{"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\nfrom helpers import principal_cents, refund_ceiling\n\ndef run(payload, policy):\n    if not payload:\n        return {\"invoices\": []}\n    if isinstance(payload, list):\n        raw_invoices = payload\n    elif isinstance(payload, dict):\n        raw_invoices = payload.get(\"invoices\")\n        if raw_invoices is None:\n            raw_invoices = payload.get(\"items\", [])\n        if not raw_invoices:\n            return {\"invoices\": []}\n    else:\n        return {\"invoices\": []}\n    currency = policy.get(\"currency\")\n    rounding = policy.get(\"rounding\", \"invoice\")\n    min_invoice_cents = policy.get(\"min_invoice_cents\", 0)\n    duplicate_event = policy.get(\"duplicate_event\", \"first\")\n    refunds_first = policy.get(\"refunds_first\", False)\n    void_is_tombstone = policy.get(\"void_is_tombstone\", False)\n    max_refund_age_days = policy.get(\"max_refund_age_days\", 0)\n    inclusive_limit = policy.get(\"inclusive_limit\", False)\n    fee_refundable = policy.get(\"fee_refundable\", False)\n    refund_overflow = policy.get(\"refund_overflow\", \"reject\")\n    status_case = policy.get(\"status_case\", \"lower\")\n    order = policy.get(\"order\", \"id\")\n    prepared = []\n    for inv in raw_invoices:\n        if not isinstance(inv, dict):\n            continue\n        if inv.get(\"currency\") != currency:\n            continue\n        lines = inv.get(\"lines\") or []\n        fee = inv.get(\"fee_cents\", 0) or 0\n        fee_cents = int(fee)\n        principal = principal_cents(lines, rounding)\n        charge = principal + fee_cents\n        if charge < min_invoice_cents:\n            continue\n        created = inv.get(\"created\", 0)\n        events = inv.get(\"events\") or []\n        deduped_map = {}\n        order_keys = []\n        for ev in events:\n            if not isinstance(ev, dict):\n                continue\n            eid = ev.get(\"eid\")\n            copied = dict(ev)\n            if duplicate_event == \"last\":\n                if eid not in deduped_map:\n                    order_keys.append(eid)\n                deduped_map[eid] = copied\n            else:\n                if eid not in deduped_map:\n                    order_keys.append(eid)\n                    deduped_map[eid] = copied\n        deduped = [deduped_map[k] for k in order_keys]\n        if refunds_first:\n            deduped = [e for e in deduped if e.get(\"kind\") == \"refund\"] + [e for e in deduped if e.get(\"kind\") != \"refund\"]\n        active = True\n        tombstone = False\n        refunded = 0\n        ceiling = refund_ceiling(principal, fee_cents, fee_refundable)\n        for ev in deduped:\n            kind = ev.get(\"kind\")\n            if kind == \"void\":\n                active = False\n                if void_is_tombstone:\n                    tombstone = True\n            elif kind == \"restore\":\n                if not tombstone:\n                    active = True\n            elif kind == \"refund\":\n                if not active:\n                    continue\n                day = ev.get(\"day\", 0)\n                diff = day - created\n                if diff < 0:\n                    continue\n                if inclusive_limit:\n                    if diff > max_refund_age_days:\n                        continue\n                else:\n                    if diff >= max_refund_age_days:\n                        continue\n                cents = int(ev.get(\"cents\", 0) or 0)\n                if refunded + cents > ceiling:\n                    if refund_overflow == \"cap\":\n                        allowed = ceiling - refunded\n                        if allowed > 0:\n                            refunded += allowed\n                    else:\n                        continue\n                else:\n                    refunded += cents\n        if not active:\n            status = \"void\"\n        elif refunded == charge:\n            status = \"refunded\"\n        else:\n            status = \"open\"\n        if status_case == \"upper\":\n            status = status.upper()\n        elif status_case == \"lower\":\n            status = status.lower()\n        result = {\"id\": inv.get(\"id\"), \"charge\": charge, \"refunded\": refunded, \"balance\": charge - refunded, \"status\": status}\n        prepared.append((created, inv.get(\"id\"), result))\n    if order == \"created\":\n        prepared.sort(key=lambda x: (x[0], x[1]))\n    else:\n        prepared.sort(key=lambda x: x[1])\n    return {\"invoices\": [r for _, _, r in prepared]}\n", "policy.py": "POLICY = {\"currency\": \"CAD\", \"rounding\": \"invoice\", \"duplicate_event\": \"last\", \"inclusive_limit\": False, \"max_refund_age_days\": 45, \"refunds_first\": False, \"refund_overflow\": \"reject\", \"void_is_tombstone\": False, \"order\": \"created\", \"fee_refundable\": False, \"min_invoice_cents\": 25, \"status_case\": \"upper\"}\n", "helpers.py": "from decimal import Decimal, ROUND_HALF_UP\n\ndef _to_decimal(value):\n    return Decimal(str(value))\n\ndef principal_cents(lines, rounding):\n    if rounding == \"per_line\":\n        total = 0\n        for line in lines:\n            cents = (_to_decimal(line) * Decimal(100)).quantize(Decimal(\"1\"), rounding=ROUND_HALF_UP)\n            total += int(cents)\n        return total\n    total_dollars = Decimal(0)\n    for line in lines:\n        total_dollars += _to_decimal(line)\n    cents = (total_dollars * Decimal(100)).quantize(Decimal(\"1\"), rounding=ROUND_HALF_UP)\n    return int(cents)\n\ndef refund_ceiling(principal, fee_cents, fee_refundable):\n    return principal + (fee_cents if fee_refundable else 0)\n"}}