fix(ux): Sales Order Stock Reservation Dialog (backport #38261) (#38344)

* fix(ux): no need to select rows to reserve the stock

(cherry picked from commit 9c889b37fb3e6572043c7a28706e43d051e2ff46)

* fix: use field `sales_order_item` instead `name`

(cherry picked from commit 73586fd9b2f9392d18f65a063b14ef2de2629615)

* fix(ux): no need to select rows to unreserve the stock

(cherry picked from commit 2a41da94d443dee51e615b395d18ad161d4e87fc)

---------

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
This commit is contained in:
mergify[bot] 2023-11-26 22:25:51 +05:30 committed by GitHub
parent cda5ff40f1
commit 3cbe59902a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 23 deletions

View File

@ -214,13 +214,12 @@ frappe.ui.form.on("Sales Order", {
label: __("Items to Reserve"), label: __("Items to Reserve"),
allow_bulk_edit: false, allow_bulk_edit: false,
cannot_add_rows: true, cannot_add_rows: true,
cannot_delete_rows: true,
data: [], data: [],
fields: [ fields: [
{ {
fieldname: "name", fieldname: "sales_order_item",
fieldtype: "Data", fieldtype: "Data",
label: __("Name"), label: __("Sales Order Item"),
reqd: 1, reqd: 1,
read_only: 1, read_only: 1,
}, },
@ -260,7 +259,7 @@ frappe.ui.form.on("Sales Order", {
], ],
primary_action_label: __("Reserve Stock"), primary_action_label: __("Reserve Stock"),
primary_action: () => { primary_action: () => {
var data = {items: dialog.fields_dict.items.grid.get_selected_children()}; var data = {items: dialog.fields_dict.items.grid.data};
if (data.items && data.items.length > 0) { if (data.items && data.items.length > 0) {
frappe.call({ frappe.call({
@ -278,9 +277,6 @@ frappe.ui.form.on("Sales Order", {
} }
}); });
} }
else {
frappe.msgprint(__("Please select items to reserve."));
}
dialog.hide(); dialog.hide();
}, },
@ -292,7 +288,7 @@ frappe.ui.form.on("Sales Order", {
if (unreserved_qty > 0) { if (unreserved_qty > 0) {
dialog.fields_dict.items.df.data.push({ dialog.fields_dict.items.df.data.push({
'name': item.name, 'sales_order_item': item.name,
'item_code': item.item_code, 'item_code': item.item_code,
'warehouse': item.warehouse, 'warehouse': item.warehouse,
'qty_to_reserve': (unreserved_qty / flt(item.conversion_factor)) 'qty_to_reserve': (unreserved_qty / flt(item.conversion_factor))
@ -308,7 +304,7 @@ frappe.ui.form.on("Sales Order", {
cancel_stock_reservation_entries(frm) { cancel_stock_reservation_entries(frm) {
const dialog = new frappe.ui.Dialog({ const dialog = new frappe.ui.Dialog({
title: __("Stock Unreservation"), title: __("Stock Unreservation"),
size: "large", size: "extra-large",
fields: [ fields: [
{ {
fieldname: "sr_entries", fieldname: "sr_entries",
@ -316,14 +312,13 @@ frappe.ui.form.on("Sales Order", {
label: __("Reserved Stock"), label: __("Reserved Stock"),
allow_bulk_edit: false, allow_bulk_edit: false,
cannot_add_rows: true, cannot_add_rows: true,
cannot_delete_rows: true,
in_place_edit: true, in_place_edit: true,
data: [], data: [],
fields: [ fields: [
{ {
fieldname: "name", fieldname: "sre",
fieldtype: "Link", fieldtype: "Link",
label: __("SRE"), label: __("Stock Reservation Entry"),
options: "Stock Reservation Entry", options: "Stock Reservation Entry",
reqd: 1, reqd: 1,
read_only: 1, read_only: 1,
@ -360,14 +355,14 @@ frappe.ui.form.on("Sales Order", {
], ],
primary_action_label: __("Unreserve Stock"), primary_action_label: __("Unreserve Stock"),
primary_action: () => { primary_action: () => {
var data = {sr_entries: dialog.fields_dict.sr_entries.grid.get_selected_children()}; var data = {sr_entries: dialog.fields_dict.sr_entries.grid.data};
if (data.sr_entries && data.sr_entries.length > 0) { if (data.sr_entries && data.sr_entries.length > 0) {
frappe.call({ frappe.call({
doc: frm.doc, doc: frm.doc,
method: "cancel_stock_reservation_entries", method: "cancel_stock_reservation_entries",
args: { args: {
sre_list: data.sr_entries, sre_list: data.sr_entries.map(item => item.sre),
}, },
freeze: true, freeze: true,
freeze_message: __('Unreserving Stock...'), freeze_message: __('Unreserving Stock...'),
@ -377,9 +372,6 @@ frappe.ui.form.on("Sales Order", {
} }
}); });
} }
else {
frappe.msgprint(__("Please select items to unreserve."));
}
dialog.hide(); dialog.hide();
}, },
@ -396,7 +388,7 @@ frappe.ui.form.on("Sales Order", {
r.message.forEach(sre => { r.message.forEach(sre => {
if (flt(sre.reserved_qty) > flt(sre.delivered_qty)) { if (flt(sre.reserved_qty) > flt(sre.delivered_qty)) {
dialog.fields_dict.sr_entries.df.data.push({ dialog.fields_dict.sr_entries.df.data.push({
'name': sre.name, 'sre': sre.name,
'item_code': sre.item_code, 'item_code': sre.item_code,
'warehouse': sre.warehouse, 'warehouse': sre.warehouse,
'qty': (flt(sre.reserved_qty) - flt(sre.delivered_qty)) 'qty': (flt(sre.reserved_qty) - flt(sre.delivered_qty))

View File

@ -233,7 +233,7 @@ class PickList(Document):
for location in self.locations: for location in self.locations:
if location.warehouse and location.sales_order and location.sales_order_item: if location.warehouse and location.sales_order and location.sales_order_item:
item_details = { item_details = {
"name": location.sales_order_item, "sales_order_item": location.sales_order_item,
"item_code": location.item_code, "item_code": location.item_code,
"warehouse": location.warehouse, "warehouse": location.warehouse,
"qty_to_reserve": (flt(location.picked_qty) - flt(location.stock_reserved_qty)), "qty_to_reserve": (flt(location.picked_qty) - flt(location.stock_reserved_qty)),

View File

@ -781,7 +781,7 @@ class PurchaseReceipt(BuyingController):
for item in self.items: for item in self.items:
if item.sales_order and item.sales_order_item: if item.sales_order and item.sales_order_item:
item_details = { item_details = {
"name": item.sales_order_item, "sales_order_item": item.sales_order_item,
"item_code": item.item_code, "item_code": item.item_code,
"warehouse": item.warehouse, "warehouse": item.warehouse,
"qty_to_reserve": item.stock_qty, "qty_to_reserve": item.stock_qty,

View File

@ -869,7 +869,7 @@ def create_stock_reservation_entries_for_so_items(
items = [] items = []
if items_details: if items_details:
for item in items_details: for item in items_details:
so_item = frappe.get_doc("Sales Order Item", item.get("name")) so_item = frappe.get_doc("Sales Order Item", item.get("sales_order_item"))
so_item.warehouse = item.get("warehouse") so_item.warehouse = item.get("warehouse")
so_item.qty_to_reserve = ( so_item.qty_to_reserve = (
flt(item.get("qty_to_reserve")) flt(item.get("qty_to_reserve"))
@ -1053,12 +1053,14 @@ def cancel_stock_reservation_entries(
from_voucher_type: Literal["Pick List", "Purchase Receipt"] = None, from_voucher_type: Literal["Pick List", "Purchase Receipt"] = None,
from_voucher_no: str = None, from_voucher_no: str = None,
from_voucher_detail_no: str = None, from_voucher_detail_no: str = None,
sre_list: list[dict] = None, sre_list: list = None,
notify: bool = True, notify: bool = True,
) -> None: ) -> None:
"""Cancel Stock Reservation Entries.""" """Cancel Stock Reservation Entries."""
if not sre_list: if not sre_list:
sre_list = {}
if voucher_type and voucher_no: if voucher_type and voucher_no:
sre_list = get_stock_reservation_entries_for_voucher( sre_list = get_stock_reservation_entries_for_voucher(
voucher_type, voucher_no, voucher_detail_no, fields=["name"] voucher_type, voucher_no, voucher_detail_no, fields=["name"]
@ -1082,9 +1084,11 @@ def cancel_stock_reservation_entries(
sre_list = query.run(as_dict=True) sre_list = query.run(as_dict=True)
sre_list = [d.name for d in sre_list]
if sre_list: if sre_list:
for sre in sre_list: for sre in sre_list:
frappe.get_doc("Stock Reservation Entry", sre["name"]).cancel() frappe.get_doc("Stock Reservation Entry", sre).cancel()
if notify: if notify:
msg = _("Stock Reservation Entries Cancelled") msg = _("Stock Reservation Entries Cancelled")