fix: as limit 100 was set in the query therefore not all item's default value moved to the Item Default table
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 36a31cf..be9baf4 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -533,7 +533,7 @@
erpnext.patches.v11_0.make_location_from_warehouse
erpnext.patches.v11_0.make_asset_finance_book_against_old_entries
erpnext.patches.v11_0.check_buying_selling_in_currency_exchange
-erpnext.patches.v11_0.move_item_defaults_to_child_table_for_multicompany #02-07-2018
+erpnext.patches.v11_0.move_item_defaults_to_child_table_for_multicompany #02-07-2018 #19-06-2019
erpnext.patches.v11_0.refactor_erpnext_shopify #2018-09-07
erpnext.patches.v11_0.rename_overproduction_percent_field
erpnext.patches.v11_0.update_backflush_subcontract_rm_based_on_bom
diff --git a/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py b/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py
index 01f84a0..c7c7635 100644
--- a/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py
+++ b/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py
@@ -17,10 +17,8 @@
frappe.reload_doc('stock', 'doctype', 'item_default')
frappe.reload_doc('stock', 'doctype', 'item')
- if frappe.db.a_row_exists('Item Default'): return
-
companies = frappe.get_all("Company")
- if len(companies) == 1:
+ if len(companies) == 1 and not frappe.get_all("Item Default", limit=1):
try:
frappe.db.sql('''
INSERT INTO `tabItem Default`
@@ -35,32 +33,64 @@
except:
pass
else:
- item_details = frappe.get_all("Item", fields=["name", "default_warehouse", "buying_cost_center",
- "expense_account", "selling_cost_center", "income_account"], limit=100)
+ item_details = frappe.db.sql(""" SELECT name, default_warehouse,
+ buying_cost_center, expense_account, selling_cost_center, income_account
+ FROM tabItem
+ WHERE
+ name not in (select distinct parent from `tabItem Default`) and ifnull(disabled, 0) = 0"""
+ , as_dict=1)
- for item in item_details:
- item_defaults = []
+ items_default_data = {}
+ for item_data in item_details:
+ for d in [["default_warehouse", "Warehouse"], ["expense_account", "Account"],
+ ["income_account", "Account"], ["buying_cost_center", "Cost Center"],
+ ["selling_cost_center", "Cost Center"]]:
+ if item_data.get(d[0]):
+ company = frappe.get_value(d[1], item_data.get(d[0]), "company", cache=True)
- def insert_into_item_defaults(doc_field_name, doc_field_value, company):
- for d in item_defaults:
- if d.get("company") == company:
- d[doc_field_name] = doc_field_value
- return
- item_defaults.append({
- "company": company,
- doc_field_name: doc_field_value
- })
+ if item_data.name not in items_default_data:
+ items_default_data[item_data.name] = {}
- for d in [
- ["default_warehouse", "Warehouse"], ["expense_account", "Account"], ["income_account", "Account"],
- ["buying_cost_center", "Cost Center"], ["selling_cost_center", "Cost Center"]
- ]:
- if item.get(d[0]):
- company = frappe.get_value(d[1], item.get(d[0]), "company", cache=True)
- insert_into_item_defaults(d[0], item.get(d[0]), company)
+ company_wise_data = items_default_data[item_data.name]
- doc = frappe.get_doc("Item", item.name)
- doc.extend("item_defaults", item_defaults)
+ if company not in company_wise_data:
+ company_wise_data[company] = {}
- for child_doc in doc.item_defaults:
- child_doc.db_insert()
\ No newline at end of file
+ default_data = company_wise_data[company]
+ default_data[d[0]] = item_data.get(d[0])
+
+ to_insert_data = []
+
+ # items_default_data data structure will be as follow
+ # {
+ # 'item_code 1': {'company 1': {'default_warehouse': 'Test Warehouse 1'}},
+ # 'item_code 2': {
+ # 'company 1': {'default_warehouse': 'Test Warehouse 1'},
+ # 'company 2': {'default_warehouse': 'Test Warehouse 1'}
+ # }
+ # }
+
+ for item_code, companywise_item_data in items_default_data.items():
+ for company, item_default_data in companywise_item_data.items():
+ to_insert_data.append((
+ frappe.generate_hash("", 10),
+ item_code,
+ 'Item',
+ 'item_defaults',
+ company,
+ item_default_data.get('default_warehouse'),
+ item_default_data.get('expense_account'),
+ item_default_data.get('income_account'),
+ item_default_data.get('buying_cost_center'),
+ item_default_data.get('selling_cost_center'),
+ ))
+
+ if to_insert_data:
+ frappe.db.sql('''
+ INSERT INTO `tabItem Default`
+ (
+ `name`, `parent`, `parenttype`, `parentfield`, `company`, `default_warehouse`,
+ `expense_account`, `income_account`, `buying_cost_center`, `selling_cost_center`
+ )
+ VALUES {}
+ '''.format(', '.join(['%s'] * len(to_insert_data))), tuple(to_insert_data))
\ No newline at end of file