Files
tradon/modules/account_invoice_correction/invoice.py
2026-03-14 09:42:12 +00:00

83 lines
2.7 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction
from trytond.wizard import Button, StateAction, StateView, Wizard
class Invoice(metaclass=PoolMeta):
__name__ = 'account.invoice'
@classmethod
def __setup__(cls):
super().__setup__()
cls._buttons.update({
'correct': {
'invisible': Eval('state') != 'posted',
'depends': ['state', 'type'],
},
})
@classmethod
@ModelView.button_action(
'account_invoice_correction.wizard_invoice_correct')
def correct(cls, invoices):
pass
class InvoiceCorrectStart(ModelView):
__name__ = 'account.invoice.correct.start'
invoice = fields.Many2One('account.invoice', 'Invoice', readonly=True)
lines = fields.Many2Many('account.invoice.line', None, None,
'Invoice Lines',
domain=[
('invoice', '=', Eval('invoice', -1)),
('type', '=', 'line'),
])
class InvoiceCorrect(Wizard):
__name__ = 'account.invoice.correct'
start = StateView('account.invoice.correct.start',
'account_invoice_correction.correct_start_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Correct', 'correct', 'tryton-ok', default=True),
])
correct = StateAction('account_invoice.act_invoice_form')
def default_start(self, fields):
context = Transaction().context
return {
'invoice': context['active_id'],
'lines': [],
}
def do_correct(self, action):
pool = Pool()
Invoice = self.model
Line = pool.get('account.invoice.line')
invoice = self.record
with Transaction().set_context(_account_invoice_correction=True):
correction, = Invoice.copy([invoice], default={
'lines': [],
})
# Copy each line one by one to get negative and positive lines
# following each other
for line in self.start.lines:
Line.copy([line], default={
'invoice': correction.id,
'quantity': -line.quantity,
})
Line.copy([line], default={
'invoice': correction.id,
})
correction.update_taxes()
data = {'res_id': [correction.id]}
return action, data