Files
contract/subscription_oca/models/sale_subscription_template.py
2023-12-15 12:32:58 +01:00

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)],
}