From aeab6c559ced19027142941481c996d064e859dd Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 13 Aug 2015 17:01:36 +0530 Subject: [PATCH 01/38] [enhancement] multi-currency, added fields #1002 --- erpnext/accounts/doctype/account/account.json | 277 +++++++++++++- .../accounts/doctype/gl_entry/gl_entry.json | 340 ++++++++++++++++-- .../journal_entry_account.json | 105 ++++++ .../doctype/party_account/party_account.json | 23 +- erpnext/selling/doctype/customer/customer.js | 10 +- .../selling/doctype/customer/customer.json | 265 ++++++++------ .../doctype/sales_team/sales_team.json | 111 +++++- 7 files changed, 965 insertions(+), 166 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index e60d9abe15a..82c9c6622c8 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -3,29 +3,57 @@ "allow_import": 1, "allow_rename": 1, "creation": "2013-01-30 12:49:46", + "custom": 0, "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "Setup", "fields": [ { + "allow_on_submit": 0, "fieldname": "properties", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break0", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "account_name", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 1, "label": "Account Name", @@ -33,147 +61,335 @@ "oldfieldname": "account_name", "oldfieldtype": "Data", "permlevel": 0, + "print_hide": 0, "read_only": 1, + "report_hide": 0, "reqd": 1, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "default": "0", "fieldname": "is_group", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Is Group", + "no_copy": 0, "permlevel": 0, "precision": "", - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "company", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Company", + "no_copy": 0, "oldfieldname": "company", "oldfieldtype": "Link", "options": "Company", "permlevel": 0, + "print_hide": 0, "read_only": 1, + "report_hide": 0, "reqd": 1, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "root_type", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Root Type", + "no_copy": 0, "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "report_type", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Report Type", + "no_copy": 0, "options": "\nBalance Sheet\nProfit and Loss", "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, + "fieldname": "currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Currency", + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, "fieldname": "column_break1", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "parent_account", "fieldtype": "Link", + "hidden": 0, "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, "label": "Parent Account", + "no_copy": 0, "oldfieldname": "parent_account", "oldfieldtype": "Link", "options": "Account", "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { - "description": "Setting Account Type helps in selecting this Account in transactions.", + "allow_on_submit": 0, + "description": "", "fieldname": "account_type", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Account Type", + "no_copy": 0, "oldfieldname": "account_type", "oldfieldtype": "Select", "options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nRound Off\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment\nStock\nTemporary", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "Rate at which this tax is applied", "fieldname": "tax_rate", "fieldtype": "Float", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Rate", + "no_copy": 0, "oldfieldname": "tax_rate", "oldfieldtype": "Currency", "permlevel": 0, - "reqd": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "If the account is frozen, entries are allowed to restricted users.", "fieldname": "freeze_account", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Frozen", + "no_copy": 0, "oldfieldname": "freeze_account", "oldfieldtype": "Select", "options": "No\nYes", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "warehouse", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Warehouse", + "no_copy": 0, "options": "Warehouse", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "balance_must_be", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Balance must be", + "no_copy": 0, "options": "\nDebit\nCredit", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "lft", "fieldtype": "Int", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Lft", + "no_copy": 0, "permlevel": 0, "print_hide": 1, "read_only": 1, - "search_index": 1 + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "rgt", "fieldtype": "Int", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Rgt", + "no_copy": 0, "permlevel": 0, "print_hide": 1, "read_only": 1, - "search_index": 1 + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "old_parent", "fieldtype": "Data", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Old Parent", + "no_copy": 0, "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], + "hide_heading": 0, + "hide_toolbar": 0, "icon": "icon-money", "idx": 1, "in_create": 0, - "modified": "2015-07-20 03:54:14.297995", + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "modified": "2015-08-13 16:43:10.645538", "modified_by": "Administrator", "module": "Accounts", "name": "Account", @@ -182,16 +398,19 @@ { "amend": 0, "apply_user_permissions": 1, + "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, + "if_owner": 0, "import": 1, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts User", + "set_user_permissions": 0, "share": 1, "submit": 0, "write": 1 @@ -199,52 +418,72 @@ { "amend": 0, "apply_user_permissions": 1, + "cancel": 0, "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Auditor", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { "amend": 0, "apply_user_permissions": 1, + "cancel": 0, "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Sales User", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { "amend": 0, "apply_user_permissions": 1, + "cancel": 0, "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Purchase User", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { "amend": 0, "apply_user_permissions": 0, + "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, + "if_owner": 0, "import": 1, "permlevel": 0, "print": 1, @@ -257,5 +496,7 @@ "write": 1 } ], + "read_only": 0, + "read_only_onload": 0, "search_fields": "" } \ No newline at end of file diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json index 14b3c58ecc9..08c5d87a0f0 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.json +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -1,199 +1,475 @@ { + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, "autoname": "GL.#######", "creation": "2013-01-10 16:34:06", + "custom": 0, "docstatus": 0, "doctype": "DocType", "fields": [ { + "allow_on_submit": 0, "fieldname": "posting_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 1, "label": "Posting Date", + "no_copy": 0, "oldfieldname": "posting_date", "oldfieldtype": "Date", "permlevel": 0, - "search_index": 1 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "transaction_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Transaction Date", + "no_copy": 0, "oldfieldname": "transaction_date", "oldfieldtype": "Date", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "account", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 1, "label": "Account", + "no_copy": 0, "oldfieldname": "account", "oldfieldtype": "Link", "options": "Account", "permlevel": 0, - "search_index": 1 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "party_type", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Party Type", + "no_copy": 0, "options": "DocType", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "party", "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Party", + "no_copy": 0, "options": "party_type", "permlevel": 0, - "search_index": 1 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "cost_center", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 1, "label": "Cost Center", + "no_copy": 0, "oldfieldname": "cost_center", "oldfieldtype": "Link", "options": "Cost Center", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "debit", "fieldtype": "Currency", - "label": "Debit Amt", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Debit Amount", + "no_copy": 0, "oldfieldname": "debit", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "credit", "fieldtype": "Currency", - "label": "Credit Amt", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Amount", + "no_copy": 0, "oldfieldname": "credit", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, + "fieldname": "currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Currency", + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "debit_in_account_currency", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Debit Amount in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "credit_in_account_currency", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Amount in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, "fieldname": "against", "fieldtype": "Text", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Against", + "no_copy": 0, "oldfieldname": "against", "oldfieldtype": "Text", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "against_voucher_type", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 0, + "in_list_view": 0, "label": "Against Voucher Type", + "no_copy": 0, "oldfieldname": "against_voucher_type", "oldfieldtype": "Data", "options": "DocType", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "against_voucher", "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Against Voucher", + "no_copy": 0, "oldfieldname": "against_voucher", "oldfieldtype": "Data", "options": "against_voucher_type", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "voucher_type", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Voucher Type", + "no_copy": 0, "oldfieldname": "voucher_type", "oldfieldtype": "Select", "options": "DocType", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "voucher_no", "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Voucher No", + "no_copy": 0, "oldfieldname": "voucher_no", "oldfieldtype": "Data", "options": "voucher_type", "permlevel": 0, - "search_index": 1 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "remarks", "fieldtype": "Text", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Remarks", "no_copy": 1, "oldfieldname": "remarks", "oldfieldtype": "Text", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "is_opening", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Is Opening", + "no_copy": 0, "oldfieldname": "is_opening", "oldfieldtype": "Select", "options": "No\nYes", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "is_advance", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 0, + "in_list_view": 0, "label": "Is Advance", + "no_copy": 0, "oldfieldname": "is_advance", "oldfieldtype": "Select", "options": "No\nYes", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "fiscal_year", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Fiscal Year", + "no_copy": 0, "oldfieldname": "fiscal_year", "oldfieldtype": "Select", "options": "Fiscal Year", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "company", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Company", + "no_copy": 0, "oldfieldname": "company", "oldfieldtype": "Link", "options": "Company", "permlevel": 0, - "search_index": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], + "hide_heading": 0, + "hide_toolbar": 0, "icon": "icon-list", "idx": 1, "in_create": 1, - "modified": "2015-07-09 15:51:04.986518", + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "modified": "2015-08-13 16:46:11.515538", "modified_by": "Administrator", "module": "Accounts", "name": "GL Entry", @@ -202,44 +478,66 @@ { "amend": 0, "apply_user_permissions": 1, + "cancel": 0, "create": 0, + "delete": 0, "email": 1, "export": 1, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts User", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, "create": 0, + "delete": 0, "email": 1, "export": 1, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, "create": 0, "delete": 0, "email": 0, "export": 1, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 0, "read": 1, "report": 1, "role": "Auditor", + "set_user_permissions": 0, "share": 0, + "submit": 0, "write": 0 } ], + "read_only": 0, + "read_only_onload": 0, "search_fields": "voucher_no,account,posting_date,against_voucher", "sort_field": "modified", "sort_order": "DESC" 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 77a04570562..9f30db1a82f 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -32,6 +32,27 @@ "unique": 0, "width": "250px" }, + { + "allow_on_submit": 0, + "fieldname": "currency", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Currency", + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "balance", @@ -54,6 +75,27 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "balance_in_account_currency", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Balance in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "default": ":Company", @@ -159,6 +201,27 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "party_balance_in_account_currency", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Party Balance in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "sec_break1", @@ -200,6 +263,27 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "debit_in_account_currency", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Debit in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "col_break2", @@ -240,6 +324,27 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "credit_in_account_currency", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "reference", diff --git a/erpnext/accounts/doctype/party_account/party_account.json b/erpnext/accounts/doctype/party_account/party_account.json index 14e9250ce8e..9c6db018892 100644 --- a/erpnext/accounts/doctype/party_account/party_account.json +++ b/erpnext/accounts/doctype/party_account/party_account.json @@ -25,13 +25,27 @@ "report_hide": 0, "reqd": 1, "search_index": 0, - "set_only_once": 0 + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "col_break1", "fieldtype": "Column Break", - "label": "col_break1", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { @@ -51,7 +65,8 @@ "report_hide": 0, "reqd": 1, "search_index": 0, - "set_only_once": 0 + "set_only_once": 0, + "unique": 0 } ], "hide_heading": 0, @@ -61,7 +76,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2014-08-29 16:08:49.388820", + "modified": "2015-08-13 16:40:02.413005", "modified_by": "Administrator", "module": "Accounts", "name": "Party Account", diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js index ac0f6366cd5..ab23d73ae8c 100644 --- a/erpnext/selling/doctype/customer/customer.js +++ b/erpnext/selling/doctype/customer/customer.js @@ -12,7 +12,15 @@ frappe.ui.form.on("Customer", "refresh", function(frm) { frm.toggle_display(['address_html','contact_html'], !frm.doc.__islocal); - if(!frm.doc.__islocal) erpnext.utils.render_address_and_contact(frm); + if(!frm.doc.__islocal) { + erpnext.utils.render_address_and_contact(frm); + } + + var grid = cur_frm.get_field("sales_team").grid; + grid.set_column_disp("allocated_percentage", false); + grid.set_column_disp("allocated_amount", false); + grid.set_column_disp("incentives", false); + }) cur_frm.cscript.onload = function(doc, dt, dn) { diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index eea3f2ff148..a053427962f 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -8,7 +8,7 @@ "description": "Buyer of Goods and Services.", "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "", "fields": [ { "allow_on_submit": 0, @@ -94,28 +94,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "fieldname": "lead_name", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "From Lead", - "no_copy": 1, - "oldfieldname": "lead_name", - "oldfieldtype": "Link", - "options": "Lead", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "fieldname": "column_break0", @@ -135,6 +113,26 @@ "unique": 0, "width": "50%" }, + { + "allow_on_submit": 0, + "fieldname": "default_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "description": "", @@ -181,26 +179,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "fieldname": "tax_id", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Tax ID", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "fieldname": "is_frozen", @@ -308,7 +286,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Default Receivable Accounts", + "label": "", "no_copy": 0, "permlevel": 0, "print_hide": 0, @@ -364,26 +342,7 @@ }, { "allow_on_submit": 0, - "fieldname": "column_break2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "50%" - }, - { - "allow_on_submit": 0, - "description": "Additional information regarding the customer.", + "description": "", "fieldname": "customer_details", "fieldtype": "Text", "hidden": 0, @@ -403,6 +362,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "website", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Website", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "tax_id", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Tax ID", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "lead_name", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "From Lead", + "no_copy": 1, + "oldfieldname": "lead_name", + "oldfieldtype": "Link", + "options": "Lead", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "column_break3", @@ -422,26 +442,6 @@ "unique": 0, "width": "50%" }, - { - "allow_on_submit": 0, - "fieldname": "default_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Currency", - "no_copy": 1, - "options": "Currency", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "fieldname": "default_price_list", @@ -482,6 +482,25 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "section_break_24", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "credit_days_based_on", @@ -525,6 +544,25 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "column_break_27", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "credit_limit", @@ -547,25 +585,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "fieldname": "website", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Website", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "fieldname": "sales_team_section_break", @@ -609,6 +628,25 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "column_break_32", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "default_commission_rate", @@ -630,6 +668,25 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "section_break_34", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "sales_team", @@ -682,7 +739,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-07 20:34:25.761769", + "modified": "2015-08-13 16:41:28.805471", "modified_by": "Administrator", "module": "Selling", "name": "Customer", diff --git a/erpnext/selling/doctype/sales_team/sales_team.json b/erpnext/selling/doctype/sales_team/sales_team.json index dda6046e7e9..709e690d16b 100644 --- a/erpnext/selling/doctype/sales_team/sales_team.json +++ b/erpnext/selling/doctype/sales_team/sales_team.json @@ -1,107 +1,182 @@ { - "creation": "2013-04-19 13:30:51.000000", + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "creation": "2013-04-19 13:30:51", + "custom": 0, "docstatus": 0, "doctype": "DocType", "fields": [ { + "allow_on_submit": 0, "fieldname": "sales_person", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 1, "label": "Sales Person", + "no_copy": 0, "oldfieldname": "sales_person", "oldfieldtype": "Link", "options": "Sales Person", "permlevel": 0, + "print_hide": 0, "print_width": "200px", + "read_only": 0, + "report_hide": 0, "reqd": 1, "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "200px" }, { - "fieldname": "sales_designation", - "fieldtype": "Data", - "hidden": 0, - "in_list_view": 1, - "label": "Designation", - "oldfieldname": "sales_designation", - "oldfieldtype": "Data", - "permlevel": 0, - "print_width": "100px", - "width": "100px" - }, - { + "allow_on_submit": 0, "fieldname": "contact_no", "fieldtype": "Data", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Contact No.", + "no_copy": 0, "oldfieldname": "contact_no", "oldfieldtype": "Data", "permlevel": 0, + "print_hide": 0, "print_width": "100px", + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" }, { + "allow_on_submit": 0, "fieldname": "col_break1", "fieldtype": "Column Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "allocated_percentage", "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Contribution (%)", + "no_copy": 0, "oldfieldname": "allocated_percentage", "oldfieldtype": "Currency", "permlevel": 0, + "print_hide": 0, "print_width": "100px", + "read_only": 0, + "report_hide": 0, "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" }, { + "allow_on_submit": 0, "fieldname": "allocated_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Contribution to Net Total", + "no_copy": 0, "oldfieldname": "allocated_amount", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, + "print_hide": 0, "print_width": "120px", "read_only": 1, + "report_hide": 0, "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "120px" }, { + "allow_on_submit": 0, "fieldname": "incentives", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Incentives", + "no_copy": 0, "oldfieldname": "incentives", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "parenttype", "fieldtype": "Data", "hidden": 1, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 0, "label": "Parenttype", + "no_copy": 0, "oldfieldname": "parenttype", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 1, - "search_index": 1 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 } ], + "hide_heading": 0, + "hide_toolbar": 0, "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, "istable": 1, - "modified": "2013-12-31 19:00:14.000000", + "modified": "2015-08-13 16:30:24.146848", "modified_by": "Administrator", "module": "Selling", "name": "Sales Team", - "owner": "Administrator" + "owner": "Administrator", + "permissions": [], + "read_only": 0, + "read_only_onload": 0 } \ No newline at end of file From 6aea1c0da51315f83afc8b080fdef8bbd6aed36d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 18 Aug 2015 11:31:02 +0530 Subject: [PATCH 02/38] Currency validation in gl entry --- erpnext/accounts/doctype/account/account.py | 9 +++++++ erpnext/accounts/doctype/gl_entry/gl_entry.py | 26 +++++++++++++++++++ erpnext/accounts/party.py | 13 ++++++++-- erpnext/buying/doctype/supplier/supplier.py | 3 +++ erpnext/selling/doctype/customer/customer.py | 8 +++--- 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index 46f75208fc6..a57cc259203 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -28,6 +28,7 @@ class Account(Document): self.validate_warehouse_account() self.validate_frozen_accounts_modifier() self.validate_balance_must_be_debit_or_credit() + self.validate_account_currency() def validate_parent(self): """Fetch Parent Details and validate parent account""" @@ -86,6 +87,14 @@ class Account(Document): frappe.throw(_("Account balance already in Debit, you are not allowed to set 'Balance Must Be' as 'Credit'")) elif account_balance < 0 and self.balance_must_be == "Debit": 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") + + elif self.currency != frappe.db.get_value("Account", self.name, "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")) def convert_group_to_ledger(self): if self.check_if_child_exists(): diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 43c421352c7..075abd7209a 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -20,6 +20,7 @@ class GLEntry(Document): self.check_pl_account() self.validate_cost_center() self.validate_party() + self.validate_currency() def on_update_with_args(self, adv_adj, update_outstanding = 'Yes'): self.validate_account_details(adv_adj) @@ -98,6 +99,31 @@ class GLEntry(Document): if not frozen_accounts_modifier in frappe.get_roles(): if frappe.db.get_value(self.party_type, self.party, "is_frozen"): frappe.throw("{0} {1} is frozen".format(self.party_type, self.party), CustomerFrozen) + + 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 + + if not self.currency: + self.currency = company_currency + + if account_currency != self.currency: + frappe.throw(_("Accounting Entry for {0} can only be made in currency: {1}") + .format(self.account, (account_currency or company_currency))) + + if self.party_type and self.party: + existing_gle = frappe.db.get_value("GL Entry", + {"party_type": self.party_type, "party": self.party}, ["name", "currency"]) + if not existing_gle: + party_currency = frappe.db.get_value(self.party_type, self.party, "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)) + else: + currency_in_existing_entries = existing_gle.currency or company_currency + if currency_in_existing_entries != self.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)) def validate_balance_type(account, adv_adj=False): if not adv_adj and account: diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 250286c4367..be672cca467 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -7,7 +7,7 @@ import frappe import datetime from frappe import _, msgprint, scrub from frappe.defaults import get_user_permissions -from frappe.utils import add_days, getdate, formatdate, flt, get_first_day, date_diff, nowdate +from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff from erpnext.utilities.doctype.address.address import get_address_display from erpnext.utilities.doctype.contact.contact import get_contact_details @@ -141,7 +141,16 @@ def set_account_and_due_date(party, account, party_type, company, posting_date, "due_date": get_due_date(posting_date, party_type, party, company) } return out - + +def validate_party_account(party): + party_account_defined_for_companies = [d.company for d in party.get("party_accounts")] + + for company, company_currency in frappe.db.sql("select name, default_currency from `tabCompany`"): + if party.currency and party.currency != company_currency \ + and company not in party_account_defined_for_companies: + frappe.throw(_("Please mention Party Account for company {0}, as party currency is different than company's default currency") + .format(company)) + @frappe.whitelist() def get_party_account(company, party, party_type): """Returns the account for the given `party`. diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py index af7716be0ea..a70a77195ac 100644 --- a/erpnext/buying/doctype/supplier/supplier.py +++ b/erpnext/buying/doctype/supplier/supplier.py @@ -8,6 +8,7 @@ from frappe import msgprint, _ from frappe.model.naming import make_autoname from erpnext.utilities.address_and_contact import load_address_and_contact from erpnext.utilities.transaction_base import TransactionBase +from erpnext.accounts.party import validate_party_account class Supplier(TransactionBase): def get_feed(self): @@ -44,6 +45,8 @@ class Supplier(TransactionBase): if frappe.defaults.get_global_default('supp_master_name') == 'Naming Series': if not self.naming_series: msgprint(_("Series is mandatory"), raise_exception=1) + + validate_party_account(self) def get_contacts(self,nm): if nm: diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index fe68966f5f9..ae5cb49f185 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -10,6 +10,7 @@ from frappe.utils import flt from erpnext.utilities.transaction_base import TransactionBase from erpnext.utilities.address_and_contact import load_address_and_contact +from erpnext.accounts.party import validate_party_account class Customer(TransactionBase): def get_feed(self): @@ -26,12 +27,13 @@ class Customer(TransactionBase): else: self.name = make_autoname(self.naming_series+'.#####') - def validate_values(self): + def validate_mandatory(self): if frappe.defaults.get_global_default('cust_master_name') == 'Naming Series' and not self.naming_series: frappe.throw(_("Series is mandatory"), frappe.MandatoryError) - + def validate(self): - self.validate_values() + self.validate_mandatory() + validate_party_account(self) def update_lead_status(self): if self.lead_name: From 7dbd39578109c3735b836686ec847dc5360d3ee1 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 18 Aug 2015 11:33:29 +0530 Subject: [PATCH 03/38] Toggle alternative currency fields --- .../doctype/journal_entry/journal_entry.js | 54 ++++++++++++------- .../journal_entry_account.json | 6 +-- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index ff1ace49d27..11078262186 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -2,8 +2,44 @@ // License: GNU General Public License v3. See license.txt frappe.provide("erpnext.accounts"); +frappe.provide("erpnext.journal_entry"); frappe.require("assets/erpnext/js/utils.js"); +cur_frm.add_fetch("account", "currency", "currency"); + +frappe.ui.form.on("Journal Entry", { + refresh: function(frm) { + erpnext.toggle_naming_series(); + cur_frm.cscript.voucher_type(frm.doc); + + if(frm.doc.docstatus==1) { + cur_frm.add_custom_button(__('View Ledger'), function() { + frappe.route_options = { + "voucher_no": frm.doc.name, + "from_date": frm.doc.posting_date, + "to_date": frm.doc.posting_date, + "company": frm.doc.company, + group_by_voucher: 0 + }; + frappe.set_route("query-report", "General Ledger"); + }, "icon-table"); + } + + // hide /unhide fields based on currency + erpnext.journal_entry.toggle_fields_based_on_currency(frm); + } +}) + +erpnext.journal_entry.toggle_fields_based_on_currency = function(frm) { + var fields = ["balance_in_account_currency", "party_balance_in_account_currency", + "debit_in_account_currency", "credit_in_account_currency"]; + + 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); +} + erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ onload: function() { this.load_defaults(); @@ -164,24 +200,6 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ cur_frm.script_manager.make(erpnext.accounts.JournalEntry); -cur_frm.cscript.refresh = function(doc) { - erpnext.toggle_naming_series(); - cur_frm.cscript.voucher_type(doc); - - if(doc.docstatus==1) { - cur_frm.add_custom_button(__('View Ledger'), function() { - frappe.route_options = { - "voucher_no": doc.name, - "from_date": doc.posting_date, - "to_date": doc.posting_date, - "company": doc.company, - group_by_voucher: 0 - }; - frappe.set_route("query-report", "General Ledger"); - }, "icon-table"); - } -} - cur_frm.cscript.company = function(doc, cdt, cdn) { cur_frm.refresh_fields(); erpnext.get_fiscal_year(doc.company, doc.posting_date); 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 9f30db1a82f..506dfd962d0 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -89,7 +89,7 @@ "permlevel": 0, "precision": "", "print_hide": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -215,7 +215,7 @@ "permlevel": 0, "precision": "", "print_hide": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -476,7 +476,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-17 02:11:33.991361", + "modified": "2015-08-17 19:20:19.153237", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", From e459cb4d096b0894f28d03414db738df2826979a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 18 Aug 2015 16:12:01 +0530 Subject: [PATCH 04/38] Journal Entry: validate and post gle in multi currency --- .../accounts/doctype/gl_entry/gl_entry.json | 4 +- .../doctype/journal_entry/journal_entry.json | 543 ++++++++++++++++-- .../doctype/journal_entry/journal_entry.py | 46 +- .../journal_entry_account.json | 6 +- 4 files changed, 544 insertions(+), 55 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json index 08c5d87a0f0..dfe9fc3e5cf 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.json +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -186,7 +186,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Currency", + "label": "Account Currency", "no_copy": 0, "options": "Currency", "permlevel": 0, @@ -469,7 +469,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-13 16:46:11.515538", + "modified": "2015-08-18 14:25:44.430671", "modified_by": "Administrator", "module": "Accounts", "name": "GL Entry", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 4847a71ac21..c652ae4991c 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -1,36 +1,64 @@ { + "allow_copy": 0, "allow_import": 1, + "allow_rename": 0, "autoname": "naming_series:", "creation": "2013-03-25 10:53:52", + "custom": 0, "docstatus": 0, "doctype": "DocType", "fields": [ { + "allow_on_submit": 0, "fieldname": "entry_type_and_date", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "options": "icon-flag", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "default": "Journal Entry", "fieldname": "voucher_type", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 0, "label": "Voucher Type", + "no_copy": 0, "oldfieldname": "voucher_type", "oldfieldtype": "Select", "options": "Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry", "permlevel": 0, "print_hide": 0, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "naming_series", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", @@ -39,19 +67,38 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break1", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "posting_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 0, "label": "Posting Date", @@ -59,49 +106,123 @@ "oldfieldname": "posting_date", "oldfieldtype": "Date", "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, + "fieldname": "exchange_rate", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Exchange Rate", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, "fieldname": "2_add_edit_gl_entries", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-table", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "accounts", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Accounting Entries", + "no_copy": 0, "oldfieldname": "entries", "oldfieldtype": "Table", "options": "Journal Entry Account", "permlevel": 0, "print_hide": 0, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break99", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:inList([\"Credit Note\", \"Debit Note\"], doc.voucher_type)", "fieldname": "stock_entry", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Stock Entry", + "no_copy": 0, "options": "Stock Entry", "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_debit", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 1, "label": "Total Debit", @@ -110,23 +231,44 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_credit", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Total Credit", "no_copy": 1, "oldfieldname": "total_credit", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "difference", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Difference (Dr - Cr)", "no_copy": 1, "oldfieldname": "difference", @@ -134,26 +276,58 @@ "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "get_balance", "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Make Difference Entry", + "no_copy": 0, "oldfieldtype": "Button", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break99", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "eg. Cheque Number", "fieldname": "cheque_no", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 1, "label": "Reference Number", @@ -161,48 +335,103 @@ "oldfieldname": "cheque_no", "oldfieldtype": "Data", "permlevel": 0, + "print_hide": 0, "read_only": 0, - "search_index": 1 + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "cheque_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Reference Date", "no_copy": 1, "oldfieldname": "cheque_date", "oldfieldtype": "Date", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "user_remark", "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "User Remark", "no_copy": 1, "oldfieldname": "user_remark", "oldfieldtype": "Small Text", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "view_details", "fieldtype": "Fold", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "View Details", - "permlevel": 0 + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "reference", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Reference", + "no_copy": 0, "options": "icon-pushpin", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "clearance_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Clearance Date", "no_copy": 1, "oldfieldname": "clearance_date", @@ -210,135 +439,272 @@ "permlevel": 0, "print_hide": 0, "read_only": 1, - "search_index": 1 + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "User Remark will be added to Auto Remark", "fieldname": "remark", "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "Remark", "no_copy": 1, "oldfieldname": "remark", "oldfieldtype": "Small Text", "permlevel": 0, + "print_hide": 0, "read_only": 1, - "reqd": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break98", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "bill_no", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "Bill No", + "no_copy": 0, "oldfieldname": "bill_no", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "bill_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Bill Date", + "no_copy": 0, "oldfieldname": "bill_date", "oldfieldtype": "Date", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "due_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Due Date", + "no_copy": 0, "oldfieldname": "due_date", "oldfieldtype": "Date", "permlevel": 0, "print_hide": 0, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "addtional_info", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-file-text", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break2", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "default": "No", "description": "", "fieldname": "is_opening", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Is Opening", + "no_copy": 0, "oldfieldname": "is_opening", "oldfieldtype": "Select", "options": "No\nYes", "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 1 + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "default": "Accounts Receivable", "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", "fieldname": "write_off_based_on", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Based On", + "no_copy": 0, "options": "Accounts Receivable\nAccounts Payable", "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", "fieldname": "write_off_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Amount", + "no_copy": 0, "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", "fieldname": "get_outstanding_invoices", "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Get Outstanding Invoices", + "no_copy": 0, "options": "get_outstanding_invoices", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "letter_head", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Letter Head", + "no_copy": 0, "options": "Letter Head", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "select_print_heading", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Print Heading", "no_copy": 1, "oldfieldname": "select_print_heading", @@ -347,12 +713,20 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "amended_from", "fieldtype": "Link", + "hidden": 0, "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", @@ -360,31 +734,59 @@ "options": "Journal Entry", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break3", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "pay_to_recd_from", "fieldtype": "Data", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Pay To / Recd From", "no_copy": 1, "permlevel": 0, "print_hide": 0, "read_only": 0, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_amount", "fieldtype": "Currency", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "Total Amount", "no_copy": 1, @@ -392,60 +794,106 @@ "permlevel": 0, "print_hide": 1, "read_only": 1, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_amount_in_words", "fieldtype": "Data", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Amount in Words", "no_copy": 1, "permlevel": 0, "print_hide": 1, "read_only": 1, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "company", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Company", + "no_copy": 0, "oldfieldname": "company", "oldfieldtype": "Link", "options": "Company", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "fiscal_year", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Fiscal Year", + "no_copy": 0, "oldfieldname": "fiscal_year", "oldfieldtype": "Select", "options": "Fiscal Year", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "title", "fieldtype": "Data", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Title", + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], + "hide_heading": 0, + "hide_toolbar": 0, "icon": "icon-file-text", "idx": 1, + "in_create": 0, + "in_dialog": 0, "is_submittable": 1, - "modified": "2015-06-29 15:28:12.529019", + "issingle": 0, + "istable": 0, + "modified": "2015-08-18 14:26:37.496638", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", @@ -458,26 +906,35 @@ "create": 1, "delete": 1, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts User", + "set_user_permissions": 0, "share": 1, "submit": 1, "write": 1 }, { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts Manager", + "set_user_permissions": 0, "share": 1, "submit": 1, "write": 1 @@ -489,18 +946,24 @@ "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Auditor", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 } ], + "read_only": 0, "read_only_onload": 1, "search_fields": "voucher_type,posting_date, due_date, cheque_no", "sort_field": "modified", "sort_order": "DESC", "title_field": "title" -} +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 4b25a881124..8ea1e58e170 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -13,6 +13,7 @@ from erpnext.accounts.utils import get_balance_on class JournalEntry(AccountsController): def __init__(self, arg1, arg2=None): super(JournalEntry, self).__init__(arg1, arg2) + self.company_currency = get_company_currency(self.company) def get_feed(self): return self.voucher_type @@ -27,6 +28,7 @@ class JournalEntry(AccountsController): self.validate_cheque_info() self.validate_entries_for_advance() self.validate_debit_and_credit() + self.validate_multi_currency() self.validate_against_jv() self.validate_reference_doc() self.set_against_account() @@ -266,6 +268,30 @@ class JournalEntry(AccountsController): 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] + + if alternate_currency: + if not self.exchange_rate: + frappe.throw(_("Exchange Rate is mandatory in multi-currency Journal Entry")) + + if len(alternate_currency) > 1: + frappe.throw(_("Only one alternate currency can be used in a single Journal Entry")) + else: + 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: + exchange_rate = 1 + + d.debit_in_account_currency = flt(flt(d.debit)*exchange_rate, d.precision("debit_in_account_currency")) + d.credit_in_account_currency = flt(flt(d.credit)*exchange_rate, d.precision("credit_in_account_currency")) + def create_remarks(self): r = [] @@ -275,15 +301,13 @@ class JournalEntry(AccountsController): else: msgprint(_("Please enter Reference date"), raise_exception=frappe.MandatoryError) - company_currency = get_company_currency(self.company) - for d in self.get('accounts'): if d.reference_type=="Sales Invoice" and d.credit: - r.append(_("{0} against Sales Invoice {1}").format(fmt_money(flt(d.credit), currency = company_currency), \ + r.append(_("{0} against Sales Invoice {1}").format(fmt_money(flt(d.credit), currency = self.company_currency), \ d.reference_name)) if d.reference_type=="Sales Order" and d.credit: - r.append(_("{0} against Sales Order {1}").format(fmt_money(flt(d.credit), currency = company_currency), \ + r.append(_("{0} against Sales Order {1}").format(fmt_money(flt(d.credit), currency = self.company_currency), \ d.reference_name)) if d.reference_type == "Purchase Invoice" and d.debit: @@ -291,11 +315,11 @@ class JournalEntry(AccountsController): from `tabPurchase Invoice` where name=%s""", d.reference_name) if bill_no and bill_no[0][0] and bill_no[0][0].lower().strip() \ not in ['na', 'not applicable', 'none']: - r.append(_('{0} against Bill {1} dated {2}').format(fmt_money(flt(d.debit), currency=company_currency), bill_no[0][0], + r.append(_('{0} against Bill {1} dated {2}').format(fmt_money(flt(d.debit), currency=self.company_currency), bill_no[0][0], bill_no[0][1] and formatdate(bill_no[0][1].strftime('%Y-%m-%d')))) if d.reference_type == "Purchase Order" and d.debit: - r.append(_("{0} against Purchase Order {1}").format(fmt_money(flt(d.credit), currency = company_currency), \ + r.append(_("{0} against Purchase Order {1}").format(fmt_money(flt(d.credit), currency = self.company_currency), \ d.reference_name)) if self.user_remark: @@ -316,10 +340,9 @@ class JournalEntry(AccountsController): self.set_total_amount(d.debit or d.credit) def set_total_amount(self, amt): - company_currency = get_company_currency(self.company) self.total_amount = amt from frappe.utils import money_in_words - self.total_amount_in_words = money_in_words(amt, company_currency) + self.total_amount_in_words = money_in_words(amt, self.company_currency) def make_gl_entries(self, cancel=0, adv_adj=0): from erpnext.accounts.general_ledger import make_gl_entries @@ -333,8 +356,11 @@ class JournalEntry(AccountsController): "party_type": d.party_type, "party": d.party, "against": d.against_account, - "debit": flt(d.debit, self.precision("debit", "accounts")), - "credit": flt(d.credit, self.precision("credit", "accounts")), + "debit": flt(d.debit, d.precision("debit")), + "credit": flt(d.credit, d.precision("credit")), + "currency": d.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, "against_voucher": d.reference_name, "remarks": self.remark, 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 506dfd962d0..5cd72169895 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -277,7 +277,7 @@ "permlevel": 0, "precision": "", "print_hide": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -338,7 +338,7 @@ "permlevel": 0, "precision": "", "print_hide": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -476,7 +476,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-17 19:20:19.153237", + "modified": "2015-08-18 15:17:42.583090", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", From 0e46a9b86e44d79db4217654fe1be19c3902f59e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 18 Aug 2015 18:19:27 +0530 Subject: [PATCH 05/38] Journal Entry: client side triggers --- .../doctype/journal_entry/journal_entry.js | 115 ++++++++++++------ .../doctype/journal_entry/journal_entry.py | 40 +++--- .../journal_entry_account.json | 86 ++++++------- 3 files changed, 144 insertions(+), 97 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 11078262186..e0d580c595f 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -5,8 +5,6 @@ frappe.provide("erpnext.accounts"); frappe.provide("erpnext.journal_entry"); frappe.require("assets/erpnext/js/utils.js"); -cur_frm.add_fetch("account", "currency", "currency"); - frappe.ui.form.on("Journal Entry", { refresh: function(frm) { erpnext.toggle_naming_series(); @@ -189,8 +187,10 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ // set difference if(doc.difference) { if(doc.difference > 0) { + row.credit_in_account_currency = doc.difference; row.credit = doc.difference; } else { + row.debit_in_account_currency = -doc.difference; row.debit = -doc.difference; } } @@ -211,10 +211,10 @@ cur_frm.cscript.posting_date = function(doc, cdt, cdn){ cur_frm.cscript.update_totals = function(doc) { var td=0.0; var tc =0.0; - var el = doc.accounts || []; - for(var i in el) { - td += flt(el[i].debit, precision("debit", el[i])); - tc += flt(el[i].credit, precision("credit", el[i])); + var accounts = doc.accounts || []; + for(var i in accounts) { + td += flt(accounts[i].debit, precision("debit", accounts[i])); + tc += flt(accounts[i].credit, precision("credit", accounts[i])); } var doc = locals[doc.doctype][doc.name]; doc.total_debit = td; @@ -223,32 +223,12 @@ cur_frm.cscript.update_totals = function(doc) { refresh_many(['total_debit','total_credit','difference']); } -cur_frm.cscript.debit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); } -cur_frm.cscript.credit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); } - cur_frm.cscript.get_balance = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); return $c_obj(cur_frm.doc, 'get_balance', '', function(r, rt){ cur_frm.refresh(); }); } -// Get balance -// ----------- - -cur_frm.cscript.account = function(doc,dt,dn) { - var d = locals[dt][dn]; - if(d.account) { - return frappe.call({ - method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_account_balance_and_party_type", - args: {account: d.account, date: doc.posting_date}, - callback: function(r) { - $.extend(d, r.message); - refresh_field('balance', d.name, 'accounts'); - refresh_field('party_type', d.name, 'accounts'); - } - }); - } -} cur_frm.cscript.validate = function(doc,cdt,cdn) { cur_frm.cscript.update_totals(doc); @@ -313,22 +293,77 @@ cur_frm.cscript.voucher_type = function(doc, cdt, cdn) { } } -frappe.ui.form.on("Journal Entry Account", "party", function(frm, cdt, cdn) { - var d = frappe.get_doc(cdt, cdn); - if(!d.account && d.party_type && d.party) { - return frm.call({ - method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_party_account_and_balance", - child: d, - args: { - company: frm.doc.company, - party_type: d.party_type, - party: d.party - } - }); +frappe.ui.form.on("Journal Entry Account", { + party: function(frm, cdt, cdn) { + var d = frappe.get_doc(cdt, cdn); + if(!d.account && d.party_type && d.party) { + return frm.call({ + method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_party_account_and_balance", + child: d, + args: { + company: frm.doc.company, + party_type: d.party_type, + party: d.party + } + }); + } + }, + + account: function(frm, dt, dn) { + var d = locals[dt][dn]; + if(d.account) { + return frappe.call({ + method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_account_balance_and_party_type", + args: { + account: d.account, + date: frm.doc.posting_date, + company: frm.doc.company + }, + callback: function(r) { + if(r.message) { + $.extend(d, r.message[0]); + refresh_field('balance', d.name, 'accounts'); + refresh_field('party_type', d.name, 'accounts'); + refresh_field('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]) + } + } + } + }); + } + }, + + debit_in_account_currency: function(frm, dt, dn) { + 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; + + frappe.model.set_value(dt, dn, "debit", + flt(flt(row.debit_in_account_currency)*exchange_rate), precision("debit", row)); + }, + + credit_in_account_currency: function(frm, dt, dn) { + 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; + + frappe.model.set_value(dt, dn, "credit", + flt(flt(row.credit_in_account_currency)*exchange_rate), precision("credit", row)); + }, + + debit: function(frm, dt, dn) { + cur_frm.cscript.update_totals(frm.doc); + }, + + credit: function(frm, dt, dn) { + cur_frm.cscript.update_totals(frm.doc); } }) frappe.ui.form.on("Journal Entry Account", "accounts_remove", function(frm) { cur_frm.cscript.update_totals(frm.doc); -}); - +}); \ No newline at end of file diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 8ea1e58e170..315685da8fe 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe.utils import cstr, flt, fmt_money, formatdate, getdate, date_diff from frappe import msgprint, _, scrub -from erpnext.setup.utils import get_company_currency +from erpnext.setup.utils import get_company_currency, get_exchange_rate from erpnext.controllers.accounts_controller import AccountsController from erpnext.accounts.utils import get_balance_on @@ -27,8 +27,8 @@ class JournalEntry(AccountsController): self.validate_party() self.validate_cheque_info() self.validate_entries_for_advance() - self.validate_debit_and_credit() self.validate_multi_currency() + self.validate_debit_and_credit() self.validate_against_jv() self.validate_reference_doc() self.set_against_account() @@ -259,8 +259,8 @@ class JournalEntry(AccountsController): if d.debit and d.credit: frappe.throw(_("You cannot credit and debit same account at the same time")) - self.total_debit = flt(self.total_debit) + flt(d.debit, self.precision("debit", "accounts")) - self.total_credit = flt(self.total_credit) + flt(d.credit, self.precision("credit", "accounts")) + self.total_debit = flt(self.total_debit) + flt(d.debit, d.precision("debit")) + self.total_credit = flt(self.total_credit) + flt(d.credit, d.precision("credit")) self.difference = flt(self.total_debit, self.precision("total_debit")) - \ flt(self.total_credit, self.precision("total_credit")) @@ -285,12 +285,10 @@ class JournalEntry(AccountsController): 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: - exchange_rate = 1 + exchange_rate = self.exchange_rate if d.currency != self.company_currency else 1 - d.debit_in_account_currency = flt(flt(d.debit)*exchange_rate, d.precision("debit_in_account_currency")) - d.credit_in_account_currency = flt(flt(d.credit)*exchange_rate, d.precision("credit_in_account_currency")) + 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")) def create_remarks(self): @@ -681,14 +679,28 @@ def get_party_account_and_balance(company, party_type, party): } @frappe.whitelist() -def get_account_balance_and_party_type(account, date): +def get_account_balance_and_party_type(account, date, company): """Returns dict of account balance and party type to be set in Journal Entry on selection of account.""" if not frappe.has_permission("Account"): frappe.msgprint(_("No Permission"), raise_exception=1) - account_type = frappe.db.get_value("Account", account, "account_type") - return { + company_currency = get_company_currency(company) + account_details = frappe.db.get_value("Account", account, ["account_type", "currency"], as_dict=1) + + if account_details.account_type == "Receivable": + party_type = "Customer" + elif account_details.account_type == "Payable": + party_type = "Supplier" + else: + party_type = "" + + exchange_rate = None + if account_details.currency != company_currency: + exchange_rate = get_exchange_rate(account_details.currency, company_currency) + + grid_values = { "balance": get_balance_on(account, date), - "party_type": {"Receivable":"Customer", "Payable":"Supplier"}.get(account_type, "") + "party_type": party_type, + "currency": account_details.currency or company_currency, } - + return grid_values, exchange_rate \ No newline at end of file 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 5cd72169895..253c267b8ac 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -241,6 +241,27 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "debit_in_account_currency", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Debit in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "debit", @@ -263,27 +284,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "fieldname": "debit_in_account_currency", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Debit in Account Currency", - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "fieldname": "col_break2", @@ -302,6 +302,27 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "fieldname": "credit_in_account_currency", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit in Account Currency", + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "credit", @@ -324,27 +345,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "fieldname": "credit_in_account_currency", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Credit in Account Currency", - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "fieldname": "reference", @@ -476,7 +476,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-18 15:17:42.583090", + "modified": "2015-08-18 17:23:28.378231", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", From 46bcbaf97b11f4a4030747e1c87171e18d9c58f5 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 19 Aug 2015 13:49:10 +0530 Subject: [PATCH 06/38] GL Entry in account currency --- .../doctype/journal_entry/journal_entry.py | 1 - .../purchase_invoice/purchase_invoice.py | 20 ++++--- .../doctype/sales_invoice/sales_invoice.py | 59 ++++++++++++------- erpnext/controllers/accounts_controller.py | 24 +++++++- erpnext/controllers/stock_controller.py | 21 ++++--- .../purchase_receipt/purchase_receipt.py | 31 ++++++---- 6 files changed, 102 insertions(+), 54 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 315685da8fe..ebdd7293358 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -13,7 +13,6 @@ from erpnext.accounts.utils import get_balance_on class JournalEntry(AccountsController): def __init__(self, arg1, arg2=None): super(JournalEntry, self).__init__(arg1, arg2) - self.company_currency = get_company_currency(self.company) def get_feed(self): return self.voucher_type diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 132cb1027d6..fca96c218fb 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -254,7 +254,6 @@ class PurchaseInvoice(BuyingController): "party": self.supplier, "against": self.against_expense_account, "credit": self.total_amount_to_pay, - "remarks": self.remarks, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype, }) @@ -264,15 +263,20 @@ class PurchaseInvoice(BuyingController): 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") + + dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" + gl_entries.append( self.get_gl_dict({ "account": tax.account_head, "against": self.supplier, - "debit": tax.add_deduct_tax == "Add" and tax.base_tax_amount_after_discount_amount or 0, - "credit": tax.add_deduct_tax == "Deduct" and tax.base_tax_amount_after_discount_amount or 0, - "remarks": self.remarks, + dr_or_cr: tax.base_tax_amount_after_discount_amount, + dr_or_cr + "_in_account_currency": tax.base_tax_amount_after_discount_amount \ + if account_currency==self.company_currency \ + else tax.tax_amount_after_discount_amount, "cost_center": tax.cost_center - }) + }, account_currency) ) # accumulate valuation tax @@ -288,14 +292,15 @@ class PurchaseInvoice(BuyingController): 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") gl_entries.append( self.get_gl_dict({ "account": item.expense_account, "against": self.supplier, "debit": item.base_net_amount, - "remarks": self.remarks, + "debit_in_account_currency": item.net_amount, "cost_center": item.cost_center - }) + }, account_currency) ) if auto_accounting_for_stock and self.is_opening == "No" and \ @@ -353,7 +358,6 @@ class PurchaseInvoice(BuyingController): "account": self.write_off_account, "against": self.supplier, "credit": flt(self.write_off_amount), - "remarks": self.remarks, "cost_center": self.write_off_cost_center }) ) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index f82590a6094..7298b43d2b4 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -468,8 +468,10 @@ class SalesInvoice(SellingController): from erpnext.accounts.general_ledger import merge_similar_entries gl_entries = [] + + customer_account_currency = frappe.db.get_value("Account", self.debit_to, "currency") - self.make_customer_gl_entry(gl_entries) + self.make_customer_gl_entry(gl_entries, customer_account_currency) self.make_tax_gl_entries(gl_entries) @@ -478,14 +480,14 @@ class SalesInvoice(SellingController): # merge gl entries before adding pos entries gl_entries = merge_similar_entries(gl_entries) - self.make_pos_gl_entries(gl_entries) + self.make_pos_gl_entries(gl_entries, customer_account_currency) - self.make_write_off_gl_entry(gl_entries) + self.make_write_off_gl_entry(gl_entries, customer_account_currency) return gl_entries - def make_customer_gl_entry(self, gl_entries): - if self.base_grand_total: + def make_customer_gl_entry(self, gl_entries, customer_account_currency): + if self.grand_total: gl_entries.append( self.get_gl_dict({ "account": self.debit_to, @@ -493,37 +495,42 @@ class SalesInvoice(SellingController): "party": self.customer, "against": self.against_income_account, "debit": self.base_grand_total, - "remarks": self.remarks, + "debit_in_account_currency": self.base_grand_total \ + if customer_account_currency==self.company_currency else self.grand_total, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype - }) + }, customer_account_currency) ) 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") gl_entries.append( self.get_gl_dict({ "account": tax.account_head, "against": self.customer, "credit": flt(tax.base_tax_amount_after_discount_amount), - "remarks": self.remarks, + "credit_in_account_currency": flt(tax.base_tax_amount_after_discount_amount) \ + if account_currency==self.company_currency else flt(tax.tax_amount_after_discount_amount), "cost_center": tax.cost_center - }) + }, account_currency) ) def make_item_gl_entries(self, gl_entries): # 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") gl_entries.append( self.get_gl_dict({ "account": item.income_account, "against": self.customer, "credit": item.base_net_amount, - "remarks": self.remarks, + "credit_in_account_currency": item.base_net_amount \ + if account_currency==self.company_currency else item.net_amount, "cost_center": item.cost_center - }) + }, account_currency) ) # expense account gl entries @@ -531,8 +538,11 @@ class SalesInvoice(SellingController): and cint(self.update_stock): gl_entries += super(SalesInvoice, self).get_gl_entries() - def make_pos_gl_entries(self, gl_entries): + def make_pos_gl_entries(self, gl_entries, customer_account_currency): 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") + paid_amount_in_account_currency = self.paid_amount if bank_account_currency==self.company_currency \ + else flt(self.paid_amount/self.conversion_rate, self.precision("paid_amount")) # POS, make payment entries gl_entries.append( self.get_gl_dict({ @@ -541,23 +551,28 @@ class SalesInvoice(SellingController): "party": self.customer, "against": self.cash_bank_account, "credit": self.paid_amount, - "remarks": self.remarks, + "credit_in_account_currency": paid_amount_in_account_currency, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype, - }) + }, customer_account_currency) ) gl_entries.append( self.get_gl_dict({ "account": self.cash_bank_account, "against": self.customer, "debit": self.paid_amount, - "remarks": self.remarks, - }) + "debit_in_account_currency": paid_amount_in_account_currency + }, bank_account_currency) ) - def make_write_off_gl_entry(self, gl_entries): + def make_write_off_gl_entry(self, gl_entries, customer_account_currency): # 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_amount_in_account_currency = self.write_off_amount \ + if write_off_account_currency==self.company_currency \ + else flt(self.write_off_amount/self.conversion_rate, self.precision("write_off_amount")) + gl_entries.append( self.get_gl_dict({ "account": self.debit_to, @@ -565,19 +580,19 @@ class SalesInvoice(SellingController): "party": self.customer, "against": self.write_off_account, "credit": self.write_off_amount, - "remarks": self.remarks, + "credit_in_account_currency": write_off_amount_in_account_currency, "against_voucher": self.return_against if cint(self.is_return) else self.name, - "against_voucher_type": self.doctype, - }) + "against_voucher_type": self.doctype + }, customer_account_currency) ) gl_entries.append( self.get_gl_dict({ "account": self.write_off_account, "against": self.customer, "debit": self.write_off_amount, - "remarks": self.remarks, + "debit_in_account_currency": write_off_amount_in_account_currency, "cost_center": self.write_off_cost_center - }) + }, write_off_account_currency) ) def get_list_context(context=None): diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index c7600dfaeac..7aacf735ebe 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -16,6 +16,11 @@ force_item_fields = ("item_group", "barcode", "brand", "stock_uom") class CustomerFrozen(frappe.ValidationError): pass class AccountsController(TransactionBase): + def __init__(self, arg1, arg2=None): + super(AccountsController, self).__init__(arg1, arg2) + + self.company_currency = get_company_currency(self.company) + def validate(self): if self.get("_action") and self._action != "update_after_submit": self.set_missing_values(for_validate=True) @@ -187,7 +192,7 @@ class AccountsController(TransactionBase): if frappe.db.get_value(taxes_and_charges_doctype, self.taxes_and_charges, "disabled"): frappe.throw(_("{0} '{1}' is disabled").format(taxes_and_charges_doctype, self.taxes_and_charges)) - def get_gl_dict(self, args): + def get_gl_dict(self, args, account_currency=None): """this method populates the common properties of a gl entry record""" gl_dict = frappe._dict({ 'company': self.company, @@ -198,11 +203,28 @@ class AccountsController(TransactionBase): 'fiscal_year': self.fiscal_year, 'debit': 0, 'credit': 0, + 'debit_in_account_currency': 0, + 'credit_in_account_currency': 0, 'is_opening': self.get("is_opening") or "No", 'party_type': None, 'party': None }) gl_dict.update(args) + + if not account_currency: + account_currency = frappe.db.get_value("Account", gl_dict.account, "currency") + + gl_dict["currency"] = self.company_currency if account_currency==self.company_currency else self.currency + + # set debit/credit in account currency if not provided + if flt(gl_dict.debit) and not flt(gl_dict.debit_in_account_currency): + gl_dict.debit_in_account_currency = gl_dict.debit if account_currency==self.company_currency \ + else flt(gl_dict.debit / (self.get("conversion_rate") or 1), 2) + + if flt(gl_dict.credit) and not flt(gl_dict.credit_in_account_currency): + gl_dict.credit_in_account_currency = gl_dict.credit if account_currency==self.company_currency \ + else flt(gl_dict.credit / (self.get("conversion_rate") or 1), 2) + return gl_dict def clear_unallocated_advances(self, childtype, parentfield): diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index cfde04b5720..425aadd27b7 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -48,22 +48,22 @@ class StockController(AccountsController): # from warehouse account self.check_expense_account(detail) - + gl_list.append(self.get_gl_dict({ - "account": warehouse_account[sle.warehouse], + "account": warehouse_account[sle.warehouse]["name"], "against": detail.expense_account, "cost_center": detail.cost_center, "remarks": self.get("remarks") or "Accounting Entry for Stock", - "debit": flt(sle.stock_value_difference, 2) - })) + "debit": flt(sle.stock_value_difference, 2), + }, warehouse_account[sle.warehouse]["currency"])) - # to target warehouse / expense account + # to target warehouse / expense account gl_list.append(self.get_gl_dict({ "account": detail.expense_account, - "against": warehouse_account[sle.warehouse], + "against": warehouse_account[sle.warehouse]["name"], "cost_center": detail.cost_center, "remarks": self.get("remarks") or "Accounting Entry for Stock", - "credit": flt(sle.stock_value_difference, 2) + "credit": flt(sle.stock_value_difference, 2), })) elif sle.warehouse not in warehouse_with_no_account: warehouse_with_no_account.append(sle.warehouse) @@ -316,6 +316,9 @@ def get_voucherwise_gl_entries(future_stock_vouchers, posting_date): return gl_entries def get_warehouse_account(): - warehouse_account = dict(frappe.db.sql("""select warehouse, name from tabAccount - where account_type = 'Warehouse' and ifnull(warehouse, '') != ''""")) + warehouse_account = frappe._dict() + + for d in frappe.db.sql("""select warehouse, name, 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/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 53233ce777e..759b7a767a7 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -293,23 +293,28 @@ class PurchaseReceipt(BuyingController): val_rate_db_precision = 6 if cint(d.precision("valuation_rate")) <= 6 else 9 # warehouse account + stock_value_diff = flt(flt(d.valuation_rate, val_rate_db_precision) * flt(d.qty) + * flt(d.conversion_factor), d.precision("base_net_amount")) + gl_entries.append(self.get_gl_dict({ - "account": warehouse_account[d.warehouse], + "account": warehouse_account[d.warehouse]["name"], "against": stock_rbnb, "cost_center": d.cost_center, "remarks": self.get("remarks") or _("Accounting Entry for Stock"), - "debit": flt(flt(d.valuation_rate, val_rate_db_precision) * flt(d.qty) * flt(d.conversion_factor), - self.precision("base_net_amount", d)) - })) + "debit": stock_value_diff + }, warehouse_account[d.warehouse]["currency"])) # stock received but not billed + stock_rbnb_currency = frappe.db.get_value("Account", stock_rbnb, "currency") gl_entries.append(self.get_gl_dict({ "account": stock_rbnb, - "against": warehouse_account[d.warehouse], + "against": warehouse_account[d.warehouse]["name"], "cost_center": d.cost_center, "remarks": self.get("remarks") or _("Accounting Entry for Stock"), - "credit": flt(d.base_net_amount, self.precision("base_net_amount", d)) - })) + "credit": flt(d.base_net_amount, d.precision("base_net_amount")), + "credit_in_account_currency": flt(d.base_net_amount, d.precision("base_net_amount")) \ + if stock_rbnb_currency==self.currency else flt(d.net_amount, d.precision("net_amount")) + }, stock_rbnb_currency)) negative_expense_to_be_booked += flt(d.item_tax_amount) @@ -317,7 +322,7 @@ class PurchaseReceipt(BuyingController): if flt(d.landed_cost_voucher_amount): gl_entries.append(self.get_gl_dict({ "account": expenses_included_in_valuation, - "against": warehouse_account[d.warehouse], + "against": warehouse_account[d.warehouse]["name"], "cost_center": d.cost_center, "remarks": self.get("remarks") or _("Accounting Entry for Stock"), "credit": flt(d.landed_cost_voucher_amount) @@ -326,12 +331,12 @@ class PurchaseReceipt(BuyingController): # sub-contracting warehouse if flt(d.rm_supp_cost) and warehouse_account.get(self.supplier_warehouse): gl_entries.append(self.get_gl_dict({ - "account": warehouse_account[self.supplier_warehouse], - "against": warehouse_account[d.warehouse], + "account": warehouse_account[self.supplier_warehouse]["name"], + "against": warehouse_account[d.warehouse]["name"], "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"])) # divisional loss adjustment if not self.get("taxes"): @@ -345,11 +350,11 @@ class PurchaseReceipt(BuyingController): if divisional_loss: gl_entries.append(self.get_gl_dict({ "account": stock_rbnb, - "against": warehouse_account[d.warehouse], + "against": warehouse_account[d.warehouse]["name"], "cost_center": d.cost_center, "remarks": self.get("remarks") or _("Accounting Entry for Stock"), "debit": divisional_loss - })) + }, stock_rbnb_currency)) elif d.warehouse not in warehouse_with_no_account or \ d.rejected_warehouse not in warehouse_with_no_account: From 50ba6faaf6c02bf393e992cc6e7dbf6f7f92ce39 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 19 Aug 2015 19:21:49 +0530 Subject: [PATCH 07/38] Currency input from Chart of Accounts page --- erpnext/accounts/page/accounts_browser/accounts_browser.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js index 77a87fff7c0..56277814951 100644 --- a/erpnext/accounts/page/accounts_browser/accounts_browser.js +++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js @@ -211,7 +211,8 @@ erpnext.AccountsChart = Class.extend({ 'Income Account', 'Tax', 'Chargeable', 'Temporary'].join('\n'), 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:'warehouse', label:__('Warehouse'), options:"Warehouse"}, + {fieldtype:'Link', fieldname:'currency', label:__('Currency'), options:"Currency"} ] }) From 69c1401764ae0db4a72dfab44b510fadb93aaedf Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 19 Aug 2015 19:22:12 +0530 Subject: [PATCH 08/38] Multi currency patch initialized --- erpnext/patches/v5_7/multi_currency.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 erpnext/patches/v5_7/multi_currency.py diff --git a/erpnext/patches/v5_7/multi_currency.py b/erpnext/patches/v5_7/multi_currency.py new file mode 100644 index 00000000000..52e4d0499f5 --- /dev/null +++ b/erpnext/patches/v5_7/multi_currency.py @@ -0,0 +1,10 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.db.sql("""update `tabAccount` acc + set currency = (select default_currency from tabCompany where name=acc.company) + where ifnull(currency, '') = ''""") \ No newline at end of file From c561a499d7b24ba7e7a31bbf75e35bd5d9a04766 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 19 Aug 2015 19:22:34 +0530 Subject: [PATCH 09/38] Multi currency GL entry fixes --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 7 +- .../purchase_invoice/purchase_invoice.py | 3 +- erpnext/accounts/general_ledger.py | 19 +- erpnext/accounts/party.py | 13 +- erpnext/buying/doctype/supplier/supplier.json | 415 ++++++++++++++++-- erpnext/controllers/accounts_controller.py | 24 +- erpnext/controllers/stock_controller.py | 2 +- .../selling/doctype/customer/customer.json | 4 +- .../doctype/delivery_note/delivery_note.js | 20 +- .../purchase_receipt/purchase_receipt.py | 2 +- 10 files changed, 441 insertions(+), 68 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 075abd7209a..b37b4049052 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -106,16 +106,15 @@ class GLEntry(Document): if not self.currency: self.currency = company_currency - if account_currency != self.currency: frappe.throw(_("Accounting Entry for {0} can only be made in currency: {1}") .format(self.account, (account_currency or company_currency))) if self.party_type and self.party: - existing_gle = frappe.db.get_value("GL Entry", - {"party_type": self.party_type, "party": self.party}, ["name", "currency"]) + existing_gle = frappe.db.get_value("GL Entry", {"party_type": self.party_type, + "party": self.party, "company": self.company}, ["name", "currency"], as_dict=1) if not existing_gle: - party_currency = frappe.db.get_value(self.party_type, self.party, "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)) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index fca96c218fb..ac2ec3d4c9c 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -298,7 +298,8 @@ class PurchaseInvoice(BuyingController): "account": item.expense_account, "against": self.supplier, "debit": item.base_net_amount, - "debit_in_account_currency": item.net_amount, + "debit_in_account_currency": item.base_net_amount \ + if account_currency==self.company_currency else item.net_amount, "cost_center": item.cost_center }, account_currency) ) diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index 7edd69f70a1..ed2a0494b2b 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -27,14 +27,25 @@ def process_gl_map(gl_map, merge_entries=True): gl_map = merge_similar_entries(gl_map) for entry in gl_map: - # toggle debit, credit if negative entry + # toggle debit, credit if negative entry if flt(entry.debit) < 0: entry.credit = flt(entry.credit) - flt(entry.debit) entry.debit = 0.0 + + if flt(entry.debit_in_account_currency) < 0: + entry.credit_in_account_currency = \ + flt(entry.credit_in_account_currency) - flt(entry.debit_in_account_currency) + entry.debit_in_account_currency = 0.0 + if flt(entry.credit) < 0: entry.debit = flt(entry.debit) - flt(entry.credit) entry.credit = 0.0 - + + if flt(entry.credit_in_account_currency) < 0: + entry.debit_in_account_currency = \ + flt(entry.debit_in_account_currency) - flt(entry.credit_in_account_currency) + entry.credit_in_account_currency = 0.0 + return gl_map def merge_similar_entries(gl_map): @@ -45,7 +56,11 @@ def merge_similar_entries(gl_map): same_head = check_if_in_list(entry, merged_gl_map) if same_head: same_head.debit = flt(same_head.debit) + flt(entry.debit) + same_head.debit_in_account_currency = \ + flt(same_head.debit_in_account_currency) + flt(entry.debit_in_account_currency) same_head.credit = flt(same_head.credit) + flt(entry.credit) + same_head.credit_in_account_currency = \ + flt(same_head.credit_in_account_currency) + flt(entry.credit_in_account_currency) else: merged_gl_map.append(entry) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index be672cca467..2b2912d190b 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -143,13 +143,16 @@ def set_account_and_due_date(party, account, party_type, company, posting_date, return out def validate_party_account(party): - party_account_defined_for_companies = [d.company for d in party.get("party_accounts")] - + party_account_defined_for_companies = [d.company for d in party.get("accounts")] + party_account_required_for_companies = [] for company, company_currency in frappe.db.sql("select name, default_currency from `tabCompany`"): - if party.currency and party.currency != company_currency \ + if party.default_currency and party.default_currency != company_currency \ and company not in party_account_defined_for_companies: - frappe.throw(_("Please mention Party Account for company {0}, as party currency is different than company's default currency") - .format(company)) + party_account_required_for_companies.append(company) + + if party_account_required_for_companies: + frappe.msgprint(_("Please mention Party Account for the following companies, as party currency is different from company's default currency: {0}") + .format("\n" + "\n".join(party_account_required_for_companies))) @frappe.whitelist() def get_party_account(company, party, party_type): diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index c3128a5187d..4501a303065 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -1,254 +1,601 @@ { + "allow_copy": 0, "allow_import": 1, "allow_rename": 1, "autoname": "naming_series:", "creation": "2013-01-10 16:34:11", + "custom": 0, "description": "Supplier of Goods or Services.", "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "Setup", "fields": [ { + "allow_on_submit": 0, "fieldname": "basic_info", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-user", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "naming_series", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", "oldfieldtype": "Select", "options": "SUPP-", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "supplier_name", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "Supplier Name", "no_copy": 1, "oldfieldname": "supplier_name", "oldfieldtype": "Data", "permlevel": 0, - "reqd": 1 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break0", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "supplier_type", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Supplier Type", + "no_copy": 0, "oldfieldname": "supplier_type", "oldfieldtype": "Link", "options": "Supplier Type", "permlevel": 0, - "reqd": 1 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "is_frozen", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Is Frozen", + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:!doc.__islocal", "fieldname": "address_contacts", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Address & Contacts", + "no_copy": 0, "oldfieldtype": "Column Break", "options": "icon-map-marker", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "address_html", "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Address HTML", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break1", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "contact_html", "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Contact HTML", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "default_payable_accounts", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Default Payable Accounts", - "permlevel": 0 + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { - "depends_on": "eval:!doc.__islocal", + "allow_on_submit": 0, + "depends_on": "", "description": "Mention if non-standard receivable account applicable", "fieldname": "accounts", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Accounts", + "no_copy": 0, "options": "Party Account", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "more_info", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "More Info", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-file-text", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "default_currency", "fieldtype": "Link", + "hidden": 0, "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, "label": "Default Currency", "no_copy": 1, "options": "Currency", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "default_price_list", "fieldtype": "Link", + "hidden": 0, "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, "label": "Price List", + "no_copy": 0, "options": "Price List", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "default_taxes_and_charges", "fieldtype": "Link", + "hidden": 0, "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges", + "no_copy": 0, "options": "Purchase Taxes and Charges Template", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "credit_days", "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Credit Days", - "permlevel": 0 + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break2", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "website", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Website", + "no_copy": 0, "oldfieldname": "website", "oldfieldtype": "Data", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "Statutory info and other general information about your Supplier", "fieldname": "supplier_details", "fieldtype": "Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Supplier Details", + "no_copy": 0, "oldfieldname": "supplier_details", "oldfieldtype": "Code", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "communications", "fieldtype": "Table", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Communications", + "no_copy": 0, "options": "Communication", "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], + "hide_heading": 0, + "hide_toolbar": 0, "icon": "icon-user", "idx": 1, - "modified": "2015-07-17 09:39:05.318826", + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "modified": "2015-08-19 16:50:48.078108", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", "owner": "Administrator", "permissions": [ - { - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User" - }, { "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Purchase Manager", + "role": "Purchase User", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, "create": 1, "delete": 1, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Purchase Master Manager", + "set_user_permissions": 0, "share": 1, "submit": 0, "write": 1 }, { + "amend": 0, "apply_user_permissions": 1, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, + "print": 0, "read": 1, - "role": "Stock User" + "report": 0, + "role": "Stock User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 }, { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Stock Manager" + "role": "Stock Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 }, { + "amend": 0, "apply_user_permissions": 1, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, + "print": 0, "read": 1, - "role": "Accounts User" + "report": 0, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 }, { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Accounts Manager" + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 } ], + "read_only": 0, + "read_only_onload": 0, "search_fields": "supplier_name, supplier_type", "title_field": "supplier_name" } \ No newline at end of file diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 7aacf735ebe..1e7e31822fa 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -18,8 +18,8 @@ class CustomerFrozen(frappe.ValidationError): pass class AccountsController(TransactionBase): def __init__(self, arg1, arg2=None): super(AccountsController, self).__init__(arg1, arg2) - - self.company_currency = get_company_currency(self.company) + if self.get("company"): + self.company_currency = get_company_currency(self.company) def validate(self): if self.get("_action") and self._action != "update_after_submit": @@ -211,20 +211,30 @@ class AccountsController(TransactionBase): }) gl_dict.update(args) + gl_dict = self.set_balance_in_account_currency(gl_dict, account_currency) + + return gl_dict + + def set_balance_in_account_currency(self, gl_dict, account_currency=None): if not account_currency: account_currency = frappe.db.get_value("Account", gl_dict.account, "currency") - gl_dict["currency"] = self.company_currency if account_currency==self.company_currency else self.currency + 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)) + + gl_dict["currency"] = self.company_currency if account_currency==self.company_currency \ + else account_currency # set debit/credit in account currency if not provided if flt(gl_dict.debit) and not flt(gl_dict.debit_in_account_currency): gl_dict.debit_in_account_currency = gl_dict.debit if account_currency==self.company_currency \ - else flt(gl_dict.debit / (self.get("conversion_rate") or 1), 2) - + else flt(gl_dict.debit / (self.get("conversion_rate")), 2) + if flt(gl_dict.credit) and not flt(gl_dict.credit_in_account_currency): gl_dict.credit_in_account_currency = gl_dict.credit if account_currency==self.company_currency \ - else flt(gl_dict.credit / (self.get("conversion_rate") or 1), 2) - + else flt(gl_dict.credit / (self.get("conversion_rate")), 2) + return gl_dict def clear_unallocated_advances(self, childtype, parentfield): diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 425aadd27b7..dacb719b165 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -71,7 +71,7 @@ class StockController(AccountsController): if warehouse_with_no_account: msgprint(_("No accounting entries for the following warehouses") + ": \n" + "\n".join(warehouse_with_no_account)) - + return process_gl_map(gl_list) def get_voucher_details(self, default_expense_account, default_cost_center, sle_map): diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index a053427962f..a1bbeeb551e 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -299,7 +299,7 @@ }, { "allow_on_submit": 0, - "depends_on": "eval:!doc.__islocal", + "depends_on": "", "description": "Mention if non-standard receivable account applicable", "fieldname": "accounts", "fieldtype": "Table", @@ -739,7 +739,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-13 16:41:28.805471", + "modified": "2015-08-19 16:01:33.347348", "modified_by": "Administrator", "module": "Selling", "name": "Customer", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index e7ede652a3a..17194fdd4a7 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -10,17 +10,6 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( this._super(); if (!doc.is_return) { - if(doc.__onload && !doc.__onload.billing_complete && doc.docstatus==1) { - // show Make Invoice button only if Delivery Note is not created from Sales Invoice - var from_sales_invoice = false; - from_sales_invoice = cur_frm.doc.items.some(function(item) { - return item.against_sales_invoice ? true : false; - }); - - if(!from_sales_invoice) - cur_frm.add_custom_button(__('Invoice'), this.make_sales_invoice).addClass("btn-primary"); - } - if(flt(doc.per_installed, 2) < 100 && doc.docstatus==1) cur_frm.add_custom_button(__('Installation Note'), this.make_installation_note); @@ -59,7 +48,16 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( } } + if(doc.__onload && !doc.__onload.billing_complete && doc.docstatus==1 && !doc.is_return) { + // show Make Invoice button only if Delivery Note is not created from Sales Invoice + var from_sales_invoice = false; + from_sales_invoice = cur_frm.doc.items.some(function(item) { + return item.against_sales_invoice ? true : false; + }); + if(!from_sales_invoice) + cur_frm.add_custom_button(__('Invoice'), this.make_sales_invoice).addClass("btn-primary"); + } erpnext.stock.delivery_note.set_print_hide(doc, dt, dn); diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 759b7a767a7..d4e9f1d1ca3 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -313,7 +313,7 @@ class PurchaseReceipt(BuyingController): "remarks": self.get("remarks") or _("Accounting Entry for Stock"), "credit": flt(d.base_net_amount, d.precision("base_net_amount")), "credit_in_account_currency": flt(d.base_net_amount, d.precision("base_net_amount")) \ - if stock_rbnb_currency==self.currency else flt(d.net_amount, d.precision("net_amount")) + if stock_rbnb_currency==self.company_currency else flt(d.net_amount, d.precision("net_amount")) }, stock_rbnb_currency)) negative_expense_to_be_booked += flt(d.item_tax_amount) From 895029dc15786fff0518a99f58a9b67cd1926083 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 20 Aug 2015 14:55:39 +0530 Subject: [PATCH 10/38] Validate currency in transactions --- erpnext/controllers/accounts_controller.py | 38 ++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 1e7e31822fa..7775cb311f8 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -44,6 +44,7 @@ class AccountsController(TransactionBase): self.validate_enabled_taxes_and_charges() self.validate_party() + self.validate_currency() def on_submit(self): if self.meta.get_field("is_recurring"): @@ -211,14 +212,21 @@ class AccountsController(TransactionBase): }) gl_dict.update(args) + if not account_currency: + account_currency = frappe.db.get_value("Account", gl_dict.account, "currency") + + self.validate_account_currency(gl_dict.account, account_currency) gl_dict = self.set_balance_in_account_currency(gl_dict, account_currency) return gl_dict - def set_balance_in_account_currency(self, gl_dict, account_currency=None): - if not account_currency: - account_currency = frappe.db.get_value("Account", gl_dict.account, "currency") - + def validate_account_currency(self, account, account_currency=None): + valid_currency = list(set(self.currency, self.company_currency)) + if account_currency not in valid_currency: + frappe.throw(_("Invalid Account {0}. 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)) @@ -398,9 +406,27 @@ class AccountsController(TransactionBase): if party_type: party = self.get(party_type.lower()) - if frappe.db.get_value(party_type, party, "is_frozen"): + if frappe.db.get_value(party_type, party, "is_frozen"): frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) - + + self.validate_currency(party_type, party) + + def validate_currency(self, party_type, party): + if self.get("currency") and self.currency != self.company_currency: + 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}").format(currency_in_existing_entries)) + 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)) + @frappe.whitelist() def get_tax_rate(account_head): return frappe.db.get_value("Account", account_head, "tax_rate") From a12d9597299c1473fea4197c8801f10d30208aac Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 27 Aug 2015 12:27:24 +0530 Subject: [PATCH 11/38] GL Entries for Sales/Purchase Invoice in multi currency --- .../purchase_invoice/purchase_invoice.js | 21 + .../purchase_invoice/purchase_invoice.json | 1283 ++++++++++++- .../purchase_invoice/purchase_invoice.py | 27 +- .../purchase_invoice_advance.json | 224 ++- .../doctype/sales_invoice/sales_invoice.js | 26 +- .../doctype/sales_invoice/sales_invoice.json | 1668 +++++++++++++++-- .../doctype/sales_invoice/sales_invoice.py | 58 +- .../sales_invoice_advance.json | 224 ++- 8 files changed, 3120 insertions(+), 411 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 62578659925..559596d58e6 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -75,8 +75,29 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ me.apply_pricing_rule(); }) }, + + credit_to: function() { + var me = this; + if(this.frm.doc.credit_to) { + me.frm.call({ + method: "frappe.client.get_value", + args: { + doctype: "Account", + fieldname: "currency", + filters: { name: me.frm.doc.credit_to }, + }, + callback: function(r, rt) { + if(r.message) { + me.frm.set_value("party_account_currency", r.message.currency); + me.set_dynamic_labels(); + } + } + }); + } + }, write_off_amount: function() { + this.set_in_company_currency(this.frm.doc, ["write_off_amount"]); this.calculate_outstanding_amount(); this.frm.refresh_fields(); }, diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index f8101dc7af5..3a14cf650e6 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -1,13 +1,21 @@ { + "allow_copy": 0, "allow_import": 1, + "allow_rename": 0, "autoname": "naming_series:", "creation": "2013-05-21 16:16:39", + "custom": 0, "docstatus": 0, "doctype": "DocType", "fields": [ { + "allow_on_submit": 0, "fieldname": "naming_series", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", @@ -17,80 +25,160 @@ "print_hide": 1, "read_only": 0, "report_hide": 0, - "reqd": 1 + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "supplier", "fieldtype": "Link", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Supplier", + "no_copy": 0, "oldfieldname": "supplier", "oldfieldtype": "Link", "options": "Supplier", "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 1 + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "supplier", "fieldname": "supplier_name", "fieldtype": "Data", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "Supplier Name", + "no_copy": 0, "oldfieldname": "supplier_name", "oldfieldtype": "Data", "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "address_display", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Address", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "contact_display", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Contact", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "contact_mobile", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Mobile No", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "contact_email", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Contact Email", + "no_copy": 0, "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break1", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Date", "no_copy": 0, "oldfieldname": "posting_date", @@ -98,40 +186,63 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "", "fieldname": "bill_no", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Supplier Invoice No", + "no_copy": 0, "oldfieldname": "bill_no", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 0, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "bill_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Supplier Invoice Date", + "no_copy": 0, "oldfieldname": "bill_date", "oldfieldtype": "Date", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 0, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "amended_from", "fieldtype": "Link", + "hidden": 0, "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", @@ -139,484 +250,1024 @@ "options": "Purchase Invoice", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "company", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Company", + "no_copy": 0, "oldfieldname": "company", "oldfieldtype": "Link", "options": "Company", "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "is_return", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Is Return", "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "is_return", "fieldname": "return_against", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Return Against Purchase Invoice", "no_copy": 0, "options": "Purchase Invoice", "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "currency_and_price_list", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "options": "icon-tag", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "currency", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Currency", + "no_copy": 0, "oldfieldname": "currency", "oldfieldtype": "Select", "options": "Currency", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "The rate at which Bill Currency is converted into company's base currency", "fieldname": "conversion_rate", "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Exchange Rate", + "no_copy": 0, "oldfieldname": "conversion_rate", "oldfieldtype": "Currency", "permlevel": 0, "precision": "9", "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break2", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "buying_price_list", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Price List", + "no_copy": 0, "options": "Price List", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "price_list_currency", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Price List Currency", + "no_copy": 0, "options": "Currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "plc_conversion_rate", "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Price List Exchange Rate", + "no_copy": 0, "permlevel": 0, "precision": "9", "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "ignore_pricing_rule", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Ignore Pricing Rule", "no_copy": 1, "permlevel": 1, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "items_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-shopping-cart", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "items", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Items", + "no_copy": 0, "oldfieldname": "entries", "oldfieldtype": "Table", "options": "Purchase Invoice Item", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break_26", "fieldtype": "Section Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total (Company Currency)", + "no_copy": 0, "options": "Company:company:default_currency", "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "Will be calculated automatically when you enter the details", "fieldname": "base_net_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Net Total (Company Currency)", + "no_copy": 0, "oldfieldname": "net_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_28", "fieldtype": "Column Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total", "fieldtype": "Currency", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total", + "no_copy": 0, "options": "currency", "permlevel": 0, "precision": "", "print_hide": 0, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "net_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Net Total", + "no_copy": 0, "oldfieldname": "net_total_import", "oldfieldtype": "Currency", "options": "currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "taxes_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "taxes_and_charges", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges", + "no_copy": 0, "oldfieldname": "purchase_other_charges", "oldfieldtype": "Link", "options": "Purchase Taxes and Charges Template", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "taxes", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Purchase Taxes and Charges", + "no_copy": 0, "oldfieldname": "purchase_tax_details", "oldfieldtype": "Table", "options": "Purchase Taxes and Charges", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "other_charges_calculation", "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges Calculation", + "no_copy": 0, "oldfieldtype": "HTML", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "totals", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_taxes_and_charges_added", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges Added (Company Currency)", + "no_copy": 0, "oldfieldname": "other_charges_added", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_taxes_and_charges_deducted", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges Deducted (Company Currency)", + "no_copy": 0, "oldfieldname": "other_charges_deducted", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_total_taxes_and_charges", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Taxes and Charges (Company Currency)", + "no_copy": 0, "oldfieldname": "total_tax", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_40", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "taxes_and_charges_added", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges Added", + "no_copy": 0, "oldfieldname": "other_charges_added_import", "oldfieldtype": "Currency", "options": "currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "taxes_and_charges_deducted", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges Deducted", + "no_copy": 0, "oldfieldname": "other_charges_deducted_import", "oldfieldtype": "Currency", "options": "currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_taxes_and_charges", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Taxes and Charges", + "no_copy": 0, "options": "currency", "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break_44", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "default": "Grand Total", "fieldname": "apply_discount_on", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Apply Additional Discount On", + "no_copy": 0, "options": "\nGrand Total\nNet Total", "permlevel": 0, "precision": "", - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_46", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "discount_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Additional Discount Amount", + "no_copy": 0, "options": "currency", "permlevel": 0, "precision": "", - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_discount_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Additional Discount Amount (Company Currency)", + "no_copy": 0, "options": "Company:company:default_currency", "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break_49", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_grand_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Grand Total (Company Currency)", + "no_copy": 0, "oldfieldname": "grand_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "In Words will be visible once you save the Purchase Invoice.", "fieldname": "base_in_words", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "In Words (Company Currency)", + "no_copy": 0, "oldfieldname": "in_words", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break8", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "grand_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Grand Total", + "no_copy": 0, "oldfieldname": "grand_total_import", "oldfieldtype": "Currency", "options": "currency", "permlevel": 0, "print_hide": 0, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "in_words", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "In Words", + "no_copy": 0, "oldfieldname": "in_words_import", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 0, - "read_only": 1 - }, - { - "fieldname": "total_amount_to_pay", - "fieldtype": "Currency", - "hidden": 0, - "label": "Total Amount To Pay", - "no_copy": 1, - "oldfieldname": "total_amount_to_pay", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_advance", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Advance", "no_copy": 1, "oldfieldname": "total_advance", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "outstanding_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 0, "label": "Outstanding Amount", "no_copy": 1, "oldfieldname": "outstanding_amount", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "write_off_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Amount", "no_copy": 1, + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "base_write_off_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off Amount (Company Currency)", + "no_copy": 1, "options": "Company:company:default_currency", "permlevel": 0, + "precision": "", "print_hide": 1, - "read_only": 0 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:flt(doc.write_off_amount)!=0", "fieldname": "write_off_account", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Account", "no_copy": 1, "options": "Account", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:flt(doc.write_off_amount)!=0", "fieldname": "write_off_cost_center", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Cost Center", "no_copy": 1, "options": "Cost Center", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "against_expense_account", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Against Expense Account", "no_copy": 1, "oldfieldname": "against_expense_account", @@ -624,36 +1275,80 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "fold", "fieldtype": "Fold", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "advances_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "get_advances_paid", "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Get Advances Paid", + "no_copy": 0, "oldfieldtype": "Button", "options": "get_advances", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "advances", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Advances", "no_copy": 1, "oldfieldname": "advance_allocation_details", @@ -661,107 +1356,249 @@ "options": "Purchase Invoice Advance", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "terms_section_break", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "options": "icon-legal", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "tc_name", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Terms", + "no_copy": 0, "options": "Terms and Conditions", "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "terms", "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Terms and Conditions1", - "permlevel": 0 + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "supplier", "fieldname": "contact_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "options": "icon-bullhorn", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "supplier_address", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Supplier Address", + "no_copy": 0, "options": "Address", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "col_break23", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "contact_person", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Contact Person", + "no_copy": 0, "options": "Contact", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "more_info", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-file-text", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "Supplier (Payable) Account", "fieldname": "credit_to", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Credit To", + "no_copy": 0, "oldfieldname": "credit_to", "oldfieldtype": "Link", "options": "Account", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, + "fieldname": "party_account_currency", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Party Account Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, "default": "No", "description": "Considered as Opening Balance", "fieldname": "is_opening", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Is Opening", + "no_copy": 0, "oldfieldname": "is_opening", "oldfieldtype": "Select", "options": "No\nYes", "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "select_print_heading", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Print Heading", "no_copy": 1, "oldfieldname": "select_print_heading", @@ -770,12 +1607,20 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "due_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Due Date", "no_copy": 0, "oldfieldname": "due_date", @@ -783,40 +1628,82 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "mode_of_payment", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Mode of Payment", + "no_copy": 0, "oldfieldname": "mode_of_payment", "oldfieldtype": "Select", "options": "Mode of Payment", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_63", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "fiscal_year", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Fiscal Year", + "no_copy": 0, "oldfieldname": "fiscal_year", "oldfieldtype": "Select", "options": "Fiscal Year", "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "remarks", "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Remarks", "no_copy": 1, "oldfieldname": "remarks", @@ -824,22 +1711,50 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "reqd": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.docstatus<2", "fieldname": "recurring_invoice", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Invoice", + "no_copy": 0, "options": "icon-time", "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_77", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { @@ -848,10 +1763,20 @@ "description": "Check if recurring invoice, uncheck to stop recurring or put proper End Date", "fieldname": "is_recurring", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Is Recurring", "no_copy": 1, "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -859,11 +1784,21 @@ "description": "Select the period when the invoice will be generated automatically", "fieldname": "recurring_type", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Type", "no_copy": 1, "options": "Monthly\nQuarterly\nHalf-yearly\nYearly", "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -871,10 +1806,20 @@ "description": "Start date of current invoice's period", "fieldname": "from_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "From Date", "no_copy": 1, "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -882,10 +1827,20 @@ "description": "End date of current invoice's period", "fieldname": "to_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "To Date", "no_copy": 1, "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -893,10 +1848,20 @@ "description": "The day of the month on which auto invoice will be generated e.g. 05, 28 etc", "fieldname": "repeat_on_day_of_month", "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Repeat on Day of Month", "no_copy": 1, "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -904,39 +1869,81 @@ "description": "The date on which recurring invoice will be stop", "fieldname": "end_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "End Date", "no_copy": 1, "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_82", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The date on which next invoice will be generated. It is generated on submit.", "fieldname": "next_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Next Date", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The unique id for tracking all recurring invoices. It is generated on submit.", "fieldname": "recurring_id", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Id", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -944,25 +1951,54 @@ "description": "Enter email id separated by commas, invoice will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Notification Email Address", "no_copy": 1, "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.is_recurring==1", "fieldname": "recurring_print_format", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Print Format", + "no_copy": 0, "options": "Print Format", "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], + "hide_heading": 0, + "hide_toolbar": 0, "icon": "icon-file-text", "idx": 1, + "in_create": 0, + "in_dialog": 0, "is_submittable": 1, - "modified": "2015-07-24 11:49:59.762109", + "issingle": 0, + "istable": 0, + "modified": "2015-08-26 16:42:54.655847", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -975,11 +2011,15 @@ "create": 1, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts User", + "set_user_permissions": 0, "share": 1, "submit": 1, "write": 1 @@ -991,11 +2031,16 @@ "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Purchase User", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, @@ -1006,25 +2051,35 @@ "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Supplier", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts Manager", + "set_user_permissions": 0, "share": 1, "submit": 1, "write": 1 @@ -1036,21 +2091,41 @@ "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Auditor", + "set_user_permissions": 0, + "share": 0, "submit": 0, "write": 0 }, { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 1, + "print": 0, "read": 1, + "report": 0, "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } ], + "read_only": 0, "read_only_onload": 1, "search_fields": "posting_date, supplier, fiscal_year, bill_no, base_grand_total, outstanding_amount", "sort_field": "modified", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index ac2ec3d4c9c..0868a427448 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -244,7 +244,7 @@ class PurchaseInvoice(BuyingController): expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation") gl_entries = [] - + # parent's gl entry if self.base_grand_total: gl_entries.append( @@ -253,10 +253,12 @@ class PurchaseInvoice(BuyingController): "party_type": "Supplier", "party": self.supplier, "against": self.against_expense_account, - "credit": self.total_amount_to_pay, + "credit": self.base_grand_total, + "credit_in_account_currency": self.base_grand_total \ + if self.party_account_currency==self.company_currency else self.grand_total, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype, - }) + }, self.party_account_currency) ) # tax table gl entries @@ -354,11 +356,28 @@ class PurchaseInvoice(BuyingController): # 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") + + gl_entries.append( + self.get_gl_dict({ + "account": self.credit_to, + "party_type": "Supplier", + "party": self.supplier, + "against": self.write_off_account, + "debit": self.base_write_off_amount, + "debit_in_account_currency": self.base_write_off_amount \ + if self.party_account_currency==self.company_currency else self.write_off_amount, + "against_voucher": self.return_against if cint(self.is_return) else self.name, + "against_voucher_type": self.doctype, + }, self.party_account_currency) + ) gl_entries.append( self.get_gl_dict({ "account": self.write_off_account, "against": self.supplier, - "credit": flt(self.write_off_amount), + "credit": flt(self.base_write_off_amount), + "credit_in_account_currency": self.base_write_off_amount \ + if write_off_account_currency==self.company_currency else self.write_off_amount, "cost_center": self.write_off_cost_center }) ) diff --git a/erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json b/erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json index ec73ad4b27c..49540b7ea2a 100644 --- a/erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json +++ b/erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json @@ -1,89 +1,163 @@ { - "creation": "2013-03-08 15:36:46", - "docstatus": 0, - "doctype": "DocType", + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "creation": "2013-03-08 15:36:46", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "journal_entry", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Journal Entry", - "no_copy": 1, - "oldfieldname": "journal_voucher", - "oldfieldtype": "Link", - "options": "Journal Entry", - "permlevel": 0, - "print_width": "180px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "journal_entry", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Journal Entry", + "no_copy": 1, + "oldfieldname": "journal_voucher", + "oldfieldtype": "Link", + "options": "Journal Entry", + "permlevel": 0, + "print_hide": 0, + "print_width": "180px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "180px" - }, + }, { - "fieldname": "jv_detail_no", - "fieldtype": "Data", - "hidden": 1, - "in_list_view": 0, - "label": "Journal Entry Detail No", - "no_copy": 1, - "oldfieldname": "jv_detail_no", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 1, - "print_width": "80px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "jv_detail_no", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Journal Entry Detail No", + "no_copy": 1, + "oldfieldname": "jv_detail_no", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 1, + "print_width": "80px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "80px" - }, + }, { - "fieldname": "remarks", - "fieldtype": "Small Text", - "in_list_view": 1, - "label": "Remarks", - "no_copy": 1, - "oldfieldname": "remarks", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_width": "150px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "remarks", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Remarks", + "no_copy": 1, + "oldfieldname": "remarks", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 0, + "print_width": "150px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "fieldname": "col_break1", - "fieldtype": "Column Break", - "permlevel": 0 - }, + "allow_on_submit": 0, + "fieldname": "col_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { - "fieldname": "advance_amount", - "fieldtype": "Currency", - "in_list_view": 1, - "label": "Advance Amount", - "no_copy": 1, - "oldfieldname": "advance_amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_width": "100px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "advance_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Advance Amount", + "no_copy": 1, + "oldfieldname": "advance_amount", + "oldfieldtype": "Currency", + "options": "party_account_currency", + "permlevel": 0, + "print_hide": 0, + "print_width": "100px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "fieldname": "allocated_amount", - "fieldtype": "Currency", - "in_list_view": 1, - "label": "Allocated Amount", - "no_copy": 1, - "oldfieldname": "allocated_amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_width": "100px", + "allow_on_submit": 0, + "fieldname": "allocated_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Allocated Amount", + "no_copy": 1, + "oldfieldname": "allocated_amount", + "oldfieldtype": "Currency", + "options": "party_account_currency", + "permlevel": 0, + "print_hide": 0, + "print_width": "100px", + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" } - ], - "idx": 1, - "istable": 1, - "modified": "2014-12-25 16:29:15.176476", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Purchase Invoice Advance", - "owner": "Administrator", - "permissions": [] -} + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "modified": "2015-08-25 17:51:30.274069", + "modified_by": "nabin@erpnext.com", + "module": "Accounts", + "name": "Purchase Invoice Advance", + "owner": "Administrator", + "permissions": [], + "read_only": 0, + "read_only_onload": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 734684f69d9..61b7f943d8d 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -174,6 +174,26 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte me.apply_pricing_rule(); }) }, + + debit_to: function() { + var me = this; + if(this.frm.doc.debit_to) { + me.frm.call({ + method: "frappe.client.get_value", + args: { + doctype: "Account", + fieldname: "currency", + filters: { name: me.frm.doc.debit_to }, + }, + callback: function(r, rt) { + if(r.message) { + me.frm.set_value("party_account_currency", r.message.currency); + me.set_dynamic_labels(); + } + } + }); + } + }, allocated_amount: function() { this.calculate_total_advance(); @@ -182,10 +202,10 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte write_off_outstanding_amount_automatically: function() { if(cint(this.frm.doc.write_off_outstanding_amount_automatically)) { - frappe.model.round_floats_in(this.frm.doc, ["base_grand_total", "paid_amount"]); + frappe.model.round_floats_in(this.frm.doc, ["grand_total", "paid_amount"]); // this will make outstanding amount 0 this.frm.set_value("write_off_amount", - flt(this.frm.doc.base_grand_total - this.frm.doc.paid_amount - this.frm.doc.total_advance, precision("write_off_amount")) + flt(this.frm.doc.grand_total - this.frm.doc.paid_amount - this.frm.doc.total_advance, precision("write_off_amount")) ); this.frm.toggle_enable("write_off_amount", false); @@ -198,10 +218,12 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte }, write_off_amount: function() { + this.set_in_company_currency(this.frm.doc, ["write_off_amount"]); this.write_off_outstanding_amount_automatically(); }, paid_amount: function() { + this.set_in_company_currency(this.frm.doc, ["paid_amount"]); this.write_off_outstanding_amount_automatically(); }, diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index cd70a46c5d2..c89a46bc505 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -1,22 +1,43 @@ { + "allow_copy": 0, "allow_import": 1, + "allow_rename": 0, "autoname": "naming_series:", "creation": "2013-05-24 19:29:05", + "custom": 0, "default_print_format": "Standard", "docstatus": 0, "doctype": "DocType", - "document_type": "Transaction", + "document_type": "Document", "fields": [ { + "allow_on_submit": 0, "fieldname": "customer_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "options": "icon-user", - "permlevel": 0 + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "naming_series", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", @@ -25,12 +46,20 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "customer", "fieldtype": "Link", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Customer", "no_copy": 0, "oldfieldname": "customer", @@ -39,89 +68,181 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 1 + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "customer", "fieldname": "customer_name", "fieldtype": "Data", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "Customer Name", + "no_copy": 0, "oldfieldname": "customer_name", "oldfieldtype": "Data", "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "address_display", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Address", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "contact_display", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Contact", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "contact_mobile", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Mobile No", + "no_copy": 0, "permlevel": 0, - "read_only": 1 + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "contact_email", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Contact Email", + "no_copy": 0, "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "mode_of_payment", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Mode of Payment", "no_copy": 0, "oldfieldname": "mode_of_payment", "oldfieldtype": "Select", "options": "Mode of Payment", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break1", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "company", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Company", + "no_copy": 0, "oldfieldname": "company", "oldfieldtype": "Link", "options": "Company", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "amended_from", "fieldtype": "Link", + "hidden": 0, "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", @@ -129,13 +250,22 @@ "options": "Sales Invoice", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Date", "no_copy": 1, "oldfieldname": "posting_date", @@ -143,851 +273,1849 @@ "permlevel": 0, "print_hide": 0, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "due_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Payment Due Date", "no_copy": 1, "oldfieldname": "due_date", "oldfieldtype": "Date", "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, "reqd": 0, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "is_pos", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Is POS", + "no_copy": 0, "oldfieldname": "is_pos", "oldfieldtype": "Check", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "is_return", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Is Return", "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "is_return", "fieldname": "return_against", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Return Against Sales Invoice", "no_copy": 0, "options": "Sales Invoice", "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "shipping_address_name", "fieldtype": "Link", "hidden": 1, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Shipping Address Name", + "no_copy": 0, "options": "Address", "permlevel": 0, "precision": "", - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "shipping_address", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Shipping Address", + "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "currency_and_price_list", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "options": "icon-tag", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "currency", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Currency", + "no_copy": 0, "oldfieldname": "currency", "oldfieldtype": "Select", "options": "Currency", "permlevel": 0, "print_hide": 1, "read_only": 0, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "Rate at which Customer Currency is converted to customer's base currency", "fieldname": "conversion_rate", "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Exchange Rate", + "no_copy": 0, "oldfieldname": "conversion_rate", "oldfieldtype": "Currency", "permlevel": 0, "precision": "9", "print_hide": 1, "read_only": 0, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break2", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "selling_price_list", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Price List", + "no_copy": 0, "oldfieldname": "price_list_name", "oldfieldtype": "Select", "options": "Price List", "permlevel": 0, "print_hide": 1, "read_only": 0, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "price_list_currency", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Price List Currency", + "no_copy": 0, "options": "Currency", "permlevel": 0, "print_hide": 1, "read_only": 1, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "Rate at which Price list currency is converted to customer's base currency", "fieldname": "plc_conversion_rate", "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Price List Exchange Rate", "no_copy": 0, "permlevel": 0, "precision": "9", "print_hide": 1, "read_only": 0, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "ignore_pricing_rule", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Ignore Pricing Rule", "no_copy": 1, "permlevel": 1, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "items_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-shopping-cart", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "update_stock", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Update Stock", + "no_copy": 0, "oldfieldname": "update_stock", "oldfieldtype": "Check", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "items", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Items", + "no_copy": 0, "oldfieldname": "entries", "oldfieldtype": "Table", "options": "Sales Invoice Item", "permlevel": 0, + "print_hide": 0, "read_only": 0, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "packing_list", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Packing List", + "no_copy": 0, "options": "icon-suitcase", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "packed_items", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Packed Items", + "no_copy": 0, "options": "Packed Item", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "product_bundle_help", "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Product Bundle Help", + "no_copy": 0, "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break_30", "fieldtype": "Section Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total (Company Currency)", + "no_copy": 0, "options": "Company:company:default_currency", "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_net_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Net Total (Company Currency)", + "no_copy": 0, "oldfieldname": "net_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_32", "fieldtype": "Column Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total", + "no_copy": 0, "options": "currency", "permlevel": 0, "precision": "", "print_hide": 0, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "net_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Net Total", + "no_copy": 0, "options": "currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "taxes_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "taxes_and_charges", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges", + "no_copy": 0, "oldfieldname": "charge", "oldfieldtype": "Link", "options": "Sales Taxes and Charges Template", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_38", "fieldtype": "Column Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "shipping_rule", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Shipping Rule", + "no_copy": 0, "oldfieldtype": "Button", "options": "Shipping Rule", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break_40", "fieldtype": "Section Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "taxes", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Sales Taxes and Charges", + "no_copy": 0, "oldfieldname": "other_charges", "oldfieldtype": "Table", "options": "Sales Taxes and Charges", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "other_charges_calculation", "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Taxes and Charges Calculation", + "no_copy": 0, "oldfieldtype": "HTML", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break_43", "fieldtype": "Section Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_total_taxes_and_charges", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Taxes and Charges (Company Currency)", + "no_copy": 0, "oldfieldname": "other_charges_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_47", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_taxes_and_charges", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Taxes and Charges", + "no_copy": 0, "options": "currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break_49", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "default": "Grand Total", "fieldname": "apply_discount_on", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Apply Additional Discount On", + "no_copy": 0, "options": "\nGrand Total\nNet Total", "permlevel": 0, "precision": "", - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break_51", "fieldtype": "Column Break", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "discount_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Additional Discount Amount", + "no_copy": 0, "options": "currency", "permlevel": 0, - "print_hide": 1 + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_discount_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Additional Discount Amount (Company Currency)", + "no_copy": 0, "options": "Company:company:default_currency", "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "totals", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_grand_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Grand Total (Company Currency)", + "no_copy": 0, "oldfieldname": "grand_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, + "report_hide": 0, "reqd": 1, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "base_rounded_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Rounded Total (Company Currency)", + "no_copy": 0, "oldfieldname": "rounded_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "In Words will be visible once you save the Sales Invoice.", "fieldname": "base_in_words", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "In Words (Company Currency)", + "no_copy": 0, "oldfieldname": "in_words", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break5", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "grand_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 1, "label": "Grand Total", + "no_copy": 0, "oldfieldname": "grand_total_export", "oldfieldtype": "Currency", "options": "currency", "permlevel": 0, "print_hide": 0, "read_only": 1, - "reqd": 1 + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "rounded_total", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Rounded Total", + "no_copy": 0, "oldfieldname": "rounded_total_export", "oldfieldtype": "Currency", "options": "currency", "permlevel": 0, "print_hide": 0, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "in_words", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "In Words", + "no_copy": 0, "oldfieldname": "in_words_export", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 0, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_advance", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Advance", + "no_copy": 0, "oldfieldname": "total_advance", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "outstanding_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, "in_list_view": 0, "label": "Outstanding Amount", "no_copy": 1, "oldfieldname": "outstanding_amount", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "advances_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Advances", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "get_advances_received", "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Get Advances Received", + "no_copy": 0, "oldfieldtype": "Button", "options": "get_advances", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "advances", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Advances", + "no_copy": 0, "oldfieldname": "advance_adjustment_details", "oldfieldtype": "Table", "options": "Sales Invoice Advance", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", "fieldname": "payments_section", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Payments", + "no_copy": 0, "options": "icon-money", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "is_pos", "fieldname": "paid_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Paid Amount", "no_copy": 1, "oldfieldname": "paid_amount", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "currency", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, + "fieldname": "base_paid_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Paid Amount (Company Currency)", + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, "depends_on": "is_pos", "fieldname": "column_break3", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "depends_on": "is_pos", "fieldname": "cash_bank_account", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Cash/Bank Account", + "no_copy": 0, "oldfieldname": "cash_bank_account", "oldfieldtype": "Link", "options": "Account", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "grand_total", "fieldname": "column_break4", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "depends_on": "", "fieldname": "write_off_amount", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Amount", "no_copy": 1, + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "base_write_off_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off Amount (Company Currency)", + "no_copy": 1, "options": "Company:company:default_currency", "permlevel": 0, + "precision": "", "print_hide": 1, - "read_only": 0 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { - "depends_on": "", + "allow_on_submit": 0, + "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", "fieldname": "write_off_outstanding_amount_automatically", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Outstanding Amount", + "no_copy": 0, "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { - "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", + "allow_on_submit": 0, + "depends_on": "", "fieldname": "column_break_74", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "", "fieldname": "write_off_account", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Account", + "no_copy": 0, "options": "Account", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "", "fieldname": "write_off_cost_center", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Write Off Cost Center", + "no_copy": 0, "options": "Cost Center", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "fold", "fieldtype": "Fold", - "permlevel": 0 + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "terms_section_break", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-legal", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "tc_name", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Terms", + "no_copy": 0, "oldfieldname": "tc_name", "oldfieldtype": "Link", "options": "Terms and Conditions", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "terms", "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Terms and Conditions Details", + "no_copy": 0, "oldfieldname": "terms", "oldfieldtype": "Text Editor", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "customer", "fieldname": "contact_section", "fieldtype": "Section Break", "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "options": "icon-bullhorn", "permlevel": 0, - "read_only": 0 + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "", "fieldname": "territory", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Territory", + "no_copy": 0, "options": "Territory", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "", "fieldname": "customer_group", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Customer Group", + "no_copy": 0, "options": "Customer Group", "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "col_break23", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, + "print_hide": 0, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "customer_address", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Customer Address", + "no_copy": 0, "options": "Address", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "contact_person", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Contact Person", + "no_copy": 0, "options": "Contact", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "more_info", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-file-text", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "description": "Customer (Receivable) Account", "fieldname": "debit_to", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Debit To", + "no_copy": 0, "oldfieldname": "debit_to", "oldfieldtype": "Link", "options": "Account", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 1 + "search_index": 1, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Party Account Currency", + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, "fieldname": "project_name", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Project Name", + "no_copy": 0, "oldfieldname": "project_name", "oldfieldtype": "Link", "options": "Project", "permlevel": 0, + "print_hide": 0, "read_only": 0, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.source == 'Campaign'", "fieldname": "campaign", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Campaign", + "no_copy": 0, "oldfieldname": "campaign", "oldfieldtype": "Link", "options": "Campaign", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "source", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Source", + "no_copy": 0, "oldfieldname": "source", "oldfieldtype": "Select", "options": "\nExisting Customer\nReference\nAdvertisement\nCold Calling\nExhibition\nSupplier Reference\nMass Mailing\nCustomer's Vendor\nCampaign", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "default": "No", "description": "Considered as an Opening Balance", "fieldname": "is_opening", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Is Opening Entry", + "no_copy": 0, "oldfieldname": "is_opening", "oldfieldtype": "Select", "options": "No\nYes", "permlevel": 0, "print_hide": 1, "read_only": 0, - "search_index": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "c_form_applicable", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "C-Form Applicable", "no_copy": 1, "options": "No\nYes", "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "c_form_no", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "C-Form No", "no_copy": 1, "options": "C-Form", "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break8", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "letter_head", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Letter Head", + "no_copy": 0, "oldfieldname": "letter_head", "oldfieldtype": "Select", "options": "Letter Head", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, "fieldname": "select_print_heading", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Print Heading", "no_copy": 1, "oldfieldname": "select_print_heading", @@ -996,23 +2124,41 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "posting_time", "fieldtype": "Time", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Posting Time", "no_copy": 1, "oldfieldname": "posting_time", "oldfieldtype": "Time", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "fiscal_year", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Fiscal Year", "no_copy": 0, "oldfieldname": "fiscal_year", @@ -1021,12 +2167,20 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, "reqd": 1, - "search_index": 0 + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "remarks", "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Remarks", "no_copy": 1, "oldfieldname": "remarks", @@ -1034,103 +2188,216 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "reqd": 0 + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "sales_team_section_break", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "", + "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-group", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break9", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "sales_partner", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, "in_filter": 1, + "in_list_view": 0, "label": "Sales Partner", + "no_copy": 0, "oldfieldname": "sales_partner", "oldfieldtype": "Link", "options": "Sales Partner", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break10", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "oldfieldtype": "Column Break", "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "fieldname": "commission_rate", "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Commission Rate (%)", + "no_copy": 0, "oldfieldname": "commission_rate", "oldfieldtype": "Currency", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "total_commission", "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Total Commission", + "no_copy": 0, "oldfieldname": "total_commission", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "section_break2", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "sales_team", "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Sales Team1", + "no_copy": 0, "oldfieldname": "sales_team", "oldfieldtype": "Table", "options": "Sales Team", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.docstatus<2", "fieldname": "recurring_invoice", "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Invoice", + "no_copy": 0, "options": "icon-time", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break11", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { @@ -1139,11 +2406,20 @@ "description": "Check if recurring invoice, uncheck to stop recurring or put proper End Date", "fieldname": "is_recurring", "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Is Recurring", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -1151,12 +2427,21 @@ "description": "Select the period when the invoice will be generated automatically", "fieldname": "recurring_type", "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Type", "no_copy": 1, "options": "\nMonthly\nQuarterly\nHalf-yearly\nYearly", "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -1164,11 +2449,20 @@ "description": "Start date of current invoice's period", "fieldname": "from_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "From Date", "no_copy": 1, "permlevel": 0, "print_hide": 0, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -1176,11 +2470,20 @@ "description": "End date of current invoice's period", "fieldname": "to_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "To Date", "no_copy": 1, "permlevel": 0, "print_hide": 0, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -1188,11 +2491,20 @@ "description": "The day of the month on which auto invoice will be generated e.g. 05, 28 etc ", "fieldname": "repeat_on_day_of_month", "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Repeat on Day of Month", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -1200,42 +2512,81 @@ "description": "The date on which recurring invoice will be stop", "fieldname": "end_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "End Date", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "column_break12", "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "no_copy": 0, "permlevel": 0, "print_hide": 1, "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" }, { + "allow_on_submit": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The date on which next invoice will be generated. It is generated on submit.\n", "fieldname": "next_date", "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Next Date", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The unique id for tracking all recurring invoices.\u00a0It is generated on submit.", "fieldname": "recurring_id", "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Id", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { "allow_on_submit": 1, @@ -1243,25 +2594,51 @@ "description": "Enter email id separated by commas, invoice will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Notification Email Address", "no_copy": 1, "permlevel": 0, "print_hide": 1, - "read_only": 0 + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "depends_on": "eval:doc.is_recurring==1", "fieldname": "recurring_print_format", "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Recurring Print Format", + "no_copy": 0, "options": "Print Format", "permlevel": 0, - "precision": "" + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 }, { + "allow_on_submit": 0, "fieldname": "against_income_account", "fieldtype": "Small Text", "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, "label": "Against Income Account", "no_copy": 1, "oldfieldname": "against_income_account", @@ -1269,29 +2646,44 @@ "permlevel": 0, "print_hide": 1, "read_only": 0, - "report_hide": 1 + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], + "hide_heading": 0, + "hide_toolbar": 0, "icon": "icon-file-text", "idx": 1, + "in_create": 0, + "in_dialog": 0, "is_submittable": 1, - "modified": "2015-07-24 11:48:07.544569", - "modified_by": "Administrator", + "issingle": 0, + "istable": 0, + "modified": "2015-08-25 18:07:27.927856", + "modified_by": "nabin@erpnext.com", "module": "Accounts", "name": "Sales Invoice", "owner": "Administrator", "permissions": [ { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts Manager", + "set_user_permissions": 0, "share": 1, "submit": 1, "write": 1 @@ -1303,33 +2695,61 @@ "create": 1, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts User", + "set_user_permissions": 0, "share": 1, "submit": 1, "write": 1 }, { + "amend": 0, "apply_user_permissions": 1, "cancel": 0, + "create": 0, "delete": 0, "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Customer" + "role": "Customer", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 }, { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, "permlevel": 1, + "print": 0, "read": 1, + "report": 0, "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } ], + "read_only": 0, "read_only_onload": 1, "search_fields": "posting_date, due_date, customer, fiscal_year, base_grand_total, outstanding_amount", "sort_field": "modified", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 7298b43d2b4..aec31dcccd4 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -397,14 +397,21 @@ class SalesInvoice(SellingController): if cint(self.is_pos) == 1: if flt(self.paid_amount) == 0: if self.cash_bank_account: - frappe.db.set(self, 'paid_amount', - (flt(self.base_grand_total) - flt(self.write_off_amount))) + 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) + 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) def check_prev_docstatus(self): for d in self.get('items'): @@ -469,9 +476,7 @@ class SalesInvoice(SellingController): gl_entries = [] - customer_account_currency = frappe.db.get_value("Account", self.debit_to, "currency") - - self.make_customer_gl_entry(gl_entries, customer_account_currency) + self.make_customer_gl_entry(gl_entries) self.make_tax_gl_entries(gl_entries) @@ -480,13 +485,13 @@ class SalesInvoice(SellingController): # merge gl entries before adding pos entries gl_entries = merge_similar_entries(gl_entries) - self.make_pos_gl_entries(gl_entries, customer_account_currency) + self.make_pos_gl_entries(gl_entries) - self.make_write_off_gl_entry(gl_entries, customer_account_currency) + self.make_write_off_gl_entry(gl_entries) return gl_entries - def make_customer_gl_entry(self, gl_entries, customer_account_currency): + def make_customer_gl_entry(self, gl_entries): if self.grand_total: gl_entries.append( self.get_gl_dict({ @@ -496,10 +501,10 @@ class SalesInvoice(SellingController): "against": self.against_income_account, "debit": self.base_grand_total, "debit_in_account_currency": self.base_grand_total \ - if customer_account_currency==self.company_currency else self.grand_total, + if self.party_account_currency==self.company_currency else self.grand_total, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype - }, customer_account_currency) + }, self.party_account_currency) ) def make_tax_gl_entries(self, gl_entries): @@ -538,11 +543,9 @@ class SalesInvoice(SellingController): and cint(self.update_stock): gl_entries += super(SalesInvoice, self).get_gl_entries() - def make_pos_gl_entries(self, gl_entries, customer_account_currency): + 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") - paid_amount_in_account_currency = self.paid_amount if bank_account_currency==self.company_currency \ - else flt(self.paid_amount/self.conversion_rate, self.precision("paid_amount")) # POS, make payment entries gl_entries.append( self.get_gl_dict({ @@ -550,28 +553,27 @@ class SalesInvoice(SellingController): "party_type": "Customer", "party": self.customer, "against": self.cash_bank_account, - "credit": self.paid_amount, - "credit_in_account_currency": paid_amount_in_account_currency, + "credit": self.base_paid_amount, + "credit_in_account_currency": self.base_paid_amount \ + if self.party_account_currency==self.company_currency else self.paid_amount, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype, - }, customer_account_currency) + }, self.party_account_currency) ) gl_entries.append( self.get_gl_dict({ "account": self.cash_bank_account, "against": self.customer, - "debit": self.paid_amount, - "debit_in_account_currency": paid_amount_in_account_currency + "debit": self.base_paid_amount, + "debit_in_account_currency": self.base_paid_amount \ + if bank_account_currency==self.company_currency else self.paid_amount }, bank_account_currency) ) - def make_write_off_gl_entry(self, gl_entries, customer_account_currency): + 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_amount_in_account_currency = self.write_off_amount \ - if write_off_account_currency==self.company_currency \ - else flt(self.write_off_amount/self.conversion_rate, self.precision("write_off_amount")) gl_entries.append( self.get_gl_dict({ @@ -579,18 +581,20 @@ class SalesInvoice(SellingController): "party_type": "Customer", "party": self.customer, "against": self.write_off_account, - "credit": self.write_off_amount, - "credit_in_account_currency": write_off_amount_in_account_currency, + "credit": self.base_write_off_amount, + "credit_in_account_currency": self.base_write_off_amount \ + if self.party_account_currency==self.company_currency else self.write_off_amount, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype - }, customer_account_currency) + }, self.party_account_currency) ) gl_entries.append( self.get_gl_dict({ "account": self.write_off_account, "against": self.customer, - "debit": self.write_off_amount, - "debit_in_account_currency": write_off_amount_in_account_currency, + "debit": self.base_write_off_amount, + "debit_in_account_currency": self.base_write_off_amount \ + if write_off_account_currency==self.company_currency else self.write_off_amount, "cost_center": self.write_off_cost_center }, write_off_account_currency) ) diff --git a/erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json b/erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json index 722ae12fc11..714cd00c4b8 100644 --- a/erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json +++ b/erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json @@ -1,89 +1,163 @@ { - "creation": "2013-02-22 01:27:41", - "docstatus": 0, - "doctype": "DocType", + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "creation": "2013-02-22 01:27:41", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "journal_entry", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Journal Entry", - "no_copy": 1, - "oldfieldname": "journal_voucher", - "oldfieldtype": "Link", - "options": "Journal Entry", - "permlevel": 0, - "print_width": "250px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "journal_entry", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Journal Entry", + "no_copy": 1, + "oldfieldname": "journal_voucher", + "oldfieldtype": "Link", + "options": "Journal Entry", + "permlevel": 0, + "print_hide": 0, + "print_width": "250px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "250px" - }, + }, { - "fieldname": "remarks", - "fieldtype": "Small Text", - "in_list_view": 1, - "label": "Remarks", - "no_copy": 1, - "oldfieldname": "remarks", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_width": "150px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "remarks", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Remarks", + "no_copy": 1, + "oldfieldname": "remarks", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 0, + "print_width": "150px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "fieldname": "jv_detail_no", - "fieldtype": "Data", - "hidden": 1, - "in_list_view": 0, - "label": "Journal Entry Detail No", - "no_copy": 1, - "oldfieldname": "jv_detail_no", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_width": "120px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "jv_detail_no", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Journal Entry Detail No", + "no_copy": 1, + "oldfieldname": "jv_detail_no", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_width": "120px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "120px" - }, + }, { - "fieldname": "col_break1", - "fieldtype": "Column Break", - "permlevel": 0 - }, + "allow_on_submit": 0, + "fieldname": "col_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { - "fieldname": "advance_amount", - "fieldtype": "Currency", - "in_list_view": 1, - "label": "Advance amount", - "no_copy": 1, - "oldfieldname": "advance_amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_width": "120px", - "read_only": 1, + "allow_on_submit": 0, + "fieldname": "advance_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Advance amount", + "no_copy": 1, + "oldfieldname": "advance_amount", + "oldfieldtype": "Currency", + "options": "party_account_currency", + "permlevel": 0, + "print_hide": 0, + "print_width": "120px", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "120px" - }, + }, { - "fieldname": "allocated_amount", - "fieldtype": "Currency", - "in_list_view": 1, - "label": "Allocated amount", - "no_copy": 1, - "oldfieldname": "allocated_amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_width": "120px", + "allow_on_submit": 0, + "fieldname": "allocated_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Allocated amount", + "no_copy": 1, + "oldfieldname": "allocated_amount", + "oldfieldtype": "Currency", + "options": "party_account_currency", + "permlevel": 0, + "print_hide": 0, + "print_width": "120px", + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "120px" } - ], - "idx": 1, - "istable": 1, - "modified": "2014-12-25 16:30:19.446500", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Sales Invoice Advance", - "owner": "Administrator", - "permissions": [] -} + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "modified": "2015-08-21 16:22:28.866049", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Sales Invoice Advance", + "owner": "Administrator", + "permissions": [], + "read_only": 0, + "read_only_onload": 0 +} \ No newline at end of file From 4ffd7f3d0576d2c2278c9157e8ac6d33ce24c446 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 27 Aug 2015 12:28:36 +0530 Subject: [PATCH 12/38] Outstanding, paid and write-off amount in Invoice --- .../purchase_common/purchase_common.js | 13 +----- erpnext/controllers/accounts_controller.py | 42 ++++++++++++------- erpnext/controllers/taxes_and_totals.py | 28 +++++++------ .../public/js/controllers/taxes_and_totals.js | 40 ++++++++++++++++++ erpnext/public/js/controllers/transaction.js | 10 +++-- erpnext/public/js/pos/pos.js | 8 ++-- erpnext/selling/sales_common.js | 24 ----------- 7 files changed, 94 insertions(+), 71 deletions(-) diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js index 7693e080946..f372cd84d8d 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.js +++ b/erpnext/buying/doctype/purchase_common/purchase_common.js @@ -157,20 +157,9 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ }, add_deduct_tax: function(doc, cdt, cdn) { this.calculate_taxes_and_totals(); - }, - - calculate_outstanding_amount: function() { - if(this.frm.doc.doctype == "Purchase Invoice" && this.frm.doc.docstatus < 2) { - frappe.model.round_floats_in(this.frm.doc, ["base_grand_total", "total_advance", "write_off_amount"]); - this.frm.doc.total_amount_to_pay = flt(this.frm.doc.base_grand_total - this.frm.doc.write_off_amount, - precision("total_amount_to_pay")); - if (!this.frm.doc.is_return) { - this.frm.doc.outstanding_amount = flt(this.frm.doc.total_amount_to_pay - this.frm.doc.total_advance, - precision("outstanding_amount")); - } - } } }); + cur_frm.add_fetch('project_name', 'cost_center', 'cost_center'); erpnext.buying.get_default_bom = function(frm) { diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 7775cb311f8..6ba954f7a31 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -18,8 +18,13 @@ class CustomerFrozen(frappe.ValidationError): pass class AccountsController(TransactionBase): def __init__(self, arg1, arg2=None): super(AccountsController, self).__init__(arg1, arg2) - if self.get("company"): - self.company_currency = get_company_currency(self.company) + + @property + def company_currency(self): + if not hasattr(self, "__company_currency"): + self.__company_currency = get_company_currency(self.company) + + return self.__company_currency def validate(self): if self.get("_action") and self._action != "update_after_submit": @@ -221,10 +226,10 @@ class AccountsController(TransactionBase): return gl_dict def validate_account_currency(self, account, account_currency=None): - valid_currency = list(set(self.currency, self.company_currency)) + valid_currency = list(set([self.currency, self.company_currency])) if account_currency not in valid_currency: - frappe.throw(_("Invalid Account {0}. Account Currency must be {1}") - .format(account, "or".join(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: @@ -397,22 +402,28 @@ class AccountsController(TransactionBase): if frozen_accounts_modifier in frappe.get_roles(): return + party_type, party = self.get_party() + + if party_type: + if frappe.db.get_value(party_type, party, "is_frozen"): + frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) + + def get_party(self): party_type = None if self.meta.get_field("customer"): party_type = 'Customer' elif self.meta.get_field("supplier"): party_type = 'Supplier' - - if party_type: - party = self.get(party_type.lower()) - if frappe.db.get_value(party_type, party, "is_frozen"): - frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) - - self.validate_currency(party_type, party) - - def validate_currency(self, party_type, party): + + party = self.get(party_type.lower()) if party_type else None + + return party_type, party + + def validate_currency(self): if self.get("currency") and self.currency != self.company_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 @@ -420,7 +431,8 @@ class AccountsController(TransactionBase): if existing_gle: if currency_in_existing_entries != self.company_currency \ and currency_in_existing_entries != self.currency: - frappe.throw(_("Currency must be {0}").format(currency_in_existing_entries)) + 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: diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index d526f66baf3..0fbe22d7af5 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -394,17 +394,21 @@ class calculate_taxes_and_totals(object): # NOTE: # write_off_amount is only for POS Invoice # total_advance is only for non POS Invoice - + if self.doc.is_return: + return + + self.doc.round_floats_in(self.doc, ["grand_total", "total_advance", "write_off_amount"]) + total_amount_to_pay = flt(self.doc.grand_total - self.doc.total_advance - self.doc.write_off_amount, + self.doc.precision("grand_total")) + if self.doc.doctype == "Sales Invoice": - if not self.doc.is_return: - self.doc.round_floats_in(self.doc, ["base_grand_total", "total_advance", "write_off_amount", "paid_amount"]) - total_amount_to_pay = self.doc.base_grand_total - self.doc.write_off_amount - self.doc.outstanding_amount = flt(total_amount_to_pay - self.doc.total_advance - self.doc.paid_amount, - self.doc.precision("outstanding_amount")) + self.doc.round_floats_in(self.doc, ["paid_amount"]) + outstanding_amount = flt(total_amount_to_pay - self.doc.paid_amount, self.doc.precision("outstanding_amount")) + elif self.doc.doctype == "Purchase Invoice": + outstanding_amount = flt(total_amount_to_pay, self.doc.precision("outstanding_amount")) + + if self.doc.party_account_currency == self.doc.currency: + self.doc.outstanding_amount = outstanding_amount else: - self.doc.round_floats_in(self.doc, ["total_advance", "write_off_amount"]) - self.doc.total_amount_to_pay = flt(self.doc.base_grand_total - self.doc.write_off_amount, - self.doc.precision("total_amount_to_pay")) - if not self.doc.is_return: - self.doc.outstanding_amount = flt(self.doc.total_amount_to_pay - self.doc.total_advance, - self.doc.precision("outstanding_amount")) + self.doc.outstanding_amount = flt(outstanding_amount * self.doc.conversion_rate, + self.doc.precision("outstanding_amount")) \ No newline at end of file diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 0b3ca7f2a85..ad794d6e19e 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -491,5 +491,45 @@ erpnext.taxes_and_totals = erpnext.stock.StockController.extend({ this.frm.doc.total_advance = flt(total_allocated_amount, precision("total_advance")); this.calculate_outstanding_amount(update_paid_amount); + }, + + calculate_outstanding_amount: function(update_paid_amount) { + // NOTE: + // paid_amount and write_off_amount is only for POS Invoice + // total_advance is only for non POS Invoice + if(this.frm.doc.is_return || this.frm.doc.docstatus > 0) return; + + frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount"]); + + var total_amount_to_pay = flt((this.frm.doc.grand_total - this.frm.doc.total_advance + - this.frm.doc.write_off_amount), precision("grand_total")); + + if(this.frm.doc.doctype == "Sales Invoice") { + frappe.model.round_floats_in(this.frm.doc, ["paid_amount"]); + + if(this.frm.doc.is_pos) { + if(!this.frm.doc.paid_amount || update_paid_amount===undefined || update_paid_amount) { + this.frm.doc.paid_amount = flt(total_amount_to_pay); + } + } else { + this.frm.doc.paid_amount = 0 + } + this.set_in_company_currency(this.frm.doc, ["paid_amount"]); + this.frm.refresh_field("paid_amount"); + this.frm.refresh_field("base_paid_amount"); + + var outstanding_amount = flt(total_amount_to_pay - this.frm.doc.paid_amount, + precision("outstanding_amount")); + + } else if(this.frm.doc.doctype == "Purchase Invoice") { + var outstanding_amount = flt(total_amount_to_pay, precision("outstanding_amount")); + } + + if(this.frm.doc.party_account_currency == this.frm.doc.currency) { + this.frm.set_value("outstanding_amount", outstanding_amount); + } else { + this.frm.set_value("outstanding_amount", + flt(outstanding_amount * this.frm.doc.conversion_rate, precision("outstanding_amount"))); + } } }) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index ba10702bd98..5cc75b6a8ad 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -415,11 +415,14 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ setup_field_label_map(["base_total", "base_net_total", "base_total_taxes_and_charges", "base_discount_amount", "base_grand_total", "base_rounded_total", "base_in_words", "base_taxes_and_charges_added", "base_taxes_and_charges_deducted", "total_amount_to_pay", - "outstanding_amount", "total_advance", "paid_amount", "write_off_amount"], company_currency); + "base_paid_amount", "base_write_off_amount" + ], company_currency); setup_field_label_map(["total", "net_total", "total_taxes_and_charges", "discount_amount", "grand_total", "taxes_and_charges_added", "taxes_and_charges_deducted", - "rounded_total", "in_words"], this.frm.doc.currency); + "rounded_total", "in_words", "paid_amount", "write_off_amount"], this.frm.doc.currency); + + setup_field_label_map(["outstanding_amount", "total_advance"], this.frm.doc.party_account_currency); cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency + " = [?] " + company_currency) @@ -432,7 +435,8 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ // toggle fields this.frm.toggle_display(["conversion_rate", "base_total", "base_net_total", "base_total_taxes_and_charges", "base_taxes_and_charges_added", "base_taxes_and_charges_deducted", - "base_grand_total", "base_rounded_total", "base_in_words", "base_discount_amount"], + "base_grand_total", "base_rounded_total", "base_in_words", "base_discount_amount", + "base_paid_amount", "base_write_off_amount"], this.frm.doc.currency != company_currency); this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"], diff --git a/erpnext/public/js/pos/pos.js b/erpnext/public/js/pos/pos.js index 5f827964f6d..02eeab08379 100644 --- a/erpnext/public/js/pos/pos.js +++ b/erpnext/public/js/pos/pos.js @@ -473,13 +473,11 @@ erpnext.pos.PointOfSale = Class.extend({ } me.frm.set_value("mode_of_payment", values.mode_of_payment); - //me.frm.cscript.calculate_taxes_and_totals(); - - var paid_amount = flt((flt(values.paid_amount) - flt(values.change)) / me.frm.doc.conversion_rate, precision("paid_amount")); + var paid_amount = flt((flt(values.paid_amount) - flt(values.change)), precision("paid_amount")); me.frm.set_value("paid_amount", paid_amount); - + // specifying writeoff amount here itself, so as to avoid recursion issue - me.frm.set_value("write_off_amount", me.frm.doc.base_grand_total - paid_amount); + me.frm.set_value("write_off_amount", me.frm.doc.grand_total - paid_amount); me.frm.set_value("outstanding_amount", 0); me.frm.savesubmit(this); diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js index 5404947e1d9..6a8744a3854 100644 --- a/erpnext/selling/sales_common.js +++ b/erpnext/selling/sales_common.js @@ -206,30 +206,6 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ } }, - calculate_outstanding_amount: function(update_paid_amount) { - // NOTE: - // paid_amount and write_off_amount is only for POS Invoice - // total_advance is only for non POS Invoice - if(this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.docstatus==0 && !this.frm.doc.is_return) { - frappe.model.round_floats_in(this.frm.doc, ["base_grand_total", "total_advance", "write_off_amount", - "paid_amount"]); - var total_amount_to_pay = this.frm.doc.base_grand_total - this.frm.doc.write_off_amount - - this.frm.doc.total_advance; - if(this.frm.doc.is_pos) { - if(!this.frm.doc.paid_amount || update_paid_amount===undefined || update_paid_amount) { - this.frm.doc.paid_amount = flt(total_amount_to_pay); - this.frm.refresh_field("paid_amount"); - } - } else { - this.frm.doc.paid_amount = 0 - this.frm.refresh_field("paid_amount"); - } - - this.frm.set_value("outstanding_amount", flt(total_amount_to_pay - - this.frm.doc.paid_amount, precision("outstanding_amount"))); - } - }, - calculate_commission: function() { if(this.frm.fields_dict.commission_rate) { if(this.frm.doc.commission_rate > 100) { From 54fe26dcfbb144b5963fc6af9ae355aa07efd3ab Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 27 Aug 2015 12:55:24 +0530 Subject: [PATCH 13/38] [patch] Multi currency --- .../doctype/journal_entry/journal_entry.py | 2 +- .../journal_entry_account.json | 10 +-- erpnext/patches.txt | 1 + erpnext/patches/v5_7/multi_currency.py | 10 --- erpnext/patches/v6_0/__init__.py | 0 erpnext/patches/v6_0/multi_currency.py | 85 +++++++++++++++++++ 6 files changed, 92 insertions(+), 16 deletions(-) delete mode 100644 erpnext/patches/v5_7/multi_currency.py create mode 100644 erpnext/patches/v6_0/__init__.py create mode 100644 erpnext/patches/v6_0/multi_currency.py diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index ebdd7293358..f122deb552a 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -263,7 +263,7 @@ class JournalEntry(AccountsController): 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)) 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 253c267b8ac..718d96ad3f9 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -270,14 +270,14 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 1, - "label": "Debit", + "label": "Debit in Company Currency", "no_copy": 0, "oldfieldname": "debit", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -331,14 +331,14 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 1, - "label": "Credit", + "label": "Credit in Company Currency", "no_copy": 0, "oldfieldname": "credit", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -476,7 +476,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-18 17:23:28.378231", + "modified": "2015-08-27 12:52:20.914258", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 21656c6d659..cadd6afe560 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -193,3 +193,4 @@ execute:frappe.db.sql("update `tabProduction Order` pro set description = (selec erpnext.patches.v5_7.item_template_attributes erpnext.patches.v4_2.repost_reserved_qty #2015-08-20 erpnext.patches.v5_4.update_purchase_cost_against_project +erpnext.patches.v6_0.multi_currency \ No newline at end of file diff --git a/erpnext/patches/v5_7/multi_currency.py b/erpnext/patches/v5_7/multi_currency.py deleted file mode 100644 index 52e4d0499f5..00000000000 --- a/erpnext/patches/v5_7/multi_currency.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql("""update `tabAccount` acc - set currency = (select default_currency from tabCompany where name=acc.company) - where ifnull(currency, '') = ''""") \ No newline at end of file diff --git a/erpnext/patches/v6_0/__init__.py b/erpnext/patches/v6_0/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/patches/v6_0/multi_currency.py b/erpnext/patches/v6_0/multi_currency.py new file mode 100644 index 00000000000..21c851b4485 --- /dev/null +++ b/erpnext/patches/v6_0/multi_currency.py @@ -0,0 +1,85 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + # Reload doctype + for dt in ("Account", "GL Entry", "Journal Entry", + "Journal Entry Account", "Sales Invoice", "Purchase Invoice"): + frappe.reload_doctype(dt) + + for company in frappe.get_all("Company", fields=["name", "default_currency", "default_receivable_account"]): + + # update currency in account and gl entry as per company currency + frappe.db.sql("""update `tabAccount` set currency = %s + where ifnull(currency, '') = '' and company=%s""", (company.default_currency, company.name)) + + # update newly introduced field's value in sales / purchase invoice + frappe.db.sql(""" + update + `tabSales Invoice` + set + base_paid_amount=paid_amount, + base_write_off_amount=write_off_amount, + party_account_currency=%s + where company=%s + """, (company.default_currency, company.name)) + + frappe.db.sql(""" + update + `tabPurchase Invoice` + set + base_write_off_amount=write_off_amount, + party_account_currency=%s + where company=%s + """, (company.default_currency, company.name)) + + # update exchange rate, debit/credit in account currency in Journal Entry + frappe.db.sql("""update `tabJournal Entry` set exchange_rate=1""") + + frappe.db.sql(""" + update + `tabJournal Entry Account` jea, `tabJournal Entry` je + set + debit_in_account_currency=debit, + credit_in_account_currency=credit, + currency=%s + where + jea.parent = je.name + and je.company=%s + """, (company.default_currency, company.name)) + + # update debit/credit in account currency in GL Entry + frappe.db.sql(""" + update + `tabGL Entry` + set + debit_in_account_currency=debit, + credit_in_account_currency=credit, + currency=%s + where + company=%s + """, (company.default_currency, company.name)) + + # Set party account if default currency of party other than company's default currency + for dt in ("Customer", "Supplier"): + parties = frappe.db.sql("""select name from `tab{0}` p + where ifnull(default_currency, '') != '' and default_currency != %s + and not exists(select name from `tabParty Account` where parent=p.name and company=%s)""" + .format(dt), (company.default_currency, company.name)) + + for p in parties: + party = frappe.get_doc(dt, p[0]) + party_gle = frappe.db.get_value("GL Entry", {"party_type": dt, "party": p[0], + "company": company.name}, ["account"], as_dict=True) + + party_account = party_gle.account or company.default_receivable_account + + party.append("party_accounts", { + "company": company.name, + "account": party_account + }) + party.ignore_mandatory() + party.save() \ No newline at end of file From 2091f0c97ed6d5f045b496cfa8afbe951c014b25 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 27 Aug 2015 14:35:17 +0530 Subject: [PATCH 14/38] Checked out json files from upstream --- .../doctype/journal_entry/journal_entry.json | 294 ++--- .../doctype/party_account/party_account.json | 8 +- .../purchase_invoice/purchase_invoice.json | 499 +++++--- .../doctype/sales_invoice/sales_invoice.json | 1000 ++++++++++------- erpnext/buying/doctype/supplier/supplier.json | 272 +++-- .../selling/doctype/customer/customer.json | 517 +++++---- 6 files changed, 1578 insertions(+), 1012 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index c652ae4991c..8f6e94faa8c 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -10,6 +10,8 @@ "fields": [ { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "entry_type_and_date", "fieldtype": "Section Break", "hidden": 0, @@ -28,8 +30,33 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "default": "", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Title", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": "Journal Entry", "fieldname": "voucher_type", "fieldtype": "Select", @@ -37,7 +64,7 @@ "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 0, - "label": "Voucher Type", + "label": "Entry Type", "no_copy": 0, "oldfieldname": "voucher_type", "oldfieldtype": "Select", @@ -53,6 +80,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "naming_series", "fieldtype": "Select", "hidden": 0, @@ -75,6 +104,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break1", "fieldtype": "Column Break", "hidden": 0, @@ -95,6 +126,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "posting_date", "fieldtype": "Date", "hidden": 0, @@ -116,26 +149,8 @@ }, { "allow_on_submit": 0, - "fieldname": "exchange_rate", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Exchange Rate", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "2_add_edit_gl_entries", "fieldtype": "Section Break", "hidden": 0, @@ -157,6 +172,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "fieldname": "accounts", "fieldtype": "Table", "hidden": 0, @@ -179,6 +196,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "section_break99", "fieldtype": "Section Break", "hidden": 0, @@ -197,6 +216,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:inList([\"Credit Note\", \"Debit Note\"], doc.voucher_type)", "fieldname": "stock_entry", "fieldtype": "Link", @@ -219,6 +240,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_debit", "fieldtype": "Currency", "hidden": 0, @@ -241,6 +264,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_credit", "fieldtype": "Currency", "hidden": 0, @@ -263,6 +288,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "difference", "fieldtype": "Currency", "hidden": 0, @@ -285,6 +312,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "get_balance", "fieldtype": "Button", "hidden": 0, @@ -305,6 +334,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break99", "fieldtype": "Column Break", "hidden": 0, @@ -323,7 +354,9 @@ }, { "allow_on_submit": 0, - "description": "eg. Cheque Number", + "bold": 0, + "collapsible": 0, + "description": "", "fieldname": "cheque_no", "fieldtype": "Data", "hidden": 0, @@ -345,6 +378,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "cheque_date", "fieldtype": "Date", "hidden": 0, @@ -366,6 +401,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "user_remark", "fieldtype": "Small Text", "hidden": 0, @@ -387,25 +424,8 @@ }, { "allow_on_submit": 0, - "fieldname": "view_details", - "fieldtype": "Fold", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "View Details", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, "fieldname": "reference", "fieldtype": "Section Break", "hidden": 0, @@ -426,6 +446,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "clearance_date", "fieldtype": "Date", "hidden": 0, @@ -447,7 +469,9 @@ }, { "allow_on_submit": 0, - "description": "User Remark will be added to Auto Remark", + "bold": 0, + "collapsible": 0, + "description": "", "fieldname": "remark", "fieldtype": "Small Text", "hidden": 0, @@ -469,6 +493,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break98", "fieldtype": "Column Break", "hidden": 0, @@ -487,6 +513,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "bill_no", "fieldtype": "Data", "hidden": 0, @@ -508,6 +536,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "bill_date", "fieldtype": "Date", "hidden": 0, @@ -529,6 +559,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "due_date", "fieldtype": "Date", "hidden": 0, @@ -550,13 +582,83 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "printing_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Printing Settings", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "letter_head", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Letter Head", + "no_copy": 0, + "options": "Letter Head", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "select_print_heading", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Print Heading", + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, "fieldname": "addtional_info", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "More Details", "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-file-text", @@ -571,26 +673,8 @@ }, { "allow_on_submit": 0, - "fieldname": "column_break2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "50%" - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": "No", "description": "", "fieldname": "is_opening", @@ -615,6 +699,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": "Accounts Receivable", "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", "fieldname": "write_off_based_on", @@ -637,6 +723,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", "fieldname": "write_off_amount", "fieldtype": "Currency", @@ -658,6 +746,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", "fieldname": "get_outstanding_invoices", "fieldtype": "Button", @@ -677,50 +767,10 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 1, - "fieldname": "letter_head", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Letter Head", - "no_copy": 0, - "options": "Letter Head", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 1, - "fieldname": "select_print_heading", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Print Heading", - "no_copy": 1, - "oldfieldname": "select_print_heading", - "oldfieldtype": "Link", - "options": "Print Heading", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "amended_from", "fieldtype": "Link", "hidden": 0, @@ -743,6 +793,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break3", "fieldtype": "Column Break", "hidden": 0, @@ -763,6 +815,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "pay_to_recd_from", "fieldtype": "Data", "hidden": 0, @@ -782,6 +836,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_amount", "fieldtype": "Currency", "hidden": 1, @@ -802,6 +858,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_amount_in_words", "fieldtype": "Data", "hidden": 1, @@ -821,6 +879,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "company", "fieldtype": "Link", "hidden": 0, @@ -843,6 +903,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "fiscal_year", "fieldtype": "Link", "hidden": 0, @@ -862,26 +924,6 @@ "search_index": 1, "set_only_once": 0, "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Title", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 } ], "hide_heading": 0, @@ -893,7 +935,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-08-18 14:26:37.496638", + "modified": "2015-08-26 12:47:53.107439", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", diff --git a/erpnext/accounts/doctype/party_account/party_account.json b/erpnext/accounts/doctype/party_account/party_account.json index 9c6db018892..27d0349ad3f 100644 --- a/erpnext/accounts/doctype/party_account/party_account.json +++ b/erpnext/accounts/doctype/party_account/party_account.json @@ -10,6 +10,8 @@ "fields": [ { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "company", "fieldtype": "Link", "hidden": 0, @@ -30,6 +32,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "col_break1", "fieldtype": "Column Break", "hidden": 0, @@ -50,6 +54,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "account", "fieldtype": "Link", "hidden": 0, @@ -76,7 +82,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-13 16:40:02.413005", + "modified": "2015-08-26 11:23:22.917738", "modified_by": "Administrator", "module": "Accounts", "name": "Party Account", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 3a14cf650e6..0f31a2f8454 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -8,8 +8,33 @@ "docstatus": 0, "doctype": "DocType", "fields": [ + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "default": "{supplier_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Title", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "naming_series", "fieldtype": "Select", "hidden": 0, @@ -32,6 +57,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "supplier", "fieldtype": "Link", "hidden": 0, @@ -54,6 +81,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "supplier", "fieldname": "supplier_name", "fieldtype": "Data", @@ -76,6 +105,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "address_display", "fieldtype": "Small Text", "hidden": 1, @@ -95,6 +126,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_display", "fieldtype": "Small Text", "hidden": 1, @@ -114,6 +147,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_mobile", "fieldtype": "Small Text", "hidden": 1, @@ -133,6 +168,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_email", "fieldtype": "Small Text", "hidden": 1, @@ -152,6 +189,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break1", "fieldtype": "Column Break", "hidden": 0, @@ -172,6 +211,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", @@ -194,6 +235,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "description": "", "fieldname": "bill_no", "fieldtype": "Data", @@ -216,6 +259,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "bill_date", "fieldtype": "Date", "hidden": 0, @@ -237,6 +282,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "amended_from", "fieldtype": "Link", "hidden": 0, @@ -259,6 +306,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "company", "fieldtype": "Link", "hidden": 0, @@ -281,6 +330,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "is_return", "fieldtype": "Check", "hidden": 0, @@ -301,6 +352,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "is_return", "fieldname": "return_against", "fieldtype": "Link", @@ -323,13 +376,15 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, "fieldname": "currency_and_price_list", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Currency and Price List", "no_copy": 0, "options": "icon-tag", "permlevel": 0, @@ -343,6 +398,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "currency", "fieldtype": "Link", "hidden": 0, @@ -365,7 +422,9 @@ }, { "allow_on_submit": 0, - "description": "The rate at which Bill Currency is converted into company's base currency", + "bold": 0, + "collapsible": 0, + "description": "", "fieldname": "conversion_rate", "fieldtype": "Float", "hidden": 0, @@ -388,6 +447,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break2", "fieldtype": "Column Break", "hidden": 0, @@ -406,6 +467,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "buying_price_list", "fieldtype": "Link", "hidden": 0, @@ -426,6 +489,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "price_list_currency", "fieldtype": "Link", "hidden": 0, @@ -446,6 +511,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "plc_conversion_rate", "fieldtype": "Float", "hidden": 0, @@ -466,6 +533,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "ignore_pricing_rule", "fieldtype": "Check", "hidden": 0, @@ -485,6 +554,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "items_section", "fieldtype": "Section Break", "hidden": 0, @@ -506,6 +577,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "fieldname": "items", "fieldtype": "Table", "hidden": 0, @@ -528,6 +601,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "section_break_26", "fieldtype": "Section Break", "hidden": 0, @@ -546,6 +621,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_total", "fieldtype": "Currency", "hidden": 0, @@ -567,7 +644,9 @@ }, { "allow_on_submit": 0, - "description": "Will be calculated automatically when you enter the details", + "bold": 0, + "collapsible": 0, + "description": "", "fieldname": "base_net_total", "fieldtype": "Currency", "hidden": 0, @@ -590,6 +669,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_28", "fieldtype": "Column Break", "hidden": 0, @@ -608,6 +689,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total", "fieldtype": "Currency", "hidden": 0, @@ -629,6 +712,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "net_total", "fieldtype": "Currency", "hidden": 0, @@ -651,6 +736,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "taxes_section", "fieldtype": "Section Break", "hidden": 0, @@ -672,6 +759,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "taxes_and_charges", "fieldtype": "Link", "hidden": 0, @@ -694,6 +783,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "taxes", "fieldtype": "Table", "hidden": 0, @@ -716,6 +807,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "other_charges_calculation", "fieldtype": "HTML", "hidden": 0, @@ -736,6 +829,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "totals", "fieldtype": "Section Break", "hidden": 0, @@ -757,6 +852,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_taxes_and_charges_added", "fieldtype": "Currency", "hidden": 0, @@ -779,6 +876,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_taxes_and_charges_deducted", "fieldtype": "Currency", "hidden": 0, @@ -801,6 +900,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_total_taxes_and_charges", "fieldtype": "Currency", "hidden": 0, @@ -823,6 +924,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_40", "fieldtype": "Column Break", "hidden": 0, @@ -842,6 +945,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "taxes_and_charges_added", "fieldtype": "Currency", "hidden": 0, @@ -864,6 +969,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "taxes_and_charges_deducted", "fieldtype": "Currency", "hidden": 0, @@ -886,6 +993,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_taxes_and_charges", "fieldtype": "Currency", "hidden": 0, @@ -907,12 +1016,16 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "discount_amount", "fieldname": "section_break_44", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "label": "Additional Discount", "no_copy": 0, "permlevel": 0, "precision": "", @@ -926,6 +1039,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": "Grand Total", "fieldname": "apply_discount_on", "fieldtype": "Select", @@ -948,6 +1063,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_46", "fieldtype": "Column Break", "hidden": 0, @@ -967,6 +1084,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "discount_amount", "fieldtype": "Currency", "hidden": 0, @@ -988,6 +1107,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_discount_amount", "fieldtype": "Currency", "hidden": 0, @@ -1009,6 +1130,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "section_break_49", "fieldtype": "Section Break", "hidden": 0, @@ -1028,6 +1151,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_grand_total", "fieldtype": "Currency", "hidden": 0, @@ -1050,7 +1175,9 @@ }, { "allow_on_submit": 0, - "description": "In Words will be visible once you save the Purchase Invoice.", + "bold": 0, + "collapsible": 0, + "description": "", "fieldname": "base_in_words", "fieldtype": "Data", "hidden": 0, @@ -1072,6 +1199,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break8", "fieldtype": "Column Break", "hidden": 0, @@ -1092,6 +1221,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "grand_total", "fieldtype": "Currency", "hidden": 0, @@ -1114,6 +1245,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "in_words", "fieldtype": "Data", "hidden": 0, @@ -1135,6 +1268,32 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_amount_to_pay", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Total Amount To Pay", + "no_copy": 1, + "oldfieldname": "total_amount_to_pay", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_advance", "fieldtype": "Currency", "hidden": 0, @@ -1145,7 +1304,7 @@ "no_copy": 1, "oldfieldname": "total_advance", "oldfieldtype": "Currency", - "options": "party_account_currency", + "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1157,6 +1316,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "outstanding_amount", "fieldtype": "Currency", "hidden": 0, @@ -1167,7 +1328,7 @@ "no_copy": 1, "oldfieldname": "outstanding_amount", "oldfieldtype": "Currency", - "options": "party_account_currency", + "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1179,6 +1340,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "write_off_amount", "fieldtype": "Currency", "hidden": 0, @@ -1187,7 +1350,7 @@ "in_list_view": 0, "label": "Write Off Amount", "no_copy": 1, - "options": "currency", + "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 0, @@ -1199,27 +1362,8 @@ }, { "allow_on_submit": 0, - "fieldname": "base_write_off_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Write Off Amount (Company Currency)", - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:flt(doc.write_off_amount)!=0", "fieldname": "write_off_account", "fieldtype": "Link", @@ -1241,6 +1385,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:flt(doc.write_off_amount)!=0", "fieldname": "write_off_cost_center", "fieldtype": "Link", @@ -1262,6 +1408,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "against_expense_account", "fieldtype": "Small Text", "hidden": 1, @@ -1283,31 +1431,16 @@ }, { "allow_on_submit": 0, - "fieldname": "fold", - "fieldtype": "Fold", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "advances", "fieldname": "advances_section", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Advance Payments", "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", @@ -1322,6 +1455,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "get_advances_paid", "fieldtype": "Button", "hidden": 0, @@ -1343,6 +1478,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "advances", "fieldtype": "Table", "hidden": 0, @@ -1365,13 +1502,16 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "terms", "fieldname": "terms_section_break", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Terms and Conditions", "no_copy": 0, "options": "icon-legal", "permlevel": 0, @@ -1385,6 +1525,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "tc_name", "fieldtype": "Link", "hidden": 0, @@ -1405,6 +1547,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "terms", "fieldtype": "Text Editor", "hidden": 0, @@ -1424,6 +1568,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, "depends_on": "supplier", "fieldname": "contact_section", "fieldtype": "Section Break", @@ -1431,7 +1577,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Contact Details", "no_copy": 0, "options": "icon-bullhorn", "permlevel": 0, @@ -1445,6 +1591,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "supplier_address", "fieldtype": "Link", "hidden": 0, @@ -1465,6 +1613,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "col_break23", "fieldtype": "Column Break", "hidden": 0, @@ -1484,6 +1634,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_person", "fieldtype": "Link", "hidden": 0, @@ -1504,86 +1656,19 @@ }, { "allow_on_submit": 0, - "fieldname": "more_info", + "bold": 0, + "collapsible": 1, + "fieldname": "printing_settings", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Printing Settings", "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "icon-file-text", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "description": "Supplier (Payable) Account", - "fieldname": "credit_to", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Credit To", - "no_copy": 0, - "oldfieldname": "credit_to", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "party_account_currency", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Party Account Currency", - "no_copy": 1, - "options": "Currency", "permlevel": 0, "precision": "", - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "default": "No", - "description": "Considered as Opening Balance", - "fieldname": "is_opening", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Is Opening", - "no_copy": 0, - "oldfieldname": "is_opening", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 1, + "print_hide": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -1593,6 +1678,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "fieldname": "select_print_heading", "fieldtype": "Link", "hidden": 0, @@ -1615,6 +1702,82 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "more_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "More Details", + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-file-text", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "credit_to", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Credit To", + "no_copy": 0, + "oldfieldname": "credit_to", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "No", + "description": "", + "fieldname": "is_opening", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Is Opening", + "no_copy": 0, + "oldfieldname": "is_opening", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "due_date", "fieldtype": "Date", "hidden": 0, @@ -1636,6 +1799,28 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_63", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "mode_of_payment", "fieldtype": "Link", "hidden": 0, @@ -1658,24 +1843,8 @@ }, { "allow_on_submit": 0, - "fieldname": "column_break_63", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "fiscal_year", "fieldtype": "Link", "hidden": 0, @@ -1698,6 +1867,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "remarks", "fieldtype": "Small Text", "hidden": 0, @@ -1719,6 +1890,9 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "is_recurring", "depends_on": "eval:doc.docstatus<2", "fieldname": "recurring_invoice", "fieldtype": "Section Break", @@ -1738,29 +1912,12 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "fieldname": "column_break_77", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "50%" - }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.docstatus<2", - "description": "Check if recurring invoice, uncheck to stop recurring or put proper End Date", + "description": "", "fieldname": "is_recurring", "fieldtype": "Check", "hidden": 0, @@ -1780,6 +1937,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "Select the period when the invoice will be generated automatically", "fieldname": "recurring_type", @@ -1802,6 +1961,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "Start date of current invoice's period", "fieldname": "from_date", @@ -1823,6 +1984,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "End date of current invoice's period", "fieldname": "to_date", @@ -1844,6 +2007,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The day of the month on which auto invoice will be generated e.g. 05, 28 etc", "fieldname": "repeat_on_day_of_month", @@ -1865,6 +2030,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The date on which recurring invoice will be stop", "fieldname": "end_date", @@ -1886,6 +2053,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_82", "fieldtype": "Column Break", "hidden": 0, @@ -1905,6 +2074,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The date on which next invoice will be generated. It is generated on submit.", "fieldname": "next_date", @@ -1926,6 +2097,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The unique id for tracking all recurring invoices. It is generated on submit.", "fieldname": "recurring_id", @@ -1947,6 +2120,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "Enter email id separated by commas, invoice will be mailed automatically on particular date", "fieldname": "notification_email_address", @@ -1968,6 +2143,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "fieldname": "recurring_print_format", "fieldtype": "Link", @@ -1998,7 +2175,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-08-26 16:42:54.655847", + "modified": "2015-08-26 12:33:12.303959", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -2130,5 +2307,5 @@ "search_fields": "posting_date, supplier, fiscal_year, bill_no, base_grand_total, outstanding_amount", "sort_field": "modified", "sort_order": "DESC", - "title_field": "supplier_name" + "title_field": "title" } \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index c89a46bc505..e253f8dc200 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -8,10 +8,12 @@ "default_print_format": "Standard", "docstatus": 0, "doctype": "DocType", - "document_type": "Document", + "document_type": "", "fields": [ { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "customer_section", "fieldtype": "Section Break", "hidden": 0, @@ -30,8 +32,33 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "default": "{customer_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Title", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, "fieldname": "naming_series", "fieldtype": "Select", "hidden": 0, @@ -54,6 +81,8 @@ }, { "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, "fieldname": "customer", "fieldtype": "Link", "hidden": 0, @@ -76,6 +105,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "customer", "fieldname": "customer_name", "fieldtype": "Data", @@ -98,6 +129,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "address_display", "fieldtype": "Small Text", "hidden": 1, @@ -117,6 +150,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_display", "fieldtype": "Small Text", "hidden": 1, @@ -136,6 +171,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_mobile", "fieldtype": "Small Text", "hidden": 1, @@ -155,6 +192,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_email", "fieldtype": "Small Text", "hidden": 1, @@ -174,19 +213,20 @@ }, { "allow_on_submit": 0, - "fieldname": "mode_of_payment", - "fieldtype": "Link", + "bold": 0, + "collapsible": 0, + "fieldname": "is_pos", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Mode of Payment", + "label": "Is POS", "no_copy": 0, - "oldfieldname": "mode_of_payment", - "oldfieldtype": "Select", - "options": "Mode of Payment", + "oldfieldname": "is_pos", + "oldfieldtype": "Check", "permlevel": 0, - "print_hide": 0, + "print_hide": 1, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -196,6 +236,31 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "is_return", + "fieldname": "is_return", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Is Return", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break1", "fieldtype": "Column Break", "hidden": 0, @@ -215,50 +280,8 @@ }, { "allow_on_submit": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Company", - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Amended From", - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Link", - "options": "Sales Invoice", - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", @@ -281,6 +304,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "due_date", "fieldtype": "Date", "hidden": 0, @@ -302,37 +327,44 @@ }, { "allow_on_submit": 0, - "fieldname": "is_pos", - "fieldtype": "Check", + "bold": 0, + "collapsible": 0, + "fieldname": "company", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, - "in_filter": 0, + "in_filter": 1, "in_list_view": 0, - "label": "Is POS", + "label": "Company", "no_copy": 0, - "oldfieldname": "is_pos", - "oldfieldtype": "Check", + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", "permlevel": 0, "print_hide": 1, "read_only": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 }, { "allow_on_submit": 0, - "fieldname": "is_return", - "fieldtype": "Check", + "bold": 0, + "collapsible": 0, + "fieldname": "amended_from", + "fieldtype": "Link", "hidden": 0, - "ignore_user_permissions": 0, + "ignore_user_permissions": 1, "in_filter": 0, "in_list_view": 0, - "label": "Is Return", - "no_copy": 0, + "label": "Amended From", + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Link", + "options": "Sales Invoice", "permlevel": 0, - "precision": "", "print_hide": 1, "read_only": 1, "report_hide": 0, @@ -343,6 +375,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "is_return", "fieldname": "return_against", "fieldtype": "Link", @@ -365,6 +399,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "shipping_address_name", "fieldtype": "Link", "hidden": 1, @@ -386,6 +422,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "shipping_address", "fieldtype": "Small Text", "hidden": 1, @@ -406,15 +444,17 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, "fieldname": "currency_and_price_list", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Currency and Price List", "no_copy": 0, - "options": "icon-tag", + "options": "", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -426,6 +466,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "currency", "fieldtype": "Link", "hidden": 0, @@ -448,6 +490,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "description": "Rate at which Customer Currency is converted to customer's base currency", "fieldname": "conversion_rate", "fieldtype": "Float", @@ -471,6 +515,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break2", "fieldtype": "Column Break", "hidden": 0, @@ -490,6 +536,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "selling_price_list", "fieldtype": "Link", "hidden": 0, @@ -512,6 +560,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "price_list_currency", "fieldtype": "Link", "hidden": 0, @@ -532,6 +582,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "description": "Rate at which Price list currency is converted to customer's base currency", "fieldname": "plc_conversion_rate", "fieldtype": "Float", @@ -553,6 +605,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "ignore_pricing_rule", "fieldtype": "Check", "hidden": 0, @@ -572,6 +626,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "items_section", "fieldtype": "Section Break", "hidden": 0, @@ -593,6 +649,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "update_stock", "fieldtype": "Check", "hidden": 0, @@ -614,6 +672,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "fieldname": "items", "fieldtype": "Table", "hidden": 0, @@ -636,6 +696,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "packing_list", "fieldtype": "Section Break", "hidden": 0, @@ -656,6 +718,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "packed_items", "fieldtype": "Table", "hidden": 0, @@ -676,6 +740,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "product_bundle_help", "fieldtype": "HTML", "hidden": 0, @@ -695,6 +761,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "section_break_30", "fieldtype": "Section Break", "hidden": 0, @@ -713,6 +781,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_total", "fieldtype": "Currency", "hidden": 0, @@ -734,6 +804,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_net_total", "fieldtype": "Currency", "hidden": 0, @@ -756,6 +828,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_32", "fieldtype": "Column Break", "hidden": 0, @@ -774,6 +848,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total", "fieldtype": "Currency", "hidden": 0, @@ -795,6 +871,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "net_total", "fieldtype": "Currency", "hidden": 0, @@ -815,13 +893,15 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "taxes_section", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Taxes and Charges", + "label": "", "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", @@ -836,6 +916,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "taxes_and_charges", "fieldtype": "Link", "hidden": 0, @@ -858,6 +940,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_38", "fieldtype": "Column Break", "hidden": 0, @@ -876,6 +960,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "shipping_rule", "fieldtype": "Link", "hidden": 0, @@ -897,6 +983,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "section_break_40", "fieldtype": "Section Break", "hidden": 0, @@ -915,6 +1003,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "fieldname": "taxes", "fieldtype": "Table", "hidden": 0, @@ -937,6 +1027,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "other_charges_calculation", "fieldtype": "HTML", "hidden": 0, @@ -957,6 +1049,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "section_break_43", "fieldtype": "Section Break", "hidden": 0, @@ -975,6 +1069,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_total_taxes_and_charges", "fieldtype": "Currency", "hidden": 0, @@ -997,6 +1093,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_47", "fieldtype": "Column Break", "hidden": 0, @@ -1016,6 +1114,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_taxes_and_charges", "fieldtype": "Currency", "hidden": 0, @@ -1036,12 +1136,16 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "discount_amount", "fieldname": "section_break_49", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "label": "Discount", "no_copy": 0, "permlevel": 0, "precision": "", @@ -1055,6 +1159,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": "Grand Total", "fieldname": "apply_discount_on", "fieldtype": "Select", @@ -1077,6 +1183,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break_51", "fieldtype": "Column Break", "hidden": 0, @@ -1095,6 +1203,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "discount_amount", "fieldtype": "Currency", "hidden": 0, @@ -1115,6 +1225,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_discount_amount", "fieldtype": "Currency", "hidden": 0, @@ -1136,6 +1248,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "totals", "fieldtype": "Section Break", "hidden": 0, @@ -1157,6 +1271,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_grand_total", "fieldtype": "Currency", "hidden": 0, @@ -1179,6 +1295,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "base_rounded_total", "fieldtype": "Currency", "hidden": 0, @@ -1201,6 +1319,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "description": "In Words will be visible once you save the Sales Invoice.", "fieldname": "base_in_words", "fieldtype": "Data", @@ -1223,6 +1343,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break5", "fieldtype": "Column Break", "hidden": 0, @@ -1243,6 +1365,8 @@ }, { "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, "fieldname": "grand_total", "fieldtype": "Currency", "hidden": 0, @@ -1265,6 +1389,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "rounded_total", "fieldtype": "Currency", "hidden": 0, @@ -1287,6 +1413,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "in_words", "fieldtype": "Data", "hidden": 0, @@ -1308,6 +1436,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_advance", "fieldtype": "Currency", "hidden": 0, @@ -1318,7 +1448,7 @@ "no_copy": 0, "oldfieldname": "total_advance", "oldfieldtype": "Currency", - "options": "party_account_currency", + "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1330,6 +1460,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "outstanding_amount", "fieldtype": "Currency", "hidden": 0, @@ -1340,7 +1472,7 @@ "no_copy": 1, "oldfieldname": "outstanding_amount", "oldfieldtype": "Currency", - "options": "party_account_currency", + "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1352,13 +1484,16 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "advances", "fieldname": "advances_section", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Advances", + "label": "Advance Payments", "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-money", @@ -1373,6 +1508,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "get_advances_received", "fieldtype": "Button", "hidden": 0, @@ -1394,6 +1531,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "advances", "fieldtype": "Table", "hidden": 0, @@ -1416,6 +1555,9 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "paid_amount", "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", "fieldname": "payments_section", "fieldtype": "Section Break", @@ -1437,58 +1579,19 @@ }, { "allow_on_submit": 0, - "depends_on": "is_pos", - "fieldname": "paid_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Paid Amount", - "no_copy": 1, - "oldfieldname": "paid_amount", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "base_paid_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Paid Amount (Company Currency)", - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "depends_on": "is_pos", - "fieldname": "column_break3", - "fieldtype": "Column Break", + "bold": 0, + "collapsible": 0, + "fieldname": "mode_of_payment", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "label": "Mode of Payment", "no_copy": 0, + "oldfieldname": "mode_of_payment", + "oldfieldtype": "Select", + "options": "Mode of Payment", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -1496,11 +1599,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "unique": 0, - "width": "50%" + "unique": 0 }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "is_pos", "fieldname": "cash_bank_account", "fieldtype": "Link", @@ -1524,14 +1628,15 @@ }, { "allow_on_submit": 0, - "depends_on": "grand_total", - "fieldname": "column_break4", - "fieldtype": "Section Break", + "bold": 0, + "collapsible": 0, + "depends_on": "is_pos", + "fieldname": "column_break3", + "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", "no_copy": 0, "permlevel": 0, "print_hide": 0, @@ -1545,16 +1650,20 @@ }, { "allow_on_submit": 0, - "depends_on": "", - "fieldname": "write_off_amount", + "bold": 0, + "collapsible": 0, + "depends_on": "is_pos", + "fieldname": "paid_amount", "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Write Off Amount", + "label": "Paid Amount", "no_copy": 1, - "options": "currency", + "oldfieldname": "paid_amount", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", "permlevel": 0, "print_hide": 1, "read_only": 0, @@ -1566,19 +1675,45 @@ }, { "allow_on_submit": 0, - "fieldname": "base_write_off_amount", + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "write_off_amount", + "depends_on": "grand_total", + "fieldname": "column_break4", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, + "width": "50%" + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "write_off_amount", "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Write Off Amount (Company Currency)", + "label": "Write Off Amount", "no_copy": 1, "options": "Company:company:default_currency", "permlevel": 0, - "precision": "", "print_hide": 1, - "read_only": 1, + "read_only": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -1587,7 +1722,9 @@ }, { "allow_on_submit": 0, - "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", + "bold": 0, + "collapsible": 0, + "depends_on": "is_pos", "fieldname": "write_off_outstanding_amount_automatically", "fieldtype": "Check", "hidden": 0, @@ -1607,6 +1744,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "", "fieldname": "column_break_74", "fieldtype": "Column Break", @@ -1627,6 +1766,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "", "fieldname": "write_off_account", "fieldtype": "Link", @@ -1648,6 +1789,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "", "fieldname": "write_off_cost_center", "fieldtype": "Link", @@ -1669,34 +1812,19 @@ }, { "allow_on_submit": 0, - "fieldname": "fold", - "fieldtype": "Fold", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "terms", "fieldname": "terms_section_break", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Terms", "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-legal", + "options": "", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -1708,6 +1836,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "tc_name", "fieldtype": "Link", "hidden": 0, @@ -1730,6 +1860,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "terms", "fieldtype": "Text Editor", "hidden": 0, @@ -1751,6 +1883,99 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "edit_printing_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Printing Settings", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "letter_head", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Letter Head", + "no_copy": 0, + "oldfieldname": "letter_head", + "oldfieldtype": "Select", + "options": "Letter Head", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_84", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "select_print_heading", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Print Heading", + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, "depends_on": "customer", "fieldname": "contact_section", "fieldtype": "Section Break", @@ -1758,7 +1983,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Properties", "no_copy": 0, "options": "icon-bullhorn", "permlevel": 0, @@ -1772,172 +1997,8 @@ }, { "allow_on_submit": 0, - "description": "", - "fieldname": "territory", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Territory", - "no_copy": 0, - "options": "Territory", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "description": "", - "fieldname": "customer_group", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Customer Group", - "no_copy": 0, - "options": "Customer Group", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "col_break23", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "50%" - }, - { - "allow_on_submit": 0, - "fieldname": "customer_address", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Customer Address", - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "contact_person", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Contact Person", - "no_copy": 0, - "options": "Contact", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "more_info", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "icon-file-text", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "description": "Customer (Receivable) Account", - "fieldname": "debit_to", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Debit To", - "no_copy": 0, - "oldfieldname": "debit_to", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "party_account_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Party Account Currency", - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "project_name", "fieldtype": "Link", "hidden": 0, @@ -1960,6 +2021,119 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "territory", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Territory", + "no_copy": 0, + "options": "Territory", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "customer_group", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Customer Group", + "no_copy": 0, + "options": "Customer Group", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "col_break23", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, + "width": "50%" + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "customer_address", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Customer Address", + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "contact_person", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Contact Person", + "no_copy": 0, + "options": "Contact", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.source == 'Campaign'", "fieldname": "campaign", "fieldtype": "Link", @@ -1983,6 +2157,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "source", "fieldtype": "Select", "hidden": 0, @@ -2005,8 +2181,58 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "more_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Accounting Details", + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-file-text", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "debit_to", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Debit To", + "no_copy": 0, + "oldfieldname": "debit_to", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": "No", - "description": "Considered as an Opening Balance", + "description": "", "fieldname": "is_opening", "fieldtype": "Select", "hidden": 0, @@ -2029,6 +2255,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "c_form_applicable", "fieldtype": "Select", "hidden": 0, @@ -2049,6 +2277,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "c_form_no", "fieldtype": "Link", "hidden": 0, @@ -2069,6 +2299,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break8", "fieldtype": "Column Break", "hidden": 0, @@ -2086,52 +2318,10 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 1, - "fieldname": "letter_head", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Letter Head", - "no_copy": 0, - "oldfieldname": "letter_head", - "oldfieldtype": "Select", - "options": "Letter Head", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 1, - "fieldname": "select_print_heading", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Print Heading", - "no_copy": 1, - "oldfieldname": "select_print_heading", - "oldfieldtype": "Link", - "options": "Print Heading", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "posting_time", "fieldtype": "Time", "hidden": 0, @@ -2153,6 +2343,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "fiscal_year", "fieldtype": "Link", "hidden": 0, @@ -2175,6 +2367,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "remarks", "fieldtype": "Small Text", "hidden": 0, @@ -2196,13 +2390,16 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "sales_partner", "fieldname": "sales_team_section_break", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Commission", "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-group", @@ -2217,26 +2414,8 @@ }, { "allow_on_submit": 0, - "fieldname": "column_break9", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "50%" - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "sales_partner", "fieldtype": "Link", "hidden": 0, @@ -2259,6 +2438,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break10", "fieldtype": "Column Break", "hidden": 0, @@ -2279,6 +2460,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "commission_rate", "fieldtype": "Float", "hidden": 0, @@ -2300,6 +2483,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "total_commission", "fieldtype": "Currency", "hidden": 0, @@ -2322,12 +2507,16 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "sales_team", "fieldname": "section_break2", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "label": "Sales Team", "no_copy": 0, "permlevel": 0, "print_hide": 1, @@ -2340,6 +2529,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "sales_team", "fieldtype": "Table", "hidden": 0, @@ -2362,6 +2553,9 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "is_recurring", "depends_on": "eval:doc.docstatus<2", "fieldname": "recurring_invoice", "fieldtype": "Section Break", @@ -2369,7 +2563,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Recurring Invoice", + "label": "Recurring", "no_copy": 0, "options": "icon-time", "permlevel": 0, @@ -2383,6 +2577,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break11", "fieldtype": "Column Break", "hidden": 0, @@ -2402,6 +2598,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.docstatus<2", "description": "Check if recurring invoice, uncheck to stop recurring or put proper End Date", "fieldname": "is_recurring", @@ -2423,6 +2621,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "Select the period when the invoice will be generated automatically", "fieldname": "recurring_type", @@ -2445,6 +2645,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "Start date of current invoice's period", "fieldname": "from_date", @@ -2466,6 +2668,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "End date of current invoice's period", "fieldname": "to_date", @@ -2487,6 +2691,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The day of the month on which auto invoice will be generated e.g. 05, 28 etc ", "fieldname": "repeat_on_day_of_month", @@ -2508,6 +2714,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The date on which recurring invoice will be stop", "fieldname": "end_date", @@ -2529,6 +2737,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break12", "fieldtype": "Column Break", "hidden": 0, @@ -2548,6 +2758,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The date on which next invoice will be generated. It is generated on submit.\n", "fieldname": "next_date", @@ -2569,6 +2781,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "The unique id for tracking all recurring invoices.\u00a0It is generated on submit.", "fieldname": "recurring_id", @@ -2590,6 +2804,8 @@ }, { "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "description": "Enter email id separated by commas, invoice will be mailed automatically on particular date", "fieldname": "notification_email_address", @@ -2611,6 +2827,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", "fieldname": "recurring_print_format", "fieldtype": "Link", @@ -2633,6 +2851,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "against_income_account", "fieldtype": "Small Text", "hidden": 1, @@ -2662,8 +2882,8 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-08-25 18:07:27.927856", - "modified_by": "nabin@erpnext.com", + "modified": "2015-08-27 01:33:40.206780", + "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", "owner": "Administrator", @@ -2754,5 +2974,5 @@ "search_fields": "posting_date, due_date, customer, fiscal_year, base_grand_total, outstanding_amount", "sort_field": "modified", "sort_order": "DESC", - "title_field": "customer_name" + "title_field": "title" } \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 4501a303065..7f3bf89a8dc 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -12,6 +12,8 @@ "fields": [ { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "basic_info", "fieldtype": "Section Break", "hidden": 0, @@ -33,6 +35,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "naming_series", "fieldtype": "Select", "hidden": 0, @@ -55,6 +59,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "supplier_name", "fieldtype": "Data", "hidden": 0, @@ -76,6 +82,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break0", "fieldtype": "Column Break", "hidden": 0, @@ -95,6 +103,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "supplier_type", "fieldtype": "Link", "hidden": 0, @@ -117,6 +127,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "is_frozen", "fieldtype": "Check", "hidden": 0, @@ -137,6 +149,137 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Default Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_price_list", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Price List", + "no_copy": 0, + "options": "Price List", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_10", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_taxes_and_charges", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Taxes and Charges", + "no_copy": 0, + "options": "Purchase Taxes and Charges Template", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "credit_days", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Days", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:!doc.__islocal", "fieldname": "address_contacts", "fieldtype": "Section Break", @@ -144,7 +287,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Address & Contacts", + "label": "Address and Contacts", "no_copy": 0, "oldfieldtype": "Column Break", "options": "icon-map-marker", @@ -159,6 +302,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "address_html", "fieldtype": "HTML", "hidden": 0, @@ -178,6 +323,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break1", "fieldtype": "Column Break", "hidden": 0, @@ -197,6 +344,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_html", "fieldtype": "HTML", "hidden": 0, @@ -216,6 +365,9 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "accounts", "fieldname": "default_payable_accounts", "fieldtype": "Section Break", "hidden": 0, @@ -235,7 +387,9 @@ }, { "allow_on_submit": 0, - "depends_on": "", + "bold": 0, + "collapsible": 0, + "depends_on": "eval:!doc.__islocal", "description": "Mention if non-standard receivable account applicable", "fieldname": "accounts", "fieldtype": "Table", @@ -257,112 +411,16 @@ }, { "allow_on_submit": 0, - "fieldname": "more_info", + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "supplier_details", + "fieldname": "column_break2", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "More Info", - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "icon-file-text", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "default_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Default Currency", - "no_copy": 1, - "options": "Currency", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "default_price_list", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Price List", - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "default_taxes_and_charges", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Taxes and Charges", - "no_copy": 0, - "options": "Purchase Taxes and Charges Template", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "credit_days", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Credit Days", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "column_break2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, + "label": "Supplier Details", "no_copy": 0, "permlevel": 0, "print_hide": 0, @@ -376,6 +434,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "website", "fieldtype": "Data", "hidden": 0, @@ -397,6 +457,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "description": "Statutory info and other general information about your Supplier", "fieldname": "supplier_details", "fieldtype": "Text", @@ -419,6 +481,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "communications", "fieldtype": "Table", "hidden": 1, @@ -447,7 +511,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-19 16:50:48.078108", + "modified": "2015-08-25 07:14:56.245716", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index a1bbeeb551e..3167a835791 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -8,10 +8,12 @@ "description": "Buyer of Goods and Services.", "docstatus": 0, "doctype": "DocType", - "document_type": "", + "document_type": "Setup", "fields": [ { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "basic_info", "fieldtype": "Section Break", "hidden": 0, @@ -33,6 +35,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "naming_series", "fieldtype": "Select", "hidden": 0, @@ -53,6 +57,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "customer_name", "fieldtype": "Data", "hidden": 0, @@ -74,6 +80,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "customer_type", "fieldtype": "Select", "hidden": 0, @@ -96,6 +104,32 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "lead_name", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "From Lead", + "no_copy": 1, + "oldfieldname": "lead_name", + "oldfieldtype": "Link", + "options": "Lead", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break0", "fieldtype": "Column Break", "hidden": 0, @@ -115,26 +149,8 @@ }, { "allow_on_submit": 0, - "fieldname": "default_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Currency", - "no_copy": 1, - "options": "Currency", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "description": "", "fieldname": "customer_group", "fieldtype": "Link", @@ -158,6 +174,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "description": "", "fieldname": "territory", "fieldtype": "Link", @@ -181,6 +199,30 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "tax_id", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Tax ID", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "is_frozen", "fieldtype": "Check", "hidden": 0, @@ -201,6 +243,117 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "currency_and_price_list", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_price_list", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Default Price List", + "no_copy": 0, + "options": "Price List", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_14", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_taxes_and_charges", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Default Taxes and Charges", + "no_copy": 0, + "options": "Sales Taxes and Charges Template", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:!doc.__islocal", "fieldname": "address_contacts", "fieldtype": "Section Break", @@ -208,7 +361,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Address and Contact", "no_copy": 0, "options": "icon-map-marker", "permlevel": 0, @@ -222,6 +375,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "address_html", "fieldtype": "HTML", "hidden": 0, @@ -241,6 +396,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "column_break1", "fieldtype": "Column Break", "hidden": 0, @@ -260,6 +417,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "contact_html", "fieldtype": "HTML", "hidden": 0, @@ -280,13 +439,16 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "accounts", "fieldname": "default_receivable_accounts", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Default Receivable Accounts", "no_copy": 0, "permlevel": 0, "print_hide": 0, @@ -299,7 +461,9 @@ }, { "allow_on_submit": 0, - "depends_on": "", + "bold": 0, + "collapsible": 0, + "depends_on": "eval:!doc.__islocal", "description": "Mention if non-standard receivable account applicable", "fieldname": "accounts", "fieldtype": "Table", @@ -321,116 +485,16 @@ }, { "allow_on_submit": 0, - "fieldname": "more_info", + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "eval:doc.credit_days || doc.credit_limit", + "fieldname": "column_break2", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "icon-file-text", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "description": "", - "fieldname": "customer_details", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Customer Details", - "no_copy": 0, - "oldfieldname": "customer_details", - "oldfieldtype": "Code", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "website", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Website", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "tax_id", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Tax ID", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "lead_name", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "From Lead", - "no_copy": 1, - "oldfieldname": "lead_name", - "oldfieldtype": "Link", - "options": "Lead", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "column_break3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, + "label": "Credit Limit", "no_copy": 0, "permlevel": 0, "print_hide": 0, @@ -444,65 +508,8 @@ }, { "allow_on_submit": 0, - "fieldname": "default_price_list", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Price List", - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "default_taxes_and_charges", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Taxes and Charges", - "no_copy": 0, - "options": "Sales Taxes and Charges Template", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "section_break_24", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "credit_days_based_on", "fieldtype": "Select", "hidden": 0, @@ -524,6 +531,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "depends_on": "eval:doc.credit_days_based_on=='Fixed Days'", "fieldname": "credit_days", "fieldtype": "Int", @@ -546,25 +555,8 @@ }, { "allow_on_submit": 0, - "fieldname": "column_break_27", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "credit_limit", "fieldtype": "Currency", "hidden": 0, @@ -587,13 +579,85 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "customer_details", + "fieldname": "more_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Customer Details", + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-file-text", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Additional information regarding the customer.", + "fieldname": "customer_details", + "fieldtype": "Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Customer Details", + "no_copy": 0, + "oldfieldname": "customer_details", + "oldfieldtype": "Code", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "website", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Website", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "default_sales_partner", "fieldname": "sales_team_section_break", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Sales Partner and Commission", "no_copy": 0, "oldfieldtype": "Section Break", "options": "icon-group", @@ -608,6 +672,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "default_sales_partner", "fieldtype": "Link", "hidden": 0, @@ -630,25 +696,8 @@ }, { "allow_on_submit": 0, - "fieldname": "column_break_32", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "default_commission_rate", "fieldtype": "Float", "hidden": 0, @@ -670,12 +719,16 @@ }, { "allow_on_submit": 0, - "fieldname": "section_break_34", + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "sales_team", + "fieldname": "sales_team_section", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "label": "Sales Team", "no_copy": 0, "permlevel": 0, "precision": "", @@ -689,6 +742,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "sales_team", "fieldtype": "Table", "hidden": 0, @@ -711,6 +766,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "communications", "fieldtype": "Table", "hidden": 1, @@ -739,7 +796,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-19 16:01:33.347348", + "modified": "2015-08-25 07:09:26.411627", "modified_by": "Administrator", "module": "Selling", "name": "Customer", @@ -907,7 +964,7 @@ }, { "amend": 0, - "apply_user_permissions": 0, + "apply_user_permissions": 1, "cancel": 0, "create": 0, "delete": 0, From 9a9a4293b3e88ef182a6791dd8b4d32e835d8cdd Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 27 Aug 2015 16:26:38 +0530 Subject: [PATCH 15/38] [new fields] Party Account Currency, Paid Amount and Write Off Amount in Acompany Currency --- .../purchase_invoice/purchase_invoice.json | 169 ++++++++++++------ .../doctype/sales_invoice/sales_invoice.json | 79 +++++++- 2 files changed, 192 insertions(+), 56 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index ef6cc7797fd..0d4953aa0ea 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -1266,30 +1266,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_amount_to_pay", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Total Amount To Pay", - "no_copy": 1, - "oldfieldname": "total_amount_to_pay", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -1304,7 +1280,7 @@ "no_copy": 1, "oldfieldname": "total_advance", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1328,7 +1304,7 @@ "no_copy": 1, "oldfieldname": "outstanding_amount", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1338,6 +1314,30 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "write_off_amount", + "depends_on": "grand_total", + "fieldname": "write_off", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1350,7 +1350,7 @@ "in_list_view": 0, "label": "Write Off Amount", "no_copy": 1, - "options": "Company:company:default_currency", + "options": "currency", "permlevel": 0, "print_hide": 1, "read_only": 0, @@ -1360,6 +1360,50 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "base_write_off_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off Amount (Company Currency)", + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_61", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1406,29 +1450,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "against_expense_account", - "fieldtype": "Small Text", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Against Expense Account", - "no_copy": 1, - "oldfieldname": "against_expense_account", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -1748,6 +1769,29 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Party Account Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1797,6 +1841,29 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "against_expense_account", + "fieldtype": "Small Text", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Against Expense Account", + "no_copy": 1, + "oldfieldname": "against_expense_account", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -2175,7 +2242,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-08-27 03:21:24.432106", + "modified": "2015-08-27 16:05:29.519073", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index cd97a225888..955a19b3d69 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -1448,7 +1448,7 @@ "no_copy": 0, "oldfieldname": "total_advance", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1472,7 +1472,7 @@ "no_copy": 1, "oldfieldname": "outstanding_amount", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "party_account_currency", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -1663,7 +1663,7 @@ "no_copy": 1, "oldfieldname": "paid_amount", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "options": "currency", "permlevel": 0, "print_hide": 1, "read_only": 0, @@ -1673,6 +1673,29 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "base_paid_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Paid Amount (Company Currency)", + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1710,7 +1733,7 @@ "in_list_view": 0, "label": "Write Off Amount", "no_copy": 1, - "options": "Company:company:default_currency", + "options": "currency", "permlevel": 0, "print_hide": 1, "read_only": 0, @@ -1720,6 +1743,29 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "base_write_off_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off Amount (Company Currency)", + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -2227,6 +2273,29 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Party Account Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -2882,7 +2951,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-08-27 03:29:14.270731", + "modified": "2015-08-27 16:12:12.077662", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", From f6f38f2f2d05e9525b8c5ff9e3d63a52da03ec42 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 27 Aug 2015 16:27:33 +0530 Subject: [PATCH 16/38] [new fields] Exchange Rate in Journal Entry and some properties changes in Journal Entry Account --- .../doctype/journal_entry/journal_entry.json | 24 ++++++- .../journal_entry_account.json | 66 +++++++++++++++---- 2 files changed, 78 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 02a98421e0c..ea632f12660 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -147,6 +147,28 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "exchange_rate", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Exchange Rate", + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1002,7 +1024,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-08-27 03:19:18.634225", + "modified": "2015-08-27 16:07:33.265318", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", 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 718d96ad3f9..fa7fcf97484 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -10,6 +10,8 @@ "fields": [ { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "account", "fieldtype": "Link", "hidden": 0, @@ -34,6 +36,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "currency", "fieldtype": "Link", "hidden": 1, @@ -41,11 +45,11 @@ "in_filter": 0, "in_list_view": 0, "label": "Currency", - "no_copy": 0, + "no_copy": 1, "options": "Currency", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -55,6 +59,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "balance", "fieldtype": "Currency", "hidden": 0, @@ -77,6 +83,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "balance_in_account_currency", "fieldtype": "Currency", "hidden": 1, @@ -84,11 +92,11 @@ "in_filter": 0, "in_list_view": 0, "label": "Balance in Account Currency", - "no_copy": 0, + "no_copy": 1, "options": "currency", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -98,6 +106,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "default": ":Company", "description": "If Income or Expense", "fieldname": "cost_center", @@ -124,6 +134,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "col_break1", "fieldtype": "Column Break", "hidden": 0, @@ -142,6 +154,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "party_type", "fieldtype": "Link", "hidden": 0, @@ -162,6 +176,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "party", "fieldtype": "Dynamic Link", "hidden": 0, @@ -182,6 +198,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "party_balance", "fieldtype": "Currency", "hidden": 0, @@ -203,6 +221,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "party_balance_in_account_currency", "fieldtype": "Currency", "hidden": 1, @@ -210,11 +230,11 @@ "in_filter": 0, "in_list_view": 0, "label": "Party Balance in Account Currency", - "no_copy": 0, + "no_copy": 1, "options": "currency", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -224,6 +244,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "sec_break1", "fieldtype": "Section Break", "hidden": 0, @@ -243,6 +265,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "debit_in_account_currency", "fieldtype": "Currency", "hidden": 1, @@ -264,6 +288,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "debit", "fieldtype": "Currency", "hidden": 0, @@ -271,12 +297,12 @@ "in_filter": 0, "in_list_view": 1, "label": "Debit in Company Currency", - "no_copy": 0, + "no_copy": 1, "oldfieldname": "debit", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, - "print_hide": 0, + "print_hide": 1, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -286,6 +312,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "col_break2", "fieldtype": "Column Break", "hidden": 0, @@ -304,6 +332,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "credit_in_account_currency", "fieldtype": "Currency", "hidden": 1, @@ -325,6 +355,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "credit", "fieldtype": "Currency", "hidden": 0, @@ -332,12 +364,12 @@ "in_filter": 0, "in_list_view": 1, "label": "Credit in Company Currency", - "no_copy": 0, + "no_copy": 1, "oldfieldname": "credit", "oldfieldtype": "Currency", "options": "Company:company:default_currency", "permlevel": 0, - "print_hide": 0, + "print_hide": 1, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -347,6 +379,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "reference", "fieldtype": "Section Break", "hidden": 0, @@ -366,6 +400,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "reference_type", "fieldtype": "Select", "hidden": 0, @@ -387,6 +423,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "reference_name", "fieldtype": "Dynamic Link", "hidden": 0, @@ -408,6 +446,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "col_break3", "fieldtype": "Column Break", "hidden": 0, @@ -426,6 +466,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "is_advance", "fieldtype": "Select", "hidden": 0, @@ -448,6 +490,8 @@ }, { "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "fieldname": "against_account", "fieldtype": "Text", "hidden": 1, @@ -476,7 +520,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-27 12:52:20.914258", + "modified": "2015-08-27 16:09:43.872157", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", From 78be5664281863341121448bddc096abf009fc1d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 27 Aug 2015 16:27:44 +0530 Subject: [PATCH 17/38] minor fix --- erpnext/buying/doctype/supplier/supplier.json | 4 ++-- erpnext/selling/doctype/customer/customer.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 7f3bf89a8dc..35742be6624 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -389,7 +389,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "depends_on": "eval:!doc.__islocal", + "depends_on": "", "description": "Mention if non-standard receivable account applicable", "fieldname": "accounts", "fieldtype": "Table", @@ -511,7 +511,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-25 07:14:56.245716", + "modified": "2015-08-27 16:22:08.762061", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index 3167a835791..105f814eb92 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -463,7 +463,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "depends_on": "eval:!doc.__islocal", + "depends_on": "", "description": "Mention if non-standard receivable account applicable", "fieldname": "accounts", "fieldtype": "Table", @@ -796,7 +796,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-25 07:09:26.411627", + "modified": "2015-08-27 16:21:57.520411", "modified_by": "Administrator", "module": "Selling", "name": "Customer", From 6e439a5e5383662b9715b853ec84ec38875122ee Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 28 Aug 2015 19:24:22 +0530 Subject: [PATCH 18/38] Multi currency: test case and fixes --- erpnext/accounts/doctype/account/account.json | 41 +++++++- erpnext/accounts/doctype/account/account.py | 6 +- .../accounts/doctype/account/test_account.py | 52 +++++----- .../accounts/doctype/gl_entry/gl_entry.json | 46 ++++++++- erpnext/accounts/doctype/gl_entry/gl_entry.py | 28 +++--- .../doctype/gl_entry/test_gl_entry.py | 2 +- .../doctype/journal_entry/journal_entry.js | 8 +- .../doctype/journal_entry/journal_entry.py | 63 +++++++----- .../journal_entry/test_journal_entry.py | 75 +++++++++++--- .../doctype/journal_entry/test_records.json | 28 +++--- .../journal_entry_account.json | 6 +- .../doctype/payment_tool/payment_tool.py | 6 +- .../doctype/payment_tool/test_payment_tool.py | 24 ++--- .../test_period_closing_voucher.py | 4 +- .../purchase_invoice/purchase_invoice.py | 6 +- .../purchase_invoice/test_purchase_invoice.py | 50 ++++++++++ .../doctype/sales_invoice/sales_invoice.json | 4 +- .../doctype/sales_invoice/sales_invoice.py | 24 ++--- .../sales_invoice/test_sales_invoice.py | 97 ++++++++++++++++--- .../page/accounts_browser/accounts_browser.js | 2 +- .../buying/doctype/supplier/test_records.json | 14 ++- erpnext/controllers/accounts_controller.py | 72 +++++++------- erpnext/controllers/stock_controller.py | 4 +- erpnext/patches/v6_0/multi_currency.py | 2 +- .../selling/doctype/customer/customer.json | 4 +- .../doctype/customer/test_records.json | 16 ++- .../setup/doctype/company/test_records.json | 2 +- .../purchase_receipt/purchase_receipt.py | 8 +- 28 files changed, 495 insertions(+), 199 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index 82c9c6622c8..737b07ee20d 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 a57cc259203..7f632b11bd5 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -89,10 +89,10 @@ class Account(Document): 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 2a3feda79b1..83516dacb9d 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -9,36 +9,39 @@ def _make_test_records(verbose): 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 @@ def _make_test_records(verbose): "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 dfe9fc3e5cf..23a44aaafd5 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 b37b4049052..83edf1df557 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 import _ 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 @@ class GLEntry(Document): 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 383409cd3bf..146d084a11b 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 @@ class TestGLEntry(unittest.TestCase): 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 e0d580c595f..adf4c20c294 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -35,7 +35,7 @@ erpnext.journal_entry.toggle_fields_based_on_currency = function(frm) { 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 @@ frappe.ui.form.on("Journal Entry Account", { $.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 @@ frappe.ui.form.on("Journal Entry Account", { 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 @@ frappe.ui.form.on("Journal Entry Account", { 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 d61e63a3945..57d9f0d37b8 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 @@ class JournalEntry(AccountsController): 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 @@ class JournalEntry(AccountsController): 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 @@ class JournalEntry(AccountsController): "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 @@ def get_payment_entry_from_sales_invoice(sales_invoice): 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 @@ def get_payment_entry_from_purchase_invoice(purchase_invoice): 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 @@ def get_payment_entry_from_sales_order(sales_order): """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 @@ def get_payment_entry_from_sales_order(sales_order): 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 @@ def get_payment_entry_from_sales_order(sales_order): 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 @@ def get_payment_entry_from_purchase_order(purchase_order): 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 @@ def get_payment_entry_from_purchase_order(purchase_order): 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 @@ def get_account_balance_and_party_type(account, date, company): 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 @@ def get_account_balance_and_party_type(account, date, company): 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 8995e34220f..0d9cd249ab0 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 @@ class TestJournalEntry(unittest.TestCase): 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 @@ class TestJournalEntry(unittest.TestCase): 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 @@ class TestJournalEntry(unittest.TestCase): 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 @@ class TestJournalEntry(unittest.TestCase): 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 @@ class TestJournalEntry(unittest.TestCase): 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 f6608638e09..5e25c3cb4a5 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 fa7fcf97484..11c92e2ea08 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 4edbebd09f7..4c001c5b3c1 100644 --- a/erpnext/accounts/doctype/payment_tool/payment_tool.py +++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py @@ -33,7 +33,8 @@ class PaymentTool(Document): 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 @@ class PaymentTool(Document): 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 321986cd466..4f1c9e98a4a 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 @@ class TestPaymentTool(unittest.TestCase): "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 @@ class TestPaymentTool(unittest.TestCase): "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 @@ class TestPaymentTool(unittest.TestCase): "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 @@ class TestPaymentTool(unittest.TestCase): 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 @@ class TestPaymentTool(unittest.TestCase): 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 @@ class TestPaymentTool(unittest.TestCase): 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 @@ class TestPaymentTool(unittest.TestCase): 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 afff47fd40c..0b597462a9a 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 @@ from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journ 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 1a591356e50..b640ddae8c3 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -269,7 +269,7 @@ class PurchaseInvoice(BuyingController): 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 @@ class PurchaseInvoice(BuyingController): 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 @@ class PurchaseInvoice(BuyingController): # 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 0b74948d0e1..2754ee6def8 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 @@ from frappe.utils import cint 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 @@ class TestPurchaseInvoice(unittest.TestCase): 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 955a19b3d69..0d1b42cc76e 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 9639038b431..0871a66c75b 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -423,22 +423,18 @@ class SalesInvoice(SellingController): 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 @@ class SalesInvoice(SellingController): 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 @@ class SalesInvoice(SellingController): # 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 @@ class SalesInvoice(SellingController): 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 @@ class SalesInvoice(SellingController): 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 c7a992c489c..e519bd3969e 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 @@ import unittest, copy 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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ class TestSalesInvoice(unittest.TestCase): [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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ class TestSalesInvoice(unittest.TestCase): 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 @@ def create_sales_invoice(**args): 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 56277814951..7fbe92bc07b 100644 --- a/erpnext/accounts/page/accounts_browser/accounts_browser.js +++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js @@ -212,7 +212,7 @@ erpnext.AccountsChart = Class.extend({ 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 dfa5d46f24a..82e0a447bb7 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 6ba954f7a31..7af73691889 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -14,6 +14,7 @@ from erpnext.controllers.sales_and_purchase_return import validate_return 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 @@ class AccountsController(TransactionBase): 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 @@ class AccountsController(TransactionBase): 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 @@ class AccountsController(TransactionBase): 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 @@ class AccountsController(TransactionBase): 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 @@ class AccountsController(TransactionBase): 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 @@ class AccountsController(TransactionBase): 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 @@ class AccountsController(TransactionBase): 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 ccbad0d122c..eccceb0ad3b 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -53,7 +53,7 @@ class StockController(AccountsController): "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_voucherwise_gl_entries(future_stock_vouchers, posting_date): 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 21c851b4485..d506ab76d46 100644 --- a/erpnext/patches/v6_0/multi_currency.py +++ b/erpnext/patches/v6_0/multi_currency.py @@ -77,7 +77,7 @@ def execute(): 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 105f814eb92..952be8ba721 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 e076f7a8931..5c0bbd92463 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 13cb03e0816..b6918b3afaa 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 f6649c119cf..85610a49d21 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -316,10 +316,10 @@ class PurchaseReceipt(BuyingController): "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 @@ class PurchaseReceipt(BuyingController): "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: From c68f68d6cc28cf16f9c3afab95410893fd261043 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 28 Aug 2015 19:26:28 +0530 Subject: [PATCH 19/38] [fix] Patch fixed for account_currency field rename --- erpnext/patches/v6_0/multi_currency.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/patches/v6_0/multi_currency.py b/erpnext/patches/v6_0/multi_currency.py index d506ab76d46..45e8ebb3d0d 100644 --- a/erpnext/patches/v6_0/multi_currency.py +++ b/erpnext/patches/v6_0/multi_currency.py @@ -13,8 +13,8 @@ def execute(): for company in frappe.get_all("Company", fields=["name", "default_currency", "default_receivable_account"]): # update currency in account and gl entry as per company currency - frappe.db.sql("""update `tabAccount` set currency = %s - where ifnull(currency, '') = '' and company=%s""", (company.default_currency, company.name)) + frappe.db.sql("""update `tabAccount` set account_currency = %s + where ifnull(account_currency, '') = '' and company=%s""", (company.default_currency, company.name)) # update newly introduced field's value in sales / purchase invoice frappe.db.sql(""" @@ -45,7 +45,7 @@ def execute(): set debit_in_account_currency=debit, credit_in_account_currency=credit, - currency=%s + account_currency=%s where jea.parent = je.name and je.company=%s @@ -58,7 +58,7 @@ def execute(): set debit_in_account_currency=debit, credit_in_account_currency=credit, - currency=%s + account_currency=%s where company=%s """, (company.default_currency, company.name)) From 06b15bfd634bfe54027e77c6b46680f46cffe71d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 31 Aug 2015 15:39:03 +0530 Subject: [PATCH 20/38] [report] General Ledger in multi currency --- .../doctype/journal_entry/journal_entry.py | 2 +- .../report/general_ledger/general_ledger.py | 153 ++++++++++++++---- 2 files changed, 126 insertions(+), 29 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 57d9f0d37b8..58464dcd423 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -258,7 +258,7 @@ class JournalEntry(AccountsController): 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: + if d.account_currency!=self.company_currency and d.account_currency not in alternate_currency: alternate_currency.append(d.account_currency) if alternate_currency: diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index 1cc9f4fc35e..fd91929a76a 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -12,9 +12,12 @@ def execute(filters=None): account_details.setdefault(acc.name, acc) validate_filters(filters, account_details) + validate_party(filters) + + filters = set_account_currency(filters) - columns = get_columns() + columns = get_columns(filters) res = get_result(filters, account_details) @@ -43,36 +46,77 @@ def validate_party(filters): frappe.throw(_("To filter based on Party, select Party Type first")) elif not frappe.db.exists(party_type, party): frappe.throw(_("Invalid {0}: {1}").format(party_type, party)) - -def get_columns(): - return [_("Posting Date") + ":Date:90", _("Account") + ":Link/Account:200", - _("Debit") + ":Float:100", _("Credit") + ":Float:100", + +def set_account_currency(filters): + if not (filters.get("account") or filters.get("party")): + return filters + else: + filters["company_currency"] = frappe.db.get_value("Company", filters.company, "default_currency") + account_currency = None + + if filters.get("account"): + account_currency = frappe.db.get_value("Account", filters.account, "account_currency") + elif filters.get("party"): + gle_currency = frappe.db.get_value("GL Entry", {"party_type": filters.party_type, + "party": filters.party, "company": filters.company}, "account_currency") + if gle_currency: + account_currency = gle_currency + else: + account_currency = frappe.db.get_value(filters.party_type, filters.party, "default_currency") + + filters["account_currency"] = account_currency or filters.company_currency + + if filters.account_currency != filters.company_currency: + filters["show_in_account_currency"] = 1 + + return filters + +def get_columns(filters): + columns = [ + _("Posting Date") + ":Date:90", _("Account") + ":Link/Account:200", + _("Debit") + ":Float:100", _("Credit") + ":Float:100" + ] + + if filters.get("show_in_account_currency"): + columns += [ + _("Debit") + " (" + filters.account_currency + ")" + ":Float:100", + _("Credit") + " (" + filters.account_currency + ")" + ":Float:100" + ] + + columns += [ _("Voucher Type") + "::120", _("Voucher No") + ":Dynamic Link/Voucher Type:160", _("Against Account") + "::120", _("Party Type") + "::80", _("Party") + "::150", - _("Cost Center") + ":Link/Cost Center:100", _("Remarks") + "::400"] + _("Cost Center") + ":Link/Cost Center:100", _("Remarks") + "::400" + ] + + return columns def get_result(filters, account_details): gl_entries = get_gl_entries(filters) data = get_data_with_opening_closing(filters, account_details, gl_entries) - result = get_result_as_list(data) + result = get_result_as_list(data, filters) return result def get_gl_entries(filters): + select_fields = """, sum(ifnull(debit_in_account_currency, 0)) as debit_in_account_currency, + sum(ifnull(credit_in_account_currency, 0)) as credit_in_account_currency""" \ + if filters.get("show_in_account_currency") else "" + group_by_condition = "group by voucher_type, voucher_no, account, cost_center" \ if filters.get("group_by_voucher") else "group by name" gl_entries = frappe.db.sql("""select posting_date, account, party_type, party, - sum(ifnull(debit, 0)) as debit, sum(ifnull(credit, 0)) as credit, - voucher_type, voucher_no, cost_center, remarks, against, is_opening + sum(ifnull(debit, 0)) as debit, sum(ifnull(credit, 0)) as credit, + voucher_type, voucher_no, cost_center, remarks, against, is_opening {select_fields} from `tabGL Entry` where company=%(company)s {conditions} {group_by_condition} order by posting_date, account"""\ - .format(conditions=get_conditions(filters), group_by_condition=group_by_condition), - filters, as_dict=1) + .format(select_fields=select_fields, conditions=get_conditions(filters), + group_by_condition=group_by_condition), filters, as_dict=1) return gl_entries @@ -105,35 +149,51 @@ def get_data_with_opening_closing(filters, account_details, gl_entries): data = [] gle_map = initialize_gle_map(gl_entries) - opening, total_debit, total_credit, gle_map = get_accountwise_gle(filters, gl_entries, gle_map) + opening, total_debit, total_credit, opening_in_account_currency, total_debit_in_account_currency, \ + total_credit_in_account_currency, gle_map = get_accountwise_gle(filters, gl_entries, gle_map) # Opening for filtered account if filters.get("account") or filters.get("party"): - data += [get_balance_row(_("Opening"), opening), {}] + data += [get_balance_row(_("Opening"), opening, opening_in_account_currency), {}] for acc, acc_dict in gle_map.items(): if acc_dict.entries: # Opening for individual ledger, if grouped by account if filters.get("group_by_account"): - data.append(get_balance_row(_("Opening"), acc_dict.opening)) + data.append(get_balance_row(_("Opening"), acc_dict.opening, + acc_dict.opening_in_account_currency)) data += acc_dict.entries # Totals and closing for individual ledger, if grouped by account if filters.get("group_by_account"): + account_closing = acc_dict.opening + acc_dict.total_debit - acc_dict.total_credit + account_closing_in_account_currency = acc_dict.opening_in_account_currency \ + + acc_dict.total_debit_in_account_currency - acc_dict.total_credit_in_account_currency + data += [{"account": "'" + _("Totals") + "'", "debit": acc_dict.total_debit, "credit": acc_dict.total_credit}, get_balance_row(_("Closing (Opening + Totals)"), - (acc_dict.opening + acc_dict.total_debit - acc_dict.total_credit)), {}] + account_closing, account_closing_in_account_currency), {}] # Total debit and credit between from and to date if total_debit or total_credit: - data.append({"account": "'" + _("Totals") + "'", "debit": total_debit, "credit": total_credit}) + data.append({ + "account": "'" + _("Totals") + "'", + "debit": total_debit, + "credit": total_credit, + "debit_in_account_currency": total_debit_in_account_currency, + "credit_in_account_currency": total_credit_in_account_currency + }) # Closing for filtered account if filters.get("account") or filters.get("party"): + closing = opening + total_debit - total_credit + closing_in_account_currency = opening_in_account_currency + \ + total_debit_in_account_currency - total_credit_in_account_currency + data.append(get_balance_row(_("Closing (Opening + Totals)"), - (opening + total_debit - total_credit))) + closing, closing_in_account_currency)) return data @@ -142,46 +202,83 @@ def initialize_gle_map(gl_entries): for gle in gl_entries: gle_map.setdefault(gle.account, frappe._dict({ "opening": 0, + "opening_in_account_currency": 0, "entries": [], "total_debit": 0, + "total_debit_in_account_currency": 0, "total_credit": 0, - "closing": 0 + "total_credit_in_account_currency": 0, + "closing": 0, + "closing_in_account_currency": 0 })) return gle_map def get_accountwise_gle(filters, gl_entries, gle_map): opening, total_debit, total_credit = 0, 0, 0 + opening_in_account_currency, total_debit_in_account_currency, total_credit_in_account_currency = 0, 0, 0 + from_date, to_date = getdate(filters.from_date), getdate(filters.to_date) for gle in gl_entries: amount = flt(gle.debit, 3) - flt(gle.credit, 3) + amount_in_account_currency = flt(gle.debit_in_account_currency, 3) - flt(gle.credit_in_account_currency, 3) + if (filters.get("account") or filters.get("party") or filters.get("group_by_account")) \ and (gle.posting_date < from_date or cstr(gle.is_opening) == "Yes"): + gle_map[gle.account].opening += amount + if filters.get("show_in_account_currency"): + gle_map[gle.account].opening_in_account_currency += amount_in_account_currency + if filters.get("account") or filters.get("party"): opening += amount + if filters.get("show_in_account_currency"): + opening_in_account_currency += amount_in_account_currency + elif gle.posting_date <= to_date: gle_map[gle.account].entries.append(gle) gle_map[gle.account].total_debit += flt(gle.debit, 3) gle_map[gle.account].total_credit += flt(gle.credit, 3) - + total_debit += flt(gle.debit, 3) total_credit += flt(gle.credit, 3) + + if filters.get("show_in_account_currency"): + gle_map[gle.account].total_debit_in_account_currency += flt(gle.debit_in_account_currency, 3) + gle_map[gle.account].total_credit_in_account_currency += flt(gle.credit_in_account_currency, 3) + + total_debit_in_account_currency += flt(gle.debit_in_account_currency, 3) + total_credit_in_account_currency += flt(gle.credit_in_account_currency, 3) - return opening, total_debit, total_credit, gle_map + return opening, total_debit, total_credit, opening_in_account_currency, \ + total_debit_in_account_currency, total_credit_in_account_currency, gle_map -def get_balance_row(label, balance): - return { +def get_balance_row(label, balance, balance_in_account_currency=None): + balance_row = { "account": "'" + label + "'", "debit": balance if balance > 0 else 0, - "credit": -1*balance if balance < 0 else 0, + "credit": -1*balance if balance < 0 else 0 } + + if balance_in_account_currency != None: + balance_row.update({ + "debit_in_account_currency": balance_in_account_currency if balance_in_account_currency > 0 else 0, + "credit_in_account_currency": -1*balance_in_account_currency if balance_in_account_currency < 0 else 0 + }) + + return balance_row -def get_result_as_list(data): +def get_result_as_list(data, filters): result = [] for d in data: - result.append([d.get("posting_date"), d.get("account"), d.get("debit"), - d.get("credit"), d.get("voucher_type"), d.get("voucher_no"), - d.get("against"), d.get("party_type"), d.get("party"), - d.get("cost_center"), d.get("remarks")]) + row = [d.get("posting_date"), d.get("account"), d.get("debit"), d.get("credit")] + + if filters.get("show_in_account_currency"): + row += [d.get("debit_in_account_currency"), d.get("credit_in_account_currency")] + + row += [d.get("voucher_type"), d.get("voucher_no"), d.get("against"), + d.get("party_type"), d.get("party"), d.get("cost_center"), d.get("remarks") + ] + + result.append(row) return result From 699751c5319eacc70a32646f768af56f4505c5f2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 31 Aug 2015 17:02:04 +0530 Subject: [PATCH 21/38] [report] Accounts Receivable / Payable in multi currency --- .../accounts_receivable.py | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 19703be8ebc..988335f0eb5 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe from frappe import _, scrub -from frappe.utils import getdate, nowdate, flt, cint +from frappe.utils import getdate, nowdate, flt, cint, cstr class ReceivablePayableReport(object): def __init__(self, filters=None): @@ -30,19 +30,37 @@ class ReceivablePayableReport(object): if args.get("party_type") == "Supplier": columns += [_("Bill No") + "::80", _("Bill Date") + ":Date:80"] - columns += [_("Invoiced Amount") + ":Currency:100", _("Paid Amount") + ":Currency:100", - _("Outstanding Amount") + ":Currency:100", _("Age") + ":Int:50", - "0-" + str(self.filters.range1) + ":Currency:100", - str(self.filters.range1) + "-" + str(self.filters.range2) + ":Currency:100", - str(self.filters.range2) + "-" + str(self.filters.range3) + ":Currency:100", - str(self.filters.range3) + _("-Above") + ":Currency:100" - ] + for label in ("Invoiced Amount", "Paid Amount", "Outstanding Amount"): + columns.append({ + "label": label, + "fieldtype": "Currency", + "options": "currency", + "width": 120 + }) + + columns += [_("Age (Days)") + "::80"] + + for label in ("0-" + cstr(self.filters.range1), + cstr(self.filters.range1) + "-" + cstr(self.filters.range2), + cstr(self.filters.range2) + "-" +cstr(self.filters.range3), + cstr(self.filters.range3) + _("-Above")): + columns.append({ + "label": label, + "fieldtype": "Currency", + "options": "currency", + "width": 120 + }) if args.get("party_type") == "Customer": columns += [_("Territory") + ":Link/Territory:80"] if args.get("party_type") == "Supplier": columns += [_("Supplier Type") + ":Link/Supplier Type:80"] - columns += [_("Remarks") + "::200"] + columns += [{ + "fieldname": "currency", + "label": _("Currency"), + "fieldtype": "Data", + "width": 100, + }, _("Remarks") + "::200"] return columns @@ -91,10 +109,11 @@ class ReceivablePayableReport(object): # customer territory / supplier type if args.get("party_type") == "Customer": - row += [self.get_territory(gle.party), gle.remarks] + row += [self.get_territory(gle.party)] if args.get("party_type") == "Supplier": - row += [self.get_supplier_type(gle.party), gle.remarks] + row += [self.get_supplier_type(gle.party)] + row += [gle.account_currency, gle.remarks] data.append(row) return data @@ -171,10 +190,17 @@ class ReceivablePayableReport(object): def get_gl_entries(self, party_type): if not hasattr(self, "gl_entries"): conditions, values = self.prepare_conditions(party_type) - self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party, debit, credit, - voucher_type, voucher_no, against_voucher_type, against_voucher from `tabGL Entry` - where docstatus < 2 and party_type=%s {0} order by posting_date, party""" - .format(conditions), values, as_dict=True) + + if self.filters.get(scrub(party_type)): + select_fields = ", debit_in_account_currency as debit, credit_in_account_currency as credit" + else: + select_fields = ", debit, credit" + + self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party, + voucher_type, voucher_no, against_voucher_type, against_voucher, account_currency, remarks {0} + from `tabGL Entry` + where docstatus < 2 and party_type=%s {1} order by posting_date, party""" + .format(select_fields, conditions), values, as_dict=True) return self.gl_entries From bac9b8eef6bcec20b0304cc8d4e527574a048762 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 31 Aug 2015 19:01:11 +0530 Subject: [PATCH 22/38] Payment Tool changes due to multi currency --- .../journal_entry_account.json | 22 ++++---- .../doctype/payment_tool/payment_tool.js | 29 ++++++++--- .../doctype/payment_tool/payment_tool.json | 28 +++++++++- .../doctype/payment_tool/payment_tool.py | 51 ++++++++++++------- .../payment_tool_detail.json | 5 +- .../purchase_invoice/purchase_invoice.js | 4 +- .../purchase_invoice/purchase_invoice.py | 5 +- .../doctype/sales_invoice/sales_invoice.js | 4 +- .../doctype/sales_invoice/sales_invoice.py | 5 +- .../public/js/controllers/taxes_and_totals.js | 2 +- 10 files changed, 111 insertions(+), 44 deletions(-) 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 11c92e2ea08..c866181446e 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -93,7 +93,7 @@ "in_list_view": 0, "label": "Balance in Account Currency", "no_copy": 1, - "options": "currency", + "options": "account_currency", "permlevel": 0, "precision": "", "print_hide": 1, @@ -231,7 +231,7 @@ "in_list_view": 0, "label": "Party Balance in Account Currency", "no_copy": 1, - "options": "currency", + "options": "account_currency", "permlevel": 0, "precision": "", "print_hide": 1, @@ -269,13 +269,13 @@ "collapsible": 0, "fieldname": "debit_in_account_currency", "fieldtype": "Currency", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 0, + "in_list_view": 1, "label": "Debit in Account Currency", "no_copy": 0, - "options": "currency", + "options": "account_currency", "permlevel": 0, "precision": "", "print_hide": 0, @@ -295,7 +295,7 @@ "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 1, + "in_list_view": 0, "label": "Debit in Company Currency", "no_copy": 1, "oldfieldname": "debit", @@ -336,13 +336,13 @@ "collapsible": 0, "fieldname": "credit_in_account_currency", "fieldtype": "Currency", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 0, + "in_list_view": 1, "label": "Credit in Account Currency", "no_copy": 0, - "options": "currency", + "options": "account_currency", "permlevel": 0, "precision": "", "print_hide": 0, @@ -362,7 +362,7 @@ "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 1, + "in_list_view": 0, "label": "Credit in Company Currency", "no_copy": 1, "oldfieldname": "credit", @@ -520,7 +520,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-28 17:15:25.180681", + "modified": "2015-08-31 17:50:04.145031", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.js b/erpnext/accounts/doctype/payment_tool/payment_tool.js index 6eefdb936c3..5904b99d0a4 100644 --- a/erpnext/accounts/doctype/payment_tool/payment_tool.js +++ b/erpnext/accounts/doctype/payment_tool/payment_tool.js @@ -55,6 +55,25 @@ frappe.ui.form.on("Payment Tool", "party", function(frm) { } }) +frappe.ui.form.on("Payment Tool", "party_account", function(frm) { + if(frm.doc.party_account) { + frm.call({ + method: "frappe.client.get_value", + args: { + doctype: "Account", + fieldname: "account_currency", + filters: { name: frm.doc.party_account }, + }, + callback: function(r, rt) { + if(r.message) { + frm.set_value("party_account_currency", r.message.account_currency); + erpnext.payment_tool.check_mandatory_to_set_button(frm); + } + } + }); + } +}) + frappe.ui.form.on("Payment Tool", "company", function(frm) { erpnext.payment_tool.check_mandatory_to_set_button(frm); }); @@ -63,10 +82,6 @@ frappe.ui.form.on("Payment Tool", "received_or_paid", function(frm) { erpnext.payment_tool.check_mandatory_to_set_button(frm); }); -frappe.ui.form.on("Payment Tool", "party", function(frm) { - erpnext.payment_tool.check_mandatory_to_set_button(frm); -}); - // Fetch bank/cash account based on payment mode frappe.ui.form.on("Payment Tool", "payment_mode", function(frm) { return frappe.call({ @@ -158,7 +173,9 @@ frappe.ui.form.on("Payment Tool Detail", "against_voucher_no", function(frm, cdt method: 'erpnext.accounts.doctype.payment_tool.payment_tool.get_against_voucher_amount', args: { "against_voucher_type": row.against_voucher_type, - "against_voucher_no": row.against_voucher_no + "against_voucher_no": row.against_voucher_no, + "party_account": self.party_account, + "company": self.company }, callback: function(r) { if(!r.exc) { @@ -216,4 +233,4 @@ erpnext.payment_tool.check_mandatory_to_fetch = function(doc) { $.each(["Company", "Party Type", "Party", "Received or Paid"], function(i, field) { if(!doc[frappe.model.scrub(field)]) frappe.throw(__("Please select {0} first", [field])); }); -} +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.json b/erpnext/accounts/doctype/payment_tool/payment_tool.json index e00d9e29abf..55e70481e2c 100644 --- a/erpnext/accounts/doctype/payment_tool/payment_tool.json +++ b/erpnext/accounts/doctype/payment_tool/payment_tool.json @@ -106,7 +106,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Column Break 1", + "label": "", "no_copy": 0, "permlevel": 0, "print_hide": 0, @@ -162,6 +162,29 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Party Account Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -306,6 +329,7 @@ "in_list_view": 0, "label": "Total Payment Amount", "no_copy": 0, + "options": "party_account_currency", "permlevel": 0, "print_hide": 0, "read_only": 1, @@ -450,7 +474,7 @@ "is_submittable": 0, "issingle": 1, "istable": 0, - "modified": "2015-06-05 11:17:33.843334", + "modified": "2015-08-31 18:58:21.813054", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Tool", diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.py b/erpnext/accounts/doctype/payment_tool/payment_tool.py index 4c001c5b3c1..924fd1e1c6d 100644 --- a/erpnext/accounts/doctype/payment_tool/payment_tool.py +++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe -from frappe import _ +from frappe import _, scrub from frappe.utils import flt from frappe.model.document import Document import json @@ -38,7 +38,8 @@ class PaymentTool(Document): 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') - total_payment_amount = flt(total_payment_amount) + flt(d1.debit) - flt(d1.credit) + total_payment_amount = flt(total_payment_amount) + \ + flt(d1.debit_in_account_currency) - flt(d1.credit_in_account_currency) d2 = jv.append("accounts") d2.account = self.payment_account @@ -57,11 +58,14 @@ def get_outstanding_vouchers(args): frappe.throw(_("No permission to use Payment Tool"), frappe.PermissionError) args = json.loads(args) + + party_account_currency = frappe.db.get_value("Account", args.get("party_account"), "account_currency") + company_currency = frappe.db.get_value("Company", args.get("company"), "default_currency") if args.get("party_type") == "Customer" and args.get("received_or_paid") == "Received": - amount_query = "ifnull(debit, 0) - ifnull(credit, 0)" + amount_query = "ifnull(debit_in_account_currency, 0) - ifnull(credit_in_account_currency, 0)" elif args.get("party_type") == "Supplier" and args.get("received_or_paid") == "Paid": - amount_query = "ifnull(credit, 0) - ifnull(debit, 0)" + amount_query = "ifnull(credit_in_account_currency, 0) - ifnull(debit_in_account_currency, 0)" else: frappe.throw(_("Please enter the Against Vouchers manually")) @@ -70,27 +74,34 @@ def get_outstanding_vouchers(args): args.get("party_type"), args.get("party")) # Get all SO / PO which are not fully billed or aginst which full advance not paid - orders_to_be_billed = get_orders_to_be_billed(args.get("party_type"), args.get("party")) + orders_to_be_billed = get_orders_to_be_billed(args.get("party_type"), args.get("party"), + party_account_currency, company_currency) return outstanding_invoices + orders_to_be_billed -def get_orders_to_be_billed(party_type, party): +def get_orders_to_be_billed(party_type, party, party_account_currency, company_currency): voucher_type = 'Sales Order' if party_type == "Customer" else 'Purchase Order' + + ref_field = "base_grand_total" if party_account_currency == company_currency else "grand_total" + orders = frappe.db.sql(""" select name as voucher_no, - ifnull(base_grand_total, 0) as invoice_amount, - (ifnull(base_grand_total, 0) - ifnull(advance_paid, 0)) as outstanding_amount, + ifnull({ref_field}, 0) as invoice_amount, + (ifnull({ref_field}, 0) - ifnull(advance_paid, 0)) as outstanding_amount, transaction_date as posting_date from - `tab%s` + `tab{voucher_type}` where - %s = %s + {party_type} = %s and docstatus = 1 and ifnull(status, "") != "Stopped" - and ifnull(base_grand_total, 0) > ifnull(advance_paid, 0) + and ifnull({ref_field}, 0) > ifnull(advance_paid, 0) and abs(100 - ifnull(per_billed, 0)) > 0.01 - """ % (voucher_type, 'customer' if party_type == "Customer" else 'supplier', '%s'), - party, as_dict = True) + """.format(**{ + "ref_field": ref_field, + "voucher_type": voucher_type, + "party_type": scrub(party_type) + }), party, as_dict = True) order_list = [] for d in orders: @@ -100,13 +111,19 @@ def get_orders_to_be_billed(party_type, party): return order_list @frappe.whitelist() -def get_against_voucher_amount(against_voucher_type, against_voucher_no): +def get_against_voucher_amount(against_voucher_type, against_voucher_no, party_account, company): + party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") + company_currency = frappe.db.get_value("Company", company, "default_currency") + ref_field = "base_grand_total" if party_account_currency == company_currency else "grand_total" + if against_voucher_type in ["Sales Order", "Purchase Order"]: - select_cond = "base_grand_total as total_amount, ifnull(base_grand_total, 0) - ifnull(advance_paid, 0) as outstanding_amount" + select_cond = "{0} as total_amount, ifnull({0}, 0) - ifnull(advance_paid, 0) as outstanding_amount"\ + .format(ref_field) elif against_voucher_type in ["Sales Invoice", "Purchase Invoice"]: - select_cond = "base_grand_total as total_amount, outstanding_amount" + select_cond = "{0} as total_amount, outstanding_amount".format(ref_field) elif against_voucher_type == "Journal Entry": - select_cond = "total_debit as total_amount" + ref_field = "total_debit" if party_account_currency == company_currency else "total_debit/exchange_rate" + select_cond = "{0} as total_amount".format(ref_field) details = frappe.db.sql("""select {0} from `tab{1}` where name = %s""" .format(select_cond, against_voucher_type), against_voucher_no, as_dict=1) diff --git a/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json index 5221f35a3fd..7e1460863ad 100644 --- a/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json +++ b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json @@ -87,6 +87,7 @@ "in_list_view": 1, "label": "Total Amount", "no_copy": 0, + "options": "party_account_currency", "permlevel": 0, "print_hide": 0, "read_only": 1, @@ -108,6 +109,7 @@ "in_list_view": 1, "label": "Outstanding Amount", "no_copy": 0, + "options": "party_account_currency", "permlevel": 0, "print_hide": 0, "read_only": 1, @@ -129,6 +131,7 @@ "in_list_view": 1, "label": "Payment Amount", "no_copy": 0, + "options": "party_account_currency", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -146,7 +149,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2014-09-11 08:55:34.384017", + "modified": "2015-08-31 18:58:35.537060", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Tool Detail", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index e0a8245bba3..2e3794a2385 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -83,12 +83,12 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ method: "frappe.client.get_value", args: { doctype: "Account", - fieldname: "currency", + fieldname: "account_currency", filters: { name: me.frm.doc.credit_to }, }, callback: function(r, rt) { if(r.message) { - me.frm.set_value("party_account_currency", r.message.currency); + me.frm.set_value("party_account_currency", r.message.account_currency); me.set_dynamic_labels(); } } diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index b640ddae8c3..4fac12129e7 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -91,13 +91,16 @@ class PurchaseInvoice(BuyingController): throw(_("Conversion rate cannot be 0 or 1")) def validate_credit_to_acc(self): - account = frappe.db.get_value("Account", self.credit_to, ["account_type", "report_type"], as_dict=True) + account = frappe.db.get_value("Account", self.credit_to, + ["account_type", "report_type", "account_currency"], as_dict=True) if account.report_type != "Balance Sheet": frappe.throw(_("Credit To account must be a Balance Sheet account")) if self.supplier and account.account_type != "Payable": frappe.throw(_("Credit To account must be a Payable account")) + + self.party_account_currency = account.account_currency def check_for_stopped_status(self): check_list = [] diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 1d44e5410f9..5e8d3a5d9b7 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -183,12 +183,12 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte method: "frappe.client.get_value", args: { doctype: "Account", - fieldname: "currency", + fieldname: "account_currency", filters: { name: me.frm.doc.debit_to }, }, callback: function(r, rt) { if(r.message) { - me.frm.set_value("party_account_currency", r.message.currency); + me.frm.set_value("party_account_currency", r.message.account_currency); me.set_dynamic_labels(); } } diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 0871a66c75b..bce8fe214e2 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -271,13 +271,16 @@ class SalesInvoice(SellingController): reconcile_against_document(lst) def validate_debit_to_acc(self): - account = frappe.db.get_value("Account", self.debit_to, ["account_type", "report_type"], as_dict=True) + account = frappe.db.get_value("Account", self.debit_to, + ["account_type", "report_type", "account_currency"], as_dict=True) if account.report_type != "Balance Sheet": frappe.throw(_("Debit To account must be a Balance Sheet account")) if self.customer and account.account_type != "Receivable": frappe.throw(_("Debit To account must be a Receivable account")) + + self.party_account_currency = account.account_currency def validate_fixed_asset_account(self): """Validate Fixed Asset and whether Income Account Entered Exists""" diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index ad794d6e19e..b1b24cf38ae 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -525,7 +525,7 @@ erpnext.taxes_and_totals = erpnext.stock.StockController.extend({ var outstanding_amount = flt(total_amount_to_pay, precision("outstanding_amount")); } - if(this.frm.doc.party_account_currency == this.frm.doc.currency) { + if(this.frm.doc.party_account_currency == this.frm.doc.currency) { this.frm.set_value("outstanding_amount", outstanding_amount); } else { this.frm.set_value("outstanding_amount", From 98096771c2e192398c1660ee170f58e9b10a5122 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 3 Sep 2015 10:28:08 +0530 Subject: [PATCH 23/38] [multi currency] Introduced Accounting Currency in Customer and Supplier, and validation according to that --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 21 +++------ erpnext/accounts/party.py | 44 ++++++++++++++---- erpnext/buying/doctype/supplier/supplier.json | 29 ++++++++++-- erpnext/buying/doctype/supplier/supplier.py | 3 +- erpnext/controllers/accounts_controller.py | 20 +++------ erpnext/patches/v6_0/multi_currency.py | 45 ++++++++++++------- .../selling/doctype/customer/customer.json | 31 +++++++++++-- erpnext/selling/doctype/customer/customer.py | 3 +- erpnext/setup/doctype/company/company.py | 22 ++++++--- 9 files changed, 150 insertions(+), 68 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 83edf1df557..fe49163f269 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -114,21 +114,12 @@ class GLEntry(Document): 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", "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 - 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), - InvalidAccountCurrency) - else: - 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), - InvalidAccountCurrency) + party_account_currency = frappe.db.get_value(self.party_type, self.party, "party_account_currency") \ + or company_currency + + if party_account_currency != self.account_currency: + frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}") + .format(self.party_type, self.party, party_account_currency), InvalidAccountCurrency) def validate_balance_type(account, adv_adj=False): if not adv_adj and account: diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 2b2912d190b..4a19645bec0 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -142,17 +142,43 @@ def set_account_and_due_date(party, account, party_type, company, posting_date, } return out +def validate_accounting_currency(party): + company_currency = get_company_currency() + + # set party account currency + if not party.party_account_currency: + if party.default_currency: + party.party_account_currency = party.default_currency + else: + party.party_account_currency = company_currency + + party_account_currency_in_db = frappe.db.get_value(party.doctype, party.name, "party_account_currency") + if party_account_currency_in_db and party_account_currency_in_db != party.party_account_currency: + existing_gle = frappe.db.get_value("GL Entry", {"party_type": party.doctype, + "party": party.name}, ["name", "account_currency"], as_dict=1) + if existing_gle: + frappe.throw(_("Accounting Currency cannot be changed, as GL Entry exists for this {0}") + .format(party.doctype)) + + def validate_party_account(party): - party_account_defined_for_companies = [d.company for d in party.get("accounts")] - party_account_required_for_companies = [] - for company, company_currency in frappe.db.sql("select name, default_currency from `tabCompany`"): - if party.default_currency and party.default_currency != company_currency \ - and company not in party_account_defined_for_companies: - party_account_required_for_companies.append(company) + company_currency = get_company_currency() + + if party.party_account_currency != company_currency: + party_account_defined_for_companies = [d.company for d in party.get("accounts")] + all_companies = [d.name for d in frappe.get_list("Company")] + party_account_required_for_companies = list(set(all_companies) - set(party_account_defined_for_companies)) - if party_account_required_for_companies: - frappe.msgprint(_("Please mention Party Account for the following companies, as party currency is different from company's default currency: {0}") - .format("\n" + "\n".join(party_account_required_for_companies))) + if party_account_required_for_companies: + frappe.msgprint(_("Please mention Default {0} Account for the following companies, as accounting currency is different from company's default currency: {1}") + .format( + "Receivable" if party.doctype=="Customer" else "Payable", + "\n" + "\n".join(party_account_required_for_companies) + ) + ) + +def get_company_currency(): + return frappe.db.sql("select default_currency from tabCompany limit 1")[0][0] @frappe.whitelist() def get_party_account(company, party, party_type): diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 35742be6624..e90ffc541f9 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -385,12 +385,35 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Accounting Currency", + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, "collapsible": 0, "depends_on": "", - "description": "Mention if non-standard receivable account applicable", + "description": "Mention if non-standard receivable account", "fieldname": "accounts", "fieldtype": "Table", "hidden": 0, @@ -511,8 +534,8 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-27 16:22:08.762061", - "modified_by": "Administrator", + "modified": "2015-09-02 16:31:35.050738", + "modified_by": "nabin@erpnext.com", "module": "Buying", "name": "Supplier", "owner": "Administrator", diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py index a70a77195ac..6ee6b3928b1 100644 --- a/erpnext/buying/doctype/supplier/supplier.py +++ b/erpnext/buying/doctype/supplier/supplier.py @@ -8,7 +8,7 @@ from frappe import msgprint, _ from frappe.model.naming import make_autoname from erpnext.utilities.address_and_contact import load_address_and_contact from erpnext.utilities.transaction_base import TransactionBase -from erpnext.accounts.party import validate_party_account +from erpnext.accounts.party import validate_accounting_currency, validate_party_account class Supplier(TransactionBase): def get_feed(self): @@ -46,6 +46,7 @@ class Supplier(TransactionBase): if not self.naming_series: msgprint(_("Series is mandatory"), raise_exception=1) + validate_accounting_currency(self) validate_party_account(self) def get_contacts(self,nm): diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 7af73691889..47d7e7a4fee 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -428,20 +428,12 @@ class AccountsController(TransactionBase): if self.get("currency"): party_type, party = self.get_party() 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) + party_account_currency = frappe.db.get_value(party_type, party, "party_account_currency") \ + or self.company_currency + + if party_account_currency != self.company_currency and self.currency != party_account_currency: + frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}") + .format(party_type, party, party_account_currency), InvalidCurrency) @frappe.whitelist() def get_tax_rate(account_head): diff --git a/erpnext/patches/v6_0/multi_currency.py b/erpnext/patches/v6_0/multi_currency.py index 45e8ebb3d0d..0441c4a776d 100644 --- a/erpnext/patches/v6_0/multi_currency.py +++ b/erpnext/patches/v6_0/multi_currency.py @@ -7,7 +7,7 @@ import frappe def execute(): # Reload doctype for dt in ("Account", "GL Entry", "Journal Entry", - "Journal Entry Account", "Sales Invoice", "Purchase Invoice"): + "Journal Entry Account", "Sales Invoice", "Purchase Invoice", "Customer", "Supplier"): frappe.reload_doctype(dt) for company in frappe.get_all("Company", fields=["name", "default_currency", "default_receivable_account"]): @@ -65,21 +65,36 @@ def execute(): # Set party account if default currency of party other than company's default currency for dt in ("Customer", "Supplier"): - parties = frappe.db.sql("""select name from `tab{0}` p - where ifnull(default_currency, '') != '' and default_currency != %s - and not exists(select name from `tabParty Account` where parent=p.name and company=%s)""" - .format(dt), (company.default_currency, company.name)) - + parties = frappe.get_all(dt, ["name", "default_currency"]) for p in parties: - party = frappe.get_doc(dt, p[0]) - party_gle = frappe.db.get_value("GL Entry", {"party_type": dt, "party": p[0], - "company": company.name}, ["account"], as_dict=True) + # Get party GL Entries + party_gle = frappe.db.get_value("GL Entry", {"party_type": dt, "party": p.name, + "company": company.name}, ["account", "account_currency"], as_dict=True) - party_account = party_gle.account or company.default_receivable_account + party = frappe.get_doc(dt, p.name) - party.append("accounts", { - "company": company.name, - "account": party_account - }) - party.ignore_mandatory() + # set default currency and party account currency + if not party.default_currency: + party.default_currency = company.default_currency + + party.party_account_currency = company.default_currency if party_gle else party.default_currency + + # Add default receivable /payable account if not exists + # and currency is other than company currency + if party.default_currency != company.default_currency: + party_account_exists = False + for d in party.get("accounts"): + if d.company == company.name: + party_account_exists = True + break + + if not party_account_exists: + party_account = party_gle.account if party_gle else company.default_receivable_account + if party_account: + party.append("accounts", { + "company": company.name, + "account": party_account + }) + + party.flags.ignore_mandatory = True party.save() \ No newline at end of file diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index 952be8ba721..d160798b3d9 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -273,7 +273,7 @@ "ignore_user_permissions": 1, "in_filter": 0, "in_list_view": 0, - "label": "Currency", + "label": "Default Currency", "no_copy": 1, "options": "Currency", "permlevel": 0, @@ -459,12 +459,35 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Accounting Currency", + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, "collapsible": 0, "depends_on": "", - "description": "Mention if non-standard receivable account applicable", + "description": "Mention if non-standard receivable account", "fieldname": "accounts", "fieldtype": "Table", "hidden": 0, @@ -796,8 +819,8 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-27 17:00:50.604869", - "modified_by": "Administrator", + "modified": "2015-09-02 16:32:54.474655", + "modified_by": "nabin@erpnext.com", "module": "Selling", "name": "Customer", "owner": "Administrator", diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index ae5cb49f185..c8f774c17ec 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -10,7 +10,7 @@ from frappe.utils import flt from erpnext.utilities.transaction_base import TransactionBase from erpnext.utilities.address_and_contact import load_address_and_contact -from erpnext.accounts.party import validate_party_account +from erpnext.accounts.party import validate_accounting_currency, validate_party_account class Customer(TransactionBase): def get_feed(self): @@ -33,6 +33,7 @@ class Customer(TransactionBase): def validate(self): self.validate_mandatory() + validate_accounting_currency(self) validate_party_account(self) def update_lead_status(self): diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index cf47de5f6f6..72c6cdd52b5 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -34,13 +34,8 @@ class Company(Document): if not self.abbr.strip(): frappe.throw(_("Abbreviation is mandatory")) - self.previous_default_currency = frappe.db.get_value("Company", self.name, "default_currency") - if self.default_currency and self.previous_default_currency and \ - self.default_currency != self.previous_default_currency and \ - self.check_if_transactions_exist(): - frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.")) - self.validate_default_accounts() + self.validate_currency() def validate_default_accounts(self): for field in ["default_bank_account", "default_cash_account", "default_receivable_account", "default_payable_account", @@ -51,6 +46,21 @@ class Company(Document): if for_company != self.name: frappe.throw(_("Account {0} does not belong to company: {1}") .format(self.get(field), self.name)) + + def validate_currency(self): + self.previous_default_currency = frappe.db.get_value("Company", self.name, "default_currency") + if self.default_currency and self.previous_default_currency and \ + self.default_currency != self.previous_default_currency and \ + self.check_if_transactions_exist(): + frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.")) + + if self.default_currency: + currency_in_other_companies = frappe.db.sql("""select default_currency from tabCompany + where name!=%s limit 1""", self.name) + + if currency_in_other_companies and self.default_currency != currency_in_other_companies[0][0]: + frappe.throw(_("Currency must be same for all Companies")) + def on_update(self): if not frappe.db.sql("""select name from tabAccount From 1609933748a12412a03137021a4e830945a374f2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 3 Sep 2015 16:03:07 +0530 Subject: [PATCH 24/38] Test cases for multi currency --- erpnext/accounts/party.py | 45 +++++++++++++------ .../buying/doctype/supplier/test_records.json | 2 +- erpnext/selling/doctype/customer/customer.js | 16 ++++--- .../selling/doctype/customer/test_customer.py | 14 +++++- .../doctype/customer/test_records.json | 2 +- erpnext/setup/doctype/company/company.py | 10 +---- 6 files changed, 59 insertions(+), 30 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 4a19645bec0..09f9b6ab236 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -11,6 +11,9 @@ from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff from erpnext.utilities.doctype.address.address import get_address_display from erpnext.utilities.doctype.contact.contact import get_contact_details +class InvalidCurrency(frappe.ValidationError): pass +class InvalidAccountCurrency(frappe.ValidationError): pass + @frappe.whitelist() def get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None, price_list=None, currency=None, doctype=None): @@ -149,36 +152,52 @@ def validate_accounting_currency(party): if not party.party_account_currency: if party.default_currency: party.party_account_currency = party.default_currency - else: - party.party_account_currency = company_currency + elif len(set(company_currency.values())) == 1: + party.party_account_currency = company_currency.values()[0] party_account_currency_in_db = frappe.db.get_value(party.doctype, party.name, "party_account_currency") - if party_account_currency_in_db and party_account_currency_in_db != party.party_account_currency: + if party_account_currency_in_db != party.party_account_currency: existing_gle = frappe.db.get_value("GL Entry", {"party_type": party.doctype, "party": party.name}, ["name", "account_currency"], as_dict=1) if existing_gle: - frappe.throw(_("Accounting Currency cannot be changed, as GL Entry exists for this {0}") - .format(party.doctype)) + if party_account_currency_in_db: + frappe.throw(_("Accounting Currency cannot be changed, as GL Entry exists for this {0}") + .format(party.doctype), InvalidCurrency) + else: + party.party_account_currency = existing_gle.account_currency def validate_party_account(party): company_currency = get_company_currency() - - if party.party_account_currency != company_currency: - party_account_defined_for_companies = [d.company for d in party.get("accounts")] - all_companies = [d.name for d in frappe.get_list("Company")] - party_account_required_for_companies = list(set(all_companies) - set(party_account_defined_for_companies)) + if party.party_account_currency: + companies_with_different_currency = [] + for company, currency in company_currency.items(): + if currency != party.party_account_currency: + companies_with_different_currency.append(company) - if party_account_required_for_companies: + for d in party.get("accounts"): + if d.company in companies_with_different_currency: + companies_with_different_currency.remove(d.company) + + selected_account_currency = frappe.db.get_value("Account", d.account, "account_currency") + if selected_account_currency != party.party_account_currency: + frappe.throw(_("Account {0} is invalid, account currency must be {1}") + .format(d.account, selected_account_currency), InvalidAccountCurrency) + + if companies_with_different_currency: frappe.msgprint(_("Please mention Default {0} Account for the following companies, as accounting currency is different from company's default currency: {1}") .format( "Receivable" if party.doctype=="Customer" else "Payable", - "\n" + "\n".join(party_account_required_for_companies) + "\n" + "\n".join(companies_with_different_currency) ) ) def get_company_currency(): - return frappe.db.sql("select default_currency from tabCompany limit 1")[0][0] + company_currency = frappe._dict() + for d in frappe.get_all("Company", fields=["name", "default_currency"]): + company_currency.setdefault(d.name, d.default_currency) + + return company_currency @frappe.whitelist() def get_party_account(company, party, party_type): diff --git a/erpnext/buying/doctype/supplier/test_records.json b/erpnext/buying/doctype/supplier/test_records.json index 82e0a447bb7..6d01dffb614 100644 --- a/erpnext/buying/doctype/supplier/test_records.json +++ b/erpnext/buying/doctype/supplier/test_records.json @@ -13,7 +13,7 @@ "doctype": "Supplier", "supplier_name": "_Test Supplier USD", "supplier_type": "_Test Supplier Type", - "default_currency": "USD", + "party_account_currency": "USD", "accounts": [{ "company": "_Test Company", "account": "_Test Payable USD - _TC" diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js index ab23d73ae8c..9325e72ae7d 100644 --- a/erpnext/selling/doctype/customer/customer.js +++ b/erpnext/selling/doctype/customer/customer.js @@ -100,11 +100,17 @@ cur_frm.fields_dict['default_price_list'].get_query = function(doc, cdt, cdn) { cur_frm.fields_dict['accounts'].grid.get_field('account').get_query = function(doc, cdt, cdn) { var d = locals[cdt][cdn]; + var filters = { + 'account_type': 'Receivable', + 'company': d.company, + "is_group": 0 + }; + + if(doc.party_account_currency) { + $.extend(filters, {"account_currency": doc.party_account_currency}); + } + return { - filters: { - 'account_type': 'Receivable', - 'company': d.company, - "is_group": 0 - } + filters: filters } } diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index dca4bb76fb8..a0a1501a467 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -8,6 +8,8 @@ import unittest from frappe.test_runner import make_test_records from erpnext.controllers.accounts_controller import CustomerFrozen +from erpnext.accounts.party import InvalidCurrency +from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice test_ignore = ["Price List"] @@ -77,4 +79,14 @@ class TestCustomer(unittest.TestCase): frappe.db.set_value("Customer", "_Test Customer", "is_frozen", 0) - so.save() \ No newline at end of file + so.save() + + def test_multi_currency(self): + customer = frappe.get_doc("Customer", "_Test Customer USD") + + create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC", + currency="USD", conversion_rate=50) + + customer.party_account_currency = "EUR" + self.assertRaises(InvalidCurrency, customer.save) + \ No newline at end of file diff --git a/erpnext/selling/doctype/customer/test_records.json b/erpnext/selling/doctype/customer/test_records.json index 5c0bbd92463..060633ec4f6 100644 --- a/erpnext/selling/doctype/customer/test_records.json +++ b/erpnext/selling/doctype/customer/test_records.json @@ -33,7 +33,7 @@ "customer_type": "Individual", "doctype": "Customer", "territory": "_Test Territory", - "default_currency": "USD", + "party_account_currency": "USD", "accounts": [{ "company": "_Test Company", "account": "_Test Receivable USD - _TC" diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 72c6cdd52b5..804dc4deb93 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -52,15 +52,7 @@ class Company(Document): if self.default_currency and self.previous_default_currency and \ self.default_currency != self.previous_default_currency and \ self.check_if_transactions_exist(): - frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.")) - - if self.default_currency: - currency_in_other_companies = frappe.db.sql("""select default_currency from tabCompany - where name!=%s limit 1""", self.name) - - if currency_in_other_companies and self.default_currency != currency_in_other_companies[0][0]: - frappe.throw(_("Currency must be same for all Companies")) - + frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.")) def on_update(self): if not frappe.db.sql("""select name from tabAccount From 34fe81f7eb159b8d013fd2d13aa9f7eb6c34a5cf Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 3 Sep 2015 19:18:00 +0530 Subject: [PATCH 25/38] Patch fixed --- erpnext/accounts/party.py | 2 +- erpnext/patches/v6_0/multi_currency.py | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 09f9b6ab236..4f49bc07fd6 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -178,7 +178,7 @@ def validate_party_account(party): for d in party.get("accounts"): if d.company in companies_with_different_currency: companies_with_different_currency.remove(d.company) - + selected_account_currency = frappe.db.get_value("Account", d.account, "account_currency") if selected_account_currency != party.party_account_currency: frappe.throw(_("Account {0} is invalid, account currency must be {1}") diff --git a/erpnext/patches/v6_0/multi_currency.py b/erpnext/patches/v6_0/multi_currency.py index 0441c4a776d..793a0c21700 100644 --- a/erpnext/patches/v6_0/multi_currency.py +++ b/erpnext/patches/v6_0/multi_currency.py @@ -65,7 +65,7 @@ def execute(): # Set party account if default currency of party other than company's default currency for dt in ("Customer", "Supplier"): - parties = frappe.get_all(dt, ["name", "default_currency"]) + parties = frappe.get_all(dt) for p in parties: # Get party GL Entries party_gle = frappe.db.get_value("GL Entry", {"party_type": dt, "party": p.name, @@ -73,15 +73,13 @@ def execute(): party = frappe.get_doc(dt, p.name) - # set default currency and party account currency - if not party.default_currency: - party.default_currency = company.default_currency - - party.party_account_currency = company.default_currency if party_gle else party.default_currency + # set party account currency + if party_gle or not party.party_account_currency: + party.party_account_currency = company.default_currency # Add default receivable /payable account if not exists # and currency is other than company currency - if party.default_currency != company.default_currency: + if party.party_account_currency and party.party_account_currency != company.default_currency: party_account_exists = False for d in party.get("accounts"): if d.company == company.name: From c0e3b1a0c72d86e6851641e50fd44c9258cf4122 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 4 Sep 2015 13:26:23 +0530 Subject: [PATCH 26/38] Removed account and party balance in company currency from Journal Entry --- .../doctype/journal_entry/journal_entry.js | 3 +- .../journal_entry_account.json | 50 +------------------ erpnext/accounts/utils.py | 14 ++++-- 3 files changed, 12 insertions(+), 55 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index adf4c20c294..44acab52376 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -29,8 +29,7 @@ frappe.ui.form.on("Journal Entry", { }) erpnext.journal_entry.toggle_fields_based_on_currency = function(frm) { - var fields = ["balance_in_account_currency", "party_balance_in_account_currency", - "debit_in_account_currency", "credit_in_account_currency"]; + var fields = ["debit_in_account_currency", "credit_in_account_currency"]; var company_currency = erpnext.get_currency(frm.doc.company); 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 c866181446e..85f410982cf 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -71,31 +71,8 @@ "no_copy": 1, "oldfieldname": "balance", "oldfieldtype": "Data", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "balance_in_account_currency", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Balance in Account Currency", - "no_copy": 1, "options": "account_currency", "permlevel": 0, - "precision": "", "print_hide": 1, "read_only": 1, "report_hide": 0, @@ -208,33 +185,10 @@ "in_list_view": 0, "label": "Party Balance", "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "party_balance_in_account_currency", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Party Balance in Account Currency", - "no_copy": 1, "options": "account_currency", "permlevel": 0, "precision": "", - "print_hide": 1, + "print_hide": 0, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -520,7 +474,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-31 17:50:04.145031", + "modified": "2015-09-04 03:29:37.127968", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 51c79160c7a..f0f096e9c37 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -50,7 +50,7 @@ def validate_fiscal_year(date, fiscal_year, label=_("Date"), doc=None): throw(_("{0} '{1}' not in Fiscal Year {2}").format(label, formatdate(date), fiscal_year)) @frappe.whitelist() -def get_balance_on(account=None, date=None, party_type=None, party=None): +def get_balance_on(account=None, date=None, party_type=None, party=None, in_account_currency=True): if not account and frappe.form_dict.get("account"): account = frappe.form_dict.get("account") if not date and frappe.form_dict.get("date"): @@ -102,10 +102,14 @@ def get_balance_on(account=None, date=None, party_type=None, party=None): (party_type.replace('"', '\\"'), party.replace('"', '\\"'))) if account or (party_type and party): + if in_account_currency: + select_field = "sum(ifnull(debit_in_account_currency, 0)) - sum(ifnull(credit_in_account_currency, 0))" + else: + select_field = "sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))" bal = frappe.db.sql(""" - SELECT sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)) + SELECT {0} FROM `tabGL Entry` gle - WHERE %s""" % " and ".join(cond))[0][0] + WHERE {1}""".format(select_field, " and ".join(cond)))[0][0] # if bal is None, return 0 return flt(bal) @@ -273,7 +277,7 @@ def get_stock_and_account_difference(account_list=None, posting_date=None): and name in (%s)""" % ', '.join(['%s']*len(account_list)), account_list)) for account, warehouse in account_warehouse.items(): - account_balance = get_balance_on(account, posting_date) + account_balance = get_balance_on(account, posting_date, in_account_currency=False) stock_value = get_stock_value_on(warehouse, posting_date) if abs(flt(stock_value) - flt(account_balance)) > 0.005: difference.setdefault(account, flt(stock_value) - flt(account_balance)) @@ -378,7 +382,7 @@ def get_stock_rbnb_difference(posting_date, company): # Balance as per system stock_rbnb_account = "Stock Received But Not Billed - " + frappe.db.get_value("Company", company, "abbr") - sys_bal = get_balance_on(stock_rbnb_account, posting_date) + sys_bal = get_balance_on(stock_rbnb_account, posting_date, in_account_currency=False) # Amount should be credited return flt(stock_rbnb) + flt(sys_bal) From 4d62d7867e95429c30cb3a96ca2492655ac964e8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 4 Sep 2015 13:26:45 +0530 Subject: [PATCH 27/38] [report] Bank Reconciliation Statement in account currency --- .../bank_reconciliation_statement.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py index e592f69700d..7016c4690b3 100644 --- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py +++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py @@ -23,7 +23,8 @@ def execute(filters=None): total_debit += flt(d[2]) total_credit += flt(d[3]) - amounts_not_reflected_in_system = frappe.db.sql("""select sum(ifnull(jvd.debit, 0) - ifnull(jvd.credit, 0)) + amounts_not_reflected_in_system = frappe.db.sql(""" + select sum(ifnull(jvd.debit_in_account_currency, 0) - ifnull(jvd.credit_in_account_currency, 0)) from `tabJournal Entry Account` jvd, `tabJournal Entry` jv where jvd.parent = jv.name and jv.docstatus=1 and jvd.account=%s and jv.posting_date > %s and jv.clearance_date <= %s and ifnull(jv.is_opening, 'No') = 'No' @@ -38,7 +39,7 @@ def execute(filters=None): data += [ get_balance_row(_("System Balance"), balance_as_per_system), [""]*len(columns), - ["", '"' + _("Amounts not reflected in bank") + '"', total_debit, total_credit, "", "", "", ""], + ["", '"' + _("Amounts not reflected in bank") + '"', total_debit, total_credit, "", "", "", "", ""], get_balance_row(_("Amounts not reflected in system"), amounts_not_reflected_in_system), [""]*len(columns), get_balance_row(_("Expected balance as per bank"), bank_bal) @@ -49,13 +50,14 @@ def execute(filters=None): def get_columns(): return [_("Posting Date") + ":Date:100", _("Journal Entry") + ":Link/Journal Entry:220", _("Debit") + ":Currency:120", _("Credit") + ":Currency:120", - _("Against Account") + ":Link/Account:200", _("Reference") + "::100", _("Ref Date") + ":Date:110", _("Clearance Date") + ":Date:110" + _("Against Account") + ":Link/Account:200", _("Reference") + "::100", + _("Ref Date") + ":Date:110", _("Clearance Date") + ":Date:110", _("Currency") + ":Link/Currency:70" ] def get_entries(filters): entries = frappe.db.sql("""select - jv.posting_date, jv.name, jvd.debit, jvd.credit, - jvd.against_account, jv.cheque_no, jv.cheque_date, jv.clearance_date + jv.posting_date, jv.name, jvd.debit_in_account_currency, jvd.credit_in_account_currency, + jvd.against_account, jv.cheque_no, jv.cheque_date, jv.clearance_date, jvd.account_currency from `tabJournal Entry Account` jvd, `tabJournal Entry` jv where jvd.parent = jv.name and jv.docstatus=1 @@ -68,6 +70,6 @@ def get_entries(filters): def get_balance_row(label, amount): if amount > 0: - return ["", '"' + label + '"', amount, 0, "", "", "", ""] + return ["", '"' + label + '"', amount, 0, "", "", "", "", ""] else: - return ["", '"' + label + '"', 0, abs(amount), "", "", "", ""] + return ["", '"' + label + '"', 0, abs(amount), "", "", "", "", ""] From 3a53d49b7e00cc1646a67b070aabeb29c013fb63 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 4 Sep 2015 15:46:47 +0530 Subject: [PATCH 28/38] [fix] Set account and party balance in Journal Entry --- erpnext/accounts/doctype/journal_entry/journal_entry.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 58464dcd423..1070fb7233e 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -36,6 +36,7 @@ class JournalEntry(AccountsController): self.validate_expense_claim() self.validate_credit_debit_note() self.validate_empty_accounts_table() + self.set_account_and_party_balance() self.set_title() def on_submit(self): @@ -451,6 +452,11 @@ class JournalEntry(AccountsController): def validate_empty_accounts_table(self): if not self.get('accounts'): frappe.throw("Accounts table cannot be blank.") + + def set_account_and_party_balance(self): + for d in self.get("accounts"): + d.account_balance = get_balance_on(account=d.account, date=self.posting_date) + d.party_balance = get_balance_on(party_type=d.party_type, party=d.party, date=self.posting_date) @frappe.whitelist() def get_default_bank_cash_account(company, voucher_type, mode_of_payment=None): From 216aaaf1d6bcf93ac861a7c2a91fc7b45f28fe9d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 4 Sep 2015 16:41:04 +0530 Subject: [PATCH 29/38] Set currency and exchange rate based on Customer's currency while making Quotation from Opportunity --- erpnext/crm/doctype/opportunity/opportunity.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index 78729a3bcbb..5cf96e99044 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -6,6 +6,7 @@ import frappe, json from frappe.utils import cstr, cint from frappe import msgprint, _ from frappe.model.mapper import get_mapped_doc +from erpnext.setup.utils import get_exchange_rate from erpnext.utilities.transaction_base import TransactionBase @@ -179,7 +180,17 @@ def get_item_details(item_code): def make_quotation(source_name, target_doc=None): def set_missing_values(source, target): quotation = frappe.get_doc(target) - quotation.currency = None # set it as default from customer + + company_currency = frappe.db.get_value("Company", quotation.company, "default_currency") + party_account_currency = frappe.db.get_value("Customer", quotation.customer, "party_account_currency") + if company_currency == party_account_currency: + exchange_rate = 1 + else: + exchange_rate = get_exchange_rate(party_account_currency, company_currency) + + quotation.currency = party_account_currency or company_currency + quotation.conversion_rate = exchange_rate + quotation.run_method("set_missing_values") quotation.run_method("calculate_taxes_and_totals") From bf9691ed398b7c7b5491cf078fdae6921c5905fc Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 7 Sep 2015 10:40:48 +0530 Subject: [PATCH 30/38] Multiple fixes --- .../chart_of_accounts/chart_of_accounts.py | 3 +- erpnext/accounts/doctype/gl_entry/gl_entry.py | 2 +- .../doctype/journal_entry/journal_entry.py | 89 +++++++++++++------ 3 files changed, 67 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py index ce3a7fddb75..bfb5240fa82 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py +++ b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py @@ -36,7 +36,8 @@ def create_charts(chart_name, company): "is_group": is_group, "root_type": root_type, "report_type": report_type, - "account_type": child.get("account_type") + "account_type": child.get("account_type"), + "account_currency": frappe.db.get_value("Company", company, "default_currency") }) if root_account: diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index fe49163f269..ac54aa6528f 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -116,7 +116,7 @@ class GLEntry(Document): if self.party_type and self.party: party_account_currency = frappe.db.get_value(self.party_type, self.party, "party_account_currency") \ or company_currency - + if party_account_currency != self.account_currency: frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}") .format(self.party_type, self.party, party_account_currency), InvalidAccountCurrency) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 1070fb7233e..4640b103d79 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -146,6 +146,7 @@ class JournalEntry(AccountsController): self.reference_totals = {} self.reference_types = {} + self.reference_parties = {} for d in self.get("accounts"): if not d.reference_type: @@ -153,8 +154,8 @@ class JournalEntry(AccountsController): if not d.reference_name: d.reference_type = None if d.reference_type and d.reference_name and (d.reference_type in field_dict.keys()): - dr_or_cr = "credit" if d.reference_type in ("Sales Order", "Sales Invoice") \ - else "debit" + dr_or_cr = "credit_in_account_currency" \ + if d.reference_type in ("Sales Order", "Sales Invoice") else "debit_in_account_currency" # check debit or credit type Sales / Purchase Order if d.reference_type=="Sales Order" and flt(d.debit) > 0: @@ -168,6 +169,8 @@ class JournalEntry(AccountsController): self.reference_totals[d.reference_name] = 0.0 self.reference_totals[d.reference_name] += flt(d.get(dr_or_cr)) self.reference_types[d.reference_name] = d.reference_type + if d.party_type and d.party: + self.reference_parties[d.reference_name] = [d.party_type, d.party] against_voucher = frappe.db.get_value(d.reference_type, d.reference_name, [scrub(dt) for dt in field_dict.get(d.reference_type)]) @@ -193,23 +196,31 @@ class JournalEntry(AccountsController): """Validate totals, stopped and docstatus for orders""" for reference_name, total in self.reference_totals.iteritems(): reference_type = self.reference_types[reference_name] + party_type, party = self.reference_parties.get(reference_name) if reference_type in ("Sales Order", "Purchase Order"): - voucher_properties = frappe.db.get_value(reference_type, reference_name, - ["docstatus", "per_billed", "status", "advance_paid", "base_grand_total"]) + voucher_properties = frappe.db.get_value(reference_type, reference_name, + ["docstatus", "per_billed", "status", "advance_paid", + "base_grand_total", "grand_total", "currency"], as_dict=1) - if voucher_properties[0] != 1: + if voucher_properties.docstatus != 1: frappe.throw(_("{0} {1} is not submitted").format(reference_type, reference_name)) - if flt(voucher_properties[1]) >= 100: + if flt(voucher_properties.per_billed) >= 100: frappe.throw(_("{0} {1} is fully billed").format(reference_type, reference_name)) - if cstr(voucher_properties[2]) == "Stopped": + if cstr(voucher_properties.status) == "Stopped": frappe.throw(_("{0} {1} is stopped").format(reference_type, reference_name)) - - if flt(voucher_properties[4]) < (flt(voucher_properties[3]) + total): + + party_account_currency = frappe.db.get_value(party_type, party, "party_account_currency") + if party_account_currency == self.company_currency: + voucher_total = voucher_properties.base_grand_total + else: + voucher_total = voucher_properties.grand_total + + if flt(voucher_total) < (flt(voucher_properties.advance_paid) + total): frappe.throw(_("Advance paid against {0} {1} cannot be greater \ - than Grand Total {2}").format(reference_type, reference_name, voucher_properties[4])) + than Grand Total {2}").format(reference_type, reference_name, voucher_total)) def validate_invoices(self): """Validate totals and docstatus for invoices""" @@ -218,14 +229,14 @@ class JournalEntry(AccountsController): if reference_type in ("Sales Invoice", "Purchase Invoice"): voucher_properties = frappe.db.get_value(reference_type, reference_name, - ["docstatus", "outstanding_amount"]) + ["docstatus", "outstanding_amount"], as_dict=1) - if voucher_properties[0] != 1: + if voucher_properties.docstatus != 1: frappe.throw(_("{0} {1} is not submitted").format(reference_type, reference_name)) - if total and flt(voucher_properties[1]) < total: - frappe.throw(_("Payment against {0} {1} cannot be greater \ - than Outstanding Amount {2}").format(reference_type, reference_name, voucher_properties[1])) + if total and flt(voucher_properties.outstanding_amount) < total: + frappe.throw(_("Payment against {0} {1} cannot be greater than Outstanding Amount {2}") + .format(reference_type, reference_name, voucher_properties.outstanding_amount)) def set_against_account(self): accounts_debited, accounts_credited = [], [] @@ -239,7 +250,6 @@ class JournalEntry(AccountsController): def validate_debit_and_credit(self): self.total_debit, self.total_credit, self.difference = 0, 0, 0 - for d in self.get("accounts"): if d.debit and d.credit: frappe.throw(_("You cannot credit and debit same account at the same time")) @@ -262,12 +272,16 @@ class JournalEntry(AccountsController): if d.account_currency!=self.company_currency and d.account_currency not in alternate_currency: alternate_currency.append(d.account_currency) - if alternate_currency: - if not self.exchange_rate: - frappe.throw(_("Exchange Rate is mandatory in multi-currency Journal Entry")) - + if alternate_currency: if len(alternate_currency) > 1: frappe.throw(_("Only one alternate currency can be used in a single Journal Entry")) + + if not self.exchange_rate: + self.exchange_rate = get_exchange_rate(alternate_currency[0], self.company_currency) + + if not self.exchange_rate: + frappe.throw(_("Exchange Rate is mandatory in multi-currency Journal Entry")) + else: self.exchange_rate = 1.0 @@ -479,7 +493,8 @@ def get_default_bank_cash_account(company, voucher_type, mode_of_payment=None): if account: return { "account": account, - "balance": get_balance_on(account) + "balance": get_balance_on(account), + "account_currency": frappe.db.get_value("Account", account, "account_currency") } @frappe.whitelist() @@ -487,11 +502,20 @@ def get_payment_entry_from_sales_invoice(sales_invoice): """Returns new Journal Entry document as dict for given Sales Invoice""" from erpnext.accounts.utils import get_balance_on si = frappe.get_doc("Sales Invoice", sales_invoice) + + # exchange rate + if si.company_currency == si.party_account_currency: + exchange_rate = 1 + else: + exchange_rate = get_exchange_rate(si.party_account_currency, si.company_currency) + jv = get_payment_entry(si) jv.remark = 'Payment received against Sales Invoice {0}. {1}'.format(si.name, si.remarks) - + jv.exchange_rate = exchange_rate + # credit customer jv.get("accounts")[0].account = si.debit_to + jv.get("accounts")[0].account_currency = si.party_account_currency jv.get("accounts")[0].party_type = "Customer" jv.get("accounts")[0].party = si.customer jv.get("accounts")[0].balance = get_balance_on(si.debit_to) @@ -501,7 +525,10 @@ def get_payment_entry_from_sales_invoice(sales_invoice): jv.get("accounts")[0].reference_name = si.name # debit bank - jv.get("accounts")[1].debit_in_account_currency = si.outstanding_amount + if jv.get("accounts")[1].account_currency == si.party_account_currency: + jv.get("accounts")[1].debit_in_account_currency = si.outstanding_amount + else: + jv.get("accounts")[1].debit_in_account_currency = si.outstanding_amount * exchange_rate return jv.as_dict() @@ -509,11 +536,19 @@ def get_payment_entry_from_sales_invoice(sales_invoice): def get_payment_entry_from_purchase_invoice(purchase_invoice): """Returns new Journal Entry document as dict for given Purchase Invoice""" pi = frappe.get_doc("Purchase Invoice", purchase_invoice) + + if pi.company_currency == pi.party_account_currency: + exchange_rate = 1 + else: + exchange_rate = get_exchange_rate(pi.party_account_currency, pi.company_currency) + jv = get_payment_entry(pi) jv.remark = 'Payment against Purchase Invoice {0}. {1}'.format(pi.name, pi.remarks) - + jv.exchange_rate = exchange_rate + # credit supplier jv.get("accounts")[0].account = pi.credit_to + jv.get("accounts")[0].account_currency = pi.party_account_currency jv.get("accounts")[0].party_type = "Supplier" jv.get("accounts")[0].party = pi.supplier jv.get("accounts")[0].balance = get_balance_on(pi.credit_to) @@ -523,7 +558,10 @@ def get_payment_entry_from_purchase_invoice(purchase_invoice): jv.get("accounts")[0].reference_name = pi.name # credit bank - jv.get("accounts")[1].credit_in_account_currency = pi.outstanding_amount + if jv.get("accounts")[1].account_currency == pi.party_account_currency: + jv.get("accounts")[1].credit_in_account_currency = pi.outstanding_amount + else: + jv.get("accounts")[1].credit_in_account_currency = pi.outstanding_amount * exchange_rate return jv.as_dict() @@ -618,6 +656,7 @@ def get_payment_entry(doc): if bank_account: d2.account = bank_account["account"] d2.balance = bank_account["balance"] + d2.account_currency = bank_account["account_currency"] return jv From b2739cbb79967b72178cc2bfb5f24512b467183b Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 8 Sep 2015 12:18:45 +0530 Subject: [PATCH 31/38] Get average exchange rate in case of bank transfer --- .../doctype/journal_entry/journal_entry.js | 3 +- .../doctype/journal_entry/journal_entry.py | 40 ++++++++++++++----- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 44acab52376..34892c54e70 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -316,7 +316,8 @@ frappe.ui.form.on("Journal Entry Account", { args: { account: d.account, date: frm.doc.posting_date, - company: frm.doc.company + company: frm.doc.company, + credited: flt(d.credit_in_account_currency) > 0 ? true : false }, callback: function(r) { if(r.message) { diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 4640b103d79..06fe1a3a19d 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -276,12 +276,10 @@ class JournalEntry(AccountsController): if len(alternate_currency) > 1: frappe.throw(_("Only one alternate currency can be used in a single Journal Entry")) - if not self.exchange_rate: - self.exchange_rate = get_exchange_rate(alternate_currency[0], self.company_currency) - + self.set_exchange_rate() + if not self.exchange_rate: frappe.throw(_("Exchange Rate is mandatory in multi-currency Journal Entry")) - else: self.exchange_rate = 1.0 @@ -290,7 +288,18 @@ class JournalEntry(AccountsController): 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")) - + + def set_exchange_rate(self): + for d in self.get("accounts"): + if d.account_currency != self.company_currency: + account_type = frappe.db.get_value("Account", d.account, "account_type") + if account_type == "Bank" and flt(d.credit_in_account_currency) > 0: + self.exchange_rate = get_average_exchange_rate(d.account) + break + if not self.exchange_rate: + self.exchange_rate = get_exchange_rate(d.account_currency, self.company_currency) + + def create_remarks(self): r = [] @@ -723,7 +732,7 @@ def get_party_account_and_balance(company, party_type, party): } @frappe.whitelist() -def get_account_balance_and_party_type(account, date, company): +def get_account_balance_and_party_type(account, date, company, credited=False): """Returns dict of account balance and party type to be set in Journal Entry on selection of account.""" if not frappe.has_permission("Account"): frappe.msgprint(_("No Permission"), raise_exception=1) @@ -740,11 +749,24 @@ def get_account_balance_and_party_type(account, date, company): exchange_rate = None if account_details.account_currency != company_currency: - exchange_rate = get_exchange_rate(account_details.account_currency, company_currency) - + if account_details.account_type == "Bank" and credited: + exchange_rate = get_average_exchange_rate(account) + else: + exchange_rate = get_exchange_rate(account_details.account_currency, company_currency) + grid_values = { "balance": get_balance_on(account, date), "party_type": party_type, "account_currency": account_details.account_currency or company_currency, } - return grid_values, exchange_rate \ No newline at end of file + return grid_values, exchange_rate + +def get_average_exchange_rate(account): + exchange_rate = 0 + bank_balance_in_account_currency = get_balance_on(account) + if bank_balance_in_account_currency: + bank_balance_in_company_currency = get_balance_on(account, in_account_currency=False) + exchange_rate = bank_balance_in_company_currency / bank_balance_in_account_currency + + return exchange_rate + \ No newline at end of file From d608363d7b998db683c32d7d8d3184a8379d47a5 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 8 Sep 2015 12:53:59 +0530 Subject: [PATCH 32/38] [fix] Map amount in advance payment entry agaionst SO/PO based on party account currency --- .../doctype/journal_entry/journal_entry.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 06fe1a3a19d..3db1820cbfa 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -587,11 +587,18 @@ def get_payment_entry_from_sales_order(sales_order): 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") party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") company_currency = get_company_currency(so.company) + if so.company_currency == party_account_currency: + exchange_rate = 1 + else: + exchange_rate = get_exchange_rate(party_account_currency, so.company_currency) + + jv.exchange_rate = exchange_rate + if party_account_currency == company_currency: amount = flt(so.base_grand_total) - flt(so.advance_paid) else: @@ -599,6 +606,7 @@ def get_payment_entry_from_sales_order(sales_order): # credit customer jv.get("accounts")[0].account = party_account + jv.get("accounts")[0].account_currency = party_account_currency jv.get("accounts")[0].party_type = "Customer" jv.get("accounts")[0].party = so.customer jv.get("accounts")[0].balance = get_balance_on(party_account) @@ -609,7 +617,10 @@ def get_payment_entry_from_sales_order(sales_order): jv.get("accounts")[0].is_advance = "Yes" # debit bank - jv.get("accounts")[1].debit_in_account_currency = amount + if jv.get("accounts")[1].account_currency == party_account_currency: + jv.get("accounts")[1].debit_in_account_currency = amount + else: + jv.get("accounts")[1].debit_in_account_currency = amount * exchange_rate return jv.as_dict() @@ -630,6 +641,13 @@ def get_payment_entry_from_purchase_order(purchase_order): party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") company_currency = get_company_currency(po.company) + if po.company_currency == party_account_currency: + exchange_rate = 1 + else: + exchange_rate = get_exchange_rate(party_account_currency, po.company_currency) + + jv.exchange_rate = exchange_rate + if party_account_currency == company_currency: amount = flt(po.base_grand_total) - flt(po.advance_paid) else: @@ -647,7 +665,10 @@ def get_payment_entry_from_purchase_order(purchase_order): jv.get("accounts")[0].is_advance = "Yes" # debit bank - jv.get("accounts")[1].credit_in_account_currency = amount + if jv.get("accounts")[1].account_currency == party_account_currency: + jv.get("accounts")[1].credit_in_account_currency = amount + else: + jv.get("accounts")[1].credit_in_account_currency = amount * exchange_rate return jv.as_dict() From e3ae05aabd6eb2ce3b0b89776164436bd6db2bf1 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 9 Sep 2015 18:43:12 +0530 Subject: [PATCH 33/38] Multi-currency: Exchange Rate in Journal Entry --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 7 +- .../doctype/journal_entry/journal_entry.js | 168 ++++++---- .../doctype/journal_entry/journal_entry.json | 46 +-- .../doctype/journal_entry/journal_entry.py | 312 ++++++++++-------- .../journal_entry/test_journal_entry.py | 5 +- .../journal_entry_account.json | 103 +++++- .../purchase_invoice/purchase_invoice.py | 2 +- .../purchase_invoice/test_purchase_invoice.py | 3 +- .../purchase_invoice/test_records.json | 3 + .../doctype/sales_invoice/sales_invoice.py | 2 +- .../sales_invoice/test_sales_invoice.py | 2 +- erpnext/accounts/utils.py | 17 +- erpnext/controllers/accounts_controller.py | 4 +- erpnext/patches/v6_0/multi_currency.py | 28 +- 14 files changed, 456 insertions(+), 246 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index f89fb62bf52..dbaf5901daf 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -153,17 +153,18 @@ def update_outstanding_amt(account, party_type, party, against_voucher_type, aga party_condition = "" # get final outstanding amt - bal = flt(frappe.db.sql("""select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)) + bal = flt(frappe.db.sql(""" + select sum(ifnull(debit_in_account_currency, 0)) - sum(ifnull(credit_in_account_currency, 0)) from `tabGL Entry` where against_voucher_type=%s and against_voucher=%s and account = %s {0}""".format(party_condition), (against_voucher_type, against_voucher, account))[0][0] or 0.0) - + if against_voucher_type == 'Purchase Invoice': bal = -bal elif against_voucher_type == "Journal Entry": against_voucher_amount = flt(frappe.db.sql(""" - select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)) + select sum(ifnull(debit_in_account_currency, 0)) - sum(ifnull(credit_in_account_currency, 0)) from `tabGL Entry` where voucher_type = 'Journal Entry' and voucher_no = %s and account = %s and ifnull(against_voucher, '') = '' {0}""" .format(party_condition), (against_voucher, account))[0][0]) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 4ed404337c2..246c410fcc8 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -25,16 +25,29 @@ frappe.ui.form.on("Journal Entry", { // hide /unhide fields based on currency erpnext.journal_entry.toggle_fields_based_on_currency(frm); + }, + + multi_currency: function(frm) { + erpnext.journal_entry.toggle_fields_based_on_currency(frm); } }) erpnext.journal_entry.toggle_fields_based_on_currency = function(frm) { - var fields = ["debit_in_account_currency", "credit_in_account_currency"]; - - var company_currency = erpnext.get_currency(frm.doc.company); - + var fields = ["currency_section", "account_currency", "exchange_rate", "debit", "credit"]; + var grid = frm.get_field("accounts").grid; - grid.set_column_disp(fields, grid.account_currency!=company_currency); + if(grid) grid.set_column_disp(fields, frm.doc.multi_currency); + + // dynamic label + var field_label_map = { + "debit_in_account_currency": "Debit", + "credit_in_account_currency": "Credit" + }; + + $.each(field_label_map, function (fieldname, label) { + var df = frappe.meta.get_docfield("Journal Entry Account", fieldname, frm.doc.name); + df.label = frm.doc.multi_currency ? (label + " in Account Currency") : label; + }) } erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ @@ -62,17 +75,26 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ setup_queries: function() { var me = this; - - $.each(["account", "cost_center"], function(i, fieldname) { - me.frm.set_query(fieldname, "accounts", function() { - frappe.model.validate_missing(me.frm.doc, "company"); - return { - filters: { - company: me.frm.doc.company, - is_group: 0 - } - }; - }); + var company_currency = erpnext.get_currency(me.frm.doc.company); + + me.frm.set_query("account", "accounts", function(doc, cdt, cdn) { + var filters = { + company: me.frm.doc.company, + is_group: 0 + }; + if(!doc.multi_currency) { + $.extend(filters, {currency: company_currency}); + } + return { filters: filters }; + }); + + me.frm.set_query("cost_center", "accounts", function(doc, cdt, cdn) { + return { + filters: { + company: me.frm.doc.company, + is_group: 0 + } + }; }); me.frm.set_query("party_type", "accounts", function(doc, cdt, cdn) { @@ -151,32 +173,39 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ reference_name: function(doc, cdt, cdn) { var d = frappe.get_doc(cdt, cdn); - if (d.reference_type==="Purchase Invoice" && !flt(d.debit)) { - this.get_outstanding('Purchase Invoice', d.reference_name, d); - } - if (d.reference_type==="Sales Invoice" && !flt(d.credit)) { - this.get_outstanding('Sales Invoice', d.reference_name, d); - } - if (d.reference_type==="Journal Entry" && !flt(d.credit) && !flt(d.debit)) { - this.get_outstanding('Journal Entry', d.reference_name, d); + if(d.reference_name) { + if (d.reference_type==="Purchase Invoice" && !flt(d.debit)) { + this.get_outstanding('Purchase Invoice', d.reference_name, doc.company, d); + } + if (d.reference_type==="Sales Invoice" && !flt(d.credit)) { + this.get_outstanding('Sales Invoice', d.reference_name, doc.company, d); + } + if (d.reference_type==="Journal Entry" && !flt(d.credit) && !flt(d.debit)) { + this.get_outstanding('Journal Entry', d.reference_name, doc.company, d); + } } }, - get_outstanding: function(doctype, docname, child) { + get_outstanding: function(doctype, docname, company, child) { var me = this; var args = { "doctype": doctype, "docname": docname, "party": child.party, - "account": child.account + "account": child.account, + "account_currency": child.account_currency, + "company": company } - return this.frm.call({ - child: child, - method: "get_outstanding", + return frappe.call({ + method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_outstanding", args: { args: args}, callback: function(r) { - cur_frm.cscript.update_totals(me.frm.doc); + if(r.message) { + $.each(r.message, function(field, value) { + frappe.model.set_value(child.doctype, child.name, field, value); + }) + } } }); }, @@ -325,42 +354,26 @@ frappe.ui.form.on("Journal Entry Account", { account: d.account, date: frm.doc.posting_date, company: frm.doc.company, - credited: flt(d.credit_in_account_currency) > 0 ? true : false + debit: flt(d.debit_in_account_currency), + credit: flt(d.credit_in_account_currency), + exchange_rate: d.exchange_rate }, callback: function(r) { if(r.message) { - $.extend(d, r.message[0]); - refresh_field('balance', d.name, 'accounts'); - refresh_field('party_type', 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]) - } + $.extend(d, r.message); + refresh_field('accounts'); } } }); } }, - debit_in_account_currency: function(frm, dt, dn) { - var company_currency = erpnext.get_currency(frm.doc.company); - var row = locals[dt][dn]; - - 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)); + debit_in_account_currency: function(frm, cdt, cdn) { + erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn); }, - credit_in_account_currency: function(frm, dt, dn) { - var company_currency = erpnext.get_currency(frm.doc.company); - var row = locals[dt][dn]; - - 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)); + credit_in_account_currency: function(frm, cdt, cdn) { + erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn); }, debit: function(frm, dt, dn) { @@ -369,9 +382,52 @@ frappe.ui.form.on("Journal Entry Account", { credit: function(frm, dt, dn) { cur_frm.cscript.update_totals(frm.doc); + }, + + exchange_rate: function(frm, cdt, cdn) { + erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn); } }) frappe.ui.form.on("Journal Entry Account", "accounts_remove", function(frm) { cur_frm.cscript.update_totals(frm.doc); -}); \ No newline at end of file +}); + +erpnext.journal_entry.set_debit_credit_in_company_currency = function(frm, cdt, cdn) { + erpnext.journal_entry.set_exchange_rate(frm, cdt, cdn); + + var row = locals[cdt][cdn]; + + frappe.model.set_value(cdt, cdn, "debit", + flt(flt(row.debit_in_account_currency)*row.exchange_rate), precision("debit", row)); + frappe.model.set_value(cdt, cdn, "credit", + flt(flt(row.credit_in_account_currency)*row.exchange_rate), precision("credit", row)); +} + +erpnext.journal_entry.set_exchange_rate = function(frm, cdt, cdn) { + var company_currency = erpnext.get_currency(frm.doc.company); + var row = locals[cdt][cdn]; + + if(row.account_currency == company_currency || !frm.doc.multi_currency) { + frappe.model.set_value(cdt, cdn, "exchange_rate", 1); + } else if (!row.exchange_rate || row.account_type == "Bank") { + frappe.call({ + method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_exchange_rate", + args: { + account: row.account, + account_currency: row.account_currency, + company: frm.doc.company, + reference_type: row.reference_type, + reference_name: row.reference_name, + debit: flt(row.debit_in_account_currency), + credit: flt(row.credit_in_account_currency), + exchange_rate: row.exchange_rate + }, + callback: function(r) { + if(r.message) { + frappe.model.set_value(cdt, cdn, "exchange_rate", r.message); + } + } + }) + } +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index ea632f12660..af49d68f14c 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -147,28 +147,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "exchange_rate", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Exchange Rate", - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -422,6 +400,28 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "multi_currency", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Multi Currency", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1024,7 +1024,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-08-27 16:07:33.265318", + "modified": "2015-09-09 02:07:40.980884", "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 3db1820cbfa..04324c0efd1 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -5,9 +5,9 @@ from __future__ import unicode_literals import frappe 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 from erpnext.accounts.utils import get_balance_on +from erpnext.setup.utils import get_company_currency class JournalEntry(AccountsController): @@ -267,39 +267,37 @@ class JournalEntry(AccountsController): def validate_multi_currency(self): alternate_currency = [] for d in self.get("accounts"): - d.account_currency = frappe.db.get_value("Account", d.account, "account_currency") or self.company_currency + account = frappe.db.get_value("Account", d.account, ["account_currency", "account_type"], as_dict=1) + d.account_currency = account.account_currency or self.company_currency + d.account_type = account.account_type if d.account_currency!=self.company_currency and d.account_currency not in alternate_currency: alternate_currency.append(d.account_currency) - if alternate_currency: + if alternate_currency: + if not self.multi_currency: + frappe.throw(_("Please check Multi Currency option to allow accounts with other currency")) + if len(alternate_currency) > 1: frappe.throw(_("Only one alternate currency can be used in a single Journal Entry")) - - self.set_exchange_rate() - - if not self.exchange_rate: - frappe.throw(_("Exchange Rate is mandatory in multi-currency Journal Entry")) - else: - self.exchange_rate = 1.0 - + + self.set_exchange_rate() + for d in self.get("accounts"): - 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")) - + d.debit = flt(flt(d.debit_in_account_currency)*flt(d.exchange_rate), d.precision("debit")) + d.credit = flt(flt(d.credit_in_account_currency)*flt(d.exchange_rate), d.precision("credit")) + def set_exchange_rate(self): for d in self.get("accounts"): - if d.account_currency != self.company_currency: - account_type = frappe.db.get_value("Account", d.account, "account_type") - if account_type == "Bank" and flt(d.credit_in_account_currency) > 0: - self.exchange_rate = get_average_exchange_rate(d.account) - break - if not self.exchange_rate: - self.exchange_rate = get_exchange_rate(d.account_currency, self.company_currency) - - + if d.account_currency == self.company_currency: + d.exchange_rate = 1 + elif not d.exchange_rate or d.account_type=="Bank" or \ + (d.reference_type in ("Sales Invoice", "Purchase Invoice") and d.reference_name): + d.exchange_rate = get_exchange_rate(d.account, d.account_currency, self.company, + d.reference_type, d.reference_name, d.debit, d.credit, d.exchange_rate) + + if not d.exchange_rate: + frappe.throw(_("Row {0}: Exchange Rate is mandatory").format(d.idx)) def create_remarks(self): r = [] @@ -387,21 +385,21 @@ class JournalEntry(AccountsController): diff = flt(self.difference, self.precision("difference")) # If any row without amount, set the diff on that row - for d in self.get('accounts'): - if not d.credit and not d.debit and diff != 0: - if diff>0: - d.credit = diff - elif diff<0: - d.debit = diff - flag = 1 - - # Set the diff in a new row - if flag == 0 and diff != 0: - jd = self.append('accounts', {}) + if diff: + for d in self.get('accounts'): + if not d.credit_in_account_currency and not d.debit_in_account_currency and diff != 0: + blank_row = d + + if not blank_row: + blank_row = self.append('accounts', {}) + + blank_row.exchange_rate = 1 if diff>0: - jd.credit = abs(diff) + blank_row.credit_in_account_currency = diff + blank_row.credit = diff elif diff<0: - jd.debit = abs(diff) + blank_row.debit_in_account_currency = abs(diff) + blank_row.debit = abs(diff) self.validate_debit_and_credit() @@ -500,10 +498,12 @@ def get_default_bank_cash_account(company, voucher_type, mode_of_payment=None): account = frappe.db.get_value("Account", {"company": company, "account_type": "Cash", "is_group": 0}) if account: + account_details = frappe.db.get_value("Account", account, ["account_currency", "account_type"], as_dict=1) return { "account": account, "balance": get_balance_on(account), - "account_currency": frappe.db.get_value("Account", account, "account_currency") + "account_currency": account_details.account_currency, + "account_type": account_details.account_type } @frappe.whitelist() @@ -513,31 +513,36 @@ def get_payment_entry_from_sales_invoice(sales_invoice): si = frappe.get_doc("Sales Invoice", sales_invoice) # exchange rate - if si.company_currency == si.party_account_currency: - exchange_rate = 1 - else: - exchange_rate = get_exchange_rate(si.party_account_currency, si.company_currency) + exchange_rate = get_exchange_rate(si.debit_to, si.party_account_currency, si.company, + si.doctype, si.name) jv = get_payment_entry(si) jv.remark = 'Payment received against Sales Invoice {0}. {1}'.format(si.name, si.remarks) - jv.exchange_rate = exchange_rate # credit customer - jv.get("accounts")[0].account = si.debit_to - jv.get("accounts")[0].account_currency = si.party_account_currency - jv.get("accounts")[0].party_type = "Customer" - 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_in_account_currency = si.outstanding_amount - jv.get("accounts")[0].reference_type = si.doctype - jv.get("accounts")[0].reference_name = si.name + row1 = jv.get("accounts")[0] + row1.account = si.debit_to + row1.account_currency = si.party_account_currency + row1.party_type = "Customer" + row1.party = si.customer + row1.balance = get_balance_on(si.debit_to) + row1.party_balance = get_balance_on(party=si.customer, party_type="Customer") + row1.credit_in_account_currency = si.outstanding_amount + row1.reference_type = si.doctype + row1.reference_name = si.name + row1.exchange_rate = exchange_rate + row1.account_type = "Receivable" if si.customer else "" # debit bank - if jv.get("accounts")[1].account_currency == si.party_account_currency: - jv.get("accounts")[1].debit_in_account_currency = si.outstanding_amount + row2 = jv.get("accounts")[1] + if row2.account_currency == si.party_account_currency: + row2.debit_in_account_currency = si.outstanding_amount else: - jv.get("accounts")[1].debit_in_account_currency = si.outstanding_amount * exchange_rate + row2.debit_in_account_currency = si.outstanding_amount * exchange_rate + + # set multi currency check + if row1.account_currency != si.company_currency or row2.account_currency != si.company_currency: + jv.multi_currency = 1 return jv.as_dict() @@ -546,31 +551,37 @@ def get_payment_entry_from_purchase_invoice(purchase_invoice): """Returns new Journal Entry document as dict for given Purchase Invoice""" pi = frappe.get_doc("Purchase Invoice", purchase_invoice) - if pi.company_currency == pi.party_account_currency: - exchange_rate = 1 - else: - exchange_rate = get_exchange_rate(pi.party_account_currency, pi.company_currency) + exchange_rate = get_exchange_rate(pi.debit_to, pi.party_account_currency, pi.company, + pi.doctype, pi.name) jv = get_payment_entry(pi) jv.remark = 'Payment against Purchase Invoice {0}. {1}'.format(pi.name, pi.remarks) jv.exchange_rate = exchange_rate # credit supplier - jv.get("accounts")[0].account = pi.credit_to - jv.get("accounts")[0].account_currency = pi.party_account_currency - jv.get("accounts")[0].party_type = "Supplier" - 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_in_account_currency = pi.outstanding_amount - jv.get("accounts")[0].reference_type = pi.doctype - jv.get("accounts")[0].reference_name = pi.name + row1 = jv.get("accounts")[0] + row1.account = pi.credit_to + row1.account_currency = pi.party_account_currency + row1.party_type = "Supplier" + row1.party = pi.supplier + row1.balance = get_balance_on(pi.credit_to) + row1.party_balance = get_balance_on(party=pi.supplier, party_type="Supplier") + row1.debit_in_account_currency = pi.outstanding_amount + row1.reference_type = pi.doctype + row1.reference_name = pi.name + row1.exchange_rate = exchange_rate + row1.account_type = "Payable" if pi.supplier else "" # credit bank - if jv.get("accounts")[1].account_currency == pi.party_account_currency: - jv.get("accounts")[1].credit_in_account_currency = pi.outstanding_amount + row2 = jv.get("accounts")[1] + if row2.account_currency == pi.party_account_currency: + row2.credit_in_account_currency = pi.outstanding_amount else: - jv.get("accounts")[1].credit_in_account_currency = pi.outstanding_amount * exchange_rate + row2.credit_in_account_currency = pi.outstanding_amount * exchange_rate + + # set multi currency check + if row1.account_currency != pi.company_currency or row2.account_currency != pi.company_currency: + jv.multi_currency = 1 return jv.as_dict() @@ -590,37 +601,39 @@ def get_payment_entry_from_sales_order(sales_order): party_account = get_party_account(so.company, so.customer, "Customer") party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") - company_currency = get_company_currency(so.company) - if so.company_currency == party_account_currency: - exchange_rate = 1 - else: - exchange_rate = get_exchange_rate(party_account_currency, so.company_currency) - - jv.exchange_rate = exchange_rate - - if party_account_currency == company_currency: + exchange_rate = get_exchange_rate(party_account, party_account_currency, so.company) + + if party_account_currency == so.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 - jv.get("accounts")[0].account_currency = party_account_currency - jv.get("accounts")[0].party_type = "Customer" - 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_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" + row1 = jv.get("accounts")[0] + row1.account = party_account + row1.account_currency = party_account_currency + row1.party_type = "Customer" + row1.party = so.customer + row1.balance = get_balance_on(party_account) + row1.party_balance = get_balance_on(party=so.customer, party_type="Customer") + row1.credit_in_account_currency = amount + row1.reference_type = so.doctype + row1.reference_name = so.name + row1.is_advance = "Yes" + row1.exchange_rate = exchange_rate + row1.account_type = "Receivable" # debit bank - if jv.get("accounts")[1].account_currency == party_account_currency: - jv.get("accounts")[1].debit_in_account_currency = amount + row2 = jv.get("accounts")[1] + if row2.account_currency == party_account_currency: + row2.debit_in_account_currency = amount else: - jv.get("accounts")[1].debit_in_account_currency = amount * exchange_rate + row2.debit_in_account_currency = amount * exchange_rate + + # set multi currency check + if row1.account_currency != so.company_currency or row2.account_currency != so.company_currency: + jv.multi_currency = 1 return jv.as_dict() @@ -639,36 +652,38 @@ def get_payment_entry_from_purchase_order(purchase_order): party_account = get_party_account(po.company, po.supplier, "Supplier") party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") - company_currency = get_company_currency(po.company) - if po.company_currency == party_account_currency: - exchange_rate = 1 - else: - exchange_rate = get_exchange_rate(party_account_currency, po.company_currency) + exchange_rate = get_exchange_rate(party_account, party_account_currency, po.company) - jv.exchange_rate = exchange_rate - - if party_account_currency == company_currency: + if party_account_currency == po.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 - jv.get("accounts")[0].party_type = "Supplier" - 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_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" + row1 = jv.get("accounts")[0] + row1.account = party_account + row1.party_type = "Supplier" + row1.party = po.supplier + row1.balance = get_balance_on(party_account) + row1.party_balance = get_balance_on(party=po.supplier, party_type="Supplier") + row1.debit_in_account_currency = amount + row1.reference_type = po.doctype + row1.reference_name = po.name + row1.is_advance = "Yes" + row1.exchange_rate = exchange_rate + row1.account_type = "Payable" # debit bank - if jv.get("accounts")[1].account_currency == party_account_currency: - jv.get("accounts")[1].credit_in_account_currency = amount + row2 = jv.get("accounts")[1] + if row2.account_currency == party_account_currency: + row2.credit_in_account_currency = amount else: - jv.get("accounts")[1].credit_in_account_currency = amount * exchange_rate + row2.credit_in_account_currency = amount * exchange_rate + + # set multi currency check + if row1.account_currency != po.company_currency or row2.account_currency != po.company_currency: + jv.multi_currency = 1 return jv.as_dict() @@ -687,6 +702,9 @@ def get_payment_entry(doc): d2.account = bank_account["account"] d2.balance = bank_account["balance"] d2.account_currency = bank_account["account_currency"] + d2.account_type = bank_account["account_type"] + d2.exchange_rate = get_exchange_rate(bank_account["account"], + bank_account["account_currency"], doc.company) return jv @@ -712,27 +730,37 @@ def get_outstanding(args): if not frappe.has_permission("Account"): frappe.msgprint(_("No Permission"), raise_exception=1) args = eval(args) + company_currency = get_company_currency(args.get("company")) + if args.get("doctype") == "Journal Entry": condition = " and party=%(party)s" if args.get("party") else "" against_jv_amount = frappe.db.sql(""" - select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)) + select sum(ifnull(debit_in_account_currency, 0)) - sum(ifnull(credit_in_account_currency, 0)) from `tabJournal Entry Account` where parent=%(docname)s and account=%(account)s {0} and ifnull(reference_type, '')=''""".format(condition), args) against_jv_amount = flt(against_jv_amount[0][0]) if against_jv_amount else 0 + amount_field = "credit_in_account_currency" if against_jv_amount > 0 else "debit_in_account_currency" return { - ("credit" if against_jv_amount > 0 else "debit"): abs(against_jv_amount) + amount_field: abs(against_jv_amount) } - elif args.get("doctype") == "Sales Invoice": - outstanding_amount = flt(frappe.db.get_value("Sales Invoice", args["docname"], "outstanding_amount")) + elif args.get("doctype") in ("Sales Invoice", "Purchase Invoice"): + invoice = frappe.db.get_value(args["doctype"], args["docname"], + ["outstanding_amount", "conversion_rate"], as_dict=1) + + exchange_rate = invoice.conversion_rate if (args.get("account_currency") != company_currency) else 1 + + if args["doctype"] == "Sales Invoice": + amount_field = "credit_in_account_currency" \ + if flt(invoice.outstanding_amount) > 0 else "debit_in_account_currency" + else: + amount_field = "debit_in_account_currency" \ + if flt(invoice.outstanding_amount) > 0 else "credit_in_account_currency" + return { - ("credit" if outstanding_amount > 0 else "debit"): abs(outstanding_amount) - } - elif args.get("doctype") == "Purchase Invoice": - outstanding_amount = flt(frappe.db.get_value("Purchase Invoice", args["docname"], "outstanding_amount")) - return { - ("debit" if outstanding_amount > 0 else "credit"): abs(outstanding_amount) + amount_field: abs(flt(invoice.outstanding_amount)), + "exchange_rate": exchange_rate } @frappe.whitelist() @@ -753,7 +781,7 @@ def get_party_account_and_balance(company, party_type, party): } @frappe.whitelist() -def get_account_balance_and_party_type(account, date, company, credited=False): +def get_account_balance_and_party_type(account, date, company, debit=None, credit=None, exchange_rate=None): """Returns dict of account balance and party type to be set in Journal Entry on selection of account.""" if not frappe.has_permission("Account"): frappe.msgprint(_("No Permission"), raise_exception=1) @@ -768,19 +796,37 @@ def get_account_balance_and_party_type(account, date, company, credited=False): else: party_type = "" - exchange_rate = None - if account_details.account_currency != company_currency: - if account_details.account_type == "Bank" and credited: - exchange_rate = get_average_exchange_rate(account) - else: - exchange_rate = get_exchange_rate(account_details.account_currency, company_currency) - grid_values = { "balance": get_balance_on(account, date), "party_type": party_type, + "account_type": account_details.account_type, "account_currency": account_details.account_currency or company_currency, + "exchange_rate": get_exchange_rate(account, account_details.account_currency, + company, debit=debit, credit=credit, exchange_rate=exchange_rate) } - return grid_values, exchange_rate + return grid_values + +@frappe.whitelist() +def get_exchange_rate(account, account_currency, company, + reference_type=None, reference_name=None, debit=None, credit=None, exchange_rate=None): + from erpnext.setup.utils import get_exchange_rate + company_currency = get_company_currency(company) + account_details = frappe.db.get_value("Account", account, ["account_type", "root_type"], as_dict=1) + + if account_currency != company_currency: + if reference_type in ("Sales Invoice", "Purchase Invoice") and reference_name: + exchange_rate = frappe.db.get_value(reference_type, reference_name, "conversion_rate") + elif account_details.account_type == "Bank" and \ + ((account_details.root_type == "Asset" and flt(credit) > 0) or + (account_details.root_type == "Liability" and debit)): + exchange_rate = get_average_exchange_rate(account) + + if not exchange_rate: + exchange_rate = get_exchange_rate(account_currency, company_currency) + else: + exchange_rate = 1 + + return exchange_rate def get_average_exchange_rate(account): exchange_rate = 0 diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py index 0d9cd249ab0..753e0126c9b 100644 --- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py @@ -218,19 +218,20 @@ def make_journal_entry(account1, account2, amount, cost_center=None, exchange_ra jv.company = "_Test Company" jv.fiscal_year = "_Test Fiscal Year 2013" jv.user_remark = "test" - jv.exchange_rate = exchange_rate - + jv.multi_currency = 1 jv.set("accounts", [ { "account": account1, "cost_center": cost_center, "debit_in_account_currency": amount if amount > 0 else 0, "credit_in_account_currency": abs(amount) if amount < 0 else 0, + "exchange_rate": exchange_rate }, { "account": account2, "cost_center": cost_center, "credit_in_account_currency": amount if amount > 0 else 0, "debit_in_account_currency": abs(amount) if amount < 0 else 0, + exchange_rate: exchange_rate } ]) if save or submit: 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 85f410982cf..577df2510c8 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -38,19 +38,18 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "account_currency", - "fieldtype": "Link", + "fieldname": "account_type", + "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Account Currency", - "no_copy": 1, - "options": "Currency", + "label": "Account Type", + "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 1, - "read_only": 1, + "read_only": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -196,6 +195,96 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": "", + "depends_on": "", + "fieldname": "currency_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Currency", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "account_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Account Currency", + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_10", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "exchange_rate", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Exchange Rate", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -474,7 +563,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-09-04 03:29:37.127968", + "modified": "2015-09-09 12:55:59.270539", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 4fac12129e7..d92e1fa0ccd 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -216,7 +216,7 @@ class PurchaseInvoice(BuyingController): 'party_type': 'Supplier', 'party': self.supplier, 'is_advance' : 'Yes', - 'dr_or_cr' : 'debit', + 'dr_or_cr' : 'debit_in_account_currency', 'unadjusted_amt' : flt(d.advance_amount), 'allocated_amt' : flt(d.allocated_amount) } diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 2754ee6def8..b39f30bbdcc 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -219,7 +219,8 @@ class TestPurchaseInvoice(unittest.TestCase): pi.load_from_db() self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account` - where reference_type='Purchase Invoice' and reference_name=%s and debit=300""", pi.name)) + where reference_type='Purchase Invoice' + and reference_name=%s and debit_in_account_currency=300""", pi.name)) self.assertEqual(pi.outstanding_amount, 1212.30) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_records.json b/erpnext/accounts/doctype/purchase_invoice/test_records.json index 679e87024ac..e6961d978bc 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_records.json +++ b/erpnext/accounts/doctype/purchase_invoice/test_records.json @@ -141,6 +141,9 @@ "supplier": "_Test Supplier", "supplier_name": "_Test Supplier" }, + + + { "bill_no": "NA", "buying_price_list": "_Test Price List", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index bce8fe214e2..3f368184f27 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -260,7 +260,7 @@ class SalesInvoice(SellingController): 'party_type': 'Customer', 'party': self.customer, 'is_advance' : 'Yes', - 'dr_or_cr' : 'credit', + 'dr_or_cr' : 'credit_in_account_currency', 'unadjusted_amt' : flt(d.advance_amount), 'allocated_amt' : flt(d.allocated_amount) } diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index e519bd3969e..449f98d8f2d 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -661,7 +661,7 @@ class TestSalesInvoice(unittest.TestCase): where reference_name=%s""", si.name)) self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account` - where reference_name=%s and credit=300""", si.name)) + where reference_name=%s and credit_in_account_currency=300""", si.name)) self.assertEqual(si.outstanding_amount, 261.8) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index f0f096e9c37..89ff6cff15d 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -198,21 +198,26 @@ def update_against_doc(d, jv_obj): jv_detail.set("reference_name", d["against_voucher"]) if d['allocated_amt'] < d['unadjusted_amt']: - jvd = frappe.db.sql("""select cost_center, balance, against_account, is_advance - from `tabJournal Entry Account` where name = %s""", d['voucher_detail_no']) + jvd = frappe.db.sql(""" + select cost_center, balance, against_account, is_advance, account_type, exchange_rate + from `tabJournal Entry Account` where name = %s + """, d['voucher_detail_no'], as_dict=True) + # new entry with balance amount ch = jv_obj.append("accounts") ch.account = d['account'] + ch.account_type = jvd[0]['account_type'] + ch.exchange_rate = jvd[0]['exchange_rate'] ch.party_type = d["party_type"] ch.party = d["party"] - ch.cost_center = cstr(jvd[0][0]) - ch.balance = flt(jvd[0][1]) + ch.cost_center = cstr(jvd[0]["cost_center"]) + ch.balance = flt(jvd[0]["balance"]) ch.set(d['dr_or_cr'], flt(d['unadjusted_amt']) - flt(d['allocated_amt'])) ch.set(d['dr_or_cr']== 'debit' and 'credit' or 'debit', 0) - ch.against_account = cstr(jvd[0][2]) + ch.against_account = cstr(jvd[0]["against_account"]) ch.reference_type = original_reference_type ch.reference_name = original_reference_name - ch.is_advance = cstr(jvd[0][3]) + ch.is_advance = cstr(jvd[0]["is_advance"]) ch.docstatus = 1 # will work as update after submit diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 47d7e7a4fee..39527df97ab 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -236,8 +236,8 @@ class AccountsController(TransactionBase): .format(account, " or ".join(valid_currency))) def set_balance_in_account_currency(self, gl_dict, account_currency=None): - if not (self.get("conversion_rate") or self.get("exchange_rate")) \ - and account_currency!=self.company_currency: + if (not self.get("conversion_rate") and self.doctype!="Journal Entry" + and account_currency!=self.company_currency): frappe.throw(_("Account: {0} with currency: {1} can not be selected") .format(gl_dict.account, account_currency)) diff --git a/erpnext/patches/v6_0/multi_currency.py b/erpnext/patches/v6_0/multi_currency.py index 793a0c21700..2b53134c050 100644 --- a/erpnext/patches/v6_0/multi_currency.py +++ b/erpnext/patches/v6_0/multi_currency.py @@ -37,18 +37,18 @@ def execute(): """, (company.default_currency, company.name)) # update exchange rate, debit/credit in account currency in Journal Entry - frappe.db.sql("""update `tabJournal Entry` set exchange_rate=1""") - frappe.db.sql(""" - update - `tabJournal Entry Account` jea, `tabJournal Entry` je - set + update `tabJournal Entry Account` jea + set exchange_rate=1, debit_in_account_currency=debit, credit_in_account_currency=credit, - account_currency=%s - where - jea.parent = je.name - and je.company=%s + account_type=(select account_type from `tabAccount` where name=jea.account) + """) + + frappe.db.sql(""" + update `tabJournal Entry Account` jea, `tabJournal Entry` je + set account_currency=%s + where jea.parent = je.name and je.company=%s """, (company.default_currency, company.name)) # update debit/credit in account currency in GL Entry @@ -87,7 +87,15 @@ def execute(): break if not party_account_exists: - party_account = party_gle.account if party_gle else company.default_receivable_account + party_account = None + if party_gle: + party_account = party_gle.account + else: + default_receivable_account_currency = frappe.db.get_value("Account", + company.default_receivable_account, "account_currency") + if default_receivable_account_currency != company.default_currency: + party_account = company.default_receivable_account + if party_account: party.append("accounts", { "company": company.name, From 71ef6675cef34031afb555493a0411d123be8e3f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 10 Sep 2015 19:25:50 +0530 Subject: [PATCH 34/38] [fix] Journal Entry client side minor fixes --- .../accounts/doctype/journal_entry/journal_entry.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 246c410fcc8..383b4b620d5 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -75,7 +75,6 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ setup_queries: function() { var me = this; - var company_currency = erpnext.get_currency(me.frm.doc.company); me.frm.set_query("account", "accounts", function(doc, cdt, cdn) { var filters = { @@ -83,7 +82,9 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ is_group: 0 }; if(!doc.multi_currency) { - $.extend(filters, {currency: company_currency}); + $.extend(filters, { + account_currency: frappe.get_doc(":Company", me.frm.doc.company).default_currency + }); } return { filters: filters }; }); @@ -230,6 +231,7 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ row.debit = -doc.difference; } } + cur_frm.cscript.update_totals(doc); }, }); @@ -405,7 +407,7 @@ erpnext.journal_entry.set_debit_credit_in_company_currency = function(frm, cdt, } erpnext.journal_entry.set_exchange_rate = function(frm, cdt, cdn) { - var company_currency = erpnext.get_currency(frm.doc.company); + var company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; var row = locals[cdt][cdn]; if(row.account_currency == company_currency || !frm.doc.multi_currency) { @@ -417,8 +419,8 @@ erpnext.journal_entry.set_exchange_rate = function(frm, cdt, cdn) { account: row.account, account_currency: row.account_currency, company: frm.doc.company, - reference_type: row.reference_type, - reference_name: row.reference_name, + reference_type: cstr(row.reference_type), + reference_name: cstr(row.reference_name), debit: flt(row.debit_in_account_currency), credit: flt(row.credit_in_account_currency), exchange_rate: row.exchange_rate From d461d462aabda0658a1e1fa8508a10c34a287fcb Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 10 Sep 2015 10:30:41 +0530 Subject: [PATCH 35/38] [minor] rename notified_modifed > notified_update. Merge with #1296 --- erpnext/buying/doctype/purchase_order/purchase_order.py | 2 +- erpnext/controllers/status_updater.py | 2 +- .../manufacturing/doctype/production_order/production_order.py | 2 +- erpnext/selling/doctype/sales_order/sales_order.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 07644404082..e8c79d8e7a7 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -166,7 +166,7 @@ class PurchaseOrder(BuyingController): self.update_ordered_qty() msgprint(_("Status of {0} {1} is now {2}").format(self.doctype, self.name, status)) - self.notify_modified() + self.notify_update() clear_doctype_notifications(self) def on_submit(self): diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index 9c67e9a1b85..c43493cd55b 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -222,7 +222,7 @@ class StatusUpdater(Document): where name='%(name)s'""" % args) if args.get("set_modified"): - frappe.get_doc(args["target_parent_dt"], name).notify_modified() + frappe.get_doc(args["target_parent_dt"], name).notify_update() def update_billing_status_for_zero_amount_refdoc(self, ref_dt): ref_fieldname = ref_dt.lower().replace(" ", "_") diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py index 3e380a54eb8..e5e0a964bc2 100644 --- a/erpnext/manufacturing/doctype/production_order/production_order.py +++ b/erpnext/manufacturing/doctype/production_order/production_order.py @@ -109,7 +109,7 @@ class ProductionOrder(Document): self.update_status(status) self.update_planned_qty() frappe.msgprint(_("Production Order status is {0}").format(status)) - self.notify_modified() + self.notify_update() def update_status(self, status=None): diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 8fcff104771..3e689038a0c 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -226,7 +226,7 @@ class SalesOrder(SellingController): frappe.db.set(self, 'status', 'Stopped') self.update_reserved_qty() frappe.msgprint(_("{0} {1} status is Stopped").format(self.doctype, self.name)) - self.notify_modified() + self.notify_update() clear_doctype_notifications(self) def unstop_sales_order(self): From 8db7bd2d8fc66fe52cbd131d94e96631a180e25a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 10 Sep 2015 12:13:27 +0530 Subject: [PATCH 36/38] [fix] Igonre permissions while saving Company and Warehouse from Accounts Settings --- .../accounts/doctype/accounts_settings/accounts_settings.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py index 9fc9854d2dc..5f569a83052 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -16,7 +16,9 @@ class AccountsSettings(Document): if cint(self.auto_accounting_for_stock): # set default perpetual account in company for company in frappe.db.sql("select name from tabCompany"): - frappe.get_doc("Company", company[0]).save() + company = frappe.get_doc("Company", company[0]) + company.flags.ignore_permissions = True + company.save() # Create account head for warehouses warehouse_list = frappe.db.sql("select name, company from tabWarehouse", as_dict=1) @@ -25,4 +27,5 @@ class AccountsSettings(Document): frappe.throw(_("Company is missing in warehouses {0}").format(comma_and(warehouse_with_no_company))) for wh in warehouse_list: wh_doc = frappe.get_doc("Warehouse", wh.name) + wh_doc.flags.ignore_permissions = True wh_doc.save() From 5d9cfc76cd56e6866180bb9d94b45d81fe11727f Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 11 Sep 2015 12:26:57 +0530 Subject: [PATCH 37/38] Don't copy title field in Duplicate --- .../doctype/journal_entry/journal_entry.json | 2000 ++++++++--------- .../doctype/pricing_rule/pricing_rule.json | 4 +- .../purchase_invoice/purchase_invoice.json | 4 +- .../purchase_taxes_and_charges_template.json | 6 +- .../doctype/sales_invoice/sales_invoice.json | 4 +- .../sales_taxes_and_charges_template.json | 6 +- .../purchase_order/purchase_order.json | 4 +- .../supplier_quotation.json | 4 +- .../newsletter_list/newsletter_list.json | 6 +- .../crm/doctype/opportunity/opportunity.json | 4 +- .../doctype/expense_claim/expense_claim.json | 1152 +++++----- .../doctype/activity_cost/activity_cost.json | 2 +- .../doctype/project_task/project_task.json | 4 +- .../projects/doctype/time_log/time_log.json | 1624 ++++++------- .../selling/doctype/quotation/quotation.json | 4 +- .../doctype/sales_order/sales_order.json | 4 +- .../terms_and_conditions.json | 6 +- .../doctype/delivery_note/delivery_note.json | 4 +- .../material_request/material_request.json | 4 +- .../purchase_receipt/purchase_receipt.json | 4 +- .../doctype/stock_entry/stock_entry.json | 4 +- 21 files changed, 2427 insertions(+), 2427 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 77927bca4d7..2b025e6f33d 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -1,1100 +1,1100 @@ { - "allow_copy": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "naming_series:", - "creation": "2013-03-25 10:53:52", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", + "allow_copy": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "naming_series:", + "creation": "2013-03-25 10:53:52", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "entry_type_and_date", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "no_copy": 0, - "options": "icon-flag", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "entry_type_and_date", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "options": "icon-flag", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "default": "", - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Title", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "default": "", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Title", + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "Journal Entry", - "fieldname": "voucher_type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Entry Type", - "no_copy": 0, - "oldfieldname": "voucher_type", - "oldfieldtype": "Select", - "options": "Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "Journal Entry", + "fieldname": "voucher_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Entry Type", + "no_copy": 0, + "oldfieldname": "voucher_type", + "oldfieldtype": "Select", + "options": "Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "naming_series", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Series", - "no_copy": 1, - "oldfieldname": "naming_series", - "oldfieldtype": "Select", - "options": "JV-", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Series", + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "JV-", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "posting_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Posting Date", - "no_copy": 1, - "oldfieldname": "posting_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "posting_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Posting Date", + "no_copy": 1, + "oldfieldname": "posting_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "2_add_edit_gl_entries", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "icon-table", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "2_add_edit_gl_entries", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-table", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "fieldname": "accounts", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Accounting Entries", - "no_copy": 0, - "oldfieldname": "entries", - "oldfieldtype": "Table", - "options": "Journal Entry Account", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "accounts", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Accounting Entries", + "no_copy": 0, + "oldfieldname": "entries", + "oldfieldtype": "Table", + "options": "Journal Entry Account", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break99", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break99", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "", - "fieldname": "cheque_no", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 1, - "label": "Reference Number", - "no_copy": 1, - "oldfieldname": "cheque_no", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "cheque_no", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 1, + "label": "Reference Number", + "no_copy": 1, + "oldfieldname": "cheque_no", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "cheque_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference Date", - "no_copy": 1, - "oldfieldname": "cheque_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "cheque_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference Date", + "no_copy": 1, + "oldfieldname": "cheque_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "user_remark", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "User Remark", - "no_copy": 1, - "oldfieldname": "user_remark", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "user_remark", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "User Remark", + "no_copy": 1, + "oldfieldname": "user_remark", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break99", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break99", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_debit", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 1, - "label": "Total Debit", - "no_copy": 1, - "oldfieldname": "total_debit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_debit", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 1, + "label": "Total Debit", + "no_copy": 1, + "oldfieldname": "total_debit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_credit", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Total Credit", - "no_copy": 1, - "oldfieldname": "total_credit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_credit", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Total Credit", + "no_copy": 1, + "oldfieldname": "total_credit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "difference", - "fieldname": "difference", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Difference (Dr - Cr)", - "no_copy": 1, - "oldfieldname": "difference", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "difference", + "fieldname": "difference", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Difference (Dr - Cr)", + "no_copy": 1, + "oldfieldname": "difference", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "difference", - "fieldname": "get_balance", - "fieldtype": "Button", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Make Difference Entry", - "no_copy": 0, - "oldfieldtype": "Button", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "difference", + "fieldname": "get_balance", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Make Difference Entry", + "no_copy": 0, + "oldfieldtype": "Button", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "multi_currency", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Multi Currency", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "multi_currency", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Multi Currency", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_amount", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Total Amount", - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_amount", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Total Amount", + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "read_only": 1, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_amount_in_words", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Total Amount in Words", - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_amount_in_words", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Total Amount in Words", + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "read_only": 1, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "fieldname": "reference", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference", - "no_copy": 0, - "options": "icon-pushpin", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "reference", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference", + "no_copy": 0, + "options": "icon-pushpin", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "clearance_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Clearance Date", - "no_copy": 1, - "oldfieldname": "clearance_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "clearance_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Clearance Date", + "no_copy": 1, + "oldfieldname": "clearance_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "", - "fieldname": "remark", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Remark", - "no_copy": 1, - "oldfieldname": "remark", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "remark", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Remark", + "no_copy": 1, + "oldfieldname": "remark", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break98", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break98", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "bill_no", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Bill No", - "no_copy": 0, - "oldfieldname": "bill_no", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "bill_no", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Bill No", + "no_copy": 0, + "oldfieldname": "bill_no", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "bill_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Bill Date", - "no_copy": 0, - "oldfieldname": "bill_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "bill_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Bill Date", + "no_copy": 0, + "oldfieldname": "bill_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "due_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Due Date", - "no_copy": 0, - "oldfieldname": "due_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "due_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Due Date", + "no_copy": 0, + "oldfieldname": "due_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", - "fieldname": "write_off", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Write Off", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", + "fieldname": "write_off", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "Accounts Receivable", - "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", - "fieldname": "write_off_based_on", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Write Off Based On", - "no_copy": 0, - "options": "Accounts Receivable\nAccounts Payable", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "Accounts Receivable", + "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", + "fieldname": "write_off_based_on", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off Based On", + "no_copy": 0, + "options": "Accounts Receivable\nAccounts Payable", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", - "fieldname": "get_outstanding_invoices", - "fieldtype": "Button", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Get Outstanding Invoices", - "no_copy": 0, - "options": "get_outstanding_invoices", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", + "fieldname": "get_outstanding_invoices", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Get Outstanding Invoices", + "no_copy": 0, + "options": "get_outstanding_invoices", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_30", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_30", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", - "fieldname": "write_off_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Write Off Amount", - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", + "fieldname": "write_off_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Write Off Amount", + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "fieldname": "printing_settings", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Printing Settings", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "printing_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Printing Settings", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "pay_to_recd_from", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Pay To / Recd From", - "no_copy": 1, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "pay_to_recd_from", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Pay To / Recd From", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_35", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_35", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "fieldname": "letter_head", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Letter Head", - "no_copy": 0, - "options": "Letter Head", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "letter_head", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Letter Head", + "no_copy": 0, + "options": "Letter Head", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "fieldname": "select_print_heading", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Print Heading", - "no_copy": 1, - "oldfieldname": "select_print_heading", - "oldfieldtype": "Link", - "options": "Print Heading", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "select_print_heading", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Print Heading", + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "fieldname": "addtional_info", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "More Information", - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "icon-file-text", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "addtional_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "More Information", + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-file-text", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Company", - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Company", + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "fiscal_year", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Fiscal Year", - "no_copy": 0, - "oldfieldname": "fiscal_year", - "oldfieldtype": "Select", - "options": "Fiscal Year", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "fiscal_year", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Fiscal Year", + "no_copy": 0, + "oldfieldname": "fiscal_year", + "oldfieldtype": "Select", + "options": "Fiscal Year", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "No", - "description": "", - "fieldname": "is_opening", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Is Opening", - "no_copy": 0, - "oldfieldname": "is_opening", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "No", + "description": "", + "fieldname": "is_opening", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Is Opening", + "no_copy": 0, + "oldfieldname": "is_opening", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:inList([\"Credit Note\", \"Debit Note\"], doc.voucher_type)", - "fieldname": "stock_entry", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Stock Entry", - "no_copy": 0, - "options": "Stock Entry", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:inList([\"Credit Note\", \"Debit Note\"], doc.voucher_type)", + "fieldname": "stock_entry", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Stock Entry", + "no_copy": 0, + "options": "Stock Entry", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Amended From", - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Link", - "options": "Journal Entry", - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Amended From", + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Link", + "options": "Journal Entry", + "permlevel": 0, + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-file-text", - "idx": 1, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "modified": "2015-09-09 02:07:40.980884", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Journal Entry", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-file-text", + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "modified": "2015-09-11 12:20:50.635624", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Journal Entry", + "owner": "Administrator", "permissions": [ { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Auditor", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Auditor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 } - ], - "read_only": 0, - "read_only_onload": 1, - "search_fields": "voucher_type,posting_date, due_date, cheque_no", - "sort_field": "modified", - "sort_order": "DESC", + ], + "read_only": 0, + "read_only_onload": 1, + "search_fields": "voucher_type,posting_date, due_date, cheque_no", + "sort_field": "modified", + "sort_order": "DESC", "title_field": "title" -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json index ed3b2d12943..be027ad9a82 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json @@ -41,7 +41,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -851,7 +851,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-13 14:58:29.194326", + "modified": "2015-09-11 12:19:52.242771", "modified_by": "Administrator", "module": "Accounts", "name": "Pricing Rule", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 81b478f8f62..6937c97e8c7 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -20,7 +20,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -2242,7 +2242,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:19:39.803805", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.json b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.json index ab18215301d..86fd799ba26 100644 --- a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.json +++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.json @@ -8,7 +8,7 @@ "description": "Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.\n10. Add or Deduct: Whether you want to add or deduct the tax.", "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "Setup", "fields": [ { "allow_on_submit": 0, @@ -21,7 +21,7 @@ "in_filter": 1, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "oldfieldname": "title", "oldfieldtype": "Data", "permlevel": 0, @@ -176,7 +176,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-05-06 08:52:01.499434", + "modified": "2015-09-11 12:19:53.741725", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Taxes and Charges Template", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 9ec623b5121..263bbe2ebe2 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -44,7 +44,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -2951,7 +2951,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:20:06.545927", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.json b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.json index bbba7d39bfe..9a3a4580f53 100644 --- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.json +++ b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.json @@ -8,7 +8,7 @@ "description": "Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.", "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "Setup", "fields": [ { "allow_on_submit": 0, @@ -21,7 +21,7 @@ "in_filter": 1, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "oldfieldname": "title", "oldfieldtype": "Data", "permlevel": 0, @@ -198,7 +198,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:19:46.488710", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Taxes and Charges Template", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 4b646c609db..b092037b714 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -43,7 +43,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -2032,7 +2032,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:19:55.502661", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index 7e35b2503cb..128146734a3 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -43,7 +43,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -1554,7 +1554,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:20:10.684388", "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation", diff --git a/erpnext/crm/doctype/newsletter_list/newsletter_list.json b/erpnext/crm/doctype/newsletter_list/newsletter_list.json index 7537c03bad9..01f1b758333 100644 --- a/erpnext/crm/doctype/newsletter_list/newsletter_list.json +++ b/erpnext/crm/doctype/newsletter_list/newsletter_list.json @@ -7,7 +7,7 @@ "custom": 0, "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "Setup", "fields": [ { "allow_on_submit": 0, @@ -20,7 +20,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -62,7 +62,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-07-15 07:18:30.094155", + "modified": "2015-09-11 12:20:05.237636", "modified_by": "Administrator", "module": "CRM", "name": "Newsletter List", diff --git a/erpnext/crm/doctype/opportunity/opportunity.json b/erpnext/crm/doctype/opportunity/opportunity.json index 63453453686..856f81308d3 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.json +++ b/erpnext/crm/doctype/opportunity/opportunity.json @@ -185,7 +185,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -889,7 +889,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:19:38.052900", "modified_by": "Administrator", "module": "CRM", "name": "Opportunity", diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.json b/erpnext/hr/doctype/expense_claim/expense_claim.json index c5ef312d89b..5d3b5979804 100644 --- a/erpnext/hr/doctype/expense_claim/expense_claim.json +++ b/erpnext/hr/doctype/expense_claim/expense_claim.json @@ -1,634 +1,634 @@ { - "allow_copy": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "naming_series:", - "creation": "2013-01-10 16:34:14", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "naming_series:", + "creation": "2013-01-10 16:34:14", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "EXP", - "fieldname": "naming_series", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Series", - "no_copy": 1, - "options": "EXP", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "EXP", + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Series", + "no_copy": 1, + "options": "EXP", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "Draft", - "depends_on": "eval:!doc.__islocal", - "fieldname": "approval_status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Approval Status", - "no_copy": 1, - "oldfieldname": "approval_status", - "oldfieldtype": "Select", - "options": "Draft\nApproved\nRejected", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "Draft", + "depends_on": "eval:!doc.__islocal", + "fieldname": "approval_status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Approval Status", + "no_copy": 1, + "oldfieldname": "approval_status", + "oldfieldtype": "Select", + "options": "Draft\nApproved\nRejected", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "A user with \"Expense Approver\" role", - "fieldname": "exp_approver", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Approver", - "no_copy": 0, - "oldfieldname": "exp_approver", - "oldfieldtype": "Select", - "options": "User", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "A user with \"Expense Approver\" role", + "fieldname": "exp_approver", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Approver", + "no_copy": 0, + "oldfieldname": "exp_approver", + "oldfieldtype": "Select", + "options": "User", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "160px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break0", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_claimed_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Total Claimed Amount", - "no_copy": 1, - "oldfieldname": "total_claimed_amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_claimed_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Total Claimed Amount", + "no_copy": 1, + "oldfieldname": "total_claimed_amount", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "160px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_sanctioned_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Total Sanctioned Amount", - "no_copy": 1, - "oldfieldname": "total_sanctioned_amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_sanctioned_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Total Sanctioned Amount", + "no_copy": 1, + "oldfieldname": "total_sanctioned_amount", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "160px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "expense_details", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "no_copy": 0, - "oldfieldtype": "Section Break", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "expense_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "oldfieldtype": "Section Break", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "expenses", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Expenses", - "no_copy": 0, - "oldfieldname": "expense_voucher_details", - "oldfieldtype": "Table", - "options": "Expense Claim Detail", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "expenses", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Expenses", + "no_copy": 0, + "oldfieldname": "expense_voucher_details", + "oldfieldtype": "Table", + "options": "Expense Claim Detail", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "sb1", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "options": "Simple", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "sb1", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "options": "Simple", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "Today", - "fieldname": "posting_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Posting Date", - "no_copy": 0, - "oldfieldname": "posting_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "Today", + "fieldname": "posting_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Posting Date", + "no_copy": 0, + "oldfieldname": "posting_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "employee", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "From Employee", - "no_copy": 0, - "oldfieldname": "employee", - "oldfieldtype": "Link", - "options": "Employee", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "From Employee", + "no_copy": 0, + "oldfieldname": "employee", + "oldfieldtype": "Link", + "options": "Employee", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "employee_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Employee Name", - "no_copy": 0, - "oldfieldname": "employee_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Employee Name", + "no_copy": 0, + "oldfieldname": "employee_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Company", - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Company", + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "fiscal_year", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 1, - "in_list_view": 0, - "label": "Fiscal Year", - "no_copy": 0, - "oldfieldname": "fiscal_year", - "oldfieldtype": "Select", - "options": "Fiscal Year", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "fiscal_year", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Fiscal Year", + "no_copy": 0, + "oldfieldname": "fiscal_year", + "oldfieldtype": "Select", + "options": "Fiscal Year", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "cb1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "cb1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "total_amount_reimbursed", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Total Amount Reimbursed", - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "total_amount_reimbursed", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Total Amount Reimbursed", + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "remark", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Remark", - "no_copy": 1, - "oldfieldname": "remark", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "remark", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Remark", + "no_copy": 1, + "oldfieldname": "remark", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "project", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Project", - "no_copy": 0, - "options": "Project", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "project", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Project", + "no_copy": 0, + "options": "Project", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "task", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Task", - "no_copy": 0, - "options": "Task", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "task", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Task", + "no_copy": 0, + "options": "Task", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "default": "{employee_name}", - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Title", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "default": "{employee_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Title", + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "email_id", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Employees Email Id", - "no_copy": 0, - "oldfieldname": "email_id", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "email_id", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Employees Email Id", + "no_copy": 0, + "oldfieldname": "email_id", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Amended From", - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Data", - "options": "Expense Claim", - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Amended From", + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Data", + "options": "Expense Claim", + "permlevel": 0, + "print_hide": 1, + "read_only": 1, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "160px" } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-money", - "idx": 1, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "modified": "2015-09-07 15:51:26", - "modified_by": "Administrator", - "module": "HR", - "name": "Expense Claim", - "owner": "harshada@webnotestech.com", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-money", + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "modified": "2015-09-11 12:20:16.578324", + "modified_by": "Administrator", + "module": "HR", + "name": "Expense Claim", + "owner": "harshada@webnotestech.com", "permissions": [ { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Expense Approver", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\",\"Project\",\"Task\",\"User\"]", + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Expense Approver", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\",\"Project\",\"Task\",\"User\"]", "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\",\"Project\",\"Task\",\"User\"]", + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\",\"Project\",\"Task\",\"User\"]", "write": 1 } - ], - "read_only": 0, - "read_only_onload": 0, - "search_fields": "approval_status,employee,employee_name", - "sort_field": "modified", - "sort_order": "DESC", + ], + "read_only": 0, + "read_only_onload": 0, + "search_fields": "approval_status,employee,employee_name", + "sort_field": "modified", + "sort_order": "DESC", "title_field": "title" -} +} \ No newline at end of file diff --git a/erpnext/projects/doctype/activity_cost/activity_cost.json b/erpnext/projects/doctype/activity_cost/activity_cost.json index 88f91162ebc..584a4cb4107 100644 --- a/erpnext/projects/doctype/activity_cost/activity_cost.json +++ b/erpnext/projects/doctype/activity_cost/activity_cost.json @@ -219,7 +219,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-31 06:43:42.804365", + "modified": "2015-09-11 12:19:59.149156", "modified_by": "Administrator", "module": "Projects", "name": "Activity Cost", diff --git a/erpnext/projects/doctype/project_task/project_task.json b/erpnext/projects/doctype/project_task/project_task.json index 14e8d786c45..a108ae6fe9a 100644 --- a/erpnext/projects/doctype/project_task/project_task.json +++ b/erpnext/projects/doctype/project_task/project_task.json @@ -19,7 +19,7 @@ "in_filter": 0, "in_list_view": 1, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -217,7 +217,7 @@ "is_submittable": 0, "issingle": 0, "istable": 1, - "modified": "2015-08-19 12:45:54.093938", + "modified": "2015-09-11 12:19:41.832529", "modified_by": "Administrator", "module": "Projects", "name": "Project Task", diff --git a/erpnext/projects/doctype/time_log/time_log.json b/erpnext/projects/doctype/time_log/time_log.json index 7e221b26802..cdcf64274a3 100644 --- a/erpnext/projects/doctype/time_log/time_log.json +++ b/erpnext/projects/doctype/time_log/time_log.json @@ -1,896 +1,896 @@ { - "allow_copy": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "naming_series:", - "creation": "2013-04-03 16:38:41", - "custom": 0, - "description": "Log of Activities performed by users against Tasks that can be used for tracking time, billing.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", + "allow_copy": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "naming_series:", + "creation": "2013-04-03 16:38:41", + "custom": 0, + "description": "Log of Activities performed by users against Tasks that can be used for tracking time, billing.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "naming_series", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Series", - "no_copy": 0, - "options": "TL-", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Series", + "no_copy": 0, + "options": "TL-", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Status", - "no_copy": 0, - "options": "Draft\nSubmitted\nBatched for Billing\nBilled\nCancelled", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Status", + "no_copy": 0, + "options": "Draft\nSubmitted\nBatched for Billing\nBilled\nCancelled", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break_4", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_4", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "from_time", - "fieldtype": "Datetime", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "From Time", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "from_time", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "From Time", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "0", - "fieldname": "hours", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Hours", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "0", + "fieldname": "hours", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Hours", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "to_time", - "fieldtype": "Datetime", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "To Time", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "to_time", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "To Time", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_8", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_8", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:!doc.for_manufacturing", - "fieldname": "activity_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Activity Type", - "no_copy": 0, - "options": "Activity Type", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:!doc.for_manufacturing", + "fieldname": "activity_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Activity Type", + "no_copy": 0, + "options": "Activity Type", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "project", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Project", - "no_copy": 0, - "options": "Project", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "project", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Project", + "no_copy": 0, + "options": "Project", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "task", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Task", - "no_copy": 0, - "options": "Task", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "task", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Task", + "no_copy": 0, + "options": "Task", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break_12", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_12", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "user", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "User", - "no_copy": 0, - "options": "User", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "user", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "User", + "no_copy": 0, + "options": "User", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "employee", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Employee", - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Employee", + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "for_manufacturing", - "fieldtype": "Check", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "For Manufacturing", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "for_manufacturing", + "fieldtype": "Check", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "For Manufacturing", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "billable", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Billable", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "billable", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Billable", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.for_manufacturing", - "fieldname": "section_break_11", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.for_manufacturing", + "fieldname": "section_break_11", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "production_order", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Production Order", - "no_copy": 0, - "options": "Production Order", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "production_order", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Production Order", + "no_copy": 0, + "options": "Production Order", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "operation", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Operation", - "no_copy": 0, - "options": "Operation", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "operation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Operation", + "no_copy": 0, + "options": "Operation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "operation_id", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Operation ID", - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "operation_id", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Operation ID", + "no_copy": 0, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_14", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_14", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "workstation", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Workstation", - "no_copy": 0, - "options": "Workstation", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "workstation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Workstation", + "no_copy": 0, + "options": "Workstation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "description": "Operation completed for how many finished goods?", - "fieldname": "completed_qty", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Completed Qty", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "description": "Operation completed for how many finished goods?", + "fieldname": "completed_qty", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Completed Qty", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break_7", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "note", - "fieldtype": "Text Editor", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Note", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "note", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Note", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "section_break_24", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "section_break_24", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "0", - "description": "", - "fieldname": "costing_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Costing Rate based on Activity Type (per hour)", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "0", + "description": "", + "fieldname": "costing_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Costing Rate based on Activity Type (per hour)", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "0", - "fieldname": "costing_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Costing Amount", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "0", + "fieldname": "costing_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Costing Amount", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_25", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_25", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "0", - "description": "", - "fieldname": "billing_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Billing Rate based on Activity Type (per hour)", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "0", + "description": "", + "fieldname": "billing_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Billing Rate based on Activity Type (per hour)", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "0", - "description": "Will be updated only if Time Log is 'Billable'", - "fieldname": "billing_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Billing Amount", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "0", + "description": "Will be updated only if Time Log is 'Billable'", + "fieldname": "billing_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Billing Amount", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break_29", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_29", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "Will be updated when batched.", - "fieldname": "time_log_batch", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Time Log Batch", - "no_copy": 0, - "options": "Time Log Batch", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Will be updated when batched.", + "fieldname": "time_log_batch", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Time Log Batch", + "no_copy": 0, + "options": "Time Log Batch", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "Will be updated when billed.", - "fieldname": "sales_invoice", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Sales Invoice", - "no_copy": 0, - "options": "Sales Invoice", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Will be updated when billed.", + "fieldname": "sales_invoice", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Sales Invoice", + "no_copy": 0, + "options": "Sales Invoice", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Amended From", - "no_copy": 1, - "options": "Time Log", - "permlevel": 1, - "print_hide": 1, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Amended From", + "no_copy": 1, + "options": "Time Log", + "permlevel": 1, + "print_hide": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Title", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Title", + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-time", - "idx": 1, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "modified": "2015-09-07 15:51:26", - "modified_by": "Administrator", - "module": "Projects", - "name": "Time Log", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-time", + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "modified": "2015-09-11 12:19:48.187752", + "modified_by": "Administrator", + "module": "Projects", + "name": "Time Log", + "owner": "Administrator", "permissions": [ { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Projects User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Projects User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 0, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Projects Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 0, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Projects Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 } - ], - "read_only": 0, - "read_only_onload": 0, + ], + "read_only": 0, + "read_only_onload": 0, "title_field": "title" -} +} \ No newline at end of file diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 97f32f216a6..3807e2de314 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -64,7 +64,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -1843,7 +1843,7 @@ "issingle": 0, "istable": 0, "max_attachments": 1, - "modified": "2015-08-27 03:27:57.267110", + "modified": "2015-09-11 12:20:18.521489", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 417250b35f7..2e85e26c74c 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -65,7 +65,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -2553,7 +2553,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:19:42.436344", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json index cc11b8043b0..a8e59c931c1 100644 --- a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json +++ b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json @@ -8,7 +8,7 @@ "description": "Standard Terms and Conditions that can be added to Sales and Purchases.\n\nExamples:\n\n1. Validity of the offer.\n1. Payment Terms (In Advance, On Credit, part advance etc).\n1. What is extra (or payable by the Customer).\n1. Safety / usage warning.\n1. Warranty if any.\n1. Returns Policy.\n1. Terms of shipping, if applicable.\n1. Ways of addressing disputes, indemnity, liability, etc.\n1. Address and Contact of your Company.", "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "Setup", "fields": [ { "allow_on_submit": 0, @@ -21,7 +21,7 @@ "in_filter": 1, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "oldfieldname": "title", "oldfieldtype": "Data", "permlevel": 0, @@ -66,7 +66,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:19:53.267342", "modified_by": "Administrator", "module": "Setup", "name": "Terms and Conditions", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 3366a58c13e..f65e74a83e3 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -66,7 +66,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -2438,7 +2438,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:20:00.264753", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/material_request/material_request.json b/erpnext/stock/doctype/material_request/material_request.json index 0d36e9c0171..855b50b6d36 100644 --- a/erpnext/stock/doctype/material_request/material_request.json +++ b/erpnext/stock/doctype/material_request/material_request.json @@ -42,7 +42,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -510,7 +510,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:19:49.832338", "modified_by": "Administrator", "module": "Stock", "name": "Material Request", diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index b9c5ba7158d..fc874bcd8c9 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -66,7 +66,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 1, @@ -2076,7 +2076,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:20:13.894374", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.json b/erpnext/stock/doctype/stock_entry/stock_entry.json index 1fe3cb489b3..f55c12ca31f 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.json +++ b/erpnext/stock/doctype/stock_entry/stock_entry.json @@ -42,7 +42,7 @@ "in_filter": 0, "in_list_view": 0, "label": "Title", - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, @@ -1291,7 +1291,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-09-07 15:51:26", + "modified": "2015-09-11 12:20:21.220215", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry", From 979326b0b16140a2b670bf93fef11e4ebafec6e9 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 11 Sep 2015 16:22:37 +0530 Subject: [PATCH 38/38] minor fixes in multi-currency --- .../doctype/journal_entry/journal_entry.py | 115 +++++++++--------- .../accounts_receivable.py | 45 +++---- erpnext/controllers/accounts_controller.py | 52 ++++---- 3 files changed, 107 insertions(+), 105 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 04324c0efd1..cb12969112c 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -199,26 +199,26 @@ class JournalEntry(AccountsController): party_type, party = self.reference_parties.get(reference_name) if reference_type in ("Sales Order", "Purchase Order"): - voucher_properties = frappe.db.get_value(reference_type, reference_name, - ["docstatus", "per_billed", "status", "advance_paid", + order = frappe.db.get_value(reference_type, reference_name, + ["docstatus", "per_billed", "status", "advance_paid", "base_grand_total", "grand_total", "currency"], as_dict=1) - if voucher_properties.docstatus != 1: + if order.docstatus != 1: frappe.throw(_("{0} {1} is not submitted").format(reference_type, reference_name)) - if flt(voucher_properties.per_billed) >= 100: + if flt(order.per_billed) >= 100: frappe.throw(_("{0} {1} is fully billed").format(reference_type, reference_name)) - if cstr(voucher_properties.status) == "Stopped": + if cstr(order.status) == "Stopped": frappe.throw(_("{0} {1} is stopped").format(reference_type, reference_name)) - + party_account_currency = frappe.db.get_value(party_type, party, "party_account_currency") if party_account_currency == self.company_currency: - voucher_total = voucher_properties.base_grand_total + voucher_total = order.base_grand_total else: - voucher_total = voucher_properties.grand_total - - if flt(voucher_total) < (flt(voucher_properties.advance_paid) + total): + voucher_total = order.grand_total + + if flt(voucher_total) < (flt(order.advance_paid) + total): frappe.throw(_("Advance paid against {0} {1} cannot be greater \ than Grand Total {2}").format(reference_type, reference_name, voucher_total)) @@ -228,15 +228,15 @@ class JournalEntry(AccountsController): reference_type = self.reference_types[reference_name] if reference_type in ("Sales Invoice", "Purchase Invoice"): - voucher_properties = frappe.db.get_value(reference_type, reference_name, + invoice = frappe.db.get_value(reference_type, reference_name, ["docstatus", "outstanding_amount"], as_dict=1) - if voucher_properties.docstatus != 1: + if invoice.docstatus != 1: frappe.throw(_("{0} {1} is not submitted").format(reference_type, reference_name)) - if total and flt(voucher_properties.outstanding_amount) < total: + if total and flt(invoice.outstanding_amount) < total: frappe.throw(_("Payment against {0} {1} cannot be greater than Outstanding Amount {2}") - .format(reference_type, reference_name, voucher_properties.outstanding_amount)) + .format(reference_type, reference_name, invoice.outstanding_amount)) def set_against_account(self): accounts_debited, accounts_credited = [], [] @@ -263,21 +263,21 @@ class JournalEntry(AccountsController): 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 = [] for d in self.get("accounts"): account = frappe.db.get_value("Account", d.account, ["account_currency", "account_type"], as_dict=1) d.account_currency = account.account_currency or self.company_currency d.account_type = account.account_type - + if d.account_currency!=self.company_currency and d.account_currency not in alternate_currency: alternate_currency.append(d.account_currency) - + if alternate_currency: if not self.multi_currency: frappe.throw(_("Please check Multi Currency option to allow accounts with other currency")) - + if len(alternate_currency) > 1: frappe.throw(_("Only one alternate currency can be used in a single Journal Entry")) @@ -286,14 +286,14 @@ class JournalEntry(AccountsController): for d in self.get("accounts"): d.debit = flt(flt(d.debit_in_account_currency)*flt(d.exchange_rate), d.precision("debit")) d.credit = flt(flt(d.credit_in_account_currency)*flt(d.exchange_rate), d.precision("credit")) - + def set_exchange_rate(self): for d in self.get("accounts"): if d.account_currency == self.company_currency: d.exchange_rate = 1 elif not d.exchange_rate or d.account_type=="Bank" or \ (d.reference_type in ("Sales Invoice", "Purchase Invoice") and d.reference_name): - d.exchange_rate = get_exchange_rate(d.account, d.account_currency, self.company, + d.exchange_rate = get_exchange_rate(d.account, d.account_currency, self.company, d.reference_type, d.reference_name, d.debit, d.credit, d.exchange_rate) if not d.exchange_rate: @@ -389,10 +389,10 @@ class JournalEntry(AccountsController): for d in self.get('accounts'): if not d.credit_in_account_currency and not d.debit_in_account_currency and diff != 0: blank_row = d - + if not blank_row: blank_row = self.append('accounts', {}) - + blank_row.exchange_rate = 1 if diff>0: blank_row.credit_in_account_currency = diff @@ -473,7 +473,7 @@ class JournalEntry(AccountsController): def validate_empty_accounts_table(self): if not self.get('accounts'): frappe.throw("Accounts table cannot be blank.") - + def set_account_and_party_balance(self): for d in self.get("accounts"): d.account_balance = get_balance_on(account=d.account, date=self.posting_date) @@ -511,14 +511,14 @@ def get_payment_entry_from_sales_invoice(sales_invoice): """Returns new Journal Entry document as dict for given Sales Invoice""" from erpnext.accounts.utils import get_balance_on si = frappe.get_doc("Sales Invoice", sales_invoice) - + # exchange rate - exchange_rate = get_exchange_rate(si.debit_to, si.party_account_currency, si.company, + exchange_rate = get_exchange_rate(si.debit_to, si.party_account_currency, si.company, si.doctype, si.name) - + jv = get_payment_entry(si) jv.remark = 'Payment received against Sales Invoice {0}. {1}'.format(si.name, si.remarks) - + # credit customer row1 = jv.get("accounts")[0] row1.account = si.debit_to @@ -539,7 +539,7 @@ def get_payment_entry_from_sales_invoice(sales_invoice): row2.debit_in_account_currency = si.outstanding_amount else: row2.debit_in_account_currency = si.outstanding_amount * exchange_rate - + # set multi currency check if row1.account_currency != si.company_currency or row2.account_currency != si.company_currency: jv.multi_currency = 1 @@ -550,14 +550,14 @@ def get_payment_entry_from_sales_invoice(sales_invoice): def get_payment_entry_from_purchase_invoice(purchase_invoice): """Returns new Journal Entry document as dict for given Purchase Invoice""" pi = frappe.get_doc("Purchase Invoice", purchase_invoice) - - exchange_rate = get_exchange_rate(pi.debit_to, pi.party_account_currency, pi.company, + + exchange_rate = get_exchange_rate(pi.debit_to, pi.party_account_currency, pi.company, pi.doctype, pi.name) - + jv = get_payment_entry(pi) jv.remark = 'Payment against Purchase Invoice {0}. {1}'.format(pi.name, pi.remarks) jv.exchange_rate = exchange_rate - + # credit supplier row1 = jv.get("accounts")[0] row1.account = pi.credit_to @@ -578,7 +578,7 @@ def get_payment_entry_from_purchase_invoice(purchase_invoice): row2.credit_in_account_currency = pi.outstanding_amount else: row2.credit_in_account_currency = pi.outstanding_amount * exchange_rate - + # set multi currency check if row1.account_currency != pi.company_currency or row2.account_currency != pi.company_currency: jv.multi_currency = 1 @@ -590,7 +590,7 @@ def get_payment_entry_from_sales_order(sales_order): """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: @@ -601,9 +601,9 @@ def get_payment_entry_from_sales_order(sales_order): party_account = get_party_account(so.company, so.customer, "Customer") party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") - + exchange_rate = get_exchange_rate(party_account, party_account_currency, so.company) - + if party_account_currency == so.company_currency: amount = flt(so.base_grand_total) - flt(so.advance_paid) else: @@ -630,7 +630,7 @@ def get_payment_entry_from_sales_order(sales_order): row2.debit_in_account_currency = amount else: row2.debit_in_account_currency = amount * exchange_rate - + # set multi currency check if row1.account_currency != so.company_currency or row2.account_currency != so.company_currency: jv.multi_currency = 1 @@ -649,12 +649,12 @@ def get_payment_entry_from_purchase_order(purchase_order): 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") party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") - + exchange_rate = get_exchange_rate(party_account, party_account_currency, po.company) - + if party_account_currency == po.company_currency: amount = flt(po.base_grand_total) - flt(po.advance_paid) else: @@ -680,7 +680,7 @@ def get_payment_entry_from_purchase_order(purchase_order): row2.credit_in_account_currency = amount else: row2.credit_in_account_currency = amount * exchange_rate - + # set multi currency check if row1.account_currency != po.company_currency or row2.account_currency != po.company_currency: jv.multi_currency = 1 @@ -703,7 +703,7 @@ def get_payment_entry(doc): d2.balance = bank_account["balance"] d2.account_currency = bank_account["account_currency"] d2.account_type = bank_account["account_type"] - d2.exchange_rate = get_exchange_rate(bank_account["account"], + d2.exchange_rate = get_exchange_rate(bank_account["account"], bank_account["account_currency"], doc.company) return jv @@ -731,7 +731,7 @@ def get_outstanding(args): frappe.msgprint(_("No Permission"), raise_exception=1) args = eval(args) company_currency = get_company_currency(args.get("company")) - + if args.get("doctype") == "Journal Entry": condition = " and party=%(party)s" if args.get("party") else "" @@ -746,18 +746,18 @@ def get_outstanding(args): amount_field: abs(against_jv_amount) } elif args.get("doctype") in ("Sales Invoice", "Purchase Invoice"): - invoice = frappe.db.get_value(args["doctype"], args["docname"], + invoice = frappe.db.get_value(args["doctype"], args["docname"], ["outstanding_amount", "conversion_rate"], as_dict=1) exchange_rate = invoice.conversion_rate if (args.get("account_currency") != company_currency) else 1 - + if args["doctype"] == "Sales Invoice": amount_field = "credit_in_account_currency" \ if flt(invoice.outstanding_amount) > 0 else "debit_in_account_currency" else: amount_field = "debit_in_account_currency" \ if flt(invoice.outstanding_amount) > 0 else "credit_in_account_currency" - + return { amount_field: abs(flt(invoice.outstanding_amount)), "exchange_rate": exchange_rate @@ -788,52 +788,51 @@ def get_account_balance_and_party_type(account, date, company, debit=None, credi company_currency = get_company_currency(company) account_details = frappe.db.get_value("Account", account, ["account_type", "account_currency"], as_dict=1) - + if account_details.account_type == "Receivable": party_type = "Customer" elif account_details.account_type == "Payable": party_type = "Supplier" else: party_type = "" - + grid_values = { "balance": get_balance_on(account, date), "party_type": party_type, "account_type": account_details.account_type, "account_currency": account_details.account_currency or company_currency, - "exchange_rate": get_exchange_rate(account, account_details.account_currency, + "exchange_rate": get_exchange_rate(account, account_details.account_currency, company, debit=debit, credit=credit, exchange_rate=exchange_rate) } return grid_values - + @frappe.whitelist() -def get_exchange_rate(account, account_currency, company, +def get_exchange_rate(account, account_currency, company, reference_type=None, reference_name=None, debit=None, credit=None, exchange_rate=None): from erpnext.setup.utils import get_exchange_rate company_currency = get_company_currency(company) account_details = frappe.db.get_value("Account", account, ["account_type", "root_type"], as_dict=1) - + if account_currency != company_currency: if reference_type in ("Sales Invoice", "Purchase Invoice") and reference_name: exchange_rate = frappe.db.get_value(reference_type, reference_name, "conversion_rate") elif account_details.account_type == "Bank" and \ - ((account_details.root_type == "Asset" and flt(credit) > 0) or + ((account_details.root_type == "Asset" and flt(credit) > 0) or (account_details.root_type == "Liability" and debit)): exchange_rate = get_average_exchange_rate(account) - + if not exchange_rate: exchange_rate = get_exchange_rate(account_currency, company_currency) else: exchange_rate = 1 - + return exchange_rate - + def get_average_exchange_rate(account): exchange_rate = 0 bank_balance_in_account_currency = get_balance_on(account) if bank_balance_in_account_currency: bank_balance_in_company_currency = get_balance_on(account, in_account_currency=False) exchange_rate = bank_balance_in_company_currency / bank_balance_in_account_currency - + return exchange_rate - \ No newline at end of file diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 988335f0eb5..20ecbe92afd 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe from frappe import _, scrub -from frappe.utils import getdate, nowdate, flt, cint, cstr +from frappe.utils import getdate, nowdate, flt, cint class ReceivablePayableReport(object): def __init__(self, filters=None): @@ -37,13 +37,13 @@ class ReceivablePayableReport(object): "options": "currency", "width": 120 }) - + columns += [_("Age (Days)") + "::80"] - - for label in ("0-" + cstr(self.filters.range1), - cstr(self.filters.range1) + "-" + cstr(self.filters.range2), - cstr(self.filters.range2) + "-" +cstr(self.filters.range3), - cstr(self.filters.range3) + _("-Above")): + + for label in ("0-{range1}".format(**self.filters), + "{range1}-{range2}".format(**self.filters), + "{range2}-{range3}".format(**self.filters), + "{range3}-{above}".format(range3=self.filters.range3, above=_("Above"))): columns.append({ "label": label, "fieldtype": "Currency", @@ -55,12 +55,15 @@ class ReceivablePayableReport(object): columns += [_("Territory") + ":Link/Territory:80"] if args.get("party_type") == "Supplier": columns += [_("Supplier Type") + ":Link/Supplier Type:80"] - columns += [{ - "fieldname": "currency", - "label": _("Currency"), - "fieldtype": "Data", - "width": 100, - }, _("Remarks") + "::200"] + columns += [ + { + "fieldname": "currency", + "label": _("Currency"), + "fieldtype": "Data", + "width": 100, + }, + _("Remarks") + "::200" + ] return columns @@ -174,7 +177,7 @@ class ReceivablePayableReport(object): def get_voucher_details(self, party_type): voucher_details = frappe._dict() - + if party_type == "Customer": for si in frappe.db.sql("""select name, due_date from `tabSales Invoice` where docstatus=1""", as_dict=1): @@ -190,14 +193,14 @@ class ReceivablePayableReport(object): def get_gl_entries(self, party_type): if not hasattr(self, "gl_entries"): conditions, values = self.prepare_conditions(party_type) - + if self.filters.get(scrub(party_type)): - select_fields = ", debit_in_account_currency as debit, credit_in_account_currency as credit" + select_fields = "debit_in_account_currency as debit, credit_in_account_currency as credit" else: - select_fields = ", debit, credit" - + select_fields = "debit, credit" + self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party, - voucher_type, voucher_no, against_voucher_type, against_voucher, account_currency, remarks {0} + voucher_type, voucher_no, against_voucher_type, against_voucher, account_currency, remarks, {0} from `tabGL Entry` where docstatus < 2 and party_type=%s {1} order by posting_date, party""" .format(select_fields, conditions), values, as_dict=True) @@ -207,7 +210,7 @@ class ReceivablePayableReport(object): def prepare_conditions(self, party_type): conditions = [""] values = [party_type] - + party_type_field = scrub(party_type) if self.filters.company: @@ -216,7 +219,7 @@ class ReceivablePayableReport(object): if self.filters.get(party_type_field): conditions.append("party=%s") - values.append(self.filters.get(party_type_field)) + values.append(self.filters.get(party_type_field)) return " and ".join(conditions), values diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 39527df97ab..ceb993096ac 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -19,14 +19,14 @@ class InvalidCurrency(frappe.ValidationError): pass class AccountsController(TransactionBase): def __init__(self, arg1, arg2=None): super(AccountsController, self).__init__(arg1, arg2) - + @property def company_currency(self): if not hasattr(self, "__company_currency"): self.__company_currency = get_company_currency(self.company) - + return self.__company_currency - + def validate(self): if self.get("_action") and self._action != "update_after_submit": self.set_missing_values(for_validate=True) @@ -166,7 +166,7 @@ class AccountsController(TransactionBase): item.set("discount_percentage", ret.get("discount_percentage")) if ret.get("pricing_rule_for") == "Price": item.set("pricing_list_rate", ret.get("pricing_list_rate")) - + def set_taxes(self): if not self.meta.get_field("taxes"): @@ -215,15 +215,15 @@ class AccountsController(TransactionBase): 'party': None }) gl_dict.update(args) - + if not 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) - + return gl_dict - + def validate_account_currency(self, account, account_currency=None): if self.doctype == "Journal Entry": return @@ -233,26 +233,26 @@ class AccountsController(TransactionBase): 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 self.doctype!="Journal Entry" + .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 self.doctype!="Journal Entry" 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["account_currency"] = self.company_currency if account_currency==self.company_currency \ else account_currency - + # set debit/credit in account currency if not provided if flt(gl_dict.debit) and not flt(gl_dict.debit_in_account_currency): gl_dict.debit_in_account_currency = gl_dict.debit if account_currency==self.company_currency \ else flt(gl_dict.debit / (self.get("conversion_rate")), 2) - + if flt(gl_dict.credit) and not flt(gl_dict.credit_in_account_currency): gl_dict.credit_in_account_currency = gl_dict.credit if account_currency==self.company_currency \ else flt(gl_dict.credit / (self.get("conversion_rate")), 2) - + return gl_dict def clear_unallocated_advances(self, childtype, parentfield): @@ -267,13 +267,13 @@ class AccountsController(TransactionBase): # conver sales_order to "Sales Order" reference_type = against_order_field.replace("_", " ").title() - + condition = "" if order_list: in_placeholder = ', '.join(['%s'] * len(order_list)) condition = "or (t2.reference_type = '{0}' and ifnull(t2.reference_name, '') in ({1}))"\ .format(reference_type, in_placeholder) - + res = frappe.db.sql(""" select t1.name as jv_no, t1.remark, t2.{0} as amount, t2.name as jv_detail_no, @@ -381,7 +381,7 @@ class AccountsController(TransactionBase): from `tabJournal Entry Account` where - reference_type = %s and reference_name = %s + 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)) @@ -409,9 +409,9 @@ class AccountsController(TransactionBase): party_type, party = self.get_party() if party_type: - if frappe.db.get_value(party_type, party, "is_frozen"): + if frappe.db.get_value(party_type, party, "is_frozen"): frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) - + def get_party(self): party_type = None if self.meta.get_field("customer"): @@ -419,22 +419,22 @@ class AccountsController(TransactionBase): elif self.meta.get_field("supplier"): party_type = 'Supplier' - + party = self.get(party_type.lower()) if party_type else None - + return party_type, party - + def validate_currency(self): if self.get("currency"): party_type, party = self.get_party() if party_type and party: party_account_currency = frappe.db.get_value(party_type, party, "party_account_currency") \ or self.company_currency - + if party_account_currency != self.company_currency and self.currency != party_account_currency: frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}") .format(party_type, party, party_account_currency), InvalidCurrency) - + @frappe.whitelist() def get_tax_rate(account_head): return frappe.db.get_value("Account", account_head, "tax_rate")