mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-20 23:35:11 +00:00
refactor(stock): adding type hint for stock module
This commit is contained in:
@@ -9,7 +9,12 @@ from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry impor
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_data(
|
||||
item_code=None, warehouse=None, item_group=None, start=0, sort_by="actual_qty", sort_order="desc"
|
||||
item_code: str | None = None,
|
||||
warehouse: str | None = None,
|
||||
item_group: str | None = None,
|
||||
start: int = 0,
|
||||
sort_by: str = "actual_qty",
|
||||
sort_order: str = "desc",
|
||||
):
|
||||
"""Return data to render the item dashboard"""
|
||||
filters = []
|
||||
|
||||
@@ -7,13 +7,13 @@ from erpnext.stock.utils import get_stock_balance
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_data(
|
||||
item_code=None,
|
||||
warehouse=None,
|
||||
parent_warehouse=None,
|
||||
company=None,
|
||||
start=0,
|
||||
sort_by="stock_capacity",
|
||||
sort_order="desc",
|
||||
item_code: str | None = None,
|
||||
warehouse: str | None = None,
|
||||
parent_warehouse: str | None = None,
|
||||
company: str | None = None,
|
||||
start: int = 0,
|
||||
sort_by: str = "stock_capacity",
|
||||
sort_order: str = "desc",
|
||||
):
|
||||
"""Return data to render the warehouse capacity dashboard."""
|
||||
filters = get_filters(item_code, warehouse, parent_warehouse, company)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.query_builder.functions import Sum
|
||||
@@ -11,15 +13,15 @@ from frappe.utils.dashboard import cache_source
|
||||
@frappe.whitelist()
|
||||
@cache_source
|
||||
def get(
|
||||
chart_name=None,
|
||||
chart=None,
|
||||
no_cache=None,
|
||||
filters=None,
|
||||
from_date=None,
|
||||
to_date=None,
|
||||
timespan=None,
|
||||
time_interval=None,
|
||||
heatmap_year=None,
|
||||
chart_name: str | None = None,
|
||||
chart: Any = None,
|
||||
no_cache: Any = None,
|
||||
filters: dict | str | None = None,
|
||||
from_date: Any = None,
|
||||
to_date: Any = None,
|
||||
timespan: Any = None,
|
||||
time_interval: Any = None,
|
||||
heatmap_year: Any = None,
|
||||
):
|
||||
if filters and isinstance(filters, str):
|
||||
filters = frappe.parse_json(filters)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils.dashboard import cache_source
|
||||
@@ -10,15 +12,15 @@ from frappe.utils.dashboard import cache_source
|
||||
@frappe.whitelist()
|
||||
@cache_source
|
||||
def get(
|
||||
chart_name=None,
|
||||
chart=None,
|
||||
no_cache=None,
|
||||
filters=None,
|
||||
from_date=None,
|
||||
to_date=None,
|
||||
timespan=None,
|
||||
time_interval=None,
|
||||
heatmap_year=None,
|
||||
chart_name: str | None = None,
|
||||
chart: Any | None = None,
|
||||
no_cache: Any | None = None,
|
||||
filters: dict | str | None = None,
|
||||
from_date: Any | None = None,
|
||||
to_date: Any | None = None,
|
||||
timespan: Any | None = None,
|
||||
time_interval: Any | None = None,
|
||||
heatmap_year: Any | None = None,
|
||||
):
|
||||
labels, datapoints = [], []
|
||||
filters = frappe.parse_json(filters)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
|
||||
import datetime
|
||||
from collections import OrderedDict, defaultdict
|
||||
|
||||
import frappe
|
||||
@@ -10,7 +11,7 @@ from frappe.model.document import Document
|
||||
from frappe.model.naming import make_autoname, revert_series_if_last
|
||||
from frappe.query_builder.functions import CurDate, Sum
|
||||
from frappe.utils import cint, flt, get_link_to_form
|
||||
from frappe.utils.data import add_days
|
||||
from frappe.utils.data import DateTimeLikeObject, add_days
|
||||
from frappe.utils.jinja import render_template
|
||||
|
||||
|
||||
@@ -235,18 +236,18 @@ class Batch(Document):
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_batch_qty(
|
||||
batch_no=None,
|
||||
warehouse=None,
|
||||
item_code=None,
|
||||
creation=None,
|
||||
posting_datetime=None,
|
||||
posting_date=None,
|
||||
posting_time=None,
|
||||
ignore_voucher_nos=None,
|
||||
for_stock_levels=False,
|
||||
consider_negative_batches=False,
|
||||
do_not_check_future_batches=False,
|
||||
ignore_reserved_stock=False,
|
||||
batch_no: str | None = None,
|
||||
warehouse: str | None = None,
|
||||
item_code: str | None = None,
|
||||
creation: DateTimeLikeObject | None = None,
|
||||
posting_datetime: DateTimeLikeObject | None = None,
|
||||
posting_date: DateTimeLikeObject | None = None,
|
||||
posting_time: datetime.timedelta | None = None,
|
||||
ignore_voucher_nos: list | None = None,
|
||||
for_stock_levels: bool = False,
|
||||
consider_negative_batches: bool = False,
|
||||
do_not_check_future_batches: bool = False,
|
||||
ignore_reserved_stock: bool = False,
|
||||
):
|
||||
"""Returns batch actual qty if warehouse is passed,
|
||||
or returns dict of qty by warehouse if warehouse is None
|
||||
@@ -295,7 +296,7 @@ def get_batch_qty(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_batches_by_oldest(item_code, warehouse):
|
||||
def get_batches_by_oldest(item_code: str, warehouse: str):
|
||||
"""Returns the oldest batch and qty for the given item_code and warehouse"""
|
||||
batches = get_batch_qty(item_code=item_code, warehouse=warehouse)
|
||||
batches_dates = [[batch, frappe.get_value("Batch", batch.batch_no, "expiry_date")] for batch in batches]
|
||||
@@ -447,7 +448,7 @@ def make_batch(kwargs):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_pos_reserved_batch_qty(filters):
|
||||
def get_pos_reserved_batch_qty(filters: dict | str):
|
||||
import json
|
||||
|
||||
if isinstance(filters, str):
|
||||
|
||||
@@ -8,6 +8,7 @@ import frappe
|
||||
from frappe import _
|
||||
from frappe.contacts.doctype.address.address import get_company_address
|
||||
from frappe.desk.notifications import clear_doctype_notifications
|
||||
from frappe.model.document import Document
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from frappe.model.utils import get_fetch_values
|
||||
from frappe.query_builder import DocType
|
||||
@@ -846,7 +847,9 @@ def get_returned_qty_map(delivery_note):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_sales_invoice(source_name, target_doc=None, args=None):
|
||||
def make_sales_invoice(
|
||||
source_name: str, target_doc: str | Document | None = None, args: dict | str | None = None
|
||||
):
|
||||
if args is None:
|
||||
args = {}
|
||||
if isinstance(args, str):
|
||||
@@ -975,7 +978,9 @@ def make_sales_invoice(source_name, target_doc=None, args=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_delivery_trip(source_name, target_doc=None, kwargs=None):
|
||||
def make_delivery_trip(
|
||||
source_name: str, target_doc: str | Document | None = None, kwargs: dict | None = None
|
||||
):
|
||||
if not target_doc:
|
||||
target_doc = frappe.new_doc("Delivery Trip")
|
||||
doclist = get_mapped_doc(
|
||||
@@ -1001,7 +1006,9 @@ def make_delivery_trip(source_name, target_doc=None, kwargs=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_installation_note(source_name, target_doc=None, kwargs=None):
|
||||
def make_installation_note(
|
||||
source_name: str, target_doc: str | Document | None = None, kwargs: dict | None = None
|
||||
):
|
||||
def update_item(obj, target, source_parent):
|
||||
target.qty = flt(obj.qty) - flt(obj.installed_qty)
|
||||
target.serial_no = obj.serial_no
|
||||
@@ -1029,7 +1036,7 @@ def make_installation_note(source_name, target_doc=None, kwargs=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_packing_slip(source_name, target_doc=None):
|
||||
def make_packing_slip(source_name: str, target_doc: str | Document | None = None):
|
||||
def set_missing_values(source, target):
|
||||
target.run_method("set_missing_values")
|
||||
|
||||
@@ -1084,7 +1091,7 @@ def make_packing_slip(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_shipment(source_name, target_doc=None):
|
||||
def make_shipment(source_name: str, target_doc: str | Document | None = None):
|
||||
def postprocess(source, target):
|
||||
user = frappe.db.get_value(
|
||||
"User", frappe.session.user, ["email", "full_name", "phone", "mobile_no"], as_dict=1
|
||||
@@ -1159,20 +1166,20 @@ def make_shipment(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_sales_return(source_name, target_doc=None):
|
||||
def make_sales_return(source_name: str, target_doc: str | Document | None = None):
|
||||
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
||||
|
||||
return make_return_doc("Delivery Note", source_name, target_doc)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_delivery_note_status(docname, status):
|
||||
def update_delivery_note_status(docname: str, status: str):
|
||||
dn = frappe.get_lazy_doc("Delivery Note", docname)
|
||||
dn.update_status(status)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_inter_company_purchase_receipt(source_name, target_doc=None):
|
||||
def make_inter_company_purchase_receipt(source_name: str, target_doc: str | Document | None = None):
|
||||
return make_inter_company_transaction("Delivery Note", source_name, target_doc)
|
||||
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ class DeliveryTrip(Document):
|
||||
frappe.msgprint(_("Delivery Notes {0} updated").format(", ".join(delivery_notes_updated)))
|
||||
|
||||
@frappe.whitelist()
|
||||
def process_route(self, optimize):
|
||||
def process_route(self, optimize: bool):
|
||||
"""
|
||||
Estimate the arrival times for each stop in the Delivery Trip.
|
||||
If `optimize` is True, the stops will be re-arranged, based
|
||||
@@ -305,7 +305,7 @@ class DeliveryTrip(Document):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_contact_and_address(name):
|
||||
def get_contact_and_address(name: str):
|
||||
out = frappe._dict()
|
||||
|
||||
get_default_contact(out, name)
|
||||
@@ -367,7 +367,7 @@ def get_default_address(out, name):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_contact_display(contact):
|
||||
def get_contact_display(contact: str):
|
||||
contact_info = frappe.db.get_value(
|
||||
"Contact", contact, ["first_name", "last_name", "phone", "mobile_no"], as_dict=1
|
||||
)
|
||||
@@ -403,7 +403,7 @@ def sanitize_address(address):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def notify_customers(delivery_trip):
|
||||
def notify_customers(delivery_trip: str):
|
||||
delivery_trip = frappe.get_doc("Delivery Trip", delivery_trip)
|
||||
|
||||
context = delivery_trip.as_dict()
|
||||
@@ -468,7 +468,7 @@ def get_attachments(delivery_stop):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_driver_email(driver):
|
||||
def get_driver_email(driver: str):
|
||||
employee = frappe.db.get_value("Driver", driver, "employee")
|
||||
email = frappe.db.get_value("Employee", employee, "prefered_email")
|
||||
return {"email": email}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and contributors
|
||||
# For license information, please see license.txt
|
||||
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _, bold, scrub
|
||||
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
|
||||
@@ -306,7 +308,12 @@ def field_exists(doctype, fieldname) -> str or None:
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_inventory_documents(
|
||||
doctype=None, txt=None, searchfield=None, start=None, page_len=None, filters=None
|
||||
doctype: Any | None = None,
|
||||
txt: str | None = None,
|
||||
searchfield: str | None = None,
|
||||
start: int | None = None,
|
||||
page_len: int | None = None,
|
||||
filters: dict | None = None,
|
||||
):
|
||||
and_filters = [["DocField", "parent", "not in", ["Batch", "Serial No", "Item Price"]]]
|
||||
or_filters = [
|
||||
@@ -395,13 +402,13 @@ def get_inventory_dimensions():
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def delete_dimension(dimension):
|
||||
def delete_dimension(dimension: str):
|
||||
doc = frappe.get_doc("Inventory Dimension", dimension)
|
||||
doc.delete()
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_parent_fields(child_doctype, dimension_name):
|
||||
def get_parent_fields(child_doctype: str, dimension_name: str):
|
||||
parent_doctypes = frappe.get_all("DocField", fields=["parent"], filters={"options": child_doctype})
|
||||
|
||||
fields = []
|
||||
|
||||
@@ -1341,7 +1341,7 @@ def set_item_default(item_code, company, fieldname, value):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_item_details(item_code, company=None):
|
||||
def get_item_details(item_code: str, company: str | None = None):
|
||||
out = frappe._dict()
|
||||
if company:
|
||||
out = get_item_defaults(item_code, company) or frappe._dict()
|
||||
@@ -1353,7 +1353,7 @@ def get_item_details(item_code, company=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_uom_conv_factor(uom, stock_uom):
|
||||
def get_uom_conv_factor(uom: str | None, stock_uom: str | None):
|
||||
"""Get UOM conversion factor from uom to stock_uom
|
||||
e.g. uom = "Kg", stock_uom = "Gram" then returns 1000.0
|
||||
"""
|
||||
@@ -1399,7 +1399,7 @@ def get_uom_conv_factor(uom, stock_uom):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_item_attribute(parent, attribute_value=""):
|
||||
def get_item_attribute(parent: str, attribute_value: str = ""):
|
||||
"""Used for providing auto-completions in child table."""
|
||||
if not frappe.has_permission("Item"):
|
||||
frappe.throw(_("No Permission"))
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
# For license information, please see license.txt
|
||||
|
||||
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
@@ -83,7 +85,7 @@ class ItemAlternative(Document):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_alternative_items(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_alternative_items(doctype: Any, txt: str, searchfield: Any, start: int, page_len: int, filters: dict):
|
||||
return frappe.db.sql(
|
||||
f""" (select alternative_item_code from `tabItem Alternative`
|
||||
where item_code = %(item_code)s and alternative_item_code like %(txt)s)
|
||||
|
||||
@@ -86,7 +86,7 @@ class ItemManufacturer(Document):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_item_manufacturer_part_no(item_code, manufacturer):
|
||||
def get_item_manufacturer_part_no(item_code: str, manufacturer: str):
|
||||
return frappe.db.get_value(
|
||||
"Item Manufacturer",
|
||||
{"item_code": item_code, "manufacturer": manufacturer},
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
# For license information, please see license.txt
|
||||
|
||||
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
@@ -221,7 +223,7 @@ class LandedCostVoucher(Document):
|
||||
)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_receipt_document_details(self, receipt_document_type, receipt_document):
|
||||
def get_receipt_document_details(self, receipt_document_type: str, receipt_document: str):
|
||||
if receipt_document_type in [
|
||||
"Purchase Invoice",
|
||||
"Purchase Receipt",
|
||||
@@ -356,7 +358,7 @@ class LandedCostVoucher(Document):
|
||||
)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_vendor_invoice_amount(self, vendor_invoice):
|
||||
def get_vendor_invoice_amount(self, vendor_invoice: str):
|
||||
filters = frappe._dict(
|
||||
{
|
||||
"name": vendor_invoice,
|
||||
@@ -427,7 +429,9 @@ def get_pr_items(purchase_receipt):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_vendor_invoices(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_vendor_invoices(
|
||||
doctype: str, txt: str | None, searchfield: Any, start: int, page_len: int, filters: dict
|
||||
):
|
||||
if not frappe.has_permission("Purchase Invoice", "read"):
|
||||
return []
|
||||
|
||||
|
||||
@@ -6,10 +6,12 @@
|
||||
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
import frappe.defaults
|
||||
from frappe import _, msgprint
|
||||
from frappe.model.document import Document
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from frappe.query_builder import Order
|
||||
from frappe.query_builder.functions import Sum
|
||||
@@ -479,14 +481,16 @@ def get_list_context(context=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_status(name, status):
|
||||
def update_status(name: str, status: str):
|
||||
material_request = frappe.get_doc("Material Request", name)
|
||||
material_request.check_permission("write")
|
||||
material_request.update_status(status)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_purchase_order(source_name, target_doc=None, args=None):
|
||||
def make_purchase_order(
|
||||
source_name: str, target_doc: str | Document | None = None, args: dict | str | None = None
|
||||
):
|
||||
if args is None:
|
||||
args = {}
|
||||
if isinstance(args, str):
|
||||
@@ -563,7 +567,7 @@ def make_purchase_order(source_name, target_doc=None, args=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_request_for_quotation(source_name, target_doc=None):
|
||||
def make_request_for_quotation(source_name: str, target_doc: str | Document | None = None):
|
||||
doclist = get_mapped_doc(
|
||||
"Material Request",
|
||||
source_name,
|
||||
@@ -588,7 +592,9 @@ def make_request_for_quotation(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_purchase_order_based_on_supplier(source_name, target_doc=None, args=None):
|
||||
def make_purchase_order_based_on_supplier(
|
||||
source_name: str, target_doc: str | Document | None = None, args: dict | None = None
|
||||
):
|
||||
mr = source_name
|
||||
|
||||
supplier_items = get_items_based_on_default_supplier(args.get("supplier"))
|
||||
@@ -631,7 +637,7 @@ def make_purchase_order_based_on_supplier(source_name, target_doc=None, args=Non
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_items_based_on_default_supplier(supplier):
|
||||
def get_items_based_on_default_supplier(supplier: str):
|
||||
supplier_items = [
|
||||
d.parent
|
||||
for d in frappe.db.get_all(
|
||||
@@ -644,7 +650,9 @@ def get_items_based_on_default_supplier(supplier):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_material_requests_based_on_supplier(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_material_requests_based_on_supplier(
|
||||
doctype: Any, txt: str, searchfield: Any, start: int, page_len: int, filters: dict
|
||||
):
|
||||
supplier = filters.get("supplier")
|
||||
supplier_items = get_items_based_on_default_supplier(supplier)
|
||||
|
||||
@@ -688,7 +696,9 @@ def get_material_requests_based_on_supplier(doctype, txt, searchfield, start, pa
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_default_supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_default_supplier_query(
|
||||
doctype: Any, txt: str, searchfield: str, start: int, page_len: int, filters: dict
|
||||
):
|
||||
doc = frappe.get_doc("Material Request", filters.get("doc"))
|
||||
item_list = []
|
||||
for d in doc.items:
|
||||
@@ -718,7 +728,7 @@ def get_default_supplier_query(doctype, txt, searchfield, start, page_len, filte
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_supplier_quotation(source_name, target_doc=None):
|
||||
def make_supplier_quotation(source_name: str, target_doc: str | Document | None = None):
|
||||
def postprocess(source, target_doc):
|
||||
set_missing_values(source, target_doc)
|
||||
|
||||
@@ -748,7 +758,7 @@ def make_supplier_quotation(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: str | Document | None = None):
|
||||
def update_item(obj, target, source_parent):
|
||||
qty = (
|
||||
flt(flt(obj.stock_qty) - flt(obj.ordered_qty)) / target.conversion_factor
|
||||
@@ -841,7 +851,7 @@ def make_stock_entry(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def raise_work_orders(material_request, company):
|
||||
def raise_work_orders(material_request: str, company: str):
|
||||
mr = frappe.get_doc("Material Request", material_request)
|
||||
errors = []
|
||||
work_orders = []
|
||||
@@ -912,7 +922,7 @@ def raise_work_orders(material_request, company):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_pick_list(source_name, target_doc=None):
|
||||
def create_pick_list(source_name: str, target_doc: str | Document | None = None):
|
||||
def update_item(obj, target, source_parent):
|
||||
qty = flt((obj.stock_qty - obj.picked_qty) / target.conversion_factor, obj.precision("qty"))
|
||||
target.qty = qty
|
||||
@@ -951,7 +961,7 @@ def create_pick_list(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_in_transit_stock_entry(source_name, in_transit_warehouse):
|
||||
def make_in_transit_stock_entry(source_name: str, in_transit_warehouse: str):
|
||||
ste_doc = make_stock_entry(source_name)
|
||||
ste_doc.add_to_transit = 1
|
||||
ste_doc.to_warehouse = in_transit_warehouse
|
||||
|
||||
@@ -366,7 +366,7 @@ def on_doctype_update():
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_items_from_product_bundle(row):
|
||||
def get_items_from_product_bundle(row: str):
|
||||
row, items = ItemDetailsCtx(json.loads(row)), []
|
||||
|
||||
bundled_items = get_product_bundle_items(row["item_code"])
|
||||
|
||||
@@ -206,7 +206,7 @@ class PackingSlip(StatusUpdater):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def item_details(doctype, txt, searchfield, start, page_len, filters):
|
||||
def item_details(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict):
|
||||
from erpnext.controllers.queries import get_match_cond
|
||||
|
||||
return frappe.db.sql(
|
||||
|
||||
@@ -4,9 +4,11 @@
|
||||
import json
|
||||
from collections import OrderedDict, defaultdict
|
||||
from itertools import groupby
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _, bold
|
||||
from frappe.model.document import Document
|
||||
from frappe.model.mapper import map_child_doc
|
||||
from frappe.query_builder import Case
|
||||
from frappe.query_builder.custom import GROUP_CONCAT
|
||||
@@ -428,7 +430,7 @@ class PickList(TransactionBase):
|
||||
frappe.get_doc("Sales Order", sales_order, for_update=True).update_picking_status()
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_stock_reservation_entries(self, notify=True) -> None:
|
||||
def create_stock_reservation_entries(self, notify: bool = True) -> None:
|
||||
"""Creates Stock Reservation Entries for Sales Order Items against Pick List."""
|
||||
|
||||
so_items_details_map = {}
|
||||
@@ -455,7 +457,7 @@ class PickList(TransactionBase):
|
||||
)
|
||||
|
||||
@frappe.whitelist()
|
||||
def cancel_stock_reservation_entries(self, notify=True) -> None:
|
||||
def cancel_stock_reservation_entries(self, notify: bool = True) -> None:
|
||||
"""Cancel Stock Reservation Entries for Sales Order Items created against Pick List."""
|
||||
|
||||
from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import (
|
||||
@@ -480,7 +482,7 @@ class PickList(TransactionBase):
|
||||
)
|
||||
|
||||
@frappe.whitelist()
|
||||
def set_item_locations(self, save=False):
|
||||
def set_item_locations(self, save: bool = False):
|
||||
self.validate_for_qty()
|
||||
items = self.aggregate_item_qty()
|
||||
picked_items_details = self.get_picked_items_details(items)
|
||||
@@ -1209,7 +1211,7 @@ def get_available_item_locations_for_other_item(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_delivery_note(source_name, target_doc=None):
|
||||
def create_delivery_note(source_name: str, target_doc: str | Document | None = None):
|
||||
pick_list = frappe.get_doc("Pick List", source_name)
|
||||
validate_item_locations(pick_list)
|
||||
sales_dict = dict()
|
||||
@@ -1280,7 +1282,9 @@ def create_dn_wo_so(pick_list, delivery_note=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_dn_for_pick_lists(source_name, target_doc=None, kwargs=None):
|
||||
def create_dn_for_pick_lists(
|
||||
source_name: str, target_doc: str | Document | None = None, kwargs: dict | str | None = None
|
||||
):
|
||||
"""Get Items from Multiple Pick Lists and create a Delivery Note for filtered customer"""
|
||||
if kwargs is None:
|
||||
kwargs = {}
|
||||
@@ -1428,7 +1432,7 @@ def add_product_bundles_to_delivery_note(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_stock_entry(pick_list):
|
||||
def create_stock_entry(pick_list: str):
|
||||
pick_list = frappe.get_doc(json.loads(pick_list))
|
||||
validate_item_locations(pick_list)
|
||||
|
||||
@@ -1454,7 +1458,15 @@ def create_stock_entry(pick_list):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filters, as_dict):
|
||||
def get_pending_work_orders(
|
||||
doctype: Any,
|
||||
txt: str,
|
||||
searchfield: str,
|
||||
start: int,
|
||||
page_length: int,
|
||||
filters: dict,
|
||||
as_dict: bool = False,
|
||||
):
|
||||
wo = frappe.qb.DocType("Work Order")
|
||||
return (
|
||||
frappe.qb.from_(wo)
|
||||
@@ -1474,7 +1486,9 @@ def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filte
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_item_details(item_code, uom=None, warehouse=None, company=None):
|
||||
def get_item_details(
|
||||
item_code: str, uom: str | None = None, warehouse: str | None = None, company: str | None = None
|
||||
):
|
||||
details = frappe.db.get_value("Item", item_code, "stock_uom", as_dict=1)
|
||||
details.uom = uom or details.stock_uom
|
||||
if uom:
|
||||
@@ -1610,7 +1624,7 @@ def get_rejected_warehouses():
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_pick_list_query(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_pick_list_query(doctype: Any, txt: str, searchfield: Any, start: int, page_len: int, filters: dict):
|
||||
frappe.has_permission("Pick List", throw=True)
|
||||
|
||||
if not filters.get("company"):
|
||||
|
||||
@@ -7,6 +7,7 @@ import json
|
||||
import frappe
|
||||
from frappe import _, throw
|
||||
from frappe.desk.notifications import clear_doctype_notifications
|
||||
from frappe.model.document import Document
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from frappe.query_builder.functions import Abs, CombineDatetime, Sum
|
||||
from frappe.utils import cint, flt, get_datetime, getdate, nowdate
|
||||
@@ -246,7 +247,8 @@ class PurchaseReceipt(BuyingController):
|
||||
from erpnext.stock.doctype.putaway_rule.putaway_rule import apply_putaway_rule
|
||||
|
||||
if self.get("items") and self.apply_putaway_rule and not self.get("is_return"):
|
||||
apply_putaway_rule(self.doctype, self.get("items"), self.company)
|
||||
if items := apply_putaway_rule(self.doctype, self.get("items"), self.company):
|
||||
self.items = items
|
||||
|
||||
def validate(self):
|
||||
self.validate_posting_time()
|
||||
@@ -1401,7 +1403,9 @@ def get_item_wise_returned_qty(pr_doc):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_purchase_invoice(source_name, target_doc=None, args=None):
|
||||
def make_purchase_invoice(
|
||||
source_name: str | None, target_doc: str | Document | None = None, args: dict | str | None = None
|
||||
):
|
||||
if args is None:
|
||||
args = {}
|
||||
if isinstance(args, str):
|
||||
@@ -1554,14 +1558,14 @@ def get_returned_qty_map(purchase_receipt):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_purchase_return_against_rejected_warehouse(source_name):
|
||||
def make_purchase_return_against_rejected_warehouse(source_name: str):
|
||||
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
||||
|
||||
return make_return_doc("Purchase Receipt", source_name, return_against_rejected_qty=True)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_purchase_return(source_name, target_doc=None):
|
||||
def make_purchase_return(source_name: str, target_doc: str | Document | None = None):
|
||||
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
||||
|
||||
return make_return_doc("Purchase Receipt", source_name, target_doc)
|
||||
@@ -1574,7 +1578,7 @@ def update_purchase_receipt_status(docname, status):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_stock_entry(source_name, target_doc=None):
|
||||
def make_stock_entry(source_name: str, target_doc: str | Document | None = None):
|
||||
def set_missing_values(source, target):
|
||||
target.stock_entry_type = "Material Transfer"
|
||||
target.purpose = "Material Transfer"
|
||||
@@ -1634,7 +1638,7 @@ def make_stock_entry(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_inter_company_delivery_note(source_name, target_doc=None):
|
||||
def make_inter_company_delivery_note(source_name: str, target_doc: str | Document | None = None):
|
||||
return make_inter_company_transaction("Purchase Receipt", source_name, target_doc)
|
||||
|
||||
|
||||
@@ -1644,7 +1648,7 @@ def update_regional_gl_entries(gl_list, doc):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_lcv(doctype, docname):
|
||||
def make_lcv(doctype: str, docname: str):
|
||||
landed_cost_voucher = frappe.new_doc("Landed Cost Voucher")
|
||||
|
||||
details = frappe.db.get_value(doctype, docname, ["supplier", "company", "base_grand_total"], as_dict=1)
|
||||
|
||||
@@ -90,7 +90,7 @@ class PutawayRule(Document):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_available_putaway_capacity(rule):
|
||||
def get_available_putaway_capacity(rule: str):
|
||||
stock_capacity, item_code, warehouse = frappe.db.get_value(
|
||||
"Putaway Rule", rule, ["stock_capacity", "item_code", "warehouse"]
|
||||
)
|
||||
@@ -100,7 +100,9 @@ def get_available_putaway_capacity(rule):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def apply_putaway_rule(doctype, items, company, sync=None, purpose=None):
|
||||
def apply_putaway_rule(
|
||||
doctype: str, items: list | str, company: str, sync: str | bool | None = None, purpose: str | None = None
|
||||
):
|
||||
"""Applies Putaway Rule on line items.
|
||||
|
||||
items: List of Purchase Receipt/Stock Entry Items
|
||||
@@ -193,8 +195,8 @@ def apply_putaway_rule(doctype, items, company, sync=None, purpose=None):
|
||||
show_unassigned_items_message(items_not_accomodated)
|
||||
|
||||
if updated_table and _items_changed(items, updated_table, doctype):
|
||||
items[:] = updated_table
|
||||
frappe.msgprint(_("Applied putaway rules."), alert=True)
|
||||
return updated_table
|
||||
|
||||
if sync and json.loads(sync): # sync with client side
|
||||
return items
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
@@ -364,7 +366,7 @@ class QualityInspection(Document):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def item_query(doctype, txt, searchfield, start, page_len, filters):
|
||||
def item_query(doctype: Any, txt: str | None, searchfield: Any, start: int, page_len: int, filters: dict):
|
||||
from frappe.desk.reportview import get_match_cond
|
||||
|
||||
from_doctype = cstr(filters.get("from"))
|
||||
@@ -420,7 +422,9 @@ def item_query(doctype, txt, searchfield, start, page_len, filters):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def quality_inspection_query(doctype, txt, searchfield, start, page_len, filters):
|
||||
def quality_inspection_query(
|
||||
doctype: Any, txt: str | None, searchfield: Any, start: int, page_len: int, filters: dict
|
||||
):
|
||||
return frappe.get_all(
|
||||
"Quality Inspection",
|
||||
limit_start=start,
|
||||
@@ -437,7 +441,7 @@ def quality_inspection_query(doctype, txt, searchfield, start, page_len, filters
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_quality_inspection(source_name, target_doc=None):
|
||||
def make_quality_inspection(source_name: str, target_doc: Document | str | None = None):
|
||||
def postprocess(source, doc):
|
||||
doc.inspected_by = frappe.session.user
|
||||
doc.get_quality_inspection_template()
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
from frappe.utils.data import DateTimeLikeObject
|
||||
|
||||
from erpnext.stock.utils import get_stock_balance, get_stock_value_on
|
||||
|
||||
@@ -32,7 +33,7 @@ class QuickStockBalance(Document):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_stock_item_details(warehouse, date, item=None, barcode=None):
|
||||
def get_stock_item_details(warehouse: str, date: str, item: str | None = None, barcode: str | None = None):
|
||||
out = {}
|
||||
if barcode:
|
||||
out["item"] = frappe.db.get_value("Item Barcode", filters={"barcode": barcode}, fieldname=["parent"])
|
||||
|
||||
@@ -332,7 +332,7 @@ class RepostItemValuation(Document):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def bulk_restart_reposting(names):
|
||||
def bulk_restart_reposting(names: str):
|
||||
names = json.loads(names)
|
||||
for name in names:
|
||||
doc = frappe.get_doc("Repost Item Valuation", name)
|
||||
|
||||
@@ -5,6 +5,7 @@ import collections
|
||||
import csv
|
||||
import json
|
||||
from collections import Counter, defaultdict
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
import frappe.query_builder
|
||||
@@ -27,6 +28,7 @@ from frappe.utils import (
|
||||
)
|
||||
from frappe.utils.csvutils import build_csv_response
|
||||
|
||||
from erpnext.stock.doctype.purchase_receipt_item.purchase_receipt_item import PurchaseReceiptItem
|
||||
from erpnext.stock.serial_batch_bundle import (
|
||||
BatchNoValuation,
|
||||
SerialNoValuation,
|
||||
@@ -1631,7 +1633,7 @@ class SerialandBatchBundle(Document):
|
||||
self.delink_reference_from_batch()
|
||||
|
||||
@frappe.whitelist()
|
||||
def add_serial_batch(self, data):
|
||||
def add_serial_batch(self, data: str | dict):
|
||||
serial_nos, batch_nos = [], []
|
||||
if isinstance(data, str):
|
||||
data = parse_json(data)
|
||||
@@ -1658,7 +1660,7 @@ class SerialandBatchBundle(Document):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def download_blank_csv_template(content):
|
||||
def download_blank_csv_template(content: str | list):
|
||||
csv_data = []
|
||||
if isinstance(content, str):
|
||||
content = parse_json(content)
|
||||
@@ -1672,7 +1674,7 @@ def download_blank_csv_template(content):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def upload_csv_file(item_code, file_path):
|
||||
def upload_csv_file(item_code: str, file_path: str):
|
||||
serial_nos, batch_nos = [], []
|
||||
serial_nos, batch_nos = get_serial_batch_from_csv(item_code, file_path)
|
||||
|
||||
@@ -1770,7 +1772,7 @@ def get_serial_batch_from_data(item_code, kwargs):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_serial_nos(item_code, serial_nos):
|
||||
def create_serial_nos(item_code: str, serial_nos: list | str):
|
||||
serial_nos = get_serial_batch_from_data(
|
||||
item_code,
|
||||
{
|
||||
@@ -1887,7 +1889,9 @@ def make_batch_nos(item_code, batch_nos):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
|
||||
def item_query(
|
||||
doctype: Any, txt: str, searchfield: str, start: int, page_len: int, filters: Any, as_dict: bool = False
|
||||
):
|
||||
item_filters = {"disabled": 0}
|
||||
if txt:
|
||||
item_filters["name"] = ("like", f"%{txt}%")
|
||||
@@ -1902,7 +1906,13 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_serial_batch_ledgers(item_code=None, docstatus=None, voucher_no=None, name=None, child_row=None):
|
||||
def get_serial_batch_ledgers(
|
||||
item_code: str | None = None,
|
||||
docstatus: str | list | int | None = None,
|
||||
voucher_no: str | None = None,
|
||||
name: str | list | None = None,
|
||||
child_row: dict | str | None = None,
|
||||
):
|
||||
filters = get_filters_for_bundle(
|
||||
item_code=item_code, docstatus=docstatus, voucher_no=voucher_no, name=name, child_row=child_row
|
||||
)
|
||||
@@ -1978,7 +1988,13 @@ def get_reference_serial_and_batch_bundle(child_row):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def add_serial_batch_ledgers(entries, child_row, doc, warehouse, do_not_save=False) -> object:
|
||||
def add_serial_batch_ledgers(
|
||||
entries: list | str,
|
||||
child_row: PurchaseReceiptItem | dict | str,
|
||||
doc: Document,
|
||||
warehouse: str | None = None,
|
||||
do_not_save: bool = False,
|
||||
):
|
||||
if isinstance(child_row, str):
|
||||
child_row = frappe._dict(parse_json(child_row))
|
||||
|
||||
@@ -2131,7 +2147,7 @@ def update_serial_batch_no_ledgers(bundle, entries, child_row, parent_doc, wareh
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_serial_or_batch(bundle_id, serial_no=None, batch_no=None):
|
||||
def update_serial_or_batch(bundle_id: str, serial_no: str | None = None, batch_no: str | None = None):
|
||||
if batch_no and not serial_no:
|
||||
if qty := frappe.db.get_value(
|
||||
"Serial and Batch Entry", {"parent": bundle_id, "batch_no": batch_no}, "qty"
|
||||
@@ -3303,12 +3319,14 @@ def get_stock_ledgers_batches(kwargs):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_batch_no_from_serial_no(serial_no):
|
||||
def get_batch_no_from_serial_no(serial_no: str):
|
||||
return frappe.get_cached_value("Serial No", serial_no, "batch_no")
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def is_serial_batch_no_exists(item_code, type_of_transaction, serial_no=None, batch_no=None):
|
||||
def is_serial_batch_no_exists(
|
||||
item_code: str, type_of_transaction: str, serial_no: str | None = None, batch_no: str | None = None
|
||||
):
|
||||
if serial_no and not frappe.db.exists("Serial No", serial_no):
|
||||
if type_of_transaction != "Inward":
|
||||
frappe.throw(_("Serial No {0} does not exists").format(serial_no))
|
||||
@@ -3337,7 +3355,7 @@ def make_batch_no(batch_no, item_code):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def is_duplicate_serial_no(bundle_id, serial_no):
|
||||
def is_duplicate_serial_no(bundle_id: str, serial_no: str):
|
||||
return frappe.db.exists("Serial and Batch Entry", {"parent": bundle_id, "serial_no": serial_no})
|
||||
|
||||
|
||||
|
||||
@@ -221,7 +221,7 @@ def auto_fetch_serial_number(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_pos_reserved_serial_nos(filters):
|
||||
def get_pos_reserved_serial_nos(filters: str | dict):
|
||||
if isinstance(filters, str):
|
||||
filters = json.loads(filters)
|
||||
|
||||
|
||||
@@ -114,19 +114,19 @@ class Shipment(Document):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_address_name(ref_doctype, docname):
|
||||
def get_address_name(ref_doctype: str, docname: str):
|
||||
# Return address name
|
||||
return get_party_shipping_address(ref_doctype, docname)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_contact_name(ref_doctype, docname):
|
||||
def get_contact_name(ref_doctype: str, docname: str):
|
||||
# Return address name
|
||||
return get_default_contact(ref_doctype, docname)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_company_contact(user):
|
||||
def get_company_contact(user: str):
|
||||
contact = frappe.db.get_value(
|
||||
"User",
|
||||
user,
|
||||
|
||||
@@ -7,6 +7,7 @@ from collections import defaultdict
|
||||
|
||||
import frappe
|
||||
from frappe import _, bold
|
||||
from frappe.model.document import Document
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from frappe.query_builder import DocType
|
||||
from frappe.query_builder.functions import Sum
|
||||
@@ -215,7 +216,10 @@ class StockEntry(StockController, SubcontractingInwardController):
|
||||
apply_rule = self.apply_putaway_rule and (self.purpose in ["Material Transfer", "Material Receipt"])
|
||||
|
||||
if self.get("items") and apply_rule:
|
||||
apply_putaway_rule(self.doctype, self.get("items"), self.company, purpose=self.purpose)
|
||||
if items := apply_putaway_rule(
|
||||
self.doctype, self.get("items"), self.company, purpose=self.purpose
|
||||
):
|
||||
self.items = items
|
||||
|
||||
if self.project:
|
||||
for item in self.items:
|
||||
@@ -2094,7 +2098,7 @@ class StockEntry(StockController, SubcontractingInwardController):
|
||||
return False
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_item_details(self, args: ItemDetailsCtx = None, for_update=False):
|
||||
def get_item_details(self, args: ItemDetailsCtx | None = None, for_update: bool = False):
|
||||
item = frappe.qb.DocType("Item")
|
||||
item_default = frappe.qb.DocType("Item Default")
|
||||
|
||||
@@ -3515,7 +3519,7 @@ class StockEntry(StockController, SubcontractingInwardController):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def move_sample_to_retention_warehouse(company, items):
|
||||
def move_sample_to_retention_warehouse(company: str, items: str | list):
|
||||
from erpnext.stock.serial_batch_bundle import (
|
||||
SerialBatchCreation,
|
||||
get_batch_nos,
|
||||
@@ -3596,7 +3600,7 @@ def move_sample_to_retention_warehouse(company, items):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_stock_in_entry(source_name, target_doc=None):
|
||||
def make_stock_in_entry(source_name: str, target_doc: str | Document | None = None):
|
||||
def set_missing_values(source, target):
|
||||
target.stock_entry_type = "Material Transfer"
|
||||
target.set_missing_values()
|
||||
@@ -3647,7 +3651,7 @@ def make_stock_in_entry(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_work_order_details(work_order, company):
|
||||
def get_work_order_details(work_order: str, company: str):
|
||||
work_order = frappe.get_doc("Work Order", work_order)
|
||||
pending_qty_to_produce = flt(work_order.qty) - flt(work_order.produced_qty)
|
||||
|
||||
@@ -3766,7 +3770,7 @@ def get_valuation_rate_for_finished_good_entry(work_order):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_uom_details(item_code, uom, qty):
|
||||
def get_uom_details(item_code: str, uom: str, qty: float | None):
|
||||
"""Returns dict `{"conversion_factor": [value], "transfer_qty": qty * [value]}`
|
||||
:param args: dict with `item_code`, `uom` and `qty`"""
|
||||
conversion_factor = get_conversion_factor(item_code, uom).get("conversion_factor")
|
||||
@@ -3825,7 +3829,7 @@ def get_expired_batches():
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_warehouse_details(args):
|
||||
def get_warehouse_details(args: str | dict):
|
||||
if isinstance(args, str):
|
||||
args = json.loads(args)
|
||||
|
||||
@@ -3847,7 +3851,7 @@ def get_warehouse_details(args):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def validate_sample_quantity(item_code, sample_quantity, qty, batch_no=None):
|
||||
def validate_sample_quantity(item_code: str, sample_quantity: int, qty: float, batch_no: str | None = None):
|
||||
if cint(qty) < cint(sample_quantity):
|
||||
frappe.throw(
|
||||
_("Sample quantity {0} cannot be more than received quantity {1}").format(sample_quantity, qty)
|
||||
@@ -3916,7 +3920,7 @@ def get_supplied_items(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_items_from_subcontract_order(source_name, target_doc=None):
|
||||
def get_items_from_subcontract_order(source_name: str, target_doc: str | Document | None = None):
|
||||
from erpnext.controllers.subcontracting_controller import make_rm_stock_entry
|
||||
|
||||
if isinstance(target_doc, str):
|
||||
|
||||
@@ -2,9 +2,12 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import frappe
|
||||
from frappe import _, bold, json, msgprint
|
||||
from frappe.utils import add_to_date, cint, cstr, flt, now
|
||||
from frappe.utils.data import DateTimeLikeObject
|
||||
|
||||
import erpnext
|
||||
from erpnext.accounts.utils import get_company_default
|
||||
@@ -16,6 +19,7 @@ from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle impor
|
||||
get_available_serial_nos,
|
||||
)
|
||||
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
|
||||
from erpnext.stock.doctype.stock_reconciliation_item.stock_reconciliation_item import StockReconciliationItem
|
||||
from erpnext.stock.utils import get_combine_datetime, get_incoming_rate, get_stock_balance
|
||||
|
||||
|
||||
@@ -1260,7 +1264,14 @@ def get_batch_qty_for_stock_reco(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_items(warehouse, posting_date, posting_time, company, item_code=None, ignore_empty_stock=False):
|
||||
def get_items(
|
||||
warehouse: str,
|
||||
posting_date: DateTimeLikeObject,
|
||||
posting_time: DateTimeLikeObject,
|
||||
company: str,
|
||||
item_code: str | None = None,
|
||||
ignore_empty_stock: bool | str | int = False,
|
||||
):
|
||||
ignore_empty_stock = cint(ignore_empty_stock)
|
||||
items = []
|
||||
if item_code and warehouse:
|
||||
@@ -1426,13 +1437,13 @@ def get_itemwise_batch(warehouse, posting_date, company, item_code=None):
|
||||
def get_stock_balance_for(
|
||||
item_code: str,
|
||||
warehouse: str,
|
||||
posting_date,
|
||||
posting_time,
|
||||
posting_date: DateTimeLikeObject,
|
||||
posting_time: DateTimeLikeObject | timedelta,
|
||||
batch_no: str | None = None,
|
||||
with_valuation_rate: bool = True,
|
||||
inventory_dimensions_dict=None,
|
||||
row=None,
|
||||
company=None,
|
||||
inventory_dimensions_dict: dict | None = None,
|
||||
row: StockReconciliationItem | str | dict | None = None,
|
||||
company: str | None = None,
|
||||
):
|
||||
frappe.has_permission("Stock Reconciliation", "write", throw=True)
|
||||
|
||||
@@ -1519,7 +1530,7 @@ def get_stock_balance_for(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_difference_account(purpose, company):
|
||||
def get_difference_account(purpose: str, company: str):
|
||||
if purpose == "Stock Reconciliation":
|
||||
account = get_company_default(company, "stock_adjustment_account")
|
||||
else:
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _, throw
|
||||
@@ -191,7 +192,13 @@ class Warehouse(NestedSet):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_children(doctype, parent=None, company=None, is_root=False, include_disabled=False):
|
||||
def get_children(
|
||||
doctype: str,
|
||||
parent: str | None = None,
|
||||
company: str | None = None,
|
||||
is_root: bool = False,
|
||||
include_disabled: bool | str = False,
|
||||
):
|
||||
if is_root:
|
||||
parent = ""
|
||||
|
||||
@@ -224,7 +231,7 @@ def add_node():
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def convert_to_group_or_ledger(docname=None):
|
||||
def convert_to_group_or_ledger(docname: str | None = None):
|
||||
if not docname:
|
||||
docname = frappe.form_dict.docname
|
||||
return frappe.get_doc("Warehouse", docname).convert_to_group_or_ledger()
|
||||
@@ -299,7 +306,9 @@ def apply_warehouse_filter(query, sle, filters):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_warehouses_for_reorder(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_warehouses_for_reorder(
|
||||
doctype: str, txt: Any, searchfield: Any, start: int, page_len: int, filters: dict
|
||||
):
|
||||
filters = frappe._dict(filters or {})
|
||||
|
||||
if filters.warehouse and not frappe.db.exists("Warehouse", filters.warehouse):
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _, throw
|
||||
@@ -54,7 +55,12 @@ def _preprocess_ctx(ctx):
|
||||
|
||||
@frappe.whitelist()
|
||||
@erpnext.normalize_ctx_input(ItemDetailsCtx)
|
||||
def get_item_details(ctx, doc=None, for_validate=False, overwrite_warehouse=True) -> ItemDetails:
|
||||
def get_item_details(
|
||||
ctx: ItemDetailsCtx,
|
||||
doc: Document | str | None = None,
|
||||
for_validate: bool = False,
|
||||
overwrite_warehouse: bool = True,
|
||||
):
|
||||
"""
|
||||
ctx = {
|
||||
"item_code": "",
|
||||
@@ -649,7 +655,13 @@ def get_barcode_data(items_list=None, item_code=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_item_tax_info(doc, tax_category, item_codes, item_rates=None, item_tax_templates=None):
|
||||
def get_item_tax_info(
|
||||
doc: Document | str | None,
|
||||
tax_category: str,
|
||||
item_codes: list,
|
||||
item_rates: dict | None = None,
|
||||
item_tax_templates: dict | None = None,
|
||||
):
|
||||
out = {}
|
||||
|
||||
if item_tax_templates is None:
|
||||
@@ -690,7 +702,7 @@ def get_item_tax_info(doc, tax_category, item_codes, item_rates=None, item_tax_t
|
||||
|
||||
@frappe.whitelist()
|
||||
@erpnext.normalize_ctx_input(ItemDetailsCtx)
|
||||
def get_item_tax_template(ctx, item=None, out: ItemDetails | None = None):
|
||||
def get_item_tax_template(ctx: ItemDetailsCtx, item: Document | None = None, out: ItemDetails | None = None):
|
||||
"""
|
||||
Determines item_tax template from item or parent item groups.
|
||||
|
||||
@@ -821,7 +833,7 @@ def is_within_valid_range(ctx: ItemDetailsCtx, tax) -> bool:
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_item_tax_map(*, doc: str | dict | Document, tax_template: str | None = None, as_json=True):
|
||||
def get_item_tax_map(*, doc: str | dict | Document, tax_template: str | None = None, as_json: bool = True):
|
||||
doc = parse_json(doc)
|
||||
item_tax_map = {}
|
||||
for t in (t for t in (doc.get("taxes") or []) if not t.get("set_by_item_tax_template")):
|
||||
@@ -838,7 +850,7 @@ def get_item_tax_map(*, doc: str | dict | Document, tax_template: str | None = N
|
||||
|
||||
@frappe.whitelist()
|
||||
@erpnext.normalize_ctx_input(ItemDetailsCtx)
|
||||
def calculate_service_end_date(ctx: ItemDetailsCtx, item=None):
|
||||
def calculate_service_end_date(ctx: ItemDetailsCtx, item: Document | None = None):
|
||||
_preprocess_ctx(ctx)
|
||||
if not item:
|
||||
item = frappe.get_cached_doc("Item", ctx.item_code)
|
||||
@@ -1156,7 +1168,7 @@ def get_item_price(
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_batch_based_item_price(pctx: ItemPriceCtx | dict | str, item_code) -> float:
|
||||
def get_batch_based_item_price(pctx: ItemPriceCtx | dict | str, item_code: str):
|
||||
pctx = parse_json(pctx)
|
||||
|
||||
item_price = get_item_price(pctx, item_code, force_batch_no=True)
|
||||
@@ -1172,7 +1184,7 @@ def get_batch_based_item_price(pctx: ItemPriceCtx | dict | str, item_code) -> fl
|
||||
|
||||
|
||||
@erpnext.normalize_ctx_input(ItemDetailsCtx)
|
||||
def get_price_list_rate_for(ctx: ItemDetailsCtx, item_code):
|
||||
def get_price_list_rate_for(ctx: ItemDetailsCtx, item_code: str):
|
||||
"""
|
||||
:param customer: link to Customer DocType
|
||||
:param supplier: link to Supplier DocType
|
||||
@@ -1355,7 +1367,7 @@ def get_pos_profile_item_details_(ctx: ItemDetailsCtx, company, pos_profile=None
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_pos_profile(company, pos_profile=None, user=None):
|
||||
def get_pos_profile(company: str, pos_profile: str | None = None, user: str | None = None):
|
||||
if pos_profile:
|
||||
return frappe.get_cached_doc("POS Profile", pos_profile)
|
||||
|
||||
@@ -1391,7 +1403,7 @@ def get_pos_profile(company, pos_profile=None, user=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_conversion_factor(item_code, uom):
|
||||
def get_conversion_factor(item_code: str | None, uom: str):
|
||||
item = frappe.get_cached_value("Item", item_code, ["variant_of", "stock_uom"], as_dict=True)
|
||||
if not item_code or not item or uom == item.stock_uom:
|
||||
return {"conversion_factor": 1.0}
|
||||
@@ -1422,7 +1434,7 @@ def get_conversion_factor(item_code, uom):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_projected_qty(item_code, warehouse):
|
||||
def get_projected_qty(item_code: str, warehouse: str):
|
||||
return {
|
||||
"projected_qty": frappe.db.get_value(
|
||||
"Bin", {"item_code": item_code, "warehouse": warehouse}, "projected_qty"
|
||||
@@ -1431,7 +1443,9 @@ def get_projected_qty(item_code, warehouse):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_bin_details(item_code, warehouse, company=None, include_child_warehouses=False):
|
||||
def get_bin_details(
|
||||
item_code: str, warehouse: str | None, company: str | None = None, include_child_warehouses: bool = False
|
||||
):
|
||||
bin_details = {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0}
|
||||
|
||||
if warehouse:
|
||||
@@ -1472,7 +1486,7 @@ def get_company_total_stock(item_code, company):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_batch_qty(batch_no, warehouse, item_code):
|
||||
def get_batch_qty(batch_no: str, warehouse: str, item_code: str):
|
||||
from erpnext.stock.doctype.batch import batch
|
||||
|
||||
if batch_no:
|
||||
@@ -1481,7 +1495,7 @@ def get_batch_qty(batch_no, warehouse, item_code):
|
||||
|
||||
@frappe.whitelist()
|
||||
@erpnext.normalize_ctx_input(ItemDetailsCtx)
|
||||
def apply_price_list(ctx, as_doc=False, doc=None):
|
||||
def apply_price_list(ctx: ItemDetailsCtx, as_doc: bool = False, doc: Document | None = None):
|
||||
"""Apply pricelist on a document-like dict object and return as
|
||||
{'parent': dict, 'children': list}
|
||||
|
||||
@@ -1581,7 +1595,7 @@ def get_price_list_currency_and_exchange_rate(ctx: ItemDetailsCtx):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_default_bom(item_code=None):
|
||||
def get_default_bom(item_code: str | None = None):
|
||||
def _get_bom(item):
|
||||
bom = frappe.get_all("BOM", dict(item=item, is_active=True, is_default=True, docstatus=1), limit=1)
|
||||
return bom[0].name if bom else None
|
||||
@@ -1599,7 +1613,7 @@ def get_default_bom(item_code=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_valuation_rate(item_code, company, warehouse=None):
|
||||
def get_valuation_rate(item_code: str, company: str, warehouse: str | None = None):
|
||||
if frappe.get_cached_value("Warehouse", warehouse, "is_group"):
|
||||
return {"valuation_rate": 0.0}
|
||||
|
||||
@@ -1640,7 +1654,7 @@ def get_gross_profit(out: ItemDetails):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_serial_no(_args, serial_nos=None, sales_order=None):
|
||||
def get_serial_no(_args: Any, serial_nos: list | None = None, sales_order: str | None = None):
|
||||
serial_nos = serial_nos or []
|
||||
return serial_nos
|
||||
|
||||
|
||||
@@ -134,7 +134,7 @@ def get_linked_cancelled_sabb(filters):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def fix_sabb_entries(selected_rows):
|
||||
def fix_sabb_entries(selected_rows: str | list):
|
||||
if isinstance(selected_rows, str):
|
||||
selected_rows = frappe.parse_json(selected_rows)
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
|
||||
# For license information, please see license.txt
|
||||
|
||||
from typing import Any
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
|
||||
@@ -179,7 +181,7 @@ def get_columns(filters, data):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_voucher_type(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_voucher_type(doctype: Any, txt: str, searchfield: Any, start: int, page_len: int, filters: dict):
|
||||
child_doctypes = frappe.get_all(
|
||||
"DocField",
|
||||
filters={"fieldname": "serial_and_batch_bundle"},
|
||||
@@ -196,7 +198,7 @@ def get_voucher_type(doctype, txt, searchfield, start, page_len, filters):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_serial_nos(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_serial_nos(doctype: Any, txt: str, searchfield: Any, start: int, page_len: int, filters: dict):
|
||||
query_filters = {}
|
||||
|
||||
if txt:
|
||||
@@ -224,7 +226,7 @@ def get_serial_nos(doctype, txt, searchfield, start, page_len, filters):
|
||||
|
||||
@frappe.whitelist()
|
||||
@frappe.validate_and_sanitize_search_inputs
|
||||
def get_batch_nos(doctype, txt, searchfield, start, page_len, filters):
|
||||
def get_batch_nos(doctype: Any, txt: str, searchfield: Any, start: int, page_len: int, filters: dict):
|
||||
query_filters = {}
|
||||
|
||||
if filters.get("voucher_no") and txt:
|
||||
|
||||
@@ -174,7 +174,7 @@ def get_columns(filters):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_reposting_entries(rows, company):
|
||||
def create_reposting_entries(rows: str | list, company: str):
|
||||
if isinstance(rows, str):
|
||||
rows = parse_json(rows)
|
||||
|
||||
|
||||
@@ -296,7 +296,7 @@ def get_columns():
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_reposting_entries(rows, item_code=None, warehouse=None):
|
||||
def create_reposting_entries(rows: str | list, item_code: str | None = None, warehouse: str | None = None):
|
||||
if isinstance(rows, str):
|
||||
rows = parse_json(rows)
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ def get_data(filters=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_batch_qty(selected_batches=None):
|
||||
def update_batch_qty(selected_batches: str | None = None):
|
||||
if not selected_batches:
|
||||
return
|
||||
|
||||
|
||||
@@ -2,12 +2,14 @@
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
|
||||
import datetime
|
||||
import json
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.query_builder.functions import IfNull, Sum
|
||||
from frappe.utils import cstr, flt, get_link_to_form, get_time, getdate, nowdate, nowtime
|
||||
from frappe.utils.data import DateTimeLikeObject
|
||||
|
||||
import erpnext
|
||||
from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import get_available_serial_nos
|
||||
@@ -93,13 +95,13 @@ def get_stock_value_on(
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_stock_balance(
|
||||
item_code,
|
||||
warehouse,
|
||||
posting_date=None,
|
||||
posting_time=None,
|
||||
with_valuation_rate=False,
|
||||
with_serial_no=False,
|
||||
inventory_dimensions_dict=None,
|
||||
item_code: str,
|
||||
warehouse: str,
|
||||
posting_date: DateTimeLikeObject | None = None,
|
||||
posting_time: DateTimeLikeObject | datetime.timedelta | None = None,
|
||||
with_valuation_rate: bool = False,
|
||||
with_serial_no: bool = False,
|
||||
inventory_dimensions_dict: dict | None = None,
|
||||
):
|
||||
"""Returns stock balance quantity at given warehouse on given posting date or current date.
|
||||
|
||||
@@ -165,7 +167,7 @@ def get_serial_nos_data(serial_nos):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_latest_stock_qty(item_code, warehouse=None):
|
||||
def get_latest_stock_qty(item_code: str, warehouse: str | None = None):
|
||||
values, condition = [item_code], ""
|
||||
if warehouse:
|
||||
lft, rgt, is_group = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt", "is_group"])
|
||||
@@ -237,7 +239,7 @@ def _create_bin(item_code, warehouse):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_incoming_rate(args, raise_error_if_no_rate=True, fallbacks: bool = True):
|
||||
def get_incoming_rate(args: dict | str, raise_error_if_no_rate: bool = True, fallbacks: bool = True):
|
||||
"""Get Incoming Rate based on valuation method"""
|
||||
from erpnext.stock.stock_ledger import get_previous_sle, get_valuation_rate
|
||||
|
||||
|
||||
Reference in New Issue
Block a user