Skip to content

Commit

Permalink
[FIX] sale_invoice_policy: changes after OCA review
Browse files Browse the repository at this point in the history
  • Loading branch information
ACheung-FactorLibre committed Mar 27, 2024
1 parent 66ebadd commit 4b727ed
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 43 deletions.
31 changes: 10 additions & 21 deletions sale_invoice_policy/models/product_template.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,18 @@
# Copyright 2017 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import api, models
from odoo import fields, models


class ProductTemplate(models.Model):
_inherit = "product.template"

@api.depends("detailed_type")
def _compute_invoice_policy(self):
"""
Apply the invoice_policy given by context (if exist) otherwise use the
default invoice policy given by variable with this same name.
If the product is type = 'service', we don't have to apply the invoice
policy given by the context.
"""
invoice_policy = self.env.context.get("invoice_policy")
if invoice_policy:
non_service_products = self.filtered(lambda p: p.type != "service")
non_service_products.invoice_policy = invoice_policy
else:
default_invoice_policy = (
self.env["res.config.settings"]
.sudo()
.default_get(["default_invoice_policy"])
.get("default_invoice_policy", False)
)
self.invoice_policy = default_invoice_policy
def _default_invoice_policy(self):
return (
self.env["res.config.settings"]
.sudo()
.default_get(["default_invoice_policy"])
.get("default_invoice_policy", False)
)

invoice_policy = fields.Selection(default=_default_invoice_policy)
39 changes: 19 additions & 20 deletions sale_invoice_policy/models/sale_order_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"

def _get_order_lines(self, invoice_policy):
so_lines = self.filtered(
lambda x, p=invoice_policy: x.order_id.invoice_policy == p
).with_prefetch()
return so_lines

def _set_invoice_policy_on_product_templates(self, invoice_policy):
so_lines = self._get_order_lines(invoice_policy)
product_templates = so_lines.mapped("product_template_id").filtered(
lambda p: p.invoice_policy != invoice_policy
and not p.detailed_type == "service"
)
if product_templates:
product_templates.write({"invoice_policy": invoice_policy})

@api.depends(
"qty_invoiced",
"qty_delivered",
Expand All @@ -19,16 +34,8 @@ def _compute_qty_to_invoice(self):
line_by_id = {line.id: line for line in self}
done_lines = self.env["sale.order.line"]
for invoice_policy in invoice_policies:
so_lines = self.filtered(
lambda x, p=invoice_policy: x.order_id.invoice_policy == p
).with_prefetch()
product_templates = so_lines.mapped("product_template_id").filtered(
lambda p: p.invoice_policy != invoice_policy
)
if product_templates:
product_templates.with_context(
invoice_policy=invoice_policy
)._compute_invoice_policy()
so_lines = self._get_order_lines(invoice_policy)
self._set_invoice_policy_on_product_templates(invoice_policy)
if so_lines:
done_lines |= so_lines
super(SaleOrderLine, so_lines)._compute_qty_to_invoice()
Expand All @@ -54,16 +61,8 @@ def _compute_invoice_status(self):
line_by_id = {line.id: line for line in self}
done_lines = self.env["sale.order.line"]
for invoice_policy in invoice_policies:
so_lines = self.filtered(
lambda x, p=invoice_policy: x.order_id.invoice_policy == p
).with_prefetch()
product_templates = so_lines.mapped("product_template_id").filtered(
lambda p: p.invoice_policy != invoice_policy
)
if product_templates:
product_templates.with_context(
invoice_policy=invoice_policy
)._compute_invoice_policy()
so_lines = self._get_order_lines(invoice_policy)
self._set_invoice_policy_on_product_templates(invoice_policy)
done_lines |= so_lines
if so_lines:
super(SaleOrderLine, so_lines)._compute_invoice_status()
Expand Down
2 changes: 0 additions & 2 deletions sale_invoice_policy/tests/test_sale_invoice_policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,6 @@ def test_sale_order_invoice_policy_service3(self):
# Shouldn't be impacted by the context because the type is service
self.assertEqual(product.detailed_type, "service")
self.assertEqual(product.invoice_policy, invoice_policy)
# This one is not a service, so it must be impacted by the context
self.assertEqual(product2.invoice_policy, new_invoice_policy)
products.mapped("product_tmpl_id").with_context(
invoice_policy=invoice_policy,
)._compute_invoice_policy()
Expand Down

0 comments on commit 4b727ed

Please sign in to comment.