@fiado/type-kit 3.544.0 → 3.545.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/loanCredit/devicePostureBackfillDtos.test.ts +39 -0
- package/_test_/unit/loanCredit/reconcileModeDtos.test.ts +48 -0
- package/_test_/unit/mdm/dtos/deviceStatusLockSchedule.test.ts +46 -0
- package/bin/loanCredit/dtos/requests/RunDevicePostureBackfillRequest.d.ts +9 -0
- package/bin/loanCredit/dtos/requests/RunDevicePostureBackfillRequest.js +42 -0
- package/bin/loanCredit/dtos/requests/UpdateReconcileModeRequest.d.ts +9 -0
- package/bin/loanCredit/dtos/requests/UpdateReconcileModeRequest.js +42 -0
- package/bin/loanCredit/dtos/responses/DevicePostureBackfillResult.d.ts +12 -0
- package/bin/loanCredit/dtos/responses/DevicePostureBackfillResult.js +2 -0
- package/bin/loanCredit/dtos/responses/ReconcileModeView.d.ts +11 -0
- package/bin/loanCredit/dtos/responses/ReconcileModeView.js +2 -0
- package/bin/loanCredit/enums/ReconcileModeEnum.d.ts +5 -0
- package/bin/loanCredit/enums/ReconcileModeEnum.js +9 -0
- package/bin/loanCredit/index.d.ts +5 -0
- package/bin/loanCredit/index.js +6 -0
- package/bin/mdm/dtos/DeviceStatusResponse.d.ts +4 -0
- package/package.json +1 -1
- package/src/loanCredit/dtos/requests/RunDevicePostureBackfillRequest.ts +27 -0
- package/src/loanCredit/dtos/requests/UpdateReconcileModeRequest.ts +26 -0
- package/src/loanCredit/dtos/responses/DevicePostureBackfillResult.ts +12 -0
- package/src/loanCredit/dtos/responses/ReconcileModeView.ts +12 -0
- package/src/loanCredit/enums/ReconcileModeEnum.ts +5 -0
- package/src/loanCredit/index.ts +7 -0
- package/src/mdm/dtos/DeviceStatusResponse.ts +4 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { DevicePostureBackfillResult, RunDevicePostureBackfillRequest } from '../../../src/loanCredit/index';
|
|
5
|
+
|
|
6
|
+
const valid = { dryRun: true, requestedBy: 'andres@somosfiado.com', reason: 'F3: backfill en prod' };
|
|
7
|
+
|
|
8
|
+
describe('RunDevicePostureBackfillRequest', () => {
|
|
9
|
+
it('valida el dry-run y la corrida real', async () => {
|
|
10
|
+
for (const dryRun of [true, false]) {
|
|
11
|
+
expect(await validate(plainToInstance(RunDevicePostureBackfillRequest, { ...valid, dryRun }))).toEqual([]);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('dryRun es obligatorio y booleano: no se infiere una corrida real', async () => {
|
|
16
|
+
const missing = await validate(plainToInstance(RunDevicePostureBackfillRequest, { requestedBy: valid.requestedBy, reason: valid.reason }));
|
|
17
|
+
const text = await validate(plainToInstance(RunDevicePostureBackfillRequest, { ...valid, dryRun: 'false' }));
|
|
18
|
+
expect(missing.map(e => e.property)).toContain('dryRun');
|
|
19
|
+
expect(text.map(e => e.property)).toContain('dryRun');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('acepta el cursor de la página anterior', async () => {
|
|
23
|
+
expect(await validate(plainToInstance(RunDevicePostureBackfillRequest, { ...valid, cursor: 'eyJwayI6IkNSRURJVCMxIn0' }))).toEqual([]);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe('DevicePostureBackfillResult', () => {
|
|
28
|
+
it('reporta lo contado y lo escrito por separado', () => {
|
|
29
|
+
const result: DevicePostureBackfillResult = {
|
|
30
|
+
dryRun: true,
|
|
31
|
+
devicesScanned: 120,
|
|
32
|
+
wouldWrite: 5,
|
|
33
|
+
written: 0,
|
|
34
|
+
skippedByCondition: 0,
|
|
35
|
+
nextCursor: 'eyJwayI6IkNSRURJVCMyIn0',
|
|
36
|
+
};
|
|
37
|
+
expect(result.written).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import {
|
|
5
|
+
ReconcileModeEnum,
|
|
6
|
+
ReconcileModeView,
|
|
7
|
+
UpdateReconcileModeRequest,
|
|
8
|
+
} from '../../../src/loanCredit/index';
|
|
9
|
+
import { MdmProviderEnum } from '../../../src/mdm/enums/MdmProviderEnum';
|
|
10
|
+
|
|
11
|
+
const validUpdate = { mode: 'ACT', expectedVersion: 0, reason: 'T3 aprobada', requestedBy: 'andres@somosfiado.com' };
|
|
12
|
+
|
|
13
|
+
describe('UpdateReconcileModeRequest', () => {
|
|
14
|
+
it('valida OBSERVE y ACT', async () => {
|
|
15
|
+
for (const mode of [ReconcileModeEnum.OBSERVE, ReconcileModeEnum.ACT]) {
|
|
16
|
+
const errors = await validate(plainToInstance(UpdateReconcileModeRequest, { ...validUpdate, mode }));
|
|
17
|
+
expect(errors).toEqual([]);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('rechaza un modo fuera del enum', async () => {
|
|
22
|
+
const errors = await validate(plainToInstance(UpdateReconcileModeRequest, { ...validUpdate, mode: 'SHADOW' }));
|
|
23
|
+
expect(errors.map(e => e.property)).toContain('mode');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('exige expectedVersion entero ≥ 0: con 0 se crea la fila', async () => {
|
|
27
|
+
const negative = await validate(plainToInstance(UpdateReconcileModeRequest, { ...validUpdate, expectedVersion: -1 }));
|
|
28
|
+
const missing = await validate(plainToInstance(UpdateReconcileModeRequest, { mode: 'ACT', reason: 'x', requestedBy: 'a@b.mx' }));
|
|
29
|
+
expect(negative.map(e => e.property)).toContain('expectedVersion');
|
|
30
|
+
expect(missing.map(e => e.property)).toContain('expectedVersion');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('exige quién lo pide y por qué', async () => {
|
|
34
|
+
const errors = await validate(plainToInstance(UpdateReconcileModeRequest, { mode: 'ACT', expectedVersion: 0 }));
|
|
35
|
+
expect(errors.map(e => e.property).sort()).toEqual(['reason', 'requestedBy']);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('ReconcileModeView', () => {
|
|
40
|
+
it('describe el modo vigente de un proveedor', () => {
|
|
41
|
+
const view: ReconcileModeView = {
|
|
42
|
+
provider: MdmProviderEnum.TRUSTONIC,
|
|
43
|
+
mode: ReconcileModeEnum.OBSERVE,
|
|
44
|
+
version: 0,
|
|
45
|
+
};
|
|
46
|
+
expect(view.mode).toBe('OBSERVE');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { DeviceStatusResponse } from '../../../../src/mdm/dtos/DeviceStatusResponse';
|
|
3
|
+
import { MdmErrorCodeEnum } from '../../../../src/mdm/enums/MdmErrorCodeEnum';
|
|
4
|
+
import { MdmOperationStatusEnum } from '../../../../src/mdm/enums/MdmOperationStatusEnum';
|
|
5
|
+
import * as MdmBarrel from '../../../../src/mdm/index';
|
|
6
|
+
|
|
7
|
+
describe('DeviceStatusResponse — corte del proveedor', () => {
|
|
8
|
+
it('distingue «el proveedor tiene corte» de «el proveedor dice que no hay»', () => {
|
|
9
|
+
const withCut: DeviceStatusResponse = {
|
|
10
|
+
imei: '356253241262026',
|
|
11
|
+
status: MdmOperationStatusEnum.SUCCESS,
|
|
12
|
+
lockScheduledFor: '2026-10-23T05:59:59.000Z',
|
|
13
|
+
};
|
|
14
|
+
const withoutCut: DeviceStatusResponse = {
|
|
15
|
+
imei: '356253241262026',
|
|
16
|
+
status: MdmOperationStatusEnum.SUCCESS,
|
|
17
|
+
lockScheduledFor: null,
|
|
18
|
+
};
|
|
19
|
+
expect(withCut.lockScheduledFor).toBe('2026-10-23T05:59:59.000Z');
|
|
20
|
+
expect(withoutCut.lockScheduledFor).toBeNull();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('el corte ilegible viaja en su propio campo y no toca el error del ítem', () => {
|
|
24
|
+
const unreadable: DeviceStatusResponse = {
|
|
25
|
+
imei: '352999000000023',
|
|
26
|
+
status: MdmOperationStatusEnum.SUCCESS,
|
|
27
|
+
lockScheduleReadError: {
|
|
28
|
+
code: MdmErrorCodeEnum.PROVIDER_NOT_SUPPORTED,
|
|
29
|
+
message: 'El proveedor no permite leer el corte por IMEI',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
expect(unreadable.error).toBeUndefined();
|
|
33
|
+
expect(unreadable.lockScheduledFor).toBeUndefined();
|
|
34
|
+
expect(unreadable.lockScheduleReadError?.code).toBe(MdmErrorCodeEnum.PROVIDER_NOT_SUPPORTED);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('el connector viejo no manda ninguno de los dos campos', () => {
|
|
38
|
+
const legacy: DeviceStatusResponse = { imei: '1', status: MdmOperationStatusEnum.SUCCESS };
|
|
39
|
+
expect('lockScheduledFor' in legacy).toBe(false);
|
|
40
|
+
expect('lockScheduleReadError' in legacy).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('sale por el barrel de mdm', () => {
|
|
44
|
+
expect(MdmBarrel.DeviceStatusResponse).toBeDefined();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Body de `POST /private/device-posture/backfill` (loan-credit-business). */
|
|
2
|
+
export declare class RunDevicePostureBackfillRequest {
|
|
3
|
+
/** `true` sólo cuenta lo que escribiría; `false` escribe. Nunca se infiere. */
|
|
4
|
+
dryRun: boolean;
|
|
5
|
+
requestedBy: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
/** `nextCursor` de la corrida anterior, para seguir donde cortó por presupuesto. */
|
|
8
|
+
cursor?: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
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.RunDevicePostureBackfillRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
/** Body de `POST /private/device-posture/backfill` (loan-credit-business). */
|
|
16
|
+
class RunDevicePostureBackfillRequest {
|
|
17
|
+
}
|
|
18
|
+
exports.RunDevicePostureBackfillRequest = RunDevicePostureBackfillRequest;
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, class_transformer_1.Expose)(),
|
|
21
|
+
(0, class_validator_1.IsBoolean)(),
|
|
22
|
+
__metadata("design:type", Boolean)
|
|
23
|
+
], RunDevicePostureBackfillRequest.prototype, "dryRun", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, class_transformer_1.Expose)(),
|
|
26
|
+
(0, class_validator_1.IsEmail)(),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], RunDevicePostureBackfillRequest.prototype, "requestedBy", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, class_transformer_1.Expose)(),
|
|
31
|
+
(0, class_validator_1.IsString)(),
|
|
32
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
33
|
+
(0, class_validator_1.MaxLength)(300),
|
|
34
|
+
__metadata("design:type", String)
|
|
35
|
+
], RunDevicePostureBackfillRequest.prototype, "reason", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, class_transformer_1.Expose)(),
|
|
38
|
+
(0, class_validator_1.IsOptional)(),
|
|
39
|
+
(0, class_validator_1.IsString)(),
|
|
40
|
+
(0, class_validator_1.MaxLength)(2048),
|
|
41
|
+
__metadata("design:type", String)
|
|
42
|
+
], RunDevicePostureBackfillRequest.prototype, "cursor", void 0);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ReconcileModeEnum } from '../../enums/ReconcileModeEnum';
|
|
2
|
+
/** Body de `PUT /private/reconcile-modes/:provider` (loan-credit-business). */
|
|
3
|
+
export declare class UpdateReconcileModeRequest {
|
|
4
|
+
mode: ReconcileModeEnum;
|
|
5
|
+
/** Versión que el cliente leyó con el GET; 0 cuando la fila todavía no existe. */
|
|
6
|
+
expectedVersion: number;
|
|
7
|
+
reason: string;
|
|
8
|
+
requestedBy: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
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.UpdateReconcileModeRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const ReconcileModeEnum_1 = require("../../enums/ReconcileModeEnum");
|
|
16
|
+
/** Body de `PUT /private/reconcile-modes/:provider` (loan-credit-business). */
|
|
17
|
+
class UpdateReconcileModeRequest {
|
|
18
|
+
}
|
|
19
|
+
exports.UpdateReconcileModeRequest = UpdateReconcileModeRequest;
|
|
20
|
+
__decorate([
|
|
21
|
+
(0, class_transformer_1.Expose)(),
|
|
22
|
+
(0, class_validator_1.IsEnum)(ReconcileModeEnum_1.ReconcileModeEnum),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], UpdateReconcileModeRequest.prototype, "mode", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_transformer_1.Expose)(),
|
|
27
|
+
(0, class_validator_1.IsInt)(),
|
|
28
|
+
(0, class_validator_1.Min)(0),
|
|
29
|
+
__metadata("design:type", Number)
|
|
30
|
+
], UpdateReconcileModeRequest.prototype, "expectedVersion", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, class_transformer_1.Expose)(),
|
|
33
|
+
(0, class_validator_1.IsString)(),
|
|
34
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
35
|
+
(0, class_validator_1.MaxLength)(300),
|
|
36
|
+
__metadata("design:type", String)
|
|
37
|
+
], UpdateReconcileModeRequest.prototype, "reason", void 0);
|
|
38
|
+
__decorate([
|
|
39
|
+
(0, class_transformer_1.Expose)(),
|
|
40
|
+
(0, class_validator_1.IsEmail)(),
|
|
41
|
+
__metadata("design:type", String)
|
|
42
|
+
], UpdateReconcileModeRequest.prototype, "requestedBy", void 0);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Resultado de una página del backfill. Sin `nextCursor`, la flota ya se recorrió completa. */
|
|
2
|
+
export interface DevicePostureBackfillResult {
|
|
3
|
+
dryRun: boolean;
|
|
4
|
+
devicesScanned: number;
|
|
5
|
+
/** Intenciones manuales y prórrogas que faltan en el expediente. */
|
|
6
|
+
wouldWrite: number;
|
|
7
|
+
/** Siempre 0 en dry-run. */
|
|
8
|
+
written: number;
|
|
9
|
+
/** Escrituras que perdieron la condición (ya existía el campo o cambió la versión). */
|
|
10
|
+
skippedByCondition: number;
|
|
11
|
+
nextCursor?: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MdmProviderEnum } from '../../../mdm/enums/MdmProviderEnum';
|
|
2
|
+
import { ReconcileModeEnum } from '../../enums/ReconcileModeEnum';
|
|
3
|
+
/** Modo vigente del conciliador para un proveedor. Sin fila guardada: OBSERVE con versión 0. */
|
|
4
|
+
export interface ReconcileModeView {
|
|
5
|
+
provider: MdmProviderEnum;
|
|
6
|
+
mode: ReconcileModeEnum;
|
|
7
|
+
version: number;
|
|
8
|
+
updatedBy?: string;
|
|
9
|
+
updatedAt?: string;
|
|
10
|
+
reason?: string;
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReconcileModeEnum = void 0;
|
|
4
|
+
/** Modo del conciliador del corte, por proveedor: sólo calcula (OBSERVE) o también decide (ACT). */
|
|
5
|
+
var ReconcileModeEnum;
|
|
6
|
+
(function (ReconcileModeEnum) {
|
|
7
|
+
ReconcileModeEnum["OBSERVE"] = "OBSERVE";
|
|
8
|
+
ReconcileModeEnum["ACT"] = "ACT";
|
|
9
|
+
})(ReconcileModeEnum || (exports.ReconcileModeEnum = ReconcileModeEnum = {}));
|
|
@@ -160,3 +160,8 @@ export * from './dtos/responses/SellerPaymentOptions';
|
|
|
160
160
|
export * from './dtos/responses/SellerCreditLookupResult';
|
|
161
161
|
export * from './dtos/responses/InStorePaymentListItem';
|
|
162
162
|
export * from './dtos/responses/CreditCustomerListItem';
|
|
163
|
+
export * from './enums/ReconcileModeEnum';
|
|
164
|
+
export * from './dtos/requests/UpdateReconcileModeRequest';
|
|
165
|
+
export * from './dtos/responses/ReconcileModeView';
|
|
166
|
+
export * from './dtos/requests/RunDevicePostureBackfillRequest';
|
|
167
|
+
export * from './dtos/responses/DevicePostureBackfillResult';
|
package/bin/loanCredit/index.js
CHANGED
|
@@ -204,3 +204,9 @@ __exportStar(require("./dtos/responses/SellerPaymentOptions"), exports);
|
|
|
204
204
|
__exportStar(require("./dtos/responses/SellerCreditLookupResult"), exports);
|
|
205
205
|
__exportStar(require("./dtos/responses/InStorePaymentListItem"), exports);
|
|
206
206
|
__exportStar(require("./dtos/responses/CreditCustomerListItem"), exports);
|
|
207
|
+
// Conciliador del corte MDM: modo por proveedor y backfill
|
|
208
|
+
__exportStar(require("./enums/ReconcileModeEnum"), exports);
|
|
209
|
+
__exportStar(require("./dtos/requests/UpdateReconcileModeRequest"), exports);
|
|
210
|
+
__exportStar(require("./dtos/responses/ReconcileModeView"), exports);
|
|
211
|
+
__exportStar(require("./dtos/requests/RunDevicePostureBackfillRequest"), exports);
|
|
212
|
+
__exportStar(require("./dtos/responses/DevicePostureBackfillResult"), exports);
|
|
@@ -11,5 +11,9 @@ export declare class DeviceStatusResponse {
|
|
|
11
11
|
lastSeenAt?: string;
|
|
12
12
|
lastTransition?: string;
|
|
13
13
|
enrolledAt?: string;
|
|
14
|
+
/** Corte que el proveedor tiene armado (ISO-8601). `null`: el proveedor dice que no hay corte. */
|
|
15
|
+
lockScheduledFor?: string | null;
|
|
16
|
+
/** No se pudo leer el corte; el `error` del ítem sigue hablando sólo del estado del equipo. */
|
|
17
|
+
lockScheduleReadError?: MdmError;
|
|
14
18
|
error?: MdmError;
|
|
15
19
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsBoolean, IsEmail, IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
/** Body de `POST /private/device-posture/backfill` (loan-credit-business). */
|
|
5
|
+
export class RunDevicePostureBackfillRequest {
|
|
6
|
+
/** `true` sólo cuenta lo que escribiría; `false` escribe. Nunca se infiere. */
|
|
7
|
+
@Expose()
|
|
8
|
+
@IsBoolean()
|
|
9
|
+
dryRun!: boolean;
|
|
10
|
+
|
|
11
|
+
@Expose()
|
|
12
|
+
@IsEmail()
|
|
13
|
+
requestedBy!: string;
|
|
14
|
+
|
|
15
|
+
@Expose()
|
|
16
|
+
@IsString()
|
|
17
|
+
@IsNotEmpty()
|
|
18
|
+
@MaxLength(300)
|
|
19
|
+
reason!: string;
|
|
20
|
+
|
|
21
|
+
/** `nextCursor` de la corrida anterior, para seguir donde cortó por presupuesto. */
|
|
22
|
+
@Expose()
|
|
23
|
+
@IsOptional()
|
|
24
|
+
@IsString()
|
|
25
|
+
@MaxLength(2048)
|
|
26
|
+
cursor?: string;
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsEmail, IsEnum, IsInt, IsNotEmpty, IsString, MaxLength, Min } from 'class-validator';
|
|
3
|
+
import { ReconcileModeEnum } from '../../enums/ReconcileModeEnum';
|
|
4
|
+
|
|
5
|
+
/** Body de `PUT /private/reconcile-modes/:provider` (loan-credit-business). */
|
|
6
|
+
export class UpdateReconcileModeRequest {
|
|
7
|
+
@Expose()
|
|
8
|
+
@IsEnum(ReconcileModeEnum)
|
|
9
|
+
mode!: ReconcileModeEnum;
|
|
10
|
+
|
|
11
|
+
/** Versión que el cliente leyó con el GET; 0 cuando la fila todavía no existe. */
|
|
12
|
+
@Expose()
|
|
13
|
+
@IsInt()
|
|
14
|
+
@Min(0)
|
|
15
|
+
expectedVersion!: number;
|
|
16
|
+
|
|
17
|
+
@Expose()
|
|
18
|
+
@IsString()
|
|
19
|
+
@IsNotEmpty()
|
|
20
|
+
@MaxLength(300)
|
|
21
|
+
reason!: string;
|
|
22
|
+
|
|
23
|
+
@Expose()
|
|
24
|
+
@IsEmail()
|
|
25
|
+
requestedBy!: string;
|
|
26
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Resultado de una página del backfill. Sin `nextCursor`, la flota ya se recorrió completa. */
|
|
2
|
+
export interface DevicePostureBackfillResult {
|
|
3
|
+
dryRun: boolean;
|
|
4
|
+
devicesScanned: number;
|
|
5
|
+
/** Intenciones manuales y prórrogas que faltan en el expediente. */
|
|
6
|
+
wouldWrite: number;
|
|
7
|
+
/** Siempre 0 en dry-run. */
|
|
8
|
+
written: number;
|
|
9
|
+
/** Escrituras que perdieron la condición (ya existía el campo o cambió la versión). */
|
|
10
|
+
skippedByCondition: number;
|
|
11
|
+
nextCursor?: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MdmProviderEnum } from '../../../mdm/enums/MdmProviderEnum';
|
|
2
|
+
import { ReconcileModeEnum } from '../../enums/ReconcileModeEnum';
|
|
3
|
+
|
|
4
|
+
/** Modo vigente del conciliador para un proveedor. Sin fila guardada: OBSERVE con versión 0. */
|
|
5
|
+
export interface ReconcileModeView {
|
|
6
|
+
provider: MdmProviderEnum;
|
|
7
|
+
mode: ReconcileModeEnum;
|
|
8
|
+
version: number;
|
|
9
|
+
updatedBy?: string;
|
|
10
|
+
updatedAt?: string;
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
package/src/loanCredit/index.ts
CHANGED
|
@@ -188,3 +188,10 @@ export * from './dtos/responses/SellerPaymentOptions';
|
|
|
188
188
|
export * from './dtos/responses/SellerCreditLookupResult';
|
|
189
189
|
export * from './dtos/responses/InStorePaymentListItem';
|
|
190
190
|
export * from './dtos/responses/CreditCustomerListItem';
|
|
191
|
+
|
|
192
|
+
// Conciliador del corte MDM: modo por proveedor y backfill
|
|
193
|
+
export * from './enums/ReconcileModeEnum';
|
|
194
|
+
export * from './dtos/requests/UpdateReconcileModeRequest';
|
|
195
|
+
export * from './dtos/responses/ReconcileModeView';
|
|
196
|
+
export * from './dtos/requests/RunDevicePostureBackfillRequest';
|
|
197
|
+
export * from './dtos/responses/DevicePostureBackfillResult';
|
|
@@ -12,5 +12,9 @@ export class DeviceStatusResponse {
|
|
|
12
12
|
lastSeenAt?: string;
|
|
13
13
|
lastTransition?: string;
|
|
14
14
|
enrolledAt?: string;
|
|
15
|
+
/** Corte que el proveedor tiene armado (ISO-8601). `null`: el proveedor dice que no hay corte. */
|
|
16
|
+
lockScheduledFor?: string | null;
|
|
17
|
+
/** No se pudo leer el corte; el `error` del ítem sigue hablando sólo del estado del equipo. */
|
|
18
|
+
lockScheduleReadError?: MdmError;
|
|
15
19
|
error?: MdmError;
|
|
16
20
|
}
|