Use reference field for statement line relation

issue6854
review367971002
This commit is contained in:
Cédric Krier committed 2022-02-23 00:01:17 +01:00
1 parent 8445e6244f
commit 61e2fc6d76
7 files changed
+96 -43

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Use reference field for statement line relation
* Create default statement journal
* Add support for Python 3.10
* Remove support for Python 3.6
+78 -26
View File
@@ -7,6 +7,7 @@ from itertools import groupby
from sql import Null
from sql.aggregate import Max, Sum
from sql.conditionals import Coalesce
from sql.operators import Concat
from trytond.config import config
from trytond.i18n import gettext
@@ -250,12 +251,12 @@ class Statement(Workflow, ModelSQL, ModelView):
invoices = set()
for line in self.lines:
if (getattr(line, 'invoice', None)
if (line.invoice
and line.invoice.currency == self.company.currency):
invoices.add(line.invoice)
for origin in self.origins:
for line in origin.lines:
if (getattr(line, 'invoice', None)
if (line.invoice
and line.invoice.currency == self.company.currency):
invoices.add(line.invoice)
invoice_id2amount_to_pay = {}
@@ -270,7 +271,8 @@ class Statement(Workflow, ModelSQL, ModelView):
for origin in origins:
lines = list(origin.lines)
for line in lines:
if (getattr(line, 'invoice', None) and line.id
if (line.invoice
and line.id
and line.invoice.id in invoice_id2amount_to_pay):
amount_to_pay = invoice_id2amount_to_pay[line.invoice.id]
if (amount_to_pay
@@ -297,7 +299,7 @@ class Statement(Workflow, ModelSQL, ModelView):
invoices = set()
for line in self.lines:
if (getattr(line, 'invoice', None)
if (line.invoice
and line.invoice.currency == self.company.currency):
invoices.add(line.invoice)
invoice_id2amount_to_pay = {}
@@ -311,7 +313,7 @@ class Statement(Workflow, ModelSQL, ModelView):
lines = list(self.lines)
line_offset = 0
for index, line in enumerate(self.lines or []):
if getattr(line, 'invoice', None) and line.id:
if line.invoice and line.id:
if line.invoice.id not in invoice_id2amount_to_pay:
continue
amount_to_pay = invoice_id2amount_to_pay[line.invoice.id]
@@ -495,7 +497,7 @@ class Statement(Workflow, ModelSQL, ModelView):
gettext('account_statement'
'.msg_statement_invoice_paid_cancelled'))
Line.write(paid_cancelled_invoice_lines, {
'invoice': None,
'related_to': None,
})
cls.create_move(statements)
@@ -504,9 +506,10 @@ class Statement(Workflow, ModelSQL, ModelView):
'state': 'validated',
})
common_lines = [l for l in Line.search([
('statement.state', '=', 'draft'),
('invoice.state', 'in', ['posted', 'paid']),
])
('statement.state', '=', 'draft'),
('related_to.state', 'in', ['posted', 'paid'],
'account.invoice'),
])
if l.invoice.reconciled]
if common_lines:
warning_key = '_'.join(str(l.id) for l in common_lines)
@@ -515,7 +518,7 @@ class Statement(Workflow, ModelSQL, ModelView):
gettext('account_statement'
'.msg_statement_paid_invoice_draft'))
Line.write(common_lines, {
'invoice': None,
'related_to': None,
})
@classmethod
@@ -757,15 +760,22 @@ class Line(
('company', '=', Eval('company', -1)),
],
depends=['company'])
invoice = fields.Many2One('account.invoice', 'Invoice',
domain=[
('company', '=', Eval('company', -1)),
If(Bool(Eval('party')), [('party', '=', Eval('party'))], []),
If(Bool(Eval('account')), [('account', '=', Eval('account'))], []),
If(Eval('statement_state') == 'draft',
('state', '=', 'posted'),
('state', '!=', '')),
],
related_to = fields.Reference(
"Related To", 'get_relations',
domain={
'account.invoice': [
('company', '=', Eval('company', -1)),
If(Bool(Eval('party')),
('party', '=', Eval('party')),
()),
If(Bool(Eval('account')),
('account', '=', Eval('account')),
()),
If(Eval('statement_state') == 'draft',
('state', '=', 'posted'),
('state', '!=', '')),
],
},
states=_states,
context={'with_payment': False},
depends=['company', 'party', 'account'] + _depends)
@@ -796,11 +806,51 @@ class Line(
'account_statement.msg_line_amount_non_zero'),
]
@classmethod
def __register__(cls, module):
table = cls.__table__()
super().__register__(module)
table_h = cls.__table_handler__(module)
cursor = Transaction().connection.cursor()
if table_h.column_exist('invoice'):
cursor.execute(*table.update(
[table.related_to],
[Concat('account.invoice,', table.invoice)],
where=table.invoice != Null))
table_h.drop_column('invoice')
@property
@fields.depends('related_to')
def invoice(self):
pool = Pool()
Invoice = pool.get('account.invoice')
related_to = getattr(self, 'related_to', None)
if isinstance(related_to, Invoice) and related_to.id >= 0:
return related_to
@invoice.setter
def invoice(self, value):
self.related_to = value
@staticmethod
def default_amount():
return Decimal(0)
@fields.depends('amount', 'party', 'invoice', 'date')
@classmethod
def _get_relations(cls):
"Return a list of Model names for related_to Reference"
return ['account.invoice']
@classmethod
def get_relations(cls):
Model = Pool().get('ir.model')
get_name = Model.get_name
models = cls._get_relations()
return [(None, '')] + [(m, get_name(m)) for m in models]
@fields.depends('amount', 'party', 'date', methods=['invoice'])
def on_change_party(self):
if self.party:
if self.amount:
@@ -817,8 +867,10 @@ class Line(
else:
self.invoice = None
@fields.depends('amount', 'party', 'account', 'invoice', 'statement',
'date', '_parent_statement.journal')
@fields.depends(
'amount', 'party', 'account', 'date',
'statement', '_parent_statement.journal',
methods=['invoice'])
def on_change_amount(self):
Currency = Pool().get('currency.currency')
if self.party:
@@ -845,7 +897,7 @@ class Line(
else:
self.invoice = None
@fields.depends('account', 'invoice')
@fields.depends('account', methods=['invoice'])
def on_change_account(self):
if self.invoice:
if self.account:
@@ -854,8 +906,8 @@ class Line(
else:
self.invoice = None
@fields.depends('party', 'account', 'invoice')
def on_change_invoice(self):
@fields.depends('party', 'account', methods=['invoice'])
def on_change_related_to(self):
if self.invoice:
if not self.party:
self.party = self.invoice.party
@@ -915,7 +967,7 @@ class Line(
else:
default = default.copy()
default.setdefault('move', None)
default.setdefault('invoice', None)
default.setdefault('related_to', None)
return super(Line, cls).copy(lines, default=default)
@classmethod
+11 -11
View File
@@ -143,7 +143,7 @@ Received 180 from customer::
>>> statement_line.party = customer
>>> statement_line.account == receivable
True
>>> statement_line.invoice = customer_invoice1
>>> statement_line.related_to = customer_invoice1
>>> statement_line.amount
Decimal('100.00')
>>> statement_line = statement.lines[-1]
@@ -158,7 +158,7 @@ Received 180 from customer::
>>> statement_line.account == receivable
True
>>> statement_line.description = 'other description'
>>> statement_line.invoice = customer_invoice2
>>> statement_line.related_to = customer_invoice2
>>> statement_line.amount
Decimal('80.00')
@@ -172,7 +172,7 @@ Paid 50 to customer::
>>> statement_line.amount = Decimal('-50')
>>> statement_line.party = customer
>>> statement_line.account = receivable
>>> statement_line.invoice = customer_credit_note
>>> statement_line.related_to = customer_credit_note
Paid 50 to supplier::
@@ -183,7 +183,7 @@ Paid 50 to supplier::
>>> statement_line.party = supplier
>>> statement_line.account == payable
True
>>> statement_line.invoice = supplier_invoice
>>> statement_line.related_to = supplier_invoice
>>> statement_line.amount
Decimal('-50.00')
>>> statement_line = statement.lines.pop()
@@ -302,8 +302,8 @@ Let's test the negative amount version of the supplier/customer invoices::
>>> statement_line.party = customer
>>> statement_line.account = receivable
>>> statement_line.amount = Decimal(-120)
>>> statement_line.invoice = customer_invoice3
>>> statement_line.invoice.id == customer_invoice3.id
>>> statement_line.related_to = customer_invoice3
>>> statement_line.related_to.id == customer_invoice3.id
True
>>> statement_line = StatementLine()
@@ -312,7 +312,7 @@ Let's test the negative amount version of the supplier/customer invoices::
>>> statement_line.party = supplier
>>> statement_line.account = payable
>>> statement_line.amount = Decimal(50)
>>> statement_line.invoice = supplier_invoice2
>>> statement_line.related_to = supplier_invoice2
>>> statement_line.amount
Decimal('40.00')
>>> len(statement.lines)
@@ -341,7 +341,7 @@ Testing the use of an invoice in multiple statements::
>>> statement_line.party = customer
>>> statement_line.account = receivable
>>> statement_line.amount = Decimal(300)
>>> statement_line.invoice = customer_invoice4
>>> statement_line.related_to = customer_invoice4
>>> statement1.save()
>>> statement2 = Statement(name='2', journal=statement_journal)
@@ -351,7 +351,7 @@ Testing the use of an invoice in multiple statements::
>>> statement_line.party = customer
>>> statement_line.account = receivable
>>> statement_line.amount = Decimal(300)
>>> statement_line.invoice = customer_invoice4
>>> statement_line.related_to = customer_invoice4
>>> statement2.save()
>>> statement1.click('validate_statement') # doctest: +IGNORE_EXCEPTION_DETAIL
@@ -366,10 +366,10 @@ Testing the use of an invoice in multiple statements::
'validated'
>>> statement1.reload()
>>> bool(statement1.lines[0].invoice)
>>> bool(statement1.lines[0].related_to)
True
>>> statement2.reload()
>>> bool(statement2.lines[0].invoice)
>>> bool(statement2.lines[0].related_to)
False
Testing balance validation::
+2 -2
View File
@@ -95,7 +95,7 @@ Pending amount is used to fill all invoices::
>>> origin, = statement.origins
>>> line = origin.lines.new()
>>> line.invoice = customer_invoice1
>>> line.related_to = customer_invoice1
>>> line.amount
Decimal('100.00')
>>> line.party == customer
@@ -105,7 +105,7 @@ Pending amount is used to fill all invoices::
>>> origin.pending_amount
Decimal('80.00')
>>> line = origin.lines.new()
>>> line.invoice = customer_invoice2
>>> line.related_to = customer_invoice2
>>> line.amount
Decimal('80.00')
>>> line.party == customer
+2 -2
View File
@@ -16,8 +16,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="party"/>
<label name="account"/>
<field name="account"/>
<label name="invoice"/>
<field name="invoice"/>
<label name="related_to"/>
<field name="related_to"/>
<newline/>
<label name="description"/>
<field name="description" colspan="3"/>
+1 -1
View File
@@ -8,6 +8,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="amount"/>
<field name="party" expand="1"/>
<field name="account" expand="1"/>
<field name="invoice" expand="1"/>
<field name="related_to" expand="1"/>
<field name="description" expand="1"/>
</tree>
+1 -1
View File
@@ -7,7 +7,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="date"/>
<field name="amount" sum="Amount"/>
<field name="party" expand="1"/>
<field name="invoice" expand="1"/>
<field name="related_to" expand="1"/>
<field name="account" expand="1"/>
<field name="description" expand="1"/>
</tree>