From f4e1dc66abba812afb95027a1e8bf648a700af88 Mon Sep 17 00:00:00 2001 From: sygel Date: Mon, 8 Jul 2024 13:20:27 +0200 Subject: [PATCH] [MIG] subscription_oca: Migration to 17.0 --- subscription_oca/README.rst | 6 ++ subscription_oca/__manifest__.py | 2 +- subscription_oca/models/sale_order.py | 4 +- subscription_oca/models/sale_subscription.py | 70 +++++++++---------- .../models/sale_subscription_line.py | 39 +++++------ subscription_oca/readme/CONTRIBUTORS.md | 4 ++ .../static/description/index.html | 6 ++ .../tests/test_subscription_oca.py | 35 +++++++++- .../views/product_template_views.xml | 2 +- subscription_oca/views/res_partner_views.xml | 2 +- subscription_oca/views/sale_order_views.xml | 2 +- .../sale_subscription_template_views.xml | 7 +- .../views/sale_subscription_views.xml | 26 +++---- 13 files changed, 122 insertions(+), 83 deletions(-) diff --git a/subscription_oca/README.rst b/subscription_oca/README.rst index 8ebbec736..2d4891934 100644 --- a/subscription_oca/README.rst +++ b/subscription_oca/README.rst @@ -101,6 +101,12 @@ Contributors - Ilyas +- `Sygel `__: + + - Harald Panten + - Valentin Vinagre + - Alberto Martínez + Maintainers ----------- diff --git a/subscription_oca/__manifest__.py b/subscription_oca/__manifest__.py index fa4400f48..d7c92230b 100644 --- a/subscription_oca/__manifest__.py +++ b/subscription_oca/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Subscription management", "summary": "Generate recurring invoices.", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "development_status": "Beta", "category": "Subscription Management", "website": "https://github.com/OCA/contract", diff --git a/subscription_oca/models/sale_order.py b/subscription_oca/models/sale_order.py index 0aabac0cb..40cbc0e99 100644 --- a/subscription_oca/models/sale_order.py +++ b/subscription_oca/models/sale_order.py @@ -49,7 +49,7 @@ class SaleOrder(models.Model): rec = self.env["sale.subscription"].create( { "partner_id": self.partner_id.id, - "user_id": self._context["uid"], + "user_id": self.env.context.get("uid", self.env.uid), "template_id": subscription_tmpl.id, "pricelist_id": self.partner_id.property_product_pricelist.id, "date_start": date.today(), @@ -75,7 +75,7 @@ class SaleOrder(models.Model): return grouped def action_confirm(self): - res = super(SaleOrder, self).action_confirm() + res = super().action_confirm() for record in self: grouped = self.group_subscription_lines() for tmpl, lines in grouped.items(): diff --git a/subscription_oca/models/sale_subscription.py b/subscription_oca/models/sale_subscription.py index abe3b9364..f99e4a8db 100644 --- a/subscription_oca/models/sale_subscription.py +++ b/subscription_oca/models/sale_subscription.py @@ -116,11 +116,6 @@ class SaleSubscription(models.Model): group_expand="_read_group_stage_ids", store=True, ) - stage_str = fields.Char( - related="stage_id.name", - string="Etapa", - store=True, - ) sale_subscription_line_ids = fields.One2many( comodel_name="sale.subscription.line", inverse_name="sale_subscription_id", @@ -320,22 +315,22 @@ class SaleSubscription(models.Model): invoice = self.create_invoice() if self.template_id.invoicing_mode != "draft": invoice.action_post() - if self.template_id.invoicing_mode == "invoice_send": - mail_template = self.template_id.invoice_mail_template_id - invoice.with_context(force_send=True).message_post_with_template( - mail_template.id, - composition_mode="comment", - email_layout_xmlid="mail.mail_notification_paynow", - ) + mail_template = self.template_id.invoice_mail_template_id + invoice.with_context(force_send=True)._generate_pdf_and_send_invoice( + mail_template + ) invoice_number = invoice.name message_body = ( - "%s %s" - % (msg_static, invoice.id, invoice_number) + f"{msg_static} " + f"" + f"{invoice_number}" + "" ) if self.template_id.invoicing_mode == "sale_and_invoice": order_id = self.create_sale_order() - order_id.action_done() + order_id.action_confirm() + order_id.action_lock() new_invoice = order_id._create_invoices() new_invoice.action_post() new_invoice.invoice_origin = order_id.name + ", " + self.name @@ -346,7 +341,7 @@ class SaleSubscription(models.Model): ) if not invoice_number: invoice_number = _("To validate") - message_body = "%s %s" % (msg_static, invoice_number) + message_body = f"{msg_static} {invoice_number}" self.calculate_recurring_next_date(self.recurring_next_date) self.message_post(body=message_body) @@ -447,24 +442,27 @@ class SaleSubscription(models.Model): return res - @api.model - def create(self, values): - if "recurring_rule_boundary" in values: - if not values["recurring_rule_boundary"]: - template_id = self.env["sale.subscription.template"].browse( - values["template_id"] + @api.model_create_multi + def create(self, vals_list): + for values in vals_list: + if "recurring_rule_boundary" in values: + if not values["recurring_rule_boundary"]: + template_id = self.env["sale.subscription.template"].browse( + values["template_id"] + ) + date_start = values["date_start"] + if not isinstance(values["date_start"], date): + date_start = fields.Date.to_date(values["date_start"]) + values["date"] = template_id._get_date(date_start) + if "date_start" in values and "recurring_next_date" in values: + res = self._check_dates( + values["date_start"], values["recurring_next_date"] ) - date_start = values["date_start"] - if not isinstance(values["date_start"], date): - date_start = fields.Date.to_date(values["date_start"]) - values["date"] = template_id._get_date(date_start) - if "date_start" in values and "recurring_next_date" in values: - res = self._check_dates(values["date_start"], values["recurring_next_date"]) - if res: - values["date_start"] = values["recurring_next_date"] - values["stage_id"] = ( - self.env["sale.subscription.stage"] - .search([("type", "=", "pre")], order="sequence desc", limit=1) - .id - ) - return super(SaleSubscription, self).create(values) + if res: + values["date_start"] = values["recurring_next_date"] + values["stage_id"] = ( + self.env["sale.subscription.stage"] + .search([("type", "=", "pre")], order="sequence desc", limit=1) + .id + ) + return super().create(vals_list) diff --git a/subscription_oca/models/sale_subscription_line.py b/subscription_oca/models/sale_subscription_line.py index a780e4075..bac2974d0 100644 --- a/subscription_oca/models/sale_subscription_line.py +++ b/subscription_oca/models/sale_subscription_line.py @@ -39,6 +39,24 @@ class SaleSubscriptionLine(models.Model): store=True, readonly=False, ) + price_subtotal = fields.Monetary( + string="Subtotal", readonly=True, compute="_compute_subtotal", store=True + ) + price_total = fields.Monetary( + string="Total", readonly=True, compute="_compute_subtotal", store=True + ) + amount_tax_line_amount = fields.Float( + string="Taxes Amount", compute="_compute_subtotal", store=True + ) + sale_subscription_id = fields.Many2one( + comodel_name="sale.subscription", string="Subscription" + ) + company_id = fields.Many2one( + related="sale_subscription_id.company_id", + string="Company", + store=True, + index=True, + ) @api.depends("product_id", "price_unit", "product_uom_qty", "discount", "tax_ids") def _compute_subtotal(self): @@ -61,25 +79,6 @@ class SaleSubscriptionLine(models.Model): } ) - price_subtotal = fields.Monetary( - string="Subtotal", readonly="True", compute=_compute_subtotal, store=True - ) - price_total = fields.Monetary( - string="Total", readonly="True", compute=_compute_subtotal, store=True - ) - amount_tax_line_amount = fields.Float( - string="Taxes Amount", compute="_compute_subtotal", store=True - ) - sale_subscription_id = fields.Many2one( - comodel_name="sale.subscription", string="Subscription" - ) - company_id = fields.Many2one( - related="sale_subscription_id.company_id", - string="Company", - store=True, - index=True, - ) - @api.depends("product_id") def _compute_name(self): for record in self: @@ -102,7 +101,7 @@ class SaleSubscriptionLine(models.Model): ) # If company_id is set, always filter taxes by the company taxes = line.product_id.taxes_id.filtered( - lambda t: t.company_id == line.env.company + lambda t: t.company_id == self.env.company ) line.tax_ids = fpos.map_tax(taxes) diff --git a/subscription_oca/readme/CONTRIBUTORS.md b/subscription_oca/readme/CONTRIBUTORS.md index 355719e83..ffcb90714 100644 --- a/subscription_oca/readme/CONTRIBUTORS.md +++ b/subscription_oca/readme/CONTRIBUTORS.md @@ -2,3 +2,7 @@ - Carolina Ferrer \<\> - [Ooops404](https://www.ooops404.com): - Ilyas \<\> +- [Sygel](https://www.sygel.es): + - Harald Panten + - Valentin Vinagre + - Alberto Martínez diff --git a/subscription_oca/static/description/index.html b/subscription_oca/static/description/index.html index fd95e10e8..156261a6c 100644 --- a/subscription_oca/static/description/index.html +++ b/subscription_oca/static/description/index.html @@ -450,6 +450,12 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
  • Ilyas <irazor147@gmail.com>
  • +
  • Sygel:
      +
    • Harald Panten
    • +
    • Valentin Vinagre
    • +
    • Alberto Martínez
    • +
    +
  • diff --git a/subscription_oca/tests/test_subscription_oca.py b/subscription_oca/tests/test_subscription_oca.py index 016996063..8c2cab964 100644 --- a/subscription_oca/tests/test_subscription_oca.py +++ b/subscription_oca/tests/test_subscription_oca.py @@ -60,10 +60,18 @@ class TestSubscriptionOCA(TransactionCase): "price_include": True, } ) + cls.tax_0pc = cls.env["account.tax"].create( + { + "name": "0% Tax", + "amount_type": "percent", + "amount": 0, + } + ) cls.product_1 = cls.env.ref("product.product_product_1") cls.product_1.subscribable = True cls.product_1.taxes_id = [(6, 0, cls.tax_10pc_incl.ids)] cls.product_2 = cls.env.ref("product.product_product_2") + cls.product_2.taxes_id = [(6, 0, cls.tax_0pc.ids)] cls.product_2.subscribable = True cls.country = cls.env["res.country"].search([], limit=1) @@ -201,7 +209,6 @@ class TestSubscriptionOCA(TransactionCase): cls.sub_line2.unlink() # Pricelists. - cls.pricelist_default = cls.env.ref("product.list0") cls.pricelist_l1 = cls._create_price_list("Level 1") cls.pricelist_l2 = cls._create_price_list("Level 2") cls.pricelist_l3 = cls._create_price_list("Level 3") @@ -588,7 +595,13 @@ class TestSubscriptionOCA(TransactionCase): self.pricelist_l3.currency_id = self.env.ref("base.THB") self.sub_line.sale_subscription_id.pricelist_id = self.pricelist_l3 res = self.sub_line._get_display_price(self.product_1) - self.assertAlmostEqual(int(res), 514) + self.assertAlmostEqual( + int(res), + round( + self.product_1.standard_price + * self.pricelist_l3.currency_id.rate_ids[:1].company_rate + ), + ) self.sub_line.product_uom_qty = 300 res = self.sub_line.read(["discount"]) self.assertEqual(res[0]["discount"], 0) @@ -608,6 +621,24 @@ class TestSubscriptionOCA(TransactionCase): ) def _collect_all_sub_test_results(self, subscription): + """Creates the invoice of a subscription and returns its data + :param subscription: subscription to invoice + :returns: Lists with the following data + returns[0]: Created sale order record + returns[1]: Created invoice record + returns[2]: Type of the action to see a manually created invoice + returns[3]: Number of invoices + returns[4]: Amount total (wout taxes) of all the invoices + returns[5]: Invoices count of the subscription + returns[6]: Type of the action to the subscription invoices + returns[7]: Sale order count of the subscription + returns[8]: Id of the sale order + returns[9]: Recurring next date of the subscription + returns[10]: Id of the pricelist of the subsciption + returns[11]: Fiscal position record of the subscription + returns[12]: Type of the wizard action close a subscription + returns[13]: Subscription stages + """ test_res = [] sale_order = subscription.create_sale_order() test_res.append(sale_order) diff --git a/subscription_oca/views/product_template_views.xml b/subscription_oca/views/product_template_views.xml index 0ef00a86b..0ef9006ec 100644 --- a/subscription_oca/views/product_template_views.xml +++ b/subscription_oca/views/product_template_views.xml @@ -11,7 +11,7 @@ diff --git a/subscription_oca/views/res_partner_views.xml b/subscription_oca/views/res_partner_views.xml index 3be7a6690..d3c6290ba 100644 --- a/subscription_oca/views/res_partner_views.xml +++ b/subscription_oca/views/res_partner_views.xml @@ -13,7 +13,7 @@ class="oe_stat_button" icon="fa-recycle" name="action_view_subscription_ids" - attrs="{'invisible': [('subscription_ids', '=', False)]}" + invisible="not subscription_ids" >
    diff --git a/subscription_oca/views/sale_order_views.xml b/subscription_oca/views/sale_order_views.xml index 674776bf1..e5d987308 100644 --- a/subscription_oca/views/sale_order_views.xml +++ b/subscription_oca/views/sale_order_views.xml @@ -10,7 +10,7 @@