mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 16:34:46 +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) {
|
set_custom_buttons(frm) {
|
||||||
if (!frm.is_new()) {
|
if (!frm.is_new()) {
|
||||||
frm.add_custom_button(__("View MRP"), () => {
|
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", {
|
frappe.set_route("query-report", "Material Requirements Planning Report", {
|
||||||
company: frm.doc.company,
|
company: frm.doc.company,
|
||||||
from_date: frm.doc.from_date,
|
from_date: frm.doc.from_date,
|
||||||
|
|||||||
@@ -190,8 +190,8 @@ class MasterProductionSchedule(Document):
|
|||||||
ignore_orders = []
|
ignore_orders = []
|
||||||
if sales_order_schedules:
|
if sales_order_schedules:
|
||||||
for row in sales_order_schedules:
|
for row in sales_order_schedules:
|
||||||
if row.sales_order not in ignore_orders:
|
if row.sales_order_item and row.sales_order_item not in ignore_orders:
|
||||||
ignore_orders.append(row.sales_order)
|
ignore_orders.append(row.sales_order_item)
|
||||||
|
|
||||||
sales_orders = self.get_items_from_sales_orders(ignore_orders)
|
sales_orders = self.get_items_from_sales_orders(ignore_orders)
|
||||||
|
|
||||||
@@ -221,14 +221,14 @@ class MasterProductionSchedule(Document):
|
|||||||
|
|
||||||
if self.sales_orders:
|
if self.sales_orders:
|
||||||
names = [s.sales_order for s in self.sales_orders if s.sales_order]
|
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:
|
if not names:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
query = query.where(doctype.parent.isin(names))
|
query = query.where(doctype.parent.isin(names))
|
||||||
|
|
||||||
|
if ignore_orders:
|
||||||
|
query = query.where(doctype.name.notin(ignore_orders))
|
||||||
|
|
||||||
return query.run(as_dict=True)
|
return query.run(as_dict=True)
|
||||||
|
|
||||||
def get_sales_order_schedules(self):
|
def get_sales_order_schedules(self):
|
||||||
@@ -239,6 +239,7 @@ class MasterProductionSchedule(Document):
|
|||||||
doctype.stock_uom,
|
doctype.stock_uom,
|
||||||
doctype.delivery_date,
|
doctype.delivery_date,
|
||||||
doctype.sales_order,
|
doctype.sales_order,
|
||||||
|
doctype.sales_order_item,
|
||||||
doctype.stock_qty.as_("qty"),
|
doctype.stock_qty.as_("qty"),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -249,9 +250,6 @@ class MasterProductionSchedule(Document):
|
|||||||
if self.from_date:
|
if self.from_date:
|
||||||
query = query.where(doctype.delivery_date >= 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)
|
return query.run(as_dict=True)
|
||||||
|
|
||||||
def get_item_wise_mps_data(self, data):
|
def get_item_wise_mps_data(self, data):
|
||||||
|
|||||||
@@ -58,6 +58,12 @@ frappe.ui.form.on("Sales Order", {
|
|||||||
},
|
},
|
||||||
|
|
||||||
refresh: function (frm) {
|
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.docstatus === 1) {
|
||||||
if (
|
if (
|
||||||
frm.doc.status !== "Closed" &&
|
frm.doc.status !== "Closed" &&
|
||||||
@@ -849,6 +855,10 @@ frappe.ui.form.on("Sales Order Item", {
|
|||||||
add_schedule(frm, cdt, cdn) {
|
add_schedule(frm, cdt, cdn) {
|
||||||
let row = locals[cdt][cdn];
|
let row = locals[cdt][cdn];
|
||||||
|
|
||||||
|
if (row.__islocal) {
|
||||||
|
frappe.throw(__("Please save the Sales Order before adding a delivery schedule."));
|
||||||
|
}
|
||||||
|
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: "get_delivery_schedule",
|
method: "get_delivery_schedule",
|
||||||
doc: frm.doc,
|
doc: frm.doc,
|
||||||
|
|||||||
@@ -481,6 +481,7 @@ class SalesOrder(SellingController):
|
|||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
self.check_credit_limit()
|
self.check_credit_limit()
|
||||||
self.update_reserved_qty()
|
self.update_reserved_qty()
|
||||||
|
self.delete_removed_delivery_schedule_items()
|
||||||
|
|
||||||
frappe.get_cached_doc("Authorization Control").validate_approving_authority(
|
frappe.get_cached_doc("Authorization Control").validate_approving_authority(
|
||||||
self.doctype, self.company, self.base_grand_total, self
|
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"):
|
if self.get("reserve_stock") and not self.get("is_subcontracted"):
|
||||||
self.create_stock_reservation_entries()
|
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):
|
def on_cancel(self):
|
||||||
self.ignore_linked_doctypes = (
|
self.ignore_linked_doctypes = (
|
||||||
"GL Entry",
|
"GL Entry",
|
||||||
@@ -901,7 +909,7 @@ class SalesOrder(SellingController):
|
|||||||
names.append(doc.name)
|
names.append(doc.name)
|
||||||
|
|
||||||
if names:
|
if names:
|
||||||
self.delete_delivery_schedule_items(names)
|
self.delete_delivery_schedule_items(child_row.name, names)
|
||||||
|
|
||||||
if first_delivery_date:
|
if first_delivery_date:
|
||||||
self.update_delivery_date_based_on_schedule(child_row, first_delivery_date)
|
self.update_delivery_date_based_on_schedule(child_row, first_delivery_date)
|
||||||
@@ -915,7 +923,7 @@ class SalesOrder(SellingController):
|
|||||||
|
|
||||||
self.save()
|
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."""
|
"""Delete delivery schedule items."""
|
||||||
doctype = frappe.qb.DocType("Delivery Schedule Item")
|
doctype = frappe.qb.DocType("Delivery Schedule Item")
|
||||||
|
|
||||||
@@ -924,6 +932,9 @@ class SalesOrder(SellingController):
|
|||||||
if ignore_names:
|
if ignore_names:
|
||||||
query = query.where(doctype.name.notin(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()
|
query.run()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user