# Copyright 2016-2019 Onestein () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import _, api, fields, models from odoo.exceptions import UserError class AccountInvoiceLine(models.Model): _inherit = "account.invoice.line" 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", ) @api.depends("spread_id", "invoice_id.state") def _compute_spread_check(self): for line in self: if line.spread_id: line.spread_check = "linked" elif line.invoice_id.state == "draft": line.spread_check = "unlinked" else: line.spread_check = "unavailable" @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 { "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, } # In case no spread board is linked to the invoice line # open the wizard to link them company = self.invoice_id.company_id ctx = dict( self.env.context, default_invoice_line_id=self.id, default_company_id=company.id, allow_spread_planning=company.allow_spread_planning, ) return { "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, } 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 if ( aline.analytic_account_id and iline.account_analytic_id != aline.analytic_account_id ): return False return True for line in self: if line.spread_check == "linked": continue spread_type = ( "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)) template = matched.mapped("template_id") if not template: continue elif len(template) > 1: raise UserError( _( "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 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()