chore: calculate in python code

This commit is contained in:
David
2024-09-04 21:46:34 +02:00
parent 5b3e0c5543
commit 00b70d7654

View File

@@ -467,6 +467,39 @@ class StatusUpdater(Document):
where name='{detail_id}'""".format(**args) where name='{detail_id}'""".format(**args)
) )
@staticmethod
def _calculate_target_parent_percentage(
name, target_parent_dt, target_dt, target_ref_field, target_field
):
child_records = frappe.get_all(
target_dt,
filters={"parent": name, "parenttype": target_parent_dt},
fields=[target_ref_field, target_field],
)
sum_ref = sum(abs(record[target_ref_field]) for record in child_records)
if sum_ref > 0:
percentage = round(
sum(min(abs(record[target_field]), abs(record[target_ref_field])) for record in child_records)
/ sum_ref
* 100,
6,
)
else:
percentage = 0
return percentage
@staticmethod
def _determine_status(percentage, keyword):
if percentage < 0.001:
return f"Not {keyword}"
elif percentage >= 99.999999:
return f"Fully {keyword}"
else:
return f"Partly {keyword}"
def _update_percent_field_in_targets(self, args, update_modified=True): def _update_percent_field_in_targets(self, args, update_modified=True):
"""Update percent field in parent transaction""" """Update percent field in parent transaction"""
if args.get("percent_join_field_parent"): if args.get("percent_join_field_parent"):
@@ -490,25 +523,27 @@ class StatusUpdater(Document):
self._update_modified(args, update_modified) self._update_modified(args, update_modified)
if args.get("target_parent_field"): if args.get("target_parent_field"):
percentage = self._calculate_target_parent_percentage(
args["name"],
args["target_parent_dt"],
args["target_dt"],
args["target_ref_field"],
args["target_field"],
)
frappe.db.sql( frappe.db.sql(
"""update `tab{target_parent_dt}` """update `tab{target_parent_dt}`
set {target_parent_field} = round( set {target_parent_field} = {percentage}
ifnull((select
ifnull(sum(case when abs({target_ref_field}) > abs({target_field}) then abs({target_field}) else abs({target_ref_field}) end), 0)
/ sum(abs({target_ref_field})) * 100
from `tab{target_dt}` where parent='{name}' and parenttype='{target_parent_dt}' having sum(abs({target_ref_field})) > 0), 0), 6)
{update_modified} {update_modified}
where name='{name}'""".format(**args) where name='{name}'""".format(percentage=percentage, **args)
) )
# update field # update field
if args.get("status_field"): if args.get("status_field"):
status = self._determine_status(percentage, args["keyword"])
frappe.db.sql( frappe.db.sql(
"""update `tab{target_parent_dt}` """update `tab{target_parent_dt}`
set {status_field} = (case when {target_parent_field}<0.001 then 'Not {keyword}' set {status_field} = '{status}'
else case when {target_parent_field}>=99.999999 then 'Fully {keyword}' where name='{name}'""".format(status=status, **args)
else 'Partly {keyword}' end end)
where name='{name}'""".format(**args)
) )
if update_modified: if update_modified: