@owlmeans/server-payment 0.1.18-rc.11 → 0.1.18-rc.13
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/README.md +1 -1
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/server-payment/SKILL.md +67 -7
- package/build/config.d.ts +15 -1
- package/build/config.d.ts.map +1 -1
- package/build/config.js +40 -2
- package/build/config.js.map +1 -1
- package/build/consts.d.ts +10 -0
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +10 -0
- package/build/consts.js.map +1 -1
- package/build/index.d.ts +2 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/model.d.ts.map +1 -1
- package/build/model.js +2 -1
- package/build/model.js.map +1 -1
- package/build/plugins/estimate.d.ts +43 -0
- package/build/plugins/estimate.d.ts.map +1 -0
- package/build/plugins/estimate.js +235 -0
- package/build/plugins/estimate.js.map +1 -0
- package/build/plugins/events.d.ts.map +1 -1
- package/build/plugins/events.js +17 -4
- package/build/plugins/events.js.map +1 -1
- package/build/plugins/fx.d.ts +26 -0
- package/build/plugins/fx.d.ts.map +1 -0
- package/build/plugins/fx.js +56 -0
- package/build/plugins/fx.js.map +1 -0
- package/build/plugins/portal.d.ts.map +1 -1
- package/build/plugins/portal.js +6 -2
- package/build/plugins/portal.js.map +1 -1
- package/build/plugins/stripe.d.ts +2 -1
- package/build/plugins/stripe.d.ts.map +1 -1
- package/build/plugins/stripe.js +51 -19
- package/build/plugins/stripe.js.map +1 -1
- package/build/service.d.ts.map +1 -1
- package/build/service.js +6 -0
- package/build/service.js.map +1 -1
- package/build/sync.d.ts +5 -0
- package/build/sync.d.ts.map +1 -1
- package/build/sync.js +80 -14
- package/build/sync.js.map +1 -1
- package/build/types.d.ts +46 -1
- package/build/types.d.ts.map +1 -1
- package/build/utils.d.ts +3 -1
- package/build/utils.d.ts.map +1 -1
- package/build/utils.js +3 -1
- package/build/utils.js.map +1 -1
- package/package.json +16 -16
- package/src/config.ts +47 -5
- package/src/consts.ts +11 -0
- package/src/index.ts +2 -0
- package/src/model.ts +2 -1
- package/src/plugins/estimate.ts +299 -0
- package/src/plugins/events.ts +17 -4
- package/src/plugins/fx.ts +93 -0
- package/src/plugins/portal.ts +6 -2
- package/src/plugins/stripe.ts +55 -19
- package/src/service.ts +6 -0
- package/src/sync.ts +101 -13
- package/src/types.ts +49 -2
- package/src/utils.ts +6 -2
- package/tests/checkout.spec.ts +118 -2
- package/tests/estimate.spec.ts +240 -0
- package/tests/events.spec.ts +13 -0
- package/tests/fake-stripe.ts +130 -6
- package/tests/portal.spec.ts +19 -2
- package/tests/sync.spec.ts +114 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../src/plugins/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../src/plugins/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,EAEL,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAE1B,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAOjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AA+EhF,eAAO,MAAM,sBAAsB,YACxB,cAAc,QAAQ,WAAW,eAAe,MAAM,aAAY,WAAW,KACrF;IAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAejG,CAAA;AAED,eAAO,MAAM,wBAAwB,UAC5B,MAAM,CAAC,KAAK,UAAU;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KACjF,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAIrC,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAe,UAAU,UAAU,MAAM,UAAU,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAiFlH,CAAA;AAQD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAe,UAAU,UAAU,MAAM,WAAW,OAAO,KAAG,OAAO,CAAC,IAAI,CAwBzG,CAAA"}
|
package/build/plugins/stripe.js
CHANGED
|
@@ -1,16 +1,35 @@
|
|
|
1
|
-
import { assertCheckoutAmount, chargeAmountMinor, CheckoutPricingMode, PaygateError, ProductError, ProductType, WebhookSetupError, } from '@owlmeans/payment';
|
|
1
|
+
import { assertCheckoutAmount, chargeAmountMinor, CheckoutPricingMode, PaygateError, ProductError, ProductType, TaxBehavior, WebhookSetupError, } from '@owlmeans/payment';
|
|
2
2
|
import { STRIPE_PAYGATE_ALIAS, STRIPE_SIGNATURE } from '../consts.js';
|
|
3
|
-
import { paygateCustomers, payment } from '../utils.js';
|
|
3
|
+
import { paygateCustomers, payment, stripePricingConfig } from '../utils.js';
|
|
4
4
|
import { isSoldThrough, planLookupKey } from '../sync.js';
|
|
5
5
|
import { createEventHandler } from './events.js';
|
|
6
|
+
import { settlementAmount } from './fx.js';
|
|
6
7
|
import { stripeWebhookSecrets } from './webhook-manager.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
/**
|
|
9
|
+
* A Checkout Session's tax and currency options, entirely driven by the declared `PricingPolicy` —
|
|
10
|
+
* an undeclared one (`DEFAULT_PRICING_POLICY`) reproduces exactly what every session hard-coded
|
|
11
|
+
* before this policy existed: automatic tax and tax-id collection on, no Adaptive Pricing.
|
|
12
|
+
*
|
|
13
|
+
* `customer_update.address` lets automatic tax use the billing address Checkout just collected
|
|
14
|
+
* rather than only a previously saved one; `customer_update.name` lets tax-id collection save the
|
|
15
|
+
* business name it collects. Each is included only for the concern that needs it.
|
|
16
|
+
*/
|
|
17
|
+
const checkoutOptions = (policy, promotions) => {
|
|
18
|
+
const customerUpdate = {};
|
|
19
|
+
if (policy.tax.automatic)
|
|
20
|
+
customerUpdate.address = 'auto';
|
|
21
|
+
if (policy.tax.collectTaxId)
|
|
22
|
+
customerUpdate.name = 'auto';
|
|
23
|
+
return {
|
|
24
|
+
...(policy.tax.automatic
|
|
25
|
+
? { automatic_tax: { enabled: true }, billing_address_collection: 'required' }
|
|
26
|
+
: {}),
|
|
27
|
+
...(policy.tax.collectTaxId ? { tax_id_collection: { enabled: true } } : {}),
|
|
28
|
+
...(Object.keys(customerUpdate).length > 0 ? { customer_update: customerUpdate } : {}),
|
|
29
|
+
...(policy.currency.adaptive === true ? { adaptive_pricing: { enabled: true } } : {}),
|
|
30
|
+
allow_promotion_codes: promotions,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
14
33
|
const ensureStripeCustomer = async (ctx, stripe, params) => {
|
|
15
34
|
const resource = paygateCustomers(ctx);
|
|
16
35
|
const existing = await resource.byEntity(params.entityId, STRIPE_PAYGATE_ALIAS);
|
|
@@ -58,7 +77,7 @@ const sharedSession = (customer, params, product, plan, metadata) => ({
|
|
|
58
77
|
...metadata,
|
|
59
78
|
},
|
|
60
79
|
});
|
|
61
|
-
export const amountCheckoutLineItem = (product, plan, amountMinor) => {
|
|
80
|
+
export const amountCheckoutLineItem = (product, plan, amountMinor, behavior = TaxBehavior.Exclusive) => {
|
|
62
81
|
if (plan.amountPolicy == null)
|
|
63
82
|
throw new ProductError(`amount-policy:${plan.sku}`);
|
|
64
83
|
assertCheckoutAmount(plan.amountPolicy, amountMinor);
|
|
@@ -67,7 +86,7 @@ export const amountCheckoutLineItem = (product, plan, amountMinor) => {
|
|
|
67
86
|
return {
|
|
68
87
|
lineItem: {
|
|
69
88
|
price_data: {
|
|
70
|
-
product: product.sku, currency, unit_amount: chargeMinor, tax_behavior:
|
|
89
|
+
product: product.sku, currency, unit_amount: chargeMinor, tax_behavior: behavior,
|
|
71
90
|
},
|
|
72
91
|
quantity: 1,
|
|
73
92
|
},
|
|
@@ -92,6 +111,7 @@ export const createCheckoutLink = async (ctx, stripe, params) => {
|
|
|
92
111
|
throw new ProductError(`plan:${params.planSku}`);
|
|
93
112
|
}
|
|
94
113
|
const customer = await ensureStripeCustomer(ctx, stripe, params);
|
|
114
|
+
const pricing = await payment(ctx).pricingPolicy();
|
|
95
115
|
if (product.type === ProductType.Consumable) {
|
|
96
116
|
const plan = plans.find(item => item.sku === params.planSku) ?? plans[0];
|
|
97
117
|
if (plan == null)
|
|
@@ -99,15 +119,25 @@ export const createCheckoutLink = async (ctx, stripe, params) => {
|
|
|
99
119
|
if (plan.pricingMode === CheckoutPricingMode.Amount) {
|
|
100
120
|
if (params.amountMinor == null)
|
|
101
121
|
throw new ProductError('amount');
|
|
102
|
-
const {
|
|
122
|
+
const { chargeMinor: sourceChargeMinor, currency: amountCurrency } = amountCheckoutLineItem(product, plan, params.amountMinor, pricing.tax.behavior);
|
|
123
|
+
const settled = await settlementAmount(ctx, stripe, sourceChargeMinor, amountCurrency);
|
|
124
|
+
const lineItem = {
|
|
125
|
+
price_data: {
|
|
126
|
+
product: product.sku, currency: settled.currency, unit_amount: settled.amountMinor,
|
|
127
|
+
tax_behavior: pricing.tax.behavior,
|
|
128
|
+
},
|
|
129
|
+
quantity: 1,
|
|
130
|
+
};
|
|
103
131
|
const session = await stripe.checkout.sessions.create({
|
|
104
132
|
mode: 'payment', line_items: [lineItem], invoice_creation: { enabled: true },
|
|
105
|
-
...
|
|
133
|
+
...checkoutOptions(pricing, false),
|
|
106
134
|
...sharedSession(customer, params, product, plan, {
|
|
107
135
|
pricingMode: CheckoutPricingMode.Amount,
|
|
108
|
-
currency,
|
|
136
|
+
currency: settled.currency,
|
|
137
|
+
amountCurrency,
|
|
109
138
|
amountMinor: String(params.amountMinor),
|
|
110
|
-
|
|
139
|
+
sourceChargeAmountMinor: String(sourceChargeMinor),
|
|
140
|
+
chargeAmountMinor: String(settled.amountMinor),
|
|
111
141
|
}),
|
|
112
142
|
});
|
|
113
143
|
if (session.url == null)
|
|
@@ -115,16 +145,16 @@ export const createCheckoutLink = async (ctx, stripe, params) => {
|
|
|
115
145
|
return session.url;
|
|
116
146
|
}
|
|
117
147
|
const price = await findPrice(stripe, product.sku, planLookupKey(product, plan));
|
|
118
|
-
const
|
|
148
|
+
const quantityPolicy = plan.quantityPolicy ?? {
|
|
119
149
|
minimum: plan.minQuantity ?? 1,
|
|
120
150
|
maximum: plan.maxQuantity ?? Math.max(100_000, plan.minQuantity ?? 1),
|
|
121
151
|
default: plan.defaultQuantity ?? plan.minQuantity ?? 1,
|
|
122
152
|
};
|
|
123
153
|
const session = await stripe.checkout.sessions.create({
|
|
124
154
|
mode: 'payment',
|
|
125
|
-
line_items: [quantityCheckoutLineItem(price,
|
|
155
|
+
line_items: [quantityCheckoutLineItem(price, quantityPolicy)],
|
|
126
156
|
invoice_creation: { enabled: true },
|
|
127
|
-
...
|
|
157
|
+
...checkoutOptions(pricing, true),
|
|
128
158
|
...sharedSession(customer, params, product, plan, { pricingMode: CheckoutPricingMode.Quantity }),
|
|
129
159
|
});
|
|
130
160
|
if (session.url == null)
|
|
@@ -136,15 +166,17 @@ export const createCheckoutLink = async (ctx, stripe, params) => {
|
|
|
136
166
|
if (plan == null)
|
|
137
167
|
throw new ProductError('plan');
|
|
138
168
|
const price = await findPrice(stripe, product.sku, planLookupKey(product, plan));
|
|
169
|
+
const subscriptionPaymentMethodTypes = (await stripePricingConfig(ctx))?.subscriptionPaymentMethodTypes;
|
|
139
170
|
const session = await stripe.checkout.sessions.create({
|
|
140
171
|
mode: 'subscription', line_items: [{ price: price.id, quantity: 1 }],
|
|
172
|
+
...(subscriptionPaymentMethodTypes != null ? { payment_method_types: subscriptionPaymentMethodTypes } : {}),
|
|
141
173
|
subscription_data: {
|
|
142
174
|
metadata: {
|
|
143
175
|
pricingMode: CheckoutPricingMode.Quantity, entityId: params.entityId,
|
|
144
176
|
service: params.service, productSku: product.sku, planSku: plan.sku,
|
|
145
177
|
},
|
|
146
178
|
},
|
|
147
|
-
...
|
|
179
|
+
...checkoutOptions(pricing, true),
|
|
148
180
|
...sharedSession(customer, params, product, plan, {}),
|
|
149
181
|
});
|
|
150
182
|
if (session.url == null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/plugins/stripe.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EACrG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/plugins/stripe.ts"],"names":[],"mappings":"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"}
|
package/build/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAMhC,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAMhC,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAuBjE,OAAO,KAAK,EACV,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,qBAAqB,EAChF,yBAAyB,EAC1B,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,sBAAsB;IACrC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QACrB,UAAU,UAAU,MAAM,SAAQ,sBAAsB,KAC5D,OAAO,CAAC,IAAI,CAad,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QACvB,UAAU,YAAY,MAAM,WAAW,MAAM,SAAQ,wBAAwB,KACjF,OAAO,CAAC,yBAAyB,CA+BnC,CAAA;AAID,eAAO,MAAM,kBAAkB,WACtB,MAAM,SAA0B,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,KAC3E,cA8BF,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,OAC3E,CAAC,SAAS,qBAAqB,KACnC,CAuBF,CAAA"}
|
package/build/service.js
CHANGED
|
@@ -8,6 +8,7 @@ import { makeLimitGate } from './limit.js';
|
|
|
8
8
|
import { appendCompletionObserver } from './observer.js';
|
|
9
9
|
import { findPlan, findProduct, planRank } from './plan.js';
|
|
10
10
|
import { resyncStripeSubscription, resyncStripeSubscriptions } from './plugins/events.js';
|
|
11
|
+
import { makeEstimateCache, estimateStripePrice } from './plugins/estimate.js';
|
|
11
12
|
import { createPortalLink, ensurePortalConfiguration } from './plugins/portal.js';
|
|
12
13
|
import { createCheckoutLink } from './plugins/stripe.js';
|
|
13
14
|
import { ensureWebhookEndpoint } from './plugins/webhook-manager.js';
|
|
@@ -72,6 +73,9 @@ export const grantInternalPlan = async (ctx, entityId, planSku, opts = {}) => {
|
|
|
72
73
|
const unmanaged = () => { throw new PaygateError('unmanaged'); };
|
|
73
74
|
export const makeGatewayService = (alias = GATEWAY_SERVICE, opts = {}) => {
|
|
74
75
|
const managed = opts.manage !== false;
|
|
76
|
+
// One estimate cache per gateway SERVICE instance, never module-level: several service
|
|
77
|
+
// instances (several tests, several deployments in one process) must never share hits.
|
|
78
|
+
const estimateCache = makeEstimateCache();
|
|
75
79
|
const service = createService(alias, {
|
|
76
80
|
managed,
|
|
77
81
|
createLink: async (ctx, params) => managed
|
|
@@ -83,6 +87,8 @@ export const makeGatewayService = (alias = GATEWAY_SERVICE, opts = {}) => {
|
|
|
83
87
|
? await resyncStripeSubscription(ctx, await stripeClient(ctx), ref) : unmanaged(),
|
|
84
88
|
resyncAll: async (ctx) => managed
|
|
85
89
|
? await resyncStripeSubscriptions(ctx, await stripeClient(ctx)) : unmanaged(),
|
|
90
|
+
estimatePrice: async (ctx, params) => managed
|
|
91
|
+
? await estimateStripePrice(ctx, await stripeClient(ctx), params, estimateCache) : unmanaged(),
|
|
86
92
|
}, service => async () => {
|
|
87
93
|
const ctx = service.assertCtx();
|
|
88
94
|
assertPlanDeclarations(ctx.cfg);
|
package/build/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/build/sync.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export declare const stripePlansOf: (ctx: ApiContext) => Promise<Array<{
|
|
|
13
13
|
* Synchronize every product sold through Stripe, and its Stripe-sold plans, to Stripe products and
|
|
14
14
|
* prices. A product whose declaration fingerprint is unchanged makes no paygate call. Free plans
|
|
15
15
|
* and plans sold through no Stripe gateway are never synchronized.
|
|
16
|
+
*
|
|
17
|
+
* The declared `PricingPolicy.tax.behavior` (absent by default, so a price's `tax_behavior` stays
|
|
18
|
+
* whatever it already was) is applied to a matching price only while it is `unspecified` — Stripe
|
|
19
|
+
* forbids changing a price once set to `exclusive` or `inclusive` — and to a fresh one on creation.
|
|
20
|
+
* A price carrying the OPPOSITE behavior is deactivated and replaced, same as any other mismatch.
|
|
16
21
|
*/
|
|
17
22
|
export declare const syncStripeProducts: (ctx: ApiContext, stripe: Stripe) => Promise<void>;
|
|
18
23
|
/** `syncStripeProducts` with this context's own Stripe client. */
|
package/build/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,OAAO,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,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,OAAO,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAY7D,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;AA6HD;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,QAAe,UAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CA6BtF,CAAA;AAED,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,QAAe,UAAU,KAAG,OAAO,CAAC,IAAI,CAChB,CAAA"}
|
package/build/sync.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
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';
|
|
5
6
|
export const planLookupKey = (product, plan) => product.type === ProductType.Consumable ? `${product.sku}-consumable` : plan.sku;
|
|
6
7
|
/** Whether a plan is sold through a paygate: never a free plan; otherwise its own gateways, else the product's. */
|
|
7
8
|
export const isSoldThrough = (product, plan, paygate) => plan.free !== true && (plan.gateways ?? product.gateways ?? []).includes(paygate);
|
|
@@ -21,14 +22,20 @@ export const stripePlansOf = async (ctx) => {
|
|
|
21
22
|
}
|
|
22
23
|
return result;
|
|
23
24
|
};
|
|
24
|
-
|
|
25
|
+
/**
|
|
26
|
+
* `behavior` is hashed alongside the catalogue: an undeclared policy hashes as `null`, so declaring
|
|
27
|
+
* or changing `tax.behavior` re-syncs every product exactly once, the same as any other catalogue
|
|
28
|
+
* edit.
|
|
29
|
+
*/
|
|
30
|
+
const fingerprintOf = (product, plans, behavior) => createHash('sha256')
|
|
25
31
|
.update(JSON.stringify({
|
|
26
32
|
sku: product.sku, type: product.type, name: product.title,
|
|
27
33
|
description: product.description ?? null, taxCode: product.taxCode ?? null,
|
|
28
34
|
unitLabel: product.unitLabel ?? null, services: [...(product.services ?? [])].sort(),
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
behavior,
|
|
36
|
+
plans: plans.map(({ plan, unitAmount, currency, sourceUnitAmount, sourceCurrency }) => ({
|
|
37
|
+
sku: plan.sku, price: plan.price, currency, unitAmount, sourceUnitAmount, sourceCurrency,
|
|
38
|
+
duration: plan.duration, recurring: plan.recurring ?? null, pricingMode: plan.pricingMode ?? null,
|
|
32
39
|
amountPolicy: plan.amountPolicy ?? null, quantityPolicy: plan.quantityPolicy ?? null,
|
|
33
40
|
lookup: planLookupKey(product, plan),
|
|
34
41
|
})).sort((a, b) => a.sku.localeCompare(b.sku)),
|
|
@@ -56,22 +63,62 @@ const deactivateAmountPrice = async (stripe, product, plan) => {
|
|
|
56
63
|
await stripe.prices.update(price.id, { active: false });
|
|
57
64
|
}
|
|
58
65
|
};
|
|
59
|
-
|
|
66
|
+
/** Whether `price` already carries the OPPOSITE of `behavior` — never `unspecified`, which is not a conflict. */
|
|
67
|
+
const opposesBehavior = (price, behavior) => behavior != null && price.tax_behavior !== 'unspecified' && price.tax_behavior !== behavior;
|
|
68
|
+
/**
|
|
69
|
+
* The behavior the Stripe account's own Tax Settings resolve to for `currency`, or `null` when no
|
|
70
|
+
* default is configured yet (nothing established to disrupt). `inferred_by_currency` follows
|
|
71
|
+
* Stripe's own rule: exclusive for USD/CAD, inclusive otherwise.
|
|
72
|
+
*/
|
|
73
|
+
const accountDefaultBehavior = async (stripe, currency) => {
|
|
74
|
+
const { defaults } = await stripe.tax.settings.retrieve();
|
|
75
|
+
if (defaults.tax_behavior === 'inferred_by_currency') {
|
|
76
|
+
return ['usd', 'cad'].includes(currency.toLowerCase()) ? TaxBehavior.Exclusive : TaxBehavior.Inclusive;
|
|
77
|
+
}
|
|
78
|
+
if (defaults.tax_behavior === 'exclusive')
|
|
79
|
+
return TaxBehavior.Exclusive;
|
|
80
|
+
if (defaults.tax_behavior === 'inclusive')
|
|
81
|
+
return TaxBehavior.Inclusive;
|
|
82
|
+
return null;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Give `price` the declared `behavior` while it is still `unspecified` (the only state Stripe lets
|
|
86
|
+
* an existing price's `tax_behavior` be set from). Skipped, with a `console.error`, when the
|
|
87
|
+
* account's own default resolves to the opposite behavior — applying ours would then change what an
|
|
88
|
+
* existing renewal actually charges — unless `migrateUnspecifiedPrices` opts into that migration.
|
|
89
|
+
*/
|
|
90
|
+
const applyUnspecifiedBehavior = async (stripe, price, lookupKey, behavior, migrateUnspecifiedPrices) => {
|
|
91
|
+
if (!migrateUnspecifiedPrices) {
|
|
92
|
+
const resolved = await accountDefaultBehavior(stripe, price.currency);
|
|
93
|
+
if (resolved != null && resolved !== behavior) {
|
|
94
|
+
console.error(`[payment] price '${lookupKey}' left 'unspecified': the Stripe account's default tax `
|
|
95
|
+
+ `behavior for ${price.currency.toUpperCase()} is '${resolved}', not the declared `
|
|
96
|
+
+ `'${behavior}' — applying it would change existing renewal amounts. Set `
|
|
97
|
+
+ '`stripe.migrateUnspecifiedPrices` to override.');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
await stripe.prices.update(price.id, { tax_behavior: behavior });
|
|
102
|
+
};
|
|
103
|
+
const ensureStripePrice = async (stripe, product, resolved, behavior, migrateUnspecifiedPrices) => {
|
|
104
|
+
const { plan, unitAmount, currency } = resolved;
|
|
60
105
|
if (plan.pricingMode === CheckoutPricingMode.Amount) {
|
|
61
106
|
await deactivateAmountPrice(stripe, product, plan);
|
|
62
107
|
return;
|
|
63
108
|
}
|
|
64
109
|
const lookupKey = planLookupKey(product, plan);
|
|
65
|
-
const unitAmount = Math.round(plan.price * 100);
|
|
66
|
-
const currency = plan.currency ?? 'usd';
|
|
67
110
|
const recurring = plan.recurring != null
|
|
68
111
|
? { interval: plan.recurring.interval } : undefined;
|
|
69
112
|
const existing = await activePrices(stripe, product);
|
|
70
|
-
const
|
|
113
|
+
const candidate = existing.find(price => price.lookup_key === lookupKey && price.unit_amount === unitAmount
|
|
71
114
|
&& price.currency === currency
|
|
72
115
|
&& ((price.recurring?.interval ?? null) === (recurring?.interval ?? null)));
|
|
73
|
-
if (
|
|
116
|
+
if (candidate != null && !opposesBehavior(candidate, behavior)) {
|
|
117
|
+
if (behavior != null && candidate.tax_behavior === 'unspecified') {
|
|
118
|
+
await applyUnspecifiedBehavior(stripe, candidate, lookupKey, behavior, migrateUnspecifiedPrices);
|
|
119
|
+
}
|
|
74
120
|
return;
|
|
121
|
+
}
|
|
75
122
|
for (const price of existing.filter(item => item.lookup_key === lookupKey)) {
|
|
76
123
|
await stripe.prices.update(price.id, { active: false });
|
|
77
124
|
}
|
|
@@ -79,6 +126,7 @@ const ensureStripePrice = async (stripe, product, plan) => {
|
|
|
79
126
|
product: product.sku, currency, unit_amount: unitAmount, lookup_key: lookupKey,
|
|
80
127
|
transfer_lookup_key: true, nickname: plan.sku,
|
|
81
128
|
...(recurring != null ? { recurring } : { billing_scheme: 'per_unit' }),
|
|
129
|
+
...(behavior != null ? { tax_behavior: behavior } : {}),
|
|
82
130
|
metadata: { sku: plan.sku, ...(product.services && { services: product.services.join(',') }) },
|
|
83
131
|
});
|
|
84
132
|
};
|
|
@@ -86,17 +134,35 @@ const ensureStripePrice = async (stripe, product, plan) => {
|
|
|
86
134
|
* Synchronize every product sold through Stripe, and its Stripe-sold plans, to Stripe products and
|
|
87
135
|
* prices. A product whose declaration fingerprint is unchanged makes no paygate call. Free plans
|
|
88
136
|
* and plans sold through no Stripe gateway are never synchronized.
|
|
137
|
+
*
|
|
138
|
+
* The declared `PricingPolicy.tax.behavior` (absent by default, so a price's `tax_behavior` stays
|
|
139
|
+
* whatever it already was) is applied to a matching price only while it is `unspecified` — Stripe
|
|
140
|
+
* forbids changing a price once set to `exclusive` or `inclusive` — and to a fresh one on creation.
|
|
141
|
+
* A price carrying the OPPOSITE behavior is deactivated and replaced, same as any other mismatch.
|
|
89
142
|
*/
|
|
90
143
|
export const syncStripeProducts = async (ctx, stripe) => {
|
|
91
144
|
const fpRes = fingerprints(ctx);
|
|
145
|
+
const behavior = (await payment(ctx).pricingPolicy()).tax.behavior ?? null;
|
|
146
|
+
const migrateUnspecifiedPrices = (await stripePricingConfig(ctx))?.migrateUnspecifiedPrices ?? false;
|
|
147
|
+
const fxRates = new Map();
|
|
92
148
|
for (const { product, plans } of await stripePlansOf(ctx)) {
|
|
93
|
-
const
|
|
149
|
+
const resolvedPlans = [];
|
|
150
|
+
for (const plan of plans) {
|
|
151
|
+
const sourceUnitAmount = Math.round(plan.price * 100);
|
|
152
|
+
const sourceCurrency = (plan.currency ?? 'usd').toLowerCase();
|
|
153
|
+
const settled = plan.pricingMode === CheckoutPricingMode.Amount
|
|
154
|
+
? { amountMinor: sourceUnitAmount, currency: sourceCurrency }
|
|
155
|
+
: await settlementAmount(ctx, stripe, sourceUnitAmount, sourceCurrency, fxRates);
|
|
156
|
+
resolvedPlans.push({ plan, unitAmount: settled.amountMinor, currency: settled.currency, sourceUnitAmount, sourceCurrency });
|
|
157
|
+
}
|
|
158
|
+
const hash = fingerprintOf(product, resolvedPlans, behavior);
|
|
94
159
|
const stored = await fpRes.bySku(product.sku);
|
|
95
160
|
if (stored != null && stored.hash === hash)
|
|
96
161
|
continue;
|
|
97
162
|
const stripeProduct = await ensureStripeProduct(stripe, product);
|
|
98
|
-
for (const
|
|
99
|
-
await ensureStripePrice(stripe, product,
|
|
163
|
+
for (const resolved of resolvedPlans) {
|
|
164
|
+
await ensureStripePrice(stripe, product, resolved, behavior, migrateUnspecifiedPrices);
|
|
165
|
+
}
|
|
100
166
|
if (stored != null) {
|
|
101
167
|
await fpRes.update({ ...stored, hash, productId: stripeProduct.id, updatedAt: new Date() });
|
|
102
168
|
}
|
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;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { MongoResource } from '@owlmeans/mongo-resource';
|
|
|
4
4
|
import type { PluginConfig } from '@owlmeans/config';
|
|
5
5
|
import type { PermissionSet } from '@owlmeans/auth';
|
|
6
6
|
import type { Config as ApiConfig, Context as ApiContext } from '@owlmeans/server-api';
|
|
7
|
-
import type { AmountCheckoutPolicy, CheckoutPricingMode, EntitlementView, LimitDeclaration, LimitView, PlanCapability, PlanDuration, PortalFlow, Product, ProductPlan, ProductType, QuantityCheckoutPolicy, SubscriptionStatus } from '@owlmeans/payment';
|
|
7
|
+
import type { AmountCheckoutPolicy, CheckoutPricingMode, EntitlementView, LimitDeclaration, LimitView, PlanCapability, PlanDuration, PortalFlow, PriceEstimate, PricingPolicy, Product, ProductPlan, ProductType, QuantityCheckoutPolicy, SubscriptionStatus } from '@owlmeans/payment';
|
|
8
8
|
export interface Config extends ApiConfig {
|
|
9
9
|
}
|
|
10
10
|
export interface Context<C extends Config = Config> extends ApiContext<C> {
|
|
@@ -75,6 +75,31 @@ export interface StripePluginConfig extends PluginConfig {
|
|
|
75
75
|
api: string;
|
|
76
76
|
webhook?: string;
|
|
77
77
|
}
|
|
78
|
+
/** Stripe-only pricing settings — never a browser-visible field (see `PricingPolicy` for those). */
|
|
79
|
+
export interface StripePricingDef {
|
|
80
|
+
/** Overrides `STRIPE_FX_QUOTES_API_VERSION`, when Stripe moves or renames the preview. */
|
|
81
|
+
fxApiVersion?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Stripe settlement currency used when a catalogue price is declared in another currency.
|
|
84
|
+
* Recurring prices are converted during product sync; amount checkout is converted per session.
|
|
85
|
+
*/
|
|
86
|
+
settlementCurrency?: string;
|
|
87
|
+
/** Explicit Stripe payment methods for subscription Checkout; absent keeps Stripe's dynamic selection. */
|
|
88
|
+
subscriptionPaymentMethodTypes?: string[];
|
|
89
|
+
/**
|
|
90
|
+
* Let a matching `unspecified` price take the declared `tax.behavior` even when the Stripe
|
|
91
|
+
* account's own tax-settings default resolves to the opposite one — which changes what an
|
|
92
|
+
* existing subscriber is charged at their next renewal. Absent/`false`: such a price is left
|
|
93
|
+
* `unspecified` and a `console.error` explains why.
|
|
94
|
+
*/
|
|
95
|
+
migrateUnspecifiedPrices?: boolean;
|
|
96
|
+
}
|
|
97
|
+
export interface StripePricingPluginConfig extends PluginConfig, StripePricingDef {
|
|
98
|
+
}
|
|
99
|
+
/** `declarePaymentPricing`'s argument: the browser-safe `PricingPolicy` plus Stripe-only settings. */
|
|
100
|
+
export interface PricingDef extends PricingPolicy {
|
|
101
|
+
stripe?: StripePricingDef;
|
|
102
|
+
}
|
|
78
103
|
/** What the managed customer portal configuration shows. */
|
|
79
104
|
export interface PortalBrandingDef {
|
|
80
105
|
headline?: string;
|
|
@@ -102,6 +127,15 @@ export interface PortalLinkOptions {
|
|
|
102
127
|
planSku?: string;
|
|
103
128
|
returnUrl: string;
|
|
104
129
|
}
|
|
130
|
+
export interface PriceEstimateParams {
|
|
131
|
+
productSku: string;
|
|
132
|
+
/** Stable database key resolved by the application before this in-process call. */
|
|
133
|
+
entityId: string;
|
|
134
|
+
/** Absent: the product's own reference plan (an amount-priced consumable). */
|
|
135
|
+
planSku?: string;
|
|
136
|
+
/** ISO 3166-1 alpha-2. Absent: taken from the entity's paygate customer address. */
|
|
137
|
+
country?: string;
|
|
138
|
+
}
|
|
105
139
|
export interface GrantInternalPlanOptions {
|
|
106
140
|
/** Required to grant a plan that is not `free`. */
|
|
107
141
|
force?: boolean;
|
|
@@ -118,6 +152,8 @@ export interface GatewayService extends InitializedService {
|
|
|
118
152
|
managed: boolean;
|
|
119
153
|
createLink: (ctx: ApiContext, params: CreateLinkParams) => Promise<string>;
|
|
120
154
|
portalLink: (ctx: ApiContext, entityId: string, opts: PortalLinkOptions) => Promise<string>;
|
|
155
|
+
/** @throws PaygateError('unmanaged') when `managed` is `false`. */
|
|
156
|
+
estimatePrice: (ctx: ApiContext, params: PriceEstimateParams) => Promise<PriceEstimate>;
|
|
121
157
|
grantInternalPlan: (ctx: ApiContext, entityId: string, planSku: string, opts?: GrantInternalPlanOptions) => Promise<PaymentSubscriptionRecord>;
|
|
122
158
|
/** @returns how many subscription rows changed */
|
|
123
159
|
resyncSubscription: (ctx: ApiContext, ref: SubscriptionRef) => Promise<number>;
|
|
@@ -152,8 +188,15 @@ export interface QuantityTopUpCompletion extends TopUpBase {
|
|
|
152
188
|
}
|
|
153
189
|
export interface AmountTopUpCompletion extends TopUpBase {
|
|
154
190
|
mode: 'amount';
|
|
191
|
+
/** Net value in the amount policy's catalogue currency. */
|
|
155
192
|
amountMinor: number;
|
|
193
|
+
/** Grossed-up value in the amount policy's catalogue currency, before settlement conversion. */
|
|
194
|
+
sourceChargeAmountMinor: number;
|
|
195
|
+
/** The amount policy's catalogue currency. */
|
|
196
|
+
amountCurrency: string;
|
|
197
|
+
/** Pre-tax subtotal actually charged by Stripe, in `currency`. */
|
|
156
198
|
chargeAmountMinor: number;
|
|
199
|
+
/** Stripe integration/settlement currency. */
|
|
157
200
|
currency: string;
|
|
158
201
|
}
|
|
159
202
|
export type TopUpCompletion = QuantityTopUpCompletion | AmountTopUpCompletion;
|
|
@@ -347,6 +390,8 @@ export interface PaymentFulfillmentRecord extends ResourceRecord {
|
|
|
347
390
|
mode: CheckoutPricingMode;
|
|
348
391
|
units?: number;
|
|
349
392
|
amountMinor?: number;
|
|
393
|
+
sourceChargeAmountMinor?: number;
|
|
394
|
+
amountCurrency?: string;
|
|
350
395
|
chargeAmountMinor?: number;
|
|
351
396
|
currency?: string;
|
|
352
397
|
createdAt: Date;
|