@fiado/type-kit 3.664.0 → 3.665.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/transferNote/transferNoteConfigAndPrivate.test.ts +14 -0
  2. package/_test_/unit/transferNote/transferNoteRequests.test.ts +55 -0
  3. package/bin/transferNote/constants/transferNoteValidation.d.ts +2 -0
  4. package/bin/transferNote/constants/transferNoteValidation.js +3 -1
  5. package/bin/transferNote/dtos/requests/PrivateTransferNoteRequests.d.ts +2 -2
  6. package/bin/transferNote/dtos/requests/PrivateTransferNoteRequests.js +1 -1
  7. package/bin/transferNote/dtos/requests/RetailerTransferNoteRequests.d.ts +2 -2
  8. package/bin/transferNote/dtos/requests/RetailerTransferNoteRequests.js +1 -1
  9. package/bin/transferNote/dtos/requests/TransferNoteQueries.d.ts +19 -2
  10. package/bin/transferNote/dtos/requests/TransferNoteQueries.js +48 -10
  11. package/bin/transferNote/dtos/requests/transferNoteRequestDecorators.d.ts +4 -0
  12. package/bin/transferNote/dtos/requests/transferNoteRequestDecorators.js +24 -0
  13. package/bin/transferNote/enums/TransferNoteDirectionEnum.d.ts +5 -0
  14. package/bin/transferNote/enums/TransferNoteDirectionEnum.js +9 -0
  15. package/bin/transferNote/index.d.ts +1 -0
  16. package/bin/transferNote/index.js +1 -0
  17. package/package.json +1 -1
  18. package/src/transferNote/constants/transferNoteValidation.ts +3 -0
  19. package/src/transferNote/dtos/requests/PrivateTransferNoteRequests.ts +2 -2
  20. package/src/transferNote/dtos/requests/RetailerTransferNoteRequests.ts +2 -2
  21. package/src/transferNote/dtos/requests/TransferNoteQueries.ts +39 -4
  22. package/src/transferNote/dtos/requests/transferNoteRequestDecorators.ts +26 -1
  23. package/src/transferNote/enums/TransferNoteDirectionEnum.ts +5 -0
  24. package/src/transferNote/index.ts +1 -0
@@ -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
+ });
@@ -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, ListTransferNotesQuery } from './TransferNoteQueries';
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 ListTransferNotesQuery {
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.ListTransferNotesQuery {
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, ListTransferNotesQuery } from './TransferNoteQueries';
3
+ import { ListTransferNoteItemsQuery, ListTransferNotePoolQuery, ListViewerTransferNotesQuery } from './TransferNoteQueries';
4
4
  /** Query de publicListRetailerTransferNotes; el retailer va en la ruta. */
5
- export declare class ListRetailerTransferNotesQuery extends ListTransferNotesQuery {
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.ListTransferNotesQuery {
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
- /** Query de publicListTransferNotes. */
6
- export declare class ListTransferNotesQuery {
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
- /** Query de publicListTransferNotes. */
21
- class ListTransferNotesQuery {
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.ListTransferNotesQuery = ListTransferNotesQuery;
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
- ], ListTransferNotesQuery.prototype, "status", void 0);
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
- ], ListTransferNotesQuery.prototype, "pairKey", void 0);
37
+ ], ListTransferNotesBaseQuery.prototype, "pairKey", void 0);
36
38
  __decorate([
37
39
  (0, transferNoteRequestDecorators_1.OptionalIsoWeek)(),
38
40
  __metadata("design:type", String)
39
- ], ListTransferNotesQuery.prototype, "isoWeek", void 0);
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
- ], ListTransferNotesQuery.prototype, "issueOrigin", void 0);
47
+ ], ListTransferNotesBaseQuery.prototype, "issueOrigin", void 0);
46
48
  __decorate([
47
49
  (0, transferNoteRequestDecorators_1.PageLimit)(),
48
50
  __metadata("design:type", Number)
49
- ], ListTransferNotesQuery.prototype, "limit", void 0);
51
+ ], ListTransferNotesBaseQuery.prototype, "limit", void 0);
50
52
  __decorate([
51
53
  (0, transferNoteRequestDecorators_1.PageToken)(),
52
54
  __metadata("design:type", String)
53
- ], ListTransferNotesQuery.prototype, "nextToken", void 0);
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,5 @@
1
+ /** Sentido de la nota visto desde quien consulta: INCOMING si es el receptor, OUTGOING si es el pagador. */
2
+ export declare enum TransferNoteDirectionEnum {
3
+ INCOMING = "INCOMING",
4
+ OUTGOING = "OUTGOING"
5
+ }
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.664.0",
3
+ "version": "3.665.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -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, ListTransferNotesQuery } from './TransferNoteQueries';
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 ListTransferNotesQuery {
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, ListTransferNotesQuery } from './TransferNoteQueries';
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 ListTransferNotesQuery {}
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
- /** Query de publicListTransferNotes. */
10
- export class ListTransferNotesQuery {
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) => {
@@ -0,0 +1,5 @@
1
+ /** Sentido de la nota visto desde quien consulta: INCOMING si es el receptor, OUTGOING si es el pagador. */
2
+ export enum TransferNoteDirectionEnum {
3
+ INCOMING = 'INCOMING',
4
+ OUTGOING = 'OUTGOING',
5
+ }
@@ -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';