mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-31 23:33:43 +00:00
Merge pull request #57913 from frappe/mergify/bp/version-16-hotfix/pr-57911
fix: tolerate floating-point drift in sales team allocated percentage (backport #57911)
This commit is contained in:
@@ -253,7 +253,7 @@ class SellingController(StockController):
|
|||||||
|
|
||||||
total += sales_person.allocated_percentage
|
total += sales_person.allocated_percentage
|
||||||
|
|
||||||
if sales_team and total != 100.0:
|
if sales_team and flt(total, self.precision("allocated_percentage", "sales_team")) != 100.0:
|
||||||
throw(_("Total allocated percentage for sales team should be 100"))
|
throw(_("Total allocated percentage for sales team should be 100"))
|
||||||
|
|
||||||
def validate_sales_team(self, sales_team):
|
def validate_sales_team(self, sales_team):
|
||||||
|
|||||||
@@ -194,7 +194,8 @@ class Customer(TransactionBase):
|
|||||||
self.loyalty_program_tier = customer.loyalty_program_tier
|
self.loyalty_program_tier = customer.loyalty_program_tier
|
||||||
|
|
||||||
if self.sales_team:
|
if self.sales_team:
|
||||||
if sum(member.allocated_percentage or 0 for member in self.sales_team) != 100:
|
total = sum(flt(member.allocated_percentage) for member in self.sales_team)
|
||||||
|
if flt(total, self.precision("allocated_percentage", "sales_team")) != 100:
|
||||||
frappe.throw(_("Total contribution percentage should be equal to 100"))
|
frappe.throw(_("Total contribution percentage should be equal to 100"))
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
|
|||||||
@@ -2890,6 +2890,17 @@ class TestSalesOrder(ERPNextTestSuite):
|
|||||||
so = make_sales_order(item_code=fg_item, qty=10, rate=50, warehouse=fg_warehouse, do_not_save=1)
|
so = make_sales_order(item_code=fg_item, qty=10, rate=50, warehouse=fg_warehouse, do_not_save=1)
|
||||||
self.assertRaises(frappe.ValidationError, so.save)
|
self.assertRaises(frappe.ValidationError, so.save)
|
||||||
|
|
||||||
|
def test_sales_team_allocated_percentage_tolerates_floating_point_drift(self):
|
||||||
|
# 10.0 + 58.02 + 31.98 accumulates to 100.00000000000001 in binary floating point
|
||||||
|
so = make_sales_order(do_not_save=True)
|
||||||
|
for sales_person, percentage in (
|
||||||
|
("_Test Sales Person", 10.0),
|
||||||
|
("_Test Sales Person 1", 58.02),
|
||||||
|
("_Test Sales Person 2", 31.98),
|
||||||
|
):
|
||||||
|
so.append("sales_team", {"sales_person": sales_person, "allocated_percentage": percentage})
|
||||||
|
so.save()
|
||||||
|
|
||||||
|
|
||||||
def compare_payment_schedules(doc, doc1, doc2):
|
def compare_payment_schedules(doc, doc1, doc2):
|
||||||
for index, schedule in enumerate(doc1.get("payment_schedule")):
|
for index, schedule in enumerate(doc1.get("payment_schedule")):
|
||||||
|
|||||||
Reference in New Issue
Block a user