Alternative Python Solution

Prev Next

Consider using the following simple Python code (as a serverless function) that replaces the whole functionality of this extension (no need for any webhook):

import pandas as pd
from txscript import TxScript, is_empty, default_to, is_set


def sum_values(values):
    """Sums values if there are any, otherwise returns an empty string (not zero)."""
    return sum(v for v in values if is_set(v)) if any(is_set(v) for v in values) else ''


def rossum_hook_request_handler(payload):
    t = TxScript.from_payload(payload)

    # Reset the target table:
    t.field.line_items_grouped = []

    # Collect all relevant data:
    data = []
    for row in t.field.line_items:
        data.append({
            "item_rate_grouped": row.item_rate.attr.value,  # Must use attr.value because of the `groupby` call!
            "item_description_grouped": row.item_description,
            "item_total_base_grouped": row.item_total_base,
            "item_tax_grouped": row.item_tax,
            "item_amount_total_grouped": row.item_amount_total,
        })

    # Group the data if any:
    if len(data) > 0:
        # https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
        t.field.line_items_grouped = (
            pd.DataFrame(data)
            .groupby('item_rate_grouped')
            .agg({
                "item_description_grouped": "first",
                "item_total_base_grouped": sum_values,
                "item_tax_grouped": sum_values,
                "item_amount_total_grouped": sum_values
            })
            .reset_index().to_dict("records")
        )

    return t.hook_response()