diff --git a/stock/doctype/packing_slip/packing_slip.js b/stock/doctype/packing_slip/packing_slip.js index d3cf9be030..7e26a09d5f 100644 --- a/stock/doctype/packing_slip/packing_slip.js +++ b/stock/doctype/packing_slip/packing_slip.js @@ -43,8 +43,8 @@ cur_frm.cscript.item_code = function(doc, cdt, cdn) { } -cur_frm.cscript.onload = function(doc, cdt, cdn) { - if(doc.delivery_note) { +cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) { + if(doc.delivery_note && doc.__islocal) { var ps_detail = getchildren('Packing Slip Item', doc.name, 'item_details'); if(!(flt(ps_detail[0].net_weight) && cstr(ps_detail[0].weight_uom))) { cur_frm.cscript.update_item_details(doc); diff --git a/stock/doctype/packing_slip/packing_slip.py b/stock/doctype/packing_slip/packing_slip.py index 9e544b62d8..7ef7d367a0 100644 --- a/stock/doctype/packing_slip/packing_slip.py +++ b/stock/doctype/packing_slip/packing_slip.py @@ -16,7 +16,7 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import flt, cint +from webnotes.utils import flt, cint, now class DocType: def __init__(self, d, dl): @@ -56,6 +56,15 @@ class DocType: Validate if case nos overlap If they do, recommend next case no. """ + if not cint(self.doc.from_case_no): + webnotes.msgprint("Please specify a valid 'From Case No.'", raise_exception=1) + elif not self.doc.to_case_no: + self.doc.to_case_no = self.doc.from_case_no + elif self.doc.from_case_no > self.doc.to_case_no: + webnotes.msgprint("'To Case No.' cannot be less than 'From Case No.'", + raise_exception=1) + + res = webnotes.conn.sql("""\ SELECT name FROM `tabPacking Slip` WHERE delivery_note = %(delivery_note)s AND docstatus = 1 AND @@ -92,16 +101,24 @@ class DocType: item_codes = ", ".join([('"' + d.item_code + '"') for d in self.doclist]) + items = [d.item_code for d in self.doclist.get({"parentfield": "item_details"})] + 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 Item` - WHERE parent = "%s" AND item_code IN (%s) - GROUP BY item_code""" % (self.doc.delivery_note, item_codes), - as_dict=1) - + + # gets item code, qty per item code, latest packed qty per item code and stock uom + res = webnotes.conn.sql("""select item_code, ifnull(sum(qty), 0) as qty, + (select sum(ifnull(psi.qty, 0) * (abs(ps.to_case_no - ps.from_case_no) + 1)) + from `tabPacking Slip` ps, `tabPacking Slip Item` psi + where ps.name = psi.parent and ps.docstatus = 1 + and ps.delivery_note = dni.parent and psi.item_code=dni.item_code) + as packed_qty, + stock_uom + from `tabDelivery Note Item` dni + where parent=%s and item_code in (%s) + group by item_code""" % ("%s", ", ".join(["%s"]*len(items))), + tuple([self.doc.delivery_note] + items), as_dict=1, debug=1) + ps_item_qty = dict([[d.item_code, d.qty] for d in self.doclist]) no_of_cases = cint(self.doc.to_case_no) - cint(self.doc.from_case_no) + 1 @@ -148,28 +165,29 @@ class DocType: dn_details, ps_item_qty, no_of_cases = self.get_details_for_packing() for item in dn_details: - if event=='submit': - new_packed_qty = flt(item['packed_qty']) + (flt(ps_item_qty[item['item_code']]) * no_of_cases) - - elif event=='cancel': - new_packed_qty = flt(item['packed_qty']) - (flt(ps_item_qty[item['item_code']]) * no_of_cases) - + new_packed_qty = flt(item['packed_qty']) if (new_packed_qty < 0) or (new_packed_qty > flt(item['qty'])): webnotes.msgprint("Invalid new packed quantity for item %s. \ Please try again or contact support@erpnext.com" % item['item_code'], raise_exception=1) - + + delivery_note_item = webnotes.conn.get_value("Delivery Note Item", { + "parent": self.doc.delivery_note, "item_code": item["item_code"]}) + webnotes.conn.sql("""\ UPDATE `tabDelivery Note Item` SET packed_qty = %s WHERE parent = %s AND item_code = %s""", - (new_packed_qty, self.doc.delivery_note, item['item_code'])) + (new_packed_qty, self.doc.delivery_note, item['item_code'])) + webnotes.conn.set_value("Delivery Note", self.doc.delivery_note, + "modified", now()) def update_item_details(self): """ Fill empty columns in Packing Slip Item """ - self.doc.from_case_no = self.get_recommended_case_no() + if not self.doc.from_case_no: + self.doc.from_case_no = self.get_recommended_case_no() from webnotes.model.code import get_obj for d in self.doclist: