{"files":{"main.py":"from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n","core.py":"from decimal import Decimal, ROUND_HALF_UP\n\n\ndef _cents(d):\n    return int((d * 100).quantize(Decimal(1), rounding=ROUND_HALF_UP))\n\n\ndef _invoices(payload):\n    if not payload:\n        return []\n    if isinstance(payload, dict):\n        return payload.get('invoices') or []\n    return list(payload)\n\n\ndef _charge(inv, policy):\n    decs = [Decimal(str(x)) for x in (inv.get('lines') or [])]\n    if policy['rounding'] == 'per_line':\n        total = sum((_cents(d) for d in decs), 0)\n    else:\n        total = _cents(sum(decs, Decimal(0)))\n    return total + int(inv.get('fee_cents', 0) or 0)\n\n\ndef _events(inv, policy):\n    d = {}\n    for e in inv.get('events') or []:\n        k = e['eid']\n        if k in d and policy['duplicate_event'] == 'first':\n            continue\n        d[k] = e\n    evs = list(d.values())\n    if policy['refunds_first']:\n        evs = [e for e in evs if e['kind'] == 'refund'] + [e for e in evs if e['kind'] != 'refund']\n    return evs\n\n\ndef run(payload, policy):\n    out = []\n    for inv in _invoices(payload):\n        if inv.get('currency') != policy['currency']:\n            continue\n        charge = _charge(inv, policy)\n        if charge < policy['min_invoice_cents']:\n            continue\n        fee = int(inv.get('fee_cents', 0) or 0)\n        ceiling = charge if policy['fee_refundable'] else charge - fee\n        created = inv['created']\n        active = True\n        tomb = False\n        refunded = 0\n        for e in _events(inv, policy):\n            kind = e['kind']\n            if kind == 'void':\n                active = False\n                if policy['void_is_tombstone']:\n                    tomb = True\n            elif kind == 'restore':\n                if not tomb:\n                    active = True\n            elif kind == 'refund':\n                if not active:\n                    continue\n                age = e['day'] - created\n                lim = policy['max_refund_age_days']\n                ok = age >= 0 and (age <= lim if policy['inclusive_limit'] else age < lim)\n                if not ok:\n                    continue\n                c = int(e['cents'])\n                room = ceiling - refunded\n                if c > room:\n                    if policy['refund_overflow'] == 'cap':\n                        c = max(room, 0)\n                    else:\n                        continue\n                refunded += c\n        if not active:\n            status = 'void'\n        elif refunded == charge:\n            status = 'refunded'\n        else:\n            status = 'open'\n        sc = policy['status_case']\n        status = status.upper() if sc == 'upper' else status.lower()\n        out.append({'id': inv['id'], 'charge': charge, 'refunded': refunded,\n                    'balance': charge - refunded, 'status': status,\n                    '_c': created})\n    if policy['order'] == 'created':\n        out.sort(key=lambda r: (r['_c'], r['id']))\n    else:\n        out.sort(key=lambda r: r['id'])\n    for r in out:\n        del r['_c']\n    return {'invoices': out}\n","policy.py":"POLICY = {\n    'currency': 'CAD',\n    'duplicate_event': 'last',\n    'fee_refundable': False,\n    'inclusive_limit': False,\n    'max_refund_age_days': 45,\n    'min_invoice_cents': 25,\n    'order': 'created',\n    'refund_overflow': 'reject',\n    'refunds_first': False,\n    'rounding': 'invoice',\n    'status_case': 'upper',\n    'void_is_tombstone': False,\n}\n","helpers.py":"# Optional pure helper functions.\n"}}