@spottoai/types-package 1.0.2-beta.401 → 1.0.2-beta.403
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/dist/azure/billingPlots.d.ts +7 -1
- package/dist/azure/billingPlots.d.ts.map +1 -1
- package/dist/azure/billingPlots.js +45 -4
- package/dist/azure/billingPlots.js.map +1 -1
- package/dist/azure/financialChargePolicy.d.ts +149 -0
- package/dist/azure/financialChargePolicy.d.ts.map +1 -0
- package/dist/azure/financialChargePolicy.js +349 -0
- package/dist/azure/financialChargePolicy.js.map +1 -0
- package/dist/azure/prices.d.ts +13 -0
- package/dist/azure/prices.d.ts.map +1 -1
- package/dist/azure/recommendations.d.ts +4 -0
- package/dist/azure/recommendations.d.ts.map +1 -1
- package/dist/azure/reports.d.ts +18 -0
- package/dist/azure/reports.d.ts.map +1 -1
- package/dist/azure/reports.js.map +1 -1
- package/dist/azure/views.d.ts +9 -0
- package/dist/azure/views.d.ts.map +1 -1
- package/dist/azure/views.js.map +1 -1
- package/dist/company/company.d.ts +1 -0
- package/dist/company/company.d.ts.map +1 -1
- package/dist/esm/azure/billingPlots.js +45 -4
- package/dist/esm/azure/financialChargePolicy.js +338 -0
- package/dist/esm/index.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
export const AZURE_CLOUD_SERVICES_EXCLUDING_MARKETPLACE_POLICY_REF_V1 = 'azure-cloud-services-excluding-marketplace/v1';
|
|
2
|
+
const UNKNOWN_REASON_CODES = new Set(['publisher-type-missing', 'publisher-type-unsupported', 'publisher-type-unrecognized']);
|
|
3
|
+
const CHARGEABLE_UNAVAILABLE_REASON_CODES = new Set([
|
|
4
|
+
'partial-source-coverage',
|
|
5
|
+
'policy-mismatch',
|
|
6
|
+
'generation-mismatch',
|
|
7
|
+
'coordinate-mismatch',
|
|
8
|
+
'mixed-currency',
|
|
9
|
+
'source-unavailable',
|
|
10
|
+
'reconciliation-failed',
|
|
11
|
+
]);
|
|
12
|
+
const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/u;
|
|
13
|
+
const ISO_CURRENCY_PATTERN = /^[A-Z]{3}$/u;
|
|
14
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
15
|
+
const hasExactFields = (value, required, optional = []) => {
|
|
16
|
+
const allowed = new Set([...required, ...optional]);
|
|
17
|
+
return required.every(field => Object.prototype.hasOwnProperty.call(value, field)) && Object.keys(value).every(field => allowed.has(field));
|
|
18
|
+
};
|
|
19
|
+
const isNonEmptyTrimmedString = (value) => typeof value === 'string' && value.length > 0 && value === value.trim();
|
|
20
|
+
const isSafeInteger = (value) => typeof value === 'number' && Number.isSafeInteger(value);
|
|
21
|
+
const isNonNegativeSafeInteger = (value) => isSafeInteger(value) && value >= 0;
|
|
22
|
+
const isIsoDate = (value) => typeof value === 'string' && ISO_DATE_PATTERN.test(value) && !Number.isNaN(Date.parse(`${value}T00:00:00.000Z`));
|
|
23
|
+
const areStringArraysEqual = (left, right) => left.length === right.length && left.every((value, index) => value === right[index]);
|
|
24
|
+
const isSortedUniqueStringArray = (value, allowedValues) => {
|
|
25
|
+
if (!Array.isArray(value) || value.length === 0 || !value.every(item => typeof item === 'string' && allowedValues.has(item)))
|
|
26
|
+
return false;
|
|
27
|
+
const canonical = [...new Set(value)].sort();
|
|
28
|
+
return areStringArraysEqual(value, canonical);
|
|
29
|
+
};
|
|
30
|
+
/** Exact validator for publisher evidence retained from an Azure billing source. */
|
|
31
|
+
export const isAzurePublisherTypeEvidenceV1 = (value) => {
|
|
32
|
+
if (!isRecord(value) || (value.status !== 'available' && value.status !== 'unavailable'))
|
|
33
|
+
return false;
|
|
34
|
+
if (value.status === 'available') {
|
|
35
|
+
return (hasExactFields(value, ['status', 'publisherType'], ['publisherName']) &&
|
|
36
|
+
isNonEmptyTrimmedString(value.publisherType) &&
|
|
37
|
+
(value.publisherName === undefined || isNonEmptyTrimmedString(value.publisherName)));
|
|
38
|
+
}
|
|
39
|
+
return (hasExactFields(value, ['status', 'reasonCode']) &&
|
|
40
|
+
(value.reasonCode === 'publisher-type-missing' || value.reasonCode === 'publisher-type-unsupported'));
|
|
41
|
+
};
|
|
42
|
+
/** Exact validator for the authoritative classification of one billing component. */
|
|
43
|
+
export const isAzureFinancialChargeClassificationV1 = (value) => {
|
|
44
|
+
if (!isRecord(value) || (value.source !== 'azure-native' && value.source !== 'marketplace' && value.source !== 'unknown'))
|
|
45
|
+
return false;
|
|
46
|
+
const publisherNameIsValid = value.publisherName === undefined || isNonEmptyTrimmedString(value.publisherName);
|
|
47
|
+
if (!publisherNameIsValid)
|
|
48
|
+
return false;
|
|
49
|
+
if (value.source === 'azure-native' || value.source === 'marketplace') {
|
|
50
|
+
if (!hasExactFields(value, ['source', 'publisherType'], ['publisherName']) || !isNonEmptyTrimmedString(value.publisherType)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const publisherType = value.publisherType.toLowerCase();
|
|
54
|
+
return value.source === 'marketplace' ? publisherType === 'marketplace' : publisherType === 'azure' || publisherType === 'microsoft';
|
|
55
|
+
}
|
|
56
|
+
if (!hasExactFields(value, ['source', 'reasonCode'], ['publisherType', 'publisherName']) ||
|
|
57
|
+
typeof value.reasonCode !== 'string' ||
|
|
58
|
+
!UNKNOWN_REASON_CODES.has(value.reasonCode)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (value.reasonCode === 'publisher-type-unrecognized') {
|
|
62
|
+
if (!isNonEmptyTrimmedString(value.publisherType))
|
|
63
|
+
return false;
|
|
64
|
+
const publisherType = value.publisherType.toLowerCase();
|
|
65
|
+
return publisherType !== 'azure' && publisherType !== 'microsoft' && publisherType !== 'marketplace';
|
|
66
|
+
}
|
|
67
|
+
return value.publisherType === undefined;
|
|
68
|
+
};
|
|
69
|
+
export const isAzureFinancialCoordinateV1 = (value) => {
|
|
70
|
+
if (!isRecord(value) ||
|
|
71
|
+
!hasExactFields(value, ['generationId', 'providerName', 'providerScopeId', 'basis', 'period', 'currencyCode', 'minorUnitScale'])) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (!isNonEmptyTrimmedString(value.generationId) ||
|
|
75
|
+
value.providerName !== 'azure' ||
|
|
76
|
+
!isNonEmptyTrimmedString(value.providerScopeId) ||
|
|
77
|
+
(value.basis !== 'billed' && value.basis !== 'amortized') ||
|
|
78
|
+
typeof value.currencyCode !== 'string' ||
|
|
79
|
+
!ISO_CURRENCY_PATTERN.test(value.currencyCode) ||
|
|
80
|
+
!isNonNegativeSafeInteger(value.minorUnitScale) ||
|
|
81
|
+
value.minorUnitScale > 6 ||
|
|
82
|
+
!isRecord(value.period) ||
|
|
83
|
+
!hasExactFields(value.period, ['startDate', 'endDateExclusive']) ||
|
|
84
|
+
!isIsoDate(value.period.startDate) ||
|
|
85
|
+
!isIsoDate(value.period.endDateExclusive)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return value.period.startDate < value.period.endDateExclusive;
|
|
89
|
+
};
|
|
90
|
+
const isSourceTotals = (value) => {
|
|
91
|
+
if (!isRecord(value) ||
|
|
92
|
+
!hasExactFields(value, [
|
|
93
|
+
'allChargeMinorUnits',
|
|
94
|
+
'azureNativeMinorUnits',
|
|
95
|
+
'marketplaceMinorUnits',
|
|
96
|
+
'unknownMinorUnits',
|
|
97
|
+
'unknownAbsoluteMinorUnits',
|
|
98
|
+
'rowCount',
|
|
99
|
+
'azureNativeRowCount',
|
|
100
|
+
'marketplaceRowCount',
|
|
101
|
+
'unknownRowCount',
|
|
102
|
+
'unknownNonZeroRowCount',
|
|
103
|
+
])) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const signedValues = [value.allChargeMinorUnits, value.azureNativeMinorUnits, value.marketplaceMinorUnits, value.unknownMinorUnits];
|
|
107
|
+
const countValues = [
|
|
108
|
+
value.unknownAbsoluteMinorUnits,
|
|
109
|
+
value.rowCount,
|
|
110
|
+
value.azureNativeRowCount,
|
|
111
|
+
value.marketplaceRowCount,
|
|
112
|
+
value.unknownRowCount,
|
|
113
|
+
value.unknownNonZeroRowCount,
|
|
114
|
+
];
|
|
115
|
+
if (!signedValues.every(isSafeInteger) || !countValues.every(isNonNegativeSafeInteger))
|
|
116
|
+
return false;
|
|
117
|
+
const totals = value;
|
|
118
|
+
return (totals.unknownNonZeroRowCount <= totals.unknownRowCount &&
|
|
119
|
+
totals.rowCount === totals.azureNativeRowCount + totals.marketplaceRowCount + totals.unknownRowCount &&
|
|
120
|
+
totals.allChargeMinorUnits === totals.azureNativeMinorUnits + totals.marketplaceMinorUnits + totals.unknownMinorUnits);
|
|
121
|
+
};
|
|
122
|
+
const isUnknownObject = (value) => isRecord(value) &&
|
|
123
|
+
hasExactFields(value, [
|
|
124
|
+
'objectKey',
|
|
125
|
+
'name',
|
|
126
|
+
'resourceType',
|
|
127
|
+
'billableComponentKey',
|
|
128
|
+
'signedCostMinorUnits',
|
|
129
|
+
'absoluteCostMinorUnits',
|
|
130
|
+
'rowCount',
|
|
131
|
+
'nonZeroRowCount',
|
|
132
|
+
'reasonCodes',
|
|
133
|
+
], ['resourceId']) &&
|
|
134
|
+
isNonEmptyTrimmedString(value.objectKey) &&
|
|
135
|
+
isNonEmptyTrimmedString(value.name) &&
|
|
136
|
+
isNonEmptyTrimmedString(value.resourceType) &&
|
|
137
|
+
(value.resourceId === undefined || isNonEmptyTrimmedString(value.resourceId)) &&
|
|
138
|
+
isNonEmptyTrimmedString(value.billableComponentKey) &&
|
|
139
|
+
isSafeInteger(value.signedCostMinorUnits) &&
|
|
140
|
+
isNonNegativeSafeInteger(value.absoluteCostMinorUnits) &&
|
|
141
|
+
isNonNegativeSafeInteger(value.rowCount) &&
|
|
142
|
+
value.rowCount > 0 &&
|
|
143
|
+
isNonNegativeSafeInteger(value.nonZeroRowCount) &&
|
|
144
|
+
value.nonZeroRowCount > 0 &&
|
|
145
|
+
value.nonZeroRowCount <= value.rowCount &&
|
|
146
|
+
isSortedUniqueStringArray(value.reasonCodes, UNKNOWN_REASON_CODES);
|
|
147
|
+
const coordinatesEqual = (left, right) => left.generationId === right.generationId &&
|
|
148
|
+
left.providerName === right.providerName &&
|
|
149
|
+
left.providerScopeId === right.providerScopeId &&
|
|
150
|
+
left.basis === right.basis &&
|
|
151
|
+
left.period.startDate === right.period.startDate &&
|
|
152
|
+
left.period.endDateExclusive === right.period.endDateExclusive &&
|
|
153
|
+
left.currencyCode === right.currencyCode &&
|
|
154
|
+
left.minorUnitScale === right.minorUnitScale;
|
|
155
|
+
export const isAzureFinancialChargeCoverageV1 = (value) => {
|
|
156
|
+
if (!isRecord(value) ||
|
|
157
|
+
!hasExactFields(value, ['contractVersion', 'policyRef', 'coordinate', 'status', 'sourceTotals', 'unknownObjects']) ||
|
|
158
|
+
value.contractVersion !== 'financial-charge-policy/v1' ||
|
|
159
|
+
value.policyRef !== AZURE_CLOUD_SERVICES_EXCLUDING_MARKETPLACE_POLICY_REF_V1 ||
|
|
160
|
+
!isAzureFinancialCoordinateV1(value.coordinate) ||
|
|
161
|
+
(value.status !== 'complete' && value.status !== 'partial') ||
|
|
162
|
+
!isSourceTotals(value.sourceTotals) ||
|
|
163
|
+
!Array.isArray(value.unknownObjects) ||
|
|
164
|
+
!value.unknownObjects.every(isUnknownObject)) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
const objectKeys = value.unknownObjects.map(item => item.objectKey);
|
|
168
|
+
if (!areStringArraysEqual(objectKeys, [...new Set(objectKeys)].sort()))
|
|
169
|
+
return false;
|
|
170
|
+
const objectSignedTotal = value.unknownObjects.reduce((total, item) => total + item.signedCostMinorUnits, 0);
|
|
171
|
+
const objectAbsoluteTotal = value.unknownObjects.reduce((total, item) => total + item.absoluteCostMinorUnits, 0);
|
|
172
|
+
const objectNonZeroRows = value.unknownObjects.reduce((total, item) => total + item.nonZeroRowCount, 0);
|
|
173
|
+
if (!Number.isSafeInteger(objectSignedTotal) ||
|
|
174
|
+
!Number.isSafeInteger(objectAbsoluteTotal) ||
|
|
175
|
+
!Number.isSafeInteger(objectNonZeroRows) ||
|
|
176
|
+
objectSignedTotal !== value.sourceTotals.unknownMinorUnits ||
|
|
177
|
+
objectAbsoluteTotal !== value.sourceTotals.unknownAbsoluteMinorUnits ||
|
|
178
|
+
objectNonZeroRows !== value.sourceTotals.unknownNonZeroRowCount) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
const hasMaterialUnknown = value.sourceTotals.unknownNonZeroRowCount > 0;
|
|
182
|
+
if (value.status === 'complete') {
|
|
183
|
+
return !hasMaterialUnknown && value.sourceTotals.unknownAbsoluteMinorUnits === 0 && value.unknownObjects.length === 0;
|
|
184
|
+
}
|
|
185
|
+
return hasMaterialUnknown && value.unknownObjects.length > 0;
|
|
186
|
+
};
|
|
187
|
+
const isCanonicalSavingsAggregateV2 = (value, coordinate) => {
|
|
188
|
+
if (!isRecord(value) ||
|
|
189
|
+
!hasExactFields(value, ['contractVersion', 'generationId', 'scopeKey', 'scope', 'allocationCount', 'totals']) ||
|
|
190
|
+
value.contractVersion !== 'savings/v2' ||
|
|
191
|
+
value.generationId !== coordinate.generationId ||
|
|
192
|
+
!isNonEmptyTrimmedString(value.scopeKey) ||
|
|
193
|
+
!isNonNegativeSafeInteger(value.allocationCount) ||
|
|
194
|
+
!isRecord(value.scope) ||
|
|
195
|
+
!hasExactFields(value.scope, ['kind', 'providerName', 'providerScopeId', 'filterFingerprint']) ||
|
|
196
|
+
value.scope.kind !== 'subscription-full' ||
|
|
197
|
+
value.scope.providerName !== 'azure' ||
|
|
198
|
+
value.scope.providerScopeId !== coordinate.providerScopeId ||
|
|
199
|
+
!isNonEmptyTrimmedString(value.scope.filterFingerprint) ||
|
|
200
|
+
!isRecord(value.totals) ||
|
|
201
|
+
!hasExactFields(value.totals, ['currency', 'minorUnitScale', 'currentMonthlyMinorUnits', 'minSavingsMinorUnits', 'maxSavingsMinorUnits']) ||
|
|
202
|
+
value.totals.currency !== coordinate.currencyCode ||
|
|
203
|
+
value.totals.minorUnitScale !== coordinate.minorUnitScale ||
|
|
204
|
+
!isNonNegativeSafeInteger(value.totals.currentMonthlyMinorUnits) ||
|
|
205
|
+
!isNonNegativeSafeInteger(value.totals.minSavingsMinorUnits) ||
|
|
206
|
+
!isNonNegativeSafeInteger(value.totals.maxSavingsMinorUnits)) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
return value.totals.minSavingsMinorUnits <= value.totals.maxSavingsMinorUnits;
|
|
210
|
+
};
|
|
211
|
+
export const isAzurePolicyBoundSavingsAggregateV1 = (value) => {
|
|
212
|
+
if (!isRecord(value) ||
|
|
213
|
+
!hasExactFields(value, ['contractVersion', 'policyRef', 'coordinate', 'coverage', 'savingsAggregate']) ||
|
|
214
|
+
value.contractVersion !== 'financial-charge-policy/v1' ||
|
|
215
|
+
value.policyRef !== AZURE_CLOUD_SERVICES_EXCLUDING_MARKETPLACE_POLICY_REF_V1 ||
|
|
216
|
+
!isAzureFinancialCoordinateV1(value.coordinate) ||
|
|
217
|
+
!isAzureFinancialChargeCoverageV1(value.coverage) ||
|
|
218
|
+
!coordinatesEqual(value.coordinate, value.coverage.coordinate)) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
return isCanonicalSavingsAggregateV2(value.savingsAggregate, value.coordinate);
|
|
222
|
+
};
|
|
223
|
+
export const isAzureChargeableSavingsV1 = (value) => {
|
|
224
|
+
if (!isRecord(value) ||
|
|
225
|
+
value.contractVersion !== 'financial-charge-policy/v1' ||
|
|
226
|
+
value.policyRef !== AZURE_CLOUD_SERVICES_EXCLUDING_MARKETPLACE_POLICY_REF_V1 ||
|
|
227
|
+
!isAzureFinancialCoordinateV1(value.coordinate) ||
|
|
228
|
+
!isAzureFinancialChargeCoverageV1(value.coverage) ||
|
|
229
|
+
!coordinatesEqual(value.coordinate, value.coverage.coordinate)) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
if (value.status === 'available') {
|
|
233
|
+
return (hasExactFields(value, [
|
|
234
|
+
'contractVersion',
|
|
235
|
+
'policyRef',
|
|
236
|
+
'coordinate',
|
|
237
|
+
'status',
|
|
238
|
+
'coverage',
|
|
239
|
+
'savingsAggregate',
|
|
240
|
+
'chargeableMaxSavingsMinorUnits',
|
|
241
|
+
]) &&
|
|
242
|
+
value.coverage.status === 'complete' &&
|
|
243
|
+
isCanonicalSavingsAggregateV2(value.savingsAggregate, value.coordinate) &&
|
|
244
|
+
isNonNegativeSafeInteger(value.chargeableMaxSavingsMinorUnits) &&
|
|
245
|
+
value.chargeableMaxSavingsMinorUnits === value.savingsAggregate.totals.maxSavingsMinorUnits);
|
|
246
|
+
}
|
|
247
|
+
return (value.status === 'unavailable' &&
|
|
248
|
+
hasExactFields(value, ['contractVersion', 'policyRef', 'coordinate', 'status', 'coverage', 'reasonCodes']) &&
|
|
249
|
+
isSortedUniqueStringArray(value.reasonCodes, CHARGEABLE_UNAVAILABLE_REASON_CODES));
|
|
250
|
+
};
|
|
251
|
+
const COMPANY_CHARGEABLE_UNAVAILABLE_REASON_CODES = new Set([
|
|
252
|
+
...CHARGEABLE_UNAVAILABLE_REASON_CODES,
|
|
253
|
+
'no-provider-scopes',
|
|
254
|
+
'scope-unavailable',
|
|
255
|
+
'mixed-minor-unit-scale',
|
|
256
|
+
]);
|
|
257
|
+
/** Exact boundary validator for the company-level billing projection. */
|
|
258
|
+
export const isAzureCompanyChargeableSavingsResponseV1 = (value) => {
|
|
259
|
+
if (!isRecord(value) ||
|
|
260
|
+
!hasExactFields(value, ['contractVersion', 'policyRef', 'companyId', 'scopeResults', 'companyTotal']) ||
|
|
261
|
+
value.contractVersion !== 'financial-charge-policy/v1' ||
|
|
262
|
+
value.policyRef !== AZURE_CLOUD_SERVICES_EXCLUDING_MARKETPLACE_POLICY_REF_V1 ||
|
|
263
|
+
!isNonEmptyTrimmedString(value.companyId) ||
|
|
264
|
+
!Array.isArray(value.scopeResults) ||
|
|
265
|
+
!isRecord(value.companyTotal)) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
const providerScopeIds = new Set();
|
|
269
|
+
for (const scopeResult of value.scopeResults) {
|
|
270
|
+
if (!isRecord(scopeResult) || !isNonEmptyTrimmedString(scopeResult.providerScopeId))
|
|
271
|
+
return false;
|
|
272
|
+
const normalizedScopeId = scopeResult.providerScopeId.toLowerCase();
|
|
273
|
+
if (providerScopeIds.has(normalizedScopeId))
|
|
274
|
+
return false;
|
|
275
|
+
providerScopeIds.add(normalizedScopeId);
|
|
276
|
+
if (scopeResult.status === 'available') {
|
|
277
|
+
if (!hasExactFields(scopeResult, [
|
|
278
|
+
'providerScopeId',
|
|
279
|
+
'status',
|
|
280
|
+
'generationId',
|
|
281
|
+
'basis',
|
|
282
|
+
'period',
|
|
283
|
+
'currencyCode',
|
|
284
|
+
'minorUnitScale',
|
|
285
|
+
'chargeableMaxSavingsMinorUnits',
|
|
286
|
+
]) ||
|
|
287
|
+
!isNonEmptyTrimmedString(scopeResult.generationId) ||
|
|
288
|
+
(scopeResult.basis !== 'billed' && scopeResult.basis !== 'amortized') ||
|
|
289
|
+
!isRecord(scopeResult.period) ||
|
|
290
|
+
!hasExactFields(scopeResult.period, ['startDate', 'endDateExclusive']) ||
|
|
291
|
+
!isIsoDate(scopeResult.period.startDate) ||
|
|
292
|
+
!isIsoDate(scopeResult.period.endDateExclusive) ||
|
|
293
|
+
scopeResult.period.startDate >= scopeResult.period.endDateExclusive ||
|
|
294
|
+
typeof scopeResult.currencyCode !== 'string' ||
|
|
295
|
+
!ISO_CURRENCY_PATTERN.test(scopeResult.currencyCode) ||
|
|
296
|
+
!isNonNegativeSafeInteger(scopeResult.minorUnitScale) ||
|
|
297
|
+
scopeResult.minorUnitScale > 6 ||
|
|
298
|
+
!isNonNegativeSafeInteger(scopeResult.chargeableMaxSavingsMinorUnits)) {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (scopeResult.status !== 'unavailable' ||
|
|
304
|
+
!hasExactFields(scopeResult, ['providerScopeId', 'status', 'reasonCodes']) ||
|
|
305
|
+
!isSortedUniqueStringArray(scopeResult.reasonCodes, COMPANY_CHARGEABLE_UNAVAILABLE_REASON_CODES)) {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (value.companyTotal.status === 'available') {
|
|
310
|
+
if (!hasExactFields(value.companyTotal, ['status', 'basis', 'period', 'currencyCode', 'minorUnitScale', 'chargeableMaxSavingsMinorUnits']) ||
|
|
311
|
+
(value.companyTotal.basis !== 'billed' && value.companyTotal.basis !== 'amortized') ||
|
|
312
|
+
!isRecord(value.companyTotal.period) ||
|
|
313
|
+
!hasExactFields(value.companyTotal.period, ['startDate', 'endDateExclusive']) ||
|
|
314
|
+
!isIsoDate(value.companyTotal.period.startDate) ||
|
|
315
|
+
!isIsoDate(value.companyTotal.period.endDateExclusive) ||
|
|
316
|
+
value.companyTotal.period.startDate >= value.companyTotal.period.endDateExclusive ||
|
|
317
|
+
typeof value.companyTotal.currencyCode !== 'string' ||
|
|
318
|
+
!ISO_CURRENCY_PATTERN.test(value.companyTotal.currencyCode) ||
|
|
319
|
+
!isNonNegativeSafeInteger(value.companyTotal.minorUnitScale) ||
|
|
320
|
+
!isNonNegativeSafeInteger(value.companyTotal.chargeableMaxSavingsMinorUnits) ||
|
|
321
|
+
value.scopeResults.some(scopeResult => scopeResult.status !== 'available')) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
const availableScopes = value.scopeResults.filter((scopeResult) => scopeResult.status === 'available');
|
|
325
|
+
const companyTotal = value.companyTotal;
|
|
326
|
+
const total = availableScopes.reduce((sum, scopeResult) => sum + scopeResult.chargeableMaxSavingsMinorUnits, 0);
|
|
327
|
+
return (Number.isSafeInteger(total) &&
|
|
328
|
+
total === companyTotal.chargeableMaxSavingsMinorUnits &&
|
|
329
|
+
availableScopes.every(scopeResult => scopeResult.basis === companyTotal.basis &&
|
|
330
|
+
scopeResult.period.startDate === companyTotal.period.startDate &&
|
|
331
|
+
scopeResult.period.endDateExclusive === companyTotal.period.endDateExclusive &&
|
|
332
|
+
scopeResult.currencyCode === companyTotal.currencyCode &&
|
|
333
|
+
scopeResult.minorUnitScale === companyTotal.minorUnitScale));
|
|
334
|
+
}
|
|
335
|
+
return (value.companyTotal.status === 'unavailable' &&
|
|
336
|
+
hasExactFields(value.companyTotal, ['status', 'reasonCodes']) &&
|
|
337
|
+
isSortedUniqueStringArray(value.companyTotal.reasonCodes, COMPANY_CHARGEABLE_UNAVAILABLE_REASON_CODES));
|
|
338
|
+
};
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Main entry point - export all interfaces from this package */
|
|
2
2
|
export * from './azure/common.js';
|
|
3
3
|
export * from './azure/costComposition.js';
|
|
4
|
+
export * from './azure/financialChargePolicy.js';
|
|
4
5
|
export * from './azure/activityLogs.js';
|
|
5
6
|
export * from './azure/activityLogAnalysis.js';
|
|
6
7
|
export * from './azure/activityLogAnalysisValidation.js';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Main entry point - export all interfaces from this package */
|
|
2
2
|
export * from './azure/common';
|
|
3
3
|
export * from './azure/costComposition';
|
|
4
|
+
export * from './azure/financialChargePolicy';
|
|
4
5
|
export * from './azure/activityLogs';
|
|
5
6
|
export * from './azure/activityLogAnalysis';
|
|
6
7
|
export * from './azure/activityLogAnalysisValidation';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,MAAM,CAAC;AACrB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,MAAM,CAAC;AACrB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
/** Main entry point - export all interfaces from this package */
|
|
18
18
|
__exportStar(require("./azure/common"), exports);
|
|
19
19
|
__exportStar(require("./azure/costComposition"), exports);
|
|
20
|
+
__exportStar(require("./azure/financialChargePolicy"), exports);
|
|
20
21
|
__exportStar(require("./azure/activityLogs"), exports);
|
|
21
22
|
__exportStar(require("./azure/activityLogAnalysis"), exports);
|
|
22
23
|
__exportStar(require("./azure/activityLogAnalysisValidation"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAAiE;AACjE,iDAA+B;AAC/B,0DAAwC;AACxC,uDAAqC;AACrC,8DAA4C;AAC5C,wEAAsD;AACtD,kDAAgC;AAChC,4DAA0C;AAC1C,oEAAkD;AAClD,gEAA8C;AAC9C,0EAAwD;AACxD,+DAA6C;AAC7C,uDAAqC;AACrC,mDAAiC;AACjC,8DAA4C;AAC5C,oDAAkC;AAClC,kDAAgC;AAChC,kDAAgC;AAChC,mDAAiC;AACjC,0DAAwC;AACxC,yDAAuC;AACvC,iDAA+B;AAC/B,wDAAsC;AACtC,0DAAwC;AACxC,+DAA6C;AAC7C,8DAA4C;AAC5C,iEAA+C;AAC/C,8DAA4C;AAC5C,+DAA6C;AAC7C,oDAAkC;AAClC,kDAAgC;AAChC,6DAA2C;AAC3C,0DAAwC;AACxC,uDAAqC;AACrC,yDAAuC;AACvC,wDAAsC;AACtC,gDAA8B;AAC9B,mDAAiC;AACjC,kDAAgC;AAChC,4DAA0C;AAC1C,iEAA+C;AAC/C,0EAAwD;AACxD,+DAA6C;AAC7C,4DAA0C;AAC1C,qDAAmC;AACnC,4DAA0C;AAC1C,yDAAuC;AACvC,4DAA0C;AAC1C,wCAAsB;AACtB,6CAA2B;AAC3B,gDAA8B;AAC9B,0CAAwB;AACxB,2CAAyB;AACzB,4DAA0C;AAC1C,4CAA0B;AAC1B,qDAAmC;AACnC,8CAA4B;AAC5B,uCAAqB;AACrB,gDAA8B;AAC9B,2CAAyB;AACzB,iDAA+B;AAC/B,6CAA2B;AAC3B,6DAA2C;AAC3C,yCAAuB;AACvB,8CAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAAiE;AACjE,iDAA+B;AAC/B,0DAAwC;AACxC,gEAA8C;AAC9C,uDAAqC;AACrC,8DAA4C;AAC5C,wEAAsD;AACtD,kDAAgC;AAChC,4DAA0C;AAC1C,oEAAkD;AAClD,gEAA8C;AAC9C,0EAAwD;AACxD,+DAA6C;AAC7C,uDAAqC;AACrC,mDAAiC;AACjC,8DAA4C;AAC5C,oDAAkC;AAClC,kDAAgC;AAChC,kDAAgC;AAChC,mDAAiC;AACjC,0DAAwC;AACxC,yDAAuC;AACvC,iDAA+B;AAC/B,wDAAsC;AACtC,0DAAwC;AACxC,+DAA6C;AAC7C,8DAA4C;AAC5C,iEAA+C;AAC/C,8DAA4C;AAC5C,+DAA6C;AAC7C,oDAAkC;AAClC,kDAAgC;AAChC,6DAA2C;AAC3C,0DAAwC;AACxC,uDAAqC;AACrC,yDAAuC;AACvC,wDAAsC;AACtC,gDAA8B;AAC9B,mDAAiC;AACjC,kDAAgC;AAChC,4DAA0C;AAC1C,iEAA+C;AAC/C,0EAAwD;AACxD,+DAA6C;AAC7C,4DAA0C;AAC1C,qDAAmC;AACnC,4DAA0C;AAC1C,yDAAuC;AACvC,4DAA0C;AAC1C,wCAAsB;AACtB,6CAA2B;AAC3B,gDAA8B;AAC9B,0CAAwB;AACxB,2CAAyB;AACzB,4DAA0C;AAC1C,4CAA0B;AAC1B,qDAAmC;AACnC,8CAA4B;AAC5B,uCAAqB;AACrB,gDAA8B;AAC9B,2CAAyB;AACzB,iDAA+B;AAC/B,6CAA2B;AAC3B,6DAA2C;AAC3C,yCAAuB;AACvB,8CAA4B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spottoai/types-package",
|
|
3
|
-
"version": "1.0.2-beta.
|
|
3
|
+
"version": "1.0.2-beta.403",
|
|
4
4
|
"description": "Shared TypeScript interfaces for SpottoAI",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -84,11 +84,12 @@
|
|
|
84
84
|
"check:azure-view-set-contracts": "node scripts/check-azure-view-set-contracts.mjs",
|
|
85
85
|
"check:dev-1135-latest-contracts": "node scripts/check-dev-1135-latest-contracts.mjs",
|
|
86
86
|
"check:environment-contracts": "node scripts/check-environment-contracts.mjs",
|
|
87
|
+
"check:financial-charge-policy-contracts": "node scripts/check-financial-charge-policy-contracts.mjs",
|
|
87
88
|
"check:capability-passport-contracts": "node scripts/check-capability-passport-contracts.mjs",
|
|
88
89
|
"check:commitments-planning": "node scripts/check-commitments-planning.mjs",
|
|
89
90
|
"check:organization-commitments-planning": "node scripts/check-organization-commitments-planning.mjs",
|
|
90
91
|
"prepublishOnly": "npm run clean && npm run build && npm test",
|
|
91
|
-
"test": "npm run build && npm run check:activity-log-analysis-contracts && npm run check:artifact-evidence-contracts && npm run check:billing-artifact-object-boundaries && npm run check:billing-cost-analysis-read-responses && npm run check:aws-examples && npm run check:plugin-public-artifacts && npm run check:portal-public-artifacts && npm run check:relationship-public-artifacts && npm run check:azure-view-set-contracts && npm run check:dev-1135-latest-contracts && npm run check:environment-contracts && npm run check:capability-passport-contracts && npm run check:commitments-planning && npm run check:organization-commitments-planning && npm run check:packed-exports",
|
|
92
|
+
"test": "npm run build && npm run check:activity-log-analysis-contracts && npm run check:artifact-evidence-contracts && npm run check:billing-artifact-object-boundaries && npm run check:billing-cost-analysis-read-responses && npm run check:aws-examples && npm run check:plugin-public-artifacts && npm run check:portal-public-artifacts && npm run check:relationship-public-artifacts && npm run check:azure-view-set-contracts && npm run check:dev-1135-latest-contracts && npm run check:environment-contracts && npm run check:financial-charge-policy-contracts && npm run check:capability-passport-contracts && npm run check:commitments-planning && npm run check:organization-commitments-planning && npm run check:packed-exports",
|
|
92
93
|
"lint": "eslint src --ext .ts",
|
|
93
94
|
"lint:fix": "eslint src --ext .ts --fix",
|
|
94
95
|
"format": "prettier --write \"src/**/*.{ts,js,json}\"",
|