@owlmeans/server-payment 0.1.18-rc.2 → 0.1.18-rc.21

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 (222) hide show
  1. package/README.md +109 -25
  2. package/agent-meta/manifest.json +2 -2
  3. package/agent-meta/skills/server-payment/SKILL.md +475 -52
  4. package/build/actions/index.d.ts +1 -0
  5. package/build/actions/index.d.ts.map +1 -1
  6. package/build/actions/index.js +1 -0
  7. package/build/actions/index.js.map +1 -1
  8. package/build/actions/resync-subscriptions.d.ts +3 -0
  9. package/build/actions/resync-subscriptions.d.ts.map +1 -0
  10. package/build/actions/resync-subscriptions.js +7 -0
  11. package/build/actions/resync-subscriptions.js.map +1 -0
  12. package/build/actions/resync.d.ts +1 -0
  13. package/build/actions/resync.d.ts.map +1 -1
  14. package/build/actions/resync.js +7 -3
  15. package/build/actions/resync.js.map +1 -1
  16. package/build/actions/webhook.d.ts.map +1 -1
  17. package/build/actions/webhook.js +6 -3
  18. package/build/actions/webhook.js.map +1 -1
  19. package/build/config.d.ts +60 -5
  20. package/build/config.d.ts.map +1 -1
  21. package/build/config.js +237 -5
  22. package/build/config.js.map +1 -1
  23. package/build/consts.d.ts +75 -3
  24. package/build/consts.d.ts.map +1 -1
  25. package/build/consts.js +94 -5
  26. package/build/consts.js.map +1 -1
  27. package/build/consumer/capture.d.ts +74 -0
  28. package/build/consumer/capture.d.ts.map +1 -0
  29. package/build/consumer/capture.js +291 -0
  30. package/build/consumer/capture.js.map +1 -0
  31. package/build/consumer/format.d.ts +27 -0
  32. package/build/consumer/format.d.ts.map +1 -0
  33. package/build/consumer/format.js +81 -0
  34. package/build/consumer/format.js.map +1 -0
  35. package/build/consumer/handlers.d.ts +28 -0
  36. package/build/consumer/handlers.d.ts.map +1 -0
  37. package/build/consumer/handlers.js +173 -0
  38. package/build/consumer/handlers.js.map +1 -0
  39. package/build/consumer/index.d.ts +7 -0
  40. package/build/consumer/index.d.ts.map +1 -0
  41. package/build/consumer/index.js +6 -0
  42. package/build/consumer/index.js.map +1 -0
  43. package/build/consumer/mail.d.ts +27 -0
  44. package/build/consumer/mail.d.ts.map +1 -0
  45. package/build/consumer/mail.js +314 -0
  46. package/build/consumer/mail.js.map +1 -0
  47. package/build/consumer/origin.d.ts +14 -0
  48. package/build/consumer/origin.d.ts.map +1 -0
  49. package/build/consumer/origin.js +47 -0
  50. package/build/consumer/origin.js.map +1 -0
  51. package/build/consumer/reconcile.d.ts +12 -0
  52. package/build/consumer/reconcile.d.ts.map +1 -0
  53. package/build/consumer/reconcile.js +317 -0
  54. package/build/consumer/reconcile.js.map +1 -0
  55. package/build/consumer/records.d.ts +78 -0
  56. package/build/consumer/records.d.ts.map +1 -0
  57. package/build/consumer/records.js +296 -0
  58. package/build/consumer/records.js.map +1 -0
  59. package/build/consumer/service.d.ts +51 -0
  60. package/build/consumer/service.d.ts.map +1 -0
  61. package/build/consumer/service.js +760 -0
  62. package/build/consumer/service.js.map +1 -0
  63. package/build/consumer/withdrawal.d.ts +57 -0
  64. package/build/consumer/withdrawal.d.ts.map +1 -0
  65. package/build/consumer/withdrawal.js +247 -0
  66. package/build/consumer/withdrawal.js.map +1 -0
  67. package/build/entitlement.d.ts +10 -0
  68. package/build/entitlement.d.ts.map +1 -0
  69. package/build/entitlement.js +69 -0
  70. package/build/entitlement.js.map +1 -0
  71. package/build/entrypoints.d.ts +1 -1
  72. package/build/entrypoints.d.ts.map +1 -1
  73. package/build/entrypoints.js +2 -1
  74. package/build/entrypoints.js.map +1 -1
  75. package/build/gate.d.ts +32 -4
  76. package/build/gate.d.ts.map +1 -1
  77. package/build/gate.js +59 -19
  78. package/build/gate.js.map +1 -1
  79. package/build/index.d.ts +18 -3
  80. package/build/index.d.ts.map +1 -1
  81. package/build/index.js +15 -3
  82. package/build/index.js.map +1 -1
  83. package/build/limit.d.ts +13 -0
  84. package/build/limit.d.ts.map +1 -0
  85. package/build/limit.js +47 -0
  86. package/build/limit.js.map +1 -0
  87. package/build/model.d.ts +10 -1
  88. package/build/model.d.ts.map +1 -1
  89. package/build/model.js +215 -17
  90. package/build/model.js.map +1 -1
  91. package/build/observer.d.ts +9 -0
  92. package/build/observer.d.ts.map +1 -1
  93. package/build/observer.js +38 -12
  94. package/build/observer.js.map +1 -1
  95. package/build/plan.d.ts +22 -0
  96. package/build/plan.d.ts.map +1 -0
  97. package/build/plan.js +72 -0
  98. package/build/plan.js.map +1 -0
  99. package/build/plugins/checkout-plugins.d.ts +49 -0
  100. package/build/plugins/checkout-plugins.d.ts.map +1 -0
  101. package/build/plugins/checkout-plugins.js +124 -0
  102. package/build/plugins/checkout-plugins.js.map +1 -0
  103. package/build/plugins/estimate.d.ts +43 -0
  104. package/build/plugins/estimate.d.ts.map +1 -0
  105. package/build/plugins/estimate.js +268 -0
  106. package/build/plugins/estimate.js.map +1 -0
  107. package/build/plugins/events.d.ts +45 -10
  108. package/build/plugins/events.d.ts.map +1 -1
  109. package/build/plugins/events.js +605 -136
  110. package/build/plugins/events.js.map +1 -1
  111. package/build/plugins/fx.d.ts +31 -0
  112. package/build/plugins/fx.d.ts.map +1 -0
  113. package/build/plugins/fx.js +81 -0
  114. package/build/plugins/fx.js.map +1 -0
  115. package/build/plugins/portal.d.ts +37 -0
  116. package/build/plugins/portal.d.ts.map +1 -0
  117. package/build/plugins/portal.js +265 -0
  118. package/build/plugins/portal.js.map +1 -0
  119. package/build/plugins/refunds.d.ts +33 -0
  120. package/build/plugins/refunds.d.ts.map +1 -0
  121. package/build/plugins/refunds.js +80 -0
  122. package/build/plugins/refunds.js.map +1 -0
  123. package/build/plugins/stripe.d.ts +36 -4
  124. package/build/plugins/stripe.d.ts.map +1 -1
  125. package/build/plugins/stripe.js +492 -97
  126. package/build/plugins/stripe.js.map +1 -1
  127. package/build/plugins/webhook-manager.d.ts +46 -0
  128. package/build/plugins/webhook-manager.d.ts.map +1 -0
  129. package/build/plugins/webhook-manager.js +231 -0
  130. package/build/plugins/webhook-manager.js.map +1 -0
  131. package/build/reconcile.d.ts +15 -0
  132. package/build/reconcile.d.ts.map +1 -0
  133. package/build/reconcile.js +88 -0
  134. package/build/reconcile.js.map +1 -0
  135. package/build/resource.d.ts +12 -1
  136. package/build/resource.d.ts.map +1 -1
  137. package/build/resource.js +97 -6
  138. package/build/resource.js.map +1 -1
  139. package/build/service.d.ts +28 -3
  140. package/build/service.d.ts.map +1 -1
  141. package/build/service.js +146 -19
  142. package/build/service.js.map +1 -1
  143. package/build/subscription.d.ts +48 -0
  144. package/build/subscription.d.ts.map +1 -0
  145. package/build/subscription.js +176 -0
  146. package/build/subscription.js.map +1 -0
  147. package/build/sync.d.ts +28 -1
  148. package/build/sync.d.ts.map +1 -1
  149. package/build/sync.js +208 -31
  150. package/build/sync.js.map +1 -1
  151. package/build/types.d.ts +1115 -36
  152. package/build/types.d.ts.map +1 -1
  153. package/build/usage.d.ts +63 -0
  154. package/build/usage.d.ts.map +1 -0
  155. package/build/usage.js +363 -0
  156. package/build/usage.js.map +1 -0
  157. package/build/utils.d.ts +52 -1
  158. package/build/utils.d.ts.map +1 -1
  159. package/build/utils.js +69 -7
  160. package/build/utils.js.map +1 -1
  161. package/package.json +17 -13
  162. package/src/actions/index.ts +1 -0
  163. package/src/actions/resync-subscriptions.ts +10 -0
  164. package/src/actions/resync.ts +6 -3
  165. package/src/actions/webhook.ts +5 -3
  166. package/src/config.ts +264 -8
  167. package/src/consts.ts +114 -6
  168. package/src/consumer/capture.ts +362 -0
  169. package/src/consumer/format.ts +90 -0
  170. package/src/consumer/handlers.ts +211 -0
  171. package/src/consumer/index.ts +6 -0
  172. package/src/consumer/mail.ts +368 -0
  173. package/src/consumer/origin.ts +63 -0
  174. package/src/consumer/reconcile.ts +329 -0
  175. package/src/consumer/records.ts +374 -0
  176. package/src/consumer/service.ts +868 -0
  177. package/src/consumer/withdrawal.ts +302 -0
  178. package/src/entitlement.ts +84 -0
  179. package/src/entrypoints.ts +2 -1
  180. package/src/gate.ts +88 -21
  181. package/src/index.ts +24 -3
  182. package/src/limit.ts +57 -0
  183. package/src/model.ts +237 -18
  184. package/src/observer.ts +44 -11
  185. package/src/plan.ts +89 -0
  186. package/src/plugins/checkout-plugins.ts +155 -0
  187. package/src/plugins/estimate.ts +339 -0
  188. package/src/plugins/events.ts +677 -121
  189. package/src/plugins/fx.ts +122 -0
  190. package/src/plugins/portal.ts +306 -0
  191. package/src/plugins/refunds.ts +108 -0
  192. package/src/plugins/stripe.ts +581 -96
  193. package/src/plugins/webhook-manager.ts +270 -0
  194. package/src/reconcile.ts +103 -0
  195. package/src/resource.ts +152 -7
  196. package/src/service.ts +174 -18
  197. package/src/subscription.ts +231 -0
  198. package/src/sync.ts +249 -29
  199. package/src/types.ts +1227 -32
  200. package/src/usage.ts +453 -0
  201. package/src/utils.ts +127 -10
  202. package/tests/checkout-consumer.spec.ts +348 -0
  203. package/tests/checkout-plugins.spec.ts +164 -0
  204. package/tests/checkout.spec.ts +184 -83
  205. package/tests/consumer-events.spec.ts +218 -0
  206. package/tests/consumer-fixtures.ts +132 -0
  207. package/tests/consumer-ops.spec.ts +351 -0
  208. package/tests/consumer-rights.integration.spec.ts +150 -0
  209. package/tests/consumer-rights.spec.ts +501 -0
  210. package/tests/context.ts +109 -0
  211. package/tests/entitlement.spec.ts +103 -0
  212. package/tests/estimate.spec.ts +240 -0
  213. package/tests/events.spec.ts +356 -0
  214. package/tests/fake-stripe.ts +972 -0
  215. package/tests/gate.spec.ts +62 -72
  216. package/tests/limit-gate.spec.ts +68 -0
  217. package/tests/portal.spec.ts +200 -0
  218. package/tests/protocol.spec.ts +23 -6
  219. package/tests/sync.spec.ts +114 -0
  220. package/tests/usage.integration.spec.ts +101 -0
  221. package/tests/usage.spec.ts +171 -0
  222. package/tests/webhook-manager.spec.ts +152 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"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"}
package/build/sync.d.ts CHANGED
@@ -1,5 +1,32 @@
1
+ import type Stripe from 'stripe';
2
+ import type { PlanPriceView } from '@owlmeans/payment';
1
3
  import type { Context as ApiContext } from '@owlmeans/server-api';
2
4
  import type { PaymentPlan, PaymentProduct } from './types.js';
3
5
  export declare const planLookupKey: (product: PaymentProduct, plan: PaymentPlan) => string;
4
- export declare const initialize: (ctx: ApiContext) => Promise<void>;
6
+ /** Whether a plan is sold through a paygate: never a free plan; otherwise its own gateways, else the product's. */
7
+ export declare const isSoldThrough: (product: PaymentProduct, plan: PaymentPlan, paygate: string) => boolean;
8
+ /** Every product sold through Stripe with the plans it sells there. */
9
+ export declare const stripePlansOf: (ctx: ApiContext) => Promise<Array<{
10
+ product: PaymentProduct;
11
+ plans: PaymentPlan[];
12
+ }>>;
13
+ /**
14
+ * Synchronize every product sold through Stripe, and its Stripe-sold plans, to Stripe products and
15
+ * prices. A product whose declaration fingerprint is unchanged makes no paygate call. Free plans
16
+ * and plans sold through no Stripe gateway are never synchronized.
17
+ *
18
+ * The declared `PricingPolicy.tax.behavior` (absent by default, so a price's `tax_behavior` stays
19
+ * whatever it already was) is applied to a matching price only while it is `unspecified` — Stripe
20
+ * forbids changing a price once set to `exclusive` or `inclusive` — and to a fresh one on creation.
21
+ * A price carrying the OPPOSITE behavior is deactivated and replaced, same as any other mismatch.
22
+ */
23
+ export declare const syncStripeProducts: (ctx: ApiContext, stripe: Stripe) => Promise<void>;
24
+ /**
25
+ * The prices a product's plans are charged at, per currency, as the last sync stored them — no
26
+ * paygate call, so it works in an unmanaged process. One entry for each Price's default currency
27
+ * (`default: true`) and one per currency option.
28
+ */
29
+ export declare const syncedPlanPrices: (ctx: ApiContext, productSku: string) => Promise<PlanPriceView[]>;
30
+ /** `syncStripeProducts` with this context's own Stripe client. */
31
+ export declare const syncPaymentProducts: (ctx: ApiContext) => Promise<void>;
5
32
  //# sourceMappingURL=sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE7D,eAAO,MAAM,aAAa,YAAa,cAAc,QAAQ,WAAW,KAAG,MACO,CAAA;AAkElF,eAAO,MAAM,UAAU,QAAe,UAAU,KAAG,OAAO,CAAC,IAAI,CAqB9D,CAAA"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAkC,MAAM,YAAY,CAAA;AA6C7F,eAAO,MAAM,aAAa,YAAa,cAAc,QAAQ,WAAW,KAAG,MACO,CAAA;AAElF,mHAAmH;AACnH,eAAO,MAAM,aAAa,YAAa,cAAc,QAAQ,WAAW,WAAW,MAAM,KAAG,OACT,CAAA;AAEnF,uEAAuE;AACvE,eAAO,MAAM,aAAa,QAAe,UAAU,KAAG,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CAerH,CAAA;AAwJD;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,QAAe,UAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAkDtF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,QAAe,UAAU,cAAc,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAkBnG,CAAA;AAED,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,QAAe,UAAU,KAAG,OAAO,CAAC,IAAI,CAChB,CAAA"}
package/build/sync.js CHANGED
@@ -1,18 +1,73 @@
1
1
  import { createHash } from 'node:crypto';
2
- import { CheckoutPricingMode, ProductType } from '@owlmeans/payment';
2
+ import { CheckoutPricingMode, ProductType, TaxBehavior } from '@owlmeans/payment';
3
3
  import { STRIPE_PAYGATE_ALIAS } from './consts.js';
4
- import { fingerprints, payment, stripeClient } from './utils.js';
4
+ import { fingerprints, payment, stripeClient, stripePricingConfig } from './utils.js';
5
+ import { settlementAmount } from './plugins/fx.js';
6
+ /**
7
+ * The exact prices a plan is also charged in: its declared `currencyPrices`, and its catalogue
8
+ * currency when that is one of the consumer-rights region currencies but not the Price's default
9
+ * (a USD catalogue price synced as EUR keeps an exact USD option). A declared price in the default
10
+ * currency replaces the converted default amount instead.
11
+ */
12
+ const optionsOf = (plan, currency, sourceUnitAmount, sourceCurrency, regionCurrencies) => {
13
+ const options = new Map();
14
+ if (sourceCurrency !== currency && regionCurrencies.has(sourceCurrency)) {
15
+ options.set(sourceCurrency, sourceUnitAmount);
16
+ }
17
+ let unitAmount;
18
+ for (const [raw, amount] of Object.entries(plan.currencyPrices ?? {})) {
19
+ const code = raw.toLowerCase();
20
+ const minor = Math.round(amount * 100);
21
+ if (code === currency) {
22
+ unitAmount = minor;
23
+ }
24
+ else {
25
+ options.set(code, minor);
26
+ }
27
+ }
28
+ return {
29
+ ...(unitAmount != null ? { unitAmount } : {}),
30
+ options: [...options.entries()].map(([code, amount]) => ({ currency: code, unitAmount: amount }))
31
+ .sort((a, b) => a.currency.localeCompare(b.currency)),
32
+ };
33
+ };
5
34
  export const planLookupKey = (product, plan) => product.type === ProductType.Consumable ? `${product.sku}-consumable` : plan.sku;
6
- const fingerprintOf = (product, plans) => createHash('sha256')
35
+ /** Whether a plan is sold through a paygate: never a free plan; otherwise its own gateways, else the product's. */
36
+ export const isSoldThrough = (product, plan, paygate) => plan.free !== true && (plan.gateways ?? product.gateways ?? []).includes(paygate);
37
+ /** Every product sold through Stripe with the plans it sells there. */
38
+ export const stripePlansOf = async (ctx) => {
39
+ const products = await payment(ctx).products();
40
+ const result = [];
41
+ for (const product of products) {
42
+ if (!(product.gateways ?? []).includes(STRIPE_PAYGATE_ALIAS)) {
43
+ continue;
44
+ }
45
+ const plans = (await payment(ctx).allPlans(product.sku))
46
+ .filter(plan => isSoldThrough(product, plan, STRIPE_PAYGATE_ALIAS));
47
+ if (plans.length > 0) {
48
+ result.push({ product, plans });
49
+ }
50
+ }
51
+ return result;
52
+ };
53
+ /**
54
+ * `behavior` is hashed alongside the catalogue: an undeclared policy hashes as `null`, so declaring
55
+ * or changing `tax.behavior` re-syncs every product exactly once, the same as any other catalogue
56
+ * edit.
57
+ */
58
+ const fingerprintOf = (product, plans, behavior) => createHash('sha256')
7
59
  .update(JSON.stringify({
8
60
  sku: product.sku, type: product.type, name: product.title,
9
61
  description: product.description ?? null, taxCode: product.taxCode ?? null,
10
62
  unitLabel: product.unitLabel ?? null, services: [...(product.services ?? [])].sort(),
11
- plans: plans.map(plan => ({
12
- sku: plan.sku, price: plan.price, currency: plan.currency ?? 'usd', duration: plan.duration,
13
- recurring: plan.recurring ?? null, pricingMode: plan.pricingMode ?? null,
63
+ behavior,
64
+ plans: plans.map(({ plan, unitAmount, currency, sourceUnitAmount, sourceCurrency, options }) => ({
65
+ sku: plan.sku, price: plan.price, currency, unitAmount, sourceUnitAmount, sourceCurrency,
66
+ duration: plan.duration, recurring: plan.recurring ?? null, pricingMode: plan.pricingMode ?? null,
14
67
  amountPolicy: plan.amountPolicy ?? null, quantityPolicy: plan.quantityPolicy ?? null,
15
68
  lookup: planLookupKey(product, plan),
69
+ // Only when present, so a catalogue without options keeps the fingerprint it always had.
70
+ ...(options.length > 0 ? { options } : {}),
16
71
  })).sort((a, b) => a.sku.localeCompare(b.sku)),
17
72
  })).digest('hex');
18
73
  const ensureStripeProduct = async (stripe, product) => {
@@ -31,63 +86,185 @@ const ensureStripeProduct = async (stripe, product) => {
31
86
  return await stripe.products.create({ id: product.sku, ...params });
32
87
  }
33
88
  };
34
- const activePrices = async (stripe, product) => (await stripe.prices.list({ product: product.sku, active: true, limit: 100 })).data;
89
+ const activePrices = async (stripe, product) => (await stripe.prices.list({ product: product.sku, active: true, limit: 100, expand: ['data.currency_options'] })).data;
90
+ /** A price's `currency_options` besides its default currency (read only once expanded). */
91
+ const priceOptionsOf = (price) => Object.fromEntries(Object.entries(price.currency_options ?? {}).filter(([code]) => code !== price.currency));
92
+ /** Whether a price carries exactly these options (and, with a declared behavior, with that behavior). */
93
+ const optionsMatch = (price, options, behavior) => {
94
+ const current = priceOptionsOf(price);
95
+ if (Object.keys(current).length !== options.length) {
96
+ return false;
97
+ }
98
+ return options.every(option => current[option.currency]?.unit_amount === option.unitAmount
99
+ && (behavior == null || current[option.currency]?.tax_behavior == null
100
+ || current[option.currency]?.tax_behavior === 'unspecified' || current[option.currency]?.tax_behavior === behavior));
101
+ };
35
102
  const deactivateAmountPrice = async (stripe, product, plan) => {
36
103
  const lookup = planLookupKey(product, plan);
37
104
  for (const price of (await activePrices(stripe, product)).filter(item => item.lookup_key === lookup)) {
38
105
  await stripe.prices.update(price.id, { active: false });
39
106
  }
40
107
  };
41
- const ensureStripePrice = async (stripe, product, plan) => {
108
+ /** Whether `price` already carries the OPPOSITE of `behavior` — never `unspecified`, which is not a conflict. */
109
+ const opposesBehavior = (price, behavior) => behavior != null && price.tax_behavior !== 'unspecified' && price.tax_behavior !== behavior;
110
+ /**
111
+ * The behavior the Stripe account's own Tax Settings resolve to for `currency`, or `null` when no
112
+ * default is configured yet (nothing established to disrupt). `inferred_by_currency` follows
113
+ * Stripe's own rule: exclusive for USD/CAD, inclusive otherwise.
114
+ */
115
+ const accountDefaultBehavior = async (stripe, currency) => {
116
+ const { defaults } = await stripe.tax.settings.retrieve();
117
+ if (defaults.tax_behavior === 'inferred_by_currency') {
118
+ return ['usd', 'cad'].includes(currency.toLowerCase()) ? TaxBehavior.Exclusive : TaxBehavior.Inclusive;
119
+ }
120
+ if (defaults.tax_behavior === 'exclusive')
121
+ return TaxBehavior.Exclusive;
122
+ if (defaults.tax_behavior === 'inclusive')
123
+ return TaxBehavior.Inclusive;
124
+ return null;
125
+ };
126
+ /**
127
+ * Give `price` the declared `behavior` while it is still `unspecified` (the only state Stripe lets
128
+ * an existing price's `tax_behavior` be set from). Skipped, with a `console.error`, when the
129
+ * account's own default resolves to the opposite behavior — applying ours would then change what an
130
+ * existing renewal actually charges — unless `migrateUnspecifiedPrices` opts into that migration.
131
+ */
132
+ const applyUnspecifiedBehavior = async (stripe, price, lookupKey, behavior, migrateUnspecifiedPrices) => {
133
+ if (!migrateUnspecifiedPrices) {
134
+ const resolved = await accountDefaultBehavior(stripe, price.currency);
135
+ if (resolved != null && resolved !== behavior) {
136
+ console.error(`[payment] price '${lookupKey}' left 'unspecified': the Stripe account's default tax `
137
+ + `behavior for ${price.currency.toUpperCase()} is '${resolved}', not the declared `
138
+ + `'${behavior}' — applying it would change existing renewal amounts. Set `
139
+ + '`stripe.migrateUnspecifiedPrices` to override.');
140
+ return;
141
+ }
142
+ }
143
+ await stripe.prices.update(price.id, { tax_behavior: behavior });
144
+ };
145
+ const ensureStripePrice = async (stripe, product, resolved, behavior, migrateUnspecifiedPrices) => {
146
+ const { plan, unitAmount, currency, options } = resolved;
42
147
  if (plan.pricingMode === CheckoutPricingMode.Amount) {
43
148
  await deactivateAmountPrice(stripe, product, plan);
44
- return;
149
+ return null;
45
150
  }
46
151
  const lookupKey = planLookupKey(product, plan);
47
- const unitAmount = Math.round(plan.price * 100);
48
- const currency = plan.currency ?? 'usd';
49
152
  const recurring = plan.recurring != null
50
153
  ? { interval: plan.recurring.interval } : undefined;
51
154
  const existing = await activePrices(stripe, product);
52
- const match = existing.find(price => price.lookup_key === lookupKey && price.unit_amount === unitAmount
155
+ const candidate = existing.find(price => price.lookup_key === lookupKey && price.unit_amount === unitAmount
53
156
  && price.currency === currency
54
- && ((price.recurring?.interval ?? null) === (recurring?.interval ?? null)));
55
- if (match != null)
56
- return;
157
+ && ((price.recurring?.interval ?? null) === (recurring?.interval ?? null))
158
+ && optionsMatch(price, options, behavior));
159
+ if (candidate != null && !opposesBehavior(candidate, behavior)) {
160
+ if (behavior != null && candidate.tax_behavior === 'unspecified') {
161
+ await applyUnspecifiedBehavior(stripe, candidate, lookupKey, behavior, migrateUnspecifiedPrices);
162
+ }
163
+ return candidate;
164
+ }
165
+ // A changed option replaces the Price like any other change — options are never edited in place,
166
+ // so a subscriber keeps exactly the Price (and currency amounts) they accepted.
57
167
  for (const price of existing.filter(item => item.lookup_key === lookupKey)) {
58
168
  await stripe.prices.update(price.id, { active: false });
59
169
  }
60
- await stripe.prices.create({
170
+ return await stripe.prices.create({
61
171
  product: product.sku, currency, unit_amount: unitAmount, lookup_key: lookupKey,
62
172
  transfer_lookup_key: true, nickname: plan.sku,
63
173
  ...(recurring != null ? { recurring } : { billing_scheme: 'per_unit' }),
174
+ ...(behavior != null ? { tax_behavior: behavior } : {}),
175
+ ...(options.length > 0 ? {
176
+ currency_options: Object.fromEntries(options.map(option => [option.currency, {
177
+ unit_amount: option.unitAmount, ...(behavior != null ? { tax_behavior: behavior } : {}),
178
+ }])),
179
+ } : {}),
64
180
  metadata: { sku: plan.sku, ...(product.services && { services: product.services.join(',') }) },
65
181
  });
66
182
  };
67
- export const initialize = async (ctx) => {
68
- const all = await payment(ctx).products();
69
- const products = all.filter(product => (product.gateways ?? []).includes(STRIPE_PAYGATE_ALIAS));
70
- if (products.length === 0)
71
- return;
72
- const stripe = await stripeClient(ctx);
183
+ /**
184
+ * Synchronize every product sold through Stripe, and its Stripe-sold plans, to Stripe products and
185
+ * prices. A product whose declaration fingerprint is unchanged makes no paygate call. Free plans
186
+ * and plans sold through no Stripe gateway are never synchronized.
187
+ *
188
+ * The declared `PricingPolicy.tax.behavior` (absent by default, so a price's `tax_behavior` stays
189
+ * whatever it already was) is applied to a matching price only while it is `unspecified` — Stripe
190
+ * forbids changing a price once set to `exclusive` or `inclusive` — and to a fresh one on creation.
191
+ * A price carrying the OPPOSITE behavior is deactivated and replaced, same as any other mismatch.
192
+ */
193
+ export const syncStripeProducts = async (ctx, stripe) => {
73
194
  const fpRes = fingerprints(ctx);
74
- for (const product of products) {
75
- const plans = await payment(ctx).allPlans(product.sku);
76
- const hash = fingerprintOf(product, plans);
195
+ const behavior = (await payment(ctx).pricingPolicy()).tax.behavior ?? null;
196
+ const migrateUnspecifiedPrices = (await stripePricingConfig(ctx))?.migrateUnspecifiedPrices ?? false;
197
+ const fxRates = new Map();
198
+ const rights = await payment(ctx).consumerRightsPolicy();
199
+ const regionCurrencies = new Set(Object.values(rights?.currencies ?? {})
200
+ .filter((code) => typeof code === 'string').map(code => code.toLowerCase()));
201
+ for (const { product, plans } of await stripePlansOf(ctx)) {
202
+ const resolvedPlans = [];
203
+ for (const plan of plans) {
204
+ const sourceUnitAmount = Math.round(plan.price * 100);
205
+ const sourceCurrency = (plan.currency ?? 'usd').toLowerCase();
206
+ if (plan.pricingMode === CheckoutPricingMode.Amount) {
207
+ resolvedPlans.push({ plan, unitAmount: sourceUnitAmount, currency: sourceCurrency, sourceUnitAmount, sourceCurrency, options: [] });
208
+ continue;
209
+ }
210
+ const settled = await settlementAmount(ctx, stripe, sourceUnitAmount, sourceCurrency, fxRates);
211
+ const { unitAmount, options } = optionsOf(plan, settled.currency, sourceUnitAmount, sourceCurrency, regionCurrencies);
212
+ resolvedPlans.push({
213
+ plan, unitAmount: unitAmount ?? settled.amountMinor, currency: settled.currency, sourceUnitAmount, sourceCurrency,
214
+ options,
215
+ });
216
+ }
217
+ const hash = fingerprintOf(product, resolvedPlans, behavior);
77
218
  const stored = await fpRes.bySku(product.sku);
78
- if (stored != null && stored.hash === hash)
219
+ // A row from before prices were persisted syncs once more, so `planPrices` can read it.
220
+ if (stored != null && stored.hash === hash && stored.prices != null)
79
221
  continue;
80
222
  const stripeProduct = await ensureStripeProduct(stripe, product);
81
- for (const plan of plans)
82
- await ensureStripePrice(stripe, product, plan);
223
+ const prices = [];
224
+ const syncedAt = new Date();
225
+ for (const resolved of resolvedPlans) {
226
+ const price = await ensureStripePrice(stripe, product, resolved, behavior, migrateUnspecifiedPrices);
227
+ if (price != null) {
228
+ prices.push({
229
+ planSku: resolved.plan.sku, priceId: price.id, lookupKey: planLookupKey(product, resolved.plan),
230
+ currency: resolved.currency, unitAmount: resolved.unitAmount, options: resolved.options,
231
+ ...(behavior != null ? { taxBehavior: behavior } : price.tax_behavior != null ? { taxBehavior: price.tax_behavior } : {}),
232
+ ...(resolved.plan.recurring != null ? { interval: resolved.plan.recurring.interval } : {}),
233
+ sourceUnitAmount: resolved.sourceUnitAmount, sourceCurrency: resolved.sourceCurrency, syncedAt,
234
+ });
235
+ }
236
+ }
83
237
  if (stored != null) {
84
- Object.assign(stored, { hash, productId: stripeProduct.id, updatedAt: new Date() });
85
- await fpRes.save(stored);
238
+ await fpRes.update({ ...stored, hash, productId: stripeProduct.id, prices, updatedAt: new Date() });
86
239
  }
87
240
  else {
88
- await fpRes.create({ sku: product.sku, hash, productId: stripeProduct.id, updatedAt: new Date() });
241
+ await fpRes.create({ sku: product.sku, hash, productId: stripeProduct.id, prices, updatedAt: new Date() });
89
242
  }
90
243
  console.info(`[payment] synced product '${product.sku}' to Stripe (${plans.length} plan(s))`);
91
244
  }
92
245
  };
246
+ /**
247
+ * The prices a product's plans are charged at, per currency, as the last sync stored them — no
248
+ * paygate call, so it works in an unmanaged process. One entry for each Price's default currency
249
+ * (`default: true`) and one per currency option.
250
+ */
251
+ export const syncedPlanPrices = async (ctx, productSku) => {
252
+ const row = await fingerprints(ctx).bySku(productSku);
253
+ const behaviorOf = (value) => value === TaxBehavior.Exclusive || value === TaxBehavior.Inclusive ? value : undefined;
254
+ const views = [];
255
+ for (const price of row?.prices ?? []) {
256
+ const taxBehavior = behaviorOf(price.taxBehavior ?? undefined);
257
+ const shared = {
258
+ planSku: price.planSku, ...(taxBehavior != null ? { taxBehavior } : {}),
259
+ ...(price.interval != null ? { interval: price.interval } : {}),
260
+ };
261
+ views.push({ ...shared, currency: price.currency, unitAmountMinor: price.unitAmount, default: true });
262
+ for (const option of price.options ?? []) {
263
+ views.push({ ...shared, currency: option.currency, unitAmountMinor: option.unitAmount, default: false });
264
+ }
265
+ }
266
+ return views;
267
+ };
268
+ /** `syncStripeProducts` with this context's own Stripe client. */
269
+ export const syncPaymentProducts = async (ctx) => await syncStripeProducts(ctx, await stripeClient(ctx));
93
270
  //# sourceMappingURL=sync.js.map
package/build/sync.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGhE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAuB,EAAE,IAAiB,EAAU,EAAE,CAClF,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;AAElF,MAAM,aAAa,GAAG,CAAC,OAAuB,EAAE,KAAoB,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;KAClG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IACrB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK;IACzD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;IAC1E,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;IACpF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;QAC3F,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACxE,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;QACpF,MAAM,EAAE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC;KACrC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CAC/C,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAEnB,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAAc,EAAE,OAAuB,EAA2B,EAAE;IACrG,MAAM,MAAM,GAA+B;QACzC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO;QAC7F,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;KAClG,CAAA;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI;QAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAA;IAC/G,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3C,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;IACrE,CAAC;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAAE,OAAuB,EAA2B,EAAE,CAC9F,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAErF,MAAM,qBAAqB,GAAG,KAAK,EAAE,MAAc,EAAE,OAAuB,EAAE,IAAiB,EAAiB,EAAE;IAChH,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC3C,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,EAAE,CAAC;QACrG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,KAAK,EAAE,MAAc,EAAE,OAAuB,EAAE,IAAiB,EAAiB,EAAE;IAC5G,IAAI,IAAI,CAAC,WAAW,KAAK,mBAAmB,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAClD,OAAM;IACR,CAAC;IACD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAA;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI;QACtC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAwC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3F,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU;WAClG,KAAK,CAAC,QAAQ,KAAK,QAAQ;WAC3B,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7E,IAAI,KAAK,IAAI,IAAI;QAAE,OAAM;IACzB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,EAAE,CAAC;QAC3E,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACzB,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS;QAC9E,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG;QAC7C,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;QACvE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;KAC/F,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,GAAe,EAAiB,EAAE;IACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAsB,CAAA;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAA;IAC/F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAkB,CAAA;QACvE,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;YAAE,SAAQ;QACpD,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAChE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACxE,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;YACnF,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;QACpG,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,6BAA6B,OAAO,CAAC,GAAG,gBAAgB,KAAK,CAAC,MAAM,WAAW,CAAC,CAAA;IAC/F,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}