diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js index 9302a24108..dd44450ea1 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js @@ -3,6 +3,97 @@ frappe.ui.form.on('Exchange Rate Revaluation', { refresh: function(frm) { + if(frm.doc.docstatus==1) { + frm.add_custom_button(__('Make Journal Entry'), function() { + return frm.events.make_jv(frm); + }); + } + }, + get_entries: function(frm) { + frappe.call({ + method: "get_accounts_data", + doc: cur_frm.doc, + callback: function(r){ + frappe.model.clear_table(frm.doc, "accounts"); + if(r.message) { + r.message.forEach((d) => { + cur_frm.add_child("accounts",d); + }); + frm.events.get_total_gain_loss(frm); + refresh_field("accounts"); + } + } + }); + }, + + get_total_gain_loss: function(frm) { + if(!(frm.doc.accounts && frm.doc.accounts.length)) return; + + let total_gain_loss = 0; + frm.doc.accounts.forEach((d) => { + d.gain_loss = flt(d.new_balance_in_base_currency, precision("new_balance_in_base_currency", d)) - flt(d.balance_in_base_currency, precision("balance_in_base_currency", d)); + total_gain_loss += flt(d.gain_loss, precision("gain_loss", d)); + }); + + frm.set_value("total_gain_loss", flt(total_gain_loss, precision("total_gain_loss"))); + frm.refresh_fields(); + }, + + make_jv : function(frm) { + frappe.call({ + method: "make_jv_entry", + doc: frm.doc, + callback: function(r){ + if (r.message) + var doc = frappe.model.sync(r.message)[0]; + frappe.set_route("Form", doc.doctype, doc.name); + } + }); } }); + +frappe.ui.form.on("Exchange Rate Revaluation Account", { + new_exchange_rate: function(frm, cdt, cdn) { + var row = frappe.get_doc(cdt, cdn); + row.new_balance_in_base_currency = flt(row.new_exchange_rate * flt(row.balance_in_account_currency), + precision("new_balance_in_base_currency", row)); + row.gain_loss = row.new_balance_in_base_currency - flt(row.balance_in_base_currency); + refresh_field("accounts"); + frm.events.get_total_gain_loss(frm); + }, + + account: function(frm, cdt, cdn) { + get_account_details(frm, cdt, cdn); + }, + + party: function(frm, cdt, cdn) { + get_account_details(frm, cdt, cdn); + }, + + accounts_remove: function(frm) { + frm.events.get_total_gain_loss(frm); + } +}); + +var get_account_details = function(frm, cdt, cdn) { + var row = frappe.get_doc(cdt, cdn); + if(!frm.doc.company || !frm.doc.posting_date) { + frappe.throw(__("Please select Company and Posting Date to getting entries")); + } + frappe.call({ + method: "erpnext.accounts.doctype.exchange_rate_revaluation.exchange_rate_revaluation.get_account_details", + args:{ + account: row.account, + company: frm.doc.company, + posting_date: frm.doc.posting_date, + party_type: row.party_type, + party: row.party + }, + callback: function(r){ + $.extend(row, r.message); + refresh_field("accounts"); + frm.events.get_total_gain_loss(frm); + } + }); +}; \ No newline at end of file diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json index 3d302929ae..b37c67edc6 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json @@ -19,6 +19,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", "hidden": 0, @@ -173,7 +174,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "exchange_rate_revaluation_account", + "fieldname": "accounts", "fieldtype": "Table", "hidden": 0, "ignore_user_permissions": 0, @@ -184,7 +185,7 @@ "in_standard_filter": 0, "label": "Exchange Rate Revaluation Account", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Exchange Rate Revaluation Account", "permlevel": 0, "precision": "", @@ -302,7 +303,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:19:01.029331", + "modified": "2018-05-05 17:50:56.352167", "modified_by": "Administrator", "module": "Accounts", "name": "Exchange Rate Revaluation", diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py index 46abddc3f9..aa19a9eb48 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py @@ -3,8 +3,168 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext +from frappe import _ +from frappe.utils import flt from frappe.model.document import Document +from frappe.model.meta import get_field_precision +from erpnext.setup.utils import get_exchange_rate +from erpnext.accounts.doctype.journal_entry.journal_entry import get_balance_on class ExchangeRateRevaluation(Document): - pass + def validate(self): + self.set_total_gain_loss() + + def set_total_gain_loss(self): + total_gain_loss = 0 + for d in self.accounts: + d.gain_loss = flt(d.new_balance_in_base_currency, d.precision("new_balance_in_base_currency")) \ + - flt(d.balance_in_base_currency, d.precision("balance_in_base_currency")) + total_gain_loss += flt(d.gain_loss, d.precision("gain_loss")) + self.total_gain_loss = flt(total_gain_loss, self.precision("total_gain_loss")) + + def validate_mandatory(self): + if not (self.company and self.posting_date): + frappe.throw(_("Please select Company and Posting Date to getting entries")) + + def get_accounts_data(self, account=None): + accounts = [] + self.validate_mandatory() + company_currency = erpnext.get_company_currency(self.company) + precision = get_field_precision(frappe.get_meta("Exchange Rate Revaluation Account") + .get_field("new_balance_in_base_currency"), company_currency) + for d in self.get_accounts_from_gle(): + + current_exchange_rate = d.balance / d.balance_in_account_currency \ + if d.balance_in_account_currency else 0 + new_exchange_rate = get_exchange_rate(d.account_currency, company_currency, self.posting_date) + new_balance_in_base_currency = flt(d.balance_in_account_currency * new_exchange_rate) + gain_loss = flt(new_balance_in_base_currency, precision) - flt(d.balance, precision) + if gain_loss: + accounts.append({ + "account": d.account, + "party_type": d.party_type, + "party": d.party, + "account_currency": d.account_currency, + "balance_in_base_currency": d.balance, + "balance_in_account_currency": d.balance_in_account_currency, + "current_exchange_rate": current_exchange_rate, + "new_exchange_rate": new_exchange_rate, + "new_balance_in_base_currency": new_balance_in_base_currency + }) + return accounts + + def get_accounts_from_gle(self): + company_currency = erpnext.get_company_currency(self.company) + accounts = frappe.db.sql_list(""" + select name + from tabAccount + where is_group = 0 + and report_type = 'Balance Sheet' + and root_type in ('Asset', 'Liability', 'Equity') + and account_type != 'Stock' + and company=%s + and account_currency != %s + order by name""",(self.company, company_currency)) + + account_details = frappe.db.sql(""" + select + account, party_type, party, account_currency, + sum(debit_in_account_currency) - sum(credit_in_account_currency) as balance_in_account_currency, + sum(debit) - sum(credit) as balance + from `tabGL Entry` + where account in (%s) + group by account, party_type, party + having sum(debit) != sum(credit) + order by account + """ % ', '.join(['%s']*len(accounts)), tuple(accounts), as_dict=1) + + return account_details + + def make_jv_entry(self): + if self.total_gain_loss == 0: + return + + unrealized_exchange_gain_loss_account = frappe.db.get_value("Company", self.company, + "unrealized_exchange_gain_loss_account") + if not unrealized_exchange_gain_loss_account: + frappe.throw(_("Please set Unrealized Exchange Gain/Loss Account in Company {0}") + .format(self.company)) + + journal_entry = frappe.new_doc('Journal Entry') + journal_entry.voucher_type = 'Exchange Rate Revaluation' + journal_entry.company = self.company + journal_entry.posting_date = self.posting_date + journal_entry.multi_currency = 1 + + journal_entry_accounts = [] + for d in self.accounts: + dr_or_cr = "debit_in_account_currency" \ + if d.get("balance_in_account_currency") > 0 else "credit_in_account_currency" + + reverse_dr_or_cr = "debit_in_account_currency" \ + if dr_or_cr=="credit_in_account_currency" else "credit_in_account_currency" + + journal_entry_accounts.append({ + "account": d.get("account"), + "party_type": d.get("party_type"), + "party": d.get("party"), + "account_currency": d.get("account_currency"), + "balance": d.get("balance_in_account_currency"), + dr_or_cr: abs(d.get("balance_in_account_currency")), + "exchange_rate":d.get("new_exchange_rate"), + "reference_type": "Exchange Rate Revaluation", + "reference_name": self.name, + }) + journal_entry_accounts.append({ + "account": d.get("account"), + "party_type": d.get("party_type"), + "party": d.get("party"), + "account_currency": d.get("account_currency"), + "balance": d.get("balance_in_account_currency"), + reverse_dr_or_cr: abs(d.get("balance_in_account_currency")), + "exchange_rate": d.get("current_exchange_rate"), + "reference_type": "Exchange Rate Revaluation", + "reference_name": self.name + }) + + journal_entry_accounts.append({ + "account": unrealized_exchange_gain_loss_account, + "balance": get_balance_on(unrealized_exchange_gain_loss_account), + "debit_in_account_currency": abs(self.total_gain_loss) if self.total_gain_loss < 0 else 0, + "credit_in_account_currency": self.total_gain_loss if self.total_gain_loss > 0 else 0, + "exchange_rate": 1, + "reference_type": "Exchange Rate Revaluation", + "reference_name": self.name, + }) + + journal_entry.set("accounts", journal_entry_accounts) + journal_entry.set_amounts_in_company_currency() + journal_entry.set_total_debit_credit() + return journal_entry.as_dict() + +@frappe.whitelist() +def get_account_details(account, company, posting_date, party_type=None, party=None): + account_currency, account_type = frappe.db.get_value("Account", account, + ["account_currency", "account_type"]) + if account_type in ["Receivable", "Payable"] and not (party_type and party): + frappe.throw(_("Party Type and Party is mandatory for {0} account").format(account_type)) + + account_details = {} + company_currency = erpnext.get_company_currency(company) + balance = get_balance_on(account, party_type=party_type, party=party, in_account_currency=False) + if balance: + balance_in_account_currency = get_balance_on(account, party_type=party_type, party=party) + current_exchange_rate = balance / balance_in_account_currency if balance_in_account_currency else 0 + new_exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date) + new_balance_in_base_currency = balance_in_account_currency * new_exchange_rate + account_details = { + "account_currency": account_currency, + "balance_in_base_currency": balance, + "balance_in_account_currency": balance_in_account_currency, + "current_exchange_rate": current_exchange_rate, + "new_exchange_rate": new_exchange_rate, + "new_balance_in_base_currency": new_balance_in_base_currency + } + + return account_details \ No newline at end of file diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json index 66561a0718..e834266e19 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json +++ b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json @@ -50,16 +50,142 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "balance_in_base_currency", + "fieldname": "party_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Party Type", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "party", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Party", + "length": 0, + "no_copy": 0, + "options": "party_type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "account_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Account Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "balance_in_account_currency", "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, - "label": "Balance In Base Currency", + "label": "Balance In Account Currency", "length": 0, "no_copy": 0, "permlevel": 0, @@ -81,8 +207,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "balance_in_alternate_currency", - "fieldtype": "Currency", + "fieldname": "balances", + "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -90,14 +216,14 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Balance In Alternate Currency", + "label": "", "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -137,6 +263,67 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "balance_in_base_currency", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Balance In Base Currency", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_9", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -205,7 +392,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "difference", + "fieldname": "gain_loss", "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, @@ -214,7 +401,7 @@ "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, - "label": "Difference", + "label": "Gain/Loss", "length": 0, "no_copy": 0, "permlevel": 0, @@ -241,7 +428,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-13 18:30:57.531401", + "modified": "2018-05-05 17:03:03.512559", "modified_by": "Administrator", "module": "Accounts", "name": "Exchange Rate Revaluation Account", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 886b5f1a79..916c71f20f 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -96,7 +96,7 @@ "no_copy": 0, "oldfieldname": "voucher_type", "oldfieldtype": "Select", - "options": "Journal Entry\nInter Company Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry", + "options": "Journal Entry\nInter Company Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry\nExchange Rate Revaluation", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -1553,7 +1553,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-05-02 11:12:55.090374", + "modified": "2018-05-05 13:11:33.696498", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 91eea22464..f9ffbcdbd7 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -151,7 +151,7 @@ class JournalEntry(AccountsController): if (d.party_type == 'Customer' and flt(d.credit) > 0) or \ (d.party_type == 'Supplier' and flt(d.debit) > 0): if d.is_advance=="No": - msgprint(_("Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.").format(d.idx, d.account)) + msgprint(_("Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.").format(d.idx, d.account), alert=True) elif d.reference_type in ("Sales Order", "Purchase Order") and d.is_advance != "Yes": frappe.throw(_("Row {0}: Payment against Sales/Purchase Order should always be marked as advance").format(d.idx)) 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 98a2a2947f..eddcd5ecd3 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -44,6 +44,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "250px" }, @@ -75,6 +76,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -107,6 +109,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -142,6 +145,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "180px" }, @@ -171,6 +175,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -201,6 +206,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -231,6 +237,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -262,6 +269,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -294,6 +302,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -325,6 +334,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -354,6 +364,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -384,6 +395,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -413,6 +425,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -444,6 +457,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -477,6 +491,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -505,6 +520,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -536,6 +552,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -569,6 +586,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -598,6 +616,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -618,7 +637,7 @@ "label": "Reference Type", "length": 0, "no_copy": 0, - "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset\nLoan\nPayroll Entry\nEmployee Advance", + "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset\nLoan\nPayroll Entry\nEmployee Advance\nExchange Rate Revaluation", "permlevel": 0, "precision": "", "print_hide": 0, @@ -629,6 +648,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -660,8 +680,42 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.reference_type&&!in_list(doc.reference_type, ['Expense Claim', 'Asset', 'Employee Loan', 'Employee Advance'])", + "fieldname": "reference_due_date", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reference Due Date", + "length": 0, + "no_copy": 0, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -691,6 +745,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -719,6 +774,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -751,6 +807,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -782,6 +839,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -795,7 +853,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-12-07 19:54:19.851534", + "modified": "2018-05-05 17:50:25.961397", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", diff --git a/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation-submit.png b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation-submit.png new file mode 100644 index 0000000000..98f629f9b9 Binary files /dev/null and b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation-submit.png differ diff --git a/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation.png b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation.png new file mode 100644 index 0000000000..fbd584b7a9 Binary files /dev/null and b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation.png differ diff --git a/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/field_set_company.png b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/field_set_company.png new file mode 100644 index 0000000000..94484f668d Binary files /dev/null and b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/field_set_company.png differ diff --git a/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/journal-entry.png b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/journal-entry.png new file mode 100644 index 0000000000..cf204bb2b6 Binary files /dev/null and b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/journal-entry.png differ diff --git a/erpnext/docs/user/manual/en/accounts/exchange-rate-revaluation.md b/erpnext/docs/user/manual/en/accounts/exchange-rate-revaluation.md new file mode 100644 index 0000000000..d4887d0673 --- /dev/null +++ b/erpnext/docs/user/manual/en/accounts/exchange-rate-revaluation.md @@ -0,0 +1,35 @@ +# Exchange Rate Revaluation + +In ERPNext, you can make accounting entries in multiple currency. For example, if you have a bank account in foreign currency, you can make transactions in that currency and system will show bank balance in that specific currency only. + +## Setup + +To get started with multi-currency accounting, you need to assign accounting currency in Account record. You can define Currency from Chart of Accounts while creating Account. + +Set Currency from Chart of Accounts + +You can also assign / modify the currency by opening specific Account record for existing Accounts. + +Modify Account Currency + +### Exchange Rate Revaluation + +Exchange Rate Revaluation feature is for dealing the situation when you have a multiple currency accounts in one company's chart of accounts + +Steps : + +1. Set the 'Unrealized Exchange / Gain Loss Account' field in Company DocType. This aacount is to balance the difference of total credit and total debit. + +Field Set for Comapny + +2. Select the Company. + +3. Click the Get Entries button. It shows the accounts which having different currency as compare to 'Default Currency' in Company DocType. It will fetch the new exchange rate automatically if not set in Currency Exchange DocType for that currency else it will fetch the 'Exchange Rate' from Currency Exchange DocType + +Exchange Rate Revaluation + +4. On Submitting, 'Make Journal Entry' button will appear. This will create a journal entry for the Exchange Rate Revaluation. + +Exchange Rate Revaluation Submitting + +Journal Entry \ No newline at end of file diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 7c060d852d..e164d6949f 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -197,6 +197,7 @@ erpnext.company.setup_queries = function(frm) { ["round_off_account", {"root_type": "Expense"}], ["write_off_account", {"root_type": "Expense"}], ["exchange_gain_loss_account", {"root_type": "Expense"}], + ["unrealized_exchange_gain_loss_account", {"root_type": "Expense"}], ["accumulated_depreciation_account", {"root_type": "Asset", "account_type": "Accumulated Depreciation"}], ["depreciation_expense_account", {"root_type": "Expense", "account_type": "Depreciation"}], diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index 1a21887f2e..66b1433eb1 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -42,6 +42,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -73,6 +74,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -105,6 +107,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -135,6 +138,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -165,6 +169,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -193,6 +198,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -223,6 +229,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -254,6 +261,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -284,6 +292,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -314,6 +323,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -345,6 +355,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -374,6 +385,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -405,6 +417,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -434,6 +447,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -465,6 +479,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -496,6 +511,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -526,6 +542,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -556,6 +573,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -585,6 +603,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -615,6 +634,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -646,6 +666,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -678,6 +699,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -710,6 +732,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -740,6 +763,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -770,6 +794,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -800,6 +825,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -833,6 +859,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -864,6 +891,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -897,6 +925,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -928,6 +957,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -959,6 +989,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -990,6 +1021,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "unrealized_exchange_gain_loss_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Unrealized Exchange Gain/Loss Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1019,6 +1083,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1053,6 +1118,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1084,6 +1150,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1115,6 +1182,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1146,6 +1214,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1178,6 +1247,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1209,6 +1279,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1238,6 +1309,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1269,6 +1341,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1298,6 +1371,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1331,6 +1405,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1363,6 +1438,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1393,6 +1469,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1424,6 +1501,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1455,6 +1533,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1485,6 +1564,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1514,6 +1594,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1544,6 +1625,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1574,6 +1656,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1604,6 +1687,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1635,6 +1719,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1666,6 +1751,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1696,6 +1782,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1725,6 +1812,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1756,6 +1844,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1787,6 +1876,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1817,6 +1907,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1847,6 +1938,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1876,6 +1968,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1905,6 +1998,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1937,6 +2031,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1969,6 +2064,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2001,6 +2097,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2033,6 +2130,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2064,6 +2162,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2095,6 +2194,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -2128,6 +2228,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2158,6 +2259,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2188,6 +2290,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2218,6 +2321,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2248,6 +2352,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2278,6 +2383,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -2294,7 +2400,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-04-18 19:45:22.357643", + "modified": "2018-05-05 13:08:07.351655", "modified_by": "Administrator", "module": "Setup", "name": "Company", @@ -2302,7 +2408,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -2322,7 +2427,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2342,7 +2446,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2362,7 +2465,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2382,7 +2484,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2402,7 +2503,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2422,7 +2522,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0,