@fiado/type-kit 3.664.0 → 3.666.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/platformRbac/customerAccountDtos.test.ts +22 -4
- package/_test_/unit/transferNote/transferNoteConfigAndPrivate.test.ts +14 -0
- package/_test_/unit/transferNote/transferNoteRequests.test.ts +55 -0
- package/bin/platformRbac/dtos/EnsureCustomerAccountRequest.d.ts +6 -2
- package/bin/platformRbac/dtos/EnsureCustomerAccountRequest.js +12 -3
- package/bin/transferNote/constants/transferNoteValidation.d.ts +2 -0
- package/bin/transferNote/constants/transferNoteValidation.js +3 -1
- package/bin/transferNote/dtos/requests/PrivateTransferNoteRequests.d.ts +2 -2
- package/bin/transferNote/dtos/requests/PrivateTransferNoteRequests.js +1 -1
- package/bin/transferNote/dtos/requests/RetailerTransferNoteRequests.d.ts +2 -2
- package/bin/transferNote/dtos/requests/RetailerTransferNoteRequests.js +1 -1
- package/bin/transferNote/dtos/requests/TransferNoteQueries.d.ts +19 -2
- package/bin/transferNote/dtos/requests/TransferNoteQueries.js +48 -10
- package/bin/transferNote/dtos/requests/transferNoteRequestDecorators.d.ts +4 -0
- package/bin/transferNote/dtos/requests/transferNoteRequestDecorators.js +24 -0
- package/bin/transferNote/enums/TransferNoteDirectionEnum.d.ts +5 -0
- package/bin/transferNote/enums/TransferNoteDirectionEnum.js +9 -0
- package/bin/transferNote/index.d.ts +1 -0
- package/bin/transferNote/index.js +1 -0
- package/package.json +1 -1
- package/src/platformRbac/dtos/EnsureCustomerAccountRequest.ts +12 -3
- package/src/transferNote/constants/transferNoteValidation.ts +3 -0
- package/src/transferNote/dtos/requests/PrivateTransferNoteRequests.ts +2 -2
- package/src/transferNote/dtos/requests/RetailerTransferNoteRequests.ts +2 -2
- package/src/transferNote/dtos/requests/TransferNoteQueries.ts +39 -4
- package/src/transferNote/dtos/requests/transferNoteRequestDecorators.ts +26 -1
- package/src/transferNote/enums/TransferNoteDirectionEnum.ts +5 -0
- package/src/transferNote/index.ts +1 -0
|
@@ -9,9 +9,8 @@ import type { UserProfileResponse } from '../../../src/platformRbac/dtos/UserPro
|
|
|
9
9
|
|
|
10
10
|
const BODY = {
|
|
11
11
|
phone: '+525512345678',
|
|
12
|
-
retailCustomerId: 'customer-1',
|
|
13
|
-
directoryId: 'directory-1',
|
|
14
12
|
displayName: 'Ana Pérez',
|
|
13
|
+
externalId: 'customer-1',
|
|
15
14
|
createdBy: 'wizard',
|
|
16
15
|
};
|
|
17
16
|
|
|
@@ -21,11 +20,30 @@ const propertiesWithError = async (body: object): Promise<string[]> => {
|
|
|
21
20
|
};
|
|
22
21
|
|
|
23
22
|
describe('EnsureCustomerAccountRequest', () => {
|
|
24
|
-
it('valida el body
|
|
23
|
+
it('valida el body mínimo', async () => {
|
|
25
24
|
expect(await propertiesWithError(BODY)).toEqual([]);
|
|
26
25
|
});
|
|
27
26
|
|
|
28
|
-
it
|
|
27
|
+
it('valida el body con customFields y roleId', async () => {
|
|
28
|
+
const full = { ...BODY, customFields: { store: 'luga-01' }, roleId: 'role-1' };
|
|
29
|
+
expect(await propertiesWithError(full)).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it.each([{ store: 42 }, { store: null }, ['luga-01'], 'luga-01'])('rechaza customFields %p', async (customFields) => {
|
|
33
|
+
expect(await propertiesWithError({ ...BODY, customFields })).toEqual(['customFields']);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('rechaza roleId vacío cuando viene', async () => {
|
|
37
|
+
expect(await propertiesWithError({ ...BODY, roleId: '' })).toEqual(['roleId']);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('ya no expone los campos de SureKeep', () => {
|
|
41
|
+
const request = plainToInstance(EnsureCustomerAccountRequest, { ...BODY, retailCustomerId: 'c', directoryId: 'd' }, { excludeExtraneousValues: true });
|
|
42
|
+
expect(request).not.toHaveProperty('retailCustomerId');
|
|
43
|
+
expect(request).not.toHaveProperty('directoryId');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it.each(['externalId', 'displayName', 'createdBy'])('exige %s', async (field) => {
|
|
29
47
|
expect(await propertiesWithError({ ...BODY, [field]: '' })).toEqual([field]);
|
|
30
48
|
});
|
|
31
49
|
|
|
@@ -268,3 +268,17 @@ describe('cambio de configuración con doble control', () => {
|
|
|
268
268
|
expect(pendingChange.concept?.sign).toBe(TransferNoteConceptSignEnum.NEGATIVE);
|
|
269
269
|
});
|
|
270
270
|
});
|
|
271
|
+
|
|
272
|
+
describe('PrivateListTransferNotesQuery sin perspectiva', () => {
|
|
273
|
+
const caller = { tenantId: 't-1', author: 'fiado-dashboard', actorId: 'sub-1' };
|
|
274
|
+
|
|
275
|
+
it('no recibe los filtros que dependen de quién consulta', () => {
|
|
276
|
+
const dto = plainToInstance(
|
|
277
|
+
PrivateListTransferNotesQuery,
|
|
278
|
+
{ ...caller, direction: 'INCOMING', counterpartyType: 'RETAILER', retailerId: 'r-1', issuedFrom: '2026-11-01', issuedTo: '2026-11-07', limit: '20' },
|
|
279
|
+
{ excludeExtraneousValues: true },
|
|
280
|
+
);
|
|
281
|
+
expect(dto).toMatchObject({ ...caller, limit: 20 });
|
|
282
|
+
['direction', 'counterpartyType', 'retailerId', 'issuedFrom', 'issuedTo'].forEach((key) => expect(dto).not.toHaveProperty(key));
|
|
283
|
+
});
|
|
284
|
+
});
|
|
@@ -22,6 +22,8 @@ const {
|
|
|
22
22
|
TransferNoteStatusEnum,
|
|
23
23
|
TransferNoteItemStatusEnum,
|
|
24
24
|
TransferNoteConceptEnum,
|
|
25
|
+
TransferNoteDirectionEnum,
|
|
26
|
+
TransferNotePartyTypeEnum,
|
|
25
27
|
} = TransferNote;
|
|
26
28
|
|
|
27
29
|
function errorsOf<T extends object>(cls: new () => T, payload: Record<string, unknown>): string[] {
|
|
@@ -155,3 +157,56 @@ describe('queries de listado', () => {
|
|
|
155
157
|
);
|
|
156
158
|
});
|
|
157
159
|
});
|
|
160
|
+
|
|
161
|
+
describe('filtros opcionales del listado de notas', () => {
|
|
162
|
+
const filters = {
|
|
163
|
+
counterpartyType: TransferNotePartyTypeEnum.RETAILER,
|
|
164
|
+
direction: TransferNoteDirectionEnum.INCOMING,
|
|
165
|
+
issuedFrom: '2026-11-01',
|
|
166
|
+
issuedTo: '2026-11-07',
|
|
167
|
+
retailerId: 'r-1',
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
it('acepta todos los filtros juntos y un rango de un solo día', () => {
|
|
171
|
+
expect(errorsOf(ListTransferNotesQuery, filters)).toEqual([]);
|
|
172
|
+
expect(errorsOf(ListTransferNotesQuery, { issuedFrom: '2026-11-01', issuedTo: '2026-11-01' })).toEqual([]);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('expone los filtros en el DTO', () => {
|
|
176
|
+
expect(plainToInstance(ListTransferNotesQuery, filters, { excludeExtraneousValues: true })).toMatchObject(filters);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('rechaza retailerId vacío', () => {
|
|
180
|
+
expect(errorsOf(ListTransferNotesQuery, { retailerId: '' })).toEqual(['retailerId']);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('el enum de dirección solo tiene INCOMING y OUTGOING', () => {
|
|
184
|
+
expect(Object.values(TransferNoteDirectionEnum)).toEqual(['INCOMING', 'OUTGOING']);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('rechaza valores fuera de catálogo', () => {
|
|
188
|
+
expect(errorsOf(ListTransferNotesQuery, { counterpartyType: 'BANK', direction: 'SIDEWAYS' })).toEqual(
|
|
189
|
+
expect.arrayContaining(['counterpartyType', 'direction']),
|
|
190
|
+
);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it.each(['2026-11-1', '2026-02-30', '2026-11-01T00:00:00Z', 'ayer'])('rechaza el día %s', (day) => {
|
|
194
|
+
expect(errorsOf(ListTransferNotesQuery, { issuedFrom: day })).toContain('issuedFrom');
|
|
195
|
+
expect(errorsOf(ListTransferNotesQuery, { issuedTo: day })).toContain('issuedTo');
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('rechaza issuedFrom posterior a issuedTo', () => {
|
|
199
|
+
expect(errorsOf(ListTransferNotesQuery, { issuedFrom: '2026-11-08', issuedTo: '2026-11-07' })).toEqual(['issuedTo']);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('acepta cualquiera de los extremos sin el otro', () => {
|
|
203
|
+
expect(errorsOf(ListTransferNotesQuery, { issuedFrom: '2026-11-08' })).toEqual([]);
|
|
204
|
+
expect(errorsOf(ListTransferNotesQuery, { issuedTo: '2026-11-08' })).toEqual([]);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('la ruta del retailer hereda los filtros, salvo retailerId porque manda el path', () => {
|
|
208
|
+
const dto = plainToInstance(ListRetailerTransferNotesQuery, filters, { excludeExtraneousValues: true });
|
|
209
|
+
expect(dto).toMatchObject({ direction: filters.direction, counterpartyType: filters.counterpartyType, issuedFrom: filters.issuedFrom, issuedTo: filters.issuedTo });
|
|
210
|
+
expect(dto).not.toHaveProperty('retailerId');
|
|
211
|
+
});
|
|
212
|
+
});
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/** Body de POST /internal/tenants/{tenantId}/customer-accounts. */
|
|
2
2
|
export declare class EnsureCustomerAccountRequest {
|
|
3
3
|
phone: string;
|
|
4
|
-
retailCustomerId: string;
|
|
5
|
-
directoryId: string;
|
|
6
4
|
displayName: string;
|
|
5
|
+
/** Identificador del cliente en el sistema que llama; RBAC lo usa para no duplicar la cuenta. */
|
|
6
|
+
externalId: string;
|
|
7
|
+
/** Campos declarados por la aplicación; RBAC los valida contra su catálogo. */
|
|
8
|
+
customFields?: Record<string, string>;
|
|
9
|
+
/** Si falta, RBAC asigna el rol con el permiso del portal. */
|
|
10
|
+
roleId?: string;
|
|
7
11
|
createdBy: string;
|
|
8
12
|
}
|
|
@@ -13,6 +13,7 @@ exports.EnsureCustomerAccountRequest = void 0;
|
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const InputPatterns_1 = require("../../common/constants/InputPatterns");
|
|
16
|
+
const IsStringValueRecord_1 = require("../../common/validators/IsStringValueRecord");
|
|
16
17
|
/** Body de POST /internal/tenants/{tenantId}/customer-accounts. */
|
|
17
18
|
class EnsureCustomerAccountRequest {
|
|
18
19
|
}
|
|
@@ -28,19 +29,27 @@ __decorate([
|
|
|
28
29
|
(0, class_validator_1.IsString)(),
|
|
29
30
|
(0, class_validator_1.IsNotEmpty)(),
|
|
30
31
|
__metadata("design:type", String)
|
|
31
|
-
], EnsureCustomerAccountRequest.prototype, "
|
|
32
|
+
], EnsureCustomerAccountRequest.prototype, "displayName", void 0);
|
|
32
33
|
__decorate([
|
|
33
34
|
(0, class_transformer_1.Expose)(),
|
|
34
35
|
(0, class_validator_1.IsString)(),
|
|
35
36
|
(0, class_validator_1.IsNotEmpty)(),
|
|
36
37
|
__metadata("design:type", String)
|
|
37
|
-
], EnsureCustomerAccountRequest.prototype, "
|
|
38
|
+
], EnsureCustomerAccountRequest.prototype, "externalId", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, class_transformer_1.Expose)(),
|
|
41
|
+
(0, class_validator_1.IsOptional)(),
|
|
42
|
+
(0, class_validator_1.IsObject)(),
|
|
43
|
+
(0, class_validator_1.Validate)(IsStringValueRecord_1.IsStringValueRecord, { message: 'customFields: todos los valores deben ser string' }),
|
|
44
|
+
__metadata("design:type", Object)
|
|
45
|
+
], EnsureCustomerAccountRequest.prototype, "customFields", void 0);
|
|
38
46
|
__decorate([
|
|
39
47
|
(0, class_transformer_1.Expose)(),
|
|
48
|
+
(0, class_validator_1.IsOptional)(),
|
|
40
49
|
(0, class_validator_1.IsString)(),
|
|
41
50
|
(0, class_validator_1.IsNotEmpty)(),
|
|
42
51
|
__metadata("design:type", String)
|
|
43
|
-
], EnsureCustomerAccountRequest.prototype, "
|
|
52
|
+
], EnsureCustomerAccountRequest.prototype, "roleId", void 0);
|
|
44
53
|
__decorate([
|
|
45
54
|
(0, class_transformer_1.Expose)(),
|
|
46
55
|
(0, class_validator_1.IsString)(),
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
export declare const TRANSFER_NOTE_MIN_REASON_LENGTH = 20;
|
|
3
3
|
/** Semana ISO `YYYY-Www`, p. ej. `2026-W43`. */
|
|
4
4
|
export declare const TRANSFER_NOTE_ISO_WEEK_PATTERN: RegExp;
|
|
5
|
+
/** Día calendario `YYYY-MM-DD`. */
|
|
6
|
+
export declare const TRANSFER_NOTE_DAY_PATTERN: RegExp;
|
|
5
7
|
/** CLABE interbancaria de 18 dígitos. */
|
|
6
8
|
export declare const TRANSFER_NOTE_CLABE_PATTERN: RegExp;
|
|
7
9
|
export declare const TRANSFER_NOTE_MAX_PAGE_SIZE = 100;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TRANSFER_NOTE_ACTOR_ID_MAX_LENGTH = exports.TRANSFER_NOTE_MAX_PAGE_SIZE = exports.TRANSFER_NOTE_CLABE_PATTERN = exports.TRANSFER_NOTE_ISO_WEEK_PATTERN = exports.TRANSFER_NOTE_MIN_REASON_LENGTH = void 0;
|
|
3
|
+
exports.TRANSFER_NOTE_ACTOR_ID_MAX_LENGTH = exports.TRANSFER_NOTE_MAX_PAGE_SIZE = exports.TRANSFER_NOTE_CLABE_PATTERN = exports.TRANSFER_NOTE_DAY_PATTERN = exports.TRANSFER_NOTE_ISO_WEEK_PATTERN = exports.TRANSFER_NOTE_MIN_REASON_LENGTH = void 0;
|
|
4
4
|
/** Largo mínimo de la razón de una emisión manual y de una objeción. */
|
|
5
5
|
exports.TRANSFER_NOTE_MIN_REASON_LENGTH = 20;
|
|
6
6
|
/** Semana ISO `YYYY-Www`, p. ej. `2026-W43`. */
|
|
7
7
|
exports.TRANSFER_NOTE_ISO_WEEK_PATTERN = /^\d{4}-W(0[1-9]|[1-4]\d|5[0-3])$/;
|
|
8
|
+
/** Día calendario `YYYY-MM-DD`. */
|
|
9
|
+
exports.TRANSFER_NOTE_DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
8
10
|
/** CLABE interbancaria de 18 dígitos. */
|
|
9
11
|
exports.TRANSFER_NOTE_CLABE_PATTERN = /^\d{18}$/;
|
|
10
12
|
exports.TRANSFER_NOTE_MAX_PAGE_SIZE = 100;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TransferNoteConceptEnum } from '../../enums/TransferNoteConceptEnum';
|
|
2
2
|
import { CancelTransferNoteRequest, CaptureTransferNoteSpeiRequest, IssueTransferNoteRequest, PreviewTransferNoteRequest, ResolveTransferNoteDisputeRequest, RevertTransferNoteSpeiRequest } from './TransferNoteActionRequests';
|
|
3
|
-
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery,
|
|
3
|
+
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery, ListTransferNotesBaseQuery } from './TransferNoteQueries';
|
|
4
4
|
/** Tenant y servicio que llama; el lambda valida `author` contra su lista permitida. */
|
|
5
5
|
export declare class PrivateTransferNoteCaller {
|
|
6
6
|
tenantId: string;
|
|
@@ -89,7 +89,7 @@ export declare class PrivateGetTransferNoteHistoryQuery extends PrivateTransferN
|
|
|
89
89
|
export declare class PrivateGetTransferNotePdfQuery extends PrivateTransferNoteOperatorCaller {
|
|
90
90
|
}
|
|
91
91
|
/** Query de privateListTransferNotes. */
|
|
92
|
-
export declare class PrivateListTransferNotesQuery extends
|
|
92
|
+
export declare class PrivateListTransferNotesQuery extends ListTransferNotesBaseQuery {
|
|
93
93
|
tenantId: string;
|
|
94
94
|
author: string;
|
|
95
95
|
/** `sub` de Azure AD del operador del dashboard. */
|
|
@@ -190,7 +190,7 @@ class PrivateGetTransferNotePdfQuery extends PrivateTransferNoteOperatorCaller {
|
|
|
190
190
|
}
|
|
191
191
|
exports.PrivateGetTransferNotePdfQuery = PrivateGetTransferNotePdfQuery;
|
|
192
192
|
/** Query de privateListTransferNotes. */
|
|
193
|
-
class PrivateListTransferNotesQuery extends TransferNoteQueries_1.
|
|
193
|
+
class PrivateListTransferNotesQuery extends TransferNoteQueries_1.ListTransferNotesBaseQuery {
|
|
194
194
|
}
|
|
195
195
|
exports.PrivateListTransferNotesQuery = PrivateListTransferNotesQuery;
|
|
196
196
|
__decorate([
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { TransferNoteDisputeCategoryEnum } from '../../enums/TransferNoteDisputeCategoryEnum';
|
|
2
2
|
import { CaptureTransferNoteSpeiRequest } from './TransferNoteActionRequests';
|
|
3
|
-
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery,
|
|
3
|
+
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery, ListViewerTransferNotesQuery } from './TransferNoteQueries';
|
|
4
4
|
/** Query de publicListRetailerTransferNotes; el retailer va en la ruta. */
|
|
5
|
-
export declare class ListRetailerTransferNotesQuery extends
|
|
5
|
+
export declare class ListRetailerTransferNotesQuery extends ListViewerTransferNotesQuery {
|
|
6
6
|
}
|
|
7
7
|
/** Query de publicListRetailerTransferNotePool. */
|
|
8
8
|
export declare class ListRetailerTransferNotePoolQuery extends ListTransferNotePoolQuery {
|
|
@@ -17,7 +17,7 @@ const TransferNoteActionRequests_1 = require("./TransferNoteActionRequests");
|
|
|
17
17
|
const TransferNoteQueries_1 = require("./TransferNoteQueries");
|
|
18
18
|
const transferNoteRequestDecorators_1 = require("./transferNoteRequestDecorators");
|
|
19
19
|
/** Query de publicListRetailerTransferNotes; el retailer va en la ruta. */
|
|
20
|
-
class ListRetailerTransferNotesQuery extends TransferNoteQueries_1.
|
|
20
|
+
class ListRetailerTransferNotesQuery extends TransferNoteQueries_1.ListViewerTransferNotesQuery {
|
|
21
21
|
}
|
|
22
22
|
exports.ListRetailerTransferNotesQuery = ListRetailerTransferNotesQuery;
|
|
23
23
|
/** Query de publicListRetailerTransferNotePool. */
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { TransferNoteConceptEnum } from '../../enums/TransferNoteConceptEnum';
|
|
2
|
+
import { TransferNoteDirectionEnum } from '../../enums/TransferNoteDirectionEnum';
|
|
2
3
|
import { TransferNoteIssueOriginEnum } from '../../enums/TransferNoteIssueOriginEnum';
|
|
3
4
|
import { TransferNoteItemStatusEnum } from '../../enums/TransferNoteItemStatusEnum';
|
|
5
|
+
import { TransferNotePartyTypeEnum } from '../../enums/TransferNotePartyTypeEnum';
|
|
4
6
|
import { TransferNoteStatusEnum } from '../../enums/TransferNoteStatusEnum';
|
|
5
|
-
/**
|
|
6
|
-
export declare class
|
|
7
|
+
/** Filtros de la lista que no dependen de quién consulta; también los recibe la ruta privada. */
|
|
8
|
+
export declare class ListTransferNotesBaseQuery {
|
|
7
9
|
status?: TransferNoteStatusEnum;
|
|
8
10
|
pairKey?: string;
|
|
9
11
|
isoWeek?: string;
|
|
@@ -11,6 +13,21 @@ export declare class ListTransferNotesQuery {
|
|
|
11
13
|
limit?: number;
|
|
12
14
|
nextToken?: string;
|
|
13
15
|
}
|
|
16
|
+
/** Filtros de la lista vista desde una parte de la nota. */
|
|
17
|
+
export declare class ListViewerTransferNotesQuery extends ListTransferNotesBaseQuery {
|
|
18
|
+
/** La otra parte de la nota, vista desde quien consulta. */
|
|
19
|
+
counterpartyType?: TransferNotePartyTypeEnum;
|
|
20
|
+
direction?: TransferNoteDirectionEnum;
|
|
21
|
+
/** Primer día de `issuedAt`, inclusivo, en hora de Ciudad de México. */
|
|
22
|
+
issuedFrom?: string;
|
|
23
|
+
/** Último día de `issuedAt`, inclusivo, en hora de Ciudad de México. */
|
|
24
|
+
issuedTo?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Query de publicListTransferNotes. */
|
|
27
|
+
export declare class ListTransferNotesQuery extends ListViewerTransferNotesQuery {
|
|
28
|
+
/** Deja las notas donde este retailer es pagador o receptor. */
|
|
29
|
+
retailerId?: string;
|
|
30
|
+
}
|
|
14
31
|
/** Query de publicListTransferNotePool: items por par, estado, concepto y fecha. */
|
|
15
32
|
export declare class ListTransferNotePoolQuery {
|
|
16
33
|
pairKey?: string;
|
|
@@ -9,48 +9,86 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ListTransferNoteItemsQuery = exports.ListTransferNotePoolQuery = exports.ListTransferNotesQuery = void 0;
|
|
12
|
+
exports.ListTransferNoteItemsQuery = exports.ListTransferNotePoolQuery = exports.ListTransferNotesQuery = exports.ListViewerTransferNotesQuery = exports.ListTransferNotesBaseQuery = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const TransferNoteConceptEnum_1 = require("../../enums/TransferNoteConceptEnum");
|
|
16
|
+
const TransferNoteDirectionEnum_1 = require("../../enums/TransferNoteDirectionEnum");
|
|
16
17
|
const TransferNoteIssueOriginEnum_1 = require("../../enums/TransferNoteIssueOriginEnum");
|
|
17
18
|
const TransferNoteItemStatusEnum_1 = require("../../enums/TransferNoteItemStatusEnum");
|
|
19
|
+
const TransferNotePartyTypeEnum_1 = require("../../enums/TransferNotePartyTypeEnum");
|
|
18
20
|
const TransferNoteStatusEnum_1 = require("../../enums/TransferNoteStatusEnum");
|
|
19
21
|
const transferNoteRequestDecorators_1 = require("./transferNoteRequestDecorators");
|
|
20
|
-
/**
|
|
21
|
-
class
|
|
22
|
+
/** Filtros de la lista que no dependen de quién consulta; también los recibe la ruta privada. */
|
|
23
|
+
class ListTransferNotesBaseQuery {
|
|
22
24
|
}
|
|
23
|
-
exports.
|
|
25
|
+
exports.ListTransferNotesBaseQuery = ListTransferNotesBaseQuery;
|
|
24
26
|
__decorate([
|
|
25
27
|
(0, class_transformer_1.Expose)(),
|
|
26
28
|
(0, class_validator_1.IsOptional)(),
|
|
27
29
|
(0, class_validator_1.IsEnum)(TransferNoteStatusEnum_1.TransferNoteStatusEnum),
|
|
28
30
|
__metadata("design:type", String)
|
|
29
|
-
],
|
|
31
|
+
], ListTransferNotesBaseQuery.prototype, "status", void 0);
|
|
30
32
|
__decorate([
|
|
31
33
|
(0, class_transformer_1.Expose)(),
|
|
32
34
|
(0, class_validator_1.IsOptional)(),
|
|
33
35
|
(0, class_validator_1.IsString)(),
|
|
34
36
|
__metadata("design:type", String)
|
|
35
|
-
],
|
|
37
|
+
], ListTransferNotesBaseQuery.prototype, "pairKey", void 0);
|
|
36
38
|
__decorate([
|
|
37
39
|
(0, transferNoteRequestDecorators_1.OptionalIsoWeek)(),
|
|
38
40
|
__metadata("design:type", String)
|
|
39
|
-
],
|
|
41
|
+
], ListTransferNotesBaseQuery.prototype, "isoWeek", void 0);
|
|
40
42
|
__decorate([
|
|
41
43
|
(0, class_transformer_1.Expose)(),
|
|
42
44
|
(0, class_validator_1.IsOptional)(),
|
|
43
45
|
(0, class_validator_1.IsEnum)(TransferNoteIssueOriginEnum_1.TransferNoteIssueOriginEnum),
|
|
44
46
|
__metadata("design:type", String)
|
|
45
|
-
],
|
|
47
|
+
], ListTransferNotesBaseQuery.prototype, "issueOrigin", void 0);
|
|
46
48
|
__decorate([
|
|
47
49
|
(0, transferNoteRequestDecorators_1.PageLimit)(),
|
|
48
50
|
__metadata("design:type", Number)
|
|
49
|
-
],
|
|
51
|
+
], ListTransferNotesBaseQuery.prototype, "limit", void 0);
|
|
50
52
|
__decorate([
|
|
51
53
|
(0, transferNoteRequestDecorators_1.PageToken)(),
|
|
52
54
|
__metadata("design:type", String)
|
|
53
|
-
],
|
|
55
|
+
], ListTransferNotesBaseQuery.prototype, "nextToken", void 0);
|
|
56
|
+
/** Filtros de la lista vista desde una parte de la nota. */
|
|
57
|
+
class ListViewerTransferNotesQuery extends ListTransferNotesBaseQuery {
|
|
58
|
+
}
|
|
59
|
+
exports.ListViewerTransferNotesQuery = ListViewerTransferNotesQuery;
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, class_transformer_1.Expose)(),
|
|
62
|
+
(0, class_validator_1.IsOptional)(),
|
|
63
|
+
(0, class_validator_1.IsEnum)(TransferNotePartyTypeEnum_1.TransferNotePartyTypeEnum),
|
|
64
|
+
__metadata("design:type", String)
|
|
65
|
+
], ListViewerTransferNotesQuery.prototype, "counterpartyType", void 0);
|
|
66
|
+
__decorate([
|
|
67
|
+
(0, class_transformer_1.Expose)(),
|
|
68
|
+
(0, class_validator_1.IsOptional)(),
|
|
69
|
+
(0, class_validator_1.IsEnum)(TransferNoteDirectionEnum_1.TransferNoteDirectionEnum),
|
|
70
|
+
__metadata("design:type", String)
|
|
71
|
+
], ListViewerTransferNotesQuery.prototype, "direction", void 0);
|
|
72
|
+
__decorate([
|
|
73
|
+
(0, transferNoteRequestDecorators_1.OptionalDay)(),
|
|
74
|
+
__metadata("design:type", String)
|
|
75
|
+
], ListViewerTransferNotesQuery.prototype, "issuedFrom", void 0);
|
|
76
|
+
__decorate([
|
|
77
|
+
(0, transferNoteRequestDecorators_1.OptionalDay)(),
|
|
78
|
+
(0, transferNoteRequestDecorators_1.NotBeforeDay)('issuedFrom'),
|
|
79
|
+
__metadata("design:type", String)
|
|
80
|
+
], ListViewerTransferNotesQuery.prototype, "issuedTo", void 0);
|
|
81
|
+
/** Query de publicListTransferNotes. */
|
|
82
|
+
class ListTransferNotesQuery extends ListViewerTransferNotesQuery {
|
|
83
|
+
}
|
|
84
|
+
exports.ListTransferNotesQuery = ListTransferNotesQuery;
|
|
85
|
+
__decorate([
|
|
86
|
+
(0, class_transformer_1.Expose)(),
|
|
87
|
+
(0, class_validator_1.IsOptional)(),
|
|
88
|
+
(0, class_validator_1.IsString)(),
|
|
89
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
90
|
+
__metadata("design:type", String)
|
|
91
|
+
], ListTransferNotesQuery.prototype, "retailerId", void 0);
|
|
54
92
|
/** Query de publicListTransferNotePool: items por par, estado, concepto y fecha. */
|
|
55
93
|
class ListTransferNotePoolQuery {
|
|
56
94
|
}
|
|
@@ -12,6 +12,10 @@ export declare function OptionalEmail(): PropertyDecorator;
|
|
|
12
12
|
export declare function RequiredActorId(): PropertyDecorator;
|
|
13
13
|
/** Semana ISO opcional `YYYY-Www`. */
|
|
14
14
|
export declare function OptionalIsoWeek(): PropertyDecorator;
|
|
15
|
+
/** Día opcional `YYYY-MM-DD` que exista en el calendario. */
|
|
16
|
+
export declare function OptionalDay(): PropertyDecorator;
|
|
17
|
+
/** El día no puede ser anterior al de `startField`, si ese viene. */
|
|
18
|
+
export declare function NotBeforeDay(startField: string): PropertyDecorator;
|
|
15
19
|
/** Tamaño de página opcional, 1 a 100, llega como string en el query. */
|
|
16
20
|
export declare function PageLimit(): PropertyDecorator;
|
|
17
21
|
/** Cursor opcional de paginación. */
|
|
@@ -7,6 +7,8 @@ exports.RequiredEmail = RequiredEmail;
|
|
|
7
7
|
exports.OptionalEmail = OptionalEmail;
|
|
8
8
|
exports.RequiredActorId = RequiredActorId;
|
|
9
9
|
exports.OptionalIsoWeek = OptionalIsoWeek;
|
|
10
|
+
exports.OptionalDay = OptionalDay;
|
|
11
|
+
exports.NotBeforeDay = NotBeforeDay;
|
|
10
12
|
exports.PageLimit = PageLimit;
|
|
11
13
|
exports.PageToken = PageToken;
|
|
12
14
|
const class_transformer_1 = require("class-transformer");
|
|
@@ -78,6 +80,28 @@ function OptionalIsoWeek() {
|
|
|
78
80
|
(0, class_validator_1.Matches)(transferNoteValidation_1.TRANSFER_NOTE_ISO_WEEK_PATTERN)(target, key);
|
|
79
81
|
};
|
|
80
82
|
}
|
|
83
|
+
/** Día opcional `YYYY-MM-DD` que exista en el calendario. */
|
|
84
|
+
function OptionalDay() {
|
|
85
|
+
return (target, key) => {
|
|
86
|
+
(0, class_transformer_1.Expose)()(target, key);
|
|
87
|
+
(0, class_validator_1.IsOptional)()(target, key);
|
|
88
|
+
(0, class_validator_1.Matches)(transferNoteValidation_1.TRANSFER_NOTE_DAY_PATTERN)(target, key);
|
|
89
|
+
(0, class_validator_1.IsISO8601)({ strict: true })(target, key);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** El día no puede ser anterior al de `startField`, si ese viene. */
|
|
93
|
+
function NotBeforeDay(startField) {
|
|
94
|
+
return (0, class_validator_1.ValidateBy)({
|
|
95
|
+
name: 'notBeforeDay',
|
|
96
|
+
validator: {
|
|
97
|
+
validate: (value, args) => {
|
|
98
|
+
const start = (args?.object)[startField];
|
|
99
|
+
return typeof start !== 'string' || typeof value !== 'string' || start <= value;
|
|
100
|
+
},
|
|
101
|
+
defaultMessage: () => `$property no puede ser anterior a ${startField}`,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
81
105
|
/** Tamaño de página opcional, 1 a 100, llega como string en el query. */
|
|
82
106
|
function PageLimit() {
|
|
83
107
|
return (target, key) => {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransferNoteDirectionEnum = void 0;
|
|
4
|
+
/** Sentido de la nota visto desde quien consulta: INCOMING si es el receptor, OUTGOING si es el pagador. */
|
|
5
|
+
var TransferNoteDirectionEnum;
|
|
6
|
+
(function (TransferNoteDirectionEnum) {
|
|
7
|
+
TransferNoteDirectionEnum["INCOMING"] = "INCOMING";
|
|
8
|
+
TransferNoteDirectionEnum["OUTGOING"] = "OUTGOING";
|
|
9
|
+
})(TransferNoteDirectionEnum || (exports.TransferNoteDirectionEnum = TransferNoteDirectionEnum = {}));
|
|
@@ -3,6 +3,7 @@ export * from './enums/TransferNoteItemStatusEnum';
|
|
|
3
3
|
export * from './enums/TransferNoteConceptEnum';
|
|
4
4
|
export * from './enums/TransferNoteConceptSignEnum';
|
|
5
5
|
export * from './enums/TransferNotePartyTypeEnum';
|
|
6
|
+
export * from './enums/TransferNoteDirectionEnum';
|
|
6
7
|
export * from './enums/TransferNoteDisputeCategoryEnum';
|
|
7
8
|
export * from './enums/TransferNoteDisputeDecisionEnum';
|
|
8
9
|
export * from './enums/TransferNoteIssueOriginEnum';
|
|
@@ -20,6 +20,7 @@ __exportStar(require("./enums/TransferNoteItemStatusEnum"), exports);
|
|
|
20
20
|
__exportStar(require("./enums/TransferNoteConceptEnum"), exports);
|
|
21
21
|
__exportStar(require("./enums/TransferNoteConceptSignEnum"), exports);
|
|
22
22
|
__exportStar(require("./enums/TransferNotePartyTypeEnum"), exports);
|
|
23
|
+
__exportStar(require("./enums/TransferNoteDirectionEnum"), exports);
|
|
23
24
|
__exportStar(require("./enums/TransferNoteDisputeCategoryEnum"), exports);
|
|
24
25
|
__exportStar(require("./enums/TransferNoteDisputeDecisionEnum"), exports);
|
|
25
26
|
__exportStar(require("./enums/TransferNoteIssueOriginEnum"), exports);
|
package/package.json
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import { Expose } from 'class-transformer';
|
|
2
|
-
import { IsNotEmpty, IsString, Matches } from 'class-validator';
|
|
2
|
+
import { IsNotEmpty, IsObject, IsOptional, IsString, Matches, Validate } from 'class-validator';
|
|
3
3
|
import { PHONE_E164_PATTERN } from '../../common/constants/InputPatterns';
|
|
4
|
+
import { IsStringValueRecord } from '../../common/validators/IsStringValueRecord';
|
|
4
5
|
|
|
5
6
|
/** Body de POST /internal/tenants/{tenantId}/customer-accounts. */
|
|
6
7
|
export class EnsureCustomerAccountRequest {
|
|
7
8
|
@Expose() @IsString() @Matches(PHONE_E164_PATTERN) phone!: string;
|
|
8
|
-
@Expose() @IsString() @IsNotEmpty() retailCustomerId!: string;
|
|
9
|
-
@Expose() @IsString() @IsNotEmpty() directoryId!: string;
|
|
10
9
|
@Expose() @IsString() @IsNotEmpty() displayName!: string;
|
|
10
|
+
/** Identificador del cliente en el sistema que llama; RBAC lo usa para no duplicar la cuenta. */
|
|
11
|
+
@Expose() @IsString() @IsNotEmpty() externalId!: string;
|
|
12
|
+
/** Campos declarados por la aplicación; RBAC los valida contra su catálogo. */
|
|
13
|
+
@Expose()
|
|
14
|
+
@IsOptional()
|
|
15
|
+
@IsObject()
|
|
16
|
+
@Validate(IsStringValueRecord, { message: 'customFields: todos los valores deben ser string' })
|
|
17
|
+
customFields?: Record<string, string>;
|
|
18
|
+
/** Si falta, RBAC asigna el rol con el permiso del portal. */
|
|
19
|
+
@Expose() @IsOptional() @IsString() @IsNotEmpty() roleId?: string;
|
|
11
20
|
@Expose() @IsString() @IsNotEmpty() createdBy!: string;
|
|
12
21
|
}
|
|
@@ -4,6 +4,9 @@ export const TRANSFER_NOTE_MIN_REASON_LENGTH = 20;
|
|
|
4
4
|
/** Semana ISO `YYYY-Www`, p. ej. `2026-W43`. */
|
|
5
5
|
export const TRANSFER_NOTE_ISO_WEEK_PATTERN = /^\d{4}-W(0[1-9]|[1-4]\d|5[0-3])$/;
|
|
6
6
|
|
|
7
|
+
/** Día calendario `YYYY-MM-DD`. */
|
|
8
|
+
export const TRANSFER_NOTE_DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
9
|
+
|
|
7
10
|
/** CLABE interbancaria de 18 dígitos. */
|
|
8
11
|
export const TRANSFER_NOTE_CLABE_PATTERN = /^\d{18}$/;
|
|
9
12
|
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
ResolveTransferNoteDisputeRequest,
|
|
11
11
|
RevertTransferNoteSpeiRequest,
|
|
12
12
|
} from './TransferNoteActionRequests';
|
|
13
|
-
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery,
|
|
13
|
+
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery, ListTransferNotesBaseQuery } from './TransferNoteQueries';
|
|
14
14
|
import { OptionalEmail, RequiredActorId, RequiredId, RequiredReason } from './transferNoteRequestDecorators';
|
|
15
15
|
|
|
16
16
|
/** Tenant y servicio que llama; el lambda valida `author` contra su lista permitida. */
|
|
@@ -157,7 +157,7 @@ export class PrivateGetTransferNoteHistoryQuery extends PrivateTransferNoteOpera
|
|
|
157
157
|
export class PrivateGetTransferNotePdfQuery extends PrivateTransferNoteOperatorCaller {}
|
|
158
158
|
|
|
159
159
|
/** Query de privateListTransferNotes. */
|
|
160
|
-
export class PrivateListTransferNotesQuery extends
|
|
160
|
+
export class PrivateListTransferNotesQuery extends ListTransferNotesBaseQuery {
|
|
161
161
|
@RequiredId()
|
|
162
162
|
tenantId!: string;
|
|
163
163
|
|
|
@@ -2,11 +2,11 @@ import { Expose } from 'class-transformer';
|
|
|
2
2
|
import { IsEnum } from 'class-validator';
|
|
3
3
|
import { TransferNoteDisputeCategoryEnum } from '../../enums/TransferNoteDisputeCategoryEnum';
|
|
4
4
|
import { CaptureTransferNoteSpeiRequest } from './TransferNoteActionRequests';
|
|
5
|
-
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery,
|
|
5
|
+
import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery, ListViewerTransferNotesQuery } from './TransferNoteQueries';
|
|
6
6
|
import { LongReason } from './transferNoteRequestDecorators';
|
|
7
7
|
|
|
8
8
|
/** Query de publicListRetailerTransferNotes; el retailer va en la ruta. */
|
|
9
|
-
export class ListRetailerTransferNotesQuery extends
|
|
9
|
+
export class ListRetailerTransferNotesQuery extends ListViewerTransferNotesQuery {}
|
|
10
10
|
|
|
11
11
|
/** Query de publicListRetailerTransferNotePool. */
|
|
12
12
|
export class ListRetailerTransferNotePoolQuery extends ListTransferNotePoolQuery {}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { Expose } from 'class-transformer';
|
|
2
|
-
import { IsEnum, IsISO8601, IsOptional, IsString } from 'class-validator';
|
|
2
|
+
import { IsEnum, IsISO8601, IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
|
3
3
|
import { TransferNoteConceptEnum } from '../../enums/TransferNoteConceptEnum';
|
|
4
|
+
import { TransferNoteDirectionEnum } from '../../enums/TransferNoteDirectionEnum';
|
|
4
5
|
import { TransferNoteIssueOriginEnum } from '../../enums/TransferNoteIssueOriginEnum';
|
|
5
6
|
import { TransferNoteItemStatusEnum } from '../../enums/TransferNoteItemStatusEnum';
|
|
7
|
+
import { TransferNotePartyTypeEnum } from '../../enums/TransferNotePartyTypeEnum';
|
|
6
8
|
import { TransferNoteStatusEnum } from '../../enums/TransferNoteStatusEnum';
|
|
7
|
-
import { OptionalIsoWeek, PageLimit, PageToken } from './transferNoteRequestDecorators';
|
|
9
|
+
import { NotBeforeDay, OptionalDay, OptionalIsoWeek, PageLimit, PageToken } from './transferNoteRequestDecorators';
|
|
8
10
|
|
|
9
|
-
/**
|
|
10
|
-
export class
|
|
11
|
+
/** Filtros de la lista que no dependen de quién consulta; también los recibe la ruta privada. */
|
|
12
|
+
export class ListTransferNotesBaseQuery {
|
|
11
13
|
@Expose()
|
|
12
14
|
@IsOptional()
|
|
13
15
|
@IsEnum(TransferNoteStatusEnum)
|
|
@@ -33,6 +35,39 @@ export class ListTransferNotesQuery {
|
|
|
33
35
|
nextToken?: string;
|
|
34
36
|
}
|
|
35
37
|
|
|
38
|
+
/** Filtros de la lista vista desde una parte de la nota. */
|
|
39
|
+
export class ListViewerTransferNotesQuery extends ListTransferNotesBaseQuery {
|
|
40
|
+
/** La otra parte de la nota, vista desde quien consulta. */
|
|
41
|
+
@Expose()
|
|
42
|
+
@IsOptional()
|
|
43
|
+
@IsEnum(TransferNotePartyTypeEnum)
|
|
44
|
+
counterpartyType?: TransferNotePartyTypeEnum;
|
|
45
|
+
|
|
46
|
+
@Expose()
|
|
47
|
+
@IsOptional()
|
|
48
|
+
@IsEnum(TransferNoteDirectionEnum)
|
|
49
|
+
direction?: TransferNoteDirectionEnum;
|
|
50
|
+
|
|
51
|
+
/** Primer día de `issuedAt`, inclusivo, en hora de Ciudad de México. */
|
|
52
|
+
@OptionalDay()
|
|
53
|
+
issuedFrom?: string;
|
|
54
|
+
|
|
55
|
+
/** Último día de `issuedAt`, inclusivo, en hora de Ciudad de México. */
|
|
56
|
+
@OptionalDay()
|
|
57
|
+
@NotBeforeDay('issuedFrom')
|
|
58
|
+
issuedTo?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Query de publicListTransferNotes. */
|
|
62
|
+
export class ListTransferNotesQuery extends ListViewerTransferNotesQuery {
|
|
63
|
+
/** Deja las notas donde este retailer es pagador o receptor. */
|
|
64
|
+
@Expose()
|
|
65
|
+
@IsOptional()
|
|
66
|
+
@IsString()
|
|
67
|
+
@IsNotEmpty()
|
|
68
|
+
retailerId?: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
36
71
|
/** Query de publicListTransferNotePool: items por par, estado, concepto y fecha. */
|
|
37
72
|
export class ListTransferNotePoolQuery {
|
|
38
73
|
@Expose()
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Expose, Transform, Type } from 'class-transformer';
|
|
2
|
-
import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsString, Matches, Max, MaxLength, Min, MinLength, ValidateBy, isEmail } from 'class-validator';
|
|
2
|
+
import { IsEmail, IsISO8601, IsInt, IsNotEmpty, IsOptional, IsString, Matches, Max, MaxLength, Min, MinLength, ValidateBy, isEmail } from 'class-validator';
|
|
3
3
|
import {
|
|
4
4
|
TRANSFER_NOTE_ACTOR_ID_MAX_LENGTH,
|
|
5
|
+
TRANSFER_NOTE_DAY_PATTERN,
|
|
5
6
|
TRANSFER_NOTE_ISO_WEEK_PATTERN,
|
|
6
7
|
TRANSFER_NOTE_MAX_PAGE_SIZE,
|
|
7
8
|
TRANSFER_NOTE_MIN_REASON_LENGTH,
|
|
@@ -81,6 +82,30 @@ export function OptionalIsoWeek(): PropertyDecorator {
|
|
|
81
82
|
};
|
|
82
83
|
}
|
|
83
84
|
|
|
85
|
+
/** Día opcional `YYYY-MM-DD` que exista en el calendario. */
|
|
86
|
+
export function OptionalDay(): PropertyDecorator {
|
|
87
|
+
return (target, key) => {
|
|
88
|
+
Expose()(target, key);
|
|
89
|
+
IsOptional()(target, key);
|
|
90
|
+
Matches(TRANSFER_NOTE_DAY_PATTERN)(target, key);
|
|
91
|
+
IsISO8601({ strict: true })(target, key);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** El día no puede ser anterior al de `startField`, si ese viene. */
|
|
96
|
+
export function NotBeforeDay(startField: string): PropertyDecorator {
|
|
97
|
+
return ValidateBy({
|
|
98
|
+
name: 'notBeforeDay',
|
|
99
|
+
validator: {
|
|
100
|
+
validate: (value, args) => {
|
|
101
|
+
const start = (args?.object as Record<string, unknown>)[startField];
|
|
102
|
+
return typeof start !== 'string' || typeof value !== 'string' || start <= value;
|
|
103
|
+
},
|
|
104
|
+
defaultMessage: () => `$property no puede ser anterior a ${startField}`,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
84
109
|
/** Tamaño de página opcional, 1 a 100, llega como string en el query. */
|
|
85
110
|
export function PageLimit(): PropertyDecorator {
|
|
86
111
|
return (target, key) => {
|
|
@@ -4,6 +4,7 @@ export * from './enums/TransferNoteItemStatusEnum';
|
|
|
4
4
|
export * from './enums/TransferNoteConceptEnum';
|
|
5
5
|
export * from './enums/TransferNoteConceptSignEnum';
|
|
6
6
|
export * from './enums/TransferNotePartyTypeEnum';
|
|
7
|
+
export * from './enums/TransferNoteDirectionEnum';
|
|
7
8
|
export * from './enums/TransferNoteDisputeCategoryEnum';
|
|
8
9
|
export * from './enums/TransferNoteDisputeDecisionEnum';
|
|
9
10
|
export * from './enums/TransferNoteIssueOriginEnum';
|