fix: item variant with manufacturer (backport #38845) (#38847)
* fix: item variant with manufacturer (#38845)
(cherry picked from commit e0c8ff10daeed0829266aea9142805f68ceedb2b)
* chore: fix test case
---------
Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
diff --git a/erpnext/controllers/item_variant.py b/erpnext/controllers/item_variant.py
index c8785a5..ea7fb23 100644
--- a/erpnext/controllers/item_variant.py
+++ b/erpnext/controllers/item_variant.py
@@ -56,10 +56,24 @@
copy_attributes_to_variant(template, variant)
- variant.manufacturer = manufacturer
- variant.manufacturer_part_no = manufacturer_part_no
-
variant.item_code = append_number_if_name_exists("Item", template.name)
+ variant.flags.ignore_mandatory = True
+ variant.save()
+
+ if not frappe.db.exists(
+ "Item Manufacturer", {"item_code": variant.name, "manufacturer": manufacturer}
+ ):
+ manufacturer_doc = frappe.new_doc("Item Manufacturer")
+ manufacturer_doc.update(
+ {
+ "item_code": variant.name,
+ "manufacturer": manufacturer,
+ "manufacturer_part_no": manufacturer_part_no,
+ }
+ )
+
+ manufacturer_doc.flags.ignore_mandatory = True
+ manufacturer_doc.save(ignore_permissions=True)
return variant
diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py
index a942f58..b237f73 100644
--- a/erpnext/stock/doctype/item/test_item.py
+++ b/erpnext/stock/doctype/item/test_item.py
@@ -522,39 +522,25 @@
self.assertEqual(factor, 1.0)
def test_item_variant_by_manufacturer(self):
- fields = [{"field_name": "description"}, {"field_name": "variant_based_on"}]
- set_item_variant_settings(fields)
+ template = make_item(
+ "_Test Item Variant By Manufacturer", {"has_variants": 1, "variant_based_on": "Manufacturer"}
+ ).name
- if frappe.db.exists("Item", "_Test Variant Mfg"):
- frappe.delete_doc("Item", "_Test Variant Mfg")
- if frappe.db.exists("Item", "_Test Variant Mfg-1"):
- frappe.delete_doc("Item", "_Test Variant Mfg-1")
- if frappe.db.exists("Manufacturer", "MSG1"):
- frappe.delete_doc("Manufacturer", "MSG1")
+ for manufacturer in ["DFSS", "DASA", "ASAAS"]:
+ if not frappe.db.exists("Manufacturer", manufacturer):
+ m_doc = frappe.new_doc("Manufacturer")
+ m_doc.short_name = manufacturer
+ m_doc.insert()
- template = frappe.get_doc(
- dict(
- doctype="Item",
- item_code="_Test Variant Mfg",
- has_variant=1,
- item_group="Products",
- variant_based_on="Manufacturer",
- )
- ).insert()
+ self.assertFalse(frappe.db.exists("Item Manufacturer", {"manufacturer": "DFSS"}))
+ variant = get_variant(template, manufacturer="DFSS", manufacturer_part_no="DFSS-123")
- manufacturer = frappe.get_doc(dict(doctype="Manufacturer", short_name="MSG1")).insert()
+ item_manufacturer = frappe.db.exists(
+ "Item Manufacturer", {"manufacturer": "DFSS", "item_code": variant.name}
+ )
+ self.assertTrue(item_manufacturer)
- variant = get_variant(template.name, manufacturer=manufacturer.name)
- self.assertEqual(variant.item_code, "_Test Variant Mfg-1")
- self.assertEqual(variant.description, "_Test Variant Mfg")
- self.assertEqual(variant.manufacturer, "MSG1")
- variant.insert()
-
- variant = get_variant(template.name, manufacturer=manufacturer.name, manufacturer_part_no="007")
- self.assertEqual(variant.item_code, "_Test Variant Mfg-2")
- self.assertEqual(variant.description, "_Test Variant Mfg")
- self.assertEqual(variant.manufacturer, "MSG1")
- self.assertEqual(variant.manufacturer_part_no, "007")
+ frappe.delete_doc("Item Manufacturer", item_manufacturer)
def test_stock_exists_against_template_item(self):
stock_item = frappe.get_all("Stock Ledger Entry", fields=["item_code"], limit=1)