@abyss-project/main 2.2.0 → 2.3.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 (93) hide show
  1. package/dist/api/billing-account.admin.api.d.ts +6 -2
  2. package/dist/api/billing-account.admin.api.js +9 -1
  3. package/dist/api/billing-account.admin.api.js.map +1 -1
  4. package/dist/constants/tests/billing-catalog.constants.spec.d.ts +1 -0
  5. package/dist/constants/tests/billing-catalog.constants.spec.js +334 -0
  6. package/dist/constants/tests/billing-catalog.constants.spec.js.map +1 -0
  7. package/dist/constants/tests/catalog-plan-quotas.coherence.spec.d.ts +1 -0
  8. package/dist/constants/tests/catalog-plan-quotas.coherence.spec.js +101 -0
  9. package/dist/constants/tests/catalog-plan-quotas.coherence.spec.js.map +1 -0
  10. package/dist/constants/tests/metric-price-scale.constants.spec.d.ts +1 -0
  11. package/dist/constants/tests/metric-price-scale.constants.spec.js +83 -0
  12. package/dist/constants/tests/metric-price-scale.constants.spec.js.map +1 -0
  13. package/dist/constants/tests/module-calibration.constants.spec.d.ts +1 -0
  14. package/dist/constants/tests/module-calibration.constants.spec.js +75 -0
  15. package/dist/constants/tests/module-calibration.constants.spec.js.map +1 -0
  16. package/dist/constants/tests/module-catalog.constants.spec.d.ts +1 -0
  17. package/dist/constants/tests/module-catalog.constants.spec.js +196 -0
  18. package/dist/constants/tests/module-catalog.constants.spec.js.map +1 -0
  19. package/dist/constants/tests/overage-pricing-single-source.spec.d.ts +1 -0
  20. package/dist/constants/tests/overage-pricing-single-source.spec.js +23 -0
  21. package/dist/constants/tests/overage-pricing-single-source.spec.js.map +1 -0
  22. package/dist/constants/tests/password-policy.constants.spec.d.ts +1 -0
  23. package/dist/constants/tests/password-policy.constants.spec.js +67 -0
  24. package/dist/constants/tests/password-policy.constants.spec.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +2 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/server/tests/after-commit-emit.util.spec.d.ts +1 -0
  29. package/dist/server/tests/after-commit-emit.util.spec.js +99 -0
  30. package/dist/server/tests/after-commit-emit.util.spec.js.map +1 -0
  31. package/dist/server/tests/encrypt-secret.util.spec.d.ts +6 -0
  32. package/dist/server/tests/encrypt-secret.util.spec.js +148 -0
  33. package/dist/server/tests/encrypt-secret.util.spec.js.map +1 -0
  34. package/dist/types/enum/abyss-application-event.enum.d.ts +1 -0
  35. package/dist/types/enum/abyss-application-event.enum.js +1 -0
  36. package/dist/types/enum/abyss-application-event.enum.js.map +1 -1
  37. package/dist/types/enum/tests/billing-addon-status.enum.spec.d.ts +1 -0
  38. package/dist/types/enum/tests/billing-addon-status.enum.spec.js +66 -0
  39. package/dist/types/enum/tests/billing-addon-status.enum.spec.js.map +1 -0
  40. package/dist/types/enum/tests/report-notification-type.enum.spec.d.ts +1 -0
  41. package/dist/types/enum/tests/report-notification-type.enum.spec.js +18 -0
  42. package/dist/types/enum/tests/report-notification-type.enum.spec.js.map +1 -0
  43. package/dist/types/enum/tests/user-notification-content-type.enum.spec.d.ts +1 -0
  44. package/dist/types/enum/tests/user-notification-content-type.enum.spec.js +13 -0
  45. package/dist/types/enum/tests/user-notification-content-type.enum.spec.js.map +1 -0
  46. package/dist/types/interface/api/requests/billing-account.admin.request.d.ts +14 -1
  47. package/dist/types/interface/api/responses/billing-account.admin.response.d.ts +5 -0
  48. package/dist/utils/index.d.ts +1 -0
  49. package/dist/utils/index.js +1 -0
  50. package/dist/utils/index.js.map +1 -1
  51. package/dist/utils/plan-capacity.utils.d.ts +21 -0
  52. package/dist/utils/plan-capacity.utils.js +43 -0
  53. package/dist/utils/plan-capacity.utils.js.map +1 -0
  54. package/dist/utils/pricing.utils.d.ts +1 -0
  55. package/dist/utils/pricing.utils.js +16 -2
  56. package/dist/utils/pricing.utils.js.map +1 -1
  57. package/dist/utils/tests/billing-deep-link.utils.spec.d.ts +1 -0
  58. package/dist/utils/tests/billing-deep-link.utils.spec.js +91 -0
  59. package/dist/utils/tests/billing-deep-link.utils.spec.js.map +1 -0
  60. package/dist/utils/tests/billing.utils.spec.d.ts +1 -0
  61. package/dist/utils/tests/billing.utils.spec.js +81 -0
  62. package/dist/utils/tests/billing.utils.spec.js.map +1 -0
  63. package/dist/utils/tests/invoice-amounts.utils.spec.d.ts +1 -0
  64. package/dist/utils/tests/invoice-amounts.utils.spec.js +97 -0
  65. package/dist/utils/tests/invoice-amounts.utils.spec.js.map +1 -0
  66. package/dist/utils/tests/module-lot-price.utils.spec.d.ts +1 -0
  67. package/dist/utils/tests/module-lot-price.utils.spec.js +56 -0
  68. package/dist/utils/tests/module-lot-price.utils.spec.js.map +1 -0
  69. package/dist/utils/tests/module-price.utils.spec.d.ts +1 -0
  70. package/dist/utils/tests/module-price.utils.spec.js +79 -0
  71. package/dist/utils/tests/module-price.utils.spec.js.map +1 -0
  72. package/dist/utils/tests/overage-negotiated-rate.utils.spec.d.ts +1 -0
  73. package/dist/utils/tests/overage-negotiated-rate.utils.spec.js +59 -0
  74. package/dist/utils/tests/overage-negotiated-rate.utils.spec.js.map +1 -0
  75. package/dist/utils/tests/plan-capacity.utils.spec.d.ts +1 -0
  76. package/dist/utils/tests/plan-capacity.utils.spec.js +81 -0
  77. package/dist/utils/tests/plan-capacity.utils.spec.js.map +1 -0
  78. package/dist/utils/tests/pricing.utils.spec.d.ts +1 -0
  79. package/dist/utils/tests/pricing.utils.spec.js +219 -0
  80. package/dist/utils/tests/pricing.utils.spec.js.map +1 -0
  81. package/dist/utils/tests/quota-ceiling.utils.spec.d.ts +1 -0
  82. package/dist/utils/tests/quota-ceiling.utils.spec.js +119 -0
  83. package/dist/utils/tests/quota-ceiling.utils.spec.js.map +1 -0
  84. package/dist/utils/tests/quote-overage-rate.spec.d.ts +1 -0
  85. package/dist/utils/tests/quote-overage-rate.spec.js +39 -0
  86. package/dist/utils/tests/quote-overage-rate.spec.js.map +1 -0
  87. package/dist/utils/tests/resolve-user.utils.spec.d.ts +1 -0
  88. package/dist/utils/tests/resolve-user.utils.spec.js +98 -0
  89. package/dist/utils/tests/resolve-user.utils.spec.js.map +1 -0
  90. package/dist/utils/tests/shifted-tiers.utils.spec.d.ts +1 -0
  91. package/dist/utils/tests/shifted-tiers.utils.spec.js +176 -0
  92. package/dist/utils/tests/shifted-tiers.utils.spec.js.map +1 -0
  93. package/package.json +11 -15
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const organization_billing_enum_1 = require("../../types/enum/organization-billing.enum");
4
+ const metric_price_scale_constants_1 = require("../metric-price-scale.constants");
5
+ const billing_catalog_constants_1 = require("../billing-catalog.constants");
6
+ const pricing_utils_1 = require("../../utils/pricing.utils");
7
+ describe('METRIC_PRICE_SCALE', () => {
8
+ it('prices storage on four decreasing tranches', () => {
9
+ const scale = metric_price_scale_constants_1.METRIC_PRICE_SCALE[organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB];
10
+ expect(scale).toBeDefined();
11
+ expect(scale).toHaveLength(4);
12
+ expect(scale?.map((t) => t.nanocentsPerUnit)).toEqual([
13
+ 1_500_000_000, 1_000_000_000, 600_000_000, 400_000_000,
14
+ ]);
15
+ expect(scale?.map((t) => t.upToQuantity)).toEqual([100, 1_000, 5_000, null]);
16
+ });
17
+ it('closes every scale with an open-ended tranche', () => {
18
+ for (const scale of Object.values(metric_price_scale_constants_1.METRIC_PRICE_SCALE)) {
19
+ expect(scale.length).toBeGreaterThan(0);
20
+ expect(scale[scale.length - 1].upToQuantity).toBeNull();
21
+ expect(scale.slice(0, -1).every((t) => t.upToQuantity !== null)).toBe(true);
22
+ }
23
+ });
24
+ it('keeps every scale strictly increasing in bound and non-increasing in price', () => {
25
+ for (const scale of Object.values(metric_price_scale_constants_1.METRIC_PRICE_SCALE)) {
26
+ let previousBound = 0;
27
+ let previousPrice = Number.POSITIVE_INFINITY;
28
+ for (const tranche of scale) {
29
+ const bound = tranche.upToQuantity ?? Number.POSITIVE_INFINITY;
30
+ expect(bound).toBeGreaterThan(previousBound);
31
+ expect(tranche.nanocentsPerUnit).toBeLessThanOrEqual(previousPrice);
32
+ expect(tranche.nanocentsPerUnit).toBeGreaterThan(0);
33
+ previousBound = bound;
34
+ previousPrice = tranche.nanocentsPerUnit;
35
+ }
36
+ }
37
+ });
38
+ it('exposes the money constants', () => {
39
+ expect(metric_price_scale_constants_1.NANOCENTS_PER_CENT).toBe(1_000_000_000);
40
+ expect(metric_price_scale_constants_1.OVERAGE_MULTIPLIER).toBe(2);
41
+ });
42
+ });
43
+ describe('METRIC_PRICE_SCALE — invariants de catalogue', () => {
44
+ it('keeps every rate an integer number of nanocents', () => {
45
+ for (const [metric, scale] of Object.entries(metric_price_scale_constants_1.METRIC_PRICE_SCALE)) {
46
+ for (const tranche of scale) {
47
+ expect({ metric, rate: tranche.nanocentsPerUnit }).toEqual({
48
+ metric,
49
+ rate: Math.round(tranche.nanocentsPerUnit),
50
+ });
51
+ }
52
+ }
53
+ });
54
+ it('never prices a metric that cannot be overage-billed', () => {
55
+ for (const metric of Object.keys(metric_price_scale_constants_1.METRIC_PRICE_SCALE)) {
56
+ expect(billing_catalog_constants_1.METRIC_IS_OVERAGE_ELIGIBLE.has(metric)).toBe(true);
57
+ }
58
+ });
59
+ it('never prices a configuration metric', () => {
60
+ for (const metric of Object.keys(metric_price_scale_constants_1.METRIC_PRICE_SCALE)) {
61
+ expect(billing_catalog_constants_1.METRIC_IS_CONFIG.has(metric)).toBe(false);
62
+ }
63
+ });
64
+ it('leaves the not-yet-modular metrics unpriced on purpose', () => {
65
+ const eligibleWithoutScale = [...billing_catalog_constants_1.METRIC_IS_OVERAGE_ELIGIBLE].filter((metric) => metric_price_scale_constants_1.METRIC_PRICE_SCALE[metric] === undefined);
66
+ expect(eligibleWithoutScale.length).toBeGreaterThan(0);
67
+ });
68
+ it('still resolves a rate for every overage-eligible metric', () => {
69
+ const unresolvable = [...billing_catalog_constants_1.METRIC_IS_OVERAGE_ELIGIBLE].filter((metric) => (0, pricing_utils_1.resolveOverageNanocentsPerUnit)(metric) === null);
70
+ expect(unresolvable).toEqual([]);
71
+ });
72
+ it('keeps every fallback rate denominated per ONE unit', () => {
73
+ const perThousand = [...billing_catalog_constants_1.METRIC_IS_OVERAGE_ELIGIBLE]
74
+ .filter((metric) => metric_price_scale_constants_1.METRIC_PRICE_SCALE[metric] === undefined)
75
+ .filter((metric) => billing_catalog_constants_1.DEFAULT_OVERAGE_BASE_RATES[metric]?.unit.startsWith('1k'));
76
+ expect(perThousand).toEqual([]);
77
+ });
78
+ it('bills a fallback metric at its flat catalog rate', () => {
79
+ expect((0, pricing_utils_1.resolveOverageNanocentsPerUnit)(organization_billing_enum_1.BillingMetric.TEAM_COUNT)).toBe(100 * 1_000_000_000);
80
+ expect((0, pricing_utils_1.overagePriceCents)(organization_billing_enum_1.BillingMetric.TEAM_COUNT, 2, 2)).toBe(200);
81
+ });
82
+ });
83
+ //# sourceMappingURL=metric-price-scale.constants.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-price-scale.constants.spec.js","sourceRoot":"","sources":["../../../src/constants/tests/metric-price-scale.constants.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const organization_billing_enum_1 = require("../../types/enum/organization-billing.enum");
4
+ const metric_price_scale_constants_1 = require("../metric-price-scale.constants");
5
+ const overage_base_rates_constants_1 = require("../overage-base-rates.constants");
6
+ const module_catalog_constants_1 = require("../module-catalog.constants");
7
+ const depuisEchelle = (metric) => {
8
+ const scale = metric_price_scale_constants_1.METRIC_PRICE_SCALE[metric];
9
+ return scale ? scale[0].nanocentsPerUnit * metric_price_scale_constants_1.OVERAGE_MULTIPLIER : null;
10
+ };
11
+ const depuisTarifPlat = (metric) => {
12
+ const plat = overage_base_rates_constants_1.DEFAULT_OVERAGE_BASE_RATES[metric];
13
+ return plat ? plat.rate * metric_price_scale_constants_1.NANOCENTS_PER_CENT : null;
14
+ };
15
+ const HAUSSES_CONNUES = [
16
+ { metric: organization_billing_enum_1.BillingMetric.MEMBERS_COUNT, rapport: 1.5 },
17
+ { metric: organization_billing_enum_1.BillingMetric.TOOLS_BOARD_COUNT, rapport: 2.32 },
18
+ { metric: organization_billing_enum_1.BillingMetric.TOOLS_ATLAS_COUNT, rapport: 2.32 },
19
+ { metric: organization_billing_enum_1.BillingMetric.TOOLS_DRAW_COUNT, rapport: 2.32 },
20
+ { metric: organization_billing_enum_1.BillingMetric.TOOLS_RETROSPECTIVE_COUNT, rapport: 2.32 },
21
+ { metric: organization_billing_enum_1.BillingMetric.BANKING_SELF_BANK_CONNECTIONS_COUNT, rapport: 1.73 },
22
+ ];
23
+ describe('le calibrage des modules', () => {
24
+ it('AUCUNE métrique ne fait monter le dépassement sans figurer dans la table', () => {
25
+ const connues = new Set(HAUSSES_CONNUES.map((h) => h.metric));
26
+ const surprises = [];
27
+ for (const metric of Object.keys(metric_price_scale_constants_1.METRIC_PRICE_SCALE)) {
28
+ const echelle = depuisEchelle(metric);
29
+ const plat = depuisTarifPlat(metric);
30
+ if (echelle === null || plat === null || connues.has(metric)) {
31
+ continue;
32
+ }
33
+ if (echelle > plat) {
34
+ surprises.push(`${metric} : ${plat} → ${echelle} (×${(echelle / plat).toFixed(2)})`);
35
+ }
36
+ }
37
+ expect(surprises).toStrictEqual([]);
38
+ });
39
+ it('les hausses connues n’ont pas bougé', () => {
40
+ for (const { metric, rapport } of HAUSSES_CONNUES) {
41
+ const echelle = depuisEchelle(metric);
42
+ const plat = depuisTarifPlat(metric);
43
+ expect(echelle).not.toBeNull();
44
+ expect(plat).not.toBeNull();
45
+ expect(echelle / plat).toBeCloseTo(rapport, 2);
46
+ }
47
+ });
48
+ it('toute métrique tarifée par un module a une ÉCHELLE ou un tarif plat', () => {
49
+ const orphelines = [];
50
+ for (const module of module_catalog_constants_1.BILLING_MODULES) {
51
+ if (module.kind !== module_catalog_constants_1.BillingModuleKind.QUANTITY) {
52
+ continue;
53
+ }
54
+ for (const grant of module.lotGrants) {
55
+ if (!metric_price_scale_constants_1.METRIC_PRICE_SCALE[grant.metric] && !overage_base_rates_constants_1.DEFAULT_OVERAGE_BASE_RATES[grant.metric]) {
56
+ orphelines.push(`${module.id} → ${grant.metric}`);
57
+ }
58
+ }
59
+ }
60
+ expect(orphelines).toStrictEqual([]);
61
+ });
62
+ it('un lot de QUANTITÉ octroie toujours quelque chose sur sa propre échelle', () => {
63
+ for (const module of module_catalog_constants_1.BILLING_MODULES) {
64
+ if (module.kind !== module_catalog_constants_1.BillingModuleKind.QUANTITY) {
65
+ continue;
66
+ }
67
+ const surSonEchelle = module.lotGrants.some((g) => g.metric === module.scaleKey);
68
+ expect({ module: module.id, surSonEchelle }).toStrictEqual({
69
+ module: module.id,
70
+ surSonEchelle: true,
71
+ });
72
+ }
73
+ });
74
+ });
75
+ //# sourceMappingURL=module-calibration.constants.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-calibration.constants.spec.js","sourceRoot":"","sources":["../../../src/constants/tests/module-calibration.constants.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const organization_billing_enum_1 = require("../../types/enum/organization-billing.enum");
4
+ const metric_price_scale_constants_1 = require("../metric-price-scale.constants");
5
+ const module_catalog_constants_1 = require("../module-catalog.constants");
6
+ describe('le catalogue des modules', () => {
7
+ it('porte dix-huit modules, tous d’identifiant distinct', () => {
8
+ expect(module_catalog_constants_1.BILLING_MODULES).toHaveLength(18);
9
+ const ids = module_catalog_constants_1.BILLING_MODULES.map((m) => m.id);
10
+ expect(new Set(ids).size).toStrictEqual(ids.length);
11
+ });
12
+ it('n’expose aucun identifiant d’énumération orphelin', () => {
13
+ const declares = Object.values(module_catalog_constants_1.BillingModuleId).sort();
14
+ const presents = module_catalog_constants_1.BILLING_MODULES.map((m) => m.id).sort();
15
+ expect(presents).toStrictEqual(declares);
16
+ });
17
+ it('vend un siège aux organisations et à personne d’autre', () => {
18
+ const seats = (0, module_catalog_constants_1.moduleById)(module_catalog_constants_1.BillingModuleId.SEATS);
19
+ expect(seats?.scopes).toStrictEqual([organization_billing_enum_1.PlanAccountType.ORGANIZATION]);
20
+ });
21
+ it('déclare une échelle pour chaque module de quantité, et aucune pour un déblocage', () => {
22
+ for (const module of module_catalog_constants_1.BILLING_MODULES) {
23
+ if (module.kind === module_catalog_constants_1.BillingModuleKind.QUANTITY) {
24
+ expect(metric_price_scale_constants_1.METRIC_PRICE_SCALE[module.scaleKey]).toBeDefined();
25
+ }
26
+ else {
27
+ expect(module.flatPriceCents).toBeGreaterThan(0);
28
+ }
29
+ }
30
+ });
31
+ it('n’octroie que des métriques qui existent encore au catalogue', () => {
32
+ const connues = new Set(Object.values(organization_billing_enum_1.BillingMetric));
33
+ for (const module of module_catalog_constants_1.BILLING_MODULES) {
34
+ for (const grant of module.lotGrants) {
35
+ expect(connues.has(grant.metric)).toBe(true);
36
+ }
37
+ }
38
+ });
39
+ });
40
+ describe('les deux invariants de couverture', () => {
41
+ it('toute métrique TARIFÉE est vendue par au moins un module', () => {
42
+ expect((0, module_catalog_constants_1.pricedMetricsSoldByNoModule)()).toStrictEqual([]);
43
+ });
44
+ it('toute métrique octroyée EN QUANTITÉ a un tarif de dépassement', () => {
45
+ expect((0, module_catalog_constants_1.quantityGrantsWithoutOverageRate)()).toStrictEqual([]);
46
+ });
47
+ it('couvre les métriques annoncées', () => {
48
+ expect((0, module_catalog_constants_1.grantedMetrics)().size).toBeGreaterThanOrEqual(20);
49
+ });
50
+ });
51
+ describe('moduleGrants — un lot se multiplie, un déblocage NON', () => {
52
+ it('multiplie chaque octroi d’un module de quantité par le nombre de lots', () => {
53
+ const extract = (0, module_catalog_constants_1.moduleById)(module_catalog_constants_1.BillingModuleId.EXTRACT);
54
+ expect(extract).toBeDefined();
55
+ expect((0, module_catalog_constants_1.moduleGrants)(extract, 3)).toStrictEqual([
56
+ { metric: organization_billing_enum_1.BillingMetric.TOOLS_EXTRACTION, quantity: 1500 },
57
+ { metric: organization_billing_enum_1.BillingMetric.TOOLS_EXTRACTION_OCR_PAGES, quantity: 6000 },
58
+ ]);
59
+ });
60
+ it('NE multiplie PAS un déblocage — le point du test', () => {
61
+ const retention = (0, module_catalog_constants_1.moduleById)(module_catalog_constants_1.BillingModuleId.UNLOCK_MONITOR_RETENTION);
62
+ expect(retention).toBeDefined();
63
+ expect((0, module_catalog_constants_1.moduleGrants)(retention, 2)).toStrictEqual([
64
+ { metric: organization_billing_enum_1.BillingMetric.RETENTION_DAYS, quantity: 90 },
65
+ ]);
66
+ });
67
+ it('préserve l’illimité au lieu de le multiplier', () => {
68
+ const beam = (0, module_catalog_constants_1.moduleById)(module_catalog_constants_1.BillingModuleId.UNLOCK_BEAM_EXPIRY);
69
+ expect(beam).toBeDefined();
70
+ expect((0, module_catalog_constants_1.moduleGrants)(beam, 1)).toStrictEqual([
71
+ { metric: organization_billing_enum_1.BillingMetric.TOOLS_BEAM_EXPIRY_MAX_DAYS, quantity: -1 },
72
+ ]);
73
+ });
74
+ it('rend une liste vide pour une quantité nulle ou négative', () => {
75
+ const storage = (0, module_catalog_constants_1.moduleById)(module_catalog_constants_1.BillingModuleId.STORAGE);
76
+ expect(storage).toBeDefined();
77
+ expect((0, module_catalog_constants_1.moduleGrants)(storage, 0)).toStrictEqual([]);
78
+ expect((0, module_catalog_constants_1.moduleGrants)(storage, -5)).toStrictEqual([]);
79
+ });
80
+ it('tronque une quantité fractionnaire plutôt que d’octroyer un demi-lot', () => {
81
+ const storage = (0, module_catalog_constants_1.moduleById)(module_catalog_constants_1.BillingModuleId.STORAGE);
82
+ expect((0, module_catalog_constants_1.moduleGrants)(storage, 2.9)).toStrictEqual([
83
+ { metric: organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB, quantity: 2 },
84
+ { metric: organization_billing_enum_1.BillingMetric.FILES_COUNT, quantity: 200 },
85
+ ]);
86
+ });
87
+ });
88
+ describe('moduleById', () => {
89
+ it('trouve un module au catalogue', () => {
90
+ expect((0, module_catalog_constants_1.moduleById)(module_catalog_constants_1.BillingModuleId.TOOLS)?.label).toStrictEqual('AbyssTools — atelier');
91
+ });
92
+ it('rend undefined pour un identifiant hors catalogue', () => {
93
+ expect((0, module_catalog_constants_1.moduleById)('module-qui-n-existe-pas')).toBeUndefined();
94
+ });
95
+ });
96
+ describe('isAddonGranting — quel état octroie de la capacité', () => {
97
+ it('octroie sur ACTIVE et sur PENDING_REMOVAL, jamais sur SUSPENDED_BY_PLAN', () => {
98
+ expect((0, module_catalog_constants_1.isAddonGranting)(organization_billing_enum_1.BillingAddonStatus.ACTIVE)).toBe(true);
99
+ expect((0, module_catalog_constants_1.isAddonGranting)(organization_billing_enum_1.BillingAddonStatus.PENDING_REMOVAL)).toBe(true);
100
+ expect((0, module_catalog_constants_1.isAddonGranting)(organization_billing_enum_1.BillingAddonStatus.SUSPENDED_BY_PLAN)).toBe(false);
101
+ });
102
+ it('couvre TOUS les états déclarés — un état ajouté sans décision fait tomber ce test', () => {
103
+ const decides = [
104
+ organization_billing_enum_1.BillingAddonStatus.ACTIVE,
105
+ organization_billing_enum_1.BillingAddonStatus.PENDING_REMOVAL,
106
+ organization_billing_enum_1.BillingAddonStatus.SUSPENDED_BY_PLAN,
107
+ ];
108
+ expect(Object.values(organization_billing_enum_1.BillingAddonStatus).sort()).toStrictEqual([...decides].sort());
109
+ });
110
+ });
111
+ describe('applyModuleGrantsToLimit — le repli des modules dans une limite', () => {
112
+ const ligne = (moduleId, quantity, status = organization_billing_enum_1.BillingAddonStatus.ACTIVE) => ({ moduleId, quantity, status });
113
+ it('additionne un module de QUANTITÉ à la limite du plan', () => {
114
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB, 200, [
115
+ ligne(module_catalog_constants_1.BillingModuleId.STORAGE, 800),
116
+ ])).toStrictEqual(1000);
117
+ });
118
+ it('ne retient, dans un lot de lignes, que celles qui touchent la métrique', () => {
119
+ const possede = [
120
+ ligne(module_catalog_constants_1.BillingModuleId.STORAGE, 800),
121
+ ligne(module_catalog_constants_1.BillingModuleId.CRYPT, 2),
122
+ ligne(module_catalog_constants_1.BillingModuleId.BEAM, 3),
123
+ ];
124
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB, 200, possede)).toStrictEqual(1000);
125
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.CRYPT_ENCRYPTIONS_MONTH, 0, possede)).toStrictEqual(10000);
126
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.TOOLS_BEAM_BANDWIDTH_MONTH, 0, possede)).toStrictEqual(600);
127
+ });
128
+ it('additionne bien deux lignes distinctes qui octroieraient la même métrique', () => {
129
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB, 0, [
130
+ ligne(module_catalog_constants_1.BillingModuleId.STORAGE, 300),
131
+ ligne(module_catalog_constants_1.BillingModuleId.STORAGE, 200),
132
+ ])).toStrictEqual(500);
133
+ });
134
+ it('prend le MAXIMUM pour un déblocage, au lieu de l’ajouter', () => {
135
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.RETENTION_DAYS, 30, [
136
+ ligne(module_catalog_constants_1.BillingModuleId.UNLOCK_MONITOR_RETENTION, 1),
137
+ ])).toStrictEqual(90);
138
+ });
139
+ it('ne BAISSE jamais une limite déjà supérieure au déblocage', () => {
140
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.RETENTION_DAYS, 180, [
141
+ ligne(module_catalog_constants_1.BillingModuleId.UNLOCK_MONITOR_RETENTION, 1),
142
+ ])).toStrictEqual(180);
143
+ });
144
+ it('laisse l’illimité illimité quand la BASE l’est déjà', () => {
145
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB, -1, [
146
+ ligne(module_catalog_constants_1.BillingModuleId.STORAGE, 500),
147
+ ])).toStrictEqual(-1);
148
+ });
149
+ it('rend illimité quand le DÉBLOCAGE l’est, quelle que soit la base', () => {
150
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.TOOLS_BEAM_EXPIRY_MAX_DAYS, 7, [
151
+ ligne(module_catalog_constants_1.BillingModuleId.UNLOCK_BEAM_EXPIRY, 1),
152
+ ])).toStrictEqual(-1);
153
+ });
154
+ it('IGNORE une ligne suspendue — sinon la capacité devient gratuite', () => {
155
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.RETENTION_DAYS, 30, [
156
+ ligne(module_catalog_constants_1.BillingModuleId.UNLOCK_MONITOR_RETENTION, 1, organization_billing_enum_1.BillingAddonStatus.SUSPENDED_BY_PLAN),
157
+ ])).toStrictEqual(30);
158
+ });
159
+ it('COMPTE une ligne en retrait programmé — elle est facturée jusqu’à l’échéance', () => {
160
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB, 200, [
161
+ ligne(module_catalog_constants_1.BillingModuleId.STORAGE, 800, organization_billing_enum_1.BillingAddonStatus.PENDING_REMOVAL),
162
+ ])).toStrictEqual(1000);
163
+ });
164
+ it('ignore une ligne dont le module a quitté le catalogue, sans échouer', () => {
165
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.ACCOUNT_STORAGE_GB, 200, [
166
+ ligne('module-disparu', 5),
167
+ ])).toStrictEqual(200);
168
+ });
169
+ it('n’octroie rien pour une métrique qu’aucun module possédé ne touche', () => {
170
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.CRYPT_ENCRYPTIONS_MONTH, 500, [
171
+ ligne(module_catalog_constants_1.BillingModuleId.STORAGE, 800),
172
+ ])).toStrictEqual(500);
173
+ });
174
+ it('octroie TOUTES les métriques d’un lot, pas seulement celle qui le tarife', () => {
175
+ const lignes = [ligne(module_catalog_constants_1.BillingModuleId.TOOLS, 2)];
176
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.TOOLS_BOARD_COUNT, 0, lignes)).toStrictEqual(10);
177
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.TOOLS_ATLAS_COUNT, 0, lignes)).toStrictEqual(10);
178
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.TOOLS_SHORT_LINK_COUNT, 0, lignes)).toStrictEqual(40);
179
+ expect((0, module_catalog_constants_1.applyModuleGrantsToLimit)(organization_billing_enum_1.BillingMetric.TOOLS_SHORTLINK_RESOLUTIONS_MONTH, 0, lignes)).toStrictEqual(100000);
180
+ });
181
+ });
182
+ describe('l’invariant qui rend « somme ou maximum » décidable', () => {
183
+ it('aucune métrique n’est octroyée à la fois par un QUANTITY et par un UNLOCK', () => {
184
+ const parQuantite = new Set();
185
+ const parDeblocage = new Set();
186
+ for (const module of module_catalog_constants_1.BILLING_MODULES) {
187
+ const cible = module.kind === module_catalog_constants_1.BillingModuleKind.QUANTITY ? parQuantite : parDeblocage;
188
+ for (const grant of module.lotGrants) {
189
+ cible.add(grant.metric);
190
+ }
191
+ }
192
+ const communes = [...parQuantite].filter((m) => parDeblocage.has(m));
193
+ expect(communes).toStrictEqual([]);
194
+ });
195
+ });
196
+ //# sourceMappingURL=module-catalog.constants.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-catalog.constants.spec.js","sourceRoot":"","sources":["../../../src/constants/tests/module-catalog.constants.spec.ts"],"names":[],"mappings":";;AAAA,0FAIoD;AACpD,kFAAqE;AACrE,0EAYqC;AAWrC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,0CAAe,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,0CAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAG3D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,0CAAe,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,0CAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAG/D,MAAM,KAAK,GAAG,IAAA,qCAAU,EAAC,0CAAe,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,2CAAe,CAAC,YAAY,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,KAAK,MAAM,MAAM,IAAI,0CAAe,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,IAAI,KAAK,4CAAiB,CAAC,QAAQ,EAAE,CAAC;gBAC/C,MAAM,CAAC,iDAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBAEN,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QAKtE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,yCAAa,CAAC,CAAC,CAAC;QAC9D,KAAK,MAAM,MAAM,IAAI,0CAAe,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAGlE,MAAM,CAAC,IAAA,sDAA2B,GAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QAGvE,MAAM,CAAC,IAAA,2DAAgC,GAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,IAAA,yCAAc,GAAE,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,OAAO,GAAG,IAAA,qCAAU,EAAC,0CAAe,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAA,uCAAY,EAAC,OAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9C,EAAE,MAAM,EAAE,yCAAa,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC1D,EAAE,MAAM,EAAE,yCAAa,CAAC,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE;SACrE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAI1D,MAAM,SAAS,GAAG,IAAA,qCAAU,EAAC,0CAAe,CAAC,wBAAwB,CAAC,CAAC;QACvE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,IAAA,uCAAY,EAAC,SAAU,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAChD,EAAE,MAAM,EAAE,yCAAa,CAAC,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE;SACvD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QAGtD,MAAM,IAAI,GAAG,IAAA,qCAAU,EAAC,0CAAe,CAAC,kBAAkB,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAA,uCAAY,EAAC,IAAK,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC3C,EAAE,MAAM,EAAE,yCAAa,CAAC,0BAA0B,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE;SACnE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAGjE,MAAM,OAAO,GAAG,IAAA,qCAAU,EAAC,0CAAe,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAA,uCAAY,EAAC,OAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,IAAA,uCAAY,EAAC,OAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,OAAO,GAAG,IAAA,qCAAU,EAAC,0CAAe,CAAC,OAAO,CAAC,CAAC;QAIpD,MAAM,CAAC,IAAA,uCAAY,EAAC,OAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC;YAChD,EAAE,MAAM,EAAE,yCAAa,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE;YACzD,EAAE,MAAM,EAAE,yCAAa,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE;SACrD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,IAAA,qCAAU,EAAC,0CAAe,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAG3D,MAAM,CAAC,IAAA,qCAAU,EAAC,yBAA4C,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAIjF,MAAM,CAAC,IAAA,0CAAe,EAAC,8CAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAA,0CAAe,EAAC,8CAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,IAAA,0CAAe,EAAC,8CAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,OAAO,GAAG;YACd,8CAAkB,CAAC,MAAM;YACzB,8CAAkB,CAAC,eAAe;YAClC,8CAAkB,CAAC,iBAAiB;SACrC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,8CAAkB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC/E,MAAM,KAAK,GAAG,CACZ,QAAyB,EACzB,QAAgB,EAChB,SAA6B,8CAAkB,CAAC,MAAM,EACrC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvD,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAG9D,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC9D,KAAK,CAAC,0CAAe,CAAC,OAAO,EAAE,GAAG,CAAC;SACpC,CAAC,CACH,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAIhF,MAAM,OAAO,GAAG;YACd,KAAK,CAAC,0CAAe,CAAC,OAAO,EAAE,GAAG,CAAC;YACnC,KAAK,CAAC,0CAAe,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/B,KAAK,CAAC,0CAAe,CAAC,IAAI,EAAE,CAAC,CAAC;SAC/B,CAAC;QACF,MAAM,CAAC,IAAA,mDAAwB,EAAC,yCAAa,CAAC,kBAAkB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAC5F,IAAI,CACL,CAAC;QACF,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,uBAAuB,EAAE,CAAC,EAAE,OAAO,CAAC,CAC5E,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,0BAA0B,EAAE,CAAC,EAAE,OAAO,CAAC,CAC/E,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QAInF,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,kBAAkB,EAAE,CAAC,EAAE;YAC5D,KAAK,CAAC,0CAAe,CAAC,OAAO,EAAE,GAAG,CAAC;YACnC,KAAK,CAAC,0CAAe,CAAC,OAAO,EAAE,GAAG,CAAC;SACpC,CAAC,CACH,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAGlE,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,cAAc,EAAE,EAAE,EAAE;YACzD,KAAK,CAAC,0CAAe,CAAC,wBAAwB,EAAE,CAAC,CAAC;SACnD,CAAC,CACH,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAGlE,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,cAAc,EAAE,GAAG,EAAE;YAC1D,KAAK,CAAC,0CAAe,CAAC,wBAAwB,EAAE,CAAC,CAAC;SACnD,CAAC,CACH,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE;YAC7D,KAAK,CAAC,0CAAe,CAAC,OAAO,EAAE,GAAG,CAAC;SACpC,CAAC,CACH,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QAGzE,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,0BAA0B,EAAE,CAAC,EAAE;YACpE,KAAK,CAAC,0CAAe,CAAC,kBAAkB,EAAE,CAAC,CAAC;SAC7C,CAAC,CACH,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QAIzE,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,cAAc,EAAE,EAAE,EAAE;YACzD,KAAK,CAAC,0CAAe,CAAC,wBAAwB,EAAE,CAAC,EAAE,8CAAkB,CAAC,iBAAiB,CAAC;SACzF,CAAC,CACH,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QAItF,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC9D,KAAK,CAAC,0CAAe,CAAC,OAAO,EAAE,GAAG,EAAE,8CAAkB,CAAC,eAAe,CAAC;SACxE,CAAC,CACH,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAG7E,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC9D,KAAK,CAAC,gBAAmC,EAAE,CAAC,CAAC;SAC9C,CAAC,CACH,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACnE,KAAK,CAAC,0CAAe,CAAC,OAAO,EAAE,GAAG,CAAC;SACpC,CAAC,CACH,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAGlF,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,0CAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,IAAA,mDAAwB,EAAC,yCAAa,CAAC,iBAAiB,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAA,mDAAwB,EAAC,yCAAa,CAAC,iBAAiB,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAA,mDAAwB,EAAC,yCAAa,CAAC,sBAAsB,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAC7F,EAAE,CACH,CAAC;QACF,MAAM,CACJ,IAAA,mDAAwB,EAAC,yCAAa,CAAC,iCAAiC,EAAE,CAAC,EAAE,MAAM,CAAC,CACrF,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QAInF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiB,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;QAC9C,KAAK,MAAM,MAAM,IAAI,0CAAe,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,4CAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;YACtF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const organization_billing_enum_1 = require("../../types/enum/organization-billing.enum");
4
+ const billing_catalog_constants_1 = require("../billing-catalog.constants");
5
+ const pricing_utils_1 = require("../../utils/pricing.utils");
6
+ const annonceEnNanocents = (metric) => {
7
+ const [entry] = (0, billing_catalog_constants_1.buildCatalogOveragePricing)([{ service: organization_billing_enum_1.BillingService.ABYSS_PLATFORM, metric }]);
8
+ return entry ? entry.nanocentsPerUnit : null;
9
+ };
10
+ describe('le tarif de dépassement annoncé est celui qui est facturé', () => {
11
+ const metriques = [...billing_catalog_constants_1.METRIC_IS_OVERAGE_ELIGIBLE].filter((m) => (0, pricing_utils_1.resolveOverageNanocentsPerUnit)(m) !== null);
12
+ it('couvre bien les métriques tarifées et éligibles', () => {
13
+ expect(metriques.length).toBeGreaterThan(0);
14
+ });
15
+ it.each(metriques)('%s : annoncé === facturé', (metric) => {
16
+ const annonce = annonceEnNanocents(metric);
17
+ const facture = (0, pricing_utils_1.resolveOverageNanocentsPerUnit)(metric);
18
+ expect(annonce).not.toBeNull();
19
+ expect(facture).not.toBeNull();
20
+ expect(annonce).toBe(facture);
21
+ });
22
+ });
23
+ //# sourceMappingURL=overage-pricing-single-source.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overage-pricing-single-source.spec.js","sourceRoot":"","sources":["../../../src/constants/tests/overage-pricing-single-source.spec.ts"],"names":[],"mappings":";;AA4BA,0FAA2F;AAC3F,4EAGsC;AACtC,6DAA2E;AAQ3E,MAAM,kBAAkB,GAAG,CAAC,MAAqB,EAAiB,EAAE;IAClE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAA,sDAA0B,EAAC,CAAC,EAAE,OAAO,EAAE,0CAAc,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjG,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC,CAAC;AAEF,QAAQ,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACzE,MAAM,SAAS,GAAG,CAAC,GAAG,sDAA0B,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,8CAA8B,EAAC,CAAC,CAAC,KAAK,IAAI,CAClD,CAAC;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,0BAA0B,EAAE,CAAC,MAAM,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAA,8CAA8B,EAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const types_1 = require("../../types");
4
+ const password_policy_constants_1 = require("../password-policy.constants");
5
+ describe('PASSWORD_POLICY', () => {
6
+ it('exposes the account floor and the legacy login floor separately', () => {
7
+ expect(password_policy_constants_1.PASSWORD_POLICY.minLength).toBe(10);
8
+ expect(password_policy_constants_1.PASSWORD_POLICY.maxLength).toBe(64);
9
+ expect(password_policy_constants_1.PASSWORD_POLICY.legacyLoginMinLength).toBe(6);
10
+ expect(password_policy_constants_1.PASSWORD_POLICY.legacyLoginMinLength).toBeLessThan(password_policy_constants_1.PASSWORD_POLICY.minLength);
11
+ });
12
+ });
13
+ describe('validateAccountPassword', () => {
14
+ it('accepts a passphrase at the floor', () => {
15
+ expect((0, password_policy_constants_1.validateAccountPassword)('a'.repeat(password_policy_constants_1.PASSWORD_POLICY.minLength))).toBeNull();
16
+ });
17
+ it('rejects one character below the floor', () => {
18
+ expect((0, password_policy_constants_1.validateAccountPassword)('a'.repeat(password_policy_constants_1.PASSWORD_POLICY.minLength - 1))).toBe(types_1.PasswordPolicyViolation.tooShort);
19
+ });
20
+ it('rejects one character above the ceiling', () => {
21
+ expect((0, password_policy_constants_1.validateAccountPassword)('a'.repeat(password_policy_constants_1.PASSWORD_POLICY.maxLength + 1))).toBe(types_1.PasswordPolicyViolation.tooLong);
22
+ });
23
+ it('accepts exactly the ceiling', () => {
24
+ expect((0, password_policy_constants_1.validateAccountPassword)('a'.repeat(password_policy_constants_1.PASSWORD_POLICY.maxLength))).toBeNull();
25
+ });
26
+ it('rejects a long-but-common password', () => {
27
+ expect((0, password_policy_constants_1.validateAccountPassword)('motdepasse123')).toBe(types_1.PasswordPolicyViolation.tooCommon);
28
+ });
29
+ it('imposes no composition rule — a plain long passphrase passes', () => {
30
+ expect((0, password_policy_constants_1.validateAccountPassword)('correcte agrafe batterie cheval')).toBeNull();
31
+ });
32
+ it('treats an empty password as too short, never as valid', () => {
33
+ expect((0, password_policy_constants_1.validateAccountPassword)('')).toBe(types_1.PasswordPolicyViolation.tooShort);
34
+ });
35
+ });
36
+ describe('isCommonPassword', () => {
37
+ it('matches regardless of case and surrounding whitespace', () => {
38
+ expect((0, password_policy_constants_1.isCommonPassword)(' MotDePasse123 ')).toBe(true);
39
+ });
40
+ it('does not match a passphrase that merely contains a common word', () => {
41
+ expect((0, password_policy_constants_1.isCommonPassword)('mon azerty préféré est bleu')).toBe(false);
42
+ });
43
+ });
44
+ describe('getPasswordStrength', () => {
45
+ it('scores a short password as very weak', () => {
46
+ expect((0, password_policy_constants_1.getPasswordStrength)('abc')).toBe(types_1.PasswordStrength.veryWeak);
47
+ });
48
+ it('scores a common password as very weak whatever its length', () => {
49
+ expect((0, password_policy_constants_1.getPasswordStrength)('motdepasse123')).toBe(types_1.PasswordStrength.veryWeak);
50
+ });
51
+ it('scores a long varied passphrase as excellent', () => {
52
+ expect((0, password_policy_constants_1.getPasswordStrength)('Yacht-Brumeux-42-Septembre')).toBe(types_1.PasswordStrength.excellent);
53
+ });
54
+ it('rewards length over composition', () => {
55
+ const longPlain = (0, password_policy_constants_1.getPasswordStrength)('agrafeuse bleue du lundi matin');
56
+ const shortComplex = (0, password_policy_constants_1.getPasswordStrength)('A1!bC2@d');
57
+ expect(longPlain).toBeGreaterThan(shortComplex);
58
+ });
59
+ it('never returns a value outside the enum range', () => {
60
+ for (const candidate of ['', 'a', 'a'.repeat(200), 'Xy9!'.repeat(30)]) {
61
+ const score = (0, password_policy_constants_1.getPasswordStrength)(candidate);
62
+ expect(score).toBeGreaterThanOrEqual(types_1.PasswordStrength.veryWeak);
63
+ expect(score).toBeLessThanOrEqual(types_1.PasswordStrength.excellent);
64
+ }
65
+ });
66
+ });
67
+ //# sourceMappingURL=password-policy.constants.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-policy.constants.spec.js","sourceRoot":"","sources":["../../../src/constants/tests/password-policy.constants.spec.ts"],"names":[],"mappings":";;AAAA,uCAAwE;AACxE,4EAKsC;AAEtC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,2CAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,2CAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE3C,MAAM,CAAC,2CAAe,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,2CAAe,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,2CAAe,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,IAAA,mDAAuB,EAAC,GAAG,CAAC,MAAM,CAAC,2CAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,IAAA,mDAAuB,EAAC,GAAG,CAAC,MAAM,CAAC,2CAAe,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7E,+BAAuB,CAAC,QAAQ,CACjC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,IAAA,mDAAuB,EAAC,GAAG,CAAC,MAAM,CAAC,2CAAe,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7E,+BAAuB,CAAC,OAAO,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,IAAA,mDAAuB,EAAC,GAAG,CAAC,MAAM,CAAC,2CAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,IAAA,mDAAuB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,+BAAuB,CAAC,SAAS,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,IAAA,mDAAuB,EAAC,iCAAiC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,IAAA,mDAAuB,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,+BAAuB,CAAC,QAAQ,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,IAAA,4CAAgB,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,IAAA,4CAAgB,EAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,IAAA,+CAAmB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAgB,CAAC,QAAQ,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,IAAA,+CAAmB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,IAAA,+CAAmB,EAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAgB,CAAC,SAAS,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,SAAS,GAAG,IAAA,+CAAmB,EAAC,gCAAgC,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAA,+CAAmB,EAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,KAAK,GAAG,IAAA,+CAAmB,EAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,wBAAgB,CAAC,QAAQ,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,wBAAgB,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -542,11 +542,13 @@ type AbyssCoreSDK = {
542
542
  get: typeof billingAccountAdminApi.getAdminBillingAccount;
543
543
  getQuotaState: typeof billingAccountAdminApi.getAdminBillingQuotaState;
544
544
  listModules: typeof billingAccountAdminApi.listAdminBillingModules;
545
+ listSnapshots: typeof billingAccountAdminApi.listAdminBillingSnapshots;
545
546
  setModuleQuantity: typeof billingAccountAdminApi.setAdminBillingModuleQuantity;
546
547
  editCustomPlan: typeof billingAccountAdminApi.editAdminBillingCustomPlan;
547
548
  update: typeof billingAccountAdminApi.updateAdminBillingAccount;
548
549
  setQuotaCeiling: typeof billingAccountAdminApi.setAdminBillingQuotaCeiling;
549
550
  setOverageRate: typeof billingAccountAdminApi.setAdminBillingOverageRate;
551
+ setAlertThresholds: typeof billingAccountAdminApi.setAdminBillingAlertThresholds;
550
552
  overrideQuota: typeof billingAccountAdminApi.overrideAdminBillingQuota;
551
553
  removeQuotaOverride: typeof billingAccountAdminApi.removeAdminBillingQuotaOverride;
552
554
  adjustCredit: typeof billingAccountAdminApi.adjustAdminBillingCredit;
package/dist/index.js CHANGED
@@ -584,11 +584,13 @@ class AbyssCore {
584
584
  get: billingAccountAdminApi.getAdminBillingAccount,
585
585
  getQuotaState: billingAccountAdminApi.getAdminBillingQuotaState,
586
586
  listModules: billingAccountAdminApi.listAdminBillingModules,
587
+ listSnapshots: billingAccountAdminApi.listAdminBillingSnapshots,
587
588
  setModuleQuantity: billingAccountAdminApi.setAdminBillingModuleQuantity,
588
589
  editCustomPlan: billingAccountAdminApi.editAdminBillingCustomPlan,
589
590
  update: billingAccountAdminApi.updateAdminBillingAccount,
590
591
  setQuotaCeiling: billingAccountAdminApi.setAdminBillingQuotaCeiling,
591
592
  setOverageRate: billingAccountAdminApi.setAdminBillingOverageRate,
593
+ setAlertThresholds: billingAccountAdminApi.setAdminBillingAlertThresholds,
592
594
  overrideQuota: billingAccountAdminApi.overrideAdminBillingQuota,
593
595
  removeQuotaOverride: billingAccountAdminApi.removeAdminBillingQuotaOverride,
594
596
  adjustCredit: billingAccountAdminApi.adjustAdminBillingCredit,