@fiado/type-kit 3.620.0 → 3.622.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 (38) hide show
  1. package/_test_/unit/reconciliation/m8AdditiveBatch.test.ts +101 -0
  2. package/_test_/unit/retailIntegration/reconciliationContracts.test.ts +18 -0
  3. package/_test_/unit/transferNote/transferNoteEventsAndFeeds.test.ts +20 -0
  4. package/bin/reconciliation/constants/reconciliationErrorHttpStatus.d.ts +2 -2
  5. package/bin/reconciliation/constants/reconciliationErrorHttpStatus.js +9 -1
  6. package/bin/reconciliation/enums/ReconciliationErrorCodeEnum.d.ts +11 -1
  7. package/bin/reconciliation/enums/ReconciliationErrorCodeEnum.js +10 -0
  8. package/bin/retailIntegration/dtos/GetReconciliationResponses.d.ts +13 -2
  9. package/bin/transactionProcessor/constants/reconciliationAdjustmentErrorHttpStatus.d.ts +3 -0
  10. package/bin/transactionProcessor/constants/reconciliationAdjustmentErrorHttpStatus.js +14 -0
  11. package/bin/transactionProcessor/enums/ReconciliationAdjustmentErrorCodeEnum.d.ts +15 -0
  12. package/bin/transactionProcessor/enums/ReconciliationAdjustmentErrorCodeEnum.js +19 -0
  13. package/bin/transactionProcessor/index.d.ts +2 -0
  14. package/bin/transactionProcessor/index.js +2 -0
  15. package/bin/transferNote/constants/transferNoteErrorHttpStatus.d.ts +2 -2
  16. package/bin/transferNote/constants/transferNoteErrorHttpStatus.js +8 -1
  17. package/bin/transferNote/dtos/TransferNoteFeedRecords.d.ts +4 -0
  18. package/bin/transferNote/enums/TransferNoteErrorCodeEnum.d.ts +11 -1
  19. package/bin/transferNote/enums/TransferNoteErrorCodeEnum.js +10 -0
  20. package/bin/transferNote/events/TransferNoteIssuedEventDetail.d.ts +15 -0
  21. package/bin/transferNote/events/TransferNoteIssuedEventDetail.js +7 -0
  22. package/bin/transferNote/events/TransferNoteReconciledEventDetail.d.ts +2 -1
  23. package/bin/transferNote/events/TransferNoteReconciledEventDetail.js +1 -0
  24. package/bin/transferNote/index.d.ts +1 -0
  25. package/bin/transferNote/index.js +1 -0
  26. package/package.json +1 -1
  27. package/src/reconciliation/constants/reconciliationErrorHttpStatus.ts +10 -2
  28. package/src/reconciliation/enums/ReconciliationErrorCodeEnum.ts +10 -0
  29. package/src/retailIntegration/dtos/GetReconciliationResponses.ts +14 -2
  30. package/src/transactionProcessor/constants/reconciliationAdjustmentErrorHttpStatus.ts +12 -0
  31. package/src/transactionProcessor/enums/ReconciliationAdjustmentErrorCodeEnum.ts +15 -0
  32. package/src/transactionProcessor/index.ts +2 -0
  33. package/src/transferNote/constants/transferNoteErrorHttpStatus.ts +9 -2
  34. package/src/transferNote/dtos/TransferNoteFeedRecords.ts +4 -0
  35. package/src/transferNote/enums/TransferNoteErrorCodeEnum.ts +10 -0
  36. package/src/transferNote/events/TransferNoteIssuedEventDetail.ts +17 -0
  37. package/src/transferNote/events/TransferNoteReconciledEventDetail.ts +1 -0
  38. package/src/transferNote/index.ts +1 -0
@@ -0,0 +1,101 @@
1
+ import 'reflect-metadata';
2
+ import * as Reconciliation from '../../../src/reconciliation';
3
+ import * as TransferNote from '../../../src/transferNote';
4
+ import * as TransactionProcessor from '../../../src/transactionProcessor';
5
+ import { CurrencyId } from '../../../src/currency/enums/CurrencyId';
6
+
7
+ const { TransferNoteErrorCodeEnum: TN, TRANSFER_NOTE_ERROR_HTTP_STATUS } = TransferNote;
8
+ const { ReconciliationErrorCodeEnum: RC, RECONCILIATION_ERROR_HTTP_STATUS } = Reconciliation;
9
+ const { ReconciliationAdjustmentErrorCodeEnum: RA, RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS } = TransactionProcessor;
10
+
11
+ describe('codes de transfer-note con su status', () => {
12
+ it.each([
13
+ [TN.NOTE_DISPUTED, 409],
14
+ [TN.NOT_NOTE_PAYER, 422],
15
+ [TN.NOTE_NOT_SENT, 409],
16
+ [TN.NOT_NOTE_PAYEE, 422],
17
+ [TN.SETTLEMENT_NOT_REQUIRED, 422],
18
+ [TN.DISPUTE_ON_PAID_NOTE_PENDING_DECISION, 409],
19
+ [TN.ADJUSTMENT_KEY_CONFLICT, 409],
20
+ [TN.CONTACT_EMAIL_MISSING, 422],
21
+ [TN.NOTICE_PUBLISH_FAILED, 502],
22
+ [TN.BANK_CALENDAR_UNAVAILABLE, 502],
23
+ [TN.CUTOFF_DISPATCH_FAILED, 502],
24
+ [TN.CONCURRENT_WRITE_CONFLICT, 409],
25
+ [TN.AUDIT_QUEUE_PUBLISH_FAILED, 502],
26
+ ])('%s responde %d', (code, status) => {
27
+ expect(code).toBeDefined();
28
+ expect(TRANSFER_NOTE_ERROR_HTTP_STATUS[code]).toBe(status);
29
+ });
30
+ });
31
+
32
+ describe('codes del motor con su status', () => {
33
+ it.each([
34
+ [RC.INVALID_DEFINITION_STATUS_TRANSITION, 409],
35
+ [RC.DEFINITION_ACTIVE_FROM_REQUIRED, 422],
36
+ [RC.DEFINITION_NOT_RUNNABLE, 409],
37
+ [RC.RULE_TYPE_NOT_SUPPORTED, 422],
38
+ [RC.BANK_CALENDAR_UNAVAILABLE, 502],
39
+ [RC.RUN_DISPATCH_FAILED, 502],
40
+ [RC.BANK_STATEMENT_UNAVAILABLE, 502],
41
+ [RC.INVALID_SEED_TENANT, 400],
42
+ ])('%s responde %d', (code, status) => {
43
+ expect(code).toBeDefined();
44
+ expect(RECONCILIATION_ERROR_HTTP_STATUS[code]).toBe(status);
45
+ });
46
+ });
47
+
48
+ describe('codes del ajuste en el processor', () => {
49
+ it('el catálogo es exactamente el del ajuste', () => {
50
+ expect(Object.values(RA).sort()).toEqual([
51
+ 'ADJUSTMENT_IN_PROGRESS',
52
+ 'ADJUSTMENT_KEY_CONFLICT',
53
+ 'ADJUSTMENT_OUTCOME_UNKNOWN',
54
+ 'ADJUSTMENT_REJECTED',
55
+ 'ADJUSTMENT_UNAVAILABLE',
56
+ 'AUTHOR_NOT_ALLOWED',
57
+ 'COLLECTION_TENANT_MISSING',
58
+ ]);
59
+ });
60
+
61
+ it.each([
62
+ [RA.ADJUSTMENT_KEY_CONFLICT, 409],
63
+ [RA.ADJUSTMENT_IN_PROGRESS, 409],
64
+ [RA.ADJUSTMENT_OUTCOME_UNKNOWN, 409],
65
+ [RA.ADJUSTMENT_REJECTED, 422],
66
+ [RA.ADJUSTMENT_UNAVAILABLE, 502],
67
+ [RA.AUTHOR_NOT_ALLOWED, 422],
68
+ [RA.COLLECTION_TENANT_MISSING, 400],
69
+ ])('%s responde %d', (code, status) => {
70
+ expect(RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS[code]).toBe(status);
71
+ });
72
+ });
73
+
74
+ describe('evento TransferNoteIssued', () => {
75
+ it('vive en transferNote con su source y detailType', () => {
76
+ expect(TransferNote.TRANSFER_NOTE_EVENTS_SOURCE).toBe('fiado.transferNote');
77
+ expect(TransferNote.TransferNoteEventDetailTypeEnum.TRANSFER_NOTE_ISSUED).toBe('transferNote.TransferNoteIssued');
78
+ expect(TransferNote.TransferNoteEventDetailTypeEnum.TRANSFER_NOTE_RECONCILED).toBe('transferNote.TransferNoteReconciled');
79
+ const detail: TransferNote.TransferNoteIssuedEventDetail = {
80
+ eventId: 'surekeep#n-1#ISSUED',
81
+ tenantId: 'surekeep',
82
+ noteId: 'n-1',
83
+ pairKey: 'FSA#SK',
84
+ isoWeek: '2026-W44',
85
+ netAmountCents: 125000,
86
+ currency: CurrencyId.MXN,
87
+ issuedAt: '2026-10-27T06:01:00.000Z',
88
+ dueAt: '2026-10-29T06:00:00.000Z',
89
+ };
90
+ expect(detail.dueAt).toBe('2026-10-29T06:00:00.000Z');
91
+ });
92
+ });
93
+
94
+ describe('liquidación con la cuenta destino capturada', () => {
95
+ it('paidToClabe es opcional y sigue el patrón de CLABE', () => {
96
+ const paidTo: TransferNote.TransferNoteSettlementFeedRecord['paidToClabe'] = '012180009876543210';
97
+ const notCaptured: TransferNote.TransferNoteSettlementFeedRecord['paidToClabe'] = undefined;
98
+ expect(TransferNote.TRANSFER_NOTE_CLABE_PATTERN.test(paidTo ?? '')).toBe(true);
99
+ expect(notCaptured).toBeUndefined();
100
+ });
101
+ });
@@ -119,6 +119,24 @@ describe('respuestas de la revisión', () => {
119
119
  expect(catalog.storesPending).toBe(0);
120
120
  });
121
121
 
122
+ it('las respuestas GET exponen el motivo del aborto, el último error y el intento', () => {
123
+ const counts = { seen: 0, created: 0, updated: 0, deactivated: 0, reactivated: 0, skipped: 0 };
124
+ const org: GetOrgReconciliationResponse = {
125
+ runId: 'run-o', retailerId: 'r-1', entity: ReconciliationEntityEnum.STORES,
126
+ status: ReconciliationRunStatusEnum.ABORTED, trigger: ReconciliationTriggerEnum.MANUAL,
127
+ startedAt: '2026-10-25T10:00:00.000Z', pagesProcessed: 0, counts,
128
+ abortReason: 'RETAIL_INTEGRATION_CONNECTOR_UNAVAILABLE', lastErrorCode: 'RETAIL_INTEGRATION_CONNECTOR_UNAVAILABLE', attempt: 1, maxAttempts: 5,
129
+ };
130
+ const catalog: GetCatalogReconciliationResponse = {
131
+ runId: 'run-c', retailerId: 'r-1', entity: ReconciliationEntityEnum.CATALOG,
132
+ status: ReconciliationRunStatusEnum.RUNNING, trigger: ReconciliationTriggerEnum.SCHEDULED,
133
+ startedAt: '2026-10-25T10:00:00.000Z', pagesProcessed: 0, counts,
134
+ abortReason: null, lastErrorCode: 'RETAIL_INTEGRATION_CONNECTOR_UNAVAILABLE', attempt: 3, maxAttempts: 5,
135
+ };
136
+ expect(org.abortReason).toBe('RETAIL_INTEGRATION_CONNECTOR_UNAVAILABLE');
137
+ expect([catalog.attempt, catalog.maxAttempts]).toEqual([3, 5]);
138
+ });
139
+
122
140
  it('GetCatalogReconciliationResponse admite MOVEMENTS con su ventana', () => {
123
141
  const movements: GetCatalogReconciliationResponse = {
124
142
  runId: 'run-m',
@@ -58,6 +58,26 @@ describe('registros de feed de notas con la forma base', () => {
58
58
  expect(Object.keys(reversal)).not.toContain('noteId');
59
59
  });
60
60
 
61
+ it('un item de ajuste apunta al item original que corrige', () => {
62
+ const adjustment: TransferNote.TransferNoteItemFeedRecord = {
63
+ recordId: 'it-3',
64
+ tenantId: 'surekeep',
65
+ concept: ReconciliationFeedConceptEnum.TRANSFER_NOTE_ITEM,
66
+ matchKey: 'att-1',
67
+ amountCents: -500,
68
+ currency: CurrencyId.MXN,
69
+ occurredAt: '2026-10-28T15:00:00.000Z',
70
+ feedDay: '2026-10-28',
71
+ refs: { noteId: 'n-2', itemId: 'it-3' },
72
+ itemConcept: TransferNoteConceptEnum.ADJUSTMENT,
73
+ pairKey: 'FSA#SK',
74
+ sourceRecordId: 'it-1',
75
+ includedAt: '2026-10-28T06:01:00.000Z',
76
+ adjustedItemId: 'it-1',
77
+ };
78
+ expect(adjustment.adjustedItemId).toBe('it-1');
79
+ });
80
+
61
81
  it('la liquidación de una nota se lee con el cliente genérico', () => {
62
82
  const settlement: TransferNote.TransferNoteSettlementFeedRecord = {
63
83
  recordId: 'n-1',
@@ -1,6 +1,6 @@
1
1
  import { ReconciliationErrorCodeEnum as C } from '../enums/ReconciliationErrorCodeEnum';
2
- /** Status HTTP de cada code: 404 no existe · 409 conflicto de estado · 422 regla de negocio · 502 falló el dueño del dinero. */
3
- export declare const RECONCILIATION_ERROR_HTTP_STATUS: Readonly<Record<C, 404 | 409 | 422 | 502>>;
2
+ /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
3
+ export declare const RECONCILIATION_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 404 | 409 | 422 | 502>>;
4
4
  /** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
5
5
  export declare const RECONCILIATION_FEED_ERROR_HTTP_STATUS: {
6
6
  readonly FEED_RECORD_NOT_FOUND: 404;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RECONCILIATION_FEED_ERROR_HTTP_STATUS = exports.RECONCILIATION_ERROR_HTTP_STATUS = void 0;
4
4
  const ReconciliationErrorCodeEnum_1 = require("../enums/ReconciliationErrorCodeEnum");
5
5
  const ReconciliationFeedErrorCodeEnum_1 = require("../enums/ReconciliationFeedErrorCodeEnum");
6
- /** Status HTTP de cada code: 404 no existe · 409 conflicto de estado · 422 regla de negocio · 502 falló el dueño del dinero. */
6
+ /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
7
7
  exports.RECONCILIATION_ERROR_HTTP_STATUS = {
8
8
  [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.DEFINITION_NOT_FOUND]: 404,
9
9
  [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.RUN_IN_PROGRESS]: 409,
@@ -16,6 +16,14 @@ exports.RECONCILIATION_ERROR_HTTP_STATUS = {
16
16
  [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.ADJUSTMENT_UNAVAILABLE]: 502,
17
17
  [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.ITEM_ADJUSTED]: 409,
18
18
  [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.AUTHOR_NOT_ALLOWED]: 422,
19
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.INVALID_DEFINITION_STATUS_TRANSITION]: 409,
20
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.DEFINITION_ACTIVE_FROM_REQUIRED]: 422,
21
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.DEFINITION_NOT_RUNNABLE]: 409,
22
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.RULE_TYPE_NOT_SUPPORTED]: 422,
23
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.BANK_CALENDAR_UNAVAILABLE]: 502,
24
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.RUN_DISPATCH_FAILED]: 502,
25
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.BANK_STATEMENT_UNAVAILABLE]: 502,
26
+ [ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.INVALID_SEED_TENANT]: 400,
19
27
  };
20
28
  /** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
21
29
  exports.RECONCILIATION_FEED_ERROR_HTTP_STATUS = {
@@ -20,5 +20,15 @@ export declare enum ReconciliationErrorCodeEnum {
20
20
  /** Una partida ajustada no se reactiva. */
21
21
  ITEM_ADJUSTED = "ITEM_ADJUSTED",
22
22
  /** El `author` del espejo privado no está en la lista permitida del lambda. */
23
- AUTHOR_NOT_ALLOWED = "AUTHOR_NOT_ALLOWED"
23
+ AUTHOR_NOT_ALLOWED = "AUTHOR_NOT_ALLOWED",
24
+ INVALID_DEFINITION_STATUS_TRANSITION = "INVALID_DEFINITION_STATUS_TRANSITION",
25
+ /** Activar una definición exige su fecha de inicio. */
26
+ DEFINITION_ACTIVE_FROM_REQUIRED = "DEFINITION_ACTIVE_FROM_REQUIRED",
27
+ /** La definición no está activa o aún no entra en vigor. */
28
+ DEFINITION_NOT_RUNNABLE = "DEFINITION_NOT_RUNNABLE",
29
+ RULE_TYPE_NOT_SUPPORTED = "RULE_TYPE_NOT_SUPPORTED",
30
+ BANK_CALENDAR_UNAVAILABLE = "BANK_CALENDAR_UNAVAILABLE",
31
+ RUN_DISPATCH_FAILED = "RUN_DISPATCH_FAILED",
32
+ BANK_STATEMENT_UNAVAILABLE = "BANK_STATEMENT_UNAVAILABLE",
33
+ INVALID_SEED_TENANT = "INVALID_SEED_TENANT"
24
34
  }
@@ -25,4 +25,14 @@ var ReconciliationErrorCodeEnum;
25
25
  ReconciliationErrorCodeEnum["ITEM_ADJUSTED"] = "ITEM_ADJUSTED";
26
26
  /** El `author` del espejo privado no está en la lista permitida del lambda. */
27
27
  ReconciliationErrorCodeEnum["AUTHOR_NOT_ALLOWED"] = "AUTHOR_NOT_ALLOWED";
28
+ ReconciliationErrorCodeEnum["INVALID_DEFINITION_STATUS_TRANSITION"] = "INVALID_DEFINITION_STATUS_TRANSITION";
29
+ /** Activar una definición exige su fecha de inicio. */
30
+ ReconciliationErrorCodeEnum["DEFINITION_ACTIVE_FROM_REQUIRED"] = "DEFINITION_ACTIVE_FROM_REQUIRED";
31
+ /** La definición no está activa o aún no entra en vigor. */
32
+ ReconciliationErrorCodeEnum["DEFINITION_NOT_RUNNABLE"] = "DEFINITION_NOT_RUNNABLE";
33
+ ReconciliationErrorCodeEnum["RULE_TYPE_NOT_SUPPORTED"] = "RULE_TYPE_NOT_SUPPORTED";
34
+ ReconciliationErrorCodeEnum["BANK_CALENDAR_UNAVAILABLE"] = "BANK_CALENDAR_UNAVAILABLE";
35
+ ReconciliationErrorCodeEnum["RUN_DISPATCH_FAILED"] = "RUN_DISPATCH_FAILED";
36
+ ReconciliationErrorCodeEnum["BANK_STATEMENT_UNAVAILABLE"] = "BANK_STATEMENT_UNAVAILABLE";
37
+ ReconciliationErrorCodeEnum["INVALID_SEED_TENANT"] = "INVALID_SEED_TENANT";
28
38
  })(ReconciliationErrorCodeEnum || (exports.ReconciliationErrorCodeEnum = ReconciliationErrorCodeEnum = {}));
@@ -3,8 +3,19 @@ import type { ReconciliationRunStatusEnum } from '../enums/ReconciliationRunStat
3
3
  import type { ReconciliationTriggerEnum } from '../enums/ReconciliationTriggerEnum';
4
4
  import type { ReconciliationPreview } from './ReconciliationPreview';
5
5
  import type { ReconciliationRunCounts } from './ReconciliationRunCounts';
6
+ /** Fallos de una corrida: por qué se abortó y en qué intento de SQS va la página que falla. */
7
+ export interface ReconciliationRunAttempts {
8
+ /** Motivo del ABORTED (`MAX_ATTEMPTS`, `ROW_WITHOUT_ID`, el `code` del externo caído, etc.); null si no se abortó. */
9
+ abortReason?: string | null;
10
+ /** `code` del último error de la página en curso; null si la página no ha fallado. */
11
+ lastErrorCode?: string | null;
12
+ /** Intento de SQS (1-based) en que falló la página en curso; null si no ha fallado. */
13
+ attempt?: number | null;
14
+ /** Intentos de SQS que tiene una página antes de abortar la corrida. */
15
+ maxAttempts?: number;
16
+ }
6
17
  /** Respuesta 200 de GET .../reconciliations/{runId} en org (backofficeGetOrgReconciliation). */
7
- export interface GetOrgReconciliationResponse {
18
+ export interface GetOrgReconciliationResponse extends ReconciliationRunAttempts {
8
19
  runId: string;
9
20
  retailerId: string;
10
21
  entity: ReconciliationEntityEnum.STORES | ReconciliationEntityEnum.USERS;
@@ -22,7 +33,7 @@ export interface GetOrgReconciliationResponse {
22
33
  preview?: ReconciliationPreview;
23
34
  }
24
35
  /** Respuesta 200 de GET .../reconciliations/{runId} en catalog (backofficeGetCatalogReconciliation). */
25
- export interface GetCatalogReconciliationResponse {
36
+ export interface GetCatalogReconciliationResponse extends ReconciliationRunAttempts {
26
37
  runId: string;
27
38
  retailerId: string;
28
39
  entity: ReconciliationEntityEnum.CATALOG | ReconciliationEntityEnum.INVENTORY | ReconciliationEntityEnum.MOVEMENTS;
@@ -0,0 +1,3 @@
1
+ import { ReconciliationAdjustmentErrorCodeEnum as C } from '../enums/ReconciliationAdjustmentErrorCodeEnum';
2
+ /** Status HTTP de cada code: 400 request inválido · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
3
+ export declare const RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 409 | 422 | 502>>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS = void 0;
4
+ const ReconciliationAdjustmentErrorCodeEnum_1 = require("../enums/ReconciliationAdjustmentErrorCodeEnum");
5
+ /** Status HTTP de cada code: 400 request inválido · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
6
+ exports.RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS = {
7
+ [ReconciliationAdjustmentErrorCodeEnum_1.ReconciliationAdjustmentErrorCodeEnum.ADJUSTMENT_KEY_CONFLICT]: 409,
8
+ [ReconciliationAdjustmentErrorCodeEnum_1.ReconciliationAdjustmentErrorCodeEnum.ADJUSTMENT_IN_PROGRESS]: 409,
9
+ [ReconciliationAdjustmentErrorCodeEnum_1.ReconciliationAdjustmentErrorCodeEnum.ADJUSTMENT_OUTCOME_UNKNOWN]: 409,
10
+ [ReconciliationAdjustmentErrorCodeEnum_1.ReconciliationAdjustmentErrorCodeEnum.ADJUSTMENT_REJECTED]: 422,
11
+ [ReconciliationAdjustmentErrorCodeEnum_1.ReconciliationAdjustmentErrorCodeEnum.ADJUSTMENT_UNAVAILABLE]: 502,
12
+ [ReconciliationAdjustmentErrorCodeEnum_1.ReconciliationAdjustmentErrorCodeEnum.AUTHOR_NOT_ALLOWED]: 422,
13
+ [ReconciliationAdjustmentErrorCodeEnum_1.ReconciliationAdjustmentErrorCodeEnum.COLLECTION_TENANT_MISSING]: 400,
14
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Codes de error del ajuste de conciliación en transaction-processor; el status de cada uno está en
3
+ * `RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS`.
4
+ */
5
+ export declare enum ReconciliationAdjustmentErrorCodeEnum {
6
+ /** La misma `adjustmentKey` llegó con otro contenido. */
7
+ ADJUSTMENT_KEY_CONFLICT = "ADJUSTMENT_KEY_CONFLICT",
8
+ ADJUSTMENT_IN_PROGRESS = "ADJUSTMENT_IN_PROGRESS",
9
+ /** Un intento previo con la misma llave no dejó resultado conocido. */
10
+ ADJUSTMENT_OUTCOME_UNKNOWN = "ADJUSTMENT_OUTCOME_UNKNOWN",
11
+ ADJUSTMENT_REJECTED = "ADJUSTMENT_REJECTED",
12
+ ADJUSTMENT_UNAVAILABLE = "ADJUSTMENT_UNAVAILABLE",
13
+ AUTHOR_NOT_ALLOWED = "AUTHOR_NOT_ALLOWED",
14
+ COLLECTION_TENANT_MISSING = "COLLECTION_TENANT_MISSING"
15
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReconciliationAdjustmentErrorCodeEnum = void 0;
4
+ /**
5
+ * Codes de error del ajuste de conciliación en transaction-processor; el status de cada uno está en
6
+ * `RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS`.
7
+ */
8
+ var ReconciliationAdjustmentErrorCodeEnum;
9
+ (function (ReconciliationAdjustmentErrorCodeEnum) {
10
+ /** La misma `adjustmentKey` llegó con otro contenido. */
11
+ ReconciliationAdjustmentErrorCodeEnum["ADJUSTMENT_KEY_CONFLICT"] = "ADJUSTMENT_KEY_CONFLICT";
12
+ ReconciliationAdjustmentErrorCodeEnum["ADJUSTMENT_IN_PROGRESS"] = "ADJUSTMENT_IN_PROGRESS";
13
+ /** Un intento previo con la misma llave no dejó resultado conocido. */
14
+ ReconciliationAdjustmentErrorCodeEnum["ADJUSTMENT_OUTCOME_UNKNOWN"] = "ADJUSTMENT_OUTCOME_UNKNOWN";
15
+ ReconciliationAdjustmentErrorCodeEnum["ADJUSTMENT_REJECTED"] = "ADJUSTMENT_REJECTED";
16
+ ReconciliationAdjustmentErrorCodeEnum["ADJUSTMENT_UNAVAILABLE"] = "ADJUSTMENT_UNAVAILABLE";
17
+ ReconciliationAdjustmentErrorCodeEnum["AUTHOR_NOT_ALLOWED"] = "AUTHOR_NOT_ALLOWED";
18
+ ReconciliationAdjustmentErrorCodeEnum["COLLECTION_TENANT_MISSING"] = "COLLECTION_TENANT_MISSING";
19
+ })(ReconciliationAdjustmentErrorCodeEnum || (exports.ReconciliationAdjustmentErrorCodeEnum = ReconciliationAdjustmentErrorCodeEnum = {}));
@@ -46,6 +46,8 @@ export * from './dtos/ReconciliationAdjustmentReference';
46
46
  export * from './dtos/PrivateAuthorizeReconciliationAdjustmentRequest';
47
47
  export * from './dtos/PrivateAuthorizeReconciliationAdjustmentResponse';
48
48
  export * from './enums/TransactionProcessorCodesEnum';
49
+ export * from './enums/ReconciliationAdjustmentErrorCodeEnum';
50
+ export * from './constants/reconciliationAdjustmentErrorHttpStatus';
49
51
  export * from './enums/AsyncTxStatusEnum';
50
52
  export * from './enums/AppEnum';
51
53
  export * from './enums/TransactionInfoStatusEnum';
@@ -62,6 +62,8 @@ __exportStar(require("./dtos/ReconciliationAdjustmentReference"), exports);
62
62
  __exportStar(require("./dtos/PrivateAuthorizeReconciliationAdjustmentRequest"), exports);
63
63
  __exportStar(require("./dtos/PrivateAuthorizeReconciliationAdjustmentResponse"), exports);
64
64
  __exportStar(require("./enums/TransactionProcessorCodesEnum"), exports);
65
+ __exportStar(require("./enums/ReconciliationAdjustmentErrorCodeEnum"), exports);
66
+ __exportStar(require("./constants/reconciliationAdjustmentErrorHttpStatus"), exports);
65
67
  __exportStar(require("./enums/AsyncTxStatusEnum"), exports);
66
68
  __exportStar(require("./enums/AppEnum"), exports);
67
69
  __exportStar(require("./enums/TransactionInfoStatusEnum"), exports);
@@ -1,3 +1,3 @@
1
1
  import { TransferNoteErrorCodeEnum as C } from '../enums/TransferNoteErrorCodeEnum';
2
- /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto de estado · 422 regla de negocio. */
3
- export declare const TRANSFER_NOTE_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 404 | 409 | 422>>;
2
+ /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
3
+ export declare const TRANSFER_NOTE_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 404 | 409 | 422 | 502>>;
@@ -4,7 +4,7 @@ exports.TRANSFER_NOTE_ERROR_HTTP_STATUS = void 0;
4
4
  const reconciliationErrorHttpStatus_1 = require("../../reconciliation/constants/reconciliationErrorHttpStatus");
5
5
  const ReconciliationFeedErrorCodeEnum_1 = require("../../reconciliation/enums/ReconciliationFeedErrorCodeEnum");
6
6
  const TransferNoteErrorCodeEnum_1 = require("../enums/TransferNoteErrorCodeEnum");
7
- /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto de estado · 422 regla de negocio. */
7
+ /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
8
8
  exports.TRANSFER_NOTE_ERROR_HTTP_STATUS = {
9
9
  [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.TRANSFER_NOTE_NOT_FOUND]: 404,
10
10
  [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.NOTE_NOT_DISPUTABLE]: 409,
@@ -27,4 +27,11 @@ exports.TRANSFER_NOTE_ERROR_HTTP_STATUS = {
27
27
  [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.SOURCE_ITEM_NOT_FOUND]: 404,
28
28
  [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.TRANSFER_NOTE_ITEM_NOT_FOUND]: 404,
29
29
  [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.FEED_RECORD_NOT_FOUND]: reconciliationErrorHttpStatus_1.RECONCILIATION_FEED_ERROR_HTTP_STATUS[ReconciliationFeedErrorCodeEnum_1.ReconciliationFeedErrorCodeEnum.FEED_RECORD_NOT_FOUND],
30
+ [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.DISPUTE_ON_PAID_NOTE_PENDING_DECISION]: 409,
31
+ [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.ADJUSTMENT_KEY_CONFLICT]: 409,
32
+ [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.NOTICE_PUBLISH_FAILED]: 502,
33
+ [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.BANK_CALENDAR_UNAVAILABLE]: 502,
34
+ [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.CUTOFF_DISPATCH_FAILED]: 502,
35
+ [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.CONCURRENT_WRITE_CONFLICT]: 409,
36
+ [TransferNoteErrorCodeEnum_1.TransferNoteErrorCodeEnum.AUDIT_QUEUE_PUBLISH_FAILED]: 502,
30
37
  };
@@ -16,6 +16,8 @@ export interface TransferNoteItemFeedRecord extends ReconciliationFeedRecord {
16
16
  /** `recordId` en el feed del dueño del que salió el item. */
17
17
  sourceRecordId: string;
18
18
  includedAt: string;
19
+ /** itemId del item original que corrige un item de concepto ADJUSTMENT. */
20
+ adjustedItemId?: string;
19
21
  }
20
22
  /** Registro del feed TRANSFER_NOTE_SETTLEMENT: lo que una nota debe pagar y lo capturado; `recordId` y `matchKey` son el noteId. */
21
23
  export interface TransferNoteSettlementFeedRecord extends ReconciliationFeedRecord {
@@ -35,4 +37,6 @@ export interface TransferNoteSettlementFeedRecord extends ReconciliationFeedReco
35
37
  payeeClabe: string;
36
38
  paidAt?: string;
37
39
  paidAmountCents?: number;
40
+ /** CLABE destino del SPEI capturado (`TRANSFER_NOTE_CLABE_PATTERN`); el motor la compara contra `payeeClabe`. */
41
+ paidToClabe?: string;
38
42
  }
@@ -28,5 +28,15 @@ export declare enum TransferNoteErrorCodeEnum {
28
28
  /** No hay item para el concepto y registro de origen pedidos en by-source. */
29
29
  TRANSFER_NOTE_ITEM_NOT_FOUND = "TRANSFER_NOTE_ITEM_NOT_FOUND",
30
30
  /** Mismo code del feed genérico que implementa cada dueño. */
31
- FEED_RECORD_NOT_FOUND = "FEED_RECORD_NOT_FOUND"
31
+ FEED_RECORD_NOT_FOUND = "FEED_RECORD_NOT_FOUND",
32
+ /** La nota pagada ya tiene una objeción esperando decisión. */
33
+ DISPUTE_ON_PAID_NOTE_PENDING_DECISION = "DISPUTE_ON_PAID_NOTE_PENDING_DECISION",
34
+ /** La misma llave de ajuste llegó con otro contenido. */
35
+ ADJUSTMENT_KEY_CONFLICT = "ADJUSTMENT_KEY_CONFLICT",
36
+ NOTICE_PUBLISH_FAILED = "NOTICE_PUBLISH_FAILED",
37
+ BANK_CALENDAR_UNAVAILABLE = "BANK_CALENDAR_UNAVAILABLE",
38
+ CUTOFF_DISPATCH_FAILED = "CUTOFF_DISPATCH_FAILED",
39
+ /** Otra escritura cambió el registro entre la lectura y el guardado. */
40
+ CONCURRENT_WRITE_CONFLICT = "CONCURRENT_WRITE_CONFLICT",
41
+ AUDIT_QUEUE_PUBLISH_FAILED = "AUDIT_QUEUE_PUBLISH_FAILED"
32
42
  }
@@ -33,4 +33,14 @@ var TransferNoteErrorCodeEnum;
33
33
  TransferNoteErrorCodeEnum["TRANSFER_NOTE_ITEM_NOT_FOUND"] = "TRANSFER_NOTE_ITEM_NOT_FOUND";
34
34
  /** Mismo code del feed genérico que implementa cada dueño. */
35
35
  TransferNoteErrorCodeEnum["FEED_RECORD_NOT_FOUND"] = "FEED_RECORD_NOT_FOUND";
36
+ /** La nota pagada ya tiene una objeción esperando decisión. */
37
+ TransferNoteErrorCodeEnum["DISPUTE_ON_PAID_NOTE_PENDING_DECISION"] = "DISPUTE_ON_PAID_NOTE_PENDING_DECISION";
38
+ /** La misma llave de ajuste llegó con otro contenido. */
39
+ TransferNoteErrorCodeEnum["ADJUSTMENT_KEY_CONFLICT"] = "ADJUSTMENT_KEY_CONFLICT";
40
+ TransferNoteErrorCodeEnum["NOTICE_PUBLISH_FAILED"] = "NOTICE_PUBLISH_FAILED";
41
+ TransferNoteErrorCodeEnum["BANK_CALENDAR_UNAVAILABLE"] = "BANK_CALENDAR_UNAVAILABLE";
42
+ TransferNoteErrorCodeEnum["CUTOFF_DISPATCH_FAILED"] = "CUTOFF_DISPATCH_FAILED";
43
+ /** Otra escritura cambió el registro entre la lectura y el guardado. */
44
+ TransferNoteErrorCodeEnum["CONCURRENT_WRITE_CONFLICT"] = "CONCURRENT_WRITE_CONFLICT";
45
+ TransferNoteErrorCodeEnum["AUDIT_QUEUE_PUBLISH_FAILED"] = "AUDIT_QUEUE_PUBLISH_FAILED";
36
46
  })(TransferNoteErrorCodeEnum || (exports.TransferNoteErrorCodeEnum = TransferNoteErrorCodeEnum = {}));
@@ -0,0 +1,15 @@
1
+ import { CurrencyId } from '../../currency/enums/CurrencyId';
2
+ export declare class TransferNoteIssuedEventDetail {
3
+ /** Fijo por nota: un reenvío llega con el mismo id. */
4
+ eventId: string;
5
+ tenantId: string;
6
+ noteId: string;
7
+ pairKey: string;
8
+ isoWeek: string;
9
+ netAmountCents: number;
10
+ currency: CurrencyId;
11
+ /** ISO 8601 de la emisión. */
12
+ issuedAt: string;
13
+ /** ISO 8601 del vencimiento del SPEI. */
14
+ dueAt: string;
15
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransferNoteIssuedEventDetail = void 0;
4
+ // `detail` de TransferNoteIssued; source `TRANSFER_NOTE_EVENTS_SOURCE`, detail-type `TRANSFER_NOTE_ISSUED`.
5
+ class TransferNoteIssuedEventDetail {
6
+ }
7
+ exports.TransferNoteIssuedEventDetail = TransferNoteIssuedEventDetail;
@@ -1,7 +1,8 @@
1
1
  import { CurrencyId } from '../../currency/enums/CurrencyId';
2
2
  export declare const TRANSFER_NOTE_EVENTS_SOURCE = "fiado.transferNote";
3
3
  export declare enum TransferNoteEventDetailTypeEnum {
4
- TRANSFER_NOTE_RECONCILED = "transferNote.TransferNoteReconciled"
4
+ TRANSFER_NOTE_RECONCILED = "transferNote.TransferNoteReconciled",
5
+ TRANSFER_NOTE_ISSUED = "transferNote.TransferNoteIssued"
5
6
  }
6
7
  export declare class TransferNoteReconciledEventDetail {
7
8
  /** Fijo por nota: un reenvío llega con el mismo id y el consumidor lo descarta. */
@@ -6,6 +6,7 @@ exports.TRANSFER_NOTE_EVENTS_SOURCE = 'fiado.transferNote';
6
6
  var TransferNoteEventDetailTypeEnum;
7
7
  (function (TransferNoteEventDetailTypeEnum) {
8
8
  TransferNoteEventDetailTypeEnum["TRANSFER_NOTE_RECONCILED"] = "transferNote.TransferNoteReconciled";
9
+ TransferNoteEventDetailTypeEnum["TRANSFER_NOTE_ISSUED"] = "transferNote.TransferNoteIssued";
9
10
  })(TransferNoteEventDetailTypeEnum || (exports.TransferNoteEventDetailTypeEnum = TransferNoteEventDetailTypeEnum = {}));
10
11
  // `detail` de TransferNoteReconciled; el motor recalcula con él el agregado de la semana del par.
11
12
  class TransferNoteReconciledEventDetail {
@@ -32,3 +32,4 @@ export * from './dtos/responses/RetailerTransferNoteResponses';
32
32
  export * from './dtos/responses/TransferNoteConfigResponses';
33
33
  export * from './dtos/responses/PrivateTransferNoteResponses';
34
34
  export * from './events/TransferNoteReconciledEventDetail';
35
+ export * from './events/TransferNoteIssuedEventDetail';
@@ -54,3 +54,4 @@ __exportStar(require("./dtos/responses/TransferNoteConfigResponses"), exports);
54
54
  __exportStar(require("./dtos/responses/PrivateTransferNoteResponses"), exports);
55
55
  // Eventos
56
56
  __exportStar(require("./events/TransferNoteReconciledEventDetail"), exports);
57
+ __exportStar(require("./events/TransferNoteIssuedEventDetail"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.620.0",
3
+ "version": "3.622.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -1,8 +1,8 @@
1
1
  import { ReconciliationErrorCodeEnum as C } from '../enums/ReconciliationErrorCodeEnum';
2
2
  import { ReconciliationFeedErrorCodeEnum } from '../enums/ReconciliationFeedErrorCodeEnum';
3
3
 
4
- /** Status HTTP de cada code: 404 no existe · 409 conflicto de estado · 422 regla de negocio · 502 falló el dueño del dinero. */
5
- export const RECONCILIATION_ERROR_HTTP_STATUS: Readonly<Record<C, 404 | 409 | 422 | 502>> = {
4
+ /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
5
+ export const RECONCILIATION_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 404 | 409 | 422 | 502>> = {
6
6
  [C.DEFINITION_NOT_FOUND]: 404,
7
7
  [C.RUN_IN_PROGRESS]: 409,
8
8
  [C.ITEM_NOT_FOUND]: 404,
@@ -14,6 +14,14 @@ export const RECONCILIATION_ERROR_HTTP_STATUS: Readonly<Record<C, 404 | 409 | 42
14
14
  [C.ADJUSTMENT_UNAVAILABLE]: 502,
15
15
  [C.ITEM_ADJUSTED]: 409,
16
16
  [C.AUTHOR_NOT_ALLOWED]: 422,
17
+ [C.INVALID_DEFINITION_STATUS_TRANSITION]: 409,
18
+ [C.DEFINITION_ACTIVE_FROM_REQUIRED]: 422,
19
+ [C.DEFINITION_NOT_RUNNABLE]: 409,
20
+ [C.RULE_TYPE_NOT_SUPPORTED]: 422,
21
+ [C.BANK_CALENDAR_UNAVAILABLE]: 502,
22
+ [C.RUN_DISPATCH_FAILED]: 502,
23
+ [C.BANK_STATEMENT_UNAVAILABLE]: 502,
24
+ [C.INVALID_SEED_TENANT]: 400,
17
25
  };
18
26
 
19
27
  /** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
@@ -21,4 +21,14 @@ export enum ReconciliationErrorCodeEnum {
21
21
  ITEM_ADJUSTED = 'ITEM_ADJUSTED',
22
22
  /** El `author` del espejo privado no está en la lista permitida del lambda. */
23
23
  AUTHOR_NOT_ALLOWED = 'AUTHOR_NOT_ALLOWED',
24
+ INVALID_DEFINITION_STATUS_TRANSITION = 'INVALID_DEFINITION_STATUS_TRANSITION',
25
+ /** Activar una definición exige su fecha de inicio. */
26
+ DEFINITION_ACTIVE_FROM_REQUIRED = 'DEFINITION_ACTIVE_FROM_REQUIRED',
27
+ /** La definición no está activa o aún no entra en vigor. */
28
+ DEFINITION_NOT_RUNNABLE = 'DEFINITION_NOT_RUNNABLE',
29
+ RULE_TYPE_NOT_SUPPORTED = 'RULE_TYPE_NOT_SUPPORTED',
30
+ BANK_CALENDAR_UNAVAILABLE = 'BANK_CALENDAR_UNAVAILABLE',
31
+ RUN_DISPATCH_FAILED = 'RUN_DISPATCH_FAILED',
32
+ BANK_STATEMENT_UNAVAILABLE = 'BANK_STATEMENT_UNAVAILABLE',
33
+ INVALID_SEED_TENANT = 'INVALID_SEED_TENANT',
24
34
  }
@@ -4,8 +4,20 @@ import type { ReconciliationTriggerEnum } from '../enums/ReconciliationTriggerEn
4
4
  import type { ReconciliationPreview } from './ReconciliationPreview';
5
5
  import type { ReconciliationRunCounts } from './ReconciliationRunCounts';
6
6
 
7
+ /** Fallos de una corrida: por qué se abortó y en qué intento de SQS va la página que falla. */
8
+ export interface ReconciliationRunAttempts {
9
+ /** Motivo del ABORTED (`MAX_ATTEMPTS`, `ROW_WITHOUT_ID`, el `code` del externo caído, etc.); null si no se abortó. */
10
+ abortReason?: string | null;
11
+ /** `code` del último error de la página en curso; null si la página no ha fallado. */
12
+ lastErrorCode?: string | null;
13
+ /** Intento de SQS (1-based) en que falló la página en curso; null si no ha fallado. */
14
+ attempt?: number | null;
15
+ /** Intentos de SQS que tiene una página antes de abortar la corrida. */
16
+ maxAttempts?: number;
17
+ }
18
+
7
19
  /** Respuesta 200 de GET .../reconciliations/{runId} en org (backofficeGetOrgReconciliation). */
8
- export interface GetOrgReconciliationResponse {
20
+ export interface GetOrgReconciliationResponse extends ReconciliationRunAttempts {
9
21
  runId: string;
10
22
  retailerId: string;
11
23
  entity: ReconciliationEntityEnum.STORES | ReconciliationEntityEnum.USERS;
@@ -24,7 +36,7 @@ export interface GetOrgReconciliationResponse {
24
36
  }
25
37
 
26
38
  /** Respuesta 200 de GET .../reconciliations/{runId} en catalog (backofficeGetCatalogReconciliation). */
27
- export interface GetCatalogReconciliationResponse {
39
+ export interface GetCatalogReconciliationResponse extends ReconciliationRunAttempts {
28
40
  runId: string;
29
41
  retailerId: string;
30
42
  entity: ReconciliationEntityEnum.CATALOG | ReconciliationEntityEnum.INVENTORY | ReconciliationEntityEnum.MOVEMENTS;
@@ -0,0 +1,12 @@
1
+ import { ReconciliationAdjustmentErrorCodeEnum as C } from '../enums/ReconciliationAdjustmentErrorCodeEnum';
2
+
3
+ /** Status HTTP de cada code: 400 request inválido · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
4
+ export const RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 409 | 422 | 502>> = {
5
+ [C.ADJUSTMENT_KEY_CONFLICT]: 409,
6
+ [C.ADJUSTMENT_IN_PROGRESS]: 409,
7
+ [C.ADJUSTMENT_OUTCOME_UNKNOWN]: 409,
8
+ [C.ADJUSTMENT_REJECTED]: 422,
9
+ [C.ADJUSTMENT_UNAVAILABLE]: 502,
10
+ [C.AUTHOR_NOT_ALLOWED]: 422,
11
+ [C.COLLECTION_TENANT_MISSING]: 400,
12
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Codes de error del ajuste de conciliación en transaction-processor; el status de cada uno está en
3
+ * `RECONCILIATION_ADJUSTMENT_ERROR_HTTP_STATUS`.
4
+ */
5
+ export enum ReconciliationAdjustmentErrorCodeEnum {
6
+ /** La misma `adjustmentKey` llegó con otro contenido. */
7
+ ADJUSTMENT_KEY_CONFLICT = 'ADJUSTMENT_KEY_CONFLICT',
8
+ ADJUSTMENT_IN_PROGRESS = 'ADJUSTMENT_IN_PROGRESS',
9
+ /** Un intento previo con la misma llave no dejó resultado conocido. */
10
+ ADJUSTMENT_OUTCOME_UNKNOWN = 'ADJUSTMENT_OUTCOME_UNKNOWN',
11
+ ADJUSTMENT_REJECTED = 'ADJUSTMENT_REJECTED',
12
+ ADJUSTMENT_UNAVAILABLE = 'ADJUSTMENT_UNAVAILABLE',
13
+ AUTHOR_NOT_ALLOWED = 'AUTHOR_NOT_ALLOWED',
14
+ COLLECTION_TENANT_MISSING = 'COLLECTION_TENANT_MISSING',
15
+ }
@@ -47,6 +47,8 @@ export * from './dtos/PrivateAuthorizeReconciliationAdjustmentRequest';
47
47
  export * from './dtos/PrivateAuthorizeReconciliationAdjustmentResponse';
48
48
 
49
49
  export * from './enums/TransactionProcessorCodesEnum';
50
+ export * from './enums/ReconciliationAdjustmentErrorCodeEnum';
51
+ export * from './constants/reconciliationAdjustmentErrorHttpStatus';
50
52
  export * from './enums/AsyncTxStatusEnum';
51
53
  export * from './enums/AppEnum';
52
54
  export * from './enums/TransactionInfoStatusEnum';
@@ -2,8 +2,8 @@ import { RECONCILIATION_FEED_ERROR_HTTP_STATUS } from '../../reconciliation/cons
2
2
  import { ReconciliationFeedErrorCodeEnum } from '../../reconciliation/enums/ReconciliationFeedErrorCodeEnum';
3
3
  import { TransferNoteErrorCodeEnum as C } from '../enums/TransferNoteErrorCodeEnum';
4
4
 
5
- /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto de estado · 422 regla de negocio. */
6
- export const TRANSFER_NOTE_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 404 | 409 | 422>> = {
5
+ /** Status HTTP de cada code: 400 request inválido · 404 no existe · 409 conflicto · 422 regla de negocio · 502 falló un externo. */
6
+ export const TRANSFER_NOTE_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 404 | 409 | 422 | 502>> = {
7
7
  [C.TRANSFER_NOTE_NOT_FOUND]: 404,
8
8
  [C.NOTE_NOT_DISPUTABLE]: 409,
9
9
  [C.NET_NOT_POSITIVE]: 422,
@@ -25,4 +25,11 @@ export const TRANSFER_NOTE_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 404 | 409
25
25
  [C.SOURCE_ITEM_NOT_FOUND]: 404,
26
26
  [C.TRANSFER_NOTE_ITEM_NOT_FOUND]: 404,
27
27
  [C.FEED_RECORD_NOT_FOUND]: RECONCILIATION_FEED_ERROR_HTTP_STATUS[ReconciliationFeedErrorCodeEnum.FEED_RECORD_NOT_FOUND],
28
+ [C.DISPUTE_ON_PAID_NOTE_PENDING_DECISION]: 409,
29
+ [C.ADJUSTMENT_KEY_CONFLICT]: 409,
30
+ [C.NOTICE_PUBLISH_FAILED]: 502,
31
+ [C.BANK_CALENDAR_UNAVAILABLE]: 502,
32
+ [C.CUTOFF_DISPATCH_FAILED]: 502,
33
+ [C.CONCURRENT_WRITE_CONFLICT]: 409,
34
+ [C.AUDIT_QUEUE_PUBLISH_FAILED]: 502,
28
35
  };
@@ -14,6 +14,8 @@ export interface TransferNoteItemFeedRecord extends ReconciliationFeedRecord {
14
14
  /** `recordId` en el feed del dueño del que salió el item. */
15
15
  sourceRecordId: string;
16
16
  includedAt: string;
17
+ /** itemId del item original que corrige un item de concepto ADJUSTMENT. */
18
+ adjustedItemId?: string;
17
19
  }
18
20
 
19
21
  /** Registro del feed TRANSFER_NOTE_SETTLEMENT: lo que una nota debe pagar y lo capturado; `recordId` y `matchKey` son el noteId. */
@@ -32,4 +34,6 @@ export interface TransferNoteSettlementFeedRecord extends ReconciliationFeedReco
32
34
  payeeClabe: string;
33
35
  paidAt?: string;
34
36
  paidAmountCents?: number;
37
+ /** CLABE destino del SPEI capturado (`TRANSFER_NOTE_CLABE_PATTERN`); el motor la compara contra `payeeClabe`. */
38
+ paidToClabe?: string;
35
39
  }
@@ -31,4 +31,14 @@ export enum TransferNoteErrorCodeEnum {
31
31
  TRANSFER_NOTE_ITEM_NOT_FOUND = 'TRANSFER_NOTE_ITEM_NOT_FOUND',
32
32
  /** Mismo code del feed genérico que implementa cada dueño. */
33
33
  FEED_RECORD_NOT_FOUND = ReconciliationFeedErrorCodeEnum.FEED_RECORD_NOT_FOUND,
34
+ /** La nota pagada ya tiene una objeción esperando decisión. */
35
+ DISPUTE_ON_PAID_NOTE_PENDING_DECISION = 'DISPUTE_ON_PAID_NOTE_PENDING_DECISION',
36
+ /** La misma llave de ajuste llegó con otro contenido. */
37
+ ADJUSTMENT_KEY_CONFLICT = 'ADJUSTMENT_KEY_CONFLICT',
38
+ NOTICE_PUBLISH_FAILED = 'NOTICE_PUBLISH_FAILED',
39
+ BANK_CALENDAR_UNAVAILABLE = 'BANK_CALENDAR_UNAVAILABLE',
40
+ CUTOFF_DISPATCH_FAILED = 'CUTOFF_DISPATCH_FAILED',
41
+ /** Otra escritura cambió el registro entre la lectura y el guardado. */
42
+ CONCURRENT_WRITE_CONFLICT = 'CONCURRENT_WRITE_CONFLICT',
43
+ AUDIT_QUEUE_PUBLISH_FAILED = 'AUDIT_QUEUE_PUBLISH_FAILED',
34
44
  }
@@ -0,0 +1,17 @@
1
+ import { CurrencyId } from '../../currency/enums/CurrencyId';
2
+
3
+ // `detail` de TransferNoteIssued; source `TRANSFER_NOTE_EVENTS_SOURCE`, detail-type `TRANSFER_NOTE_ISSUED`.
4
+ export class TransferNoteIssuedEventDetail {
5
+ /** Fijo por nota: un reenvío llega con el mismo id. */
6
+ eventId!: string;
7
+ tenantId!: string;
8
+ noteId!: string;
9
+ pairKey!: string;
10
+ isoWeek!: string;
11
+ netAmountCents!: number;
12
+ currency!: CurrencyId;
13
+ /** ISO 8601 de la emisión. */
14
+ issuedAt!: string;
15
+ /** ISO 8601 del vencimiento del SPEI. */
16
+ dueAt!: string;
17
+ }
@@ -5,6 +5,7 @@ export const TRANSFER_NOTE_EVENTS_SOURCE = 'fiado.transferNote';
5
5
 
6
6
  export enum TransferNoteEventDetailTypeEnum {
7
7
  TRANSFER_NOTE_RECONCILED = 'transferNote.TransferNoteReconciled',
8
+ TRANSFER_NOTE_ISSUED = 'transferNote.TransferNoteIssued',
8
9
  }
9
10
 
10
11
  // `detail` de TransferNoteReconciled; el motor recalcula con él el agregado de la semana del par.
@@ -43,3 +43,4 @@ export * from './dtos/responses/PrivateTransferNoteResponses';
43
43
 
44
44
  // Eventos
45
45
  export * from './events/TransferNoteReconciledEventDetail';
46
+ export * from './events/TransferNoteIssuedEventDetail';