2
0
account-financial-tools/account_spread_cost_revenue/models/account_invoice_line.py

122 lines
4.3 KiB
Python
Raw Normal View History

2019-03-15 10:36:21 +01:00
# Copyright 2016-2019 Onestein (<https://www.onestein.eu>)
2018-10-22 12:27:50 +02:00
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo.exceptions import UserError
2018-10-22 12:27:50 +02:00
class AccountInvoiceLine(models.Model):
2020-09-07 14:17:04 +02:00
_inherit = "account.invoice.line"
2018-10-22 12:27:50 +02:00
2020-09-07 14:17:04 +02:00
spread_id = fields.Many2one("account.spread", string="Spread Board", copy=False)
spread_check = fields.Selection(
[
("linked", "Linked"),
("unlinked", "Unlinked"),
("unavailable", "Unavailable"),
],
compute="_compute_spread_check",
)
2018-10-22 12:27:50 +02:00
2020-09-07 14:17:04 +02:00
@api.depends("spread_id", "invoice_id.state")
2018-10-22 12:27:50 +02:00
def _compute_spread_check(self):
for line in self:
if line.spread_id:
2020-09-07 14:17:04 +02:00
line.spread_check = "linked"
elif line.invoice_id.state == "draft":
line.spread_check = "unlinked"
2018-10-22 12:27:50 +02:00
else:
2020-09-07 14:17:04 +02:00
line.spread_check = "unavailable"
2018-10-22 12:27:50 +02:00
@api.multi
def spread_details(self):
"""Button on the invoice lines tree view of the invoice
form to show the spread form view."""
if not self:
# In case the widget clicked before the creation of the line
return
if self.spread_id:
return {
2020-09-07 14:17:04 +02:00
"name": _("Spread Details"),
"view_type": "form",
"view_mode": "form",
"res_model": "account.spread",
"type": "ir.actions.act_window",
"target": "current",
"readonly": False,
"res_id": self.spread_id.id,
2018-10-22 12:27:50 +02:00
}
# In case no spread board is linked to the invoice line
# open the wizard to link them
company = self.invoice_id.company_id
2018-10-22 12:27:50 +02:00
ctx = dict(
self.env.context,
default_invoice_line_id=self.id,
default_company_id=company.id,
allow_spread_planning=company.allow_spread_planning,
2018-10-22 12:27:50 +02:00
)
return {
2020-09-07 14:17:04 +02:00
"name": _("Link Invoice Line with Spread Board"),
"view_type": "form",
"view_mode": "form",
"res_model": "account.spread.invoice.line.link.wizard",
"type": "ir.actions.act_window",
"target": "new",
"context": ctx,
2018-10-22 12:27:50 +02:00
}
def create_auto_spread(self):
""" Create auto spread table for each invoice line, when needed """
def _filter_line(aline, iline):
""" Find matching template auto line with invoice line """
if aline.product_id and iline.product_id != aline.product_id:
return False
if aline.account_id and iline.account_id != aline.account_id:
return False
2020-09-07 14:17:04 +02:00
if (
aline.analytic_account_id
and iline.account_analytic_id != aline.analytic_account_id
):
return False
return True
for line in self:
2020-09-07 14:17:04 +02:00
if line.spread_check == "linked":
continue
spread_type = (
2020-09-07 14:17:04 +02:00
"sale"
if line.invoice_type in ["out_invoice", "out_refund"]
else "purchase"
)
spread_auto = self.env["account.spread.template.auto"].search(
[
("template_id.auto_spread", "=", True),
("template_id.spread_type", "=", spread_type),
]
)
matched = spread_auto.filtered(lambda a, i=line: _filter_line(a, i))
2020-09-07 14:17:04 +02:00
template = matched.mapped("template_id")
if not template:
continue
elif len(template) > 1:
raise UserError(
2020-09-07 14:17:04 +02:00
_(
"Too many auto spread templates (%s) matched with the "
"invoice line, %s"
)
% (len(template), line.display_name)
)
# Found auto spread template for this invoice line, create it
2020-09-07 14:17:04 +02:00
wizard = self.env["account.spread.invoice.line.link.wizard"].new(
{
"invoice_line_id": line.id,
"company_id": line.company_id.id,
"spread_action_type": "template",
"template_id": template.id,
}
)
wizard.confirm()