{"files": {"main.py": "from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n", "core.py": "from helpers import principal_cents, extract_amount_cents, sort_key_id\n\ndef run(payload, policy):\n    if not payload:\n        return {\"invoices\": []}\n    if isinstance(payload, dict):\n        if \"invoices\" in payload:\n            invoices_in = payload.get(\"invoices\") or []\n        elif \"id\" in payload:\n            invoices_in = [payload]\n        else:\n            invoices_in = []\n    elif isinstance(payload, (list, tuple)):\n        invoices_in = list(payload)\n    else:\n        return {\"invoices\": []}\n    currency = policy.get(\"currency\")\n    rounding = policy.get(\"rounding\", \"per_line\")\n    min_charge = policy.get(\"min_invoice_cents\", 0)\n    duplicate_event = policy.get(\"duplicate_event\", \"first\")\n    refunds_first = policy.get(\"refunds_first\", False)\n    fee_refundable = policy.get(\"fee_refundable\", False)\n    inclusive = policy.get(\"inclusive_limit\", False)\n    max_age = policy.get(\"max_refund_age_days\", 0)\n    overflow = policy.get(\"refund_overflow\", \"cap\")\n    tombstone_enabled = policy.get(\"void_is_tombstone\", False)\n    status_case = policy.get(\"status_case\", \"lower\")\n    order = policy.get(\"order\", \"id\")\n    collected = []\n    for inv in invoices_in:\n        if not isinstance(inv, dict):\n            continue\n        if inv.get(\"currency\") != currency:\n            continue\n        lines = inv.get(\"lines\") or []\n        principal = principal_cents(lines, rounding)\n        fee = inv.get(\"fee_cents\", 0)\n        try:\n            fee = int(fee)\n        except Exception:\n            fee = 0\n        charge = principal + fee\n        if charge < min_charge:\n            continue\n        created = inv.get(\"created\", inv.get(\"created_day\", 0))\n        try:\n            created_val = int(created)\n        except Exception:\n            created_val = 0\n        events_in = inv.get(\"events\") or []\n        deduped_map = {}\n        for idx, ev in enumerate(events_in):\n            if not isinstance(ev, dict):\n                continue\n            if \"eid\" in ev:\n                eid = ev.get(\"eid\")\n            elif \"id\" in ev:\n                eid = ev.get(\"id\")\n            else:\n                eid = (\"__missing__\", idx)\n            try:\n                hash(eid)\n                key = eid\n            except Exception:\n                key = (\"__unhashable__\", idx)\n            if key not in deduped_map:\n                deduped_map[key] = ev\n            elif duplicate_event == \"last\":\n                deduped_map[key] = ev\n            else:\n                pass\n        events = list(deduped_map.values())\n        if refunds_first:\n            refunds = [e for e in events if (e.get(\"kind\") or e.get(\"type\")) == \"refund\"]\n            others = [e for e in events if (e.get(\"kind\") or e.get(\"type\")) != \"refund\"]\n            events = refunds + others\n        active = True\n        tombstoned = False\n        refunded = 0\n        ceiling = charge if fee_refundable else principal\n        for ev in events:\n            kind = ev.get(\"kind\") or ev.get(\"type\")\n            if kind == \"void\":\n                active = False\n                if tombstone_enabled:\n                    tombstoned = True\n            elif kind == \"restore\":\n                if not tombstoned:\n                    active = True\n            elif kind == \"refund\":\n                if not active:\n                    continue\n                day = ev.get(\"day\")\n                if day is None:\n                    continue\n                try:\n                    diff = int(day) - created_val\n                except Exception:\n                    continue\n                if diff < 0:\n                    continue\n                if inclusive:\n                    if diff > max_age:\n                        continue\n                else:\n                    if diff >= max_age:\n                        continue\n                cents = extract_amount_cents(ev)\n                if overflow == \"cap\":\n                    remaining = ceiling - refunded\n                    if remaining <= 0:\n                        continue\n                    refunded += cents if cents < remaining else remaining\n                else:\n                    if refunded + cents > ceiling:\n                        continue\n                    refunded += cents\n            else:\n                continue\n        if not active:\n            status = \"void\"\n        elif refunded == charge:\n            status = \"refunded\"\n        else:\n            status = \"open\"\n        if isinstance(status_case, str) and status_case.lower() == \"upper\":\n            status = status.upper()\n        else:\n            status = status.lower()\n        result = {\"id\": inv.get(\"id\"), \"charge\": charge, \"refunded\": refunded, \"balance\": charge - refunded, \"status\": status}\n        collected.append((created_val, result))\n    if order == \"id\":\n        try:\n            collected_sorted = sorted(collected, key=lambda pair: sort_key_id(pair[1].get(\"id\")))\n        except Exception:\n            collected_sorted = sorted(collected, key=lambda pair: str(pair[1].get(\"id\")))\n    else:\n        try:\n            collected_sorted = sorted(collected, key=lambda pair: (pair[0], sort_key_id(pair[1].get(\"id\"))))\n        except Exception:\n            collected_sorted = sorted(collected, key=lambda pair: (pair[0], str(pair[1].get(\"id\"))))\n    return {\"invoices\": [r for _, r in collected_sorted]}\n", "policy.py": "POLICY = {\"currency\": \"USD\", \"duplicate_event\": \"first\", \"fee_refundable\": True, \"inclusive_limit\": True, \"max_refund_age_days\": 30, \"min_invoice_cents\": 10, \"order\": \"id\", \"refund_overflow\": \"cap\", \"refunds_first\": True, \"rounding\": \"per_line\", \"status_case\": \"lower\", \"void_is_tombstone\": True}\n", "helpers.py": "from decimal import Decimal, ROUND_HALF_UP\n\ndef _line_value(line):\n    if isinstance(line, dict):\n        for k in (\"amount\", \"price\", \"value\", \"dollars\", \"line\"):\n            if k in line:\n                return line[k]\n        return 0\n    return line\n\ndef _to_decimal(value):\n    if isinstance(value, Decimal):\n        return value\n    return Decimal(str(value))\n\ndef principal_cents(lines, rounding):\n    vals = [_to_decimal(_line_value(x)) for x in (lines or [])]\n    if rounding == \"per_line\":\n        total = 0\n        for v in vals:\n            total += int((v * Decimal(\"100\")).quantize(Decimal(\"1\"), rounding=ROUND_HALF_UP))\n        return total\n    s = sum(vals, Decimal(\"0\"))\n    return int((s * Decimal(\"100\")).quantize(Decimal(\"1\"), rounding=ROUND_HALF_UP))\n\ndef extract_amount_cents(ev):\n    v = ev.get(\"cents\", ev.get(\"amount_cents\", ev.get(\"amount\", 0)))\n    try:\n        return int(v)\n    except Exception:\n        return 0\n\ndef sort_key_id(v):\n    return v\n"}}