mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-23 15:09:20 +00:00
Merge pull request #29913 from marination/item-merge-bundles
fix: Block merging items if both have product bundles
This commit is contained in:
@@ -398,6 +398,7 @@ class Item(Document):
|
|||||||
|
|
||||||
if merge:
|
if merge:
|
||||||
self.validate_properties_before_merge(new_name)
|
self.validate_properties_before_merge(new_name)
|
||||||
|
self.validate_duplicate_product_bundles_before_merge(old_name, new_name)
|
||||||
self.validate_duplicate_website_item_before_merge(old_name, new_name)
|
self.validate_duplicate_website_item_before_merge(old_name, new_name)
|
||||||
|
|
||||||
def after_rename(self, old_name, new_name, merge):
|
def after_rename(self, old_name, new_name, merge):
|
||||||
@@ -462,6 +463,20 @@ class Item(Document):
|
|||||||
msg += ": \n" + ", ".join([self.meta.get_label(fld) for fld in field_list])
|
msg += ": \n" + ", ".join([self.meta.get_label(fld) for fld in field_list])
|
||||||
frappe.throw(msg, title=_("Cannot Merge"), exc=DataValidationError)
|
frappe.throw(msg, title=_("Cannot Merge"), exc=DataValidationError)
|
||||||
|
|
||||||
|
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})
|
||||||
|
new_bundle = frappe.get_value("Product Bundle",filters={"new_item_code": new_name})
|
||||||
|
|
||||||
|
if old_bundle and new_bundle:
|
||||||
|
bundle_link = get_link_to_form("Product Bundle", old_bundle)
|
||||||
|
old_name, new_name = frappe.bold(old_name), frappe.bold(new_name)
|
||||||
|
|
||||||
|
msg = _("Please delete Product Bundle {0}, before merging {1} into {2}").format(
|
||||||
|
bundle_link, old_name, new_name
|
||||||
|
)
|
||||||
|
frappe.throw(msg, title=_("Cannot Merge"), exc=DataValidationError)
|
||||||
|
|
||||||
def validate_duplicate_website_item_before_merge(self, old_name, new_name):
|
def validate_duplicate_website_item_before_merge(self, old_name, new_name):
|
||||||
"""
|
"""
|
||||||
Block merge if both old and new items have website items against them.
|
Block merge if both old and new items have website items against them.
|
||||||
@@ -479,8 +494,9 @@ class Item(Document):
|
|||||||
|
|
||||||
old_web_item = [d.get("name") for d in web_items if d.get("item_code") == old_name][0]
|
old_web_item = [d.get("name") for d in web_items if d.get("item_code") == old_name][0]
|
||||||
web_item_link = get_link_to_form("Website Item", old_web_item)
|
web_item_link = get_link_to_form("Website Item", old_web_item)
|
||||||
|
old_name, new_name = frappe.bold(old_name), frappe.bold(new_name)
|
||||||
|
|
||||||
msg = f"Please delete linked Website Item {frappe.bold(web_item_link)} before merging {old_name} and {new_name}"
|
msg = f"Please delete linked Website Item {frappe.bold(web_item_link)} before merging {old_name} into {new_name}"
|
||||||
frappe.throw(_(msg), title=_("Cannot Merge"), exc=DataValidationError)
|
frappe.throw(_(msg), title=_("Cannot Merge"), exc=DataValidationError)
|
||||||
|
|
||||||
def set_last_purchase_rate(self, new_name):
|
def set_last_purchase_rate(self, new_name):
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ from erpnext.controllers.item_variant import (
|
|||||||
get_variant,
|
get_variant,
|
||||||
)
|
)
|
||||||
from erpnext.stock.doctype.item.item import (
|
from erpnext.stock.doctype.item.item import (
|
||||||
|
DataValidationError,
|
||||||
InvalidBarcode,
|
InvalidBarcode,
|
||||||
StockExistsForTemplate,
|
StockExistsForTemplate,
|
||||||
get_item_attribute,
|
get_item_attribute,
|
||||||
@@ -388,6 +389,26 @@ class TestItem(ERPNextTestCase):
|
|||||||
self.assertTrue(frappe.db.get_value("Bin",
|
self.assertTrue(frappe.db.get_value("Bin",
|
||||||
{"item_code": "Test Item for Merging 2", "warehouse": "_Test Warehouse 1 - _TC"}))
|
{"item_code": "Test Item for Merging 2", "warehouse": "_Test Warehouse 1 - _TC"}))
|
||||||
|
|
||||||
|
def test_item_merging_with_product_bundle(self):
|
||||||
|
from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle
|
||||||
|
|
||||||
|
create_item("Test Item Bundle Item 1", is_stock_item=False)
|
||||||
|
create_item("Test Item Bundle Item 2", is_stock_item=False)
|
||||||
|
create_item("Test Item inside Bundle")
|
||||||
|
bundle_items = ["Test Item inside Bundle"]
|
||||||
|
|
||||||
|
# make bundles for both items
|
||||||
|
bundle1 = make_product_bundle("Test Item Bundle Item 1", bundle_items, qty=2)
|
||||||
|
make_product_bundle("Test Item Bundle Item 2", bundle_items, qty=2)
|
||||||
|
|
||||||
|
with self.assertRaises(DataValidationError):
|
||||||
|
frappe.rename_doc("Item", "Test Item Bundle Item 1", "Test Item Bundle Item 2", merge=True)
|
||||||
|
|
||||||
|
bundle1.delete()
|
||||||
|
frappe.rename_doc("Item", "Test Item Bundle Item 1", "Test Item Bundle Item 2", merge=True)
|
||||||
|
|
||||||
|
self.assertFalse(frappe.db.exists("Item", "Test Item Bundle Item 1"))
|
||||||
|
|
||||||
def test_uom_conversion_factor(self):
|
def test_uom_conversion_factor(self):
|
||||||
if frappe.db.exists('Item', 'Test Item UOM'):
|
if frappe.db.exists('Item', 'Test Item UOM'):
|
||||||
frappe.delete_doc('Item', 'Test Item UOM')
|
frappe.delete_doc('Item', 'Test Item UOM')
|
||||||
|
|||||||
Reference in New Issue
Block a user