spotcharge-types 1.0.437 → 1.0.438

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.
@@ -1,2 +1,3 @@
1
1
  export { CONSUMER_STATION_ACCESS_TYPES, FLEET_STATION_ACCESS_TYPES, mapCapabilitiesAccessToAccessType, stationHasConsumerAccess, stationHasFleetAccess, } from './station-access.util';
2
+ export { MAX_PARTNER_SHARE_PERCENT, PARTNER_SHARE_CAP_ERROR, PARTNER_SHARE_TARIFF_REQUIRED_ERROR, PLATFORM_MIN_SHARE_PERCENT, PartnershipShareInput, maxPartnerShareSumMinor, partnerShareSumMinorForRate, partnerShareSumMinorPercentOnly, platformKeepsPercentAtRate, remainingPartnerSharePercent, toShareMinorUnits, validatePartnerShareTotals, } from './station-partnership-share.util';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,mCAAmC,EACnC,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,EAC5B,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,kCAAkC,CAAC"}
@@ -1,10 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stationHasFleetAccess = exports.stationHasConsumerAccess = exports.mapCapabilitiesAccessToAccessType = exports.FLEET_STATION_ACCESS_TYPES = exports.CONSUMER_STATION_ACCESS_TYPES = void 0;
3
+ exports.validatePartnerShareTotals = exports.toShareMinorUnits = exports.remainingPartnerSharePercent = exports.platformKeepsPercentAtRate = exports.partnerShareSumMinorPercentOnly = exports.partnerShareSumMinorForRate = exports.maxPartnerShareSumMinor = exports.PLATFORM_MIN_SHARE_PERCENT = exports.PARTNER_SHARE_TARIFF_REQUIRED_ERROR = exports.PARTNER_SHARE_CAP_ERROR = exports.MAX_PARTNER_SHARE_PERCENT = exports.stationHasFleetAccess = exports.stationHasConsumerAccess = exports.mapCapabilitiesAccessToAccessType = exports.FLEET_STATION_ACCESS_TYPES = exports.CONSUMER_STATION_ACCESS_TYPES = void 0;
4
4
  var station_access_util_1 = require("./station-access.util");
5
5
  Object.defineProperty(exports, "CONSUMER_STATION_ACCESS_TYPES", { enumerable: true, get: function () { return station_access_util_1.CONSUMER_STATION_ACCESS_TYPES; } });
6
6
  Object.defineProperty(exports, "FLEET_STATION_ACCESS_TYPES", { enumerable: true, get: function () { return station_access_util_1.FLEET_STATION_ACCESS_TYPES; } });
7
7
  Object.defineProperty(exports, "mapCapabilitiesAccessToAccessType", { enumerable: true, get: function () { return station_access_util_1.mapCapabilitiesAccessToAccessType; } });
8
8
  Object.defineProperty(exports, "stationHasConsumerAccess", { enumerable: true, get: function () { return station_access_util_1.stationHasConsumerAccess; } });
9
9
  Object.defineProperty(exports, "stationHasFleetAccess", { enumerable: true, get: function () { return station_access_util_1.stationHasFleetAccess; } });
10
+ var station_partnership_share_util_1 = require("./station-partnership-share.util");
11
+ Object.defineProperty(exports, "MAX_PARTNER_SHARE_PERCENT", { enumerable: true, get: function () { return station_partnership_share_util_1.MAX_PARTNER_SHARE_PERCENT; } });
12
+ Object.defineProperty(exports, "PARTNER_SHARE_CAP_ERROR", { enumerable: true, get: function () { return station_partnership_share_util_1.PARTNER_SHARE_CAP_ERROR; } });
13
+ Object.defineProperty(exports, "PARTNER_SHARE_TARIFF_REQUIRED_ERROR", { enumerable: true, get: function () { return station_partnership_share_util_1.PARTNER_SHARE_TARIFF_REQUIRED_ERROR; } });
14
+ Object.defineProperty(exports, "PLATFORM_MIN_SHARE_PERCENT", { enumerable: true, get: function () { return station_partnership_share_util_1.PLATFORM_MIN_SHARE_PERCENT; } });
15
+ Object.defineProperty(exports, "maxPartnerShareSumMinor", { enumerable: true, get: function () { return station_partnership_share_util_1.maxPartnerShareSumMinor; } });
16
+ Object.defineProperty(exports, "partnerShareSumMinorForRate", { enumerable: true, get: function () { return station_partnership_share_util_1.partnerShareSumMinorForRate; } });
17
+ Object.defineProperty(exports, "partnerShareSumMinorPercentOnly", { enumerable: true, get: function () { return station_partnership_share_util_1.partnerShareSumMinorPercentOnly; } });
18
+ Object.defineProperty(exports, "platformKeepsPercentAtRate", { enumerable: true, get: function () { return station_partnership_share_util_1.platformKeepsPercentAtRate; } });
19
+ Object.defineProperty(exports, "remainingPartnerSharePercent", { enumerable: true, get: function () { return station_partnership_share_util_1.remainingPartnerSharePercent; } });
20
+ Object.defineProperty(exports, "toShareMinorUnits", { enumerable: true, get: function () { return station_partnership_share_util_1.toShareMinorUnits; } });
21
+ Object.defineProperty(exports, "validatePartnerShareTotals", { enumerable: true, get: function () { return station_partnership_share_util_1.validatePartnerShareTotals; } });
10
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,6DAM+B;AAL7B,oIAAA,6BAA6B,OAAA;AAC7B,iIAAA,0BAA0B,OAAA;AAC1B,wIAAA,iCAAiC,OAAA;AACjC,+HAAA,wBAAwB,OAAA;AACxB,4HAAA,qBAAqB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,6DAM+B;AAL7B,oIAAA,6BAA6B,OAAA;AAC7B,iIAAA,0BAA0B,OAAA;AAC1B,wIAAA,iCAAiC,OAAA;AACjC,+HAAA,wBAAwB,OAAA;AACxB,4HAAA,qBAAqB,OAAA;AAEvB,mFAa0C;AAZxC,2IAAA,yBAAyB,OAAA;AACzB,yIAAA,uBAAuB,OAAA;AACvB,qJAAA,mCAAmC,OAAA;AACnC,4IAAA,0BAA0B,OAAA;AAE1B,yIAAA,uBAAuB,OAAA;AACvB,6IAAA,2BAA2B,OAAA;AAC3B,iJAAA,+BAA+B,OAAA;AAC/B,4IAAA,0BAA0B,OAAA;AAC1B,8IAAA,4BAA4B,OAAA;AAC5B,mIAAA,iBAAiB,OAAA;AACjB,4IAAA,0BAA0B,OAAA"}
@@ -0,0 +1,22 @@
1
+ import { StationPartnershipShareType } from '../consts/station-partnership-share-type.const';
2
+ export declare const PLATFORM_MIN_SHARE_PERCENT = 10;
3
+ export declare const MAX_PARTNER_SHARE_PERCENT = 90;
4
+ export interface PartnershipShareInput {
5
+ shareType: StationPartnershipShareType;
6
+ percent: string | null;
7
+ amountPerKwh: string | null;
8
+ }
9
+ export declare const PARTNER_SHARE_CAP_ERROR = "Partner shares cannot exceed 90% of the kWh price. SpotCharge keeps at least 10%.";
10
+ export declare const PARTNER_SHARE_TARIFF_REQUIRED_ERROR = "Set a tariff on this charger size before using rupee partnership shares.";
11
+ export declare function toShareMinorUnits(value: string): number | null;
12
+ /** Partner share total in minor units (10000 = 100%) for one energy rate. */
13
+ export declare function partnerShareSumMinorForRate(partners: PartnershipShareInput[], energyRate: number): number | null;
14
+ /** Partner share total when every row is a typed percent (no tariff needed). */
15
+ export declare function partnerShareSumMinorPercentOnly(partners: PartnershipShareInput[]): number | null;
16
+ export declare function validatePartnerShareTotals(partners: PartnershipShareInput[], energyRates: number[]): string | null;
17
+ /** SpotCharge remainder as a percent of the kWh price (0–100), for display. */
18
+ export declare function platformKeepsPercentAtRate(partners: PartnershipShareInput[], energyRate: number | null): number | null;
19
+ /** Highest partner total across applicable tariff rates (minor units). */
20
+ export declare function maxPartnerShareSumMinor(partners: PartnershipShareInput[], energyRates: number[]): number | null;
21
+ export declare function remainingPartnerSharePercent(partners: PartnershipShareInput[], energyRates: number[]): number | null;
22
+ //# sourceMappingURL=station-partnership-share.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"station-partnership-share.util.d.ts","sourceRoot":"","sources":["../../src/utils/station-partnership-share.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,gDAAgD,CAAC;AAE7F,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAK5C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,2BAA2B,CAAC;IACvC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,uBAAuB,sFACiD,CAAC;AAEtF,eAAO,MAAM,mCAAmC,6EAC4B,CAAC;AAE7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO9D;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAmBf;AAED,gFAAgF;AAChF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,MAAM,GAAG,IAAI,CAahG;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,GAAG,IAAI,CA6Bf;AAED,+EAA+E;AAC/E,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,GAAG,IAAI,CASf;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,GAAG,IAAI,CAoBf;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,qBAAqB,EAAE,EACjC,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,GAAG,IAAI,CAMf"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remainingPartnerSharePercent = exports.maxPartnerShareSumMinor = exports.platformKeepsPercentAtRate = exports.validatePartnerShareTotals = exports.partnerShareSumMinorPercentOnly = exports.partnerShareSumMinorForRate = exports.toShareMinorUnits = exports.PARTNER_SHARE_TARIFF_REQUIRED_ERROR = exports.PARTNER_SHARE_CAP_ERROR = exports.MAX_PARTNER_SHARE_PERCENT = exports.PLATFORM_MIN_SHARE_PERCENT = void 0;
4
+ var station_partnership_share_type_const_1 = require("../consts/station-partnership-share-type.const");
5
+ exports.PLATFORM_MIN_SHARE_PERCENT = 10;
6
+ exports.MAX_PARTNER_SHARE_PERCENT = 90;
7
+ var FULL_SHARE_MINOR = 10000;
8
+ var MAX_PARTNER_SHARE_MINOR = exports.MAX_PARTNER_SHARE_PERCENT * 100;
9
+ exports.PARTNER_SHARE_CAP_ERROR = 'Partner shares cannot exceed 90% of the kWh price. SpotCharge keeps at least 10%.';
10
+ exports.PARTNER_SHARE_TARIFF_REQUIRED_ERROR = 'Set a tariff on this charger size before using rupee partnership shares.';
11
+ function toShareMinorUnits(value) {
12
+ var _a;
13
+ var match = /^(\d{1,8})(?:\.(\d{1,2}))?$/.exec(String(value !== null && value !== void 0 ? value : '').trim());
14
+ if (!match) {
15
+ return null;
16
+ }
17
+ var fraction = (_a = match[2]) !== null && _a !== void 0 ? _a : '';
18
+ return Number(match[1]) * 100 + Number((fraction + '00').slice(0, 2));
19
+ }
20
+ exports.toShareMinorUnits = toShareMinorUnits;
21
+ /** Partner share total in minor units (10000 = 100%) for one energy rate. */
22
+ function partnerShareSumMinorForRate(partners, energyRate) {
23
+ var _a, _b;
24
+ var sum = 0;
25
+ for (var _i = 0, partners_1 = partners; _i < partners_1.length; _i++) {
26
+ var row = partners_1[_i];
27
+ if (row.shareType === station_partnership_share_type_const_1.StationPartnershipShareType.PerKwh) {
28
+ var amountMinor = toShareMinorUnits((_a = row.amountPerKwh) !== null && _a !== void 0 ? _a : '');
29
+ if (amountMinor === null || amountMinor <= 0 || energyRate <= 0) {
30
+ return null;
31
+ }
32
+ var amount = amountMinor / 100;
33
+ sum += Math.round((amount / energyRate) * FULL_SHARE_MINOR);
34
+ continue;
35
+ }
36
+ var minor = toShareMinorUnits((_b = row.percent) !== null && _b !== void 0 ? _b : '');
37
+ if (minor === null || minor <= 0) {
38
+ return null;
39
+ }
40
+ sum += minor;
41
+ }
42
+ return sum;
43
+ }
44
+ exports.partnerShareSumMinorForRate = partnerShareSumMinorForRate;
45
+ /** Partner share total when every row is a typed percent (no tariff needed). */
46
+ function partnerShareSumMinorPercentOnly(partners) {
47
+ var _a;
48
+ var sum = 0;
49
+ for (var _i = 0, partners_2 = partners; _i < partners_2.length; _i++) {
50
+ var row = partners_2[_i];
51
+ if (row.shareType === station_partnership_share_type_const_1.StationPartnershipShareType.PerKwh) {
52
+ return null;
53
+ }
54
+ var minor = toShareMinorUnits((_a = row.percent) !== null && _a !== void 0 ? _a : '');
55
+ if (minor === null || minor <= 0) {
56
+ return null;
57
+ }
58
+ sum += minor;
59
+ }
60
+ return sum;
61
+ }
62
+ exports.partnerShareSumMinorPercentOnly = partnerShareSumMinorPercentOnly;
63
+ function validatePartnerShareTotals(partners, energyRates) {
64
+ var usableRates = Array.from(new Set(energyRates.filter(function (rate) { return rate > 0; })));
65
+ var hasRupee = partners.some(function (row) { return row.shareType === station_partnership_share_type_const_1.StationPartnershipShareType.PerKwh; });
66
+ if (hasRupee && usableRates.length === 0) {
67
+ return exports.PARTNER_SHARE_TARIFF_REQUIRED_ERROR;
68
+ }
69
+ if (hasRupee) {
70
+ for (var _i = 0, usableRates_1 = usableRates; _i < usableRates_1.length; _i++) {
71
+ var rate = usableRates_1[_i];
72
+ var sum_1 = partnerShareSumMinorForRate(partners, rate);
73
+ if (sum_1 === null) {
74
+ return exports.PARTNER_SHARE_TARIFF_REQUIRED_ERROR;
75
+ }
76
+ if (sum_1 > MAX_PARTNER_SHARE_MINOR) {
77
+ return exports.PARTNER_SHARE_CAP_ERROR;
78
+ }
79
+ }
80
+ return null;
81
+ }
82
+ var sum = partnerShareSumMinorPercentOnly(partners);
83
+ if (sum === null) {
84
+ return null;
85
+ }
86
+ if (sum > MAX_PARTNER_SHARE_MINOR) {
87
+ return exports.PARTNER_SHARE_CAP_ERROR;
88
+ }
89
+ return null;
90
+ }
91
+ exports.validatePartnerShareTotals = validatePartnerShareTotals;
92
+ /** SpotCharge remainder as a percent of the kWh price (0–100), for display. */
93
+ function platformKeepsPercentAtRate(partners, energyRate) {
94
+ var sum = energyRate != null && energyRate > 0
95
+ ? partnerShareSumMinorForRate(partners, energyRate)
96
+ : partnerShareSumMinorPercentOnly(partners);
97
+ if (sum === null) {
98
+ return null;
99
+ }
100
+ return Math.max(0, (FULL_SHARE_MINOR - sum) / 100);
101
+ }
102
+ exports.platformKeepsPercentAtRate = platformKeepsPercentAtRate;
103
+ /** Highest partner total across applicable tariff rates (minor units). */
104
+ function maxPartnerShareSumMinor(partners, energyRates) {
105
+ var usableRates = energyRates.filter(function (rate) { return rate > 0; });
106
+ var hasRupee = partners.some(function (row) { return row.shareType === station_partnership_share_type_const_1.StationPartnershipShareType.PerKwh; });
107
+ if (hasRupee) {
108
+ if (usableRates.length === 0) {
109
+ return null;
110
+ }
111
+ var max = 0;
112
+ for (var _i = 0, usableRates_2 = usableRates; _i < usableRates_2.length; _i++) {
113
+ var rate = usableRates_2[_i];
114
+ var sum = partnerShareSumMinorForRate(partners, rate);
115
+ if (sum === null) {
116
+ return null;
117
+ }
118
+ max = Math.max(max, sum);
119
+ }
120
+ return max;
121
+ }
122
+ return partnerShareSumMinorPercentOnly(partners);
123
+ }
124
+ exports.maxPartnerShareSumMinor = maxPartnerShareSumMinor;
125
+ function remainingPartnerSharePercent(partners, energyRates) {
126
+ var sumMinor = maxPartnerShareSumMinor(partners, energyRates);
127
+ if (sumMinor === null) {
128
+ return null;
129
+ }
130
+ return Math.max(0, (MAX_PARTNER_SHARE_MINOR - sumMinor) / 100);
131
+ }
132
+ exports.remainingPartnerSharePercent = remainingPartnerSharePercent;
133
+ //# sourceMappingURL=station-partnership-share.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"station-partnership-share.util.js","sourceRoot":"","sources":["../../src/utils/station-partnership-share.util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spotcharge-types",
3
- "version": "1.0.437",
3
+ "version": "1.0.438",
4
4
  "description": "Spotcharge types",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -5,3 +5,17 @@ export {
5
5
  stationHasConsumerAccess,
6
6
  stationHasFleetAccess,
7
7
  } from './station-access.util';
8
+ export {
9
+ MAX_PARTNER_SHARE_PERCENT,
10
+ PARTNER_SHARE_CAP_ERROR,
11
+ PARTNER_SHARE_TARIFF_REQUIRED_ERROR,
12
+ PLATFORM_MIN_SHARE_PERCENT,
13
+ PartnershipShareInput,
14
+ maxPartnerShareSumMinor,
15
+ partnerShareSumMinorForRate,
16
+ partnerShareSumMinorPercentOnly,
17
+ platformKeepsPercentAtRate,
18
+ remainingPartnerSharePercent,
19
+ toShareMinorUnits,
20
+ validatePartnerShareTotals,
21
+ } from './station-partnership-share.util';
@@ -0,0 +1,155 @@
1
+ import { StationPartnershipShareType } from '../consts/station-partnership-share-type.const';
2
+
3
+ export const PLATFORM_MIN_SHARE_PERCENT = 10;
4
+ export const MAX_PARTNER_SHARE_PERCENT = 90;
5
+
6
+ const FULL_SHARE_MINOR = 10000;
7
+ const MAX_PARTNER_SHARE_MINOR = MAX_PARTNER_SHARE_PERCENT * 100;
8
+
9
+ export interface PartnershipShareInput {
10
+ shareType: StationPartnershipShareType;
11
+ percent: string | null;
12
+ amountPerKwh: string | null;
13
+ }
14
+
15
+ export const PARTNER_SHARE_CAP_ERROR =
16
+ 'Partner shares cannot exceed 90% of the kWh price. SpotCharge keeps at least 10%.';
17
+
18
+ export const PARTNER_SHARE_TARIFF_REQUIRED_ERROR =
19
+ 'Set a tariff on this charger size before using rupee partnership shares.';
20
+
21
+ export function toShareMinorUnits(value: string): number | null {
22
+ const match = /^(\d{1,8})(?:\.(\d{1,2}))?$/.exec(String(value ?? '').trim());
23
+ if (!match) {
24
+ return null;
25
+ }
26
+ const fraction = match[2] ?? '';
27
+ return Number(match[1]) * 100 + Number((fraction + '00').slice(0, 2));
28
+ }
29
+
30
+ /** Partner share total in minor units (10000 = 100%) for one energy rate. */
31
+ export function partnerShareSumMinorForRate(
32
+ partners: PartnershipShareInput[],
33
+ energyRate: number,
34
+ ): number | null {
35
+ let sum = 0;
36
+ for (const row of partners) {
37
+ if (row.shareType === StationPartnershipShareType.PerKwh) {
38
+ const amountMinor = toShareMinorUnits(row.amountPerKwh ?? '');
39
+ if (amountMinor === null || amountMinor <= 0 || energyRate <= 0) {
40
+ return null;
41
+ }
42
+ const amount = amountMinor / 100;
43
+ sum += Math.round((amount / energyRate) * FULL_SHARE_MINOR);
44
+ continue;
45
+ }
46
+ const minor = toShareMinorUnits(row.percent ?? '');
47
+ if (minor === null || minor <= 0) {
48
+ return null;
49
+ }
50
+ sum += minor;
51
+ }
52
+ return sum;
53
+ }
54
+
55
+ /** Partner share total when every row is a typed percent (no tariff needed). */
56
+ export function partnerShareSumMinorPercentOnly(partners: PartnershipShareInput[]): number | null {
57
+ let sum = 0;
58
+ for (const row of partners) {
59
+ if (row.shareType === StationPartnershipShareType.PerKwh) {
60
+ return null;
61
+ }
62
+ const minor = toShareMinorUnits(row.percent ?? '');
63
+ if (minor === null || minor <= 0) {
64
+ return null;
65
+ }
66
+ sum += minor;
67
+ }
68
+ return sum;
69
+ }
70
+
71
+ export function validatePartnerShareTotals(
72
+ partners: PartnershipShareInput[],
73
+ energyRates: number[],
74
+ ): string | null {
75
+ const usableRates = Array.from(new Set(energyRates.filter((rate) => rate > 0)));
76
+ const hasRupee = partners.some((row) => row.shareType === StationPartnershipShareType.PerKwh);
77
+
78
+ if (hasRupee && usableRates.length === 0) {
79
+ return PARTNER_SHARE_TARIFF_REQUIRED_ERROR;
80
+ }
81
+
82
+ if (hasRupee) {
83
+ for (const rate of usableRates) {
84
+ const sum = partnerShareSumMinorForRate(partners, rate);
85
+ if (sum === null) {
86
+ return PARTNER_SHARE_TARIFF_REQUIRED_ERROR;
87
+ }
88
+ if (sum > MAX_PARTNER_SHARE_MINOR) {
89
+ return PARTNER_SHARE_CAP_ERROR;
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+
95
+ const sum = partnerShareSumMinorPercentOnly(partners);
96
+ if (sum === null) {
97
+ return null;
98
+ }
99
+ if (sum > MAX_PARTNER_SHARE_MINOR) {
100
+ return PARTNER_SHARE_CAP_ERROR;
101
+ }
102
+ return null;
103
+ }
104
+
105
+ /** SpotCharge remainder as a percent of the kWh price (0–100), for display. */
106
+ export function platformKeepsPercentAtRate(
107
+ partners: PartnershipShareInput[],
108
+ energyRate: number | null,
109
+ ): number | null {
110
+ const sum =
111
+ energyRate != null && energyRate > 0
112
+ ? partnerShareSumMinorForRate(partners, energyRate)
113
+ : partnerShareSumMinorPercentOnly(partners);
114
+ if (sum === null) {
115
+ return null;
116
+ }
117
+ return Math.max(0, (FULL_SHARE_MINOR - sum) / 100);
118
+ }
119
+
120
+ /** Highest partner total across applicable tariff rates (minor units). */
121
+ export function maxPartnerShareSumMinor(
122
+ partners: PartnershipShareInput[],
123
+ energyRates: number[],
124
+ ): number | null {
125
+ const usableRates = energyRates.filter((rate) => rate > 0);
126
+ const hasRupee = partners.some((row) => row.shareType === StationPartnershipShareType.PerKwh);
127
+
128
+ if (hasRupee) {
129
+ if (usableRates.length === 0) {
130
+ return null;
131
+ }
132
+ let max = 0;
133
+ for (const rate of usableRates) {
134
+ const sum = partnerShareSumMinorForRate(partners, rate);
135
+ if (sum === null) {
136
+ return null;
137
+ }
138
+ max = Math.max(max, sum);
139
+ }
140
+ return max;
141
+ }
142
+
143
+ return partnerShareSumMinorPercentOnly(partners);
144
+ }
145
+
146
+ export function remainingPartnerSharePercent(
147
+ partners: PartnershipShareInput[],
148
+ energyRates: number[],
149
+ ): number | null {
150
+ const sumMinor = maxPartnerShareSumMinor(partners, energyRates);
151
+ if (sumMinor === null) {
152
+ return null;
153
+ }
154
+ return Math.max(0, (MAX_PARTNER_SHARE_MINOR - sumMinor) / 100);
155
+ }