From 8d5045ef4caf695dbfdc087b78c8f68a79976813 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Mon, 4 Dec 2023 18:03:22 +0530 Subject: [PATCH] feat: provision to add items in Stock Reservation dialog --- .../doctype/sales_order/sales_order.js | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 0d36f23695..b206e3fe33 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -207,6 +207,50 @@ frappe.ui.form.on("Sales Order", { }, }, {fieldtype: "Column Break"}, + { + fieldname: "add_item", + fieldtype: "Link", + label: __("Add Item"), + options: "Sales Order Item", + get_query: () => { + return { + query: "erpnext.controllers.queries.get_filtered_child_rows", + filters: { + "parenttype": frm.doc.doctype, + "parent": frm.doc.name, + "reserve_stock": 1, + } + } + }, + onchange: () => { + let sales_order_item = dialog.get_value("add_item"); + + if (sales_order_item) { + frm.doc.items.forEach(item => { + if (item.name === sales_order_item) { + let unreserved_qty = (flt(item.stock_qty) - (item.stock_reserved_qty ? flt(item.stock_reserved_qty) : (flt(item.delivered_qty) * flt(item.conversion_factor)))) / flt(item.conversion_factor); + + if (unreserved_qty > 0) { + dialog.fields_dict.items.df.data.forEach((row) => { + if (row.sales_order_item === sales_order_item) { + unreserved_qty -= row.qty_to_reserve; + } + }); + } + + dialog.fields_dict.items.df.data.push({ + 'sales_order_item': item.name, + 'item_code': item.item_code, + 'warehouse': dialog.get_value("set_warehouse") || item.warehouse, + 'qty_to_reserve': Math.max(unreserved_qty, 0) + }); + dialog.fields_dict.items.grid.refresh(); + dialog.set_value("add_item", undefined); + } + }); + } + }, + }, {fieldtype: "Section Break"}, { fieldname: "items", @@ -308,14 +352,14 @@ frappe.ui.form.on("Sales Order", { frm.doc.items.forEach(item => { if (item.reserve_stock) { - let unreserved_qty = (flt(item.stock_qty) - (item.stock_reserved_qty ? flt(item.stock_reserved_qty) : (flt(item.delivered_qty) * flt(item.conversion_factor)))) + let unreserved_qty = (flt(item.stock_qty) - (item.stock_reserved_qty ? flt(item.stock_reserved_qty) : (flt(item.delivered_qty) * flt(item.conversion_factor)))) / flt(item.conversion_factor); if (unreserved_qty > 0) { dialog.fields_dict.items.df.data.push({ 'sales_order_item': item.name, 'item_code': item.item_code, 'warehouse': item.warehouse, - 'qty_to_reserve': (unreserved_qty / flt(item.conversion_factor)) + 'qty_to_reserve': unreserved_qty }); } }