chore: calculate in python code
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user