@fiado/type-kit 3.435.0 → 3.437.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/_test_/unit/loanConfig/recentParameterChanges.test.ts +91 -0
  2. package/bin/loanConfig/constants/RecentParameterChangesLimits.d.ts +4 -0
  3. package/bin/loanConfig/constants/RecentParameterChangesLimits.js +7 -0
  4. package/bin/loanConfig/dtos/requests/ListRecentParameterChangesRequest.d.ts +6 -0
  5. package/bin/loanConfig/dtos/requests/ListRecentParameterChangesRequest.js +37 -0
  6. package/bin/loanConfig/dtos/responses/ListRecentParameterChangesResponse.d.ts +12 -0
  7. package/bin/loanConfig/dtos/responses/ListRecentParameterChangesResponse.js +2 -0
  8. package/bin/loanConfig/dtos/responses/ParameterAuditEntry.d.ts +14 -0
  9. package/bin/loanConfig/dtos/responses/ParameterAuditEntry.js +2 -0
  10. package/bin/loanConfig/enums/ParameterTypeEnum.d.ts +3 -2
  11. package/bin/loanConfig/enums/ParameterTypeEnum.js +2 -1
  12. package/bin/loanConfig/index.d.ts +4 -0
  13. package/bin/loanConfig/index.js +5 -0
  14. package/bin/remittance/dtos/RemittanceBackofficeCancelCloseResponse.d.ts +5 -0
  15. package/bin/remittance/dtos/RemittanceBackofficeTransaction.d.ts +3 -0
  16. package/package.json +1 -1
  17. package/src/loanConfig/constants/RecentParameterChangesLimits.ts +5 -0
  18. package/src/loanConfig/dtos/requests/ListRecentParameterChangesRequest.ts +26 -0
  19. package/src/loanConfig/dtos/responses/ListRecentParameterChangesResponse.ts +14 -0
  20. package/src/loanConfig/dtos/responses/ParameterAuditEntry.ts +14 -0
  21. package/src/loanConfig/enums/ParameterTypeEnum.ts +2 -1
  22. package/src/loanConfig/index.ts +6 -0
  23. package/src/remittance/dtos/RemittanceBackofficeCancelCloseResponse.ts +5 -0
  24. package/src/remittance/dtos/RemittanceBackofficeTransaction.ts +3 -0
@@ -0,0 +1,91 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { ParameterTypeEnum } from '../../../src/loanConfig/enums/ParameterTypeEnum';
5
+ import type { ParameterAuditEntry } from '../../../src/loanConfig/dtos/responses/ParameterAuditEntry';
6
+ import type {
7
+ ListRecentParameterChangesResponse,
8
+ RecentParameterChange,
9
+ } from '../../../src/loanConfig/dtos/responses/ListRecentParameterChangesResponse';
10
+ import { ListRecentParameterChangesRequest } from '../../../src/loanConfig/dtos/requests/ListRecentParameterChangesRequest';
11
+ import {
12
+ RECENT_PARAMETER_CHANGES_MAX_DAYS,
13
+ RECENT_PARAMETER_CHANGES_MAX_LIMIT,
14
+ } from '../../../src/loanConfig/constants/RecentParameterChangesLimits';
15
+
16
+ /** Igual que `validateRequest` del lambda: sin `@Expose` la propiedad se descarta. */
17
+ const validateQuery = (query: object) => {
18
+ const dto = plainToInstance(ListRecentParameterChangesRequest, query, { excludeExtraneousValues: true });
19
+ return validate(dto, { whitelist: true, forbidNonWhitelisted: true }).then((errors) => ({ dto, errors }));
20
+ };
21
+
22
+ describe('ParameterTypeEnum', () => {
23
+ it('incluye FEATURE_FLAG como el paramType 15', () => {
24
+ expect(ParameterTypeEnum.FEATURE_FLAG).toBe('FEATURE_FLAG');
25
+ expect(Object.values(ParameterTypeEnum)).toHaveLength(15);
26
+ });
27
+ });
28
+
29
+ describe('ParameterAuditEntry', () => {
30
+ it('describe una fila del histórico sin ip', () => {
31
+ const entry: ParameterAuditEntry = {
32
+ at: '2026-09-15T18:30:00.000Z',
33
+ action: 'UPDATE',
34
+ fieldChanged: 'value',
35
+ oldValue: 'false',
36
+ newValue: 'true',
37
+ performedBy: 'sub-123',
38
+ reason: 'Piloto de bloqueo en tienda',
39
+ };
40
+ expect(Object.keys(entry)).not.toContain('ip');
41
+ });
42
+ });
43
+
44
+ describe('ListRecentParameterChangesRequest', () => {
45
+ it('acepta el query vacío: los defaults los pone el lambda', async () => {
46
+ const { dto, errors } = await validateQuery({});
47
+ expect(errors).toEqual([]);
48
+ expect(dto.days).toBeUndefined();
49
+ expect(dto.limit).toBeUndefined();
50
+ });
51
+
52
+ it('convierte days y limit que llegan como texto', async () => {
53
+ const { dto, errors } = await validateQuery({ days: '30', limit: '50' });
54
+ expect(errors).toEqual([]);
55
+ expect(dto.days).toBe(30);
56
+ expect(dto.limit).toBe(50);
57
+ });
58
+
59
+ it('los topes son 30 días y 50 filas', () => {
60
+ expect(RECENT_PARAMETER_CHANGES_MAX_DAYS).toBe(30);
61
+ expect(RECENT_PARAMETER_CHANGES_MAX_LIMIT).toBe(50);
62
+ });
63
+
64
+ it.each([['31'], ['0'], ['1.5'], ['abc']])('rechaza days=%s', async (days) => {
65
+ const { errors } = await validateQuery({ days });
66
+ expect(errors.some((error) => error.property === 'days')).toBe(true);
67
+ });
68
+
69
+ it.each([['51'], ['0'], ['-1'], ['x']])('rechaza limit=%s', async (limit) => {
70
+ const { errors } = await validateQuery({ limit });
71
+ expect(errors.some((error) => error.property === 'limit')).toBe(true);
72
+ });
73
+ });
74
+
75
+ describe('ListRecentParameterChangesResponse', () => {
76
+ it('cada cambio es una entrada del histórico más su paramType y key', () => {
77
+ const item: RecentParameterChange = {
78
+ at: '2026-09-15T18:30:00.000Z',
79
+ action: 'UPDATE',
80
+ fieldChanged: 'value',
81
+ oldValue: '300',
82
+ newValue: '240',
83
+ performedBy: 'sub-123',
84
+ reason: 'Ajuste del OTP del wizard',
85
+ paramType: ParameterTypeEnum.WIZARD,
86
+ key: 'otp_timeout_seconds',
87
+ };
88
+ const response: ListRecentParameterChangesResponse = { items: [item], totalInWindow: 7 };
89
+ expect(response.totalInWindow).toBeGreaterThanOrEqual(response.items.length);
90
+ });
91
+ });
@@ -0,0 +1,4 @@
1
+ /** Días máximos que cubre el feed de cambios recientes, hoy incluido. */
2
+ export declare const RECENT_PARAMETER_CHANGES_MAX_DAYS = 30;
3
+ /** Filas máximas que devuelve el feed en una llamada. */
4
+ export declare const RECENT_PARAMETER_CHANGES_MAX_LIMIT = 50;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RECENT_PARAMETER_CHANGES_MAX_LIMIT = exports.RECENT_PARAMETER_CHANGES_MAX_DAYS = void 0;
4
+ /** Días máximos que cubre el feed de cambios recientes, hoy incluido. */
5
+ exports.RECENT_PARAMETER_CHANGES_MAX_DAYS = 30;
6
+ /** Filas máximas que devuelve el feed en una llamada. */
7
+ exports.RECENT_PARAMETER_CHANGES_MAX_LIMIT = 50;
@@ -0,0 +1,6 @@
1
+ /** Query de `GET /public/parameters/audit/recent`. Sin valores, el lambda pone sus defaults. */
2
+ export declare class ListRecentParameterChangesRequest {
3
+ /** Días hacia atrás que cubre la ventana, hoy incluido (días UTC). */
4
+ days?: number;
5
+ limit?: number;
6
+ }
@@ -0,0 +1,37 @@
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.ListRecentParameterChangesRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const RecentParameterChangesLimits_1 = require("../../constants/RecentParameterChangesLimits");
16
+ /** Query de `GET /public/parameters/audit/recent`. Sin valores, el lambda pone sus defaults. */
17
+ class ListRecentParameterChangesRequest {
18
+ }
19
+ exports.ListRecentParameterChangesRequest = ListRecentParameterChangesRequest;
20
+ __decorate([
21
+ (0, class_transformer_1.Expose)(),
22
+ (0, class_validator_1.IsOptional)(),
23
+ (0, class_transformer_1.Type)(() => Number),
24
+ (0, class_validator_1.IsInt)(),
25
+ (0, class_validator_1.Min)(1),
26
+ (0, class_validator_1.Max)(RecentParameterChangesLimits_1.RECENT_PARAMETER_CHANGES_MAX_DAYS),
27
+ __metadata("design:type", Number)
28
+ ], ListRecentParameterChangesRequest.prototype, "days", void 0);
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsOptional)(),
32
+ (0, class_transformer_1.Type)(() => Number),
33
+ (0, class_validator_1.IsInt)(),
34
+ (0, class_validator_1.Min)(1),
35
+ (0, class_validator_1.Max)(RecentParameterChangesLimits_1.RECENT_PARAMETER_CHANGES_MAX_LIMIT),
36
+ __metadata("design:type", Number)
37
+ ], ListRecentParameterChangesRequest.prototype, "limit", void 0);
@@ -0,0 +1,12 @@
1
+ import { ParameterTypeEnum } from '../../enums/ParameterTypeEnum';
2
+ import { ParameterAuditEntry } from './ParameterAuditEntry';
3
+ /** Un cambio del feed: la entrada del histórico más la llave del parámetro que cambió. */
4
+ export interface RecentParameterChange extends ParameterAuditEntry {
5
+ paramType: ParameterTypeEnum;
6
+ key: string;
7
+ }
8
+ /** Respuesta de `GET /public/parameters/audit/recent`. `totalInWindow` cuenta toda la ventana. */
9
+ export interface ListRecentParameterChangesResponse {
10
+ items: RecentParameterChange[];
11
+ totalInWindow: number;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Una fila del histórico de un parámetro. Sin `ip`; `performedBy` puede traer el correo del actor
3
+ * y solo lo lee quien tiene `loan.parameter.audit`.
4
+ */
5
+ export interface ParameterAuditEntry {
6
+ /** ISO del cambio. */
7
+ at: string;
8
+ action: 'CREATE' | 'UPDATE' | 'DELETE' | 'STATUS_CHANGE';
9
+ fieldChanged: string | null;
10
+ oldValue: string | null;
11
+ newValue: string | null;
12
+ performedBy: string;
13
+ reason: string | null;
14
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 = 14).
2
+ * Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 + FEATURE_FLAG = 15).
3
3
  * @enum {string}
4
4
  */
5
5
  export declare enum ParameterTypeEnum {
@@ -16,5 +16,6 @@ export declare enum ParameterTypeEnum {
16
16
  CROSS_BORDER = "CROSS_BORDER",
17
17
  WIZARD = "WIZARD",
18
18
  INTEGRATIONS = "INTEGRATIONS",
19
- SCORING = "SCORING"
19
+ SCORING = "SCORING",
20
+ FEATURE_FLAG = "FEATURE_FLAG"
20
21
  }
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ParameterTypeEnum = void 0;
4
4
  /**
5
- * Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 = 14).
5
+ * Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 + FEATURE_FLAG = 15).
6
6
  * @enum {string}
7
7
  */
8
8
  var ParameterTypeEnum;
@@ -21,4 +21,5 @@ var ParameterTypeEnum;
21
21
  ParameterTypeEnum["WIZARD"] = "WIZARD";
22
22
  ParameterTypeEnum["INTEGRATIONS"] = "INTEGRATIONS";
23
23
  ParameterTypeEnum["SCORING"] = "SCORING";
24
+ ParameterTypeEnum["FEATURE_FLAG"] = "FEATURE_FLAG";
24
25
  })(ParameterTypeEnum || (exports.ParameterTypeEnum = ParameterTypeEnum = {}));
@@ -1,7 +1,11 @@
1
1
  export * from './enums/ParameterTypeEnum';
2
2
  export * from './enums/ParameterValueTypeEnum';
3
+ export * from './constants/RecentParameterChangesLimits';
3
4
  export * from './dtos/Parameter';
4
5
  export * from './dtos/requests/UpdateParameterRequest';
5
6
  export * from './dtos/requests/BulkUpdateParametersRequest';
6
7
  export * from './dtos/requests/BulkGetParametersRequest';
8
+ export * from './dtos/requests/ListRecentParameterChangesRequest';
7
9
  export * from './dtos/responses/ParameterResponse';
10
+ export * from './dtos/responses/ParameterAuditEntry';
11
+ export * from './dtos/responses/ListRecentParameterChangesResponse';
@@ -16,11 +16,16 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./enums/ParameterTypeEnum"), exports);
18
18
  __exportStar(require("./enums/ParameterValueTypeEnum"), exports);
19
+ // Constants
20
+ __exportStar(require("./constants/RecentParameterChangesLimits"), exports);
19
21
  // Entity DTOs
20
22
  __exportStar(require("./dtos/Parameter"), exports);
21
23
  // Request DTOs
22
24
  __exportStar(require("./dtos/requests/UpdateParameterRequest"), exports);
23
25
  __exportStar(require("./dtos/requests/BulkUpdateParametersRequest"), exports);
24
26
  __exportStar(require("./dtos/requests/BulkGetParametersRequest"), exports);
27
+ __exportStar(require("./dtos/requests/ListRecentParameterChangesRequest"), exports);
25
28
  // Response DTOs
26
29
  __exportStar(require("./dtos/responses/ParameterResponse"), exports);
30
+ __exportStar(require("./dtos/responses/ParameterAuditEntry"), exports);
31
+ __exportStar(require("./dtos/responses/ListRecentParameterChangesResponse"), exports);
@@ -1,4 +1,5 @@
1
1
  import { RemittanceBackofficeTransaction } from "./RemittanceBackofficeTransaction";
2
+ import { RemittanceCancelOutcomeEnum } from "../enums/RemittanceCancelOutcomeEnum";
2
3
  /** Resultado del cierre manual: la tx fresca y qué pasos se ejecutaron en esta llamada. */
3
4
  export declare class RemittanceBackofficeCancelCloseResponse {
4
5
  transaction: RemittanceBackofficeTransaction;
@@ -7,4 +8,8 @@ export declare class RemittanceBackofficeCancelCloseResponse {
7
8
  credited: boolean;
8
9
  /** true si la tx ya estaba en estado final y no se hizo nada. */
9
10
  alreadyProcessed: boolean;
11
+ /** Desenlace que quedó en UniTeller (puede diferir del elegido por ops). */
12
+ appliedOutcome?: RemittanceCancelOutcomeEnum;
13
+ /** true si UniTeller (o un reporte previo) cambió el desenlace elegido. */
14
+ corrected?: boolean;
10
15
  }
@@ -58,6 +58,9 @@ export declare class RemittanceBackofficeTransaction {
58
58
  cancelClosedBy?: string;
59
59
  cancelClosedAt?: string;
60
60
  cancelCloseNote?: string;
61
+ /** Intentos fallidos del cierre automático (cron); tras el tope queda para revisión manual. */
62
+ cancelAutoCloseAttempts?: number;
63
+ cancelAutoCloseLastError?: string;
61
64
  smsAlertCount?: number;
62
65
  createdAt: string;
63
66
  updatedAt: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.435.0",
3
+ "version": "3.437.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,5 @@
1
+ /** Días máximos que cubre el feed de cambios recientes, hoy incluido. */
2
+ export const RECENT_PARAMETER_CHANGES_MAX_DAYS = 30;
3
+
4
+ /** Filas máximas que devuelve el feed en una llamada. */
5
+ export const RECENT_PARAMETER_CHANGES_MAX_LIMIT = 50;
@@ -0,0 +1,26 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsInt, IsOptional, Max, Min } from 'class-validator';
3
+ import {
4
+ RECENT_PARAMETER_CHANGES_MAX_DAYS,
5
+ RECENT_PARAMETER_CHANGES_MAX_LIMIT,
6
+ } from '../../constants/RecentParameterChangesLimits';
7
+
8
+ /** Query de `GET /public/parameters/audit/recent`. Sin valores, el lambda pone sus defaults. */
9
+ export class ListRecentParameterChangesRequest {
10
+ /** Días hacia atrás que cubre la ventana, hoy incluido (días UTC). */
11
+ @Expose()
12
+ @IsOptional()
13
+ @Type(() => Number)
14
+ @IsInt()
15
+ @Min(1)
16
+ @Max(RECENT_PARAMETER_CHANGES_MAX_DAYS)
17
+ days?: number;
18
+
19
+ @Expose()
20
+ @IsOptional()
21
+ @Type(() => Number)
22
+ @IsInt()
23
+ @Min(1)
24
+ @Max(RECENT_PARAMETER_CHANGES_MAX_LIMIT)
25
+ limit?: number;
26
+ }
@@ -0,0 +1,14 @@
1
+ import { ParameterTypeEnum } from '../../enums/ParameterTypeEnum';
2
+ import { ParameterAuditEntry } from './ParameterAuditEntry';
3
+
4
+ /** Un cambio del feed: la entrada del histórico más la llave del parámetro que cambió. */
5
+ export interface RecentParameterChange extends ParameterAuditEntry {
6
+ paramType: ParameterTypeEnum;
7
+ key: string;
8
+ }
9
+
10
+ /** Respuesta de `GET /public/parameters/audit/recent`. `totalInWindow` cuenta toda la ventana. */
11
+ export interface ListRecentParameterChangesResponse {
12
+ items: RecentParameterChange[];
13
+ totalInWindow: number;
14
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Una fila del histórico de un parámetro. Sin `ip`; `performedBy` puede traer el correo del actor
3
+ * y solo lo lee quien tiene `loan.parameter.audit`.
4
+ */
5
+ export interface ParameterAuditEntry {
6
+ /** ISO del cambio. */
7
+ at: string;
8
+ action: 'CREATE' | 'UPDATE' | 'DELETE' | 'STATUS_CHANGE';
9
+ fieldChanged: string | null;
10
+ oldValue: string | null;
11
+ newValue: string | null;
12
+ performedBy: string;
13
+ reason: string | null;
14
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 = 14).
2
+ * Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 + FEATURE_FLAG = 15).
3
3
  * @enum {string}
4
4
  */
5
5
  export enum ParameterTypeEnum {
@@ -17,4 +17,5 @@ export enum ParameterTypeEnum {
17
17
  WIZARD = 'WIZARD',
18
18
  INTEGRATIONS = 'INTEGRATIONS',
19
19
  SCORING = 'SCORING',
20
+ FEATURE_FLAG = 'FEATURE_FLAG',
20
21
  }
@@ -1,6 +1,9 @@
1
1
  export * from './enums/ParameterTypeEnum';
2
2
  export * from './enums/ParameterValueTypeEnum';
3
3
 
4
+ // Constants
5
+ export * from './constants/RecentParameterChangesLimits';
6
+
4
7
  // Entity DTOs
5
8
  export * from './dtos/Parameter';
6
9
 
@@ -8,6 +11,9 @@ export * from './dtos/Parameter';
8
11
  export * from './dtos/requests/UpdateParameterRequest';
9
12
  export * from './dtos/requests/BulkUpdateParametersRequest';
10
13
  export * from './dtos/requests/BulkGetParametersRequest';
14
+ export * from './dtos/requests/ListRecentParameterChangesRequest';
11
15
 
12
16
  // Response DTOs
13
17
  export * from './dtos/responses/ParameterResponse';
18
+ export * from './dtos/responses/ParameterAuditEntry';
19
+ export * from './dtos/responses/ListRecentParameterChangesResponse';
@@ -1,4 +1,5 @@
1
1
  import { RemittanceBackofficeTransaction } from "./RemittanceBackofficeTransaction";
2
+ import { RemittanceCancelOutcomeEnum } from "../enums/RemittanceCancelOutcomeEnum";
2
3
 
3
4
  /** Resultado del cierre manual: la tx fresca y qué pasos se ejecutaron en esta llamada. */
4
5
  export class RemittanceBackofficeCancelCloseResponse {
@@ -8,4 +9,8 @@ export class RemittanceBackofficeCancelCloseResponse {
8
9
  credited!: boolean;
9
10
  /** true si la tx ya estaba en estado final y no se hizo nada. */
10
11
  alreadyProcessed!: boolean;
12
+ /** Desenlace que quedó en UniTeller (puede diferir del elegido por ops). */
13
+ appliedOutcome?: RemittanceCancelOutcomeEnum;
14
+ /** true si UniTeller (o un reporte previo) cambió el desenlace elegido. */
15
+ corrected?: boolean;
11
16
  }
@@ -59,6 +59,9 @@ export class RemittanceBackofficeTransaction {
59
59
  cancelClosedBy?: string;
60
60
  cancelClosedAt?: string;
61
61
  cancelCloseNote?: string;
62
+ /** Intentos fallidos del cierre automático (cron); tras el tope queda para revisión manual. */
63
+ cancelAutoCloseAttempts?: number;
64
+ cancelAutoCloseLastError?: string;
62
65
  smsAlertCount?: number;
63
66
  createdAt!: string;
64
67
  updatedAt!: string;