mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-20 15:25:13 +00:00
Merge pull request #52771 from mihir-kandoi/type-hints-manufacturing
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.-.######"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user