diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index 2d844bb189..c114c52776 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -18,29 +18,23 @@ class PaymentReconciliation(Document): def get_jv_entries(self): self.check_mandatory_to_fetch() dr_or_cr = "credit" if self.party_type == "Customer" else "debit" - if self.party_type=="Customer": - amount_query = "ifnull(t2.credit, 0) - ifnull(t2.debit, 0)" - else: - amount_query = "ifnull(t2.debit, 0) - ifnull(t2.credit, 0)" - - cond = self.check_condition(amount_query) + + cond = self.check_condition(dr_or_cr) bank_account_condition = "t2.against_account like %(bank_cash_account)s" \ if self.bank_cash_account else "1=1" jv_entries = frappe.db.sql(""" select - t1.name as voucher_no, t1.posting_date, t1.remark, t2.account, - t2.name as voucher_detail_no, {amount_query} as payment_amount, t2.is_advance + t1.name as voucher_no, t1.posting_date, t1.remark, t2.account, + t2.name as voucher_detail_no, {dr_or_cr} as payment_amount, t2.is_advance from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2 where t1.name = t2.parent and t1.docstatus = 1 and t2.docstatus = 1 - and t2.account = %(party_account)s and {amount_query} > 0 - and ifnull((select ifnull(sum(ifnull(credit, 0) - ifnull(debit, 0)), 0) from `tabJournal Voucher Detail` - where parent=t1.name and account=t2.account and docstatus=1 group by account), 0) > 0 - and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')='' - and ifnull(t2.against_jv, '')='' {cond} + and t2.account = %(party_account)s and {dr_or_cr} > 0 + and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')='' + and ifnull(t2.against_jv, '')='' {cond} and (CASE WHEN t1.voucher_type in ('Debit Note', 'Credit Note') THEN 1=1 @@ -50,7 +44,6 @@ class PaymentReconciliation(Document): "dr_or_cr": dr_or_cr, "cond": cond, "bank_account_condition": bank_account_condition, - "amount_query": amount_query }), { "party_account": self.party_account, "bank_cash_account": "%%%s%%" % self.bank_cash_account @@ -73,49 +66,42 @@ class PaymentReconciliation(Document): #Fetch JVs, Sales and Purchase Invoices for 'payment_reconciliation_invoices' to reconcile against non_reconciled_invoices = [] dr_or_cr = "debit" if self.party_type == "Customer" else "credit" - if self.party_type=="Customer": - amount_query = "ifnull(debit, 0) - ifnull(credit, 0)" - else: - amount_query = "ifnull(credit, 0) - ifnull(debit, 0)" - - cond = self.check_condition(amount_query) + cond = self.check_condition(dr_or_cr) invoice_list = frappe.db.sql(""" select - voucher_no, voucher_type, posting_date, - ifnull(sum({amount_query}), 0) as invoice_amount + voucher_no, voucher_type, posting_date, + ifnull(sum({dr_or_cr}), 0) as invoice_amount from `tabGL Entry` where - account = %s and {amount_query} > 0 {cond} + account = %s and {dr_or_cr} > 0 {cond} group by voucher_type, voucher_no """.format(**{ "cond": cond, - "amount_query": amount_query + "dr_or_cr": dr_or_cr }), (self.party_account), as_dict=True) for d in invoice_list: payment_amount = frappe.db.sql(""" select - ifnull(sum(ifnull({amount_query}, 0)), 0) + ifnull(sum(ifnull({0}, 0)), 0) from `tabGL Entry` where - account = %s and {amount_query} < 0 + account = %s and {0} > 0 and against_voucher_type = %s and ifnull(against_voucher, '') = %s - """.format(**{ - "cond": cond, - "amount_query": amount_query - }), (self.party_account, d.voucher_type, d.voucher_no)) - + """.format("credit" if self.party_type == "Customer" else "debit"), + (self.party_account, d.voucher_type, d.voucher_no)) + payment_amount = -1*payment_amount[0][0] if payment_amount else 0 if d.invoice_amount > payment_amount: non_reconciled_invoices.append({ - 'voucher_no': d.voucher_no, - 'voucher_type': d.voucher_type, - 'posting_date': d.posting_date, - 'invoice_amount': flt(d.invoice_amount), + 'voucher_no': d.voucher_no, + 'voucher_type': d.voucher_type, + 'posting_date': d.posting_date, + 'invoice_amount': flt(d.invoice_amount), 'outstanding_amount': d.invoice_amount - payment_amount}) self.add_invoice_entries(non_reconciled_invoices) @@ -123,7 +109,7 @@ class PaymentReconciliation(Document): def add_invoice_entries(self, non_reconciled_invoices): #Populate 'payment_reconciliation_invoices' with JVs and Invoices to reconcile against self.set('payment_reconciliation_invoices', []) - + for e in non_reconciled_invoices: ent = self.append('payment_reconciliation_invoices', {}) ent.invoice_type = e.get('voucher_type') @@ -166,14 +152,14 @@ class PaymentReconciliation(Document): def validate_invoice(self): if not self.get("payment_reconciliation_invoices"): frappe.throw(_("No records found in the Invoice table")) - + if not self.get("payment_reconciliation_payments"): frappe.throw(_("No records found in the Payment table")) - + unreconciled_invoices = frappe._dict() for d in self.get("payment_reconciliation_invoices"): unreconciled_invoices.setdefault(d.invoice_type, {}).setdefault(d.invoice_number, d.outstanding_amount) - + invoices_to_reconcile = [] for p in self.get("payment_reconciliation_payments"): if p.invoice_type and p.invoice_number: @@ -189,13 +175,13 @@ class PaymentReconciliation(Document): if not invoices_to_reconcile: frappe.throw(_("Please select Invoice Type and Invoice Number in atleast one row")) - def check_condition(self, amount_query): + def check_condition(self, dr_or_cr): cond = self.from_date and " and posting_date >= '" + self.from_date + "'" or "" cond += self.to_date and " and posting_date <= '" + self.to_date + "'" or "" if self.minimum_amount: - cond += " and {0} >= %s".format(amount_query) % self.minimum_amount + cond += " and {0} >= %s".format(dr_or_cr) % self.minimum_amount if self.maximum_amount: - cond += " and {0} <= %s".format(amount_query) % self.maximum_amount + cond += " and {0} <= %s".format(dr_or_cr) % self.maximum_amount - return cond \ No newline at end of file + return cond