109 lines
4.0 KiB
Python
109 lines
4.0 KiB
Python
# Copyright 2016-2019 Onestein (<https://www.onestein.eu>)
|
|
# 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()
|