line: balance-berechnung ausgelagert,

reconciliation: Feld 'feature'
This commit is contained in:
Frederik Jaeckel 2022-12-31 14:46:06 +01:00
parent e0a6d39bdb
commit b809d51fe0
6 changed files with 57 additions and 26 deletions

61
line.py
View file

@ -672,27 +672,24 @@ class Line(SecondCurrencyMixin, Workflow, ModelSQL, ModelView):
else:
return 2
@fields.depends('id', 'date', 'cashbook', \
'_parent_cashbook.id', 'reconciliation', \
'_parent_reconciliation.start_amount',\
'_parent_reconciliation.state')
def on_change_with_balance(self, name=None):
""" compute balance until current line, with current sort order,
try to use a reconciliation as start to speed up calculation
@classmethod
def get_balance_of_line(cls, line, field_name='amount', credit_name='credit', debit_name='debit'):
""" get balance of current line,
try to speed up by usage of last reconcilitaion
"""
pool = Pool()
Reconciliation = pool.get('cashbook.recon')
Line = pool.get('cashbook.line')
Line2 = pool.get('cashbook.line')
def get_from_last_recon(line2):
""" search last reconciliation in state 'done',
generate query
"""
query2 = []
end_amount = None
end_value = None
recons = Reconciliation.search([
('cashbook.id', '=', self.cashbook.id),
('cashbook.id', '=', line.cashbook.id),
('date_to', '<=', line2.date),
('state', '=', 'done'),
], order=[('date_from', 'DESC')], limit=1)
@ -705,42 +702,56 @@ class Line(SecondCurrencyMixin, Workflow, ModelSQL, ModelView):
('reconciliation.id', '!=', recons[0]),
],
])
end_amount = recons[0].end_amount
return (query2, end_amount)
end_value = getattr(recons[0], 'end_%s' % field_name)
return (query2, end_value)
if self.cashbook:
if line.cashbook:
query = [
('cashbook.id', '=', self.cashbook.id),
('cashbook.id', '=', line.cashbook.id),
]
balance = Decimal('0.0')
# get existing reconciliation, starting before current line
# this will speed up calculation of by-line-balance
if self.date is not None:
if self.reconciliation:
if self.reconciliation.state == 'done':
if line.date is not None:
if line.reconciliation:
if line.reconciliation.state == 'done':
query.append(
('reconciliation.id', '=', self.reconciliation.id),
('reconciliation.id', '=', line.reconciliation.id),
)
balance = self.reconciliation.start_amount
balance = getattr(line.reconciliation, 'start_%s' % field_name)
else :
(query2, balance2) = get_from_last_recon(self)
(query2, balance2) = get_from_last_recon(line)
query.extend(query2)
if balance2 is not None:
balance = balance2
else :
(query2, balance2) = get_from_last_recon(self)
(query2, balance2) = get_from_last_recon(line)
query.extend(query2)
if balance2 is not None:
balance = balance2
lines = Line.search(query)
for line in lines:
balance += line.credit - line.debit
if line.id == self.id:
lines = Line2.search(query)
for line3 in lines:
balance += getattr(line3, credit_name) - getattr(line3, debit_name)
if line3.id == line.id:
break
return balance
@fields.depends('id', 'date', 'cashbook', \
'_parent_cashbook.id', 'reconciliation', \
'_parent_reconciliation.start_amount',\
'_parent_reconciliation.state')
def on_change_with_balance(self, name=None):
""" compute balance until current line, with current sort order,
try to use a reconciliation as start to speed up calculation
"""
Line2 = Pool().get('cashbook.line')
return Line2.get_balance_of_line(self,
field_name='amount',
credit_name='credit',
debit_name='debit')
@classmethod
def clear_by_bookingtype(cls, values, line=None):
""" clear some fields by value of bookingtype