changeset eaeae8354d52 in modules/account_invoice:default details: https://hg.tryton.org/modules/account_invoice?cmd=changeset;node=eaeae8354d52 description: Update status of invoices linked to delegated reconciliations on deletion
issue9947 review319031003 diffstat: account.py | 49 ++++++++++++++++++---------------- tests/scenario_invoice_group_line.rst | 13 +++++++++ 2 files changed, 39 insertions(+), 23 deletions(-) diffs (93 lines): diff -r 5cbde9e252db -r eaeae8354d52 account.py --- a/account.py Sun Dec 27 00:19:30 2020 +0100 +++ b/account.py Tue Jan 05 12:16:02 2021 +0100 @@ -282,6 +282,29 @@ return product +def _invoices_to_process(reconciliations): + pool = Pool() + Reconciliation = pool.get('account.move.reconciliation') + Invoice = pool.get('account.invoice') + + move_ids = set() + others = set() + for reconciliation in reconciliations: + for line in reconciliation.lines: + move_ids.add(line.move.id) + others.update(line.reconciliations_delegated) + + invoices = set() + for sub_ids in grouped_slice(move_ids): + invoices.update(Invoice.search([ + ('move', 'in', list(sub_ids)), + ])) + if others: + invoices.update(_invoices_to_process(Reconciliation.browse(others))) + + return invoices + + class Reconciliation(metaclass=PoolMeta): __name__ = 'account.move.reconciliation' @@ -289,36 +312,16 @@ def create(cls, vlist): Invoice = Pool().get('account.invoice') reconciliations = super(Reconciliation, cls).create(vlist) - - def process(reconciliations): - move_ids = set() - others = set() - for reconciliation in reconciliations: - for line in reconciliation.lines: - move_ids.add(line.move.id) - others.update(line.reconciliations_delegated) - if others: - move_ids.update(process(cls.browse(others))) - return move_ids - move_ids = process(reconciliations) - invoices = set() - for sub_ids in grouped_slice(move_ids): - invoices.update(Invoice.search([ - ('move', 'in', list(sub_ids)), - ])) - Invoice.process(Invoice.browse(invoices)) + Invoice.process(list(_invoices_to_process(reconciliations))) return reconciliations @classmethod def delete(cls, reconciliations): Invoice = Pool().get('account.invoice') - move_ids = set(l.move.id for r in reconciliations for l in r.lines) - invoices = Invoice.search([ - ('move', 'in', list(move_ids)), - ]) + invoices_to_process = _invoices_to_process(reconciliations) super(Reconciliation, cls).delete(reconciliations) - Invoice.process(invoices) + Invoice.process(list(invoices_to_process)) class RenewFiscalYear(metaclass=PoolMeta): diff -r 5cbde9e252db -r eaeae8354d52 tests/scenario_invoice_group_line.rst --- a/tests/scenario_invoice_group_line.rst Sun Dec 27 00:19:30 2020 +0100 +++ b/tests/scenario_invoice_group_line.rst Tue Jan 05 12:16:02 2021 +0100 @@ -124,3 +124,16 @@ >>> supplier_invoice.reload() >>> supplier_invoice.state 'paid' + +Remove the created reconciliation:: + + >>> Reconciliation = Model.get('account.move.reconciliation') + >>> reconciliation, = Reconciliation.find([('lines', '=', lines[0].id)]) + >>> Reconciliation.delete([reconciliation]) + + >>> invoice.reload() + >>> invoice.state + 'posted' + >>> supplier_invoice.reload() + >>> supplier_invoice.state + 'posted'