@fantastic.dev/better-stripe 0.11.0 → 0.13.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 (168) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +267 -2
  3. package/dist/client/billing/balanceFunding.d.ts +36 -0
  4. package/dist/client/billing/balanceFunding.d.ts.map +1 -0
  5. package/dist/client/billing/balanceFunding.js +107 -0
  6. package/dist/client/billing/balanceFunding.js.map +1 -0
  7. package/dist/client/billing/invoicePreview.d.ts +28 -0
  8. package/dist/client/billing/invoicePreview.d.ts.map +1 -0
  9. package/dist/client/billing/invoicePreview.js +56 -0
  10. package/dist/client/billing/invoicePreview.js.map +1 -0
  11. package/dist/client/charge-currency-format.d.ts +3 -0
  12. package/dist/client/charge-currency-format.d.ts.map +1 -0
  13. package/dist/client/charge-currency-format.js +22 -0
  14. package/dist/client/charge-currency-format.js.map +1 -0
  15. package/dist/client/charge-currency.d.ts +14 -0
  16. package/dist/client/charge-currency.d.ts.map +1 -0
  17. package/dist/client/charge-currency.js +85 -0
  18. package/dist/client/charge-currency.js.map +1 -0
  19. package/dist/client/costRecovery-invoices.d.ts +38 -0
  20. package/dist/client/costRecovery-invoices.d.ts.map +1 -0
  21. package/dist/client/costRecovery-invoices.js +105 -0
  22. package/dist/client/costRecovery-invoices.js.map +1 -0
  23. package/dist/client/costRecovery.d.ts +156 -0
  24. package/dist/client/costRecovery.d.ts.map +1 -0
  25. package/dist/client/costRecovery.js +117 -0
  26. package/dist/client/costRecovery.js.map +1 -0
  27. package/dist/client/index.d.ts +28 -66
  28. package/dist/client/index.d.ts.map +1 -1
  29. package/dist/client/index.js +25 -0
  30. package/dist/client/index.js.map +1 -1
  31. package/dist/client/products/prices.d.ts +3 -2
  32. package/dist/client/products/prices.d.ts.map +1 -1
  33. package/dist/client/products/prices.js +0 -3
  34. package/dist/client/products/prices.js.map +1 -1
  35. package/dist/client/products/products.d.ts +3 -2
  36. package/dist/client/products/products.d.ts.map +1 -1
  37. package/dist/client/products/products.js +0 -3
  38. package/dist/client/products/products.js.map +1 -1
  39. package/dist/client/settlement/processingCosts.d.ts +56 -0
  40. package/dist/client/settlement/processingCosts.d.ts.map +1 -0
  41. package/dist/client/settlement/processingCosts.js +173 -0
  42. package/dist/client/settlement/processingCosts.js.map +1 -0
  43. package/dist/client/utils/webhookEndpoints.d.ts +1 -1
  44. package/dist/client/utils/webhookEndpoints.d.ts.map +1 -1
  45. package/dist/client/utils/webhookEndpoints.js +1 -0
  46. package/dist/client/utils/webhookEndpoints.js.map +1 -1
  47. package/dist/client/webhooks/processors.d.ts.map +1 -1
  48. package/dist/client/webhooks/processors.js +1 -0
  49. package/dist/client/webhooks/processors.js.map +1 -1
  50. package/dist/component/_generated/component.d.ts +322 -0
  51. package/dist/component/_generated/component.d.ts.map +1 -1
  52. package/dist/component/costRecovery/claims.d.ts +68 -0
  53. package/dist/component/costRecovery/claims.d.ts.map +1 -0
  54. package/dist/component/costRecovery/claims.js +92 -0
  55. package/dist/component/costRecovery/claims.js.map +1 -0
  56. package/dist/component/costRecovery/completion.d.ts +39 -0
  57. package/dist/component/costRecovery/completion.d.ts.map +1 -0
  58. package/dist/component/costRecovery/completion.js +69 -0
  59. package/dist/component/costRecovery/completion.js.map +1 -0
  60. package/dist/component/costRecovery/helpers.d.ts +68 -0
  61. package/dist/component/costRecovery/helpers.d.ts.map +1 -0
  62. package/dist/component/costRecovery/helpers.js +71 -0
  63. package/dist/component/costRecovery/helpers.js.map +1 -0
  64. package/dist/component/costRecovery/mutations.d.ts +210 -0
  65. package/dist/component/costRecovery/mutations.d.ts.map +1 -0
  66. package/dist/component/costRecovery/mutations.js +93 -0
  67. package/dist/component/costRecovery/mutations.js.map +1 -0
  68. package/dist/component/costRecovery/queries.d.ts +108 -0
  69. package/dist/component/costRecovery/queries.d.ts.map +1 -0
  70. package/dist/component/costRecovery/queries.js +73 -0
  71. package/dist/component/costRecovery/queries.js.map +1 -0
  72. package/dist/component/costRecovery/reservations.d.ts +95 -0
  73. package/dist/component/costRecovery/reservations.d.ts.map +1 -0
  74. package/dist/component/costRecovery/reservations.js +134 -0
  75. package/dist/component/costRecovery/reservations.js.map +1 -0
  76. package/dist/component/costRecovery/schema.d.ts +382 -0
  77. package/dist/component/costRecovery/schema.d.ts.map +1 -0
  78. package/dist/component/costRecovery/schema.js +115 -0
  79. package/dist/component/costRecovery/schema.js.map +1 -0
  80. package/dist/component/schema.d.ts +135 -0
  81. package/dist/component/schema.js +5 -0
  82. package/dist/component/schema.js.map +1 -1
  83. package/dist/react/components/PriceCard.d.ts +3 -1
  84. package/dist/react/components/PriceCard.d.ts.map +1 -1
  85. package/dist/react/components/PriceCard.js +2 -2
  86. package/dist/react/components/PriceCard.js.map +1 -1
  87. package/dist/react/index.d.ts +1 -0
  88. package/dist/react/index.d.ts.map +1 -1
  89. package/dist/react/index.js +1 -0
  90. package/dist/react/index.js.map +1 -1
  91. package/dist/react/lib/price-helpers.d.ts +4 -6
  92. package/dist/react/lib/price-helpers.d.ts.map +1 -1
  93. package/dist/react/lib/price-helpers.js +16 -9
  94. package/dist/react/lib/price-helpers.js.map +1 -1
  95. package/dist/react/workflows/Collections.d.ts.map +1 -1
  96. package/dist/react/workflows/Collections.js +2 -1
  97. package/dist/react/workflows/Collections.js.map +1 -1
  98. package/dist/react/workflows/PlanPricingEditor.d.ts +4 -0
  99. package/dist/react/workflows/PlanPricingEditor.d.ts.map +1 -1
  100. package/dist/react/workflows/PlanPricingEditor.js +12 -9
  101. package/dist/react/workflows/PlanPricingEditor.js.map +1 -1
  102. package/dist/react/workflows/Refunds.d.ts +14 -3
  103. package/dist/react/workflows/Refunds.d.ts.map +1 -1
  104. package/dist/react/workflows/Refunds.js +58 -16
  105. package/dist/react/workflows/Refunds.js.map +1 -1
  106. package/dist/react/workflows/index.d.ts +3 -1
  107. package/dist/react/workflows/index.d.ts.map +1 -1
  108. package/dist/react/workflows/index.js +2 -1
  109. package/dist/react/workflows/index.js.map +1 -1
  110. package/dist/react/workflows/refund-preview.d.ts +16 -0
  111. package/dist/react/workflows/refund-preview.d.ts.map +1 -0
  112. package/dist/react/workflows/refund-preview.js +38 -0
  113. package/dist/react/workflows/refund-preview.js.map +1 -0
  114. package/docs/react-workflows.md +167 -1
  115. package/package.json +2 -2
  116. package/src/client/billing/balanceFunding.test.ts +257 -0
  117. package/src/client/billing/balanceFunding.ts +183 -0
  118. package/src/client/billing/balanceFundingTransport.test.ts +89 -0
  119. package/src/client/billing/invoicePreview.test.ts +123 -0
  120. package/src/client/billing/invoicePreview.ts +94 -0
  121. package/src/client/billing/invoicePreviewTransport.test.ts +70 -0
  122. package/src/client/charge-currency-format.ts +29 -0
  123. package/src/client/charge-currency.test.ts +113 -0
  124. package/src/client/charge-currency.ts +119 -0
  125. package/src/client/costRecovery-invoices.test.ts +401 -0
  126. package/src/client/costRecovery-invoices.transport.test.ts +107 -0
  127. package/src/client/costRecovery-invoices.ts +144 -0
  128. package/src/client/costRecovery.test.ts +76 -0
  129. package/src/client/costRecovery.ts +254 -0
  130. package/src/client/index.ts +76 -75
  131. package/src/client/products/prices.ts +13 -11
  132. package/src/client/products/products.ts +10 -10
  133. package/src/client/settlement/processingCosts.test.ts +349 -0
  134. package/src/client/settlement/processingCosts.ts +315 -0
  135. package/src/client/settlement/processingCostsTransport.test.ts +135 -0
  136. package/src/client/utils/webhookEndpoints.test.ts +5 -0
  137. package/src/client/utils/webhookEndpoints.ts +1 -0
  138. package/src/client/webhooks/hooks.test.ts +9 -0
  139. package/src/client/webhooks/payout-canceled.integration.test.ts +192 -0
  140. package/src/client/webhooks/processors.ts +1 -0
  141. package/src/component/_generated/api.ts +12 -0
  142. package/src/component/_generated/component.ts +407 -0
  143. package/src/component/cost-recovery.test.ts +344 -0
  144. package/src/component/costRecovery/claims.ts +119 -0
  145. package/src/component/costRecovery/completion.ts +92 -0
  146. package/src/component/costRecovery/helpers.ts +83 -0
  147. package/src/component/costRecovery/mutations.ts +115 -0
  148. package/src/component/costRecovery/queries.ts +88 -0
  149. package/src/component/costRecovery/reservations.ts +164 -0
  150. package/src/component/costRecovery/schema.ts +135 -0
  151. package/src/component/schema.ts +10 -0
  152. package/src/react/components/PayoutSchedule.render.test.tsx +15 -0
  153. package/src/react/components/PriceCard.render.test.tsx +37 -0
  154. package/src/react/components/PriceCard.tsx +9 -1
  155. package/src/react/index.test.ts +5 -0
  156. package/src/react/index.ts +7 -0
  157. package/src/react/lib/price-helpers.test.ts +15 -2
  158. package/src/react/lib/price-helpers.ts +25 -8
  159. package/src/react/workflows/Billing.test.tsx +1 -1
  160. package/src/react/workflows/Collections.test.tsx +36 -0
  161. package/src/react/workflows/Collections.tsx +3 -1
  162. package/src/react/workflows/PlanPricingEditor.currency.test.tsx +164 -0
  163. package/src/react/workflows/PlanPricingEditor.tsx +26 -10
  164. package/src/react/workflows/Refunds.currency.test.tsx +290 -0
  165. package/src/react/workflows/Refunds.tsx +115 -25
  166. package/src/react/workflows/index.ts +8 -1
  167. package/src/react/workflows/refund-preview.test.ts +65 -0
  168. package/src/react/workflows/refund-preview.ts +56 -0
@@ -0,0 +1,93 @@
1
+ import { getGroup, integer } from "./helpers.js";
2
+ import { v } from "convex/values";
3
+ import { mutation } from "../_generated/server.js";
4
+ import { recordClaim, rollbackClaim } from "./claims.js";
5
+ import { reserveGroup, sealGroup } from "./reservations.js";
6
+ import { finishGroup } from "./completion.js";
7
+ import { observationFields, claimDoc, groupDoc, reservationDoc, reserveArgs, rollbackArgs, finishArgs, } from "./schema.js";
8
+ export const record = mutation({
9
+ args: observationFields,
10
+ returns: claimDoc,
11
+ handler: async (ctx, args) => {
12
+ if (args.claimKey.startsWith("rollback:"))
13
+ throw new Error("Rollback claim keys are reserved.");
14
+ return recordClaim(ctx, args);
15
+ },
16
+ });
17
+ export const rollback = mutation({
18
+ args: rollbackArgs,
19
+ returns: claimDoc,
20
+ handler: rollbackClaim,
21
+ });
22
+ export const reserve = mutation({
23
+ args: reserveArgs,
24
+ returns: v.object({ reservation: reservationDoc, group: groupDoc }),
25
+ handler: reserveGroup,
26
+ });
27
+ export const seal = mutation({
28
+ args: { groupKey: v.string() },
29
+ returns: groupDoc,
30
+ handler: sealGroup,
31
+ });
32
+ export const finish = mutation({
33
+ args: finishArgs,
34
+ returns: v.object({ group: groupDoc, isDone: v.boolean() }),
35
+ handler: finishGroup,
36
+ });
37
+ export const bindInvoiceItem = mutation({
38
+ args: { groupKey: v.string(), invoiceItemId: v.string() },
39
+ returns: groupDoc,
40
+ handler: async (ctx, args) => {
41
+ const group = await ctx.db
42
+ .query("recoveryGroups")
43
+ .withIndex("by_key", (q) => q.eq("groupKey", args.groupKey))
44
+ .unique();
45
+ if (!group ||
46
+ group.sourceKind !== "invoice" ||
47
+ group.status === "open" ||
48
+ group.status === "released" ||
49
+ group.status === "releasing")
50
+ throw new Error("Invoice recovery group must be sealed and active.");
51
+ if (!args.invoiceItemId ||
52
+ (group.invoiceItemId && group.invoiceItemId !== args.invoiceItemId))
53
+ throw new Error("Recovery invoice item identity cannot change.");
54
+ await ctx.db.patch("recoveryGroups", group._id, {
55
+ invoiceItemId: args.invoiceItemId,
56
+ });
57
+ return (await ctx.db.get("recoveryGroups", group._id));
58
+ },
59
+ });
60
+ export const bindInvoiceFunding = mutation({
61
+ args: {
62
+ groupKey: v.string(),
63
+ sourceChargeId: v.string(),
64
+ sourceGross: v.number(),
65
+ sourceProcessingFee: v.number(),
66
+ },
67
+ returns: groupDoc,
68
+ handler: async (ctx, args) => {
69
+ const group = await getGroup(ctx, args.groupKey);
70
+ if (group.sourceKind !== "invoice" || group.status !== "collected")
71
+ throw new Error("Invoice funding requires a collected invoice recovery group.");
72
+ integer(args.sourceGross);
73
+ integer(args.sourceProcessingFee);
74
+ if (!args.sourceChargeId ||
75
+ args.sourceGross <= 0 ||
76
+ args.sourceProcessingFee < 0)
77
+ throw new Error("Invalid invoice funding economics.");
78
+ const funding = {
79
+ sourceChargeId: args.sourceChargeId,
80
+ sourceGross: args.sourceGross,
81
+ sourceProcessingFee: args.sourceProcessingFee,
82
+ };
83
+ if (group.invoiceFunding &&
84
+ Object.keys(funding).some((key) => group.invoiceFunding[key] !==
85
+ funding[key]))
86
+ throw new Error("Original invoice funding economics cannot change.");
87
+ await ctx.db.patch("recoveryGroups", group._id, {
88
+ invoiceFunding: funding,
89
+ });
90
+ return (await ctx.db.get("recoveryGroups", group._id));
91
+ },
92
+ });
93
+ //# sourceMappingURL=mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../src/component/costRecovery/mutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ export declare const balance: import("convex/server").RegisteredQuery<"public", {
2
+ accountId: string;
3
+ currency: string;
4
+ scopeKey: string;
5
+ }, Promise<{
6
+ accountId: string;
7
+ scopeKey: string;
8
+ currency: string;
9
+ amountDue: number;
10
+ collectedAmount: number;
11
+ reservedAmount: number;
12
+ outstanding: number;
13
+ activeGroupKey?: string | undefined;
14
+ }>>;
15
+ export declare const listClaims: import("convex/server").RegisteredQuery<"public", {
16
+ accountId: string;
17
+ currency: string;
18
+ paginationOpts: {
19
+ id?: number;
20
+ endCursor?: string | null;
21
+ maximumRowsRead?: number;
22
+ maximumBytesRead?: number;
23
+ numItems: number;
24
+ cursor: string | null;
25
+ };
26
+ scopeKey: string;
27
+ }, Promise<{
28
+ page: {
29
+ _creationTime: number;
30
+ _id: import("convex/values").GenericId<"recoveryClaims">;
31
+ accountId: string;
32
+ amountDue: number;
33
+ claimKey: string;
34
+ collectedAmount: number;
35
+ currency: string;
36
+ outstanding: number;
37
+ reservedAmount: number;
38
+ revision: number;
39
+ scopeKey: string;
40
+ sign: "negative" | "positive" | "zero";
41
+ sourceChargeId: string;
42
+ sourceGross: number;
43
+ sourceProcessingFee: number;
44
+ }[];
45
+ continueCursor: string;
46
+ isDone: boolean;
47
+ }>>;
48
+ export declare const group: import("convex/server").RegisteredQuery<"public", {
49
+ groupKey: string;
50
+ }, Promise<{
51
+ _creationTime: number;
52
+ _id: import("convex/values").GenericId<"recoveryGroups">;
53
+ accountId: string;
54
+ amount: number;
55
+ currency: string;
56
+ groupKey: string;
57
+ invoiceFunding?: {
58
+ sourceChargeId: string;
59
+ sourceGross: number;
60
+ sourceProcessingFee: number;
61
+ } | undefined;
62
+ invoiceItemId?: string | undefined;
63
+ maxCredit: number;
64
+ maxDebit: number;
65
+ pendingOperations: number;
66
+ scopeKey: string;
67
+ sourceGross?: number | undefined;
68
+ sourceId: string;
69
+ sourceKind: "invoice" | "settlement";
70
+ sourceProcessingFee?: number | undefined;
71
+ status: "collected" | "collecting" | "open" | "released" | "releasing" | "sealed";
72
+ } | null>>;
73
+ export declare const reservation: import("convex/server").RegisteredQuery<"public", {
74
+ operationKey: string;
75
+ }, Promise<{
76
+ _creationTime: number;
77
+ _id: import("convex/values").GenericId<"recoveryReservations">;
78
+ allocations: {
79
+ amount: number;
80
+ claimId: import("convex/values").GenericId<"recoveryClaims">;
81
+ claimKey: string;
82
+ }[];
83
+ amount: number;
84
+ groupKey: string;
85
+ limit: number;
86
+ operationKey: string;
87
+ status: "collected" | "empty" | "released" | "reserved";
88
+ } | null>>;
89
+ export declare const claim: import("convex/server").RegisteredQuery<"public", {
90
+ claimKey: string;
91
+ }, Promise<{
92
+ _creationTime: number;
93
+ _id: import("convex/values").GenericId<"recoveryClaims">;
94
+ accountId: string;
95
+ amountDue: number;
96
+ claimKey: string;
97
+ collectedAmount: number;
98
+ currency: string;
99
+ outstanding: number;
100
+ reservedAmount: number;
101
+ revision: number;
102
+ scopeKey: string;
103
+ sign: "negative" | "positive" | "zero";
104
+ sourceChargeId: string;
105
+ sourceGross: number;
106
+ sourceProcessingFee: number;
107
+ } | null>>;
108
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/component/costRecovery/queries.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,OAAO;;;;;;;;;;;;;GAiBlB,CAAC;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BrB,CAAC;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;UAQhB,CAAC;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;UAQtB,CAAC;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;UAQhB,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { paginationOptsValidator } from "convex/server";
2
+ import { v } from "convex/values";
3
+ import { query } from "../_generated/server.js";
4
+ import { balanceFields, claimDoc, groupDoc, scopeFields, reservationDoc, } from "./schema.js";
5
+ import { readBalance, scopeOnly, validateScope, batchLimit, } from "./helpers.js";
6
+ export const balance = query({
7
+ args: scopeFields,
8
+ returns: v.object(balanceFields),
9
+ handler: async (ctx, args) => {
10
+ validateScope(args);
11
+ const stored = await readBalance(ctx, args);
12
+ return {
13
+ ...scopeOnly(args),
14
+ amountDue: stored?.amountDue ?? 0,
15
+ collectedAmount: stored?.collectedAmount ?? 0,
16
+ reservedAmount: stored?.reservedAmount ?? 0,
17
+ outstanding: stored?.outstanding ?? 0,
18
+ ...(stored?.activeGroupKey
19
+ ? { activeGroupKey: stored.activeGroupKey }
20
+ : {}),
21
+ };
22
+ },
23
+ });
24
+ export const listClaims = query({
25
+ args: { ...scopeFields, paginationOpts: paginationOptsValidator },
26
+ returns: v.object({
27
+ page: v.array(claimDoc),
28
+ continueCursor: v.string(),
29
+ isDone: v.boolean(),
30
+ }),
31
+ handler: async (ctx, args) => {
32
+ validateScope(args);
33
+ batchLimit(args.paginationOpts.numItems);
34
+ const result = await ctx.db
35
+ .query("recoveryClaims")
36
+ .withIndex("by_scope", (q) => q
37
+ .eq("accountId", args.accountId)
38
+ .eq("scopeKey", args.scopeKey)
39
+ .eq("currency", args.currency))
40
+ .order("desc")
41
+ .paginate(args.paginationOpts);
42
+ return {
43
+ page: result.page,
44
+ continueCursor: result.continueCursor,
45
+ isDone: result.isDone,
46
+ };
47
+ },
48
+ });
49
+ export const group = query({
50
+ args: { groupKey: v.string() },
51
+ returns: v.union(groupDoc, v.null()),
52
+ handler: (ctx, args) => ctx.db
53
+ .query("recoveryGroups")
54
+ .withIndex("by_key", (q) => q.eq("groupKey", args.groupKey))
55
+ .unique(),
56
+ });
57
+ export const reservation = query({
58
+ args: { operationKey: v.string() },
59
+ returns: v.union(reservationDoc, v.null()),
60
+ handler: (ctx, args) => ctx.db
61
+ .query("recoveryReservations")
62
+ .withIndex("by_key", (q) => q.eq("operationKey", args.operationKey))
63
+ .unique(),
64
+ });
65
+ export const claim = query({
66
+ args: { claimKey: v.string() },
67
+ returns: v.union(claimDoc, v.null()),
68
+ handler: (ctx, args) => ctx.db
69
+ .query("recoveryClaims")
70
+ .withIndex("by_key", (q) => q.eq("claimKey", args.claimKey))
71
+ .unique(),
72
+ });
73
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/component/costRecovery/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { MutationCtx } from "../_generated/server.js";
2
+ import type { Infer } from "convex/values";
3
+ declare const _reserveArgs: import("convex/values").VObject<{
4
+ accountId: string;
5
+ currency: string;
6
+ groupKey: string;
7
+ limit?: number | undefined;
8
+ maxCredit: number;
9
+ maxDebit: number;
10
+ operationKey: string;
11
+ scopeKey: string;
12
+ sourceGross?: number | undefined;
13
+ sourceId: string;
14
+ sourceKind: "invoice" | "settlement";
15
+ sourceProcessingFee?: number | undefined;
16
+ }, {
17
+ accountId: import("convex/values").VString<string, "required">;
18
+ scopeKey: import("convex/values").VString<string, "required">;
19
+ currency: import("convex/values").VString<string, "required">;
20
+ groupKey: import("convex/values").VString<string, "required">;
21
+ sourceKind: import("convex/values").VUnion<"invoice" | "settlement", [import("convex/values").VLiteral<"settlement", "required">, import("convex/values").VLiteral<"invoice", "required">], "required", never>;
22
+ sourceId: import("convex/values").VString<string, "required">;
23
+ sourceGross: import("convex/values").VFloat64<number | undefined, "optional">;
24
+ sourceProcessingFee: import("convex/values").VFloat64<number | undefined, "optional">;
25
+ maxDebit: import("convex/values").VFloat64<number, "required">;
26
+ maxCredit: import("convex/values").VFloat64<number, "required">;
27
+ operationKey: import("convex/values").VString<string, "required">;
28
+ limit: import("convex/values").VFloat64<number | undefined, "optional">;
29
+ }, "required", "accountId" | "currency" | "groupKey" | "limit" | "maxCredit" | "maxDebit" | "operationKey" | "scopeKey" | "sourceGross" | "sourceId" | "sourceKind" | "sourceProcessingFee">;
30
+ export declare function reserveGroup(ctx: MutationCtx, args: Infer<typeof _reserveArgs>): Promise<{
31
+ reservation: {
32
+ _creationTime: number;
33
+ _id: import("convex/values").GenericId<"recoveryReservations">;
34
+ allocations: {
35
+ amount: number;
36
+ claimId: import("convex/values").GenericId<"recoveryClaims">;
37
+ claimKey: string;
38
+ }[];
39
+ amount: number;
40
+ groupKey: string;
41
+ limit: number;
42
+ operationKey: string;
43
+ status: "collected" | "empty" | "released" | "reserved";
44
+ };
45
+ group: {
46
+ _creationTime: number;
47
+ _id: import("convex/values").GenericId<"recoveryGroups">;
48
+ accountId: string;
49
+ amount: number;
50
+ currency: string;
51
+ groupKey: string;
52
+ invoiceFunding?: {
53
+ sourceChargeId: string;
54
+ sourceGross: number;
55
+ sourceProcessingFee: number;
56
+ } | undefined;
57
+ invoiceItemId?: string | undefined;
58
+ maxCredit: number;
59
+ maxDebit: number;
60
+ pendingOperations: number;
61
+ scopeKey: string;
62
+ sourceGross?: number | undefined;
63
+ sourceId: string;
64
+ sourceKind: "invoice" | "settlement";
65
+ sourceProcessingFee?: number | undefined;
66
+ status: "collected" | "collecting" | "open" | "released" | "releasing" | "sealed";
67
+ };
68
+ }>;
69
+ export declare function sealGroup(ctx: MutationCtx, args: {
70
+ groupKey: string;
71
+ }): Promise<{
72
+ _creationTime: number;
73
+ _id: import("convex/values").GenericId<"recoveryGroups">;
74
+ accountId: string;
75
+ amount: number;
76
+ currency: string;
77
+ groupKey: string;
78
+ invoiceFunding?: {
79
+ sourceChargeId: string;
80
+ sourceGross: number;
81
+ sourceProcessingFee: number;
82
+ } | undefined;
83
+ invoiceItemId?: string | undefined;
84
+ maxCredit: number;
85
+ maxDebit: number;
86
+ pendingOperations: number;
87
+ scopeKey: string;
88
+ sourceGross?: number | undefined;
89
+ sourceId: string;
90
+ sourceKind: "invoice" | "settlement";
91
+ sourceProcessingFee?: number | undefined;
92
+ status: "collected" | "collecting" | "open" | "released" | "releasing" | "sealed";
93
+ }>;
94
+ export {};
95
+ //# sourceMappingURL=reservations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservations.d.ts","sourceRoot":"","sources":["../../../src/component/costRecovery/reservations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAY3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;4LAAwB,CAAC;AAC3C,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,KAAK,CAAC,OAAO,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyIjC;AACD,wBAAsB,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;GAQ3E"}
@@ -0,0 +1,134 @@
1
+ import { v } from "convex/values";
2
+ import { reserveArgs } from "./schema.js";
3
+ import { balance, batchLimit, getGroup, groupTarget, integer, sign, validateScope, } from "./helpers.js";
4
+ const _reserveArgs = v.object(reserveArgs);
5
+ export async function reserveGroup(ctx, args) {
6
+ validateScope(args);
7
+ const limit = args.limit ?? 100;
8
+ batchLimit(limit);
9
+ [args.maxDebit, args.maxCredit].forEach(integer);
10
+ if (!args.groupKey.trim() ||
11
+ !args.operationKey.trim() ||
12
+ !args.sourceId ||
13
+ args.maxDebit < 0 ||
14
+ args.maxCredit < 0)
15
+ throw new Error("Invalid recovery operation identity or limits.");
16
+ if (args.sourceGross !== undefined && integer(args.sourceGross) <= 0)
17
+ throw new Error("Funding gross must be positive.");
18
+ if (args.sourceProcessingFee !== undefined &&
19
+ integer(args.sourceProcessingFee) < 0)
20
+ throw new Error("Funding processing fee must be nonnegative.");
21
+ if (args.sourceKind === "settlement" &&
22
+ (!args.sourceGross || args.sourceProcessingFee === undefined))
23
+ throw new Error("Settlement recovery requires original funding gross.");
24
+ let group = await ctx.db
25
+ .query("recoveryGroups")
26
+ .withIndex("by_key", (q) => q.eq("groupKey", args.groupKey))
27
+ .unique();
28
+ const existing = await ctx.db
29
+ .query("recoveryReservations")
30
+ .withIndex("by_key", (q) => q.eq("operationKey", args.operationKey))
31
+ .unique();
32
+ if (group)
33
+ for (const key of [
34
+ "accountId",
35
+ "scopeKey",
36
+ "currency",
37
+ "sourceKind",
38
+ "sourceId",
39
+ "sourceGross",
40
+ "sourceProcessingFee",
41
+ "maxDebit",
42
+ "maxCredit",
43
+ ])
44
+ if (group[key] !== args[key])
45
+ throw new Error("Recovery group identity and limits cannot change.");
46
+ if (existing) {
47
+ if (existing.groupKey !== args.groupKey ||
48
+ existing.limit !== limit ||
49
+ !group)
50
+ throw new Error("Recovery operation identity cannot change.");
51
+ return { reservation: existing, group };
52
+ }
53
+ const ledger = await balance(ctx, args);
54
+ if (ledger.activeGroupKey && ledger.activeGroupKey !== args.groupKey)
55
+ throw new Error("Another recovery boundary is pending.");
56
+ if (group && group.status !== "open")
57
+ throw new Error("Recovery group is sealed; replay its existing operations.");
58
+ if (!group) {
59
+ const { operationKey: _operationKey, limit: _limit, ...input } = args;
60
+ const id = await ctx.db.insert("recoveryGroups", {
61
+ ...input,
62
+ amount: 0,
63
+ pendingOperations: 0,
64
+ status: "open",
65
+ });
66
+ group = (await ctx.db.get("recoveryGroups", id));
67
+ }
68
+ const delta = integer(groupTarget(group, ledger.outstanding) - group.amount);
69
+ const direction = sign(delta);
70
+ let remaining = Math.abs(delta), amount = 0;
71
+ const allocations = [];
72
+ if (direction !== "zero") {
73
+ const claims = await ctx.db
74
+ .query("recoveryClaims")
75
+ .withIndex("by_sign", (q) => q
76
+ .eq("accountId", args.accountId)
77
+ .eq("scopeKey", args.scopeKey)
78
+ .eq("currency", args.currency)
79
+ .eq("sign", direction))
80
+ .take(limit);
81
+ for (const claim of claims) {
82
+ if (!remaining)
83
+ break;
84
+ const take = Math.min(remaining, Math.abs(claim.outstanding)) * (delta < 0 ? -1 : 1);
85
+ const reservedAmount = integer(claim.reservedAmount + take), outstanding = integer(claim.outstanding - take);
86
+ await ctx.db.patch("recoveryClaims", claim._id, {
87
+ reservedAmount,
88
+ outstanding,
89
+ sign: sign(outstanding),
90
+ });
91
+ allocations.push({
92
+ claimId: claim._id,
93
+ claimKey: claim.claimKey,
94
+ amount: take,
95
+ });
96
+ amount = integer(amount + take);
97
+ remaining -= Math.abs(take);
98
+ }
99
+ }
100
+ const reservationId = await ctx.db.insert("recoveryReservations", {
101
+ operationKey: args.operationKey,
102
+ groupKey: args.groupKey,
103
+ amount,
104
+ limit,
105
+ allocations,
106
+ status: allocations.length ? "reserved" : "empty",
107
+ });
108
+ if (allocations.length) {
109
+ await ctx.db.patch("recoveryBalances", ledger._id, {
110
+ reservedAmount: integer(ledger.reservedAmount + amount),
111
+ outstanding: integer(ledger.outstanding - amount),
112
+ activeGroupKey: group.groupKey,
113
+ });
114
+ await ctx.db.patch("recoveryGroups", group._id, {
115
+ amount: integer(group.amount + amount),
116
+ pendingOperations: group.pendingOperations + 1,
117
+ });
118
+ }
119
+ return {
120
+ reservation: (await ctx.db.get("recoveryReservations", reservationId)),
121
+ group: (await ctx.db.get("recoveryGroups", group._id)),
122
+ };
123
+ }
124
+ export async function sealGroup(ctx, args) {
125
+ const group = await getGroup(ctx, args.groupKey);
126
+ if (group.status !== "open")
127
+ return group;
128
+ const ledger = await balance(ctx, group);
129
+ if (groupTarget(group, ledger.outstanding) !== group.amount)
130
+ throw new Error("Recovery needs another reservation batch before sealing.");
131
+ await ctx.db.patch("recoveryGroups", group._id, { status: "sealed" });
132
+ return (await ctx.db.get("recoveryGroups", group._id));
133
+ }
134
+ //# sourceMappingURL=reservations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservations.js","sourceRoot":"","sources":["../../../src/component/costRecovery/reservations.ts"],"names":[],"mappings":"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"}