I have modified the reorder_item.py script to perform the following tasks:
separating material requests and items based on warehouse targets.
This worked very well.
But when I start adding tasks like adding a source warehouse based on the default warehouse of the item, this doesn’t seem to work.
I have tried executing it manually via ssh:
bench execute erpnext.stock.reorder_item.reorder_item
but still haven’t succeeded in producing new material requests.
Here is the code that I have modified:
def create_material_request(material_requests):
mr_list = []
exceptions_list = []
def _log_exception(mr):
if frappe.local.message_log:
exceptions_list.extend(frappe.local.message_log)
frappe.local.message_log = []
else:
exceptions_list.append(frappe.get_traceback())
mr.log_error("Unable to create material request")
for request_type in material_requests:
for company in material_requests[request_type]:
try:
items = material_requests[request_type][company]
if not items:
continue
# Group items by warehouse
items_by_warehouse = {}
for d in items:
d = frappe._dict(d)
if d.warehouse not in items_by_warehouse:
items_by_warehouse[d.warehouse] = []
items_by_warehouse[d.warehouse].append(d)
# Create a Material Request for each warehouse
for warehouse, warehouse_items in items_by_warehouse.items():
mr = frappe.new_doc("Material Request")
mr.update(
{
"company": company,
"transaction_date": nowdate(),
"material_request_type": "Material Transfer" if request_type == "Transfer" else request_type,
}
)
for d in warehouse_items:
item = frappe.get_doc("Item", d.item_code)
uom = item.stock_uom
conversion_factor = 1.0
if request_type == "Purchase":
uom = item.purchase_uom or item.stock_uom
if uom != item.stock_uom:
conversion_factor = (
frappe.db.get_value(
"UOM Conversion Detail", {"parent": item.name, "uom": uom}, "conversion_factor"
)
or 1.0
)
must_be_whole_number = frappe.db.get_value("UOM", uom, "must_be_whole_number", cache=True)
qty = d.reorder_qty / conversion_factor
if must_be_whole_number:
qty = ceil(qty)
# Get the default warehouse for the item
default_warehouse = frappe.db.get_value("Item Default", {"parent": d.item_code}, "default_warehouse")
mr.append(
"items",
{
"doctype": "Material Request Item",
"item_code": d.item_code,
"schedule_date": add_days(nowdate(), cint(item.lead_time_days)),
"qty": qty,
"uom": uom,
"stock_uom": item.stock_uom,
"warehouse": warehouse, # Use the default warehouse
"from_warehouse": default_warehouse, # Use the default warehouse as the source warehouse
"item_name": item.item_name,
"description": item.description,
"item_group": item.item_group,
"brand": item.brand,
},
)
schedule_dates = [d.schedule_date for d in mr.items]
mr.schedule_date = max(schedule_dates or [nowdate()])
mr.flags.ignore_mandatory = True
mr.insert()
mr.submit()
mr_list.append(mr)
Please help.