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

This commit is contained in:
Rushabh Mehta 2012-10-26 11:14:51 +02:00
commit 44aed5eab9
17 changed files with 742 additions and 719 deletions

View File

@ -165,4 +165,4 @@ if len(out) > 0:
t_row[col_idx['Voucher No']] = 'Total' t_row[col_idx['Voucher No']] = 'Total'
t_row[col_idx['Opening Amt']] = total_booking_amt t_row[col_idx['Opening Amt']] = total_booking_amt
t_row[col_idx['Outstanding Amt']] = total_outstanding_amt t_row[col_idx['Outstanding Amt']] = total_outstanding_amt
out.append(t_row) out.append(t_row)

View File

@ -162,42 +162,50 @@ class DocType(TransactionBase):
# Check for stopped status # Check for stopped status
self.check_for_stopped_status(pc_obj) self.check_for_stopped_status(pc_obj)
# get total in words # get total in words
dcc = TransactionBase().get_company_currency(self.doc.company) 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 = 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) 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): def update_bin(self, is_submit, is_stopped = 0):
pc_obj = get_obj('Purchase Common') pc_obj = get_obj('Purchase Common')
for d in getlist(self.doclist, 'po_details'): for d in getlist(self.doclist, 'po_details'):
#1. Check if is_stock_item == 'Yes' #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) ind_qty, po_qty = 0, flt(d.qty) * flt(d.conversion_factor)
if is_stopped: 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 # No updates in Purchase Request on Stop / Unstop
if cstr(d.prevdoc_doctype) == 'Purchase Request' and not is_stopped: if cstr(d.prevdoc_doctype) == 'Purchase Request' and not is_stopped:
# get qty and pending_qty of prevdoc # 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) curr_ref_qty = pc_obj.get_qty(d.doctype, 'prevdoc_detail_docname',
max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0 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): if flt(qty) + flt(po_qty) > flt(max_qty):
curr_qty = flt(max_qty) - flt(qty) curr_qty = flt(max_qty) - flt(qty)
# special case as there is no restriction for Purchase Request - Purchase Order # special case as there is no restriction
curr_qty = (curr_qty > 0) and curr_qty or 0 # for Purchase Request - Purchase Order
curr_qty = curr_qty > 0 and curr_qty or 0
else: else:
curr_qty = flt(po_qty) curr_qty = flt(po_qty)
ind_qty = -flt(curr_qty) ind_qty = -flt(curr_qty)
#==> Update Bin's Purchase Request Qty by +- ind_qty and Ordered Qty by +- qty # Update ordered_qty and indented_qty in bin
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) 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): def check_modified_date(self):
mod_db = sql("select modified from `tabPurchase Order` where name = '%s'" % self.doc.name) 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))) date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))

View File

@ -167,32 +167,29 @@ class DocType:
# Validate qty against SO # Validate qty against SO
self.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): def update_bin(self, is_submit, is_stopped):
""" Update Quantity Requested for Purchase in Bin"""
for d in getlist(self.doclist, 'indent_details'): for d in getlist(self.doclist, 'indent_details'):
# Step 1:=> Check if is_stock_item == 'Yes' if webnotes.conn.get_value("Item", d.item_code, "is_stock_item") == "Yes":
if cstr(sql("select is_stock_item from `tabItem` where name = '%s'" % cstr(d.item_code))[0][0]) == 'Yes':
if not d.warehouse: if not d.warehouse:
msgprint('Please Enter Warehouse for Item %s as it is stock item.' % cstr(d.item_code)) msgprint("Please Enter Warehouse for Item %s as it is stock item"
raise Exception % cstr(d.item_code), raise_exception=1)
# Step 2:=> Set Qty
qty =flt(d.qty) qty =flt(d.qty)
if is_stopped: if is_stopped:
qty = (d.qty > d.ordered_qty) and flt(flt(d.qty) - flt(d.ordered_qty)) or 0 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) 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): def on_submit(self):
# Step 1:=> Set Status
set(self.doc,'status','Submitted') set(self.doc,'status','Submitted')
# Step 2:=> Update Bin
self.update_bin(is_submit = 1, is_stopped = 0) self.update_bin(is_submit = 1, is_stopped = 0)
def check_modified_date(self): def check_modified_date(self):
@ -202,9 +199,7 @@ class DocType:
if date_diff and date_diff[0][0]: if date_diff and date_diff[0][0]:
msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ") msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
raise Exception raise Exception
# On Stop / unstop
#------------------------------------------------------------------------------
def update_status(self, status): def update_status(self, status):
self.check_modified_date() self.check_modified_date()
# Step 1:=> Update Bin # Step 1:=> Update Bin
@ -216,8 +211,7 @@ class DocType:
# Step 3:=> Acknowledge User # Step 3:=> Acknowledge User
msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)) ) msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)) )
# On Cancel
#-----------------------------------------------------------------------------
def on_cancel(self): def on_cancel(self):
# Step 1:=> Get Purchase Common Obj # Step 1:=> Get Purchase Common Obj
pc_obj = get_obj(dt='Purchase Common') pc_obj = get_obj(dt='Purchase Common')

View File

@ -24,27 +24,33 @@ def repost_reserved_qty():
i += 1 i += 1
print i print i
reserved_qty = webnotes.conn.sql(""" reserved_qty = webnotes.conn.sql("""
select sum((dnpi_qty / so_item_qty) * (so_item_qty - so_item_delivered_qty)) select
from (select sum((dnpi_qty / so_item_qty) * (so_item_qty - so_item_delivered_qty))
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 from
( (
select qty, parent_detail_docname select
from `tabDelivery Note Packing Item` dnpi_in qty as dnpi_qty,
where item_code = %s and warehouse = %s (
and parenttype="Sales Order" select qty from `tabSales Order Item`
and exists (select * from `tabSales Order` so where name = dnpi.parent_detail_docname
where name = dnpi_in.parent and docstatus = 1 and status != 'Stopped') ) as so_item_qty,
) dnpi) tab (
where so_item_qty >= so_item_delivered_qty""", (d[0], d[1])) 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]): if flt(d[3]) != flt(reserved_qty[0][0]):
print d[3], reserved_qty[0][0] print d[3], reserved_qty[0][0]

View File

@ -58,57 +58,63 @@ class DocType:
def validate(self): def validate(self):
if self.doc.production_item : 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: if not item_detail:
msgprint("Item '%s' does not exist or cancelled in the system." % cstr(self.doc.production_item)) msgprint("Item '%s' does not exist or cancelled in the system."
raise Exception % cstr(self.doc.production_item), raise_exception=1)
if self.doc.bom_no: if self.doc.bom_no:
bom = sql("""select name from `tabBOM` where name = %s and docstatus = 1 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: if not bom:
msgprint("""Incorrect BOM: %s entered. 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)) May be BOM not exists or inactive or not submitted
raise Exception or for some other item.""" % cstr(self.doc.bom_no), raise_exception=1)
def stop_unstop(self, status): def stop_unstop(self, status):
""" Called from client side on Stop/Unstop event""" """ Called from client side on Stop/Unstop event"""
self.update_status(status) 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)
qty = (flt(self.doc.qty) - flt(self.doc.produced_qty)) * ((status == 'Stopped') and -1 or 1) self.update_planned_qty(qty)
get_obj('Warehouse', self.doc.fg_warehouse).update_bin(0, 0, 0, 0, flt(qty), self.doc.production_item, now())
msgprint("Production Order has been %s" % status) msgprint("Production Order has been %s" % status)
def update_status(self, status): def update_status(self, status):
if status == 'Stopped': if status == 'Stopped':
set(self.doc, 'status', cstr(status)) webnotes.conn.set(self.doc, 'status', cstr(status))
else: else:
if flt(self.doc.qty) == flt(self.doc.produced_qty): 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): 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: if flt(self.doc.produced_qty) == 0:
set(self.doc, 'status', 'Submitted') webnotes.conn.set(self.doc, 'status', 'Submitted')
def on_submit(self): def on_submit(self):
set(self.doc,'status', 'Submitted') webnotes.conn.set(self.doc,'status', 'Submitted')
# increase Planned Qty of Prooduction Item by Qty self.update_planned_qty(self.doc.qty)
get_obj('Warehouse', self.doc.fg_warehouse).update_bin(0, 0, 0, 0,flt(self.doc.qty), self.doc.production_item, now())
def on_cancel(self): def on_cancel(self):
# Check whether any stock entry exists against this Production Order # 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)) stock_entry = sql("""select name from `tabStock Entry`
if st and st[0][0]: where production_order = %s and docstatus = 1""", self.doc.name)
if stock_entry:
msgprint("""Submitted Stock Entry %s exists against this production order. msgprint("""Submitted Stock Entry %s exists against this production order.
Hence can not be cancelled.""" % st[0][0]) Hence can not be cancelled.""" % stock_entry[0][0], raise_exception=1)
raise Exception
set(self.doc,'status', 'Cancelled') webnotes.conn.set(self.doc,'status', 'Cancelled')
# decrease Planned Qty of Prooduction Item by Qty self.update_planned_qty(-self.doc.qty)
get_obj('Warehouse', self.doc.fg_warehouse).update_bin(0, 0, 0, 0,-flt(self.doc.qty), self.doc.production_item, now())
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)

View File

@ -350,7 +350,6 @@ class DocType(TransactionBase):
def on_submit(self): def on_submit(self):
self.check_prev_docstatus() self.check_prev_docstatus()
self.update_stock_ledger(update_stock = 1) self.update_stock_ledger(update_stock = 1)
self.set_sms_msg(1)
# update customer's last sales order no. # 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)) 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) get_obj('Sales Common').check_credit(self,self.doc.grand_total)
@ -373,7 +372,6 @@ class DocType(TransactionBase):
raise Exception raise Exception
self.check_nextdoc_docstatus() self.check_nextdoc_docstatus()
self.update_stock_ledger(update_stock = -1) self.update_stock_ledger(update_stock = -1)
self.set_sms_msg()
#update prevdoc status #update prevdoc status
self.update_prevdoc_status('cancel') self.update_prevdoc_status('cancel')
@ -405,75 +403,44 @@ class DocType(TransactionBase):
def check_modified_date(self): def check_modified_date(self):
mod_db = sql("select modified from `tabSales Order` where name = '%s'" % self.doc.name) 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))) date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))
if date_diff and date_diff[0][0]: if date_diff and date_diff[0][0]:
msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ") msgprint("%s: %s has been modified after you have opened. Please Refresh"
raise Exception % (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): def stop_sales_order(self):
self.check_modified_date() self.check_modified_date()
self.update_stock_ledger(update_stock = -1,clear = 1) self.update_stock_ledger(update_stock = -1,clear = 1)
# ::::::::: SET SO STATUS ::::::::::
set(self.doc, 'status', 'Stopped') 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): def unstop_sales_order(self):
self.check_modified_date() self.check_modified_date()
self.update_stock_ledger(update_stock = 1,clear = 1) self.update_stock_ledger(update_stock = 1,clear = 1)
# ::::::::: SET SO STATUS ::::::::::
set(self.doc, 'status', 'Submitted') 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): def update_stock_ledger(self, update_stock, clear = 0):
for d in self.get_item_list(clear): 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) if webnotes.conn.get_value("Item", d['item_code'], "is_stock_item") == "Yes":
# stock ledger will be updated only if it is a stock item
if stock_item and stock_item[0]['is_stock_item'] == "Yes":
if not d['reserved_warehouse']: if not d['reserved_warehouse']:
msgprint("Message: Please enter Reserved Warehouse for item %s as it is stock item."% d['item_code']) msgprint("""Please enter Reserved Warehouse for item %s
raise Exception as it is stock ite""" % d['item_code'], raise_exception=1)
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,\ args = {
doc_name=self.doc.name, is_amended = (self.doc.amended_from and 'Yes' or 'No')) "item_code": d['item_code'],
"reserved_qty": flt(update_stock) * flt(d['qty']),
# Gets Items from packing list "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): def get_item_list(self, clear):
return get_obj('Sales Common').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): def on_update(self):
pass pass

View File

@ -3,11 +3,11 @@
# These values are common in all dictionaries # These values are common in all dictionaries
{ {
'creation': '2012-04-20 14:02:53', u'creation': '2012-07-03 13:30:02',
'docstatus': 0, u'docstatus': 0,
'modified': '2012-05-22 14:11:21', u'modified': '2012-10-23 10:57:41',
'modified_by': u'Administrator', u'modified_by': u'Administrator',
'owner': u'Administrator' u'owner': u'Administrator'
}, },
# These values are common for all DocType # These values are common for all DocType
@ -18,12 +18,12 @@
'allow_print': 1, 'allow_print': 1,
'colour': u'White:FFF', 'colour': u'White:FFF',
'default_print_format': u'Standard', 'default_print_format': u'Standard',
'doctype': 'DocType', u'doctype': u'DocType',
'hide_toolbar': 0, 'hide_toolbar': 0,
'in_create': 1, 'in_create': 1,
'issingle': 1, 'issingle': 1,
'module': u'Setup', 'module': u'Setup',
'name': '__common__', u'name': u'__common__',
'read_only': 1, 'read_only': 1,
'section_style': u'Tabbed', 'section_style': u'Tabbed',
'server_code_error': u' ', 'server_code_error': u' ',
@ -33,8 +33,8 @@
# These values are common for all DocField # These values are common for all DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'name': '__common__', u'name': u'__common__',
'parent': u'Global Defaults', 'parent': u'Global Defaults',
'parentfield': u'fields', 'parentfield': u'fields',
'parenttype': u'DocType', 'parenttype': u'DocType',
@ -43,8 +43,8 @@
# These values are common for all DocPerm # These values are common for all DocPerm
{ {
'doctype': u'DocPerm', u'doctype': u'DocPerm',
'name': '__common__', u'name': u'__common__',
'parent': u'Global Defaults', 'parent': u'Global Defaults',
'parentfield': u'permissions', 'parentfield': u'permissions',
'parenttype': u'DocType', 'parenttype': u'DocType',
@ -53,57 +53,13 @@
# DocType, Global Defaults # DocType, Global Defaults
{ {
'doctype': 'DocType', u'doctype': u'DocType',
'name': u'Global Defaults' u'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
}, },
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'company', 'fieldname': u'company',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Company' 'label': u'Company'
@ -111,7 +67,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_company', 'fieldname': u'default_company',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Company', 'label': u'Default Company',
@ -121,7 +77,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'current_fiscal_year', 'fieldname': u'current_fiscal_year',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Current Fiscal Year', 'label': u'Current Fiscal Year',
@ -131,7 +87,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'date_format', 'fieldname': u'date_format',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Date Format', 'label': u'Date Format',
@ -140,7 +96,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break1', 'fieldname': u'column_break1',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'width': u'50%' 'width': u'50%'
@ -149,7 +105,7 @@
# DocField # DocField
{ {
'default': u'INR', 'default': u'INR',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_currency', 'fieldname': u'default_currency',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Default Currency', 'label': u'Default Currency',
@ -159,7 +115,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_currency_format', 'fieldname': u'default_currency_format',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Default Currency Format', 'label': u'Default Currency Format',
@ -168,7 +124,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_currency_fraction', 'fieldname': u'default_currency_fraction',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Default Currency Fraction' 'label': u'Default Currency Fraction'
@ -176,7 +132,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'stock', 'fieldname': u'stock',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Stock' 'label': u'Stock'
@ -184,7 +140,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break2', 'fieldname': u'column_break2',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'width': u'50%' 'width': u'50%'
@ -192,7 +148,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_item_group', 'fieldname': u'default_item_group',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Item Group', 'label': u'Default Item Group',
@ -201,7 +157,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'ighelp', 'fieldname': u'ighelp',
'fieldtype': u'HTML', 'fieldtype': u'HTML',
'label': u'IGHelp', 'label': u'IGHelp',
@ -210,27 +166,18 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_stock_uom', 'fieldname': u'default_stock_uom',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Stock UOM', 'label': u'Default Stock UOM',
'options': u'UOM' 'options': u'UOM'
}, },
# DocField
{
'doctype': u'DocField',
'fieldname': u'default_valuation_method',
'fieldtype': u'Select',
'label': u'Default Valuation Method',
'options': u'FIFO\nMoving Average'
},
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Applicable only if valuation method is moving average', 'description': u'Applicable only if valuation method is moving average',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'allow_negative_stock', 'fieldname': u'allow_negative_stock',
'fieldtype': u'Check', 'fieldtype': u'Check',
'label': u'Allow Negative Stock' 'label': u'Allow Negative Stock'
@ -238,7 +185,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_warehouse_type', 'fieldname': u'default_warehouse_type',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Warehouse Type', 'label': u'Default Warehouse Type',
@ -247,7 +194,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'auto_indent', 'fieldname': u'auto_indent',
'fieldtype': u'Check', 'fieldtype': u'Check',
'label': u'Raise Purchase Request when stock reaches re-order level' 'label': u'Raise Purchase Request when stock reaches re-order level'
@ -256,7 +203,7 @@
# DocField # DocField
{ {
'default': u'1', 'default': u'1',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break3', 'fieldname': u'column_break3',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'width': u'50%' 'width': u'50%'
@ -266,7 +213,7 @@
{ {
'colour': u'White:FFF', '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>', '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', 'fieldname': u'tolerance',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Allowance Percent' 'label': u'Allowance Percent'
@ -276,7 +223,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Stock level frozen up to this date, nobody can do / modify entry except authorized person', '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', 'fieldname': u'stock_frozen_upto',
'fieldtype': u'Date', 'fieldtype': u'Date',
'label': u'Stock Frozen Upto' 'label': u'Stock Frozen Upto'
@ -286,7 +233,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Users with this role are allowed to do / modify stock entry before frozen date', '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', 'fieldname': u'stock_auth_role',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Authorized Role (Frozen Entry)', 'label': u'Authorized Role (Frozen Entry)',
@ -295,7 +242,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'accounts', 'fieldname': u'accounts',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Accounts' 'label': u'Accounts'
@ -305,7 +252,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Accounting entry frozen up to this date, nobody can do / modify entry except authorized person', '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', 'fieldname': u'acc_frozen_upto',
'fieldtype': u'Date', 'fieldtype': u'Date',
'label': u'Accounts Frozen Upto' 'label': u'Accounts Frozen Upto'
@ -315,7 +262,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Users with this role are allowed to do / modify accounting entry before frozen date', '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', 'fieldname': u'bde_auth_role',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Authourized Role (Frozen Entry)', 'label': u'Authourized Role (Frozen Entry)',
@ -324,7 +271,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'credit_controller', 'fieldname': u'credit_controller',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Credit Controller', 'label': u'Credit Controller',
@ -333,14 +280,14 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break4', 'fieldname': u'column_break4',
'fieldtype': u'Column Break' 'fieldtype': u'Column Break'
}, },
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'account_info', 'fieldname': u'account_info',
'fieldtype': u'HTML', 'fieldtype': u'HTML',
'label': u'Account Info', 'label': u'Account Info',
@ -349,7 +296,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'selling', 'fieldname': u'selling',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Selling' 'label': u'Selling'
@ -359,7 +306,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'Customer Name', 'default': u'Customer Name',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'cust_master_name', 'fieldname': u'cust_master_name',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Customer Master created by ', 'label': u'Customer Master created by ',
@ -368,7 +315,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_customer_group', 'fieldname': u'default_customer_group',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Customer Group', 'label': u'Default Customer Group',
@ -377,7 +324,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'cghelp', 'fieldname': u'cghelp',
'fieldtype': u'HTML', 'fieldtype': u'HTML',
'label': u'CGHelp', 'label': u'CGHelp',
@ -386,7 +333,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_territory', 'fieldname': u'default_territory',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Territory', 'label': u'Default Territory',
@ -395,7 +342,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'territoryhelp', 'fieldname': u'territoryhelp',
'fieldtype': u'HTML', 'fieldtype': u'HTML',
'label': u'TerritoryHelp', 'label': u'TerritoryHelp',
@ -404,7 +351,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break5', 'fieldname': u'column_break5',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'width': u'50%' 'width': u'50%'
@ -412,7 +359,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_price_list', 'fieldname': u'default_price_list',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Price List', 'label': u'Default Price List',
@ -421,7 +368,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_price_list_currency', 'fieldname': u'default_price_list_currency',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Price List Currency', 'label': u'Default Price List Currency',
@ -432,7 +379,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'so_required', 'fieldname': u'so_required',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Sales Order Required', 'label': u'Sales Order Required',
@ -443,7 +390,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'dn_required', 'fieldname': u'dn_required',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Delivery Note Required', 'label': u'Delivery Note Required',
@ -452,7 +399,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'buying', 'fieldname': u'buying',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Buying' 'label': u'Buying'
@ -460,7 +407,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_supplier_type', 'fieldname': u'default_supplier_type',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Supplier Type', 'label': u'Default Supplier Type',
@ -471,7 +418,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'Supplier Name', 'default': u'Supplier Name',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'supp_master_name', 'fieldname': u'supp_master_name',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Supplier Master created by ', 'label': u'Supplier Master created by ',
@ -480,7 +427,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break6', 'fieldname': u'column_break6',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'width': u'50%' 'width': u'50%'
@ -490,7 +437,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'po_required', 'fieldname': u'po_required',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Purchase Order Required', 'label': u'Purchase Order Required',
@ -501,7 +448,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'pr_required', 'fieldname': u'pr_required',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Purchase Receipt Required', 'label': u'Purchase Receipt Required',
@ -510,7 +457,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'maintain_same_rate', 'fieldname': u'maintain_same_rate',
'fieldtype': u'Check', 'fieldtype': u'Check',
'label': u'Maintain same rate throughout purchase cycle' 'label': u'Maintain same rate throughout purchase cycle'
@ -518,7 +465,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'hr', 'fieldname': u'hr',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'HR', 'label': u'HR',
@ -529,7 +476,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Employee record is created using selected field. ', 'description': u'Employee record is created using selected field. ',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'emp_created_by', 'fieldname': u'emp_created_by',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Employee Records to be created by ', 'label': u'Employee Records to be created by ',
@ -538,7 +485,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'system', 'fieldname': u'system',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'System' 'label': u'System'
@ -546,9 +493,53 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'sms_sender_name', 'fieldname': u'sms_sender_name',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'SMS Sender Name' '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
} }
] ]

View File

@ -23,47 +23,45 @@ from webnotes.model import db_exists
from webnotes.model.doc import Document, addchild, getchildren, make_autoname from webnotes.model.doc import Document, addchild, getchildren, make_autoname
from webnotes.model.doclist import getlist, copy_doclist 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.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
from webnotes import session, form, msgprint, errprint from webnotes import msgprint, errprint
set = webnotes.conn.set
sql = webnotes.conn.sql sql = webnotes.conn.sql
get_value = webnotes.conn.get_value
# -----------------------------------------------------------------------------------------
class DocType: class DocType:
def __init__(self, doc, doclist=[]): def __init__(self, doc, doclist=[]):
self.doc = doc self.doc = doc
self.doclist = doclist 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 # check actual qty with total number of serial no
if serial_no: if args.get("serial_no"):
self.check_qty_with_serial_no() self.check_qty_with_serial_no()
# update valuation and qty after transaction for post dated entry # 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): def check_qty_with_serial_no(self):
""" """
@ -327,7 +325,7 @@ class DocType:
def reorder_item(self,doc_type,doc_name): def reorder_item(self,doc_type,doc_name):
""" Reorder item if stock reaches reorder level""" """ 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 #check if re-order is required
ret = sql("""select re_order_level, item_name, description, brand, item_group, ret = sql("""select re_order_level, item_name, description, brand, item_group,
lead_time_days, min_order_qty, email_notify, re_order_qty lead_time_days, min_order_qty, email_notify, re_order_qty
@ -371,7 +369,7 @@ class DocType:
indent_details_child.save() indent_details_child.save()
indent_obj = get_obj('Purchase Request',indent.name,with_children=1) indent_obj = get_obj('Purchase Request',indent.name,with_children=1)
indent_obj.validate() indent_obj.validate()
set(indent_obj.doc,'docstatus',1) webnotes.conn.set(indent_obj.doc,'docstatus',1)
indent_obj.on_submit() indent_obj.on_submit()
msgprint("""Item: %s is to be re-ordered. Purchase Request %s raised. msgprint("""Item: %s is to be re-ordered. Purchase Request %s raised.
It was generated from %s %s""" % It was generated from %s %s""" %

View File

@ -244,7 +244,7 @@ class DocType(TransactionBase):
def on_submit(self): def on_submit(self):
self.validate_packed_qty() 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 # Check for Approving Authority
get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self) 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): def update_stock_ledger(self, update_stock, is_stopped = 0):
self.values = [] self.values = []
for d in self.get_item_list(is_stopped): 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 webnotes.conn.get_value("Item", d['item_code'], "is_stock_item") == "Yes":
if stock_item[0]['is_stock_item'] == "Yes":
if not d['warehouse']: if not d['warehouse']:
msgprint("Message: Please enter Warehouse for item %s as it is stock item."% d['item_code']) msgprint("Please enter Warehouse for item %s as it is stock item"
raise Exception % d['item_code'], raise_exception=1)
if d['reserved_qty'] < 0 : if d['reserved_qty'] < 0 :
# Reduce reserved qty from reserved warehouse mentioned in so # 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']), \ args = {
0, 0, 0, d['item_code'], self.doc.transaction_date,doc_type=self.doc.doctype, \ "item_code": d['item_code'],
doc_name=self.doc.name, is_amended = (self.doc.amended_from and 'Yes' or 'No')) "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 # Reduce actual qty from warehouse
self.make_sl_entry(d, d['warehouse'], - flt(d['qty']) , 0, update_stock) 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): def credit_limit(self):
"""check credit limit of items in DN Detail which are not fetched from sales order""" """check credit limit of items in DN Detail which are not fetched from sales order"""
amount, total = 0, 0 amount, total = 0, 0
@ -407,5 +404,4 @@ class DocType(TransactionBase):
self.doclist = get_obj('Sales Common').make_packing_list(self,'delivery_note_details') self.doclist = get_obj('Sales Common').make_packing_list(self,'delivery_note_details')
sl = get_obj('Stock Ledger') sl = get_obj('Stock Ledger')
sl.scrub_serial_nos(self) sl.scrub_serial_nos(self)
sl.scrub_serial_nos(self, 'packing_details') sl.scrub_serial_nos(self, 'packing_details')

View File

@ -3,11 +3,11 @@
# These values are common in all dictionaries # These values are common in all dictionaries
{ {
'creation': '2012-07-03 13:30:46', u'creation': '2012-07-12 22:19:45',
'docstatus': 0, u'docstatus': 0,
'modified': '2012-07-11 09:57:42', u'modified': '2012-10-23 11:02:09',
'modified_by': u'Administrator', u'modified_by': u'Administrator',
'owner': u'Administrator' u'owner': u'Administrator'
}, },
# These values are common for all DocType # These values are common for all DocType
@ -18,11 +18,11 @@
'autoname': u'field:item_code', 'autoname': u'field:item_code',
'colour': u'White:FFF', 'colour': u'White:FFF',
'default_print_format': u'Standard', 'default_print_format': u'Standard',
'doctype': 'DocType', u'doctype': u'DocType',
'document_type': u'Master', 'document_type': u'Master',
'max_attachments': 1, 'max_attachments': 1,
'module': u'Stock', 'module': u'Stock',
'name': '__common__', u'name': u'__common__',
'search_fields': u'item_name,description,item_group,customer_code', 'search_fields': u'item_name,description,item_group,customer_code',
'section_style': u'Tray', 'section_style': u'Tray',
'server_code_error': u' ', 'server_code_error': u' ',
@ -34,8 +34,8 @@
# These values are common for all DocField # These values are common for all DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'name': '__common__', u'name': u'__common__',
'parent': u'Item', 'parent': u'Item',
'parentfield': u'fields', 'parentfield': u'fields',
'parenttype': u'DocType' 'parenttype': u'DocType'
@ -43,8 +43,8 @@
# These values are common for all DocPerm # These values are common for all DocPerm
{ {
'doctype': u'DocPerm', u'doctype': u'DocPerm',
'name': '__common__', u'name': u'__common__',
'parent': u'Item', 'parent': u'Item',
'parentfield': u'permissions', 'parentfield': u'permissions',
'parenttype': u'DocType', 'parenttype': u'DocType',
@ -53,97 +53,13 @@
# DocType, Item # DocType, Item
{ {
'doctype': 'DocType', u'doctype': u'DocType',
'name': u'Item' u'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
}, },
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item', 'fieldname': u'item',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Item', 'label': u'Item',
@ -154,7 +70,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'trash_reason', 'fieldname': u'trash_reason',
'fieldtype': u'Small Text', 'fieldtype': u'Small Text',
'label': u'Trash Reason', 'label': u'Trash Reason',
@ -167,7 +83,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Item will be saved by this name in the data base.', 'description': u'Item will be saved by this name in the data base.',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item_code', 'fieldname': u'item_code',
'fieldtype': u'Data', 'fieldtype': u'Data',
'in_filter': 0, 'in_filter': 0,
@ -181,7 +97,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item_name', 'fieldname': u'item_name',
'fieldtype': u'Data', 'fieldtype': u'Data',
'in_filter': 1, 'in_filter': 1,
@ -197,7 +113,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'<a href="#!Sales Browser/Item Group">Manage Item Groups</a>', 'description': u'<a href="#!Sales Browser/Item Group">Manage Item Groups</a>',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item_group', 'fieldname': u'item_group',
'fieldtype': u'Link', 'fieldtype': u'Link',
'in_filter': 1, 'in_filter': 1,
@ -211,7 +127,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'brand', 'fieldname': u'brand',
'fieldtype': u'Link', 'fieldtype': u'Link',
'hidden': 0, 'hidden': 0,
@ -226,7 +142,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'barcode', 'fieldname': u'barcode',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Barcode', 'label': u'Barcode',
@ -235,7 +151,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break0', 'fieldname': u'column_break0',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'permlevel': 0 'permlevel': 0
@ -243,7 +159,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'description', 'fieldname': u'description',
'fieldtype': u'Text', 'fieldtype': u'Text',
'in_filter': 0, 'in_filter': 0,
@ -258,7 +174,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'description_html', 'fieldname': u'description_html',
'fieldtype': u'Text', 'fieldtype': u'Text',
'label': u'Description HTML', 'label': u'Description HTML',
@ -269,7 +185,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Generates HTML to include image (1st attachment) in the description', 'description': u'Generates HTML to include image (1st attachment) in the description',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'add_image', 'fieldname': u'add_image',
'fieldtype': u'Button', 'fieldtype': u'Button',
'label': u'Add Image', 'label': u'Add Image',
@ -278,7 +194,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'inventory', 'fieldname': u'inventory',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Inventory', 'label': u'Inventory',
@ -290,7 +206,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Enter unit of measurement in which stock of this item is maintained in your warehouse.', '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', 'fieldname': u'stock_uom',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default UoM', 'label': u'Default UoM',
@ -306,7 +222,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'Yes', 'default': u'Yes',
'description': u'Select "Yes" if you are maintaining stock of this item in your Inventory.', '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', 'fieldname': u'is_stock_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Is Stock Item', 'label': u'Is Stock Item',
@ -319,19 +235,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'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',
'fieldname': u'default_warehouse', 'fieldname': u'default_warehouse',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Warehouse', 'label': u'Default Warehouse',
@ -345,7 +249,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Percentage variation in quantity to be allowed while receiving or delivering this item.', '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', 'fieldname': u'tolerance',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Allowance Percent', 'label': u'Allowance Percent',
@ -358,7 +262,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'The system will generate auto indent when stock reaches re-order level.', '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', 'fieldname': u're_order_level',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Re-Order Level', 'label': u'Re-Order Level',
@ -371,7 +275,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'The system will create auto indent of re-order quantity when stock reaches re-order level', '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', 'fieldname': u're_order_qty',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Re-Order Qty', 'label': u'Re-Order Qty',
@ -380,7 +284,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'email_notify', 'fieldname': u'email_notify',
'fieldtype': u'Check', 'fieldtype': u'Check',
'label': u'Send Email Notification when stock reaches re-order level', 'label': u'Send Email Notification when stock reaches re-order level',
@ -392,7 +296,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'0.00', 'default': u'0.00',
'description': u'You can enter the minimum quantity of this item to be ordered.', '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', 'fieldname': u'min_order_qty',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'hidden': 0, 'hidden': 0,
@ -404,7 +308,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break1', 'fieldname': u'column_break1',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'oldfieldtype': u'Column Break', 'oldfieldtype': u'Column Break',
@ -417,7 +321,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'description': u'Select "Yes" if this item is used for some internal purpose in your company.', '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', 'fieldname': u'is_asset_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Is Asset Item', 'label': u'Is Asset Item',
@ -432,7 +336,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'has_batch_no', 'fieldname': u'has_batch_no',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Has Batch No', 'label': u'Has Batch No',
@ -448,7 +352,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', '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.', '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', 'fieldname': u'has_serial_no',
'fieldtype': u'Select', 'fieldtype': u'Select',
'in_filter': 1, 'in_filter': 1,
@ -462,7 +366,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'warranty_period', 'fieldname': u'warranty_period',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Warranty Period (in days)', 'label': u'Warranty Period (in days)',
@ -473,7 +377,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'end_of_life', 'fieldname': u'end_of_life',
'fieldtype': u'Date', 'fieldtype': u'Date',
'label': u'End of Life', 'label': u'End of Life',
@ -485,7 +389,7 @@
# DocField # DocField
{ {
'description': u'Net Weight of each Item', 'description': u'Net Weight of each Item',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'net_weight', 'fieldname': u'net_weight',
'fieldtype': u'Float', 'fieldtype': u'Float',
'label': u'Net Weight', 'label': u'Net Weight',
@ -494,7 +398,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'weight_uom', 'fieldname': u'weight_uom',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Weight UOM', 'label': u'Weight UOM',
@ -505,7 +409,7 @@
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'purchase_details', 'fieldname': u'purchase_details',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Purchase Details', 'label': u'Purchase Details',
@ -518,7 +422,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'Yes', 'default': u'Yes',
'description': u'Selecting "Yes" will allow this item to appear in Purchase Order , Purchase Receipt.', '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', 'fieldname': u'is_purchase_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Is Purchase Item', 'label': u'Is Purchase Item',
@ -533,7 +437,7 @@
{ {
'colour': u'White:FFF', '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.', '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', 'fieldname': u'lead_time_days',
'fieldtype': u'Int', 'fieldtype': u'Int',
'label': u'Lead Time Days', 'label': u'Lead Time Days',
@ -547,7 +451,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Default Purchase Account in which cost of the item will be debited.', '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', 'fieldname': u'purchase_account',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Expense Account', 'label': u'Default Expense Account',
@ -562,7 +466,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'Default Cost Center for tracking expense for this item.', 'description': u'Default Cost Center for tracking expense for this item.',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'cost_center', 'fieldname': u'cost_center',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Cost Center', 'label': u'Default Cost Center',
@ -576,7 +480,7 @@
{ {
'colour': u'White:FFF', '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.', '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', 'fieldname': u'buying_cost',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Buying Cost', 'label': u'Buying Cost',
@ -589,7 +493,7 @@
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'last_purchase_rate', 'fieldname': u'last_purchase_rate',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Last Purchase Rate', 'label': u'Last Purchase Rate',
@ -601,7 +505,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'standard_rate', 'fieldname': u'standard_rate',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Standard Rate', 'label': u'Standard Rate',
@ -612,7 +516,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break2', 'fieldname': u'column_break2',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'oldfieldtype': u'Column Break', 'oldfieldtype': u'Column Break',
@ -622,7 +526,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'uom_conversion_details', 'fieldname': u'uom_conversion_details',
'fieldtype': u'Table', 'fieldtype': u'Table',
'label': u'UOM Conversion Details', 'label': u'UOM Conversion Details',
@ -634,7 +538,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'manufacturer', 'fieldname': u'manufacturer',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Manufacturer', 'label': u'Manufacturer',
@ -643,7 +547,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'manufacturer_part_no', 'fieldname': u'manufacturer_part_no',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Manufacturer Part Number', 'label': u'Manufacturer Part Number',
@ -652,7 +556,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item_supplier_details', 'fieldname': u'item_supplier_details',
'fieldtype': u'Table', 'fieldtype': u'Table',
'label': u'Item Supplier Details', 'label': u'Item Supplier Details',
@ -662,7 +566,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'sales_details', 'fieldname': u'sales_details',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Sales Details', 'label': u'Sales Details',
@ -675,7 +579,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'Yes', 'default': u'Yes',
'description': u'Selecting "Yes" will allow this item to figure in Sales Order, Delivery Note', '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', 'fieldname': u'is_sales_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'in_filter': 1, 'in_filter': 1,
@ -692,7 +596,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'description': u'Select "Yes" if this item represents some work like training, designing, consulting etc.', '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', 'fieldname': u'is_service_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'in_filter': 1, 'in_filter': 1,
@ -709,7 +613,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', '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.', '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', 'fieldname': u'is_sample_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Allow Samples', 'label': u'Allow Samples',
@ -722,7 +626,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'max_discount', 'fieldname': u'max_discount',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Max Discount (%)', 'label': u'Max Discount (%)',
@ -733,7 +637,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_income_account', 'fieldname': u'default_income_account',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default Income Account', 'label': u'Default Income Account',
@ -743,7 +647,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_sales_cost_center', 'fieldname': u'default_sales_cost_center',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Cost Center', 'label': u'Cost Center',
@ -753,7 +657,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'sales_rate', 'fieldname': u'sales_rate',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'hidden': 1, 'hidden': 1,
@ -765,7 +669,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break3', 'fieldname': u'column_break3',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'oldfieldtype': u'Column Break', 'oldfieldtype': u'Column Break',
@ -777,7 +681,7 @@
{ {
'colour': u'White:FFF', '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.', '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', 'fieldname': u'ref_rate_details',
'fieldtype': u'Table', 'fieldtype': u'Table',
'label': u'Item Prices', 'label': u'Item Prices',
@ -790,7 +694,7 @@
# DocField # DocField
{ {
'description': u'For the convenience of customers, these codes can be used in print formats like Invoices and Delivery Notes', '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', 'fieldname': u'item_customer_details',
'fieldtype': u'Table', 'fieldtype': u'Table',
'label': u'Customer Codes', 'label': u'Customer Codes',
@ -800,7 +704,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item_tax_section_break', 'fieldname': u'item_tax_section_break',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Item Tax', 'label': u'Item Tax',
@ -810,7 +714,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item_tax', 'fieldname': u'item_tax',
'fieldtype': u'Table', 'fieldtype': u'Table',
'label': u'Item Tax1', 'label': u'Item Tax1',
@ -822,7 +726,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'inspection_criteria', 'fieldname': u'inspection_criteria',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Inspection Criteria', 'label': u'Inspection Criteria',
@ -833,7 +737,7 @@
# DocField # DocField
{ {
'default': u'No', 'default': u'No',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'inspection_required', 'fieldname': u'inspection_required',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Inspection Required', 'label': u'Inspection Required',
@ -847,7 +751,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'item_specification_details', 'fieldname': u'item_specification_details',
'fieldtype': u'Table', 'fieldtype': u'Table',
'label': u'Item Quality Inspection Parameter', 'label': u'Item Quality Inspection Parameter',
@ -859,7 +763,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'manufacturing', 'fieldname': u'manufacturing',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Manufacturing', 'label': u'Manufacturing',
@ -872,7 +776,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', '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.', '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', 'fieldname': u'is_manufactured_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Allow Bill of Materials', 'label': u'Allow Bill of Materials',
@ -886,7 +790,7 @@
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'default_bom', 'fieldname': u'default_bom',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Default BOM', 'label': u'Default BOM',
@ -902,7 +806,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'description': u'Selecting "Yes" will allow you to make a Production Order for this item.', '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', 'fieldname': u'is_pro_applicable',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Allow Production Order', 'label': u'Allow Production Order',
@ -918,7 +822,7 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default': u'No', 'default': u'No',
'description': u'Select "Yes" if you supply raw materials to your supplier to manufacture this item.', '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', 'fieldname': u'is_sub_contracted_item',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Is Sub Contracted Item', 'label': u'Is Sub Contracted Item',
@ -931,7 +835,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'file_list', 'fieldname': u'file_list',
'fieldtype': u'Text', 'fieldtype': u'Text',
'hidden': 1, 'hidden': 1,
@ -943,7 +847,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'customer_code', 'fieldname': u'customer_code',
'fieldtype': u'Data', 'fieldtype': u'Data',
'hidden': 1, 'hidden': 1,
@ -956,7 +860,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'website_section', 'fieldname': u'website_section',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Website', 'label': u'Website',
@ -965,7 +869,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'show_in_website', 'fieldname': u'show_in_website',
'fieldtype': u'Check', 'fieldtype': u'Check',
'label': u'Show in Website', 'label': u'Show in Website',
@ -976,7 +880,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'website page link', 'description': u'website page link',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'page_name', 'fieldname': u'page_name',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Page Name', 'label': u'Page Name',
@ -985,7 +889,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'website_image', 'fieldname': u'website_image',
'fieldtype': u'Select', 'fieldtype': u'Select',
'label': u'Image', 'label': u'Image',
@ -995,7 +899,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'web_short_description', 'fieldname': u'web_short_description',
'fieldtype': u'Text', 'fieldtype': u'Text',
'label': u'Short Description', 'label': u'Short Description',
@ -1004,11 +908,95 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'web_long_description', 'fieldname': u'web_long_description',
'fieldtype': u'Code', 'fieldtype': u'Code',
'label': u'Long Description', 'label': u'Long Description',
'options': u'Markdown', 'options': u'Markdown',
'permlevel': 0 '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
} }
] ]

View File

@ -218,16 +218,17 @@ class DocType(TransactionBase):
pc_obj = get_obj('Purchase Common') pc_obj = get_obj('Purchase Common')
self.values = [] self.values = []
for d in getlist(self.doclist, 'purchase_receipt_details'): for d in getlist(self.doclist, 'purchase_receipt_details'):
# Check if is_stock_item == 'Yes' if webnotes.conn.get_value("Item", d.item_code, "is_stock_item") == "Yes":
if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes':
ord_qty = 0 ord_qty = 0
pr_qty = flt(d.qty) * flt(d.conversion_factor) pr_qty = flt(d.qty) * flt(d.conversion_factor)
# Check If Prevdoc Doctype is Purchase Order
if cstr(d.prevdoc_doctype) == 'Purchase Order': if cstr(d.prevdoc_doctype) == 'Purchase Order':
# get qty and pending_qty of prevdoc # 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) curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname',
max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0 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): if flt(qty) + flt(pr_qty) > flt(max_qty):
curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor) curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor)
@ -235,11 +236,18 @@ class DocType(TransactionBase):
curr_qty = flt(pr_qty) curr_qty = flt(pr_qty)
ord_qty = -flt(curr_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 # UPDATE actual qty to warehouse by pr_qty
self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit) self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit)
# UPDATE actual to rejected warehouse by rejected qty # UPDATE actual to rejected warehouse by rejected qty
if flt(d.rejected_qty) > 0: 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) self.make_sl_entry(d, self.doc.rejected_warehouse, flt(d.rejected_qty) * flt(d.conversion_factor), d.valuation_rate, is_submit, rejected = 1)

View File

@ -73,8 +73,10 @@ class DocType(TransactionBase):
self.validate_item() self.validate_item()
def on_update(self): def on_update(self):
if self.doc.warehouse and self.doc.status == 'In Store' and cint(self.doc.sle_exists) == 0 and \ if self.doc.warehouse and self.doc.status == 'In Store' \
not sql("select name from `tabStock Ledger Entry` where serial_no = %s and ifnull(is_cancelled, 'No') = 'No'", self.doc.name): 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) self.make_stock_ledger_entry(1)
webnotes.conn.set(self.doc, 'sle_exists', 1) webnotes.conn.set(self.doc, 'sle_exists', 1)

View File

@ -440,18 +440,30 @@ class DocType(TransactionBase):
if self.doc.production_order: if self.doc.production_order:
pro_obj = get_obj("Production Order", self.doc.production_order) pro_obj = get_obj("Production Order", self.doc.production_order)
if flt(pro_obj.doc.docstatus) != 1: 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)) msgprint("""You cannot do any transaction against
raise Exception Production Order : %s, as it's not submitted"""
% (pro_obj.doc.name), raise_exception=1)
if pro_obj.doc.status == 'Stopped': 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)) msgprint("""You cannot do any transaction against Production Order : %s,
raise Exception 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): 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)) msgprint("""Posting Date of Stock Entry cannot be before Posting Date of
raise Exception Production Order: %s"""% cstr(self.doc.production_order), raise_exception=1)
if self.doc.process == 'Backflush': 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) pro_obj.doc.produced_qty = flt(pro_obj.doc.produced_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()) (is_submit and 1 or -1 ) * flt(self.doc.fg_completed_qty)
pro_obj.doc.status = (flt(pro_obj.doc.qty) == flt(pro_obj.doc.produced_qty)) and 'Completed' or 'In Process' 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() pro_obj.doc.save()

View File

@ -230,8 +230,12 @@ class DocType:
if v["actual_qty"]: if v["actual_qty"]:
sle_id = self.make_entry(v) sle_id = self.make_entry(v)
get_obj('Warehouse', v["warehouse"]).update_bin(flt(v["actual_qty"]), 0, 0, 0, 0, v["item_code"], \ args = v.copy()
v["posting_date"], sle_id, v["posting_time"], '', v["is_cancelled"],v["voucher_type"],v["voucher_no"], is_amended) args.update({
"sle_id": sle_id,
"is_amended": is_amended
})
get_obj('Warehouse', v["warehouse"]).update_bin(args)
def make_entry(self, args): def make_entry(self, args):

View File

@ -16,4 +16,16 @@
cur_frm.cscript.refresh = function(doc) { cur_frm.cscript.refresh = function(doc) {
cur_frm.toggle_display('warehouse_name', doc.__islocal); 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', '', '');
}
} }

View File

@ -18,106 +18,186 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes 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.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 import db_exists from webnotes.model.doc import Document, addchild, getchildren
from webnotes.model.doc import Document, addchild, getchildren, make_autoname from webnotes.model.doclist import getlist
from webnotes.model.doclist import getlist, copy_doclist from webnotes.model.code import get_obj
from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax from webnotes import msgprint, errprint
from webnotes import session, form, msgprint, errprint
set = webnotes.conn.set
sql = webnotes.conn.sql 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: class DocType:
def __init__(self, doc, doclist=[]): def __init__(self, doc, doclist=[]):
self.doc = doc self.doc = doc
self.doclist = doclist 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 \ 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 '' bin = bin and bin[0][0] or ''
if not bin: 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 = Document('Bin')
bin.item_code = item_code bin.item_code = item_code
bin.stock_uom = get_value('Item', item_code, 'stock_uom') bin.stock_uom = webnotes.conn.get_value('Item', item_code, 'stock_uom')
bin.warehouse = self.doc.name bin.warehouse = warehouse
bin.warehouse_type = self.doc.warehouse_type bin.warehouse_type = webnotes.conn.get_value("Warehouse", warehouse, "warehouse_type")
bin_obj = get_obj(doc=bin) bin_obj = get_obj(doc=bin)
bin_obj.validate() bin_obj.validate()
bin.save(1) bin.save(1)
bin = bin.name bin = bin.name
else: else:
bin_obj = get_obj('Bin',bin) bin_obj = get_obj('Bin', bin)
return bin_obj return bin_obj
def validate_asset(self, item_code): 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': if webnotes.conn.get_value("Item", item_code, "is_asset_item") == 'Yes' \
msgprint("Fixed Asset Item %s can only be transacted in a Fixed Asset type Warehouse" % item_code) and self.doc.warehouse_type != 'Fixed Asset':
raise Exception msgprint("""Fixed Asset Item %s can only be transacted in a
Fixed Asset type Warehouse""" % item_code, raise_exception=1)
def update_bin(self, args):
# update bin self.validate_asset(args.get("item_code"))
# ---------- is_stock_item = webnotes.conn.get_value('Item', args.get("item_code"), 'is_stock_item')
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'): if is_stock_item == 'Yes':
self.validate_asset(item_code) bin = self.get_bin(args.get("item_code"))
it_det = get_value('Item', item_code, 'is_stock_item') bin.update_stock(args)
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)
return bin return bin
else: else:
msgprint("[Stock Update] Ignored %s since it is not a stock item" % item_code) msgprint("[Stock Update] Ignored %s since it is not a stock item"
% args.get("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")
def check_state(self): 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): def validate(self):
if self.doc.email_id: if self.doc.email_id and not validate_email_add(self.doc.email_id):
if not validate_email_add(self.doc.email_id): msgprint("Please enter valid Email Id", raise_exception=1)
msgprint("Please enter valid Email Id.")
raise Exception
if not self.doc.warehouse_type: if not self.doc.warehouse_type:
msgprint("[Warehouse Type is Mandatory] Please Enter Please Entry warehouse type in Warehouse " + self.doc.name) msgprint("Warehouse Type is Mandatory", raise_exception=1)
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.")
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): def on_trash(self):
# delete bin # delete bin
bins = sql("select * from `tabBin` where warehouse = %s", self.doc.name, as_dict=1) bins = sql("select * from `tabBin` where warehouse = %s", self.doc.name, as_dict=1)
for d in bins: 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']: if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
msgprint("Warehouse: %s can not be deleted as qty exists for item: %s" % (self.doc.name, d['item_code']), raise_exception=1) 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: else:
sql("delete from `tabBin` where name = %s", d['name']) sql("delete from `tabBin` where name = %s", d['name'])
# delete cancelled sle # delete cancelled sle
if sql("select name from `tabStock Ledger Entry` where warehouse = %s and ifnull('is_cancelled', '') = 'No'", self.doc.name): if sql("""select name from `tabStock Ledger Entry`
mdgprint("Warehosue can not be deleted as stock ledger entry exists for this warehosue.", raise_exception=1) 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: 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)

View File

@ -3,11 +3,11 @@
# These values are common in all dictionaries # These values are common in all dictionaries
{ {
'creation': '2012-07-03 13:30:45', u'creation': '2012-10-10 12:07:10',
'docstatus': 0, u'docstatus': 0,
'modified': '2012-07-11 10:18:07', u'modified': '2012-10-25 15:03:49',
'modified_by': u'Administrator', u'modified_by': u'Administrator',
'owner': u'Administrator' u'owner': u'Administrator'
}, },
# These values are common for all DocType # These values are common for all DocType
@ -18,10 +18,10 @@
'colour': u'White:FFF', 'colour': u'White:FFF',
'default_print_format': u'Standard', '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', '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', 'document_type': u'Master',
'module': u'Stock', 'module': u'Stock',
'name': '__common__', u'name': u'__common__',
'search_fields': u'warehouse_type', 'search_fields': u'warehouse_type',
'section_style': u'Tabbed', 'section_style': u'Tabbed',
'server_code_error': u' ', 'server_code_error': u' ',
@ -31,8 +31,8 @@
# These values are common for all DocField # These values are common for all DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'name': '__common__', u'name': u'__common__',
'parent': u'Warehouse', 'parent': u'Warehouse',
'parentfield': u'fields', 'parentfield': u'fields',
'parenttype': u'DocType' 'parenttype': u'DocType'
@ -40,8 +40,8 @@
# These values are common for all DocPerm # These values are common for all DocPerm
{ {
'doctype': u'DocPerm', u'doctype': u'DocPerm',
'name': '__common__', u'name': u'__common__',
'parent': u'Warehouse', 'parent': u'Warehouse',
'parentfield': u'permissions', 'parentfield': u'permissions',
'parenttype': u'DocType', 'parenttype': u'DocType',
@ -50,130 +50,13 @@
# DocType, Warehouse # DocType, Warehouse
{ {
'doctype': 'DocType', u'doctype': u'DocType',
'name': u'Warehouse' u'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
}, },
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'warehouse_detail', 'fieldname': u'warehouse_detail',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Warehouse Detail', 'label': u'Warehouse Detail',
@ -183,7 +66,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'warehouse_name', 'fieldname': u'warehouse_name',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Warehouse Name', 'label': u'Warehouse Name',
@ -196,7 +79,7 @@
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'warehouse_type', 'fieldname': u'warehouse_type',
'fieldtype': u'Link', 'fieldtype': u'Link',
'label': u'Warehouse Type', 'label': u'Warehouse Type',
@ -210,7 +93,7 @@
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'company', 'fieldname': u'company',
'fieldtype': u'Link', 'fieldtype': u'Link',
'in_filter': 1, 'in_filter': 1,
@ -226,7 +109,7 @@
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'For Reference Only.', 'description': u'For Reference Only.',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'warehouse_contact_info', 'fieldname': u'warehouse_contact_info',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Warehouse Contact Info', 'label': u'Warehouse Contact Info',
@ -235,7 +118,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'email_id', 'fieldname': u'email_id',
'fieldtype': u'Data', 'fieldtype': u'Data',
'hidden': 1, 'hidden': 1,
@ -248,7 +131,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'phone_no', 'fieldname': u'phone_no',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Phone No', 'label': u'Phone No',
@ -260,7 +143,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'mobile_no', 'fieldname': u'mobile_no',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Mobile No', 'label': u'Mobile No',
@ -272,7 +155,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'column_break0', 'fieldname': u'column_break0',
'fieldtype': u'Column Break', 'fieldtype': u'Column Break',
'oldfieldtype': u'Column Break', 'oldfieldtype': u'Column Break',
@ -281,7 +164,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'address_line_1', 'fieldname': u'address_line_1',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Address Line 1', 'label': u'Address Line 1',
@ -292,7 +175,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'address_line_2', 'fieldname': u'address_line_2',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'Address Line 2', 'label': u'Address Line 2',
@ -303,7 +186,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'city', 'fieldname': u'city',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'City', 'label': u'City',
@ -316,7 +199,7 @@
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'state', 'fieldname': u'state',
'fieldtype': u'Data', 'fieldtype': u'Data',
'label': u'State', 'label': u'State',
@ -328,7 +211,7 @@
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'pin', 'fieldname': u'pin',
'fieldtype': u'Int', 'fieldtype': u'Int',
'label': u'PIN', 'label': u'PIN',
@ -340,24 +223,92 @@
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'For Admin use only. Please report errors to support@erpnext.com', '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.',
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'repost_stock', 'fieldname': u'merge_warehouses_section',
'fieldtype': u'Section Break', 'fieldtype': u'Section Break',
'label': u'Repost Stock', 'label': u'Merge Warehouses',
'oldfieldtype': u'Section Break',
'permlevel': 2 'permlevel': 2
}, },
# DocField # DocField
{ {
'doctype': u'DocField', u'doctype': u'DocField',
'fieldname': u'repost_stock_ledger', 'fieldname': u'merge_with',
'fieldtype': u'Button', 'fieldtype': u'Link',
'hidden': 0, 'label': u'Merge With',
'label': u'Repost Stock Ledger', 'options': u'Warehouse',
'oldfieldtype': u'Button',
'options': u'repost_stock',
'permlevel': 2 '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
} }
] ]