refactor(treewide): formatting and ruff fixes, + manually enabled F401
Signed-off-by: Akhil Narang <me@akhilnarang.dev>
diff --git a/erpnext/stock/__init__.py b/erpnext/stock/__init__.py
index bd16d69..7b58cbb 100644
--- a/erpnext/stock/__init__.py
+++ b/erpnext/stock/__init__.py
@@ -17,9 +17,9 @@
def get_warehouse_account_map(company=None):
- company_warehouse_account_map = company and frappe.flags.setdefault(
- "warehouse_account_map", {}
- ).get(company)
+ company_warehouse_account_map = company and frappe.flags.setdefault("warehouse_account_map", {}).get(
+ company
+ )
warehouse_account_map = frappe.flags.warehouse_account_map
if not warehouse_account_map or not company_warehouse_account_map or frappe.flags.in_test:
diff --git a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
index d488150..cbc4fc7 100644
--- a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
+++ b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
@@ -27,9 +27,7 @@
if filters and filters.get("company"):
warehouse_filters.append(["company", "=", filters.get("company")])
- warehouses = frappe.get_list(
- "Warehouse", pluck="name", filters=warehouse_filters, order_by="name"
- )
+ warehouses = frappe.get_list("Warehouse", pluck="name", filters=warehouse_filters, order_by="name")
warehouses = frappe.get_list(
"Bin",
diff --git a/erpnext/stock/deprecated_serial_batch.py b/erpnext/stock/deprecated_serial_batch.py
index 6e32cc2..bc53878 100644
--- a/erpnext/stock/deprecated_serial_batch.py
+++ b/erpnext/stock/deprecated_serial_batch.py
@@ -139,9 +139,7 @@
if not self.non_batchwise_balance_qty:
continue
- self.batch_avg_rate[batch_no] = (
- self.non_batchwise_balance_value / self.non_batchwise_balance_qty
- )
+ self.batch_avg_rate[batch_no] = self.non_batchwise_balance_value / self.non_batchwise_balance_qty
stock_value_change = self.batch_avg_rate[batch_no] * ledger.qty
self.stock_value_change += stock_value_change
@@ -208,9 +206,9 @@
bundle_child = frappe.qb.DocType("Serial and Batch Entry")
batch = frappe.qb.DocType("Batch")
- timestamp_condition = CombineDatetime(
- bundle.posting_date, bundle.posting_time
- ) < CombineDatetime(self.sle.posting_date, self.sle.posting_time)
+ timestamp_condition = CombineDatetime(bundle.posting_date, bundle.posting_time) < CombineDatetime(
+ self.sle.posting_date, self.sle.posting_time
+ )
if self.sle.creation:
timestamp_condition |= (
diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py
index e8e94fd..8726642 100644
--- a/erpnext/stock/doctype/batch/batch.py
+++ b/erpnext/stock/doctype/batch/batch.py
@@ -240,17 +240,13 @@
def get_batches_by_oldest(item_code, warehouse):
"""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
- ]
+ batches_dates = [[batch, frappe.get_value("Batch", batch.batch_no, "expiry_date")] for batch in batches]
batches_dates.sort(key=lambda tup: tup[1])
return batches_dates
@frappe.whitelist()
-def split_batch(
- batch_no: str, item_code: str, warehouse: str, qty: float, new_batch_id: str | None = None
-):
+def split_batch(batch_no: str, item_code: str, warehouse: str, qty: float, new_batch_id: str | None = None):
"""Split the batch into a new batch"""
batch = frappe.get_doc(dict(doctype="Batch", item=item_code, batch_id=new_batch_id)).insert()
qty = flt(qty)
@@ -282,7 +278,10 @@
company=company,
items=[
dict(
- item_code=item_code, qty=qty, s_warehouse=warehouse, serial_and_batch_bundle=from_bundle_id
+ item_code=item_code,
+ qty=qty,
+ s_warehouse=warehouse,
+ serial_and_batch_bundle=from_bundle_id,
),
dict(
item_code=item_code, qty=qty, t_warehouse=warehouse, serial_and_batch_bundle=to_bundle_id
diff --git a/erpnext/stock/doctype/batch/test_batch.py b/erpnext/stock/doctype/batch/test_batch.py
index 7fb672c..1adffae 100644
--- a/erpnext/stock/doctype/batch/test_batch.py
+++ b/erpnext/stock/doctype/batch/test_batch.py
@@ -156,9 +156,7 @@
bundle = stock_entry.items[0].serial_and_batch_bundle
self.assertTrue(bundle)
- self.assertEqual(
- get_batch_qty(get_batch_from_bundle(bundle), stock_entry.items[0].t_warehouse), 90
- )
+ self.assertEqual(get_batch_qty(get_batch_from_bundle(bundle), stock_entry.items[0].t_warehouse), 90)
def test_delivery_note(self):
"""Test automatic batch selection for outgoing items"""
@@ -543,9 +541,7 @@
get_batch_from_bundle(pr_2.items[0].serial_and_batch_bundle),
)
- self.assertEqual(
- "BATCHEXISTING002", get_batch_from_bundle(pr_2.items[0].serial_and_batch_bundle)
- )
+ self.assertEqual("BATCHEXISTING002", get_batch_from_bundle(pr_2.items[0].serial_and_batch_bundle))
def create_batch(item_code, rate, create_item_price_for_batch):
diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py
index 9310985..e3a155b 100644
--- a/erpnext/stock/doctype/bin/bin.py
+++ b/erpnext/stock/doctype/bin/bin.py
@@ -83,9 +83,7 @@
get_reserved_qty_for_sub_assembly,
)
- reserved_qty_for_production_plan = get_reserved_qty_for_sub_assembly(
- self.item_code, self.warehouse
- )
+ reserved_qty_for_production_plan = get_reserved_qty_for_sub_assembly(self.item_code, self.warehouse)
if reserved_qty_for_production_plan is None and not self.reserved_qty_for_production_plan:
return
@@ -106,9 +104,7 @@
in open work orders"""
from erpnext.manufacturing.doctype.work_order.work_order import get_reserved_qty_for_production
- self.reserved_qty_for_production = get_reserved_qty_for_production(
- self.item_code, self.warehouse
- )
+ self.reserved_qty_for_production = get_reserved_qty_for_production(self.item_code, self.warehouse)
self.db_set(
"reserved_qty_for_production", flt(self.reserved_qty_for_production), update_modified=True
@@ -156,9 +152,7 @@
se_item = frappe.qb.DocType("Stock Entry Detail")
if frappe.db.field_exists("Stock Entry", "is_return"):
- qty_field = (
- Case().when(se.is_return == 1, se_item.transfer_qty * -1).else_(se_item.transfer_qty)
- )
+ qty_field = Case().when(se.is_return == 1, se_item.transfer_qty * -1).else_(se_item.transfer_qty)
else:
qty_field = se_item.transfer_qty
diff --git a/erpnext/stock/doctype/bin/test_bin.py b/erpnext/stock/doctype/bin/test_bin.py
index b79dee8..e4f5565 100644
--- a/erpnext/stock/doctype/bin/test_bin.py
+++ b/erpnext/stock/doctype/bin/test_bin.py
@@ -31,4 +31,4 @@
def test_index_exists(self):
indexes = frappe.db.sql("show index from tabBin where Non_unique = 0", as_dict=1)
if not any(index.get("Key_name") == "unique_item_warehouse" for index in indexes):
- self.fail(f"Expected unique index on item-warehouse")
+ self.fail("Expected unique index on item-warehouse")
diff --git a/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py b/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py
index e99a0b1..1cb6305 100644
--- a/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py
+++ b/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py
@@ -149,6 +149,6 @@
try:
doc.create_closing_stock_balance_entries()
doc.db_set("status", "Completed")
- except Exception as e:
+ except Exception:
doc.db_set("status", "Failed")
doc.log_error(title="Closing Stock Balance Failed")
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index f13353e..c3148d6 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -141,7 +141,7 @@
# end: auto-generated types
def __init__(self, *args, **kwargs):
- super(DeliveryNote, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.status_updater = [
{
"source_dt": "Delivery Note Item",
@@ -229,7 +229,7 @@
for f in fieldname:
toggle_print_hide(self.meta if key == "parent" else item_meta, f)
- super(DeliveryNote, self).before_print(settings)
+ super().before_print(settings)
def set_actual_qty(self):
for d in self.get("items"):
@@ -250,7 +250,7 @@
def validate(self):
self.validate_posting_time()
- super(DeliveryNote, self).validate()
+ super().validate()
self.validate_references()
self.set_status()
self.so_required()
@@ -274,11 +274,16 @@
self.reset_default_field_value("set_warehouse", "items", "warehouse")
def validate_with_previous_doc(self):
- super(DeliveryNote, self).validate_with_previous_doc(
+ super().validate_with_previous_doc(
{
"Sales Order": {
"ref_dn_field": "against_sales_order",
- "compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]],
+ "compare_fields": [
+ ["customer", "="],
+ ["company", "="],
+ ["project", "="],
+ ["currency", "="],
+ ],
},
"Sales Order Item": {
"ref_dn_field": "so_detail",
@@ -288,7 +293,12 @@
},
"Sales Invoice": {
"ref_dn_field": "against_sales_invoice",
- "compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]],
+ "compare_fields": [
+ ["customer", "="],
+ ["company", "="],
+ ["project", "="],
+ ["currency", "="],
+ ],
},
"Sales Invoice Item": {
"ref_dn_field": "si_detail",
@@ -409,7 +419,7 @@
)
def validate_warehouse(self):
- super(DeliveryNote, self).validate_warehouse()
+ super().validate_warehouse()
for d in self.get_item_list():
if not d["warehouse"] and frappe.get_cached_value("Item", d["item_code"], "is_stock_item") == 1:
@@ -466,7 +476,7 @@
self.repost_future_sle_and_gle()
def on_cancel(self):
- super(DeliveryNote, self).on_cancel()
+ super().on_cancel()
self.check_sales_order_on_hold_or_close("against_sales_order")
self.check_next_docstatus()
@@ -555,7 +565,9 @@
delivered_batch_qty[entry.batch_no] -= delivered_qty
else:
# `Delivered Qty` should be less than or equal to `Reserved Qty`.
- qty_can_be_deliver = min((sre_doc.reserved_qty - sre_doc.delivered_qty), qty_to_deliver)
+ qty_can_be_deliver = min(
+ (sre_doc.reserved_qty - sre_doc.delivered_qty), qty_to_deliver
+ )
sre_doc.delivered_qty += qty_can_be_deliver
sre_doc.db_update()
@@ -613,7 +625,9 @@
batch_qty_to_undelivered = {d.batch_no: -1 * d.qty for d in sbb.entries}
for entry in sre_doc.sb_entries:
if entry.batch_no in batch_qty_to_undelivered:
- undelivered_qty = min(entry.delivered_qty, batch_qty_to_undelivered[entry.batch_no])
+ undelivered_qty = min(
+ entry.delivered_qty, batch_qty_to_undelivered[entry.batch_no]
+ )
entry.delivered_qty -= undelivered_qty
entry.db_update()
qty_can_be_undelivered += undelivered_qty
@@ -669,7 +683,8 @@
frappe.bold(reserved_warehouses[0])
if len(reserved_warehouses) == 1
else _("{0} and {1}").format(
- frappe.bold(", ".join(reserved_warehouses[:-1])), frappe.bold(reserved_warehouses[-1])
+ frappe.bold(", ".join(reserved_warehouses[:-1])),
+ frappe.bold(reserved_warehouses[-1]),
),
)
frappe.throw(msg, title=_("Stock Reservation Warehouse Mismatch"))
@@ -1166,7 +1181,7 @@
"User", frappe.session.user, ["email", "full_name", "phone", "mobile_no"], as_dict=1
)
target.pickup_contact_email = user.email
- pickup_contact_display = "{}".format(user.full_name)
+ pickup_contact_display = f"{user.full_name}"
if user:
if user.email:
pickup_contact_display += "<br>" + user.email
@@ -1182,7 +1197,7 @@
contact = frappe.db.get_value(
"Contact", source.contact_person, ["email_id", "phone", "mobile_no"], as_dict=1
)
- delivery_contact_display = "{}".format(source.contact_display)
+ delivery_contact_display = f"{source.contact_display}"
if contact:
if contact.email_id:
delivery_contact_display += "<br>" + contact.email_id
@@ -1351,8 +1366,7 @@
"postprocess": update_details,
"field_no_map": ["taxes_and_charges", "set_warehouse"],
},
- doctype
- + " Item": {
+ doctype + " Item": {
"doctype": target_doctype + " Item",
"field_map": {
source_document_warehouse_field: target_document_warehouse_field,
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index 905287d..6f47c26 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -68,7 +68,7 @@
self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert)
def test_delivery_note_no_gl_entry(self):
- company = frappe.db.get_value("Warehouse", "_Test Warehouse - _TC", "company")
+ frappe.db.get_value("Warehouse", "_Test Warehouse - _TC", "company")
make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100)
stock_queue = json.loads(
@@ -85,16 +85,14 @@
dn = create_delivery_note()
- sle = frappe.get_doc(
- "Stock Ledger Entry", {"voucher_type": "Delivery Note", "voucher_no": dn.name}
- )
+ sle = frappe.get_doc("Stock Ledger Entry", {"voucher_type": "Delivery Note", "voucher_no": dn.name})
self.assertEqual(sle.stock_value_difference, flt(-1 * stock_queue[0][1], 2))
self.assertFalse(get_gl_entries("Delivery Note", dn.name))
def test_delivery_note_gl_entry_packing_item(self):
- company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
+ frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=10, basic_rate=100)
make_stock_entry(
@@ -141,7 +139,7 @@
stock_in_hand_account: [0.0, stock_value_diff],
"Cost of Goods Sold - TCP1": [stock_value_diff, 0.0],
}
- for i, gle in enumerate(gl_entries):
+ for _i, gle in enumerate(gl_entries):
self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
# check stock in hand balance
@@ -795,7 +793,7 @@
"Stock In Hand - TCP1": [0.0, stock_value_difference],
target_warehouse: [stock_value_difference, 0.0],
}
- for i, gle in enumerate(gl_entries):
+ for _i, gle in enumerate(gl_entries):
self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
# tear down
@@ -1003,7 +1001,7 @@
"Cost of Goods Sold - TCP1": {"cost_center": cost_center},
stock_in_hand_account: {"cost_center": cost_center},
}
- for i, gle in enumerate(gl_entries):
+ for _i, gle in enumerate(gl_entries):
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
def test_delivery_note_cost_center_with_balance_sheet_account(self):
@@ -1032,7 +1030,7 @@
"Cost of Goods Sold - TCP1": {"cost_center": cost_center},
stock_in_hand_account: {"cost_center": cost_center},
}
- for i, gle in enumerate(gl_entries):
+ for _i, gle in enumerate(gl_entries):
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
def test_make_sales_invoice_from_dn_for_returned_qty(self):
@@ -1100,9 +1098,7 @@
},
)
make_product_bundle(parent=batched_bundle.name, items=[batched_item.name])
- make_stock_entry(
- item_code=batched_item.name, target="_Test Warehouse - _TC", qty=10, basic_rate=42
- )
+ make_stock_entry(item_code=batched_item.name, target="_Test Warehouse - _TC", qty=10, basic_rate=42)
dn = create_delivery_note(item_code=batched_bundle.name, qty=1)
dn.load_from_db()
@@ -1125,9 +1121,7 @@
dn.reload()
dn.delete()
- bundle = frappe.db.get_value(
- "Serial and Batch Bundle", {"voucher_detail_no": packed_name}, "name"
- )
+ bundle = frappe.db.get_value("Serial and Batch Bundle", {"voucher_detail_no": packed_name}, "name")
self.assertFalse(bundle)
frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1)
@@ -1306,9 +1300,7 @@
warehouse=warehouse,
target_warehouse=target,
)
- self.assertFalse(
- frappe.db.exists("GL Entry", {"voucher_no": dn.name, "voucher_type": dn.doctype})
- )
+ self.assertFalse(frappe.db.exists("GL Entry", {"voucher_no": dn.name, "voucher_type": dn.doctype}))
def test_batch_expiry_for_delivery_note(self):
from erpnext.controllers.sales_and_purchase_return import make_return_doc
@@ -1435,9 +1427,7 @@
basic_rate=100.0,
posting_date=add_days(nowdate(), -5),
)
- dn = create_delivery_note(
- item_code=item_code, qty=5, rate=500, posting_date=add_days(nowdate(), -4)
- )
+ dn = create_delivery_note(item_code=item_code, qty=5, rate=500, posting_date=add_days(nowdate(), -4))
self.assertEqual(dn.items[0].incoming_rate, 100.0)
make_stock_entry(
@@ -1527,9 +1517,7 @@
self.assertAlmostEqual(returned_dn.items[0].incoming_rate, 200.0)
def test_batch_with_non_stock_uom(self):
- frappe.db.set_single_value(
- "Stock Settings", "auto_create_serial_and_batch_bundle_for_outward", 1
- )
+ frappe.db.set_single_value("Stock Settings", "auto_create_serial_and_batch_bundle_for_outward", 1)
item = make_item(
properties={
@@ -1562,9 +1550,7 @@
)
self.assertEqual(abs(delivered_batch_qty), 5.0)
- frappe.db.set_single_value(
- "Stock Settings", "auto_create_serial_and_batch_bundle_for_outward", 0
- )
+ frappe.db.set_single_value("Stock Settings", "auto_create_serial_and_batch_bundle_for_outward", 0)
def test_internal_transfer_for_non_stock_item(self):
from erpnext.selling.doctype.customer.test_customer import create_internal_customer
@@ -1604,9 +1590,7 @@
item_details = {}
for item in [serial_item, batch_item]:
- se = make_stock_entry(
- item_code=item.name, target="_Test Warehouse - _TC", qty=5, basic_rate=100
- )
+ se = make_stock_entry(item_code=item.name, target="_Test Warehouse - _TC", qty=5, basic_rate=100)
item_details[item.name] = se.items[0].serial_and_batch_bundle
dn = create_delivery_note(item_code=bundle_item.name, qty=1, do_not_submit=True)
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
index cb9fc5b..58f393d 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
@@ -40,7 +40,7 @@
# end: auto-generated types
def __init__(self, *args, **kwargs):
- super(DeliveryTrip, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
# Google Maps returns distances in meters by default
self.default_distance_uom = (
@@ -94,9 +94,7 @@
delete (bool, optional): Defaults to `False`. `True` if driver details need to be emptied, else `False`.
"""
- delivery_notes = list(
- set(stop.delivery_note for stop in self.delivery_stops if stop.delivery_note)
- )
+ delivery_notes = list(set(stop.delivery_note for stop in self.delivery_stops if stop.delivery_note))
update_fields = {
"driver": self.driver,
@@ -342,14 +340,11 @@
"Contact", contact, ["first_name", "last_name", "phone", "mobile_no"], as_dict=1
)
- contact_info.html = (
- """ <b>%(first_name)s %(last_name)s</b> <br> %(phone)s <br> %(mobile_no)s"""
- % {
- "first_name": contact_info.first_name,
- "last_name": contact_info.last_name or "",
- "phone": contact_info.phone or "",
- "mobile_no": contact_info.mobile_no or "",
- }
+ contact_info.html = """ <b>{first_name} {last_name}</b> <br> {phone} <br> {mobile_no}""".format(
+ first_name=contact_info.first_name,
+ last_name=contact_info.last_name or "",
+ phone=contact_info.phone or "",
+ mobile_no=contact_info.mobile_no or "",
)
return contact_info.html
diff --git a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
index 9b8b46e..09f5b2c 100644
--- a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
@@ -1,7 +1,6 @@
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
-import unittest
import frappe
from frappe.tests.utils import FrappeTestCase
diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
index d5eef5a..103d8a1 100644
--- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
@@ -384,9 +384,7 @@
@frappe.whitelist()
def get_parent_fields(child_doctype, dimension_name):
- parent_doctypes = frappe.get_all(
- "DocField", fields=["parent"], filters={"options": child_doctype}
- )
+ parent_doctypes = frappe.get_all("DocField", fields=["parent"], filters={"options": child_doctype})
fields = []
diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
index 361c2f8..8ce954d 100644
--- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
@@ -210,9 +210,7 @@
)
self.assertFalse(
- frappe.db.get_value(
- "Custom Field", {"fieldname": "project", "dt": "Stock Ledger Entry"}, "name"
- )
+ frappe.db.get_value("Custom Field", {"fieldname": "project", "dt": "Stock Ledger Entry"}, "name")
)
def test_check_mandatory_dimensions(self):
@@ -296,9 +294,7 @@
se_doc.save()
se_doc.submit()
- entries = get_voucher_sl_entries(
- se_doc.name, ["warehouse", "store", "incoming_rate", "actual_qty"]
- )
+ entries = get_voucher_sl_entries(se_doc.name, ["warehouse", "store", "incoming_rate", "actual_qty"])
for entry in entries:
self.assertEqual(entry.warehouse, warehouse)
@@ -488,7 +484,14 @@
"autoname": "field:store_name",
"fields": [{"label": "Store Name", "fieldname": "store_name", "fieldtype": "Data"}],
"permissions": [
- {"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
+ {
+ "role": "System Manager",
+ "permlevel": 0,
+ "read": 1,
+ "write": 1,
+ "create": 1,
+ "delete": 1,
+ }
],
}
).insert(ignore_permissions=True)
@@ -510,7 +513,14 @@
"autoname": "field:shelf_name",
"fields": [{"label": "Shelf Name", "fieldname": "shelf_name", "fieldtype": "Data"}],
"permissions": [
- {"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
+ {
+ "role": "System Manager",
+ "permlevel": 0,
+ "read": 1,
+ "write": 1,
+ "create": 1,
+ "delete": 1,
+ }
],
}
).insert(ignore_permissions=True)
@@ -532,7 +542,14 @@
"autoname": "field:rack_name",
"fields": [{"label": "Rack Name", "fieldname": "rack_name", "fieldtype": "Data"}],
"permissions": [
- {"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
+ {
+ "role": "System Manager",
+ "permlevel": 0,
+ "read": 1,
+ "write": 1,
+ "create": 1,
+ "delete": 1,
+ }
],
}
).insert(ignore_permissions=True)
@@ -554,7 +571,14 @@
"autoname": "field:pallet_name",
"fields": [{"label": "Pallet Name", "fieldname": "pallet_name", "fieldtype": "Data"}],
"permissions": [
- {"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
+ {
+ "role": "System Manager",
+ "permlevel": 0,
+ "read": 1,
+ "write": 1,
+ "create": 1,
+ "delete": 1,
+ }
],
}
).insert(ignore_permissions=True)
@@ -570,7 +594,14 @@
"autoname": "field:site_name",
"fields": [{"label": "Site Name", "fieldname": "site_name", "fieldtype": "Data"}],
"permissions": [
- {"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
+ {
+ "role": "System Manager",
+ "permlevel": 0,
+ "read": 1,
+ "write": 1,
+ "create": 1,
+ "delete": 1,
+ }
],
}
).insert(ignore_permissions=True)
@@ -623,9 +654,7 @@
to_warehouse = create_warehouse("_Test Internal Warehouse GIT A", company=company)
- pr_doc = make_purchase_receipt(
- company=company, warehouse=warehouse, qty=10, rate=100, do_not_submit=True
- )
+ pr_doc = make_purchase_receipt(company=company, warehouse=warehouse, qty=10, rate=100, do_not_submit=True)
pr_doc.items[0].store = "Inter Transfer Store 1"
pr_doc.submit()
@@ -651,9 +680,7 @@
expene_account = frappe.db.get_value(
"Company", company, "stock_adjustment_account"
- ) or frappe.db.get_value(
- "Account", {"company": company, "account_type": "Expense Account"}, "name"
- )
+ ) or frappe.db.get_value("Account", {"company": company, "account_type": "Expense Account"}, "name")
return frappe._dict(
{
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 949c109..063b28d 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -3,7 +3,6 @@
import copy
import json
-from typing import Dict, List, Optional
import frappe
from frappe import _
@@ -375,9 +374,9 @@
for d in self.get("uoms"):
if cstr(d.uom) in check_list:
frappe.throw(
- _("Unit of Measure {0} has been entered more than once in Conversion Factor Table").format(
- d.uom
- )
+ _(
+ "Unit of Measure {0} has been entered more than once in Conversion Factor Table"
+ ).format(d.uom)
)
else:
check_list.append(cstr(d.uom))
@@ -429,7 +428,7 @@
frappe.throw(
_("{0} entered twice {1} in Item Taxes").format(
frappe.bold(d.item_tax_template),
- "for tax category {0}".format(frappe.bold(d.tax_category)) if d.tax_category else "",
+ f"for tax category {frappe.bold(d.tax_category)}" if d.tax_category else "",
)
)
else:
@@ -448,7 +447,9 @@
)
if duplicate:
frappe.throw(
- _("Barcode {0} already used in Item {1}").format(item_barcode.barcode, duplicate[0][0])
+ _("Barcode {0} already used in Item {1}").format(
+ item_barcode.barcode, duplicate[0][0]
+ )
)
item_barcode.barcode_type = (
@@ -477,9 +478,9 @@
warehouse_material_request_type += [(d.get("warehouse"), d.get("material_request_type"))]
else:
frappe.throw(
- _("Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}.").format(
- d.idx, d.warehouse, d.material_request_type
- ),
+ _(
+ "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}."
+ ).format(d.idx, d.warehouse, d.material_request_type),
DuplicateReorderRows,
)
@@ -547,20 +548,21 @@
for dt in ("Sales Taxes and Charges", "Purchase Taxes and Charges"):
for d in frappe.db.sql(
- """select name, item_wise_tax_detail from `tab{0}`
- where ifnull(item_wise_tax_detail, '') != ''""".format(
- dt
- ),
+ f"""select name, item_wise_tax_detail from `tab{dt}`
+ where ifnull(item_wise_tax_detail, '') != ''""",
as_dict=1,
):
-
item_wise_tax_detail = json.loads(d.item_wise_tax_detail)
if isinstance(item_wise_tax_detail, dict) and old_name in item_wise_tax_detail:
item_wise_tax_detail[new_name] = item_wise_tax_detail[old_name]
item_wise_tax_detail.pop(old_name)
frappe.db.set_value(
- dt, d.name, "item_wise_tax_detail", json.dumps(item_wise_tax_detail), update_modified=False
+ dt,
+ d.name,
+ "item_wise_tax_detail",
+ json.dumps(item_wise_tax_detail),
+ update_modified=False,
)
def delete_old_bins(self, old_name):
@@ -587,9 +589,7 @@
)
msg += " <br>"
- msg += (
- ", ".join([get_link_to_form("Stock Reconciliation", d.parent) for d in records]) + "<br><br>"
- )
+ msg += ", ".join([get_link_to_form("Stock Reconciliation", d.parent) for d in records]) + "<br><br>"
msg += _(
"Note: To merge the items, create a separate Stock Reconciliation for the old item {0}"
@@ -612,12 +612,8 @@
def validate_duplicate_product_bundles_before_merge(self, old_name, new_name):
"Block merge if both old and new items have product bundles."
- old_bundle = frappe.get_value(
- "Product Bundle", filters={"new_item_code": old_name, "disabled": 0}
- )
- new_bundle = frappe.get_value(
- "Product Bundle", filters={"new_item_code": new_name, "disabled": 0}
- )
+ old_bundle = frappe.get_value("Product Bundle", filters={"new_item_code": old_name, "disabled": 0})
+ new_bundle = frappe.get_value("Product Bundle", filters={"new_item_code": new_name, "disabled": 0})
if old_bundle and new_bundle:
bundle_link = get_link_to_form("Product Bundle", old_bundle)
@@ -635,9 +631,7 @@
def recalculate_bin_qty(self, new_name):
from erpnext.stock.stock_balance import repost_stock
- existing_allow_negative_stock = frappe.db.get_single_value(
- "Stock Settings", "allow_negative_stock"
- )
+ existing_allow_negative_stock = frappe.db.get_single_value("Stock Settings", "allow_negative_stock")
frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 1)
repost_stock_for_warehouses = frappe.get_all(
@@ -654,9 +648,7 @@
for warehouse in repost_stock_for_warehouses:
repost_stock(new_name, warehouse)
- frappe.db.set_single_value(
- "Stock Settings", "allow_negative_stock", existing_allow_negative_stock
- )
+ frappe.db.set_single_value("Stock Settings", "allow_negative_stock", existing_allow_negative_stock)
def update_bom_item_desc(self):
if self.is_new():
@@ -817,12 +809,10 @@
return "<br>".join(docnames)
def table_row(title, body):
- return """<tr>
- <td>{0}</td>
- <td>{1}</td>
- </tr>""".format(
- title, body
- )
+ return f"""<tr>
+ <td>{title}</td>
+ <td>{body}</td>
+ </tr>"""
rows = ""
for docname, attr_list in not_included.items():
@@ -834,17 +824,15 @@
)
message = """
- <div>{0}</div><br>
+ <div>{}</div><br>
<table class="table">
<thead>
- <td>{1}</td>
- <td>{2}</td>
+ <td>{}</td>
+ <td>{}</td>
</thead>
- {3}
+ {}
</table>
- """.format(
- error_description, _("Variant Items"), _("Attributes"), rows
- )
+ """.format(error_description, _("Variant Items"), _("Attributes"), rows)
frappe.throw(message, title=_("Variant Attribute Error"), is_minimizable=True, wide=True)
@@ -974,7 +962,7 @@
frappe.throw(msg, title=_("Linked with submitted documents"))
- def _get_linked_submitted_documents(self, changed_fields: List[str]) -> Optional[Dict[str, str]]:
+ def _get_linked_submitted_documents(self, changed_fields: list[str]) -> dict[str, str] | None:
linked_doctypes = [
"Delivery Note Item",
"Sales Invoice Item",
@@ -1163,17 +1151,13 @@
last_purchase_receipt and last_purchase_receipt[0].posting_date or "1900-01-01"
)
- if last_purchase_order and (
- purchase_order_date >= purchase_receipt_date or not last_purchase_receipt
- ):
+ if last_purchase_order and (purchase_order_date >= purchase_receipt_date or not last_purchase_receipt):
# use purchase order
last_purchase = last_purchase_order[0]
purchase_date = purchase_order_date
- elif last_purchase_receipt and (
- purchase_receipt_date > purchase_order_date or not last_purchase_order
- ):
+ elif last_purchase_receipt and (purchase_receipt_date > purchase_order_date or not last_purchase_order):
# use purchase receipt
last_purchase = last_purchase_receipt[0]
purchase_date = purchase_receipt_date
@@ -1349,7 +1333,7 @@
frappe.publish_progress(count / total * 100, title=_("Updating Variants..."))
-def validate_item_default_company_links(item_defaults: List[ItemDefault]) -> None:
+def validate_item_default_company_links(item_defaults: list[ItemDefault]) -> None:
for item_default in item_defaults:
for doctype, field in [
["Warehouse", "default_warehouse"],
diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py
index b237f73..a0ed1f2 100644
--- a/erpnext/stock/doctype/item/test_item.py
+++ b/erpnext/stock/doctype/item/test_item.py
@@ -315,7 +315,6 @@
self.assertEqual(value, purchase_item_details.get(key))
def test_item_default_validations(self):
-
with self.assertRaises(frappe.ValidationError) as ve:
make_item(
"Bad Item defaults",
@@ -469,9 +468,7 @@
self.assertFalse(frappe.db.exists("Item", old))
- self.assertTrue(
- frappe.db.get_value("Bin", {"item_code": new, "warehouse": "_Test Warehouse - _TC"})
- )
+ self.assertTrue(frappe.db.get_value("Bin", {"item_code": new, "warehouse": "_Test Warehouse - _TC"}))
self.assertTrue(
frappe.db.get_value("Bin", {"item_code": new, "warehouse": "_Test Warehouse 1 - _TC"})
)
@@ -729,9 +726,7 @@
@change_settings("Stock Settings", {"sample_retention_warehouse": "_Test Warehouse - _TC"})
def test_retain_sample(self):
- item = make_item(
- "_TestRetainSample", {"has_batch_no": 1, "retain_sample": 1, "sample_quantity": 1}
- )
+ item = make_item("_TestRetainSample", {"has_batch_no": 1, "retain_sample": 1, "sample_quantity": 1})
self.assertEqual(item.has_batch_no, 1)
self.assertEqual(item.retain_sample, 1)
@@ -804,7 +799,7 @@
def test_customer_codes_length(self):
"""Check if item code with special characters are allowed."""
item = make_item(properties={"item_code": "Test Item Code With Special Characters"})
- for row in range(3):
+ for _row in range(3):
item.append("customer_items", {"ref_code": frappe.generate_hash("", 120)})
item.save()
self.assertTrue(len(item.customer_code) > 140)
@@ -845,9 +840,7 @@
make_property_setter("Item", None, "search_fields", "item_name", "Data", for_doctype="Doctype")
item = make_item(properties={"item_name": "Test Item", "description": "Test Description"})
- data = item_query(
- "Item", "Test Item", "", 0, 20, filters={"item_name": "Test Item"}, as_dict=True
- )
+ data = item_query("Item", "Test Item", "", 0, 20, filters={"item_name": "Test Item"}, as_dict=True)
self.assertEqual(data[0].name, item.name)
self.assertEqual(data[0].item_name, item.item_name)
self.assertTrue("description" not in data[0])
@@ -855,9 +848,7 @@
make_property_setter(
"Item", None, "search_fields", "item_name, description", "Data", for_doctype="Doctype"
)
- data = item_query(
- "Item", "Test Item", "", 0, 20, filters={"item_name": "Test Item"}, as_dict=True
- )
+ data = item_query("Item", "Test Item", "", 0, 20, filters={"item_name": "Test Item"}, as_dict=True)
self.assertEqual(data[0].name, item.name)
self.assertEqual(data[0].item_name, item.item_name)
self.assertEqual(data[0].description, item.description)
diff --git a/erpnext/stock/doctype/item_alternative/item_alternative.py b/erpnext/stock/doctype/item_alternative/item_alternative.py
index 83bee9c..a73a82f 100644
--- a/erpnext/stock/doctype/item_alternative/item_alternative.py
+++ b/erpnext/stock/doctype/item_alternative/item_alternative.py
@@ -45,9 +45,7 @@
"allow_alternative_item",
]
item_data = frappe.db.get_value("Item", self.item_code, fields, as_dict=1)
- alternative_item_data = frappe.db.get_value(
- "Item", self.alternative_item_code, fields, as_dict=1
- )
+ alternative_item_data = frappe.db.get_value("Item", self.alternative_item_code, fields, as_dict=1)
for field in fields:
if item_data.get(field) != alternative_item_data.get(field):
@@ -87,14 +85,12 @@
@frappe.validate_and_sanitize_search_inputs
def get_alternative_items(doctype, txt, searchfield, start, page_len, filters):
return frappe.db.sql(
- """ (select alternative_item_code from `tabItem Alternative`
+ f""" (select alternative_item_code from `tabItem Alternative`
where item_code = %(item_code)s and alternative_item_code like %(txt)s)
union
(select item_code from `tabItem Alternative`
where alternative_item_code = %(item_code)s and item_code like %(txt)s
- and two_way = 1) limit {1} offset {0}
- """.format(
- start, page_len
- ),
+ and two_way = 1) limit {page_len} offset {start}
+ """,
{"item_code": filters.get("item_code"), "txt": "%" + txt + "%"},
)
diff --git a/erpnext/stock/doctype/item_alternative/test_item_alternative.py b/erpnext/stock/doctype/item_alternative/test_item_alternative.py
index 1996418..11e45ee 100644
--- a/erpnext/stock/doctype/item_alternative/test_item_alternative.py
+++ b/erpnext/stock/doctype/item_alternative/test_item_alternative.py
@@ -54,9 +54,7 @@
"fg_item_qty": 5,
},
]
- sco = get_subcontracting_order(
- service_items=service_items, supplier_warehouse=supplier_warehouse
- )
+ sco = get_subcontracting_order(service_items=service_items, supplier_warehouse=supplier_warehouse)
rm_items = [
{
"item_code": "Test Finished Goods - A",
@@ -106,9 +104,7 @@
"reserved_qty_for_sub_contract",
)
- self.assertEqual(
- after_transfer_reserved_qty_for_sub_contract, flt(reserved_qty_for_sub_contract - 5)
- )
+ self.assertEqual(after_transfer_reserved_qty_for_sub_contract, flt(reserved_qty_for_sub_contract - 5))
scr = make_subcontracting_receipt(sco.name)
scr.save()
@@ -159,9 +155,7 @@
"reserved_qty_for_production",
)
- self.assertEqual(
- reserved_qty_for_production_after_transfer, flt(reserved_qty_for_production - 5)
- )
+ self.assertEqual(reserved_qty_for_production_after_transfer, flt(reserved_qty_for_production - 5))
ste1 = frappe.get_doc(make_stock_entry(pro_order.name, "Manufacture", 5))
status = False
diff --git a/erpnext/stock/doctype/item_attribute/item_attribute.py b/erpnext/stock/doctype/item_attribute/item_attribute.py
index 7b341b2..04421d6 100644
--- a/erpnext/stock/doctype/item_attribute/item_attribute.py
+++ b/erpnext/stock/doctype/item_attribute/item_attribute.py
@@ -93,7 +93,9 @@
values, abbrs = [], []
for d in self.item_attribute_values:
if d.attribute_value.lower() in map(str.lower, values):
- frappe.throw(_("Attribute value: {0} must appear only once").format(d.attribute_value.title()))
+ frappe.throw(
+ _("Attribute value: {0} must appear only once").format(d.attribute_value.title())
+ )
values.append(d.attribute_value)
if d.abbr.lower() in map(str.lower, abbrs):
diff --git a/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py
index ed004d5..715f09b 100644
--- a/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py
+++ b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py
@@ -57,7 +57,9 @@
# if unchecked and default in Item master, clear it.
if default_manufacturer == self.manufacturer and default_part_no == self.manufacturer_part_no:
frappe.db.set_value(
- "Item", item.name, {"default_item_manufacturer": None, "default_manufacturer_part_no": None}
+ "Item",
+ item.name,
+ {"default_item_manufacturer": None, "default_manufacturer_part_no": None},
)
elif self.is_default:
diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py
index d64e321..ccdf1a0 100644
--- a/erpnext/stock/doctype/item_price/item_price.py
+++ b/erpnext/stock/doctype/item_price/item_price.py
@@ -68,7 +68,7 @@
if not price_list_details:
link = frappe.utils.get_link_to_form("Price List", self.price_list)
- frappe.throw("The price list {0} does not exist or is disabled".format(link))
+ frappe.throw(f"The price list {link} does not exist or is disabled")
self.buying, self.selling, self.currency = price_list_details
@@ -85,7 +85,6 @@
frappe.throw(_(msg))
def check_duplicates(self):
-
item_price = frappe.qb.DocType("Item Price")
query = (
diff --git a/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py b/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py
index a4bdc0b..3ee46e4 100644
--- a/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py
+++ b/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py
@@ -64,4 +64,6 @@
def validate(self):
for d in self.fields:
if d.field_name in self.invalid_fields_for_copy_fields_in_variants:
- frappe.throw(_("Cannot set the field <b>{0}</b> for copying in variants").format(d.field_name))
+ frappe.throw(
+ _("Cannot set the field <b>{0}</b> for copying in variants").format(d.field_name)
+ )
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
index baff540..5e5efb5 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
@@ -103,13 +103,13 @@
for d in self.get("purchase_receipts"):
docstatus = frappe.db.get_value(d.receipt_document_type, d.receipt_document, "docstatus")
if docstatus != 1:
- msg = (
- f"Row {d.idx}: {d.receipt_document_type} {frappe.bold(d.receipt_document)} must be submitted"
- )
+ msg = f"Row {d.idx}: {d.receipt_document_type} {frappe.bold(d.receipt_document)} must be submitted"
frappe.throw(_(msg), title=_("Invalid Document"))
if d.receipt_document_type == "Purchase Invoice":
- update_stock = frappe.db.get_value(d.receipt_document_type, d.receipt_document, "update_stock")
+ update_stock = frappe.db.get_value(
+ d.receipt_document_type, d.receipt_document, "update_stock"
+ )
if not update_stock:
msg = _("Row {0}: Purchase Invoice {1} has no stock impact.").format(
d.idx, frappe.bold(d.receipt_document)
@@ -159,7 +159,8 @@
)
item.applicable_charges = flt(
- flt(item.get(based_on_field)) * (flt(self.total_taxes_and_charges) / flt(total_item_cost)),
+ flt(item.get(based_on_field))
+ * (flt(self.total_taxes_and_charges) / flt(total_item_cost)),
item.precision("applicable_charges"),
)
total_charges += item.applicable_charges
@@ -257,7 +258,9 @@
for item in self.get("items"):
if item.is_fixed_asset:
receipt_document_type = (
- "purchase_invoice" if item.receipt_document_type == "Purchase Invoice" else "purchase_receipt"
+ "purchase_invoice"
+ if item.receipt_document_type == "Purchase Invoice"
+ else "purchase_receipt"
)
docs = frappe.db.get_all(
"Asset",
@@ -280,9 +283,7 @@
frappe.throw(
_(
"{0} <b>{1}</b> has submitted Assets. Remove Item <b>{2}</b> from table to continue."
- ).format(
- item.receipt_document_type, item.receipt_document, item.item_code
- )
+ ).format(item.receipt_document_type, item.receipt_document, item.item_code)
)
def update_rate_in_serial_no_for_non_asset_items(self, receipt_document):
@@ -291,10 +292,10 @@
serial_nos = get_serial_nos(item.serial_no)
if serial_nos:
frappe.db.sql(
- "update `tabSerial No` set purchase_rate=%s where name in ({0})".format(
+ "update `tabSerial No` set purchase_rate=%s where name in ({})".format(
", ".join(["%s"] * len(serial_nos))
),
- tuple([item.valuation_rate] + serial_nos),
+ tuple([item.valuation_rate, *serial_nos]),
)
diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
index 4058aa8..9ec2d69 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
@@ -16,9 +16,7 @@
make_purchase_receipt,
)
from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
- get_batch_from_bundle,
get_serial_nos_from_bundle,
- make_serial_batch_bundle,
)
from erpnext.stock.serial_batch_bundle import SerialNoValuation
@@ -68,9 +66,7 @@
as_dict=1,
)
- self.assertEqual(
- last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction
- )
+ self.assertEqual(last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction)
self.assertEqual(last_sle_after_landed_cost.stock_value - last_sle.stock_value, 25.0)
# assert after submit
@@ -93,7 +89,6 @@
self.assertPurchaseReceiptLCVGLEntries(pr)
def assertPurchaseReceiptLCVGLEntries(self, pr):
-
gl_entries = get_gl_entries("Purchase Receipt", pr.name)
self.assertTrue(gl_entries)
@@ -176,9 +171,7 @@
as_dict=1,
)
- self.assertEqual(
- last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction
- )
+ self.assertEqual(last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction)
self.assertEqual(last_sle_after_landed_cost.stock_value - last_sle.stock_value, 50.0)
def test_landed_cost_voucher_for_zero_purchase_rate(self):
@@ -235,7 +228,6 @@
)
def test_landed_cost_voucher_against_purchase_invoice(self):
-
pi = make_purchase_invoice(
update_stock=1,
posting_date=frappe.utils.nowdate(),
@@ -280,9 +272,7 @@
as_dict=1,
)
- self.assertEqual(
- last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction
- )
+ self.assertEqual(last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction)
self.assertEqual(last_sle_after_landed_cost.stock_value - last_sle.stock_value, 50.0)
@@ -436,7 +426,7 @@
do_not_save=True,
)
pr.items[0].cost_center = "Main - TCP1"
- for x in range(2):
+ for _x in range(2):
pr.append(
"items",
{
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index ace84f8..b52b169 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -107,13 +107,13 @@
if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty):
frappe.throw(
- _("Material Request of maximum {0} can be made for Item {1} against Sales Order {2}").format(
- actual_so_qty - already_indented, item, so_no
- )
+ _(
+ "Material Request of maximum {0} can be made for Item {1} against Sales Order {2}"
+ ).format(actual_so_qty - already_indented, item, so_no)
)
def validate(self):
- super(MaterialRequest, self).validate()
+ super().validate()
self.validate_schedule_date()
self.check_for_on_hold_or_closed_status("Sales Order", "sales_order")
@@ -187,12 +187,8 @@
self.set_status(update=True, status="Cancelled")
def check_modified_date(self):
- mod_db = frappe.db.sql(
- """select modified from `tabMaterial Request` where name = %s""", self.name
- )
- date_diff = frappe.db.sql(
- """select TIMEDIFF('%s', '%s')""" % (mod_db[0][0], cstr(self.modified))
- )
+ mod_db = frappe.db.sql("""select modified from `tabMaterial Request` where name = %s""", self.name)
+ date_diff = frappe.db.sql(f"""select TIMEDIFF('{mod_db[0][0]}', '{cstr(self.modified)}')""")
if date_diff and date_diff[0][0]:
frappe.throw(_("{0} {1} has been modified. Please refresh.").format(_(self.doctype), self.name))
@@ -276,7 +272,9 @@
d.ordered_qty = flt(mr_items_ordered_qty.get(d.name))
if mr_qty_allowance:
- allowed_qty = flt((d.qty + (d.qty * (mr_qty_allowance / 100))), d.precision("ordered_qty"))
+ allowed_qty = flt(
+ (d.qty + (d.qty * (mr_qty_allowance / 100))), d.precision("ordered_qty")
+ )
if d.ordered_qty and d.ordered_qty > allowed_qty:
frappe.throw(
@@ -371,9 +369,7 @@
def set_missing_values(source, target_doc):
- if target_doc.doctype == "Purchase Order" and getdate(target_doc.schedule_date) < getdate(
- nowdate()
- ):
+ if target_doc.doctype == "Purchase Order" and getdate(target_doc.schedule_date) < getdate(nowdate()):
target_doc.schedule_date = None
target_doc.run_method("set_missing_values")
target_doc.run_method("calculate_taxes_and_totals")
@@ -503,9 +499,7 @@
target_doc.schedule_date = None
target_doc.set(
"items",
- [
- d for d in target_doc.get("items") if d.get("item_code") in supplier_items and d.get("qty") > 0
- ],
+ [d for d in target_doc.get("items") if d.get("item_code") in supplier_items and d.get("qty") > 0],
)
set_missing_values(source, target_doc)
@@ -557,7 +551,7 @@
if filters.get("transaction_date"):
date = filters.get("transaction_date")[1]
- conditions += "and mr.transaction_date between '{0}' and '{1}' ".format(date[0], date[1])
+ conditions += f"and mr.transaction_date between '{date[0]}' and '{date[1]}' "
supplier = filters.get("supplier")
supplier_items = get_items_based_on_default_supplier(supplier)
@@ -569,18 +563,18 @@
"""select distinct mr.name, transaction_date,company
from `tabMaterial Request` mr, `tabMaterial Request Item` mr_item
where mr.name = mr_item.parent
- and mr_item.item_code in ({0})
+ and mr_item.item_code in ({})
and mr.material_request_type = 'Purchase'
and mr.per_ordered < 99.99
and mr.docstatus = 1
and mr.status != 'Stopped'
and mr.company = %s
- {1}
+ {}
order by mr_item.item_code ASC
- limit {2} offset {3} """.format(
+ limit {} offset {} """.format(
", ".join(["%s"] * len(supplier_items)), conditions, cint(page_len), cint(start)
),
- tuple(supplier_items) + (filters.get("company"),),
+ (*tuple(supplier_items), filters.get("company")),
as_dict=1,
)
@@ -708,7 +702,10 @@
"doctype": "Stock Entry",
"validation": {
"docstatus": ["=", 1],
- "material_request_type": ["in", ["Material Transfer", "Material Issue", "Customer Provided"]],
+ "material_request_type": [
+ "in",
+ ["Material Transfer", "Material Issue", "Customer Provided"],
+ ],
},
},
"Material Request Item": {
@@ -738,9 +735,7 @@
mr = frappe.get_doc("Material Request", material_request)
errors = []
work_orders = []
- default_wip_warehouse = frappe.db.get_single_value(
- "Manufacturing Settings", "default_wip_warehouse"
- )
+ default_wip_warehouse = frappe.db.get_single_value("Manufacturing Settings", "default_wip_warehouse")
for d in mr.items:
if (d.stock_qty - d.ordered_qty) > 0:
@@ -788,7 +783,9 @@
)
else:
msgprint(
- _("The {0} {1} created successfully").format(frappe.bold(_("Work Order")), work_orders_list[0])
+ _("The {0} {1} created successfully").format(
+ frappe.bold(_("Work Order")), work_orders_list[0]
+ )
)
if errors:
diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py
index 48397a3..b383078 100644
--- a/erpnext/stock/doctype/material_request/test_material_request.py
+++ b/erpnext/stock/doctype/material_request/test_material_request.py
@@ -756,9 +756,7 @@
self.assertEqual(mr.per_ordered, 100)
def test_customer_provided_parts_mr(self):
- create_item(
- "CUST-0987", is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0
- )
+ create_item("CUST-0987", is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0)
existing_requested_qty = self._get_requested_qty("_Test Customer", "_Test Warehouse - _TC")
mr = make_material_request(item_code="CUST-0987", material_request_type="Customer Provided")
@@ -822,7 +820,7 @@
)
comapnywise_mr_list.setdefault(mr2.company, []).append(mr2.name)
- for company, mr_list in comapnywise_mr_list.items():
+ for company, _mr_list in comapnywise_mr_list.items():
emails = get_email_list(company)
self.assertTrue(comapnywise_users[company] in emails)
@@ -840,9 +838,7 @@
}
).insert()
- in_transit_warehouse = frappe.db.exists(
- "Warehouse", {"warehouse_type": "Transit", "company": company}
- )
+ in_transit_warehouse = frappe.db.exists("Warehouse", {"warehouse_type": "Transit", "company": company})
if not in_transit_warehouse:
in_transit_warehouse = (
diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py
index d81ceaf..081d9c5 100644
--- a/erpnext/stock/doctype/packed_item/packed_item.py
+++ b/erpnext/stock/doctype/packed_item/packed_item.py
@@ -69,9 +69,7 @@
return
parent_items_price, reset = {}, False
- set_price_from_children = frappe.db.get_single_value(
- "Selling Settings", "editable_bundle_item_rates"
- )
+ set_price_from_children = frappe.db.get_single_value("Selling Settings", "editable_bundle_item_rates")
stale_packed_items_table = get_indexed_packed_items_table(doc)
@@ -236,9 +234,7 @@
bin = get_packed_item_bin_qty(packing_item.item_code, pi_row.warehouse)
pi_row.actual_qty = flt(bin.get("actual_qty"))
pi_row.projected_qty = flt(bin.get("projected_qty"))
- pi_row.use_serial_batch_fields = frappe.db.get_single_value(
- "Stock Settings", "use_serial_batch_fields"
- )
+ pi_row.use_serial_batch_fields = frappe.db.get_single_value("Stock Settings", "use_serial_batch_fields")
def update_packed_item_price_data(pi_row, item_data, doc):
@@ -293,9 +289,7 @@
def get_cancelled_doc_packed_item_details(old_packed_items):
prev_doc_packed_items_map = {}
for items in old_packed_items:
- prev_doc_packed_items_map.setdefault((items.item_code, items.parent_item), []).append(
- items.as_dict()
- )
+ prev_doc_packed_items_map.setdefault((items.item_code, items.parent_item), []).append(items.as_dict())
return prev_doc_packed_items_map
diff --git a/erpnext/stock/doctype/packed_item/test_packed_item.py b/erpnext/stock/doctype/packed_item/test_packed_item.py
index ad06732..3f87ced 100644
--- a/erpnext/stock/doctype/packed_item/test_packed_item.py
+++ b/erpnext/stock/doctype/packed_item/test_packed_item.py
@@ -1,7 +1,6 @@
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
-from typing import List, Optional, Tuple
import frappe
from frappe.tests.utils import FrappeTestCase, change_settings
@@ -15,8 +14,8 @@
def create_product_bundle(
- quantities: Optional[List[int]] = None, warehouse: Optional[str] = None
-) -> Tuple[str, List[str]]:
+ quantities: list[int] | None = None, warehouse: str | None = None
+) -> tuple[str, list[str]]:
"""Get a new product_bundle for use in tests.
Create 10x required stock if warehouse is specified.
@@ -169,9 +168,7 @@
# backdated stock entry
for item in self.bundle_items:
- make_stock_entry(
- item_code=item, to_warehouse=warehouse, qty=10, rate=200, posting_date=yesterday
- )
+ make_stock_entry(item_code=item, to_warehouse=warehouse, qty=10, rate=200, posting_date=yesterday)
# assert correct reposting
gles = get_gl_entries(dn.doctype, dn.name)
@@ -182,10 +179,11 @@
def assertReturns(self, original, returned):
self.assertEqual(len(original), len(returned))
- sort_function = lambda p: (p.parent_item, p.item_code, p.qty)
+ def sort_function(p):
+ return p.parent_item, p.item_code, p.qty
for sent, returned in zip(
- sorted(original, key=sort_function), sorted(returned, key=sort_function)
+ sorted(original, key=sort_function), sorted(returned, key=sort_function), strict=False
):
self.assertEqual(sent.item_code, returned.item_code)
self.assertEqual(sent.parent_item, returned.parent_item)
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py
index 88acfe8..8f8e8dc 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.py
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.py
@@ -34,7 +34,7 @@
# end: auto-generated types
def __init__(self, *args, **kwargs) -> None:
- super(PackingSlip, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.status_updater = [
{
"target_dt": "Delivery Note Item",
@@ -87,9 +87,7 @@
"""Validate if case nos overlap. If they do, recommend next case no."""
if cint(self.from_case_no) <= 0:
- frappe.throw(
- _("The 'From Package No.' field must neither be empty nor it's value less than 1.")
- )
+ frappe.throw(_("The 'From Package No.' field must neither be empty nor it's value less than 1."))
elif not self.to_case_no:
self.to_case_no = self.from_case_no
elif cint(self.to_case_no) < cint(self.from_case_no):
@@ -212,9 +210,8 @@
return frappe.db.sql(
"""select name, item_name, description from `tabItem`
where name in ( select item_code FROM `tabDelivery Note Item`
- where parent= %s)
- and %s like "%s" %s
- limit %s offset %s """
- % ("%s", searchfield, "%s", get_match_cond(doctype), "%s", "%s"),
+ where parent= {})
+ and {} like "{}" {}
+ limit {} offset {} """.format("%s", searchfield, "%s", get_match_cond(doctype), "%s", "%s"),
((filters or {}).get("delivery_note"), "%%%s%%" % txt, page_len, start),
)
diff --git a/erpnext/stock/doctype/packing_slip/test_packing_slip.py b/erpnext/stock/doctype/packing_slip/test_packing_slip.py
index 96da23d..08c70bf 100644
--- a/erpnext/stock/doctype/packing_slip/test_packing_slip.py
+++ b/erpnext/stock/doctype/packing_slip/test_packing_slip.py
@@ -1,7 +1,6 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
-import unittest
import frappe
from frappe.tests.utils import FrappeTestCase
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index 4eab7e8..56bdca5 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -4,7 +4,6 @@
import json
from collections import OrderedDict, defaultdict
from itertools import groupby
-from typing import Dict, List
import frappe
from frappe import _
@@ -381,9 +380,7 @@
),
)
- locations = get_items_with_location_and_quantity(
- item_doc, self.item_location_map, self.docstatus
- )
+ locations = get_items_with_location_and_quantity(item_doc, self.item_location_map, self.docstatus)
item_doc.idx = None
item_doc.name = None
@@ -437,12 +434,10 @@
item_map = OrderedDict()
for item in locations:
if not item.item_code:
- frappe.throw("Row #{0}: Item Code is Mandatory".format(item.idx))
+ frappe.throw(f"Row #{item.idx}: Item Code is Mandatory")
if not cint(
frappe.get_cached_value("Item", item.item_code, "is_stock_item")
- ) and not frappe.db.exists(
- "Product Bundle", {"new_item_code": item.item_code, "disabled": 0}
- ):
+ ) and not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code, "disabled": 0}):
continue
item_code = item.item_code
reference = item.sales_order_item or item.material_request_item
@@ -564,7 +559,7 @@
return picked_items
- def _get_product_bundles(self) -> Dict[str, str]:
+ def _get_product_bundles(self) -> dict[str, str]:
# Dict[so_item_row: item_code]
product_bundles = {}
for item in self.locations:
@@ -577,13 +572,11 @@
)
return product_bundles
- def _get_product_bundle_qty_map(self, bundles: List[str]) -> Dict[str, Dict[str, float]]:
+ def _get_product_bundle_qty_map(self, bundles: list[str]) -> dict[str, dict[str, float]]:
# bundle_item_code: Dict[component, qty]
product_bundle_qty_map = {}
for bundle_item_code in bundles:
- bundle = frappe.get_last_doc(
- "Product Bundle", {"new_item_code": bundle_item_code, "disabled": 0}
- )
+ bundle = frappe.get_last_doc("Product Bundle", {"new_item_code": bundle_item_code, "disabled": 0})
product_bundle_qty_map[bundle_item_code] = {item.item_code: item.qty for item in bundle.items}
return product_bundle_qty_map
@@ -617,7 +610,11 @@
def has_reserved_stock(self):
if self.purpose == "Delivery":
for location in self.locations:
- if location.sales_order and location.sales_order_item and flt(location.stock_reserved_qty) > 0:
+ if (
+ location.sales_order
+ and location.sales_order_item
+ and flt(location.stock_reserved_qty) > 0
+ ):
return True
return False
@@ -629,7 +626,7 @@
doc.run_method("update_status")
-def get_picked_items_qty(items) -> List[Dict]:
+def get_picked_items_qty(items) -> list[dict]:
pi_item = frappe.qb.DocType("Pick List Item")
return (
frappe.qb.from_(pi_item)
@@ -659,17 +656,13 @@
locations = []
# if stock qty is zero on submitted entry, show positive remaining qty to recalculate in case of restock.
- remaining_stock_qty = (
- item_doc.qty if (docstatus == 1 and item_doc.stock_qty == 0) else item_doc.stock_qty
- )
+ remaining_stock_qty = item_doc.qty if (docstatus == 1 and item_doc.stock_qty == 0) else item_doc.stock_qty
while flt(remaining_stock_qty) > 0 and available_locations:
item_location = available_locations.pop(0)
item_location = frappe._dict(item_location)
- stock_qty = (
- remaining_stock_qty if item_location.qty >= remaining_stock_qty else item_location.qty
- )
+ stock_qty = remaining_stock_qty if item_location.qty >= remaining_stock_qty else item_location.qty
qty = stock_qty / (item_doc.conversion_factor or 1)
uom_must_be_whole_number = frappe.get_cached_value("UOM", item_doc.uom, "must_be_whole_number")
@@ -705,7 +698,7 @@
if item_location.serial_no:
# set remaining serial numbers
item_location.serial_no = item_location.serial_no[-int(qty_diff) :]
- available_locations = [item_location] + available_locations
+ available_locations = [item_location, *available_locations]
# update available locations for the item
item_location_map[item_doc.item_code] = available_locations
@@ -920,9 +913,7 @@
rejected_warehouses = get_rejected_warehouses()
for d in data:
- if (
- not consider_rejected_warehouses and rejected_warehouses and d.warehouse in rejected_warehouses
- ):
+ if not consider_rejected_warehouses and rejected_warehouses and d.warehouse in rejected_warehouses:
continue
if d.warehouse not in warehouse_wise_batches:
@@ -1033,8 +1024,7 @@
"name": "so_detail",
"parent": "against_sales_order",
},
- "condition": lambda doc: abs(doc.delivered_qty) < abs(doc.qty)
- and doc.delivered_by_supplier != 1,
+ "condition": lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier != 1,
}
for customer in sales_dict:
@@ -1056,7 +1046,6 @@
def map_pl_locations(pick_list, item_mapper, delivery_note, sales_order=None):
-
for location in pick_list.locations:
if location.sales_order != sales_order or location.product_bundle_item:
continue
@@ -1087,9 +1076,7 @@
delivery_note.customer = frappe.get_value("Sales Order", sales_order, "customer")
-def add_product_bundles_to_delivery_note(
- pick_list: "PickList", delivery_note, item_mapper
-) -> None:
+def add_product_bundles_to_delivery_note(pick_list: "PickList", delivery_note, item_mapper) -> None:
"""Add product bundles found in pick list to delivery note.
When mapping pick list items, the bundle item itself isn't part of the
@@ -1167,7 +1154,7 @@
& (wo.qty > wo.material_transferred_for_manufacturing)
& (wo.docstatus == 1)
& (wo.company == filters.get("company"))
- & (wo.name.like("%{0}%".format(txt)))
+ & (wo.name.like(f"%{txt}%"))
)
.orderby(Case().when(Locate(txt, wo.name) > 0, Locate(txt, wo.name)).else_(99999))
.orderby(wo.name)
@@ -1234,9 +1221,7 @@
stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
stock_entry.fg_completed_qty = pick_list.for_qty
if work_order.bom_no:
- stock_entry.inspection_required = frappe.db.get_value(
- "BOM", work_order.bom_no, "inspection_required"
- )
+ stock_entry.inspection_required = frappe.db.get_value("BOM", work_order.bom_no, "inspection_required")
is_wip_warehouse_group = frappe.db.get_value("Warehouse", work_order.wip_warehouse, "is_group")
if not (is_wip_warehouse_group and work_order.skip_transfer):
diff --git a/erpnext/stock/doctype/pick_list/test_pick_list.py b/erpnext/stock/doctype/pick_list/test_pick_list.py
index cffd0d2..0fe869b 100644
--- a/erpnext/stock/doctype/pick_list/test_pick_list.py
+++ b/erpnext/stock/doctype/pick_list/test_pick_list.py
@@ -319,7 +319,6 @@
pr2.cancel()
def test_pick_list_for_items_from_multiple_sales_orders(self):
-
item_code = make_item().name
try:
frappe.get_doc(
@@ -463,9 +462,7 @@
self.assertEqual(pick_list.locations[0].qty, delivery_note.items[0].qty)
self.assertEqual(pick_list.locations[1].qty, delivery_note.items[1].qty)
- self.assertEqual(
- sales_order.items[0].conversion_factor, delivery_note.items[0].conversion_factor
- )
+ self.assertEqual(sales_order.items[0].conversion_factor, delivery_note.items[0].conversion_factor)
pick_list.cancel()
sales_order.cancel()
@@ -514,7 +511,7 @@
_dict(item_code="A", warehouse="X", qty=8, picked_qty=3),
_dict(item_code="B", warehouse="Y", qty=6, picked_qty=4),
]
- for expected_item, created_item in zip(expected_items, pl.locations):
+ for expected_item, created_item in zip(expected_items, pl.locations, strict=False):
_compare_dicts(expected_item, created_item)
def test_multiple_dn_creation(self):
@@ -624,9 +621,7 @@
pick_list_1.set_item_locations()
pick_list_1.submit()
create_delivery_note(pick_list_1.name)
- for dn in frappe.get_all(
- "Delivery Note", filters={"pick_list": pick_list_1.name}, fields={"name"}
- ):
+ for dn in frappe.get_all("Delivery Note", filters={"pick_list": pick_list_1.name}, fields={"name"}):
for dn_item in frappe.get_doc("Delivery Note", dn.name).get("items"):
if dn_item.item_code == "_Test Item":
self.assertEqual(dn_item.qty, 1)
@@ -728,7 +723,9 @@
self.assertTrue(loc.serial_and_batch_bundle)
data = frappe.get_all(
- "Serial and Batch Entry", fields=["serial_no"], filters={"parent": loc.serial_and_batch_bundle}
+ "Serial and Batch Entry",
+ fields=["serial_no"],
+ filters={"parent": loc.serial_and_batch_bundle},
)
picked_serial_nos = [d.serial_no for d in data]
@@ -760,7 +757,7 @@
quantities = [5, 2]
bundle, components = create_product_bundle(quantities, warehouse=warehouse)
- bundle_items = dict(zip(components, quantities))
+ bundle_items = dict(zip(components, quantities, strict=False))
so = make_sales_order(item_code=bundle, qty=3, rate=42)
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index e87e20d..0eb42b1 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -135,7 +135,7 @@
# end: auto-generated types
def __init__(self, *args, **kwargs):
- super(PurchaseReceipt, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.status_updater = [
{
"target_dt": "Purchase Order Item",
@@ -228,7 +228,7 @@
def validate(self):
self.validate_posting_time()
- super(PurchaseReceipt, self).validate()
+ super().validate()
if self._action != "submit":
self.set_status()
@@ -258,15 +258,15 @@
# Improves UX by not giving messages of "Assets Created" before throwing error of not finding arbnb account
self.get_company_default("asset_received_but_not_billed")
get_asset_account(
- "capital_work_in_progress_account", asset_category=item.asset_category, company=self.company
+ "capital_work_in_progress_account",
+ asset_category=item.asset_category,
+ company=self.company,
)
break
def validate_provisional_expense_account(self):
provisional_accounting_for_non_stock_items = cint(
- frappe.db.get_value(
- "Company", self.company, "enable_provisional_accounting_for_non_stock_items"
- )
+ frappe.db.get_value("Company", self.company, "enable_provisional_accounting_for_non_stock_items")
)
if not provisional_accounting_for_non_stock_items:
@@ -278,7 +278,7 @@
item.provisional_expense_account = default_provisional_account
def validate_with_previous_doc(self):
- super(PurchaseReceipt, self).validate_with_previous_doc(
+ super().validate_with_previous_doc(
{
"Purchase Order": {
"ref_dn_field": "purchase_order",
@@ -339,24 +339,20 @@
return qty and flt(qty[0][0]) or 0.0
def get_po_qty_and_warehouse(self, po_detail):
- po_qty, po_warehouse = frappe.db.get_value(
- "Purchase Order Item", po_detail, ["qty", "warehouse"]
- )
+ po_qty, po_warehouse = frappe.db.get_value("Purchase Order Item", po_detail, ["qty", "warehouse"])
return po_qty, po_warehouse
# Check for Closed status
def check_on_hold_or_closed_status(self):
check_list = []
for d in self.get("items"):
- if (
- d.meta.get_field("purchase_order") and d.purchase_order and d.purchase_order not in check_list
- ):
+ if d.meta.get_field("purchase_order") and d.purchase_order and d.purchase_order not in check_list:
check_list.append(d.purchase_order)
check_on_hold_or_closed_status("Purchase Order", d.purchase_order)
# on submit
def on_submit(self):
- super(PurchaseReceipt, self).on_submit()
+ super().on_submit()
# Check for Approving Authority
frappe.get_doc("Authorization Control").validate_approving_authority(
@@ -390,7 +386,7 @@
frappe.throw(_("Purchase Invoice {0} is already submitted").format(self.submit_rv[0][0]))
def on_cancel(self):
- super(PurchaseReceipt, self).on_cancel()
+ super().on_cancel()
self.check_on_hold_or_closed_status()
# Check if Purchase Invoice has been submitted against current Purchase Order
@@ -437,9 +433,7 @@
)
provisional_accounting_for_non_stock_items = cint(
- frappe.db.get_value(
- "Company", self.company, "enable_provisional_accounting_for_non_stock_items"
- )
+ frappe.db.get_value("Company", self.company, "enable_provisional_accounting_for_non_stock_items")
)
exchange_rate_map, net_rate_map = get_purchase_document_details(self)
@@ -508,7 +502,6 @@
and self.conversion_rate != exchange_rate_map[item.purchase_invoice]
and item.net_rate == net_rate_map[item.purchase_invoice_item]
):
-
discrepancy_caused_by_exchange_rate_difference = (item.qty * item.net_rate) * (
exchange_rate_map[item.purchase_invoice] - self.conversion_rate
)
@@ -691,10 +684,12 @@
elif warehouse_account.get(d.warehouse):
stock_value_diff = get_stock_value_difference(self.name, d.name, d.warehouse)
stock_asset_account_name = warehouse_account[d.warehouse]["account"]
- supplier_warehouse_account = warehouse_account.get(self.supplier_warehouse, {}).get("account")
- supplier_warehouse_account_currency = warehouse_account.get(self.supplier_warehouse, {}).get(
- "account_currency"
+ supplier_warehouse_account = warehouse_account.get(self.supplier_warehouse, {}).get(
+ "account"
)
+ supplier_warehouse_account_currency = warehouse_account.get(
+ self.supplier_warehouse, {}
+ ).get("account_currency")
# If PR is sub-contracted and fg item rate is zero
# in that case if account for source and target warehouse are same,
@@ -911,7 +906,7 @@
so_items_details_map.setdefault(item.sales_order, []).append(item_details)
if so_items_details_map:
- if get_datetime("{} {}".format(self.posting_date, self.posting_time)) > get_datetime():
+ if get_datetime(f"{self.posting_date} {self.posting_time}") > get_datetime():
return frappe.msgprint(
_("Cannot create Stock Reservation Entries for future dated Purchase Receipts.")
)
@@ -1172,9 +1167,7 @@
frappe.throw(_("All items have already been Invoiced/Returned"))
doc = frappe.get_doc(target)
- doc.payment_terms_template = get_payment_terms_template(
- source.supplier, "Supplier", source.company
- )
+ doc.payment_terms_template = get_payment_terms_template(source.supplier, "Supplier", source.company)
doc.run_method("onload")
doc.run_method("set_missing_values")
@@ -1186,9 +1179,7 @@
def update_item(source_doc, target_doc, source_parent):
target_doc.qty, returned_qty = get_pending_qty(source_doc)
- if frappe.db.get_single_value(
- "Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"
- ):
+ if frappe.db.get_single_value("Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"):
target_doc.rejected_qty = 0
target_doc.stock_qty = flt(target_doc.qty) * flt(
target_doc.conversion_factor, target_doc.precision("conversion_factor")
@@ -1197,9 +1188,7 @@
def get_pending_qty(item_row):
qty = item_row.qty
- if frappe.db.get_single_value(
- "Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"
- ):
+ if frappe.db.get_single_value("Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"):
qty = item_row.received_qty
pending_qty = qty - invoiced_qty_map.get(item_row.name, 0)
returned_qty = flt(returned_qty_map.get(item_row.name, 0))
@@ -1384,15 +1373,11 @@
if total_item_cost > 0:
item_account_wise_cost[(item.item_code, item.purchase_receipt_item)][
account.expense_account
- ]["amount"] += (
- account.amount * item.get(based_on_field) / total_item_cost
- )
+ ]["amount"] += account.amount * item.get(based_on_field) / total_item_cost
item_account_wise_cost[(item.item_code, item.purchase_receipt_item)][
account.expense_account
- ]["base_amount"] += (
- account.base_amount * item.get(based_on_field) / total_item_cost
- )
+ ]["base_amount"] += account.base_amount * item.get(based_on_field) / total_item_cost
else:
item_account_wise_cost[(item.item_code, item.purchase_receipt_item)][
account.expense_account
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 5cf2080..705b0f9 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -63,7 +63,6 @@
pr.delete()
def test_reverse_purchase_receipt_sle(self):
-
pr = make_purchase_receipt(qty=0.5, item_code="_Test Item Home Desktop 200")
sl_entry = frappe.db.get_all(
@@ -150,9 +149,7 @@
pi.delete() # draft PI
pr.cancel()
frappe.db.set_value("Supplier", "_Test Supplier", "payment_terms", old_template_in_supplier)
- frappe.get_doc(
- "Payment Terms Template", "_Test Payment Terms Template For Purchase Invoice"
- ).delete()
+ frappe.get_doc("Payment Terms Template", "_Test Payment Terms Template For Purchase Invoice").delete()
def test_purchase_receipt_no_gl_entry(self):
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
@@ -220,7 +217,6 @@
def test_duplicate_serial_nos(self):
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
- from erpnext.stock.serial_batch_bundle import SerialBatchCreation
item = frappe.db.exists("Item", {"item_name": "Test Serialized Item 123"})
if not item:
@@ -243,7 +239,7 @@
serial_nos = get_serial_nos_from_bundle(bundle_id)
- self.assertEquals(get_serial_nos_from_bundle(pr.items[0].serial_and_batch_bundle), serial_nos)
+ self.assertEqual(get_serial_nos_from_bundle(pr.items[0].serial_and_batch_bundle), serial_nos)
bundle_id = make_serial_batch_bundle(
frappe._dict(
@@ -266,7 +262,7 @@
# Then made delivery note to remove the serial nos from stock
dn = create_delivery_note(item_code=item.name, qty=2, rate=1500, serial_no=serial_nos)
dn.load_from_db()
- self.assertEquals(get_serial_nos_from_bundle(dn.items[0].serial_and_batch_bundle), serial_nos)
+ self.assertEqual(get_serial_nos_from_bundle(dn.items[0].serial_and_batch_bundle), serial_nos)
posting_date = add_days(today(), -3)
@@ -393,13 +389,12 @@
frappe.db.get_value("Serial No", serial_no, "warehouse"), pr.get("items")[0].warehouse
)
- rejected_serial_nos = get_serial_nos_from_bundle(
- pr.get("items")[0].rejected_serial_and_batch_bundle
- )
+ rejected_serial_nos = get_serial_nos_from_bundle(pr.get("items")[0].rejected_serial_and_batch_bundle)
self.assertEqual(len(rejected_serial_nos), 2)
for serial_no in rejected_serial_nos:
self.assertEqual(
- frappe.db.get_value("Serial No", serial_no, "warehouse"), pr.get("items")[0].rejected_warehouse
+ frappe.db.get_value("Serial No", serial_no, "warehouse"),
+ pr.get("items")[0].rejected_warehouse,
)
pr.cancel()
@@ -614,8 +609,6 @@
for field, value in field_values.items():
self.assertEqual(cstr(serial_no.get(field)), value)
- from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
-
pr = make_purchase_receipt(item_code="_Test Serialized Item With Series", qty=1)
serial_no = get_serial_nos_from_bundle(pr.get("items")[0].serial_and_batch_bundle)[0]
@@ -733,7 +726,6 @@
po.cancel()
def test_serial_no_against_purchase_receipt(self):
-
item_code = "Test Manual Created Serial No"
if not frappe.db.exists("Item", item_code):
make_item(item_code, dict(has_serial_no=1))
@@ -884,7 +876,7 @@
"Stock Received But Not Billed - TCP1": {"cost_center": cost_center},
stock_in_hand_account: {"cost_center": cost_center},
}
- for i, gle in enumerate(gl_entries):
+ for _i, gle in enumerate(gl_entries):
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
pr.cancel()
@@ -909,7 +901,7 @@
"Stock Received But Not Billed - TCP1": {"cost_center": cost_center},
stock_in_hand_account: {"cost_center": cost_center},
}
- for i, gle in enumerate(gl_entries):
+ for _i, gle in enumerate(gl_entries):
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
pr.cancel()
@@ -1190,9 +1182,7 @@
pr.submit()
# Get exchnage gain and loss account
- exchange_gain_loss_account = frappe.db.get_value(
- "Company", pr.company, "exchange_gain_loss_account"
- )
+ exchange_gain_loss_account = frappe.db.get_value("Company", pr.company, "exchange_gain_loss_account")
# fetching the latest GL Entry with exchange gain and loss account account
amount = frappe.db.get_value(
@@ -1249,9 +1239,7 @@
account = "Stock Received But Not Billed - TCP1"
make_item(item_code)
- se = make_stock_entry(
- item_code=item_code, from_warehouse=warehouse, qty=50, do_not_save=True, rate=0
- )
+ se = make_stock_entry(item_code=item_code, from_warehouse=warehouse, qty=50, do_not_save=True, rate=0)
se.items[0].allow_zero_valuation_rate = 1
se.save()
se.submit()
@@ -1697,7 +1685,6 @@
)
# Step 4: Create Internal Purchase Receipt
- from erpnext.controllers.status_updater import OverAllowanceError
from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt
pr = make_inter_company_purchase_receipt(dn.name)
@@ -1847,7 +1834,6 @@
)
# Step 4: Create Internal Purchase Receipt
- from erpnext.controllers.status_updater import OverAllowanceError
from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt
pr = make_inter_company_purchase_receipt(dn.name)
@@ -2200,9 +2186,9 @@
gl_entries = get_gl_entries(pr_return.doctype, pr_return.name)
# Test - 1: SLE Stock Value Difference should be equal to Qty * Average Rate
- average_rate = (
- (se.items[0].qty * se.items[0].basic_rate) + (pr.items[0].qty * pr.items[0].rate)
- ) / (se.items[0].qty + pr.items[0].qty)
+ average_rate = ((se.items[0].qty * se.items[0].basic_rate) + (pr.items[0].qty * pr.items[0].rate)) / (
+ se.items[0].qty + pr.items[0].qty
+ )
expected_stock_value_difference = pr_return.items[0].qty * average_rate
self.assertEqual(
flt(sl_entries[0].stock_value_difference, 2), flt(expected_stock_value_difference, 2)
@@ -2344,7 +2330,7 @@
do_not_save=1,
)
- for i in range(9):
+ for _i in range(9):
pr.append(
"items",
{
@@ -2384,7 +2370,7 @@
do_not_save=1,
)
- for i in range(9):
+ for _i in range(9):
pr.append(
"items",
{
@@ -2678,7 +2664,9 @@
self.assertEqual(row.rate, 250.0)
serial_nos = get_serial_nos_from_bundle(row.serial_and_batch_bundle)
for sn in serial_nos:
- serial_no_details = frappe.db.get_value("Serial No", sn, ["status", "warehouse"], as_dict=1)
+ serial_no_details = frappe.db.get_value(
+ "Serial No", sn, ["status", "warehouse"], as_dict=1
+ )
self.assertTrue(serial_no_details.status == "Active")
self.assertEqual(serial_no_details.warehouse, "Work In Progress - TCP1")
@@ -2815,7 +2803,9 @@
self.assertEqual(row.rate, 250.0)
serial_nos = get_serial_nos_from_bundle(row.serial_and_batch_bundle)
for sn in serial_nos:
- serial_no_details = frappe.db.get_value("Serial No", sn, ["status", "warehouse"], as_dict=1)
+ serial_no_details = frappe.db.get_value(
+ "Serial No", sn, ["status", "warehouse"], as_dict=1
+ )
self.assertTrue(serial_no_details.status == "Active")
self.assertEqual(serial_no_details.warehouse, "Work In Progress - TCP1")
@@ -2890,7 +2880,6 @@
def get_taxes(**args):
-
args = frappe._dict(args)
return [
@@ -3035,14 +3024,13 @@
"rejected_warehouse": args.rejected_warehouse or "_Test Rejected Warehouse - _TC"
if rejected_qty != 0
else "",
- "rate": args.rate if args.rate != None else 50,
+ "rate": args.rate if args.rate is not None else 50,
"conversion_factor": args.conversion_factor or 1.0,
"stock_qty": flt(qty) * (flt(args.conversion_factor) or 1.0),
"serial_and_batch_bundle": bundle_id,
"stock_uom": args.stock_uom or "_Test UOM",
"uom": uom,
- "cost_center": args.cost_center
- or frappe.get_cached_value("Company", pr.company, "cost_center"),
+ "cost_center": args.cost_center or frappe.get_cached_value("Company", pr.company, "cost_center"),
"asset_location": args.location or "Test Location",
"use_serial_batch_fields": args.use_serial_batch_fields or 0,
"serial_no": args.serial_no if args.use_serial_batch_fields else "",
diff --git a/erpnext/stock/doctype/putaway_rule/putaway_rule.py b/erpnext/stock/doctype/putaway_rule/putaway_rule.py
index 7ed6923..923c34e 100644
--- a/erpnext/stock/doctype/putaway_rule/putaway_rule.py
+++ b/erpnext/stock/doctype/putaway_rule/putaway_rule.py
@@ -128,9 +128,7 @@
updated_table = add_row(item, pending_qty, source_warehouse or item.warehouse, updated_table)
continue
- at_capacity, rules = get_ordered_putaway_rules(
- item_code, company, source_warehouse=source_warehouse
- )
+ at_capacity, rules = get_ordered_putaway_rules(item_code, company, source_warehouse=source_warehouse)
if not rules:
warehouse = source_warehouse or item.get("warehouse")
@@ -221,7 +219,7 @@
new_sorted = sorted(new, key=sort_key)
# Once sorted by all relevant keys both tables should align if they are same.
- for old_item, new_item in zip(old_sorted, new_sorted):
+ for old_item, new_item in zip(old_sorted, new_sorted, strict=False):
for key in compare_keys:
if old_item.get(key) != new_item.get(key):
return True
@@ -270,9 +268,7 @@
if item.doctype == "Stock Entry Detail":
new_updated_table_row.t_warehouse = warehouse
- new_updated_table_row.transfer_qty = flt(to_allocate) * flt(
- new_updated_table_row.conversion_factor
- )
+ new_updated_table_row.transfer_qty = flt(to_allocate) * flt(new_updated_table_row.conversion_factor)
else:
new_updated_table_row.stock_qty = flt(to_allocate) * flt(new_updated_table_row.conversion_factor)
new_updated_table_row.warehouse = warehouse
@@ -294,23 +290,19 @@
for entry in items_not_accomodated:
item_link = frappe.utils.get_link_to_form("Item", entry[0])
- formatted_item_rows += """
- <td>{0}</td>
- <td>{1}</td>
- </tr>""".format(
- item_link, frappe.bold(entry[1])
- )
+ formatted_item_rows += f"""
+ <td>{item_link}</td>
+ <td>{frappe.bold(entry[1])}</td>
+ </tr>"""
msg += """
<table class="table">
<thead>
- <td>{0}</td>
- <td>{1}</td>
+ <td>{}</td>
+ <td>{}</td>
</thead>
- {2}
+ {}
</table>
- """.format(
- _("Item"), _("Unassigned Qty"), formatted_item_rows
- )
+ """.format(_("Item"), _("Unassigned Qty"), formatted_item_rows)
frappe.msgprint(msg, title=_("Insufficient Capacity"), is_minimizable=True, wide=True)
diff --git a/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py b/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py
index f5bad51..9f7fdec 100644
--- a/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py
+++ b/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py
@@ -10,7 +10,6 @@
from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
get_batch_from_bundle,
get_serial_nos_from_bundle,
- make_serial_batch_bundle,
)
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
@@ -51,9 +50,7 @@
def test_putaway_rules_priority(self):
"""Test if rule is applied by priority, irrespective of free space."""
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg")
rule_2 = create_putaway_rule(
item_code="_Rice", warehouse=self.warehouse_2, capacity=300, uom="Kg", priority=2
)
@@ -74,17 +71,11 @@
def test_putaway_rules_with_same_priority(self):
"""Test if rule with more free space is applied,
among two rules with same priority and capacity."""
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=500, uom="Kg"
- )
- rule_2 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_2, capacity=500, uom="Kg"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=500, uom="Kg")
+ rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=500, uom="Kg")
# out of 500 kg capacity, occupy 100 kg in warehouse_1
- stock_receipt = make_stock_entry(
- item_code="_Rice", target=self.warehouse_1, qty=100, basic_rate=50
- )
+ stock_receipt = make_stock_entry(item_code="_Rice", target=self.warehouse_1, qty=100, basic_rate=50)
pr = make_purchase_receipt(item_code="_Rice", qty=700, apply_putaway_rule=1, do_not_submit=1)
self.assertEqual(len(pr.items), 2)
@@ -102,12 +93,8 @@
def test_putaway_rules_with_insufficient_capacity(self):
"""Test if qty exceeding capacity, is handled."""
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=100, uom="Kg"
- )
- rule_2 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_2, capacity=200, uom="Kg"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=100, uom="Kg")
+ rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=200, uom="Kg")
pr = make_purchase_receipt(item_code="_Rice", qty=350, apply_putaway_rule=1, do_not_submit=1)
self.assertEqual(len(pr.items), 2)
@@ -128,19 +115,13 @@
item.append("uoms", {"uom": "Bag", "conversion_factor": 1000})
item.save()
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=3, uom="Bag"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=3, uom="Bag")
self.assertEqual(rule_1.stock_capacity, 3000)
- rule_2 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_2, capacity=4, uom="Bag"
- )
+ rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=4, uom="Bag")
self.assertEqual(rule_2.stock_capacity, 4000)
# populate 'Rack 1' with 1 Bag, making the free space 2 Bags
- stock_receipt = make_stock_entry(
- item_code="_Rice", target=self.warehouse_1, qty=1000, basic_rate=50
- )
+ stock_receipt = make_stock_entry(item_code="_Rice", target=self.warehouse_1, qty=1000, basic_rate=50)
pr = make_purchase_receipt(
item_code="_Rice",
@@ -172,9 +153,7 @@
frappe.db.set_value("UOM", "Bag", "must_be_whole_number", 1)
# Putaway Rule in different UOM
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=1, uom="Bag"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=1, uom="Bag")
self.assertEqual(rule_1.stock_capacity, 1000)
# Putaway Rule in Stock UOM
rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=500)
@@ -204,9 +183,7 @@
def test_putaway_rules_with_reoccurring_item(self):
"""Test rules on same item entered multiple times with different rate."""
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg")
# total capacity is 200 Kg
pr = make_purchase_receipt(item_code="_Rice", qty=100, apply_putaway_rule=1, do_not_submit=1)
@@ -242,9 +219,7 @@
def test_validate_over_receipt_in_warehouse(self):
"""Test if overreceipt is blocked in the presence of putaway rules."""
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg")
pr = make_purchase_receipt(item_code="_Rice", qty=300, apply_putaway_rule=1, do_not_submit=1)
self.assertEqual(len(pr.items), 1)
@@ -296,9 +271,7 @@
def test_putaway_rule_on_stock_entry_material_transfer_reoccuring_item(self):
"""Test if reoccuring item is correctly considered."""
- rule_1 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_1, capacity=300, uom="Kg"
- )
+ rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=300, uom="Kg")
rule_2 = create_putaway_rule(
item_code="_Rice", warehouse=self.warehouse_2, capacity=600, uom="Kg", priority=2
)
@@ -440,9 +413,7 @@
rule_1 = create_putaway_rule(
item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
) # more capacity
- rule_2 = create_putaway_rule(
- item_code="_Rice", warehouse=self.warehouse_2, capacity=100, uom="Kg"
- )
+ rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=100, uom="Kg")
stock_entry = make_stock_entry(
item_code="_Rice",
@@ -492,9 +463,7 @@
putaway.capacity = args.capacity or 1
putaway.stock_uom = frappe.db.get_value("Item", putaway.item_code, "stock_uom")
putaway.uom = args.uom or putaway.stock_uom
- putaway.conversion_factor = get_conversion_factor(putaway.item_code, putaway.uom)[
- "conversion_factor"
- ]
+ putaway.conversion_factor = get_conversion_factor(putaway.item_code, putaway.uom)["conversion_factor"]
if not args.do_not_save:
putaway.save()
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index 8816341..536a88f 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -125,13 +125,11 @@
if self.reference_type == "Job Card":
if self.reference_name:
frappe.db.sql(
- """
- UPDATE `tab{doctype}`
+ f"""
+ UPDATE `tab{self.reference_type}`
SET quality_inspection = %s, modified = %s
WHERE name = %s and production_item = %s
- """.format(
- doctype=self.reference_type
- ),
+ """,
(quality_inspection, self.modified, self.reference_name, self.item_code),
)
@@ -153,9 +151,9 @@
args.append(self.name)
frappe.db.sql(
- """
+ f"""
UPDATE
- `tab{child_doc}` t1, `tab{parent_doc}` t2
+ `tab{doctype}` t1, `tab{self.reference_type}` t2
SET
t1.quality_inspection = %s, t2.modified = %s
WHERE
@@ -163,9 +161,7 @@
and t1.item_code = %s
and t1.parent = t2.name
{conditions}
- """.format(
- parent_doc=self.reference_type, child_doc=doctype, conditions=conditions
- ),
+ """,
args,
)
@@ -203,7 +199,9 @@
reading_value = reading.get("reading_" + str(i))
if reading_value is not None and reading_value.strip():
result = (
- flt(reading.get("min_value")) <= parse_float(reading_value) <= flt(reading.get("max_value"))
+ flt(reading.get("min_value"))
+ <= parse_float(reading_value)
+ <= flt(reading.get("max_value"))
)
if not result:
return False
@@ -225,9 +223,9 @@
except NameError as e:
field = frappe.bold(e.args[0].split()[1])
frappe.throw(
- _("Row #{0}: {1} is not a valid reading field. Please refer to the field description.").format(
- reading.idx, field
- ),
+ _(
+ "Row #{0}: {1} is not a valid reading field. Please refer to the field description."
+ ).format(reading.idx, field),
title=_("Invalid Formula"),
)
except Exception:
@@ -296,40 +294,26 @@
qi_condition = ""
return frappe.db.sql(
- """
+ f"""
SELECT item_code
- FROM `tab{doc}`
+ FROM `tab{from_doctype}`
WHERE parent=%(parent)s and docstatus < 2 and item_code like %(txt)s
{qi_condition} {cond} {mcond}
- ORDER BY item_code limit {page_len} offset {start}
- """.format(
- doc=from_doctype,
- cond=cond,
- mcond=mcond,
- start=cint(start),
- page_len=cint(page_len),
- qi_condition=qi_condition,
- ),
+ ORDER BY item_code limit {cint(page_len)} offset {cint(start)}
+ """,
{"parent": filters.get("parent"), "txt": "%%%s%%" % txt},
)
elif filters.get("reference_name"):
return frappe.db.sql(
- """
+ f"""
SELECT production_item
- FROM `tab{doc}`
+ FROM `tab{from_doctype}`
WHERE name = %(reference_name)s and docstatus < 2 and production_item like %(txt)s
{qi_condition} {cond} {mcond}
ORDER BY production_item
- limit {page_len} offset {start}
- """.format(
- doc=from_doctype,
- cond=cond,
- mcond=mcond,
- start=cint(start),
- page_len=cint(page_len),
- qi_condition=qi_condition,
- ),
+ limit {cint(page_len)} offset {cint(start)}
+ """,
{"reference_name": filters.get("reference_name"), "txt": "%%%s%%" % txt},
)
diff --git a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
index c423ca8..f59d7c3 100644
--- a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
@@ -159,9 +159,7 @@
do_not_submit=True,
)
- readings = [
- {"specification": "Iron Content", "min_value": 0.1, "max_value": 0.9, "reading_1": "1.0"}
- ]
+ readings = [{"specification": "Iron Content", "min_value": 0.1, "max_value": 0.9, "reading_1": "1.0"}]
qa = create_quality_inspection(
reference_type="Stock Entry", reference_name=se.name, readings=readings, status="Rejected"
diff --git a/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py b/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py
index 34fb68c..7b7bffe 100644
--- a/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py
+++ b/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py
@@ -35,17 +35,13 @@
def get_stock_item_details(warehouse, date, item=None, barcode=None):
out = {}
if barcode:
- out["item"] = frappe.db.get_value(
- "Item Barcode", filters={"barcode": barcode}, fieldname=["parent"]
- )
+ out["item"] = frappe.db.get_value("Item Barcode", filters={"barcode": barcode}, fieldname=["parent"])
if not out["item"]:
frappe.throw(_("Invalid Barcode. There is no Item attached to this barcode."))
else:
out["item"] = item
- barcodes = frappe.db.get_values(
- "Item Barcode", filters={"parent": out["item"]}, fieldname=["barcode"]
- )
+ barcodes = frappe.db.get_values("Item Barcode", filters={"parent": out["item"]}, fieldname=["barcode"])
out["barcodes"] = [x[0] for x in barcodes]
out["qty"] = get_stock_balance(out["item"], warehouse, date)
diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
index 4ad3237..73778e3 100644
--- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
@@ -144,15 +144,12 @@
if not acc_settings.acc_frozen_upto:
return
if getdate(self.posting_date) <= getdate(acc_settings.acc_frozen_upto):
- if (
+ if acc_settings.frozen_accounts_modifier and frappe.session.user in get_users_with_role(
acc_settings.frozen_accounts_modifier
- and frappe.session.user in get_users_with_role(acc_settings.frozen_accounts_modifier)
):
frappe.msgprint(_("Caution: This might alter frozen accounts."))
return
- frappe.throw(
- _("You cannot repost item valuation before {}").format(acc_settings.acc_frozen_upto)
- )
+ frappe.throw(_("You cannot repost item valuation before {}").format(acc_settings.acc_frozen_upto))
def reset_field_values(self):
if self.based_on == "Transaction":
diff --git a/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
index 950b436..7aa2fc3 100644
--- a/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
@@ -175,7 +175,6 @@
riv3.set_status("Skipped")
def test_stock_freeze_validation(self):
-
today = nowdate()
riv = frappe.get_doc(
diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
index 58971e8..1ae34d0 100644
--- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
+++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
@@ -4,7 +4,6 @@
import collections
import csv
from collections import Counter, defaultdict
-from typing import Dict, List
import frappe
from frappe import _, _dict, bold
@@ -149,9 +148,7 @@
serial_no_warehouse[data.serial_no] = data.warehouse
for serial_no in serial_nos:
- if (
- not serial_no_warehouse.get(serial_no) or serial_no_warehouse.get(serial_no) != self.warehouse
- ):
+ if not serial_no_warehouse.get(serial_no) or serial_no_warehouse.get(serial_no) != self.warehouse:
self.throw_error_message(
f"Serial No {bold(serial_no)} is not present in the warehouse {bold(self.warehouse)}.",
SerialNoWarehouseError,
@@ -229,9 +226,7 @@
def get_serial_nos(self):
return [d.serial_no for d in self.entries if d.serial_no]
- def set_incoming_rate_for_outward_transaction(
- self, row=None, save=False, allow_negative_stock=False
- ):
+ def set_incoming_rate_for_outward_transaction(self, row=None, save=False, allow_negative_stock=False):
sle = self.get_sle_for_outward_transaction()
if self.has_serial_no:
@@ -352,14 +347,10 @@
if not self.voucher_detail_no or self.voucher_detail_no != row.name:
values_to_set["voucher_detail_no"] = row.name
- if parent.get("posting_date") and (
- not self.posting_date or self.posting_date != parent.posting_date
- ):
+ if parent.get("posting_date") and (not self.posting_date or self.posting_date != parent.posting_date):
values_to_set["posting_date"] = parent.posting_date or today()
- if parent.get("posting_time") and (
- not self.posting_time or self.posting_time != parent.posting_time
- ):
+ if parent.get("posting_time") and (not self.posting_time or self.posting_time != parent.posting_time):
values_to_set["posting_time"] = parent.posting_time
if parent.doctype in [
@@ -441,9 +432,9 @@
parent = frappe.qb.DocType("Serial and Batch Bundle")
child = frappe.qb.DocType("Serial and Batch Entry")
- timestamp_condition = CombineDatetime(
- parent.posting_date, parent.posting_time
- ) > CombineDatetime(self.posting_date, self.posting_time)
+ timestamp_condition = CombineDatetime(parent.posting_date, parent.posting_time) > CombineDatetime(
+ self.posting_date, self.posting_time
+ )
future_entries = (
frappe.qb.from_(parent)
@@ -615,7 +606,6 @@
)
def validate_incorrect_serial_nos(self, serial_nos):
-
if self.voucher_type == "Stock Entry" and self.voucher_no:
if frappe.get_cached_value("Stock Entry", self.voucher_no, "purpose") == "Repack":
return
@@ -942,7 +932,7 @@
serial_nos = []
batch_nos = []
- with open(file_path, "r") as f:
+ with open(file_path) as f:
reader = csv.reader(f)
serial_nos, batch_nos = parse_csv_file_to_get_serial_batch(reader)
@@ -1217,10 +1207,7 @@
def create_serial_batch_no_ledgers(
entries, child_row, parent_doc, warehouse=None, do_not_save=False
) -> object:
-
- warehouse = warehouse or (
- child_row.rejected_warehouse if child_row.is_rejected else child_row.warehouse
- )
+ warehouse = warehouse or (child_row.rejected_warehouse if child_row.is_rejected else child_row.warehouse)
type_of_transaction = get_type_of_transaction(parent_doc, child_row)
if parent_doc.get("doctype") == "Stock Entry":
@@ -1706,9 +1693,7 @@
reserved_batches_details = frappe._dict()
if data:
reserved_batches_details = frappe._dict(
- {
- (d.batch_no, d.warehouse): frappe._dict({"warehouse": d.warehouse, "qty": d.qty}) for d in data
- }
+ {(d.batch_no, d.warehouse): frappe._dict({"warehouse": d.warehouse, "qty": d.qty}) for d in data}
)
return reserved_batches_details
@@ -1856,7 +1841,7 @@
# For work order and subcontracting
-def get_voucher_wise_serial_batch_from_bundle(**kwargs) -> Dict[str, Dict]:
+def get_voucher_wise_serial_batch_from_bundle(**kwargs) -> dict[str, dict]:
data = get_ledgers_from_serial_batch_bundle(**kwargs)
if not data:
return {}
@@ -1984,7 +1969,7 @@
return [row.serial_no for row in data if row.serial_no]
-def get_ledgers_from_serial_batch_bundle(**kwargs) -> List[frappe._dict]:
+def get_ledgers_from_serial_batch_bundle(**kwargs) -> list[frappe._dict]:
bundle_table = frappe.qb.DocType("Serial and Batch Bundle")
serial_batch_table = frappe.qb.DocType("Serial and Batch Entry")
@@ -2045,7 +2030,7 @@
stock_ledger_entry.serial_no,
stock_ledger_entry.serial_and_batch_bundle,
)
- .where((stock_ledger_entry.is_cancelled == 0))
+ .where(stock_ledger_entry.is_cancelled == 0)
)
if kwargs.get("posting_date"):
diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py
index 826ac03..5f75b40 100644
--- a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py
+++ b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py
@@ -650,7 +650,7 @@
batches = get_batch_nos(bundle)
- return list(batches.keys())[0]
+ return next(iter(batches.keys()))
def get_serial_nos_from_bundle(bundle):
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 5f4f393..4c693d8 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -3,7 +3,6 @@
import json
-from typing import List, Optional, Union
import frappe
from frappe import ValidationError, _
@@ -47,9 +46,7 @@
item_group: DF.Link | None
item_name: DF.Data | None
location: DF.Link | None
- maintenance_status: DF.Literal[
- "", "Under Warranty", "Out of Warranty", "Under AMC", "Out of AMC"
- ]
+ maintenance_status: DF.Literal["", "Under Warranty", "Out of Warranty", "Under AMC", "Out of AMC"]
purchase_document_no: DF.Data | None
purchase_rate: DF.Float
serial_no: DF.Data
@@ -61,7 +58,7 @@
# end: auto-generated types
def __init__(self, *args, **kwargs):
- super(SerialNo, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.via_stock_ledger = False
def validate(self):
@@ -121,9 +118,9 @@
)
-def get_available_serial_nos(serial_no_series, qty) -> List[str]:
+def get_available_serial_nos(serial_no_series, qty) -> list[str]:
serial_nos = []
- for i in range(cint(qty)):
+ for _i in range(cint(qty)):
serial_nos.append(get_new_serial_number(serial_no_series))
return serial_nos
@@ -138,13 +135,11 @@
def get_items_html(serial_nos, item_code):
body = ", ".join(serial_nos)
- return """<details><summary>
- <b>{0}:</b> {1} Serial Numbers <span class="caret"></span>
+ return f"""<details><summary>
+ <b>{item_code}:</b> {len(serial_nos)} Serial Numbers <span class="caret"></span>
</summary>
- <div class="small">{2}</div></details>
- """.format(
- item_code, len(serial_nos), body
- )
+ <div class="small">{body}</div></details>
+ """
def get_serial_nos(serial_no):
@@ -177,11 +172,9 @@
def get_delivery_note_serial_no(item_code, qty, delivery_note):
serial_nos = ""
dn_serial_nos = frappe.db.sql_list(
- """ select name from `tabSerial No`
+ f""" select name from `tabSerial No`
where item_code = %(item_code)s and delivery_document_no = %(delivery_note)s
- and sales_invoice is null limit {0}""".format(
- cint(qty)
- ),
+ and sales_invoice is null limit {cint(qty)}""",
{"item_code": item_code, "delivery_note": delivery_note},
)
@@ -196,12 +189,11 @@
qty: int,
item_code: str,
warehouse: str,
- posting_date: Optional[str] = None,
- batch_nos: Optional[Union[str, List[str]]] = None,
- for_doctype: Optional[str] = None,
+ posting_date: str | None = None,
+ batch_nos: str | list[str] | None = None,
+ for_doctype: str | None = None,
exclude_sr_nos=None,
-) -> List[str]:
-
+) -> list[str]:
filters = frappe._dict({"item_code": item_code, "warehouse": warehouse})
if exclude_sr_nos is None:
diff --git a/erpnext/stock/doctype/serial_no/test_serial_no.py b/erpnext/stock/doctype/serial_no/test_serial_no.py
index 5a5c403..79291af 100644
--- a/erpnext/stock/doctype/serial_no/test_serial_no.py
+++ b/erpnext/stock/doctype/serial_no/test_serial_no.py
@@ -6,9 +6,8 @@
import frappe
-from frappe import _, _dict
+from frappe import _dict
from frappe.tests.utils import FrappeTestCase
-from frappe.utils import today
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
from erpnext.stock.doctype.item.test_item import make_item
@@ -16,10 +15,8 @@
from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
get_batch_from_bundle,
get_serial_nos_from_bundle,
- make_serial_batch_bundle,
)
from erpnext.stock.doctype.serial_no.serial_no import *
-from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
@@ -53,9 +50,7 @@
se = make_serialized_item(target_warehouse="_Test Warehouse - _TC")
serial_nos = get_serial_nos_from_bundle(se.get("items")[0].serial_and_batch_bundle)
- dn = create_delivery_note(
- item_code="_Test Serialized Item With Series", qty=1, serial_no=[serial_nos[0]]
- )
+ create_delivery_note(item_code="_Test Serialized Item With Series", qty=1, serial_no=[serial_nos[0]])
serial_no = frappe.get_doc("Serial No", serial_nos[0])
@@ -63,7 +58,7 @@
self.assertEqual(serial_no.warehouse, None)
wh = create_warehouse("_Test Warehouse", company="_Test Company 1")
- pr = make_purchase_receipt(
+ make_purchase_receipt(
item_code="_Test Serialized Item With Series",
qty=1,
serial_no=[serial_nos[0]],
@@ -118,7 +113,7 @@
self.assertRaises(frappe.ValidationError, dn.cancel)
# deliver from second company
- dn_2 = create_delivery_note(
+ create_delivery_note(
item_code="_Test Serialized Item With Series",
qty=1,
serial_no=[serial_nos[0]],
@@ -201,16 +196,14 @@
{"doctype": "Serial No", "item_code": item_code, "serial_no": serial_no}
).insert()
- in1 = make_stock_entry(
+ make_stock_entry(
item_code=item_code, to_warehouse=warehouse, qty=1, rate=42, serial_no=[serial_nos[0]]
)
- in2 = make_stock_entry(
+ make_stock_entry(
item_code=item_code, to_warehouse=warehouse, qty=1, rate=113, serial_no=[serial_nos[1]]
)
- out = create_delivery_note(
- item_code=item_code, qty=1, serial_no=[serial_nos[0]], do_not_submit=True
- )
+ out = create_delivery_note(item_code=item_code, qty=1, serial_no=[serial_nos[0]], do_not_submit=True)
bundle = out.items[0].serial_and_batch_bundle
doc = frappe.get_doc("Serial and Batch Bundle", bundle)
diff --git a/erpnext/stock/doctype/shipment/test_shipment.py b/erpnext/stock/doctype/shipment/test_shipment.py
index 726dff4..4d4eadc 100644
--- a/erpnext/stock/doctype/shipment/test_shipment.py
+++ b/erpnext/stock/doctype/shipment/test_shipment.py
@@ -76,9 +76,7 @@
shipment.description_of_content = "unit test entry"
for delivery_note in delivery_notes:
shipment.append("shipment_delivery_note", {"delivery_note": delivery_note.name})
- shipment.append(
- "shipment_parcel", {"length": 5, "width": 5, "height": 5, "weight": 5, "count": 5}
- )
+ shipment.append("shipment_parcel", {"length": 5, "width": 5, "height": 5, "weight": 5, "count": 5})
shipment.insert()
return shipment
@@ -96,9 +94,7 @@
def get_shipment_customer_address(customer_name):
address_title = customer_name + " address 123"
- customer_address = frappe.get_all(
- "Address", fields=["name"], filters={"address_title": address_title}
- )
+ customer_address = frappe.get_all("Address", fields=["name"], filters={"address_title": address_title})
if len(customer_address):
return customer_address[0]
else:
@@ -160,9 +156,7 @@
customer.is_primary_contact = 1
customer.is_billing_contact = 1
customer.append("email_ids", {"email_id": "randomme@email.com", "is_primary": 1})
- customer.append(
- "phone_nos", {"phone": "123123123", "is_primary_phone": 1, "is_primary_mobile_no": 1}
- )
+ customer.append("phone_nos", {"phone": "123123123", "is_primary_phone": 1, "is_primary_mobile_no": 1})
customer.status = "Passive"
customer.insert()
return customer
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index d2dab8a..9bb607c 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -4,7 +4,6 @@
import json
from collections import defaultdict
-from typing import List
import frappe
from frappe import _
@@ -147,7 +146,7 @@
# end: auto-generated types
def __init__(self, *args, **kwargs):
- super(StockEntry, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
if self.purchase_order:
self.subcontract_data = frappe._dict(
{
@@ -174,9 +173,7 @@
def before_validate(self):
from erpnext.stock.doctype.putaway_rule.putaway_rule import apply_putaway_rule
- apply_rule = self.apply_putaway_rule and (
- self.purpose in ["Material Transfer", "Material Receipt"]
- )
+ 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)
@@ -345,7 +342,11 @@
if self.purpose == "Send to Warehouse":
for d in frappe.get_all(
"Stock Entry",
- filters={"docstatus": 0, "outgoing_stock_entry": self.name, "purpose": "Receive at Warehouse"},
+ filters={
+ "docstatus": 0,
+ "outgoing_stock_entry": self.name,
+ "purpose": "Receive at Warehouse",
+ },
):
frappe.delete_doc("Stock Entry", d.name)
@@ -487,7 +488,7 @@
return
precision = frappe.get_precision("Stock Entry Detail", "qty")
- fg_item = list(fg_qty.keys())[0]
+ fg_item = next(iter(fg_qty.keys()))
fg_item_qty = flt(fg_qty[fg_item], precision)
fg_completed_qty = flt(self.fg_completed_qty, precision)
@@ -670,14 +671,13 @@
production_item, qty = frappe.db.get_value(
"Work Order", self.work_order, ["production_item", "qty"]
)
- args = other_ste + [production_item]
+ args = [*other_ste, production_item]
fg_qty_already_entered = frappe.db.sql(
"""select sum(transfer_qty)
from `tabStock Entry Detail`
- where parent in (%s)
- and item_code = %s
- and ifnull(s_warehouse,'')='' """
- % (", ".join(["%s" * len(other_ste)]), "%s"),
+ where parent in ({})
+ and item_code = {}
+ and ifnull(s_warehouse,'')='' """.format(", ".join(["%s" * len(other_ste)]), "%s"),
args,
)[0][0]
if fg_qty_already_entered and fg_qty_already_entered >= qty:
@@ -758,9 +758,7 @@
Set rate for outgoing, scrapped and finished items
"""
# Set rate for outgoing items
- outgoing_items_cost = self.set_rate_for_outgoing_items(
- reset_outgoing_rate, raise_error_if_no_rate
- )
+ outgoing_items_cost = self.set_rate_for_outgoing_items(reset_outgoing_rate, raise_error_if_no_rate)
finished_item_qty = sum(d.transfer_qty for d in self.items if d.is_finished_item)
items = []
@@ -867,7 +865,6 @@
if settings.material_consumption:
if settings.get_rm_cost_from_consumption_entry and self.work_order:
-
# Validate only if Material Consumption Entry exists for the Work Order.
if frappe.db.exists(
"Stock Entry",
@@ -879,7 +876,9 @@
):
for item in self.items:
if not item.is_finished_item and not item.is_scrap_item:
- label = frappe.get_meta(settings.doctype).get_label("get_rm_cost_from_consumption_entry")
+ label = frappe.get_meta(settings.doctype).get_label(
+ "get_rm_cost_from_consumption_entry"
+ )
frappe.throw(
_(
"Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials."
@@ -892,7 +891,8 @@
)
if frappe.db.exists(
- "Stock Entry", {"docstatus": 1, "work_order": self.work_order, "purpose": "Manufacture"}
+ "Stock Entry",
+ {"docstatus": 1, "work_order": self.work_order, "purpose": "Manufacture"},
):
frappe.throw(
_("Only one {0} entry can be created against the Work Order {1}").format(
@@ -1060,13 +1060,17 @@
item_code = se_item.original_item or se_item.item_code
precision = cint(frappe.db.get_default("float_precision")) or 3
required_qty = sum(
- [flt(d.required_qty) for d in subcontract_order.supplied_items if d.rm_item_code == item_code]
+ [
+ flt(d.required_qty)
+ for d in subcontract_order.supplied_items
+ if d.rm_item_code == item_code
+ ]
)
total_allowed = required_qty + (required_qty * (qty_allowance / 100))
if not required_qty:
- bom_no = frappe.db.get_value(
+ frappe.db.get_value(
f"{self.subcontract_data.order_doctype} Item",
{
"parent": self.get(self.subcontract_data.order_field),
@@ -1112,7 +1116,10 @@
& (se.docstatus == 1)
& (se_detail.item_code == se_item.item_code)
& (
- ((se.purchase_order == self.purchase_order) & (se_detail.po_detail == se_item.po_detail))
+ (
+ (se.purchase_order == self.purchase_order)
+ & (se_detail.po_detail == se_item.po_detail)
+ )
if self.subcontract_data.order_doctype == "Purchase Order"
else (
(se.subcontracting_order == self.subcontracting_order)
@@ -1165,7 +1172,9 @@
else:
if not se_item.allow_alternative_item:
frappe.throw(
- _("Row {0}# Item {1} not found in 'Raw Materials Supplied' table in {2} {3}").format(
+ _(
+ "Row {0}# Item {1} not found in 'Raw Materials Supplied' table in {2} {3}"
+ ).format(
se_item.idx,
se_item.item_code,
self.subcontract_data.order_doctype,
@@ -1342,12 +1351,18 @@
for d in self.get("items"):
if cstr(d.s_warehouse):
sle = self.get_sl_entries(
- d, {"warehouse": cstr(d.s_warehouse), "actual_qty": -flt(d.transfer_qty), "incoming_rate": 0}
+ d,
+ {
+ "warehouse": cstr(d.s_warehouse),
+ "actual_qty": -flt(d.transfer_qty),
+ "incoming_rate": 0,
+ },
)
if cstr(d.t_warehouse):
sle.dependant_sle_voucher_detail_no = d.name
elif finished_item_row and (
- finished_item_row.item_code != d.item_code or finished_item_row.t_warehouse != d.s_warehouse
+ finished_item_row.item_code != d.item_code
+ or finished_item_row.t_warehouse != d.s_warehouse
):
sle.dependant_sle_voucher_detail_no = finished_item_row.name
@@ -1419,7 +1434,7 @@
sl_entries.append(sle)
def get_gl_entries(self, warehouse_account):
- gl_entries = super(StockEntry, self).get_gl_entries(warehouse_account)
+ gl_entries = super().get_gl_entries(warehouse_account)
if self.purpose in ("Repack", "Manufacture"):
total_basic_amount = sum(flt(t.basic_amount) for t in self.get("items") if t.is_finished_item)
@@ -1452,9 +1467,9 @@
flt(t.amount * multiply_based_on) / divide_based_on
)
- item_account_wise_additional_cost[(d.item_code, d.name)][t.expense_account]["base_amount"] += (
- flt(t.base_amount * multiply_based_on) / divide_based_on
- )
+ item_account_wise_additional_cost[(d.item_code, d.name)][t.expense_account][
+ "base_amount"
+ ] += flt(t.base_amount * multiply_based_on) / divide_based_on
if item_account_wise_additional_cost:
for d in self.get("items"):
@@ -1486,7 +1501,9 @@
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit": -1
- * amount["base_amount"], # put it as negative credit instead of debit purposefully
+ * amount[
+ "base_amount"
+ ], # put it as negative credit instead of debit purposefully
},
item=d,
)
@@ -1607,7 +1624,10 @@
):
subcontract_items = frappe.get_all(
self.subcontract_data.order_supplied_items_field,
- {"parent": self.get(self.subcontract_data.order_field), "rm_item_code": args.get("item_code")},
+ {
+ "parent": self.get(self.subcontract_data.order_field),
+ "rm_item_code": args.get("item_code"),
+ },
"main_item_code",
)
@@ -1655,7 +1675,6 @@
)
if self.bom_no:
-
backflush_based_on = frappe.db.get_single_value(
"Manufacturing Settings", "backflush_raw_materials_based_on"
)
@@ -1669,7 +1688,6 @@
"Material Transfer for Manufacture",
"Material Consumption for Manufacture",
]:
-
if self.work_order and self.purpose == "Material Transfer for Manufacture":
item_dict = self.get_pending_raw_materials(backflush_based_on)
if self.to_warehouse and self.pro_doc:
@@ -1679,7 +1697,10 @@
elif (
self.work_order
- and (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture")
+ and (
+ self.purpose == "Manufacture"
+ or self.purpose == "Material Consumption for Manufacture"
+ )
and not self.pro_doc.skip_transfer
and self.flags.backflush_based_on == "Material Transferred for Manufacture"
):
@@ -1687,7 +1708,10 @@
elif (
self.work_order
- and (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture")
+ and (
+ self.purpose == "Manufacture"
+ or self.purpose == "Material Consumption for Manufacture"
+ )
and self.flags.backflush_based_on == "BOM"
and frappe.db.get_single_value("Manufacturing Settings", "material_consumption") == 1
):
@@ -1700,7 +1724,10 @@
item_dict = self.get_bom_raw_materials(self.fg_completed_qty)
# Get Subcontract Order Supplied Items Details
- if self.get(self.subcontract_data.order_field) and self.purpose == "Send to Subcontractor":
+ if (
+ self.get(self.subcontract_data.order_field)
+ and self.purpose == "Send to Subcontractor"
+ ):
# Get Subcontract Order Supplied Items Details
parent = frappe.qb.DocType(self.subcontract_data.order_doctype)
child = frappe.qb.DocType(self.subcontract_data.order_supplied_items_field)
@@ -1719,9 +1746,14 @@
if self.pro_doc and cint(self.pro_doc.from_wip_warehouse):
item["from_warehouse"] = self.pro_doc.wip_warehouse
# Get Reserve Warehouse from Subcontract Order
- if self.get(self.subcontract_data.order_field) and self.purpose == "Send to Subcontractor":
+ if (
+ self.get(self.subcontract_data.order_field)
+ and self.purpose == "Send to Subcontractor"
+ ):
item["from_warehouse"] = item_wh.get(item.item_code)
- item["to_warehouse"] = self.to_warehouse if self.purpose == "Send to Subcontractor" else ""
+ item["to_warehouse"] = (
+ self.to_warehouse if self.purpose == "Send to Subcontractor" else ""
+ )
self.add_to_stock_entry_detail(item_dict)
@@ -1911,9 +1943,7 @@
from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
if (
- frappe.db.get_single_value(
- "Manufacturing Settings", "set_op_cost_and_scrape_from_sub_assemblies"
- )
+ frappe.db.get_single_value("Manufacturing Settings", "set_op_cost_and_scrape_from_sub_assemblies")
and self.work_order
and frappe.get_cached_value("Work Order", self.work_order, "use_multi_level_bom")
):
@@ -2070,7 +2100,7 @@
)
precision = frappe.get_precision("Stock Entry Detail", "qty")
- for key, row in available_materials.items():
+ for _key, row in available_materials.items():
remaining_qty_to_produce = flt(wo_data.trans_qty) - flt(wo_data.produced_qty)
if remaining_qty_to_produce <= 0 and not self.is_return:
continue
@@ -2244,9 +2274,7 @@
continue
transfer_pending = flt(d.required_qty) > flt(d.transferred_qty)
- can_transfer = transfer_pending or (
- backflush_based_on == "Material Transferred for Manufacture"
- )
+ can_transfer = transfer_pending or (backflush_based_on == "Material Transferred for Manufacture")
if not can_transfer:
continue
@@ -2261,7 +2289,9 @@
)
item_row["job_card_item"] = job_card_item or None
- if d.source_warehouse and not frappe.db.get_value("Warehouse", d.source_warehouse, "is_group"):
+ if d.source_warehouse and not frappe.db.get_value(
+ "Warehouse", d.source_warehouse, "is_group"
+ ):
item_row["from_warehouse"] = d.source_warehouse
item_row["to_warehouse"] = wip_warehouse
@@ -2318,9 +2348,9 @@
if item_row.get(field):
se_child.set(field, item_row.get(field))
- if se_child.s_warehouse == None:
+ if se_child.s_warehouse is None:
se_child.s_warehouse = self.from_warehouse
- if se_child.t_warehouse == None:
+ if se_child.t_warehouse is None:
se_child.t_warehouse = self.to_warehouse
# in stock uom
@@ -2376,15 +2406,20 @@
expiry_date = frappe.db.get_value("Batch", item.batch_no, "expiry_date")
if expiry_date:
if getdate(self.posting_date) > getdate(expiry_date):
- frappe.throw(_("Batch {0} of Item {1} has expired.").format(item.batch_no, item.item_code))
+ frappe.throw(
+ _("Batch {0} of Item {1} has expired.").format(
+ item.batch_no, item.item_code
+ )
+ )
else:
- frappe.throw(_("Batch {0} of Item {1} is disabled.").format(item.batch_no, item.item_code))
+ frappe.throw(
+ _("Batch {0} of Item {1} is disabled.").format(item.batch_no, item.item_code)
+ )
def update_subcontract_order_supplied_items(self):
if self.get(self.subcontract_data.order_field) and (
self.purpose in ["Send to Subcontractor", "Material Transfer"] or self.is_return
):
-
# Get Subcontract Order Supplied Items Details
order_supplied_items = frappe.db.get_all(
self.subcontract_data.order_supplied_items_field,
@@ -2449,8 +2484,8 @@
cond = ""
for data, transferred_qty in stock_entries.items():
- cond += """ WHEN (parent = %s and name = %s) THEN %s
- """ % (
+ cond += """ WHEN (parent = {} and name = {}) THEN {}
+ """.format(
frappe.db.escape(data[0]),
frappe.db.escape(data[1]),
transferred_qty,
@@ -2506,7 +2541,9 @@
material_request = item.material_request or None
if self.purpose == "Material Transfer" and material_request not in material_requests:
if self.outgoing_stock_entry and parent_se:
- material_request = frappe.get_value("Stock Entry Detail", item.ste_detail, "material_request")
+ material_request = frappe.get_value(
+ "Stock Entry Detail", item.ste_detail, "material_request"
+ )
if material_request and material_request not in material_requests:
material_requests.append(material_request)
@@ -2543,7 +2580,7 @@
d.serial_and_batch_bundle = id
d.use_serial_batch_fields = 0
- def get_available_serial_nos(self) -> List[str]:
+ def get_available_serial_nos(self) -> list[str]:
serial_nos = []
data = frappe.get_all(
"Serial No",
@@ -2738,9 +2775,7 @@
)
)
):
- operating_cost_per_unit += flt(work_order.corrective_operation_cost) / flt(
- work_order.produced_qty
- )
+ operating_cost_per_unit += flt(work_order.corrective_operation_cost) / flt(work_order.produced_qty)
return operating_cost_per_unit
@@ -2753,24 +2788,20 @@
if subcontract_order:
cond = f"and ste.purpose = 'Send to Subcontractor' and ste.{subcontract_order_field} = '{subcontract_order}'"
elif work_order:
- cond = "and ste.purpose = 'Material Transfer for Manufacture' and ste.work_order = '{0}'".format(
- work_order
- )
+ cond = f"and ste.purpose = 'Material Transfer for Manufacture' and ste.work_order = '{work_order}'"
if not cond:
return {}
used_alternative_items = {}
data = frappe.db.sql(
- """ select sted.original_item, sted.uom, sted.conversion_factor,
+ f""" select sted.original_item, sted.uom, sted.conversion_factor,
sted.item_code, sted.item_name, sted.conversion_factor,sted.stock_uom, sted.description
from
`tabStock Entry` ste, `tabStock Entry Detail` sted
where
sted.parent = ste.name and ste.docstatus = 1 and sted.original_item != sted.item_code
- {0} """.format(
- cond
- ),
+ {cond} """,
as_dict=1,
)
@@ -2808,9 +2839,7 @@
conversion_factor = get_conversion_factor(item_code, uom).get("conversion_factor")
if not conversion_factor:
- frappe.msgprint(
- _("UOM conversion factor required for UOM: {0} in Item: {1}").format(uom, item_code)
- )
+ frappe.msgprint(_("UOM conversion factor required for UOM: {0} in Item: {1}").format(uom, item_code))
ret = {"uom": ""}
else:
ret = {
@@ -2920,9 +2949,7 @@
else:
supplied_item.supplied_qty += row.transfer_qty
- supplied_item.total_supplied_qty = flt(supplied_item.supplied_qty) - flt(
- supplied_item.returned_qty
- )
+ supplied_item.total_supplied_qty = flt(supplied_item.supplied_qty) - flt(supplied_item.returned_qty)
return supplied_item_details
@@ -3034,7 +3061,11 @@
& (stock_entry_detail.s_warehouse.isnotnull())
& (
stock_entry.purpose.isin(
- ["Manufacture", "Material Consumption for Manufacture", "Material Transfer for Manufacture"]
+ [
+ "Manufacture",
+ "Material Consumption for Manufacture",
+ "Material Transfer for Manufacture",
+ ]
)
)
)
@@ -3086,7 +3117,6 @@
doc.has_batch_no = 1
batchwise_serial_nos = get_batchwise_serial_nos(child.item_code, row)
for batch_no, qty in row.batches_to_be_consume.items():
-
while qty > 0:
qty -= 1
doc.append(
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
index 271cbbc..e5f4e73 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
@@ -2,7 +2,7 @@
# See license.txt
-from typing import TYPE_CHECKING, Optional, overload
+from typing import TYPE_CHECKING, overload
import frappe
from frappe.utils import cint, flt
@@ -18,15 +18,15 @@
*,
item_code: str,
qty: float,
- company: Optional[str] = None,
- from_warehouse: Optional[str] = None,
- to_warehouse: Optional[str] = None,
- rate: Optional[float] = None,
- serial_no: Optional[str] = None,
- batch_no: Optional[str] = None,
- posting_date: Optional[str] = None,
- posting_time: Optional[str] = None,
- purpose: Optional[str] = None,
+ company: str | None = None,
+ from_warehouse: str | None = None,
+ to_warehouse: str | None = None,
+ rate: float | None = None,
+ serial_no: str | None = None,
+ batch_no: str | None = None,
+ posting_date: str | None = None,
+ posting_time: str | None = None,
+ purpose: str | None = None,
do_not_save: bool = False,
do_not_submit: bool = False,
inspection_required: bool = False,
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index 01a43b3..c4ead57 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -5,7 +5,7 @@
import frappe
from frappe.permissions import add_user_permission, remove_user_permission
from frappe.tests.utils import FrappeTestCase, change_settings
-from frappe.utils import add_days, add_to_date, flt, nowdate, nowtime, today
+from frappe.utils import add_days, flt, nowdate, nowtime, today
from erpnext.accounts.doctype.account.test_account import get_inventory_account
from erpnext.controllers.accounts_controller import InvalidQtyError
@@ -20,7 +20,7 @@
get_serial_nos_from_bundle,
make_serial_batch_bundle,
)
-from erpnext.stock.doctype.serial_no.serial_no import * # noqa
+from erpnext.stock.doctype.serial_no.serial_no import *
from erpnext.stock.doctype.stock_entry.stock_entry import FinishedGoodError, make_stock_in_entry
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
from erpnext.stock.doctype.stock_ledger_entry.stock_ledger_entry import StockFreezeError
@@ -38,7 +38,7 @@
condition, values = "", []
for key, value in args.items():
condition += " and " if condition else " where "
- condition += "`{0}`=%s".format(key)
+ condition += f"`{key}`=%s"
values.append(value)
return frappe.db.sql(
@@ -151,8 +151,7 @@
)
projected_qty = (
- frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "projected_qty")
- or 0
+ frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "projected_qty") or 0
)
frappe.db.set_single_value("Stock Settings", "auto_indent", 1)
@@ -693,14 +692,10 @@
se.set_stock_entry_type()
se.insert()
se.submit()
- self.assertTrue(
- frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse 1 - _TC"
- )
+ self.assertTrue(frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse 1 - _TC")
se.cancel()
- self.assertTrue(
- frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse - _TC"
- )
+ self.assertTrue(frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse - _TC")
frappe.flags.use_serial_and_batch_fields = False
def test_serial_cancel(self):
@@ -732,9 +727,7 @@
else:
item = frappe.get_doc("Item", {"item_name": "Batched and Serialised Item"})
- se = make_stock_entry(
- item_code=item.item_code, target="_Test Warehouse - _TC", qty=1, basic_rate=100
- )
+ se = make_stock_entry(item_code=item.item_code, target="_Test Warehouse - _TC", qty=1, basic_rate=100)
batch_no = get_batch_from_bundle(se.items[0].serial_and_batch_bundle)
serial_no = get_serial_nos_from_bundle(se.items[0].serial_and_batch_bundle)[0]
batch_qty = get_batch_qty(batch_no, "_Test Warehouse - _TC", item.item_code)
@@ -750,7 +743,7 @@
self.assertEqual(frappe.db.get_value("Serial No", serial_no, "warehouse"), None)
def test_warehouse_company_validation(self):
- company = frappe.db.get_value("Warehouse", "_Test Warehouse 2 - _TC1", "company")
+ frappe.db.get_value("Warehouse", "_Test Warehouse 2 - _TC1", "company")
frappe.get_doc("User", "test2@example.com").add_roles(
"Sales User", "Sales Manager", "Stock User", "Stock Manager"
)
@@ -856,12 +849,8 @@
for d in stock_entry.get("items"):
if d.item_code != "_Test FG Item 2":
rm_cost += flt(d.amount)
- fg_cost = list(filter(lambda x: x.item_code == "_Test FG Item 2", stock_entry.get("items")))[
- 0
- ].amount
- self.assertEqual(
- fg_cost, flt(rm_cost + bom_operation_cost + work_order.additional_operating_cost, 2)
- )
+ fg_cost = next(filter(lambda x: x.item_code == "_Test FG Item 2", stock_entry.get("items"))).amount
+ self.assertEqual(fg_cost, flt(rm_cost + bom_operation_cost + work_order.additional_operating_cost, 2))
@change_settings("Manufacturing Settings", {"material_consumption": 1})
def test_work_order_manufacture_with_material_consumption(self):
@@ -904,8 +893,8 @@
for d in s.get("items"):
if d.s_warehouse:
rm_cost += d.amount
- fg_cost = list(filter(lambda x: x.item_code == "_Test FG Item", s.get("items")))[0].amount
- scrap_cost = list(filter(lambda x: x.is_scrap_item, s.get("items")))[0].amount
+ fg_cost = next(filter(lambda x: x.item_code == "_Test FG Item", s.get("items"))).amount
+ scrap_cost = next(filter(lambda x: x.is_scrap_item, s.get("items"))).amount
self.assertEqual(fg_cost, flt(rm_cost - scrap_cost, 2))
# When Stock Entry has only FG + Scrap
@@ -919,13 +908,11 @@
rm_cost += d.amount
self.assertEqual(rm_cost, 0)
expected_fg_cost = s.get_basic_rate_for_manufactured_item(1)
- fg_cost = list(filter(lambda x: x.item_code == "_Test FG Item", s.get("items")))[0].amount
+ fg_cost = next(filter(lambda x: x.item_code == "_Test FG Item", s.get("items"))).amount
self.assertEqual(flt(fg_cost, 2), flt(expected_fg_cost, 2))
def test_variant_work_order(self):
- bom_no = frappe.db.get_value(
- "BOM", {"item": "_Test Variant Item", "is_default": 1, "docstatus": 1}
- )
+ bom_no = frappe.db.get_value("BOM", {"item": "_Test Variant Item", "is_default": 1, "docstatus": 1})
make_item_variant() # make variant of _Test Variant Item if absent
@@ -1061,9 +1048,7 @@
self.assertRaises(frappe.ValidationError, repack.submit)
def test_customer_provided_parts_se(self):
- create_item(
- "CUST-0987", is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0
- )
+ create_item("CUST-0987", is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0)
se = make_stock_entry(
item_code="CUST-0987", purpose="Material Receipt", qty=4, to_warehouse="_Test Warehouse - _TC"
)
@@ -1178,9 +1163,7 @@
self.check_gl_entries(
"Stock Entry",
se.name,
- sorted(
- [["Stock Adjustment - TCP1", 100.0, 0.0], ["Miscellaneous Expenses - TCP1", 0.0, 100.0]]
- ),
+ sorted([["Stock Adjustment - TCP1", 100.0, 0.0], ["Miscellaneous Expenses - TCP1", 0.0, 100.0]]),
)
def test_conversion_factor_change(self):
@@ -1344,7 +1327,7 @@
)
batch_nos.append(get_batch_from_bundle(se2.items[0].serial_and_batch_bundle))
- with self.assertRaises(frappe.ValidationError) as nse:
+ with self.assertRaises(frappe.ValidationError):
make_stock_entry(
item_code=item_code,
qty=1,
@@ -1604,15 +1587,12 @@
self.assertRaises(BatchExpiredError, se.save)
def test_negative_stock_reco(self):
- from erpnext.controllers.stock_controller import BatchExpiredError
- from erpnext.stock.doctype.batch.test_batch import make_new_batch
-
frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 0)
item_code = "Test Negative Item - 001"
- item_doc = create_item(item_code=item_code, is_stock_item=1, valuation_rate=10)
+ create_item(item_code=item_code, is_stock_item=1, valuation_rate=10)
- se1 = make_stock_entry(
+ make_stock_entry(
item_code=item_code,
posting_date=add_days(today(), -3),
posting_time="00:00:00",
@@ -1621,7 +1601,7 @@
to_warehouse="_Test Warehouse - _TC",
)
- se2 = make_stock_entry(
+ make_stock_entry(
item_code=item_code,
posting_date=today(),
posting_time="00:00:00",
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index b49fe22..a3166a8 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -232,9 +232,7 @@
if not self.serial_and_batch_bundle:
self.throw_error_message(f"Serial No / Batch No are mandatory for Item {self.item_code}")
- if (
- self.serial_and_batch_bundle and not item_detail.has_serial_no and not item_detail.has_batch_no
- ):
+ if self.serial_and_batch_bundle and not item_detail.has_serial_no and not item_detail.has_batch_no:
self.throw_error_message(f"Serial No and Batch No are not allowed for Item {self.item_code}")
def throw_error_message(self, message, exception=frappe.ValidationError):
@@ -262,7 +260,9 @@
)
if older_than_x_days_ago and stock_settings.stock_auth_role not in frappe.get_roles():
frappe.throw(
- _("Not allowed to update stock transactions older than {0}").format(stock_frozen_upto_days),
+ _("Not allowed to update stock transactions older than {0}").format(
+ stock_frozen_upto_days
+ ),
StockFreezeError,
)
@@ -280,7 +280,9 @@
expiry_date = frappe.db.get_value("Batch", self.batch_no, "expiry_date")
if expiry_date:
if getdate(self.posting_date) > getdate(expiry_date):
- frappe.throw(_("Batch {0} of Item {1} has expired.").format(self.batch_no, self.item_code))
+ frappe.throw(
+ _("Batch {0} of Item {1} has expired.").format(self.batch_no, self.item_code)
+ )
def validate_and_set_fiscal_year(self):
if not self.fiscal_year:
@@ -313,7 +315,7 @@
(self.item_code, self.warehouse),
)[0][0]
- cur_doc_posting_datetime = "%s %s" % (
+ cur_doc_posting_datetime = "{} {}".format(
self.posting_date,
self.get("posting_time") or "00:00:00",
)
@@ -322,7 +324,9 @@
last_transaction_time
):
msg = _("Last Stock Transaction for item {0} under warehouse {1} was on {2}.").format(
- frappe.bold(self.item_code), frappe.bold(self.warehouse), frappe.bold(last_transaction_time)
+ frappe.bold(self.item_code),
+ frappe.bold(self.warehouse),
+ frappe.bold(last_transaction_time),
)
msg += "<br><br>" + _(
diff --git a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
index 40a2d5a..6c12b36 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
@@ -8,7 +8,6 @@
import frappe
from frappe.core.page.permission_manager.permission_manager import reset
from frappe.custom.doctype.property_setter.property_setter import make_property_setter
-from frappe.query_builder.functions import CombineDatetime
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, add_to_date, flt, today
@@ -20,8 +19,6 @@
)
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
- get_batch_from_bundle,
- get_serial_nos_from_bundle,
make_serial_batch_bundle,
)
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
@@ -40,8 +37,7 @@
# delete SLE and BINs for all items
frappe.db.sql(
- "delete from `tabStock Ledger Entry` where item_code in (%s)"
- % (", ".join(["%s"] * len(items))),
+ "delete from `tabStock Ledger Entry` where item_code in (%s)" % (", ".join(["%s"] * len(items))),
items,
)
frappe.db.sql(
@@ -127,7 +123,7 @@
self.assertEqual(finished_item_sle.get("valuation_rate"), 540)
# Reconciliation for _Test Item for Reposting at Stores on 12-04-2020: Qty = 50, Rate = 150
- sr = create_stock_reconciliation(
+ create_stock_reconciliation(
item_code="_Test Item for Reposting",
warehouse="Stores - _TC",
qty=50,
@@ -491,7 +487,7 @@
expected_incoming_rates = expected_abs_svd = [75.0, 125.0, 75.0, 125.0]
self.assertEqual(expected_abs_svd, svd_list, "Incorrect 'Stock Value Difference' values")
- for dn, incoming_rate in zip(dns, expected_incoming_rates):
+ for dn, _incoming_rate in zip(dns, expected_incoming_rates, strict=False):
self.assertTrue(
dn.items[0].incoming_rate in expected_abs_svd,
"Incorrect 'Incoming Rate' values fetched for DN items",
@@ -567,9 +563,7 @@
],
)
- reciept = make_stock_entry(
- item_code=item_code, target=source, batch_no=batches[0], qty=5, rate=10
- )
+ reciept = make_stock_entry(item_code=item_code, target=source, batch_no=batches[0], qty=5, rate=10)
self.assertSLEs(
reciept,
[
@@ -691,9 +685,7 @@
],
)
- consume_today = make_stock_entry(
- item_code=item_code, source=warehouse, batch_no=batches[0], qty=1
- )
+ consume_today = make_stock_entry(item_code=item_code, source=warehouse, batch_no=batches[0], qty=1)
self.assertSLEs(
consume_today,
[
@@ -726,8 +718,8 @@
item, warehouses, batches = setup_item_valuation_test()
def check_sle_details_against_expected(sle_details, expected_sle_details, detail, columns):
- for i, (sle_vals, ex_sle_vals) in enumerate(zip(sle_details, expected_sle_details)):
- for col, sle_val, ex_sle_val in zip(columns, sle_vals, ex_sle_vals):
+ for i, (sle_vals, ex_sle_vals) in enumerate(zip(sle_details, expected_sle_details, strict=False)):
+ for col, sle_val, ex_sle_val in zip(columns, sle_vals, ex_sle_vals, strict=False):
if col == "stock_queue":
sle_val = get_stock_value_from_q(sle_val)
ex_sle_val = get_stock_value_from_q(ex_sle_val)
@@ -757,9 +749,7 @@
se_entry_list_mi = [
(item, warehouses[0], None, batches[1], 1, None, "2021-01-29"),
]
- ses = create_stock_entry_entries_for_batchwise_item_valuation_test(
- se_entry_list_mi, "Material Issue"
- )
+ ses = create_stock_entry_entries_for_batchwise_item_valuation_test(se_entry_list_mi, "Material Issue")
sle_details = fetch_sle_details_for_doc_list(ses, columns=columns, as_dict=0)
expected_sle_details = [(-100.0, 50.0, -1.0, 1.0, "[]")]
details_list.append((sle_details, expected_sle_details, "Material Issue Entries", columns))
@@ -949,9 +939,7 @@
rates = [10 * i for i in range(1, 5)]
- receipt = make_stock_entry(
- item_code=rm.name, target=warehouse, qty=10, do_not_save=True, rate=10
- )
+ receipt = make_stock_entry(item_code=rm.name, target=warehouse, qty=10, do_not_save=True, rate=10)
for rate in rates[1:]:
row = frappe.copy_doc(receipt.items[0], ignore_no_copy=False)
row.basic_rate = rate
@@ -981,9 +969,7 @@
repack.submit()
# same exact queue should be transferred
- self.assertSLEs(
- repack, [{"incoming_rate": sum(rates) * 10}], sle_filters={"item_code": packed.name}
- )
+ self.assertSLEs(repack, [{"incoming_rate": sum(rates) * 10}], sle_filters={"item_code": packed.name})
def test_negative_fifo_valuation(self):
"""
@@ -993,7 +979,7 @@
item = make_item(properties={"allow_negative_stock": 1}).name
warehouse = "_Test Warehouse - _TC"
- receipt = make_stock_entry(item_code=item, target=warehouse, qty=10, rate=10)
+ make_stock_entry(item_code=item, target=warehouse, qty=10, rate=10)
consume1 = make_stock_entry(item_code=item, source=warehouse, qty=15)
self.assertSLEs(consume1, [{"stock_value": -5 * 10, "stock_queue": [[-5, 10]]}])
@@ -1033,27 +1019,21 @@
self.assertEqual(50, _get_stock_credit(depdendent_consumption))
# backdated receipt - should trigger GL repost of all previous stock entries
- bd_receipt = make_stock_entry(
- item_code=item, to_warehouse=A, qty=5, rate=20, posting_date=_day(-1)
- )
+ bd_receipt = make_stock_entry(item_code=item, to_warehouse=A, qty=5, rate=20, posting_date=_day(-1))
self.assertEqual(100, _get_stock_credit(depdendent_consumption))
# cancelling receipt should reset it back
bd_receipt.cancel()
self.assertEqual(50, _get_stock_credit(depdendent_consumption))
- bd_receipt2 = make_stock_entry(
- item_code=item, to_warehouse=A, qty=2, rate=20, posting_date=_day(-2)
- )
+ bd_receipt2 = make_stock_entry(item_code=item, to_warehouse=A, qty=2, rate=20, posting_date=_day(-2))
# total as per FIFO -> 2 * 20 + 3 * 10 = 70
self.assertEqual(70, _get_stock_credit(depdendent_consumption))
# transfer WIP material to final destination and consume it all
depdendent_consumption.cancel()
make_stock_entry(item_code=item, from_warehouse=B, to_warehouse=C, qty=5, posting_date=_day(3))
- final_consumption = make_stock_entry(
- item_code=item, from_warehouse=C, qty=5, posting_date=_day(4)
- )
+ final_consumption = make_stock_entry(item_code=item, from_warehouse=C, qty=5, posting_date=_day(4))
# exact amount gets consumed
self.assertEqual(70, _get_stock_credit(final_consumption))
@@ -1120,11 +1100,10 @@
self.assertEqual([1], ordered_qty_after_transaction())
def test_timestamp_clash(self):
-
item = make_item().name
warehouse = "_Test Warehouse - _TC"
- reciept = make_stock_entry(
+ make_stock_entry(
item_code=item,
to_warehouse=warehouse,
qty=100,
@@ -1133,7 +1112,7 @@
posting_time="01:00:00",
)
- consumption = make_stock_entry(
+ make_stock_entry(
item_code=item,
from_warehouse=warehouse,
qty=50,
@@ -1152,11 +1131,10 @@
try:
backdated_receipt.cancel()
- except Exception as e:
+ except Exception:
self.fail("Double processing of qty for clashing timestamp.")
def test_previous_sle_with_clashed_timestamp(self):
-
item = make_item().name
warehouse = "_Test Warehouse - _TC"
@@ -1197,7 +1175,6 @@
self.assertEqual(sle[0].actual_qty, 5)
def test_backdated_sle_with_same_timestamp(self):
-
item = make_item().name
warehouse = "_Test Warehouse - _TC"
@@ -1440,12 +1417,13 @@
def setup_item_valuation_test(
- valuation_method="FIFO", suffix=None, use_batchwise_valuation=1, batches_list=["X", "Y"]
+ valuation_method="FIFO", suffix=None, use_batchwise_valuation=1, batches_list=None
):
- from erpnext.stock.doctype.batch.batch import make_batch
from erpnext.stock.doctype.item.test_item import make_item
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
+ if batches_list is None:
+ batches_list = ["X", "Y"]
if not suffix:
suffix = get_unique_suffix()
@@ -1459,7 +1437,7 @@
for i, batch_id in enumerate(batches):
if not frappe.db.exists("Batch", batch_id):
ubw = use_batchwise_valuation
- if isinstance(use_batchwise_valuation, (list, tuple)):
+ if isinstance(use_batchwise_valuation, list | tuple):
ubw = use_batchwise_valuation[i]
batch = frappe.get_doc(
frappe._dict(
@@ -1490,9 +1468,7 @@
dns = []
for item, warehouse, batch_no, qty, rate in dn_entry_list:
- so = make_sales_order(
- rate=rate, qty=qty, item=item, warehouse=warehouse, against_blanket_order=0
- )
+ so = make_sales_order(rate=rate, qty=qty, item=item, warehouse=warehouse, against_blanket_order=0)
dn = make_delivery_note(so.name)
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 0311481..0421f0f 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -1,7 +1,6 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
-from typing import Optional
import frappe
from frappe import _, bold, msgprint
@@ -58,7 +57,7 @@
# end: auto-generated types
def __init__(self, *args, **kwargs):
- super(StockReconciliation, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.head_row = ["Item Code", "Warehouse", "Quantity", "Valuation Rate"]
def validate(self):
@@ -142,7 +141,9 @@
"type_of_transaction": "Outward",
"company": self.company,
"is_rejected": 0,
- "serial_nos": get_serial_nos(row.current_serial_no) if row.current_serial_no else None,
+ "serial_nos": get_serial_nos(row.current_serial_no)
+ if row.current_serial_no
+ else None,
"batches": frappe._dict({row.batch_no: row.current_qty}) if row.batch_no else None,
"batch_no": row.batch_no,
"do_not_submit": True,
@@ -327,7 +328,9 @@
if not item.batch_no and not item.serial_no:
for dimension in get_inventory_dimensions():
if item.get(dimension.get("fieldname")):
- inventory_dimensions_dict[dimension.get("fieldname")] = item.get(dimension.get("fieldname"))
+ inventory_dimensions_dict[dimension.get("fieldname")] = item.get(
+ dimension.get("fieldname")
+ )
item_dict = get_stock_balance_for(
item.item_code,
@@ -432,11 +435,17 @@
# do not allow negative valuation
if flt(row.valuation_rate) < 0:
- self.validation_messages.append(_get_msg(row_num, _("Negative Valuation Rate is not allowed")))
+ self.validation_messages.append(
+ _get_msg(row_num, _("Negative Valuation Rate is not allowed"))
+ )
if row.qty and row.valuation_rate in ["", None]:
row.valuation_rate = get_stock_balance(
- row.item_code, row.warehouse, self.posting_date, self.posting_time, with_valuation_rate=True
+ row.item_code,
+ row.warehouse,
+ self.posting_date,
+ self.posting_time,
+ with_valuation_rate=True,
)[1]
if not row.valuation_rate:
# try if there is a buying price list in default currency
@@ -508,7 +517,7 @@
else:
items_html = ""
for d in data:
- items_html += "<li>{0} units of Item {1} in Warehouse {2}</li>".format(
+ items_html += "<li>{} units of Item {} in Warehouse {}</li>".format(
bold(d[2]), bold(d[0]), bold(d[1])
)
@@ -528,7 +537,6 @@
sl_entries = []
for row in self.items:
-
if not row.qty and not row.valuation_rate and not row.current_qty:
self.make_adjustment_entry(row, sl_entries)
continue
@@ -578,9 +586,7 @@
sl_entries.append(self.get_sle_for_items(row))
if sl_entries:
- allow_negative_stock = cint(
- frappe.db.get_single_value("Stock Settings", "allow_negative_stock")
- )
+ allow_negative_stock = cint(frappe.db.get_single_value("Stock Settings", "allow_negative_stock"))
self.make_sl_entries(sl_entries, allow_negative_stock=allow_negative_stock)
def make_adjustment_entry(self, row, sl_entries):
@@ -688,9 +694,7 @@
data.valuation_rate = flt(row.valuation_rate)
data.stock_value_difference = -1 * flt(row.amount_difference)
- elif (
- self.docstatus == 1 and has_dimensions and (not row.batch_no or not row.serial_and_batch_bundle)
- ):
+ elif self.docstatus == 1 and has_dimensions and (not row.batch_no or not row.serial_and_batch_bundle):
data.actual_qty = row.qty
data.qty_after_transaction = 0.0
data.incoming_rate = flt(row.valuation_rate)
@@ -711,9 +715,7 @@
sl_entries = self.merge_similar_item_serial_nos(sl_entries)
sl_entries.reverse()
- allow_negative_stock = cint(
- frappe.db.get_single_value("Stock Settings", "allow_negative_stock")
- )
+ allow_negative_stock = cint(frappe.db.get_single_value("Stock Settings", "allow_negative_stock"))
self.make_sl_entries(sl_entries, allow_negative_stock=allow_negative_stock)
def merge_similar_item_serial_nos(self, sl_entries):
@@ -750,9 +752,7 @@
if not self.cost_center:
msgprint(_("Please enter Cost Center"), raise_exception=1)
- return super(StockReconciliation, self).get_gl_entries(
- warehouse_account, self.expense_account, self.cost_center
- )
+ return super().get_gl_entries(warehouse_account, self.expense_account, self.cost_center)
def validate_expense_account(self):
if not cint(erpnext.is_perpetual_inventory_enabled(self.company)):
@@ -851,7 +851,12 @@
val_rate = item_dict.get("rate")
elif row.batch_no:
current_qty = get_batch_qty_for_stock_reco(
- row.item_code, row.warehouse, row.batch_no, self.posting_date, self.posting_time, self.name
+ row.item_code,
+ row.warehouse,
+ row.batch_no,
+ self.posting_date,
+ self.posting_time,
+ self.name,
)
precesion = row.precision("current_qty")
@@ -986,9 +991,7 @@
return current_qty
-def get_batch_qty_for_stock_reco(
- item_code, warehouse, batch_no, posting_date, posting_time, voucher_no
-):
+def get_batch_qty_for_stock_reco(item_code, warehouse, batch_no, posting_date, posting_time, voucher_no):
ledger = frappe.qb.DocType("Stock Ledger Entry")
query = (
@@ -1018,9 +1021,7 @@
@frappe.whitelist()
-def get_items(
- warehouse, posting_date, posting_time, company, item_code=None, ignore_empty_stock=False
-):
+def get_items(warehouse, posting_date, posting_time, company, item_code=None, ignore_empty_stock=False):
ignore_empty_stock = cint(ignore_empty_stock)
items = [frappe._dict({"item_code": item_code, "warehouse": warehouse})]
@@ -1175,15 +1176,13 @@
warehouse: str,
posting_date,
posting_time,
- batch_no: Optional[str] = None,
+ batch_no: str | None = None,
with_valuation_rate: bool = True,
inventory_dimensions_dict=None,
):
frappe.has_permission("Stock Reconciliation", "write", throw=True)
- item_dict = frappe.get_cached_value(
- "Item", item_code, ["has_serial_no", "has_batch_no"], as_dict=1
- )
+ item_dict = frappe.get_cached_value("Item", item_code, ["has_serial_no", "has_batch_no"], as_dict=1)
if not item_dict:
# In cases of data upload to Items table
@@ -1222,9 +1221,7 @@
qty, rate = data
if item_dict.get("has_batch_no"):
- qty = (
- get_batch_qty(batch_no, warehouse, posting_date=posting_date, posting_time=posting_time) or 0
- )
+ qty = get_batch_qty(batch_no, warehouse, posting_date=posting_date, posting_time=posting_time) or 0
return {
"qty": qty,
diff --git a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
index 479a74a..0ffcdd5 100644
--- a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
@@ -7,7 +7,7 @@
import frappe
from frappe.tests.utils import FrappeTestCase, change_settings
-from frappe.utils import add_days, cstr, flt, nowdate, nowtime, random_string
+from frappe.utils import add_days, cstr, flt, nowdate, nowtime
from erpnext.accounts.utils import get_stock_and_account_balance
from erpnext.stock.doctype.item.test_item import create_item
@@ -17,7 +17,6 @@
get_serial_nos_from_bundle,
make_serial_batch_bundle,
)
-from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation import (
EmptyStockReconciliationItemsError,
get_items,
@@ -106,7 +105,8 @@
# no gl entries
self.assertTrue(
frappe.db.get_value(
- "Stock Ledger Entry", {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}
+ "Stock Ledger Entry",
+ {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name},
)
)
@@ -152,7 +152,6 @@
def test_stock_reco_for_serialized_item(self):
to_delete_records = []
- to_delete_serial_nos = []
# Add new serial nos
serial_item_code = "Stock-Reco-Serial-Item-1"
@@ -344,9 +343,7 @@
def test_customer_provided_items(self):
item_code = "Stock-Reco-customer-Item-100"
- create_item(
- item_code, is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0
- )
+ create_item(item_code, is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0)
sr = create_stock_reconciliation(item_code=item_code, qty=10, rate=420)
@@ -529,18 +526,18 @@
item_code = self.make_item().name
warehouse = "_Test Warehouse - _TC"
- sr = create_stock_reconciliation(
+ create_stock_reconciliation(
item_code=item_code, warehouse=warehouse, qty=10, rate=100, posting_date=add_days(nowdate(), 10)
)
- dn = create_delivery_note(
+ create_delivery_note(
item_code=item_code, warehouse=warehouse, qty=5, rate=120, posting_date=add_days(nowdate(), 12)
)
old_bin_qty = frappe.db.get_value(
"Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty"
)
- sr2 = create_stock_reconciliation(
+ create_stock_reconciliation(
item_code=item_code, warehouse=warehouse, qty=11, rate=100, posting_date=add_days(nowdate(), 11)
)
new_bin_qty = frappe.db.get_value(
@@ -760,8 +757,6 @@
self.assertEqual(flt(sle[0].actual_qty), flt(-100.0))
def test_backdated_stock_reco_entry_with_batch(self):
- from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
-
item_code = self.make_item(
"Test New Batch Item ABCVSD",
{
@@ -813,7 +808,7 @@
)
stock_reco1.reload()
- new_batch_no = get_batch_from_bundle(stock_reco1.items[0].serial_and_batch_bundle)
+ get_batch_from_bundle(stock_reco1.items[0].serial_and_batch_bundle)
self.assertEqual(len(sles), 2)
@@ -828,7 +823,7 @@
warehouse = "_Test Warehouse - _TC"
# Stock Value => 100 * 100 = 10000
- se = make_stock_entry(
+ make_stock_entry(
item_code=item_code,
target=warehouse,
qty=100,
@@ -988,9 +983,7 @@
self.assertEqual(d.actual_qty, 5.0)
self.assertAlmostEqual(d.stock_value_difference, 500.0)
- active_serial_no = frappe.get_all(
- "Serial No", filters={"status": "Active", "item_code": item_code}
- )
+ active_serial_no = frappe.get_all("Serial No", filters={"status": "Active", "item_code": item_code})
self.assertEqual(len(active_serial_no), 5)
@@ -1083,9 +1076,7 @@
)
)
if frappe.get_all("Stock Ledger Entry", {"company": sr.company})
- else frappe.get_cached_value(
- "Account", {"account_type": "Temporary", "company": sr.company}, "name"
- )
+ else frappe.get_cached_value("Account", {"account_type": "Temporary", "company": sr.company}, "name")
)
sr.cost_center = (
args.cost_center
diff --git a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
index 26fe8e1..91a7375 100644
--- a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
+++ b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
@@ -153,7 +153,7 @@
if self.reservation_based_on == "Qty":
self.validate_with_allowed_qty(self.reserved_qty)
- def auto_reserve_serial_and_batch(self, based_on: str = None) -> None:
+ def auto_reserve_serial_and_batch(self, based_on: str | None = None) -> None:
"""Auto pick Serial and Batch Nos to reserve when `Reservation Based On` is `Serial and Batch`."""
if (
@@ -272,9 +272,7 @@
if cint(frappe.db.get_value("Batch", entry.batch_no, "disabled")):
msg = _(
"Row #{0}: Stock cannot be reserved for Item {1} against a disabled Batch {2}."
- ).format(
- entry.idx, frappe.bold(self.item_code), frappe.bold(entry.batch_no)
- )
+ ).format(entry.idx, frappe.bold(self.item_code), frappe.bold(entry.batch_no))
frappe.throw(msg)
available_qty_to_reserve = get_available_qty_to_reserve(
@@ -360,9 +358,7 @@
) -> None:
"""Updates total reserved qty in the Pick List."""
- if (
- self.from_voucher_type == "Pick List" and self.from_voucher_no and self.from_voucher_detail_no
- ):
+ if self.from_voucher_type == "Pick List" and self.from_voucher_no and self.from_voucher_detail_no:
sre = frappe.qb.DocType("Stock Reservation Entry")
reserved_qty = (
frappe.qb.from_(sre)
@@ -390,7 +386,7 @@
bin_doc = frappe.get_cached_doc("Bin", bin_name)
bin_doc.update_reserved_stock()
- def update_status(self, status: str = None, update_modified: bool = True) -> None:
+ def update_status(self, status: str | None = None, update_modified: bool = True) -> None:
"""Updates status based on Voucher Qty, Reserved Qty and Delivered Qty."""
if not status:
@@ -448,9 +444,7 @@
)
voucher_delivered_qty = flt(delivered_qty) * flt(conversion_factor)
- allowed_qty = min(
- self.available_qty, (self.voucher_qty - voucher_delivered_qty - total_reserved_qty)
- )
+ allowed_qty = min(self.available_qty, (self.voucher_qty - voucher_delivered_qty - total_reserved_qty))
if self.get("_action") != "submit" and self.voucher_type == "Sales Order" and allowed_qty <= 0:
msg = _("Item {0} is already reserved/delivered against Sales Order {1}.").format(
@@ -466,16 +460,16 @@
if qty_to_be_reserved > allowed_qty:
actual_qty = get_stock_balance(self.item_code, self.warehouse)
msg = """
- Cannot reserve more than Allowed Qty {0} {1} for Item {2} against {3} {4}.<br /><br />
+ Cannot reserve more than Allowed Qty {} {} for Item {} against {} {}.<br /><br />
The <b>Allowed Qty</b> is calculated as follows:<br />
<ul>
- <li>Actual Qty [Available Qty at Warehouse] = {5}</li>
- <li>Reserved Stock [Ignore current SRE] = {6}</li>
- <li>Available Qty To Reserve [Actual Qty - Reserved Stock] = {7}</li>
- <li>Voucher Qty [Voucher Item Qty] = {8}</li>
- <li>Delivered Qty [Qty delivered against the Voucher Item] = {9}</li>
- <li>Total Reserved Qty [Qty reserved against the Voucher Item] = {10}</li>
- <li>Allowed Qty [Minimum of (Available Qty To Reserve, (Voucher Qty - Delivered Qty - Total Reserved Qty))] = {11}</li>
+ <li>Actual Qty [Available Qty at Warehouse] = {}</li>
+ <li>Reserved Stock [Ignore current SRE] = {}</li>
+ <li>Available Qty To Reserve [Actual Qty - Reserved Stock] = {}</li>
+ <li>Voucher Qty [Voucher Item Qty] = {}</li>
+ <li>Delivered Qty [Qty delivered against the Voucher Item] = {}</li>
+ <li>Total Reserved Qty [Qty reserved against the Voucher Item] = {}</li>
+ <li>Allowed Qty [Minimum of (Available Qty To Reserve, (Voucher Qty - Delivered Qty - Total Reserved Qty))] = {}</li>
</ul>
""".format(
frappe.bold(allowed_qty),
@@ -511,14 +505,12 @@
allowed_voucher_types = ["Sales Order"]
if voucher.doctype not in allowed_voucher_types:
- msg = _("Stock Reservation can only be created against {0}.").format(
- ", ".join(allowed_voucher_types)
- )
+ msg = _("Stock Reservation can only be created against {0}.").format(", ".join(allowed_voucher_types))
frappe.throw(msg)
def get_available_qty_to_reserve(
- item_code: str, warehouse: str, batch_no: str = None, ignore_sre=None
+ item_code: str, warehouse: str, batch_no: str | None = None, ignore_sre=None
) -> float:
"""Returns `Available Qty to Reserve (Actual Qty - Reserved Qty)` for Item, Warehouse and Batch combination."""
@@ -611,7 +603,7 @@
return available_serial_nos_list
-def get_sre_reserved_qty_for_item_and_warehouse(item_code: str, warehouse: str = None) -> float:
+def get_sre_reserved_qty_for_item_and_warehouse(item_code: str, warehouse: str | None = None) -> float:
"""Returns current `Reserved Qty` for Item and Warehouse combination."""
sre = frappe.qb.DocType("Stock Reservation Entry")
@@ -635,7 +627,7 @@
def get_sre_reserved_qty_for_items_and_warehouses(
- item_code_list: list, warehouse_list: list = None
+ item_code_list: list, warehouse_list: list | None = None
) -> dict:
"""Returns a dict like {("item_code", "warehouse"): "reserved_qty", ... }."""
@@ -689,7 +681,7 @@
def get_sre_reserved_warehouses_for_voucher(
- voucher_type: str, voucher_no: str, voucher_detail_no: str = None
+ voucher_type: str, voucher_no: str, voucher_detail_no: str | None = None
) -> list:
"""Returns a list of warehouses where the stock is reserved for the provided voucher."""
@@ -744,7 +736,7 @@
def get_sre_reserved_serial_nos_details(
- item_code: str, warehouse: str, serial_nos: list = None
+ item_code: str, warehouse: str, serial_nos: list | None = None
) -> dict:
"""Returns a dict of `Serial No` reserved in Stock Reservation Entry. The dict is like {serial_no: sre_name, ...}"""
@@ -772,9 +764,7 @@
return frappe._dict(query.run())
-def get_sre_reserved_batch_nos_details(
- item_code: str, warehouse: str, batch_nos: list = None
-) -> dict:
+def get_sre_reserved_batch_nos_details(item_code: str, warehouse: str, batch_nos: list | None = None) -> dict:
"""Returns a dict of `Batch Qty` reserved in Stock Reservation Entry. The dict is like {batch_no: qty, ...}"""
sre = frappe.qb.DocType("Stock Reservation Entry")
@@ -849,9 +839,7 @@
sb_entry.batch_no,
(sb_entry.qty - sb_entry.delivered_qty).as_("qty"),
)
- .where(
- (sre.docstatus == 1) & (sre.name == sre_name) & (sre.status.notin(["Delivered", "Cancelled"]))
- )
+ .where((sre.docstatus == 1) & (sre.name == sre_name) & (sre.status.notin(["Delivered", "Cancelled"])))
.where(sb_entry.qty > sb_entry.delivered_qty)
.orderby(sb_entry.creation)
).run(as_dict=True)
@@ -880,7 +868,7 @@
return bundle.name
-def has_reserved_stock(voucher_type: str, voucher_no: str, voucher_detail_no: str = None) -> bool:
+def has_reserved_stock(voucher_type: str, voucher_no: str, voucher_detail_no: str | None = None) -> bool:
"""Returns True if there is any Stock Reservation Entry for the given voucher."""
if get_stock_reservation_entries_for_voucher(
@@ -893,7 +881,7 @@
def create_stock_reservation_entries_for_so_items(
sales_order: object,
- items_details: list[dict] = None,
+ items_details: list[dict] | None = None,
from_voucher_type: Literal["Pick List", "Purchase Receipt"] = None,
notify=True,
) -> None:
@@ -914,9 +902,7 @@
validate_stock_reservation_settings(sales_order)
- allow_partial_reservation = frappe.db.get_single_value(
- "Stock Settings", "allow_partial_reservation"
- )
+ allow_partial_reservation = frappe.db.get_single_value("Stock Settings", "allow_partial_reservation")
items = []
if items_details:
@@ -1041,7 +1027,9 @@
# Skip the item if `Partial Reservation` is disabled in the Stock Settings.
if not allow_partial_reservation:
if qty_to_be_reserved == flt(item.get("qty_to_reserve")):
- msg = _("Enable Allow Partial Reservation in the Stock Settings to reserve partial stock.")
+ msg = _(
+ "Enable Allow Partial Reservation in the Stock Settings to reserve partial stock."
+ )
frappe.msgprint(msg, title=_("Partial Stock Reservation"), indicator="yellow")
continue
@@ -1099,13 +1087,13 @@
def cancel_stock_reservation_entries(
- voucher_type: str = None,
- voucher_no: str = None,
- voucher_detail_no: str = None,
+ voucher_type: str | None = None,
+ voucher_no: str | None = None,
+ voucher_detail_no: str | None = None,
from_voucher_type: Literal["Pick List", "Purchase Receipt"] = None,
- from_voucher_no: str = None,
- from_voucher_detail_no: str = None,
- sre_list: list = None,
+ from_voucher_no: str | None = None,
+ from_voucher_detail_no: str | None = None,
+ sre_list: list | None = None,
notify: bool = True,
) -> None:
"""Cancel Stock Reservation Entries."""
@@ -1151,8 +1139,8 @@
def get_stock_reservation_entries_for_voucher(
voucher_type: str,
voucher_no: str,
- voucher_detail_no: str = None,
- fields: list[str] = None,
+ voucher_detail_no: str | None = None,
+ fields: list[str] | None = None,
ignore_status: bool = False,
) -> list[dict]:
"""Returns list of Stock Reservation Entries against a Voucher."""
@@ -1171,9 +1159,7 @@
sre = frappe.qb.DocType("Stock Reservation Entry")
query = (
frappe.qb.from_(sre)
- .where(
- (sre.docstatus == 1) & (sre.voucher_type == voucher_type) & (sre.voucher_no == voucher_no)
- )
+ .where((sre.docstatus == 1) & (sre.voucher_type == voucher_type) & (sre.voucher_no == voucher_no))
.orderby(sre.creation)
)
diff --git a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py
index dd023e2..ddbf0b2 100644
--- a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py
+++ b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py
@@ -25,9 +25,7 @@
def setUp(self) -> None:
self.warehouse = "_Test Warehouse - _TC"
self.sr_item = make_item(properties={"is_stock_item": 1, "valuation_rate": 100})
- create_material_receipt(
- items={self.sr_item.name: self.sr_item}, warehouse=self.warehouse, qty=100
- )
+ create_material_receipt(items={self.sr_item.name: self.sr_item}, warehouse=self.warehouse, qty=100)
@change_settings("Stock Settings", {"allow_negative_stock": 0})
def test_validate_stock_reservation_settings(self) -> None:
diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py
index d975c29..7fcda1d 100644
--- a/erpnext/stock/doctype/stock_settings/stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/stock_settings.py
@@ -112,9 +112,9 @@
for field in warehouse_fields:
if frappe.db.get_value("Warehouse", self.get(field), "is_group"):
frappe.throw(
- _("Group Warehouses cannot be used in transactions. Please change the value of {0}").format(
- frappe.bold(self.meta.get_field(field).label)
- ),
+ _(
+ "Group Warehouses cannot be used in transactions. Please change the value of {0}"
+ ).format(frappe.bold(self.meta.get_field(field).label)),
title=_("Incorrect Warehouse"),
)
@@ -160,7 +160,6 @@
# Change in value of `Allow Negative Stock`
if self.has_value_changed("allow_negative_stock"):
-
# Disable -> Enable: Don't allow if `Stock Reservation` is enabled
if self.allow_negative_stock and self.enable_stock_reservation:
frappe.throw(
@@ -171,10 +170,8 @@
# Change in value of `Enable Stock Reservation`
if self.has_value_changed("enable_stock_reservation"):
-
# Disable -> Enable
if self.enable_stock_reservation:
-
# Don't allow if `Allow Negative Stock` is enabled
if self.allow_negative_stock:
frappe.throw(
@@ -190,7 +187,10 @@
precision = frappe.db.get_single_value("System Settings", "float_precision") or 3
bin = frappe.qb.DocType("Bin")
bin_with_negative_stock = (
- frappe.qb.from_(bin).select(bin.name).where(Round(bin.actual_qty, precision) < 0).limit(1)
+ frappe.qb.from_(bin)
+ .select(bin.name)
+ .where(Round(bin.actual_qty, precision) < 0)
+ .limit(1)
).run()
if bin_with_negative_stock:
diff --git a/erpnext/stock/doctype/stock_settings/test_stock_settings.py b/erpnext/stock/doctype/stock_settings/test_stock_settings.py
index cda739e..4b5ae43 100644
--- a/erpnext/stock/doctype/stock_settings/test_stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/test_stock_settings.py
@@ -1,7 +1,6 @@
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
-import unittest
import frappe
from frappe.tests.utils import FrappeTestCase
diff --git a/erpnext/stock/doctype/warehouse/test_warehouse.py b/erpnext/stock/doctype/warehouse/test_warehouse.py
index 5a7228a..02d64ca 100644
--- a/erpnext/stock/doctype/warehouse/test_warehouse.py
+++ b/erpnext/stock/doctype/warehouse/test_warehouse.py
@@ -58,7 +58,7 @@
warehouse_ids.append(warehouse_id)
item_names = [f"_Test Item {i} for Unlinking" for i in range(2)]
- for item, warehouse in zip(item_names, warehouse_ids):
+ for item, warehouse in zip(item_names, warehouse_ids, strict=False):
create_item(item, warehouse=warehouse, company=company)
# Delete warehouses
@@ -78,7 +78,6 @@
)
def test_group_non_group_conversion(self):
-
warehouse = frappe.get_doc("Warehouse", create_warehouse("TestGroupConversion"))
convert_to_group_or_ledger(warehouse.name)
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 07b354a..00ed00b 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -55,9 +55,7 @@
def onload(self):
"""load account name for General Ledger Report"""
- if self.company and cint(
- frappe.db.get_value("Company", self.company, "enable_perpetual_inventory")
- ):
+ if self.company and cint(frappe.db.get_value("Company", self.company, "enable_perpetual_inventory")):
account = self.account or get_warehouse_account(self)
if account:
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index d09282d..ee2f9cb 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -156,19 +156,14 @@
def update_bin_details(args, out, doc):
- if (
- args.get("doctype") == "Material Request"
- and args.get("material_request_type") == "Material Transfer"
- ):
+ if args.get("doctype") == "Material Request" and args.get("material_request_type") == "Material Transfer":
out.update(get_bin_details(args.item_code, args.get("from_warehouse")))
elif out.get("warehouse"):
company = args.company if (doc and doc.get("doctype") == "Purchase Order") else None
# calculate company_total_stock only for po
- bin_details = get_bin_details(
- args.item_code, out.warehouse, company, include_child_warehouses=True
- )
+ bin_details = get_bin_details(args.item_code, out.warehouse, company, include_child_warehouses=True)
out.update(bin_details)
@@ -274,9 +269,7 @@
if not item:
item = frappe.get_doc("Item", args.get("item_code"))
- if (
- item.variant_of and not item.taxes and frappe.db.exists("Item Tax", {"parent": item.variant_of})
- ):
+ if item.variant_of and not item.taxes and frappe.db.exists("Item Tax", {"parent": item.variant_of}):
item.update_template_tables()
item_defaults = get_item_defaults(item.name, args.company)
@@ -321,9 +314,7 @@
# Set stock UOM in args, so that it can be used while fetching item price
args.stock_uom = item.stock_uom
- if args.get("batch_no") and item.name != frappe.get_cached_value(
- "Batch", args.get("batch_no"), "item"
- ):
+ if args.get("batch_no") and item.name != frappe.get_cached_value("Batch", args.get("batch_no"), "item"):
args["batch_no"] = ""
out = frappe._dict(
@@ -344,9 +335,7 @@
"provisional_expense_account": get_provisional_account(
args, item_defaults, item_group_defaults, brand_defaults
),
- "cost_center": get_default_cost_center(
- args, item_defaults, item_group_defaults, brand_defaults
- ),
+ "cost_center": get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults),
"has_serial_no": item.has_serial_no,
"has_batch_no": item.has_batch_no,
"batch_no": args.get("batch_no"),
@@ -372,9 +361,7 @@
if args.get("doctype") in ["Sales Order", "Sales Invoice"]
else 0,
"is_fixed_asset": item.is_fixed_asset,
- "last_purchase_rate": item.last_purchase_rate
- if args.get("doctype") in ["Purchase Order"]
- else 0,
+ "last_purchase_rate": item.last_purchase_rate if args.get("doctype") in ["Purchase Order"] else 0,
"transaction_date": args.get("transaction_date"),
"against_blanket_order": args.get("against_blanket_order"),
"bom_no": item.get("default_bom"),
@@ -510,9 +497,7 @@
itemwise_barcode = {}
for item in items_list:
- barcodes = frappe.db.get_all(
- "Item Barcode", filters={"parent": item.item_code}, fields="barcode"
- )
+ barcodes = frappe.db.get_all("Item Barcode", filters={"parent": item.item_code}, fields="barcode")
for barcode in barcodes:
if item.item_code not in itemwise_barcode:
@@ -532,13 +517,13 @@
if item_rates is None:
item_rates = {}
- if isinstance(item_codes, (str,)):
+ if isinstance(item_codes, str):
item_codes = json.loads(item_codes)
- if isinstance(item_rates, (str,)):
+ if isinstance(item_rates, str):
item_rates = json.loads(item_rates)
- if isinstance(item_tax_templates, (str,)):
+ if isinstance(item_tax_templates, str):
item_tax_templates = json.loads(item_tax_templates)
for item_code in item_codes:
@@ -606,9 +591,7 @@
taxes_with_no_validity.append(tax)
if taxes_with_validity:
- taxes = sorted(
- taxes_with_validity, key=lambda i: i.valid_from or tax.maximum_net_rate, reverse=True
- )
+ taxes = sorted(taxes_with_validity, key=lambda i: i.valid_from or tax.maximum_net_rate, reverse=True)
else:
taxes = taxes_with_no_validity
@@ -761,7 +744,7 @@
elif not cost_center and args.get("item_code") and company:
for method in ["get_item_defaults", "get_item_group_defaults", "get_brand_defaults"]:
- path = "erpnext.stock.get_item_details.{0}".format(method)
+ path = f"erpnext.stock.get_item_details.{method}"
data = frappe.get_attr(path)(args.get("item_code"), company)
if data and (data.selling_cost_center or data.buying_cost_center):
@@ -776,11 +759,7 @@
if not cost_center and args.get("cost_center"):
cost_center = args.get("cost_center")
- if (
- company
- and cost_center
- and frappe.get_cached_value("Cost Center", cost_center, "company") != company
- ):
+ if company and cost_center and frappe.get_cached_value("Cost Center", cost_center, "company") != company:
return None
if not cost_center and company:
@@ -790,11 +769,7 @@
def get_default_supplier(args, item, item_group, brand):
- return (
- item.get("default_supplier")
- or item_group.get("default_supplier")
- or brand.get("default_supplier")
- )
+ return item.get("default_supplier") or item_group.get("default_supplier") or brand.get("default_supplier")
def get_price_list_rate(args, item_doc, out=None):
@@ -829,9 +804,7 @@
if not price_list_rate:
return out
- out.price_list_rate = (
- flt(price_list_rate) * flt(args.plc_conversion_rate) / flt(args.conversion_rate)
- )
+ out.price_list_rate = flt(price_list_rate) * flt(args.plc_conversion_rate) / flt(args.conversion_rate)
if frappe.db.get_single_value("Buying Settings", "disable_last_purchase_rate"):
return out
@@ -846,9 +819,7 @@
def insert_item_price(args):
"""Insert Item Price if Price List and Price List Rate are specified and currency is the same"""
- if frappe.db.get_value(
- "Price List", args.price_list, "currency", cache=True
- ) == args.currency and cint(
+ if frappe.db.get_value("Price List", args.price_list, "currency", cache=True) == args.currency and cint(
frappe.db.get_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing")
):
if frappe.has_permission("Item Price", "write"):
@@ -870,7 +841,9 @@
):
frappe.db.set_value("Item Price", item_price.name, "price_list_rate", price_list_rate)
frappe.msgprint(
- _("Item Price updated for {0} in Price List {1}").format(args.item_code, args.price_list),
+ _("Item Price updated for {0} in Price List {1}").format(
+ args.item_code, args.price_list
+ ),
alert=True,
)
else:
@@ -1011,11 +984,7 @@
if not args.conversion_rate and args.currency == company_currency:
args.conversion_rate = 1.0
- if (
- not args.ignore_conversion_rate
- and args.conversion_rate == 1
- and args.currency != company_currency
- ):
+ if not args.ignore_conversion_rate and args.conversion_rate == 1 and args.currency != company_currency:
args.conversion_rate = (
get_exchange_rate(args.currency, company_currency, args.transaction_date, "for_buying") or 1.0
)
@@ -1050,7 +1019,9 @@
if meta.get_field("plc_conversion_rate"):
args.plc_conversion_rate = flt(
args.plc_conversion_rate,
- get_field_precision(meta.get_field("plc_conversion_rate"), frappe._dict({"fields": args})),
+ get_field_precision(
+ meta.get_field("plc_conversion_rate"), frappe._dict({"fields": args})
+ ),
)
@@ -1288,9 +1259,7 @@
company_currency = get_company_currency(args.company)
if (not plc_conversion_rate) or (
- price_list_currency
- and args.price_list_currency
- and price_list_currency != args.price_list_currency
+ price_list_currency and args.price_list_currency and price_list_currency != args.price_list_currency
):
# cksgb 19/09/2016: added args.transaction_date as posting_date argument for get_exchange_rate
plc_conversion_rate = (
@@ -1312,9 +1281,7 @@
@frappe.whitelist()
def get_default_bom(item_code=None):
def _get_bom(item):
- bom = frappe.get_all(
- "BOM", dict(item=item, is_active=True, is_default=True, docstatus=1), limit=1
- )
+ 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
if not item_code:
@@ -1354,7 +1321,7 @@
pi_item = frappe.qb.DocType("Purchase Invoice Item")
valuation_rate = (
frappe.qb.from_(pi_item)
- .select((Sum(pi_item.base_net_amount) / Sum(pi_item.qty * pi_item.conversion_factor)))
+ .select(Sum(pi_item.base_net_amount) / Sum(pi_item.qty * pi_item.conversion_factor))
.where((pi_item.docstatus == 1) & (pi_item.item_code == item_code))
).run()
diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py
index 59f8b20..a24e852 100644
--- a/erpnext/stock/reorder_item.py
+++ b/erpnext/stock/reorder_item.py
@@ -58,9 +58,7 @@
item_warehouse_projected_qty.get(kwargs.item_code, {}).get(kwargs.warehouse_group)
)
else:
- projected_qty = flt(
- item_warehouse_projected_qty.get(kwargs.item_code, {}).get(kwargs.warehouse)
- )
+ projected_qty = flt(item_warehouse_projected_qty.get(kwargs.item_code, {}).get(kwargs.warehouse))
if (reorder_level or reorder_qty) and projected_qty <= reorder_level:
deficiency = reorder_level - projected_qty
@@ -188,13 +186,12 @@
for item_code, warehouse, projected_qty in frappe.db.sql(
"""select item_code, warehouse, projected_qty
- from tabBin where item_code in ({0})
+ from tabBin where item_code in ({})
and (warehouse != '' and warehouse is not null)""".format(
", ".join(["%s"] * len(items_to_consider))
),
items_to_consider,
):
-
if item_code not in item_warehouse_projected_qty:
item_warehouse_projected_qty.setdefault(item_code, {})
@@ -242,7 +239,9 @@
{
"company": company,
"transaction_date": nowdate(),
- "material_request_type": "Material Transfer" if request_type == "Transfer" else request_type,
+ "material_request_type": "Material Transfer"
+ if request_type == "Transfer"
+ else request_type,
}
)
@@ -257,7 +256,9 @@
if uom != item.stock_uom:
conversion_factor = (
frappe.db.get_value(
- "UOM Conversion Detail", {"parent": item.name, "uom": uom}, "conversion_factor"
+ "UOM Conversion Detail",
+ {"parent": item.name, "uom": uom},
+ "conversion_factor",
)
or 1.0
)
@@ -323,9 +324,7 @@
msg = frappe.render_template("templates/emails/reorder_item.html", {"mr_list": mr_list})
- frappe.sendmail(
- recipients=email_list, subject=_("Auto Material Requests Generated"), message=msg
- )
+ frappe.sendmail(recipients=email_list, subject=_("Auto Material Requests Generated"), message=msg)
def get_email_list(company):
@@ -378,7 +377,7 @@
for exception in exceptions_list:
try:
exception = json.loads(exception)
- error_message = """<div class='small text-muted'>{0}</div><br>""".format(
+ error_message = """<div class='small text-muted'>{}</div><br>""".format(
_(exception.get("message"))
)
content += error_message
diff --git a/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py b/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py
index 5661e8b..3820b3e 100644
--- a/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py
+++ b/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py
@@ -28,15 +28,15 @@
def get_columns():
- return (
- [_("Item") + ":Link/Item:150"]
- + [_("Item Name") + "::150"]
- + [_("Batch") + ":Link/Batch:150"]
- + [_("Stock UOM") + ":Link/UOM:100"]
- + [_("Quantity") + ":Float:100"]
- + [_("Expires On") + ":Date:100"]
- + [_("Expiry (In Days)") + ":Int:130"]
- )
+ return [
+ _("Item") + ":Link/Item:150",
+ _("Item Name") + "::150",
+ _("Batch") + ":Link/Batch:150",
+ _("Stock UOM") + ":Link/UOM:100",
+ _("Quantity") + ":Float:100",
+ _("Expires On") + ":Date:100",
+ _("Expiry (In Days)") + ":Int:130",
+ ]
def get_data(filters):
@@ -76,9 +76,7 @@
.where(
(batch.disabled == 0)
& (batch.batch_qty > 0)
- & (
- (Date(batch.creation) >= filters["from_date"]) & (Date(batch.creation) <= filters["to_date"])
- )
+ & ((Date(batch.creation) >= filters["from_date"]) & (Date(batch.creation) <= filters["to_date"]))
)
.orderby(batch.creation)
)
diff --git a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
index 7f2608e..fe0cefd 100644
--- a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
+++ b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
@@ -70,18 +70,18 @@
def get_columns(filters):
"""return columns based on filters"""
- columns = (
- [_("Item") + ":Link/Item:100"]
- + [_("Item Name") + "::150"]
- + [_("Description") + "::150"]
- + [_("Warehouse") + ":Link/Warehouse:100"]
- + [_("Batch") + ":Link/Batch:100"]
- + [_("Opening Qty") + ":Float:90"]
- + [_("In Qty") + ":Float:80"]
- + [_("Out Qty") + ":Float:80"]
- + [_("Balance Qty") + ":Float:90"]
- + [_("UOM") + "::90"]
- )
+ columns = [
+ _("Item") + ":Link/Item:100",
+ _("Item Name") + "::150",
+ _("Description") + "::150",
+ _("Warehouse") + ":Link/Warehouse:100",
+ _("Batch") + ":Link/Batch:100",
+ _("Opening Qty") + ":Float:90",
+ _("In Qty") + ":Float:80",
+ _("Out Qty") + ":Float:80",
+ _("Balance Qty") + ":Float:90",
+ _("UOM") + "::90",
+ ]
return columns
@@ -195,9 +195,7 @@
def get_item_details(filters):
item_map = {}
- for d in (frappe.qb.from_("Item").select("name", "item_name", "description", "stock_uom")).run(
- as_dict=1
- ):
+ for d in (frappe.qb.from_("Item").select("name", "item_name", "description", "stock_uom")).run(as_dict=1):
item_map.setdefault(d.name, d)
return item_map
diff --git a/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py b/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py
index 4642a53..b3c8e93 100644
--- a/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py
+++ b/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py
@@ -3,7 +3,7 @@
import datetime
from collections import OrderedDict
-from typing import Dict, List, Tuple, Union
+from typing import Union
import frappe
from frappe import _
@@ -13,15 +13,15 @@
Filters = frappe._dict
Row = frappe._dict
-Data = List[Row]
-Columns = List[Dict[str, str]]
+Data = list[Row]
+Columns = list[dict[str, str]]
DateTime = Union[datetime.date, datetime.datetime]
-FilteredEntries = List[Dict[str, Union[str, float, DateTime, None]]]
-ItemGroupsDict = Dict[Tuple[int, int], Dict[str, Union[str, int]]]
-SVDList = List[frappe._dict]
+FilteredEntries = list[dict[str, str | float | DateTime | None]]
+ItemGroupsDict = dict[tuple[int, int], dict[str, str | int]]
+SVDList = list[frappe._dict]
-def execute(filters: Filters) -> Tuple[Columns, Data]:
+def execute(filters: Filters) -> tuple[Columns, Data]:
update_filters_with_account(filters)
validate_filters(filters)
columns = get_columns()
@@ -158,7 +158,7 @@
item.item_group = ig_map[item.get("item_code")]
-def get_item_groups_map(svd_list: SVDList) -> Dict[str, str]:
+def get_item_groups_map(svd_list: SVDList) -> dict[str, str]:
item_codes = set(i["item_code"] for i in svd_list)
ig_list = frappe.get_list(
"Item", fields=["item_code", "item_group"], filters=[("item_code", "in", item_codes)]
@@ -168,9 +168,7 @@
def get_item_groups_dict() -> ItemGroupsDict:
item_groups_list = frappe.get_all("Item Group", fields=("name", "is_group", "lft", "rgt"))
- return {
- (i["lft"], i["rgt"]): {"name": i["name"], "is_group": i["is_group"]} for i in item_groups_list
- }
+ return {(i["lft"], i["rgt"]): {"name": i["name"], "is_group": i["is_group"]} for i in item_groups_list}
def update_leveled_dict(leveled_dict: OrderedDict) -> None:
diff --git a/erpnext/stock/report/delayed_item_report/delayed_item_report.py b/erpnext/stock/report/delayed_item_report/delayed_item_report.py
index 546a834..0bfb4da 100644
--- a/erpnext/stock/report/delayed_item_report/delayed_item_report.py
+++ b/erpnext/stock/report/delayed_item_report/delayed_item_report.py
@@ -13,7 +13,7 @@
return data, columns
-class DelayedItemReport(object):
+class DelayedItemReport:
def __init__(self, filters=None):
self.filters = frappe._dict(filters or {})
diff --git a/erpnext/stock/report/delayed_order_report/delayed_order_report.py b/erpnext/stock/report/delayed_order_report/delayed_order_report.py
index 197218d..24be939 100644
--- a/erpnext/stock/report/delayed_order_report/delayed_order_report.py
+++ b/erpnext/stock/report/delayed_order_report/delayed_order_report.py
@@ -20,7 +20,7 @@
return self.get_columns(), self.get_data(consolidated=True) or []
def get_data(self, consolidated=False):
- data = super(DelayedOrderReport, self).get_data(consolidated) or []
+ data = super().get_data(consolidated) or []
so_list = []
result = []
diff --git a/erpnext/stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py b/erpnext/stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py
index 9e14033..404a58b 100644
--- a/erpnext/stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py
+++ b/erpnext/stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py
@@ -40,19 +40,18 @@
def get_stock_ledger_entries(filters):
-
sle_filters = {"is_cancelled": 0}
if filters.warehouse:
children = get_descendants_of("Warehouse", filters.warehouse)
- sle_filters["warehouse"] = ("in", children + [filters.warehouse])
+ sle_filters["warehouse"] = ("in", [*children, filters.warehouse])
if filters.item_code:
sle_filters["item_code"] = filters.item_code
elif filters.get("item_group"):
item_group = filters.get("item_group")
children = get_descendants_of("Item Group", item_group)
- item_group_filter = {"item_group": ("in", children + [item_group])}
+ item_group_filter = {"item_group": ("in", [*children, item_group])}
sle_filters["item_code"] = (
"in",
frappe.get_all("Item", filters=item_group_filter, pluck="name", order_by=None),
diff --git a/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py b/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py
index b68db35..163e7ab 100644
--- a/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py
+++ b/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py
@@ -27,7 +27,7 @@
def validate_data(itewise_balance_qty):
res = []
- for key, data in itewise_balance_qty.items():
+ for _key, data in itewise_balance_qty.items():
row = get_incorrect_data(data)
if row:
res.append(row)
diff --git a/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py b/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py
index 39d84a7..4d740bd 100644
--- a/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py
+++ b/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py
@@ -43,11 +43,9 @@
def get_incorrect_serial_nos(serial_nos_data):
result = []
- total_value = frappe._dict(
- {"qty": 0, "valuation_rate": 0, "serial_no": frappe.bold(_("Balance"))}
- )
+ total_value = frappe._dict({"qty": 0, "valuation_rate": 0, "serial_no": frappe.bold(_("Balance"))})
- for serial_no, data in serial_nos_data.items():
+ for _serial_no, data in serial_nos_data.items():
total_dict = frappe._dict({"qty": 0, "valuation_rate": 0, "serial_no": frappe.bold(_("Total"))})
if check_incorrect_serial_data(data, total_dict):
diff --git a/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py b/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
index da958a8..7be8831 100644
--- a/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
+++ b/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
@@ -16,9 +16,7 @@
def execute(filters=None):
if not erpnext.is_perpetual_inventory_enabled(filters.company):
frappe.throw(
- _("Perpetual inventory required for the company {0} to view this report.").format(
- filters.company
- )
+ _("Perpetual inventory required for the company {0} to view this report.").format(filters.company)
)
data = get_data(filters)
@@ -83,9 +81,7 @@
closing_date = add_days(from_date, -1)
for key, stock_data in voucher_wise_dict.items():
- prev_stock_value = get_stock_value_on(
- posting_date=closing_date, item_code=key[0], warehouses=key[1]
- )
+ prev_stock_value = get_stock_value_on(posting_date=closing_date, item_code=key[0], warehouses=key[1])
for data in stock_data:
expected_stock_value = prev_stock_value + data.stock_value_difference
if abs(data.stock_value - expected_stock_value) > 0.1:
diff --git a/erpnext/stock/report/item_prices/item_prices.py b/erpnext/stock/report/item_prices/item_prices.py
index a53a9f2..5c5b84f 100644
--- a/erpnext/stock/report/item_prices/item_prices.py
+++ b/erpnext/stock/report/item_prices/item_prices.py
@@ -111,9 +111,7 @@
).run(as_dict=True)
for d in price_list:
- d.update(
- {"price": "{0} {1} - {2}".format(d.currency, round(d.price_list_rate, 2), d.price_list)}
- )
+ d.update({"price": f"{d.currency} {round(d.price_list_rate, 2)} - {d.price_list}"})
d.pop("currency")
d.pop("price_list_rate")
d.pop("price_list")
diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
index c4358b8..dffe948 100644
--- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
+++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
@@ -24,9 +24,7 @@
data = []
for item in items:
- total_outgoing = flt(consumed_item_map.get(item.name, 0)) + flt(
- delivered_item_map.get(item.name, 0)
- )
+ total_outgoing = flt(consumed_item_map.get(item.name, 0)) + flt(delivered_item_map.get(item.name, 0))
avg_daily_outgoing = flt(total_outgoing / diff, float_precision)
reorder_level = (avg_daily_outgoing * flt(item.lead_time_days)) + flt(item.safety_stock)
diff --git a/erpnext/stock/report/reserved_stock/reserved_stock.py b/erpnext/stock/report/reserved_stock/reserved_stock.py
index 21ce203..7963851 100644
--- a/erpnext/stock/report/reserved_stock/reserved_stock.py
+++ b/erpnext/stock/report/reserved_stock/reserved_stock.py
@@ -73,10 +73,10 @@
"project",
]:
if value := filters.get(field):
- query = query.where((sre[field] == value))
+ query = query.where(sre[field] == value)
if value := filters.get("stock_reservation_entry"):
- query = query.where((sre.name == value))
+ query = query.where(sre.name == value)
data = query.run(as_list=True)
diff --git a/erpnext/stock/report/reserved_stock/test_reserved_stock.py b/erpnext/stock/report/reserved_stock/test_reserved_stock.py
index 6ef89f9..16906fb 100644
--- a/erpnext/stock/report/reserved_stock/test_reserved_stock.py
+++ b/erpnext/stock/report/reserved_stock/test_reserved_stock.py
@@ -2,7 +2,6 @@
# See license.txt
from random import randint
-import frappe
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils.data import today
diff --git a/erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py b/erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py
index 3ea5e82..7bd8d70 100644
--- a/erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py
+++ b/erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py
@@ -146,9 +146,7 @@
)
if not item_details or item_details.get("has_serial_no"):
- columns.append(
- {"label": _("Serial No"), "fieldname": "serial_no", "fieldtype": "Data", "width": 120}
- )
+ columns.append({"label": _("Serial No"), "fieldname": "serial_no", "fieldtype": "Data", "width": 120})
if not item_details or item_details.get("has_batch_no"):
columns.extend(
@@ -184,7 +182,7 @@
query_filters = {"options": ["in", [d.parent for d in child_doctypes]]}
if txt:
- query_filters["parent"] = ["like", "%{}%".format(txt)]
+ query_filters["parent"] = ["like", f"%{txt}%"]
return frappe.get_all("DocField", filters=query_filters, fields=["distinct parent"], as_list=True)
diff --git a/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py b/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py
index 3f5216b..f229f73 100644
--- a/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py
+++ b/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py
@@ -84,9 +84,7 @@
return []
data = []
- serial_bundle_ids = [
- d.serial_and_batch_bundle for d in stock_ledgers if d.serial_and_batch_bundle
- ]
+ serial_bundle_ids = [d.serial_and_batch_bundle for d in stock_ledgers if d.serial_and_batch_bundle]
bundle_wise_serial_nos = get_serial_nos(filters, serial_bundle_ids)
diff --git a/erpnext/stock/report/stock_ageing/stock_ageing.py b/erpnext/stock/report/stock_ageing/stock_ageing.py
index 02ac8c6..efa736c 100644
--- a/erpnext/stock/report/stock_ageing/stock_ageing.py
+++ b/erpnext/stock/report/stock_ageing/stock_ageing.py
@@ -2,8 +2,8 @@
# License: GNU General Public License v3. See license.txt
+from collections.abc import Iterator
from operator import itemgetter
-from typing import Dict, Iterator, List, Tuple, Union
import frappe
from frappe import _
@@ -14,7 +14,7 @@
Filters = frappe._dict
-def execute(filters: Filters = None) -> Tuple:
+def execute(filters: Filters = None) -> tuple:
to_date = filters["to_date"]
columns = get_columns(filters)
@@ -26,14 +26,14 @@
return columns, data, None, chart_data
-def format_report_data(filters: Filters, item_details: Dict, to_date: str) -> List[Dict]:
+def format_report_data(filters: Filters, item_details: dict, to_date: str) -> list[dict]:
"Returns ordered, formatted data with ranges."
_func = itemgetter(1)
data = []
precision = cint(frappe.db.get_single_value("System Settings", "float_precision", cache=True))
- for item, item_dict in item_details.items():
+ for _item, item_dict in item_details.items():
if not flt(item_dict.get("total_qty"), precision):
continue
@@ -74,12 +74,12 @@
return data
-def get_average_age(fifo_queue: List, to_date: str) -> float:
+def get_average_age(fifo_queue: list, to_date: str) -> float:
batch_age = age_qty = total_qty = 0.0
for batch in fifo_queue:
batch_age = date_diff(to_date, batch[1])
- if isinstance(batch[0], (int, float)):
+ if isinstance(batch[0], int | float):
age_qty += batch_age * batch[0]
total_qty += batch[0]
else:
@@ -89,8 +89,7 @@
return flt(age_qty / total_qty, 2) if total_qty else 0.0
-def get_range_age(filters: Filters, fifo_queue: List, to_date: str, item_dict: Dict) -> Tuple:
-
+def get_range_age(filters: Filters, fifo_queue: list, to_date: str, item_dict: dict) -> tuple:
precision = cint(frappe.db.get_single_value("System Settings", "float_precision", cache=True))
range1 = range2 = range3 = above_range3 = 0.0
@@ -111,7 +110,7 @@
return range1, range2, range3, above_range3
-def get_columns(filters: Filters) -> List[Dict]:
+def get_columns(filters: Filters) -> list[dict]:
range_columns = []
setup_ageing_columns(filters, range_columns)
columns = [
@@ -169,7 +168,7 @@
return columns
-def get_chart_data(data: List, filters: Filters) -> Dict:
+def get_chart_data(data: list, filters: Filters) -> dict:
if not data:
return []
@@ -193,7 +192,7 @@
}
-def setup_ageing_columns(filters: Filters, range_columns: List):
+def setup_ageing_columns(filters: Filters, range_columns: list):
ranges = [
f"0 - {filters['range1']}",
f"{cint(filters['range1']) + 1} - {cint(filters['range2'])}",
@@ -205,23 +204,21 @@
add_column(range_columns, label=_("Age ({0})").format(label), fieldname=fieldname)
-def add_column(
- range_columns: List, label: str, fieldname: str, fieldtype: str = "Float", width: int = 140
-):
+def add_column(range_columns: list, label: str, fieldname: str, fieldtype: str = "Float", width: int = 140):
range_columns.append(dict(label=label, fieldname=fieldname, fieldtype=fieldtype, width=width))
class FIFOSlots:
"Returns FIFO computed slots of inwarded stock as per date."
- def __init__(self, filters: Dict = None, sle: List = None):
+ def __init__(self, filters: dict | None = None, sle: list | None = None):
self.item_details = {}
self.transferred_item_details = {}
self.serial_no_batch_purchase_details = {}
self.filters = filters
self.sle = sle
- def generate(self) -> Dict:
+ def generate(self) -> dict:
"""
Returns dict of the foll.g structure:
Key = Item A / (Item A, Warehouse A)
@@ -264,7 +261,7 @@
return self.item_details
- def __init_key_stores(self, row: Dict) -> Tuple:
+ def __init_key_stores(self, row: dict) -> tuple:
"Initialise keys and FIFO Queue."
key = (row.name, row.warehouse)
@@ -276,9 +273,7 @@
return key, fifo_queue, transferred_item_key
- def __compute_incoming_stock(
- self, row: Dict, fifo_queue: List, transfer_key: Tuple, serial_nos: List
- ):
+ def __compute_incoming_stock(self, row: dict, fifo_queue: list, transfer_key: tuple, serial_nos: list):
"Update FIFO Queue on inward stock."
transfer_data = self.transferred_item_details.get(transfer_key)
@@ -304,9 +299,7 @@
self.serial_no_batch_purchase_details.setdefault(serial_no, row.posting_date)
fifo_queue.append([serial_no, row.posting_date])
- def __compute_outgoing_stock(
- self, row: Dict, fifo_queue: List, transfer_key: Tuple, serial_nos: List
- ):
+ def __compute_outgoing_stock(self, row: dict, fifo_queue: list, transfer_key: tuple, serial_nos: list):
"Update FIFO Queue on outward stock."
if serial_nos:
fifo_queue[:] = [serial_no for serial_no in fifo_queue if serial_no[0] not in serial_nos]
@@ -332,7 +325,7 @@
self.transferred_item_details[transfer_key].append([qty_to_pop, slot[1]])
qty_to_pop = 0
- def __adjust_incoming_transfer_qty(self, transfer_data: Dict, fifo_queue: List, row: Dict):
+ def __adjust_incoming_transfer_qty(self, transfer_data: dict, fifo_queue: list, row: dict):
"Add previously removed stock back to FIFO Queue."
transfer_qty_to_pop = flt(row.actual_qty)
@@ -359,7 +352,7 @@
add_to_fifo_queue([transfer_qty_to_pop, transfer_data[0][1]])
transfer_qty_to_pop = 0
- def __update_balances(self, row: Dict, key: Union[Tuple, str]):
+ def __update_balances(self, row: dict, key: tuple | str):
self.item_details[key]["qty_after_transaction"] = row.qty_after_transaction
if "total_qty" not in self.item_details[key]:
@@ -369,7 +362,7 @@
self.item_details[key]["has_serial_no"] = row.has_serial_no
- def __aggregate_details_by_item(self, wh_wise_data: Dict) -> Dict:
+ def __aggregate_details_by_item(self, wh_wise_data: dict) -> dict:
"Aggregate Item-Wh wise data into single Item entry."
item_aggregated_data = {}
for key, row in wh_wise_data.items():
@@ -377,7 +370,12 @@
if not item_aggregated_data.get(item):
item_aggregated_data.setdefault(
item,
- {"details": frappe._dict(), "fifo_queue": [], "qty_after_transaction": 0.0, "total_qty": 0.0},
+ {
+ "details": frappe._dict(),
+ "fifo_queue": [],
+ "qty_after_transaction": 0.0,
+ "total_qty": 0.0,
+ },
)
item_row = item_aggregated_data.get(item)
item_row["details"].update(row["details"])
@@ -388,7 +386,7 @@
return item_aggregated_data
- def __get_stock_ledger_entries(self) -> Iterator[Dict]:
+ def __get_stock_ledger_entries(self) -> Iterator[dict]:
sle = frappe.qb.DocType("Stock Ledger Entry")
item = self.__get_item_query() # used as derived table in sle query
diff --git a/erpnext/stock/report/stock_analytics/stock_analytics.py b/erpnext/stock/report/stock_analytics/stock_analytics.py
index ab48181..920c315 100644
--- a/erpnext/stock/report/stock_analytics/stock_analytics.py
+++ b/erpnext/stock/report/stock_analytics/stock_analytics.py
@@ -1,7 +1,6 @@
# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import datetime
-from typing import List
import frappe
from frappe import _, scrub
@@ -48,12 +47,10 @@
ranges = get_period_date_ranges(filters)
- for dummy, end_date in ranges:
+ for _dummy, end_date in ranges:
period = get_period(end_date, filters)
- columns.append(
- {"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120}
- )
+ columns.append({"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120})
return columns
@@ -67,7 +64,7 @@
increment = {"Monthly": 1, "Quarterly": 3, "Half-Yearly": 6, "Yearly": 12}.get(filters.range, 1)
periodic_daterange = []
- for dummy in range(1, 53, increment):
+ for _dummy in range(1, 53, increment):
if filters.range == "Weekly":
period_end_date = from_date + relativedelta(days=6)
else:
@@ -116,9 +113,7 @@
elif filters.range == "Monthly":
period = _(str(months[posting_date.month - 1])) + " " + str(posting_date.year)
elif filters.range == "Quarterly":
- period = _("Quarter {0} {1}").format(
- str(((posting_date.month - 1) // 3) + 1), str(posting_date.year)
- )
+ period = _("Quarter {0} {1}").format(str(((posting_date.month - 1) // 3) + 1), str(posting_date.year))
else:
year = get_fiscal_year(posting_date, company=filters.company)
period = str(year[2])
@@ -188,15 +183,13 @@
periodic_data.setdefault(d.item_code, {}).setdefault(period, {}).setdefault(d.warehouse, 0.0)
periodic_data[d.item_code]["balance"][d.warehouse] += value
- periodic_data[d.item_code][period][d.warehouse] = periodic_data[d.item_code]["balance"][
- d.warehouse
- ]
+ periodic_data[d.item_code][period][d.warehouse] = periodic_data[d.item_code]["balance"][d.warehouse]
return periodic_data
def fill_intermediate_periods(
- periodic_data, item_code: str, current_period: str, all_periods: List[str]
+ periodic_data, item_code: str, current_period: str, all_periods: list[str]
) -> None:
"""There might be intermediate periods where no stock ledger entry exists, copy previous previous data.
@@ -235,7 +228,7 @@
today = getdate()
- for dummy, item_data in item_details.items():
+ for _dummy, item_data in item_details.items():
row = {
"name": item_data.name,
"item_name": item_data.item_name,
@@ -273,7 +266,7 @@
item_filters = {"is_stock_item": 1}
if item_group := filters.get("item_group"):
children = get_descendants_of("Item Group", item_group, ignore_permissions=True)
- item_filters["item_group"] = ("in", children + [item_group])
+ item_filters["item_group"] = ("in", [*children, item_group])
if brand := filters.get("brand"):
item_filters["brand"] = brand
diff --git a/erpnext/stock/report/stock_analytics/test_stock_analytics.py b/erpnext/stock/report/stock_analytics/test_stock_analytics.py
index dd8f8d8..b4f086c 100644
--- a/erpnext/stock/report/stock_analytics/test_stock_analytics.py
+++ b/erpnext/stock/report/stock_analytics/test_stock_analytics.py
@@ -3,7 +3,7 @@
import frappe
from frappe import _dict
from frappe.tests.utils import FrappeTestCase
-from frappe.utils.data import add_to_date, get_datetime, getdate, nowdate
+from frappe.utils.data import add_to_date, getdate
from erpnext.accounts.utils import get_fiscal_year
from erpnext.stock.doctype.item.test_item import make_item
@@ -55,7 +55,6 @@
self.assertEqual(actual_buckets, expected_buckets)
def test_get_period_date_ranges(self):
-
filters = _dict(range="Monthly", from_date="2020-12-28", to_date="2021-02-06")
ranges = get_period_date_ranges(filters)
@@ -69,7 +68,6 @@
self.assertEqual(ranges, expected_ranges)
def test_get_period_date_ranges_yearly(self):
-
filters = _dict(range="Yearly", from_date="2021-01-28", to_date="2021-02-06")
ranges = get_period_date_ranges(filters)
diff --git a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py
index 416cf48..67e340d 100644
--- a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py
+++ b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py
@@ -14,9 +14,7 @@
def execute(filters=None):
if not erpnext.is_perpetual_inventory_enabled(filters.company):
frappe.throw(
- _("Perpetual inventory required for the company {0} to view this report.").format(
- filters.company
- )
+ _("Perpetual inventory required for the company {0} to view this report.").format(filters.company)
)
data = get_data(filters)
@@ -34,7 +32,7 @@
"posting_date": ("<=", report_filters.as_on_date),
}
- currency_precision = get_currency_precision() or 2
+ get_currency_precision() or 2
stock_ledger_entries = get_stock_ledger_data(report_filters, filters)
voucher_wise_gl_data = get_gl_data(report_filters, filters)
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index 500affa..0d31398 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -3,7 +3,7 @@
from operator import itemgetter
-from typing import Any, Dict, List, Optional, TypedDict
+from typing import Any, TypedDict
import frappe
from frappe import _
@@ -20,27 +20,27 @@
class StockBalanceFilter(TypedDict):
- company: Optional[str]
+ company: str | None
from_date: str
to_date: str
- item_group: Optional[str]
- item: Optional[str]
- warehouse: Optional[str]
- warehouse_type: Optional[str]
- include_uom: Optional[str] # include extra info in converted UOM
+ item_group: str | None
+ item: str | None
+ warehouse: str | None
+ warehouse_type: str | None
+ include_uom: str | None # include extra info in converted UOM
show_stock_ageing_data: bool
show_variant_attributes: bool
-SLEntry = Dict[str, Any]
+SLEntry = dict[str, Any]
-def execute(filters: Optional[StockBalanceFilter] = None):
+def execute(filters: StockBalanceFilter | None = None):
return StockBalanceReport(filters).run()
-class StockBalanceReport(object):
- def __init__(self, filters: Optional[StockBalanceFilter]) -> None:
+class StockBalanceReport:
+ def __init__(self, filters: StockBalanceFilter | None) -> None:
self.filters = filters
self.from_date = getdate(filters.get("from_date"))
self.to_date = getdate(filters.get("to_date"))
@@ -48,7 +48,7 @@
self.start_from = None
self.data = []
self.columns = []
- self.sle_entries: List[SLEntry] = []
+ self.sle_entries: list[SLEntry] = []
self.set_company_currency()
def set_company_currency(self) -> None:
@@ -106,7 +106,7 @@
if self.filters.get("show_variant_attributes"):
variant_values = self.get_variant_values_for()
- for key, report_data in self.item_warehouse_map.items():
+ for _key, report_data in self.item_warehouse_map.items():
if variant_data := variant_values.get(report_data.item_code):
report_data.update(variant_data)
@@ -201,7 +201,6 @@
qty_dict.opening_val += value_diff
elif entry.posting_date >= self.from_date and entry.posting_date <= self.to_date:
-
if flt(qty_diff, self.float_precision) >= 0:
qty_dict.in_qty += qty_diff
qty_dict.in_val += value_diff
@@ -247,7 +246,7 @@
return tuple(group_by_key)
- def get_closing_balance(self) -> List[Dict[str, Any]]:
+ def get_closing_balance(self) -> list[dict[str, Any]]:
if self.filters.get("ignore_closing_balance"):
return []
@@ -342,7 +341,7 @@
def apply_items_filters(self, query, item_table) -> str:
if item_group := self.filters.get("item_group"):
children = get_descendants_of("Item Group", item_group, ignore_permissions=True)
- query = query.where(item_table.item_group.isin(children + [item_group]))
+ query = query.where(item_table.item_group.isin([*children, item_group]))
for field in ["item_code", "brand"]:
if not self.filters.get(field):
@@ -566,7 +565,9 @@
frappe.qb.from_(sr)
.select(sr.name, Coalesce("Stock Reconciliation").as_("voucher_type"))
.where(
- (sr.docstatus == 1) & (sr.posting_date <= self.to_date) & (sr.purpose == "Opening Stock")
+ (sr.docstatus == 1)
+ & (sr.posting_date <= self.to_date)
+ & (sr.purpose == "Opening Stock")
)
)
).select("voucher_type", "name")
@@ -592,7 +593,7 @@
def filter_items_with_no_transactions(
- iwb_map, float_precision: float, inventory_dimensions: list = None
+ iwb_map, float_precision: float, inventory_dimensions: list | None = None
):
pop_keys = []
for group_by_key in iwb_map:
@@ -629,6 +630,6 @@
return iwb_map
-def get_variants_attributes() -> List[str]:
+def get_variants_attributes() -> list[str]:
"""Return all item variant attributes."""
return frappe.get_all("Item Attribute", pluck="name")
diff --git a/erpnext/stock/report/stock_balance/test_stock_balance.py b/erpnext/stock/report/stock_balance/test_stock_balance.py
index e963de2..8b3dbee 100644
--- a/erpnext/stock/report/stock_balance/test_stock_balance.py
+++ b/erpnext/stock/report/stock_balance/test_stock_balance.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict
+from typing import Any
import frappe
from frappe import _dict
@@ -32,12 +32,11 @@
def tearDown(self):
frappe.db.rollback()
- def assertPartialDictEq(self, expected: Dict[str, Any], actual: Dict[str, Any]):
+ def assertPartialDictEq(self, expected: dict[str, Any], actual: dict[str, Any]):
for k, v in expected.items():
self.assertEqual(v, actual[k], msg=f"{expected=}\n{actual=}")
def generate_stock_ledger(self, item_code: str, movements):
-
for movement in map(_dict, movements):
if "to_warehouse" not in movement:
movement.to_warehouse = "_Test Warehouse - _TC"
@@ -128,7 +127,6 @@
self.assertPartialDictEq({"opening_qty": 6, "in_qty": 0}, rows[0])
def test_uom_converted_info(self):
-
self.item.append("uoms", {"conversion_factor": 5, "uom": "Box"})
self.item.save()
@@ -167,8 +165,6 @@
variant.save()
self.generate_stock_ledger(variant.name, [_dict(qty=5, rate=10)])
- rows = stock_balance(
- self.filters.update({"show_variant_attributes": 1, "item_code": variant.name})
- )
+ rows = stock_balance(self.filters.update({"show_variant_attributes": 1, "item_code": variant.name}))
self.assertPartialDictEq(attributes, rows[0])
self.assertInvariants(rows)
diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py
index e98351a..97e2f55 100644
--- a/erpnext/stock/report/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/report/stock_ledger/stock_ledger.py
@@ -547,11 +547,8 @@
def get_warehouse_condition(warehouse):
warehouse_details = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"], as_dict=1)
if warehouse_details:
- return (
- " exists (select name from `tabWarehouse` wh \
- where wh.lft >= %s and wh.rgt <= %s and warehouse = wh.name)"
- % (warehouse_details.lft, warehouse_details.rgt)
- )
+ return f" exists (select name from `tabWarehouse` wh \
+ where wh.lft >= {warehouse_details.lft} and wh.rgt <= {warehouse_details.rgt} and warehouse = wh.name)"
return ""
@@ -562,22 +559,17 @@
if item_table:
ig = frappe.qb.DocType("Item Group")
return item_table.item_group.isin(
- (
- frappe.qb.from_(ig)
- .select(ig.name)
- .where(
- (ig.lft >= item_group_details.lft)
- & (ig.rgt <= item_group_details.rgt)
- & (item_table.item_group == ig.name)
- )
+ frappe.qb.from_(ig)
+ .select(ig.name)
+ .where(
+ (ig.lft >= item_group_details.lft)
+ & (ig.rgt <= item_group_details.rgt)
+ & (item_table.item_group == ig.name)
)
)
else:
- return (
- "item.item_group in (select ig.name from `tabItem Group` ig \
- where ig.lft >= %s and ig.rgt <= %s and item.item_group = ig.name)"
- % (item_group_details.lft, item_group_details.rgt)
- )
+ return f"item.item_group in (select ig.name from `tabItem Group` ig \
+ where ig.lft >= {item_group_details.lft} and ig.rgt <= {item_group_details.rgt} and item.item_group = ig.name)"
def check_inventory_dimension_filters_applied(filters) -> bool:
diff --git a/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py b/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py
index c3c85aa..12800f2 100644
--- a/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py
+++ b/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py
@@ -8,9 +8,6 @@
from erpnext.maintenance.doctype.maintenance_schedule.test_maintenance_schedule import (
make_serial_item_with_serial,
)
-from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
-from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
-from erpnext.stock.report.stock_ledger.stock_ledger import execute
class TestStockLedgerReeport(FrappeTestCase):
diff --git a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py
index 189a90a..0b7e551 100644
--- a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py
+++ b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py
@@ -228,7 +228,7 @@
return data
-def get_item_warehouse_combinations(filters: dict = None) -> dict:
+def get_item_warehouse_combinations(filters: dict | None = None) -> dict:
filters = frappe._dict(filters or {})
bin = frappe.qb.DocType("Bin")
@@ -284,7 +284,5 @@
return True
elif difference_in == "Valuation" and valuation_diff:
return True
- elif difference_in not in ["Qty", "Value", "Valuation"] and (
- qty_diff or value_diff or valuation_diff
- ):
+ elif difference_in not in ["Qty", "Value", "Valuation"] and (qty_diff or value_diff or valuation_diff):
return True
diff --git a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
index 31c756d..743656c 100644
--- a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
+++ b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
@@ -250,9 +250,7 @@
query = query.where(bin.item_code == filters.item_code)
if filters.warehouse:
- warehouse_details = frappe.db.get_value(
- "Warehouse", filters.warehouse, ["lft", "rgt"], as_dict=1
- )
+ warehouse_details = frappe.db.get_value("Warehouse", filters.warehouse, ["lft", "rgt"], as_dict=1)
if warehouse_details:
wh = frappe.qb.DocType("Warehouse")
@@ -286,7 +284,9 @@
(item.is_stock_item == 1)
& (item.disabled == 0)
& (
- (item.end_of_life > today()) | (item.end_of_life.isnull()) | (item.end_of_life == "0000-00-00")
+ (item.end_of_life > today())
+ | (item.end_of_life.isnull())
+ | (item.end_of_life == "0000-00-00")
)
& (ExistsCriterion(frappe.qb.from_(bin).select(bin.name).where(bin.item_code == item.name)))
)
diff --git a/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py b/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
index 8c76908..e28b2d7 100644
--- a/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
+++ b/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
@@ -20,7 +20,6 @@
total_qty = total_amount = 0.0
if consumed_details.get(item_code):
for cd in consumed_details.get(item_code):
-
if cd.voucher_no not in material_transfer_vouchers:
if cd.voucher_type in ["Delivery Note", "Sales Invoice"]:
delivered_qty += abs(flt(cd.actual_qty))
@@ -54,19 +53,19 @@
def get_columns(filters):
"""return columns based on filters"""
- columns = (
- [_("Item") + ":Link/Item:100"]
- + [_("Item Name") + "::100"]
- + [_("Description") + "::150"]
- + [_("UOM") + ":Link/UOM:90"]
- + [_("Consumed Qty") + ":Float:110"]
- + [_("Consumed Amount") + ":Currency:130"]
- + [_("Delivered Qty") + ":Float:110"]
- + [_("Delivered Amount") + ":Currency:130"]
- + [_("Total Qty") + ":Float:110"]
- + [_("Total Amount") + ":Currency:130"]
- + [_("Supplier(s)") + "::250"]
- )
+ columns = [
+ _("Item") + ":Link/Item:100",
+ _("Item Name") + "::100",
+ _("Description") + "::150",
+ _("UOM") + ":Link/UOM:90",
+ _("Consumed Qty") + ":Float:110",
+ _("Consumed Amount") + ":Currency:130",
+ _("Delivered Qty") + ":Float:110",
+ _("Delivered Amount") + ":Currency:130",
+ _("Total Qty") + ":Float:110",
+ _("Total Amount") + ":Currency:130",
+ _("Supplier(s)") + "::250",
+ ]
return columns
@@ -173,9 +172,7 @@
def get_material_transfer_vouchers():
se = frappe.qb.DocType("Stock Entry")
query = (
- frappe.qb.from_(se)
- .select(se.name)
- .where((se.purpose == "Material Transfer") & (se.docstatus == 1))
+ frappe.qb.from_(se).select(se.name).where((se.purpose == "Material Transfer") & (se.docstatus == 1))
)
return [r[0] for r in query.run()]
diff --git a/erpnext/stock/report/test_reports.py b/erpnext/stock/report/test_reports.py
index d118d8e..74c6afa 100644
--- a/erpnext/stock/report/test_reports.py
+++ b/erpnext/stock/report/test_reports.py
@@ -1,5 +1,4 @@
import unittest
-from typing import List, Tuple
import frappe
@@ -14,7 +13,7 @@
batch = frappe.db.get_value("Batch", fieldname=["name"], as_dict=True, order_by="creation desc")
-REPORT_FILTER_TEST_CASES: List[Tuple[ReportName, ReportFilters]] = [
+REPORT_FILTER_TEST_CASES: list[tuple[ReportName, ReportFilters]] = [
("Stock Ledger", {"_optional": True}),
("Stock Ledger", {"batch_no": batch}),
("Stock Ledger", {"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}),
diff --git a/erpnext/stock/report/total_stock_summary/total_stock_summary.py b/erpnext/stock/report/total_stock_summary/total_stock_summary.py
index c3155bd..4848c21 100644
--- a/erpnext/stock/report/total_stock_summary/total_stock_summary.py
+++ b/erpnext/stock/report/total_stock_summary/total_stock_summary.py
@@ -8,7 +8,6 @@
def execute(filters=None):
-
if not filters:
filters = {}
columns = get_columns(filters)
@@ -54,8 +53,8 @@
else:
query = query.select(wh.company).groupby(wh.company)
- query = query.select(
- item.item_code, item.description, Sum(bin.actual_qty).as_("actual_qty")
- ).groupby(item.item_code)
+ query = query.select(item.item_code, item.description, Sum(bin.actual_qty).as_("actual_qty")).groupby(
+ item.item_code
+ )
return query.run()
diff --git a/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py b/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
index 5dbdcef..e1cce31 100644
--- a/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
+++ b/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
@@ -40,7 +40,7 @@
item_balance = {}
item_value = {}
- for (company, item, warehouse) in sorted(iwb_map):
+ for company, item, warehouse in sorted(iwb_map):
if not item_map.get(item):
continue
@@ -71,7 +71,7 @@
row += [average_age]
- bal_qty = [sum(bal_qty) for bal_qty in zip(*wh_balance)]
+ bal_qty = [sum(bal_qty) for bal_qty in zip(*wh_balance, strict=False)]
total_qty = sum(bal_qty)
if len(warehouse_list) > 1:
row += [total_qty]
diff --git a/erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py b/erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
index a0e9944..39baa54 100644
--- a/erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
+++ b/erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
@@ -1,7 +1,7 @@
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
-from typing import Any, Dict, List, Optional, TypedDict
+from typing import Any, TypedDict
import frappe
from frappe import _
@@ -9,12 +9,12 @@
class StockBalanceFilter(TypedDict):
- company: Optional[str]
- warehouse: Optional[str]
- show_disabled_warehouses: Optional[int]
+ company: str | None
+ warehouse: str | None
+ show_disabled_warehouses: int | None
-SLEntry = Dict[str, Any]
+SLEntry = dict[str, Any]
def execute(filters=None):
@@ -25,7 +25,7 @@
return columns, data
-def get_warehouse_wise_balance(filters: StockBalanceFilter) -> List[SLEntry]:
+def get_warehouse_wise_balance(filters: StockBalanceFilter) -> list[SLEntry]:
sle = frappe.qb.DocType("Stock Ledger Entry")
query = (
@@ -95,7 +95,7 @@
update_balance(warehouse, warehouse.stock_balance)
-def get_columns(filters: StockBalanceFilter) -> List[Dict]:
+def get_columns(filters: StockBalanceFilter) -> list[dict]:
columns = [
{
"label": _("Warehouse"),
diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py
index 9625b20..d9f3473 100644
--- a/erpnext/stock/serial_batch_bundle.py
+++ b/erpnext/stock/serial_batch_bundle.py
@@ -1,5 +1,4 @@
from collections import defaultdict
-from typing import List
import frappe
from frappe import _, bold
@@ -130,13 +129,14 @@
frappe.throw(_(error_msg))
def set_serial_and_batch_bundle(self, sn_doc):
- self.sle.db_set(
- {"serial_and_batch_bundle": sn_doc.name, "auto_created_serial_and_batch_bundle": 1}
- )
+ self.sle.db_set({"serial_and_batch_bundle": sn_doc.name, "auto_created_serial_and_batch_bundle": 1})
if sn_doc.is_rejected:
frappe.db.set_value(
- self.child_doctype, self.sle.voucher_detail_no, "rejected_serial_and_batch_bundle", sn_doc.name
+ self.child_doctype,
+ self.sle.voucher_detail_no,
+ "rejected_serial_and_batch_bundle",
+ sn_doc.name,
)
else:
values_to_update = {
@@ -157,9 +157,7 @@
def child_doctype(self):
child_doctype = self.sle.voucher_type + " Item"
- if (
- self.sle.voucher_type == "Subcontracting Receipt" and self.sle.dependant_sle_voucher_detail_no
- ):
+ if self.sle.voucher_type == "Subcontracting Receipt" and self.sle.dependant_sle_voucher_detail_no:
child_doctype = "Subcontracting Receipt Supplied Item"
if self.sle.voucher_type == "Stock Entry":
@@ -343,9 +341,7 @@
if serial_nos:
filters["serial_no"] = ("in", serial_nos)
- entries = frappe.get_all(
- "Serial and Batch Entry", fields=["serial_no"], filters=filters, order_by="idx"
- )
+ entries = frappe.get_all("Serial and Batch Entry", fields=["serial_no"], filters=filters, order_by="idx")
if not entries:
return []
@@ -497,9 +493,7 @@
# else it remains the same as that of previous entry
self.wh_data.valuation_rate = new_stock_value / new_stock_qty
- if (
- not self.wh_data.valuation_rate and self.sle.voucher_detail_no and not self.is_rejected_entry()
- ):
+ if not self.wh_data.valuation_rate and self.sle.voucher_detail_no and not self.is_rejected_entry():
allow_zero_rate = self.sle_self.check_if_allow_zero_valuation_rate(
self.sle.voucher_type, self.sle.voucher_detail_no
)
@@ -507,9 +501,7 @@
self.wh_data.valuation_rate = self.sle_self.get_fallback_rate(self.sle)
self.wh_data.qty_after_transaction += self.sle.actual_qty
- self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(
- self.wh_data.valuation_rate
- )
+ self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(self.wh_data.valuation_rate)
def is_rejected_entry(self):
return is_rejected(self.sle.voucher_type, self.sle.voucher_detail_no, self.sle.warehouse)
@@ -560,7 +552,7 @@
self.calculate_avg_rate_for_non_batchwise_valuation()
self.set_stock_value_difference()
- def get_batch_no_ledgers(self) -> List[dict]:
+ def get_batch_no_ledgers(self) -> list[dict]:
if not self.batchwise_valuation_batches:
return []
@@ -620,9 +612,7 @@
for batch in batches:
self.batchwise_valuation_batches.append(batch.name)
- self.non_batchwise_valuation_batches = list(
- set(self.batches) - set(self.batchwise_valuation_batches)
- )
+ self.non_batchwise_valuation_batches = list(set(self.batches) - set(self.batchwise_valuation_batches))
def get_batch_nos(self) -> list:
if self.sle.get("batch_nos"):
@@ -659,9 +649,7 @@
if not hasattr(self, "wh_data"):
return
- self.wh_data.stock_value = round_off_if_near_zero(
- self.wh_data.stock_value + self.stock_value_change
- )
+ self.wh_data.stock_value = round_off_if_near_zero(self.wh_data.stock_value + self.stock_value_change)
self.wh_data.qty_after_transaction += self.sle.actual_qty
if self.wh_data.qty_after_transaction:
@@ -796,17 +784,17 @@
def set_other_details(self):
if not self.get("posting_date"):
- setattr(self, "posting_date", today())
+ self.posting_date = today()
self.__dict__["posting_date"] = self.posting_date
if not self.get("actual_qty"):
qty = self.get("qty") or self.get("total_qty")
- setattr(self, "actual_qty", qty)
+ self.actual_qty = qty
self.__dict__["actual_qty"] = self.actual_qty
if not hasattr(self, "use_serial_batch_fields"):
- setattr(self, "use_serial_batch_fields", 0)
+ self.use_serial_batch_fields = 0
def duplicate_package(self):
if not self.serial_and_batch_bundle:
@@ -920,9 +908,7 @@
self.batches = get_available_batches(kwargs)
def set_auto_serial_batch_entries_for_inward(self):
- if (self.get("batches") and self.has_batch_no) or (
- self.get("serial_nos") and self.has_serial_no
- ):
+ if (self.get("batches") and self.has_batch_no) or (self.get("serial_nos") and self.has_serial_no):
if self.use_serial_batch_fields and self.get("serial_nos"):
self.make_serial_no_if_not_exists()
@@ -950,7 +936,7 @@
serial_nos_details = []
batch_no = None
if self.batches:
- batch_no = list(self.batches.keys())[0]
+ batch_no = next(iter(self.batches.keys()))
for serial_no in serial_nos:
serial_nos_details.append(
@@ -1040,7 +1026,7 @@
msg = f"Please set Serial No Series in the item {self.item_code} or create Serial and Batch Bundle manually."
frappe.throw(_(msg))
- for i in range(abs(cint(self.actual_qty))):
+ for _i in range(abs(cint(self.actual_qty))):
serial_no = make_autoname(self.serial_no_series, "Serial No")
sr_nos.append(serial_no)
serial_nos_details.append(
diff --git a/erpnext/stock/stock_balance.py b/erpnext/stock/stock_balance.py
index ba03ff2..20bd4ca 100644
--- a/erpnext/stock/stock_balance.py
+++ b/erpnext/stock/stock_balance.py
@@ -15,9 +15,7 @@
frappe.db.auto_commit_on_many_writes = 1
if allow_negative_stock:
- existing_allow_negative_stock = frappe.db.get_single_value(
- "Stock Settings", "allow_negative_stock"
- )
+ existing_allow_negative_stock = frappe.db.get_single_value("Stock Settings", "allow_negative_stock")
frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 1)
item_warehouses = frappe.db.sql(
@@ -37,9 +35,7 @@
frappe.db.rollback()
if allow_negative_stock:
- frappe.db.set_single_value(
- "Stock Settings", "allow_negative_stock", existing_allow_negative_stock
- )
+ frappe.db.set_single_value("Stock Settings", "allow_negative_stock", existing_allow_negative_stock)
frappe.db.auto_commit_on_many_writes = 0
@@ -51,7 +47,6 @@
only_bin=False,
allow_negative_stock=False,
):
-
if not only_bin:
repost_actual_qty(item_code, warehouse, allow_zero_rate, allow_negative_stock)
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index aef1a82..edb4df6 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -4,7 +4,6 @@
import copy
import gzip
import json
-from typing import Optional, Set, Tuple
import frappe
from frappe import _, scrub
@@ -272,12 +271,10 @@
)
affected_transactions.update(obj.affected_transactions)
- distinct_item_warehouses[
- (args[i].get("item_code"), args[i].get("warehouse"))
- ].reposting_status = True
+ distinct_item_warehouses[(args[i].get("item_code"), args[i].get("warehouse"))].reposting_status = True
if obj.new_items_found:
- for item_wh, data in distinct_item_warehouses.items():
+ for _item_wh, data in distinct_item_warehouses.items():
if ("args_idx" not in data and not data.reposting_status) or (
data.sle_changed and data.reposting_status
):
@@ -324,9 +321,7 @@
frappe.throw(_(validation_msg))
-def update_args_in_repost_item_valuation(
- doc, index, args, distinct_item_warehouses, affected_transactions
-):
+def update_args_in_repost_item_valuation(doc, index, args, distinct_item_warehouses, affected_transactions):
if not doc.items_to_be_repost:
file_name = ""
if doc.reposting_data_file:
@@ -478,7 +473,7 @@
return new_dict
-def get_affected_transactions(doc, reposting_data=None) -> Set[Tuple[str, str]]:
+def get_affected_transactions(doc, reposting_data=None) -> set[tuple[str, str]]:
if not reposting_data and doc and doc.reposting_data_file:
reposting_data = get_reposting_data(doc.reposting_data_file)
@@ -497,7 +492,7 @@
return doc.current_index
-class update_entries_after(object):
+class update_entries_after:
"""
update valution rate and qty after transaction
from the current time-bucket onwards
@@ -539,7 +534,7 @@
self.new_items_found = False
self.distinct_item_warehouses = args.get("distinct_item_warehouses", frappe._dict())
- self.affected_transactions: Set[Tuple[str, str]] = set()
+ self.affected_transactions: set[tuple[str, str]] = set()
self.reserved_stock = flt(self.args.reserved_stock)
self.data = frappe._dict()
@@ -618,9 +613,7 @@
self.process_sle(sle)
def get_sle_against_current_voucher(self):
- self.args["posting_datetime"] = get_combine_datetime(
- self.args.posting_date, self.args.posting_time
- )
+ self.args["posting_datetime"] = get_combine_datetime(self.args.posting_date, self.args.posting_time)
return frappe.db.sql(
"""
@@ -658,9 +651,7 @@
if not dependant_sle:
return entries_to_fix
- elif (
- dependant_sle.item_code == self.item_code and dependant_sle.warehouse == self.args.warehouse
- ):
+ elif dependant_sle.item_code == self.item_code and dependant_sle.warehouse == self.args.warehouse:
return entries_to_fix
elif dependant_sle.item_code != self.item_code:
self.update_distinct_item_warehouses(dependant_sle)
@@ -680,9 +671,7 @@
self.distinct_item_warehouses[key] = val
self.new_items_found = True
else:
- existing_sle_posting_date = (
- self.distinct_item_warehouses[key].get("sle", {}).get("posting_date")
- )
+ existing_sle_posting_date = self.distinct_item_warehouses[key].get("sle", {}).get("posting_date")
dependent_voucher_detail_nos = self.get_dependent_voucher_detail_nos(key)
@@ -774,7 +763,9 @@
self.wh_data.valuation_rate
)
if self.valuation_method != "Moving Average":
- self.wh_data.stock_queue = [[self.wh_data.qty_after_transaction, self.wh_data.valuation_rate]]
+ self.wh_data.stock_queue = [
+ [self.wh_data.qty_after_transaction, self.wh_data.valuation_rate]
+ ]
else:
if self.valuation_method == "Moving Average":
self.get_moving_average_values(sle)
@@ -843,9 +834,7 @@
self.wh_data.valuation_rate = new_stock_value / new_stock_qty
if not self.wh_data.valuation_rate and sle.voucher_detail_no:
- allow_zero_rate = self.check_if_allow_zero_valuation_rate(
- sle.voucher_type, sle.voucher_detail_no
- )
+ allow_zero_rate = self.check_if_allow_zero_valuation_rate(sle.voucher_type, sle.voucher_detail_no)
if not allow_zero_rate:
self.wh_data.valuation_rate = self.get_fallback_rate(sle)
@@ -862,9 +851,7 @@
if abs(sle.actual_qty) == 0.0:
sle.is_cancelled = 1
- if sle.serial_and_batch_bundle and frappe.get_cached_value(
- "Item", sle.item_code, "has_serial_no"
- ):
+ if sle.serial_and_batch_bundle and frappe.get_cached_value("Item", sle.item_code, "has_serial_no"):
self.update_serial_no_status(sle)
def update_serial_no_status(self, sle):
@@ -1265,9 +1252,7 @@
stock_value_difference = stock_value - prev_stock_value
self.wh_data.stock_queue = stock_queue.state
- self.wh_data.stock_value = round_off_if_near_zero(
- self.wh_data.stock_value + stock_value_difference
- )
+ self.wh_data.stock_value = round_off_if_near_zero(self.wh_data.stock_value + stock_value_difference)
if not self.wh_data.stock_queue:
self.wh_data.stock_queue.append(
@@ -1305,9 +1290,7 @@
outgoing_rate = self.get_fallback_rate(sle)
stock_value_difference = outgoing_rate * actual_qty
- self.wh_data.stock_value = round_off_if_near_zero(
- self.wh_data.stock_value + stock_value_difference
- )
+ self.wh_data.stock_value = round_off_if_near_zero(self.wh_data.stock_value + stock_value_difference)
if self.wh_data.qty_after_transaction:
self.wh_data.valuation_rate = self.wh_data.stock_value / self.wh_data.qty_after_transaction
@@ -1356,7 +1339,6 @@
exceptions[0]["voucher_type"],
exceptions[0]["voucher_no"],
) in frappe.local.flags.currently_saving:
-
msg = _("{0} units of {1} needed in {2} to complete this transaction.").format(
frappe.bold(abs(deficiency)),
frappe.get_desk_link("Item", exceptions[0]["item_code"]),
@@ -1379,13 +1361,11 @@
allowed_qty = abs(exceptions[0]["actual_qty"]) - abs(exceptions[0]["diff"])
if allowed_qty > 0:
- msg = "{0} As {1} units are reserved for other sales orders, you are allowed to consume only {2} units.".format(
+ msg = "{} As {} units are reserved for other sales orders, you are allowed to consume only {} units.".format(
msg, frappe.bold(self.reserved_stock), frappe.bold(allowed_qty)
)
else:
- msg = "{0} As the full stock is reserved for other sales orders, you're not allowed to consume the stock.".format(
- msg,
- )
+ msg = f"{msg} As the full stock is reserved for other sales orders, you're not allowed to consume the stock."
msg_list.append(msg)
@@ -1434,7 +1414,7 @@
voucher_condition = f"and voucher_no != '{voucher_no}'"
sle = frappe.db.sql(
- """
+ f"""
select *, posting_datetime as "timestamp"
from `tabStock Ledger Entry`
where item_code = %(item_code)s
@@ -1446,10 +1426,7 @@
)
order by posting_datetime desc, creation desc
limit 1
- for update""".format(
- operator=operator,
- voucher_condition=voucher_condition,
- ),
+ for update""",
args,
as_dict=1,
)
@@ -1489,7 +1466,7 @@
extra_cond=None,
):
"""get stock ledger entries filtered by specific posting datetime conditions"""
- conditions = " and posting_datetime {0} %(posting_datetime)s".format(operator)
+ conditions = f" and posting_datetime {operator} %(posting_datetime)s"
if previous_sle.get("warehouse"):
conditions += " and warehouse = %(warehouse)s"
elif previous_sle.get("warehouse_condition"):
@@ -1501,17 +1478,17 @@
conditions += (
""" and
(
- serial_no = {0}
- or serial_no like {1}
- or serial_no like {2}
- or serial_no like {3}
+ serial_no = {}
+ or serial_no like {}
+ or serial_no like {}
+ or serial_no like {}
)
"""
).format(
frappe.db.escape(serial_no),
- frappe.db.escape("{}\n%".format(serial_no)),
- frappe.db.escape("%\n{}".format(serial_no)),
- frappe.db.escape("%\n{}\n%".format(serial_no)),
+ frappe.db.escape(f"{serial_no}\n%"),
+ frappe.db.escape(f"%\n{serial_no}"),
+ frappe.db.escape(f"%\n{serial_no}\n%"),
)
if not previous_sle.get("posting_date"):
@@ -1531,17 +1508,16 @@
"""
select *, posting_datetime as "timestamp"
from `tabStock Ledger Entry`
- where item_code = %%(item_code)s
+ where item_code = %(item_code)s
and is_cancelled = 0
- %(conditions)s
- order by posting_datetime %(order)s, creation %(order)s
- %(limit)s %(for_update)s"""
- % {
- "conditions": conditions,
- "limit": limit or "",
- "for_update": for_update and "for update" or "",
- "order": order,
- },
+ {conditions}
+ order by posting_datetime {order}, creation {order}
+ {limit} {for_update}""".format(
+ conditions=conditions,
+ limit=limit or "",
+ for_update=for_update and "for update" or "",
+ order=order,
+ ),
previous_sle,
as_dict=1,
debug=debug,
@@ -1566,17 +1542,14 @@
)
-def get_batch_incoming_rate(
- item_code, warehouse, batch_no, posting_date, posting_time, creation=None
-):
-
+def get_batch_incoming_rate(item_code, warehouse, batch_no, posting_date, posting_time, creation=None):
sle = frappe.qb.DocType("Stock Ledger Entry")
timestamp_condition = sle.posting_datetime < get_combine_datetime(posting_date, posting_time)
if creation:
- timestamp_condition |= (
- sle.posting_datetime == get_combine_datetime(posting_date, posting_time)
- ) & (sle.creation < creation)
+ timestamp_condition |= (sle.posting_datetime == get_combine_datetime(posting_date, posting_time)) & (
+ sle.creation < creation
+ )
batch_details = (
frappe.qb.from_(sle)
@@ -1606,7 +1579,6 @@
batch_no=None,
serial_and_batch_bundle=None,
):
-
from erpnext.stock.serial_batch_bundle import BatchNoValuation
if not company:
@@ -1697,7 +1669,7 @@
solutions += (
"<li>"
+ _("If not, you can Cancel / Submit this entry")
- + " {0} ".format(frappe.bold(_("after")))
+ + " {} ".format(frappe.bold(_("after")))
+ _("performing either one below:")
+ "</li>"
)
@@ -1833,9 +1805,7 @@
neg_sle = get_future_sle_with_negative_qty(args)
if is_negative_with_precision(neg_sle):
- message = _(
- "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction."
- ).format(
+ message = _("{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction.").format(
abs(neg_sle[0]["qty_after_transaction"]),
frappe.get_desk_link("Item", args.item_code),
frappe.get_desk_link("Warehouse", args.warehouse),
@@ -1970,12 +1940,8 @@
def validate_reserved_serial_nos(item_code, warehouse, serial_nos):
- if reserved_serial_nos_details := get_sre_reserved_serial_nos_details(
- item_code, warehouse, serial_nos
- ):
- if common_serial_nos := list(
- set(serial_nos).intersection(set(reserved_serial_nos_details.keys()))
- ):
+ if reserved_serial_nos_details := get_sre_reserved_serial_nos_details(item_code, warehouse, serial_nos):
+ if common_serial_nos := list(set(serial_nos).intersection(set(reserved_serial_nos_details.keys()))):
msg = _(
"Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding."
)
@@ -2019,7 +1985,7 @@
frappe.throw(msg, title=_("Reserved Stock for Batch"))
-def is_negative_stock_allowed(*, item_code: Optional[str] = None) -> bool:
+def is_negative_stock_allowed(*, item_code: str | None = None) -> bool:
if cint(frappe.db.get_single_value("Stock Settings", "allow_negative_stock", cache=True)):
return True
if item_code and cint(frappe.db.get_value("Item", item_code, "allow_negative_stock", cache=True)):
diff --git a/erpnext/stock/tests/test_get_item_details.py b/erpnext/stock/tests/test_get_item_details.py
index b53e29e..30f748a 100644
--- a/erpnext/stock/tests/test_get_item_details.py
+++ b/erpnext/stock/tests/test_get_item_details.py
@@ -1,5 +1,3 @@
-import json
-
import frappe
from frappe.test_runner import make_test_records
from frappe.tests.utils import FrappeTestCase
@@ -16,7 +14,6 @@
super().setUp()
def test_get_item_detail_purchase_order(self):
-
args = frappe._dict(
{
"item_code": "_Test Item",
@@ -29,7 +26,6 @@
"name": None,
"supplier": "_Test Supplier",
"transaction_date": None,
- "conversion_rate": 1.0,
"price_list": "_Test Buying Price List",
"is_subcontracted": 0,
"ignore_pricing_rule": 1,
diff --git a/erpnext/stock/tests/test_utils.py b/erpnext/stock/tests/test_utils.py
index 4e93ac9..bc646fa 100644
--- a/erpnext/stock/tests/test_utils.py
+++ b/erpnext/stock/tests/test_utils.py
@@ -28,7 +28,7 @@
)
self.assertGreaterEqual(len(sles), len(expected_sles))
- for exp_sle, act_sle in zip(expected_sles, sles):
+ for exp_sle, act_sle in zip(expected_sles, sles, strict=False):
for k, v in exp_sle.items():
act_value = act_sle[k]
if k == "stock_queue":
@@ -51,7 +51,7 @@
order_by=order_by or "posting_date, creation",
)
self.assertGreaterEqual(len(actual_gles), len(expected_gles))
- for exp_gle, act_gle in zip(expected_gles, actual_gles):
+ for exp_gle, act_gle in zip(expected_gles, actual_gles, strict=False):
for k, exp_value in exp_gle.items():
act_value = act_gle[k]
self.assertEqual(exp_value, act_value, msg=f"{k} doesn't match \n{exp_gle}\n{act_gle}")
diff --git a/erpnext/stock/tests/test_valuation.py b/erpnext/stock/tests/test_valuation.py
index 4d8990a..47b8f0b 100644
--- a/erpnext/stock/tests/test_valuation.py
+++ b/erpnext/stock/tests/test_valuation.py
@@ -28,9 +28,7 @@
self.assertAlmostEqual(sum(q for q, _ in self.queue), qty, msg=f"queue: {self.queue}", places=4)
def assertTotalValue(self, value):
- self.assertAlmostEqual(
- sum(q * r for q, r in self.queue), value, msg=f"queue: {self.queue}", places=2
- )
+ self.assertAlmostEqual(sum(q * r for q, r in self.queue), value, msg=f"queue: {self.queue}", places=2)
def test_simple_addition(self):
self.queue.add_stock(1, 10)
@@ -210,9 +208,7 @@
self.assertAlmostEqual(sum(q for q, _ in self.stack), qty, msg=f"stack: {self.stack}", places=4)
def assertTotalValue(self, value):
- self.assertAlmostEqual(
- sum(q * r for q, r in self.stack), value, msg=f"stack: {self.stack}", places=2
- )
+ self.assertAlmostEqual(sum(q * r for q, r in self.stack), value, msg=f"stack: {self.stack}", places=2)
def test_simple_addition(self):
self.stack.add_stock(1, 10)
@@ -355,7 +351,6 @@
self.assertEqual(stock_queue, expected_queue)
def test_lifo_values(self):
-
in1 = self._make_stock_entry(1, 1)
self.assertStockQueue(in1, [[1, 1]])
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index 93e2fa4..64c239a 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -3,7 +3,6 @@
import json
-from typing import Dict, Optional
import frappe
from frappe import _
@@ -18,7 +17,7 @@
from erpnext.stock.serial_batch_bundle import BatchNoValuation, SerialNoValuation
from erpnext.stock.valuation import FIFOValuation, LIFOValuation
-BarcodeScanResult = Dict[str, Optional[str]]
+BarcodeScanResult = dict[str, str | None]
class InvalidWarehouseCompany(frappe.ValidationError):
@@ -59,7 +58,7 @@
def get_stock_value_on(
- warehouses: list | str = None, posting_date: str = None, item_code: str = None
+ warehouses: list | str | None = None, posting_date: str | None = None, item_code: str | None = None
) -> float:
if not posting_date:
posting_date = nowdate()
@@ -150,9 +149,7 @@
else (0.0, 0.0, None)
)
else:
- return (
- (last_entry.qty_after_transaction, last_entry.valuation_rate) if last_entry else (0.0, 0.0)
- )
+ return (last_entry.qty_after_transaction, last_entry.valuation_rate) if last_entry else (0.0, 0.0)
else:
return last_entry.qty_after_transaction if last_entry else 0.0
@@ -180,10 +177,8 @@
condition += " AND warehouse = %s"
actual_qty = frappe.db.sql(
- """select sum(actual_qty) from tabBin
- where item_code=%s {0}""".format(
- condition
- ),
+ f"""select sum(actual_qty) from tabBin
+ where item_code=%s {condition}""",
values,
)[0][0]
@@ -278,9 +273,7 @@
args.actual_qty = args.qty
args.serial_nos = get_serial_nos_data(args.get("serial_no"))
- sn_obj = SerialNoValuation(
- sle=args, warehouse=args.get("warehouse"), item_code=args.get("item_code")
- )
+ sn_obj = SerialNoValuation(sle=args, warehouse=args.get("warehouse"), item_code=args.get("item_code"))
return sn_obj.get_incoming_rate()
elif (
@@ -288,7 +281,6 @@
and frappe.db.get_value("Batch", args.get("batch_no"), "use_batchwise_valuation", cache=True)
and not args.get("serial_and_batch_bundle")
):
-
args.actual_qty = args.qty
args.batch_nos = frappe._dict({args.batch_no: args})
@@ -329,10 +321,7 @@
return flt(in_rate)
-def get_batch_incoming_rate(
- item_code, warehouse, batch_no, posting_date, posting_time, creation=None
-):
-
+def get_batch_incoming_rate(item_code, warehouse, batch_no, posting_date, posting_time, creation=None):
sle = frappe.qb.DocType("Stock Ledger Entry")
timestamp_condition = CombineDatetime(sle.posting_date, sle.posting_time) < CombineDatetime(
@@ -340,8 +329,7 @@
)
if creation:
timestamp_condition |= (
- CombineDatetime(sle.posting_date, sle.posting_time)
- == CombineDatetime(posting_date, posting_time)
+ CombineDatetime(sle.posting_date, sle.posting_time) == CombineDatetime(posting_date, posting_time)
) & (sle.creation < creation)
batch_details = (
@@ -379,9 +367,7 @@
"""get valuation method from item or default"""
val_method = frappe.db.get_value("Item", item_code, "valuation_method", cache=True)
if not val_method:
- val_method = (
- frappe.db.get_single_value("Stock Settings", "valuation_method", cache=True) or "FIFO"
- )
+ val_method = frappe.db.get_single_value("Stock Settings", "valuation_method", cache=True) or "FIFO"
return val_method
@@ -456,7 +442,6 @@
if not include_uom or not conversion_factors:
return
- convertible_cols = {}
is_dict_obj = False
if isinstance(result[0], dict):
is_dict_obj = True
@@ -471,8 +456,8 @@
columns.insert(
idx + 1,
{
- "label": "{0} (per {1})".format(d.get("label"), include_uom),
- "fieldname": "{0}_{1}".format(d.get("fieldname"), frappe.scrub(include_uom)),
+ "label": "{} (per {})".format(d.get("label"), include_uom),
+ "fieldname": "{}_{}".format(d.get("fieldname"), frappe.scrub(include_uom)),
"fieldtype": "Currency" if d.get("convertible") == "rate" else "Float",
},
)
@@ -495,7 +480,7 @@
if not is_dict_obj:
row.insert(key + 1, new_value)
else:
- new_key = "{0}_{1}".format(key, frappe.scrub(include_uom))
+ new_key = f"{key}_{frappe.scrub(include_uom)}"
update_dict_values.append([row, new_key, new_value])
for data in update_dict_values:
@@ -518,9 +503,9 @@
{"converted_col": columns[next_col]["fieldname"], "for_type": col.get("convertible")}
)
if col.get("convertible") == "rate":
- columns[next_col]["label"] += " (per {})".format(include_uom)
+ columns[next_col]["label"] += f" (per {include_uom})"
else:
- columns[next_col]["label"] += " ({})".format(include_uom)
+ columns[next_col]["label"] += f" ({include_uom})"
for row_idx, row in enumerate(result):
for convertible_col, data in convertible_column_map.items():
@@ -594,7 +579,7 @@
def set_cache(data: BarcodeScanResult):
frappe.cache().set_value(f"erpnext:barcode_scan:{search_value}", data, expires_in_sec=120)
- def get_cache() -> Optional[BarcodeScanResult]:
+ def get_cache() -> BarcodeScanResult | None:
if data := frappe.cache().get_value(f"erpnext:barcode_scan:{search_value}"):
return data
@@ -647,7 +632,7 @@
return {}
-def _update_item_info(scan_result: Dict[str, Optional[str]]) -> Dict[str, Optional[str]]:
+def _update_item_info(scan_result: dict[str, str | None]) -> dict[str, str | None]:
if item_code := scan_result.get("item_code"):
if item_info := frappe.get_cached_value(
"Item",
diff --git a/erpnext/stock/valuation.py b/erpnext/stock/valuation.py
index 35f4f12..b1df982 100644
--- a/erpnext/stock/valuation.py
+++ b/erpnext/stock/valuation.py
@@ -1,9 +1,10 @@
from abc import ABC, abstractmethod, abstractproperty
-from typing import Callable, List, NewType, Optional, Tuple
+from collections.abc import Callable
+from typing import NewType
from frappe.utils import flt
-StockBin = NewType("StockBin", List[float]) # [[qty, rate], ...]
+StockBin = NewType("StockBin", list[float]) # [[qty, rate], ...]
# Indexes of values inside FIFO bin 2-tuple
QTY = 0
@@ -17,15 +18,15 @@
@abstractmethod
def remove_stock(
- self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
- ) -> List[StockBin]:
+ self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] | None = None
+ ) -> list[StockBin]:
pass
@abstractproperty
- def state(self) -> List[StockBin]:
+ def state(self) -> list[StockBin]:
pass
- def get_total_stock_and_value(self) -> Tuple[float, float]:
+ def get_total_stock_and_value(self) -> tuple[float, float]:
total_qty = 0.0
total_value = 0.0
@@ -62,11 +63,11 @@
# ref: https://docs.python.org/3/reference/datamodel.html#slots
__slots__ = ["queue"]
- def __init__(self, state: Optional[List[StockBin]]):
- self.queue: List[StockBin] = state if state is not None else []
+ def __init__(self, state: list[StockBin] | None):
+ self.queue: list[StockBin] = state if state is not None else []
@property
- def state(self) -> List[StockBin]:
+ def state(self) -> list[StockBin]:
"""Get current state of queue."""
return self.queue
@@ -95,8 +96,8 @@
self.queue[-1][QTY] = qty
def remove_stock(
- self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
- ) -> List[StockBin]:
+ self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] | None = None
+ ) -> list[StockBin]:
"""Remove stock from the queue and return popped bins.
args:
@@ -166,11 +167,11 @@
# ref: https://docs.python.org/3/reference/datamodel.html#slots
__slots__ = ["stack"]
- def __init__(self, state: Optional[List[StockBin]]):
- self.stack: List[StockBin] = state if state is not None else []
+ def __init__(self, state: list[StockBin] | None):
+ self.stack: list[StockBin] = state if state is not None else []
@property
- def state(self) -> List[StockBin]:
+ def state(self) -> list[StockBin]:
"""Get current state of stack."""
return self.stack
@@ -201,8 +202,8 @@
self.stack[-1][QTY] = qty
def remove_stock(
- self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
- ) -> List[StockBin]:
+ self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] | None = None
+ ) -> list[StockBin]:
"""Remove stock from the stack and return popped bins.
args: