@fantastic.dev/better-stripe 0.28.4 → 0.28.6

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 (93) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +5 -1
  3. package/dist/client/connect/payoutAdoptionTestHelpers.d.ts +6 -2
  4. package/dist/client/connect/payoutAdoptionTestHelpers.d.ts.map +1 -1
  5. package/dist/client/connect/payoutExecutionTestHelpers.d.ts +3 -1
  6. package/dist/client/connect/payoutExecutionTestHelpers.d.ts.map +1 -1
  7. package/dist/client/connect/payoutPreview.d.ts.map +1 -1
  8. package/dist/client/connect/payoutPreview.js +1 -1
  9. package/dist/client/connect/payoutPreview.js.map +1 -1
  10. package/dist/client/connect/payoutQualification.d.ts.map +1 -1
  11. package/dist/client/connect/payoutQualification.js +5 -1
  12. package/dist/client/connect/payoutQualification.js.map +1 -1
  13. package/dist/client/connect/payoutSyncTestHelpers.d.ts +3 -1
  14. package/dist/client/connect/payoutSyncTestHelpers.d.ts.map +1 -1
  15. package/dist/client/connect/payoutWorker.d.ts +4 -1
  16. package/dist/client/connect/payoutWorker.d.ts.map +1 -1
  17. package/dist/client/connect/payoutWorker.js +35 -1
  18. package/dist/client/connect/payoutWorker.js.map +1 -1
  19. package/dist/client/payoutPolicy.d.ts +2 -0
  20. package/dist/client/payoutPolicy.d.ts.map +1 -1
  21. package/dist/client/payoutPolicy.js +2 -0
  22. package/dist/client/payoutPolicy.js.map +1 -1
  23. package/dist/component/_generated/component.d.ts +4 -0
  24. package/dist/component/_generated/component.d.ts.map +1 -1
  25. package/dist/component/earnings/triggers.d.ts +4 -2
  26. package/dist/component/earnings/triggers.d.ts.map +1 -1
  27. package/dist/component/payoutRelease/helpers.d.ts +1 -1
  28. package/dist/component/payoutRelease/helpers.d.ts.map +1 -1
  29. package/dist/component/payoutRelease/helpers.js +2 -1
  30. package/dist/component/payoutRelease/helpers.js.map +1 -1
  31. package/dist/component/payoutRelease/mutations.d.ts.map +1 -1
  32. package/dist/component/payoutRelease/mutations.js +1 -1
  33. package/dist/component/payoutRelease/mutations.js.map +1 -1
  34. package/dist/component/payoutRelease/planning.d.ts.map +1 -1
  35. package/dist/component/payoutRelease/planning.js +1 -1
  36. package/dist/component/payoutRelease/planning.js.map +1 -1
  37. package/dist/component/payoutRelease/preview.d.ts.map +1 -1
  38. package/dist/component/payoutRelease/preview.js +3 -1
  39. package/dist/component/payoutRelease/preview.js.map +1 -1
  40. package/dist/component/payoutWorker/helpers.d.ts +1 -0
  41. package/dist/component/payoutWorker/helpers.d.ts.map +1 -1
  42. package/dist/component/payoutWorker/mutations.d.ts +2 -0
  43. package/dist/component/payoutWorker/mutations.d.ts.map +1 -1
  44. package/dist/component/payoutWorker/mutations.js +3 -0
  45. package/dist/component/payoutWorker/mutations.js.map +1 -1
  46. package/dist/component/payoutWorker/queries.d.ts +2 -0
  47. package/dist/component/payoutWorker/queries.d.ts.map +1 -1
  48. package/dist/component/payoutWorker/schema.d.ts +18 -2
  49. package/dist/component/payoutWorker/schema.d.ts.map +1 -1
  50. package/dist/component/payoutWorker/schema.js +7 -0
  51. package/dist/component/payoutWorker/schema.js.map +1 -1
  52. package/dist/component/schema.d.ts +3 -1
  53. package/dist/react/workflows/PayoutAttemptStatus.d.ts +14 -0
  54. package/dist/react/workflows/PayoutAttemptStatus.d.ts.map +1 -0
  55. package/dist/react/workflows/PayoutAttemptStatus.js +13 -0
  56. package/dist/react/workflows/PayoutAttemptStatus.js.map +1 -0
  57. package/dist/react/workflows/PayoutProgress.d.ts.map +1 -1
  58. package/dist/react/workflows/PayoutProgress.js +2 -1
  59. package/dist/react/workflows/PayoutProgress.js.map +1 -1
  60. package/dist/react/workflows/index.d.ts +2 -0
  61. package/dist/react/workflows/index.d.ts.map +1 -1
  62. package/dist/react/workflows/index.js +1 -0
  63. package/dist/react/workflows/index.js.map +1 -1
  64. package/dist/react/workflows/payout-attempt-state.d.ts +9 -0
  65. package/dist/react/workflows/payout-attempt-state.d.ts.map +1 -0
  66. package/dist/react/workflows/payout-attempt-state.js +47 -0
  67. package/dist/react/workflows/payout-attempt-state.js.map +1 -0
  68. package/dist/react/workflows/payout-progress-state.d.ts +5 -1
  69. package/dist/react/workflows/payout-progress-state.d.ts.map +1 -1
  70. package/dist/react/workflows/payout-progress-state.js +11 -2
  71. package/dist/react/workflows/payout-progress-state.js.map +1 -1
  72. package/docs/react-workflows.md +19 -0
  73. package/docs/settlement.md +25 -1
  74. package/package.json +1 -1
  75. package/src/client/connect/payoutPreview.ts +3 -1
  76. package/src/client/connect/payoutQualification.ts +7 -1
  77. package/src/client/connect/payoutQualificationFreshness.test.ts +192 -0
  78. package/src/client/connect/payoutWorker.test.ts +57 -1
  79. package/src/client/connect/payoutWorker.ts +46 -2
  80. package/src/client/payoutPolicy.ts +2 -0
  81. package/src/component/_generated/component.ts +4 -0
  82. package/src/component/payoutRelease/helpers.ts +2 -0
  83. package/src/component/payoutRelease/mutations.ts +7 -1
  84. package/src/component/payoutRelease/planning.ts +1 -0
  85. package/src/component/payoutRelease/preview.ts +3 -1
  86. package/src/component/payoutWorker/mutations.ts +3 -0
  87. package/src/component/payoutWorker/schema.ts +15 -0
  88. package/src/react/workflows/PayoutAttemptStatus.tsx +44 -0
  89. package/src/react/workflows/PayoutProgress.test.tsx +48 -0
  90. package/src/react/workflows/PayoutProgress.tsx +6 -0
  91. package/src/react/workflows/index.ts +6 -0
  92. package/src/react/workflows/payout-attempt-state.ts +70 -0
  93. package/src/react/workflows/payout-progress-state.ts +21 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/workflows/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/workflows/index.ts"],"names":[],"mappings":"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"}
@@ -44,4 +44,5 @@ export { AffiliateRateEditor } from "./AffiliateRateEditor.js";
44
44
  export { AffiliatePayoutEditor } from "./AffiliatePayoutEditor.js";
45
45
  export { AffiliateRecovery, AffiliateRecoveryHistory, } from "./AffiliateRecovery.js";
46
46
  export { EvidenceUpload } from "./EvidenceUpload.js";
47
+ export { PayoutAttemptStatus } from "./PayoutAttemptStatus.js";
47
48
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/workflows/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/workflows/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PayoutAttempt } from "../../client/connect/payoutWorker.js";
2
+ export type PayoutAttemptState = PayoutAttempt & {
3
+ message: string;
4
+ tone: "warning" | "neutral" | "success";
5
+ formattedAt?: string;
6
+ timeLabel?: string;
7
+ };
8
+ export declare function payoutAttemptState(attempt: PayoutAttempt | null | undefined, locale?: string, timeZone?: string): PayoutAttemptState | undefined;
9
+ //# sourceMappingURL=payout-attempt-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payout-attempt-state.d.ts","sourceRoot":"","sources":["../../../src/react/workflows/payout-attempt-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAyB1E,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACzC,MAAM,SAAU,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,kBAAkB,GAAG,SAAS,CAkChC"}
@@ -0,0 +1,47 @@
1
+ const messages = {
2
+ balance_insufficient: "Stripe rejected the payout because the available balance changed. Remaining unpaid entitlement is preserved; any retry requires fresh balance verification.",
3
+ amount_too_small: "Stripe rejected the payout below its supported minimum. A numeric provider floor is unavailable. Review payout settings promptly; holding limits still apply.",
4
+ worker_error: "The automatic payout check could not complete. An uncertain outcome must be reconciled before another payout can be created.",
5
+ returned: "The bank returned the payout. Returned funds will be assessed again when available.",
6
+ bank_destination_unavailable: "Add or verify a supported payout bank account before the worker can retry.",
7
+ affiliate_recovery_pending: "Commission recovery must settle before a new automatic payout can qualify.",
8
+ below_threshold: "No payout was requested because the combined balance is below the application minimum.",
9
+ insufficient_available: "No payout was requested because the supported available Stripe balance is insufficient.",
10
+ schedule_drift: "Payout scheduling changed outside the application. Contact platform support to verify controls.",
11
+ snapshot_limit: "History reconciliation is incomplete. No payout was requested from a partial balance.",
12
+ policy_inactive: "The application-managed payout policy is inactive. No new application payout was requested.",
13
+ };
14
+ export function payoutAttemptState(attempt, locale = "en-US", timeZone) {
15
+ if (!attempt)
16
+ return undefined;
17
+ const message = attempt.status === "running"
18
+ ? "An automatic payout check is running. Its outcome is not verified yet."
19
+ : attempt.status === "reconciling"
20
+ ? "The payout outcome needs verification. The same operation will be reconciled before any new payout."
21
+ : attempt.status === "paid"
22
+ ? "The latest application payout was verified as paid by Stripe."
23
+ : (messages[attempt.reason] ??
24
+ "The latest automatic payout check did not complete. Review account settings or contact platform support.");
25
+ return {
26
+ ...attempt,
27
+ message,
28
+ tone: attempt.status === "paid"
29
+ ? "success"
30
+ : ["rejected", "failed", "reconciling"].includes(attempt.status)
31
+ ? "warning"
32
+ : "neutral",
33
+ ...(attempt.at === undefined
34
+ ? {}
35
+ : {
36
+ formattedAt: new Intl.DateTimeFormat(locale, {
37
+ dateStyle: "medium",
38
+ timeStyle: "short",
39
+ timeZone,
40
+ }).format(attempt.at),
41
+ timeLabel: attempt.status === "running"
42
+ ? "Attempt started"
43
+ : "Result recorded",
44
+ }),
45
+ };
46
+ }
47
+ //# sourceMappingURL=payout-attempt-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payout-attempt-state.js","sourceRoot":"","sources":["../../../src/react/workflows/payout-attempt-state.ts"],"names":[],"mappings":"AACA,MAAM,QAAQ,GAA2B;IACvC,oBAAoB,EAClB,6JAA6J;IAC/J,gBAAgB,EACd,+JAA+J;IACjK,YAAY,EACV,8HAA8H;IAChI,QAAQ,EACN,qFAAqF;IACvF,4BAA4B,EAC1B,4EAA4E;IAC9E,0BAA0B,EACxB,4EAA4E;IAC9E,eAAe,EACb,wFAAwF;IAC1F,sBAAsB,EACpB,yFAAyF;IAC3F,cAAc,EACZ,iGAAiG;IACnG,cAAc,EACZ,uFAAuF;IACzF,eAAe,EACb,6FAA6F;CAChG,CAAC;AAOF,MAAM,UAAU,kBAAkB,CAChC,OAAyC,EACzC,MAAM,GAAG,OAAO,EAChB,QAAiB;IAEjB,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,KAAK,SAAS;QAC1B,CAAC,CAAC,wEAAwE;QAC1E,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,aAAa;YAChC,CAAC,CAAC,qGAAqG;YACvG,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;gBACzB,CAAC,CAAC,+DAA+D;gBACjE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;oBACzB,0GAA0G,CAAC,CAAC;IACtH,OAAO;QACL,GAAG,OAAO;QACV,OAAO;QACP,IAAI,EACF,OAAO,CAAC,MAAM,KAAK,MAAM;YACvB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC9D,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS;QACjB,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS;YAC1B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;oBAC3C,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,OAAO;oBAClB,QAAQ;iBACT,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrB,SAAS,EACP,OAAO,CAAC,MAAM,KAAK,SAAS;oBAC1B,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,iBAAiB;aACxB,CAAC;KACP,CAAC;AACJ,CAAC"}
@@ -1,3 +1,5 @@
1
+ import { type PayoutAttemptState } from "./payout-attempt-state.js";
2
+ import type { PayoutAttempt } from "../../client/connect/payoutWorker.js";
1
3
  import type { ReactNode } from "react";
2
4
  import type { PayoutPolicy, PayoutPreview } from "../../client/payoutPolicy.js";
3
5
  export type PayoutProgressMetric = {
@@ -33,6 +35,7 @@ export type PayoutProgressState = {
33
35
  nextAttemptAt: number | null;
34
36
  holdDeadline: number | null;
35
37
  observedAt: number | null;
38
+ lastAttempt?: PayoutAttemptState;
36
39
  recovery?: {
37
40
  status: NonNullable<PayoutPolicy["holdingExpiry"]>["status"];
38
41
  balances?: {
@@ -47,6 +50,7 @@ export type PayoutProgressState = {
47
50
  export type PayoutProgressProps = {
48
51
  policy: Pick<PayoutPolicy, "mode" | "status" | "thresholds" | "holdDeadline" | "holdingExpiry"> | null | undefined;
49
52
  preview?: PayoutPreview | null;
53
+ lastAttempt?: PayoutAttempt | null;
50
54
  currency: string;
51
55
  /** Application worker attempt time, never a bank arrival estimate. */
52
56
  nextAttemptAt?: number | null;
@@ -56,5 +60,5 @@ export type PayoutProgressProps = {
56
60
  /** Compose translated host cards with the same financial state. */
57
61
  children?: (state: PayoutProgressState) => ReactNode;
58
62
  };
59
- export declare function payoutProgressState({ policy, preview, currency, nextAttemptAt, locale, }: PayoutProgressProps): PayoutProgressState;
63
+ export declare function payoutProgressState({ policy, preview, currency, nextAttemptAt, lastAttempt, timeZone, locale, }: PayoutProgressProps): PayoutProgressState;
60
64
  //# sourceMappingURL=payout-progress-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"payout-progress-state.d.ts","sourceRoot":"","sources":["../../../src/react/workflows/payout-progress-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EACC,YAAY,GACZ,SAAS,GACT,SAAS,GACT,UAAU,GACV,MAAM,GACN,aAAa,GACb,SAAS,GACT,UAAU,GACV,UAAU,GACV,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EACJ,SAAS,GAAG,gBAAgB,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,WAAW,CACtB,OAAO,CAAC,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,YAAY,CAAC,CAC3D,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;QACtC,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,EAAE,CAAC;IACJ,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7D,QAAQ,CAAC,EAAE;YACT,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,cAAc,EAAE,MAAM,CAAC;YACvB,YAAY,EAAE,MAAM,CAAC;SACtB,EAAE,CAAC;KACL,CAAC;CACH,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EACF,IAAI,CACF,YAAY,EACZ,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,eAAe,CACpE,GACD,IAAI,GACJ,SAAS,CAAC;IACd,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;CACtD,CAAC;AAqBF,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,OAAO,EACP,QAAQ,EACR,aAAa,EACb,MAAgB,GACjB,EAAE,mBAAmB,GAAG,mBAAmB,CAyJ3C"}
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,3 +1,4 @@
1
+ import { payoutAttemptState, } from "./payout-attempt-state.js";
1
2
  import { formatPrice } from "../lib/price-helpers.js";
2
3
  const reasons = {
3
4
  below_threshold: "Below-minimum funds remain owed and carry forward to a later automatic attempt.",
@@ -11,7 +12,9 @@ const reasons = {
11
12
  snapshot_limit: "This account needs continued history reconciliation before eligibility can be assessed.",
12
13
  policy_changed: "Payout settings changed. Refresh the assessment.",
13
14
  };
14
- export function payoutProgressState({ policy, preview, currency, nextAttemptAt, locale = "en-US", }) {
15
+ export function payoutProgressState({ policy, preview, currency, nextAttemptAt, lastAttempt, timeZone, locale = "en-US", }) {
16
+ if (lastAttempt && lastAttempt.currency !== currency)
17
+ throw new Error("Payout attempt currency does not match the selected currency.");
15
18
  const amount = (value) => formatPrice(value, currency, locale);
16
19
  const state = {
17
20
  status: "loading",
@@ -24,6 +27,9 @@ export function payoutProgressState({ policy, preview, currency, nextAttemptAt,
24
27
  nextAttemptAt: null,
25
28
  holdDeadline: policy?.mode === "custom" ? (policy.holdDeadline ?? null) : null,
26
29
  observedAt: null,
30
+ lastAttempt: policy === undefined
31
+ ? undefined
32
+ : payoutAttemptState(lastAttempt, locale, timeZone),
27
33
  };
28
34
  if (policy !== undefined) {
29
35
  if (policy?.status === "changing") {
@@ -63,7 +69,10 @@ export function payoutProgressState({ policy, preview, currency, nextAttemptAt,
63
69
  "Stripe manages automatic payouts. No additional application minimum is set.";
64
70
  }
65
71
  else if (preview !== undefined) {
66
- state.nextAttemptAt = nextAttemptAt ?? null;
72
+ state.nextAttemptAt =
73
+ state.lastAttempt?.status === "running"
74
+ ? null
75
+ : (nextAttemptAt ?? null);
67
76
  if (!preview || !("currency" in preview)) {
68
77
  state.status = "unavailable";
69
78
  state.reason = preview?.reason ?? "assessment_unavailable";
@@ -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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"}
@@ -752,3 +752,22 @@ described in the [settlement guide](settlement.md#development-reset-safeguards).
752
752
  See the [read contract guide](read-contracts.md) for reactive product, price and payout
753
753
  cursors, exact currency summaries, legacy backfill, payout failure details, and
754
754
  published-version adoption requirements.
755
+
756
+ ### Latest automatic payout attempt
757
+
758
+ `payoutAttemptStatus(job)` projects a package worker job into the public
759
+ `PayoutAttempt` contract. Use `payoutAttemptValidator` in host response validators
760
+ and forward the result as `lastAttempt` to `PayoutProgress`, or render the
761
+ unstyled `PayoutAttemptStatus` workflow directly. Its render prop supplies a
762
+ safe message, tone and localized result time for host cards.
763
+
764
+ Stripe rejections retain `balance_insufficient` or `amount_too_small` instead of
765
+ a generic rejection. This history is separate from an informational eligibility
766
+ preview; qualification does not promise provider acceptance. A running lease
767
+ or unresolved operation suppresses an older paid result. The workflow hides a
768
+ stale retry date while a check runs. Legacy jobs without a recorded result time
769
+ show no invented timestamp. Result/check times are not bank arrival estimates.
770
+
771
+ The example uses the same package workflow in API and BetterStripe-component
772
+ views, including seller and affiliate payout panels. No status control is a
773
+ manual withdrawal request. Unknown outcomes reconcile the original operation.
@@ -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
@@ -801,3 +809,19 @@ Pending or unknown direct affiliate payouts and recovery operations also block
801
809
  reset, preserving the receipts and obligations needed for reconciliation.
802
810
  The guard preserves the restoration and payout records until that work is done.
803
811
  Read-only cache collections can be cleared with the other development data.
812
+
813
+ ### Observing automatic attempt outcomes
814
+
815
+ Worker jobs record `lastResultAt` with each completed check and retain a verified
816
+ Stripe rejection code in `lastReason`. `payoutAttemptStatus(job)` distinguishes
817
+ running, reconciling, rejected, failed, held and paid results. Active generations
818
+ take precedence over old successes; missing legacy result times remain unknown.
819
+ Use the exported `payoutAttemptValidator` for a host DTO and keep the operation's
820
+ immutable rejection receipt for audits. The example warns operators on rejected
821
+ payouts before the holding deadline, without logging raw provider errors.
822
+
823
+ A rejected request releases proven reservations; it does not forfeit unpaid
824
+ entitlement. Refunds/reversals still reduce qualifying funds. Provider floors
825
+ remain provider-enforced and numerically unknown when not exposed. Reassess fresh
826
+ receipts and balances on the next scheduled attempt rather than manually
827
+ recreating uncertain requests.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fantastic.dev/better-stripe",
3
- "version": "0.28.4",
3
+ "version": "0.28.6",
4
4
  "description": "A Convex component for Stripe V2 Accounts API integration.",
5
5
  "keywords": [
6
6
  "stripe",
@@ -59,7 +59,9 @@ export async function previewRecipientPayout(
59
59
  return held("policy_changed");
60
60
  if (
61
61
  proof.observedAt < Date.now() - 30000 ||
62
- proof.observations.some((o) => o.observedAt < Date.now() - 30000)
62
+ proof.observations.some(
63
+ (o) => o.currency === opts.currency && o.observedAt < Date.now() - 30000,
64
+ )
63
65
  )
64
66
  return held("observations_stale");
65
67
  return ctx.runQuery(
@@ -137,7 +137,13 @@ export async function collectPayoutQualification(
137
137
  if (history.status !== "verified") return history;
138
138
  return {
139
139
  status: "verified",
140
- observations,
140
+ // The complete currency history just matched every independently verified
141
+ // receipt again. Other currencies have not undergone that verification.
142
+ observations: observations.map((o) =>
143
+ o.currency === opts.currency
144
+ ? { ...o, observedAt: history.observedAt }
145
+ : o,
146
+ ),
141
147
  destinationId,
142
148
  providerAvailable: history.providerAvailable,
143
149
  observedAt: history.observedAt,
@@ -0,0 +1,192 @@
1
+ // @vitest-environment edge-runtime
2
+ import { afterEach, expect, it, vi } from "vitest";
3
+ import type Stripe from "stripe";
4
+ import { makeFunctionReference } from "convex/server";
5
+ import { setup, scope, component } from "./payoutExecutionTestHelpers.js";
6
+ import { previewRecipientPayout } from "./payoutPreview.js";
7
+ import { collectPayoutQualification } from "./payoutQualification.js";
8
+ afterEach(() => vi.restoreAllMocks());
9
+ async function delayedHistory(amounts?: number[]) {
10
+ const s = await setup(amounts);
11
+ const initial = Date.now();
12
+ let now = initial;
13
+ vi.spyOn(Date, "now").mockImplementation(() => now);
14
+ const list = s.provider.balanceTransactions.list.getMockImplementation()!;
15
+ let change: (() => void) | undefined;
16
+ let delayed = false;
17
+ s.provider.balanceTransactions.list.mockImplementation(async (params) => {
18
+ if (!params.source && !delayed) {
19
+ delayed = true;
20
+ now += 35000;
21
+ change?.();
22
+ }
23
+ const result = await list(params);
24
+ const currency = (params as { currency?: string }).currency;
25
+ return {
26
+ ...result,
27
+ data: currency
28
+ ? result.data.filter((t) => t.currency === currency)
29
+ : result.data,
30
+ };
31
+ });
32
+ const preview = () =>
33
+ previewRecipientPayout(
34
+ s.provider as unknown as Stripe,
35
+ component,
36
+ s.ctx,
37
+ scope,
38
+ s.verify,
39
+ );
40
+ return { ...s, initial, preview, change: (fn: () => void) => (change = fn) };
41
+ }
42
+ it.each(["preview", "release"])(
43
+ "a complete fresh history renews old source verification for %s",
44
+ async (mode) => {
45
+ const s = await delayedHistory();
46
+ expect(await (mode === "preview" ? s.preview() : s.run())).toMatchObject(
47
+ mode === "preview"
48
+ ? { status: "qualified", amount: 1000, observedAt: s.initial + 35000 }
49
+ : { status: "updated", claim: { status: "paid", amount: 1000 } },
50
+ );
51
+ expect(s.provider.payouts.create).toHaveBeenCalledTimes(
52
+ mode === "preview" ? 0 : 1,
53
+ );
54
+ },
55
+ );
56
+ it.each(["changed", "matured", "missing", "partial"])(
57
+ "does not renew source verification from %s provider history",
58
+ async (kind) => {
59
+ const s = await delayedHistory();
60
+ if (kind === "matured")
61
+ s.setTransactions(
62
+ s
63
+ .transactions()
64
+ .map((t, i) => (i === 0 ? { ...t, status: "pending" } : t)),
65
+ );
66
+ s.change(() => {
67
+ const rows = s.transactions();
68
+ s.setTransactions(
69
+ kind === "missing" || kind === "partial"
70
+ ? rows.slice(1)
71
+ : rows.map((t, i) =>
72
+ i === 0
73
+ ? kind === "matured"
74
+ ? { ...t, status: "available" }
75
+ : { ...t, fee: 1, net: t.amount - 1 }
76
+ : t,
77
+ ),
78
+ );
79
+ });
80
+ if (kind === "partial") {
81
+ const list = s.provider.balanceTransactions.list.getMockImplementation()!;
82
+ s.provider.balanceTransactions.list.mockImplementation(
83
+ async (params) => ({
84
+ ...(await list(params)),
85
+ has_more: !params.source,
86
+ }),
87
+ );
88
+ }
89
+ expect(await s.preview()).toMatchObject({ status: "held", amount: 0 });
90
+ expect(s.provider.payouts.create).not.toHaveBeenCalled();
91
+ expect(
92
+ await s.t.run((ctx) => ctx.db.query("payoutReleaseClaims").collect()),
93
+ ).toEqual([]);
94
+ },
95
+ );
96
+ it("renews only the selected currency and leaves other source proof times unchanged", async () => {
97
+ const s = await delayedHistory([600, 400, 100]);
98
+ await s.t.run(async (ctx) => {
99
+ const row = await ctx.db
100
+ .query("transfers")
101
+ .withIndex("by_stripe_transfer_id", (q) =>
102
+ q.eq("stripeTransferId", "tr_2"),
103
+ )
104
+ .unique();
105
+ await ctx.db.patch(row!._id, { currency: "eur" });
106
+ });
107
+ s.setTransactions(
108
+ s.transactions().map((t, i) => (i === 2 ? { ...t, currency: "eur" } : t)),
109
+ );
110
+ const transfer = s.provider.transfers.retrieve.getMockImplementation()!;
111
+ s.provider.transfers.retrieve.mockImplementation(async (id) => ({
112
+ ...(await transfer(id)),
113
+ currency: id.endsWith("_2") ? "eur" : "usd",
114
+ }));
115
+ const charge = s.provider.charges.retrieve.getMockImplementation()!;
116
+ s.provider.charges.retrieve.mockImplementation(async (id) => ({
117
+ ...(await charge(id)),
118
+ currency: id.endsWith("_2") ? "eur" : "usd",
119
+ }));
120
+ s.provider.balance.retrieve.mockResolvedValue({
121
+ available: [
122
+ { currency: "usd", amount: 1000, source_types: { card: 1000 } },
123
+ { currency: "eur", amount: 100, source_types: { card: 100 } },
124
+ ],
125
+ pending: [],
126
+ });
127
+ const proof = await collectPayoutQualification(
128
+ s.provider as unknown as Stripe,
129
+ component,
130
+ s.ctx,
131
+ scope,
132
+ 10,
133
+ );
134
+ expect(proof).toMatchObject({
135
+ status: "verified",
136
+ observations: [
137
+ { currency: "usd", observedAt: s.initial + 35000 },
138
+ { currency: "usd", observedAt: s.initial + 35000 },
139
+ { currency: "eur", observedAt: s.initial },
140
+ ],
141
+ });
142
+ if (proof.status !== "verified") throw new Error("Expected complete proof");
143
+ const args = {
144
+ accountId: scope.accountId,
145
+ ownerKey: scope.ownerKey,
146
+ currency: "usd",
147
+ expectedRevision: 0,
148
+ observations: proof.observations,
149
+ providerAvailable: proof.providerAvailable,
150
+ independentLiabilities: 0,
151
+ };
152
+ // Use the already-collected proof, whose EUR observation really is stale.
153
+ expect(
154
+ await s.t.query(
155
+ makeFunctionReference<"query">("payoutRelease/queries:preview"),
156
+ args,
157
+ ),
158
+ ).toMatchObject({
159
+ status: "qualified",
160
+ amount: 1000,
161
+ observedAt: s.initial + 35000,
162
+ });
163
+ const claim = await s.t.mutation(
164
+ makeFunctionReference<"mutation">("payoutRelease/mutations:claim"),
165
+ { ...args, operationKey: scope.operationKey, destinationId: "ba_one" },
166
+ );
167
+ expect(claim).toMatchObject({ status: "reserved", amount: 1000 });
168
+ expect(
169
+ await s.t.mutation(
170
+ makeFunctionReference<"mutation">("payoutRelease/mutations:beginAttempt"),
171
+ {
172
+ accountId: scope.accountId,
173
+ ownerKey: scope.ownerKey,
174
+ operationKey: scope.operationKey,
175
+ },
176
+ ),
177
+ ).toMatchObject({ amount: 1000, attemptedAt: s.initial + 35000 });
178
+ });
179
+
180
+ it("still rejects local source changes after provider-history renewal", async () => {
181
+ const s = await delayedHistory();
182
+ const policy = await s.verify();
183
+ s.verify.mockResolvedValueOnce(policy).mockImplementationOnce(async () => {
184
+ await s.t.run(async (ctx) => {
185
+ const row = await ctx.db.query("transfers").first();
186
+ await ctx.db.patch(row!._id, { reversedAmount: 1 });
187
+ });
188
+ return policy;
189
+ });
190
+ await expect(s.preview()).rejects.toThrow(/snapshot changed/);
191
+ expect(s.provider.payouts.create).not.toHaveBeenCalled();
192
+ });
@@ -3,7 +3,7 @@ import { afterEach, expect, it, vi } from "vitest";
3
3
  import type Stripe from "stripe";
4
4
  import { setup, scope, component } from "./payoutExecutionTestHelpers.js";
5
5
  import { reconcileRecipientPayout } from "./payoutReconciliation.js";
6
- import { PayoutWorkerClient } from "./payoutWorker.js";
6
+ import { PayoutWorkerClient, payoutAttemptStatus } from "./payoutWorker.js";
7
7
  import { changeBalance } from "../../component/affiliateRecovery/accounting.js";
8
8
  afterEach(() => vi.useRealTimers());
9
9
  async function worker(amounts?: number[]) {
@@ -143,3 +143,59 @@ it("reports affiliate recovery holds before a fresh attempt without creating a p
143
143
  });
144
144
  expect(s.provider.payouts.create).not.toHaveBeenCalled();
145
145
  });
146
+
147
+ it.each(["balance_insufficient", "amount_too_small"])(
148
+ "persists actionable %s rejection and its result time",
149
+ async (code) => {
150
+ const s = await worker();
151
+ s.provider.payouts.create.mockRejectedValueOnce(
152
+ Object.assign(new Error(code), {
153
+ type: "StripeInvalidRequestError",
154
+ code,
155
+ requestId: "req_rejected",
156
+ }),
157
+ );
158
+ expect(await s.run()).toMatchObject({
159
+ job: { lastReason: code, lastResultAt: expect.any(Number) },
160
+ payout: { claim: { status: "rejected", rejection: { code } } },
161
+ });
162
+ },
163
+ );
164
+
165
+ it("does not reuse a prior paid result or timestamp for a newer running generation", async () => {
166
+ const s = await worker();
167
+ const result = await s.run();
168
+ if (result.status !== "completed")
169
+ throw new Error("Expected completed fixture");
170
+ const active = {
171
+ ...result.job,
172
+ generation: result.job.generation + 1,
173
+ completedGeneration: result.job.generation,
174
+ hasOperation: true,
175
+ operationKey: "new-operation",
176
+ lastReason: "paid",
177
+ lastResultAt: 1000,
178
+ lastAttemptAt: 2000,
179
+ leaseUntil: 3000,
180
+ };
181
+ expect(payoutAttemptStatus(active, 2100)).toEqual({
182
+ currency: "usd",
183
+ status: "running",
184
+ reason: "pending_claim",
185
+ at: 2000,
186
+ });
187
+ expect(payoutAttemptStatus(active, 4000)).toEqual({
188
+ currency: "usd",
189
+ status: "reconciling",
190
+ reason: "pending_claim",
191
+ });
192
+ });
193
+ it("keeps legacy result times unknown rather than inventing a completion time", async () => {
194
+ const s = await worker();
195
+ const result = await s.run();
196
+ if (result.status !== "completed")
197
+ throw new Error("Expected completed fixture");
198
+ expect(
199
+ payoutAttemptStatus({ ...result.job, lastResultAt: undefined }),
200
+ ).toEqual({ currency: "usd", status: "paid", reason: "paid" });
201
+ });
@@ -1,5 +1,8 @@
1
1
  import type { Infer } from "convex/values";
2
- import type { jobDoc } from "../../component/payoutWorker/schema.js";
2
+ import type {
3
+ jobDoc,
4
+ attemptStatus,
5
+ } from "../../component/payoutWorker/schema.js";
3
6
  import type { policyDoc } from "../../component/payoutPolicy/schema.js";
4
7
  import type { Component, RunCtx } from "../helpers.js";
5
8
  import { runMutationOrThrow } from "../helpers.js";
@@ -138,7 +141,48 @@ export class PayoutWorkerClient {
138
141
  throw error;
139
142
  }
140
143
  const reason =
141
- payout.status === "held" ? payout.reason : payout.claim.status;
144
+ payout.status === "held"
145
+ ? payout.reason
146
+ : (payout.claim.rejection?.code ?? payout.claim.status);
142
147
  return { status: "completed", job: await finish(reason), payout };
143
148
  }
144
149
  }
150
+
151
+ export type PayoutAttempt = Infer<typeof attemptStatus>;
152
+ /** Current lease and generation take precedence over a prior result. Legacy timestamps remain unknown. */
153
+ export function payoutAttemptStatus(
154
+ job: PayoutWorkerJob | null,
155
+ now = Date.now(),
156
+ ): PayoutAttempt | null {
157
+ if (!job || (!job.hasOperation && !job.lastReason)) return null;
158
+ const completed = job.completedGeneration === job.generation;
159
+ const running = job.hasOperation && (job.leaseUntil ?? 0) > now;
160
+ const reason =
161
+ job.hasOperation && !completed
162
+ ? "pending_claim"
163
+ : (job.lastReason ?? "pending_claim");
164
+ const status = running
165
+ ? "running"
166
+ : job.hasOperation
167
+ ? "reconciling"
168
+ : ["balance_insufficient", "amount_too_small", "rejected"].includes(
169
+ reason,
170
+ )
171
+ ? "rejected"
172
+ : reason === "paid"
173
+ ? "paid"
174
+ : ["worker_error", "returned"].includes(reason)
175
+ ? "failed"
176
+ : "held";
177
+ const at = running
178
+ ? job.lastAttemptAt
179
+ : job.hasOperation && !completed
180
+ ? undefined
181
+ : job.lastResultAt;
182
+ return {
183
+ currency: job.currency,
184
+ status,
185
+ reason,
186
+ ...(at === undefined ? {} : { at }),
187
+ };
188
+ }