diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index 07a098a7c186c9e11a1e836a21f54d932952de2a..ac107d611220b0c927bb6771319661e5dec9d854 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -287,7 +287,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) @@ -327,7 +327,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 be6f951f5465d04cc8134ddc2643bd32e0870f8e..b9471b572c663b3dea643dedb4375dc064e3acb0 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")