mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
# Copyright 2023 Domatix - Carlos Martínez
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class SaleSubscriptionTemplate(models.Model):
|
|
_name = "sale.subscription.template"
|
|
_description = "Subscription templates"
|
|
|
|
name = fields.Char(required=True)
|
|
description = fields.Text(string="Terms and conditions")
|
|
recurring_interval = fields.Integer(string="Repeat every", default=1)
|
|
recurring_rule_type = fields.Selection(
|
|
[
|
|
("days", "Day(s)"),
|
|
("weeks", "Week(s)"),
|
|
("months", "Month(s)"),
|
|
("years", "Year(s)"),
|
|
],
|
|
string="Recurrence",
|
|
default="months",
|
|
)
|
|
recurring_rule_boundary = fields.Selection(
|
|
[("unlimited", "Forever"), ("limited", "Fixed")],
|
|
string="Duration",
|
|
default="unlimited",
|
|
)
|
|
invoicing_mode = fields.Selection(
|
|
default="draft",
|
|
string="Invoicing mode",
|
|
selection=[
|
|
("draft", "Draft"),
|
|
("invoice", "Invoice"),
|
|
("invoice_send", "Invoice & send"),
|
|
("sale_and_invoice", "Sale order & Invoice"),
|
|
],
|
|
)
|
|
code = fields.Char()
|
|
recurring_rule_count = fields.Integer(default=1, string="Rule count")
|
|
invoice_mail_template_id = fields.Many2one(
|
|
comodel_name="mail.template",
|
|
string="Invoice Email",
|
|
domain="[('model', '=', 'account.move')]",
|
|
)
|
|
product_ids = fields.One2many(
|
|
comodel_name="product.template",
|
|
inverse_name="subscription_template_id",
|
|
string="Products",
|
|
)
|
|
product_ids_count = fields.Integer(
|
|
compute="_compute_product_ids_count", string="product_ids"
|
|
)
|
|
subscription_ids = fields.One2many(
|
|
comodel_name="sale.subscription",
|
|
inverse_name="template_id",
|
|
string="Subscriptions",
|
|
)
|
|
subscription_count = fields.Integer(
|
|
compute="_compute_subscription_count", string="subscription_ids"
|
|
)
|
|
|
|
def _compute_subscription_count(self):
|
|
data = self.env["sale.subscription"].read_group(
|
|
domain=[("template_id", "in", self.ids)],
|
|
fields=["template_id"],
|
|
groupby=["template_id"],
|
|
)
|
|
count_dict = {
|
|
item["template_id"][0]: item["template_id_count"] for item in data
|
|
}
|
|
for record in self:
|
|
record.subscription_count = count_dict.get(record.id, 0)
|
|
|
|
def action_view_subscription_ids(self):
|
|
return {
|
|
"name": self.name,
|
|
"view_mode": "tree,form",
|
|
"res_model": "sale.subscription",
|
|
"type": "ir.actions.act_window",
|
|
"domain": [("id", "in", self.subscription_ids.ids)],
|
|
}
|
|
|
|
def _get_date(self, date_start):
|
|
self.ensure_one()
|
|
return relativedelta(months=+self.recurring_rule_count) + date_start
|
|
|
|
@api.depends("product_ids")
|
|
def _compute_product_ids_count(self):
|
|
for record in self:
|
|
record.product_ids_count = len(self.product_ids)
|
|
|
|
def action_view_product_ids(self):
|
|
return {
|
|
"name": self.name,
|
|
"view_type": "form",
|
|
"view_mode": "tree,form",
|
|
"res_model": "product.template",
|
|
"type": "ir.actions.act_window",
|
|
"domain": [("id", "in", self.product_ids.ids)],
|
|
}
|