@fantastic.dev/better-stripe 0.28.5 → 0.29.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 (137) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/MIGRATION.md +6 -0
  3. package/README.md +7 -1
  4. package/dist/client/connect/payoutAdoptionTestHelpers.d.ts +28 -8
  5. package/dist/client/connect/payoutAdoptionTestHelpers.d.ts.map +1 -1
  6. package/dist/client/connect/payoutCollectedInput.d.ts +110 -0
  7. package/dist/client/connect/payoutCollectedInput.d.ts.map +1 -0
  8. package/dist/client/connect/payoutCollectedInput.js +70 -0
  9. package/dist/client/connect/payoutCollectedInput.js.map +1 -0
  10. package/dist/client/connect/payoutExecution.d.ts +1 -0
  11. package/dist/client/connect/payoutExecution.d.ts.map +1 -1
  12. package/dist/client/connect/payoutExecution.js +94 -67
  13. package/dist/client/connect/payoutExecution.js.map +1 -1
  14. package/dist/client/connect/payoutExecutionTestHelpers.d.ts +16 -4
  15. package/dist/client/connect/payoutExecutionTestHelpers.d.ts.map +1 -1
  16. package/dist/client/connect/payoutExecutionTestHelpers.js +9 -6
  17. package/dist/client/connect/payoutExecutionTestHelpers.js.map +1 -1
  18. package/dist/client/connect/payoutPreview.d.ts +1 -0
  19. package/dist/client/connect/payoutPreview.d.ts.map +1 -1
  20. package/dist/client/connect/payoutPreview.js +31 -19
  21. package/dist/client/connect/payoutPreview.js.map +1 -1
  22. package/dist/client/connect/payoutQualification.d.ts +7 -1
  23. package/dist/client/connect/payoutQualification.d.ts.map +1 -1
  24. package/dist/client/connect/payoutQualification.js +39 -20
  25. package/dist/client/connect/payoutQualification.js.map +1 -1
  26. package/dist/client/connect/payoutSyncTestHelpers.d.ts +14 -4
  27. package/dist/client/connect/payoutSyncTestHelpers.d.ts.map +1 -1
  28. package/dist/client/connect/payoutWorker.d.ts.map +1 -1
  29. package/dist/client/connect/payoutWorker.js +4 -1
  30. package/dist/client/connect/payoutWorker.js.map +1 -1
  31. package/dist/client/costRecovery.d.ts +5 -0
  32. package/dist/client/costRecovery.d.ts.map +1 -1
  33. package/dist/client/costRecovery.js +5 -0
  34. package/dist/client/costRecovery.js.map +1 -1
  35. package/dist/client/payoutPolicy.d.ts +4 -0
  36. package/dist/client/payoutPolicy.d.ts.map +1 -1
  37. package/dist/component/_generated/component.d.ts +175 -0
  38. package/dist/component/_generated/component.d.ts.map +1 -1
  39. package/dist/component/costRecovery/mutations.js +1 -1
  40. package/dist/component/costRecovery/queries.d.ts +9 -0
  41. package/dist/component/costRecovery/queries.d.ts.map +1 -1
  42. package/dist/component/costRecovery/queries.js +20 -0
  43. package/dist/component/costRecovery/queries.js.map +1 -1
  44. package/dist/component/earnings/triggers.d.ts +16 -6
  45. package/dist/component/earnings/triggers.d.ts.map +1 -1
  46. package/dist/component/payoutRelease/adoption.d.ts +6 -0
  47. package/dist/component/payoutRelease/adoption.d.ts.map +1 -1
  48. package/dist/component/payoutRelease/helpers.d.ts +4 -1
  49. package/dist/component/payoutRelease/helpers.d.ts.map +1 -1
  50. package/dist/component/payoutRelease/helpers.js +18 -10
  51. package/dist/component/payoutRelease/helpers.js.map +1 -1
  52. package/dist/component/payoutRelease/mutations.d.ts +20 -0
  53. package/dist/component/payoutRelease/mutations.d.ts.map +1 -1
  54. package/dist/component/payoutRelease/mutations.js +14 -2
  55. package/dist/component/payoutRelease/mutations.js.map +1 -1
  56. package/dist/component/payoutRelease/planning.d.ts +4 -0
  57. package/dist/component/payoutRelease/planning.d.ts.map +1 -1
  58. package/dist/component/payoutRelease/planning.js +4 -2
  59. package/dist/component/payoutRelease/planning.js.map +1 -1
  60. package/dist/component/payoutRelease/preview.d.ts +2 -0
  61. package/dist/component/payoutRelease/preview.d.ts.map +1 -1
  62. package/dist/component/payoutRelease/preview.js +5 -1
  63. package/dist/component/payoutRelease/preview.js.map +1 -1
  64. package/dist/component/payoutRelease/queries.d.ts +11 -0
  65. package/dist/component/payoutRelease/queries.d.ts.map +1 -1
  66. package/dist/component/payoutRelease/schema.d.ts +17 -2
  67. package/dist/component/payoutRelease/schema.d.ts.map +1 -1
  68. package/dist/component/payoutRelease/schema.js +3 -0
  69. package/dist/component/payoutRelease/schema.js.map +1 -1
  70. package/dist/component/payoutSnapshots/financial.d.ts +35 -0
  71. package/dist/component/payoutSnapshots/financial.d.ts.map +1 -0
  72. package/dist/component/payoutSnapshots/financial.js +89 -0
  73. package/dist/component/payoutSnapshots/financial.js.map +1 -0
  74. package/dist/component/payoutSnapshots/liabilities.d.ts +7 -0
  75. package/dist/component/payoutSnapshots/liabilities.d.ts.map +1 -0
  76. package/dist/component/payoutSnapshots/liabilities.js +18 -0
  77. package/dist/component/payoutSnapshots/liabilities.js.map +1 -0
  78. package/dist/component/payoutSnapshots/localState.d.ts +2 -0
  79. package/dist/component/payoutSnapshots/localState.d.ts.map +1 -1
  80. package/dist/component/payoutSnapshots/localState.js +6 -3
  81. package/dist/component/payoutSnapshots/localState.js.map +1 -1
  82. package/dist/component/payoutSnapshots/mutations.d.ts +6 -0
  83. package/dist/component/payoutSnapshots/mutations.d.ts.map +1 -1
  84. package/dist/component/payoutSnapshots/mutations.js +2 -0
  85. package/dist/component/payoutSnapshots/mutations.js.map +1 -1
  86. package/dist/component/payoutSnapshots/queries.d.ts +133 -0
  87. package/dist/component/payoutSnapshots/queries.d.ts.map +1 -0
  88. package/dist/component/payoutSnapshots/queries.js +84 -0
  89. package/dist/component/payoutSnapshots/queries.js.map +1 -0
  90. package/dist/component/payoutSnapshots/revisions.d.ts.map +1 -1
  91. package/dist/component/payoutSnapshots/revisions.js +19 -0
  92. package/dist/component/payoutSnapshots/revisions.js.map +1 -1
  93. package/dist/component/payoutSnapshots/schema.d.ts +15 -5
  94. package/dist/component/payoutSnapshots/schema.d.ts.map +1 -1
  95. package/dist/component/payoutSnapshots/schema.js +3 -1
  96. package/dist/component/payoutSnapshots/schema.js.map +1 -1
  97. package/dist/component/payoutWorker/mutations.d.ts.map +1 -1
  98. package/dist/component/payoutWorker/mutations.js +3 -1
  99. package/dist/component/payoutWorker/mutations.js.map +1 -1
  100. package/dist/component/schema.d.ts +14 -4
  101. package/dist/react/workflows/payout-attempt-state.d.ts.map +1 -1
  102. package/dist/react/workflows/payout-attempt-state.js +3 -0
  103. package/dist/react/workflows/payout-attempt-state.js.map +1 -1
  104. package/dist/react/workflows/payout-progress-state.d.ts.map +1 -1
  105. package/dist/react/workflows/payout-progress-state.js +3 -0
  106. package/dist/react/workflows/payout-progress-state.js.map +1 -1
  107. package/docs/settlement.md +84 -17
  108. package/package.json +1 -1
  109. package/src/client/connect/payoutCollectedInput.ts +120 -0
  110. package/src/client/connect/payoutExecution.ts +116 -84
  111. package/src/client/connect/payoutExecutionTestHelpers.ts +19 -6
  112. package/src/client/connect/payoutLargeHistory.test.ts +222 -0
  113. package/src/client/connect/payoutLiabilityVersion.test.ts +221 -0
  114. package/src/client/connect/payoutPreview.ts +43 -23
  115. package/src/client/connect/payoutQualification.ts +69 -22
  116. package/src/client/connect/payoutQualificationFreshness.test.ts +192 -0
  117. package/src/client/connect/payoutWorker.ts +4 -1
  118. package/src/client/costRecovery.ts +8 -0
  119. package/src/component/_generated/api.ts +6 -0
  120. package/src/component/_generated/component.ts +203 -0
  121. package/src/component/costRecovery/mutations.ts +1 -1
  122. package/src/component/costRecovery/queries.ts +21 -0
  123. package/src/component/payoutRelease/helpers.ts +21 -11
  124. package/src/component/payoutRelease/mutations.ts +25 -2
  125. package/src/component/payoutRelease/planning.ts +8 -1
  126. package/src/component/payoutRelease/preview.ts +5 -1
  127. package/src/component/payoutRelease/schema.ts +3 -0
  128. package/src/component/payoutSnapshots/financial.ts +121 -0
  129. package/src/component/payoutSnapshots/liabilities.ts +25 -0
  130. package/src/component/payoutSnapshots/localState.ts +7 -3
  131. package/src/component/payoutSnapshots/mutations.ts +2 -0
  132. package/src/component/payoutSnapshots/queries.ts +102 -0
  133. package/src/component/payoutSnapshots/revisions.ts +26 -0
  134. package/src/component/payoutSnapshots/schema.ts +3 -0
  135. package/src/component/payoutWorker/mutations.ts +3 -1
  136. package/src/react/workflows/payout-attempt-state.ts +6 -0
  137. package/src/react/workflows/payout-progress-state.ts +6 -0
@@ -1 +1 @@
1
- {"version":3,"file":"payout-progress-state.d.ts","sourceRoot":"","sources":["../../../src/react/workflows/payout-progress-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"payout-progress-state.d.ts","sourceRoot":"","sources":["../../../src/react/workflows/payout-progress-state.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,9 @@ const reasons = {
9
9
  payout_unidentified: "A previous payout outcome needs reconciliation. No replacement payout will be created blindly.",
10
10
  observations_stale: "Provider observations expired. Refresh the assessment.",
11
11
  expired: "The custom holding deadline has passed. Eligibility is unavailable until the payout schedule is restored and verified.",
12
+ collection_pending: "Complete payout history is still being collected. This collection has not requested a new bank payout; the automatic worker will resume the same collection.",
13
+ collection_invalidated: "Payout history changed during collection. A fresh assessment is required before funds can qualify.",
14
+ collection_requires_action: "This account requires a server action to collect its complete payout history.",
12
15
  snapshot_limit: "This account needs continued history reconciliation before eligibility can be assessed.",
13
16
  policy_changed: "Payout settings changed. Refresh the assessment.",
14
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"payout-progress-state.js","sourceRoot":"","sources":["../../../src/react/workflows/payout-progress-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"payout-progress-state.js","sourceRoot":"","sources":["../../../src/react/workflows/payout-progress-state.ts"],"names":[],"mappings":"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"}
@@ -479,13 +479,13 @@ is canceled on replay, and a new scheduled operation can collect fresh receipts.
479
479
  Below-threshold money remains owed. The numeric provider floor remains `null`
480
480
  unless a supported provider contract exposes it.
481
481
 
482
- Current atomic collection accepts up to 100 account transfers and 100 historical
483
- claims. Larger accounts return `held/snapshot_limit`, without paying a partial
484
- page. Provider history uses a 1–100 page budget, default 10; exhaustion stays held.
485
- Use the historical import and funded activation flow below for known old funds.
486
- Resumable larger-account collection, independent provider-debit allocation,
487
- recurring example jobs and React controls remain integration work. Unknown funds
488
- and unsupported accounts keep explicit migration holds.
482
+ The direct component snapshot remains bounded at 100 source/claim rows. The SDK
483
+ switches to a complete paginated manifest above that boundary and binds its
484
+ verified membership to the financial claim. It never pays from a partial page.
485
+ Provider history uses a 1–100 page budget, default 10; exhaustion stays held.
486
+ Use the separate historical import and funded activation contract below for known
487
+ old funds; a local manifest is not historical-adoption proof. Unknown funds and
488
+ unsupported accounts keep explicit migration holds.
489
489
 
490
490
  Sources: [payout creation and source balance selection](https://docs.stripe.com/api/payouts/create),
491
491
  [complete balance history and automatic-only payout filtering](https://docs.stripe.com/api/balance_transactions/list).
@@ -725,7 +725,15 @@ assessment with its reason, rather than inventing amounts. Ledger changes during
725
725
  the final query reject the assessment and require a refresh.
726
726
 
727
727
  The preview verifies policy controls again after reading provider data. Source
728
- and balance observations older than 30 seconds do not qualify. Display
728
+ and balance observations for the selected currency older than 30 seconds do not
729
+ qualify. A complete provider-history check renews that currency's source
730
+ verification time only after all independently fetched receipt fingerprints,
731
+ current balance and stable history head match. Partial, changed, missing or
732
+ unallocated history never renews it. This lets slower receipt scans finish
733
+ without relaxing freshness; local ownership, membership, reversal and reservation
734
+ checks still run atomically afterward. Other currencies keep their original
735
+ observation times and cannot increase or block this currency's assessment merely
736
+ because their receipt observations are older. Display
729
737
  `observedAt` as an assessment time; release independently repeats qualification
730
738
  and reserves funds atomically. A qualified preview is neither a promised payout
731
739
  nor authorization to call Stripe. `job.nextAttemptAt` is the next application
@@ -733,9 +741,10 @@ attempt. Bank arrival dates remain separate provider data from
733
741
  `getPayoutSnapshot`.
734
742
 
735
743
  Stripe-managed recipients keep Stripe's default automatic schedule. This preview
736
- requires a ready custom policy and preserves the current source/history limits,
737
- region restrictions and supported payout rail. It does not remove the need for
738
- provider-history continuation on larger accounts.
744
+ requires a ready custom policy, verified complete provider history, the supported
745
+ region/control capabilities and payout rail. The SDK automatically collects a
746
+ paginated local manifest when the small direct snapshot exceeds 100 rows; a
747
+ partial collection never supplies an eligibility amount.
739
748
 
740
749
  ## Resumable local collections
741
750
 
@@ -746,8 +755,8 @@ components. The public page shape remains `page`, `continueCursor` and `isDone`.
746
755
  Treat cursors as opaque and restart cached pages at a null cursor when upgrading
747
756
  these readers. Use the package's discard operation for an obsolete read-only
748
757
  collection; never erase financially bound or unresolved payout state to restart
749
- a scan. This change preserves the existing source/history limits and does not
750
- make larger provider-history qualification complete.
758
+ a scan. The automatic SDK qualification path uses these pages when a direct
759
+ snapshot exceeds 100 lifetime source or claim rows.
751
760
 
752
761
  An authorized host worker can collect the local recipient ledger in bounded
753
762
  steps, retaining its cursor and step number across restarts:
@@ -780,15 +789,31 @@ stop collection with an explicit reason.
780
789
 
781
790
  `local_ready` describes a read-only local manifest. Complete provider receipts,
782
791
  provider history and monetary claim binding are still required before a payout.
783
- These local APIs do not remove the current bounded release/adoption limits by
784
- themselves. Provider-history continuation and scalable claim execution remain
785
- under implementation.
792
+ The SDK verifies every source against Stripe, fetching at most five source
793
+ receipts concurrently, and checks the complete selected-currency provider history.
794
+ The monetary transaction then checks the collection's owner, policy, full source
795
+ membership, allocation rollups and current risk revision. A qualifying collection
796
+ is bound to the immutable payout claim, including that claim's own reservation
797
+ writes. The risk revision is checked again before the provider attempt. A later
798
+ reversal, fee or competing claim cannot silently change the request.
799
+
800
+ `collection_pending` retains the recurring worker operation and resumes its local
801
+ cursor on a subsequent scheduled check. `collection_invalidated` requires a new
802
+ assessment. Preview/qualification on a query-only context returns
803
+ `collection_requires_action` for larger histories; use an authorized server action.
804
+ A bank payout is not created by collecting or previewing. Complete provider history
805
+ still has the caller's `maxPages` budget, and claims must fit Convex's argument,
806
+ transaction and document limits. Budget errors never erase financial records or
807
+ qualify a partial manifest; use operator recovery for an unsupported workload.
786
808
 
787
809
  After a read-only collection is no longer needed, repeatedly call
788
810
  `discardSnapshot(ctx, { accountId, ownerKey, operationKey: collectionKey })` until
789
811
  it returns `null`. Cleanup removes only collection caches. Read-only collection
790
812
  leases last 24 hours. Financially bound collections reject read-only cleanup and
791
- expiry; payout claims and their source reservations keep their own lifecycle.
813
+ expiry. Once an attempt is durably marked or an unattempted claim is canceled,
814
+ its cache becomes discardable; the claim retains its own immutable observations
815
+ and reservations. An unknown provider outcome keeps those reservations, even
816
+ when the disposable cache has been removed.
792
817
 
793
818
  ### Development reset safeguards
794
819
 
@@ -817,3 +842,45 @@ entitlement. Refunds/reversals still reduce qualifying funds. Provider floors
817
842
  remain provider-enforced and numerically unknown when not exposed. Reassess fresh
818
843
  receipts and balances on the next scheduled attempt rather than manually
819
844
  recreating uncertain requests.
845
+
846
+ ### Versioned recovery liabilities
847
+
848
+ Resolve seller refund/dispute costs and their account version in one component query:
849
+
850
+ ```ts
851
+ const quote = await stripe.costRecovery.payoutQuote(ctx, {
852
+ accountId,
853
+ scopeKey: authorizedRecoveryScope,
854
+ currency,
855
+ });
856
+ await stripe.payoutPolicy.worker.run(ctx, {
857
+ accountId,
858
+ ownerKey,
859
+ currency,
860
+ ...quote,
861
+ });
862
+ ```
863
+
864
+ Use the same quote with `preview` or `release`. The amount is
865
+ `max(0, amountDue - collectedAmount)` for that authorized recovery scope;
866
+ invoice reservations remain owed until collection is verified. Provider-collected
867
+ costs are not deducted again. Keep the amount and `liabilityRevision` together,
868
+ for the same account, scope and currency. Use an authorized user-level scope
869
+ when costs span communities; the host remains responsible for including all
870
+ other authorized debts/reserves and for versioning state outside this component.
871
+ The package's revision does not version an external host database.
872
+
873
+ Recovery amount changes enter the payout risk journal. The financial boundary
874
+ rejects an old quote, and a bound claim checks the current risk revision again
875
+ before its attempt. Its own reservation writes are included in the binding.
876
+ A source/fee/recovery change requires a new assessment; unattempted reservations
877
+ are canceled exactly on replay. An attempted or unknown payout still reconciles
878
+ its immutable request. New claims retain the approved `independentLiabilities`
879
+ and `liabilityRevision` for audit.
880
+
881
+ Legacy unversioned calls remain valid for accounts without recovery balance
882
+ records. Once such records exist, obtain a quote; missing versions fail safely.
883
+ The example's worker and preview adapters do this automatically. Old unattempted
884
+ claims are canceled on replay, rather than retroactively supplied with a guessed
885
+ quote. Restart obsolete read-only collections after upgrading their fingerprint
886
+ format; never clear unresolved financial claims to bypass validation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fantastic.dev/better-stripe",
3
- "version": "0.28.5",
3
+ "version": "0.29.0",
4
4
  "description": "A Convex component for Stripe V2 Accounts API integration.",
5
5
  "keywords": [
6
6
  "stripe",
@@ -0,0 +1,120 @@
1
+ import type { Infer } from "convex/values";
2
+ import type { Component, RunCtx } from "../helpers.js";
3
+ import type { snapshotDoc } from "../../component/payoutSnapshots/schema.js";
4
+ import type { transferDocValidator } from "../../component/connect/validators.js";
5
+ import type { claimDoc } from "../../component/payoutRelease/schema.js";
6
+ import { componentRef } from "../webhooks/helpers.js";
7
+ import {
8
+ collectPayoutSnapshot,
9
+ discardPayoutSnapshot,
10
+ } from "./payoutCollection.js";
11
+ export type CollectionRef = {
12
+ accountId: string;
13
+ ownerKey: string;
14
+ operationKey: string;
15
+ snapshotId: Infer<typeof snapshotDoc>["_id"];
16
+ };
17
+ export type PayoutInput = {
18
+ status: "ready";
19
+ transfers: Infer<typeof transferDocValidator>[];
20
+ claims: Infer<typeof claimDoc>[];
21
+ };
22
+ export async function collectLargePayoutInput(
23
+ component: Component,
24
+ ctx: RunCtx,
25
+ opts: { accountId: string; ownerKey: string; operationKey?: string },
26
+ maxPages: number,
27
+ ) {
28
+ if (!ctx.runMutation)
29
+ return { status: "held" as const, reason: "collection_requires_action" };
30
+ const policy = (await ctx.runQuery(
31
+ componentRef(component, "payoutPolicy/queries/get"),
32
+ { accountId: opts.accountId, ownerKey: opts.ownerKey },
33
+ )) as { revision: number } | null;
34
+ const scope = {
35
+ accountId: opts.accountId,
36
+ ownerKey: opts.ownerKey,
37
+ operationKey: opts.operationKey ?? crypto.randomUUID(),
38
+ };
39
+ let h = await collectPayoutSnapshot(component, ctx, {
40
+ ...scope,
41
+ expectedRevision: policy?.revision ?? -1,
42
+ });
43
+ for (
44
+ let i = 0;
45
+ i < maxPages * 25 && h.phase !== "local_ready" && h.phase !== "invalidated";
46
+ i++
47
+ )
48
+ h = await collectPayoutSnapshot(component, ctx, {
49
+ ...scope,
50
+ expectedRevision: h.expectedRevision,
51
+ expectedStep: h.step,
52
+ });
53
+ const collection = { ...scope, snapshotId: h._id };
54
+ if (h.phase !== "local_ready")
55
+ return {
56
+ status: "held" as const,
57
+ reason:
58
+ h.phase === "invalidated"
59
+ ? "collection_invalidated"
60
+ : "collection_pending",
61
+ collection,
62
+ };
63
+ async function pages<T>(
64
+ kind: "sources" | "claims",
65
+ count: number,
66
+ ): Promise<T[]> {
67
+ const rows: T[] = [];
68
+ let cursor: string | null = null;
69
+ for (let i = 0; i <= Math.ceil(count / 25); i++) {
70
+ const page = (await ctx.runQuery(
71
+ componentRef(component, `payoutSnapshots/queries/${kind}`),
72
+ { ...scope, paginationOpts: { cursor, numItems: 25 } },
73
+ )) as { page: T[]; isDone: boolean; continueCursor: string };
74
+ rows.push(...page.page);
75
+ if (page.isDone) {
76
+ if (rows.length !== count)
77
+ throw new Error("Collected payout membership changed.");
78
+ return rows;
79
+ }
80
+ if (!page.continueCursor || page.continueCursor === cursor)
81
+ throw new Error("Collected payout cursor did not advance.");
82
+ cursor = page.continueCursor;
83
+ }
84
+ throw new Error(
85
+ "Collected payout page budget exhausted; preserve collection for retry.",
86
+ );
87
+ }
88
+ return {
89
+ status: "ready" as const,
90
+ transfers: await pages<Infer<typeof transferDocValidator>>(
91
+ "sources",
92
+ h.sourceCount,
93
+ ),
94
+ claims: await pages<Infer<typeof claimDoc>>("claims", h.claimCount),
95
+ collection,
96
+ };
97
+ }
98
+ /** Bound unattempted claims retain their cache. Attempted/terminal claims keep their own immutable financial proof. */
99
+ export async function discardQualificationInput(
100
+ component: Component,
101
+ ctx: RunCtx,
102
+ collection?: CollectionRef,
103
+ keep = false,
104
+ ) {
105
+ if (!collection || keep || !ctx.runMutation) return;
106
+ const { snapshotId: _, ...scope } = collection;
107
+ const h = (await ctx.runQuery(
108
+ componentRef(component, "payoutSnapshots/queries/get"),
109
+ scope,
110
+ )) as Infer<typeof snapshotDoc> | null;
111
+ if (!h?.readOnly) return;
112
+ for (let i = 0; i < 1000; i++)
113
+ if (
114
+ !(await discardPayoutSnapshot(component, ctx, {
115
+ ...scope,
116
+ batchSize: 100,
117
+ }))
118
+ )
119
+ return;
120
+ }
@@ -1,3 +1,4 @@
1
+ import { discardQualificationInput } from "./payoutCollectedInput.js";
1
2
  import type Stripe from "stripe";
2
3
  import type { Infer } from "convex/values";
3
4
  import type { Component, RunCtx } from "../helpers.js";
@@ -20,6 +21,7 @@ export type PayoutReleaseOptions = {
20
21
  currency: string;
21
22
  /** Host supplies all authorized off-provider debts/reserves, without double counting provider receipt debits. */
22
23
  independentLiabilities: number;
24
+ liabilityRevision?: number;
23
25
  maxPages?: number;
24
26
  };
25
27
  type Held = { status: "held"; reason: string };
@@ -62,11 +64,20 @@ export async function releaseRecipientPayout(
62
64
  if (existing) {
63
65
  if (existing.currency !== opts.currency)
64
66
  throw new Error("Payout claim currency cannot be changed.");
65
- if (existing.attemptedAt !== undefined || existing.status !== "reserved")
66
- return reconcileRecipientPayout(stripe, component, ctx, {
67
- ...identity,
68
- maxPages,
69
- });
67
+ if (existing.attemptedAt !== undefined || existing.status !== "reserved") {
68
+ try {
69
+ return await reconcileRecipientPayout(stripe, component, ctx, {
70
+ ...identity,
71
+ maxPages,
72
+ });
73
+ } finally {
74
+ if (existing.snapshotId)
75
+ await discardQualificationInput(component, ctx, {
76
+ ...identity,
77
+ snapshotId: existing.snapshotId,
78
+ });
79
+ }
80
+ }
70
81
  // A crash before the attempt has no provider side effect. Release its exact
71
82
  // reservations; the next scheduled operation must collect fresh receipts.
72
83
  const claim = (await runMutationOrThrow(
@@ -74,6 +85,11 @@ export async function releaseRecipientPayout(
74
85
  componentRef(component, "payoutRelease/mutations/cancelUnattempted"),
75
86
  identity,
76
87
  )) as Claim;
88
+ if (existing.snapshotId)
89
+ await discardQualificationInput(component, ctx, {
90
+ ...identity,
91
+ snapshotId: existing.snapshotId,
92
+ });
77
93
  return { status: "terminal", claim };
78
94
  }
79
95
  const controls = await verify();
@@ -86,93 +102,109 @@ export async function releaseRecipientPayout(
86
102
  opts,
87
103
  maxPages,
88
104
  );
89
- if (proof.status !== "verified") return proof;
90
- const claim = (await runMutationOrThrow(
91
- ctx,
92
- componentRef(component, "payoutRelease/mutations/claim"),
93
- {
94
- ...identity,
95
- expectedRevision: controls.policy.revision,
96
- currency: opts.currency,
97
- destinationId: proof.destinationId,
98
- providerAvailable: proof.providerAvailable,
99
- independentLiabilities: opts.independentLiabilities,
100
- observations: proof.observations,
101
- },
102
- )) as Claim | Held;
103
- if (claim.status === "held") return claim;
104
- // Another caller can win this operation while receipts were being collected.
105
- if (claim.attemptedAt !== undefined || claim.status !== "reserved")
106
- return reconcileRecipientPayout(stripe, component, ctx, {
107
- ...identity,
108
- maxPages,
109
- });
110
- const latest = await verify();
111
- if (
112
- latest.status !== "verified" ||
113
- !("policy" in latest) ||
114
- latest.policy.revision !== controls.policy.revision
115
- ) {
116
- await runMutationOrThrow(
117
- ctx,
118
- componentRef(component, "payoutRelease/mutations/cancelUnattempted"),
119
- identity,
120
- );
121
- return {
122
- status: "held",
123
- reason: latest.status === "verified" ? "policy_changed" : latest.status,
124
- };
125
- }
126
- await runMutationOrThrow(
127
- ctx,
128
- componentRef(component, "payoutRelease/mutations/beginAttempt"),
129
- identity,
130
- );
131
- let payout: Stripe.Payout;
132
105
  try {
133
- payout = await stripe.payouts.create(
134
- {
135
- amount: claim.amount,
136
- currency: claim.currency,
137
- destination: claim.destinationId,
138
- method: "standard",
139
- source_type: "card",
140
- metadata: { bsPayoutClaim: claim.operationKey },
141
- },
106
+ if (proof.status !== "verified")
107
+ return { status: "held", reason: proof.reason };
108
+ const claim = (await runMutationOrThrow(
109
+ ctx,
110
+ componentRef(component, "payoutRelease/mutations/claim"),
142
111
  {
143
- stripeAccount: claim.accountId,
144
- idempotencyKey: `bs:payout-release:${claim.operationKey}`,
112
+ ...identity,
113
+ expectedRevision: controls.policy.revision,
114
+ currency: opts.currency,
115
+ destinationId: proof.destinationId,
116
+ providerAvailable: proof.providerAvailable,
117
+ independentLiabilities: opts.independentLiabilities,
118
+ observations: proof.observations,
119
+ ...(opts.liabilityRevision === undefined
120
+ ? {}
121
+ : { liabilityRevision: opts.liabilityRevision }),
122
+ ...(proof.collection
123
+ ? { snapshotId: proof.collection.snapshotId }
124
+ : {}),
145
125
  },
146
- );
147
- } catch (error) {
126
+ )) as Claim | Held;
127
+ if (claim.status === "held") return claim;
128
+ // Another caller can win this operation while receipts were being collected.
129
+ if (claim.attemptedAt !== undefined || claim.status !== "reserved")
130
+ return reconcileRecipientPayout(stripe, component, ctx, {
131
+ ...identity,
132
+ maxPages,
133
+ });
134
+ const latest = await verify();
148
135
  if (
149
- error instanceof Error &&
150
- "type" in error &&
151
- error.type === "StripeInvalidRequestError" &&
152
- "code" in error &&
153
- ["balance_insufficient", "amount_too_small"].includes(
154
- String(error.code),
155
- ) &&
156
- "requestId" in error &&
157
- typeof error.requestId === "string" &&
158
- /^req_\w+$/.test(error.requestId)
136
+ latest.status !== "verified" ||
137
+ !("policy" in latest) ||
138
+ latest.policy.revision !== controls.policy.revision
159
139
  ) {
160
- const saved = (await runMutationOrThrow(
140
+ await runMutationOrThrow(
161
141
  ctx,
162
- componentRef(component, "payoutRelease/mutations/recordRejection"),
142
+ componentRef(component, "payoutRelease/mutations/cancelUnattempted"),
143
+ identity,
144
+ );
145
+ return {
146
+ status: "held",
147
+ reason: latest.status === "verified" ? "policy_changed" : latest.status,
148
+ };
149
+ }
150
+ await runMutationOrThrow(
151
+ ctx,
152
+ componentRef(component, "payoutRelease/mutations/beginAttempt"),
153
+ identity,
154
+ );
155
+ let payout: Stripe.Payout;
156
+ try {
157
+ payout = await stripe.payouts.create(
163
158
  {
164
- ...identity,
165
- requestId: error.requestId,
166
- code: error.code,
159
+ amount: claim.amount,
160
+ currency: claim.currency,
161
+ destination: claim.destinationId,
162
+ method: "standard",
163
+ source_type: "card",
164
+ metadata: { bsPayoutClaim: claim.operationKey },
167
165
  },
168
- )) as Claim;
169
- return { status: "terminal", claim: saved };
166
+ {
167
+ stripeAccount: claim.accountId,
168
+ idempotencyKey: `bs:payout-release:${claim.operationKey}`,
169
+ },
170
+ );
171
+ } catch (error) {
172
+ if (
173
+ error instanceof Error &&
174
+ "type" in error &&
175
+ error.type === "StripeInvalidRequestError" &&
176
+ "code" in error &&
177
+ ["balance_insufficient", "amount_too_small"].includes(
178
+ String(error.code),
179
+ ) &&
180
+ "requestId" in error &&
181
+ typeof error.requestId === "string" &&
182
+ /^req_\w+$/.test(error.requestId)
183
+ ) {
184
+ const saved = (await runMutationOrThrow(
185
+ ctx,
186
+ componentRef(component, "payoutRelease/mutations/recordRejection"),
187
+ {
188
+ ...identity,
189
+ requestId: error.requestId,
190
+ code: error.code,
191
+ },
192
+ )) as Claim;
193
+ return { status: "terminal", claim: saved };
194
+ }
195
+ throw error;
170
196
  }
171
- throw error;
197
+ return await reconcileRecipientPayout(stripe, component, ctx, {
198
+ ...identity,
199
+ stripePayoutId: payout.id,
200
+ maxPages,
201
+ });
202
+ } finally {
203
+ await discardQualificationInput(
204
+ component,
205
+ ctx,
206
+ proof.collection,
207
+ proof.status === "held" && proof.reason === "collection_pending",
208
+ );
172
209
  }
173
- return reconcileRecipientPayout(stripe, component, ctx, {
174
- ...identity,
175
- stripePayoutId: payout.id,
176
- maxPages,
177
- });
178
210
  }
@@ -111,12 +111,25 @@ export async function setup(amounts = [600, 400]) {
111
111
  }),
112
112
  },
113
113
  balanceTransactions: {
114
- list: vi.fn(async (params: { source?: string; limit?: number }) => ({
115
- data: params.source
116
- ? transactions.filter((t) => t.source === params.source)
117
- : transactions.slice(0, params.limit),
118
- has_more: false,
119
- })),
114
+ list: vi.fn(
115
+ async (params: {
116
+ source?: string;
117
+ limit?: number;
118
+ currency?: string;
119
+ starting_after?: string;
120
+ }) => {
121
+ const rows = transactions.filter(
122
+ (t) =>
123
+ (!params.source || t.source === params.source) &&
124
+ (!params.currency || t.currency === params.currency),
125
+ );
126
+ const start = params.starting_after
127
+ ? rows.findIndex((t) => t.id === params.starting_after) + 1
128
+ : 0;
129
+ const data = rows.slice(start, start + (params.limit ?? 100));
130
+ return { data, has_more: start + data.length < rows.length };
131
+ },
132
+ ),
120
133
  retrieve: vi.fn(async (id: string) =>
121
134
  transactions.find((t) => t.id === id),
122
135
  ),