mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-12 11:25:09 +00:00
fix: validation for delivery schedule
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user