From decfbbdb220a6f815ca7cf942f5767cc2ea4fc82 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Thu, 2 May 2024 18:24:08 +0200 Subject: [PATCH] fix: check reconciliation reference before reconciling --- .../payment_reconciliation.py | 4 +- .../regional/doctype/fec_import/fec_import.py | 44 +++++++++++++++++-- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index 3fb13b3efb..9db942a645 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -273,7 +273,7 @@ class PaymentReconciliation(Document): def add_payment_entries(self, non_reconciled_payments): self.set("payments", []) - for payment in non_reconciled_payments: + for payment in sorted(non_reconciled_payments, key=lambda e: e.get("posting_date")): row = self.append("payments", {}) row.update(payment) @@ -313,7 +313,7 @@ class PaymentReconciliation(Document): # Populate 'invoices' with JVs and Invoices to reconcile against self.set("invoices", []) - for entry in non_reconciled_invoices: + for entry in sorted(non_reconciled_invoices, key=lambda e: e.get("posting_date")): inv = self.append("invoices", {}) inv.invoice_type = entry.get("voucher_type") inv.invoice_number = entry.get("voucher_no") diff --git a/erpnext/regional/doctype/fec_import/fec_import.py b/erpnext/regional/doctype/fec_import/fec_import.py index be6f951f54..b9471b572c 100644 --- a/erpnext/regional/doctype/fec_import/fec_import.py +++ b/erpnext/regional/doctype/fec_import/fec_import.py @@ -323,13 +323,51 @@ class FECImport(Document): "type": _("parties reconciled"), }, ) + pr = self.create_payment_reconciliation(party_type, data[0], data[1]) pr.get_unreconciled_entries() invoices = [x.as_dict() for x in pr.get("invoices")] payments = [x.as_dict() for x in pr.get("payments")] - if invoices and payments: - pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments})) - pr.reconcile() + + invoices_by_let = defaultdict(list) + for invoice in invoices: + if fec_import_doc := frappe.db.get_value( + "FEC Import Document", + dict( + linked_document_type=invoice.invoice_type, + linked_document=invoice.invoice_number, + fec_import=self.name, + ), + ): + import_document = frappe.get_doc("FEC Import Document", fec_import_doc) + for gl_entry in import_document.gl_entries: + if gl_entry.party_type and gl_entry.ecriturelet: + invoices_by_let[gl_entry.ecriturelet].append(invoice) + + payments_by_let = defaultdict(list) + for payment in payments: + if fec_import_doc := frappe.db.get_value( + "FEC Import Document", + dict( + linked_document_type=payment.reference_type, + linked_document=payment.reference_name, + fec_import=self.name, + ), + ): + import_document = frappe.get_doc("FEC Import Document", fec_import_doc) + for gl_entry in import_document.gl_entries: + if gl_entry.party_type and gl_entry.ecriturelet: + payments_by_let[gl_entry.ecriturelet].append(payment) + + for ref in invoices_by_let: + if invoices_by_let.get(ref) and payments_by_let.get(ref): + pr.allocate_entries( + frappe._dict({"invoices": invoices_by_let.get(ref), "payments": payments_by_let.get(ref)}) + ) + try: + pr.reconcile() + except Exception: + frappe.log_error(_("FEC reconciliation error")) def create_payment_reconciliation(self, party_type, party, party_account): pr = frappe.new_doc("Payment Reconciliation") -- GitLab