@fiado/type-kit 3.519.0 → 3.521.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.
- package/_test_/unit/mdm/dtos/mdmDeviceContract.test.ts +22 -0
- package/_test_/unit/rewards/backoffice.test.ts +1 -1
- package/_test_/unit/rewards/chargeDtos.test.ts +21 -0
- package/_test_/unit/rewards/deliveryMetricsDtos.test.ts +25 -0
- package/_test_/unit/rewards/grantBackofficeDtos.test.ts +30 -0
- package/_test_/unit/rewards/partnerDtos.test.ts +47 -0
- package/_test_/unit/rewardsEligibility/metricsDtos.test.ts +8 -2
- package/bin/mdm/dtos/DeviceEnrollRequest.d.ts +2 -0
- package/bin/mdm/dtos/DeviceEnrollRequest.js +6 -0
- package/bin/rewards/constants/BackofficeLimits.d.ts +13 -0
- package/bin/rewards/constants/BackofficeLimits.js +14 -1
- package/bin/rewards/dtos/backoffice/BackofficeGrantAttemptResponse.d.ts +5 -0
- package/bin/rewards/dtos/backoffice/BackofficeGrantAttemptResponse.js +7 -0
- package/bin/rewards/dtos/backoffice/BackofficeGrantItemResponse.d.ts +7 -0
- package/bin/rewards/dtos/backoffice/BackofficeGrantItemResponse.js +7 -0
- package/bin/rewards/dtos/backoffice/BackofficeGrantResponse.d.ts +7 -0
- package/bin/rewards/dtos/backoffice/BackofficeGrantResponse.js +8 -0
- package/bin/rewards/dtos/backoffice/ChargeListResponse.d.ts +6 -0
- package/bin/rewards/dtos/backoffice/ChargeListResponse.js +6 -0
- package/bin/rewards/dtos/backoffice/ChargeRecord.d.ts +17 -0
- package/bin/rewards/dtos/backoffice/ChargeRecord.js +7 -0
- package/bin/rewards/dtos/backoffice/ChargesExportQuery.d.ts +5 -0
- package/bin/rewards/dtos/backoffice/ChargesExportQuery.js +7 -0
- package/bin/rewards/dtos/backoffice/ChargesQuery.d.ts +7 -0
- package/bin/rewards/dtos/backoffice/ChargesQuery.js +7 -0
- package/bin/rewards/dtos/backoffice/DeliveryMetricsPoint.d.ts +13 -0
- package/bin/rewards/dtos/backoffice/DeliveryMetricsPoint.js +7 -0
- package/bin/rewards/dtos/backoffice/DeliveryMetricsQuery.d.ts +9 -0
- package/bin/rewards/dtos/backoffice/DeliveryMetricsQuery.js +7 -0
- package/bin/rewards/dtos/backoffice/DeliveryTopEntry.d.ts +16 -0
- package/bin/rewards/dtos/backoffice/DeliveryTopEntry.js +7 -0
- package/bin/rewards/dtos/backoffice/DeliveryTopQuery.d.ts +11 -0
- package/bin/rewards/dtos/backoffice/DeliveryTopQuery.js +7 -0
- package/bin/rewards/dtos/backoffice/GrantListQuery.d.ts +22 -0
- package/bin/rewards/dtos/backoffice/GrantListQuery.js +7 -0
- package/bin/rewards/dtos/backoffice/GrantListResponse.d.ts +5 -0
- package/bin/rewards/dtos/backoffice/GrantListResponse.js +6 -0
- package/bin/rewards/dtos/backoffice/PartnerListResponse.d.ts +6 -0
- package/bin/rewards/dtos/backoffice/PartnerListResponse.js +6 -0
- package/bin/rewards/dtos/backoffice/PartnerRequest.d.ts +7 -0
- package/bin/rewards/dtos/backoffice/PartnerRequest.js +38 -0
- package/bin/rewards/dtos/backoffice/PartnerResponse.d.ts +11 -0
- package/bin/rewards/dtos/backoffice/PartnerResponse.js +6 -0
- package/bin/rewards/dtos/backoffice/PartnerSummary.d.ts +12 -0
- package/bin/rewards/dtos/backoffice/PartnerSummary.js +7 -0
- package/bin/rewards/dtos/backoffice/PartnersSummaryQuery.d.ts +5 -0
- package/bin/rewards/dtos/backoffice/PartnersSummaryQuery.js +7 -0
- package/bin/rewards/dtos/backoffice/RewardChargeToInput.d.ts +1 -1
- package/bin/rewards/dtos/backoffice/RewardChargeToInput.js +1 -7
- package/bin/rewards/enums/DeliveryDimensionEnum.d.ts +8 -0
- package/bin/rewards/enums/DeliveryDimensionEnum.js +12 -0
- package/bin/rewards/enums/DeliveryTopByEnum.d.ts +5 -0
- package/bin/rewards/enums/DeliveryTopByEnum.js +9 -0
- package/bin/rewards/enums/DeliveryTopDimensionEnum.d.ts +7 -0
- package/bin/rewards/enums/DeliveryTopDimensionEnum.js +11 -0
- package/bin/rewards/index.d.ts +21 -0
- package/bin/rewards/index.js +21 -0
- package/bin/rewardsEligibility/dtos/backoffice/FailedConditionEvaluationResponse.d.ts +6 -0
- package/bin/rewardsEligibility/dtos/backoffice/FailedConditionEvaluationResponse.js +7 -0
- package/bin/rewardsEligibility/dtos/backoffice/FailedConditionStatResponse.d.ts +3 -0
- package/bin/rewardsEligibility/index.d.ts +1 -0
- package/bin/rewardsEligibility/index.js +1 -0
- package/package.json +1 -1
- package/src/mdm/dtos/DeviceEnrollRequest.ts +7 -1
- package/src/rewards/constants/BackofficeLimits.ts +16 -0
- package/src/rewards/dtos/backoffice/BackofficeGrantAttemptResponse.ts +6 -0
- package/src/rewards/dtos/backoffice/BackofficeGrantItemResponse.ts +8 -0
- package/src/rewards/dtos/backoffice/BackofficeGrantResponse.ts +8 -0
- package/src/rewards/dtos/backoffice/ChargeListResponse.ts +7 -0
- package/src/rewards/dtos/backoffice/ChargeRecord.ts +18 -0
- package/src/rewards/dtos/backoffice/ChargesExportQuery.ts +5 -0
- package/src/rewards/dtos/backoffice/ChargesQuery.ts +7 -0
- package/src/rewards/dtos/backoffice/DeliveryMetricsPoint.ts +14 -0
- package/src/rewards/dtos/backoffice/DeliveryMetricsQuery.ts +10 -0
- package/src/rewards/dtos/backoffice/DeliveryTopEntry.ts +14 -0
- package/src/rewards/dtos/backoffice/DeliveryTopQuery.ts +12 -0
- package/src/rewards/dtos/backoffice/GrantListQuery.ts +23 -0
- package/src/rewards/dtos/backoffice/GrantListResponse.ts +6 -0
- package/src/rewards/dtos/backoffice/PartnerListResponse.ts +7 -0
- package/src/rewards/dtos/backoffice/PartnerRequest.ts +22 -0
- package/src/rewards/dtos/backoffice/PartnerResponse.ts +12 -0
- package/src/rewards/dtos/backoffice/PartnerSummary.ts +13 -0
- package/src/rewards/dtos/backoffice/PartnersSummaryQuery.ts +5 -0
- package/src/rewards/dtos/backoffice/RewardChargeToInput.ts +1 -6
- package/src/rewards/enums/DeliveryDimensionEnum.ts +8 -0
- package/src/rewards/enums/DeliveryTopByEnum.ts +5 -0
- package/src/rewards/enums/DeliveryTopDimensionEnum.ts +7 -0
- package/src/rewards/index.ts +21 -0
- package/src/rewardsEligibility/dtos/backoffice/FailedConditionEvaluationResponse.ts +6 -0
- package/src/rewardsEligibility/dtos/backoffice/FailedConditionStatResponse.ts +4 -0
- package/src/rewardsEligibility/index.ts +1 -0
|
@@ -62,6 +62,28 @@ describe('DeviceEnrollRequest.lockMode', () => {
|
|
|
62
62
|
});
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
+
describe('DeviceEnrollRequest.firstLockAt', () => {
|
|
66
|
+
it('valida sin firstLockAt: el consumidor de hoy no se rompe', async () => {
|
|
67
|
+
const dto = plainToInstance(DeviceEnrollRequest, validEnroll);
|
|
68
|
+
const errors = await validate(dto);
|
|
69
|
+
expect(errors).toEqual([]);
|
|
70
|
+
expect(dto.firstLockAt).toBeUndefined();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('valida con firstLockAt en ISO-8601', async () => {
|
|
74
|
+
const dto = plainToInstance(DeviceEnrollRequest, { ...validEnroll, firstLockAt: '2026-11-08T06:00:00.000Z' });
|
|
75
|
+
const errors = await validate(dto);
|
|
76
|
+
expect(errors).toEqual([]);
|
|
77
|
+
expect(dto.firstLockAt).toBe('2026-11-08T06:00:00.000Z');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('falla si firstLockAt no es ISO-8601', async () => {
|
|
81
|
+
const dto = plainToInstance(DeviceEnrollRequest, { ...validEnroll, firstLockAt: '08/11/2026' });
|
|
82
|
+
const errors = await validate(dto);
|
|
83
|
+
expect(hasConstraint(errors, 'firstLockAt', 'isIso8601')).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
65
87
|
describe('DeviceUnlockRequest.unlockUntil', () => {
|
|
66
88
|
it('valida sin unlockUntil: el consumidor de hoy no se rompe', async () => {
|
|
67
89
|
const dto = plainToInstance(DeviceUnlockRequest, validUnlock);
|
|
@@ -11,7 +11,7 @@ const catalog = {
|
|
|
11
11
|
type: 'ExampleType',
|
|
12
12
|
config: { amount: 50, nested: { list: [1, 2] } },
|
|
13
13
|
cost: { amount: 50, currency: 'MXN' },
|
|
14
|
-
chargeTo: { partnerId: 'ALIADO-001'
|
|
14
|
+
chargeTo: { partnerId: 'ALIADO-001' },
|
|
15
15
|
status: 'ACTIVE',
|
|
16
16
|
};
|
|
17
17
|
const pkg = { id: 'paquete-1', name: 'Paquete 1', status: 'ACTIVE', items: [{ itemKey: 'itemA', catalogItemId: 'example-reward-a' }] };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { CurrencyId } from '../../../src/currency';
|
|
3
|
+
import { CHARGES_EXPORT_MAX_ROWS, CHARGES_MONTH_PATTERN } from '../../../src/rewards';
|
|
4
|
+
import type { ChargeListResponse, ChargeRecord, ChargesExportQuery, ChargesQuery } from '../../../src/rewards';
|
|
5
|
+
|
|
6
|
+
describe('contrato de cargos (D-C1)', () => {
|
|
7
|
+
it.each(['2026-01', '2026-12'])('acepta el mes %s', (m) => expect(CHARGES_MONTH_PATTERN.test(m)).toBe(true));
|
|
8
|
+
it.each(['2026-13', '2026-00', '26-10', '2026-1', '2026-10-01'])('rechaza el mes %s', (m) => expect(CHARGES_MONTH_PATTERN.test(m)).toBe(false));
|
|
9
|
+
|
|
10
|
+
it('tope del export y forma de ChargeRecord (con packageId, sin source)', () => {
|
|
11
|
+
const record: ChargeRecord = {
|
|
12
|
+
grantId: 'g', itemKey: 'a', grantedAt: 1, directoryId: 'd', catalogItemId: 'c', catalogItemName: 'Recarga', packageId: 'p',
|
|
13
|
+
cost: { amount: 10, currency: CurrencyId.MXN }, chargeTo: { partnerId: 'FIADO', partnerName: 'Fiado' },
|
|
14
|
+
};
|
|
15
|
+
const list: ChargeListResponse = { items: [record] };
|
|
16
|
+
const q: ChargesQuery = { partnerId: 'FIADO', month: '2026-10', limit: 10 };
|
|
17
|
+
const e: ChargesExportQuery = { partnerId: 'FIADO', month: '2026-10' };
|
|
18
|
+
expect([CHARGES_EXPORT_MAX_ROWS, list.items.length, q.month, e.partnerId]).toEqual([10000, 1, '2026-10', 'FIADO']);
|
|
19
|
+
expect('source' in record).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import {
|
|
3
|
+
DeliveryDimensionEnum, DeliveryTopByEnum, DeliveryTopDimensionEnum, METRICS_TAG_ALLOWLIST, METRICS_TAG_DIMENSION_PATTERN,
|
|
4
|
+
METRICS_TOP_LIMIT, METRICS_TOP_MAX_VALUES,
|
|
5
|
+
} from '../../../src/rewards';
|
|
6
|
+
import type { DeliveryMetricsPoint, DeliveryTopEntry } from '../../../src/rewards';
|
|
7
|
+
import { CurrencyId } from '../../../src/currency';
|
|
8
|
+
|
|
9
|
+
describe('contrato de métricas de entregas (D-D3)', () => {
|
|
10
|
+
it('constantes y enums del spec §4.3/§5.5', () => {
|
|
11
|
+
expect([METRICS_TOP_LIMIT, METRICS_TOP_MAX_VALUES]).toEqual([10, 200]);
|
|
12
|
+
expect(METRICS_TAG_ALLOWLIST).toEqual(['campaignId', 'evaluationId']);
|
|
13
|
+
expect(Object.values(DeliveryDimensionEnum)).toEqual(['ALL', 'PACKAGE', 'CATALOG_ITEM', 'PARTNER', 'SOURCE']);
|
|
14
|
+
expect(Object.values(DeliveryTopDimensionEnum)).toEqual(['PACKAGE', 'CATALOG_ITEM', 'PARTNER', 'SOURCE']);
|
|
15
|
+
expect(Object.values(DeliveryTopByEnum)).toEqual(['cost', 'count']);
|
|
16
|
+
});
|
|
17
|
+
it.each(['TAG#campaignId', 'TAG#evaluationId'])('acepta %s', (d) => expect(METRICS_TAG_DIMENSION_PATTERN.test(d)).toBe(true));
|
|
18
|
+
it.each(['TAG#userId', 'TAG#', 'tag#campaignId', 'TAG#campaignId#x'])('rechaza %s', (d) => expect(METRICS_TAG_DIMENSION_PATTERN.test(d)).toBe(false));
|
|
19
|
+
|
|
20
|
+
it('formas de punto y top', () => {
|
|
21
|
+
const p: DeliveryMetricsPoint = { date: '2026-10-08', currency: CurrencyId.MXN, granted: 1, failed: 0, skipped: 0, grantsCompleted: 1, grantsPartial: 0, grantsFailed: 0, costGranted: 10.5 };
|
|
22
|
+
const t: DeliveryTopEntry = { value: 'FIADO', label: 'Fiado', granted: 1, failed: 0, skipped: 0, cost: [{ amount: 10.5, currency: CurrencyId.MXN }] };
|
|
23
|
+
expect([p.costGranted, t.cost[0].amount]).toEqual([10.5, 10.5]);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { GRANTS_DEFAULT_RANGE_DAYS, GRANTS_EXPORT_MAX_ROWS, GRANTS_MAX_RANGE_DAYS } from '../../../src/rewards';
|
|
3
|
+
import { CurrencyId } from '../../../src/currency';
|
|
4
|
+
import type { BackofficeGrantResponse, GrantListQuery, GrantListResponse } from '../../../src/rewards';
|
|
5
|
+
import { GrantItemStatusEnum, GrantStatusEnum, ItemErrorCategoryEnum, RewardStatusEnum } from '../../../src/rewards';
|
|
6
|
+
|
|
7
|
+
describe('contrato de entregas de backoffice (Fase 4)', () => {
|
|
8
|
+
it('expone los límites del spec §6', () => {
|
|
9
|
+
expect([GRANTS_MAX_RANGE_DAYS, GRANTS_DEFAULT_RANGE_DAYS, GRANTS_EXPORT_MAX_ROWS]).toEqual([92, 7, 5000]);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('BackofficeGrantResponse extiende GrantResponse con name por ítem y message por intento', () => {
|
|
13
|
+
const grant: BackofficeGrantResponse = {
|
|
14
|
+
id: 'g1', directoryId: 'd1', packageId: 'p1', packageVersion: 1, packageName: 'Paquete',
|
|
15
|
+
source: { service: 'rewards-eligibility', reference: 'run-1' }, status: GrantStatusEnum.PARTIAL, createdAt: 1, updatedAt: 2,
|
|
16
|
+
items: [{
|
|
17
|
+
itemKey: 'a', catalogItemId: 'c', name: 'Recarga', status: GrantItemStatusEnum.FAILED,
|
|
18
|
+
chargeTo: { partnerId: 'FIADO', partnerName: 'Fiado' }, cost: { amount: 10, currency: CurrencyId.MXN }, attemptCount: 1,
|
|
19
|
+
attempts: [{ attempt: 1, startedAt: 1, finishedAt: 2, errorCategory: ItemErrorCategoryEnum.PROVIDER_REJECTED, message: 'El proveedor rechazó la operación' }],
|
|
20
|
+
}],
|
|
21
|
+
};
|
|
22
|
+
expect(grant.items[0].attempts[0].message).toContain('proveedor');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('GrantListQuery admite los filtros nuevos D-F1', () => {
|
|
26
|
+
const q: GrantListQuery = { status: 'PARTIAL,FAILED', catalogItemId: 'reward-a', errorCategory: ItemErrorCategoryEnum.INTERNAL_ERROR, search: 'abc', limit: 20 };
|
|
27
|
+
const res: GrantListResponse = { items: [] };
|
|
28
|
+
expect([q.catalogItemId, res.items.length, RewardStatusEnum.ACTIVE]).toEqual(['reward-a', 0, 'ACTIVE']);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import type { JsonValue } from '../../../src/common';
|
|
5
|
+
import { CatalogItemRequest, PartnerRequest, RewardChargeToInput } from '../../../src/rewards';
|
|
6
|
+
|
|
7
|
+
const partner = { id: 'telcel-mx', name: 'Telcel México', status: 'ACTIVE' };
|
|
8
|
+
const asPartner = (o: Record<string, JsonValue> = {}): PartnerRequest =>
|
|
9
|
+
plainToInstance(PartnerRequest, { ...partner, ...o }, { excludeExtraneousValues: true });
|
|
10
|
+
const props = async (dto: object): Promise<string[]> => (await validate(dto)).map((e) => e.property);
|
|
11
|
+
|
|
12
|
+
describe('PartnerRequest', () => {
|
|
13
|
+
it('valida un aliado correcto', async () => {
|
|
14
|
+
expect(await validate(asPartner())).toHaveLength(0);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it.each<[string, Record<string, JsonValue>, string]>([
|
|
18
|
+
['id con espacios', { id: 'con espacio' }, 'id'],
|
|
19
|
+
['id con #', { id: 'a#b' }, 'id'],
|
|
20
|
+
['id vacío', { id: '' }, 'id'],
|
|
21
|
+
['id de 65 caracteres', { id: 'x'.repeat(65) }, 'id'],
|
|
22
|
+
['name vacío', { name: '' }, 'name'],
|
|
23
|
+
['name > 120', { name: 'x'.repeat(121) }, 'name'],
|
|
24
|
+
['status desconocido', { status: 'BORRADO' }, 'status'],
|
|
25
|
+
])('rechaza %s', async (_label, override, property) => {
|
|
26
|
+
expect(await props(asPartner(override))).toContain(property);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('RewardChargeToInput (D-A2: el operador ya no escribe partnerName)', () => {
|
|
31
|
+
it('solo expone partnerId y descarta partnerName del cliente', () => {
|
|
32
|
+
const dto = plainToInstance(RewardChargeToInput, { partnerId: 'telcel-mx', partnerName: 'Falso' }, { excludeExtraneousValues: true });
|
|
33
|
+
expect(dto).toEqual({ partnerId: 'telcel-mx' });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('CatalogItemRequest valida sin partnerName', async () => {
|
|
37
|
+
const dto = plainToInstance(
|
|
38
|
+
CatalogItemRequest,
|
|
39
|
+
{
|
|
40
|
+
id: 'r-a', name: 'A', description: 'd', type: 'T', config: {}, cost: { amount: 1, currency: 'MXN' },
|
|
41
|
+
chargeTo: { partnerId: 'FIADO' }, status: 'ACTIVE',
|
|
42
|
+
},
|
|
43
|
+
{ excludeExtraneousValues: true },
|
|
44
|
+
);
|
|
45
|
+
expect(await validate(dto)).toHaveLength(0);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MetricsDimensionEnum } from '../../../src/rewardsEligibility/enums/MetricsDimensionEnum';
|
|
2
|
-
import type { FailedConditionStatResponse } from '../../../src/rewardsEligibility
|
|
2
|
+
import type { FailedConditionEvaluationResponse, FailedConditionStatResponse } from '../../../src/rewardsEligibility';
|
|
3
3
|
import type { MetricsPointResponse } from '../../../src/rewardsEligibility/dtos/backoffice/MetricsPointResponse';
|
|
4
4
|
import type { MetricsQuery } from '../../../src/rewardsEligibility/dtos/backoffice/MetricsQuery';
|
|
5
5
|
|
|
@@ -9,9 +9,15 @@ describe('DTOs de métricas (forma)', () => {
|
|
|
9
9
|
expect(Object.keys(point)).toHaveLength(10);
|
|
10
10
|
});
|
|
11
11
|
it('ranking y query', () => {
|
|
12
|
-
const stat: FailedConditionStatResponse = { key: 'directory.accountAgeDays', label: 'Antigüedad de la cuenta', count: 7 };
|
|
12
|
+
const stat: FailedConditionStatResponse = { key: 'directory.accountAgeDays', label: 'Antigüedad de la cuenta', count: 7, evaluations: [] };
|
|
13
13
|
const query: MetricsQuery = { dimension: MetricsDimensionEnum.CAMPAIGN, value: 'referidos-q4', from: '2026-10-01', to: '2026-10-08' };
|
|
14
14
|
expect(stat.count).toBe(7);
|
|
15
15
|
expect(query.dimension).toBe('CAMPAIGN');
|
|
16
16
|
});
|
|
17
|
+
|
|
18
|
+
it('FailedConditionStatResponse trae evaluations ordenables por count (D-E1)', () => {
|
|
19
|
+
const evaluation: FailedConditionEvaluationResponse = { evaluationId: 'ev-1', evaluationName: 'Referidos', count: 7 };
|
|
20
|
+
const stat: FailedConditionStatResponse = { key: 'payments.amount', label: 'Monto', count: 9, evaluations: [evaluation] };
|
|
21
|
+
expect(stat.evaluations[0]).toEqual({ evaluationId: 'ev-1', evaluationName: 'Referidos', count: 7 });
|
|
22
|
+
});
|
|
17
23
|
});
|
|
@@ -8,5 +8,7 @@ export declare class DeviceEnrollRequest {
|
|
|
8
8
|
termMonths: number;
|
|
9
9
|
/** Cuándo se dispara el bloqueo del equipo; si se omite es ONDEMAND, que es el modo de hoy. */
|
|
10
10
|
lockMode?: MdmLockModeEnum;
|
|
11
|
+
/** ISO-8601 del primer bloqueo programado (primer vencimiento); lo usan proveedores que agendan el bloqueo al enrolar. */
|
|
12
|
+
firstLockAt?: string;
|
|
11
13
|
operationReference: string;
|
|
12
14
|
}
|
|
@@ -58,6 +58,12 @@ __decorate([
|
|
|
58
58
|
(0, class_validator_1.IsOptional)(),
|
|
59
59
|
__metadata("design:type", String)
|
|
60
60
|
], DeviceEnrollRequest.prototype, "lockMode", void 0);
|
|
61
|
+
__decorate([
|
|
62
|
+
(0, class_transformer_1.Expose)(),
|
|
63
|
+
(0, class_validator_1.IsISO8601)(),
|
|
64
|
+
(0, class_validator_1.IsOptional)(),
|
|
65
|
+
__metadata("design:type", String)
|
|
66
|
+
], DeviceEnrollRequest.prototype, "firstLockAt", void 0);
|
|
61
67
|
__decorate([
|
|
62
68
|
(0, class_transformer_1.Expose)(),
|
|
63
69
|
(0, class_validator_1.IsString)(),
|
|
@@ -4,3 +4,16 @@ export declare const REWARD_ITEM_KEY_PATTERN: RegExp;
|
|
|
4
4
|
export declare const REWARD_ID_PATTERN: RegExp;
|
|
5
5
|
/** Máximo de ítems de un paquete (B-12 de rewards-business: presupuesto de tiempo del worker). Igual a `MAX_ITEMS_PER_PACKAGE` del lambda. */
|
|
6
6
|
export declare const REWARD_PACKAGE_MAX_ITEMS = 4;
|
|
7
|
+
/** Entregas de backoffice (Fase 4): ventana máxima del listado, default y tope del CSV. */
|
|
8
|
+
export declare const GRANTS_MAX_RANGE_DAYS = 92;
|
|
9
|
+
export declare const GRANTS_DEFAULT_RANGE_DAYS = 7;
|
|
10
|
+
export declare const GRANTS_EXPORT_MAX_ROWS = 5000;
|
|
11
|
+
/** Cierre mensual por aliado (D-C1): tope del CSV y formato de `month` (UTC). */
|
|
12
|
+
export declare const CHARGES_EXPORT_MAX_ROWS = 10000;
|
|
13
|
+
export declare const CHARGES_MONTH_PATTERN: RegExp;
|
|
14
|
+
/** Métricas de entregas (D-D3): top de 10, máximo 200 valores por dimensión, y etiquetas permitidas. */
|
|
15
|
+
export declare const METRICS_TOP_LIMIT = 10;
|
|
16
|
+
export declare const METRICS_TOP_MAX_VALUES = 200;
|
|
17
|
+
/** Etiquetas permitidas en métricas (D-D3b): una llave libre tendría cardinalidad ilimitada. */
|
|
18
|
+
export declare const METRICS_TAG_ALLOWLIST: readonly string[];
|
|
19
|
+
export declare const METRICS_TAG_DIMENSION_PATTERN: RegExp;
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.REWARD_PACKAGE_MAX_ITEMS = exports.REWARD_ID_PATTERN = exports.REWARD_ITEM_KEY_PATTERN = exports.REWARD_ITEM_KEY_MAX_LENGTH = void 0;
|
|
3
|
+
exports.METRICS_TAG_DIMENSION_PATTERN = exports.METRICS_TAG_ALLOWLIST = exports.METRICS_TOP_MAX_VALUES = exports.METRICS_TOP_LIMIT = exports.CHARGES_MONTH_PATTERN = exports.CHARGES_EXPORT_MAX_ROWS = exports.GRANTS_EXPORT_MAX_ROWS = exports.GRANTS_DEFAULT_RANGE_DAYS = exports.GRANTS_MAX_RANGE_DAYS = exports.REWARD_PACKAGE_MAX_ITEMS = exports.REWARD_ID_PATTERN = exports.REWARD_ITEM_KEY_PATTERN = exports.REWARD_ITEM_KEY_MAX_LENGTH = void 0;
|
|
4
4
|
/** Máximo del `itemKey` de un paquete: `RW-{grantId(32)}-{itemKey}` ≤ 64 (igual que REWARDS_MAX_ITEM_KEY_LENGTH de api-invoker). */
|
|
5
5
|
exports.REWARD_ITEM_KEY_MAX_LENGTH = 28;
|
|
6
6
|
exports.REWARD_ITEM_KEY_PATTERN = new RegExp(`^[A-Za-z0-9_-]{1,${exports.REWARD_ITEM_KEY_MAX_LENGTH}}$`);
|
|
7
7
|
exports.REWARD_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
8
8
|
/** Máximo de ítems de un paquete (B-12 de rewards-business: presupuesto de tiempo del worker). Igual a `MAX_ITEMS_PER_PACKAGE` del lambda. */
|
|
9
9
|
exports.REWARD_PACKAGE_MAX_ITEMS = 4;
|
|
10
|
+
/** Entregas de backoffice (Fase 4): ventana máxima del listado, default y tope del CSV. */
|
|
11
|
+
exports.GRANTS_MAX_RANGE_DAYS = 92;
|
|
12
|
+
exports.GRANTS_DEFAULT_RANGE_DAYS = 7;
|
|
13
|
+
exports.GRANTS_EXPORT_MAX_ROWS = 5000;
|
|
14
|
+
/** Cierre mensual por aliado (D-C1): tope del CSV y formato de `month` (UTC). */
|
|
15
|
+
exports.CHARGES_EXPORT_MAX_ROWS = 10000;
|
|
16
|
+
exports.CHARGES_MONTH_PATTERN = /^\d{4}-(0[1-9]|1[0-2])$/;
|
|
17
|
+
/** Métricas de entregas (D-D3): top de 10, máximo 200 valores por dimensión, y etiquetas permitidas. */
|
|
18
|
+
exports.METRICS_TOP_LIMIT = 10;
|
|
19
|
+
exports.METRICS_TOP_MAX_VALUES = 200;
|
|
20
|
+
/** Etiquetas permitidas en métricas (D-D3b): una llave libre tendría cardinalidad ilimitada. */
|
|
21
|
+
exports.METRICS_TAG_ALLOWLIST = ['campaignId', 'evaluationId'];
|
|
22
|
+
exports.METRICS_TAG_DIMENSION_PATTERN = /^TAG#(campaignId|evaluationId)$/;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BackofficeGrantAttemptResponse = void 0;
|
|
4
|
+
const GrantAttemptResponse_1 = require("../responses/GrantAttemptResponse");
|
|
5
|
+
class BackofficeGrantAttemptResponse extends GrantAttemptResponse_1.GrantAttemptResponse {
|
|
6
|
+
}
|
|
7
|
+
exports.BackofficeGrantAttemptResponse = BackofficeGrantAttemptResponse;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GrantItemResponse } from '../responses/GrantItemResponse';
|
|
2
|
+
import { BackofficeGrantAttemptResponse } from './BackofficeGrantAttemptResponse';
|
|
3
|
+
export declare class BackofficeGrantItemResponse extends GrantItemResponse {
|
|
4
|
+
/** Nombre de la recompensa congelada en la entrega. */
|
|
5
|
+
name: string;
|
|
6
|
+
attempts: BackofficeGrantAttemptResponse[];
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BackofficeGrantItemResponse = void 0;
|
|
4
|
+
const GrantItemResponse_1 = require("../responses/GrantItemResponse");
|
|
5
|
+
class BackofficeGrantItemResponse extends GrantItemResponse_1.GrantItemResponse {
|
|
6
|
+
}
|
|
7
|
+
exports.BackofficeGrantItemResponse = BackofficeGrantItemResponse;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GrantResponse } from '../responses/GrantResponse';
|
|
2
|
+
import { BackofficeGrantItemResponse } from './BackofficeGrantItemResponse';
|
|
3
|
+
/** Sin `directoryName`: Directory no trae un campo de nombre confiable (Q2). Sin `requestSnapshot`/`providerResponse` (R2). */
|
|
4
|
+
export declare class BackofficeGrantResponse extends GrantResponse {
|
|
5
|
+
packageName?: string;
|
|
6
|
+
items: BackofficeGrantItemResponse[];
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BackofficeGrantResponse = void 0;
|
|
4
|
+
const GrantResponse_1 = require("../responses/GrantResponse");
|
|
5
|
+
/** Sin `directoryName`: Directory no trae un campo de nombre confiable (Q2). Sin `requestSnapshot`/`providerResponse` (R2). */
|
|
6
|
+
class BackofficeGrantResponse extends GrantResponse_1.GrantResponse {
|
|
7
|
+
}
|
|
8
|
+
exports.BackofficeGrantResponse = BackofficeGrantResponse;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RewardChargeTo } from '../RewardChargeTo';
|
|
2
|
+
import { RewardCost } from '../RewardCost';
|
|
3
|
+
/** Un cargo = un ítem que quedó GRANTED, con el costo CONGELADO en la entrega (no el actual del catálogo). Sin `source` (R4 lo guarda, no se expone). */
|
|
4
|
+
export declare class ChargeRecord {
|
|
5
|
+
grantId: string;
|
|
6
|
+
itemKey: string;
|
|
7
|
+
/** Epoch en milisegundos (UTC). */
|
|
8
|
+
grantedAt: number;
|
|
9
|
+
directoryId: string;
|
|
10
|
+
catalogItemId: string;
|
|
11
|
+
catalogItemName: string;
|
|
12
|
+
campaignId?: string;
|
|
13
|
+
packageId: string;
|
|
14
|
+
cost: RewardCost;
|
|
15
|
+
chargeTo: RewardChargeTo;
|
|
16
|
+
externalRef?: Record<string, string>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChargeRecord = void 0;
|
|
4
|
+
/** Un cargo = un ítem que quedó GRANTED, con el costo CONGELADO en la entrega (no el actual del catálogo). Sin `source` (R4 lo guarda, no se expone). */
|
|
5
|
+
class ChargeRecord {
|
|
6
|
+
}
|
|
7
|
+
exports.ChargeRecord = ChargeRecord;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChargesExportQuery = void 0;
|
|
4
|
+
/** Query params ya validados de `GET /charges/export`. `month` = `AAAA-MM` UTC. */
|
|
5
|
+
class ChargesExportQuery {
|
|
6
|
+
}
|
|
7
|
+
exports.ChargesExportQuery = ChargesExportQuery;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CurrencyId } from '../../../currency';
|
|
2
|
+
/** Un punto de la serie diaria. `date` = `AAAA-MM-DD` UTC. `costGranted` = `costGrantedMinor / 100` (nunca se suman monedas distintas). */
|
|
3
|
+
export declare class DeliveryMetricsPoint {
|
|
4
|
+
date: string;
|
|
5
|
+
currency: CurrencyId;
|
|
6
|
+
granted: number;
|
|
7
|
+
failed: number;
|
|
8
|
+
skipped: number;
|
|
9
|
+
grantsCompleted: number;
|
|
10
|
+
grantsPartial: number;
|
|
11
|
+
grantsFailed: number;
|
|
12
|
+
costGranted: number;
|
|
13
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeliveryMetricsPoint = void 0;
|
|
4
|
+
/** Un punto de la serie diaria. `date` = `AAAA-MM-DD` UTC. `costGranted` = `costGrantedMinor / 100` (nunca se suman monedas distintas). */
|
|
5
|
+
class DeliveryMetricsPoint {
|
|
6
|
+
}
|
|
7
|
+
exports.DeliveryMetricsPoint = DeliveryMetricsPoint;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CurrencyId } from '../../../currency';
|
|
2
|
+
/** Query params ya validados de `GET /metrics/deliveries`. `dimension` es un `DeliveryDimensionEnum` o `TAG#campaignId|TAG#evaluationId`. `from`/`to` = `AAAA-MM-DD` UTC. */
|
|
3
|
+
export declare class DeliveryMetricsQuery {
|
|
4
|
+
dimension: string;
|
|
5
|
+
value?: string;
|
|
6
|
+
from: string;
|
|
7
|
+
to: string;
|
|
8
|
+
currency?: CurrencyId;
|
|
9
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeliveryMetricsQuery = void 0;
|
|
4
|
+
/** Query params ya validados de `GET /metrics/deliveries`. `dimension` es un `DeliveryDimensionEnum` o `TAG#campaignId|TAG#evaluationId`. `from`/`to` = `AAAA-MM-DD` UTC. */
|
|
5
|
+
class DeliveryMetricsQuery {
|
|
6
|
+
}
|
|
7
|
+
exports.DeliveryMetricsQuery = DeliveryMetricsQuery;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ItemErrorCategoryEnum } from '../../enums/ItemErrorCategoryEnum';
|
|
2
|
+
import { RewardCost } from '../RewardCost';
|
|
3
|
+
/** Una fila del top de métricas. `errors` solo viene en la dimensión `CATALOG_ITEM`. */
|
|
4
|
+
export declare class DeliveryTopEntry {
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
granted: number;
|
|
8
|
+
failed: number;
|
|
9
|
+
skipped: number;
|
|
10
|
+
/** Un costo por moneda; las monedas no se suman entre sí. */
|
|
11
|
+
cost: RewardCost[];
|
|
12
|
+
errors?: {
|
|
13
|
+
category: ItemErrorCategoryEnum;
|
|
14
|
+
count: number;
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeliveryTopEntry = void 0;
|
|
4
|
+
/** Una fila del top de métricas. `errors` solo viene en la dimensión `CATALOG_ITEM`. */
|
|
5
|
+
class DeliveryTopEntry {
|
|
6
|
+
}
|
|
7
|
+
exports.DeliveryTopEntry = DeliveryTopEntry;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CurrencyId } from '../../../currency';
|
|
2
|
+
import { DeliveryTopByEnum } from '../../enums/DeliveryTopByEnum';
|
|
3
|
+
import { DeliveryTopDimensionEnum } from '../../enums/DeliveryTopDimensionEnum';
|
|
4
|
+
/** Query params ya validados de `GET /metrics/deliveries/top`. `from`/`to` = `AAAA-MM-DD` UTC. */
|
|
5
|
+
export declare class DeliveryTopQuery {
|
|
6
|
+
dimension: DeliveryTopDimensionEnum;
|
|
7
|
+
from: string;
|
|
8
|
+
to: string;
|
|
9
|
+
by: DeliveryTopByEnum;
|
|
10
|
+
currency?: CurrencyId;
|
|
11
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeliveryTopQuery = void 0;
|
|
4
|
+
/** Query params ya validados de `GET /metrics/deliveries/top`. `from`/`to` = `AAAA-MM-DD` UTC. */
|
|
5
|
+
class DeliveryTopQuery {
|
|
6
|
+
}
|
|
7
|
+
exports.DeliveryTopQuery = DeliveryTopQuery;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ItemErrorCategoryEnum } from '../../enums/ItemErrorCategoryEnum';
|
|
2
|
+
/** Query params ya validados de `GET /grants` y `GET /grants/export` (el lambda los valida; ver `GrantListQueryHelper`). */
|
|
3
|
+
export declare class GrantListQuery {
|
|
4
|
+
limit?: number;
|
|
5
|
+
cursor?: string;
|
|
6
|
+
/** Uno o varios `GrantStatusEnum` separados por coma. */
|
|
7
|
+
status?: string;
|
|
8
|
+
packageId?: string;
|
|
9
|
+
campaignId?: string;
|
|
10
|
+
service?: string;
|
|
11
|
+
partnerId?: string;
|
|
12
|
+
directoryId?: string;
|
|
13
|
+
/** Coincide con un `id` de entrega; si no, se trata como `directoryId`. Sin búsqueda por nombre. */
|
|
14
|
+
search?: string;
|
|
15
|
+
/** `AAAA-MM-DD` UTC, inclusivos. Default: `to` = hoy, `from` = `to − 6`. Máximo 92 días. */
|
|
16
|
+
from?: string;
|
|
17
|
+
to?: string;
|
|
18
|
+
/** Entregas que contienen esta recompensa del catálogo (D-F1). */
|
|
19
|
+
catalogItemId?: string;
|
|
20
|
+
/** Entregas con al menos un ítem FAILED cuyo último intento falló con esta categoría (D-F1). */
|
|
21
|
+
errorCategory?: ItemErrorCategoryEnum;
|
|
22
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GrantListQuery = void 0;
|
|
4
|
+
/** Query params ya validados de `GET /grants` y `GET /grants/export` (el lambda los valida; ver `GrantListQueryHelper`). */
|
|
5
|
+
class GrantListQuery {
|
|
6
|
+
}
|
|
7
|
+
exports.GrantListQuery = GrantListQuery;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
2
|
+
/** Crear (POST) o reemplazar (PUT) un aliado. `version` y `updatedBy` los pone el servidor. El `id` lo genera el front del nombre. */
|
|
3
|
+
export declare class PartnerRequest {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
status: RewardStatusEnum;
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PartnerRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const BackofficeLimits_1 = require("../../constants/BackofficeLimits");
|
|
16
|
+
const RewardStatusEnum_1 = require("../../enums/RewardStatusEnum");
|
|
17
|
+
/** Crear (POST) o reemplazar (PUT) un aliado. `version` y `updatedBy` los pone el servidor. El `id` lo genera el front del nombre. */
|
|
18
|
+
class PartnerRequest {
|
|
19
|
+
}
|
|
20
|
+
exports.PartnerRequest = PartnerRequest;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, class_transformer_1.Expose)(),
|
|
23
|
+
(0, class_validator_1.IsString)(),
|
|
24
|
+
(0, class_validator_1.Matches)(BackofficeLimits_1.REWARD_ID_PATTERN),
|
|
25
|
+
__metadata("design:type", String)
|
|
26
|
+
], PartnerRequest.prototype, "id", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, class_transformer_1.Expose)(),
|
|
29
|
+
(0, class_validator_1.IsString)(),
|
|
30
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
31
|
+
(0, class_validator_1.MaxLength)(120),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], PartnerRequest.prototype, "name", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_transformer_1.Expose)(),
|
|
36
|
+
(0, class_validator_1.IsEnum)(RewardStatusEnum_1.RewardStatusEnum),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], PartnerRequest.prototype, "status", void 0);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
2
|
+
export declare class PartnerResponse {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
status: RewardStatusEnum;
|
|
6
|
+
version: number;
|
|
7
|
+
/** Epoch en milisegundos. */
|
|
8
|
+
createdAt: number;
|
|
9
|
+
updatedAt: number;
|
|
10
|
+
updatedBy: string;
|
|
11
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RewardCost } from '../RewardCost';
|
|
2
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
3
|
+
/** Un aliado con sus recompensas cobradas y el valor entregado en el rango (`GET /partners/summary`). */
|
|
4
|
+
export declare class PartnerSummary {
|
|
5
|
+
partnerId: string;
|
|
6
|
+
partnerName: string;
|
|
7
|
+
status: RewardStatusEnum;
|
|
8
|
+
/** Recompensas del catálogo que se le cobran a este aliado. */
|
|
9
|
+
catalogItemIds: string[];
|
|
10
|
+
/** Valor entregado en el rango, POR MONEDA (nunca se mezclan). Vacío si no hubo entregas. */
|
|
11
|
+
delivered: RewardCost[];
|
|
12
|
+
}
|