mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-02 11:49:10 +00:00
Warehouse merging feature and update_bin cleanup
This commit is contained in:
@@ -23,47 +23,45 @@ from webnotes.model import db_exists
|
||||
from webnotes.model.doc import Document, addchild, getchildren, make_autoname
|
||||
from webnotes.model.doclist import getlist, copy_doclist
|
||||
from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
|
||||
from webnotes import session, form, msgprint, errprint
|
||||
|
||||
|
||||
set = webnotes.conn.set
|
||||
from webnotes import msgprint, errprint
|
||||
sql = webnotes.conn.sql
|
||||
get_value = webnotes.conn.get_value
|
||||
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class DocType:
|
||||
def __init__(self, doc, doclist=[]):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
|
||||
def update_stock(self, actual_qty=0, reserved_qty=0, ordered_qty=0, indented_qty=0, \
|
||||
planned_qty=0, dt=None, sle_id='', posting_time='', serial_no = '', \
|
||||
is_cancelled = 'No',doc_type='',doc_name='',is_amended='No'):
|
||||
if not dt:
|
||||
dt = nowdate()
|
||||
|
||||
# update the stock values (for current quantities)
|
||||
self.doc.actual_qty = flt(self.doc.actual_qty) + flt(actual_qty)
|
||||
self.doc.ordered_qty = flt(self.doc.ordered_qty) + flt(ordered_qty)
|
||||
self.doc.reserved_qty = flt(self.doc.reserved_qty) + flt(reserved_qty)
|
||||
self.doc.indented_qty = flt(self.doc.indented_qty) + flt(indented_qty)
|
||||
self.doc.planned_qty = flt(self.doc.planned_qty) + flt(planned_qty)
|
||||
self.doc.projected_qty = flt(self.doc.actual_qty) + flt(self.doc.ordered_qty) + flt(self.doc.indented_qty) + flt(self.doc.planned_qty) - flt(self.doc.reserved_qty)
|
||||
self.doc.save()
|
||||
if(( flt(actual_qty)<0 or flt(reserved_qty)>0 ) and is_cancelled == 'No' and is_amended=='No'):
|
||||
self.reorder_item(doc_type,doc_name)
|
||||
|
||||
if actual_qty:
|
||||
def update_stock(self, args):
|
||||
if not args.get("posting_date"):
|
||||
posting_date = nowdate()
|
||||
|
||||
self.update_qty(args)
|
||||
|
||||
if (flt(args.get("actual_qty")) < 0 or flt(args.get("reserved_qty")) > 0) \
|
||||
and args.get("is_cancelled") == 'No' and args.get("is_amended")=='No':
|
||||
self.reorder_item(args.get("doc_type"), args.get("doc_name"))
|
||||
|
||||
if args.get("actual_qty"):
|
||||
# check actual qty with total number of serial no
|
||||
if serial_no:
|
||||
if args.get("serial_no"):
|
||||
self.check_qty_with_serial_no()
|
||||
|
||||
# update valuation and qty after transaction for post dated entry
|
||||
self.update_entries_after(dt, posting_time)
|
||||
self.update_entries_after(args.get("posting_date"), args.get("posting_time"))
|
||||
|
||||
def update_qty(self, args):
|
||||
# update the stock values (for current quantities)
|
||||
self.doc.actual_qty = flt(self.doc.actual_qty) + flt(args.get("actual_qty", 0))
|
||||
self.doc.ordered_qty = flt(self.doc.ordered_qty) + flt(args.get("ordered_qty", 0))
|
||||
self.doc.reserved_qty = flt(self.doc.reserved_qty) + flt(args.get("reserved_qty"))
|
||||
self.doc.indented_qty = flt(self.doc.indented_qty) + flt(args.get("indented_qty"))
|
||||
self.doc.planned_qty = flt(self.doc.planned_qty) + flt(args.get("planned_qty"))
|
||||
|
||||
self.doc.projected_qty = flt(self.doc.actual_qty) + flt(self.doc.ordered_qty) + \
|
||||
flt(self.doc.indented_qty) + flt(self.doc.planned_qty) - flt(self.doc.reserved_qty)
|
||||
|
||||
self.doc.save()
|
||||
|
||||
def check_qty_with_serial_no(self):
|
||||
"""
|
||||
@@ -327,7 +325,7 @@ class DocType:
|
||||
def reorder_item(self,doc_type,doc_name):
|
||||
""" Reorder item if stock reaches reorder level"""
|
||||
|
||||
if get_value('Global Defaults', None, 'auto_indent'):
|
||||
if webnotes.conn.get_value('Global Defaults', None, 'auto_indent'):
|
||||
#check if re-order is required
|
||||
ret = sql("""select re_order_level, item_name, description, brand, item_group,
|
||||
lead_time_days, min_order_qty, email_notify, re_order_qty
|
||||
@@ -371,7 +369,7 @@ class DocType:
|
||||
indent_details_child.save()
|
||||
indent_obj = get_obj('Purchase Request',indent.name,with_children=1)
|
||||
indent_obj.validate()
|
||||
set(indent_obj.doc,'docstatus',1)
|
||||
webnotes.conn.set(indent_obj.doc,'docstatus',1)
|
||||
indent_obj.on_submit()
|
||||
msgprint("""Item: %s is to be re-ordered. Purchase Request %s raised.
|
||||
It was generated from %s %s""" %
|
||||
|
||||
@@ -244,7 +244,7 @@ class DocType(TransactionBase):
|
||||
|
||||
def on_submit(self):
|
||||
self.validate_packed_qty()
|
||||
set(self.doc, 'message', 'Items against your Order #%s have been delivered. Delivery #%s: ' % (self.doc.po_no, self.doc.name))
|
||||
|
||||
# Check for Approving Authority
|
||||
get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self)
|
||||
|
||||
@@ -342,16 +342,22 @@ class DocType(TransactionBase):
|
||||
def update_stock_ledger(self, update_stock, is_stopped = 0):
|
||||
self.values = []
|
||||
for d in self.get_item_list(is_stopped):
|
||||
stock_item = sql("SELECT is_stock_item, is_sample_item FROM tabItem where name = '%s'"%(d['item_code']), as_dict = 1) # stock ledger will be updated only if it is a stock item
|
||||
if stock_item[0]['is_stock_item'] == "Yes":
|
||||
if webnotes.conn.get_value("Item", d['item_code'], "is_stock_item") == "Yes":
|
||||
if not d['warehouse']:
|
||||
msgprint("Message: Please enter Warehouse for item %s as it is stock item."% d['item_code'])
|
||||
raise Exception
|
||||
msgprint("Please enter Warehouse for item %s as it is stock item"
|
||||
% d['item_code'], raise_exception=1)
|
||||
|
||||
if d['reserved_qty'] < 0 :
|
||||
# Reduce reserved qty from reserved warehouse mentioned in so
|
||||
bin = get_obj('Warehouse', d['reserved_warehouse']).update_bin(0, flt(update_stock) * flt(d['reserved_qty']), \
|
||||
0, 0, 0, d['item_code'], self.doc.transaction_date,doc_type=self.doc.doctype, \
|
||||
doc_name=self.doc.name, is_amended = (self.doc.amended_from and 'Yes' or 'No'))
|
||||
args = {
|
||||
"item_code": d['item_code'],
|
||||
"doc_type": self.doc.doctype,
|
||||
"doc_name": self.doc.name,
|
||||
"reserved_qty": flt(update_stock) * flt(d['reserved_qty']),
|
||||
"posting_date": self.doc.posting_date,
|
||||
"is_amended": self.doc.amended_from and 'Yes' or 'No'
|
||||
}
|
||||
get_obj("Warehouse", d["reserved_warehouse"]).update_bin(args)
|
||||
|
||||
# Reduce actual qty from warehouse
|
||||
self.make_sl_entry(d, d['warehouse'], - flt(d['qty']) , 0, update_stock)
|
||||
@@ -383,15 +389,6 @@ class DocType(TransactionBase):
|
||||
})
|
||||
|
||||
|
||||
def send_sms(self):
|
||||
if not self.doc.customer_mobile_no:
|
||||
msgprint("Please enter customer mobile no")
|
||||
elif not self.doc.message:
|
||||
msgprint("Please enter the message you want to send")
|
||||
else:
|
||||
msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.customer_mobile_no,], self.doc.message))
|
||||
|
||||
|
||||
def credit_limit(self):
|
||||
"""check credit limit of items in DN Detail which are not fetched from sales order"""
|
||||
amount, total = 0, 0
|
||||
@@ -407,5 +404,4 @@ class DocType(TransactionBase):
|
||||
self.doclist = get_obj('Sales Common').make_packing_list(self,'delivery_note_details')
|
||||
sl = get_obj('Stock Ledger')
|
||||
sl.scrub_serial_nos(self)
|
||||
sl.scrub_serial_nos(self, 'packing_details')
|
||||
|
||||
sl.scrub_serial_nos(self, 'packing_details')
|
||||
@@ -3,11 +3,11 @@
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2012-07-03 13:30:46',
|
||||
'docstatus': 0,
|
||||
'modified': '2012-07-11 09:57:42',
|
||||
'modified_by': u'Administrator',
|
||||
'owner': u'Administrator'
|
||||
u'creation': '2012-07-12 22:19:45',
|
||||
u'docstatus': 0,
|
||||
u'modified': '2012-10-23 11:02:09',
|
||||
u'modified_by': u'Administrator',
|
||||
u'owner': u'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
@@ -18,11 +18,11 @@
|
||||
'autoname': u'field:item_code',
|
||||
'colour': u'White:FFF',
|
||||
'default_print_format': u'Standard',
|
||||
'doctype': 'DocType',
|
||||
u'doctype': u'DocType',
|
||||
'document_type': u'Master',
|
||||
'max_attachments': 1,
|
||||
'module': u'Stock',
|
||||
'name': '__common__',
|
||||
u'name': u'__common__',
|
||||
'search_fields': u'item_name,description,item_group,customer_code',
|
||||
'section_style': u'Tray',
|
||||
'server_code_error': u' ',
|
||||
@@ -34,8 +34,8 @@
|
||||
|
||||
# These values are common for all DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'name': '__common__',
|
||||
u'doctype': u'DocField',
|
||||
u'name': u'__common__',
|
||||
'parent': u'Item',
|
||||
'parentfield': u'fields',
|
||||
'parenttype': u'DocType'
|
||||
@@ -43,8 +43,8 @@
|
||||
|
||||
# These values are common for all DocPerm
|
||||
{
|
||||
'doctype': u'DocPerm',
|
||||
'name': '__common__',
|
||||
u'doctype': u'DocPerm',
|
||||
u'name': u'__common__',
|
||||
'parent': u'Item',
|
||||
'parentfield': u'permissions',
|
||||
'parenttype': u'DocType',
|
||||
@@ -53,97 +53,13 @@
|
||||
|
||||
# DocType, Item
|
||||
{
|
||||
'doctype': 'DocType',
|
||||
'name': u'Item'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'System Manager',
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material Master Manager',
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Master Manager',
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'System Manager'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
u'doctype': u'DocType',
|
||||
u'name': u'Item'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Item',
|
||||
@@ -154,7 +70,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'trash_reason',
|
||||
'fieldtype': u'Small Text',
|
||||
'label': u'Trash Reason',
|
||||
@@ -167,7 +83,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Item will be saved by this name in the data base.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_code',
|
||||
'fieldtype': u'Data',
|
||||
'in_filter': 0,
|
||||
@@ -181,7 +97,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_name',
|
||||
'fieldtype': u'Data',
|
||||
'in_filter': 1,
|
||||
@@ -197,7 +113,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'<a href="#!Sales Browser/Item Group">Manage Item Groups</a>',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_group',
|
||||
'fieldtype': u'Link',
|
||||
'in_filter': 1,
|
||||
@@ -211,7 +127,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'brand',
|
||||
'fieldtype': u'Link',
|
||||
'hidden': 0,
|
||||
@@ -226,7 +142,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'barcode',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Barcode',
|
||||
@@ -235,7 +151,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'column_break0',
|
||||
'fieldtype': u'Column Break',
|
||||
'permlevel': 0
|
||||
@@ -243,7 +159,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'description',
|
||||
'fieldtype': u'Text',
|
||||
'in_filter': 0,
|
||||
@@ -258,7 +174,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'description_html',
|
||||
'fieldtype': u'Text',
|
||||
'label': u'Description HTML',
|
||||
@@ -269,7 +185,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Generates HTML to include image (1st attachment) in the description',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'add_image',
|
||||
'fieldtype': u'Button',
|
||||
'label': u'Add Image',
|
||||
@@ -278,7 +194,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'inventory',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Inventory',
|
||||
@@ -290,7 +206,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Enter unit of measurement in which stock of this item is maintained in your warehouse.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'stock_uom',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Default UoM',
|
||||
@@ -306,7 +222,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'Yes',
|
||||
'description': u'Select "Yes" if you are maintaining stock of this item in your Inventory.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_stock_item',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Is Stock Item',
|
||||
@@ -319,19 +235,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'valuation_method',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Valuation Method',
|
||||
'oldfieldname': u'valuation_method',
|
||||
'oldfieldtype': u'Select',
|
||||
'options': u'\nFIFO\nMoving Average',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'default_warehouse',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Default Warehouse',
|
||||
@@ -345,7 +249,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Percentage variation in quantity to be allowed while receiving or delivering this item.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'tolerance',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Allowance Percent',
|
||||
@@ -358,7 +262,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'The system will generate auto indent when stock reaches re-order level.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u're_order_level',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Re-Order Level',
|
||||
@@ -371,7 +275,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'The system will create auto indent of re-order quantity when stock reaches re-order level',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u're_order_qty',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Re-Order Qty',
|
||||
@@ -380,7 +284,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'email_notify',
|
||||
'fieldtype': u'Check',
|
||||
'label': u'Send Email Notification when stock reaches re-order level',
|
||||
@@ -392,7 +296,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'0.00',
|
||||
'description': u'You can enter the minimum quantity of this item to be ordered.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'min_order_qty',
|
||||
'fieldtype': u'Currency',
|
||||
'hidden': 0,
|
||||
@@ -404,7 +308,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'column_break1',
|
||||
'fieldtype': u'Column Break',
|
||||
'oldfieldtype': u'Column Break',
|
||||
@@ -417,7 +321,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'description': u'Select "Yes" if this item is used for some internal purpose in your company.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_asset_item',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Is Asset Item',
|
||||
@@ -432,7 +336,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'has_batch_no',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Has Batch No',
|
||||
@@ -448,7 +352,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'description': u'Selecting "Yes" will give a unique identity to each entity of this item which can be viewed in the Serial No master.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'has_serial_no',
|
||||
'fieldtype': u'Select',
|
||||
'in_filter': 1,
|
||||
@@ -462,7 +366,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'warranty_period',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Warranty Period (in days)',
|
||||
@@ -473,7 +377,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'end_of_life',
|
||||
'fieldtype': u'Date',
|
||||
'label': u'End of Life',
|
||||
@@ -485,7 +389,7 @@
|
||||
# DocField
|
||||
{
|
||||
'description': u'Net Weight of each Item',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'net_weight',
|
||||
'fieldtype': u'Float',
|
||||
'label': u'Net Weight',
|
||||
@@ -494,7 +398,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'weight_uom',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Weight UOM',
|
||||
@@ -505,7 +409,7 @@
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'purchase_details',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Purchase Details',
|
||||
@@ -518,7 +422,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'Yes',
|
||||
'description': u'Selecting "Yes" will allow this item to appear in Purchase Order , Purchase Receipt.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_purchase_item',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Is Purchase Item',
|
||||
@@ -533,7 +437,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Lead Time days is number of days by which this item is expected in your warehouse. This days is fetched in Purchase Request when you select this item.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'lead_time_days',
|
||||
'fieldtype': u'Int',
|
||||
'label': u'Lead Time Days',
|
||||
@@ -547,7 +451,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Default Purchase Account in which cost of the item will be debited.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'purchase_account',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Default Expense Account',
|
||||
@@ -562,7 +466,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Default Cost Center for tracking expense for this item.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'cost_center',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Default Cost Center',
|
||||
@@ -576,7 +480,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'Buying Cost will be updated from Purchase Orders and Purchase Receipts. <br>The buying cost will calculated by moving average method.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'buying_cost',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Buying Cost',
|
||||
@@ -589,7 +493,7 @@
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'last_purchase_rate',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Last Purchase Rate',
|
||||
@@ -601,7 +505,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'standard_rate',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Standard Rate',
|
||||
@@ -612,7 +516,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'column_break2',
|
||||
'fieldtype': u'Column Break',
|
||||
'oldfieldtype': u'Column Break',
|
||||
@@ -622,7 +526,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'uom_conversion_details',
|
||||
'fieldtype': u'Table',
|
||||
'label': u'UOM Conversion Details',
|
||||
@@ -634,7 +538,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'manufacturer',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Manufacturer',
|
||||
@@ -643,7 +547,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'manufacturer_part_no',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Manufacturer Part Number',
|
||||
@@ -652,7 +556,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_supplier_details',
|
||||
'fieldtype': u'Table',
|
||||
'label': u'Item Supplier Details',
|
||||
@@ -662,7 +566,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'sales_details',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Sales Details',
|
||||
@@ -675,7 +579,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'Yes',
|
||||
'description': u'Selecting "Yes" will allow this item to figure in Sales Order, Delivery Note',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_sales_item',
|
||||
'fieldtype': u'Select',
|
||||
'in_filter': 1,
|
||||
@@ -692,7 +596,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'description': u'Select "Yes" if this item represents some work like training, designing, consulting etc.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_service_item',
|
||||
'fieldtype': u'Select',
|
||||
'in_filter': 1,
|
||||
@@ -709,7 +613,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'description': u'Select "Yes" if this item is to be sent to a customer or received from a supplier as a sample. Delivery notes and Purchase Receipts will update stock levels but there will be no invoice against this item.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_sample_item',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Allow Samples',
|
||||
@@ -722,7 +626,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'max_discount',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Max Discount (%)',
|
||||
@@ -733,7 +637,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'default_income_account',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Default Income Account',
|
||||
@@ -743,7 +647,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'default_sales_cost_center',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Cost Center',
|
||||
@@ -753,7 +657,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'sales_rate',
|
||||
'fieldtype': u'Currency',
|
||||
'hidden': 1,
|
||||
@@ -765,7 +669,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'column_break3',
|
||||
'fieldtype': u'Column Break',
|
||||
'oldfieldtype': u'Column Break',
|
||||
@@ -777,7 +681,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'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.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'ref_rate_details',
|
||||
'fieldtype': u'Table',
|
||||
'label': u'Item Prices',
|
||||
@@ -790,7 +694,7 @@
|
||||
# DocField
|
||||
{
|
||||
'description': u'For the convenience of customers, these codes can be used in print formats like Invoices and Delivery Notes',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_customer_details',
|
||||
'fieldtype': u'Table',
|
||||
'label': u'Customer Codes',
|
||||
@@ -800,7 +704,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_tax_section_break',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Item Tax',
|
||||
@@ -810,7 +714,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_tax',
|
||||
'fieldtype': u'Table',
|
||||
'label': u'Item Tax1',
|
||||
@@ -822,7 +726,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'inspection_criteria',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Inspection Criteria',
|
||||
@@ -833,7 +737,7 @@
|
||||
# DocField
|
||||
{
|
||||
'default': u'No',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'inspection_required',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Inspection Required',
|
||||
@@ -847,7 +751,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'item_specification_details',
|
||||
'fieldtype': u'Table',
|
||||
'label': u'Item Quality Inspection Parameter',
|
||||
@@ -859,7 +763,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'manufacturing',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Manufacturing',
|
||||
@@ -872,7 +776,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'description': u'Selecting "Yes" will allow you to create Bill of Material showing raw material and operational costs incurred to manufacture this item.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_manufactured_item',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Allow Bill of Materials',
|
||||
@@ -886,7 +790,7 @@
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'default_bom',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Default BOM',
|
||||
@@ -902,7 +806,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'description': u'Selecting "Yes" will allow you to make a Production Order for this item.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_pro_applicable',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Allow Production Order',
|
||||
@@ -918,7 +822,7 @@
|
||||
'colour': u'White:FFF',
|
||||
'default': u'No',
|
||||
'description': u'Select "Yes" if you supply raw materials to your supplier to manufacture this item.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'is_sub_contracted_item',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Is Sub Contracted Item',
|
||||
@@ -931,7 +835,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'file_list',
|
||||
'fieldtype': u'Text',
|
||||
'hidden': 1,
|
||||
@@ -943,7 +847,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'customer_code',
|
||||
'fieldtype': u'Data',
|
||||
'hidden': 1,
|
||||
@@ -956,7 +860,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'website_section',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Website',
|
||||
@@ -965,7 +869,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'show_in_website',
|
||||
'fieldtype': u'Check',
|
||||
'label': u'Show in Website',
|
||||
@@ -976,7 +880,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'website page link',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'page_name',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Page Name',
|
||||
@@ -985,7 +889,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'website_image',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Image',
|
||||
@@ -995,7 +899,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'web_short_description',
|
||||
'fieldtype': u'Text',
|
||||
'label': u'Short Description',
|
||||
@@ -1004,11 +908,95 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'web_long_description',
|
||||
'fieldtype': u'Code',
|
||||
'label': u'Long Description',
|
||||
'options': u'Markdown',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'System Manager',
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material Master Manager',
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Master Manager',
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'System Manager'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
}
|
||||
]
|
||||
@@ -218,16 +218,17 @@ class DocType(TransactionBase):
|
||||
pc_obj = get_obj('Purchase Common')
|
||||
self.values = []
|
||||
for d in getlist(self.doclist, 'purchase_receipt_details'):
|
||||
# Check if is_stock_item == 'Yes'
|
||||
if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes':
|
||||
if webnotes.conn.get_value("Item", d.item_code, "is_stock_item") == "Yes":
|
||||
ord_qty = 0
|
||||
pr_qty = flt(d.qty) * flt(d.conversion_factor)
|
||||
|
||||
# Check If Prevdoc Doctype is Purchase Order
|
||||
if cstr(d.prevdoc_doctype) == 'Purchase Order':
|
||||
# get qty and pending_qty of prevdoc
|
||||
curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'Purchase Order Item', 'Purchase Order - Purchase Receipt', self.doc.name)
|
||||
max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0
|
||||
curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname',
|
||||
d.prevdoc_detail_docname, 'Purchase Order Item',
|
||||
'Purchase Order - Purchase Receipt', self.doc.name)
|
||||
max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), \
|
||||
flt(curr_ref_qty.split('~~~')[0]), 0
|
||||
|
||||
if flt(qty) + flt(pr_qty) > flt(max_qty):
|
||||
curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor)
|
||||
@@ -235,11 +236,18 @@ class DocType(TransactionBase):
|
||||
curr_qty = flt(pr_qty)
|
||||
|
||||
ord_qty = -flt(curr_qty)
|
||||
# update order qty in bin
|
||||
bin = get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(ord_qty), 0, 0, d.item_code, self.doc.posting_date)
|
||||
|
||||
# update ordered qty in bin
|
||||
args = {
|
||||
"item_code": d.item_code,
|
||||
"posting_date": self.doc.posting_date,
|
||||
"ordered_qty": (is_submit and 1 or -1) * flt(ord_qty)
|
||||
}
|
||||
get_obj("Warehouse", d.warehouse).update_bin(args)
|
||||
|
||||
# UPDATE actual qty to warehouse by pr_qty
|
||||
self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit)
|
||||
|
||||
# UPDATE actual to rejected warehouse by rejected qty
|
||||
if flt(d.rejected_qty) > 0:
|
||||
self.make_sl_entry(d, self.doc.rejected_warehouse, flt(d.rejected_qty) * flt(d.conversion_factor), d.valuation_rate, is_submit, rejected = 1)
|
||||
|
||||
@@ -73,8 +73,10 @@ class DocType(TransactionBase):
|
||||
self.validate_item()
|
||||
|
||||
def on_update(self):
|
||||
if self.doc.warehouse and self.doc.status == 'In Store' and cint(self.doc.sle_exists) == 0 and \
|
||||
not sql("select name from `tabStock Ledger Entry` where serial_no = %s and ifnull(is_cancelled, 'No') = 'No'", self.doc.name):
|
||||
if self.doc.warehouse and self.doc.status == 'In Store' \
|
||||
and cint(self.doc.sle_exists) == 0 and \
|
||||
not sql("""select name from `tabStock Ledger Entry` where serial_no = %s and
|
||||
ifnull(is_cancelled, 'No') = 'No'""", self.doc.name):
|
||||
self.make_stock_ledger_entry(1)
|
||||
webnotes.conn.set(self.doc, 'sle_exists', 1)
|
||||
|
||||
|
||||
@@ -440,18 +440,30 @@ class DocType(TransactionBase):
|
||||
if self.doc.production_order:
|
||||
pro_obj = get_obj("Production Order", self.doc.production_order)
|
||||
if flt(pro_obj.doc.docstatus) != 1:
|
||||
msgprint("You cannot do any transaction against Production Order : %s, as it's not submitted" % (pro_obj.doc.name))
|
||||
raise Exception
|
||||
msgprint("""You cannot do any transaction against
|
||||
Production Order : %s, as it's not submitted"""
|
||||
% (pro_obj.doc.name), raise_exception=1)
|
||||
|
||||
if pro_obj.doc.status == 'Stopped':
|
||||
msgprint("You cannot do any transaction against Production Order : %s, as it's status is 'Stopped'" % (pro_obj.doc.name))
|
||||
raise Exception
|
||||
msgprint("""You cannot do any transaction against Production Order : %s,
|
||||
as it's status is 'Stopped'"""% (pro_obj.doc.name), raise_exception=1)
|
||||
|
||||
if getdate(pro_obj.doc.posting_date) > getdate(self.doc.posting_date):
|
||||
msgprint("Posting Date of Stock Entry cannot be before Posting Date of Production Order "+ cstr(self.doc.production_order))
|
||||
raise Exception
|
||||
msgprint("""Posting Date of Stock Entry cannot be before Posting Date of
|
||||
Production Order: %s"""% cstr(self.doc.production_order), raise_exception=1)
|
||||
|
||||
if self.doc.process == 'Backflush':
|
||||
pro_obj.doc.produced_qty = flt(pro_obj.doc.produced_qty) + (is_submit and 1 or -1 ) * flt(self.doc.fg_completed_qty)
|
||||
get_obj('Warehouse', pro_obj.doc.fg_warehouse).update_bin(0, 0, 0, 0, (is_submit and 1 or -1 ) * flt(self.doc.fg_completed_qty), pro_obj.doc.production_item, now())
|
||||
pro_obj.doc.status = (flt(pro_obj.doc.qty) == flt(pro_obj.doc.produced_qty)) and 'Completed' or 'In Process'
|
||||
pro_obj.doc.produced_qty = flt(pro_obj.doc.produced_qty) + \
|
||||
(is_submit and 1 or -1 ) * flt(self.doc.fg_completed_qty)
|
||||
args = {
|
||||
"item_code": pro_obj.doc.production_item,
|
||||
"posting_date": self.doc.posting_date,
|
||||
"planned_qty": (is_submit and -1 or 1 ) * flt(self.doc.fg_completed_qty)
|
||||
}
|
||||
get_obj('Warehouse', pro_obj.doc.fg_warehouse).update_bin(args)
|
||||
|
||||
pro_obj.doc.status = (flt(pro_obj.doc.qty)==flt(pro_obj.doc.produced_qty)) \
|
||||
and 'Completed' or 'In Process'
|
||||
pro_obj.doc.save()
|
||||
|
||||
|
||||
|
||||
@@ -230,8 +230,12 @@ class DocType:
|
||||
if v["actual_qty"]:
|
||||
sle_id = self.make_entry(v)
|
||||
|
||||
get_obj('Warehouse', v["warehouse"]).update_bin(flt(v["actual_qty"]), 0, 0, 0, 0, v["item_code"], \
|
||||
v["posting_date"], sle_id, v["posting_time"], '', v["is_cancelled"],v["voucher_type"],v["voucher_no"], is_amended)
|
||||
args = v.copy()
|
||||
args.update({
|
||||
"sle_id": sle_id,
|
||||
"is_amended": is_amended
|
||||
})
|
||||
get_obj('Warehouse', v["warehouse"]).update_bin(args)
|
||||
|
||||
|
||||
def make_entry(self, args):
|
||||
|
||||
@@ -16,4 +16,16 @@
|
||||
|
||||
cur_frm.cscript.refresh = function(doc) {
|
||||
cur_frm.toggle_display('warehouse_name', doc.__islocal);
|
||||
}
|
||||
|
||||
cur_frm.cscript.merge = function(doc, cdt, cdn) {
|
||||
if (!doc.merge_with) {
|
||||
msgprint("Please enter the warehouse to which you want to merge?");
|
||||
return;
|
||||
}
|
||||
var check = confirm("Are you sure you want to merge this warehouse into "
|
||||
+ doc.merge_with + "?");
|
||||
if (check) {
|
||||
$c_obj(make_doclist(cdt, cdn), 'merge_warehouses', '', '');
|
||||
}
|
||||
}
|
||||
@@ -18,106 +18,186 @@
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
|
||||
from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
|
||||
from webnotes.model import db_exists
|
||||
from webnotes.model.doc import Document, addchild, getchildren, make_autoname
|
||||
from webnotes.model.doclist import getlist, copy_doclist
|
||||
from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
|
||||
from webnotes import session, form, msgprint, errprint
|
||||
from webnotes.utils import add_days, add_months, add_years, cint, cstr, flt, get_defaults, getdate, has_common, month_name, now, nowdate, set_default, validate_email_add
|
||||
from webnotes.model.doc import Document, addchild, getchildren
|
||||
from webnotes.model.doclist import getlist
|
||||
from webnotes.model.code import get_obj
|
||||
from webnotes import msgprint, errprint
|
||||
|
||||
set = webnotes.conn.set
|
||||
sql = webnotes.conn.sql
|
||||
get_value = webnotes.conn.get_value
|
||||
in_transaction = webnotes.conn.in_transaction
|
||||
convert_to_lists = webnotes.conn.convert_to_lists
|
||||
|
||||
# -----------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class DocType:
|
||||
def __init__(self, doc, doclist=[]):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
|
||||
def get_bin(self, item_code):
|
||||
def get_bin(self, item_code, warehouse=None):
|
||||
warehouse = warehouse or self.doc.name
|
||||
bin = sql("select name from tabBin where item_code = %s and \
|
||||
warehouse = %s", (item_code, self.doc.name))
|
||||
warehouse = %s", (item_code, warehouse))
|
||||
bin = bin and bin[0][0] or ''
|
||||
if not bin:
|
||||
if not self.doc.warehouse_type :
|
||||
msgprint("[Warehouse Type is Mandatory] Please Enter warehouse type in Warehouse " + self.doc.name)
|
||||
raise Exception
|
||||
bin = Document('Bin')
|
||||
bin.item_code = item_code
|
||||
bin.stock_uom = get_value('Item', item_code, 'stock_uom')
|
||||
bin.warehouse = self.doc.name
|
||||
bin.warehouse_type = self.doc.warehouse_type
|
||||
bin.stock_uom = webnotes.conn.get_value('Item', item_code, 'stock_uom')
|
||||
bin.warehouse = warehouse
|
||||
bin.warehouse_type = webnotes.conn.get_value("Warehouse", warehouse, "warehouse_type")
|
||||
bin_obj = get_obj(doc=bin)
|
||||
bin_obj.validate()
|
||||
bin.save(1)
|
||||
bin = bin.name
|
||||
else:
|
||||
bin_obj = get_obj('Bin',bin)
|
||||
|
||||
bin_obj = get_obj('Bin', bin)
|
||||
return bin_obj
|
||||
|
||||
|
||||
def validate_asset(self, item_code):
|
||||
if sql("select is_asset_item from tabItem where name=%s", item_code)[0][0] == 'Yes' and self.doc.warehouse_type != 'Fixed Asset':
|
||||
msgprint("Fixed Asset Item %s can only be transacted in a Fixed Asset type Warehouse" % item_code)
|
||||
raise Exception
|
||||
if webnotes.conn.get_value("Item", item_code, "is_asset_item") == 'Yes' \
|
||||
and self.doc.warehouse_type != 'Fixed Asset':
|
||||
msgprint("""Fixed Asset Item %s can only be transacted in a
|
||||
Fixed Asset type Warehouse""" % item_code, raise_exception=1)
|
||||
|
||||
|
||||
# update bin
|
||||
# ----------
|
||||
def update_bin(self, actual_qty, reserved_qty, ordered_qty, indented_qty, planned_qty, item_code, dt, sle_id = '',posting_time = '', serial_no = '', is_cancelled = 'No',doc_type='',doc_name='',is_amended='No'):
|
||||
self.validate_asset(item_code)
|
||||
it_det = get_value('Item', item_code, 'is_stock_item')
|
||||
if it_det and it_det == 'Yes':
|
||||
bin = self.get_bin(item_code)
|
||||
bin.update_stock(actual_qty, reserved_qty, ordered_qty, indented_qty, planned_qty, dt, sle_id, posting_time, serial_no, is_cancelled,doc_type,doc_name,is_amended)
|
||||
def update_bin(self, args):
|
||||
self.validate_asset(args.get("item_code"))
|
||||
is_stock_item = webnotes.conn.get_value('Item', args.get("item_code"), 'is_stock_item')
|
||||
if is_stock_item == 'Yes':
|
||||
bin = self.get_bin(args.get("item_code"))
|
||||
bin.update_stock(args)
|
||||
return bin
|
||||
else:
|
||||
msgprint("[Stock Update] Ignored %s since it is not a stock item" % item_code)
|
||||
|
||||
# repost stock
|
||||
# ------------
|
||||
def repost_stock(self):
|
||||
bl = sql("select name from tabBin where warehouse=%s", self.doc.name)
|
||||
for b in bl:
|
||||
bobj = get_obj('Bin',b[0])
|
||||
bobj.update_entries_after(posting_date = '0000-00-00', posting_time = '00:00')
|
||||
|
||||
sql("COMMIT")
|
||||
sql("START TRANSACTION")
|
||||
msgprint("[Stock Update] Ignored %s since it is not a stock item"
|
||||
% args.get("item_code"))
|
||||
|
||||
def check_state(self):
|
||||
return "\n" + "\n".join([i[0] for i in sql("select state_name from `tabState` where `tabState`.country='%s' " % self.doc.country)])
|
||||
return "\n" + "\n".join([i[0] for i in sql("""
|
||||
select state_name from `tabState` where country=%s""", self.doc.country)])
|
||||
|
||||
def validate(self):
|
||||
if self.doc.email_id:
|
||||
if not validate_email_add(self.doc.email_id):
|
||||
msgprint("Please enter valid Email Id.")
|
||||
raise Exception
|
||||
if self.doc.email_id and not validate_email_add(self.doc.email_id):
|
||||
msgprint("Please enter valid Email Id", raise_exception=1)
|
||||
if not self.doc.warehouse_type:
|
||||
msgprint("[Warehouse Type is Mandatory] Please Enter Please Entry warehouse type in Warehouse " + self.doc.name)
|
||||
raise Exception
|
||||
wt = sql("select warehouse_type from `tabWarehouse` where name ='%s'" % self.doc.name)
|
||||
if cstr(self.doc.warehouse_type) != cstr(wt and wt[0][0] or ''):
|
||||
sql("update `tabStock Ledger Entry` set warehouse_type = '%s' where warehouse = '%s'" % (self.doc.warehouse_type, self.doc.name))
|
||||
msgprint("All Stock Ledger Entries Updated.")
|
||||
msgprint("Warehouse Type is Mandatory", raise_exception=1)
|
||||
|
||||
wt = sql("select warehouse_type from `tabWarehouse` where name ='%s'" % self.doc.name)
|
||||
if wt and cstr(self.doc.warehouse_type) != cstr(wt[0][0]):
|
||||
sql("""update `tabStock Ledger Entry` set warehouse_type = %s
|
||||
where warehouse = %s""", (self.doc.warehouse_type, self.doc.name))
|
||||
|
||||
def merge_warehouses(self):
|
||||
webnotes.conn.auto_commit_on_many_writes = 1
|
||||
|
||||
# get items which dealt with current warehouse
|
||||
items = webnotes.conn.sql("select item_code from tabBin where warehouse=%s" , self.doc.name)
|
||||
# delete old bins
|
||||
webnotes.conn.sql("delete from tabBin where warehouse=%s", self.doc.name)
|
||||
|
||||
# replace link fields
|
||||
from webnotes.model import rename_doc
|
||||
link_fields = rename_doc.get_link_fields('Warehouse')
|
||||
rename_doc.update_link_field_values(link_fields, self.doc.name, self.doc.merge_with)
|
||||
|
||||
for item_code in items:
|
||||
self.repost(item_code[0], self.doc.merge_with)
|
||||
|
||||
webnotes.conn.auto_commit_on_many_writes = 0
|
||||
|
||||
def repost(self, item_code, warehouse=None):
|
||||
bin = self.get_bin(item_code, warehouse)
|
||||
self.repost_actual_qty(bin)
|
||||
self.repost_reserved_qty(bin)
|
||||
self.repost_indented_qty(bin)
|
||||
self.repost_ordered_qty(bin)
|
||||
self.repost_planned_qty(bin)
|
||||
bin.doc.projected_qty = flt(bin.doc.actual_qty) + flt(bin.doc.planned_qty) \
|
||||
+ flt(bin.doc.indented_qty) + flt(bin.doc.ordered_qty) - flt(bin.doc.reserved_qty)
|
||||
bin.doc.save()
|
||||
|
||||
|
||||
def repost_actual_qty(self, bin):
|
||||
bin.update_entries_after(posting_date = '0000-00-00', posting_time = '00:00')
|
||||
|
||||
def repost_reserved_qty(self, bin):
|
||||
reserved_qty = webnotes.conn.sql("""
|
||||
select
|
||||
sum((dnpi_qty / so_item_qty) * (so_item_qty - so_item_delivered_qty))
|
||||
from
|
||||
(
|
||||
select
|
||||
qty as dnpi_qty,
|
||||
(
|
||||
select qty from `tabSales Order Item`
|
||||
where name = dnpi.parent_detail_docname
|
||||
) as so_item_qty,
|
||||
(
|
||||
select ifnull(delivered_qty, 0) from `tabSales Order Item`
|
||||
where name = dnpi.parent_detail_docname
|
||||
) as so_item_delivered_qty
|
||||
from
|
||||
(
|
||||
select qty, parent_detail_docname
|
||||
from `tabDelivery Note Packing Item` dnpi_in
|
||||
where item_code = %s and warehouse = %s
|
||||
and parenttype="Sales Order"
|
||||
and exists (select * from `tabSales Order` so
|
||||
where name = dnpi_in.parent and docstatus = 1 and status != 'Stopped')
|
||||
) dnpi
|
||||
) tab
|
||||
where
|
||||
so_item_qty >= so_item_delivered_qty
|
||||
""", (bin.doc.item_code, bin.doc.warehouse))
|
||||
|
||||
if flt(bin.doc.reserved_qty) != flt(reserved_qty[0][0]):
|
||||
webnotes.conn.set_value("Bin", bin.doc.name, "reserved_qty", flt(reserved_qty[0][0]))
|
||||
|
||||
|
||||
def repost_indented_qty(self, bin):
|
||||
indented_qty = webnotes.conn.sql("""select sum(pr_item.qty - pr_item.ordered_qty)
|
||||
from `tabPurchase Request Item` pr_item, `tabPurchase Request` pr
|
||||
where pr_item.item_code=%s and pr_item.warehouse=%s
|
||||
and pr_item.qty > pr_item.ordered_qty and pr_item.parent=pr.name
|
||||
and pr.status!='Stopped' and pr.docstatus=1"""
|
||||
, (bin.doc.item_code, bin.doc.warehouse))
|
||||
|
||||
if flt(bin.doc.indented_qty) != flt(indented_qty[0][0]):
|
||||
webnotes.conn.set_value("Bin", bin.doc.name, "indented_qty", flt(indented_qty[0][0]))
|
||||
|
||||
|
||||
def repost_ordered_qty(self, bin):
|
||||
ordered_qty = webnotes.conn.sql("""
|
||||
select sum((po_item.qty - po_item.received_qty)*po_item.conversion_factor)
|
||||
from `tabPurchase Order Item` po_item, `tabPurchase Order` po
|
||||
where po_item.item_code=%s and po_item.warehouse=%s
|
||||
and po_item.qty > po_item.received_qty and po_item.parent=po.name
|
||||
and po.status!='Stopped' and po.docstatus=1"""
|
||||
, (bin.doc.item_code, bin.doc.warehouse))
|
||||
|
||||
if flt(bin.doc.ordered_qty) != flt(ordered_qty[0][0]):
|
||||
webnotes.conn.set_value("Bin", bin.doc.name, "ordered_qty", flt(ordered_qty[0][0]))
|
||||
|
||||
def repost_planned_qty(self, bin):
|
||||
planned_qty = webnotes.conn.sql("""
|
||||
select sum(qty - produced_qty) from `tabProduction Order`
|
||||
where production_item = %s and fg_warehouse = %s and status != "Stopped"
|
||||
and docstatus=1""", (bin.doc.item_code, bin.doc.warehouse))
|
||||
|
||||
if flt(bin.doc.planned_qty) != flt(planned_qty[0][0]):
|
||||
webnotes.conn.set_value("Bin", bin.doc.name, "planned_qty", flt(planned_qty[0][0]))
|
||||
|
||||
def on_trash(self):
|
||||
# delete bin
|
||||
bins = sql("select * from `tabBin` where warehouse = %s", self.doc.name, as_dict=1)
|
||||
for d in bins:
|
||||
if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
|
||||
msgprint("Warehouse: %s can not be deleted as qty exists for item: %s" % (self.doc.name, d['item_code']), raise_exception=1)
|
||||
if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
|
||||
d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
|
||||
msgprint("""Warehouse: %s can not be deleted as qty exists for item: %s"""
|
||||
% (self.doc.name, d['item_code']), raise_exception=1)
|
||||
else:
|
||||
sql("delete from `tabBin` where name = %s", d['name'])
|
||||
|
||||
# delete cancelled sle
|
||||
if sql("select name from `tabStock Ledger Entry` where warehouse = %s and ifnull('is_cancelled', '') = 'No'", self.doc.name):
|
||||
mdgprint("Warehosue can not be deleted as stock ledger entry exists for this warehosue.", raise_exception=1)
|
||||
if sql("""select name from `tabStock Ledger Entry`
|
||||
where warehouse = %s and ifnull('is_cancelled', '') = 'No'""", self.doc.name):
|
||||
mdgprint("""Warehosue can not be deleted as stock ledger entry
|
||||
exists for this warehosue.""", raise_exception=1)
|
||||
else:
|
||||
sql("delete from `tabStock Ledger Entry` where warehouse = %s", self.doc.name)
|
||||
sql("delete from `tabStock Ledger Entry` where warehouse = %s", self.doc.name)
|
||||
@@ -3,11 +3,11 @@
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2012-07-03 13:30:45',
|
||||
'docstatus': 0,
|
||||
'modified': '2012-07-11 10:18:07',
|
||||
'modified_by': u'Administrator',
|
||||
'owner': u'Administrator'
|
||||
u'creation': '2012-10-10 12:07:10',
|
||||
u'docstatus': 0,
|
||||
u'modified': '2012-10-25 15:03:49',
|
||||
u'modified_by': u'Administrator',
|
||||
u'owner': u'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
@@ -18,10 +18,10 @@
|
||||
'colour': u'White:FFF',
|
||||
'default_print_format': u'Standard',
|
||||
'description': u'A logical Warehouse against which stock entries are made.\n\nThere are two main Warehouse Types that are significant in ERPNext.\n\n1. **Stores:** These are where your incoming **Items** are kept before they are consumed or sold. You can have as many \u201cStores\u201d type **Warehouses** as you wish. Stores type warehouses are significant because if you set an Item for automatic re-order, ERPNext will check its quantities in all \u201cStores\u201d type **Warehouses** when deciding whether to re-order or not.\n\n2. **Asset**: **Items** marked as type \u201cFixed Asset\u201d are maintained in Asset Type **Warehouses**. This helps you separate them for the **Items** that are consumed as a part of your regular operations or \u201cCost of Goods Sold\u201d.\n',
|
||||
'doctype': 'DocType',
|
||||
u'doctype': u'DocType',
|
||||
'document_type': u'Master',
|
||||
'module': u'Stock',
|
||||
'name': '__common__',
|
||||
u'name': u'__common__',
|
||||
'search_fields': u'warehouse_type',
|
||||
'section_style': u'Tabbed',
|
||||
'server_code_error': u' ',
|
||||
@@ -31,8 +31,8 @@
|
||||
|
||||
# These values are common for all DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'name': '__common__',
|
||||
u'doctype': u'DocField',
|
||||
u'name': u'__common__',
|
||||
'parent': u'Warehouse',
|
||||
'parentfield': u'fields',
|
||||
'parenttype': u'DocType'
|
||||
@@ -40,8 +40,8 @@
|
||||
|
||||
# These values are common for all DocPerm
|
||||
{
|
||||
'doctype': u'DocPerm',
|
||||
'name': '__common__',
|
||||
u'doctype': u'DocPerm',
|
||||
u'name': u'__common__',
|
||||
'parent': u'Warehouse',
|
||||
'parentfield': u'permissions',
|
||||
'parenttype': u'DocType',
|
||||
@@ -50,130 +50,13 @@
|
||||
|
||||
# DocType, Warehouse
|
||||
{
|
||||
'doctype': 'DocType',
|
||||
'name': u'Warehouse'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 2,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 2,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'All'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Master Manager',
|
||||
'submit': 0,
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'Material Master Manager'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'System Manager',
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'create': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'permlevel': 2,
|
||||
'role': u'System Manager',
|
||||
'write': 1
|
||||
u'doctype': u'DocType',
|
||||
u'name': u'Warehouse'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'warehouse_detail',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Warehouse Detail',
|
||||
@@ -183,7 +66,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'warehouse_name',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Warehouse Name',
|
||||
@@ -196,7 +79,7 @@
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'warehouse_type',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Warehouse Type',
|
||||
@@ -210,7 +93,7 @@
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'company',
|
||||
'fieldtype': u'Link',
|
||||
'in_filter': 1,
|
||||
@@ -226,7 +109,7 @@
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'For Reference Only.',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'warehouse_contact_info',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Warehouse Contact Info',
|
||||
@@ -235,7 +118,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'email_id',
|
||||
'fieldtype': u'Data',
|
||||
'hidden': 1,
|
||||
@@ -248,7 +131,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'phone_no',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Phone No',
|
||||
@@ -260,7 +143,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'mobile_no',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Mobile No',
|
||||
@@ -272,7 +155,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'column_break0',
|
||||
'fieldtype': u'Column Break',
|
||||
'oldfieldtype': u'Column Break',
|
||||
@@ -281,7 +164,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'address_line_1',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Address Line 1',
|
||||
@@ -292,7 +175,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'address_line_2',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Address Line 2',
|
||||
@@ -303,7 +186,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'city',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'City',
|
||||
@@ -316,7 +199,7 @@
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'state',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'State',
|
||||
@@ -328,7 +211,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'pin',
|
||||
'fieldtype': u'Int',
|
||||
'label': u'PIN',
|
||||
@@ -340,24 +223,92 @@
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'description': u'For Admin use only. Please report errors to support@erpnext.com',
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'repost_stock',
|
||||
'description': u'This feature is for merging duplicate warehouses. It will replace all the links of this warehouse by "Merge With" warehouse. After merging you can delete this warehouse, as stock level for this warehouse will be zero.',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'merge_warehouses_section',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Repost Stock',
|
||||
'oldfieldtype': u'Section Break',
|
||||
'label': u'Merge Warehouses',
|
||||
'permlevel': 2
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'repost_stock_ledger',
|
||||
'fieldtype': u'Button',
|
||||
'hidden': 0,
|
||||
'label': u'Repost Stock Ledger',
|
||||
'oldfieldtype': u'Button',
|
||||
'options': u'repost_stock',
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'merge_with',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Merge With',
|
||||
'options': u'Warehouse',
|
||||
'permlevel': 2
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
u'doctype': u'DocField',
|
||||
'fieldname': u'merge',
|
||||
'fieldtype': u'Button',
|
||||
'label': u'Merge',
|
||||
'permlevel': 2
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Master Manager',
|
||||
'submit': 0,
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'System Manager',
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': u'Material User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 1,
|
||||
'role': u'All'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'create': 0,
|
||||
u'doctype': u'DocPerm',
|
||||
'permlevel': 2,
|
||||
'role': u'System Manager',
|
||||
'write': 1
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user