mirror of
https://github.com/frappe/erpnext.git
synced 2025-12-03 18:35:36 +00:00
Merge pull request #50874 from rohitwaghchaure/fixed-ux-material-request
fix: UX for auto created material request via reorder
This commit is contained in:
@@ -301,6 +301,14 @@ frappe.ui.form.on("Item Reorder", {
|
|||||||
var type = frm.doc.default_material_request_type;
|
var type = frm.doc.default_material_request_type;
|
||||||
row.material_request_type = type == "Material Transfer" ? "Transfer" : type;
|
row.material_request_type = type == "Material Transfer" ? "Transfer" : type;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
warehouse_group(frm, cdt, cdn) {
|
||||||
|
let row = locals[cdt][cdn];
|
||||||
|
|
||||||
|
if (!row.warehouse_group) {
|
||||||
|
frappe.throw(__("Please select the Warehouse first"));
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
frappe.ui.form.on("Item Customer Detail", {
|
frappe.ui.form.on("Item Customer Detail", {
|
||||||
@@ -474,8 +482,12 @@ $.extend(erpnext.item, {
|
|||||||
cdt,
|
cdt,
|
||||||
cdn
|
cdn
|
||||||
) {
|
) {
|
||||||
|
let row = locals[cdt][cdn];
|
||||||
return {
|
return {
|
||||||
filters: { is_group: 1 },
|
query: "erpnext.stock.doctype.warehouse.warehouse.get_warehouses_for_reorder",
|
||||||
|
filters: {
|
||||||
|
warehouse: row.warehouse,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -7,21 +7,23 @@
|
|||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"field_order": [
|
"field_order": [
|
||||||
"warehouse_group",
|
|
||||||
"warehouse",
|
"warehouse",
|
||||||
|
"warehouse_group",
|
||||||
"warehouse_reorder_level",
|
"warehouse_reorder_level",
|
||||||
"warehouse_reorder_qty",
|
"warehouse_reorder_qty",
|
||||||
"material_request_type"
|
"material_request_type"
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
"columns": 3,
|
||||||
"fieldname": "warehouse_group",
|
"fieldname": "warehouse_group",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Check in (group)",
|
"label": "Check Availability in Warehouse",
|
||||||
"options": "Warehouse"
|
"options": "Warehouse"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"columns": 2,
|
||||||
"fieldname": "warehouse",
|
"fieldname": "warehouse",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
@@ -30,18 +32,21 @@
|
|||||||
"reqd": 1
|
"reqd": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"columns": 2,
|
||||||
"fieldname": "warehouse_reorder_level",
|
"fieldname": "warehouse_reorder_level",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Re-order Level"
|
"label": "Re-order Level"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"columns": 2,
|
||||||
"fieldname": "warehouse_reorder_qty",
|
"fieldname": "warehouse_reorder_qty",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Re-order Qty"
|
"label": "Re-order Qty"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"columns": 2,
|
||||||
"fieldname": "material_request_type",
|
"fieldname": "material_request_type",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
@@ -54,13 +59,15 @@
|
|||||||
"in_create": 1,
|
"in_create": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-03-27 13:09:55.227275",
|
"modified": "2025-12-02 16:02:23.254963",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Item Reorder",
|
"name": "Item Reorder",
|
||||||
|
"naming_rule": "Random",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [],
|
"permissions": [],
|
||||||
|
"row_format": "Dynamic",
|
||||||
"sort_field": "creation",
|
"sort_field": "creation",
|
||||||
"sort_order": "ASC",
|
"sort_order": "ASC",
|
||||||
"states": []
|
"states": []
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
"material_request_type",
|
"material_request_type",
|
||||||
"customer",
|
"customer",
|
||||||
"company",
|
"company",
|
||||||
|
"auto_created_via_reorder",
|
||||||
"column_break_2",
|
"column_break_2",
|
||||||
"transaction_date",
|
"transaction_date",
|
||||||
"schedule_date",
|
"schedule_date",
|
||||||
@@ -362,13 +363,19 @@
|
|||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"is_virtual": 1,
|
"is_virtual": 1,
|
||||||
"label": "Last Scanned Warehouse"
|
"label": "Last Scanned Warehouse"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "auto_created_via_reorder",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Auto Created (Reorder)"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-ticket",
|
"icon": "fa fa-ticket",
|
||||||
"idx": 70,
|
"idx": 70,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2025-07-31 17:19:01.166208",
|
"modified": "2025-12-02 13:56:33.001436",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Material Request",
|
"name": "Material Request",
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class MaterialRequest(BuyingController):
|
|||||||
from erpnext.stock.doctype.material_request_item.material_request_item import MaterialRequestItem
|
from erpnext.stock.doctype.material_request_item.material_request_item import MaterialRequestItem
|
||||||
|
|
||||||
amended_from: DF.Link | None
|
amended_from: DF.Link | None
|
||||||
|
auto_created_via_reorder: DF.Check
|
||||||
buying_price_list: DF.Link | None
|
buying_price_list: DF.Link | None
|
||||||
company: DF.Link
|
company: DF.Link
|
||||||
customer: DF.Link | None
|
customer: DF.Link | None
|
||||||
|
|||||||
@@ -59,6 +59,11 @@
|
|||||||
"production_plan",
|
"production_plan",
|
||||||
"material_request_plan_item",
|
"material_request_plan_item",
|
||||||
"job_card_item",
|
"job_card_item",
|
||||||
|
"item_reorder_section",
|
||||||
|
"projected_on_hand",
|
||||||
|
"column_break_fdjh",
|
||||||
|
"reorder_level",
|
||||||
|
"reorder_qty",
|
||||||
"section_break_46",
|
"section_break_46",
|
||||||
"page_break"
|
"page_break"
|
||||||
],
|
],
|
||||||
@@ -485,21 +490,50 @@
|
|||||||
"options": "currency",
|
"options": "currency",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "item_reorder_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Item Reorder"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_fdjh",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "reorder_level",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Reorder Level",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "reorder_qty",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Reorder Qty",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "If the reorder check is set at the Group warehouse level, the available quantity becomes the sum of the projected quantities of all its child warehouses.",
|
||||||
|
"fieldname": "projected_on_hand",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Projected On Hand",
|
||||||
|
"read_only": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-03-27 13:10:05.224712",
|
"modified": "2025-12-02 14:14:45.972664",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Material Request Item",
|
"name": "Material Request Item",
|
||||||
"naming_rule": "Random",
|
"naming_rule": "Random",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [],
|
"permissions": [],
|
||||||
|
"row_format": "Dynamic",
|
||||||
"sort_field": "creation",
|
"sort_field": "creation",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"states": [],
|
"states": [],
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,10 +44,13 @@ class MaterialRequestItem(Document):
|
|||||||
price_list_rate: DF.Currency
|
price_list_rate: DF.Currency
|
||||||
production_plan: DF.Link | None
|
production_plan: DF.Link | None
|
||||||
project: DF.Link | None
|
project: DF.Link | None
|
||||||
|
projected_on_hand: DF.Float
|
||||||
projected_qty: DF.Float
|
projected_qty: DF.Float
|
||||||
qty: DF.Float
|
qty: DF.Float
|
||||||
rate: DF.Currency
|
rate: DF.Currency
|
||||||
received_qty: DF.Float
|
received_qty: DF.Float
|
||||||
|
reorder_level: DF.Float
|
||||||
|
reorder_qty: DF.Float
|
||||||
sales_order: DF.Link | None
|
sales_order: DF.Link | None
|
||||||
sales_order_item: DF.Data | None
|
sales_order_item: DF.Data | None
|
||||||
schedule_date: DF.Date
|
schedule_date: DF.Date
|
||||||
|
|||||||
@@ -295,3 +295,25 @@ def apply_warehouse_filter(query, sle, filters):
|
|||||||
query = query.where(ExistsCriterion(child_query))
|
query = query.where(ExistsCriterion(child_query))
|
||||||
|
|
||||||
return query
|
return query
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
@frappe.validate_and_sanitize_search_inputs
|
||||||
|
def get_warehouses_for_reorder(doctype, txt, searchfield, start, page_len, filters):
|
||||||
|
filters = frappe._dict(filters or {})
|
||||||
|
|
||||||
|
if filters.warehouse and not frappe.db.exists("Warehouse", filters.warehouse):
|
||||||
|
frappe.throw(_("Warehouse {0} does not exist").format(filters.warehouse))
|
||||||
|
|
||||||
|
doctype = frappe.qb.DocType("Warehouse")
|
||||||
|
|
||||||
|
warehouses = (
|
||||||
|
frappe.qb.from_(doctype)
|
||||||
|
.select(doctype.name)
|
||||||
|
.where(doctype.disabled == 0)
|
||||||
|
.where((doctype.is_group == 1) | (doctype.name == filters.warehouse))
|
||||||
|
.orderby(doctype.name)
|
||||||
|
.run(as_list=True)
|
||||||
|
)
|
||||||
|
|
||||||
|
return warehouses
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ def _reorder_item():
|
|||||||
else:
|
else:
|
||||||
projected_qty = flt(item_warehouse_projected_qty.get(kwargs.item_code, {}).get(kwargs.warehouse))
|
projected_qty = flt(item_warehouse_projected_qty.get(kwargs.item_code, {}).get(kwargs.warehouse))
|
||||||
|
|
||||||
|
original_reorder_qty = reorder_qty
|
||||||
if (reorder_level or reorder_qty) and projected_qty <= reorder_level:
|
if (reorder_level or reorder_qty) and projected_qty <= reorder_level:
|
||||||
deficiency = reorder_level - projected_qty
|
deficiency = reorder_level - projected_qty
|
||||||
if deficiency > reorder_qty:
|
if deficiency > reorder_qty:
|
||||||
@@ -73,6 +74,9 @@ def _reorder_item():
|
|||||||
"warehouse": kwargs.warehouse,
|
"warehouse": kwargs.warehouse,
|
||||||
"reorder_qty": reorder_qty,
|
"reorder_qty": reorder_qty,
|
||||||
"item_details": kwargs.item_details,
|
"item_details": kwargs.item_details,
|
||||||
|
"projected_on_hand": projected_qty,
|
||||||
|
"reorder_level": reorder_level,
|
||||||
|
"original_reorder_qty": original_reorder_qty,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -240,6 +244,7 @@ def create_material_request(material_requests):
|
|||||||
mr.update(
|
mr.update(
|
||||||
{
|
{
|
||||||
"company": company,
|
"company": company,
|
||||||
|
"auto_created_via_reorder": 1,
|
||||||
"transaction_date": nowdate(),
|
"transaction_date": nowdate(),
|
||||||
"material_request_type": "Material Transfer"
|
"material_request_type": "Material Transfer"
|
||||||
if request_type == "Transfer"
|
if request_type == "Transfer"
|
||||||
@@ -285,6 +290,9 @@ def create_material_request(material_requests):
|
|||||||
"description": item.description,
|
"description": item.description,
|
||||||
"item_group": item.item_group,
|
"item_group": item.item_group,
|
||||||
"brand": item.brand,
|
"brand": item.brand,
|
||||||
|
"reorder_qty": d.original_reorder_qty,
|
||||||
|
"projected_on_hand": d.projected_on_hand,
|
||||||
|
"reorder_level": d.reorder_level,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user