line/splitline: optimize value-update on create/write
This commit is contained in:
parent
82ae7d7bca
commit
3b289b7944
4 changed files with 97 additions and 34 deletions
68
line.py
68
line.py
|
@ -836,22 +836,6 @@ class Line(SecondCurrencyMixin, Workflow, ModelSQL, ModelView):
|
|||
raise ValueError('invalid "bookingtype"')
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def update_amount_by_splitlines(cls, lines):
|
||||
""" update amounts from split-lines
|
||||
"""
|
||||
Line2 = Pool().get('cashbook.line')
|
||||
|
||||
to_write = []
|
||||
for line in lines:
|
||||
to_write.extend([
|
||||
[line],
|
||||
{
|
||||
'amount': sum([x.amount for x in line.splitlines]),
|
||||
}])
|
||||
if len(to_write) > 0:
|
||||
Line2.write(*to_write)
|
||||
|
||||
@classmethod
|
||||
def validate(cls, lines):
|
||||
""" deny date before 'start_date' of cashbook
|
||||
|
@ -945,16 +929,25 @@ class Line(SecondCurrencyMixin, Workflow, ModelSQL, ModelView):
|
|||
))
|
||||
|
||||
@classmethod
|
||||
def copy(cls, lines, default=None):
|
||||
""" reset values
|
||||
def update_values_by_splitlines(cls, lines):
|
||||
""" update amounts from split-lines
|
||||
"""
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('number', None)
|
||||
default.setdefault('state', cls.default_state())
|
||||
return super(Line, cls).copy(moves, default=default)
|
||||
to_write = []
|
||||
for line in lines:
|
||||
amount = sum([x.amount for x in line.splitlines])
|
||||
if amount != line.amount:
|
||||
to_write.extend([ [line], {'amount': amount,} ])
|
||||
return to_write
|
||||
|
||||
@classmethod
|
||||
def add_values_from_splitlines(cls, values):
|
||||
""" add values for create to line by settings on splitlines
|
||||
"""
|
||||
if ('splitlines' in values.keys()) and ('amount' not in values.keys()):
|
||||
for action in values['splitlines']:
|
||||
if action[0] == 'create':
|
||||
values['amount'] = sum([x.get('amount', None) for x in action[1]])
|
||||
return values
|
||||
|
||||
@classmethod
|
||||
def add_2nd_unit_values(cls, values):
|
||||
|
@ -966,12 +959,31 @@ class Line(SecondCurrencyMixin, Workflow, ModelSQL, ModelView):
|
|||
values.update(cls.add_2nd_currency(values, Cashbook(cashbook).currency))
|
||||
return values
|
||||
|
||||
@classmethod
|
||||
def get_fields_write_update(cls):
|
||||
""" get fields to update on write
|
||||
"""
|
||||
return ['amount', 'bookingtype']
|
||||
|
||||
@classmethod
|
||||
def copy(cls, lines, default=None):
|
||||
""" reset values
|
||||
"""
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('number', None)
|
||||
default.setdefault('state', cls.default_state())
|
||||
return super(Line, cls).copy(moves, default=default)
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
""" add debit/credit
|
||||
"""
|
||||
vlist = [x.copy() for x in vlist]
|
||||
for values in vlist:
|
||||
values.update(cls.add_values_from_splitlines(values))
|
||||
values.update(cls.get_debit_credit(values))
|
||||
values.update(cls.clear_by_bookingtype(values))
|
||||
values.update(cls.add_2nd_unit_values(values))
|
||||
|
@ -989,7 +1001,6 @@ class Line(SecondCurrencyMixin, Workflow, ModelSQL, ModelView):
|
|||
'descr': values.get('description', '-'),
|
||||
},
|
||||
))
|
||||
|
||||
return super(Line, cls).create(vlist)
|
||||
|
||||
@classmethod
|
||||
|
@ -1021,13 +1032,14 @@ class Line(SecondCurrencyMixin, Workflow, ModelSQL, ModelView):
|
|||
))
|
||||
|
||||
# update debit / credit
|
||||
if len(set(values.keys()).intersection(set({'amount', 'bookingtype'}))) > 0:
|
||||
fields_update = cls.get_fields_write_update()
|
||||
if len(set(values.keys()).intersection(set(fields_update))) > 0:
|
||||
for line in lines:
|
||||
values2 = {}
|
||||
values2.update(values)
|
||||
values2.update(cls.clear_by_bookingtype(values, line))
|
||||
values2.update(cls.get_debit_credit({
|
||||
x:values.get(x, getattr(line, x)) for x in ['amount', 'bookingtype']
|
||||
x:values.get(x, getattr(line, x)) for x in fields_update
|
||||
}, line=line))
|
||||
to_write.extend([lines, values2])
|
||||
else :
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue