@fantastic.dev/better-stripe 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +93 -8
  3. package/dist/client/connect/disputes.d.ts +20 -0
  4. package/dist/client/connect/disputes.d.ts.map +1 -1
  5. package/dist/client/connect/disputes.js +55 -0
  6. package/dist/client/connect/disputes.js.map +1 -1
  7. package/dist/client/costRecovery-invoices.d.ts +44 -0
  8. package/dist/client/costRecovery-invoices.d.ts.map +1 -0
  9. package/dist/client/costRecovery-invoices.js +109 -0
  10. package/dist/client/costRecovery-invoices.js.map +1 -0
  11. package/dist/client/costRecovery.d.ts +59 -2
  12. package/dist/client/costRecovery.d.ts.map +1 -1
  13. package/dist/client/costRecovery.js +73 -2
  14. package/dist/client/costRecovery.js.map +1 -1
  15. package/dist/client/errors.d.ts +1 -1
  16. package/dist/client/errors.d.ts.map +1 -1
  17. package/dist/client/errors.js.map +1 -1
  18. package/dist/client/index.d.ts +5 -14
  19. package/dist/client/index.d.ts.map +1 -1
  20. package/dist/client/index.js +4 -8
  21. package/dist/client/index.js.map +1 -1
  22. package/dist/component/_generated/component.d.ts +137 -0
  23. package/dist/component/_generated/component.d.ts.map +1 -1
  24. package/dist/component/costRecovery/claims.d.ts +12 -0
  25. package/dist/component/costRecovery/claims.d.ts.map +1 -1
  26. package/dist/component/costRecovery/claims.js +15 -8
  27. package/dist/component/costRecovery/claims.js.map +1 -1
  28. package/dist/component/costRecovery/completion.d.ts +6 -0
  29. package/dist/component/costRecovery/completion.d.ts.map +1 -1
  30. package/dist/component/costRecovery/helpers.d.ts +6 -0
  31. package/dist/component/costRecovery/helpers.d.ts.map +1 -1
  32. package/dist/component/costRecovery/imports.d.ts +53 -0
  33. package/dist/component/costRecovery/imports.d.ts.map +1 -0
  34. package/dist/component/costRecovery/imports.js +67 -0
  35. package/dist/component/costRecovery/imports.js.map +1 -0
  36. package/dist/component/costRecovery/mutations.d.ts +119 -0
  37. package/dist/component/costRecovery/mutations.d.ts.map +1 -1
  38. package/dist/component/costRecovery/mutations.js +64 -1
  39. package/dist/component/costRecovery/mutations.js.map +1 -1
  40. package/dist/component/costRecovery/queries.d.ts +18 -0
  41. package/dist/component/costRecovery/queries.d.ts.map +1 -1
  42. package/dist/component/costRecovery/reservations.d.ts +12 -0
  43. package/dist/component/costRecovery/reservations.d.ts.map +1 -1
  44. package/dist/component/costRecovery/schema.d.ts +116 -4
  45. package/dist/component/costRecovery/schema.d.ts.map +1 -1
  46. package/dist/component/costRecovery/schema.js +19 -0
  47. package/dist/component/costRecovery/schema.js.map +1 -1
  48. package/dist/component/schema.d.ts +36 -2
  49. package/dist/react/workflows/Collections.d.ts.map +1 -1
  50. package/dist/react/workflows/Collections.js +2 -1
  51. package/dist/react/workflows/Collections.js.map +1 -1
  52. package/dist/react/workflows/EvidenceUpload.d.ts +18 -0
  53. package/dist/react/workflows/EvidenceUpload.d.ts.map +1 -0
  54. package/dist/react/workflows/EvidenceUpload.js +35 -0
  55. package/dist/react/workflows/EvidenceUpload.js.map +1 -0
  56. package/dist/react/workflows/Onboarding.d.ts +3 -3
  57. package/dist/react/workflows/Onboarding.d.ts.map +1 -1
  58. package/dist/react/workflows/Onboarding.js +8 -6
  59. package/dist/react/workflows/Onboarding.js.map +1 -1
  60. package/dist/react/workflows/Refunds.d.ts +14 -3
  61. package/dist/react/workflows/Refunds.d.ts.map +1 -1
  62. package/dist/react/workflows/Refunds.js +58 -16
  63. package/dist/react/workflows/Refunds.js.map +1 -1
  64. package/dist/react/workflows/index.d.ts +5 -1
  65. package/dist/react/workflows/index.d.ts.map +1 -1
  66. package/dist/react/workflows/index.js +3 -1
  67. package/dist/react/workflows/index.js.map +1 -1
  68. package/dist/react/workflows/refund-preview.d.ts +16 -0
  69. package/dist/react/workflows/refund-preview.d.ts.map +1 -0
  70. package/dist/react/workflows/refund-preview.js +38 -0
  71. package/dist/react/workflows/refund-preview.js.map +1 -0
  72. package/dist/react/workflows/useWorkflowAction.d.ts +1 -1
  73. package/dist/react/workflows/useWorkflowAction.d.ts.map +1 -1
  74. package/dist/react/workflows/useWorkflowAction.js +6 -2
  75. package/dist/react/workflows/useWorkflowAction.js.map +1 -1
  76. package/docs/react-workflows.md +121 -4
  77. package/package.json +1 -1
  78. package/src/client/connect/dispute-upload.test.ts +208 -0
  79. package/src/client/connect/disputes.ts +103 -0
  80. package/src/client/costRecovery-import.test.ts +174 -0
  81. package/src/client/costRecovery-invoices.test.ts +470 -0
  82. package/src/client/costRecovery-invoices.transport.test.ts +107 -0
  83. package/src/client/costRecovery-invoices.ts +176 -0
  84. package/src/client/costRecovery.ts +123 -2
  85. package/src/client/errors.ts +1 -0
  86. package/src/client/index.ts +15 -14
  87. package/src/component/_generated/api.ts +2 -0
  88. package/src/component/_generated/component.ts +164 -0
  89. package/src/component/costRecovery/claims.ts +18 -8
  90. package/src/component/costRecovery/imports.ts +74 -0
  91. package/src/component/costRecovery/mutations.ts +80 -0
  92. package/src/component/costRecovery/schema.ts +21 -0
  93. package/src/react/workflows/Collections.test.tsx +36 -0
  94. package/src/react/workflows/Collections.tsx +3 -1
  95. package/src/react/workflows/EvidenceUpload.test.tsx +56 -0
  96. package/src/react/workflows/EvidenceUpload.tsx +71 -0
  97. package/src/react/workflows/Onboarding.test.tsx +73 -0
  98. package/src/react/workflows/Onboarding.tsx +8 -5
  99. package/src/react/workflows/Refunds.currency.test.tsx +290 -0
  100. package/src/react/workflows/Refunds.tsx +115 -25
  101. package/src/react/workflows/index.ts +11 -1
  102. package/src/react/workflows/refund-preview.test.ts +65 -0
  103. package/src/react/workflows/refund-preview.ts +56 -0
  104. package/src/react/workflows/useWorkflowAction.ts +6 -1
package/CHANGELOG.md CHANGED
@@ -14,6 +14,30 @@
14
14
  - Remove internal tracker references from public documentation and add a
15
15
  regression check that prevents their reintroduction.
16
16
 
17
+ ## [0.14.0](https://github.com/FantasticDevHQ/better-stripe/compare/v0.13.0...v0.14.0) (2026-10-15)
18
+
19
+ ### Features
20
+
21
+ - bind dispute evidence uploads and guard onboarding navigation ([#167](https://github.com/FantasticDevHQ/better-stripe/issues/167)) ([e52cd5d](https://github.com/FantasticDevHQ/better-stripe/commit/e52cd5dfc34d3c83a00d2f1686d07af5370b1e60))
22
+ - **recovery:** preserve verified opening collections ([#163](https://github.com/FantasticDevHQ/better-stripe/issues/163)) ([e613ac0](https://github.com/FantasticDevHQ/better-stripe/commit/e613ac0d52d1d053b4e3a54dd0394ad1e427c729))
23
+
24
+ ### Bug Fixes
25
+
26
+ - **recovery:** release unbound void invoice reservations ([#165](https://github.com/FantasticDevHQ/better-stripe/issues/165)) ([a73fd89](https://github.com/FantasticDevHQ/better-stripe/commit/a73fd893370688385fcf9dc2a8dd309d2cbd3ead))
27
+
28
+ ## [0.13.0](https://github.com/FantasticDevHQ/better-stripe/compare/v0.12.0...v0.13.0) (2026-10-15)
29
+
30
+ ### Features
31
+
32
+ - **recovery:** reconcile seller cost invoice adjustments ([#159](https://github.com/FantasticDevHQ/better-stripe/issues/159)) ([d1ffdbc](https://github.com/FantasticDevHQ/better-stripe/commit/d1ffdbcb224b6c31ae958c576a4bcd6ff4a0a4dd))
33
+
34
+ ### Bug Fixes
35
+
36
+ - **example:** bind reversal inputs to original charge currency ([#160](https://github.com/FantasticDevHQ/better-stripe/issues/160)) ([6b86926](https://github.com/FantasticDevHQ/better-stripe/commit/6b86926c7d4a173babd2964d4eee086f61c48f63))
37
+ - **example:** reconcile unsettled disputed sources ([#161](https://github.com/FantasticDevHQ/better-stripe/issues/161)) ([9c732bd](https://github.com/FantasticDevHQ/better-stripe/commit/9c732bdc88555210d2172067e6bbf5d2fc513190))
38
+ - **react:** isolate refund preview amounts by currency and status ([#162](https://github.com/FantasticDevHQ/better-stripe/issues/162)) ([601d509](https://github.com/FantasticDevHQ/better-stripe/commit/601d50923dc98f212b29fd4e4e3d856dfffbda44))
39
+ - **react:** preserve original refund currency units ([#157](https://github.com/FantasticDevHQ/better-stripe/issues/157)) ([494827f](https://github.com/FantasticDevHQ/better-stripe/commit/494827f1cb35b0b0ca10b1c6da38a1095bb32500))
40
+
17
41
  ## [0.12.0](https://github.com/FantasticDevHQ/better-stripe/compare/v0.11.0...v0.12.0) (2026-10-15)
18
42
 
19
43
  ### Features
package/README.md CHANGED
@@ -38,7 +38,7 @@ See the [customer preview setup and webhook migration guide](docs/accounts-v2-pr
38
38
 
39
39
  ## Status
40
40
 
41
- **Version**: `0.12.0` <!-- x-release-please-version --> (pre-1.0). API may change between minor versions until 1.0.
41
+ **Version**: `0.14.0` <!-- x-release-please-version --> (pre-1.0). API may change between minor versions until 1.0.
42
42
 
43
43
  Used in production by its authors. Webhook pipeline is covered by unit tests and a live E2E harness (`npm run e2e:webhooks`) that fires real Stripe-signed events and asserts the ledger.
44
44
 
@@ -337,9 +337,10 @@ Methods named `get<Entity>` take the component document ID (exception: `getInvoi
337
337
 
338
338
  ### Durable recovery claims
339
339
 
340
- `stripe.costRecovery` is a server-only bookkeeping client. It uses the Convex
341
- component. Its calls do not use Stripe credentials; normal component installation
342
- configuration still applies. It never moves money. Your host authenticates the
340
+ `stripe.costRecovery` is a server-only recovery client backed by the Convex
341
+ component. Bookkeeping methods do not use Stripe credentials or move money.
342
+ Invoice methods use the configured Stripe client and must run in an action.
343
+ Your host authenticates the
343
344
  caller, approves which costs are owed, authorizes the account and recovery scope,
344
345
  and verifies provider outcomes before confirming collection. A recovery scope is
345
346
  an application-defined liability boundary, such as one store. Amounts are signed
@@ -410,15 +411,99 @@ cumulative principal. This records a separate, source-linked rollback claim,
410
411
  preserves the original costs and collection history, and rounds positive and
411
412
  negative amounts symmetrically. Reinstated principal can reduce the rollback
412
413
  again with a newer revision. This bookkeeping operation does not refund or
413
- reverse a transfer. Invoice funding requires a provider-aware adapter; this
414
- settlement rollback helper does not infer invoice payment allocations.
414
+ reverse a transfer. For invoice groups, use the verified funding adapter below;
415
+ do not invent invoice payment allocations.
415
416
 
416
417
  Use `balance(ctx, scope)` for exact maintained totals and
417
418
  `listClaims(ctx, { ...scope, limit, cursor })` for paginated history. `getClaim`, `getGroup` and
418
419
  `getReservation` resume durable workflows. Integrate these server callbacks with
419
420
  the existing unstyled React `CostRecovery` display. These bookkeeping APIs leave
420
- consent, provider fee policy and entitlement changes in the host; provider invoice
421
- reconciliation and the example migration are separate work.
421
+ consent, provider fee policy and entitlement changes in the host.
422
+
423
+ ### Importing opening recovery balances
424
+
425
+ When moving an existing ledger into the component, your server can call
426
+ `stripe.costRecovery.importClaim(ctx, { ...observation, operationKey, collectedAmount })`.
427
+ The observation includes the authorized account/scope/currency, original charge,
428
+ gross and processing fee, approved cumulative amount due and a durable revision.
429
+ `collectedAmount` is the signed amount already verified as collected before the
430
+ cutover. The component retains that opening snapshot and computes outstanding as
431
+ amount due minus the imported collection. It does not create a Stripe payment.
432
+
433
+ Quiesce the old ledger's writers and verify its invoice and payout outcomes first.
434
+ An unpaid invoice is a reservation, not a collection; an unknown provider outcome
435
+ must stay held until reconciled. Do not import those amounts as collected or
436
+ silently release them. Authorize source identity and original provider economics
437
+ in the host before invoking this server-only bookkeeping operation.
438
+
439
+ Use one stable import operation key per claim. A replay returns the current claim
440
+ even after later observations or collections, without resetting its opening
441
+ amount. Changing the opening snapshot or source binding, reusing an operation key
442
+ for another claim, importing over a normal live claim, or introducing a new
443
+ opening balance while the scope has a pending external recovery group is rejected.
444
+ Signed credit collections and currencies stay separate. New observations continue
445
+ through `recordClaim` with newer durable revisions.
446
+
447
+ ### Invoice recovery adjustments
448
+
449
+ After authorizing the seller, invoice and liability scope, reserve with
450
+ `sourceKind: "invoice"` and `sourceId: invoiceId`. Allocate bounded batches and
451
+ seal the group before calling Stripe. Then attach exactly one signed adjustment
452
+ for the entire group:
453
+
454
+ ```ts
455
+ const receipt = await recovery.attachInvoice(ctx, { ...scope, groupKey });
456
+ // Invoke from your invoice lifecycle reconciliation, and repeat bounded completion
457
+ // until isDone after payment or release.
458
+ const result = await recovery.reconcileInvoice(ctx, {
459
+ ...scope,
460
+ groupKey,
461
+ releaseUncollectible: false,
462
+ });
463
+ ```
464
+
465
+ The invoice must belong to the authorized customer account, use the same currency,
466
+ and be draft before a new item is created. The package stores its stable group
467
+ identity before the provider call, uses that identity as the idempotency key and
468
+ item metadata, and persists the resulting item ID. Every retry scans all items
469
+ on that exact invoice, recovering a successful creation even if the subsequent
470
+ database write failed or the provider idempotency key expired. A bound item that
471
+ has been deleted, changed or duplicated requires reconciliation; the package
472
+ never silently recreates it. Negative adjustments are credits. Items are not
473
+ discountable.
474
+
475
+ Your host must durably serialize provider operations for each group, including
476
+ attachment and any calls that finish or release it. Never release a reservation
477
+ after a timeout or unknown provider outcome. Draft and open invoices retain their
478
+ reservations, blocking recovery from a second payout. A verified paid invoice
479
+ commits collection; a verified void releases the obligation for a future boundary.
480
+ If an invoice is voided before its adjustment was attached, reconciliation releases
481
+ an unbound sealed group only after scanning every item on that exact invoice.
482
+ The receipt then has `invoiceItemId: null`. A missing previously bound item, or
483
+ an absent adjustment on a paid or unpaid invoice, remains an error and keeps
484
+ reservations held.
485
+ Uncollectible invoices stay reserved unless your explicit host policy passes
486
+ `releaseUncollectible: true`. Do not use that policy while another process might
487
+ retry payment on the original invoice. Subscription cancellation alone does not
488
+ prove its invoices were voided. These methods never attempt card fallback or
489
+ change a payout schedule.
490
+
491
+ For a collected invoice fully funded by one PaymentIntent, call
492
+ `rollbackInvoice(ctx, { ...scope, groupKey, revision })`. It checks the paid
493
+ invoice, completely paginates its payments, verifies the funding charge and its
494
+ refund/dispute transactions, retains the original funding economics, and records
495
+ a separate proportional rollback claim. Use a durable revision captured before
496
+ provider reconciliation, and retry the full read on revision conflicts. Original
497
+ cost claims remain intact. Multiple payments, partial allocations, mixed customer
498
+ credits and non-PaymentIntent funding return
499
+ `{ status: "not_ready", reason: "invoice_funding_allocation_required" }` without
500
+ changing claims. Provider processing costs can also return their documented
501
+ not-ready reasons. Those cases need a host-approved allocation policy rather than
502
+ guessed amounts. Invoice integration in the example is a separate migration.
503
+
504
+ Provider methods preserve the configured API version and propagate Stripe errors.
505
+ See Stripe's [invoice item creation](https://docs.stripe.com/api/invoiceitems/create)
506
+ and [invoice item pagination](https://docs.stripe.com/api/invoiceitems/list).
422
507
 
423
508
  ### Refund and dispute processing costs
424
509
 
@@ -66,6 +66,26 @@ export declare function updateDispute(stripe: Stripe, component: Component, ctx:
66
66
  }): Promise<{
67
67
  success: true;
68
68
  }>;
69
+ /** File fields supported by Stripe dispute evidence. */
70
+ export type DisputeEvidenceFileField = "cancellation_policy" | "customer_communication" | "customer_signature" | "duplicate_charge_documentation" | "receipt" | "refund_policy" | "service_documentation" | "shipping_documentation" | "uncategorized_file";
71
+ export type DisputeEvidenceUploadOptions = {
72
+ stripeDisputeId: string;
73
+ /** Derive this on the server from the authenticated session. */
74
+ actor: RefundActor;
75
+ field: DisputeEvidenceFileField;
76
+ file: {
77
+ data: Uint8Array;
78
+ name: string;
79
+ type: "application/pdf" | "image/jpeg" | "image/png";
80
+ };
81
+ /** Request account owning the charge, distinct from the seller actor. */
82
+ stripeAccountId?: string;
83
+ };
84
+ /** Upload and attach to one authorized dispute as a draft. Never submits. */
85
+ export declare function uploadDisputeEvidence(stripe: Stripe, component: Component, ctx: RunCtx, opts: DisputeEvidenceUploadOptions): Promise<{
86
+ stripeFileId: string;
87
+ stripeDisputeId: string;
88
+ }>;
69
89
  /**
70
90
  * Accept a dispute (concede the chargeback). Irreversible.
71
91
  *
@@ -1 +1 @@
1
- {"version":3,"file":"disputes.d.ts","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"disputes.d.ts","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"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"}
@@ -82,6 +82,61 @@ export async function updateDispute(stripe, component, ctx, opts) {
82
82
  throwStripeError("DISPUTE_UPDATE_FAILED", "Failed to update dispute", err);
83
83
  }
84
84
  }
85
+ /** Upload and attach to one authorized dispute as a draft. Never submits. */
86
+ export async function uploadDisputeEvidence(stripe, component, ctx, opts) {
87
+ if (!opts.actor ||
88
+ !["admin", "seller"].includes(opts.actor.type) ||
89
+ (opts.actor.type === "seller" &&
90
+ (typeof opts.actor.accountId !== "string" ||
91
+ !opts.actor.accountId.trim())))
92
+ throwStripeError("DISPUTE_UNAUTHORIZED", "Dispute upload requires an authenticated actor");
93
+ await assertDisputeAuthorized(component, ctx, opts);
94
+ const fields = [
95
+ "cancellation_policy",
96
+ "customer_communication",
97
+ "customer_signature",
98
+ "duplicate_charge_documentation",
99
+ "receipt",
100
+ "refund_policy",
101
+ "service_documentation",
102
+ "shipping_documentation",
103
+ "uncategorized_file",
104
+ ];
105
+ const { data, name, type } = opts.file;
106
+ const signature = type === "application/pdf"
107
+ ? [37, 80, 68, 70, 45]
108
+ : type === "image/jpeg"
109
+ ? [255, 216, 255]
110
+ : type === "image/png"
111
+ ? [137, 80, 78, 71, 13, 10, 26, 10]
112
+ : [];
113
+ if (!fields.includes(opts.field) ||
114
+ !(data instanceof Uint8Array) ||
115
+ !data.byteLength ||
116
+ data.byteLength > 5_000_000 ||
117
+ !name.trim() ||
118
+ !signature.length ||
119
+ !signature.every((byte, i) => data[i] === byte))
120
+ throwStripeError("INVALID_CONFIGURATION", "Invalid dispute evidence: use a nonempty PDF, JPEG or PNG up to 5 MB with a matching MIME type and filename");
121
+ let stripeFileId;
122
+ try {
123
+ const file = await stripe.files.create({ purpose: "dispute_evidence", file: { data, name, type } }, opts.stripeAccountId
124
+ ? { stripeAccount: opts.stripeAccountId }
125
+ : undefined);
126
+ stripeFileId = file.id;
127
+ }
128
+ catch (err) {
129
+ throwStripeError("DISPUTE_UPLOAD_FAILED", "Failed to upload dispute evidence", err);
130
+ }
131
+ await updateDispute(stripe, component, ctx, {
132
+ stripeDisputeId: opts.stripeDisputeId,
133
+ actor: opts.actor,
134
+ stripeAccountId: opts.stripeAccountId,
135
+ evidence: { [opts.field]: stripeFileId },
136
+ submit: false,
137
+ });
138
+ return { stripeFileId, stripeDisputeId: opts.stripeDisputeId };
139
+ }
85
140
  /**
86
141
  * Accept a dispute (concede the chargeback). Irreversible.
87
142
  *
@@ -1 +1 @@
1
- {"version":3,"file":"disputes.js","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"disputes.js","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type Stripe from "stripe";
2
+ import type { RecoveryGroup, RecoveryScope } from "./costRecovery.js";
3
+ export type RecoveryInvoiceOptions = RecoveryScope & {
4
+ groupKey: string;
5
+ };
6
+ type InvoiceReceipt = {
7
+ group: RecoveryGroup;
8
+ invoiceItemId: string;
9
+ invoiceStatus: Stripe.Invoice["status"];
10
+ };
11
+ type BindInvoiceItem = (invoiceItemId: string) => Promise<RecoveryGroup>;
12
+ /** Attachment always produces an item; reconciliation can release an unbound void invoice. */
13
+ export declare function attachRecoveryInvoice(stripe: Stripe, group: RecoveryGroup | null, opts: RecoveryInvoiceOptions, bind: BindInvoiceItem, create?: true): Promise<InvoiceReceipt>;
14
+ export declare function attachRecoveryInvoice(stripe: Stripe, group: RecoveryGroup | null, opts: RecoveryInvoiceOptions, bind: BindInvoiceItem, create: false): Promise<InvoiceReceipt | (Omit<InvoiceReceipt, "invoiceItemId"> & {
15
+ invoiceItemId: null;
16
+ })>;
17
+ /** Refuse ambiguous cash/credit or multi-payment allocations instead of inventing economics. */
18
+ export declare function readInvoiceFunding(stripe: Stripe, group: RecoveryGroup): Promise<{
19
+ status: "not_ready";
20
+ paymentIntentId: string;
21
+ reason: import("./index.js").ProcessingCostNotReadyReason;
22
+ } | {
23
+ status: "ready";
24
+ paymentIntentId: string;
25
+ chargeId: string;
26
+ currency: string;
27
+ gross: number;
28
+ metadata: Record<string, string>;
29
+ processingFee: number;
30
+ refundFeeAdjustment: number;
31
+ disputeFeeAdjustment: number;
32
+ netFees: number;
33
+ refundedPrincipal: number;
34
+ disputedPrincipal: number;
35
+ principalReturned: number;
36
+ refunds: import("./index.js").ProcessingCostRecord[];
37
+ disputes: import("./index.js").ProcessingCostRecord[];
38
+ transactions: import("./index.js").ProcessingCostTransaction[];
39
+ } | {
40
+ status: "not_ready";
41
+ reason: "invoice_funding_allocation_required";
42
+ }>;
43
+ export {};
44
+ //# sourceMappingURL=costRecovery-invoices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costRecovery-invoices.d.ts","sourceRoot":"","sources":["../../src/client/costRecovery-invoices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAK1E,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzC,CAAC;AACF,KAAK,eAAe,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzE,8FAA8F;AAC9F,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,IAAI,EAAE,sBAAsB,EAC5B,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,IAAI,GACZ,OAAO,CAAC,cAAc,CAAC,CAAC;AAC3B,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,IAAI,EAAE,sBAAsB,EAC5B,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,KAAK,GACZ,OAAO,CACN,cAAc,GACd,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG;IAAE,aAAa,EAAE,IAAI,CAAA;CAAE,CAAC,CACpE,CAAC;AAmGF,gGAAgG;AAChG,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;YA8B/D,WAAW;YACX,qCAAqC;GAYlD"}
@@ -0,0 +1,109 @@
1
+ import { getProcessingCostContext } from "./settlement/processingCosts.js";
2
+ const marker = "bsRecoveryGroup";
3
+ const id = (value) => typeof value === "string" ? value : value?.id;
4
+ /** One immutable item per sealed group. Host serializes provider operations per group. */
5
+ export async function attachRecoveryInvoice(stripe, group, opts, bind, create = true) {
6
+ if (!group ||
7
+ group.groupKey !== opts.groupKey ||
8
+ group.sourceKind !== "invoice" ||
9
+ group.accountId !== opts.accountId ||
10
+ group.scopeKey !== opts.scopeKey ||
11
+ group.currency !== opts.currency)
12
+ throw new Error("Recovery invoice scope does not match the authorized group.");
13
+ if (group.status === "open" ||
14
+ (create && ["released", "releasing"].includes(group.status)))
15
+ throw new Error("Invoice recovery group must be sealed and active.");
16
+ const invoice = await stripe.invoices.retrieve(group.sourceId);
17
+ if (invoice.id !== group.sourceId ||
18
+ invoice.customer_account !== group.accountId)
19
+ throw new Error("Recovery invoice ownership does not match.");
20
+ if (invoice.currency !== group.currency)
21
+ throw new Error("Recovery invoice currency does not match.");
22
+ let found;
23
+ for await (const item of stripe.invoiceItems.list({
24
+ invoice: invoice.id,
25
+ limit: 100,
26
+ })) {
27
+ if (item.metadata?.[marker] !== group._id)
28
+ continue;
29
+ if (found)
30
+ throw new Error("Duplicate recovery invoice items require reconciliation.");
31
+ if (id(item.invoice) !== invoice.id ||
32
+ item.customer_account !== group.accountId ||
33
+ item.currency !== group.currency ||
34
+ item.amount !== group.amount ||
35
+ item.discountable ||
36
+ (group.invoiceItemId && group.invoiceItemId !== item.id))
37
+ throw new Error("Recovery invoice item economics or identity do not match.");
38
+ found = item;
39
+ }
40
+ if (!found) {
41
+ if (group.invoiceItemId)
42
+ throw new Error("Bound recovery invoice item is missing; reconcile before retrying.");
43
+ if (!create &&
44
+ invoice.status === "void" &&
45
+ ["sealed", "releasing", "released"].includes(group.status))
46
+ return { group, invoiceItemId: null, invoiceStatus: invoice.status };
47
+ if (!create)
48
+ throw new Error("Recovery invoice item is missing; no collection can be confirmed.");
49
+ if (group.status !== "sealed")
50
+ throw new Error("New recovery items require a sealed, uncompleted group.");
51
+ if (invoice.status !== "draft")
52
+ throw new Error("New recovery items require a draft invoice.");
53
+ found = await stripe.invoiceItems.create({
54
+ invoice: invoice.id,
55
+ customer_account: group.accountId,
56
+ currency: group.currency,
57
+ amount: group.amount,
58
+ discountable: false,
59
+ description: "Refund and dispute cost adjustment",
60
+ metadata: { [marker]: group._id },
61
+ }, { idempotencyKey: `better-stripe:recovery:${group._id}` });
62
+ }
63
+ const bound = group.invoiceItemId === found.id ? group : await bind(found.id);
64
+ return {
65
+ group: bound,
66
+ invoiceItemId: found.id,
67
+ invoiceStatus: invoice.status,
68
+ };
69
+ }
70
+ /** Refuse ambiguous cash/credit or multi-payment allocations instead of inventing economics. */
71
+ export async function readInvoiceFunding(stripe, group) {
72
+ const invoice = await stripe.invoices.retrieve(group.sourceId);
73
+ if (invoice.customer_account !== group.accountId ||
74
+ invoice.currency !== group.currency ||
75
+ invoice.status !== "paid")
76
+ throw new Error("Invoice funding ownership, currency or paid state does not match.");
77
+ const payments = [];
78
+ for await (const payment of stripe.invoicePayments.list({
79
+ invoice: group.sourceId,
80
+ limit: 100,
81
+ })) {
82
+ if (id(payment.invoice) !== group.sourceId ||
83
+ payment.currency !== group.currency)
84
+ throw new Error("Invoice payment identity or currency does not match.");
85
+ if (payment.status === "paid")
86
+ payments.push(payment);
87
+ }
88
+ const payment = payments[0];
89
+ if (payments.length !== 1 ||
90
+ payment?.payment.type !== "payment_intent" ||
91
+ !payment.payment.payment_intent ||
92
+ payment.amount_paid !== invoice.amount_paid)
93
+ return {
94
+ status: "not_ready",
95
+ reason: "invoice_funding_allocation_required",
96
+ };
97
+ const cost = await getProcessingCostContext(stripe, {
98
+ paymentIntentId: id(payment.payment.payment_intent),
99
+ });
100
+ if (cost.status === "not_ready")
101
+ return cost;
102
+ if (cost.currency !== group.currency || cost.gross !== invoice.amount_paid)
103
+ return {
104
+ status: "not_ready",
105
+ reason: "invoice_funding_allocation_required",
106
+ };
107
+ return cost;
108
+ }
109
+ //# sourceMappingURL=costRecovery-invoices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costRecovery-invoices.js","sourceRoot":"","sources":["../../src/client/costRecovery-invoices.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type Stripe from "stripe";
1
2
  import type { Component, RunCtx } from "./helpers.js";
2
3
  export type RecoveryScope = {
3
4
  accountId: string;
@@ -19,6 +20,12 @@ export type RecoveryClaim = RecoveryObservation & {
19
20
  reservedAmount: number;
20
21
  outstanding: number;
21
22
  sign: "positive" | "negative" | "zero";
23
+ openingCollection?: {
24
+ operationKey: string;
25
+ amountDue: number;
26
+ revision: number;
27
+ collectedAmount: number;
28
+ };
22
29
  };
23
30
  export type RecoveryBalance = RecoveryScope & {
24
31
  amountDue: number;
@@ -47,6 +54,12 @@ export type RecoveryGroup = RecoveryGroupOptions & {
47
54
  _creationTime: number;
48
55
  amount: number;
49
56
  pendingOperations: number;
57
+ invoiceItemId?: string;
58
+ invoiceFunding?: {
59
+ sourceChargeId: string;
60
+ sourceGross: number;
61
+ sourceProcessingFee: number;
62
+ };
50
63
  status: "open" | "sealed" | "collecting" | "releasing" | "collected" | "released";
51
64
  };
52
65
  export type RecoveryReservation = {
@@ -63,12 +76,56 @@ export type RecoveryReservation = {
63
76
  }[];
64
77
  status: "reserved" | "collected" | "released" | "empty";
65
78
  };
66
- /** Durable bookkeeping only. Host authorizes policy and verifies provider outcomes. */
79
+ /** Host authorizes policy and scope. Provider methods verify invoice outcomes. */
67
80
  export declare class CostRecoveryClient {
68
81
  private readonly component;
69
- constructor(component: Component);
82
+ private readonly provider?;
83
+ constructor(component: Component, provider?: (() => Stripe) | undefined);
70
84
  private mutate;
71
85
  private query;
86
+ /** Host authorizes the account, scope and invoice group; call from an action. */
87
+ attachInvoice(ctx: RunCtx, opts: RecoveryScope & {
88
+ groupKey: string;
89
+ }): Promise<{
90
+ group: RecoveryGroup;
91
+ invoiceItemId: string;
92
+ invoiceStatus: Stripe.Invoice["status"];
93
+ }>;
94
+ /** Re-read Stripe; keep unpaid items reserved. Repeat until isDone after terminal outcomes. */
95
+ reconcileInvoice(ctx: RunCtx, opts: RecoveryScope & {
96
+ groupKey: string;
97
+ releaseUncollectible?: boolean;
98
+ }): Promise<{
99
+ isDone: boolean;
100
+ group: RecoveryGroup;
101
+ invoiceItemId: string;
102
+ invoiceStatus: Stripe.Invoice["status"];
103
+ } | {
104
+ isDone: boolean;
105
+ group: RecoveryGroup;
106
+ invoiceStatus: Stripe.Invoice["status"];
107
+ invoiceItemId: null;
108
+ }>;
109
+ /** Reconcile a returned funding charge without changing the original cost claims. */
110
+ rollbackInvoice(ctx: RunCtx, opts: RecoveryScope & {
111
+ groupKey: string;
112
+ revision: number;
113
+ }): Promise<{
114
+ status: "not_ready";
115
+ paymentIntentId: string;
116
+ reason: import("./index.js").ProcessingCostNotReadyReason;
117
+ } | {
118
+ status: "ready";
119
+ claim: RecoveryClaim;
120
+ } | {
121
+ status: "not_ready";
122
+ reason: "invoice_funding_allocation_required";
123
+ }>;
124
+ /** Import a host-verified opening collection. Never overwrites a live claim. */
125
+ importClaim(ctx: RunCtx, opts: RecoveryObservation & {
126
+ operationKey: string;
127
+ collectedAmount: number;
128
+ }): Promise<RecoveryClaim>;
72
129
  recordClaim(ctx: RunCtx, opts: RecoveryObservation): Promise<RecoveryClaim>;
73
130
  reserve(ctx: RunCtx, opts: RecoveryGroupOptions & {
74
131
  operationKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"costRecovery.d.ts","sourceRoot":"","sources":["../../src/client/costRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtD,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;CACxC,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,CACE;IACE,UAAU,EAAE,YAAY,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GACD;IACE,UAAU,EAAE,SAAS,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CACJ,CAAC;AACJ,MAAM,MAAM,aAAa,GAAG,oBAAoB,GAAG;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EACJ,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;CAC7E,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrE,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;CACzD,CAAC;AACF,uFAAuF;AACvF,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAtC,YAA6B,SAAS,EAAE,SAAS,EAAI;YACvC,MAAM;YAWN,KAAK;IAUnB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,0BAEjD;IACD,OAAO,CACL,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,oBAAoB,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;qBAGtD,mBAAmB;eACzB,aAAa;OAEvB;IACD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,0BAE3C;IACD,MAAM,CACJ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;eAE9C,aAAa;gBAAU,OAAO;OAK3D;IACD,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,0BAGxE;IACD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,4BAEvC;IACD,UAAU,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,aAAa,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;cAIxD,aAAa,EAAE;wBACL,MAAM;gBACd,OAAO;OAKlB;IACD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,iCAE/C;IACD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,iCAE/C;IACD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,uCAEzD;CACF"}
1
+ {"version":3,"file":"costRecovery.d.ts","sourceRoot":"","sources":["../../src/client/costRecovery.ts"],"names":[],"mappings":"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"}