fix: don't map items twice
* don't explicitly map Delivery Note Item custom fields to Packing Slip Item, get auto-mapped while mapping the doc. * call Packing List `set_missing_values` after mapping the doc. * refactor `get_recommended_case_no`, use `frappe.db.get_value` instead of `frappe.db.sql`.
This commit is contained in:
parent
ee9f97ca7c
commit
75fe9dd3ea
@ -684,6 +684,9 @@ def make_installation_note(source_name, target_doc=None):
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_packing_slip(source_name, target_doc=None):
|
||||
def set_missing_values(source, target):
|
||||
target.run_method("set_missing_values")
|
||||
|
||||
doclist = get_mapped_doc(
|
||||
"Delivery Note",
|
||||
source_name,
|
||||
@ -701,9 +704,7 @@ def make_packing_slip(source_name, target_doc=None):
|
||||
"batch_no": "batch_no",
|
||||
"description": "description",
|
||||
"qty": "qty",
|
||||
"total_weight": "net_weight",
|
||||
"stock_uom": "stock_uom",
|
||||
"weight_uom": "weight_uom",
|
||||
"name": "dn_detail",
|
||||
},
|
||||
"condition": lambda doc: not frappe.db.exists(
|
||||
@ -723,6 +724,7 @@ def make_packing_slip(source_name, target_doc=None):
|
||||
},
|
||||
},
|
||||
target_doc,
|
||||
set_missing_values,
|
||||
)
|
||||
|
||||
return doclist
|
||||
|
@ -35,24 +35,6 @@ frappe.ui.form.on("Packing Slip", {
|
||||
frm.trigger("validate_calculate_item_details");
|
||||
},
|
||||
|
||||
onload_post_render: (frm) => {
|
||||
if(frm.doc.delivery_note && frm.doc.__islocal) {
|
||||
frm.trigger("get_items");
|
||||
}
|
||||
},
|
||||
|
||||
get_items: (frm) => {
|
||||
return frm.call({
|
||||
doc: frm.doc,
|
||||
method: "get_items",
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
frm.refresh();
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// To Case No. cannot be less than From Case No.
|
||||
validate_case_nos: (frm) => {
|
||||
doc = locals[frm.doc.doctype][frm.doc.name];
|
||||
|
@ -28,6 +28,8 @@ class PackingSlip(Document):
|
||||
validate_uom_is_integer(self, "stock_uom", "qty")
|
||||
validate_uom_is_integer(self, "weight_uom", "net_weight")
|
||||
|
||||
self.set_missing_values()
|
||||
|
||||
def validate_delivery_note(self):
|
||||
"""
|
||||
Validates if delivery note has status as draft
|
||||
@ -80,6 +82,20 @@ class PackingSlip(Document):
|
||||
if new_packed_qty > flt(item["qty"]) and no_of_cases:
|
||||
self.recommend_new_qty(item, ps_item_qty, no_of_cases)
|
||||
|
||||
def set_missing_values(self):
|
||||
if not self.from_case_no:
|
||||
self.from_case_no = self.get_recommended_case_no()
|
||||
|
||||
for item in self.items:
|
||||
weight_per_unit, weight_uom = frappe.db.get_value(
|
||||
"Item", item.item_code, ["weight_per_unit", "weight_uom"]
|
||||
)
|
||||
|
||||
if weight_per_unit and not item.net_weight:
|
||||
item.net_weight = weight_per_unit
|
||||
if weight_uom and not item.weight_uom:
|
||||
item.weight_uom = weight_uom
|
||||
|
||||
def get_details_for_packing(self):
|
||||
"""
|
||||
Returns
|
||||
@ -141,57 +157,18 @@ class PackingSlip(Document):
|
||||
)
|
||||
)
|
||||
|
||||
def update_item_details(self):
|
||||
"""
|
||||
Fill empty columns in Packing Slip Item
|
||||
"""
|
||||
if not self.from_case_no:
|
||||
self.from_case_no = self.get_recommended_case_no()
|
||||
|
||||
for d in self.get("items"):
|
||||
res = frappe.db.get_value("Item", d.item_code, ["weight_per_unit", "weight_uom"], as_dict=True)
|
||||
|
||||
if res and len(res) > 0:
|
||||
d.net_weight = res["weight_per_unit"]
|
||||
d.weight_uom = res["weight_uom"]
|
||||
|
||||
def get_recommended_case_no(self):
|
||||
"""
|
||||
Returns the next case no. for a new packing slip for a delivery
|
||||
note
|
||||
"""
|
||||
recommended_case_no = frappe.db.sql(
|
||||
"""SELECT MAX(to_case_no) FROM `tabPacking Slip`
|
||||
WHERE delivery_note = %s AND docstatus=1""",
|
||||
self.delivery_note,
|
||||
"""Returns the next case no. for a new packing slip for a delivery note"""
|
||||
|
||||
return (
|
||||
cint(
|
||||
frappe.db.get_value(
|
||||
"Packing Slip", {"delivery_note": self.delivery_note, "docstatus": 1}, ["max(to_case_no)"]
|
||||
)
|
||||
)
|
||||
+ 1
|
||||
)
|
||||
|
||||
return cint(recommended_case_no[0][0]) + 1
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_items(self):
|
||||
self.set("items", [])
|
||||
|
||||
custom_fields = frappe.get_meta("Delivery Note Item").get_custom_fields()
|
||||
|
||||
dn_details = self.get_details_for_packing()[0]
|
||||
for item in dn_details:
|
||||
if flt(item.qty) > flt(item.packed_qty):
|
||||
ch = self.append("items", {})
|
||||
ch.item_code = item.item_code
|
||||
ch.item_name = item.item_name
|
||||
ch.stock_uom = item.stock_uom
|
||||
ch.description = item.description
|
||||
ch.batch_no = item.batch_no
|
||||
ch.qty = flt(item.qty) - flt(item.packed_qty)
|
||||
|
||||
# copy custom fields
|
||||
for d in custom_fields:
|
||||
if item.get(d.fieldname):
|
||||
ch.set(d.fieldname, item.get(d.fieldname))
|
||||
|
||||
self.update_item_details()
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
|
Loading…
x
Reference in New Issue
Block a user