Merge branch 'master' of github.com:webnotes/erpnext into webshop

Conflicts:
	accounts/doctype/sales_invoice/sales_invoice.txt
	stock/doctype/item/item.txt
This commit is contained in:
Anand Doshi
2013-04-24 11:48:28 +05:30
28 changed files with 1104 additions and 486 deletions

View File

@@ -24,50 +24,169 @@ from webnotes import msgprint, _
from webnotes.model.controller import DocListController
class DocType(DocListController):
def get_tax_rate(self, tax_type):
rate = webnotes.conn.sql("select tax_rate from tabAccount where name = %s", tax_type)
ret = {
'tax_rate' : rate and flt(rate[0][0]) or 0
}
return ret
def validate(self):
if not self.doc.stock_uom:
msgprint(_("Please enter Default Unit of Measure"), raise_exception=1)
self.check_stock_uom_with_bin()
self.validate_conversion_factor()
self.add_default_uom_in_conversion_factor_table()
self.valiadte_item_type()
self.check_for_active_boms()
self.check_ref_rate_detail()
self.fill_customer_code()
self.check_item_tax()
self.validate_barcode()
self.check_non_asset_warehouse()
self.cant_change()
if self.doc.name:
self.old_page_name = webnotes.conn.get_value('Item', self.doc.name, 'page_name')
def on_update(self):
self.validate_name_with_item_group()
# webpage updates
self.update_website()
def add_default_uom_in_conversion_factor_table(self):
uom_conv_list = [d.uom for d in self.doclist.get({"parentfield": "uom_conversion_details"})]
if self.doc.stock_uom not in uom_conv_list:
ch = addchild(self.doc, 'uom_conversion_details', 'UOM Conversion Detail', self.doclist)
ch.uom = self.doc.stock_uom
ch.conversion_factor = 1
def check_stock_uom_with_bin(self):
bin = webnotes.conn.sql("select stock_uom from `tabBin` where item_code = %s",
self.doc.item_code)
if bin and cstr(bin[0][0]) and cstr(bin[0][0]) != cstr(self.doc.stock_uom):
msgprint("Please Update Stock UOM with the help of Stock UOM Replace Utility.")
raise Exception
if self.doc.stock_uom and bin and cstr(bin[0][0]) \
and cstr(bin[0][0]) != cstr(self.doc.stock_uom):
msgprint(_("Please Update Stock UOM with the help of Stock UOM Replace Utility."),
raise_exception=1)
def validate_conversion_factor(self):
check_list = []
for d in getlist(self.doclist,'uom_conversion_details'):
if not self.doc.stock_uom:
msgprint("Please enter Stock UOM first.")
raise Exception
if cstr(d.uom) in check_list:
msgprint("UOM %s has been entered more than once in Conversion Factor Details." % cstr(d.uom))
raise Exception
msgprint(_("UOM %s has been entered more than once in Conversion Factor Table." %
cstr(d.uom)), raise_exception=1)
else:
check_list.append(cstr(d.uom))
if cstr(d.uom) == cstr(self.doc.stock_uom):
if flt(d.conversion_factor) != 1:
msgprint("Conversion Factor of UOM : %s should be equal to 1. As UOM : %s is Stock UOM of Item: %s." % ( cstr(d.uom), cstr(d.uom), cstr(self.doc.name)))
raise Exception
elif cstr(d.uom) != cstr(self.doc.stock_uom) and flt(d.conversion_factor) == 1:
msgprint("Conversion Factor of UOM : %s should not be equal to 1. As UOM : %s is not Stock UOM of Item: %s." % ( cstr(d.uom), cstr(d.uom), cstr(self.doc.name)))
raise Exception
if d.uom and cstr(d.uom) == cstr(self.doc.stock_uom) and flt(d.conversion_factor) != 1:
msgprint(_("""Conversion Factor of UOM: %s should be equal to 1.
As UOM: %s is Stock UOM of Item: %s.""" %
(d.uom, d.uom, self.doc.name)), raise_exception=1)
elif d.uom and cstr(d.uom)!= self.doc.stock_uom and flt(d.conversion_factor) == 1:
msgprint(_("""Conversion Factor of UOM: %s should not be equal to 1.
As UOM: %s is not Stock UOM of Item: %s""" %
(d.uom, d.uom, self.doc.name)), raise_exception=1)
def valiadte_item_type(self):
if cstr(self.doc.is_manufactured_item) == "No":
self.doc.is_pro_applicable = "No"
if not cstr(self.doc.stock_uom) in check_list :
child = addchild( self.doc, 'uom_conversion_details',
'UOM Conversion Detail', self.doclist)
child.uom = self.doc.stock_uom
child.conversion_factor = 1
child.save()
if self.doc.is_pro_applicable == 'Yes' and self.doc.is_stock_item == 'No':
msgprint("As Production Order can be made for this Item, then Is Stock Item Should be 'Yes' as we maintain it's stock. Refer Manufacturing and Inventory section.", raise_exception=1)
if self.doc.has_serial_no == 'Yes' and self.doc.is_stock_item == 'No':
msgprint("'Has Serial No' can not be 'Yes' for non-stock item", raise_exception=1)
def check_for_active_boms(self):
def _check_for_active_boms(field_label):
if field_label in ['Is Active', 'Is Purchase Item']:
bom_mat = webnotes.conn.sql("""select distinct t1.parent
from `tabBOM Item` t1, `tabBOM` t2 where t2.name = t1.parent
and t1.item_code =%s and ifnull(t1.bom_no, '') = '' and t2.is_active = 1
and t2.docstatus = 1 and t1.docstatus =1 """, self.doc.name)
if bom_mat and bom_mat[0][0]:
msgprint(_(field_label) + _(" should be 'Yes'. As Item: ") + self.doc.name +
_(" is present in one or many Active BOMs"), raise_exception=1)
if ((field_label == 'Allow Production Order'
and self.doc.is_sub_contracted_item != 'Yes')
or (field_label == 'Is Sub Contracted Item'
and self.doc.is_manufactured_item != 'Yes')):
bom = webnotes.conn.sql("""select name from `tabBOM` where item = %s
and is_active = 1""", (self.doc.name,))
if bom and bom[0][0]:
msgprint(_(field_label) + _(" should be 'Yes'. As Item: ") + self.doc.name +
_(" is present in one or many Active BOMs"), raise_exception=1)
if not cint(self.doc.fields.get("__islocal")):
fl = {'is_manufactured_item' :'Allow Bill of Materials',
'is_sub_contracted_item':'Is Sub Contracted Item',
'is_purchase_item' :'Is Purchase Item',
'is_pro_applicable' :'Allow Production Order'}
for d in fl:
if cstr(self.doc.fields.get(d)) != 'Yes':
_check_for_active_boms(fl[d])
def check_ref_rate_detail(self):
check_list=[]
for d in getlist(self.doclist,'ref_rate_details'):
if [cstr(d.price_list_name), cstr(d.ref_currency),
cint(d.selling), cint(d.buying)] in check_list:
msgprint("Ref Rate is entered twice for Price List : '%s' and Currency : '%s'." %
(d.price_list_name,d.ref_currency), raise_exception=1)
else:
check_list.append([cstr(d.price_list_name),cstr(d.ref_currency)])
def fill_customer_code(self):
""" Append all the customer codes and insert into "customer_code" field of item table """
cust_code=[]
for d in getlist(self.doclist,'item_customer_details'):
cust_code.append(d.ref_code)
self.doc.customer_code=','.join(cust_code)
def check_item_tax(self):
"""Check whether Tax Rate is not entered twice for same Tax Type"""
check_list=[]
for d in getlist(self.doclist,'item_tax'):
if d.tax_type:
account_type = webnotes.conn.get_value("Account", d.tax_type, "account_type")
if account_type not in ['Tax', 'Chargeable']:
msgprint("'%s' is not Tax / Chargeable Account" % d.tax_type, raise_exception=1)
else:
if d.tax_type in check_list:
msgprint("Rate is entered twice for: '%s'" % d.tax_type, raise_exception=1)
else:
check_list.append(d.tax_type)
def validate_barcode(self):
if self.doc.barcode:
duplicate = webnotes.conn.sql("select name from tabItem where barcode = %s and name != %s", (self.doc.barcode, self.doc.name))
if duplicate:
msgprint("Barcode: %s already used in item: %s" %
(self.doc.barcode, cstr(duplicate[0][0])), raise_exception = 1)
def check_non_asset_warehouse(self):
if self.doc.is_asset_item == "Yes":
existing_qty = webnotes.conn.sql("select t1.warehouse, t1.actual_qty from tabBin t1, tabWarehouse t2 where t1.item_code=%s and (t2.warehouse_type!='Fixed Asset' or t2.warehouse_type is null) and t1.warehouse=t2.name and t1.actual_qty > 0", self.doc.name)
for e in existing_qty:
msgprint("%s Units exist in Warehouse %s, which is not an Asset Warehouse." %
(e[1],e[0]))
if existing_qty:
self.doc.is_asset_item = 'No'
msgprint(_("""Please transfer the above quantities to an asset warehouse \
before changing this item to an asset item"""), raise_exception=1)
def cant_change(self):
if not self.doc.fields.get("__islocal"):
vals = webnotes.conn.get_value("Item", self.doc.name,
["has_serial_no", "is_stock_item", "valuation_method"], as_dict=True)
if vals and ((self.doc.is_stock_item == "No" and vals.is_stock_item == "Yes") or
vals.has_serial_no != self.doc.has_serial_no or
vals.valuation_method != self.doc.valuation_method):
if self.check_if_sle_exists() == "exists":
webnotes.msgprint(_("As there are existing stock transactions for this \
item, you can not change the values of 'Has Serial No', \
'Is Stock Item' and 'Valuation Method'"), raise_exception=1)
def check_if_sle_exists(self):
sle = webnotes.conn.sql("""select name from `tabStock Ledger Entry`
where item_code = %s and ifnull(is_cancelled, 'No') = 'No'""", self.doc.name)
return sle and 'exists' or 'not exists'
def validate_name_with_item_group(self):
if webnotes.conn.exists("Item Group", self.doc.name):
@@ -104,107 +223,17 @@ class DocType(DocListController):
webnotes.conn.set(self.doc, "page_name", None)
# On delete 1. Delete BIN (if none of the corrosponding transactions present, it gets deleted. if present, rolled back due to exception)
def on_trash(self):
webnotes.conn.sql("""delete from tabBin where item_code=%s""", self.doc.item_code)
webnotes.conn.sql("""delete from `tabStock Ledger Entry`
where item_code=%s and is_cancelled='Yes' """, self.doc.item_code)
if self.doc.page_name:
from webnotes.webutils import clear_cache
clear_cache(self.doc.page_name)
# Check whether Ref Rate is not entered twice for same Price List and Currency
def check_ref_rate_detail(self):
check_list=[]
for d in getlist(self.doclist,'ref_rate_details'):
if [cstr(d.price_list_name),cstr(d.ref_currency),cint(d.selling),cint(d.buying)] in check_list:
msgprint("Ref Rate is entered twice for Price List : '%s' and Currency : '%s'." % (d.price_list_name,d.ref_currency))
raise Exception
else:
check_list.append([cstr(d.price_list_name),cstr(d.ref_currency)])
def get_tax_rate(self, tax_type):
return { "tax_rate": webnotes.conn.get_value("Account", tax_type, "tax_rate") }
# Append all the customer codes and insert into "customer_code" field of item table
def fill_customer_code(self):
cust_code=[]
for d in getlist(self.doclist,'item_customer_details'):
cust_code.append(d.ref_code)
self.doc.customer_code=','.join(cust_code)
def prepare_template_args(self):
from website.helpers.product import get_parent_item_groups
self.parent_groups = get_parent_item_groups(self.doc.item_group) + [{"name":self.doc.name}]
self.doc.title = self.doc.item_name
def check_item_tax(self):
"""Check whether Tax Rate is not entered twice for same Tax Type"""
check_list=[]
for d in getlist(self.doclist,'item_tax'):
if d.tax_type:
account_type = webnotes.conn.get_value("Account", d.tax_type, "account_type")
if account_type not in ['Tax', 'Chargeable']:
msgprint("'%s' is not Tax / Chargeable Account" % d.tax_type, raise_exception=1)
else:
if d.tax_type in check_list:
msgprint("Rate is entered twice for: '%s'" % d.tax_type, raise_exception=1)
else:
check_list.append(d.tax_type)
def check_for_active_boms(self, field_label):
if field_label in ['Is Active', 'Is Purchase Item']:
bom_mat = webnotes.conn.sql("select distinct t1.parent from `tabBOM Item` t1, `tabBOM` t2 where t1.item_code =%s and (t1.bom_no = '' or t1.bom_no is NULL) and t2.name = t1.parent and t2.is_active = 1 and t2.docstatus = 1 and t1.docstatus =1 ", self.doc.name)
if bom_mat and bom_mat[0][0]:
msgprint("%s should be 'Yes'. As Item %s is present in one or many Active BOMs." % (cstr(field_label), cstr(self.doc.name)))
raise Exception
if ((field_label == 'Allow Production Order'
and self.doc.is_sub_contracted_item != 'Yes')
or (field_label == 'Is Sub Contracted Item'
and self.doc.is_manufactured_item != 'Yes')):
bom = webnotes.conn.sql("select name from `tabBOM` where item = %s and is_active = 1",
(self.doc.name,))
if bom and bom[0][0]:
msgprint("%s should be 'Yes'. As Item %s is present in one or many Active BOMs." % (cstr(field_label), cstr(self.doc.name)))
raise Exception
def validate_barcode(self):
if self.doc.barcode:
duplicate = webnotes.conn.sql("select name from tabItem where barcode = %s and name != %s", (self.doc.barcode, self.doc.name))
if duplicate:
msgprint("Barcode: %s already used in item: %s" % (self.doc.barcode, cstr(duplicate[0][0])), raise_exception = 1)
def validate(self):
if not cint(self.doc.fields.get("__islocal")):
fl = {'is_manufactured_item' :'Allow Bill of Materials',
'is_sub_contracted_item':'Is Sub Contracted Item',
'is_purchase_item' :'Is Purchase Item',
'is_pro_applicable' :'Allow Production Order'}
for d in fl:
if cstr(self.doc.fields.get(d)) != 'Yes':
self.check_for_active_boms(fl[d])
self.check_ref_rate_detail()
self.fill_customer_code()
self.check_item_tax()
self.validate_barcode()
self.check_non_asset_warehouse()
self.cant_change()
if cstr(self.doc.is_manufactured_item) == "No":
self.doc.is_pro_applicable = "No"
if self.doc.is_pro_applicable == 'Yes' and self.doc.is_stock_item == 'No':
msgprint("As Production Order can be made for this Item, then Is Stock Item Should be 'Yes' as we maintain it's stock. Refer Manufacturing and Inventory section.", raise_exception=1)
if self.doc.has_serial_no == 'Yes' and self.doc.is_stock_item == 'No':
msgprint("'Has Serial No' can not be 'Yes' for non-stock item", raise_exception=1)
if self.doc.name:
self.old_page_name = webnotes.conn.get_value('Item', self.doc.name, 'page_name')
def check_non_asset_warehouse(self):
if self.doc.is_asset_item == "Yes":
existing_qty = webnotes.conn.sql("select t1.warehouse, t1.actual_qty from tabBin t1, tabWarehouse t2 where t1.item_code=%s and (t2.warehouse_type!='Fixed Asset' or t2.warehouse_type is null) and t1.warehouse=t2.name and t1.actual_qty > 0", self.doc.name)
for e in existing_qty:
msgprint("%s Units exist in Warehouse %s, which is not an Asset Warehouse." % (e[1],e[0]))
if existing_qty:
msgprint("Please transfer the above quantities to an asset warehouse before changing this item to an asset item.")
self.doc.is_asset_item = 'No'
raise Exception
if self.doc.slideshow:
from website.helpers.slideshow import get_slideshow
get_slideshow(self)
def get_file_details(self, arg = ''):
file = webnotes.conn.sql("select file_group, description from tabFile where name = %s", eval(arg)['file_name'], as_dict = 1)
@@ -215,35 +244,17 @@ class DocType(DocListController):
}
return ret
def on_trash(self):
webnotes.conn.sql("""delete from tabBin where item_code=%s""", self.doc.item_code)
webnotes.conn.sql("""delete from `tabStock Ledger Entry`
where item_code=%s and is_cancelled='Yes' """, self.doc.item_code)
def check_if_sle_exists(self):
sle = webnotes.conn.sql("select name from `tabStock Ledger Entry` where item_code = %s and ifnull(is_cancelled, 'No') = 'No'", self.doc.name)
return sle and 'exists' or 'not exists'
if self.doc.page_name:
from webnotes.webutils import clear_cache
clear_cache(self.doc.page_name)
def on_rename(self,newdn,olddn):
webnotes.conn.sql("update tabItem set item_code = %s where name = %s", (newdn, olddn))
if self.doc.page_name:
from webnotes.webutils import clear_cache
clear_cache(self.doc.page_name)
def prepare_template_args(self):
from website.helpers.product import get_parent_item_groups
self.parent_groups = get_parent_item_groups(self.doc.item_group) + [{"name":self.doc.name}]
self.doc.title = self.doc.item_name
if self.doc.slideshow:
from website.helpers.slideshow import get_slideshow
get_slideshow(self)
def cant_change(self):
if not self.doc.fields.get("__islocal"):
vals = webnotes.conn.get_value("Item", self.doc.name,
["has_serial_no", "is_stock_item", "valuation_method"], as_dict=True)
if vals and ((self.doc.is_stock_item == "No" and vals.is_stock_item == "Yes") or
vals.has_serial_no != self.doc.has_serial_no or
vals.valuation_method != self.doc.valuation_method):
if self.check_if_sle_exists() == "exists":
webnotes.msgprint(_("As there are existing stock transactions for this \
item, you can not change the values of 'Has Serial No', \
'Is Stock Item' and 'Valuation Method'"), raise_exception=1)
clear_cache(self.doc.page_name)

View File

@@ -1,8 +1,8 @@
[
{
"creation": "2013-03-28 10:35:28",
"creation": "2013-03-28 15:56:38",
"docstatus": 0,
"modified": "2013-03-20 15:10:12",
"modified": "2013-04-23 11:44:39",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -34,6 +34,7 @@
"parent": "Item",
"parentfield": "permissions",
"parenttype": "DocType",
"permlevel": 0,
"read": 1,
"submit": 0
},
@@ -47,7 +48,8 @@
"fieldtype": "Section Break",
"label": "Item",
"no_copy": 0,
"oldfieldtype": "Section Break"
"oldfieldtype": "Section Break",
"read_only": 0
},
{
"description": "Item will be saved by this name in the data base.",
@@ -58,6 +60,7 @@
"label": "Item Code",
"oldfieldname": "item_code",
"oldfieldtype": "Data",
"read_only": 0,
"reqd": 1,
"search_index": 0
},
@@ -70,6 +73,7 @@
"label": "Item Name",
"oldfieldname": "item_name",
"oldfieldtype": "Data",
"read_only": 0,
"reqd": 1,
"search_index": 1
},
@@ -83,6 +87,7 @@
"oldfieldname": "item_group",
"oldfieldtype": "Link",
"options": "Item Group",
"read_only": 0,
"reqd": 1
},
{
@@ -94,7 +99,8 @@
"oldfieldname": "stock_uom",
"oldfieldtype": "Link",
"options": "UOM",
"reqd": 0
"read_only": 0,
"reqd": 1
},
{
"doctype": "DocField",
@@ -106,25 +112,29 @@
"oldfieldtype": "Link",
"options": "Brand",
"print_hide": 1,
"read_only": 0,
"reqd": 0
},
{
"doctype": "DocField",
"fieldname": "barcode",
"fieldtype": "Data",
"label": "Barcode"
"label": "Barcode",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "column_break0",
"fieldtype": "Column Break"
"fieldtype": "Column Break",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "image",
"fieldtype": "Select",
"label": "Image",
"options": "attach_files:"
"options": "attach_files:",
"read_only": 0
},
{
"doctype": "DocField",
@@ -132,7 +142,8 @@
"fieldtype": "Image",
"in_list_view": 1,
"label": "Image View",
"options": "image"
"options": "image",
"read_only": 0
},
{
"doctype": "DocField",
@@ -143,6 +154,7 @@
"label": "Description",
"oldfieldname": "description",
"oldfieldtype": "Text",
"read_only": 0,
"reqd": 1,
"search_index": 0
},
@@ -150,21 +162,24 @@
"doctype": "DocField",
"fieldname": "description_html",
"fieldtype": "Small Text",
"label": "Description HTML"
"label": "Description HTML",
"read_only": 0
},
{
"description": "Generates HTML to include selected image in the description",
"doctype": "DocField",
"fieldname": "add_image",
"fieldtype": "Button",
"label": "Generate Description HTML"
"label": "Generate Description HTML",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "inventory",
"fieldtype": "Section Break",
"label": "Inventory",
"oldfieldtype": "Section Break"
"oldfieldtype": "Section Break",
"read_only": 0
},
{
"default": "Yes",
@@ -176,6 +191,7 @@
"oldfieldname": "is_stock_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -187,7 +203,8 @@
"label": "Default Reserved Warehouse",
"oldfieldname": "default_warehouse",
"oldfieldtype": "Link",
"options": "Warehouse"
"options": "Warehouse",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -197,7 +214,8 @@
"fieldtype": "Float",
"label": "Allowance Percent",
"oldfieldname": "tolerance",
"oldfieldtype": "Currency"
"oldfieldtype": "Currency",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -205,7 +223,8 @@
"fieldname": "valuation_method",
"fieldtype": "Select",
"label": "Valuation Method",
"options": "\nFIFO\nMoving Average"
"options": "\nFIFO\nMoving Average",
"read_only": 0
},
{
"default": "0.00",
@@ -217,7 +236,8 @@
"hidden": 0,
"label": "Minimum Order Qty",
"oldfieldname": "min_order_qty",
"oldfieldtype": "Currency"
"oldfieldtype": "Currency",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -225,6 +245,7 @@
"fieldname": "column_break1",
"fieldtype": "Column Break",
"oldfieldtype": "Column Break",
"read_only": 0,
"width": "50%"
},
{
@@ -238,6 +259,7 @@
"oldfieldname": "is_asset_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -250,6 +272,7 @@
"oldfieldname": "has_batch_no",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -264,6 +287,7 @@
"oldfieldname": "has_serial_no",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -273,7 +297,8 @@
"fieldtype": "Data",
"label": "Warranty Period (in days)",
"oldfieldname": "warranty_period",
"oldfieldtype": "Data"
"oldfieldtype": "Data",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -282,7 +307,8 @@
"fieldtype": "Date",
"label": "End of Life",
"oldfieldname": "end_of_life",
"oldfieldtype": "Date"
"oldfieldtype": "Date",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -290,7 +316,8 @@
"doctype": "DocField",
"fieldname": "net_weight",
"fieldtype": "Float",
"label": "Net Weight"
"label": "Net Weight",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -298,14 +325,16 @@
"fieldname": "weight_uom",
"fieldtype": "Link",
"label": "Weight UOM",
"options": "UOM"
"options": "UOM",
"read_only": 0
},
{
"description": "Auto-raise Material Request if quantity goes below re-order level in a warehouse",
"doctype": "DocField",
"fieldname": "reorder_section",
"fieldtype": "Section Break",
"label": "Re-order"
"label": "Re-order",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -314,19 +343,22 @@
"fieldtype": "Float",
"label": "Re-Order Level",
"oldfieldname": "re_order_level",
"oldfieldtype": "Currency"
"oldfieldtype": "Currency",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
"doctype": "DocField",
"fieldname": "re_order_qty",
"fieldtype": "Float",
"label": "Re-Order Qty"
"label": "Re-Order Qty",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "column_break_31",
"fieldtype": "Column Break"
"fieldtype": "Column Break",
"read_only": 0
},
{
"depends_on": "eval:doc.is_stock_item==\"Yes\"",
@@ -334,27 +366,31 @@
"doctype": "DocField",
"fieldname": "email_notify",
"fieldtype": "Check",
"label": "Notify by Email on Re-order"
"label": "Notify by Email on Re-order",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "section_break_31",
"fieldtype": "Section Break",
"options": "Simple"
"options": "Simple",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "item_reorder",
"fieldtype": "Table",
"label": "Warehouse-wise Item Reorder",
"options": "Item Reorder"
"options": "Item Reorder",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "purchase_details",
"fieldtype": "Section Break",
"label": "Purchase Details",
"oldfieldtype": "Section Break"
"oldfieldtype": "Section Break",
"read_only": 0
},
{
"default": "Yes",
@@ -366,6 +402,7 @@
"oldfieldname": "is_purchase_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -377,7 +414,8 @@
"label": "Lead Time Days",
"no_copy": 1,
"oldfieldname": "lead_time_days",
"oldfieldtype": "Int"
"oldfieldtype": "Int",
"read_only": 0
},
{
"depends_on": "eval:doc.is_purchase_item==\"Yes\"",
@@ -388,7 +426,8 @@
"label": "Default Expense Account",
"oldfieldname": "purchase_account",
"oldfieldtype": "Link",
"options": "Account"
"options": "Account",
"read_only": 0
},
{
"depends_on": "eval:doc.is_purchase_item==\"Yes\"",
@@ -399,7 +438,8 @@
"label": "Default Cost Center",
"oldfieldname": "cost_center",
"oldfieldtype": "Link",
"options": "Cost Center"
"options": "Cost Center",
"read_only": 0
},
{
"depends_on": "eval:doc.is_purchase_item==\"Yes\"",
@@ -419,7 +459,8 @@
"fieldtype": "Float",
"label": "Standard Rate",
"oldfieldname": "standard_rate",
"oldfieldtype": "Currency"
"oldfieldtype": "Currency",
"read_only": 0
},
{
"depends_on": "eval:doc.is_purchase_item==\"Yes\"",
@@ -427,6 +468,7 @@
"fieldname": "column_break2",
"fieldtype": "Column Break",
"oldfieldtype": "Column Break",
"read_only": 0,
"width": "50%"
},
{
@@ -438,21 +480,24 @@
"no_copy": 1,
"oldfieldname": "uom_conversion_details",
"oldfieldtype": "Table",
"options": "UOM Conversion Detail"
"options": "UOM Conversion Detail",
"read_only": 0
},
{
"depends_on": "eval:doc.is_purchase_item==\"Yes\"",
"doctype": "DocField",
"fieldname": "manufacturer",
"fieldtype": "Data",
"label": "Manufacturer"
"label": "Manufacturer",
"read_only": 0
},
{
"depends_on": "eval:doc.is_purchase_item==\"Yes\"",
"doctype": "DocField",
"fieldname": "manufacturer_part_no",
"fieldtype": "Data",
"label": "Manufacturer Part Number"
"label": "Manufacturer Part Number",
"read_only": 0
},
{
"depends_on": "eval:doc.is_purchase_item==\"Yes\"",
@@ -460,14 +505,16 @@
"fieldname": "item_supplier_details",
"fieldtype": "Table",
"label": "Item Supplier Details",
"options": "Item Supplier"
"options": "Item Supplier",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "sales_details",
"fieldtype": "Section Break",
"label": "Sales Details",
"oldfieldtype": "Section Break"
"oldfieldtype": "Section Break",
"read_only": 0
},
{
"default": "Yes",
@@ -480,6 +527,7 @@
"oldfieldname": "is_sales_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -494,6 +542,7 @@
"oldfieldname": "is_service_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -507,6 +556,7 @@
"oldfieldname": "is_sample_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -516,7 +566,8 @@
"fieldtype": "Float",
"label": "Max Discount (%)",
"oldfieldname": "max_discount",
"oldfieldtype": "Currency"
"oldfieldtype": "Currency",
"read_only": 0
},
{
"depends_on": "eval:doc.is_sales_item==\"Yes\"",
@@ -524,7 +575,8 @@
"fieldname": "default_income_account",
"fieldtype": "Link",
"label": "Default Income Account",
"options": "Account"
"options": "Account",
"read_only": 0
},
{
"depends_on": "eval:doc.is_sales_item==\"Yes\"",
@@ -532,7 +584,8 @@
"fieldname": "default_sales_cost_center",
"fieldtype": "Link",
"label": "Cost Center",
"options": "Cost Center"
"options": "Cost Center",
"read_only": 0
},
{
"depends_on": "eval:doc.is_sales_item==\"Yes\"",
@@ -542,7 +595,8 @@
"hidden": 1,
"label": "Sales Rate",
"oldfieldname": "sales_rate",
"oldfieldtype": "Currency"
"oldfieldtype": "Currency",
"read_only": 0
},
{
"depends_on": "eval:doc.is_sales_item==\"Yes\"",
@@ -550,6 +604,7 @@
"fieldname": "column_break3",
"fieldtype": "Column Break",
"oldfieldtype": "Column Break",
"read_only": 0,
"width": "50%"
},
{
@@ -559,14 +614,16 @@
"fieldname": "item_customer_details",
"fieldtype": "Table",
"label": "Customer Codes",
"options": "Item Customer Detail"
"options": "Item Customer Detail",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "item_tax_section_break",
"fieldtype": "Section Break",
"label": "Item Tax",
"oldfieldtype": "Section Break"
"oldfieldtype": "Section Break",
"read_only": 0
},
{
"doctype": "DocField",
@@ -575,13 +632,15 @@
"label": "Item Tax1",
"oldfieldname": "item_tax",
"oldfieldtype": "Table",
"options": "Item Tax"
"options": "Item Tax",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "price_list_section",
"fieldtype": "Section Break",
"label": "Price Lists and Rates"
"label": "Price Lists and Rates",
"read_only": 0
},
{
"description": "Create a price list from Price List master and enter standard ref rates against each of them. On selection of a price list in Quotation, Sales Order or Delivery Note, corresponding ref rate will be fetched for this item.",
@@ -591,14 +650,16 @@
"label": "Item Prices",
"oldfieldname": "ref_rate_details",
"oldfieldtype": "Table",
"options": "Item Price"
"options": "Item Price",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "inspection_criteria",
"fieldtype": "Section Break",
"label": "Inspection Criteria",
"oldfieldtype": "Section Break"
"oldfieldtype": "Section Break",
"read_only": 0
},
{
"default": "No",
@@ -610,6 +671,7 @@
"oldfieldname": "inspection_required",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -621,14 +683,16 @@
"label": "Item Quality Inspection Parameter",
"oldfieldname": "item_specification_details",
"oldfieldtype": "Table",
"options": "Item Quality Inspection Parameter"
"options": "Item Quality Inspection Parameter",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "manufacturing",
"fieldtype": "Section Break",
"label": "Manufacturing",
"oldfieldtype": "Section Break"
"oldfieldtype": "Section Break",
"read_only": 0
},
{
"default": "No",
@@ -640,6 +704,7 @@
"oldfieldname": "is_manufactured_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -665,6 +730,7 @@
"oldfieldname": "is_pro_applicable",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -677,6 +743,7 @@
"oldfieldname": "is_sub_contracted_item",
"oldfieldtype": "Select",
"options": "\nYes\nNo",
"read_only": 0,
"reqd": 1
},
{
@@ -687,19 +754,22 @@
"in_filter": 1,
"label": "Customer Code",
"no_copy": 1,
"print_hide": 1
"print_hide": 1,
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "website_section",
"fieldtype": "Section Break",
"label": "Website"
"label": "Website",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "show_in_website",
"fieldtype": "Check",
"label": "Show in Website"
"label": "Show in Website",
"read_only": 0
},
{
"depends_on": "show_in_website",
@@ -717,6 +787,7 @@
"fieldname": "weightage",
"fieldtype": "Int",
"label": "Weightage",
"read_only": 0,
"search_index": 1
},
{
@@ -726,7 +797,8 @@
"fieldname": "slideshow",
"fieldtype": "Link",
"label": "Slideshow",
"options": "Website Slideshow"
"options": "Website Slideshow",
"read_only": 0
},
{
"depends_on": "show_in_website",
@@ -735,12 +807,14 @@
"fieldname": "website_image",
"fieldtype": "Select",
"label": "Image",
"options": "attach_files:"
"options": "attach_files:",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "cb72",
"fieldtype": "Column Break"
"fieldtype": "Column Break",
"read_only": 0
},
{
"depends_on": "show_in_website",
@@ -749,7 +823,8 @@
"fieldname": "website_price_list",
"fieldtype": "Link",
"label": "Website Price List",
"options": "Price List"
"options": "Price List",
"read_only": 0
},
{
"depends_on": "show_in_website",
@@ -758,7 +833,8 @@
"fieldname": "website_warehouse",
"fieldtype": "Link",
"label": "Website Warehouse",
"options": "Warehouse"
"options": "Warehouse",
"read_only": 0
},
{
"depends_on": "show_in_website",
@@ -767,19 +843,22 @@
"fieldname": "website_item_groups",
"fieldtype": "Table",
"label": "Website Item Groups",
"options": "Website Item Group"
"options": "Website Item Group",
"read_only": 0
},
{
"depends_on": "show_in_website",
"doctype": "DocField",
"fieldname": "sb72",
"fieldtype": "Section Break"
"fieldtype": "Section Break",
"read_only": 0
},
{
"doctype": "DocField",
"fieldname": "copy_from_item_group",
"fieldtype": "Button",
"label": "Copy From Item Group"
"label": "Copy From Item Group",
"read_only": 0
},
{
"depends_on": "show_in_website",
@@ -787,85 +866,39 @@
"fieldname": "item_website_specifications",
"fieldtype": "Table",
"label": "Item Website Specifications",
"options": "Item Website Specification"
"options": "Item Website Specification",
"read_only": 0
},
{
"depends_on": "show_in_website",
"doctype": "DocField",
"fieldname": "web_long_description",
"fieldtype": "Text Editor",
"label": "Website Description"
},
{
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
"permlevel": 1,
"report": 0,
"role": "Material Manager",
"write": 0
},
{
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
"permlevel": 0,
"report": 1,
"role": "Material Manager",
"write": 0
},
{
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
"permlevel": 1,
"report": 0,
"role": "Material User",
"write": 0
},
{
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
"permlevel": 0,
"report": 1,
"role": "Material User",
"write": 0
"label": "Website Description",
"read_only": 0
},
{
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
"permlevel": 0,
"report": 1,
"role": "Material Master Manager",
"write": 1
"write": 1,
"report": 1
},
{
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
"permlevel": 1,
"report": 0,
"role": "Material Master Manager",
"write": 0
},
{
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
"permlevel": 0,
"report": 1,
"role": "System Manager",
"write": 1
"role": "Material Manager",
"write": 0,
"report": 1
},
{
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
"permlevel": 1,
"report": 0,
"role": "System Manager",
"write": 0
"role": "Material User",
"write": 0,
"report": 1
}
]