|
|
@@ -73,7 +73,7 @@ def get_report_result(report, filters): |
|
|
|
return res |
|
|
|
|
|
|
|
@frappe.read_only() |
|
|
|
def generate_report_result(report, filters=None, user=None, custom_columns=None): |
|
|
|
def generate_report_result(report, filters=None, user=None, custom_columns=None, report_settings=None): |
|
|
|
user = user or frappe.session.user |
|
|
|
filters = filters or [] |
|
|
|
|
|
|
@@ -108,7 +108,7 @@ def generate_report_result(report, filters=None, user=None, custom_columns=None) |
|
|
|
result = get_filtered_data(report.ref_doctype, columns, result, user) |
|
|
|
|
|
|
|
if cint(report.add_total_row) and result and not skip_total_row: |
|
|
|
result = add_total_row(result, columns) |
|
|
|
result = add_total_row(result, columns, report_settings=report_settings) |
|
|
|
|
|
|
|
return { |
|
|
|
"result": result, |
|
|
@@ -210,7 +210,7 @@ def get_script(report_name): |
|
|
|
|
|
|
|
@frappe.whitelist() |
|
|
|
@frappe.read_only() |
|
|
|
def run(report_name, filters=None, user=None, ignore_prepared_report=False, custom_columns=None): |
|
|
|
def run(report_name, filters=None, user=None, ignore_prepared_report=False, custom_columns=None, report_settings=None): |
|
|
|
report = get_report_doc(report_name) |
|
|
|
if not user: |
|
|
|
user = frappe.session.user |
|
|
@@ -238,7 +238,7 @@ def run(report_name, filters=None, user=None, ignore_prepared_report=False, cust |
|
|
|
dn = "" |
|
|
|
result = get_prepared_report_result(report, filters, dn, user) |
|
|
|
else: |
|
|
|
result = generate_report_result(report, filters, user, custom_columns) |
|
|
|
result = generate_report_result(report, filters, user, custom_columns, report_settings) |
|
|
|
|
|
|
|
result["add_total_row"] = report.add_total_row and not result.get( |
|
|
|
"skip_total_row", False |
|
|
@@ -435,9 +435,19 @@ def build_xlsx_data(columns, data, visible_idx, include_indentation, ignore_visi |
|
|
|
return result, column_widths |
|
|
|
|
|
|
|
|
|
|
|
def add_total_row(result, columns, meta=None): |
|
|
|
def add_total_row(result, columns, meta=None, report_settings=None): |
|
|
|
total_row = [""] * len(columns) |
|
|
|
has_percent = [] |
|
|
|
is_tree = False |
|
|
|
parent_field = '' |
|
|
|
|
|
|
|
if report_settings: |
|
|
|
if isinstance(report_settings, (str,)): |
|
|
|
report_settings = json.loads(report_settings) |
|
|
|
|
|
|
|
is_tree = report_settings.get('tree') |
|
|
|
parent_field = report_settings.get('parent_field') |
|
|
|
|
|
|
|
for i, col in enumerate(columns): |
|
|
|
fieldtype, options, fieldname = None, None, None |
|
|
|
if isinstance(col, str): |
|
|
@@ -464,12 +474,12 @@ def add_total_row(result, columns, meta=None): |
|
|
|
for row in result: |
|
|
|
if i >= len(row): |
|
|
|
continue |
|
|
|
|
|
|
|
cell = row.get(fieldname) if isinstance(row, dict) else row[i] |
|
|
|
if fieldtype in ["Currency", "Int", "Float", "Percent", "Duration"] and flt( |
|
|
|
cell |
|
|
|
): |
|
|
|
total_row[i] = flt(total_row[i]) + flt(cell) |
|
|
|
if not (is_tree and row.get(parent_field)): |
|
|
|
total_row[i] = flt(total_row[i]) + flt(cell) |
|
|
|
|
|
|
|
if fieldtype == "Percent" and i not in has_percent: |
|
|
|
has_percent.append(i) |
|
|
|