diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py index 69e9d8ee14c..946e7cb2d0c 100644 --- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py @@ -125,7 +125,7 @@ class BlanketOrder(Document): @frappe.whitelist() -def make_order(source_name): +def make_order(source_name: str): doctype = frappe.flags.args.doctype def update_doc(source_doc, target_doc, source_parent): diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index ceb2e9d0ffd..9aff1a183c9 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -9,6 +9,7 @@ from operator import itemgetter import frappe from frappe import _, bold from frappe.core.doctype.version.version import get_diff +from frappe.model.document import Document from frappe.model.mapper import get_mapped_doc from frappe.query_builder import Field from frappe.query_builder.functions import Count, IfNull, Sum @@ -483,7 +484,7 @@ class BOM(WebsiteGenerator): item.set(key, value) @frappe.whitelist() - def get_bom_material_detail(self, args=None): + def get_bom_material_detail(self, args: dict | str | None = None): """Get raw material details like uom, desc and rate""" if not args: args = frappe.form_dict.get("args") @@ -576,7 +577,13 @@ class BOM(WebsiteGenerator): return flt(rate) * flt(self.plc_conversion_rate or 1) / (self.conversion_rate or 1) @frappe.whitelist() - def update_cost(self, update_parent=True, from_child_bom=False, update_hour_rate=True, save=True): + def update_cost( + self, + update_parent: bool = True, + from_child_bom: bool = False, + update_hour_rate: bool = True, + save: bool = True, + ): if self.docstatus == 2: return @@ -787,7 +794,7 @@ class BOM(WebsiteGenerator): self.add_materials_from_bom(row.finished_good, row.bom_no, row.idx, qty=row.finished_good_qty) @frappe.whitelist() - def add_raw_materials(self, operation_row_id, items): + def add_raw_materials(self, operation_row_id: int, items: str | list): if isinstance(items, str): items = parse_json(items) @@ -834,7 +841,9 @@ class BOM(WebsiteGenerator): return row @frappe.whitelist() - def add_materials_from_bom(self, finished_good, bom_no, operation_row_id, qty=None): + def add_materials_from_bom( + self, finished_good: str, bom_no: str, operation_row_id: int, qty: float | None = None + ): if not frappe.db.exists("BOM", {"item": finished_good, "name": bom_no, "docstatus": 1}): frappe.throw(_("BOM {0} not found for the item {1}").format(bom_no, finished_good)) @@ -1454,7 +1463,7 @@ def get_bom_items_as_dict( @frappe.whitelist() -def get_bom_items(bom, company, qty=1, fetch_exploded=1): +def get_bom_items(bom: str, company: str, qty: float = 1, fetch_exploded: int = 1): items = get_bom_items_as_dict(bom, company, qty, fetch_exploded, include_non_stock_items=True).values() items = list(items) items.sort(key=functools.cmp_to_key(lambda a, b: a.item_code > b.item_code and 1 or -1)) @@ -1487,7 +1496,7 @@ def validate_bom_no(item, bom_no): @frappe.whitelist() -def get_children(parent=None, is_root=False, **filters): +def get_children(parent: str | None = None, is_root: bool = False, **filters): if not parent or parent == "BOM": frappe.msgprint(_("Please select a BOM")) return @@ -1743,7 +1752,7 @@ def add_operations_cost(stock_entry, work_order=None, expense_account=None, job_ @frappe.whitelist() -def get_bom_diff(bom1, bom2): +def get_bom_diff(bom1: str, bom2: str): from frappe.model import table_fields if bom1 == bom2: @@ -1799,7 +1808,9 @@ def get_bom_diff(bom1, bom2): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def item_query(doctype, txt, searchfield, start, page_len, filters): +def item_query( + doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict | None = None +): meta = frappe.get_meta("Item", cached=True) searchfields = meta.get_search_fields() @@ -1854,7 +1865,13 @@ def item_query(doctype, txt, searchfield, start, page_len, filters): @frappe.whitelist() -def make_variant_bom(source_name, bom_no, item, variant_items, target_doc=None): +def make_variant_bom( + source_name: str, + bom_no: str, + item: str, + variant_items: str | list, + target_doc: Document | str | None = None, +): from erpnext.manufacturing.doctype.work_order.work_order import add_variant_item def postprocess(source, doc): diff --git a/erpnext/manufacturing/doctype/bom_creator/bom_creator.py b/erpnext/manufacturing/doctype/bom_creator/bom_creator.py index b8d322f9463..9f97b3b6905 100644 --- a/erpnext/manufacturing/doctype/bom_creator/bom_creator.py +++ b/erpnext/manufacturing/doctype/bom_creator/bom_creator.py @@ -376,12 +376,12 @@ class BOMCreator(Document): return False @frappe.whitelist() - def get_default_bom(self, item_code) -> str: + def get_default_bom(self, item_code: str): return frappe.get_cached_value("Item", item_code, "default_bom") @frappe.whitelist() -def get_children(doctype=None, parent=None, **kwargs): +def get_children(doctype: str | None = None, parent: str | None = None, **kwargs): if isinstance(kwargs, str): kwargs = frappe.parse_json(kwargs) @@ -561,7 +561,7 @@ def delete_node(**kwargs): @frappe.whitelist() -def edit_bom_creator(doctype, docname, data, parent): +def edit_bom_creator(doctype: str, docname: str, data: str | dict, parent: str): if isinstance(data, str): data = frappe.parse_json(data) diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index 46209c88117..5bd3391ef18 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -3,6 +3,7 @@ import datetime import json from collections import OrderedDict +from typing import Any import frappe from frappe import _, bold @@ -1457,7 +1458,7 @@ class JobCard(Document): ) @frappe.whitelist() - def make_stock_entry_for_semi_fg_item(self, auto_submit=False): + def make_stock_entry_for_semi_fg_item(self, auto_submit: bool = False): from erpnext.stock.doctype.stock_entry_type.stock_entry_type import ManufactureEntry ste = ManufactureEntry( @@ -1500,7 +1501,7 @@ class JobCard(Document): @frappe.whitelist() -def make_subcontracting_po(source_name, target_doc=None): +def make_subcontracting_po(source_name: str, target_doc: Document | str | None = None): def set_missing_values(source, target): _item_details = get_subcontracting_boms_for_finished_goods(source.finished_good) @@ -1543,7 +1544,7 @@ def make_subcontracting_po(source_name, target_doc=None): @frappe.whitelist() -def make_time_log(kwargs): +def make_time_log(kwargs: str | dict): if isinstance(kwargs, str): kwargs = json.loads(kwargs) @@ -1555,7 +1556,7 @@ def make_time_log(kwargs): @frappe.whitelist() -def get_operation_details(work_order, operation): +def get_operation_details(work_order: str, operation: str): if work_order and operation: return frappe.get_all( "Work Order Operation", @@ -1565,7 +1566,7 @@ def get_operation_details(work_order, operation): @frappe.whitelist() -def get_operations(doctype, txt, searchfield, start, page_len, filters): +def get_operations(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): if not filters.get("work_order"): frappe.msgprint(_("Please select a Work Order first.")) return [] @@ -1586,7 +1587,7 @@ def get_operations(doctype, txt, searchfield, start, page_len, filters): @frappe.whitelist() -def make_material_request(source_name, target_doc=None): +def make_material_request(source_name: str, target_doc: Document | str | None = None): def update_item(obj, target, source_parent): target.warehouse = source_parent.wip_warehouse @@ -1617,7 +1618,7 @@ def make_material_request(source_name, target_doc=None): @frappe.whitelist() -def make_stock_entry(source_name, target_doc=None): +def make_stock_entry(source_name: str, target_doc: Document | str | None = None): def update_item(source, target, source_parent): target.t_warehouse = source_parent.wip_warehouse @@ -1689,7 +1690,7 @@ def time_diff_in_minutes(string_ed_date, string_st_date): @frappe.whitelist() -def get_job_details(start, end, filters=None): +def get_job_details(start: Any, end: Any, filters: str | dict | None = None): events = [] event_color = { @@ -1737,7 +1738,12 @@ def get_job_details(start, end, filters=None): @frappe.whitelist() -def make_corrective_job_card(source_name, operation=None, for_operation=None, target_doc=None): +def make_corrective_job_card( + source_name: str, + operation: str | None = None, + for_operation: str | None = None, + target_doc: Document | str | None = None, +): def set_missing_values(source, target): target.is_corrective_job_card = 1 target.operation = operation diff --git a/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py b/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py index 38eff29df30..ee5b1b96abe 100644 --- a/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py +++ b/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py @@ -468,7 +468,7 @@ def get_item_lead_time(item_code): @frappe.whitelist() -def get_mps_details(mps): +def get_mps_details(mps: str): return frappe.db.get_value( "Master Production Schedule", mps, diff --git a/erpnext/manufacturing/doctype/plant_floor/plant_floor.py b/erpnext/manufacturing/doctype/plant_floor/plant_floor.py index e6fcf1af9cc..8ddec3598f5 100644 --- a/erpnext/manufacturing/doctype/plant_floor/plant_floor.py +++ b/erpnext/manufacturing/doctype/plant_floor/plant_floor.py @@ -22,7 +22,7 @@ class PlantFloor(Document): # end: auto-generated types @frappe.whitelist() - def make_stock_entry(self, kwargs): + def make_stock_entry(self, kwargs: str | dict): if isinstance(kwargs, str): kwargs = frappe.parse_json(kwargs) @@ -66,7 +66,9 @@ class PlantFloor(Document): @frappe.whitelist() -def get_stock_summary(warehouse, start=0, item_code=None, item_group=None): +def get_stock_summary( + warehouse: str, start: int = 0, item_code: str | None = None, item_group: str | None = None +): stock_details = get_stock_details(warehouse, start=start, item_code=item_code, item_group=item_group) max_count = 0.0 diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py index 0bf93274c8d..a48fe4e9765 100644 --- a/erpnext/manufacturing/doctype/production_plan/production_plan.py +++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py @@ -141,7 +141,7 @@ class ProductionPlan(Document): row.from_warehouse = "" @frappe.whitelist() - def validate_sales_orders(self, sales_order=None): + def validate_sales_orders(self, sales_order: str | None = None): sales_orders = [] if sales_order: @@ -679,7 +679,7 @@ class ProductionPlan(Document): frappe.delete_doc("Work Order", d.name) @frappe.whitelist() - def set_status(self, close=None, update_bin=False): + def set_status(self, close: bool | None = None, update_bin: bool = False): self.status = {0: "Draft", 1: "Submitted", 2: "Cancelled"}.get(self.docstatus) if close: @@ -1033,7 +1033,7 @@ class ProductionPlan(Document): msgprint(_("No material request created")) @frappe.whitelist() - def get_sub_assembly_items(self, manufacturing_type=None): + def get_sub_assembly_items(self, manufacturing_type: str | None = None): "Fetch sub assembly items and optionally combine them." self.sub_assembly_items = [] sub_assembly_items_store = [] # temporary store to process all subassembly items @@ -1198,7 +1198,7 @@ class ProductionPlan(Document): @frappe.whitelist() -def download_raw_materials(doc, warehouses=None): +def download_raw_materials(doc: str | dict | Document, warehouses: str | list | None = None): if isinstance(doc, str): doc = frappe._dict(json.loads(doc)) @@ -1578,7 +1578,9 @@ def get_sales_orders(self): @frappe.whitelist() -def get_bin_details(row, company, for_warehouse=None, all_warehouse=False): +def get_bin_details( + row: str | dict, company: str, for_warehouse: str | None = None, all_warehouse: bool = False +): if isinstance(row, str): row = frappe._dict(json.loads(row)) @@ -1613,7 +1615,7 @@ def get_bin_details(row, company, for_warehouse=None, all_warehouse=False): @frappe.whitelist() -def get_so_details(sales_order): +def get_so_details(sales_order: str): return frappe.db.get_value( "Sales Order", sales_order, ["transaction_date", "customer", "grand_total"], as_dict=1 ) @@ -1636,7 +1638,11 @@ def get_warehouse_list(warehouses): @frappe.whitelist() -def get_items_for_material_requests(doc, warehouses=None, get_parent_warehouse_data=None): +def get_items_for_material_requests( + doc: str | frappe._dict | Document, + warehouses: str | list | None = None, + get_parent_warehouse_data: bool | int | None = None, +): if isinstance(doc, str): doc = frappe._dict(json.loads(doc)) @@ -1889,7 +1895,7 @@ def get_materials_from_other_locations(item, warehouses, new_mr_items, company): @frappe.whitelist() -def get_item_data(item_code): +def get_item_data(item_code: str): item_details = get_item_details(item_code) return { @@ -2130,7 +2136,14 @@ def get_raw_materials_of_sub_assembly_items( @frappe.whitelist() -def sales_order_query(doctype=None, txt=None, searchfield=None, start=None, page_len=None, filters=None): +def sales_order_query( + doctype: str | None = None, + txt: str | None = None, + searchfield: str | None = None, + start: int | None = None, + page_len: int | None = None, + filters: dict | None = None, +): frappe.has_permission("Production Plan", throw=True) if not filters: @@ -2201,7 +2214,9 @@ def get_reserved_qty_for_sub_assembly(item_code, warehouse): @frappe.whitelist() -def make_stock_reservation_entries(doc, items=None, table_name=None, notify=False): +def make_stock_reservation_entries( + doc: str | Document, items: str | list | None = None, table_name: str | None = None, notify: bool = False +): if isinstance(doc, str): doc = parse_json(doc) doc = frappe.get_doc("Production Plan", doc.get("name")) @@ -2238,7 +2253,7 @@ def make_stock_reservation_entries(doc, items=None, table_name=None, notify=Fals @frappe.whitelist() -def cancel_stock_reservation_entries(doc, sre_list): +def cancel_stock_reservation_entries(doc: str | Document, sre_list: str | list): if isinstance(doc, str): doc = parse_json(doc) doc = frappe.get_doc("Production Plan", doc.get("name")) diff --git a/erpnext/manufacturing/doctype/routing/routing.py b/erpnext/manufacturing/doctype/routing/routing.py index be0eed0df95..6edf8d28760 100644 --- a/erpnext/manufacturing/doctype/routing/routing.py +++ b/erpnext/manufacturing/doctype/routing/routing.py @@ -57,7 +57,7 @@ class Routing(Document): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def get_operations(doctype, txt, searchfield, start, page_len, filters): +def get_operations(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): query_filters = {} if txt: diff --git a/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py b/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py index d6c31ff351b..56f6509e6e5 100644 --- a/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py +++ b/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py @@ -67,7 +67,7 @@ class SalesForecast(Document): @frappe.whitelist() -def create_mps(source_name, target_doc=None): +def create_mps(source_name: str, target_doc: Document | str | None = None): def postprocess(source, doc): doc.naming_series = "MPS.YY.-.######" diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 34f5e252752..a1ecfe7b0b7 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -2081,7 +2081,9 @@ class WorkOrder(Document): @frappe.whitelist() -def make_stock_reservation_entries(doc, items=None, is_transfer=True, notify=False): +def make_stock_reservation_entries( + doc: str | Document, items: str | list | None = None, is_transfer: bool = True, notify: bool = False +): is_transfer = cint(is_transfer) if isinstance(doc, str): doc = parse_json(doc) @@ -2180,7 +2182,7 @@ def get_consumed_qty(work_order, item_code): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def get_bom_operations(doctype, txt, searchfield, start, page_len, filters): +def get_bom_operations(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): if txt: filters["operation"] = ("like", "%%%s%%" % txt) @@ -2188,7 +2190,7 @@ def get_bom_operations(doctype, txt, searchfield, start, page_len, filters): @frappe.whitelist() -def get_item_details(item, project=None, skip_bom_info=False, throw=True): +def get_item_details(item: str, project: str | None = None, skip_bom_info: bool = False, throw: bool = True): res = frappe.db.sql( """ select stock_uom, description, item_name, allow_alternative_item, @@ -2249,7 +2251,14 @@ def get_item_details(item, project=None, skip_bom_info=False, throw=True): @frappe.whitelist() -def make_work_order(bom_no, item, qty=0, project=None, variant_items=None, use_multi_level_bom=None): +def make_work_order( + bom_no: str, + item: str, + qty: float = 0, + project: str | None = None, + variant_items: str | list | None = None, + use_multi_level_bom: bool | None = None, +): if not frappe.has_permission("Work Order", "write"): frappe.throw(_("Not permitted"), frappe.PermissionError) @@ -2334,7 +2343,7 @@ def get_template_rm_item(wo_doc, item_code): @frappe.whitelist() -def check_if_scrap_warehouse_mandatory(bom_no): +def check_if_scrap_warehouse_mandatory(bom_no: str): res = {"set_scrap_wh_mandatory": False} if bom_no: bom = frappe.get_doc("BOM", bom_no) @@ -2346,7 +2355,7 @@ def check_if_scrap_warehouse_mandatory(bom_no): @frappe.whitelist() -def set_work_order_ops(name): +def set_work_order_ops(name: str): po = frappe.get_doc("Work Order", name) po.set_work_order_operations() po.save() @@ -2411,7 +2420,7 @@ def make_stock_entry( @frappe.whitelist() -def get_default_warehouse(company): +def get_default_warehouse(company: str): wip, fg, scrap = frappe.get_cached_value( "Company", company, ["default_wip_warehouse", "default_fg_warehouse", "default_scrap_warehouse"] ) @@ -2423,7 +2432,7 @@ def get_default_warehouse(company): @frappe.whitelist() -def stop_unstop(work_order, status): +def stop_unstop(work_order: str, status: str): """Called from client side on Stop/Unstop event""" if not frappe.has_permission("Work Order", "write"): @@ -2444,7 +2453,7 @@ def stop_unstop(work_order, status): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def query_sales_order(doctype, txt, searchfield, start, page_len, filters) -> list[str]: +def query_sales_order(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): return frappe.get_list( "Sales Order", fields=["name"], @@ -2461,7 +2470,7 @@ def query_sales_order(doctype, txt, searchfield, start, page_len, filters) -> li @frappe.whitelist() -def make_job_card(work_order, operations): +def make_job_card(work_order: str, operations: str | list) -> None: if isinstance(operations, str): operations = json.loads(operations) @@ -2494,7 +2503,7 @@ def get_operation_details(name, work_order): @frappe.whitelist() -def close_work_order(work_order, status): +def close_work_order(work_order: str, status: str): if not frappe.has_permission("Work Order", "write"): frappe.throw(_("Not permitted"), frappe.PermissionError) @@ -2648,7 +2657,7 @@ def get_work_order_operation_data(work_order, operation, workstation): @frappe.whitelist() -def create_pick_list(source_name, target_doc=None, for_qty=None): +def create_pick_list(source_name: str, target_doc: str | None = None, for_qty: float | None = None): for_qty = for_qty or json.loads(target_doc).get("for_qty") max_finished_goods_qty = frappe.db.get_value("Work Order", source_name, "qty") @@ -2742,7 +2751,7 @@ def get_reserved_qty_for_production( @frappe.whitelist() -def make_stock_return_entry(work_order): +def make_stock_return_entry(work_order: str): from erpnext.stock.doctype.stock_entry.stock_entry import get_available_materials non_consumed_items = get_available_materials(work_order) diff --git a/erpnext/manufacturing/doctype/workstation/workstation.py b/erpnext/manufacturing/doctype/workstation/workstation.py index f9427049f15..3f57b8dbf8d 100644 --- a/erpnext/manufacturing/doctype/workstation/workstation.py +++ b/erpnext/manufacturing/doctype/workstation/workstation.py @@ -19,6 +19,7 @@ from frappe.utils import ( time_diff_in_seconds, to_timedelta, ) +from frappe.utils.data import DateTimeLikeObject from erpnext.support.doctype.issue.issue import get_holidays @@ -210,7 +211,7 @@ class Workstation(Document): return schedule_date @frappe.whitelist() - def start_job(self, job_card, from_time, employee): + def start_job(self, job_card: str, from_time: DateTimeLikeObject, employee: str): doc = frappe.get_doc("Job Card", job_card) doc.append("time_logs", {"from_time": from_time, "employee": employee}) doc.save(ignore_permissions=True) @@ -218,7 +219,7 @@ class Workstation(Document): return doc @frappe.whitelist() - def complete_job(self, job_card, qty, to_time): + def complete_job(self, job_card: str, qty: float, to_time: DateTimeLikeObject): doc = frappe.get_doc("Job Card", job_card) for row in doc.time_logs: if not row.to_time: @@ -317,7 +318,7 @@ def get_status_color(status): @frappe.whitelist() -def get_raw_materials(job_card): +def get_raw_materials(job_card: str): raw_materials = frappe.get_all( "Job Card", fields=[ @@ -391,7 +392,7 @@ def get_time_logs(job_cards): @frappe.whitelist() -def get_default_holiday_list(company=None): +def get_default_holiday_list(company: str | None = None): if company: if not frappe.has_permission("Company", "read"): return [] @@ -533,7 +534,7 @@ def update_job_card(job_card: str, method: str, **kwargs): @frappe.whitelist() -def validate_job_card(job_card, status): +def validate_job_card(job_card: str, status: str): job_card_details = frappe.db.get_value("Job Card", job_card, ["status", "for_quantity"], as_dict=1) current_status = job_card_details.status diff --git a/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py b/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py index 70a1850fd0f..2028c5c6f50 100644 --- a/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py +++ b/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py @@ -93,7 +93,7 @@ def get_data(filters): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def get_work_orders(doctype, txt, searchfield, start, page_len, filters): +def get_work_orders(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): wo = frappe.qb.DocType("Work Order") query = ( frappe.qb.from_(wo) diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py index c1dac67a98e..f63a60e3349 100644 --- a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py +++ b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py @@ -1295,7 +1295,7 @@ def get_item_capacity(item_code, bucket_size): @frappe.whitelist() -def make_order(selected_rows, company, warehouse=None, mps=None): +def make_order(selected_rows: str | list, company: str, warehouse: str | None = None, mps: str | None = None): if not frappe.has_permission("Purchase Order", "create"): frappe.throw(_("Not permitted to make Purchase Orders"), frappe.PermissionError)