Multi currency: test case and fixes
diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index 82c9c66..737b07e 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -11,6 +11,8 @@
"fields": [
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "properties",
"fieldtype": "Section Break",
"hidden": 0,
@@ -31,6 +33,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "column_break0",
"fieldtype": "Column Break",
"hidden": 0,
@@ -50,6 +54,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "account_name",
"fieldtype": "Data",
"hidden": 0,
@@ -71,6 +77,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"default": "0",
"fieldname": "is_group",
"fieldtype": "Check",
@@ -92,6 +100,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
@@ -114,6 +124,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "root_type",
"fieldtype": "Select",
"hidden": 0,
@@ -134,6 +146,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "report_type",
"fieldtype": "Select",
"hidden": 0,
@@ -154,7 +168,10 @@
},
{
"allow_on_submit": 0,
- "fieldname": "currency",
+ "bold": 0,
+ "collapsible": 0,
+ "depends_on": "eval:doc.is_group==0",
+ "fieldname": "account_currency",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -175,6 +192,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "column_break1",
"fieldtype": "Column Break",
"hidden": 0,
@@ -194,6 +213,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "parent_account",
"fieldtype": "Link",
"hidden": 0,
@@ -216,6 +237,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"description": "",
"fieldname": "account_type",
"fieldtype": "Select",
@@ -239,6 +262,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"description": "Rate at which this tax is applied",
"fieldname": "tax_rate",
"fieldtype": "Float",
@@ -261,6 +286,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"description": "If the account is frozen, entries are allowed to restricted users.",
"fieldname": "freeze_account",
"fieldtype": "Select",
@@ -284,6 +311,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "warehouse",
"fieldtype": "Link",
"hidden": 0,
@@ -304,6 +333,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "balance_must_be",
"fieldtype": "Select",
"hidden": 0,
@@ -324,6 +355,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "lft",
"fieldtype": "Int",
"hidden": 1,
@@ -343,6 +376,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "rgt",
"fieldtype": "Int",
"hidden": 1,
@@ -362,6 +397,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "old_parent",
"fieldtype": "Data",
"hidden": 1,
@@ -389,7 +426,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 0,
- "modified": "2015-08-13 16:43:10.645538",
+ "modified": "2015-08-28 17:17:20.899845",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account",
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index a57cc25..7f632b1 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -89,10 +89,10 @@
frappe.throw(_("Account balance already in Credit, you are not allowed to set 'Balance Must Be' as 'Debit'"))
def validate_account_currency(self):
- if not self.currency:
- self.currency = frappe.db.get_value("Company", self.company, "default_currency")
+ if not self.account_currency:
+ self.account_currency = frappe.db.get_value("Company", self.company, "default_currency")
- elif self.currency != frappe.db.get_value("Account", self.name, "currency"):
+ elif self.account_currency != frappe.db.get_value("Account", self.name, "account_currency"):
if frappe.db.get_value("GL Entry", {"account": self.name}):
frappe.throw(_("Currency can not be changed after making entries using some other currency"))
diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py
index 2a3feda..83516da 100644
--- a/erpnext/accounts/doctype/account/test_account.py
+++ b/erpnext/accounts/doctype/account/test_account.py
@@ -9,36 +9,39 @@
accounts = [
# [account_name, parent_account, is_group]
- ["_Test Account Bank Account", "Bank Accounts", 0, "Bank"],
+ ["_Test Bank", "Bank Accounts", 0, "Bank", None],
+ ["_Test Bank USD", "Bank Accounts", 0, "Bank", "USD"],
+ ["_Test Bank EUR", "Bank Accounts", 0, "Bank", "EUR"],
- ["_Test Account Stock Expenses", "Direct Expenses", 1, None],
- ["_Test Account Shipping Charges", "_Test Account Stock Expenses", 0, "Chargeable"],
- ["_Test Account Customs Duty", "_Test Account Stock Expenses", 0, "Tax"],
- ["_Test Account Insurance Charges", "_Test Account Stock Expenses", 0, "Chargeable"],
- ["_Test Account Stock Adjustment", "_Test Account Stock Expenses", 0, "Stock Adjustment"],
+ ["_Test Account Stock Expenses", "Direct Expenses", 1, None, None],
+ ["_Test Account Shipping Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
+ ["_Test Account Customs Duty", "_Test Account Stock Expenses", 0, "Tax", None],
+ ["_Test Account Insurance Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
+ ["_Test Account Stock Adjustment", "_Test Account Stock Expenses", 0, "Stock Adjustment", None],
+ ["_Test Account Tax Assets", "Current Assets", 1, None, None],
+ ["_Test Account VAT", "_Test Account Tax Assets", 0, "Tax", None],
+ ["_Test Account Service Tax", "_Test Account Tax Assets", 0, "Tax", None],
- ["_Test Account Tax Assets", "Current Assets", 1, None],
- ["_Test Account VAT", "_Test Account Tax Assets", 0, "Tax"],
- ["_Test Account Service Tax", "_Test Account Tax Assets", 0, "Tax"],
+ ["_Test Account Reserves and Surplus", "Current Liabilities", 0, None, None],
- ["_Test Account Reserves and Surplus", "Current Liabilities", 0, None],
-
- ["_Test Account Cost for Goods Sold", "Expenses", 0, None],
- ["_Test Account Excise Duty", "_Test Account Tax Assets", 0, "Tax"],
- ["_Test Account Education Cess", "_Test Account Tax Assets", 0, "Tax"],
- ["_Test Account S&H Education Cess", "_Test Account Tax Assets", 0, "Tax"],
- ["_Test Account CST", "Direct Expenses", 0, "Tax"],
- ["_Test Account Discount", "Direct Expenses", 0, None],
- ["_Test Write Off", "Indirect Expenses", 0, None],
+ ["_Test Account Cost for Goods Sold", "Expenses", 0, None, None],
+ ["_Test Account Excise Duty", "_Test Account Tax Assets", 0, "Tax", None],
+ ["_Test Account Education Cess", "_Test Account Tax Assets", 0, "Tax", None],
+ ["_Test Account S&H Education Cess", "_Test Account Tax Assets", 0, "Tax", None],
+ ["_Test Account CST", "Direct Expenses", 0, "Tax", None],
+ ["_Test Account Discount", "Direct Expenses", 0, None, None],
+ ["_Test Write Off", "Indirect Expenses", 0, None, None],
# related to Account Inventory Integration
- ["_Test Account Stock In Hand", "Current Assets", 0, None],
- ["_Test Account Fixed Assets", "Current Assets", 0, None],
+ ["_Test Account Stock In Hand", "Current Assets", 0, None, None],
+ ["_Test Account Fixed Assets", "Current Assets", 0, None, None],
# Receivable / Payable Account
- ["_Test Receivable", "Current Assets", 0, "Receivable"],
- ["_Test Payable", "Current Liabilities", 0, "Payable"],
+ ["_Test Receivable", "Current Assets", 0, "Receivable", None],
+ ["_Test Payable", "Current Liabilities", 0, "Payable", None],
+ ["_Test Receivable USD", "Current Assets", 0, "Receivable", "USD"],
+ ["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"]
]
for company, abbr in [["_Test Company", "_TC"], ["_Test Company 1", "_TC1"]]:
@@ -48,7 +51,8 @@
"parent_account": parent_account + " - " + abbr,
"company": company,
"is_group": is_group,
- "account_type": account_type
- } for account_name, parent_account, is_group, account_type in accounts])
+ "account_type": account_type,
+ "account_currency": currency
+ } for account_name, parent_account, is_group, account_type, currency in accounts])
return test_objects
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json
index dfe9fc3..23a44aa 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.json
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json
@@ -10,6 +10,8 @@
"fields": [
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "posting_date",
"fieldtype": "Date",
"hidden": 0,
@@ -31,6 +33,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "transaction_date",
"fieldtype": "Date",
"hidden": 0,
@@ -52,6 +56,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "account",
"fieldtype": "Link",
"hidden": 0,
@@ -74,6 +80,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "party_type",
"fieldtype": "Link",
"hidden": 0,
@@ -94,6 +102,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "party",
"fieldtype": "Dynamic Link",
"hidden": 0,
@@ -114,6 +124,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "cost_center",
"fieldtype": "Link",
"hidden": 0,
@@ -136,6 +148,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "debit",
"fieldtype": "Currency",
"hidden": 0,
@@ -158,6 +172,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "credit",
"fieldtype": "Currency",
"hidden": 0,
@@ -180,7 +196,9 @@
},
{
"allow_on_submit": 0,
- "fieldname": "currency",
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "account_currency",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -201,6 +219,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "debit_in_account_currency",
"fieldtype": "Currency",
"hidden": 0,
@@ -222,6 +242,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "credit_in_account_currency",
"fieldtype": "Currency",
"hidden": 0,
@@ -243,6 +265,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "against",
"fieldtype": "Text",
"hidden": 0,
@@ -264,6 +288,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "against_voucher_type",
"fieldtype": "Link",
"hidden": 0,
@@ -286,6 +312,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "against_voucher",
"fieldtype": "Dynamic Link",
"hidden": 0,
@@ -308,6 +336,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "voucher_type",
"fieldtype": "Link",
"hidden": 0,
@@ -330,6 +360,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "voucher_no",
"fieldtype": "Dynamic Link",
"hidden": 0,
@@ -352,6 +384,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "remarks",
"fieldtype": "Text",
"hidden": 0,
@@ -373,6 +407,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "is_opening",
"fieldtype": "Select",
"hidden": 0,
@@ -395,6 +431,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "is_advance",
"fieldtype": "Select",
"hidden": 0,
@@ -417,6 +455,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "fiscal_year",
"fieldtype": "Link",
"hidden": 0,
@@ -439,6 +479,8 @@
},
{
"allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
@@ -469,7 +511,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 0,
- "modified": "2015-08-18 14:25:44.430671",
+ "modified": "2015-08-28 17:14:52.661217",
"modified_by": "Administrator",
"module": "Accounts",
"name": "GL Entry",
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index b37b404..83edf1d 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -10,6 +10,8 @@
from frappe.model.document import Document
class CustomerFrozen(frappe.ValidationError): pass
+class InvalidCurrency(frappe.ValidationError): pass
+class InvalidAccountCurrency(frappe.ValidationError): pass
class GLEntry(Document):
def validate(self):
@@ -102,27 +104,31 @@
def validate_currency(self):
company_currency = frappe.db.get_value("Company", self.company, "default_currency")
- account_currency = frappe.db.get_value("Account", self.account, "currency") or company_currency
+ account_currency = frappe.db.get_value("Account", self.account, "account_currency") or company_currency
- if not self.currency:
- self.currency = company_currency
- if account_currency != self.currency:
+ if not self.account_currency:
+ self.account_currency = company_currency
+ if account_currency != self.account_currency:
frappe.throw(_("Accounting Entry for {0} can only be made in currency: {1}")
- .format(self.account, (account_currency or company_currency)))
+ .format(self.account, (account_currency or company_currency)), InvalidAccountCurrency)
+
if self.party_type and self.party:
existing_gle = frappe.db.get_value("GL Entry", {"party_type": self.party_type,
- "party": self.party, "company": self.company}, ["name", "currency"], as_dict=1)
+ "party": self.party, "company": self.company}, ["name", "account_currency"], as_dict=1)
if not existing_gle:
- party_currency = frappe.db.get_value(self.party_type, self.party, "default_currency") or company_currency
+ party_currency = frappe.db.get_value(self.party_type, self.party, "default_currency")\
+ or company_currency
if party_currency != account_currency:
frappe.throw(_("Invalid Account {0}. Account Currency must be {1}, same as {2}: {3}")
- .format(self.account, party_currency, self.party_type, self.party))
+ .format(self.account, party_currency, self.party_type, self.party),
+ InvalidAccountCurrency)
else:
- currency_in_existing_entries = existing_gle.currency or company_currency
- if currency_in_existing_entries != self.currency:
+ currency_in_existing_entries = existing_gle.account_currency or company_currency
+ if currency_in_existing_entries != self.account_currency:
frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
- .format(self.party_type, self.party, currency_in_existing_entries))
+ .format(self.party_type, self.party, currency_in_existing_entries),
+ InvalidAccountCurrency)
def validate_balance_type(account, adv_adj=False):
if not adv_adj and account:
diff --git a/erpnext/accounts/doctype/gl_entry/test_gl_entry.py b/erpnext/accounts/doctype/gl_entry/test_gl_entry.py
index 383409c..146d084 100644
--- a/erpnext/accounts/doctype/gl_entry/test_gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/test_gl_entry.py
@@ -11,7 +11,7 @@
frappe.db.set_value("Company", "_Test Company", "round_off_cost_center", "_Test Cost Center - _TC")
jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", 100, "_Test Cost Center - _TC", submit=False)
+ "_Test Bank - _TC", 100, "_Test Cost Center - _TC", submit=False)
jv.get("accounts")[0].debit = 100.01
jv.flags.ignore_validate = True
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index e0d580c..adf4c20 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -35,7 +35,7 @@
var company_currency = erpnext.get_currency(frm.doc.company);
var grid = frm.get_field("accounts").grid;
- grid.set_column_disp(fields, grid.currency!=company_currency);
+ grid.set_column_disp(fields, grid.account_currency!=company_currency);
}
erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
@@ -324,7 +324,7 @@
$.extend(d, r.message[0]);
refresh_field('balance', d.name, 'accounts');
refresh_field('party_type', d.name, 'accounts');
- refresh_field('currency', d.name, 'accounts');
+ refresh_field('account_currency', d.name, 'accounts');
if(r.message[1] && (!frm.doc.exchange_rate || frm.doc.exchange_rate == 1.0)) {
frm.set_value("exchange_rate", r.message[1])
@@ -339,7 +339,7 @@
var company_currency = erpnext.get_currency(frm.doc.company);
var row = locals[dt][dn];
- var exchange_rate = (row.currency==company_currency) ? 1 : frm.doc.exchange_rate;
+ var exchange_rate = (row.account_currency==company_currency) ? 1 : frm.doc.exchange_rate;
frappe.model.set_value(dt, dn, "debit",
flt(flt(row.debit_in_account_currency)*exchange_rate), precision("debit", row));
@@ -349,7 +349,7 @@
var company_currency = erpnext.get_currency(frm.doc.company);
var row = locals[dt][dn];
- var exchange_rate = (row.currency==company_currency) ? 1 : frm.doc.exchange_rate;
+ var exchange_rate = (row.account_currency==company_currency) ? 1 : frm.doc.exchange_rate;
frappe.model.set_value(dt, dn, "credit",
flt(flt(row.credit_in_account_currency)*exchange_rate), precision("credit", row));
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index d61e63a..57d9f0d 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cstr, flt, fmt_money, formatdate, getdate, date_diff
+from frappe.utils import cstr, flt, fmt_money, formatdate
from frappe import msgprint, _, scrub
from erpnext.setup.utils import get_company_currency, get_exchange_rate
from erpnext.controllers.accounts_controller import AccountsController
@@ -248,13 +248,18 @@
self.difference = flt(self.total_debit, self.precision("total_debit")) - \
flt(self.total_credit, self.precision("total_credit"))
- print self.difference
+
if self.difference:
frappe.throw(_("Total Debit must be equal to Total Credit. The difference is {0}")
.format(self.difference))
def validate_multi_currency(self):
- alternate_currency = [d.currency for d in self.get("accounts") if d.currency!=self.company_currency]
+ alternate_currency = []
+ for d in self.get("accounts"):
+ d.account_currency = frappe.db.get_value("Account", d.account, "account_currency") or self.company_currency
+
+ if d.account_currency!=self.company_currency:
+ alternate_currency.append(d.account_currency)
if alternate_currency:
if not self.exchange_rate:
@@ -266,10 +271,7 @@
self.exchange_rate = 1.0
for d in self.get("accounts"):
- if not d.currency:
- d.currency = frappe.db.get_value("Account", d.account, "currency") or self.company_currency
-
- exchange_rate = self.exchange_rate if d.currency != self.company_currency else 1
+ exchange_rate = self.exchange_rate if d.account_currency != self.company_currency else 1
d.debit = flt(flt(d.debit_in_account_currency)*exchange_rate, d.precision("debit"))
d.credit = flt(flt(d.credit_in_account_currency)*exchange_rate, d.precision("credit"))
@@ -340,7 +342,7 @@
"against": d.against_account,
"debit": flt(d.debit, d.precision("debit")),
"credit": flt(d.credit, d.precision("credit")),
- "currency": d.currency,
+ "account_currency": d.account_currency,
"debit_in_account_currency": flt(d.debit_in_account_currency, d.precision("debit_in_account_currency")),
"credit_in_account_currency": flt(d.credit_in_account_currency, d.precision("credit_in_account_currency")),
"against_voucher_type": d.reference_type,
@@ -488,12 +490,12 @@
jv.get("accounts")[0].party = si.customer
jv.get("accounts")[0].balance = get_balance_on(si.debit_to)
jv.get("accounts")[0].party_balance = get_balance_on(party=si.customer, party_type="Customer")
- jv.get("accounts")[0].credit = si.outstanding_amount
+ jv.get("accounts")[0].credit_in_account_currency = si.outstanding_amount
jv.get("accounts")[0].reference_type = si.doctype
jv.get("accounts")[0].reference_name = si.name
# debit bank
- jv.get("accounts")[1].debit = si.outstanding_amount
+ jv.get("accounts")[1].debit_in_account_currency = si.outstanding_amount
return jv.as_dict()
@@ -510,12 +512,12 @@
jv.get("accounts")[0].party = pi.supplier
jv.get("accounts")[0].balance = get_balance_on(pi.credit_to)
jv.get("accounts")[0].party_balance = get_balance_on(party=pi.supplier, party_type="Supplier")
- jv.get("accounts")[0].debit = pi.outstanding_amount
+ jv.get("accounts")[0].debit_in_account_currency = pi.outstanding_amount
jv.get("accounts")[0].reference_type = pi.doctype
jv.get("accounts")[0].reference_name = pi.name
# credit bank
- jv.get("accounts")[1].credit = pi.outstanding_amount
+ jv.get("accounts")[1].credit_in_account_currency = pi.outstanding_amount
return jv.as_dict()
@@ -524,6 +526,7 @@
"""Returns new Journal Entry document as dict for given Sales Order"""
from erpnext.accounts.utils import get_balance_on
from erpnext.accounts.party import get_party_account
+
so = frappe.get_doc("Sales Order", sales_order)
if flt(so.per_billed, 2) != 0.0:
@@ -531,9 +534,15 @@
jv = get_payment_entry(so)
jv.remark = 'Advance payment received against Sales Order {0}.'.format(so.name)
+
party_account = get_party_account(so.company, so.customer, "Customer")
-
- amount = flt(so.base_grand_total) - flt(so.advance_paid)
+ party_account_currency = frappe.db.get_value("Account", party_account, "account_currency")
+ company_currency = get_company_currency(so.company)
+
+ if party_account_currency == company_currency:
+ amount = flt(so.base_grand_total) - flt(so.advance_paid)
+ else:
+ amount = flt(so.grand_total) - flt(so.advance_paid)
# credit customer
jv.get("accounts")[0].account = party_account
@@ -541,13 +550,13 @@
jv.get("accounts")[0].party = so.customer
jv.get("accounts")[0].balance = get_balance_on(party_account)
jv.get("accounts")[0].party_balance = get_balance_on(party=so.customer, party_type="Customer")
- jv.get("accounts")[0].credit = amount
+ jv.get("accounts")[0].credit_in_account_currency = amount
jv.get("accounts")[0].reference_type = so.doctype
jv.get("accounts")[0].reference_name = so.name
jv.get("accounts")[0].is_advance = "Yes"
# debit bank
- jv.get("accounts")[1].debit = amount
+ jv.get("accounts")[1].debit_in_account_currency = amount
return jv.as_dict()
@@ -563,9 +572,15 @@
jv = get_payment_entry(po)
jv.remark = 'Advance payment made against Purchase Order {0}.'.format(po.name)
+
party_account = get_party_account(po.company, po.supplier, "Supplier")
-
- amount = flt(po.base_grand_total) - flt(po.advance_paid)
+ party_account_currency = frappe.db.get_value("Account", party_account, "account_currency")
+ company_currency = get_company_currency(po.company)
+
+ if party_account_currency == company_currency:
+ amount = flt(po.base_grand_total) - flt(po.advance_paid)
+ else:
+ amount = flt(po.grand_total) - flt(po.advance_paid)
# credit customer
jv.get("accounts")[0].account = party_account
@@ -573,13 +588,13 @@
jv.get("accounts")[0].party = po.supplier
jv.get("accounts")[0].balance = get_balance_on(party_account)
jv.get("accounts")[0].party_balance = get_balance_on(party=po.supplier, party_type="Supplier")
- jv.get("accounts")[0].debit = amount
+ jv.get("accounts")[0].debit_in_account_currency = amount
jv.get("accounts")[0].reference_type = po.doctype
jv.get("accounts")[0].reference_name = po.name
jv.get("accounts")[0].is_advance = "Yes"
# debit bank
- jv.get("accounts")[1].credit = amount
+ jv.get("accounts")[1].credit_in_account_currency = amount
return jv.as_dict()
@@ -669,7 +684,7 @@
frappe.msgprint(_("No Permission"), raise_exception=1)
company_currency = get_company_currency(company)
- account_details = frappe.db.get_value("Account", account, ["account_type", "currency"], as_dict=1)
+ account_details = frappe.db.get_value("Account", account, ["account_type", "account_currency"], as_dict=1)
if account_details.account_type == "Receivable":
party_type = "Customer"
@@ -679,12 +694,12 @@
party_type = ""
exchange_rate = None
- if account_details.currency != company_currency:
- exchange_rate = get_exchange_rate(account_details.currency, company_currency)
+ if account_details.account_currency != company_currency:
+ exchange_rate = get_exchange_rate(account_details.account_currency, company_currency)
grid_values = {
"balance": get_balance_on(account, date),
"party_type": party_type,
- "currency": account_details.currency or company_currency,
+ "account_currency": account_details.account_currency or company_currency,
}
return grid_values, exchange_rate
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py
index 8995e34..0d9cd24 100644
--- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py
@@ -101,7 +101,7 @@
self.set_total_expense_zero("2013-02-28")
jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", 40000, "_Test Cost Center - _TC", submit=True)
+ "_Test Bank - _TC", 40000, "_Test Cost Center - _TC", submit=True)
self.assertTrue(frappe.db.get_value("GL Entry",
{"voucher_type": "Journal Entry", "voucher_no": jv.name}))
@@ -112,7 +112,7 @@
self.set_total_expense_zero("2013-02-28")
jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", 40000, "_Test Cost Center - _TC")
+ "_Test Bank - _TC", 40000, "_Test Cost Center - _TC")
self.assertRaises(BudgetError, jv.submit)
@@ -126,7 +126,7 @@
self.set_total_expense_zero("2013-02-28")
jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", 150000, "_Test Cost Center - _TC")
+ "_Test Bank - _TC", 150000, "_Test Cost Center - _TC")
self.assertRaises(BudgetError, jv.submit)
@@ -136,13 +136,13 @@
self.set_total_expense_zero("2013-02-28")
jv1 = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", 20000, "_Test Cost Center - _TC", submit=True)
+ "_Test Bank - _TC", 20000, "_Test Cost Center - _TC", submit=True)
self.assertTrue(frappe.db.get_value("GL Entry",
{"voucher_type": "Journal Entry", "voucher_no": jv1.name}))
jv2 = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", 20000, "_Test Cost Center - _TC", submit=True)
+ "_Test Bank - _TC", 20000, "_Test Cost Center - _TC", submit=True)
self.assertTrue(frappe.db.get_value("GL Entry",
{"voucher_type": "Journal Entry", "voucher_no": jv2.name}))
@@ -165,32 +165,79 @@
def set_total_expense_zero(self, posting_date):
existing_expense = self.get_actual_expense(posting_date)
make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", -existing_expense, "_Test Cost Center - _TC", submit=True)
+ "_Test Bank - _TC", -existing_expense, "_Test Cost Center - _TC", submit=True)
+
+ def test_multi_currency(self):
+ jv = make_journal_entry("_Test Bank USD - _TC",
+ "_Test Bank - _TC", 100, exchange_rate=50, save=False)
+
+ jv.get("accounts")[1].credit_in_account_currency = 5000
+ jv.submit()
+
+ gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+ debit_in_account_currency, credit_in_account_currency
+ from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s
+ order by account asc""", jv.name, as_dict=1)
-def make_journal_entry(account1, account2, amount, cost_center=None, submit=False):
+ self.assertTrue(gl_entries)
+
+ expected_values = {
+ "_Test Bank USD - _TC": {
+ "account_currency": "USD",
+ "debit": 5000,
+ "debit_in_account_currency": 100,
+ "credit": 0,
+ "credit_in_account_currency": 0
+ },
+ "_Test Bank - _TC": {
+ "account_currency": "INR",
+ "debit": 0,
+ "debit_in_account_currency": 0,
+ "credit": 5000,
+ "credit_in_account_currency": 5000
+ }
+ }
+
+ for field in ("account_currency", "debit", "debit_in_account_currency", "credit", "credit_in_account_currency"):
+ for i, gle in enumerate(gl_entries):
+ self.assertEquals(expected_values[gle.account][field], gle[field])
+
+
+
+ # cancel
+ jv.cancel()
+
+ gle = frappe.db.sql("""select name from `tabGL Entry`
+ where voucher_type='Sales Invoice' and voucher_no=%s""", jv.name)
+
+ self.assertFalse(gle)
+
+def make_journal_entry(account1, account2, amount, cost_center=None, exchange_rate=1, save=True, submit=False):
jv = frappe.new_doc("Journal Entry")
jv.posting_date = "2013-02-14"
jv.company = "_Test Company"
jv.fiscal_year = "_Test Fiscal Year 2013"
jv.user_remark = "test"
+ jv.exchange_rate = exchange_rate
jv.set("accounts", [
{
"account": account1,
"cost_center": cost_center,
- "debit": amount if amount > 0 else 0,
- "credit": abs(amount) if amount < 0 else 0,
+ "debit_in_account_currency": amount if amount > 0 else 0,
+ "credit_in_account_currency": abs(amount) if amount < 0 else 0,
}, {
"account": account2,
"cost_center": cost_center,
- "credit": amount if amount > 0 else 0,
- "debit": abs(amount) if amount < 0 else 0,
+ "credit_in_account_currency": amount if amount > 0 else 0,
+ "debit_in_account_currency": abs(amount) if amount < 0 else 0,
}
])
- jv.insert()
+ if save or submit:
+ jv.insert()
- if submit:
- jv.submit()
+ if submit:
+ jv.submit()
return jv
diff --git a/erpnext/accounts/doctype/journal_entry/test_records.json b/erpnext/accounts/doctype/journal_entry/test_records.json
index f660863..5e25c3c 100644
--- a/erpnext/accounts/doctype/journal_entry/test_records.json
+++ b/erpnext/accounts/doctype/journal_entry/test_records.json
@@ -9,15 +9,15 @@
"account": "_Test Receivable - _TC",
"party_type": "Customer",
"party": "_Test Customer",
- "credit": 400.0,
- "debit": 0.0,
+ "credit_in_account_currency": 400.0,
+ "debit_in_account_currency": 0.0,
"doctype": "Journal Entry Account",
"parentfield": "accounts"
},
{
- "account": "_Test Account Bank Account - _TC",
- "credit": 0.0,
- "debit": 400.0,
+ "account": "_Test Bank - _TC",
+ "credit_in_account_currency": 0.0,
+ "debit_in_account_currency": 400.0,
"doctype": "Journal Entry Account",
"parentfield": "accounts"
}
@@ -40,15 +40,15 @@
"account": "_Test Payable - _TC",
"party_type": "Supplier",
"party": "_Test Supplier",
- "credit": 0.0,
- "debit": 400.0,
+ "credit_in_account_currency": 0.0,
+ "debit_in_account_currency": 400.0,
"doctype": "Journal Entry Account",
"parentfield": "accounts"
},
{
- "account": "_Test Account Bank Account - _TC",
- "credit": 400.0,
- "debit": 0.0,
+ "account": "_Test Bank - _TC",
+ "credit_in_account_currency": 400.0,
+ "debit_in_account_currency": 0.0,
"doctype": "Journal Entry Account",
"parentfield": "accounts"
}
@@ -71,16 +71,16 @@
"account": "_Test Receivable - _TC",
"party_type": "Customer",
"party": "_Test Customer",
- "credit": 0.0,
- "debit": 400.0,
+ "credit_in_account_currency": 0.0,
+ "debit_in_account_currency": 400.0,
"doctype": "Journal Entry Account",
"parentfield": "accounts"
},
{
"account": "Sales - _TC",
"cost_center": "_Test Cost Center - _TC",
- "credit": 400.0,
- "debit": 0.0,
+ "credit_in_account_currency": 400.0,
+ "debit_in_account_currency": 0.0,
"doctype": "Journal Entry Account",
"parentfield": "accounts"
}
diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
index fa7fcf9..11c92e2 100644
--- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
+++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
@@ -38,13 +38,13 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "currency",
+ "fieldname": "account_currency",
"fieldtype": "Link",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Currency",
+ "label": "Account Currency",
"no_copy": 1,
"options": "Currency",
"permlevel": 0,
@@ -520,7 +520,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 1,
- "modified": "2015-08-27 16:09:43.872157",
+ "modified": "2015-08-28 17:15:25.180681",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Entry Account",
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.py b/erpnext/accounts/doctype/payment_tool/payment_tool.py
index 4edbebd..4c001c5 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.py
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py
@@ -33,7 +33,8 @@
d1.party_type = self.party_type
d1.party = self.party
d1.balance = get_balance_on(self.party_account)
- d1.set("debit" if self.received_or_paid=="Paid" else "credit", flt(v.payment_amount))
+ d1.set("debit_in_account_currency" if self.received_or_paid=="Paid" \
+ else "credit_in_account_currency", flt(v.payment_amount))
d1.set("reference_type", v.against_voucher_type)
d1.set("reference_name", v.against_voucher_no)
d1.set('is_advance', 'Yes' if v.against_voucher_type in ['Sales Order', 'Purchase Order'] else 'No')
@@ -41,7 +42,8 @@
d2 = jv.append("accounts")
d2.account = self.payment_account
- d2.set('debit' if total_payment_amount < 0 else 'credit', abs(total_payment_amount))
+ d2.set('debit_in_account_currency' if total_payment_amount < 0 \
+ else 'credit_in_account_currency', abs(total_payment_amount))
if self.payment_account:
d2.balance = get_balance_on(self.payment_account)
diff --git a/erpnext/accounts/doctype/payment_tool/test_payment_tool.py b/erpnext/accounts/doctype/payment_tool/test_payment_tool.py
index 321986c..4f1c9e9 100644
--- a/erpnext/accounts/doctype/payment_tool/test_payment_tool.py
+++ b/erpnext/accounts/doctype/payment_tool/test_payment_tool.py
@@ -39,7 +39,7 @@
"party": "_Test Customer 3",
"reference_type": "Sales Order",
"reference_name": so2.name,
- "credit": 1000,
+ "credit_in_account_currency": 1000,
"is_advance": "Yes"
})
@@ -67,7 +67,7 @@
"party": "_Test Customer 3",
"reference_type": si2.doctype,
"reference_name": si2.name,
- "credit": 561.80
+ "credit_in_account_currency": 561.80
})
pi = self.create_voucher(pi_test_records[0], {
@@ -91,7 +91,7 @@
"party": "_Test Customer 3",
"party_account": "_Test Receivable - _TC",
"payment_mode": "Cheque",
- "payment_account": "_Test Account Bank Account - _TC",
+ "payment_account": "_Test Bank - _TC",
"reference_no": "123456",
"reference_date": "2013-02-14"
}
@@ -117,10 +117,10 @@
def create_against_jv(self, test_record, args):
jv = frappe.copy_doc(test_record)
jv.get("accounts")[0].update(args)
- if args.get("debit"):
- jv.get("accounts")[1].credit = args["debit"]
- elif args.get("credit"):
- jv.get("accounts")[1].debit = args["credit"]
+ if args.get("debit_in_account_currency"):
+ jv.get("accounts")[1].credit_in_account_currency = args["debit_in_account_currency"]
+ elif args.get("credit_in_account_currency"):
+ jv.get("accounts")[1].debit_in_account_currency = args["credit_in_account_currency"]
jv.insert()
jv.submit()
@@ -141,7 +141,8 @@
outstanding_entries = get_outstanding_vouchers(json.dumps(args))
for d in outstanding_entries:
- self.assertEquals(flt(d.get("outstanding_amount"), 2), expected_outstanding.get(d.get("voucher_type"))[1])
+ self.assertEquals(flt(d.get("outstanding_amount"), 2),
+ expected_outstanding.get(d.get("voucher_type"))[1])
self.check_jv_entries(doc, outstanding_entries, expected_outstanding)
@@ -156,11 +157,10 @@
paytool.total_payment_amount = 300
new_jv = paytool.make_journal_entry()
-
for jv_entry in new_jv.get("accounts"):
if paytool.party_account == jv_entry.get("account") and paytool.party == jv_entry.get("party"):
- self.assertEquals(100.00,
- jv_entry.get("debit" if paytool.party_type=="Supplier" else "credit"))
+ self.assertEquals(100.00, jv_entry.get("debit_in_account_currency"
+ if paytool.party_type=="Supplier" else "credit_in_account_currency"))
self.assertEquals(jv_entry.reference_name,
expected_outstanding[jv_entry.reference_type][0])
@@ -170,4 +170,6 @@
def clear_table_entries(self):
frappe.db.sql("""delete from `tabGL Entry` where party in ("_Test Customer 3", "_Test Supplier 1")""")
frappe.db.sql("""delete from `tabSales Order` where customer = "_Test Customer 3" """)
+ frappe.db.sql("""delete from `tabSales Invoice` where customer = "_Test Customer 3" """)
frappe.db.sql("""delete from `tabPurchase Order` where supplier = "_Test Supplier 1" """)
+ frappe.db.sql("""delete from `tabPurchase Invoice` where supplier = "_Test Supplier 1" """)
diff --git a/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
index afff47f..0b59746 100644
--- a/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
+++ b/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
@@ -10,11 +10,11 @@
class TestPeriodClosingVoucher(unittest.TestCase):
def test_closing_entry(self):
- make_journal_entry("_Test Account Bank Account - _TC", "Sales - _TC", 400,
+ make_journal_entry("_Test Bank - _TC", "Sales - _TC", 400,
"_Test Cost Center - _TC", submit=True)
make_journal_entry("_Test Account Cost for Goods Sold - _TC",
- "_Test Account Bank Account - _TC", 600, "_Test Cost Center - _TC", submit=True)
+ "_Test Bank - _TC", 600, "_Test Cost Center - _TC", submit=True)
profit_or_loss = frappe.db.sql("""select sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) as balance
from `tabGL Entry` t1, `tabAccount` t2
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 1a59135..b640dda 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -269,7 +269,7 @@
valuation_tax = {}
for tax in self.get("taxes"):
if tax.category in ("Total", "Valuation and Total") and flt(tax.base_tax_amount_after_discount_amount):
- account_currency = frappe.db.get_value("Account", tax.account_head, "currency")
+ account_currency = frappe.db.get_value("Account", tax.account_head, "account_currency")
dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit"
@@ -298,7 +298,7 @@
stock_items = self.get_stock_items()
for item in self.get("items"):
if flt(item.base_net_amount):
- account_currency = frappe.db.get_value("Account", item.expense_account, "currency")
+ account_currency = frappe.db.get_value("Account", item.expense_account, "account_currency")
gl_entries.append(
self.get_gl_dict({
"account": item.expense_account,
@@ -360,7 +360,7 @@
# writeoff account includes petty difference in the invoice amount
# and the amount that is paid
if self.write_off_account and flt(self.write_off_amount):
- write_off_account_currency = frappe.db.get_value("Account", self.write_off_account, "currency")
+ write_off_account_currency = frappe.db.get_value("Account", self.write_off_account, "account_currency")
gl_entries.append(
self.get_gl_dict({
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 0b74948..2754ee6 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -10,6 +10,7 @@
import frappe.defaults
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory, \
test_records as pr_test_records
+from erpnext.controllers.accounts_controller import InvalidCurrency
test_dependencies = ["Item", "Cost Center"]
test_ignore = ["Serial No"]
@@ -276,6 +277,55 @@
self.assertEquals(expected_values[gle.account][1], gle.credit)
set_perpetual_inventory(0)
+
+ def test_multi_currency_gle(self):
+ set_perpetual_inventory(0)
+
+ pi = make_purchase_invoice(supplier="_Test Supplier USD", credit_to="_Test Payable USD - _TC",
+ currency="USD", conversion_rate=50)
+
+ gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+ debit_in_account_currency, credit_in_account_currency
+ from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
+ order by account asc""", pi.name, as_dict=1)
+
+ self.assertTrue(gl_entries)
+
+ expected_values = {
+ "_Test Payable USD - _TC": {
+ "account_currency": "USD",
+ "debit": 0,
+ "debit_in_account_currency": 0,
+ "credit": 12500,
+ "credit_in_account_currency": 250
+ },
+ "_Test Account Cost for Goods Sold - _TC": {
+ "account_currency": "INR",
+ "debit": 12500,
+ "debit_in_account_currency": 12500,
+ "credit": 0,
+ "credit_in_account_currency": 0
+ }
+ }
+
+ for field in ("account_currency", "debit", "debit_in_account_currency", "credit", "credit_in_account_currency"):
+ for i, gle in enumerate(gl_entries):
+ self.assertEquals(expected_values[gle.account][field], gle[field])
+
+
+ # Check for valid currency
+ pi1 = make_purchase_invoice(supplier="_Test Supplier USD", credit_to="_Test Payable USD - _TC",
+ do_not_save=True)
+
+ self.assertRaises(InvalidCurrency, pi1.save)
+
+ # cancel
+ pi.cancel()
+
+ gle = frappe.db.sql("""select name from `tabGL Entry`
+ where voucher_type='Sales Invoice' and voucher_no=%s""", pi.name)
+
+ self.assertFalse(gle)
def make_purchase_invoice(**args):
pi = frappe.new_doc("Purchase Invoice")
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 955a19b..0d1b42c 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -1145,7 +1145,7 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Discount",
+ "label": "Additional Discount",
"no_copy": 0,
"permlevel": 0,
"precision": "",
@@ -2951,7 +2951,7 @@
"is_submittable": 1,
"issingle": 0,
"istable": 0,
- "modified": "2015-08-27 16:12:12.077662",
+ "modified": "2015-08-27 16:46:11.526089",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 9639038..0871a66 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -423,22 +423,18 @@
if cint(self.is_pos) == 1:
if flt(self.paid_amount) == 0:
if self.cash_bank_account:
- paid_amount = flt(flt(self.grand_total) - flt(self.write_off_amount),
- self.precision("paid_amount"))
- base_paid_amount = flt(paid_amount*self.conversion_rate, self.precision("base_paid_amount"))
-
- frappe.db.set(self, 'paid_amount', paid_amount)
- frappe.db.set(self, 'base_paid_amount', base_paid_amount)
-
+ frappe.db.set(self, 'paid_amount',
+ flt(flt(self.grand_total) - flt(self.write_off_amount), self.precision("paid_amount")))
else:
# show message that the amount is not paid
frappe.db.set(self,'paid_amount',0)
- frappe.db.set(self,'base_paid_amount',0)
frappe.msgprint(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified"))
else:
frappe.db.set(self,'paid_amount',0)
- frappe.db.set(self,'base_paid_amount',0)
-
+
+ frappe.db.set(self, 'base_paid_amount',
+ flt(self.paid_amount*self.conversion_rate, self.precision("base_paid_amount")))
+
def check_prev_docstatus(self):
for d in self.get('items'):
if d.sales_order and frappe.db.get_value("Sales Order", d.sales_order, "docstatus") != 1:
@@ -512,7 +508,7 @@
def make_tax_gl_entries(self, gl_entries):
for tax in self.get("taxes"):
if flt(tax.base_tax_amount_after_discount_amount):
- account_currency = frappe.db.get_value("Account", tax.account_head, "currency")
+ account_currency = frappe.db.get_value("Account", tax.account_head, "account_currency")
gl_entries.append(
self.get_gl_dict({
"account": tax.account_head,
@@ -528,7 +524,7 @@
# income account gl entries
for item in self.get("items"):
if flt(item.base_net_amount):
- account_currency = frappe.db.get_value("Account", item.income_account, "currency")
+ account_currency = frappe.db.get_value("Account", item.income_account, "account_currency")
gl_entries.append(
self.get_gl_dict({
"account": item.income_account,
@@ -547,7 +543,7 @@
def make_pos_gl_entries(self, gl_entries):
if cint(self.is_pos) and self.cash_bank_account and self.paid_amount:
- bank_account_currency = frappe.db.get_value("Account", self.cash_bank_account, "currency")
+ bank_account_currency = frappe.db.get_value("Account", self.cash_bank_account, "account_currency")
# POS, make payment entries
gl_entries.append(
self.get_gl_dict({
@@ -575,7 +571,7 @@
def make_write_off_gl_entry(self, gl_entries):
# write off entries, applicable if only pos
if self.write_off_account and self.write_off_amount:
- write_off_account_currency = frappe.db.get_value("Account", self.write_off_account, "currency")
+ write_off_account_currency = frappe.db.get_value("Account", self.write_off_account, "account_currency")
gl_entries.append(
self.get_gl_dict({
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index c7a992c..e519bd3 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -7,6 +7,8 @@
from frappe.utils import nowdate, add_days, flt
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry, get_qty_after_transaction
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
+from erpnext.controllers.accounts_controller import InvalidCurrency
+from erpnext.accounts.doctype.gl_entry.gl_entry import InvalidAccountCurrency
class TestSalesInvoice(unittest.TestCase):
def make(self):
@@ -401,7 +403,7 @@
jv.cancel()
self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 561.8)
- def test_sales_invoice_gl_entry_without_aii(self):
+ def test_sales_invoice_gl_entry_without_perpetual_inventory(self):
set_perpetual_inventory(0)
si = frappe.copy_doc(test_records[1])
si.insert()
@@ -433,7 +435,7 @@
self.assertFalse(gle)
- def test_pos_gl_entry_with_aii(self):
+ def test_pos_gl_entry_with_perpetual_inventory(self):
set_perpetual_inventory()
self.make_pos_profile()
@@ -442,8 +444,7 @@
pos = copy.deepcopy(test_records[1])
pos["is_pos"] = 1
pos["update_stock"] = 1
- # pos["posting_time"] = "12:05"
- pos["cash_bank_account"] = "_Test Account Bank Account - _TC"
+ pos["cash_bank_account"] = "_Test Bank - _TC"
pos["paid_amount"] = 600.0
si = frappe.copy_doc(pos)
@@ -474,7 +475,7 @@
[stock_in_hand, 0.0, abs(sle.stock_value_difference)],
[pos["items"][0]["expense_account"], abs(sle.stock_value_difference), 0.0],
[si.debit_to, 0.0, 600.0],
- ["_Test Account Bank Account - _TC", 600.0, 0.0]
+ ["_Test Bank - _TC", 600.0, 0.0]
])
for i, gle in enumerate(sorted(gl_entries, key=lambda gle: gle.account)):
@@ -494,7 +495,7 @@
def make_pos_profile(self):
pos_profile = frappe.get_doc({
- "cash_bank_account": "_Test Account Bank Account - _TC",
+ "cash_bank_account": "_Test Bank - _TC",
"company": "_Test Company",
"cost_center": "_Test Cost Center - _TC",
"currency": "INR",
@@ -513,7 +514,7 @@
if not frappe.db.exists("POS Profile", "_Test POS Profile"):
pos_profile.insert()
- def test_si_gl_entry_with_aii_and_update_stock_with_warehouse_but_no_account(self):
+ def test_si_gl_entry_with_perpetual_inventory_and_update_stock_with_warehouse_but_no_account(self):
set_perpetual_inventory()
frappe.delete_doc("Account", "_Test Warehouse No Account - _TC")
@@ -567,7 +568,7 @@
self.assertFalse(gle)
set_perpetual_inventory(0)
- def test_sales_invoice_gl_entry_with_aii_no_item_code(self):
+ def test_sales_invoice_gl_entry_with_perpetual_inventory_no_item_code(self):
set_perpetual_inventory()
si = frappe.get_doc(test_records[1])
@@ -593,7 +594,7 @@
set_perpetual_inventory(0)
- def test_sales_invoice_gl_entry_with_aii_non_stock_item(self):
+ def test_sales_invoice_gl_entry_with_perpetual_inventory_non_stock_item(self):
set_perpetual_inventory()
si = frappe.get_doc(test_records[1])
si.get("items")[0].item_code = "_Test Non Stock Item"
@@ -841,7 +842,80 @@
self.assertEquals(si.total_taxes_and_charges, 234.44)
self.assertEquals(si.base_grand_total, 859.44)
self.assertEquals(si.grand_total, 859.44)
+
+ def test_multi_currency_gle(self):
+ set_perpetual_inventory(0)
+ si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
+ currency="USD", conversion_rate=50)
+ gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+ debit_in_account_currency, credit_in_account_currency
+ from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
+ order by account asc""", si.name, as_dict=1)
+
+ self.assertTrue(gl_entries)
+
+ expected_values = {
+ "_Test Receivable USD - _TC": {
+ "account_currency": "USD",
+ "debit": 5000,
+ "debit_in_account_currency": 100,
+ "credit": 0,
+ "credit_in_account_currency": 0
+ },
+ "Sales - _TC": {
+ "account_currency": "INR",
+ "debit": 0,
+ "debit_in_account_currency": 0,
+ "credit": 5000,
+ "credit_in_account_currency": 5000
+ }
+ }
+
+ for field in ("account_currency", "debit", "debit_in_account_currency", "credit", "credit_in_account_currency"):
+ for i, gle in enumerate(gl_entries):
+ self.assertEquals(expected_values[gle.account][field], gle[field])
+
+ # cancel
+ si.cancel()
+
+ gle = frappe.db.sql("""select name from `tabGL Entry`
+ where voucher_type='Sales Invoice' and voucher_no=%s""", si.name)
+
+ self.assertFalse(gle)
+
+ def test_invalid_currency(self):
+ # Customer currency = USD
+
+ # Transaction currency cannot be INR
+ si1 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
+ do_not_save=True)
+
+ self.assertRaises(InvalidCurrency, si1.save)
+
+ # Transaction currency cannot be EUR
+ si2 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
+ currency="EUR", conversion_rate=80, do_not_save=True)
+
+ self.assertRaises(InvalidCurrency, si2.save)
+
+ # Transaction currency only allowed in USD
+ si3 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
+ currency="USD", conversion_rate=50)
+
+ # Party Account currency must be in USD, as there is existing GLE with USD
+ si4 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable - _TC",
+ currency="USD", conversion_rate=50, do_not_submit=True)
+
+ self.assertRaises(InvalidAccountCurrency, si4.submit)
+
+ # Party Account currency must be in USD, force customer currency as there is no GLE
+
+ si3.cancel()
+ si5 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable - _TC",
+ currency="USD", conversion_rate=50, do_not_submit=True)
+
+ self.assertRaises(InvalidAccountCurrency, si5.submit)
def create_sales_invoice(**args):
si = frappe.new_doc("Sales Invoice")
@@ -856,14 +930,15 @@
si.is_pos = args.is_pos
si.is_return = args.is_return
si.return_against = args.return_against
- si.currency="INR"
- si.conversion_rate = 1
+ si.currency=args.currency or "INR"
+ si.conversion_rate = args.conversion_rate or 1
si.append("items", {
"item_code": args.item or args.item_code or "_Test Item",
"warehouse": args.warehouse or "_Test Warehouse - _TC",
"qty": args.qty or 1,
"rate": args.rate or 100,
+ "income_account": "Sales - _TC",
"expense_account": "Cost of Goods Sold - _TC",
"cost_center": "_Test Cost Center - _TC",
"serial_no": args.serial_no
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index 5627781..7fbe92b 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -212,7 +212,7 @@
description: __("Optional. This setting will be used to filter in various transactions.") },
{fieldtype:'Float', fieldname:'tax_rate', label:__('Tax Rate')},
{fieldtype:'Link', fieldname:'warehouse', label:__('Warehouse'), options:"Warehouse"},
- {fieldtype:'Link', fieldname:'currency', label:__('Currency'), options:"Currency"}
+ {fieldtype:'Link', fieldname:'account_currency', label:__('Currency'), options:"Currency"}
]
})
diff --git a/erpnext/buying/doctype/supplier/test_records.json b/erpnext/buying/doctype/supplier/test_records.json
index dfa5d46..82e0a44 100644
--- a/erpnext/buying/doctype/supplier/test_records.json
+++ b/erpnext/buying/doctype/supplier/test_records.json
@@ -1,14 +1,22 @@
[
{
- "company": "_Test Company",
"doctype": "Supplier",
"supplier_name": "_Test Supplier",
"supplier_type": "_Test Supplier Type"
},
{
- "company": "_Test Company",
"doctype": "Supplier",
"supplier_name": "_Test Supplier 1",
"supplier_type": "_Test Supplier Type"
+ },
+ {
+ "doctype": "Supplier",
+ "supplier_name": "_Test Supplier USD",
+ "supplier_type": "_Test Supplier Type",
+ "default_currency": "USD",
+ "accounts": [{
+ "company": "_Test Company",
+ "account": "_Test Payable USD - _TC"
+ }]
}
-]
+]
\ No newline at end of file
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 6ba954f..7af7369 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -14,6 +14,7 @@
force_item_fields = ("item_group", "barcode", "brand", "stock_uom")
class CustomerFrozen(frappe.ValidationError): pass
+class InvalidCurrency(frappe.ValidationError): pass
class AccountsController(TransactionBase):
def __init__(self, arg1, arg2=None):
@@ -106,8 +107,6 @@
def set_price_list_currency(self, buying_or_selling):
if self.meta.get_field("currency"):
- company_currency = get_company_currency(self.company)
-
# price list part
fieldname = "selling_price_list" if buying_or_selling.lower() == "selling" \
else "buying_price_list"
@@ -115,22 +114,22 @@
self.price_list_currency = frappe.db.get_value("Price List",
self.get(fieldname), "currency")
- if self.price_list_currency == company_currency:
+ if self.price_list_currency == self.company_currency:
self.plc_conversion_rate = 1.0
elif not self.plc_conversion_rate:
self.plc_conversion_rate = get_exchange_rate(
- self.price_list_currency, company_currency)
+ self.price_list_currency, self.company_currency)
# currency
if not self.currency:
self.currency = self.price_list_currency
self.conversion_rate = self.plc_conversion_rate
- elif self.currency == company_currency:
+ elif self.currency == self.company_currency:
self.conversion_rate = 1.0
elif not self.conversion_rate:
self.conversion_rate = get_exchange_rate(self.currency,
- company_currency)
+ self.company_currency)
def set_missing_item_details(self):
"""set missing item values"""
@@ -218,7 +217,7 @@
gl_dict.update(args)
if not account_currency:
- account_currency = frappe.db.get_value("Account", gl_dict.account, "currency")
+ account_currency = frappe.db.get_value("Account", gl_dict.account, "account_currency")
self.validate_account_currency(gl_dict.account, account_currency)
gl_dict = self.set_balance_in_account_currency(gl_dict, account_currency)
@@ -226,17 +225,23 @@
return gl_dict
def validate_account_currency(self, account, account_currency=None):
- valid_currency = list(set([self.currency, self.company_currency]))
+ if self.doctype == "Journal Entry":
+ return
+ valid_currency = [self.company_currency]
+ if self.get("currency") and self.currency != self.company_currency:
+ valid_currency.append(self.currency)
+
if account_currency not in valid_currency:
frappe.throw(_("Account {0} is invalid. Account Currency must be {1}")
.format(account, " or ".join(valid_currency)))
def set_balance_in_account_currency(self, gl_dict, account_currency=None):
- if not self.get("conversion_rate") and account_currency!=self.company_currency:
- frappe.throw(_("Account: {0} with currency: {1} can not be selected")
- .format(gl_dict.account, account_currency))
+ if not (self.get("conversion_rate") or self.get("exchange_rate")) \
+ and account_currency!=self.company_currency:
+ frappe.throw(_("Account: {0} with currency: {1} can not be selected")
+ .format(gl_dict.account, account_currency))
- gl_dict["currency"] = self.company_currency if account_currency==self.company_currency \
+ gl_dict["account_currency"] = self.company_currency if account_currency==self.company_currency \
else account_currency
# set debit/credit in account currency if not provided
@@ -366,9 +371,9 @@
def set_total_advance_paid(self):
if self.doctype == "Sales Order":
- dr_or_cr = "credit"
+ dr_or_cr = "credit_in_account_currency"
else:
- dr_or_cr = "debit"
+ dr_or_cr = "debit_in_account_currency"
advance_paid = frappe.db.sql("""
select
@@ -376,10 +381,9 @@
from
`tabJournal Entry Account`
where
- reference_type = %s and
- reference_name = %s and
- docstatus = 1 and is_advance = "Yes" """.format(dr_or_cr=dr_or_cr),
- (self.doctype, self.name))
+ reference_type = %s and reference_name = %s
+ and docstatus = 1 and is_advance = "Yes"
+ """.format(dr_or_cr=dr_or_cr), (self.doctype, self.name))
if advance_paid:
advance_paid = flt(advance_paid[0][0], self.precision("advance_paid"))
@@ -421,23 +425,23 @@
return party_type, party
def validate_currency(self):
- if self.get("currency") and self.currency != self.company_currency:
+ if self.get("currency"):
party_type, party = self.get_party()
-
- existing_gle = frappe.db.get_value("GL Entry", {"party_type": party_type,
- "party": party, "company": self.company}, ["name", "currency"], as_dict=1)
- currency_in_existing_entries = existing_gle.currency or self.company_currency
-
- if existing_gle:
- if currency_in_existing_entries != self.company_currency \
- and currency_in_existing_entries != self.currency:
- frappe.throw(_("Currency must be {0} for {1} {2}")
- .format(currency_in_existing_entries, party_type, party))
- else:
- party_currency = frappe.db.get_value(party_type, party, "default_currency")
- if party_currency != self.company_currency and self.currency != party_currency:
- frappe.throw(_("Currency must be same as {0} currency {1}")
- .format(party_type, party_currency))
+ if party_type and party:
+ existing_gle = frappe.db.get_value("GL Entry", {"party_type": party_type,
+ "party": party, "company": self.company}, ["name", "account_currency"], as_dict=1)
+ if existing_gle:
+ currency_in_existing_entries = existing_gle.account_currency or self.company_currency
+ if currency_in_existing_entries != self.company_currency \
+ and currency_in_existing_entries != self.currency:
+ frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
+ .format(party_type, party, currency_in_existing_entries), InvalidCurrency)
+ else:
+ party_currency = frappe.db.get_value(party_type, party, "default_currency") \
+ or self.company_currency
+ if party_currency != self.company_currency and self.currency != party_currency:
+ frappe.throw(_("Currency must be same as {0} currency {1}")
+ .format(party_type, party_currency), InvalidCurrency)
@frappe.whitelist()
def get_tax_rate(account_head):
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index ccbad0d..eccceb0 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -53,7 +53,7 @@
"cost_center": detail.cost_center,
"remarks": self.get("remarks") or "Accounting Entry for Stock",
"debit": flt(sle.stock_value_difference, 2),
- }, warehouse_account[sle.warehouse]["currency"]))
+ }, warehouse_account[sle.warehouse]["account_currency"]))
# to target warehouse / expense account
gl_list.append(self.get_gl_dict({
@@ -338,7 +338,7 @@
def get_warehouse_account():
warehouse_account = frappe._dict()
- for d in frappe.db.sql("""select warehouse, name, currency from tabAccount
+ for d in frappe.db.sql("""select warehouse, name, account_currency from tabAccount
where account_type = 'Warehouse' and ifnull(warehouse, '') != ''""", as_dict=1):
warehouse_account.setdefault(d.warehouse, d)
return warehouse_account
diff --git a/erpnext/patches/v6_0/multi_currency.py b/erpnext/patches/v6_0/multi_currency.py
index 21c851b..d506ab7 100644
--- a/erpnext/patches/v6_0/multi_currency.py
+++ b/erpnext/patches/v6_0/multi_currency.py
@@ -77,7 +77,7 @@
party_account = party_gle.account or company.default_receivable_account
- party.append("party_accounts", {
+ party.append("accounts", {
"company": company.name,
"account": party_account
})
diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json
index 105f814..952be8b 100644
--- a/erpnext/selling/doctype/customer/customer.json
+++ b/erpnext/selling/doctype/customer/customer.json
@@ -567,7 +567,7 @@
"no_copy": 0,
"oldfieldname": "credit_limit",
"oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
+ "options": "",
"permlevel": 1,
"print_hide": 0,
"read_only": 0,
@@ -796,7 +796,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 0,
- "modified": "2015-08-27 16:21:57.520411",
+ "modified": "2015-08-27 17:00:50.604869",
"modified_by": "Administrator",
"module": "Selling",
"name": "Customer",
diff --git a/erpnext/selling/doctype/customer/test_records.json b/erpnext/selling/doctype/customer/test_records.json
index e076f7a..5c0bbd9 100644
--- a/erpnext/selling/doctype/customer/test_records.json
+++ b/erpnext/selling/doctype/customer/test_records.json
@@ -1,6 +1,5 @@
[
{
- "company": "_Test Company",
"customer_group": "_Test Customer Group",
"customer_name": "_Test Customer",
"customer_type": "Individual",
@@ -8,7 +7,6 @@
"territory": "_Test Territory"
},
{
- "company": "_Test Company",
"customer_group": "_Test Customer Group",
"customer_name": "_Test Customer 1",
"customer_type": "Individual",
@@ -16,7 +14,6 @@
"territory": "_Test Territory"
},
{
- "company": "_Test Company",
"customer_group": "_Test Customer Group",
"customer_name": "_Test Customer 2",
"customer_type": "Individual",
@@ -24,11 +21,22 @@
"territory": "_Test Territory"
},
{
- "company": "_Test Company",
"customer_group": "_Test Customer Group",
"customer_name": "_Test Customer 3",
"customer_type": "Individual",
"doctype": "Customer",
"territory": "_Test Territory"
+ },
+ {
+ "customer_group": "_Test Customer Group",
+ "customer_name": "_Test Customer USD",
+ "customer_type": "Individual",
+ "doctype": "Customer",
+ "territory": "_Test Territory",
+ "default_currency": "USD",
+ "accounts": [{
+ "company": "_Test Company",
+ "account": "_Test Receivable USD - _TC"
+ }]
}
]
diff --git a/erpnext/setup/doctype/company/test_records.json b/erpnext/setup/doctype/company/test_records.json
index 13cb03e..b6918b3 100644
--- a/erpnext/setup/doctype/company/test_records.json
+++ b/erpnext/setup/doctype/company/test_records.json
@@ -19,7 +19,7 @@
},
{
"abbr": "_TC2",
- "company_name": "_Test Company 3",
+ "company_name": "_Test Company 2",
"default_currency": "EUR",
"country": "Germany",
"doctype": "Company",
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index f6649c1..85610a4 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -316,10 +316,10 @@
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"debit": stock_value_diff
- }, warehouse_account[d.warehouse]["currency"]))
+ }, warehouse_account[d.warehouse]["account_currency"]))
# stock received but not billed
- stock_rbnb_currency = frappe.db.get_value("Account", stock_rbnb, "currency")
+ stock_rbnb_currency = frappe.db.get_value("Account", stock_rbnb, "account_currency")
gl_entries.append(self.get_gl_dict({
"account": stock_rbnb,
"against": warehouse_account[d.warehouse]["name"],
@@ -350,14 +350,14 @@
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit": flt(d.rm_supp_cost)
- }, warehouse_account[self.supplier_warehouse]["currency"]))
+ }, warehouse_account[self.supplier_warehouse]["account_currency"]))
# divisional loss adjustment
sle_valuation_amount = flt(flt(d.valuation_rate, val_rate_db_precision) * flt(d.qty) * flt(d.conversion_factor),
self.precision("base_net_amount", d))
distributed_amount = flt(flt(d.base_net_amount, self.precision("base_net_amount", d))) + \
- flt(d.landed_cost_voucher_amount) + flt(d.rm_supp_cost)
+ flt(d.landed_cost_voucher_amount) + flt(d.rm_supp_cost) + flt(d.item_tax_amount)
divisional_loss = flt(distributed_amount - sle_valuation_amount, self.precision("base_net_amount", d))
if divisional_loss: