48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
# Copyright 2017 ACSONE SA/NV
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class AccountMoveLine(models.Model):
|
|
|
|
_inherit = "account.move.line"
|
|
|
|
is_tax_editable = fields.Boolean(
|
|
string="Is tax data editable?", compute="_compute_is_tax_editable"
|
|
)
|
|
|
|
tax_line_id = fields.Many2one(inverse="_inverse_tax_line_id")
|
|
|
|
@api.depends("move_id.state")
|
|
def _compute_is_tax_editable(self):
|
|
for rec in self:
|
|
rec.is_tax_editable = rec.move_id.state == "draft"
|
|
|
|
def _inverse_tax_line_id(self):
|
|
for rec in self:
|
|
repartition_type = rec.tax_repartition_line_id.repartition_type or "tax"
|
|
factor_percent = rec.tax_repartition_line_id.factor_percent or 100
|
|
has_account = bool(rec.tax_repartition_line_id.account_id)
|
|
if rec.move_id.move_type in ("out_refund", "in_refund"):
|
|
repartition_lines = rec.tax_line_id.refund_repartition_line_ids
|
|
else:
|
|
repartition_lines = rec.tax_line_id.invoice_repartition_line_ids
|
|
lines = repartition_lines.filtered(
|
|
lambda rl: rl.repartition_type == repartition_type
|
|
and rl.factor_percent == factor_percent
|
|
)
|
|
if len(lines) > 1:
|
|
lines = (
|
|
lines.filtered(
|
|
lambda rl: rl.repartition_type == "base"
|
|
or has_account is bool(rl.account_id)
|
|
)[:1]
|
|
or lines[:1]
|
|
)
|
|
elif not lines:
|
|
lines = repartition_lines.filtered(
|
|
lambda rl: rl.repartition_type == repartition_type
|
|
)[:1]
|
|
rec.tax_repartition_line_id = lines
|