Defaults in Item Group (#14874)
* Add Defaults table in Item Group * Fetch defaults from Item group if not found in Item * Add patch * Remove default fields from Item Group * Set query for defaults * Fix Codacy * Modify test records * Modify budget.py and sales_order.py * Remove join from query * Else condition to avoid error if no defaults found * refrain from making item test records before item_group * default cost center fetch correction * Remove tab item group from query
This commit is contained in:
parent
af479c8192
commit
3c9839f832
@ -298,8 +298,7 @@ def get_item_details(args):
|
||||
|
||||
if not (cost_center and expense_account):
|
||||
for doctype in ['Item Group', 'Company']:
|
||||
data = get_expense_cost_center(doctype,
|
||||
args.get(frappe.scrub(doctype)))
|
||||
data = get_expense_cost_center(doctype, args)
|
||||
|
||||
if not cost_center and data:
|
||||
cost_center = data[0]
|
||||
@ -312,8 +311,11 @@ def get_item_details(args):
|
||||
|
||||
return cost_center, expense_account
|
||||
|
||||
def get_expense_cost_center(doctype, value):
|
||||
fields = (['default_cost_center', 'default_expense_account']
|
||||
if doctype == 'Item Group' else ['cost_center', 'default_expense_account'])
|
||||
|
||||
return frappe.db.get_value(doctype, value, fields)
|
||||
def get_expense_cost_center(doctype, args):
|
||||
if doctype == 'Item Group':
|
||||
return frappe.db.get_value('Item Default',
|
||||
{'parent': args.get(frappe.scrub(doctype)), 'company': args.get('company')},
|
||||
['buying_cost_center', 'expense_account'])
|
||||
else:
|
||||
return frappe.db.get_value(doctype, args.get(frappe.scrub(doctype)),\
|
||||
['cost_center', 'default_expense_account'])
|
||||
|
@ -15,6 +15,7 @@ from erpnext.buying.utils import validate_for_items, check_for_closed_status
|
||||
from erpnext.stock.utils import get_bin
|
||||
from six import string_types
|
||||
from erpnext.stock.doctype.item.item import get_item_defaults
|
||||
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
||||
|
||||
form_grid_templates = {
|
||||
"items": "templates/form_grid/item_grid.html"
|
||||
@ -390,9 +391,10 @@ def make_purchase_invoice(source_name, target_doc=None):
|
||||
target.qty = target.amount / flt(obj.rate) if (flt(obj.rate) and flt(obj.billed_amt)) else flt(obj.qty)
|
||||
|
||||
item = get_item_defaults(target.item_code, source_parent.company)
|
||||
item_group = get_item_group_defaults(target.item_code, source_parent.company)
|
||||
target.cost_center = frappe.db.get_value("Project", obj.project, "cost_center") \
|
||||
or item.get("buying_cost_center") \
|
||||
or frappe.db.get_value("Item Group", item.item_group, "default_cost_center")
|
||||
or item_group.get("buying_cost_center")
|
||||
|
||||
doc = get_mapped_doc("Purchase Order", source_name, {
|
||||
"Purchase Order": {
|
||||
|
@ -77,6 +77,12 @@ class BuyingController(StockController):
|
||||
for d in self.get("items"):
|
||||
supplier = frappe.db.get_value("Item Default",
|
||||
{"parent": d.item_code, "company": self.company}, "default_supplier")
|
||||
if supplier:
|
||||
self.supplier = supplier
|
||||
else:
|
||||
item_group = frappe.db.get_value("Item", d.item_code, "item_group")
|
||||
supplier = frappe.db.get_value("Item Default",
|
||||
{"parent": item_group, "company": self.company}, "default_supplier")
|
||||
if supplier:
|
||||
self.supplier = supplier
|
||||
break
|
||||
|
@ -559,3 +559,4 @@ erpnext.patches.v11_0.skip_user_permission_check_for_department
|
||||
erpnext.patches.v11_0.set_department_for_doctypes
|
||||
erpnext.patches.v11_0.update_allow_transfer_for_manufacture
|
||||
erpnext.patches.v11_0.rename_healthcare_doctype_and_fields
|
||||
erpnext.patches.v11_0.add_item_group_defaults
|
||||
|
73
erpnext/patches/v11_0/add_item_group_defaults.py
Normal file
73
erpnext/patches/v11_0/add_item_group_defaults.py
Normal file
@ -0,0 +1,73 @@
|
||||
# Copyright (c) 2018, Frappe and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
def execute():
|
||||
'''
|
||||
|
||||
Fields to move from item group to item defaults child table
|
||||
[ default_cost_center, default_expense_account, default_income_account ]
|
||||
|
||||
'''
|
||||
|
||||
frappe.reload_doc('stock', 'doctype', 'item_default')
|
||||
frappe.reload_doc('setup', 'doctype', 'item_group')
|
||||
|
||||
companies = frappe.get_all("Company")
|
||||
item_groups = frappe.db.sql("""select name, default_income_account, default_expense_account,\
|
||||
default_cost_center from `tabItem Group`""", as_dict=True)
|
||||
|
||||
if len(companies) == 1:
|
||||
for item_group in item_groups:
|
||||
doc = frappe.get_doc("Item Group", item_group.get("name"))
|
||||
item_group_defaults = []
|
||||
item_group_defaults.append({
|
||||
"company": companies[0].name,
|
||||
"income_account": item_group.get("default_income_account"),
|
||||
"expense_account": item_group.get("default_expense_account"),
|
||||
"buying_cost_center": item_group.get("default_cost_center"),
|
||||
"selling_cost_center": item_group.get("default_cost_center")
|
||||
})
|
||||
doc.extend("item_group_defaults", item_group_defaults)
|
||||
for child_doc in doc.item_group_defaults:
|
||||
child_doc.db_insert()
|
||||
else:
|
||||
item_group_dict = {
|
||||
"default_expense_account": ["expense_account"],
|
||||
"default_income_account": ["income_account"],
|
||||
"default_cost_center": ["buying_cost_center", "selling_cost_center"]
|
||||
}
|
||||
for item_group in item_groups:
|
||||
item_group_defaults = []
|
||||
def insert_into_item_defaults(doc_field_name, doc_field_value, company):
|
||||
for d in item_group_defaults:
|
||||
if d.get("company") == company:
|
||||
d[doc_field_name[0]] = doc_field_value
|
||||
if len(doc_field_name) > 1:
|
||||
d[doc_field_name[1]] = doc_field_value
|
||||
return
|
||||
|
||||
item_group_defaults.append({
|
||||
"company": company,
|
||||
doc_field_name[0]: doc_field_value
|
||||
})
|
||||
|
||||
if(len(doc_field_name) > 1):
|
||||
item_group_defaults[len(item_group_defaults)-1][doc_field_name[1]] = doc_field_value
|
||||
|
||||
for d in [
|
||||
["default_expense_account", "Account"], ["default_income_account", "Account"],
|
||||
["default_cost_center", "Cost Center"]
|
||||
]:
|
||||
if item_group.get(d[0]):
|
||||
company = frappe.get_value(d[1], item_group.get(d[0]), "company", cache=True)
|
||||
doc_field_name = item_group_dict.get(d[0])
|
||||
|
||||
insert_into_item_defaults(doc_field_name, item_group.get(d[0]), company)
|
||||
|
||||
doc = frappe.get_doc("Item Group", item_group.get("name"))
|
||||
doc.extend("item_group_defaults", item_group_defaults)
|
||||
for child_doc in doc.item_group_defaults:
|
||||
child_doc.db_insert()
|
@ -16,7 +16,7 @@ from erpnext.controllers.selling_controller import SellingController
|
||||
from frappe.desk.doctype.auto_repeat.auto_repeat import get_next_schedule_date
|
||||
from erpnext.selling.doctype.customer.customer import check_credit_limit
|
||||
from erpnext.stock.doctype.item.item import get_item_defaults
|
||||
|
||||
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
||||
|
||||
form_grid_templates = {
|
||||
"items": "templates/form_grid/item_grid.html"
|
||||
@ -513,11 +513,12 @@ def make_delivery_note(source_name, target_doc=None):
|
||||
target.qty = flt(source.qty) - flt(source.delivered_qty)
|
||||
|
||||
item = get_item_defaults(target.item_code, source_parent.company)
|
||||
item_group = get_item_group_defaults(target.item_code, source_parent.company)
|
||||
|
||||
if item:
|
||||
target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center") \
|
||||
or item.get("selling_cost_center") \
|
||||
or frappe.db.get_value("Item Group", item.item_group, "default_cost_center")
|
||||
or item_group.get("selling_cost_center")
|
||||
|
||||
target_doc = get_mapped_doc("Sales Order", source_name, {
|
||||
"Sales Order": {
|
||||
@ -581,8 +582,9 @@ def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False):
|
||||
target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center")
|
||||
if not target.cost_center and target.item_code:
|
||||
item = get_item_defaults(target.item_code, target.company)
|
||||
item_group = get_item_group_defaults(target.item_code, target.company)
|
||||
target.cost_center = item.get("selling_cost_center") \
|
||||
or frappe.db.get_value("Item Group", item.item_group, "default_cost_center")
|
||||
or item_group.get("selling_cost_center")
|
||||
|
||||
doclist = get_mapped_doc("Sales Order", source_name, {
|
||||
"Sales Order": {
|
||||
|
@ -14,6 +14,40 @@ frappe.ui.form.on("Item Group", {
|
||||
]
|
||||
}
|
||||
}
|
||||
frm.fields_dict["item_group_defaults"].grid.get_field("expense_account").get_query = function(doc, cdt, cdn) {
|
||||
const row = locals[cdt][cdn];
|
||||
return {
|
||||
query: "erpnext.controllers.queries.get_expense_account",
|
||||
filters: { company: row.company }
|
||||
}
|
||||
}
|
||||
frm.fields_dict["item_group_defaults"].grid.get_field("income_account").get_query = function(doc, cdt, cdn) {
|
||||
const row = locals[cdt][cdn];
|
||||
return {
|
||||
query: "erpnext.controllers.queries.get_income_account",
|
||||
filters: { company: row.company }
|
||||
}
|
||||
}
|
||||
|
||||
frm.fields_dict["item_group_defaults"].grid.get_field("buying_cost_center").get_query = function(doc, cdt, cdn) {
|
||||
const row = locals[cdt][cdn];
|
||||
return {
|
||||
filters: {
|
||||
"is_group": 0,
|
||||
"company": row.company
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
frm.fields_dict["item_group_defaults"].grid.get_field("selling_cost_center").get_query = function(doc, cdt, cdn) {
|
||||
const row = locals[cdt][cdn];
|
||||
return {
|
||||
filters: {
|
||||
"is_group": 0,
|
||||
"company": row.company
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
refresh: function(frm) {
|
||||
|
@ -1,5 +1,6 @@
|
||||
{
|
||||
"allow_copy": 0,
|
||||
"allow_guest_to_view": 0,
|
||||
"allow_import": 1,
|
||||
"allow_rename": 1,
|
||||
"autoname": "field:item_group_name",
|
||||
@ -13,6 +14,8 @@
|
||||
"editable_grid": 0,
|
||||
"fields": [
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -38,9 +41,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -68,9 +74,12 @@
|
||||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"unique": 0
|
||||
"translatable": 0,
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 1,
|
||||
"collapsible": 0,
|
||||
@ -100,9 +109,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 1,
|
||||
"collapsible": 0,
|
||||
@ -132,9 +144,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -159,15 +174,18 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "default_income_account",
|
||||
"fieldtype": "Link",
|
||||
"fieldname": "defaults",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
@ -175,11 +193,11 @@
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Default Income Account",
|
||||
"label": "Defaults",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Account",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
@ -188,15 +206,18 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fieldname": "default_expense_account",
|
||||
"fieldtype": "Link",
|
||||
"fieldname": "item_group_defaults",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
@ -204,40 +225,12 @@
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Default Expense Account",
|
||||
"label": "Item Group Defaults",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Account",
|
||||
"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": "default_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": "Default Cost Center",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Cost Center",
|
||||
"options": "Item Default",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
@ -246,9 +239,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -274,9 +270,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -303,9 +302,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -333,9 +335,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -364,9 +369,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -394,9 +402,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -424,9 +435,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -454,9 +468,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 1,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -484,9 +501,12 @@
|
||||
"reqd": 0,
|
||||
"search_index": 1,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
@ -516,21 +536,22 @@
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
}
|
||||
],
|
||||
"has_web_view": 0,
|
||||
"hide_heading": 0,
|
||||
"hide_toolbar": 0,
|
||||
"icon": "fa fa-sitemap",
|
||||
"idx": 1,
|
||||
"image_view": 0,
|
||||
"in_create": 0,
|
||||
|
||||
"is_submittable": 0,
|
||||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 3,
|
||||
"modified": "2017-02-20 13:24:59.364873",
|
||||
"modified": "2018-07-11 16:07:56.050363",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Setup",
|
||||
"name": "Item Group",
|
||||
@ -539,7 +560,6 @@
|
||||
"permissions": [
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
@ -559,7 +579,6 @@
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
@ -579,7 +598,6 @@
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 0,
|
||||
"cancel": 0,
|
||||
"create": 1,
|
||||
"delete": 1,
|
||||
@ -599,7 +617,6 @@
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
@ -619,7 +636,6 @@
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
@ -639,7 +655,6 @@
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"apply_user_permissions": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
@ -665,5 +680,6 @@
|
||||
"show_name_in_global_search": 1,
|
||||
"sort_order": "DESC",
|
||||
"track_changes": 0,
|
||||
"track_seen": 0
|
||||
"track_seen": 0,
|
||||
"track_views": 0
|
||||
}
|
@ -173,3 +173,19 @@ def invalidate_cache_for(doc, item_group=None):
|
||||
item_group_name = frappe.db.get_value("Item Group", d.get('name'))
|
||||
if item_group_name:
|
||||
clear_cache(frappe.db.get_value('Item Group', item_group_name, 'route'))
|
||||
|
||||
def get_item_group_defaults(item, company):
|
||||
item_group = frappe.db.get_value("Item", item, "item_group")
|
||||
item_group_defaults = frappe.db.sql('''
|
||||
select
|
||||
expense_account, income_account, buying_cost_center, default_warehouse,
|
||||
selling_cost_center, default_supplier
|
||||
from
|
||||
`tabItem Default` where company = %s and parent = %s and parenttype = 'Item Group'
|
||||
''', (company, item_group), as_dict=1)
|
||||
|
||||
if item_group_defaults:
|
||||
return item_group_defaults[0]
|
||||
else:
|
||||
return frappe.db.get_value("Item", item, ["name", "item_name", "description", "stock_uom",
|
||||
"is_stock_item", "item_code", "item_group"], as_dict=1)
|
23
erpnext/setup/doctype/item_group/test_item_group.js
Normal file
23
erpnext/setup/doctype/item_group/test_item_group.js
Normal file
@ -0,0 +1,23 @@
|
||||
/* eslint-disable */
|
||||
// rename this file from _test_[name] to test_[name] to activate
|
||||
// and remove above this line
|
||||
|
||||
QUnit.test("test: Item Group", function (assert) {
|
||||
let done = assert.async();
|
||||
|
||||
// number of asserts
|
||||
assert.expect(1);
|
||||
|
||||
frappe.run_serially([
|
||||
// insert a new Item Group
|
||||
() => frappe.tests.make('Item Group', [
|
||||
// values to be set
|
||||
{key: 'value'}
|
||||
]),
|
||||
() => {
|
||||
assert.equal(cur_frm.doc.key, 'value');
|
||||
},
|
||||
() => done()
|
||||
]);
|
||||
|
||||
});
|
@ -4,7 +4,11 @@
|
||||
"is_group": 0,
|
||||
"item_group_name": "_Test Item Group",
|
||||
"parent_item_group": "All Item Groups",
|
||||
"default_cost_center": "_Test Cost Center 2 - _TC"
|
||||
"item_group_defaults": [{
|
||||
"company": "_Test Company",
|
||||
"buying_cost_center": "_Test Cost Center 2 - _TC",
|
||||
"selling_cost_center": "_Test Cost Center 2 - _TC"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"doctype": "Item Group",
|
||||
|
@ -5,3 +5,5 @@ from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
test_records = frappe.get_test_records('Sales Partner')
|
||||
|
||||
test_ignore = ["Item Group"]
|
||||
|
@ -6,3 +6,5 @@ test_dependencies = ["Employee"]
|
||||
|
||||
import frappe
|
||||
test_records = frappe.get_test_records('Sales Person')
|
||||
|
||||
test_ignore = ["Item Group"]
|
||||
|
@ -5,3 +5,5 @@ from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
test_records = frappe.get_test_records('Territory')
|
||||
|
||||
test_ignore = ["Item Group"]
|
||||
|
@ -17,7 +17,7 @@ from erpnext.stock.get_item_details import get_item_details
|
||||
from six import iteritems
|
||||
|
||||
test_ignore = ["BOM"]
|
||||
test_dependencies = ["Warehouse"]
|
||||
test_dependencies = ["Warehouse", "Item Group"]
|
||||
|
||||
def make_item(item_code, properties=None):
|
||||
if frappe.db.exists("Item", item_code):
|
||||
|
@ -9,6 +9,7 @@ from frappe.utils import cstr, cint, flt, comma_or, getdate, nowdate, formatdate
|
||||
from erpnext.stock.utils import get_incoming_rate
|
||||
from erpnext.stock.stock_ledger import get_previous_sle, NegativeStockError, get_valuation_rate
|
||||
from erpnext.stock.get_item_details import get_bin_details, get_default_cost_center, get_conversion_factor
|
||||
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
||||
from erpnext.stock.doctype.batch.batch import get_batch_no, set_batch_nos, get_batch_qty
|
||||
from erpnext.stock.doctype.item.item import get_item_defaults
|
||||
from erpnext.manufacturing.doctype.bom.bom import validate_bom_no, add_additional_cost
|
||||
@ -579,7 +580,7 @@ class StockEntry(StockController):
|
||||
pro_doc.run_method("update_planned_qty")
|
||||
|
||||
def get_item_details(self, args=None, for_update=False):
|
||||
item = frappe.db.sql("""select i.stock_uom, i.description, i.image, i.item_name, i.item_group,
|
||||
item = frappe.db.sql("""select i.name, i.stock_uom, i.description, i.image, i.item_name, i.item_group,
|
||||
i.has_batch_no, i.sample_quantity, i.has_serial_no,
|
||||
id.expense_account, id.buying_cost_center
|
||||
from `tabItem` i LEFT JOIN `tabItem Default` id ON i.name=id.parent and id.company=%s
|
||||
@ -592,6 +593,7 @@ class StockEntry(StockController):
|
||||
frappe.throw(_("Item {0} is not active or end of life has been reached").format(args.get("item_code")))
|
||||
|
||||
item = item[0]
|
||||
item_group_defaults = get_item_group_defaults(item.name, self.company)
|
||||
|
||||
ret = frappe._dict({
|
||||
'uom' : item.stock_uom,
|
||||
@ -600,7 +602,7 @@ class StockEntry(StockController):
|
||||
'image' : item.image,
|
||||
'item_name' : item.item_name,
|
||||
'expense_account' : args.get("expense_account"),
|
||||
'cost_center' : get_default_cost_center(args, item),
|
||||
'cost_center' : get_default_cost_center(args, item, item_group_defaults),
|
||||
'qty' : 0,
|
||||
'transfer_qty' : 0,
|
||||
'conversion_factor' : 1,
|
||||
|
@ -12,7 +12,7 @@ from frappe.model.meta import get_field_precision
|
||||
from erpnext.stock.doctype.batch.batch import get_batch_no
|
||||
from erpnext import get_company_currency
|
||||
from erpnext.stock.doctype.item.item import get_item_defaults
|
||||
|
||||
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
||||
|
||||
from six import string_types, iteritems
|
||||
|
||||
@ -208,7 +208,10 @@ def get_basic_details(args, item):
|
||||
if len(user_default_warehouse_list) == 1 else ""
|
||||
|
||||
item_defaults = get_item_defaults(item.name, args.company)
|
||||
warehouse = user_default_warehouse or item_defaults.get("default_warehouse") or args.warehouse
|
||||
item_group_defaults = get_item_group_defaults(item.name, args.company)
|
||||
|
||||
warehouse = user_default_warehouse or item_defaults.get("default_warehouse") or\
|
||||
item_group_defaults.get("default_warehouse") or args.warehouse
|
||||
|
||||
material_request_type = ''
|
||||
if args.get('doctype') == "Material Request" and not args.get('material_request_type'):
|
||||
@ -231,9 +234,9 @@ def get_basic_details(args, item):
|
||||
"description": cstr(item.description).strip(),
|
||||
"image": cstr(item.image).strip(),
|
||||
"warehouse": warehouse,
|
||||
"income_account": get_default_income_account(args, item_defaults),
|
||||
"expense_account": get_default_expense_account(args, item_defaults),
|
||||
"cost_center": get_default_cost_center(args, item_defaults),
|
||||
"income_account": get_default_income_account(args, item_defaults, item_group_defaults),
|
||||
"expense_account": get_default_expense_account(args, item_defaults, item_group_defaults),
|
||||
"cost_center": get_default_cost_center(args, item_defaults, item_group_defaults),
|
||||
'has_serial_no': item.has_serial_no,
|
||||
'has_batch_no': item.has_batch_no,
|
||||
"batch_no": None,
|
||||
@ -252,7 +255,7 @@ def get_basic_details(args, item):
|
||||
"net_rate": 0.0,
|
||||
"net_amount": 0.0,
|
||||
"discount_percentage": 0.0,
|
||||
"supplier": item_defaults.get("default_supplier"),
|
||||
"supplier": get_default_supplier(args, item_defaults, item_group_defaults),
|
||||
"update_stock": args.get("update_stock") if args.get('doctype') in ['Sales Invoice', 'Purchase Invoice'] else 0,
|
||||
"delivered_by_supplier": item.delivered_by_supplier if args.get("doctype") in ["Sales Order", "Sales Invoice"] else 0,
|
||||
"is_fixed_asset": item.is_fixed_asset,
|
||||
@ -299,15 +302,15 @@ def get_basic_details(args, item):
|
||||
return out
|
||||
|
||||
|
||||
def get_default_income_account(args, item):
|
||||
def get_default_income_account(args, item, item_group):
|
||||
return (item.get("income_account")
|
||||
or args.income_account
|
||||
or frappe.db.get_value("Item Group", item.item_group, "default_income_account"))
|
||||
or item_group.get("income_account")
|
||||
or args.income_account)
|
||||
|
||||
def get_default_expense_account(args, item):
|
||||
def get_default_expense_account(args, item, item_group):
|
||||
return (item.get("expense_account")
|
||||
or args.expense_account
|
||||
or frappe.db.get_value("Item Group", item.item_group, "default_expense_account"))
|
||||
or item_group.get("expense_account")
|
||||
or args.expense_account)
|
||||
|
||||
def get_default_deferred_revenue_account(args, item):
|
||||
if item.enable_deferred_revenue:
|
||||
@ -317,12 +320,16 @@ def get_default_deferred_revenue_account(args, item):
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_default_cost_center(args, item):
|
||||
def get_default_cost_center(args, item, item_group):
|
||||
return (frappe.db.get_value("Project", args.get("project"), "cost_center")
|
||||
or (item.get("selling_cost_center") if args.get("customer") else item.get("buying_cost_center"))
|
||||
or frappe.db.get_value("Item Group", item.item_group, "default_cost_center")
|
||||
or (item_group.get("selling_cost_center") if args.get("customer") else item_group.get("buying_cost_center"))
|
||||
or args.get("cost_center"))
|
||||
|
||||
def get_default_supplier(args, item, item_group):
|
||||
return (item.get("default_supplier")
|
||||
or item_group.get("default_supplier"))
|
||||
|
||||
def get_price_list_rate(args, item_doc, out):
|
||||
meta = frappe.get_meta(args.parenttype or args.doctype)
|
||||
|
||||
@ -686,10 +693,11 @@ def get_default_bom(item_code=None):
|
||||
|
||||
def get_valuation_rate(item_code, company, warehouse=None):
|
||||
item = get_item_defaults(item_code, company)
|
||||
item_group = get_item_group_defaults(item_code, company)
|
||||
# item = frappe.get_doc("Item", item_code)
|
||||
if item.get("is_stock_item"):
|
||||
if not warehouse:
|
||||
warehouse = item.get("default_warehouse")
|
||||
warehouse = item.get("default_warehouse") or item_group.get("default_warehouse")
|
||||
|
||||
return frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse},
|
||||
["valuation_rate"], as_dict=True) or {"valuation_rate": 0}
|
||||
|
Loading…
x
Reference in New Issue
Block a user