fix: travis for asset capitalization and asset repair
diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js
index 9c7f70b..5a37685 100644
--- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js
+++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js
@@ -6,6 +6,7 @@
erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.stock.StockController {
setup() {
+ this.frm.ignore_doctypes_on_cancel_all = ['Serial and Batch Bundle'];
this.setup_posting_date_time_check();
}
diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json
index d1be575..01b35f6 100644
--- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json
+++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json
@@ -334,7 +334,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2022-09-12 15:09:40.771332",
+ "modified": "2022-10-12 15:09:40.771332",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Capitalization",
diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py
index b5e780b..6841c56 100644
--- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py
+++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py
@@ -65,6 +65,10 @@
self.calculate_totals()
self.set_title()
+ def on_update(self):
+ if self.stock_items:
+ self.set_serial_and_batch_bundle(table_name="stock_items")
+
def before_submit(self):
self.validate_source_mandatory()
@@ -74,7 +78,12 @@
self.update_target_asset()
def on_cancel(self):
- self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
+ self.ignore_linked_doctypes = (
+ "GL Entry",
+ "Stock Ledger Entry",
+ "Repost Item Valuation",
+ "Serial and Batch Bundle",
+ )
self.update_stock_ledger()
self.make_gl_entries()
self.update_target_asset()
@@ -316,9 +325,7 @@
for d in self.stock_items:
sle = self.get_sl_entries(
d,
- {
- "actual_qty": -flt(d.stock_qty),
- },
+ {"actual_qty": -flt(d.stock_qty), "serial_and_batch_bundle": d.serial_and_batch_bundle},
)
sl_entries.append(sle)
diff --git a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py
index 4d519a6..5345d0e 100644
--- a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py
+++ b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py
@@ -16,6 +16,11 @@
get_asset_depr_schedule_doc,
)
from erpnext.stock.doctype.item.test_item import create_item
+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,
+)
class TestAssetCapitalization(unittest.TestCase):
@@ -371,14 +376,32 @@
asset_capitalization.set_posting_time = 1
if flt(args.stock_rate):
+ bundle = None
+ if args.stock_batch_no or args.stock_serial_no:
+ bundle = make_serial_batch_bundle(
+ frappe._dict(
+ {
+ "item_code": args.stock_item,
+ "warehouse": source_warehouse,
+ "company": frappe.get_cached_value("Warehouse", source_warehouse, "company"),
+ "qty": (flt(args.stock_qty) or 1) * -1,
+ "voucher_type": "Asset Capitalization",
+ "type_of_transaction": "Outward",
+ "serial_nos": args.stock_serial_no,
+ "posting_date": asset_capitalization.posting_date,
+ "posting_time": asset_capitalization.posting_time,
+ "do_not_submit": True,
+ }
+ )
+ ).name
+
asset_capitalization.append(
"stock_items",
{
"item_code": args.stock_item or "Capitalization Source Stock Item",
"warehouse": source_warehouse,
"stock_qty": flt(args.stock_qty) or 1,
- "batch_no": args.stock_batch_no,
- "serial_no": args.stock_serial_no,
+ "serial_and_batch_bundle": bundle,
},
)
diff --git a/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json b/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json
index 14eb0f6..26e1c3c 100644
--- a/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json
+++ b/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json
@@ -17,8 +17,9 @@
"valuation_rate",
"amount",
"batch_and_serial_no_section",
- "batch_no",
+ "serial_and_batch_bundle",
"column_break_13",
+ "batch_no",
"serial_no",
"accounting_dimensions_section",
"cost_center",
@@ -41,7 +42,10 @@
"fieldname": "batch_no",
"fieldtype": "Link",
"label": "Batch No",
- "options": "Batch"
+ "no_copy": 1,
+ "options": "Batch",
+ "print_hide": 1,
+ "read_only": 1
},
{
"fieldname": "section_break_6",
@@ -100,7 +104,10 @@
{
"fieldname": "serial_no",
"fieldtype": "Small Text",
- "label": "Serial No"
+ "hidden": 1,
+ "label": "Serial No",
+ "print_hide": 1,
+ "read_only": 1
},
{
"fieldname": "item_code",
@@ -139,12 +146,20 @@
{
"fieldname": "dimension_col_break",
"fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "serial_and_batch_bundle",
+ "fieldtype": "Link",
+ "label": "Serial and Batch Bundle",
+ "no_copy": 1,
+ "options": "Serial and Batch Bundle",
+ "print_hide": 1
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2021-09-08 15:56:20.230548",
+ "modified": "2023-04-06 01:10:17.947952",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Capitalization Stock Item",
@@ -152,5 +167,6 @@
"permissions": [],
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
\ No newline at end of file
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index a913ee4..f649e51 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -147,6 +147,8 @@
)
for stock_item in self.get("stock_items"):
+ self.validate_serial_no(stock_item)
+
stock_entry.append(
"items",
{
@@ -154,7 +156,7 @@
"item_code": stock_item.item_code,
"qty": stock_item.consumed_quantity,
"basic_rate": stock_item.valuation_rate,
- "serial_no": stock_item.serial_no,
+ "serial_no": stock_item.serial_and_batch_bundle,
"cost_center": self.cost_center,
"project": self.project,
},
@@ -165,6 +167,23 @@
self.db_set("stock_entry", stock_entry.name)
+ def validate_serial_no(self, stock_item):
+ if not stock_item.serial_and_batch_bundle and frappe.get_cached_value(
+ "Item", stock_item.item_code, "has_serial_no"
+ ):
+ msg = f"Serial No Bundle is mandatory for Item {stock_item.item_code}"
+ frappe.throw(msg, title=_("Missing Serial No Bundle"))
+
+ if stock_item.serial_and_batch_bundle:
+ values_to_update = {
+ "type_of_transaction": "Outward",
+ "voucher_type": "Stock Entry",
+ }
+
+ frappe.db.set_value(
+ "Serial and Batch Bundle", stock_item.serial_and_batch_bundle, values_to_update
+ )
+
def increase_stock_quantity(self):
if self.stock_entry:
stock_entry = frappe.get_doc("Stock Entry", self.stock_entry)
diff --git a/erpnext/assets/doctype/asset_repair/test_asset_repair.py b/erpnext/assets/doctype/asset_repair/test_asset_repair.py
index 90be568..c537143 100644
--- a/erpnext/assets/doctype/asset_repair/test_asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/test_asset_repair.py
@@ -4,7 +4,7 @@
import unittest
import frappe
-from frappe.utils import flt, nowdate
+from frappe.utils import flt, nowdate, nowtime, today
from erpnext.assets.doctype.asset.asset import (
get_asset_account,
@@ -19,6 +19,10 @@
get_asset_depr_schedule_doc,
)
from erpnext.stock.doctype.item.test_item import create_item
+from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
+ get_serial_nos_from_bundle,
+ make_serial_batch_bundle,
+)
class TestAssetRepair(unittest.TestCase):
@@ -88,8 +92,8 @@
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
stock_entry = make_serialized_item()
- bundle_id = stock_entry.get("items")[0].serial_no
- serial_nos = frappe.get_doc("Serial and Batch Bundle", bundle_id).get_serial_nos()
+ bundle_id = stock_entry.get("items")[0].serial_and_batch_bundle
+ serial_nos = get_serial_nos_from_bundle(bundle_id)
serial_no = serial_nos[0]
# should not raise any error
@@ -97,7 +101,7 @@
stock_consumption=1,
item_code=stock_entry.get("items")[0].item_code,
warehouse="_Test Warehouse - _TC",
- serial_no=serial_no,
+ serial_no=[serial_no],
submit=1,
)
@@ -109,7 +113,7 @@
)
asset_repair.repair_status = "Completed"
- self.assertRaises(SerialNoRequiredError, asset_repair.submit)
+ self.assertRaises(frappe.ValidationError, asset_repair.submit)
def test_increase_in_asset_value_due_to_stock_consumption(self):
asset = create_asset(calculate_depreciation=1, submit=1)
@@ -291,13 +295,32 @@
asset_repair.warehouse = args.warehouse or create_warehouse(
"Test Warehouse", company=asset.company
)
+
+ bundle = None
+ if args.serial_no:
+ bundle = make_serial_batch_bundle(
+ frappe._dict(
+ {
+ "item_code": args.item_code,
+ "warehouse": asset_repair.warehouse,
+ "company": frappe.get_cached_value("Warehouse", asset_repair.warehouse, "company"),
+ "qty": (flt(args.stock_qty) or 1) * -1,
+ "voucher_type": "Asset Repair",
+ "type_of_transaction": "Asset Repair",
+ "serial_nos": args.serial_no,
+ "posting_date": today(),
+ "posting_time": nowtime(),
+ }
+ )
+ ).name
+
asset_repair.append(
"stock_items",
{
"item_code": args.item_code or "_Test Stock Item",
"valuation_rate": args.rate if args.get("rate") is not None else 100,
"consumed_quantity": args.qty or 1,
- "serial_no": args.serial_no,
+ "serial_and_batch_bundle": bundle,
},
)
diff --git a/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json b/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
index 4685a09..6910c2e 100644
--- a/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
+++ b/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
@@ -9,7 +9,8 @@
"valuation_rate",
"consumed_quantity",
"total_value",
- "serial_no"
+ "serial_no",
+ "serial_and_batch_bundle"
],
"fields": [
{
@@ -34,7 +35,9 @@
{
"fieldname": "serial_no",
"fieldtype": "Small Text",
- "label": "Serial No"
+ "hidden": 1,
+ "label": "Serial No",
+ "print_hide": 1
},
{
"fieldname": "item_code",
@@ -42,12 +45,18 @@
"in_list_view": 1,
"label": "Item",
"options": "Item"
+ },
+ {
+ "fieldname": "serial_and_batch_bundle",
+ "fieldtype": "Link",
+ "label": "Serial and Batch Bundle",
+ "options": "Serial and Batch Bundle"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2022-02-08 17:37:20.028290",
+ "modified": "2023-04-06 02:24:20.375870",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Repair Consumed Item",
@@ -55,5 +64,6 @@
"permissions": [],
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json
index 18d8a72..77ba13a 100644
--- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json
+++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json
@@ -185,7 +185,7 @@
"fieldname": "type_of_transaction",
"fieldtype": "Select",
"label": "Type of Transaction",
- "options": "\nInward\nOutward\nMaintenance",
+ "options": "\nInward\nOutward\nMaintenance\nAsset Repair",
"reqd": 1
},
{
@@ -243,7 +243,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2023-04-03 16:22:30.767805",
+ "modified": "2023-04-06 02:35:38.404537",
"modified_by": "Administrator",
"module": "Stock",
"name": "Serial and Batch Bundle",
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 3139da8..0b7eda9 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
@@ -110,6 +110,9 @@
frappe.throw(_(message), exception, title=_("Error"))
def set_incoming_rate(self, row=None, save=False):
+ if self.type_of_transaction not in ["Inward", "Outward"]:
+ return
+
if self.type_of_transaction == "Outward":
self.set_incoming_rate_for_outward_transaction(row, save)
else:
diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py
index 53b3043..0081ccf 100644
--- a/erpnext/stock/serial_batch_bundle.py
+++ b/erpnext/stock/serial_batch_bundle.py
@@ -125,6 +125,12 @@
if self.sle.voucher_type == "Stock Entry":
child_doctype = "Stock Entry Detail"
+ if self.sle.voucher_type == "Asset Capitalization":
+ child_doctype = "Asset Capitalization Stock Item"
+
+ if self.sle.voucher_type == "Asset Repair":
+ child_doctype = "Asset Repair Consumed Item"
+
return child_doctype
def is_rejected_entry(self):