@vrplatform/hyperline-client 1.0.31 → 1.0.32
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/build/main/client.d.ts +977 -88
- package/build/main/client.js +49 -2
- package/build/main/client.js.map +1 -1
- package/build/main/const.d.ts +18 -20
- package/build/main/const.js +30 -22
- package/build/main/const.js.map +1 -1
- package/build/main/hyperlineError.d.ts +5 -0
- package/build/main/hyperlineError.js +14 -0
- package/build/main/hyperlineError.js.map +1 -0
- package/build/main/index.d.ts +1 -0
- package/build/main/index.js +1 -0
- package/build/main/index.js.map +1 -1
- package/build/main/types.d.ts +2 -10
- package/build/main/types.js.map +1 -1
- package/build/main/utils/calculateMrr.d.ts +2 -2
- package/build/main/utils/calculateMrr.js +6 -15
- package/build/main/utils/calculateMrr.js.map +1 -1
- package/build/main/utils/index.d.ts +0 -1
- package/build/main/utils/index.js +0 -1
- package/build/main/utils/index.js.map +1 -1
- package/build/module/client.d.ts +977 -88
- package/build/module/client.js +49 -2
- package/build/module/client.js.map +1 -1
- package/build/module/const.d.ts +18 -20
- package/build/module/const.js +30 -22
- package/build/module/const.js.map +1 -1
- package/build/module/hyperlineError.d.ts +5 -0
- package/build/module/hyperlineError.js +16 -0
- package/build/module/hyperlineError.js.map +1 -0
- package/build/module/index.d.ts +1 -0
- package/build/module/index.js +1 -0
- package/build/module/index.js.map +1 -1
- package/build/module/types.d.ts +2 -10
- package/build/module/types.js.map +1 -1
- package/build/module/utils/calculateMrr.d.ts +2 -2
- package/build/module/utils/calculateMrr.js +6 -15
- package/build/module/utils/calculateMrr.js.map +1 -1
- package/build/module/utils/index.d.ts +0 -1
- package/build/module/utils/index.js +0 -1
- package/build/module/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +107 -6
- package/src/const.ts +40 -28
- package/src/hyperlineError.ts +17 -0
- package/src/index.ts +1 -0
- package/src/types.ts +2 -11
- package/src/utils/calculateMrr.ts +11 -30
- package/src/utils/index.ts +0 -1
- package/build/main/utils/isTestingTeam.d.ts +0 -5
- package/build/main/utils/isTestingTeam.js +0 -4
- package/build/main/utils/isTestingTeam.js.map +0 -1
- package/build/module/utils/isTestingTeam.d.ts +0 -5
- package/build/module/utils/isTestingTeam.js +0 -4
- package/build/module/utils/isTestingTeam.js.map +0 -1
- package/src/utils/isTestingTeam.ts +0 -11
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { GL_HYPERLINE_DEFAULT_DEV_PLAN_ID, GL_HYPERLINE_DEFAULT_MIN_AMOUNT, GL_HYPERLINE_DEFAULT_PLAN_ID, HYPERLINE_DEFAULT_DEV_PLAN_ID, HYPERLINE_DEFAULT_MIN_AMOUNT, HYPERLINE_DEFAULT_PLAN_ID, } from '../const';
|
|
2
1
|
import { useHyperlineByToken } from '../hooks';
|
|
3
2
|
export async function calculateMrr(subscriptionId, estimated = false, _activeListings, hyperline = useHyperlineByToken(process.env.HYPERLINE_TOKEN), includeLiveBilling = false) {
|
|
4
|
-
const
|
|
5
|
-
if (!
|
|
3
|
+
const subscription = await hyperline.getSubscription(subscriptionId, includeLiveBilling);
|
|
4
|
+
if (!subscription)
|
|
6
5
|
throw new Error('Subscription not found');
|
|
7
|
-
const { products, phases, ...subscription } = _subscription;
|
|
8
6
|
let mrr = 0;
|
|
9
7
|
const activeListings = _activeListings || 0;
|
|
10
|
-
const phase = phases?.find((x) => x.type === 'standard'
|
|
8
|
+
const phase = subscription.phases?.find((x) => x.type === 'standard' &&
|
|
9
|
+
x.status !== 'finished' &&
|
|
10
|
+
!x.do_not_invoice_phase);
|
|
11
11
|
const product = phase?.products?.[0];
|
|
12
12
|
const type = product?.prices?.[0].type;
|
|
13
13
|
if (type === 'volume') {
|
|
@@ -59,16 +59,7 @@ export async function calculateMrr(subscriptionId, estimated = false, _activeLis
|
|
|
59
59
|
? firstTier.amount *
|
|
60
60
|
((firstTier.to - firstTier.from) / firstTier.unit_count)
|
|
61
61
|
: 0;
|
|
62
|
-
const
|
|
63
|
-
GL_HYPERLINE_DEFAULT_PLAN_ID,
|
|
64
|
-
GL_HYPERLINE_DEFAULT_DEV_PLAN_ID,
|
|
65
|
-
].includes(subscription.plan_id)
|
|
66
|
-
? GL_HYPERLINE_DEFAULT_MIN_AMOUNT
|
|
67
|
-
: [HYPERLINE_DEFAULT_PLAN_ID, HYPERLINE_DEFAULT_DEV_PLAN_ID].includes(subscription.plan_id)
|
|
68
|
-
? HYPERLINE_DEFAULT_MIN_AMOUNT
|
|
69
|
-
: 0;
|
|
70
|
-
const min_amount = ((product_min_amount || plan_min_amount || inferred_min_amount) ?? 0) /
|
|
71
|
-
100;
|
|
62
|
+
const min_amount = (product_min_amount ?? inferred_min_amount) / 100;
|
|
72
63
|
mrr = Math.max(mrr, min_amount);
|
|
73
64
|
const max_amount = ((product_max_amount || 0) ?? 0) / 100;
|
|
74
65
|
mrr = max_amount > 0 ? Math.min(mrr, max_amount) : mrr;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculateMrr.js","sourceRoot":"src/","sources":["utils/calculateMrr.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n GL_HYPERLINE_DEFAULT_DEV_PLAN_ID,\n GL_HYPERLINE_DEFAULT_MIN_AMOUNT,\n GL_HYPERLINE_DEFAULT_PLAN_ID,\n HYPERLINE_DEFAULT_DEV_PLAN_ID,\n HYPERLINE_DEFAULT_MIN_AMOUNT,\n HYPERLINE_DEFAULT_PLAN_ID,\n} from '../const';\nimport { useHyperlineByToken } from '../hooks';\nimport type { HyperlineEntities } from '../types';\n\nexport async function calculateMrr(\n subscriptionId: string,\n estimated = false,\n _activeListings?: number,\n hyperline: {\n getSubscription(\n id: string,\n liveBilling?: boolean\n ): Promise<{\n customer_id: string;\n // BIL-614: legacy minimums remain until the subscription migration is complete.\n plan_id: string | null;\n products?: unknown[];\n coupons?: (\n | {\n type: 'amount';\n repeat: HyperlineEntities['Coupon']['repeat'];\n discount_amount: number;\n }\n | {\n type: 'percent';\n repeat: HyperlineEntities['Coupon']['repeat'];\n discount_percent: number;\n }\n )[];\n phases?: {\n type: HyperlineEntities['SubscriptionDetails']['phases'][number]['type'];\n products: {\n min_amount?: number | null;\n max_amount?: number | null;\n prices: (\n | {\n type: 'volume';\n amount: number;\n from: number;\n to: number | null;\n unit_count: number;\n }\n | {\n type:\n | 'bps'\n | 'bulk'\n | 'bundle'\n | 'fee'\n | 'flat_fee'\n | 'packaged';\n }\n )[];\n }[];\n }[];\n live_billing?: { total_amount: number };\n } | null>;\n getInvoicesByCustomerId(id: string): Promise<{\n data: {\n issued_at: string;\n total_amount: number;\n }[];\n } | null>;\n } = useHyperlineByToken(process.env.HYPERLINE_TOKEN!),\n includeLiveBilling = false\n) {\n const _subscription = await hyperline.getSubscription(\n subscriptionId,\n includeLiveBilling\n );\n if (!_subscription) throw new Error('Subscription not found');\n\n const { products, phases, ...subscription } = _subscription;\n\n let mrr = 0;\n const activeListings = _activeListings || 0;\n const phase = phases?.find((x) => x.type === 'standard');\n const product = phase?.products?.[0];\n const type = product?.prices?.[0].type;\n if (type === 'volume') {\n const volumePrices: Array<{\n amount: number;\n from: number;\n to: number | null;\n unit_count: number;\n }> = [];\n\n product?.prices?.forEach((price) => {\n if (\n price.type !== 'volume' ||\n !('amount' in price) ||\n !('from' in price) ||\n !('to' in price) ||\n !('unit_count' in price)\n )\n return;\n\n volumePrices.push({\n amount: price.amount,\n from: price.from,\n to: price.to,\n unit_count: price.unit_count,\n });\n });\n volumePrices.sort((a, b) => a.from - b.from);\n\n mrr =\n volumePrices.reduce((acc, price) => {\n const listings =\n price.to && activeListings >= price.to\n ? price.to - price.from\n : activeListings >= price.from\n ? activeListings - price.from\n : 0;\n\n acc += (price.amount / 100) * (listings / price.unit_count);\n\n return acc;\n }, 0) || 0;\n\n const firstTier = volumePrices[0];\n const secondTier = volumePrices[1];\n const product_min_amount =\n product &&\n 'min_amount' in product &&\n typeof product.min_amount === 'number'\n ? product.min_amount\n : null;\n const product_max_amount =\n product &&\n 'max_amount' in product &&\n typeof product.max_amount === 'number'\n ? product.max_amount\n : null;\n const inferred_min_amount =\n firstTier &&\n secondTier &&\n firstTier.from === 0 &&\n firstTier.to != null &&\n secondTier.from === firstTier.to &&\n firstTier.amount === secondTier.amount &&\n firstTier.unit_count === secondTier.unit_count\n ? firstTier.amount *\n ((firstTier.to - firstTier.from) / firstTier.unit_count)\n : 0;\n const plan_min_amount = [\n GL_HYPERLINE_DEFAULT_PLAN_ID,\n GL_HYPERLINE_DEFAULT_DEV_PLAN_ID,\n ].includes(subscription.plan_id!)\n ? GL_HYPERLINE_DEFAULT_MIN_AMOUNT\n : [HYPERLINE_DEFAULT_PLAN_ID, HYPERLINE_DEFAULT_DEV_PLAN_ID].includes(\n subscription.plan_id!\n )\n ? HYPERLINE_DEFAULT_MIN_AMOUNT\n : 0;\n\n const min_amount =\n ((product_min_amount || plan_min_amount || inferred_min_amount) ?? 0) /\n 100;\n mrr = Math.max(mrr, min_amount);\n\n const max_amount = ((product_max_amount || 0) ?? 0) / 100;\n mrr = max_amount > 0 ? Math.min(mrr, max_amount) : mrr;\n\n // apply discounts (only these who repeat forever if estimated is true)\n (subscription.coupons || [])\n .filter((coupon) => (estimated ? coupon.repeat === 'forever' : true))\n .forEach((x) => {\n if ('discount_amount' in x && x.discount_amount)\n mrr -= x.discount_amount / 100;\n else if ('discount_percent' in x && x.discount_percent)\n mrr -= (x.discount_percent / 100) * mrr;\n });\n } else if (type === 'bps') {\n const { data } = subscription?.customer_id\n ? (await hyperline.getInvoicesByCustomerId(subscription.customer_id)) || {\n data: [],\n }\n : { data: [] };\n\n // sort invoices by date\n const invoices = data\n ?.sort((a, b) => a.issued_at.localeCompare(b.issued_at))\n .reverse();\n\n // get the last invoice\n mrr = (invoices[0]?.total_amount || 0) / 100;\n }\n\n return {\n mrr,\n mrrAlt:\n subscription.live_billing?.total_amount == null\n ? null\n : subscription.live_billing.total_amount / 100,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"calculateMrr.js","sourceRoot":"src/","sources":["utils/calculateMrr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,cAAsB,EACtB,SAAS,GAAG,KAAK,EACjB,eAAwB,EACxB,YAqDI,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAgB,CAAC,EACrD,kBAAkB,GAAG,KAAK;IAE1B,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,eAAe,CAClD,cAAc,EACd,kBAAkB,CACnB,CAAC;IACF,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE7D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,MAAM,cAAc,GAAG,eAAe,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,UAAU;QACrB,CAAC,CAAC,MAAM,KAAK,UAAU;QACvB,CAAC,CAAC,CAAC,oBAAoB,CAC1B,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,YAAY,GAKb,EAAE,CAAC;QAER,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACjC,IACE,KAAK,CAAC,IAAI,KAAK,QAAQ;gBACvB,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC;gBACpB,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;gBAClB,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;gBAChB,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC;gBAExB,OAAO;YAET,YAAY,CAAC,IAAI,CAAC;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAE7C,GAAG;YACD,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACjC,MAAM,QAAQ,GACZ,KAAK,CAAC,EAAE,IAAI,cAAc,IAAI,KAAK,CAAC,EAAE;oBACpC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI;oBACvB,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI;wBAC5B,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI;wBAC7B,CAAC,CAAC,CAAC,CAAC;gBAEV,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;gBAE5D,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,kBAAkB,GACtB,OAAO;YACP,YAAY,IAAI,OAAO;YACvB,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACpC,CAAC,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,kBAAkB,GACtB,OAAO;YACP,YAAY,IAAI,OAAO;YACvB,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACpC,CAAC,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,mBAAmB,GACvB,SAAS;YACT,UAAU;YACV,SAAS,CAAC,IAAI,KAAK,CAAC;YACpB,SAAS,CAAC,EAAE,IAAI,IAAI;YACpB,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE;YAChC,SAAS,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;YACtC,SAAS,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU;YAC5C,CAAC,CAAC,SAAS,CAAC,MAAM;gBAChB,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC;YAC1D,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,UAAU,GAAG,CAAC,kBAAkB,IAAI,mBAAmB,CAAC,GAAG,GAAG,CAAC;QACrE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAEhC,MAAM,UAAU,GAAG,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QAC1D,GAAG,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAEvD,uEAAuE;QACvE,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;aACzB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACpE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,IAAI,iBAAiB,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe;gBAC7C,GAAG,IAAI,CAAC,CAAC,eAAe,GAAG,GAAG,CAAC;iBAC5B,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,CAAC,gBAAgB;gBACpD,GAAG,IAAI,CAAC,CAAC,CAAC,gBAAgB,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;SAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,WAAW;YACxC,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,uBAAuB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI;gBACrE,IAAI,EAAE,EAAE;aACT;YACH,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAEjB,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI;YACnB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACvD,OAAO,EAAE,CAAC;QAEb,uBAAuB;QACvB,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,GAAG;QACH,MAAM,EACJ,YAAY,CAAC,YAAY,EAAE,YAAY,IAAI,IAAI;YAC7C,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY,GAAG,GAAG;KACnD,CAAC;AACJ,CAAC","sourcesContent":["import { useHyperlineByToken } from '../hooks';\nimport type { HyperlineEntities } from '../types';\n\nexport async function calculateMrr(\n subscriptionId: string,\n estimated = false,\n _activeListings?: number,\n hyperline: {\n getSubscription(\n id: string,\n liveBilling?: boolean\n ): Promise<{\n customer_id: string;\n coupons?: (\n | {\n type: 'amount';\n repeat: HyperlineEntities['Coupon']['repeat'];\n discount_amount: number;\n }\n | {\n type: 'percent';\n repeat: HyperlineEntities['Coupon']['repeat'];\n discount_percent: number;\n }\n )[];\n phases?: {\n type: HyperlineEntities['SubscriptionDetails']['phases'][number]['type'];\n status?: HyperlineEntities['SubscriptionDetails']['phases'][number]['status'];\n do_not_invoice_phase: boolean;\n products: {\n min_amount?: number | null;\n max_amount?: number | null;\n prices: (\n | {\n type: 'volume';\n amount: number;\n from: number;\n to: number | null;\n unit_count: number;\n }\n | {\n type:\n | 'bps'\n | 'bulk'\n | 'bundle'\n | 'fee'\n | 'flat_fee'\n | 'packaged';\n }\n )[];\n }[];\n }[];\n live_billing?: { total_amount: number };\n } | null>;\n getInvoicesByCustomerId(id: string): Promise<{\n data: {\n issued_at: string;\n total_amount: number;\n }[];\n } | null>;\n } = useHyperlineByToken(process.env.HYPERLINE_TOKEN!),\n includeLiveBilling = false\n) {\n const subscription = await hyperline.getSubscription(\n subscriptionId,\n includeLiveBilling\n );\n if (!subscription) throw new Error('Subscription not found');\n\n let mrr = 0;\n const activeListings = _activeListings || 0;\n const phase = subscription.phases?.find(\n (x) =>\n x.type === 'standard' &&\n x.status !== 'finished' &&\n !x.do_not_invoice_phase\n );\n const product = phase?.products?.[0];\n const type = product?.prices?.[0].type;\n if (type === 'volume') {\n const volumePrices: Array<{\n amount: number;\n from: number;\n to: number | null;\n unit_count: number;\n }> = [];\n\n product?.prices?.forEach((price) => {\n if (\n price.type !== 'volume' ||\n !('amount' in price) ||\n !('from' in price) ||\n !('to' in price) ||\n !('unit_count' in price)\n )\n return;\n\n volumePrices.push({\n amount: price.amount,\n from: price.from,\n to: price.to,\n unit_count: price.unit_count,\n });\n });\n volumePrices.sort((a, b) => a.from - b.from);\n\n mrr =\n volumePrices.reduce((acc, price) => {\n const listings =\n price.to && activeListings >= price.to\n ? price.to - price.from\n : activeListings >= price.from\n ? activeListings - price.from\n : 0;\n\n acc += (price.amount / 100) * (listings / price.unit_count);\n\n return acc;\n }, 0) || 0;\n\n const firstTier = volumePrices[0];\n const secondTier = volumePrices[1];\n const product_min_amount =\n product &&\n 'min_amount' in product &&\n typeof product.min_amount === 'number'\n ? product.min_amount\n : null;\n const product_max_amount =\n product &&\n 'max_amount' in product &&\n typeof product.max_amount === 'number'\n ? product.max_amount\n : null;\n const inferred_min_amount =\n firstTier &&\n secondTier &&\n firstTier.from === 0 &&\n firstTier.to != null &&\n secondTier.from === firstTier.to &&\n firstTier.amount === secondTier.amount &&\n firstTier.unit_count === secondTier.unit_count\n ? firstTier.amount *\n ((firstTier.to - firstTier.from) / firstTier.unit_count)\n : 0;\n const min_amount = (product_min_amount ?? inferred_min_amount) / 100;\n mrr = Math.max(mrr, min_amount);\n\n const max_amount = ((product_max_amount || 0) ?? 0) / 100;\n mrr = max_amount > 0 ? Math.min(mrr, max_amount) : mrr;\n\n // apply discounts (only these who repeat forever if estimated is true)\n (subscription.coupons || [])\n .filter((coupon) => (estimated ? coupon.repeat === 'forever' : true))\n .forEach((x) => {\n if ('discount_amount' in x && x.discount_amount)\n mrr -= x.discount_amount / 100;\n else if ('discount_percent' in x && x.discount_percent)\n mrr -= (x.discount_percent / 100) * mrr;\n });\n } else if (type === 'bps') {\n const { data } = subscription?.customer_id\n ? (await hyperline.getInvoicesByCustomerId(subscription.customer_id)) || {\n data: [],\n }\n : { data: [] };\n\n // sort invoices by date\n const invoices = data\n ?.sort((a, b) => a.issued_at.localeCompare(b.issued_at))\n .reverse();\n\n // get the last invoice\n mrr = (invoices[0]?.total_amount || 0) / 100;\n }\n\n return {\n mrr,\n mrrAlt:\n subscription.live_billing?.total_amount == null\n ? null\n : subscription.live_billing.total_amount / 100,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC","sourcesContent":["export * from './arrayBufferToBase64';\nexport * from './calculateMrr';\n"]}
|