You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.5 KiB
66 lines
2.5 KiB
# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0
|
|
|
|
from odoo import api, models, _
|
|
|
|
|
|
class AccountMoveLine(models.Model):
|
|
_inherit = "account.move.line"
|
|
|
|
@api.depends("product_id", "product_uom_id")
|
|
def _compute_price_unit(self):
|
|
super()._compute_price_unit()
|
|
for line in self:
|
|
if line.move_id.is_invoice() and line.initial_membership_check():
|
|
product = line.product_id
|
|
if product.initial_discount == "fixed" and product.fixed_discount:
|
|
line.price_unit -= product.fixed_discount
|
|
|
|
@api.onchange("product_id")
|
|
def _inverse_product_id(self):
|
|
super()._inverse_product_id()
|
|
for line in self:
|
|
if not line.product_id or line.display_type in (
|
|
"line_section",
|
|
"line_note",
|
|
):
|
|
continue
|
|
if line.move_id.is_invoice() and line.initial_membership_check():
|
|
product = line.product_id
|
|
if product.initial_discount == "percent" and product.percent_discount:
|
|
line.discount = product.percent_discount
|
|
else:
|
|
pass
|
|
|
|
def initial_membership_check(self):
|
|
"""
|
|
Inherit this method to implement a custom method
|
|
to decide whether or not to create the initial discount
|
|
|
|
:return:
|
|
"""
|
|
self.ensure_one()
|
|
product = self.product_id
|
|
if not product or not product.membership or product.initial_discount == "none":
|
|
return False
|
|
# If we are associated to another partner membership, evaluate that
|
|
# partner lines
|
|
partner = self.partner_id.associate_member or self.move_id.partner_id
|
|
# By default, partner to check is the partner of the invoice, but
|
|
# if a special method is found, overwritten in other modules, then
|
|
# the partner is got from that method
|
|
if hasattr(self, "_get_partner_for_membership"): # pragma: no cover
|
|
partner = self._get_partner_for_membership()
|
|
# See if partner has any membership line to decide whether or not
|
|
# to create the initial discount
|
|
member_lines = self.env["membership.membership_line"].search(
|
|
[
|
|
("partner", "=", partner.id),
|
|
(
|
|
"account_invoice_line",
|
|
"not in",
|
|
[self.id or self._origin.id],
|
|
),
|
|
("state", "not in", ["none", "canceled"]),
|
|
]
|
|
)
|
|
return not bool(member_lines)
|