@fantastic.dev/better-stripe 0.23.1 → 0.24.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.
- package/CHANGELOG.md +26 -2
- package/README.md +40 -5
- package/dist/client/affiliateRecovery/disputes.d.ts +18 -0
- package/dist/client/affiliateRecovery/disputes.d.ts.map +1 -0
- package/dist/client/affiliateRecovery/disputes.js +33 -0
- package/dist/client/affiliateRecovery/disputes.js.map +1 -0
- package/dist/client/affiliateRecovery/engine.d.ts +29 -0
- package/dist/client/affiliateRecovery/engine.d.ts.map +1 -0
- package/dist/client/affiliateRecovery/engine.js +116 -0
- package/dist/client/affiliateRecovery/engine.js.map +1 -0
- package/dist/client/affiliateRecovery/payoutGate.d.ts +24 -0
- package/dist/client/affiliateRecovery/payoutGate.d.ts.map +1 -0
- package/dist/client/affiliateRecovery/payoutGate.js +30 -0
- package/dist/client/affiliateRecovery/payoutGate.js.map +1 -0
- package/dist/client/affiliateRecovery/provider.d.ts +14 -0
- package/dist/client/affiliateRecovery/provider.d.ts.map +1 -0
- package/dist/client/affiliateRecovery/provider.js +96 -0
- package/dist/client/affiliateRecovery/provider.js.map +1 -0
- package/dist/client/affiliateRecovery/review.d.ts +28 -0
- package/dist/client/affiliateRecovery/review.d.ts.map +1 -0
- package/dist/client/affiliateRecovery/review.js +86 -0
- package/dist/client/affiliateRecovery/review.js.map +1 -0
- package/dist/client/affiliateRecovery/validators.d.ts +402 -0
- package/dist/client/affiliateRecovery/validators.d.ts.map +1 -0
- package/dist/client/affiliateRecovery/validators.js +27 -0
- package/dist/client/affiliateRecovery/validators.js.map +1 -0
- package/dist/client/affiliateRecovery.d.ts +131 -0
- package/dist/client/affiliateRecovery.d.ts.map +1 -0
- package/dist/client/affiliateRecovery.js +69 -0
- package/dist/client/affiliateRecovery.js.map +1 -0
- package/dist/client/connect/commissionReceipts.d.ts +4 -0
- package/dist/client/connect/commissionReceipts.d.ts.map +1 -0
- package/dist/client/connect/commissionReceipts.js +17 -0
- package/dist/client/connect/commissionReceipts.js.map +1 -0
- package/dist/client/connect/payoutAdoptionTestHelpers.d.ts +536 -2
- package/dist/client/connect/payoutAdoptionTestHelpers.d.ts.map +1 -1
- package/dist/client/connect/payoutSync.d.ts +32 -0
- package/dist/client/connect/payoutSync.d.ts.map +1 -0
- package/dist/client/connect/payoutSync.js +48 -0
- package/dist/client/connect/payoutSync.js.map +1 -0
- package/dist/client/connect/payoutSyncTestHelpers.d.ts +1509 -0
- package/dist/client/connect/payoutSyncTestHelpers.d.ts.map +1 -0
- package/dist/client/connect/payoutSyncTestHelpers.js +62 -0
- package/dist/client/connect/payoutSyncTestHelpers.js.map +1 -0
- package/dist/client/connect/payoutSyncValidation.d.ts +16 -0
- package/dist/client/connect/payoutSyncValidation.d.ts.map +1 -0
- package/dist/client/connect/payoutSyncValidation.js +54 -0
- package/dist/client/connect/payoutSyncValidation.js.map +1 -0
- package/dist/client/connect/payouts.d.ts +3 -1
- package/dist/client/connect/payouts.d.ts.map +1 -1
- package/dist/client/connect/payouts.js +45 -12
- package/dist/client/connect/payouts.js.map +1 -1
- package/dist/client/connect/refundPrincipal.d.ts +4 -0
- package/dist/client/connect/refundPrincipal.d.ts.map +1 -0
- package/dist/client/connect/refundPrincipal.js +21 -0
- package/dist/client/connect/refundPrincipal.js.map +1 -0
- package/dist/client/connect/reversalExecution.d.ts +47 -0
- package/dist/client/connect/reversalExecution.d.ts.map +1 -0
- package/dist/client/connect/reversalExecution.js +84 -0
- package/dist/client/connect/reversalExecution.js.map +1 -0
- package/dist/client/connect/transfers.d.ts +8 -4
- package/dist/client/connect/transfers.d.ts.map +1 -1
- package/dist/client/connect/transfers.js +52 -57
- package/dist/client/connect/transfers.js.map +1 -1
- package/dist/client/index.d.ts +29 -9
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +9 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/readContracts.d.ts +8 -0
- package/dist/client/readContracts.d.ts.map +1 -1
- package/dist/client/readContracts.js +7 -0
- package/dist/client/readContracts.js.map +1 -1
- package/dist/client/settlement/execution.d.ts.map +1 -1
- package/dist/client/settlement/execution.js +30 -3
- package/dist/client/settlement/execution.js.map +1 -1
- package/dist/client/settlement/reconciliation.d.ts.map +1 -1
- package/dist/client/settlement/reconciliation.js +16 -2
- package/dist/client/settlement/reconciliation.js.map +1 -1
- package/dist/client/webhooks/disputeRecovery.d.ts +4 -0
- package/dist/client/webhooks/disputeRecovery.d.ts.map +1 -0
- package/dist/client/webhooks/disputeRecovery.js +40 -0
- package/dist/client/webhooks/disputeRecovery.js.map +1 -0
- package/dist/client/webhooks/processors.d.ts.map +1 -1
- package/dist/client/webhooks/processors.js +14 -29
- package/dist/client/webhooks/processors.js.map +1 -1
- package/dist/component/_generated/component.d.ts +560 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/affiliateEarnings/mutations.d.ts +22 -0
- package/dist/component/affiliateEarnings/mutations.d.ts.map +1 -0
- package/dist/component/affiliateEarnings/mutations.js +160 -0
- package/dist/component/affiliateEarnings/mutations.js.map +1 -0
- package/dist/component/affiliatePayouts/mutations.d.ts +25 -0
- package/dist/component/affiliatePayouts/mutations.d.ts.map +1 -0
- package/dist/component/affiliatePayouts/mutations.js +104 -0
- package/dist/component/affiliatePayouts/mutations.js.map +1 -0
- package/dist/component/affiliatePayouts/queries.d.ts +23 -0
- package/dist/component/affiliatePayouts/queries.d.ts.map +1 -0
- package/dist/component/affiliatePayouts/queries.js +23 -0
- package/dist/component/affiliatePayouts/queries.js.map +1 -0
- package/dist/component/affiliatePayouts/recipientGuard.d.ts +12 -0
- package/dist/component/affiliatePayouts/recipientGuard.d.ts.map +1 -0
- package/dist/component/affiliatePayouts/recipientGuard.js +26 -0
- package/dist/component/affiliatePayouts/recipientGuard.js.map +1 -0
- package/dist/component/affiliateRecovery/accounting.d.ts +28 -0
- package/dist/component/affiliateRecovery/accounting.d.ts.map +1 -0
- package/dist/component/affiliateRecovery/accounting.js +71 -0
- package/dist/component/affiliateRecovery/accounting.js.map +1 -0
- package/dist/component/affiliateRecovery/mutations.d.ts +65 -0
- package/dist/component/affiliateRecovery/mutations.d.ts.map +1 -0
- package/dist/component/affiliateRecovery/mutations.js +250 -0
- package/dist/component/affiliateRecovery/mutations.js.map +1 -0
- package/dist/component/affiliateRecovery/queries.d.ts +305 -0
- package/dist/component/affiliateRecovery/queries.d.ts.map +1 -0
- package/dist/component/affiliateRecovery/queries.js +113 -0
- package/dist/component/affiliateRecovery/queries.js.map +1 -0
- package/dist/component/affiliateRecovery/schema.d.ts +171 -0
- package/dist/component/affiliateRecovery/schema.d.ts.map +1 -0
- package/dist/component/affiliateRecovery/schema.js +71 -0
- package/dist/component/affiliateRecovery/schema.js.map +1 -0
- package/dist/component/connect/mutations.d.ts +36 -23
- package/dist/component/connect/mutations.d.ts.map +1 -1
- package/dist/component/connect/mutations.js +11 -151
- package/dist/component/connect/mutations.js.map +1 -1
- package/dist/component/connect/payoutWrites.d.ts +21 -0
- package/dist/component/connect/payoutWrites.d.ts.map +1 -0
- package/dist/component/connect/payoutWrites.js +19 -0
- package/dist/component/connect/payoutWrites.js.map +1 -0
- package/dist/component/connect/queries.d.ts +10 -0
- package/dist/component/connect/queries.d.ts.map +1 -1
- package/dist/component/connect/queries.js +3 -40
- package/dist/component/connect/queries.js.map +1 -1
- package/dist/component/connect/reversalClaims.d.ts +169 -0
- package/dist/component/connect/reversalClaims.d.ts.map +1 -0
- package/dist/component/connect/reversalClaims.js +176 -0
- package/dist/component/connect/reversalClaims.js.map +1 -0
- package/dist/component/connect/reversalDiagnostics.d.ts +59 -0
- package/dist/component/connect/reversalDiagnostics.d.ts.map +1 -0
- package/dist/component/connect/reversalDiagnostics.js +50 -0
- package/dist/component/connect/reversalDiagnostics.js.map +1 -0
- package/dist/component/connect/reversalReceipts.d.ts +27 -0
- package/dist/component/connect/reversalReceipts.d.ts.map +1 -0
- package/dist/component/connect/reversalReceipts.js +85 -0
- package/dist/component/connect/reversalReceipts.js.map +1 -0
- package/dist/component/connect/schema.d.ts +31 -1
- package/dist/component/connect/schema.d.ts.map +1 -1
- package/dist/component/connect/schema.js +3 -1
- package/dist/component/connect/schema.js.map +1 -1
- package/dist/component/connect/validators.d.ts +49 -1
- package/dist/component/connect/validators.d.ts.map +1 -1
- package/dist/component/connect/validators.js +2 -0
- package/dist/component/connect/validators.js.map +1 -1
- package/dist/component/earnings/triggers.d.ts +454 -2
- package/dist/component/earnings/triggers.d.ts.map +1 -1
- package/dist/component/payoutRelease/mutations.d.ts.map +1 -1
- package/dist/component/payoutRelease/mutations.js +6 -0
- package/dist/component/payoutRelease/mutations.js.map +1 -1
- package/dist/component/payoutRelease/queries.d.ts.map +1 -1
- package/dist/component/payoutRelease/queries.js +3 -1
- package/dist/component/payoutRelease/queries.js.map +1 -1
- package/dist/component/payoutSync/helpers.d.ts +44 -0
- package/dist/component/payoutSync/helpers.d.ts.map +1 -0
- package/dist/component/payoutSync/helpers.js +60 -0
- package/dist/component/payoutSync/helpers.js.map +1 -0
- package/dist/component/payoutSync/mutations.d.ts +51 -0
- package/dist/component/payoutSync/mutations.d.ts.map +1 -0
- package/dist/component/payoutSync/mutations.js +88 -0
- package/dist/component/payoutSync/mutations.js.map +1 -0
- package/dist/component/payoutSync/queries.d.ts +16 -0
- package/dist/component/payoutSync/queries.d.ts.map +1 -0
- package/dist/component/payoutSync/queries.js +11 -0
- package/dist/component/payoutSync/queries.js.map +1 -0
- package/dist/component/payoutSync/schema.d.ts +46 -0
- package/dist/component/payoutSync/schema.d.ts.map +1 -0
- package/dist/component/payoutSync/schema.js +22 -0
- package/dist/component/payoutSync/schema.js.map +1 -0
- package/dist/component/payoutSync/validators.d.ts +137 -0
- package/dist/component/payoutSync/validators.d.ts.map +1 -0
- package/dist/component/payoutSync/validators.js +19 -0
- package/dist/component/payoutSync/validators.js.map +1 -0
- package/dist/component/schema.d.ts +268 -1
- package/dist/component/schema.js +11 -0
- package/dist/component/schema.js.map +1 -1
- package/dist/component/settlement/clawbackSchema.d.ts +161 -0
- package/dist/component/settlement/clawbackSchema.d.ts.map +1 -0
- package/dist/component/settlement/clawbackSchema.js +73 -0
- package/dist/component/settlement/clawbackSchema.js.map +1 -0
- package/dist/component/settlement/clawbacks.d.ts +55 -0
- package/dist/component/settlement/clawbacks.d.ts.map +1 -0
- package/dist/component/settlement/clawbacks.js +146 -0
- package/dist/component/settlement/clawbacks.js.map +1 -0
- package/dist/component/settlement/mutations.d.ts +16 -0
- package/dist/component/settlement/mutations.d.ts.map +1 -1
- package/dist/component/settlement/mutations.js +48 -0
- package/dist/component/settlement/mutations.js.map +1 -1
- package/dist/component/settlement/queries.d.ts +53 -0
- package/dist/component/settlement/queries.d.ts.map +1 -1
- package/dist/component/settlement/queries.js +26 -0
- package/dist/component/settlement/queries.js.map +1 -1
- package/dist/react/workflows/AffiliateRecovery.d.ts +46 -0
- package/dist/react/workflows/AffiliateRecovery.d.ts.map +1 -0
- package/dist/react/workflows/AffiliateRecovery.js +84 -0
- package/dist/react/workflows/AffiliateRecovery.js.map +1 -0
- package/dist/react/workflows/index.d.ts +2 -0
- package/dist/react/workflows/index.d.ts.map +1 -1
- package/dist/react/workflows/index.js +1 -0
- package/dist/react/workflows/index.js.map +1 -1
- package/dist/testing/affiliate-recovery.d.ts +10 -0
- package/dist/testing/affiliate-recovery.d.ts.map +1 -0
- package/dist/testing/affiliate-recovery.js +126 -0
- package/dist/testing/affiliate-recovery.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/docs/affiliate-clawbacks.md +306 -0
- package/docs/read-contracts.md +40 -5
- package/docs/settlement.md +17 -0
- package/package.json +2 -1
- package/src/client/affiliateRecovery/disputes.ts +62 -0
- package/src/client/affiliateRecovery/engine.ts +196 -0
- package/src/client/affiliateRecovery/payoutGate.ts +65 -0
- package/src/client/affiliateRecovery/provider.ts +127 -0
- package/src/client/affiliateRecovery/review.ts +117 -0
- package/src/client/affiliateRecovery/validators.ts +38 -0
- package/src/client/affiliateRecovery.ts +173 -0
- package/src/client/connect/commissionReceipts.test.ts +157 -0
- package/src/client/connect/commissionReceipts.ts +23 -0
- package/src/client/connect/payoutSync.test.ts +313 -0
- package/src/client/connect/payoutSync.ts +93 -0
- package/src/client/connect/payoutSyncTestHelpers.ts +82 -0
- package/src/client/connect/payoutSyncValidation.ts +74 -0
- package/src/client/connect/payouts.ts +75 -15
- package/src/client/connect/refundPrincipal.test.ts +46 -0
- package/src/client/connect/refundPrincipal.ts +26 -0
- package/src/client/connect/reversalExecution.ts +130 -0
- package/src/client/connect/transfers.test.ts +3 -3
- package/src/client/connect/transfers.ts +93 -92
- package/src/client/index.ts +20 -18
- package/src/client/readContracts.ts +12 -0
- package/src/client/settlement/execution.test.ts +5 -0
- package/src/client/settlement/execution.ts +50 -3
- package/src/client/settlement/reconciliation.ts +20 -2
- package/src/client/webhooks/disputeRecovery.ts +74 -0
- package/src/client/webhooks/processors.test.ts +36 -53
- package/src/client/webhooks/processors.ts +18 -31
- package/src/component/_generated/api.ts +34 -0
- package/src/component/_generated/component.ts +696 -1
- package/src/component/affiliate-clawbacks.test.ts +370 -0
- package/src/component/affiliate-component-pagination.test.ts +83 -0
- package/src/component/affiliate-direct-payout.test.ts +160 -0
- package/src/component/affiliate-recovery-lifecycle.test.ts +587 -0
- package/src/component/affiliateEarnings/mutations.ts +196 -0
- package/src/component/affiliatePayouts/mutations.ts +121 -0
- package/src/component/affiliatePayouts/queries.ts +28 -0
- package/src/component/affiliatePayouts/recipientGuard.ts +42 -0
- package/src/component/affiliateRecovery/accounting.ts +111 -0
- package/src/component/affiliateRecovery/mutations.ts +275 -0
- package/src/component/affiliateRecovery/queries.ts +138 -0
- package/src/component/affiliateRecovery/schema.ts +86 -0
- package/src/component/connect/mutations.ts +13 -190
- package/src/component/connect/payoutWrites.ts +25 -0
- package/src/component/connect/queries.ts +4 -47
- package/src/component/connect/reversalClaims.ts +232 -0
- package/src/component/connect/reversalDiagnostics.ts +61 -0
- package/src/component/connect/reversalReceipts.ts +147 -0
- package/src/component/connect/schema.ts +3 -3
- package/src/component/connect/validators.ts +2 -0
- package/src/component/payout-recovery-integration.test.ts +172 -0
- package/src/component/payout-sync.test.ts +117 -0
- package/src/component/payoutRelease/mutations.ts +9 -0
- package/src/component/payoutRelease/queries.ts +3 -1
- package/src/component/payoutSync/helpers.ts +86 -0
- package/src/component/payoutSync/mutations.ts +102 -0
- package/src/component/payoutSync/queries.ts +10 -0
- package/src/component/payoutSync/schema.ts +25 -0
- package/src/component/payoutSync/validators.ts +21 -0
- package/src/component/schema.ts +20 -0
- package/src/component/settlement/clawbackSchema.ts +78 -0
- package/src/component/settlement/clawbacks.ts +233 -0
- package/src/component/settlement/mutations.ts +54 -0
- package/src/component/settlement/queries.ts +35 -0
- package/src/component/summary-arithmetic.test.ts +9 -4
- package/src/react/workflows/AffiliateRecovery.test.tsx +106 -0
- package/src/react/workflows/AffiliateRecovery.tsx +273 -0
- package/src/react/workflows/index.ts +9 -0
- package/src/testing/affiliate-recovery.ts +137 -0
- package/src/testing/index.ts +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payoutSyncTestHelpers.d.ts","sourceRoot":"","sources":["../../../src/client/connect/payoutSyncTestHelpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIvD,eAAO,MAAM,SAAS,EAIN,SAAS,CAAC;AAC1B,MAAM,MAAM,KAAK,GACf;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAClE,KAAK,IAAI,GAAG,CACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,KAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;AACtB,wBAAsB,SAAS,kBAU9B;AACD,wBAAsB,KAAK,CACzB,KAAK,GAAE,KAAsD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAKxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkCzC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQtC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// @vitest-environment edge-runtime
|
|
2
|
+
import { convexTest } from "convex-test";
|
|
3
|
+
import { makeFunctionReference } from "convex/server";
|
|
4
|
+
import { expect, vi } from "vitest";
|
|
5
|
+
import schema from "../../component/schema.js";
|
|
6
|
+
const modules = import.meta.glob("../../component/**/*.*s");
|
|
7
|
+
const symbol = Symbol.for("toReferencePath");
|
|
8
|
+
export const component = {
|
|
9
|
+
payoutPolicy: {
|
|
10
|
+
queries: { get: { [symbol]: "betterStripe/payoutPolicy/queries/get" } },
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
export async function operation() {
|
|
14
|
+
const path = "./payoutSync.js";
|
|
15
|
+
const mod = (await import(path).catch(() => ({})));
|
|
16
|
+
expect(mod.syncPayoutFromStripe, "authoritative payout synchronization is missing").toBeTypeOf("function");
|
|
17
|
+
return mod.syncPayoutFromStripe;
|
|
18
|
+
}
|
|
19
|
+
export async function setup(scope = { type: "connected", accountId: "acct_owner" }) {
|
|
20
|
+
const t = convexTest(schema, modules);
|
|
21
|
+
const path = (ref) => ref[symbol].replace("betterStripe/", "").replace(/\/(\w+)$/, ":$1");
|
|
22
|
+
const mutate = (ref, args) => t.mutation(makeFunctionReference(path(ref)), args);
|
|
23
|
+
const ctx = {
|
|
24
|
+
runQuery: (ref, args) => t.query(makeFunctionReference(path(ref)), args),
|
|
25
|
+
runMutation: mutate,
|
|
26
|
+
};
|
|
27
|
+
let payout = {
|
|
28
|
+
id: "po_one",
|
|
29
|
+
amount: 500,
|
|
30
|
+
currency: "jpy",
|
|
31
|
+
status: "paid",
|
|
32
|
+
arrival_date: 200,
|
|
33
|
+
created: 100,
|
|
34
|
+
automatic: true,
|
|
35
|
+
method: "standard",
|
|
36
|
+
type: "bank_account",
|
|
37
|
+
source_type: "card",
|
|
38
|
+
destination: "ba_one",
|
|
39
|
+
balance_transaction: "txn_pending",
|
|
40
|
+
failure_code: null,
|
|
41
|
+
failure_message: null,
|
|
42
|
+
metadata: { accountId: "acct_metadata_is_not_authority" },
|
|
43
|
+
};
|
|
44
|
+
const retrieve = vi.fn(async () => ({ ...payout }));
|
|
45
|
+
const provider = { payouts: { retrieve } };
|
|
46
|
+
const sync = await operation();
|
|
47
|
+
return {
|
|
48
|
+
t,
|
|
49
|
+
ctx,
|
|
50
|
+
mutate,
|
|
51
|
+
retrieve,
|
|
52
|
+
provider,
|
|
53
|
+
scope,
|
|
54
|
+
set: (patch) => {
|
|
55
|
+
payout = { ...payout, ...patch };
|
|
56
|
+
},
|
|
57
|
+
read: () => ({ ...payout }),
|
|
58
|
+
run: () => sync(provider, component, ctx, { stripePayoutId: "po_one", scope }),
|
|
59
|
+
row: () => t.run((ctx) => ctx.db.query("payouts").unique()),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=payoutSyncTestHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payoutSyncTestHelpers.js","sourceRoot":"","sources":["../../../src/client/connect/payoutSyncTestHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type Stripe from "stripe";
|
|
2
|
+
import type { Infer } from "convex/values";
|
|
3
|
+
import type { snapshot } from "../../component/payoutSync/validators.js";
|
|
4
|
+
export type PayoutSyncScope = {
|
|
5
|
+
type: "connected";
|
|
6
|
+
accountId: string;
|
|
7
|
+
} | {
|
|
8
|
+
type: "platform";
|
|
9
|
+
};
|
|
10
|
+
export declare function payoutAccount(scope: PayoutSyncScope): string;
|
|
11
|
+
/** Status observations do not establish funding maturity or payout eligibility. */
|
|
12
|
+
export declare function payoutSnapshot(p: Stripe.Payout, args: {
|
|
13
|
+
stripePayoutId: string;
|
|
14
|
+
accountId: string;
|
|
15
|
+
}): Infer<typeof snapshot>;
|
|
16
|
+
//# sourceMappingURL=payoutSyncValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payoutSyncValidation.d.ts","sourceRoot":"","sources":["../../../src/client/connect/payoutSyncValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAKzE,MAAM,MAAM,eAAe,GACzB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,UAWnD;AACD,mFAAmF;AACnF,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,CAAC,MAAM,EAChB,IAAI,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClD,KAAK,CAAC,OAAO,QAAQ,CAAC,CAgDxB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { validateIdentity, validateSnapshot, } from "../../component/payoutSync/helpers.js";
|
|
2
|
+
export function payoutAccount(scope) {
|
|
3
|
+
if (scope?.type === "platform" && Object.keys(scope).length === 1)
|
|
4
|
+
return "platform";
|
|
5
|
+
if (scope?.type === "connected" &&
|
|
6
|
+
Object.keys(scope).length === 2 &&
|
|
7
|
+
typeof scope.accountId === "string" &&
|
|
8
|
+
/^acct_[A-Za-z0-9_]+$/.test(scope.accountId))
|
|
9
|
+
return scope.accountId;
|
|
10
|
+
throw new Error("Payout synchronization scope must be explicit.");
|
|
11
|
+
}
|
|
12
|
+
/** Status observations do not establish funding maturity or payout eligibility. */
|
|
13
|
+
export function payoutSnapshot(p, args) {
|
|
14
|
+
validateIdentity(args);
|
|
15
|
+
if (!p || typeof p !== "object")
|
|
16
|
+
throw new Error("Provider payout response is unavailable.");
|
|
17
|
+
if (p.id !== args.stripePayoutId)
|
|
18
|
+
throw new Error("Provider payout identity does not match.");
|
|
19
|
+
if ((p.status !== "pending" &&
|
|
20
|
+
p.status !== "paid" &&
|
|
21
|
+
p.status !== "failed" &&
|
|
22
|
+
p.status !== "canceled" &&
|
|
23
|
+
p.status !== "in_transit") ||
|
|
24
|
+
typeof p.automatic !== "boolean" ||
|
|
25
|
+
!["standard", "instant"].includes(p.method))
|
|
26
|
+
throw new Error("Provider payout status or method is unsupported.");
|
|
27
|
+
if (!Number.isSafeInteger(p.arrival_date) ||
|
|
28
|
+
p.arrival_date < 0 ||
|
|
29
|
+
!Number.isSafeInteger(p.arrival_date * 1000) ||
|
|
30
|
+
p.arrival_date * 1000 > 8640000000000000)
|
|
31
|
+
throw new Error("Invalid provider payout arrival date.");
|
|
32
|
+
if ((p.failure_code != null && typeof p.failure_code !== "string") ||
|
|
33
|
+
(p.failure_message != null && typeof p.failure_message !== "string"))
|
|
34
|
+
throw new Error("Invalid provider payout failure detail.");
|
|
35
|
+
const metadata = p.metadata ?? {};
|
|
36
|
+
if (typeof metadata !== "object" ||
|
|
37
|
+
Array.isArray(metadata) ||
|
|
38
|
+
Object.values(metadata).some((v) => typeof v !== "string"))
|
|
39
|
+
throw new Error("Invalid provider payout metadata.");
|
|
40
|
+
const result = {
|
|
41
|
+
...args,
|
|
42
|
+
amount: p.amount,
|
|
43
|
+
currency: p.currency,
|
|
44
|
+
status: p.status,
|
|
45
|
+
arrivalDate: new Date(p.arrival_date * 1000).toISOString(),
|
|
46
|
+
method: p.method,
|
|
47
|
+
failureCode: p.failure_code ?? undefined,
|
|
48
|
+
failureMessage: p.failure_message ?? undefined,
|
|
49
|
+
metadata,
|
|
50
|
+
};
|
|
51
|
+
validateSnapshot(result);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=payoutSyncValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payoutSyncValidation.js","sourceRoot":"","sources":["../../../src/client/connect/payoutSyncValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,8 @@ export declare function getAccountBalance(stripe: Stripe, opts: {
|
|
|
27
27
|
stripeAccountId: string;
|
|
28
28
|
}): Promise<AccountBalance[]>;
|
|
29
29
|
export type CreatePayoutOptions = {
|
|
30
|
+
/** Host-authorized minimum in the payout currency. */
|
|
31
|
+
minimumAmount?: number;
|
|
30
32
|
stripeAccountId: string;
|
|
31
33
|
amount: number;
|
|
32
34
|
currency?: string;
|
|
@@ -34,7 +36,7 @@ export type CreatePayoutOptions = {
|
|
|
34
36
|
/** Stripe idempotency key for retry-safe payout creation. */
|
|
35
37
|
idempotencyKey?: string;
|
|
36
38
|
};
|
|
37
|
-
export declare function createPayout(stripe: Stripe,
|
|
39
|
+
export declare function createPayout(stripe: Stripe, ctx: RunCtx, opts: CreatePayoutOptions, component?: Component): Promise<{
|
|
38
40
|
stripePayoutId: string;
|
|
39
41
|
}>;
|
|
40
42
|
export declare function getPayout(component: Component, ctx: RunCtx, opts: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payouts.d.ts","sourceRoot":"","sources":["../../../src/client/connect/payouts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payouts.d.ts","sourceRoot":"","sources":["../../../src/client/connect/payouts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAOvD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,cAAc,EAAE,CAAC,CAiB3B;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,mBAAmB,EACzB,SAAS,CAAC,EAAE,SAAS;;GAmEtB;AAED,wBAAsB,SAAS,CAC7B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,gBAM3B;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,gBAO3E"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { reserveAffiliatePayout, completeAffiliatePayout, reconcileAffiliatePayout, } from "../affiliateRecovery/payoutGate.js";
|
|
2
|
+
import { classifyRecoveryError } from "../affiliateRecovery/provider.js";
|
|
1
3
|
import { componentRef } from "../webhooks/helpers.js";
|
|
2
4
|
/**
|
|
3
5
|
* Retrieve a connected account's balance (BTS-65), scoped to that account via
|
|
@@ -26,18 +28,49 @@ export async function getAccountBalance(stripe, opts) {
|
|
|
26
28
|
entryFor(p.currency).pending += p.amount;
|
|
27
29
|
return [...byCurrency.values()];
|
|
28
30
|
}
|
|
29
|
-
export async function createPayout(stripe,
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
export async function createPayout(stripe, ctx, opts, component) {
|
|
32
|
+
const release = component
|
|
33
|
+
? await reserveAffiliatePayout(component, ctx, opts)
|
|
34
|
+
: null;
|
|
35
|
+
if (release?.state === "submitted")
|
|
36
|
+
return { stripePayoutId: release.stripePayoutId };
|
|
37
|
+
if (release?.state === "failed")
|
|
38
|
+
throw new Error("Affiliate payout failed; use a new authorized operation key.");
|
|
39
|
+
try {
|
|
40
|
+
if (release) {
|
|
41
|
+
const receiptId = await reconcileAffiliatePayout(stripe, release);
|
|
42
|
+
if (receiptId) {
|
|
43
|
+
await completeAffiliatePayout(component, ctx, release.operationKey, "submitted", receiptId);
|
|
44
|
+
return { stripePayoutId: receiptId };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (release) {
|
|
48
|
+
if (Date.now() - release.createdAt >= 23 * 60 * 60 * 1000)
|
|
49
|
+
throw new Error("Affiliate payout idempotency window expired; reconcile the provider receipt before retrying.");
|
|
50
|
+
// Receipt lookup may yield while a refund records new debt.
|
|
51
|
+
await reserveAffiliatePayout(component, ctx, opts);
|
|
52
|
+
}
|
|
53
|
+
const payout = await stripe.payouts.create({
|
|
54
|
+
amount: opts.amount,
|
|
55
|
+
currency: opts.currency ?? "usd",
|
|
56
|
+
metadata: release
|
|
57
|
+
? { ...opts.metadata, bsAffiliatePayout: release._id }
|
|
58
|
+
: (opts.metadata ?? undefined),
|
|
59
|
+
}, {
|
|
60
|
+
stripeAccount: opts.stripeAccountId,
|
|
61
|
+
...(opts.idempotencyKey !== undefined
|
|
62
|
+
? { idempotencyKey: opts.idempotencyKey }
|
|
63
|
+
: {}),
|
|
64
|
+
});
|
|
65
|
+
if (release)
|
|
66
|
+
await completeAffiliatePayout(component, ctx, release.operationKey, "submitted", payout.id);
|
|
67
|
+
return { stripePayoutId: payout.id };
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (release)
|
|
71
|
+
await completeAffiliatePayout(component, ctx, release.operationKey, classifyRecoveryError(error).state === "unknown" ? "unknown" : "failed");
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
41
74
|
}
|
|
42
75
|
export async function getPayout(component, ctx, opts) {
|
|
43
76
|
return ctx.runQuery(componentRef(component, "connect/queries/getPayout"), opts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payouts.js","sourceRoot":"","sources":["../../../src/client/connect/payouts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payouts.js","sourceRoot":"","sources":["../../../src/client/connect/payouts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refundPrincipal.d.ts","sourceRoot":"","sources":["../../../src/client/connect/refundPrincipal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,mFAAmF;AACnF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,mBAoBjB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Charge.amount_refunded also includes pending refunds; only success is final. */
|
|
2
|
+
export async function successfulRefundPrincipal(stripe, chargeId) {
|
|
3
|
+
let principal = 0;
|
|
4
|
+
let count = 0;
|
|
5
|
+
for await (const refund of stripe.refunds.list({
|
|
6
|
+
charge: chargeId,
|
|
7
|
+
limit: 100,
|
|
8
|
+
})) {
|
|
9
|
+
if (++count > 1000)
|
|
10
|
+
throw new Error("Successful refund lookup limit exceeded.");
|
|
11
|
+
if (refund.status !== "succeeded")
|
|
12
|
+
continue;
|
|
13
|
+
if (!Number.isSafeInteger(refund.amount) ||
|
|
14
|
+
refund.amount < 0 ||
|
|
15
|
+
!Number.isSafeInteger(principal + refund.amount))
|
|
16
|
+
throw new Error("Invalid successful refund principal.");
|
|
17
|
+
principal += refund.amount;
|
|
18
|
+
}
|
|
19
|
+
return principal;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=refundPrincipal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refundPrincipal.js","sourceRoot":"","sources":["../../../src/client/connect/refundPrincipal.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAc,EACd,QAAgB;IAEhB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,GAAG;KACX,CAAC,EAAE,CAAC;QACH,IAAI,EAAE,KAAK,GAAG,IAAI;YAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;YAAE,SAAS;QAC5C,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;YACpC,MAAM,CAAC,MAAM,GAAG,CAAC;YACjB,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAEhD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type Stripe from "stripe";
|
|
2
|
+
import type { Component, RunCtx } from "../helpers.js";
|
|
3
|
+
export type ClaimedSlice = {
|
|
4
|
+
stripeTransferId: string;
|
|
5
|
+
/** Cumulative reversed amount this slice starts from. */
|
|
6
|
+
from: number;
|
|
7
|
+
/** Cumulative reversed amount this slice raises the leg to. */
|
|
8
|
+
to: number;
|
|
9
|
+
/** The leg's confirmed `reversedAmount` at claim time. */
|
|
10
|
+
confirmed: number;
|
|
11
|
+
commissionTracked?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ReversalClaim = {
|
|
14
|
+
replay: boolean;
|
|
15
|
+
slices: ClaimedSlice[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Execute the slices an operation claimed via `claimReversalSlices` (BTS-63).
|
|
19
|
+
* The claim already reserved this money atomically, so all that's left is
|
|
20
|
+
* moving it: one `bs_rev_<operationId>_<transferId>` reversal per slice, then
|
|
21
|
+
* confirming the new cumulative total in the ledger. A replayed claim always
|
|
22
|
+
* re-sends byte-identical params under the same key, which Stripe answers
|
|
23
|
+
* from its idempotency cache without moving money twice.
|
|
24
|
+
*
|
|
25
|
+
* Because Stripe prunes idempotency keys after ~24h (and a crash can land
|
|
26
|
+
* between the Stripe call and the ledger confirm), a replay first checks the
|
|
27
|
+
* transfer's live `amount_reversed`: if the slice's money already moved, it
|
|
28
|
+
* just confirms the ledger instead of re-sending the reversal.
|
|
29
|
+
*
|
|
30
|
+
* A slice only executes once every predecessor slice on its leg is confirmed
|
|
31
|
+
* (`confirmed ≥ from`). Without that gate, a sibling operation landing behind
|
|
32
|
+
* a transiently-failed claim would execute and confirm PAST the hole; the
|
|
33
|
+
* failed operation's retry would then see `confirmed ≥ to` and silently skip
|
|
34
|
+
* — its money would never move while the ledger says it did. Throwing instead
|
|
35
|
+
* fails this operation's webhook event, and at-least-once delivery retries
|
|
36
|
+
* both operations until the predecessor fills its hole and each claimed slice
|
|
37
|
+
* has actually moved. The ledger's `reversedAmount` therefore always covers a
|
|
38
|
+
* solid, hole-free prefix of the reversed axis — which is exactly what makes
|
|
39
|
+
* the `confirmed`/`amount_reversed` checks above sound.
|
|
40
|
+
*/
|
|
41
|
+
export declare function executeClaimedSlices(stripe: Stripe, component: Component, ctx: RunCtx, operationId: string, claim: ReversalClaim): Promise<{
|
|
42
|
+
reversals: {
|
|
43
|
+
stripeTransferId: string;
|
|
44
|
+
amount: number;
|
|
45
|
+
}[];
|
|
46
|
+
}>;
|
|
47
|
+
//# sourceMappingURL=reversalExecution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reversalExecution.d.ts","sourceRoot":"","sources":["../../../src/client/connect/reversalExecution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAKvD,MAAM,MAAM,YAAY,GAAG;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,SAAS,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAgFxE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { runMutationOrThrow } from "../helpers.js";
|
|
2
|
+
import { componentRef } from "../webhooks/helpers.js";
|
|
3
|
+
import { findCommissionReversal } from "./commissionReceipts.js";
|
|
4
|
+
/**
|
|
5
|
+
* Execute the slices an operation claimed via `claimReversalSlices` (BTS-63).
|
|
6
|
+
* The claim already reserved this money atomically, so all that's left is
|
|
7
|
+
* moving it: one `bs_rev_<operationId>_<transferId>` reversal per slice, then
|
|
8
|
+
* confirming the new cumulative total in the ledger. A replayed claim always
|
|
9
|
+
* re-sends byte-identical params under the same key, which Stripe answers
|
|
10
|
+
* from its idempotency cache without moving money twice.
|
|
11
|
+
*
|
|
12
|
+
* Because Stripe prunes idempotency keys after ~24h (and a crash can land
|
|
13
|
+
* between the Stripe call and the ledger confirm), a replay first checks the
|
|
14
|
+
* transfer's live `amount_reversed`: if the slice's money already moved, it
|
|
15
|
+
* just confirms the ledger instead of re-sending the reversal.
|
|
16
|
+
*
|
|
17
|
+
* A slice only executes once every predecessor slice on its leg is confirmed
|
|
18
|
+
* (`confirmed ≥ from`). Without that gate, a sibling operation landing behind
|
|
19
|
+
* a transiently-failed claim would execute and confirm PAST the hole; the
|
|
20
|
+
* failed operation's retry would then see `confirmed ≥ to` and silently skip
|
|
21
|
+
* — its money would never move while the ledger says it did. Throwing instead
|
|
22
|
+
* fails this operation's webhook event, and at-least-once delivery retries
|
|
23
|
+
* both operations until the predecessor fills its hole and each claimed slice
|
|
24
|
+
* has actually moved. The ledger's `reversedAmount` therefore always covers a
|
|
25
|
+
* solid, hole-free prefix of the reversed axis — which is exactly what makes
|
|
26
|
+
* the `confirmed`/`amount_reversed` checks above sound.
|
|
27
|
+
*/
|
|
28
|
+
export async function executeClaimedSlices(stripe, component, ctx, operationId, claim) {
|
|
29
|
+
const reversals = [];
|
|
30
|
+
for (const slice of claim.slices) {
|
|
31
|
+
const receiptAmount = slice.to - slice.from;
|
|
32
|
+
if (slice.commissionTracked && claim.replay) {
|
|
33
|
+
const receipt = await findCommissionReversal(stripe, slice.stripeTransferId, operationId, receiptAmount);
|
|
34
|
+
if (receipt) {
|
|
35
|
+
await runMutationOrThrow(ctx, componentRef(component, "connect/mutations/recordTransferReversal"), {
|
|
36
|
+
stripeTransferId: slice.stripeTransferId,
|
|
37
|
+
reversedAmount: slice.to,
|
|
38
|
+
receipt: {
|
|
39
|
+
stripeReversalId: receipt.id,
|
|
40
|
+
operationId,
|
|
41
|
+
amount: receiptAmount,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (slice.confirmed >= slice.to)
|
|
47
|
+
throw new Error("Commission reversal requires receipt reconciliation.");
|
|
48
|
+
}
|
|
49
|
+
if (slice.confirmed >= slice.to)
|
|
50
|
+
continue; // executed and recorded already
|
|
51
|
+
if (slice.confirmed < slice.from) {
|
|
52
|
+
throw new Error(`reversal slice [${slice.from},${slice.to}) on ${slice.stripeTransferId} ` +
|
|
53
|
+
`blocked: predecessor claim unexecuted (confirmed=${slice.confirmed})`);
|
|
54
|
+
}
|
|
55
|
+
if (claim.replay && !slice.commissionTracked) {
|
|
56
|
+
const transfer = await stripe.transfers.retrieve(slice.stripeTransferId);
|
|
57
|
+
if ((transfer.amount_reversed ?? 0) >= slice.to) {
|
|
58
|
+
// The money moved on a previous attempt that died before confirming.
|
|
59
|
+
await runMutationOrThrow(ctx, componentRef(component, "connect/mutations/recordTransferReversal"), {
|
|
60
|
+
stripeTransferId: slice.stripeTransferId,
|
|
61
|
+
reversedAmount: slice.to,
|
|
62
|
+
});
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const amount = slice.to - slice.from;
|
|
67
|
+
const receipt = await stripe.transfers.createReversal(slice.stripeTransferId, {
|
|
68
|
+
amount,
|
|
69
|
+
...(slice.commissionTracked
|
|
70
|
+
? { metadata: { bsReversalOperation: operationId } }
|
|
71
|
+
: {}),
|
|
72
|
+
}, { idempotencyKey: `bs_rev_${operationId}_${slice.stripeTransferId}` });
|
|
73
|
+
await runMutationOrThrow(ctx, componentRef(component, "connect/mutations/recordTransferReversal"), {
|
|
74
|
+
stripeTransferId: slice.stripeTransferId,
|
|
75
|
+
reversedAmount: slice.to,
|
|
76
|
+
...(slice.commissionTracked
|
|
77
|
+
? { receipt: { stripeReversalId: receipt.id, operationId, amount } }
|
|
78
|
+
: {}),
|
|
79
|
+
});
|
|
80
|
+
reversals.push({ stripeTransferId: slice.stripeTransferId, amount });
|
|
81
|
+
}
|
|
82
|
+
return { reversals };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=reversalExecution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reversalExecution.js","sourceRoot":"","sources":["../../../src/client/connect/reversalExecution.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,9 +104,9 @@ export declare function reverseTransfers(stripe: Stripe, component: Component, c
|
|
|
104
104
|
}[];
|
|
105
105
|
}>;
|
|
106
106
|
/**
|
|
107
|
-
* Reverse a split sale's transfers pro-rata to
|
|
108
|
-
*
|
|
109
|
-
*
|
|
107
|
+
* Reverse a split sale's transfers pro-rata to cumulative succeeded refunds.
|
|
108
|
+
* Affiliate legs retain the larger refund/dispute commission exposure. Other
|
|
109
|
+
* legs converge on a cumulative reversal TARGET, `round(leg × amountRefunded /
|
|
110
110
|
* chargeAmount)`, and only the delta above the ledger's recorded
|
|
111
111
|
* `reversedAmount` is reversed. Delta-to-target (rather than percent-of-
|
|
112
112
|
* original like {@link reverseTransfers}) is what makes at-least-once webhook
|
|
@@ -127,7 +127,7 @@ export declare function reverseTransfersForRefund(stripe: Stripe, component: Com
|
|
|
127
127
|
refundId: string;
|
|
128
128
|
/** The original charge amount (minor units). */
|
|
129
129
|
chargeAmount: number;
|
|
130
|
-
/**
|
|
130
|
+
/** Cumulative principal of succeeded refunds; exclude pending/failed refunds. */
|
|
131
131
|
amountRefunded: number;
|
|
132
132
|
}): Promise<{
|
|
133
133
|
reversals: {
|
|
@@ -135,6 +135,7 @@ export declare function reverseTransfersForRefund(stripe: Stripe, component: Com
|
|
|
135
135
|
amount: number;
|
|
136
136
|
}[];
|
|
137
137
|
}>;
|
|
138
|
+
export { reverseTransfersForDispute } from "../affiliateRecovery/disputes.js";
|
|
138
139
|
/**
|
|
139
140
|
* Webhook-driven split transfer engine (BTS-22). After a charge succeeds for a
|
|
140
141
|
* separate-charges sale, fan funds out to each split recipient: compute the
|
|
@@ -163,6 +164,9 @@ export declare function reinstateTransfers(stripe: Stripe, component: Component,
|
|
|
163
164
|
sourceChargeId: string;
|
|
164
165
|
operationId: string;
|
|
165
166
|
currency: string;
|
|
167
|
+
excludeAffiliates?: boolean;
|
|
168
|
+
chargeAmount?: number;
|
|
169
|
+
refundedPrincipal?: number;
|
|
166
170
|
}): Promise<{
|
|
167
171
|
reinstated: {
|
|
168
172
|
destinationAccountId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfers.d.ts","sourceRoot":"","sources":["../../../src/client/connect/transfers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transfers.d.ts","sourceRoot":"","sources":["../../../src/client/connect/transfers.ts"],"names":[],"mappings":"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"}
|