Merge pull request #38893 from ruthra-kumar/typeerror_in_pos
fix: typeerror on pos order summary to new order screen
diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json
index 540a4f5..ea72b3c 100644
--- a/erpnext/assets/doctype/asset/asset.json
+++ b/erpnext/assets/doctype/asset/asset.json
@@ -35,6 +35,7 @@
"purchase_receipt",
"purchase_invoice",
"available_for_use_date",
+ "total_asset_cost",
"column_break_23",
"gross_purchase_amount",
"asset_quantity",
@@ -529,6 +530,14 @@
"label": "Capitalized In",
"options": "Asset Capitalization",
"read_only": 1
+ },
+ {
+ "depends_on": "eval:doc.docstatus > 0",
+ "fieldname": "total_asset_cost",
+ "fieldtype": "Currency",
+ "label": "Total Asset Cost",
+ "options": "Company:company:default_currency",
+ "read_only": 1
}
],
"idx": 72,
@@ -572,7 +581,7 @@
"link_fieldname": "target_asset"
}
],
- "modified": "2023-11-20 20:57:37.010467",
+ "modified": "2023-12-20 16:50:21.128595",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 3b3ed0a..3ea6ec7 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -111,6 +111,7 @@
"Decapitalized",
]
supplier: DF.Link | None
+ total_asset_cost: DF.Currency
total_number_of_depreciations: DF.Int
value_after_depreciation: DF.Currency
# end: auto-generated types
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index 31dd63d..b7fce91 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -93,6 +93,9 @@
self.increase_asset_value()
+ if self.capitalize_repair_cost:
+ self.asset_doc.total_asset_cost += self.repair_cost
+
if self.get("stock_consumption"):
self.check_for_stock_items_and_warehouse()
self.decrease_stock_quantity()
@@ -128,6 +131,9 @@
self.decrease_asset_value()
+ if self.capitalize_repair_cost:
+ self.asset_doc.total_asset_cost -= self.repair_cost
+
if self.get("stock_consumption"):
self.increase_stock_quantity()
if self.get("capitalize_repair_cost"):
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index f0381d2..d86b6d4 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -744,6 +744,9 @@
base_total_rm_cost = 0
for d in self.get("items"):
+ if not d.is_stock_item and self.rm_cost_as_per == "Valuation Rate":
+ continue
+
old_rate = d.rate
if self.rm_cost_as_per != "Manual":
d.rate = self.get_rm_rate(
@@ -1017,6 +1020,8 @@
item_doc = frappe.get_cached_doc("Item", args.get("item_code"))
price_list_data = get_price_list_rate(bom_args, item_doc)
rate = price_list_data.price_list_rate
+ elif bom_doc.rm_cost_as_per == "Manual":
+ return
return flt(rate)
diff --git a/erpnext/manufacturing/doctype/bom/test_bom.py b/erpnext/manufacturing/doctype/bom/test_bom.py
index 051b475..2debf91 100644
--- a/erpnext/manufacturing/doctype/bom/test_bom.py
+++ b/erpnext/manufacturing/doctype/bom/test_bom.py
@@ -698,6 +698,35 @@
bom.update_cost()
self.assertFalse(bom.flags.cost_updated)
+ def test_bom_with_service_item_cost(self):
+ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
+
+ rm_item = make_item(properties={"is_stock_item": 1, "valuation_rate": 1000.0}).name
+
+ service_item = make_item(properties={"is_stock_item": 0}).name
+
+ fg_item = make_item(properties={"is_stock_item": 1}).name
+
+ from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
+
+ bom = make_bom(item=fg_item, raw_materials=[rm_item, service_item], do_not_save=True)
+ bom.rm_cost_as_per = "Valuation Rate"
+
+ for row in bom.items:
+ if row.item_code == service_item:
+ row.rate = 566.00
+ else:
+ row.rate = 800.00
+
+ bom.save()
+
+ for row in bom.items:
+ if row.item_code == service_item:
+ self.assertEqual(row.is_stock_item, 0)
+ self.assertEqual(row.rate, 566.00)
+ else:
+ self.assertEqual(row.is_stock_item, 1)
+
def test_do_not_include_manufacturing_and_fixed_items(self):
from erpnext.manufacturing.doctype.bom.bom import item_query
diff --git a/erpnext/manufacturing/doctype/bom_item/bom_item.json b/erpnext/manufacturing/doctype/bom_item/bom_item.json
index cb58af1..dfd6612 100644
--- a/erpnext/manufacturing/doctype/bom_item/bom_item.json
+++ b/erpnext/manufacturing/doctype/bom_item/bom_item.json
@@ -14,6 +14,7 @@
"bom_no",
"source_warehouse",
"allow_alternative_item",
+ "is_stock_item",
"section_break_5",
"description",
"col_break1",
@@ -185,7 +186,7 @@
"in_list_view": 1,
"label": "Rate",
"options": "currency",
- "read_only": 1,
+ "read_only_depends_on": "eval:doc.is_stock_item == 1",
"reqd": 1
},
{
@@ -284,13 +285,21 @@
"fieldname": "do_not_explode",
"fieldtype": "Check",
"label": "Do Not Explode"
+ },
+ {
+ "default": "0",
+ "fetch_from": "item_code.is_stock_item",
+ "fieldname": "is_stock_item",
+ "fieldtype": "Check",
+ "label": "Is Stock Item",
+ "read_only": 1
}
],
"idx": 1,
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2023-11-14 18:35:51.378513",
+ "modified": "2023-12-20 16:21:55.477883",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Item",
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 56f6347..952875c 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -352,6 +352,8 @@
erpnext.patches.v14_0.update_zero_asset_quantity_field
execute:frappe.db.set_single_value("Buying Settings", "project_update_frequency", "Each Transaction")
execute:frappe.db.set_default("date_format", frappe.db.get_single_value("System Settings", "date_format"))
+erpnext.patches.v14_0.update_total_asset_cost_field
# below migration patch should always run last
erpnext.patches.v14_0.migrate_gl_to_payment_ledger
erpnext.stock.doctype.delivery_note.patches.drop_unused_return_against_index
+erpnext.patches.v14_0.set_maintain_stock_for_bom_item
\ No newline at end of file
diff --git a/erpnext/patches/v14_0/set_maintain_stock_for_bom_item.py b/erpnext/patches/v14_0/set_maintain_stock_for_bom_item.py
new file mode 100644
index 0000000..f0b618f
--- /dev/null
+++ b/erpnext/patches/v14_0/set_maintain_stock_for_bom_item.py
@@ -0,0 +1,19 @@
+import frappe
+
+
+def execute():
+ if not frappe.db.exists("BOM", {"docstatus": 1}):
+ return
+
+ # Added is_stock_item to handle Read Only based on condition for the rate field
+ frappe.db.sql(
+ """
+ UPDATE
+ `tabBOM Item` boi,
+ `tabItem` i
+ SET
+ boi.is_stock_item = i.is_stock_item
+ WHERE
+ boi.item_code = i.name
+ """
+ )
diff --git a/erpnext/patches/v14_0/update_total_asset_cost_field.py b/erpnext/patches/v14_0/update_total_asset_cost_field.py
new file mode 100644
index 0000000..57cf71b
--- /dev/null
+++ b/erpnext/patches/v14_0/update_total_asset_cost_field.py
@@ -0,0 +1,17 @@
+import frappe
+
+
+def execute():
+ asset = frappe.qb.DocType("Asset")
+ frappe.qb.update(asset).set(asset.total_asset_cost, asset.gross_purchase_amount).run()
+
+ asset_repair_list = frappe.db.get_all(
+ "Asset Repair",
+ filters={"docstatus": 1, "repair_status": "Completed", "capitalize_repair_cost": 1},
+ fields=["asset", "repair_cost"],
+ )
+
+ for asset_repair in asset_repair_list:
+ frappe.qb.update(asset).set(
+ asset.total_asset_cost, asset.total_asset_cost + asset_repair.repair_cost
+ ).where(asset.name == asset_repair.asset).run()