[fix] Multi currency advance payment against Order
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.js b/erpnext/accounts/doctype/payment_tool/payment_tool.js
index ec15b47..e15694c 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.js
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.js
@@ -42,6 +42,10 @@
frappe.ui.form.trigger("Payment Tool", "party_type");
});
+frappe.ui.form.on("Payment Tool", "party_type", function(frm) {
+ frm.set_value("received_or_paid", frm.doc.party_type=="Customer" ? "Received" : "Paid");
+});
+
frappe.ui.form.on("Payment Tool", "party", function(frm) {
if(frm.doc.party_type && frm.doc.party) {
return frappe.call({
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.py b/erpnext/accounts/doctype/payment_tool/payment_tool.py
index 19527d3..3648306 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.py
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py
@@ -71,7 +71,9 @@
d2.account = self.payment_account
d2.account_currency = bank_account_currency
d2.account_type = bank_account_type
- d2.exchange_rate = get_exchange_rate(self.payment_account, self.company)
+ d2.exchange_rate = get_exchange_rate(self.payment_account, bank_account_currency, self.company,
+ debit=(abs(total_payment_amount) if total_payment_amount < 0 else 0),
+ credit=(total_payment_amount if total_payment_amount > 0 else 0))
d2.account_balance = get_balance_on(self.payment_account)
amount_field_bank = 'debit_in_account_currency' if total_payment_amount < 0 \
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index 277229a..69e5185 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -1610,6 +1610,7 @@
"label": "Advance Paid",
"length": 0,
"no_copy": 1,
+ "options": "party_account_currency",
"permlevel": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
@@ -1972,6 +1973,31 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "fieldname": "party_account_currency",
+ "fieldtype": "Link",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Party Account Currency",
+ "length": 0,
+ "no_copy": 1,
+ "options": "Currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "column_break_74",
"fieldtype": "Column Break",
"hidden": 0,
@@ -2508,7 +2534,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-01-15 04:13:35.179163",
+ "modified": "2016-01-27 15:15:05.213016",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 81e5f9e..b8acf68 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -386,27 +386,37 @@
def set_total_advance_paid(self):
if self.doctype == "Sales Order":
dr_or_cr = "credit_in_account_currency"
+ party = self.customer
else:
dr_or_cr = "debit_in_account_currency"
+ party = self.supplier
- advance_paid = frappe.db.sql("""
+ advance = frappe.db.sql("""
select
- sum({dr_or_cr})
+ account_currency, sum({dr_or_cr}) as amount
from
`tabJournal Entry Account`
where
- reference_type = %s and reference_name = %s
+ reference_type = %s and reference_name = %s and party=%s
and docstatus = 1 and is_advance = "Yes"
- """.format(dr_or_cr=dr_or_cr), (self.doctype, self.name))
+ """.format(dr_or_cr=dr_or_cr), (self.doctype, self.name, party), as_dict=1)
- if advance_paid:
- advance_paid = flt(advance_paid[0][0], self.precision("advance_paid"))
- if flt(self.base_grand_total) >= advance_paid:
- frappe.db.set_value(self.doctype, self.name, "advance_paid", advance_paid)
- else:
- frappe.throw(_("Total advance ({0}) against Order {1} cannot be greater \
- than the Grand Total ({2})")
- .format(advance_paid, self.name, self.base_grand_total))
+ if advance:
+ advance_paid = flt(advance[0].amount, self.precision("advance_paid"))
+
+ frappe.db.set_value(self.doctype, self.name, "party_account_currency",
+ advance[0].account_currency)
+
+ if advance[0].account_currency == self.currency:
+ order_total = self.grand_total
+ else:
+ order_total = self.base_grand_total
+
+ if order_total >= advance_paid:
+ frappe.db.set_value(self.doctype, self.name, "advance_paid", advance_paid)
+ else:
+ frappe.throw(_("Total advance ({0}) against Order {1} cannot be greater than the Grand Total ({2})")
+ .format(advance_paid, self.name, order_total))
@property
def company_abbr(self):
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index ee97334..fa21f0e 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -1569,7 +1569,7 @@
"label": "Advance Paid",
"length": 0,
"no_copy": 1,
- "options": "Company:company:default_currency",
+ "options": "party_account_currency",
"permlevel": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
@@ -1963,6 +1963,31 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "fieldname": "party_account_currency",
+ "fieldtype": "Link",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Party Account Currency",
+ "length": 0,
+ "no_copy": 1,
+ "options": "Currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "column_break_77",
"fieldtype": "Column Break",
"hidden": 0,
@@ -2802,7 +2827,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2015-12-29 12:32:45.649349",
+ "modified": "2016-01-27 15:16:00.560261",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order",