From a5f40941ae43326c3222304adb5cd167dd923335 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 16 Jun 2017 15:21:36 +0530 Subject: [PATCH 01/12] [Enhance] Companywise perpetual inventory setting --- erpnext/__init__.py | 11 +- .../accounts_settings/accounts_settings.json | 13 +- .../accounts_settings/accounts_settings.py | 16 +- .../doctype/pos_profile/pos_profile.js | 17 + .../doctype/pos_profile/pos_profile.json | 4 +- .../purchase_invoice/purchase_invoice.py | 4 +- .../doctype/sales_invoice/sales_invoice.js | 28 +- .../doctype/sales_invoice/sales_invoice.py | 8 +- erpnext/accounts/general_ledger.py | 6 +- .../report/gross_profit/gross_profit.py | 2 +- erpnext/controllers/buying_controller.py | 2 +- erpnext/controllers/stock_controller.py | 4 +- erpnext/patches.txt | 2 +- .../v7_0/create_warehouse_nestedset.py | 7 +- ...ouse_ledger_gl_entries_for_transactions.py | 10 +- .../repost_future_gle_for_purchase_invoice.py | 15 +- .../repost_gle_for_pi_with_update_stock.py | 6 +- .../v8_0/move_perpetual_inventory_setting.py | 10 + erpnext/setup/doctype/company/company.js | 2 +- erpnext/setup/doctype/company/company.json | 34 +- erpnext/setup/doctype/company/company.py | 2 +- erpnext/setup/setup_wizard/setup_wizard.py | 5 +- erpnext/startup/boot.py | 4 +- .../doctype/delivery_note/delivery_note.js | 40 +- .../purchase_receipt/purchase_receipt.js | 17 +- .../purchase_receipt_item.json | 3789 +++++++++-------- .../stock/doctype/stock_entry/stock_entry.js | 32 +- .../stock_entry_detail.json | 8 +- .../stock_reconciliation.js | 27 +- .../stock_reconciliation.json | 6 +- .../stock_reconciliation.py | 2 +- erpnext/stock/stock_ledger.py | 7 +- 32 files changed, 2160 insertions(+), 1980 deletions(-) create mode 100644 erpnext/patches/v8_0/move_perpetual_inventory_setting.py diff --git a/erpnext/__init__.py b/erpnext/__init__.py index a6b5b7206b..7a4ccd625f 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -36,12 +36,13 @@ def get_company_currency(company): frappe.flags.company_currency[company] = frappe.db.get_value('Company', company, 'default_currency') return frappe.flags.company_currency[company] +def set_perpetual_inventory(enable=1, company=None): + if not company: + company = get_default_company() -def set_perpetual_inventory(enable=1): - accounts_settings = frappe.get_doc("Accounts Settings") - accounts_settings.auto_accounting_for_stock = enable - accounts_settings.save() - + company = frappe.get_doc("Company", company) + company.enable_perpetual_inventory = enable + company.save() def encode_company_abbr(name, company): '''Returns name encoded with company abbreviation''' diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 4f268a24cc..0ce3d5dea9 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -14,6 +14,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -22,7 +23,7 @@ "description": "If enabled, the system will post accounting entries for inventory automatically.", "fieldname": "auto_accounting_for_stock", "fieldtype": "Check", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -44,6 +45,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -73,6 +75,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -103,6 +106,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -131,6 +135,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -161,6 +166,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -190,6 +196,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -219,6 +226,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -249,6 +257,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -290,7 +299,7 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-04-18 13:35:59.166250", + "modified": "2017-06-16 17:39:50.614522", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py index 42467558c8..dd33ff1ab2 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -11,18 +11,4 @@ from frappe.model.document import Document class AccountsSettings(Document): def on_update(self): - frappe.db.set_default("auto_accounting_for_stock", self.auto_accounting_for_stock) - - if cint(self.auto_accounting_for_stock): - # set default perpetual account in company - for company in frappe.db.sql("select name from tabCompany"): - company = frappe.get_doc("Company", company[0]) - company.flags.ignore_permissions = True - company.save() - - # validate warehouse linked to company - warehouse_with_no_company = frappe.db.sql_list("""select name from tabWarehouse - where disabled=0 and company is null or company = ''""") - if warehouse_with_no_company: - frappe.throw(_("Company is missing in warehouses {0}") - .format(comma_and(warehouse_with_no_company))) \ No newline at end of file + pass \ No newline at end of file diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.js b/erpnext/accounts/doctype/pos_profile/pos_profile.js index 83016a903d..0927e81d6c 100755 --- a/erpnext/accounts/doctype/pos_profile/pos_profile.js +++ b/erpnext/accounts/doctype/pos_profile/pos_profile.js @@ -26,6 +26,23 @@ frappe.ui.form.on("POS Profile", "onload", function(frm) { }); }); +frappe.ui.form.on('POS Profile', { + refresh: function(frm) { + if(frm.doc.company) { + frm.trigger("toggle_display_account_head"); + } + }, + + company: function(frm) { + frm.trigger("toggle_display_account_head"); + }, + + toggle_display_account_head: function(frm) { + frm.toggle_display('expense_account', + frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory); + } +}) + // Income Account // -------------------------------- cur_frm.fields_dict['income_account'].get_query = function(doc,cdt,cdn) { diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.json b/erpnext/accounts/doctype/pos_profile/pos_profile.json index c2c75e1d35..93aca1b361 100644 --- a/erpnext/accounts/doctype/pos_profile/pos_profile.json +++ b/erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -1132,7 +1132,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:cint(sys_defaults.auto_accounting_for_stock)", + "depends_on": "", "fieldname": "expense_account", "fieldtype": "Link", "hidden": 0, @@ -1201,7 +1201,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-15 20:07:55.682137", + "modified": "2017-06-16 17:04:33.165676", "modified_by": "Administrator", "module": "Accounts", "name": "POS Profile", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index f27b2c879a..8a7bbe7e32 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -164,7 +164,7 @@ class PurchaseInvoice(BuyingController): frappe.msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True) def set_expense_account(self, for_validate=False): - auto_accounting_for_stock = cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) + auto_accounting_for_stock = self.get_company_default("enable_perpetual_inventory") if auto_accounting_for_stock: stock_not_billed_account = self.get_company_default("stock_received_but_not_billed") @@ -336,7 +336,7 @@ class PurchaseInvoice(BuyingController): def get_gl_entries(self, warehouse_account=None): self.auto_accounting_for_stock = \ - cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) + cint(self.get_company_default("enable_perpetual_inventory")) self.stock_received_but_not_billed = self.get_company_default("stock_received_but_not_billed") self.expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation") diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 21075819b2..595b7bf8d1 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -400,19 +400,6 @@ cur_frm.set_query("income_account", "items", function(doc) { } }); -// expense account -if (frappe.sys_defaults.auto_accounting_for_stock) { - cur_frm.fields_dict['items'].grid.get_field('expense_account').get_query = function(doc) { - return { - filters: { - 'report_type': 'Profit and Loss', - 'company': doc.company, - "is_group": 0 - } - } - } -} - // Cost Center in Details Table // ----------------------------- @@ -502,6 +489,21 @@ frappe.ui.form.on('Sales Invoice', { filters: {'project': doc.project} } } + + // expense account + frm.fields_dict['items'].grid.get_field('expense_account').get_query = function(doc) { + if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { + return { + filters: { + 'report_type': 'Profit and Loss', + 'company': doc.company, + "is_group": 0 + } + } + } + } + + }, project: function(frm){ diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 24da970db4..20d58b90f8 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -559,6 +559,8 @@ class SalesInvoice(SellingController): throw(_("Delivery Note {0} is not submitted").format(d.delivery_note)) def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False): + self.auto_accounting_for_stock = self.get_company_default("enable_perpetual_inventory") + if not self.grand_total: return @@ -580,11 +582,11 @@ class SalesInvoice(SellingController): self.doctype, self.return_against if cint(self.is_return) else self.name) if repost_future_gle and cint(self.update_stock) \ - and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + and cint(self.auto_accounting_for_stock): items, warehouses = self.get_items_and_warehouses() update_gl_entries_after(self.posting_date, self.posting_time, warehouses, items) elif self.docstatus == 2 and cint(self.update_stock) \ - and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + and cint(self.auto_accounting_for_stock): from erpnext.accounts.general_ledger import delete_gl_entries delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) @@ -672,7 +674,7 @@ class SalesInvoice(SellingController): ) # expense account gl entries - if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) \ + if cint(self.auto_accounting_for_stock) \ and cint(self.update_stock): gl_entries += super(SalesInvoice, self).get_gl_entries() diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index 5541cc05f6..a5f7ad2472 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -80,7 +80,7 @@ def check_if_in_list(gle, gl_map): def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False): if not from_repost: - validate_account_for_auto_accounting_for_stock(gl_map) + validate_account_for_perpetual_inventory(gl_map) round_off_debit_credit(gl_map) @@ -100,8 +100,8 @@ def make_entry(args, adv_adj, update_outstanding, from_repost=False): gle.run_method("on_update_with_args", adv_adj, update_outstanding, from_repost) gle.submit() -def validate_account_for_auto_accounting_for_stock(gl_map): - if cint(frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock")) \ +def validate_account_for_perpetual_inventory(gl_map): + if cint(frappe.db.get_value("Company", gl_map[0].company, 'enable_perpetual_inventory')) \ and gl_map[0].voucher_type=="Journal Entry": aii_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount where account_type = 'Stock' and is_group=0""")] diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 4b28f1f35d..bb5a82d767 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -227,7 +227,7 @@ class GrossProfitGenerator(object): if not average_buying_rate: average_buying_rate = get_valuation_rate(item_code, row.warehouse, row.parenttype, row.parent, allow_zero_rate=True, - currency=self.filters.currency) + currency=self.filters.currency, company=self.filters.company) self.average_buying_rate[item_code] = flt(average_buying_rate) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index d770af3cdf..553c7b345a 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -227,7 +227,7 @@ class BuyingController(StockController): }) if not rm.rate: rm.rate = get_valuation_rate(bom_item.item_code, self.supplier_warehouse, - self.doctype, self.name, currency=self.company_currency) + self.doctype, self.name, currency=self.company_currency, company = self.company) else: rm.rate = bom_item.rate diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 822712fa4d..f8df04d680 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -21,7 +21,7 @@ class StockController(AccountsController): if self.docstatus == 2: delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) - if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + if cint(self.get_company_default("enable_perpetual_inventory")): warehouse_account = get_warehouse_account_map() if self.docstatus==1: @@ -95,7 +95,7 @@ class StockController(AccountsController): def update_stock_ledger_entries(self, sle): sle.valuation_rate = get_valuation_rate(sle.item_code, sle.warehouse, - self.doctype, self.name, currency=self.company_currency) + self.doctype, self.name, currency=self.company_currency, company=self.company) sle.stock_value = flt(sle.qty_after_transaction) * flt(sle.valuation_rate) sle.stock_value_difference = flt(sle.actual_qty) * flt(sle.valuation_rate) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 8068ea61e9..23e6f80606 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -1,5 +1,5 @@ execute:import unidecode # new requirement - +erpnext.patches.v8_0.move_perpetual_inventory_setting erpnext.patches.v4_0.validate_v3_patch erpnext.patches.v4_0.fix_employee_user_id erpnext.patches.v4_0.remove_employee_role_if_no_employee diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py index 8c52c3ea3d..964df1f18d 100644 --- a/erpnext/patches/v7_0/create_warehouse_nestedset.py +++ b/erpnext/patches/v7_0/create_warehouse_nestedset.py @@ -51,7 +51,8 @@ def check_is_warehouse_associated_with_company(): def make_warehouse_nestedset(company=None): validate_parent_account_for_warehouse(company) stock_account_group = get_stock_account_group(company.name) - if not stock_account_group and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + enable_perpetual_inventory = cint(frappe.db.get_value("Company", company, 'enable_perpetual_inventory')) or 0 + if not stock_account_group and enable_perpetual_inventory: return if company: @@ -65,14 +66,14 @@ def make_warehouse_nestedset(company=None): create_default_warehouse_group(company, stock_account_group, ignore_mandatory) set_parent_to_warehouse(warehouse_group, company) - if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + if enable_perpetual_inventory: set_parent_to_warehouse_account(company) def validate_parent_account_for_warehouse(company=None): if not company: return - if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + if cint(frappe.db.get_value("Company", company, 'enable_perpetual_inventory')): parent_account = frappe.db.sql("""select name from tabAccount where account_type='Stock' and company=%s and is_group=1 and (warehouse is null or warehouse = '')""", company.name) diff --git a/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py b/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py index 174bb119c1..5a98ab1704 100644 --- a/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py +++ b/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py @@ -5,15 +5,13 @@ from __future__ import unicode_literals import frappe def execute(): - if not frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock"): - return - frappe.reload_doctype("Account") - warehouses = frappe.db.sql_list("""select name from tabAccount + warehouses = frappe.db.sql_list("""select name, company from tabAccount where account_type = 'Stock' and is_group = 0 - and (warehouse is null or warehouse = '')""") - if warehouses: + and (warehouse is null or warehouse = '')""", as_dict) + warehouses = [d.name for d in warehouses if frappe.db.get_value('Company', d.company, 'enable_perpetual_inventory')] + if len(warehouses) > 0: warehouses = set_warehouse_for_stock_account(warehouses) if not warehouses: return diff --git a/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py b/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py index f5aee1558a..22f9db6b2b 100644 --- a/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py +++ b/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py @@ -8,17 +8,16 @@ from erpnext.stock import get_warehouse_account_map from erpnext.controllers.stock_controller import update_gl_entries_after def execute(): - if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): - return - + company_list = frappe.db.sql_list("""Select name from tabCompany where enable_perpetual_inventory = 1""") frappe.reload_doc('accounts', 'doctype', 'sales_invoice') frappe.reload_doctype("Purchase Invoice") wh_account = get_warehouse_account_map() - for pi in frappe.get_all("Purchase Invoice", filters={"docstatus": 1, "update_stock": 1}): - pi_doc = frappe.get_doc("Purchase Invoice", pi.name) - items, warehouses = pi_doc.get_items_and_warehouses() - update_gl_entries_after(pi_doc.posting_date, pi_doc.posting_time, warehouses, items, wh_account) + for pi in frappe.get_all("Purchase Invoice", fields=["name", "company"], filters={"docstatus": 1, "update_stock": 1}): + if pi.company in company_list: + pi_doc = frappe.get_doc("Purchase Invoice", pi.name) + items, warehouses = pi_doc.get_items_and_warehouses() + update_gl_entries_after(pi_doc.posting_date, pi_doc.posting_time, warehouses, items, wh_account) - frappe.db.commit() \ No newline at end of file + frappe.db.commit() \ No newline at end of file diff --git a/erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py b/erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py index 9f159be2da..2d1a15181b 100644 --- a/erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py +++ b/erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py @@ -6,13 +6,11 @@ import frappe from frappe.utils import cint def execute(): - if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): - return - frappe.reload_doctype("Purchase Invoice") for pi in frappe.db.sql("""select name from `tabPurchase Invoice` - where update_stock=1 and docstatus=1 order by posting_date asc""", as_dict=1): + where company in(select name from tabCompany where enable_perpetual_inventory = 1) and + update_stock=1 and docstatus=1 order by posting_date asc""", as_dict=1): frappe.db.sql("""delete from `tabGL Entry` where voucher_type = 'Purchase Invoice' and voucher_no = %s""", pi.name) diff --git a/erpnext/patches/v8_0/move_perpetual_inventory_setting.py b/erpnext/patches/v8_0/move_perpetual_inventory_setting.py new file mode 100644 index 0000000000..3010b4dec2 --- /dev/null +++ b/erpnext/patches/v8_0/move_perpetual_inventory_setting.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.reload_doctype('Company') + enabled = frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock") or 0 + frappe.db.sql("""update tabCompany set enable_perpetual_inventory = {0}""".format(enabled)) \ No newline at end of file diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 0c55ec4c39..6c3d86d11a 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -156,7 +156,7 @@ erpnext.company.setup_queries = function(frm) { erpnext.company.set_custom_query(frm, v); }); - if (frappe.sys_defaults.auto_accounting_for_stock) { + if (frm.doc.enable_perpetual_inventory) { $.each([ ["stock_adjustment_account", {"root_type": "Expense", "account_type": "Stock Adjustment"}], diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index cd11057624..69b2c3aa19 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -1122,6 +1122,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "fieldname": "enable_perpetual_inventory", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Enable Perpetual Inventory", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1243,6 +1274,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1777,7 +1809,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-14 11:06:33.629948", + "modified": "2017-06-15 19:46:10.875108", "modified_by": "Administrator", "module": "Setup", "name": "Company", diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 0ddadf0ba6..a179959542 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -146,7 +146,7 @@ class Company(Document): self._set_default_account("accumulated_depreciation_account", "Accumulated Depreciation") self._set_default_account("depreciation_expense_account", "Depreciation") - if cint(frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock")): + if self.enable_perpetual_inventory: self._set_default_account("stock_received_but_not_billed", "Stock Received But Not Billed") self._set_default_account("default_inventory_account", "Stock") self._set_default_account("stock_adjustment_account", "Stock Adjustment") diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 5daa4e4d9e..9d814fd309 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -85,6 +85,7 @@ def create_fiscal_year_and_company(args): frappe.get_doc({ "doctype":"Company", 'company_name':args.get('company_name').strip(), + 'enable_perpetual_inventory': 1, 'abbr':args.get('company_abbr'), 'default_currency':args.get('currency'), 'country': args.get('country'), @@ -159,10 +160,6 @@ def set_defaults(args): frappe.db.set_value("System Settings", None, "email_footer_address", args.get("company")) - accounts_settings = frappe.get_doc("Accounts Settings") - accounts_settings.auto_accounting_for_stock = 1 - accounts_settings.save() - stock_settings = frappe.get_doc("Stock Settings") stock_settings.item_naming_by = "Item Code" stock_settings.valuation_method = "FIFO" diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py index 6e71769d97..80a7834ba7 100644 --- a/erpnext/startup/boot.py +++ b/erpnext/startup/boot.py @@ -27,8 +27,8 @@ def boot_session(bootinfo): bootinfo.setup_complete = frappe.db.sql("""select name from tabCompany limit 1""") and 'Yes' or 'No' - bootinfo.docs += frappe.db.sql("""select name, default_currency, cost_center, - default_terms, default_letter_head, default_bank_account from `tabCompany`""", + bootinfo.docs += frappe.db.sql("""select name, default_currency, cost_center, default_terms, + default_letter_head, default_bank_account, enable_perpetual_inventory from `tabCompany`""", as_dict=1, update={"doctype":":Company"}) def load_country_and_currency(bootinfo): diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index faa1fac5dc..35658c63d8 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -38,8 +38,9 @@ frappe.ui.form.on("Delivery Note", { } }); - if (frappe.sys_defaults.auto_accounting_for_stock) { - frm.set_query('expense_account', 'items', function(doc, cdt, cdn) { + + frm.set_query('expense_account', 'items', function(doc, cdt, cdn) { + if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { return { filters: { "report_type": "Profit and Loss", @@ -47,17 +48,20 @@ frappe.ui.form.on("Delivery Note", { "is_group": 0 } } - }); + } + }); - frm.set_query('cost_center', 'items', function(doc, cdt, cdn) { + frm.set_query('cost_center', 'items', function(doc, cdt, cdn) { + if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { return { filters: { 'company': doc.company, "is_group": 0 } } - }); - } + } + }); + $.extend(frm.cscript, new erpnext.stock.DeliveryNoteController({frm: frm})); }, @@ -137,7 +141,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( if (doc.docstatus==1) { this.show_stock_ledger(); - if (cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { + if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { this.show_general_ledger(); } if (this.frm.has_perm("submit") && doc.status !== "Closed") { @@ -164,10 +168,6 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( __("Status")) } erpnext.stock.delivery_note.set_print_hide(doc, dt, dn); - - // unhide expense_account and cost_center is auto_accounting_for_stock enabled - var aii_enabled = cint(frappe.sys_defaults.auto_accounting_for_stock) - this.frm.fields_dict["items"].grid.set_column_disp(["expense_account", "cost_center"], aii_enabled); }, make_sales_invoice: function() { @@ -225,6 +225,24 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( }); +frappe.ui.form.on('Delivery Note', { + setup: function(frm) { + if(frm.doc.company) { + frm.trigger("unhide_account_head"); + } + }, + + company: function(frm) { + frm.trigger("unhide_account_head"); + }, + + unhide_account_head: function(frm) { + // unhide expense_account and cost_center if perpetual inventory is enabled in the company + var aii_enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory + frm.fields_dict["items"].grid.set_column_disp(["expense_account", "cost_center"], aii_enabled); + } +}) + erpnext.stock.delivery_note.set_print_hide = function(doc, cdt, cdn){ var dn_fields = frappe.meta.docfield_map['Delivery Note']; diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index c9981408d3..fc92486c3b 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -33,6 +33,21 @@ frappe.ui.form.on("Purchase Receipt", { } }); + }, + + refresh: function(frm) { + if(frm.doc.company) { + frm.trigger("toggle_display_account_head"); + } + }, + + company: function(frm) { + frm.trigger("toggle_display_account_head"); + }, + + toggle_display_account_head: function(frm) { + var enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory + frm.fields_dict["items"].grid.set_column_disp(["cost_center"], enabled); } }); @@ -47,7 +62,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend this._super(); if(this.frm.doc.docstatus===1) { this.show_stock_ledger(); - if (cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { + if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { this.show_general_ledger(); } } diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json index e18e532941..2d87257894 100755 --- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -1,1996 +1,2061 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "hash", - "beta": 0, - "creation": "2013-05-24 19:29:10", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 1, + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "hash", + "beta": 0, + "creation": "2013-05-24 19:29:10", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 1, "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "barcode", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Barcode", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "barcode", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Barcode", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_2", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_2", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 3, - "fieldname": "item_code", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Item Code", - "length": 0, - "no_copy": 0, - "oldfieldname": "item_code", - "oldfieldtype": "Link", - "options": "Item", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 3, + "fieldname": "item_code", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Item Code", + "length": 0, + "no_copy": 0, + "oldfieldname": "item_code", + "oldfieldtype": "Link", + "options": "Item", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "item_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Item Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "item_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "item_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item Name", + "length": 0, + "no_copy": 0, + "oldfieldname": "item_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "fieldname": "section_break_4", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Description", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "section_break_4", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "description", - "fieldtype": "Text Editor", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Description", - "length": 0, - "no_copy": 0, - "oldfieldname": "description", - "oldfieldtype": "Text", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "300px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "oldfieldname": "description", + "oldfieldtype": "Text", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "300px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "300px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "col_break1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "image", - "fieldtype": "Attach", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Image", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "image", + "fieldtype": "Attach", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Image", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "image_view", - "fieldtype": "Image", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Image View", - "length": 0, - "no_copy": 0, - "options": "image", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "image_view", + "fieldtype": "Image", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Image View", + "length": 0, + "no_copy": 0, + "options": "image", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "received_and_accepted", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Received and Accepted", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "received_and_accepted", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Received and Accepted", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "received_qty", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Recd Quantity", - "length": 0, - "no_copy": 0, - "oldfieldname": "received_qty", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "received_qty", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Recd Quantity", + "length": 0, + "no_copy": 0, + "oldfieldname": "received_qty", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 2, - "fieldname": "qty", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Accepted Quantity", - "length": 0, - "no_copy": 0, - "oldfieldname": "qty", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 2, + "fieldname": "qty", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Accepted Quantity", + "length": 0, + "no_copy": 0, + "oldfieldname": "qty", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rejected_qty", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rejected Quantity", - "length": 0, - "no_copy": 0, - "oldfieldname": "rejected_qty", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rejected_qty", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rejected Quantity", + "length": 0, + "no_copy": 0, + "oldfieldname": "rejected_qty", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "col_break2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "uom", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "UOM", - "length": 0, - "no_copy": 0, - "oldfieldname": "uom", - "oldfieldtype": "Link", - "options": "UOM", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "uom", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "UOM", + "length": 0, + "no_copy": 0, + "oldfieldname": "uom", + "oldfieldtype": "Link", + "options": "UOM", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "stock_uom", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Stock UOM", - "length": 0, - "no_copy": 0, - "oldfieldname": "stock_uom", - "oldfieldtype": "Data", - "options": "UOM", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "stock_uom", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Stock UOM", + "length": 0, + "no_copy": 0, + "oldfieldname": "stock_uom", + "oldfieldtype": "Data", + "options": "UOM", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "conversion_factor", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Conversion Factor", - "length": 0, - "no_copy": 0, - "oldfieldname": "conversion_factor", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "conversion_factor", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Conversion Factor", + "length": 0, + "no_copy": 0, + "oldfieldname": "conversion_factor", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rate_and_amount", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rate and Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rate_and_amount", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rate and Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "price_list_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Price List Rate", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "price_list_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Price List Rate", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "price_list_rate", - "fieldname": "discount_percentage", - "fieldtype": "Percent", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Discount on Price List Rate (%)", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "price_list_rate", + "fieldname": "discount_percentage", + "fieldtype": "Percent", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Discount on Price List Rate (%)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "col_break3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "base_price_list_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Price List Rate (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_price_list_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Price List Rate (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "sec_break1", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "sec_break1", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 3, - "fieldname": "rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "import_rate", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 3, + "fieldname": "rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "import_rate", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Amount", - "length": 0, - "no_copy": 0, - "oldfieldname": "import_amount", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Amount", + "length": 0, + "no_copy": 0, + "oldfieldname": "import_amount", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "col_break4", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "base_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rate (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_rate", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rate (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_rate", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "base_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amount (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amount (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "amount", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "pricing_rule", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Pricing Rule", - "length": 0, - "no_copy": 0, - "options": "Pricing Rule", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "pricing_rule", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Pricing Rule", + "length": 0, + "no_copy": 0, + "options": "Pricing Rule", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_29", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_29", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "net_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Net Rate", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "net_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Net Rate", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 2, - "fieldname": "net_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Net Amount", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 2, + "fieldname": "net_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Net Amount", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_32", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_32", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "base_net_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Net Rate (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_net_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Net Rate (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "base_net_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Net Amount (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_net_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Net Amount (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "warehouse_and_reference", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Warehouse and Reference", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "warehouse_and_reference", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Warehouse and Reference", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "warehouse", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Accepted Warehouse", - "length": 0, - "no_copy": 0, - "oldfieldname": "warehouse", - "oldfieldtype": "Link", - "options": "Warehouse", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "warehouse", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Accepted Warehouse", + "length": 0, + "no_copy": 0, + "oldfieldname": "warehouse", + "oldfieldtype": "Link", + "options": "Warehouse", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rejected_warehouse", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rejected Warehouse", - "length": 0, - "no_copy": 1, - "oldfieldname": "rejected_warehouse", - "oldfieldtype": "Link", - "options": "Warehouse", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rejected_warehouse", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rejected Warehouse", + "length": 0, + "no_copy": 1, + "oldfieldname": "rejected_warehouse", + "oldfieldtype": "Link", + "options": "Warehouse", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "quality_inspection", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Quality Inspection", - "length": 0, - "no_copy": 1, - "oldfieldname": "qa_no", - "oldfieldtype": "Link", - "options": "Quality Inspection", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "quality_inspection", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Quality Inspection", + "length": 0, + "no_copy": 1, + "oldfieldname": "qa_no", + "oldfieldtype": "Link", + "options": "Quality Inspection", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_40", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_40", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "purchase_order", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Purchase Order", - "length": 0, - "no_copy": 1, - "oldfieldname": "prevdoc_docname", - "oldfieldtype": "Link", - "options": "Purchase Order", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "purchase_order", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Purchase Order", + "length": 0, + "no_copy": 1, + "oldfieldname": "prevdoc_docname", + "oldfieldtype": "Link", + "options": "Purchase Order", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "schedule_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Required By", - "length": 0, - "no_copy": 0, - "oldfieldname": "schedule_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "schedule_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Required By", + "length": 0, + "no_copy": 0, + "oldfieldname": "schedule_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "stock_qty", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Qty as per Stock UOM", - "length": 0, - "no_copy": 0, - "oldfieldname": "stock_qty", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "stock_qty", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Qty as per Stock UOM", + "length": 0, + "no_copy": 0, + "oldfieldname": "stock_qty", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_45", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_45", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "serial_no", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Serial No", - "length": 0, - "no_copy": 1, - "oldfieldname": "serial_no", - "oldfieldtype": "Text", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "serial_no", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Serial No", + "length": 0, + "no_copy": 1, + "oldfieldname": "serial_no", + "oldfieldtype": "Text", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "batch_no", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Batch No", - "length": 0, - "no_copy": 0, - "oldfieldname": "batch_no", - "oldfieldtype": "Link", - "options": "Batch", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "batch_no", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Batch No", + "length": 0, + "no_copy": 0, + "oldfieldname": "batch_no", + "oldfieldtype": "Link", + "options": "Batch", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_48", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_48", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rejected_serial_no", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rejected Serial No", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rejected_serial_no", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rejected Serial No", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_50", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_50", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "project", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Project", - "length": 0, - "no_copy": 0, - "options": "Project", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "project", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Project", + "length": 0, + "no_copy": 0, + "options": "Project", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": ":Company", - "depends_on": "eval:cint(sys_defaults.auto_accounting_for_stock)", - "fieldname": "cost_center", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Cost Center", - "length": 0, - "no_copy": 0, - "options": "Cost Center", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": ":Company", + "depends_on": "", + "fieldname": "cost_center", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Cost Center", + "length": 0, + "no_copy": 0, + "options": "Cost Center", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "purchase_order_item", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Purchase Order Item", - "length": 0, - "no_copy": 1, - "oldfieldname": "prevdoc_detail_docname", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "purchase_order_item", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Purchase Order Item", + "length": 0, + "no_copy": 1, + "oldfieldname": "prevdoc_detail_docname", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "col_break5", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break5", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "allow_zero_valuation_rate", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Allow Zero Valuation Rate", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "allow_zero_valuation_rate", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allow Zero Valuation Rate", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "bom", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "BOM", - "length": 0, - "no_copy": 1, - "options": "BOM", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "bom", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "BOM", + "length": 0, + "no_copy": 1, + "options": "BOM", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "billed_amt", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Billed Amt", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "billed_amt", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Billed Amt", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "landed_cost_voucher_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Landed Cost Voucher Amount", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "landed_cost_voucher_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Landed Cost Voucher Amount", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "brand", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Brand", - "length": 0, - "no_copy": 0, - "oldfieldname": "brand", - "oldfieldtype": "Link", - "options": "Brand", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "brand", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Brand", + "length": 0, + "no_copy": 0, + "oldfieldname": "brand", + "oldfieldtype": "Link", + "options": "Brand", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "item_group", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Item Group", - "length": 0, - "no_copy": 0, - "oldfieldname": "item_group", - "oldfieldtype": "Link", - "options": "Item Group", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "item_group", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item Group", + "length": 0, + "no_copy": 0, + "oldfieldname": "item_group", + "oldfieldtype": "Link", + "options": "Item Group", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rm_supp_cost", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Raw Materials Supplied Cost", - "length": 0, - "no_copy": 1, - "oldfieldname": "rm_supp_cost", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rm_supp_cost", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Raw Materials Supplied Cost", + "length": 0, + "no_copy": 1, + "oldfieldname": "rm_supp_cost", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "item_tax_amount", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Item Tax Amount", - "length": 0, - "no_copy": 1, - "oldfieldname": "item_tax_amount", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "item_tax_amount", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item Tax Amount", + "length": 0, + "no_copy": 1, + "oldfieldname": "item_tax_amount", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "valuation_rate", - "fieldtype": "Currency", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Valuation Rate", - "length": 0, - "no_copy": 1, - "oldfieldname": "valuation_rate", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "80px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "valuation_rate", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Valuation Rate", + "length": 0, + "no_copy": 1, + "oldfieldname": "valuation_rate", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "80px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "80px" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Tax detail table fetched from item master as a string and stored in this field.\nUsed for Taxes and Charges", - "fieldname": "item_tax_rate", - "fieldtype": "Code", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Item Tax Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "item_tax_rate", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Tax detail table fetched from item master as a string and stored in this field.\nUsed for Taxes and Charges", + "fieldname": "item_tax_rate", + "fieldtype": "Code", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item Tax Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "item_tax_rate", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "page_break", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Page Break", - "length": 0, - "no_copy": 0, - "oldfieldname": "page_break", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "page_break", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Page Break", + "length": 0, + "no_copy": 0, + "oldfieldname": "page_break", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2017-04-19 11:54:00.260886", - "modified_by": "Administrator", - "module": "Stock", - "name": "Purchase Receipt Item", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 1, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2017-06-16 17:23:01.404744", + "modified_by": "Administrator", + "module": "Stock", + "name": "Purchase Receipt Item", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 0, "track_seen": 0 -} +} \ No newline at end of file diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 6303df1722..6a044f78e8 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -67,6 +67,10 @@ frappe.ui.form.on('Stock Entry', { }); }); } + + if(frm.doc.company) { + frm.trigger("toggle_display_account_head"); + } }, purpose: function(frm) { frm.fields_dict.items.grid.refresh(); @@ -78,6 +82,7 @@ frappe.ui.form.on('Stock Entry', { if(company_doc.default_letter_head) { frm.set_value("letter_head", company_doc.default_letter_head); } + frm.trigger("toggle_display_account_head"); } }, set_serial_no: function(frm, cdt, cdn) { @@ -98,6 +103,11 @@ frappe.ui.form.on('Stock Entry', { } }); }, + + toggle_display_account_head: function(frm) { + var enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory + frm.fields_dict["items"].grid.set_column_disp(["cost_center", "expense_account"], enabled); + } }) frappe.ui.form.on('Stock Entry Detail', { @@ -213,17 +223,19 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ }; }); - if(cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { + if(me.frm.doc.company && frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { this.frm.add_fetch("company", "stock_adjustment_account", "expense_account"); - this.frm.fields_dict.items.grid.get_field('expense_account').get_query = - function() { - return { - filters: { - "company": me.frm.doc.company, - "is_group": 0 - } + } + + this.frm.fields_dict.items.grid.get_field('expense_account').get_query = function() { + if (frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { + return { + filters: { + "company": me.frm.doc.company, + "is_group": 0 } } + } } this.frm.set_indicator_formatter('item_code', @@ -254,7 +266,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ this.toggle_related_fields(this.frm.doc); this.toggle_enable_bom(); this.show_stock_ledger(); - if (cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { + if (this.frm.doc.docstatus===1 && frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory) { this.show_general_ledger(); } erpnext.hide_company(); @@ -272,7 +284,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ set_default_account: function(callback) { var me = this; - if(cint(frappe.defaults.get_default("auto_accounting_for_stock")) && this.frm.doc.company) { + if(this.frm.doc.company && frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory) { return this.frm.call({ method: "erpnext.accounts.utils.get_company_default", args: { diff --git a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json index 58bcff0c44..b2c6091bab 100644 --- a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json +++ b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -960,7 +960,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:cint(frappe.sys_defaults.auto_accounting_for_stock)", + "depends_on": "", "fieldname": "expense_account", "fieldtype": "Link", "hidden": 0, @@ -1020,7 +1020,7 @@ "collapsible": 0, "columns": 0, "default": ":Company", - "depends_on": "eval:cint(frappe.sys_defaults.auto_accounting_for_stock)", + "depends_on": "", "fieldname": "cost_center", "fieldtype": "Link", "hidden": 0, @@ -1266,8 +1266,8 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-08 10:38:10.914780", - "modified_by": "prateeksha@erpnext.com", + "modified": "2017-06-16 17:32:56.989049", + "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry Detail", "owner": "Administrator", diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js index a6d5383758..0c38d01e54 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js @@ -31,6 +31,10 @@ frappe.ui.form.on("Stock Reconciliation", { frm.events.get_items(frm); }); } + + if(frm.doc.company) { + frm.trigger("toggle_display_account_head"); + } }, get_items: function(frm) { @@ -103,6 +107,13 @@ frappe.ui.form.on("Stock Reconciliation", { frappe.model.set_value(cdt, cdn, "quantity_difference", flt(d.qty) - flt(d.current_qty)); frappe.model.set_value(cdt, cdn, "amount_difference", flt(d.amount) - flt(d.current_amount)); } + }, + company: function(frm) { + frm.trigger("toggle_display_account_head"); + }, + toggle_display_account_head: function(frm) { + frm.toggle_display(['expense_account', 'cost_center'], + frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory); } }); @@ -133,7 +144,7 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ set_default_expense_account: function() { var me = this; if(this.frm.doc.company) { - if (frappe.sys_defaults.auto_accounting_for_stock && !this.frm.doc.expense_account) { + if (frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory && !this.frm.doc.expense_account) { return this.frm.call({ method: "erpnext.accounts.utils.get_company_default", args: { @@ -155,11 +166,13 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ this.setup_posting_date_time_check(); - if (frappe.sys_defaults.auto_accounting_for_stock) { + if (me.frm.doc.company && frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { this.frm.add_fetch("company", "stock_adjustment_account", "expense_account"); this.frm.add_fetch("company", "cost_center", "cost_center"); - - this.frm.fields_dict["expense_account"].get_query = function() { + } + + this.frm.fields_dict["expense_account"].get_query = function() { + if(frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { return { "filters": { 'company': me.frm.doc.company, @@ -167,7 +180,9 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ } } } - this.frm.fields_dict["cost_center"].get_query = function() { + } + this.frm.fields_dict["cost_center"].get_query = function() { + if(frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { return { "filters": { 'company': me.frm.doc.company, @@ -181,7 +196,7 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ refresh: function() { if(this.frm.doc.docstatus==1) { this.show_stock_ledger(); - if (cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { + if (frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory) { this.show_general_ledger(); } } diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json index 3d3705343a..9df4ff7908 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json @@ -320,7 +320,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:cint(sys_defaults.auto_accounting_for_stock)", + "depends_on": "", "fieldname": "expense_account", "fieldtype": "Link", "hidden": 0, @@ -351,7 +351,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:cint(sys_defaults.auto_accounting_for_stock)", + "depends_on": "", "fieldname": "cost_center", "fieldtype": "Link", "hidden": 0, @@ -477,7 +477,7 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-06-13 14:28:56.013804", + "modified": "2017-06-16 17:35:54.811500", "modified_by": "Administrator", "module": "Stock", "name": "Stock Reconciliation", diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index d710949317..093bd3bda5 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -231,7 +231,7 @@ class StockReconciliation(StockController): self.expense_account, self.cost_center) def validate_expense_account(self): - if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + if not cint(frappe.db.get_value("Company", self.company, 'enable_perpetual_inventory')): return if not self.expense_account: diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index d5f64b1298..07be6588ad 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -423,8 +423,11 @@ def get_stock_ledger_entries(previous_sle, operator=None, order="desc", limit=No }, previous_sle, as_dict=1, debug=debug) def get_valuation_rate(item_code, warehouse, voucher_type, voucher_no, - allow_zero_rate=False, currency=None): + allow_zero_rate=False, currency=None, company=None): # Get valuation rate from last sle for the same item and warehouse + if not company: + company = erpnext.get_default_company() + last_valuation_rate = frappe.db.sql("""select valuation_rate from `tabStock Ledger Entry` where item_code = %s and warehouse = %s @@ -451,7 +454,7 @@ def get_valuation_rate(item_code, warehouse, voucher_type, voucher_no, dict(item_code=item_code, buying=1, currency=currency), 'price_list_rate') if not allow_zero_rate and not valuation_rate \ - and cint(frappe.db.get_value("Accounts Settings", None, "auto_accounting_for_stock")): + and cint(frappe.db.get_value("Company", company, "enable_perpetual_inventory")): frappe.local.message_log = [] frappe.throw(_("Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a sample item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submiting/cancelling this entry").format(item_code, voucher_type, voucher_no)) From 6945d0dd8a599b51a5dfb41d44484c27c7bf3fbc Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 16 Jun 2017 18:18:16 +0530 Subject: [PATCH 02/12] fixed test cases --- erpnext/__init__.py | 3 ++ .../purchase_invoice/purchase_invoice.py | 6 +-- .../purchase_invoice/test_purchase_invoice.py | 32 +++++++--------- .../doctype/sales_invoice/sales_invoice.py | 10 ++--- .../sales_invoice/test_sales_invoice.py | 3 +- erpnext/controllers/stock_controller.py | 2 +- .../delivery_note/test_delivery_note.py | 37 +++++++++++-------- .../material_request/test_material_request.py | 4 +- .../purchase_receipt/test_purchase_receipt.py | 9 +++-- .../doctype/stock_entry/test_stock_entry.py | 27 +++++++++----- 10 files changed, 72 insertions(+), 61 deletions(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 7a4ccd625f..adaae4feff 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -39,6 +39,9 @@ def get_company_currency(company): def set_perpetual_inventory(enable=1, company=None): if not company: company = get_default_company() + + if frappe.flags.in_test: + company = "_Test Company" company = frappe.get_doc("Company", company) company.enable_perpetual_inventory = enable diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 8a7bbe7e32..b391127f89 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -164,7 +164,7 @@ class PurchaseInvoice(BuyingController): frappe.msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True) def set_expense_account(self, for_validate=False): - auto_accounting_for_stock = self.get_company_default("enable_perpetual_inventory") + auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') if auto_accounting_for_stock: stock_not_billed_account = self.get_company_default("stock_received_but_not_billed") @@ -335,9 +335,7 @@ class PurchaseInvoice(BuyingController): delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) def get_gl_entries(self, warehouse_account=None): - self.auto_accounting_for_stock = \ - cint(self.get_company_default("enable_perpetual_inventory")) - + self.auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') self.stock_received_but_not_billed = self.get_company_default("stock_received_but_not_billed") self.expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation") self.negative_expense_to_be_booked = 0.0 diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index cf0ec57c74..8094e99600 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -25,11 +25,10 @@ class TestPurchaseInvoice(unittest.TestCase): def tearDown(self): unlink_payment_on_cancel_of_invoice(0) - def test_gl_entries_without_auto_accounting_for_stock(self): - set_perpetual_inventory(0) - self.assertTrue(not cint(frappe.defaults.get_global_default("auto_accounting_for_stock"))) - + def test_gl_entries_without_perpetual_inventory(self): wrapper = frappe.copy_doc(test_records[0]) + set_perpetual_inventory(0, wrapper.company) + self.assertTrue(not cint(frappe.db.get_value('Company', wrapper.company, 'enable_perpetual_inventory'))) wrapper.insert() wrapper.submit() wrapper.load_from_db() @@ -51,17 +50,16 @@ class TestPurchaseInvoice(unittest.TestCase): for d in gl_entries: self.assertEqual([d.debit, d.credit], expected_gl_entries.get(d.account)) - def test_gl_entries_with_auto_accounting_for_stock(self): - set_perpetual_inventory(1) - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) - + def test_gl_entries_with_perpetual_inventory(self): pi = frappe.copy_doc(test_records[1]) + set_perpetual_inventory(1, pi.company) + self.assertTrue(cint(frappe.db.get_value('Company', pi.company, 'enable_perpetual_inventory')), 1) pi.insert() pi.submit() self.check_gle_for_pi(pi.name) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pi.company) def test_payment_entry_unlink_against_purchase_invoice(self): from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry @@ -84,11 +82,10 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertRaises(frappe.LinkExistsError, pi_doc.cancel) - def test_gl_entries_with_auto_accounting_for_stock_against_pr(self): - set_perpetual_inventory(1) - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) - + def test_gl_entries_with_perpetual_inventory_against_pr(self): pr = frappe.copy_doc(pr_test_records[0]) + set_perpetual_inventory(1, pr.company) + self.assertTrue(cint(frappe.db.get_value('Company', pr.company, 'enable_perpetual_inventory')), 1) pr.submit() pi = frappe.copy_doc(test_records[1]) @@ -99,7 +96,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.check_gle_for_pi(pi.name) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pr.company) def check_gle_for_pi(self, pi): gl_entries = frappe.db.sql("""select account, debit, credit @@ -133,10 +130,9 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertRaises(frappe.CannotChangeConstantError, pi.save) def test_gl_entries_with_aia_for_non_stock_items(self): - set_perpetual_inventory() - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) - pi = frappe.copy_doc(test_records[1]) + set_perpetual_inventory(1, pi.company) + self.assertTrue(cint(frappe.db.get_value('Company', pi.company, 'enable_perpetual_inventory')), 1) pi.get("items")[0].item_code = "_Test Non Stock Item" pi.get("items")[0].expense_account = "_Test Account Cost for Goods Sold - _TC" pi.get("taxes").pop(0) @@ -159,7 +155,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEquals(expected_values[i][0], gle.account) self.assertEquals(expected_values[i][1], gle.debit) self.assertEquals(expected_values[i][2], gle.credit) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pi.company) def test_purchase_invoice_calculation(self): pi = frappe.copy_doc(test_records[0]) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 20d58b90f8..b7aca8f188 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -559,7 +559,7 @@ class SalesInvoice(SellingController): throw(_("Delivery Note {0} is not submitted").format(d.delivery_note)) def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False): - self.auto_accounting_for_stock = self.get_company_default("enable_perpetual_inventory") + auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') if not self.grand_total: return @@ -582,11 +582,11 @@ class SalesInvoice(SellingController): self.doctype, self.return_against if cint(self.is_return) else self.name) if repost_future_gle and cint(self.update_stock) \ - and cint(self.auto_accounting_for_stock): + and cint(auto_accounting_for_stock): items, warehouses = self.get_items_and_warehouses() update_gl_entries_after(self.posting_date, self.posting_time, warehouses, items) elif self.docstatus == 2 and cint(self.update_stock) \ - and cint(self.auto_accounting_for_stock): + and cint(auto_accounting_for_stock): from erpnext.accounts.general_ledger import delete_gl_entries delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) @@ -674,8 +674,8 @@ class SalesInvoice(SellingController): ) # expense account gl entries - if cint(self.auto_accounting_for_stock) \ - and cint(self.update_stock): + if cint(self.update_stock) and \ + frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory'): gl_entries += super(SalesInvoice, self).get_gl_entries() def make_pos_gl_entries(self, gl_entries): diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index cb05ac88e4..2e044cc981 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -488,8 +488,8 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 561.8) def test_sales_invoice_gl_entry_without_perpetual_inventory(self): - set_perpetual_inventory(0) si = frappe.copy_doc(test_records[1]) + set_perpetual_inventory(0, si.company) si.insert() si.submit() @@ -617,6 +617,7 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(expected_gl_entries[i][2], gle.credit) si.cancel() + frappe.delete_doc('Sales Invoice', si.name) gle = frappe.db.sql("""select * from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s""", si.name) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index f8df04d680..b3c2f8c10a 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -21,7 +21,7 @@ class StockController(AccountsController): if self.docstatus == 2: delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) - if cint(self.get_company_default("enable_perpetual_inventory")): + if cint(frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory')): warehouse_account = get_warehouse_account_map() if self.docstatus==1: diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index 0f3099fb1b..751d5274b4 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -47,9 +47,8 @@ class TestDeliveryNote(unittest.TestCase): self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert) def test_delivery_note_no_gl_entry(self): - set_perpetual_inventory(0) - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 0) - + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(0, company) make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100) stock_queue = json.loads(get_previous_sle({ @@ -68,8 +67,9 @@ class TestDeliveryNote(unittest.TestCase): self.assertFalse(get_gl_entries("Delivery Note", dn.name)) def test_delivery_note_gl_entry(self): - set_perpetual_inventory() - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) + set_valuation_method("_Test Item", "FIFO") make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100) @@ -115,10 +115,11 @@ class TestDeliveryNote(unittest.TestCase): dn.cancel() self.assertFalse(get_gl_entries("Delivery Note", dn.name)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_delivery_note_gl_entry_packing_item(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=10, basic_rate=100) make_stock_entry(item_code="_Test Item Home Desktop 100", @@ -156,7 +157,7 @@ class TestDeliveryNote(unittest.TestCase): dn.cancel() self.assertFalse(get_gl_entries("Delivery Note", dn.name)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_serialized(self): se = make_serialized_item() @@ -196,7 +197,8 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(cstr(serial_no.get(field)), value) def test_sales_return_for_non_bundled_items(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) @@ -230,10 +232,11 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(gle_warehouse_amount, stock_value_difference) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_return_single_item_from_bundled_items(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) create_stock_reconciliation(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, rate=100) create_stock_reconciliation(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", @@ -270,10 +273,11 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(gle_warehouse_amount, stock_value_difference) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_return_entire_bundled_items(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) create_stock_reconciliation(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, rate=100) @@ -312,7 +316,7 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(gle_warehouse_amount, 1400) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_return_for_serialized_items(self): se = make_serialized_item() @@ -350,7 +354,8 @@ class TestDeliveryNote(unittest.TestCase): }) def test_delivery_of_bundled_items_to_target_warehouse(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) set_valuation_method("_Test Item", "FIFO") set_valuation_method("_Test Item Home Desktop 100", "FIFO") @@ -418,7 +423,7 @@ class TestDeliveryNote(unittest.TestCase): for i, gle in enumerate(gl_entries): self.assertEquals([gle.debit, gle.credit], expected_values.get(gle.account)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_closed_delivery_note(self): from erpnext.stock.doctype.delivery_note.delivery_note import update_delivery_note_status diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index c3a2137412..1531f4096e 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -5,13 +5,13 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe, unittest +import frappe, unittest, erpnext from frappe.utils import flt from erpnext.stock.doctype.material_request.material_request import raise_production_orders class TestMaterialRequest(unittest.TestCase): def setUp(self): - frappe.defaults.set_global_default("auto_accounting_for_stock", 0) + erpnext.set_perpetual_inventory(0) def test_make_purchase_order(self): from erpnext.stock.doctype.material_request.material_request import make_purchase_order diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 4ea0add97d..fe157e087d 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -30,7 +30,8 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertRaises(frappe.ValidationError, frappe.get_doc(pi).submit) def test_purchase_receipt_no_gl_entry(self): - set_perpetual_inventory(0) + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(0, company) existing_bin_stock_value = frappe.db.get_value("Bin", {"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}, "stock_value") @@ -50,9 +51,9 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertFalse(get_gl_entries("Purchase Receipt", pr.name)) def test_purchase_receipt_gl_entry(self): - set_perpetual_inventory() - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) pr = frappe.copy_doc(test_records[0]) + set_perpetual_inventory(1, pr.company) + self.assertEqual(cint(frappe.db.get_value("Company", pr.company, 'enable_perpetual_inventory')), 1) pr.insert() pr.submit() @@ -84,7 +85,7 @@ class TestPurchaseReceipt(unittest.TestCase): pr.cancel() self.assertFalse(get_gl_entries("Purchase Receipt", pr.name)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pr.company) def test_subcontracting(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index 2451a9b2c9..8670f73225 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -123,7 +123,8 @@ class TestStockEntry(unittest.TestCase): self.assertTrue(item_code in items) def test_material_receipt_gl_entry(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) mr = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC") @@ -148,7 +149,8 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mr.name)) def test_material_issue_gl_entry(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC") @@ -179,7 +181,8 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mi.name)) def test_material_transfer_gl_entry(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) create_stock_reconciliation(qty=100, rate=100) @@ -217,7 +220,8 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mtn.name)) def test_repack_no_change_in_valuation(self): - set_perpetual_inventory(0) + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(0, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) make_stock_entry(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", @@ -238,10 +242,11 @@ class TestStockEntry(unittest.TestCase): order by account desc""", repack.name, as_dict=1) self.assertFalse(gl_entries) - set_perpetual_inventory(0) + set_perpetual_inventory(0, repack.company) def test_repack_with_additional_costs(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) repack = frappe.copy_doc(test_records[3]) @@ -278,7 +283,7 @@ class TestStockEntry(unittest.TestCase): ["Expenses Included In Valuation - _TC", 0.0, 1200.0] ]) ) - set_perpetual_inventory(0) + set_perpetual_inventory(0, repack.company) def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle): expected_sle.sort(key=lambda x: x[0]) @@ -452,7 +457,8 @@ class TestStockEntry(unittest.TestCase): self.assertFalse(frappe.db.get_value("Serial No", serial_no, "warehouse")) def test_warehouse_company_validation(self): - set_perpetual_inventory(0) + company = frappe.db.get_value('Warehouse', '_Test Warehouse 2 - _TC1', 'company') + set_perpetual_inventory(0, company) frappe.get_doc("User", "test2@example.com")\ .add_roles("Sales User", "Sales Manager", "Stock User", "Stock Manager") frappe.set_user("test2@example.com") @@ -465,8 +471,6 @@ class TestStockEntry(unittest.TestCase): # permission tests def test_warehouse_user(self): - set_perpetual_inventory(0) - for role in ("Stock User", "Sales User"): set_user_permission_doctypes(doctype="Stock Entry", role=role, apply_user_permissions=1, user_permission_doctypes=["Warehouse"]) @@ -483,6 +487,7 @@ class TestStockEntry(unittest.TestCase): frappe.set_user("test@example.com") st1 = frappe.copy_doc(test_records[0]) st1.company = "_Test Company 1" + set_perpetual_inventory(0, st1.company) st1.get("items")[0].t_warehouse="_Test Warehouse 2 - _TC1" self.assertRaises(frappe.PermissionError, st1.insert) @@ -490,6 +495,8 @@ class TestStockEntry(unittest.TestCase): st1 = frappe.copy_doc(test_records[0]) st1.company = "_Test Company 1" st1.get("items")[0].t_warehouse="_Test Warehouse 2 - _TC1" + st1.get("items")[0].expense_account = "Stock Adjustment - _TC1" + st1.get("items")[0].cost_center = "Main - _TC1" st1.insert() st1.submit() From 65ccb42f9509e506589a03e355c520350f27ca2c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 16 Jun 2017 18:22:30 +0530 Subject: [PATCH 03/12] fixed document --- erpnext/__init__.py | 2 +- .../docs/assets/img/accounts/perpetual-1.png | Bin 79678 -> 59962 bytes .../perpetual-inventory.md | 2 +- .../stock/doctype/stock_entry/stock_entry.js | 5 ++--- .../stock_reconciliation.js | 1 - 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index adaae4feff..f026b6adc9 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -39,7 +39,7 @@ def get_company_currency(company): def set_perpetual_inventory(enable=1, company=None): if not company: company = get_default_company() - + if frappe.flags.in_test: company = "_Test Company" diff --git a/erpnext/docs/assets/img/accounts/perpetual-1.png b/erpnext/docs/assets/img/accounts/perpetual-1.png index d9e9342d9f5b487c49b66f918aacd97404184084..458f364926192e0b70f1575729c6da64afa89d2c 100644 GIT binary patch literal 59962 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
  • <5q9JHYP)!`BO8{-c7p%q6A8 zV8sz8(Ox%iXY{AH#8(z0EwOE}mwUJfyafk@sGg{>$)?E{G^fo7$41U^qTzXWQ(I_Ghy7_hTOXzD#o$x_OLr{4M^|2K3rc%@rf>I5lFX`23-I@3a z^uePU%jw^;loF%Dtg^h)3vwFbD&jj*Nn=<;Xf0GYeB${6@x(-BQdL~l3MCq4sT9|2 zS#vw1SWrMJ%aM zyGZ0PEv^NO6t^`_ZB~A&xH}LdMA39!_Uu=#B8odjjN`;tv$f-G#+Dg{$!8O^%mUsA zHV2&pOJ&Dq<>>pTJ?O`XGPkdwmMMnNN;DOka%AxoDCFB6W6I(#QL@5v(g8y8&#;Rb zq?9(wU9C;tB74=hT@DW~=4cjKCpV`d7pf1<39;0khrR6@#fftldE>Dsu;Mt0c#0W9uBf`(e8RS_ z&_xCu5xS9lnH9|f#47+BWyA&O6#(dshw!a};>)T8Aqx-(c*=S7@Zl5P2@|oGHtq!$ z^5cp(O9wI`a^QiHkBz(mGX;6uB2*1I!j}{MItnkCH!I4s1Q%6+hlDGRx$nmjX6W`- zs+5Y$5>T+s;0h5XQjrflJ#@5)<{k+dAJ?RhUrE9Ox9UHz6=`Q;S99h02;hkg8r|=g zAE}?DE8Hren$J{1RUn|yCf9@r8b&@?GuJ!^D_Weu4{ZuREj`6PeK&PF%WEiWTxzUn zWNB1yj9~(2(pSG%3stvJpVlDNKz-)0x#Kzqw|@blnyiFh(*--pmvg-(l% zZ%IffC5`b!O>b#ZhT z>M)i-&J?hyCm>yrAAoCuCI@{AWeY|MQ;ClVExM(TMcv>>14k8sg^+iQ%*9Uz<`kHu znbsSh8-F@_9H$>S9dV*tq6x?Ta7-f4Qj2^-AIDcVUNC2&Y>qjT!xD-{l$M%+tcI~R zz%kE8*y!*yaelh7fUbq|MDZkZR9=!0(omF*)W+(;B=k!uOwLa!PUsu29FZP}9d)7L zlJ_i}D|;2*55c&@F>|Wu>c-GZH>Ae362S)6Lgse!G6Du32oSFOt|G}HdH92!>KD~p z94GboL8n!-R`Q!s2+8o}1k}rpW;X5?58A=X?)S@!{kU_t&5Bizev_Xu%Q`f@EOZ1% z`nC=uqzn?J-l{^6O`+QZjdI4*$0FK85JTUwFnKSs_%fE#kdh;%*wcb}l01V6yO;@i zX6ZE!J6AxPxSD{H1g0sE@`s5Lim(=Ok~@^>*3rr=d*&TXw!0;NPPd!DGDWrj+)JKm zPJ=ryacMVfzx5D#J_PTEm+r#A&GzQ}fOD5YGs#3sWyl;&Q+iH*Zg3>mE%KnY>vA%9 zUmUxCE{I*10dMsKS%R+gMGXaH-$FS8%E5yY#bO8;k)@e~@e-gfaFo+4m7k-N1jp

    hggA41-~e$;&h2!i?s2>9)au(NQk$dj)~;4aiu z>{S$7WHNh)FoNl|D9d%3t?Pcq*%r=wF43~s|4#QIt#0_6&$^^@C0);!i9Ra zL#Ll-aYx~k8fYyLrT=D7H{=J>@|OY>)TJu&Z3=W!B|I(4TY>u$t`7e={Z9D`sHF0U z6>2A}o9dO)CJ9c36t$X}-sRAV*2!P_ZnZ^OO_e`uvl_fo3i4(nytHY?!4Wm_3?ZVka!NlCK-7q&3(VTn|XbLSj;}?>R}`UX*2&ybp}r%<4{gS8-w;vBvHL z@55W{-o;X+eZ+q`@JKRrke2+)5;1%f4K5>?6Xqi2sB_|UX5u;h!QeIWIDc>z)q+Ae zd)YtC!ZRq-n{cgAdK@ToG&yYC<30a@!mM)j_ABNpr=2(DpoTV;wo~nwnxz|L$sa&? zNj&9pimHyPQj#17HdZuxhBo>}G_F>*pCttV04`UK&!Lr(qaL2Cm8G=< zhbuS1A1gRM$G@j(3Gn_{;%LE5peiMcCun1DgvU(7L_-D zU)%(yj*hk*w6rcRE;KHTG&c4owDj!k?6h-FkzxEL_ zaxkzrvvoAHvBvwoub#e*lOs0)!S93q=kFhQ8o8SN`y^|Jf0Fe{AnorjwDdG|wEwgB zCn(qNSq@nc<33JnYjJ{_+Ov?edK?Ds{I?3k%{F$A^+pcKOwnj ze^c-u6#au;f6RXJiwBB}_J4TK10}bj&IJI#2OuWIujmSRwhpVQIKRRAnv-9^5(-2S zEU+UH3uu0G6i1bqAfA>i)@|sn^qiQiVsyE2zf|;aeg8{8n=5IdXn9mpVK%xj3`Lk+ z^HG3ZR%*4E0kz~Ku&KgcEkr9?!;Wv4|=cw?L2FeO!YjF^9W zUv_xh?f<6Pp2O#b z!j`1t`#s9{-l_|IV*U_%v{@n752{r5;z7Z!mEcK5gLV>ZMZ!7a_u@AsT{;!s8cYqT ze}Q9vmEB%*8^>+6-xtTWK+g~agnC^D#bC9LOg_*+8+%*sfjHy+M41#6?Z^D+c)zgR z?^FLt-M@!Sj(*=^y8_N||3UV@Km36t0O(0RKtNl&tI`t5KhXZm27X|)y}H$XI{MDB zf4BQ5;ZSs`6%i^yR{4K{{0AMTS3oca7_Y>};N<^e%%9eswY+=a6v|4yJa1^I&P7bJ!j z$>!-?GSZV_4;9H$5@DDa0i#Z*Uxz7Gd4X58cEN3>|-%O4%*0!p+@k+>b(w6J_2*Qna{lfx# zjqX9?fp&mfK_$u2`Y{4m_xsfZan86#*@d0-9WpB3cEmT;Mk>Jjnygvxu>JgD-k8y^ z1XD9V-Qaou#z;=pf}H5k9bN=Rmi;SB|4_< zk*_s2sG!F-(-W4^6wo$i!Mi&YJI-Xhzm}W`*;tZ6!4l)rWIXJ|zCJ{c&Hm2-Y?NL{sl9rtlEWak=#XE)AVTi6CC2Uyq3;I{?E3rRLPI= z5bAoLHDfO<<7Q+^KEmdu*;QAU*R_!;WkrDzx9aA!qpXu$^hD+5=6+t%;Y7H~yVnc9 zmm1YC0KL~cjI(u)+V2_lM;|zT0GHn#D9fl};RoDfGi$Fpyq-n!c7wW%Kr?jwdU zz8a%Krf_Bue7DAngSz9G-PzC3{kdgHM3#kL@!iMVuhgZC#_%b;X`0s6zLCE&N%Az) z5Teb63M6%Yj&nphYAjWJD-FdX7)>+k`OD&)_hjZAUj7({=ZwH87aj}%$MJH(3Xc-#Tbc_0(;$3b4 zra|nTBi*Y6*uHA5)m@D`bC8M6!c<0i^YizVOCDwTed*D?PMdewOeb*RXrT6c!0Z(` z&*qQsISI_lGP&Ad4%8jN_+K!^fg-CQLozRLQ_^COHuj3Sih99u&8{<}uMMyjm8P z;0RBsd8wBaSWRTnWAsWDzc<@&`0#8Z0I@iv+@rZ@P_yZnzC=vzg(VlQ04)0uIl(i; zpqj!9O|48Rc#3BUHm%y>d{w95ZF52+XfrAMveR=`Hc%#sqT=P%sh$1Eu z(&7d8D|)_MwLwDhQQdR==$M0rWTWlVl-S+YEcp-P`Z<&x237ZHH8@F_mL)tybXmDX z)R~R4j;ek{w&R@K3gfA|OTc~u&B>_hAPCF`r4cBc!Yt+9f1`6H}6fzeQ7*?2!I z=~^_b`HOYWYdh})`3P+1ulprhBzD{yyj@(*DF z&jMo*txGxbSH+UMbM^T<220khJ((^&fX(CqD3v(eV9;}+>}s7MlYQS&=R=8?-oiH85mK4a~3_>&msC`mjSJ)*fBjM1|Bi$0BQNruwE4TYEq1&kjR0 zs<^VC7ZjKrAK24`WO?uW8d9Lsi{fsDPB2TiNs^r9sy9Q(_A(J1t-Eh7e~2v|P5nqm zTV@?=oH{gAFWrFQHQSV>%4sUy^TRX6hi{M7tuE|*YgKpOY=2}dVU)?f6;G3$(C(dk zL+D&_M&4-h!KESE65TcoOoX~V+kcY&tG6YPC9+c(7Uf#!6$5I}xl+y1Te*CH>3I|A zFA}+O>{B0H&UNm2``Ec$1){t4ne_9Rh;g;rrfT)@2^?NQ(e?RGaz-24&%1#cvB}yM z(bLlf;Pu=Id|IYx+0Fz*yIl7XThFi{@B?_(YWe zP5*}6qwzz4f#KHbjqL?f|J*O@^%`wP zVQhJzcKs$7;;FxE$lW$(R_YNP&N;HyoIEebYZ{pREy2!X!+J3f_v}^gn!WUzGSxRBsRy?7H^~pd?|>kI;izn)8N^b-H|~_XF)ut`s59FFf?q z3TU1*CQ(ktH!M5#VD{$#ohSzD@h)}4TA65I1fN~Ym6ID%5#EkbRUe*)m&j_Ibf^u< zRHBhs75?NZn<#7PX#gvFA_nFw_FDwc$0yjsKHg6@Z)g}Z&CSh7kaMg_9#SK~qN{q} z9ZrOXujb)X=$z)buj&th7P=lCGeD$iCHZqMu&3U-AzceFujX%vs0|eg_BNhu3EIIo zqDRDNd!a$e=7LkxjMi&QZ%5@h5;dCjk-^|S=JqAdJIo>qV-wyr1R8hkziSZ5p5l9D z?i*Ud z>o)`QjzP2sAPO`ptv1EK%4zvMv+GN{V}7BryTI@=#M*-ww>S3-bjns|OVrLs@GHrN z6u3$BSph0QDijr+5es(RFCCd|AfZq( zLdnWR{c(w4=tcDd<68>IK%3E>B13eh7Zm& zUzZ3_>lkJ%yS(;P7bt$bo>>3zktBGsNBs&!tjK(KA#Wl)&W|HhKe_=vf8qTmE)1Ex z8l{}g;MJ0URlP>o7Vsy3o7*dez~$qS5|oc4b<|K*HudUp895^Shm=; z9OMGWk$JV5HOK+YgiL$m!29eXA^ks1>lM{O!+J#nRhIN8*%V1q4tIa{qR#1VZmXq#V8?9v{m%7 zyy6023^L9%p0q*z+%bQowLip;Rv_Xmb7aIiLL?CO?{(YVQ`Z;hz(a2P)5$6?E{$2O zyTJ?qa}sj%f6rV=X$JmsgygmAlK7ELS~qhRL`md1D^C;ns{=UHvw4rJ47`EZ3OID3e|qcpLVFWV8*&+nbzl}T2(Zh2;M&J`WG zWF5E)pzJ$>-O6Y^F+>wyVT&5jEQlc6afqMSub#-34}~4qml^#p-P#YHVNvFSTZxda zi_X=7L*ucG>cu@PSD}1V2LSX-r`>^c-T9CL$ zJ6vHd1LqsG+9c1@?65%XzCe_+n`Cs^9*{}inq~2rzRPPdB#Y+RSFBJ^uOeBK%DQC_ z-YmPo+Eg^2dkcRMTZ-;^zr6lm{GP74BtF@`%S z66e`yT!aop{&X{G2O{Hc#u(hmqJ?8@*A?+uc9bYiPVUqUv_Fa*q7^nJ9b2aMnGr|% zdN5fRV&5EP?TyCj;VA}rx40CiV7^igi4VX0(K;rAj+~-RcF90sU4fxTO85{dQ3+CP zF7`2G%ku#Up;T~GNv>+$3b(xrW|5ca9vkdl78fa)Sv)~Ph`&znq�iO&z>buy|rj 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 literal 79678 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

    J6ALW`+7_r ztF%vg(yWl=k;Opb%OYu+?b@Cpg9)j5m7kSFT{g6V{zOP&qcz6p_>w-X8Fd=?Jw`7N zuDo$fnjO7kokvT4&Qh4UoIE!oGkdSHGC>{sERyXZRwco3f1BPcV1sP81+3ngY9;?8 z<-Zay3z%f{Xna)nT1b!)poEbG;TpiG0ss>07|Tsf^#~P~-NrGYpH7#%F?`V6S;6)# zMC?N?ZyaT+BK1$TccnD2gSXhgO|%ZBjD}1wr#rIAk2cEFq>X2&J7ad$Yj>4^rXVQC zw@k1EHcFxbaYV!oUw1{}_sLSk43RO_zYq71ndS zljdueXz8%w*8($~$f41$A65&7b|QXYSw6%}u*P&rb(a6$LZ~4uA)GAF&hm0G3rlWjuIxOl*3jh<2-49>qGi(ID$AZkZ633u zsQc>sq-Te62RvXshpf)}>#Y-fL`|X7oi#nS1OL*EQI+{znAsOM6#R*P>60%$1Mr6V zCV1X-;}h<%2Z1rh4+DiA8!k;di&mPhnuo97W>9^?)B3_~F`jOHB9BT0b7BB0HUr2S>cqqD=mjqbHRmrK zwic^vo1qS<9kV(}khmJjUZP2tJkDNUF5a2llMETU^eTjIDl%y>16Y%gPm z91Ns^30$12q6Kwc7L`(C;PedBNLkJ#u%pdl^~O^UXJK3!s22>$eR;u4ZK0bephElm~e_rq{?zaSq4v5%dK2b4d<;r3WKohE~KBiaM;9f;HrqKpD8 zJZLVDjL>B9lAM07XK=>o*(RQl!KlMGUMda+$}W3R}AVX!bXI5 zejv!hE5+aUKg=kdI2_rN*haIo>~*X%Z|OhG1&hTyb%d19k9YggJi8A-d_5|r*KV_L?e7Z9SCs2TfX5I1d6QTz2eiP7Y;T9#3HEfy zLXR)84K}62XRHGpN!KB6k;8!I$dM(-^+3S`8uonAADR;XougpBHD9^ns09{2REUaL z*N}iz;T>7o(V!pacxX~UG*SCfmJD8lMNN;0>qG<=R@uIvR!N?%guw`tA1M3L_-{yo z!eDUx#Fx3%P}#hZFYpfW`etx>C~#=G?Z1BPHlo<%{#%3b)W=X}>o3xygGfBA*AV;@ zA(gP9?oe=WpJ$K&?2t+Nli#_wJR7GfKFJW7?~jq+29`&fon47M3-%9NA6=IXws?gM zRMh_0L#>SPG>@UY67ga^Qx*6>$N$aN|CE0`u`s~_lX4P{F{I31Zy+BT2}SW*G2@{B E2cko50{{R3 diff --git a/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md b/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md index 92e0544e03..343e3f4769 100644 --- a/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md +++ b/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md @@ -8,7 +8,7 @@ On receipt of items in a particular warehouse, the balance in the Warehouse Acco * Activate Perpetual Inventory - > Explore > Accounts > Accounts Settings > "Make Accounting Entry For Every Stock Movement" + > Setup > Company > Stock Settings > "Enable Perpetual Inventory" Perpetual Inventory diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 6a044f78e8..f1dbeeac73 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -67,7 +67,7 @@ frappe.ui.form.on('Stock Entry', { }); }); } - + if(frm.doc.company) { frm.trigger("toggle_display_account_head"); } @@ -103,9 +103,8 @@ frappe.ui.form.on('Stock Entry', { } }); }, - toggle_display_account_head: function(frm) { - var enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory + var enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory; frm.fields_dict["items"].grid.set_column_disp(["cost_center", "expense_account"], enabled); } }) diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js index 0c38d01e54..2a6ef7be61 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js @@ -170,7 +170,6 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ this.frm.add_fetch("company", "stock_adjustment_account", "expense_account"); this.frm.add_fetch("company", "cost_center", "cost_center"); } - this.frm.fields_dict["expense_account"].get_query = function() { if(frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { return { From e9ff1914fcef996761452fe6bd308543795527b5 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 19 Jun 2017 12:54:59 +0530 Subject: [PATCH 04/12] Added is_perpetual_inventory_enabled method --- erpnext/__init__.py | 24 +++++++++++++++---- .../doctype/pos_profile/pos_profile.js | 2 +- .../purchase_invoice/purchase_invoice.py | 4 ++-- .../purchase_invoice/test_purchase_invoice.py | 10 ++++---- .../doctype/sales_invoice/sales_invoice.js | 2 +- .../doctype/sales_invoice/sales_invoice.py | 6 ++--- erpnext/accounts/general_ledger.py | 4 ++-- erpnext/controllers/stock_controller.py | 4 ++-- .../v7_0/create_warehouse_nestedset.py | 6 ++--- ...ouse_ledger_gl_entries_for_transactions.py | 4 ++-- .../v8_0/move_perpetual_inventory_setting.py | 5 +++- erpnext/public/js/utils.js | 6 +++++ erpnext/setup/doctype/company/company.py | 12 ++++++++++ .../doctype/delivery_note/delivery_note.js | 8 +++---- .../purchase_receipt/purchase_receipt.js | 4 ++-- .../purchase_receipt/test_purchase_receipt.py | 4 ++-- .../stock/doctype/stock_entry/stock_entry.js | 10 ++++---- .../stock_reconciliation.js | 12 +++++----- .../stock_reconciliation.py | 4 ++-- erpnext/stock/stock_ledger.py | 2 +- 20 files changed, 85 insertions(+), 48 deletions(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index f026b6adc9..4479bf9af7 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -38,10 +38,7 @@ def get_company_currency(company): def set_perpetual_inventory(enable=1, company=None): if not company: - company = get_default_company() - - if frappe.flags.in_test: - company = "_Test Company" + company = "_Test Company" if frappe.flags.in_test else get_default_company() company = frappe.get_doc("Company", company) company.enable_perpetual_inventory = enable @@ -57,4 +54,23 @@ def encode_company_abbr(name, company): return " - ".join(parts) +def is_perpetual_inventory_enabled(company): + if not company: + company = "_Test Company" if frappe.flags.in_test else get_default_company() + if not hasattr(frappe.local, 'enable_perpetual_inventory'): + perpetual_inventory = get_company_wise_perptual_inventory() + frappe.local.enable_perpetual_inventory = perpetual_inventory + + if not frappe.local.enable_perpetual_inventory.get(company): + is_enabled = frappe.db.get_value("Company", company, "enable_perpetual_inventory") or 0 + frappe.local.enable_perpetual_inventory.setdefault(company, is_enabled) + + return frappe.local.enable_perpetual_inventory.get(company) + +def get_company_wise_perptual_inventory(): + company_dict = {} + for data in frappe.get_all('Company', fields = ["name", "enable_perpetual_inventory"]): + company_dict[data.name] = data.enable_perpetual_inventory + + return company_dict diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.js b/erpnext/accounts/doctype/pos_profile/pos_profile.js index 0927e81d6c..03d84e9ad6 100755 --- a/erpnext/accounts/doctype/pos_profile/pos_profile.js +++ b/erpnext/accounts/doctype/pos_profile/pos_profile.js @@ -39,7 +39,7 @@ frappe.ui.form.on('POS Profile', { toggle_display_account_head: function(frm) { frm.toggle_display('expense_account', - frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory); + erpnext.is_perpetual_inventory_enabled(frm.doc.company)); } }) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index b391127f89..00d5249a38 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -164,7 +164,7 @@ class PurchaseInvoice(BuyingController): frappe.msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True) def set_expense_account(self, for_validate=False): - auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') + auto_accounting_for_stock = erpnext.is_perpetual_inventory_enabled(self.company) if auto_accounting_for_stock: stock_not_billed_account = self.get_company_default("stock_received_but_not_billed") @@ -335,7 +335,7 @@ class PurchaseInvoice(BuyingController): delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) def get_gl_entries(self, warehouse_account=None): - self.auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') + self.auto_accounting_for_stock = erpnext.is_perpetual_inventory_enabled(self.company) self.stock_received_but_not_billed = self.get_company_default("stock_received_but_not_billed") self.expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation") self.negative_expense_to_be_booked = 0.0 diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 8094e99600..8bbd6c5f05 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import unittest -import frappe +import frappe, erpnext import frappe.model from frappe.utils import cint, flt, today, nowdate import frappe.defaults @@ -28,7 +28,7 @@ class TestPurchaseInvoice(unittest.TestCase): def test_gl_entries_without_perpetual_inventory(self): wrapper = frappe.copy_doc(test_records[0]) set_perpetual_inventory(0, wrapper.company) - self.assertTrue(not cint(frappe.db.get_value('Company', wrapper.company, 'enable_perpetual_inventory'))) + self.assertTrue(not cint(erpnext.is_perpetual_inventory_enabled(wrapper.company))) wrapper.insert() wrapper.submit() wrapper.load_from_db() @@ -53,7 +53,7 @@ class TestPurchaseInvoice(unittest.TestCase): def test_gl_entries_with_perpetual_inventory(self): pi = frappe.copy_doc(test_records[1]) set_perpetual_inventory(1, pi.company) - self.assertTrue(cint(frappe.db.get_value('Company', pi.company, 'enable_perpetual_inventory')), 1) + self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pi.company)), 1) pi.insert() pi.submit() @@ -85,7 +85,7 @@ class TestPurchaseInvoice(unittest.TestCase): def test_gl_entries_with_perpetual_inventory_against_pr(self): pr = frappe.copy_doc(pr_test_records[0]) set_perpetual_inventory(1, pr.company) - self.assertTrue(cint(frappe.db.get_value('Company', pr.company, 'enable_perpetual_inventory')), 1) + self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1) pr.submit() pi = frappe.copy_doc(test_records[1]) @@ -132,7 +132,7 @@ class TestPurchaseInvoice(unittest.TestCase): def test_gl_entries_with_aia_for_non_stock_items(self): pi = frappe.copy_doc(test_records[1]) set_perpetual_inventory(1, pi.company) - self.assertTrue(cint(frappe.db.get_value('Company', pi.company, 'enable_perpetual_inventory')), 1) + self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pi.company)), 1) pi.get("items")[0].item_code = "_Test Non Stock Item" pi.get("items")[0].expense_account = "_Test Account Cost for Goods Sold - _TC" pi.get("taxes").pop(0) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 595b7bf8d1..10bd3a0b4e 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -492,7 +492,7 @@ frappe.ui.form.on('Sales Invoice', { // expense account frm.fields_dict['items'].grid.get_field('expense_account').get_query = function(doc) { - if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { + if (erpnext.is_perpetual_inventory_enabled(doc.company)) { return { filters: { 'report_type': 'Profit and Loss', diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index b7aca8f188..85c50790fb 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext import frappe.defaults from frappe.utils import cint, flt from frappe import _, msgprint, throw @@ -559,7 +559,7 @@ class SalesInvoice(SellingController): throw(_("Delivery Note {0} is not submitted").format(d.delivery_note)) def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False): - auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') + auto_accounting_for_stock = erpnext.is_perpetual_inventory_enabled(self.company) if not self.grand_total: return @@ -675,7 +675,7 @@ class SalesInvoice(SellingController): # expense account gl entries if cint(self.update_stock) and \ - frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory'): + erpnext.is_perpetual_inventory_enabled(self.company): gl_entries += super(SalesInvoice, self).get_gl_entries() def make_pos_gl_entries(self, gl_entries): diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index a5f7ad2472..ceae61cd86 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext from frappe.utils import flt, cstr, cint from frappe import _ from frappe.model.meta import get_field_precision @@ -101,7 +101,7 @@ def make_entry(args, adv_adj, update_outstanding, from_repost=False): gle.submit() def validate_account_for_perpetual_inventory(gl_map): - if cint(frappe.db.get_value("Company", gl_map[0].company, 'enable_perpetual_inventory')) \ + if cint(erpnext.is_perpetual_inventory_enabled(gl_map[0].company)) \ and gl_map[0].voucher_type=="Journal Entry": aii_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount where account_type = 'Stock' and is_group=0""")] diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index b3c2f8c10a..605881c839 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext from frappe.utils import cint, flt, cstr from frappe import msgprint, _ import frappe.defaults @@ -21,7 +21,7 @@ class StockController(AccountsController): if self.docstatus == 2: delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) - if cint(frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory')): + if cint(erpnext.is_perpetual_inventory_enabled(self.company)): warehouse_account = get_warehouse_account_map() if self.docstatus==1: diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py index 964df1f18d..06766b9f69 100644 --- a/erpnext/patches/v7_0/create_warehouse_nestedset.py +++ b/erpnext/patches/v7_0/create_warehouse_nestedset.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -import frappe +import frappe, erpnext from frappe import _ from frappe.utils import cint from frappe.utils.nestedset import rebuild_tree @@ -51,7 +51,7 @@ def check_is_warehouse_associated_with_company(): def make_warehouse_nestedset(company=None): validate_parent_account_for_warehouse(company) stock_account_group = get_stock_account_group(company.name) - enable_perpetual_inventory = cint(frappe.db.get_value("Company", company, 'enable_perpetual_inventory')) or 0 + enable_perpetual_inventory = cint(erpnext.is_perpetual_inventory_enabled(company)) or 0 if not stock_account_group and enable_perpetual_inventory: return @@ -73,7 +73,7 @@ def validate_parent_account_for_warehouse(company=None): if not company: return - if cint(frappe.db.get_value("Company", company, 'enable_perpetual_inventory')): + if cint(erpnext.is_perpetual_inventory_enabled(company)): parent_account = frappe.db.sql("""select name from tabAccount where account_type='Stock' and company=%s and is_group=1 and (warehouse is null or warehouse = '')""", company.name) diff --git a/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py b/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py index 5a98ab1704..d0e816a1a2 100644 --- a/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py +++ b/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext def execute(): frappe.reload_doctype("Account") @@ -10,7 +10,7 @@ def execute(): warehouses = frappe.db.sql_list("""select name, company from tabAccount where account_type = 'Stock' and is_group = 0 and (warehouse is null or warehouse = '')""", as_dict) - warehouses = [d.name for d in warehouses if frappe.db.get_value('Company', d.company, 'enable_perpetual_inventory')] + warehouses = [d.name for d in warehouses if erpnext.is_perpetual_inventory_enabled(d.company)] if len(warehouses) > 0: warehouses = set_warehouse_for_stock_account(warehouses) if not warehouses: diff --git a/erpnext/patches/v8_0/move_perpetual_inventory_setting.py b/erpnext/patches/v8_0/move_perpetual_inventory_setting.py index 3010b4dec2..594a15c500 100644 --- a/erpnext/patches/v8_0/move_perpetual_inventory_setting.py +++ b/erpnext/patches/v8_0/move_perpetual_inventory_setting.py @@ -7,4 +7,7 @@ import frappe def execute(): frappe.reload_doctype('Company') enabled = frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock") or 0 - frappe.db.sql("""update tabCompany set enable_perpetual_inventory = {0}""".format(enabled)) \ No newline at end of file + for data in frappe.get_all('Company', fields = ["name"]): + doc = frappe.get_doc('Company', data.name) + doc.enable_perpetual_inventory = enabled + doc.save(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 965086235f..eaf064b26c 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -31,6 +31,12 @@ $.extend(erpnext, { } }, + is_perpetual_inventory_enabled: function(company) { + if(company) { + return frappe.get_doc(":Company", company).enable_perpetual_inventory + } + }, + setup_serial_no: function() { var grid_row = cur_frm.open_grid_row(); if(!grid_row || !grid_row.grid_form.fields_dict.serial_no || diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index a179959542..b333e87e84 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -33,6 +33,7 @@ class Company(Document): self.validate_default_accounts() self.validate_currency() self.validate_coa_input() + self.validate_perpetual_inventory() def validate_abbr(self): if not self.abbr: @@ -139,6 +140,17 @@ class Company(Document): if not self.chart_of_accounts: self.chart_of_accounts = "Standard" + def validate_perpetual_inventory(self): + if not self.get("__islocal"): + if cint(self.enable_perpetual_inventory) == 1 and not self.default_inventory_account: + frappe.msgprint(_("Warning: Set default inventory account for perpetual inventory"), alert=True) + + enable_perpetual_inventory = frappe.db.get_value('Company', self.name, 'enable_perpetual_inventory') + if enable_perpetual_inventory != self.enable_perpetual_inventory: + if hasattr(frappe.local, 'enable_perpetual_inventory') and \ + self.name in frappe.local.enable_perpetual_inventory: + del frappe.local.enable_perpetual_inventory[self.name] + def set_default_accounts(self): self._set_default_account("default_cash_account", "Cash") self._set_default_account("default_bank_account", "Bank") diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 35658c63d8..de47fde1f2 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -40,7 +40,7 @@ frappe.ui.form.on("Delivery Note", { frm.set_query('expense_account', 'items', function(doc, cdt, cdn) { - if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { + if (erpnext.is_perpetual_inventory_enabled(doc.company)) { return { filters: { "report_type": "Profit and Loss", @@ -52,7 +52,7 @@ frappe.ui.form.on("Delivery Note", { }); frm.set_query('cost_center', 'items', function(doc, cdt, cdn) { - if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { + if (erpnext.is_perpetual_inventory_enabled(doc.company)) { return { filters: { 'company': doc.company, @@ -141,7 +141,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( if (doc.docstatus==1) { this.show_stock_ledger(); - if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { + if (erpnext.is_perpetual_inventory_enabled(doc.company)) { this.show_general_ledger(); } if (this.frm.has_perm("submit") && doc.status !== "Closed") { @@ -238,7 +238,7 @@ frappe.ui.form.on('Delivery Note', { unhide_account_head: function(frm) { // unhide expense_account and cost_center if perpetual inventory is enabled in the company - var aii_enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory + var aii_enabled = erpnext.is_perpetual_inventory_enabled(frm.doc.company) frm.fields_dict["items"].grid.set_column_disp(["expense_account", "cost_center"], aii_enabled); } }) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index fc92486c3b..a38b222d89 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -46,7 +46,7 @@ frappe.ui.form.on("Purchase Receipt", { }, toggle_display_account_head: function(frm) { - var enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory + var enabled = erpnext.is_perpetual_inventory_enabled(frm.doc.company) frm.fields_dict["items"].grid.set_column_disp(["cost_center"], enabled); } }); @@ -62,7 +62,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend this._super(); if(this.frm.doc.docstatus===1) { this.show_stock_ledger(); - if (frappe.get_doc(":Company", doc.company).enable_perpetual_inventory) { + if (erpnext.is_perpetual_inventory_enabled(doc.company)) { this.show_general_ledger(); } } diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index fe157e087d..d8cd27174d 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import unittest -import frappe +import frappe, erpnext import frappe.defaults from frappe.utils import cint, flt, cstr, today from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice @@ -53,7 +53,7 @@ class TestPurchaseReceipt(unittest.TestCase): def test_purchase_receipt_gl_entry(self): pr = frappe.copy_doc(test_records[0]) set_perpetual_inventory(1, pr.company) - self.assertEqual(cint(frappe.db.get_value("Company", pr.company, 'enable_perpetual_inventory')), 1) + self.assertEqual(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1) pr.insert() pr.submit() diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index f1dbeeac73..74ac58966f 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -104,7 +104,7 @@ frappe.ui.form.on('Stock Entry', { }); }, toggle_display_account_head: function(frm) { - var enabled = frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory; + var enabled = erpnext.is_perpetual_inventory_enabled(frm.doc.company); frm.fields_dict["items"].grid.set_column_disp(["cost_center", "expense_account"], enabled); } }) @@ -222,12 +222,12 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ }; }); - if(me.frm.doc.company && frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { + if(me.frm.doc.company && erpnext.is_perpetual_inventory_enabled(me.frm.doc.company)) { this.frm.add_fetch("company", "stock_adjustment_account", "expense_account"); } this.frm.fields_dict.items.grid.get_field('expense_account').get_query = function() { - if (frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { + if (erpnext.is_perpetual_inventory_enabled(me.frm.doc.company)) { return { filters: { "company": me.frm.doc.company, @@ -265,7 +265,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ this.toggle_related_fields(this.frm.doc); this.toggle_enable_bom(); this.show_stock_ledger(); - if (this.frm.doc.docstatus===1 && frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory) { + if (this.frm.doc.docstatus===1 && erpnext.is_perpetual_inventory_enabled(this.frm.doc.company)) { this.show_general_ledger(); } erpnext.hide_company(); @@ -283,7 +283,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ set_default_account: function(callback) { var me = this; - if(this.frm.doc.company && frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory) { + if(this.frm.doc.company && erpnext.is_perpetual_inventory_enabled(this.frm.doc.company)) { return this.frm.call({ method: "erpnext.accounts.utils.get_company_default", args: { diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js index 2a6ef7be61..a86dea7683 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js @@ -113,7 +113,7 @@ frappe.ui.form.on("Stock Reconciliation", { }, toggle_display_account_head: function(frm) { frm.toggle_display(['expense_account', 'cost_center'], - frappe.get_doc(":Company", frm.doc.company).enable_perpetual_inventory); + erpnext.is_perpetual_inventory_enabled(frm.doc.company)); } }); @@ -144,7 +144,7 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ set_default_expense_account: function() { var me = this; if(this.frm.doc.company) { - if (frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory && !this.frm.doc.expense_account) { + if (erpnext.is_perpetual_inventory_enabled(this.frm.doc.company) && !this.frm.doc.expense_account) { return this.frm.call({ method: "erpnext.accounts.utils.get_company_default", args: { @@ -166,12 +166,12 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ this.setup_posting_date_time_check(); - if (me.frm.doc.company && frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { + if (me.frm.doc.company && erpnext.is_perpetual_inventory_enabled(me.frm.doc.company)) { this.frm.add_fetch("company", "stock_adjustment_account", "expense_account"); this.frm.add_fetch("company", "cost_center", "cost_center"); } this.frm.fields_dict["expense_account"].get_query = function() { - if(frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { + if(erpnext.is_perpetual_inventory_enabled(me.frm.doc.company)) { return { "filters": { 'company': me.frm.doc.company, @@ -181,7 +181,7 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ } } this.frm.fields_dict["cost_center"].get_query = function() { - if(frappe.get_doc(":Company", me.frm.doc.company).enable_perpetual_inventory) { + if(erpnext.is_perpetual_inventory_enabled(me.frm.doc.company)) { return { "filters": { 'company': me.frm.doc.company, @@ -195,7 +195,7 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ refresh: function() { if(this.frm.doc.docstatus==1) { this.show_stock_ledger(); - if (frappe.get_doc(":Company", this.frm.doc.company).enable_perpetual_inventory) { + if (erpnext.is_perpetual_inventory_enabled(this.frm.doc.company)) { this.show_general_ledger(); } } diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index 093bd3bda5..9c425295c5 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext import frappe.defaults from frappe import msgprint, _ from frappe.utils import cstr, flt, cint @@ -231,7 +231,7 @@ class StockReconciliation(StockController): self.expense_account, self.cost_center) def validate_expense_account(self): - if not cint(frappe.db.get_value("Company", self.company, 'enable_perpetual_inventory')): + if not cint(erpnext.is_perpetual_inventory_enabled(self.company)): return if not self.expense_account: diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 07be6588ad..711f064922 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -454,7 +454,7 @@ def get_valuation_rate(item_code, warehouse, voucher_type, voucher_no, dict(item_code=item_code, buying=1, currency=currency), 'price_list_rate') if not allow_zero_rate and not valuation_rate \ - and cint(frappe.db.get_value("Company", company, "enable_perpetual_inventory")): + and cint(erpnext.is_perpetual_inventory_enabled(company)): frappe.local.message_log = [] frappe.throw(_("Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a sample item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submiting/cancelling this entry").format(item_code, voucher_type, voucher_no)) From 777526e3a84db129c9d46fd0fbfb62c970aacf01 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 20 Jun 2017 12:14:32 +0530 Subject: [PATCH 05/12] Update __init__.py --- erpnext/__init__.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 4479bf9af7..e1e355397f 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -59,18 +59,10 @@ def is_perpetual_inventory_enabled(company): company = "_Test Company" if frappe.flags.in_test else get_default_company() if not hasattr(frappe.local, 'enable_perpetual_inventory'): - perpetual_inventory = get_company_wise_perptual_inventory() - frappe.local.enable_perpetual_inventory = perpetual_inventory + frappe.local.enable_perpetual_inventory = {} - if not frappe.local.enable_perpetual_inventory.get(company): - is_enabled = frappe.db.get_value("Company", company, "enable_perpetual_inventory") or 0 - frappe.local.enable_perpetual_inventory.setdefault(company, is_enabled) + if not company in frappe.local.enable_perpetual_inventory: + frappe.local.enable_perpetual_inventory[company] = frappe.db.get_value("Company", + company, "enable_perpetual_inventory") or 0 - return frappe.local.enable_perpetual_inventory.get(company) - -def get_company_wise_perptual_inventory(): - company_dict = {} - for data in frappe.get_all('Company', fields = ["name", "enable_perpetual_inventory"]): - company_dict[data.name] = data.enable_perpetual_inventory - - return company_dict + return frappe.local.enable_perpetual_inventory[company] From c422874418b6c0d5353c6facb0603cd9c7d49c9b Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 20 Jun 2017 12:19:36 +0530 Subject: [PATCH 06/12] Update company.py --- erpnext/setup/doctype/company/company.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index b333e87e84..f7e4c25885 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -143,13 +143,8 @@ class Company(Document): def validate_perpetual_inventory(self): if not self.get("__islocal"): if cint(self.enable_perpetual_inventory) == 1 and not self.default_inventory_account: - frappe.msgprint(_("Warning: Set default inventory account for perpetual inventory"), alert=True) - - enable_perpetual_inventory = frappe.db.get_value('Company', self.name, 'enable_perpetual_inventory') - if enable_perpetual_inventory != self.enable_perpetual_inventory: - if hasattr(frappe.local, 'enable_perpetual_inventory') and \ - self.name in frappe.local.enable_perpetual_inventory: - del frappe.local.enable_perpetual_inventory[self.name] + frappe.msgprint(_("Set default inventory account for perpetual inventory"), + alert=True, indicator='orange') def set_default_accounts(self): self._set_default_account("default_cash_account", "Cash") From 2d9b3cd2709e286a2d898aa948c14d2b20917999 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 21 Jun 2017 09:40:06 +0530 Subject: [PATCH 07/12] Fixed test cases --- erpnext/__init__.py | 2 +- erpnext/setup/doctype/company/company.py | 4 ++++ erpnext/stock/doctype/purchase_receipt/purchase_receipt.js | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index e1e355397f..6f73467ced 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -62,7 +62,7 @@ def is_perpetual_inventory_enabled(company): frappe.local.enable_perpetual_inventory = {} if not company in frappe.local.enable_perpetual_inventory: - frappe.local.enable_perpetual_inventory[company] = frappe.db.get_value("Company", + frappe.local.enable_perpetual_inventory[company] = frappe.db.get_value("Company", company, "enable_perpetual_inventory") or 0 return frappe.local.enable_perpetual_inventory[company] diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index f7e4c25885..1af0d8cf1a 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -89,6 +89,10 @@ class Company(Document): if self.default_currency: frappe.db.set_value("Currency", self.default_currency, "enabled", 1) + if hasattr(frappe.local, 'enable_perpetual_inventory') and \ + self.name in frappe.local.enable_perpetual_inventory: + frappe.local.enable_perpetual_inventory[self.name] = self.enable_perpetual_inventory + frappe.clear_cache() def install_country_fixtures(self): diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index a38b222d89..19cc44a119 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -62,7 +62,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend this._super(); if(this.frm.doc.docstatus===1) { this.show_stock_ledger(); - if (erpnext.is_perpetual_inventory_enabled(doc.company)) { + if (erpnext.is_perpetual_inventory_enabled(this.frm.doc.company)) { this.show_general_ledger(); } } From 4b299ba009d359603b760d1dcb4a093b190cde4f Mon Sep 17 00:00:00 2001 From: mbauskar Date: Thu, 22 Jun 2017 11:36:57 +0530 Subject: [PATCH 08/12] [minor] save the system settings document --- erpnext/patches.txt | 3 ++- erpnext/patches/v8_0/save_system_settings.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 erpnext/patches/v8_0/save_system_settings.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 1f2966d60b..bad8eb0843 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -404,4 +404,5 @@ erpnext.patches.v8_0.delete_bin_indexes erpnext.patches.v8_0.move_account_head_from_account_to_warehouse_for_inventory erpnext.patches.v8_0.change_in_words_varchar_length erpnext.patches.v8_0.create_domain_docs #16-05-2017 -erpnext.patches.v8_0.update_sales_cost_in_project \ No newline at end of file +erpnext.patches.v8_0.update_sales_cost_in_project +erpnext.patches.v8_0.save_system_settings \ No newline at end of file diff --git a/erpnext/patches/v8_0/save_system_settings.py b/erpnext/patches/v8_0/save_system_settings.py new file mode 100644 index 0000000000..d91e4c1209 --- /dev/null +++ b/erpnext/patches/v8_0/save_system_settings.py @@ -0,0 +1,15 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + """ + save system settings document + """ + + frappe.reload_doc("core", "doctype", "system_settings") + doc = frappe.get_doc("System Settings", "System Settings") + doc.flags.ignore_mandatory = True + doc.save(ignore_permissions=True) From ea77b63b4a2e97cc8ffc758373c6149f504bb4eb Mon Sep 17 00:00:00 2001 From: mbauskar Date: Thu, 22 Jun 2017 13:40:58 +0600 Subject: [PATCH 09/12] bumped to version 8.1.0 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index f65e5f308c..a8c7a42c8e 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '8.0.51' +__version__ = '8.1.0' def get_default_company(user=None): From f070c548defb53383b4c52c3497e728958f3da65 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Thu, 22 Jun 2017 16:43:28 +0530 Subject: [PATCH 10/12] [ci] use deprecated trusty build for now --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8f2febd53e..9f3737428b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: python dist: trusty +group: deprecated-2017Q2 python: - "2.7" From 66e2a510b94056bb36485e135fcd5698d0dacfe6 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Thu, 22 Jun 2017 16:18:12 +0530 Subject: [PATCH 11/12] [minor] deleted deprecated reprots and changed the lead.json modified time --- erpnext/accounts/page/pos/pos.js | 4 ++-- erpnext/crm/doctype/lead/lead.json | 2 +- erpnext/patches.txt | 3 ++- erpnext/patches/v8_1/__init__.py | 0 erpnext/patches/v8_1/delete_deprecated_reports.py | 15 +++++++++++++++ 5 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 erpnext/patches/v8_1/__init__.py create mode 100644 erpnext/patches/v8_1/delete_deprecated_reports.py diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index abe81a282a..2bbce601cd 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -1484,7 +1484,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ print_dialog: function () { var me = this; - this.frappe.msgprint = frappe.msgprint( + this.msgprint = frappe.msgprint( `${__('Print')} ${__('New')}`); @@ -1495,7 +1495,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ }) $('.new_doc').click(function () { - me.frappe.msgprint.hide() + me.msgprint.hide() me.make_new_cart() }) }, diff --git a/erpnext/crm/doctype/lead/lead.json b/erpnext/crm/doctype/lead/lead.json index 40b0e50ad1..e7c2d33f3c 100644 --- a/erpnext/crm/doctype/lead/lead.json +++ b/erpnext/crm/doctype/lead/lead.json @@ -1144,7 +1144,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-13 14:29:12.567700", + "modified": "2017-06-22 14:29:12.700000", "modified_by": "Administrator", "module": "CRM", "name": "Lead", diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 35582cb563..d0fa2e666c 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -405,4 +405,5 @@ erpnext.patches.v8_0.move_account_head_from_account_to_warehouse_for_inventory erpnext.patches.v8_0.change_in_words_varchar_length erpnext.patches.v8_0.create_domain_docs #16-05-2017 erpnext.patches.v8_0.update_sales_cost_in_project -erpnext.patches.v8_0.save_system_settings \ No newline at end of file +erpnext.patches.v8_0.save_system_settings +erpnext.patches.v8_1.delete_deprecated_reports \ No newline at end of file diff --git a/erpnext/patches/v8_1/__init__.py b/erpnext/patches/v8_1/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/patches/v8_1/delete_deprecated_reports.py b/erpnext/patches/v8_1/delete_deprecated_reports.py new file mode 100644 index 0000000000..2cb84a9a5f --- /dev/null +++ b/erpnext/patches/v8_1/delete_deprecated_reports.py @@ -0,0 +1,15 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + """ delete deprecated reports """ + + reports = ["Monthly Salary Register", "Customer Addresses And Contacts", + "Supplier Addresses And Contacts"] + + for report in reports: + if frappe.db.exists("Report", report): + frappe.delete_doc("Report", report, ignore_permissions=True) \ No newline at end of file From 04c8bf0b21634d0ececdf0946a009a865bec0823 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Thu, 22 Jun 2017 17:30:25 +0600 Subject: [PATCH 12/12] bumped to version 8.1.1 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index a8c7a42c8e..7526f379fa 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '8.1.0' +__version__ = '8.1.1' def get_default_company(user=None):