diff --git a/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt b/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt index baf2b7465e..f59ab73351 100644 --- a/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt +++ b/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2012-02-13 11:28:48', + 'creation': '2012-02-02 11:50:33', 'docstatus': 0, - 'modified': '2012-02-13 11:28:48', + 'modified': '2012-02-21 16:11:29', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -34,7 +34,7 @@ 'from_doctype': u'Delivery Note', 'module': u'Stock', 'name': '__common__', - 'ref_doc_submitted': 1, + 'ref_doc_submitted': 0, 'to_doctype': u'Packing Slip' }, @@ -77,7 +77,7 @@ 'from_table': u'Delivery Note', 'match_id': 0, 'to_table': u'Packing Slip', - 'validation_logic': u'docstatus=1' + 'validation_logic': u'docstatus=0' }, # Table Mapper Detail diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index d9f479504a..10297dde83 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -52,7 +52,7 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) { unhide_field(['SMS','Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']); } - if(doc.docstatus==1) { + if(doc.docstatus==0 && !doc.__islocal) { cur_frm.add_custom_button('Make Packing Slip', cur_frm.cscript['Make Packing Slip']); } diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 60aee13512..40fdc94ca9 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -309,6 +309,7 @@ class DocType(TransactionBase): # ON SUBMIT # ================================================================================================= def on_submit(self): + self.validate_packed_qty() set(self.doc, 'message', 'Items against your Order #%s have been delivered. Delivery #%s: ' % (self.doc.po_no, self.doc.name)) self.check_qty_in_stock() # Check for Approving Authority @@ -326,6 +327,28 @@ class DocType(TransactionBase): set(self.doc, 'status', 'Submitted') + def validate_packed_qty(self): + """ + Validate that if packed qty exists, it should be equal to qty + """ + if not any([d.fields.get('packed_qty') for d in self.doclist]): + return + packing_error_list = [] + for d in self.doclist: + if d.doctype != 'Delivery Note Detail': continue + if d.fields.get('qty') != d.fields.get('packed_qty'): + packing_error_list.append([ + d.fields.get('item_code', ''), + d.fields.get('qty', ''), + d.fields.get('packed_qty', '') + ]) + if packing_error_list: + from webnotes.utils import cstr + err_msg = "\n".join([("Item: " + d[0] + ", Qty: " + cstr(d[1]) \ + + ", Packed: " + cstr(d[2])) for d in packing_error_list]) + webnotes.msgprint("Packing Error:\n" + err_msg, raise_exception=1) + + # *********** Checks whether actual quantity is present in warehouse ************* def check_qty_in_stock(self): for d in getlist(self.doclist, 'packing_details'): diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.js b/erpnext/stock/doctype/packing_slip/packing_slip.js index 2e728f687f..7359ffad1a 100644 --- a/erpnext/stock/doctype/packing_slip/packing_slip.js +++ b/erpnext/stock/doctype/packing_slip/packing_slip.js @@ -1,12 +1,12 @@ cur_frm.fields_dict['delivery_note'].get_query = function(doc, cdt, cdn) { - return 'SELECT name FROM `tabDelivery Note` WHERE docstatus=1 AND %(key)s LIKE "%s"'; + return 'SELECT name FROM `tabDelivery Note` WHERE docstatus=0 AND %(key)s LIKE "%s"'; } cur_frm.fields_dict['item_details'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) { return 'SELECT name, description FROM `tabItem` WHERE name IN ( \ - SELECT item_code FROM `tabDelivery Note Detail` \ - WHERE parent="' + doc.delivery_note + '") AND %(key)s LIKE "%s" LIMIT 50'; + SELECT item_code FROM `tabDelivery Note Detail` dnd \ + WHERE parent="' + doc.delivery_note + '" AND qty > packed_qty) AND %(key)s LIKE "%s" LIMIT 50'; } @@ -39,8 +39,7 @@ cur_frm.cscript.update_item_details = function(doc) { if(r.exc) { msgprint(r.exc); } else { - refresh_field('item_details'); - refresh_field('naming_series'); + refresh_many(['item_details', 'naming_series', 'from_case_no', 'to_case_no']) } }); } diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py index 33ec2b52c2..23367c7341 100644 --- a/erpnext/stock/doctype/packing_slip/packing_slip.py +++ b/erpnext/stock/doctype/packing_slip/packing_slip.py @@ -28,9 +28,10 @@ class DocType: WHERE name=%(delivery_note)s """, self.doc.fields) - if not(res and res[0][0]==1): + if not(res and res[0][0]==0): webnotes.msgprint("""Invalid Delivery Note. Delivery Note should exist - and should be submitted. Please rectify and try again.""", raise_exception=1) + and should be in draft state. Please rectify and try again.""", + raise_exception=1) def validate_case_nos(self): @@ -46,12 +47,8 @@ class DocType: """, self.doc.fields) if res: - recommended_case_no = webnotes.conn.sql("""\ - SELECT MAX(to_case_no) FROM `tabPacking Slip` - WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.doc.fields) - webnotes.msgprint("""Case No(s). already in use. Please rectify and try again. - Recommended From Case No. = %s""" % (cint(recommended_case_no[0][0]) + 1), + Recommended From Case No. = %s""" % self.get_recommended_case_no(), raise_exception=1) @@ -75,13 +72,18 @@ class DocType: * Item Quantity dict of current packing slip doc * No. of Cases of this packing slip """ - item_codes = ", ".join([('"' + d.item_code + '"') for d in self.doclist]) + item_codes = ", ".join([('"' + d.item_code + '"') for d in + self.doclist]) + + if not item_codes: webnotes.msgprint("No Items to Pack", + raise_exception=1) res = webnotes.conn.sql("""\ SELECT item_code, IFNULL(SUM(qty), 0) as qty, IFNULL(packed_qty, 0) as packed_qty, stock_uom FROM `tabDelivery Note Detail` WHERE parent = "%s" AND item_code IN (%s) - GROUP BY item_code""" % (self.doc.delivery_note, item_codes), as_dict=1) + GROUP BY item_code""" % (self.doc.delivery_note, item_codes), + as_dict=1) ps_item_qty = dict([[d.item_code, d.qty] for d in self.doclist]) @@ -150,7 +152,23 @@ class DocType: """ Fill empty columns in Packing Slip Detail """ + self.doc.from_case_no = self.get_recommended_case_no() + from webnotes.model.code import get_obj for d in self.doclist: psd_obj = get_obj(doc=d) psd_obj.get_item_details(self.doc.delivery_note) + + + def get_recommended_case_no(self): + """ + Returns the next case no. for a new packing slip for a delivery + note + """ + recommended_case_no = webnotes.conn.sql("""\ + SELECT MAX(to_case_no) FROM `tabPacking Slip` + WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.doc.fields) + + return cint(recommended_case_no[0][0]) + 1 + +