Skip to content

Commit

Permalink
Merge pull request #35108 from s-aga-r/PACKING-SLIP-FOR-DN-PACKED-ITEMS
Browse files Browse the repository at this point in the history
refactor: Packing Slip
  • Loading branch information
s-aga-r committed May 25, 2023
2 parents 55806c5 + b4362e5 commit 781c93c
Show file tree
Hide file tree
Showing 11 changed files with 732 additions and 556 deletions.
1 change: 1 addition & 0 deletions erpnext/patches.txt
Original file line number Diff line number Diff line change
Expand Up @@ -333,3 +333,4 @@ erpnext.patches.v14_0.migrate_gl_to_payment_ledger
execute:frappe.delete_doc_if_exists("Report", "Tax Detail")
erpnext.patches.v15_0.enable_all_leads
erpnext.patches.v14_0.update_company_in_ldc
erpnext.patches.v14_0.set_packed_qty_in_draft_delivery_notes
60 changes: 60 additions & 0 deletions erpnext/patches/v14_0/set_packed_qty_in_draft_delivery_notes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt

import frappe
from frappe.query_builder.functions import Sum


def execute():
ps = frappe.qb.DocType("Packing Slip")
dn = frappe.qb.DocType("Delivery Note")
ps_item = frappe.qb.DocType("Packing Slip Item")

ps_details = (
frappe.qb.from_(ps)
.join(ps_item)
.on(ps.name == ps_item.parent)
.join(dn)
.on(ps.delivery_note == dn.name)
.select(
dn.name.as_("delivery_note"),
ps_item.item_code.as_("item_code"),
Sum(ps_item.qty).as_("packed_qty"),
)
.where((ps.docstatus == 1) & (dn.docstatus == 0))
.groupby(dn.name, ps_item.item_code)
).run(as_dict=True)

if ps_details:
dn_list = set()
item_code_list = set()
for ps_detail in ps_details:
dn_list.add(ps_detail.delivery_note)
item_code_list.add(ps_detail.item_code)

dn_item = frappe.qb.DocType("Delivery Note Item")
dn_item_query = (
frappe.qb.from_(dn_item)
.select(
dn.parent.as_("delivery_note"),
dn_item.name,
dn_item.item_code,
dn_item.qty,
)
.where((dn_item.parent.isin(dn_list)) & (dn_item.item_code.isin(item_code_list)))
)

dn_details = frappe._dict()
for r in dn_item_query.run(as_dict=True):
dn_details.setdefault((r.delivery_note, r.item_code), frappe._dict()).setdefault(r.name, r.qty)

for ps_detail in ps_details:
dn_items = dn_details.get((ps_detail.delivery_note, ps_detail.item_code))

if dn_items:
remaining_qty = ps_detail.packed_qty
for name, qty in dn_items.items():
if remaining_qty > 0:
row_packed_qty = min(qty, remaining_qty)
frappe.db.set_value("Delivery Note Item", name, "packed_qty", row_packed_qty)
remaining_qty -= row_packed_qty
13 changes: 8 additions & 5 deletions erpnext/stock/doctype/delivery_note/delivery_note.js
Original file line number Diff line number Diff line change
Expand Up @@ -185,11 +185,14 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn
}

if(doc.docstatus==0 && !doc.__islocal) {
this.frm.add_custom_button(__('Packing Slip'), function() {
frappe.model.open_mapped_doc({
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_packing_slip",
frm: me.frm
}) }, __('Create'));
if (doc.__onload && doc.__onload.has_unpacked_items) {
this.frm.add_custom_button(__('Packing Slip'), function() {
frappe.model.open_mapped_doc({
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_packing_slip",
frm: me.frm
}) }, __('Create')
);
}
}

if (!doc.__islocal && doc.docstatus==1) {
Expand Down
78 changes: 64 additions & 14 deletions erpnext/stock/doctype/delivery_note/delivery_note.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ def __init__(self, *args, **kwargs):
]
)

def onload(self):
if self.docstatus == 0:
self.set_onload("has_unpacked_items", self.has_unpacked_items())

def before_print(self, settings=None):
def toggle_print_hide(meta, fieldname):
df = meta.get_field(fieldname)
Expand Down Expand Up @@ -302,20 +306,21 @@ def check_credit_limit(self):
)

def validate_packed_qty(self):
"""
Validate that if packed qty exists, it should be equal to qty
"""
if not any(flt(d.get("packed_qty")) for d in self.get("items")):
return
has_error = False
for d in self.get("items"):
if flt(d.get("qty")) != flt(d.get("packed_qty")):
frappe.msgprint(
_("Packed quantity must equal quantity for Item {0} in row {1}").format(d.item_code, d.idx)
)
has_error = True
if has_error:
raise frappe.ValidationError
"""Validate that if packed qty exists, it should be equal to qty"""

if frappe.db.exists("Packing Slip", {"docstatus": 1, "delivery_note": self.name}):
product_bundle_list = self.get_product_bundle_list()
for item in self.items + self.packed_items:
if (
item.item_code not in product_bundle_list
and flt(item.packed_qty)
and flt(item.packed_qty) != flt(item.qty)
):
frappe.throw(
_("Row {0}: Packed Qty must be equal to {1} Qty.").format(
item.idx, frappe.bold(item.doctype)
)
)

def update_pick_list_status(self):
from erpnext.stock.doctype.pick_list.pick_list import update_pick_list_status
Expand Down Expand Up @@ -393,6 +398,23 @@ def make_return_invoice(self):
)
)

def has_unpacked_items(self):
product_bundle_list = self.get_product_bundle_list()

for item in self.items + self.packed_items:
if item.item_code not in product_bundle_list and flt(item.packed_qty) < flt(item.qty):
return True

return False

def get_product_bundle_list(self):
items_list = [item.item_code for item in self.items]
return frappe.db.get_all(
"Product Bundle",
filters={"new_item_code": ["in", items_list]},
pluck="name",
)


def update_billed_amount_based_on_so(so_detail, update_modified=True):
from frappe.query_builder.functions import Sum
Expand Down Expand Up @@ -684,6 +706,12 @@ def update_item(obj, target, source_parent):

@frappe.whitelist()
def make_packing_slip(source_name, target_doc=None):
def set_missing_values(source, target):
target.run_method("set_missing_values")

def update_item(obj, target, source_parent):
target.qty = flt(obj.qty) - flt(obj.packed_qty)

doclist = get_mapped_doc(
"Delivery Note",
source_name,
Expand All @@ -698,12 +726,34 @@ def make_packing_slip(source_name, target_doc=None):
"field_map": {
"item_code": "item_code",
"item_name": "item_name",
"batch_no": "batch_no",
"description": "description",
"qty": "qty",
"stock_uom": "stock_uom",
"name": "dn_detail",
},
"postprocess": update_item,
"condition": lambda item: (
not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code})
and flt(item.packed_qty) < flt(item.qty)
),
},
"Packed Item": {
"doctype": "Packing Slip Item",
"field_map": {
"item_code": "item_code",
"item_name": "item_name",
"batch_no": "batch_no",
"description": "description",
"qty": "qty",
"name": "pi_detail",
},
"postprocess": update_item,
"condition": lambda item: (flt(item.packed_qty) < flt(item.qty)),
},
},
target_doc,
set_missing_values,
)

return doclist
Expand Down
11 changes: 11 additions & 0 deletions erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
"installed_qty",
"item_tax_rate",
"column_break_atna",
"packed_qty",
"received_qty",
"accounting_details_section",
"expense_account",
Expand Down Expand Up @@ -850,6 +851,16 @@
"print_hide": 1,
"read_only": 1,
"report_hide": 1
},
{
"default": "0",
"depends_on": "eval: doc.packed_qty",
"fieldname": "packed_qty",
"fieldtype": "Float",
"label": "Packed Qty",
"no_copy": 1,
"non_negative": 1,
"read_only": 1
}
],
"idx": 1,
Expand Down
13 changes: 12 additions & 1 deletion erpnext/stock/doctype/packed_item/packed_item.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"actual_qty",
"projected_qty",
"ordered_qty",
"packed_qty",
"column_break_16",
"incoming_rate",
"picked_qty",
Expand Down Expand Up @@ -242,13 +243,23 @@
"label": "Picked Qty",
"no_copy": 1,
"read_only": 1
},
{
"default": "0",
"depends_on": "eval: doc.packed_qty",
"fieldname": "packed_qty",
"fieldtype": "Float",
"label": "Packed Qty",
"no_copy": 1,
"non_negative": 1,
"read_only": 1
}
],
"idx": 1,
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2022-04-27 05:23:08.683245",
"modified": "2023-04-28 13:16:38.460806",
"modified_by": "Administrator",
"module": "Stock",
"name": "Packed Item",
Expand Down
Loading

0 comments on commit 781c93c

Please sign in to comment.