Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/search_criteria/accounts_receivable/accounts_receivable.py b/accounts/search_criteria/accounts_receivable/accounts_receivable.py
index 7d13d00..34aafe5 100644
--- a/accounts/search_criteria/accounts_receivable/accounts_receivable.py
+++ b/accounts/search_criteria/accounts_receivable/accounts_receivable.py
@@ -165,4 +165,4 @@
t_row[col_idx['Voucher No']] = 'Total'
t_row[col_idx['Opening Amt']] = total_booking_amt
t_row[col_idx['Outstanding Amt']] = total_outstanding_amt
- out.append(t_row)
+ out.append(t_row)
\ No newline at end of file
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index 814d646..092640d 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -162,42 +162,50 @@
# Check for stopped status
self.check_for_stopped_status(pc_obj)
-
# get total in words
dcc = TransactionBase().get_company_currency(self.doc.company)
self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total)
self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import)
- # update bin
- # ----------
+
def update_bin(self, is_submit, is_stopped = 0):
pc_obj = get_obj('Purchase Common')
for d in getlist(self.doclist, 'po_details'):
#1. 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":
ind_qty, po_qty = 0, flt(d.qty) * flt(d.conversion_factor)
if is_stopped:
- po_qty = flt(d.qty) > flt(d.received_qty) and flt( flt(flt(d.qty) - flt(d.received_qty)) * flt(d.conversion_factor))or 0
+ po_qty = flt(d.qty) > flt(d.received_qty) and \
+ flt( flt(flt(d.qty) - flt(d.received_qty))*flt(d.conversion_factor)) or 0
# No updates in Purchase Request on Stop / Unstop
if cstr(d.prevdoc_doctype) == 'Purchase Request' and not is_stopped:
# get qty and pending_qty of prevdoc
- curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'Purchase Request Item', 'Purchase Request - Purchase Order', 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 Request Item',
+ 'Purchase Request - Purchase Order', 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(po_qty) > flt(max_qty):
curr_qty = flt(max_qty) - flt(qty)
- # special case as there is no restriction for Purchase Request - Purchase Order
- curr_qty = (curr_qty > 0) and curr_qty or 0
+ # special case as there is no restriction
+ # for Purchase Request - Purchase Order
+ curr_qty = curr_qty > 0 and curr_qty or 0
else:
curr_qty = flt(po_qty)
ind_qty = -flt(curr_qty)
- #==> Update Bin's Purchase Request Qty by +- ind_qty and Ordered Qty by +- qty
- get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(po_qty), (is_submit and 1 or -1) * flt(ind_qty), 0, d.item_code, self.doc.transaction_date)
-
+ # Update ordered_qty and indented_qty in bin
+ args = {
+ "item_code" : d.item_code,
+ "ordered_qty" : (is_submit and 1 or -1) * flt(po_qty),
+ "indented_qty" : (is_submit and 1 or -1) * flt(ind_qty),
+ "posting_date": self.doc.transaction_date
+ }
+ get_obj("Warehouse", d.warehouse).update_bin(args)
+
def check_modified_date(self):
mod_db = sql("select modified from `tabPurchase Order` where name = '%s'" % self.doc.name)
date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))
diff --git a/buying/doctype/purchase_request/purchase_request.py b/buying/doctype/purchase_request/purchase_request.py
index a1b0985..a4373a8 100644
--- a/buying/doctype/purchase_request/purchase_request.py
+++ b/buying/doctype/purchase_request/purchase_request.py
@@ -167,32 +167,29 @@
# Validate qty against SO
self.validate_qty_against_so()
-
- # On Submit Functions
- #----------------------------------------------------------------------------
- # Update Quantity Requested for Purchase in Bin
def update_bin(self, is_submit, is_stopped):
+ """ Update Quantity Requested for Purchase in Bin"""
+
for d in getlist(self.doclist, 'indent_details'):
- # Step 1:=> Check if is_stock_item == 'Yes'
- if cstr(sql("select is_stock_item from `tabItem` where name = '%s'" % cstr(d.item_code))[0][0]) == 'Yes':
+ if webnotes.conn.get_value("Item", d.item_code, "is_stock_item") == "Yes":
if not d.warehouse:
- msgprint('Please Enter Warehouse for Item %s as it is stock item.' % cstr(d.item_code))
- raise Exception
- # Step 2:=> Set Qty
+ msgprint("Please Enter Warehouse for Item %s as it is stock item"
+ % cstr(d.item_code), raise_exception=1)
+
qty =flt(d.qty)
if is_stopped:
- qty = (d.qty > d.ordered_qty) and flt(flt(d.qty) - flt(d.ordered_qty)) or 0
- # Step 3 :=> Update Bin's Purchase Request Qty by +- qty
- get_obj('Warehouse', d.warehouse).update_bin(0, 0, 0, (is_submit and 1 or -1) * flt(qty), 0, d.item_code, self.doc.transaction_date)
+ qty = (d.qty > d.ordered_qty) and flt(flt(d.qty) - flt(d.ordered_qty)) or 0
+
+ args = {
+ "item_code": d.item_code,
+ "indented_qty": (is_submit and 1 or -1) * flt(qty),
+ "posting_date": self.doc.transaction_date
+ }
+ get_obj('Warehouse', d.warehouse).update_bin(args)
- # On Submit
- #---------------------------------------------------------------------------
def on_submit(self):
- # Step 1:=> Set Status
set(self.doc,'status','Submitted')
-
- # Step 2:=> Update Bin
self.update_bin(is_submit = 1, is_stopped = 0)
def check_modified_date(self):
@@ -202,9 +199,7 @@
if date_diff and date_diff[0][0]:
msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
raise Exception
-
- # On Stop / unstop
- #------------------------------------------------------------------------------
+
def update_status(self, status):
self.check_modified_date()
# Step 1:=> Update Bin
@@ -216,8 +211,7 @@
# Step 3:=> Acknowledge User
msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)) )
- # On Cancel
- #-----------------------------------------------------------------------------
+
def on_cancel(self):
# Step 1:=> Get Purchase Common Obj
pc_obj = get_obj(dt='Purchase Common')
diff --git a/patches/july_2012/repost_stock_due_to_wrong_packing_list.py b/patches/july_2012/repost_stock_due_to_wrong_packing_list.py
index 449dd1f..b202902 100644
--- a/patches/july_2012/repost_stock_due_to_wrong_packing_list.py
+++ b/patches/july_2012/repost_stock_due_to_wrong_packing_list.py
@@ -24,27 +24,33 @@
i += 1
print i
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
+ select
+ sum((dnpi_qty / so_item_qty) * (so_item_qty - 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""", (d[0], d[1]))
+ (
+ 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
+ """, (d[0], d[1]))
if flt(d[3]) != flt(reserved_qty[0][0]):
print d[3], reserved_qty[0][0]
diff --git a/production/doctype/production_order/production_order.py b/production/doctype/production_order/production_order.py
index 915c80d..5be3edc 100644
--- a/production/doctype/production_order/production_order.py
+++ b/production/doctype/production_order/production_order.py
@@ -58,57 +58,63 @@
def validate(self):
if self.doc.production_item :
- item_detail = sql("select name from `tabItem` where name = '%s' and docstatus != 2" % self.doc.production_item, as_dict = 1)
+ item_detail = sql("select name from `tabItem` where name = '%s' and docstatus != 2"
+ % self.doc.production_item, as_dict = 1)
if not item_detail:
- msgprint("Item '%s' does not exist or cancelled in the system." % cstr(self.doc.production_item))
- raise Exception
+ msgprint("Item '%s' does not exist or cancelled in the system."
+ % cstr(self.doc.production_item), raise_exception=1)
if self.doc.bom_no:
bom = sql("""select name from `tabBOM` where name = %s and docstatus = 1
- and is_active = 'Yes' and item = %s""", (self.doc.bom_no, self.doc.production_item), as_dict =1)
+ and is_active = 'Yes' and item = %s"""
+ , (self.doc.bom_no, self.doc.production_item), as_dict =1)
if not bom:
msgprint("""Incorrect BOM: %s entered.
- May be BOM not exists or inactive or not submitted or for some other item.""" % cstr(self.doc.bom_no))
- raise Exception
+ May be BOM not exists or inactive or not submitted
+ or for some other item.""" % cstr(self.doc.bom_no), raise_exception=1)
def stop_unstop(self, status):
""" Called from client side on Stop/Unstop event"""
self.update_status(status)
- # Update Planned Qty of Production Item
- qty = (flt(self.doc.qty) - flt(self.doc.produced_qty)) * ((status == 'Stopped') and -1 or 1)
- get_obj('Warehouse', self.doc.fg_warehouse).update_bin(0, 0, 0, 0, flt(qty), self.doc.production_item, now())
+ qty = (flt(self.doc.qty)-flt(self.doc.produced_qty)) * ((status == 'Stopped') and -1 or 1)
+ self.update_planned_qty(qty)
msgprint("Production Order has been %s" % status)
-
def update_status(self, status):
if status == 'Stopped':
- set(self.doc, 'status', cstr(status))
+ webnotes.conn.set(self.doc, 'status', cstr(status))
else:
if flt(self.doc.qty) == flt(self.doc.produced_qty):
- set(self.doc, 'status', 'Completed')
+ webnotes.conn.set(self.doc, 'status', 'Completed')
if flt(self.doc.qty) > flt(self.doc.produced_qty):
- set(self.doc, 'status', 'In Process')
+ webnotes.conn.set(self.doc, 'status', 'In Process')
if flt(self.doc.produced_qty) == 0:
- set(self.doc, 'status', 'Submitted')
+ webnotes.conn.set(self.doc, 'status', 'Submitted')
def on_submit(self):
- set(self.doc,'status', 'Submitted')
- # increase Planned Qty of Prooduction Item by Qty
- get_obj('Warehouse', self.doc.fg_warehouse).update_bin(0, 0, 0, 0,flt(self.doc.qty), self.doc.production_item, now())
-
-
+ webnotes.conn.set(self.doc,'status', 'Submitted')
+ self.update_planned_qty(self.doc.qty)
+
def on_cancel(self):
# Check whether any stock entry exists against this Production Order
- st = sql("select name from `tabStock Entry` where production_order = '%s' and docstatus = 1" % cstr(self.doc.name))
- if st and st[0][0]:
+ stock_entry = sql("""select name from `tabStock Entry`
+ where production_order = %s and docstatus = 1""", self.doc.name)
+ if stock_entry:
msgprint("""Submitted Stock Entry %s exists against this production order.
- Hence can not be cancelled.""" % st[0][0])
- raise Exception
+ Hence can not be cancelled.""" % stock_entry[0][0], raise_exception=1)
- set(self.doc,'status', 'Cancelled')
- # decrease Planned Qty of Prooduction Item by Qty
- get_obj('Warehouse', self.doc.fg_warehouse).update_bin(0, 0, 0, 0,-flt(self.doc.qty), self.doc.production_item, now())
+ webnotes.conn.set(self.doc,'status', 'Cancelled')
+ self.update_planned_qty(-self.doc.qty)
+
+ def update_planned_qty(self, qty):
+ """update planned qty in bin"""
+ args = {
+ "item_code": self.doc.production_item,
+ "posting_date": nowdate(),
+ "planned_qty": flt(qty)
+ }
+ get_obj('Warehouse', self.doc.fg_warehouse).update_bin(args)
\ No newline at end of file
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index 7b677c5..f05500d 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -350,7 +350,6 @@
def on_submit(self):
self.check_prev_docstatus()
self.update_stock_ledger(update_stock = 1)
- self.set_sms_msg(1)
# update customer's last sales order no.
update_customer = sql("update `tabCustomer` set last_sales_order = '%s', modified = '%s' where name = '%s'" %(self.doc.name, self.doc.modified, self.doc.customer))
get_obj('Sales Common').check_credit(self,self.doc.grand_total)
@@ -373,7 +372,6 @@
raise Exception
self.check_nextdoc_docstatus()
self.update_stock_ledger(update_stock = -1)
- self.set_sms_msg()
#update prevdoc status
self.update_prevdoc_status('cancel')
@@ -405,75 +403,44 @@
def check_modified_date(self):
mod_db = sql("select modified from `tabSales Order` where name = '%s'" % self.doc.name)
date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))
-
if date_diff and date_diff[0][0]:
- msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
- raise Exception
+ msgprint("%s: %s has been modified after you have opened. Please Refresh"
+ % (self.doc.doctype, self.doc.name), raise_exception=1)
- # STOP SALES ORDER
- # ==============================================================================================
- # Stops Sales Order & no more transactions will be created against this Sales Order
def stop_sales_order(self):
self.check_modified_date()
self.update_stock_ledger(update_stock = -1,clear = 1)
- # ::::::::: SET SO STATUS ::::::::::
set(self.doc, 'status', 'Stopped')
- msgprint(self.doc.doctype + ": " + self.doc.name + " has been Stopped. To make transactions against this Sales Order you need to Unstop it.")
+ msgprint("""%s: %s has been Stopped. To make transactions against this Sales Order
+ you need to Unstop it.""" % (self.doc.doctype, self.doc.name))
- # UNSTOP SALES ORDER
- # ==============================================================================================
- # Unstops Sales Order & now transactions can be continued against this Sales Order
def unstop_sales_order(self):
self.check_modified_date()
self.update_stock_ledger(update_stock = 1,clear = 1)
- # ::::::::: SET SO STATUS ::::::::::
set(self.doc, 'status', 'Submitted')
- msgprint(self.doc.doctype + ": " + self.doc.name + " has been Unstopped.")
+ msgprint("%s: %s has been Unstopped" % (self.doc.doctype, self.doc.name))
- # UPDATE STOCK LEDGER
- # ===============================================================================================
+
def update_stock_ledger(self, update_stock, clear = 0):
for d in self.get_item_list(clear):
- stock_item = sql("SELECT is_stock_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 and stock_item[0]['is_stock_item'] == "Yes":
+ if webnotes.conn.get_value("Item", d['item_code'], "is_stock_item") == "Yes":
if not d['reserved_warehouse']:
- msgprint("Message: Please enter Reserved Warehouse for item %s as it is stock item."% d['item_code'])
- raise Exception
- bin = get_obj('Warehouse', d['reserved_warehouse']).update_bin( 0, flt(update_stock) * flt(d['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'))
-
- # Gets Items from packing list
- #=================================
+ msgprint("""Please enter Reserved Warehouse for item %s
+ as it is stock ite""" % d['item_code'], raise_exception=1)
+
+ args = {
+ "item_code": d['item_code'],
+ "reserved_qty": flt(update_stock) * flt(d['qty']),
+ "posting_date": self.doc.transaction_date,
+ "doc_type": self.doc.doctype,
+ "doc_name": self.doc.name,
+ "is_amended": self.doc.amended_from and 'Yes' or 'No'
+ }
+ get_obj('Warehouse', d['reserved_warehouse']).update_bin(args)
+
+
def get_item_list(self, clear):
return get_obj('Sales Common').get_item_list( self, clear)
-
- # SET MESSAGE FOR SMS
- #======================
- def set_sms_msg(self, is_submitted = 0):
- if is_submitted:
- if not self.doc.amended_from:
- msg = 'Sales Order: '+self.doc.name+' has been made against PO no: '+cstr(self.doc.po_no)
- set(self.doc, 'message', msg)
- else:
- msg = 'Sales Order has been amended. New SO no:'+self.doc.name
- set(self.doc, 'message', msg)
- else:
- msg = 'Sales Order: '+self.doc.name+' has been cancelled.'
- set(self.doc, 'message', msg)
-
- # SEND SMS
- # =========
- 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))
- # on update
def on_update(self):
- pass
-
+ pass
\ No newline at end of file
diff --git a/setup/doctype/global_defaults/global_defaults.txt b/setup/doctype/global_defaults/global_defaults.txt
index d1175b7..f68c6d3 100644
--- a/setup/doctype/global_defaults/global_defaults.txt
+++ b/setup/doctype/global_defaults/global_defaults.txt
@@ -3,11 +3,11 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-20 14:02:53',
- 'docstatus': 0,
- 'modified': '2012-05-22 14:11:21',
- 'modified_by': u'Administrator',
- 'owner': u'Administrator'
+ u'creation': '2012-07-03 13:30:02',
+ u'docstatus': 0,
+ u'modified': '2012-10-23 10:57:41',
+ u'modified_by': u'Administrator',
+ u'owner': u'Administrator'
},
# These values are common for all DocType
@@ -18,12 +18,12 @@
'allow_print': 1,
'colour': u'White:FFF',
'default_print_format': u'Standard',
- 'doctype': 'DocType',
+ u'doctype': u'DocType',
'hide_toolbar': 0,
'in_create': 1,
'issingle': 1,
'module': u'Setup',
- 'name': '__common__',
+ u'name': u'__common__',
'read_only': 1,
'section_style': u'Tabbed',
'server_code_error': u' ',
@@ -33,8 +33,8 @@
# These values are common for all DocField
{
- 'doctype': u'DocField',
- 'name': '__common__',
+ u'doctype': u'DocField',
+ u'name': u'__common__',
'parent': u'Global Defaults',
'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'Global Defaults',
'parentfield': u'permissions',
'parenttype': u'DocType',
@@ -53,57 +53,13 @@
# DocType, Global Defaults
{
- 'doctype': 'DocType',
- 'name': u'Global Defaults'
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 1,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'System Manager',
- 'submit': 0,
- 'write': 1
- },
-
- # DocPerm
- {
- 'create': 1,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'System Manager',
- 'write': 1
- },
-
- # DocPerm
- {
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'System Manager',
- 'write': 1
- },
-
- # DocPerm
- {
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'All'
- },
-
- # DocPerm
- {
- 'doctype': u'DocPerm',
- 'permlevel': 2,
- 'role': u'System Manager',
- 'write': 1
+ u'doctype': u'DocType',
+ u'name': u'Global Defaults'
},
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'company',
'fieldtype': u'Section Break',
'label': u'Company'
@@ -111,7 +67,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_company',
'fieldtype': u'Link',
'label': u'Default Company',
@@ -121,7 +77,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'current_fiscal_year',
'fieldtype': u'Link',
'label': u'Current Fiscal Year',
@@ -131,7 +87,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'date_format',
'fieldtype': u'Select',
'label': u'Date Format',
@@ -140,7 +96,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'column_break1',
'fieldtype': u'Column Break',
'width': u'50%'
@@ -149,7 +105,7 @@
# DocField
{
'default': u'INR',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_currency',
'fieldtype': u'Select',
'label': u'Default Currency',
@@ -159,7 +115,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_currency_format',
'fieldtype': u'Select',
'label': u'Default Currency Format',
@@ -168,7 +124,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_currency_fraction',
'fieldtype': u'Data',
'label': u'Default Currency Fraction'
@@ -176,7 +132,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'stock',
'fieldtype': u'Section Break',
'label': u'Stock'
@@ -184,7 +140,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'column_break2',
'fieldtype': u'Column Break',
'width': u'50%'
@@ -192,7 +148,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_item_group',
'fieldtype': u'Link',
'label': u'Default Item Group',
@@ -201,7 +157,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'ighelp',
'fieldtype': u'HTML',
'label': u'IGHelp',
@@ -210,7 +166,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_stock_uom',
'fieldtype': u'Link',
'label': u'Default Stock UOM',
@@ -219,18 +175,9 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'default_valuation_method',
- 'fieldtype': u'Select',
- 'label': u'Default Valuation Method',
- 'options': u'FIFO\nMoving Average'
- },
-
- # DocField
- {
'colour': u'White:FFF',
'description': u'Applicable only if valuation method is moving average',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'allow_negative_stock',
'fieldtype': u'Check',
'label': u'Allow Negative Stock'
@@ -238,7 +185,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_warehouse_type',
'fieldtype': u'Link',
'label': u'Default Warehouse Type',
@@ -247,7 +194,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'auto_indent',
'fieldtype': u'Check',
'label': u'Raise Purchase Request when stock reaches re-order level'
@@ -256,7 +203,7 @@
# DocField
{
'default': u'1',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'column_break3',
'fieldtype': u'Column Break',
'width': u'50%'
@@ -266,7 +213,7 @@
{
'colour': u'White:FFF',
'description': u'Percentage you are allowed to receive or deliver more against the quantity ordered. <p>For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units</p>',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'tolerance',
'fieldtype': u'Currency',
'label': u'Allowance Percent'
@@ -276,7 +223,7 @@
{
'colour': u'White:FFF',
'description': u'Stock level frozen up to this date, nobody can do / modify entry except authorized person',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'stock_frozen_upto',
'fieldtype': u'Date',
'label': u'Stock Frozen Upto'
@@ -286,7 +233,7 @@
{
'colour': u'White:FFF',
'description': u'Users with this role are allowed to do / modify stock entry before frozen date',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'stock_auth_role',
'fieldtype': u'Link',
'label': u'Authorized Role (Frozen Entry)',
@@ -295,7 +242,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'accounts',
'fieldtype': u'Section Break',
'label': u'Accounts'
@@ -305,7 +252,7 @@
{
'colour': u'White:FFF',
'description': u'Accounting entry frozen up to this date, nobody can do / modify entry except authorized person',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'acc_frozen_upto',
'fieldtype': u'Date',
'label': u'Accounts Frozen Upto'
@@ -315,7 +262,7 @@
{
'colour': u'White:FFF',
'description': u'Users with this role are allowed to do / modify accounting entry before frozen date',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'bde_auth_role',
'fieldtype': u'Link',
'label': u'Authourized Role (Frozen Entry)',
@@ -324,7 +271,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'credit_controller',
'fieldtype': u'Link',
'label': u'Credit Controller',
@@ -333,14 +280,14 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'column_break4',
'fieldtype': u'Column Break'
},
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'account_info',
'fieldtype': u'HTML',
'label': u'Account Info',
@@ -349,7 +296,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'selling',
'fieldtype': u'Section Break',
'label': u'Selling'
@@ -359,7 +306,7 @@
{
'colour': u'White:FFF',
'default': u'Customer Name',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'cust_master_name',
'fieldtype': u'Select',
'label': u'Customer Master created by ',
@@ -368,7 +315,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_customer_group',
'fieldtype': u'Link',
'label': u'Default Customer Group',
@@ -377,7 +324,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'cghelp',
'fieldtype': u'HTML',
'label': u'CGHelp',
@@ -386,7 +333,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_territory',
'fieldtype': u'Link',
'label': u'Default Territory',
@@ -395,7 +342,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'territoryhelp',
'fieldtype': u'HTML',
'label': u'TerritoryHelp',
@@ -404,7 +351,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'column_break5',
'fieldtype': u'Column Break',
'width': u'50%'
@@ -412,7 +359,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_price_list',
'fieldtype': u'Link',
'label': u'Default Price List',
@@ -421,7 +368,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_price_list_currency',
'fieldtype': u'Link',
'label': u'Default Price List Currency',
@@ -432,7 +379,7 @@
{
'colour': u'White:FFF',
'default': u'No',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'so_required',
'fieldtype': u'Select',
'label': u'Sales Order Required',
@@ -443,7 +390,7 @@
{
'colour': u'White:FFF',
'default': u'No',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'dn_required',
'fieldtype': u'Select',
'label': u'Delivery Note Required',
@@ -452,7 +399,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'buying',
'fieldtype': u'Section Break',
'label': u'Buying'
@@ -460,7 +407,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'default_supplier_type',
'fieldtype': u'Link',
'label': u'Default Supplier Type',
@@ -471,7 +418,7 @@
{
'colour': u'White:FFF',
'default': u'Supplier Name',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'supp_master_name',
'fieldtype': u'Select',
'label': u'Supplier Master created by ',
@@ -480,7 +427,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'column_break6',
'fieldtype': u'Column Break',
'width': u'50%'
@@ -490,7 +437,7 @@
{
'colour': u'White:FFF',
'default': u'No',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'po_required',
'fieldtype': u'Select',
'label': u'Purchase Order Required',
@@ -501,7 +448,7 @@
{
'colour': u'White:FFF',
'default': u'No',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'pr_required',
'fieldtype': u'Select',
'label': u'Purchase Receipt Required',
@@ -510,7 +457,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'maintain_same_rate',
'fieldtype': u'Check',
'label': u'Maintain same rate throughout purchase cycle'
@@ -518,7 +465,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'hr',
'fieldtype': u'Section Break',
'label': u'HR',
@@ -529,7 +476,7 @@
{
'colour': u'White:FFF',
'description': u'Employee record is created using selected field. ',
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'emp_created_by',
'fieldtype': u'Select',
'label': u'Employee Records to be created by ',
@@ -538,7 +485,7 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'system',
'fieldtype': u'Section Break',
'label': u'System'
@@ -546,9 +493,53 @@
# DocField
{
- 'doctype': u'DocField',
+ u'doctype': u'DocField',
'fieldname': u'sms_sender_name',
'fieldtype': u'Data',
'label': u'SMS Sender Name'
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 1,
+ u'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'System Manager',
+ 'submit': 0,
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'create': 1,
+ u'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'System Manager',
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ u'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'All'
+ },
+
+ # DocPerm
+ {
+ u'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'System Manager',
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ u'doctype': u'DocPerm',
+ 'permlevel': 2,
+ 'role': u'System Manager',
+ 'write': 1
}
]
\ No newline at end of file
diff --git a/stock/doctype/bin/bin.py b/stock/doctype/bin/bin.py
index 648d581..8da6e9c 100644
--- a/stock/doctype/bin/bin.py
+++ b/stock/doctype/bin/bin.py
@@ -23,47 +23,45 @@
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 @@
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 @@
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""" %
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 1e0116f..bb444ec 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -244,7 +244,7 @@
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 @@
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 @@
})
- 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 @@
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')
\ No newline at end of file
diff --git a/stock/doctype/item/item.txt b/stock/doctype/item/item.txt
index c624fc1..a605821 100644
--- a/stock/doctype/item/item.txt
+++ b/stock/doctype/item/item.txt
@@ -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
}
]
\ No newline at end of file
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 20eed3b..13b2111 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -218,16 +218,17 @@
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 @@
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)
diff --git a/stock/doctype/serial_no/serial_no.py b/stock/doctype/serial_no/serial_no.py
index e811d73..931e0fe 100644
--- a/stock/doctype/serial_no/serial_no.py
+++ b/stock/doctype/serial_no/serial_no.py
@@ -73,8 +73,10 @@
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)
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index 6d3afb1..cc0f906 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -440,18 +440,30 @@
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()
diff --git a/stock/doctype/stock_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py
index e8a279b..1c52019 100644
--- a/stock/doctype/stock_ledger/stock_ledger.py
+++ b/stock/doctype/stock_ledger/stock_ledger.py
@@ -230,8 +230,12 @@
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):
diff --git a/stock/doctype/warehouse/warehouse.js b/stock/doctype/warehouse/warehouse.js
index 0017c75..0e9cd33 100644
--- a/stock/doctype/warehouse/warehouse.js
+++ b/stock/doctype/warehouse/warehouse.js
@@ -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', '', '');
+ }
}
\ No newline at end of file
diff --git a/stock/doctype/warehouse/warehouse.py b/stock/doctype/warehouse/warehouse.py
index 6e7883d..7ad297c 100644
--- a/stock/doctype/warehouse/warehouse.py
+++ b/stock/doctype/warehouse/warehouse.py
@@ -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)
\ No newline at end of file
diff --git a/stock/doctype/warehouse/warehouse.txt b/stock/doctype/warehouse/warehouse.txt
index 844e3f3..c51cfa8 100644
--- a/stock/doctype/warehouse/warehouse.txt
+++ b/stock/doctype/warehouse/warehouse.txt
@@ -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
}
]
\ No newline at end of file