fix: validation for delivery schedule

This commit is contained in:
Rohit Waghchaure
2025-11-12 23:53:11 +05:30
parent be826dba3b
commit 31ae91f313
4 changed files with 38 additions and 10 deletions

View File

@@ -53,6 +53,15 @@ frappe.ui.form.on("Master Production Schedule", {
set_custom_buttons(frm) {
if (!frm.is_new()) {
frm.add_custom_button(__("View MRP"), () => {
if (!frm.doc.items?.length && !frm.doc.sales_forecast) {
frappe.throw(
__(
"Please set actual demand or sales forecast to generate Material Requirements Planning Report."
)
);
return;
}
frappe.set_route("query-report", "Material Requirements Planning Report", {
company: frm.doc.company,
from_date: frm.doc.from_date,

View File

@@ -190,8 +190,8 @@ class MasterProductionSchedule(Document):
ignore_orders = []
if sales_order_schedules:
for row in sales_order_schedules:
if row.sales_order not in ignore_orders:
ignore_orders.append(row.sales_order)
if row.sales_order_item and row.sales_order_item not in ignore_orders:
ignore_orders.append(row.sales_order_item)
sales_orders = self.get_items_from_sales_orders(ignore_orders)
@@ -221,14 +221,14 @@ class MasterProductionSchedule(Document):
if self.sales_orders:
names = [s.sales_order for s in self.sales_orders if s.sales_order]
if ignore_orders:
names = [name for name in names if name not in ignore_orders]
if not names:
return []
query = query.where(doctype.parent.isin(names))
if ignore_orders:
query = query.where(doctype.name.notin(ignore_orders))
return query.run(as_dict=True)
def get_sales_order_schedules(self):
@@ -239,6 +239,7 @@ class MasterProductionSchedule(Document):
doctype.stock_uom,
doctype.delivery_date,
doctype.sales_order,
doctype.sales_order_item,
doctype.stock_qty.as_("qty"),
)
@@ -249,9 +250,6 @@ class MasterProductionSchedule(Document):
if self.from_date:
query = query.where(doctype.delivery_date >= self.from_date)
if self.to_date:
query = query.where(doctype.delivery_date <= self.to_date)
return query.run(as_dict=True)
def get_item_wise_mps_data(self, data):

View File

@@ -58,6 +58,12 @@ frappe.ui.form.on("Sales Order", {
},
refresh: function (frm) {
frm.fields_dict["items"].grid.update_docfield_property(
"add_schedule",
"hidden",
frm.is_new() || frm.doc.docstatus === 1 ? true : false
);
if (frm.doc.docstatus === 1) {
if (
frm.doc.status !== "Closed" &&
@@ -849,6 +855,10 @@ frappe.ui.form.on("Sales Order Item", {
add_schedule(frm, cdt, cdn) {
let row = locals[cdt][cdn];
if (row.__islocal) {
frappe.throw(__("Please save the Sales Order before adding a delivery schedule."));
}
frappe.call({
method: "get_delivery_schedule",
doc: frm.doc,

View File

@@ -481,6 +481,7 @@ class SalesOrder(SellingController):
def on_submit(self):
self.check_credit_limit()
self.update_reserved_qty()
self.delete_removed_delivery_schedule_items()
frappe.get_cached_doc("Authorization Control").validate_approving_authority(
self.doctype, self.company, self.base_grand_total, self
@@ -499,6 +500,13 @@ class SalesOrder(SellingController):
if self.get("reserve_stock") and not self.get("is_subcontracted"):
self.create_stock_reservation_entries()
def delete_removed_delivery_schedule_items(self):
items = [d.name for d in self.get("items")]
doctype = frappe.qb.DocType("Delivery Schedule Item")
frappe.qb.from_(doctype).delete().where(
(doctype.sales_order == self.name) & (doctype.sales_order_item.notin(items))
).run()
def on_cancel(self):
self.ignore_linked_doctypes = (
"GL Entry",
@@ -901,7 +909,7 @@ class SalesOrder(SellingController):
names.append(doc.name)
if names:
self.delete_delivery_schedule_items(names)
self.delete_delivery_schedule_items(child_row.name, names)
if first_delivery_date:
self.update_delivery_date_based_on_schedule(child_row, first_delivery_date)
@@ -915,7 +923,7 @@ class SalesOrder(SellingController):
self.save()
def delete_delivery_schedule_items(self, ignore_names=None):
def delete_delivery_schedule_items(self, sales_order_item=None, ignore_names=None):
"""Delete delivery schedule items."""
doctype = frappe.qb.DocType("Delivery Schedule Item")
@@ -924,6 +932,9 @@ class SalesOrder(SellingController):
if ignore_names:
query = query.where(doctype.name.notin(ignore_names))
if sales_order_item:
query = query.where(doctype.sales_order_item == sales_order_item)
query.run()