trytond-account_invoice_rule/invoice.py

130 lines
4.8 KiB
Python

from trytond.model import MatchMixin, ModelSQL, ModelView, fields
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
from trytond.pyson import Eval
class AccountInvoiceAccountRule(ModelSQL, ModelView):
"""Account Invoice Account Rule"""
__name__ = 'account.invoice.account.rule'
name = fields.Char('Name', required=True)
company = fields.Many2One('company.company', 'Company', required=True)
lines = fields.One2Many('account.invoice.account.rule.line', 'rule', 'Lines',
domain=[('company', '=', Eval('company'))], depends=['company'])
@staticmethod
def default_company():
return Transaction().context.get('company') or None
def compute(self, pattern):
for line in self.lines:
if line.match(pattern):
return line.target_account
return pattern.get('origin_account')
class AccountInvoiceAccountRuleLine(ModelSQL, ModelView, MatchMixin):
"""Account Invoice Account Rule Line"""
__name__ = 'account.invoice.account.rule.line'
rule = fields.Many2One('account.invoice.account.rule', 'Rule', required=True, ondelete='CASCADE')
origin_account = fields.Many2One('account.account', 'Origin Account',
domain=[
('type', '!=', 'view'),
('company', '=', Eval('_parent_rule', {}).get('company', -1)),
], required=True, depends=['rule'])
target_account = fields.Many2One('account.account', 'Target Account',
domain=[
('type', '!=', 'view'),
('company', '=', Eval('_parent_rule', {}).get('company', -1)),
], required=True, depends=['rule'])
company = fields.Function(fields.Many2One('company.company', 'Company'),
'on_change_with_company', searcher='search_company')
def match(self, pattern):
if 'origin_account' in pattern and pattern['origin_account'] == self.origin_account:
return True
return False
@fields.depends('rule', '_parent_rule.company')
def on_change_with_company(self, name=None):
if self.rule:
return self.rule.company.id
return Transaction().context.get('company') or None
@classmethod
def search_company(cls, name, clause):
return [('rule.%s' % name,) + tuple(clause[1:])]
class AccountInvoice(metaclass=PoolMeta):
__name__ = 'account.invoice'
@classmethod
def post(cls, invoices):
Line = Pool().get('account.invoice.line')
to_save = []
for invoice in invoices:
if invoice.move:
continue
rule = invoice.party.customer_invoice_account_rule
if invoice.type == 'in':
rule = invoice.party.supplier_invoice_account_rule
if not rule:
continue
for line in invoice.lines:
pattern = line._get_account_rule_pattern()
new_account = rule.compute(pattern)
if not new_account or line.account == new_account:
continue
line.account = rule.compute(pattern)
to_save.append(line)
Line.save(to_save)
super().post(invoices)
class AccountInvoiceLine(metaclass=PoolMeta):
__name__ = 'account.invoice.line'
def _get_account_rule_pattern(self, pattern=None):
if pattern is None:
pattern = {}
else:
pattern = pattern.copy()
pattern['origin_account'] = self.account
return pattern
class Party(metaclass=PoolMeta):
__name__ = 'party.party'
customer_invoice_account_rule = fields.MultiValue(fields.Many2One(
'account.invoice.account.rule', "Customer Invoice Account Rule",
domain=[('company', '=', Eval('context', {}).get('company', -1)),],
))
supplier_invoice_account_rule = fields.MultiValue(fields.Many2One(
'account.invoice.account.rule', "Supplier Invoice Account Rule",
domain=[('company', '=', Eval('context', {}).get('company', -1)),]))
@classmethod
def multivalue_model(cls, field):
pool = Pool()
if field in {'customer_invoice_account_rule', 'supplier_invoice_account_rule'}:
return pool.get('party.party.account')
return super(Party, cls).multivalue_model(field)
class PartyAccount(metaclass=PoolMeta):
"""Party Account"""
__name__ = 'party.party.account'
customer_invoice_account_rule = fields.Many2One(
'account.invoice.account.rule', "Customer Invoice Account Rule",
domain=[('company', '=', Eval('company', -1)),], depends=['company'])
supplier_invoice_account_rule = fields.Many2One(
'account.invoice.account.rule', "Supplier Invoice Account Rule",
domain=[('company', '=', Eval('company', -1)),
], depends=['company'])