fix: party specific item doesnt work if there are 2 suppliers with same item

(cherry picked from commit 98f5116a09)
This commit is contained in:
Mihir Kandoi
2026-06-22 14:10:45 +05:30
committed by Mergify
parent 694ebb53ec
commit 3df7a28476

View File

@@ -216,11 +216,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
group = "Customer Group" if filters.get("customer") else "Supplier Group" group = "Customer Group" if filters.get("customer") else "Supplier Group"
item_rules_list = frappe.get_all( item_rules_list = frappe.get_all(
"Party Specific Item", "Party Specific Item",
filters={ filters={"party_type": party_type},
"party": ["!=", party], fields=["party", "restrict_based_on", "based_on_value"],
"party_type": party_type,
},
fields=["restrict_based_on", "based_on_value"],
) )
party_group_rules_list = frappe.get_all( party_group_rules_list = frappe.get_all(
@@ -229,21 +226,30 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
fields=["party as party_group", "restrict_based_on", "based_on_value"], fields=["party as party_group", "restrict_based_on", "based_on_value"],
) )
current_party_group = frappe.get_value(party_type, party, frappe.scrub(group)) current_party_group = frappe.get_value(party_type, party, frappe.scrub(group))
restricted_items = defaultdict(set)
allowed_items = defaultdict(set)
for rule in item_rules_list:
restrict_based_on = "name" if rule.restrict_based_on == "Item" else rule.restrict_based_on
if rule.party == party:
allowed_items[restrict_based_on].add(rule.based_on_value)
else:
restricted_items[restrict_based_on].add(rule.based_on_value)
for rule in party_group_rules_list: for rule in party_group_rules_list:
if current_party_group != rule.party_group: restrict_based_on = "name" if rule.restrict_based_on == "Item" else rule.restrict_based_on
item_rules_list.append(rule)
filters_dict = {} if current_party_group == rule.party_group:
for rule in item_rules_list: allowed_items[restrict_based_on].add(rule.based_on_value)
if rule["restrict_based_on"] == "Item": else:
rule["restrict_based_on"] = "name" restricted_items[restrict_based_on].add(rule.based_on_value)
filters_dict[rule.restrict_based_on] = []
for rule in item_rules_list: for field, restricted_values in restricted_items.items():
filters_dict[rule.restrict_based_on].append(rule.based_on_value) values_to_exclude = restricted_values - allowed_items[field]
if values_to_exclude:
for filter in filters_dict: filters[scrub(field)] = ["not in", list(values_to_exclude)]
filters[scrub(filter)] = ["not in", filters_dict[filter]]
if filters.get("customer"): if filters.get("customer"):
del filters["customer"] del filters["customer"]