mirror of
https://github.com/frappe/erpnext.git
synced 2026-03-17 09:17:15 +00:00
fix: delete invalid pricing rule on change of applicable_for
(cherry picked from commit 42746fc630)
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from frappe.query_builder import Criterion
|
||||||
|
from frappe.query_builder.functions import IfNull
|
||||||
|
|
||||||
pricing_rule_fields = [
|
pricing_rule_fields = [
|
||||||
"apply_on",
|
"apply_on",
|
||||||
@@ -162,22 +164,50 @@ class PromotionalScheme(Document):
|
|||||||
if self.is_new():
|
if self.is_new():
|
||||||
return
|
return
|
||||||
|
|
||||||
transaction_exists = False
|
invalid_pricing_rule = self.get_invalid_pricing_rules()
|
||||||
docnames = []
|
|
||||||
|
|
||||||
# If user has changed applicable for
|
if not invalid_pricing_rule:
|
||||||
if self.get_doc_before_save() and self.get_doc_before_save().applicable_for == self.applicable_for:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
docnames = frappe.get_all("Pricing Rule", filters={"promotional_scheme": self.name})
|
if frappe.db.exists(
|
||||||
|
"Pricing Rule Detail",
|
||||||
|
{
|
||||||
|
"pricing_rule": ["in", invalid_pricing_rule],
|
||||||
|
"docstatus": ["<", 2],
|
||||||
|
},
|
||||||
|
):
|
||||||
|
raise_for_transaction_exists(self.name)
|
||||||
|
|
||||||
for docname in docnames:
|
for doc in invalid_pricing_rule:
|
||||||
if frappe.db.exists("Pricing Rule Detail", {"pricing_rule": docname.name, "docstatus": ("<", 2)}):
|
frappe.delete_doc("Pricing Rule", doc)
|
||||||
raise_for_transaction_exists(self.name)
|
|
||||||
|
|
||||||
if docnames and not transaction_exists:
|
frappe.msgprint(
|
||||||
for docname in docnames:
|
_("The following invalid Pricing Rules are deleted:")
|
||||||
frappe.delete_doc("Pricing Rule", docname.name)
|
+ "<br><br><ul><li>"
|
||||||
|
+ "</li><li>".join(invalid_pricing_rule)
|
||||||
|
+ "</li></ul>"
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_invalid_pricing_rules(self):
|
||||||
|
pr = frappe.qb.DocType("Pricing Rule")
|
||||||
|
conditions = []
|
||||||
|
conditions.append(pr.promotional_scheme == self.name)
|
||||||
|
|
||||||
|
if self.applicable_for:
|
||||||
|
applicable_for = frappe.scrub(self.applicable_for)
|
||||||
|
applicable_for_list = [d.get(applicable_for) for d in self.get(applicable_for)]
|
||||||
|
|
||||||
|
conditions.append(
|
||||||
|
(IfNull(pr.applicable_for, "") != self.applicable_for)
|
||||||
|
| (
|
||||||
|
(IfNull(pr.applicable_for, "") == self.applicable_for)
|
||||||
|
& IfNull(pr[applicable_for], "").notin(applicable_for_list)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
conditions.append(IfNull(pr.applicable_for, "") != "")
|
||||||
|
|
||||||
|
return frappe.qb.from_(pr).select(pr.name).where(Criterion.all(conditions)).run(pluck=True)
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
self.validate()
|
self.validate()
|
||||||
|
|||||||
Reference in New Issue
Block a user