From db48b7d7647e011241761369b4f0829b3d9cb045 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 2 Oct 2015 12:05:55 +0530 Subject: [PATCH] [fix] Payment Reconciliation in multi-currency --- .../payment_reconciliation.js | 39 +++++++++++-------- .../payment_reconciliation.py | 27 ++++++------- erpnext/accounts/utils.py | 15 ++++++- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js index ab6db9d381..eb84cb0c85 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js @@ -74,21 +74,7 @@ erpnext.accounts.PaymentReconciliationController = frappe.ui.form.Controller.ext doc: me.frm.doc, method: 'get_unreconciled_entries', callback: function(r, rt) { - var invoices = []; - - $.each(me.frm.doc.invoices || [], function(i, row) { - if (row.invoice_number && !inList(invoices, row.invoice_number)) - invoices.push(row.invoice_type + " | " + row.invoice_number); - }); - - frappe.meta.get_docfield("Payment Reconciliation Payment", "invoice_number", - me.frm.doc.name).options = invoices.join("\n"); - - $.each(me.frm.doc.payments || [], function(i, p) { - if(!inList(invoices, cstr(p.invoice_number))) p.invoice_number = null; - }); - - refresh_field("payments"); + me.set_invoice_options(); } }); @@ -98,8 +84,29 @@ erpnext.accounts.PaymentReconciliationController = frappe.ui.form.Controller.ext var me = this; return this.frm.call({ doc: me.frm.doc, - method: 'reconcile' + method: 'reconcile', + callback: function(r, rt) { + me.set_invoice_options(); + } }); + }, + + set_invoice_options: function() { + var invoices = []; + + $.each(me.frm.doc.invoices || [], function(i, row) { + if (row.invoice_number && !inList(invoices, row.invoice_number)) + invoices.push(row.invoice_type + " | " + row.invoice_number); + }); + + frappe.meta.get_docfield("Payment Reconciliation Payment", "invoice_number", + me.frm.doc.name).options = invoices.join("\n"); + + $.each(me.frm.doc.payments || [], function(i, p) { + if(!inList(invoices, cstr(p.invoice_number))) p.invoice_number = null; + }); + + refresh_field("payments"); } }); diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index 81bfec5b0f..13b8f02bbb 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -3,11 +3,8 @@ from __future__ import unicode_literals import frappe - from frappe.utils import flt - from frappe import msgprint, _ - from frappe.model.document import Document class PaymentReconciliation(Document): @@ -17,7 +14,8 @@ class PaymentReconciliation(Document): def get_jv_entries(self): self.check_mandatory_to_fetch() - dr_or_cr = "credit" if self.party_type == "Customer" else "debit" + dr_or_cr = "credit_in_account_currency" if self.party_type == "Customer" \ + else "debit_in_account_currency" cond = self.check_condition(dr_or_cr) @@ -68,7 +66,7 @@ class PaymentReconciliation(Document): def get_invoice_entries(self): #Fetch JVs, Sales and Purchase Invoices for 'invoices' to reconcile against non_reconciled_invoices = [] - dr_or_cr = "debit" if self.party_type == "Customer" else "credit" + dr_or_cr = "debit_in_account_currency" if self.party_type == "Customer" else "credit_in_account_currency" cond = self.check_condition(dr_or_cr) invoice_list = frappe.db.sql(""" @@ -106,13 +104,15 @@ class PaymentReconciliation(Document): and account = %(account)s and {0} > 0 and against_voucher_type = %(against_voucher_type)s and ifnull(against_voucher, '') = %(against_voucher)s - """.format("credit" if self.party_type == "Customer" else "debit"), { - "party_type": self.party_type, - "party": self.party, - "account": self.receivable_payable_account, - "against_voucher_type": d.voucher_type, - "against_voucher": d.voucher_no - }) + """.format("credit_in_account_currency" if self.party_type == "Customer" + else "debit_in_account_currency"), { + "party_type": self.party_type, + "party": self.party, + "account": self.receivable_payable_account, + "against_voucher_type": d.voucher_type, + "against_voucher": d.voucher_no + } + ) payment_amount = payment_amount[0][0] if payment_amount else 0 @@ -147,7 +147,8 @@ class PaymentReconciliation(Document): self.get_invoice_entries() self.validate_invoice() - dr_or_cr = "credit" if self.party_type == "Customer" else "debit" + dr_or_cr = "credit_in_account_currency" if self.party_type == "Customer" \ + else "debit_in_account_currency" lst = [] for e in self.get('payments'): if e.invoice_number and e.allocated_amount: diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 2a77fa1465..199769416e 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -198,6 +198,8 @@ def update_against_doc(d, jv_obj): """ jv_detail = jv_obj.get("accounts", {"name": d["voucher_detail_no"]})[0] jv_detail.set(d["dr_or_cr"], d["allocated_amt"]) + jv_detail.set('debit' if d['dr_or_cr']=='debit_in_account_currency' else 'credit', + d["allocated_amt"]*flt(jv_detail.exchange_rate)) original_reference_type = jv_detail.reference_type original_reference_name = jv_detail.reference_name @@ -210,6 +212,9 @@ def update_against_doc(d, jv_obj): select cost_center, balance, against_account, is_advance, account_type, exchange_rate from `tabJournal Entry Account` where name = %s """, d['voucher_detail_no'], as_dict=True) + + amount_in_account_currency = flt(d['unadjusted_amt']) - flt(d['allocated_amt']) + amount_in_company_currency = amount_in_account_currency * flt(jvd[0]['exchange_rate']) # new entry with balance amount ch = jv_obj.append("accounts") @@ -220,8 +225,14 @@ def update_against_doc(d, jv_obj): ch.party = d["party"] ch.cost_center = cstr(jvd[0]["cost_center"]) ch.balance = flt(jvd[0]["balance"]) - ch.set(d['dr_or_cr'], flt(d['unadjusted_amt']) - flt(d['allocated_amt'])) - ch.set(d['dr_or_cr']== 'debit' and 'credit' or 'debit', 0) + + ch.set(d['dr_or_cr'], amount_in_account_currency) + ch.set('debit' if d['dr_or_cr']=='debit_in_account_currency' else 'credit', amount_in_company_currency) + + ch.set('credit_in_account_currency' if d['dr_or_cr']== 'debit_in_account_currency' + else 'debit_in_account_currency', 0) + ch.set('credit' if d['dr_or_cr']== 'debit_in_account_currency' else 'debit', 0) + ch.against_account = cstr(jvd[0]["against_account"]) ch.reference_type = original_reference_type ch.reference_name = original_reference_name