@fiado/type-kit 3.621.0 → 3.623.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/reconciliation/m8AdditiveBatch.test.ts +101 -0
- package/_test_/unit/reconciliation/m8EngineBatch.test.ts +81 -0
- package/_test_/unit/transferNote/transferNoteEventsAndFeeds.test.ts +20 -0
- package/bin/reconciliation/constants/reconciliationErrorHttpStatus.d.ts +2 -2
- package/bin/reconciliation/constants/reconciliationErrorHttpStatus.js +12 -1
- package/bin/reconciliation/constants/reconciliationValidation.d.ts +8 -0
- package/bin/reconciliation/constants/reconciliationValidation.js +9 -1
- package/bin/reconciliation/dtos/ReconciliationDefinition.d.ts +9 -0
- package/bin/reconciliation/dtos/requests/ReconciliationActionRequests.d.ts +9 -0
- package/bin/reconciliation/dtos/requests/ReconciliationActionRequests.js +43 -1
- package/bin/reconciliation/dtos/requests/ReconciliationQueries.d.ts +2 -0
- package/bin/reconciliation/dtos/requests/ReconciliationQueries.js +7 -0
- package/bin/reconciliation/enums/ReconciliationErrorCodeEnum.d.ts +17 -1
- package/bin/reconciliation/enums/ReconciliationErrorCodeEnum.js +16 -0
- package/bin/reconciliation/enums/ReconciliationResolutionArchiveReasonEnum.d.ts +5 -1
- package/bin/reconciliation/enums/ReconciliationResolutionArchiveReasonEnum.js +4 -0
- package/bin/transactionProcessor/constants/reconciliationAdjustmentErrorHttpStatus.d.ts +3 -0
- package/bin/transactionProcessor/constants/reconciliationAdjustmentErrorHttpStatus.js +14 -0
- package/bin/transactionProcessor/enums/ReconciliationAdjustmentErrorCodeEnum.d.ts +15 -0
- package/bin/transactionProcessor/enums/ReconciliationAdjustmentErrorCodeEnum.js +19 -0
- package/bin/transactionProcessor/index.d.ts +2 -0
- package/bin/transactionProcessor/index.js +2 -0
- package/bin/transferNote/constants/transferNoteErrorHttpStatus.d.ts +2 -2
- package/bin/transferNote/constants/transferNoteErrorHttpStatus.js +8 -1
- package/bin/transferNote/dtos/TransferNoteFeedRecords.d.ts +4 -0
- package/bin/transferNote/enums/TransferNoteErrorCodeEnum.d.ts +11 -1
- package/bin/transferNote/enums/TransferNoteErrorCodeEnum.js +10 -0
- package/bin/transferNote/events/TransferNoteIssuedEventDetail.d.ts +15 -0
- package/bin/transferNote/events/TransferNoteIssuedEventDetail.js +7 -0
- package/bin/transferNote/events/TransferNoteReconciledEventDetail.d.ts +2 -1
- package/bin/transferNote/events/TransferNoteReconciledEventDetail.js +1 -0
- package/bin/transferNote/index.d.ts +1 -0
- package/bin/transferNote/index.js +1 -0
- package/package.json +1 -1
- package/src/reconciliation/constants/reconciliationErrorHttpStatus.ts +13 -2
- package/src/reconciliation/constants/reconciliationValidation.ts +12 -0
- package/src/reconciliation/dtos/ReconciliationDefinition.ts +10 -0
- package/src/reconciliation/dtos/requests/ReconciliationActionRequests.ts +60 -2
- package/src/reconciliation/dtos/requests/ReconciliationQueries.ts +6 -0
- package/src/reconciliation/enums/ReconciliationErrorCodeEnum.ts +16 -0
- package/src/reconciliation/enums/ReconciliationResolutionArchiveReasonEnum.ts +4 -0
- package/src/transactionProcessor/constants/reconciliationAdjustmentErrorHttpStatus.ts +12 -0
- package/src/transactionProcessor/enums/ReconciliationAdjustmentErrorCodeEnum.ts +15 -0
- package/src/transactionProcessor/index.ts +2 -0
- package/src/transferNote/constants/transferNoteErrorHttpStatus.ts +9 -2
- package/src/transferNote/dtos/TransferNoteFeedRecords.ts +4 -0
- package/src/transferNote/enums/TransferNoteErrorCodeEnum.ts +10 -0
- package/src/transferNote/events/TransferNoteIssuedEventDetail.ts +17 -0
- package/src/transferNote/events/TransferNoteReconciledEventDetail.ts +1 -0
- 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
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validateSync } from 'class-validator';
|
|
4
|
+
import * as Reconciliation from '../../../src/reconciliation';
|
|
5
|
+
|
|
6
|
+
const {
|
|
7
|
+
ConfigureReconciliationDefinitionRequest,
|
|
8
|
+
PrivateConfigureReconciliationDefinitionRequest,
|
|
9
|
+
ListReconciliationItemsQuery,
|
|
10
|
+
PrivateListReconciliationItemsQuery,
|
|
11
|
+
ReconciliationResolutionStatusEnum,
|
|
12
|
+
ReconciliationResolutionArchiveReasonEnum: AR,
|
|
13
|
+
ReconciliationErrorCodeEnum: RC,
|
|
14
|
+
RECONCILIATION_ERROR_HTTP_STATUS,
|
|
15
|
+
} = Reconciliation;
|
|
16
|
+
|
|
17
|
+
function errorsOf<T extends object>(cls: new () => T, payload: Record<string, unknown>): string[] {
|
|
18
|
+
const dto = plainToInstance(cls, payload, { excludeExtraneousValues: true });
|
|
19
|
+
return validateSync(dto).map((e) => e.property);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const operator = { tenantId: 'surekeep', author: 'conciliacion-dashboard', actorId: 'aZ3x9Qk-azure-ad-sub_01' };
|
|
23
|
+
|
|
24
|
+
describe('resolutionStatus en la lista de partidas', () => {
|
|
25
|
+
it.each([
|
|
26
|
+
[ListReconciliationItemsQuery, { definitionId: 'd1' }],
|
|
27
|
+
[PrivateListReconciliationItemsQuery, { definitionId: 'd1', ...operator }],
|
|
28
|
+
])('%p acepta el enum y rechaza otro valor', (cls, base) => {
|
|
29
|
+
const ok = plainToInstance(cls as never, { ...base, resolutionStatus: 'ADJUSTED' }, { excludeExtraneousValues: true }) as { resolutionStatus?: string };
|
|
30
|
+
expect(ok.resolutionStatus).toBe(ReconciliationResolutionStatusEnum.ADJUSTED);
|
|
31
|
+
expect(errorsOf(cls as never, { ...base, resolutionStatus: 'ADJUSTED' })).toEqual([]);
|
|
32
|
+
expect(errorsOf(cls as never, base)).toEqual([]);
|
|
33
|
+
expect(errorsOf(cls as never, { ...base, resolutionStatus: 'NOPE' })).toEqual(['resolutionStatus']);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe('ajustes de banco en configurar definición', () => {
|
|
38
|
+
const accounts = [{ bank: 'BANORTE', account: '0123_45-6' }];
|
|
39
|
+
it.each([
|
|
40
|
+
[ConfigureReconciliationDefinitionRequest, { status: 'ACTIVE' }],
|
|
41
|
+
[PrivateConfigureReconciliationDefinitionRequest, { status: 'ACTIVE', ...operator }],
|
|
42
|
+
])('%p valida los tres campos', (cls, base) => {
|
|
43
|
+
const ok = { ...base, bankAccounts: accounts, statementGraceBusinessDays: 30, fillPayeeConfirmationOnCredit: true };
|
|
44
|
+
expect(errorsOf(cls as never, ok)).toEqual([]);
|
|
45
|
+
expect(errorsOf(cls as never, base)).toEqual([]);
|
|
46
|
+
const dto = plainToInstance(cls as never, ok, { excludeExtraneousValues: true }) as { bankAccounts?: object[] };
|
|
47
|
+
expect(dto.bankAccounts?.[0]).toEqual(accounts[0]);
|
|
48
|
+
expect(errorsOf(cls as never, { ...base, bankAccounts: [{ bank: 'BAN/ORTE', account: '1' }] })).toEqual(['bankAccounts']);
|
|
49
|
+
expect(errorsOf(cls as never, { ...base, bankAccounts: [{ bank: 'B', account: 'x'.repeat(129) }] })).toEqual(['bankAccounts']);
|
|
50
|
+
expect(errorsOf(cls as never, { ...base, bankAccounts: Array.from({ length: 11 }, (_, i) => ({ bank: 'B', account: `${i}` })) })).toEqual(['bankAccounts']);
|
|
51
|
+
expect(errorsOf(cls as never, { ...base, statementGraceBusinessDays: 31 })).toEqual(['statementGraceBusinessDays']);
|
|
52
|
+
expect(errorsOf(cls as never, { ...base, statementGraceBusinessDays: -1 })).toEqual(['statementGraceBusinessDays']);
|
|
53
|
+
expect(errorsOf(cls as never, { ...base, fillPayeeConfirmationOnCredit: 'yes' })).toEqual(['fillPayeeConfirmationOnCredit']);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('la respuesta de definición admite los ajustes de banco', () => {
|
|
57
|
+
const settings: Pick<Reconciliation.ReconciliationDefinition, 'bankAccounts' | 'statementGraceBusinessDays' | 'fillPayeeConfirmationOnCredit'> = {
|
|
58
|
+
bankAccounts: [{ bank: 'BANORTE', account: '1' }],
|
|
59
|
+
statementGraceBusinessDays: 3,
|
|
60
|
+
fillPayeeConfirmationOnCredit: false,
|
|
61
|
+
};
|
|
62
|
+
expect(settings.bankAccounts).toHaveLength(1);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('motivos de archivo nuevos', () => {
|
|
67
|
+
it.each(['SUPERSEDED', 'ADJUSTMENT_REJECTED'])('%s existe', (reason) => {
|
|
68
|
+
expect(Object.values(AR)).toContain(reason);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('codes nuevos del motor con su status', () => {
|
|
73
|
+
it.each([
|
|
74
|
+
['ADJUSTMENT_NEEDS_REVIEW', 409],
|
|
75
|
+
['ADJUSTMENT_REFERENCE_MISSING', 422],
|
|
76
|
+
['BANK_ACCOUNTS_NOT_CONFIGURED', 409],
|
|
77
|
+
])('%s responde %d', (code, status) => {
|
|
78
|
+
expect(Object.values(RC)).toContain(code);
|
|
79
|
+
expect(RECONCILIATION_ERROR_HTTP_STATUS[code as Reconciliation.ReconciliationErrorCodeEnum]).toBe(status);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -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
|
|
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
|
|
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,17 @@ 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,
|
|
27
|
+
[ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.ADJUSTMENT_NEEDS_REVIEW]: 409,
|
|
28
|
+
[ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.ADJUSTMENT_REFERENCE_MISSING]: 422,
|
|
29
|
+
[ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.BANK_ACCOUNTS_NOT_CONFIGURED]: 409,
|
|
19
30
|
};
|
|
20
31
|
/** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
|
|
21
32
|
exports.RECONCILIATION_FEED_ERROR_HTTP_STATUS = {
|
|
@@ -4,5 +4,13 @@ export declare const RECONCILIATION_PERIOD_KEY_PATTERN: RegExp;
|
|
|
4
4
|
export declare const RECONCILIATION_MONTH_PATTERN: RegExp;
|
|
5
5
|
/** Largo mínimo de una nota de investigación. */
|
|
6
6
|
export declare const RECONCILIATION_MIN_NOTE_LENGTH = 10;
|
|
7
|
+
/** Banco o cuenta del EdC: forman la ruta `EDO_CTA/{bank}/{account}/` del bucket. */
|
|
8
|
+
export declare const RECONCILIATION_BANK_PATH_SEGMENT_PATTERN: RegExp;
|
|
9
|
+
/** Largo máximo de un banco o una cuenta del EdC. */
|
|
10
|
+
export declare const RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH = 128;
|
|
11
|
+
/** Cuentas de banco por definición. */
|
|
12
|
+
export declare const RECONCILIATION_MAX_BANK_ACCOUNTS = 10;
|
|
13
|
+
/** Días hábiles máximos de espera del EdC. */
|
|
14
|
+
export declare const RECONCILIATION_MAX_STATEMENT_GRACE_BUSINESS_DAYS = 30;
|
|
7
15
|
/** Registros por página de un feed de dueño. */
|
|
8
16
|
export declare const RECONCILIATION_FEED_PAGE_SIZE = 500;
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RECONCILIATION_FEED_PAGE_SIZE = exports.RECONCILIATION_MIN_NOTE_LENGTH = exports.RECONCILIATION_MONTH_PATTERN = exports.RECONCILIATION_PERIOD_KEY_PATTERN = void 0;
|
|
3
|
+
exports.RECONCILIATION_FEED_PAGE_SIZE = exports.RECONCILIATION_MAX_STATEMENT_GRACE_BUSINESS_DAYS = exports.RECONCILIATION_MAX_BANK_ACCOUNTS = exports.RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH = exports.RECONCILIATION_BANK_PATH_SEGMENT_PATTERN = exports.RECONCILIATION_MIN_NOTE_LENGTH = exports.RECONCILIATION_MONTH_PATTERN = exports.RECONCILIATION_PERIOD_KEY_PATTERN = void 0;
|
|
4
4
|
/** Periodo de una corrida: día `YYYY-MM-DD`, semana ISO `YYYY-Www` o mes `YYYY-MM`. */
|
|
5
5
|
exports.RECONCILIATION_PERIOD_KEY_PATTERN = /^\d{4}-((0[1-9]|1[0-2])(-(0[1-9]|[12]\d|3[01]))?|W(0[1-9]|[1-4]\d|5[0-3]))$/;
|
|
6
6
|
/** Mes `YYYY-MM`. */
|
|
7
7
|
exports.RECONCILIATION_MONTH_PATTERN = /^\d{4}-(0[1-9]|1[0-2])$/;
|
|
8
8
|
/** Largo mínimo de una nota de investigación. */
|
|
9
9
|
exports.RECONCILIATION_MIN_NOTE_LENGTH = 10;
|
|
10
|
+
/** Banco o cuenta del EdC: forman la ruta `EDO_CTA/{bank}/{account}/` del bucket. */
|
|
11
|
+
exports.RECONCILIATION_BANK_PATH_SEGMENT_PATTERN = /^[A-Za-z0-9_-]+$/;
|
|
12
|
+
/** Largo máximo de un banco o una cuenta del EdC. */
|
|
13
|
+
exports.RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH = 128;
|
|
14
|
+
/** Cuentas de banco por definición. */
|
|
15
|
+
exports.RECONCILIATION_MAX_BANK_ACCOUNTS = 10;
|
|
16
|
+
/** Días hábiles máximos de espera del EdC. */
|
|
17
|
+
exports.RECONCILIATION_MAX_STATEMENT_GRACE_BUSINESS_DAYS = 30;
|
|
10
18
|
/** Registros por página de un feed de dueño. */
|
|
11
19
|
exports.RECONCILIATION_FEED_PAGE_SIZE = 500;
|
|
@@ -12,6 +12,11 @@ export interface ReconciliationDefinitionSource {
|
|
|
12
12
|
concept: ReconciliationFeedConceptEnum;
|
|
13
13
|
partName?: string;
|
|
14
14
|
}
|
|
15
|
+
/** Cuenta de FSA cuyo EdC lee una definición BANK_STATEMENT. */
|
|
16
|
+
export interface ReconciliationDefinitionBankAccountView {
|
|
17
|
+
bank: string;
|
|
18
|
+
account: string;
|
|
19
|
+
}
|
|
15
20
|
export interface ReconciliationDefinition {
|
|
16
21
|
tenantId: string;
|
|
17
22
|
definitionId: string;
|
|
@@ -34,6 +39,10 @@ export interface ReconciliationDefinition {
|
|
|
34
39
|
sandboxRetailerIds: string[];
|
|
35
40
|
sandboxDirectoryIds: string[];
|
|
36
41
|
activeFrom?: string;
|
|
42
|
+
/** Ajustes del EdC; solo en las definiciones BANK_STATEMENT. */
|
|
43
|
+
bankAccounts?: ReconciliationDefinitionBankAccountView[];
|
|
44
|
+
statementGraceBusinessDays?: number;
|
|
45
|
+
fillPayeeConfirmationOnCredit?: boolean;
|
|
37
46
|
version: number;
|
|
38
47
|
createdAt: string;
|
|
39
48
|
createdBy: string;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { ReconciliationDefinitionStatusEnum } from '../../enums/ReconciliationDefinitionStatusEnum';
|
|
2
2
|
import { ReconciliationResolutionTypeEnum } from '../../enums/ReconciliationResolutionTypeEnum';
|
|
3
|
+
/** Cuenta de FSA cuyo EdC lee una definición BANK_STATEMENT. */
|
|
4
|
+
export declare class ReconciliationDefinitionBankAccount {
|
|
5
|
+
bank: string;
|
|
6
|
+
account: string;
|
|
7
|
+
}
|
|
3
8
|
/** Body de publicConfigureReconciliationDefinition. */
|
|
4
9
|
export declare class ConfigureReconciliationDefinitionRequest {
|
|
5
10
|
status: ReconciliationDefinitionStatusEnum;
|
|
@@ -9,6 +14,10 @@ export declare class ConfigureReconciliationDefinitionRequest {
|
|
|
9
14
|
sandboxRetailerIds?: string[];
|
|
10
15
|
sandboxDirectoryIds?: string[];
|
|
11
16
|
activeFrom?: string;
|
|
17
|
+
/** Reemplaza la lista completa de cuentas del EdC. */
|
|
18
|
+
bankAccounts?: ReconciliationDefinitionBankAccount[];
|
|
19
|
+
statementGraceBusinessDays?: number;
|
|
20
|
+
fillPayeeConfirmationOnCredit?: boolean;
|
|
12
21
|
}
|
|
13
22
|
/** Body de publicRunReconciliation: responde 202 con `runId` y corre asíncrono. */
|
|
14
23
|
export declare class RunReconciliationRequest {
|
|
@@ -9,12 +9,31 @@ 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.AddReconciliationItemNoteRequest = exports.ReactivateReconciliationItemRequest = exports.ResolveReconciliationItemRequest = exports.RunReconciliationRequest = exports.ConfigureReconciliationDefinitionRequest = void 0;
|
|
12
|
+
exports.AddReconciliationItemNoteRequest = exports.ReactivateReconciliationItemRequest = exports.ResolveReconciliationItemRequest = exports.RunReconciliationRequest = exports.ConfigureReconciliationDefinitionRequest = exports.ReconciliationDefinitionBankAccount = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
|
+
const reconciliationValidation_1 = require("../../constants/reconciliationValidation");
|
|
15
16
|
const ReconciliationDefinitionStatusEnum_1 = require("../../enums/ReconciliationDefinitionStatusEnum");
|
|
16
17
|
const ReconciliationResolutionTypeEnum_1 = require("../../enums/ReconciliationResolutionTypeEnum");
|
|
17
18
|
const reconciliationRequestDecorators_1 = require("./reconciliationRequestDecorators");
|
|
19
|
+
/** Cuenta de FSA cuyo EdC lee una definición BANK_STATEMENT. */
|
|
20
|
+
class ReconciliationDefinitionBankAccount {
|
|
21
|
+
}
|
|
22
|
+
exports.ReconciliationDefinitionBankAccount = ReconciliationDefinitionBankAccount;
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, class_transformer_1.Expose)(),
|
|
25
|
+
(0, class_validator_1.IsString)(),
|
|
26
|
+
(0, class_validator_1.MaxLength)(reconciliationValidation_1.RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH),
|
|
27
|
+
(0, class_validator_1.Matches)(reconciliationValidation_1.RECONCILIATION_BANK_PATH_SEGMENT_PATTERN),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], ReconciliationDefinitionBankAccount.prototype, "bank", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, class_transformer_1.Expose)(),
|
|
32
|
+
(0, class_validator_1.IsString)(),
|
|
33
|
+
(0, class_validator_1.MaxLength)(reconciliationValidation_1.RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH),
|
|
34
|
+
(0, class_validator_1.Matches)(reconciliationValidation_1.RECONCILIATION_BANK_PATH_SEGMENT_PATTERN),
|
|
35
|
+
__metadata("design:type", String)
|
|
36
|
+
], ReconciliationDefinitionBankAccount.prototype, "account", void 0);
|
|
18
37
|
/** Body de publicConfigureReconciliationDefinition. */
|
|
19
38
|
class ConfigureReconciliationDefinitionRequest {
|
|
20
39
|
}
|
|
@@ -62,6 +81,29 @@ __decorate([
|
|
|
62
81
|
(0, class_validator_1.IsISO8601)(),
|
|
63
82
|
__metadata("design:type", String)
|
|
64
83
|
], ConfigureReconciliationDefinitionRequest.prototype, "activeFrom", void 0);
|
|
84
|
+
__decorate([
|
|
85
|
+
(0, class_transformer_1.Expose)(),
|
|
86
|
+
(0, class_validator_1.IsOptional)(),
|
|
87
|
+
(0, class_validator_1.IsArray)(),
|
|
88
|
+
(0, class_validator_1.ArrayMaxSize)(reconciliationValidation_1.RECONCILIATION_MAX_BANK_ACCOUNTS),
|
|
89
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
90
|
+
(0, class_transformer_1.Type)(() => ReconciliationDefinitionBankAccount),
|
|
91
|
+
__metadata("design:type", Array)
|
|
92
|
+
], ConfigureReconciliationDefinitionRequest.prototype, "bankAccounts", void 0);
|
|
93
|
+
__decorate([
|
|
94
|
+
(0, class_transformer_1.Expose)(),
|
|
95
|
+
(0, class_validator_1.IsOptional)(),
|
|
96
|
+
(0, class_validator_1.IsInt)(),
|
|
97
|
+
(0, class_validator_1.Min)(0),
|
|
98
|
+
(0, class_validator_1.Max)(reconciliationValidation_1.RECONCILIATION_MAX_STATEMENT_GRACE_BUSINESS_DAYS),
|
|
99
|
+
__metadata("design:type", Number)
|
|
100
|
+
], ConfigureReconciliationDefinitionRequest.prototype, "statementGraceBusinessDays", void 0);
|
|
101
|
+
__decorate([
|
|
102
|
+
(0, class_transformer_1.Expose)(),
|
|
103
|
+
(0, class_validator_1.IsOptional)(),
|
|
104
|
+
(0, class_validator_1.IsBoolean)(),
|
|
105
|
+
__metadata("design:type", Boolean)
|
|
106
|
+
], ConfigureReconciliationDefinitionRequest.prototype, "fillPayeeConfirmationOnCredit", void 0);
|
|
65
107
|
/** Body de publicRunReconciliation: responde 202 con `runId` y corre asíncrono. */
|
|
66
108
|
class RunReconciliationRequest {
|
|
67
109
|
}
|
|
@@ -4,6 +4,7 @@ import { ReconciliationExportFormatEnum } from '../../enums/ReconciliationExport
|
|
|
4
4
|
import { ReconciliationFeedConceptEnum } from '../../enums/ReconciliationFeedConceptEnum';
|
|
5
5
|
import { ReconciliationItemStateEnum } from '../../enums/ReconciliationItemStateEnum';
|
|
6
6
|
import { ReconciliationLayerEnum } from '../../enums/ReconciliationLayerEnum';
|
|
7
|
+
import { ReconciliationResolutionStatusEnum } from '../../enums/ReconciliationResolutionStatusEnum';
|
|
7
8
|
import { ReconciliationRuleTypeEnum } from '../../enums/ReconciliationRuleTypeEnum';
|
|
8
9
|
import { ReconciliationRunStatusEnum } from '../../enums/ReconciliationRunStatusEnum';
|
|
9
10
|
/** Query de publicListReconciliationDefinitions. */
|
|
@@ -49,6 +50,7 @@ export declare class ListReconciliationItemsQuery {
|
|
|
49
50
|
concept?: ReconciliationFeedConceptEnum;
|
|
50
51
|
counterpartyId?: string;
|
|
51
52
|
format?: ReconciliationExportFormatEnum;
|
|
53
|
+
resolutionStatus?: ReconciliationResolutionStatusEnum;
|
|
52
54
|
limit?: number;
|
|
53
55
|
nextToken?: string;
|
|
54
56
|
}
|
|
@@ -19,6 +19,7 @@ const ReconciliationExportFormatEnum_1 = require("../../enums/ReconciliationExpo
|
|
|
19
19
|
const ReconciliationFeedConceptEnum_1 = require("../../enums/ReconciliationFeedConceptEnum");
|
|
20
20
|
const ReconciliationItemStateEnum_1 = require("../../enums/ReconciliationItemStateEnum");
|
|
21
21
|
const ReconciliationLayerEnum_1 = require("../../enums/ReconciliationLayerEnum");
|
|
22
|
+
const ReconciliationResolutionStatusEnum_1 = require("../../enums/ReconciliationResolutionStatusEnum");
|
|
22
23
|
const ReconciliationRuleTypeEnum_1 = require("../../enums/ReconciliationRuleTypeEnum");
|
|
23
24
|
const ReconciliationRunStatusEnum_1 = require("../../enums/ReconciliationRunStatusEnum");
|
|
24
25
|
const reconciliationRequestDecorators_1 = require("./reconciliationRequestDecorators");
|
|
@@ -182,6 +183,12 @@ __decorate([
|
|
|
182
183
|
(0, class_validator_1.IsEnum)(ReconciliationExportFormatEnum_1.ReconciliationExportFormatEnum),
|
|
183
184
|
__metadata("design:type", String)
|
|
184
185
|
], ListReconciliationItemsQuery.prototype, "format", void 0);
|
|
186
|
+
__decorate([
|
|
187
|
+
(0, class_transformer_1.Expose)(),
|
|
188
|
+
(0, class_validator_1.IsOptional)(),
|
|
189
|
+
(0, class_validator_1.IsEnum)(ReconciliationResolutionStatusEnum_1.ReconciliationResolutionStatusEnum),
|
|
190
|
+
__metadata("design:type", String)
|
|
191
|
+
], ListReconciliationItemsQuery.prototype, "resolutionStatus", void 0);
|
|
185
192
|
__decorate([
|
|
186
193
|
(0, reconciliationRequestDecorators_1.PageLimit)(),
|
|
187
194
|
__metadata("design:type", Number)
|
|
@@ -20,5 +20,21 @@ 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",
|
|
34
|
+
/** El ajuste quedó con resultado incierto y se revisa a mano. */
|
|
35
|
+
ADJUSTMENT_NEEDS_REVIEW = "ADJUSTMENT_NEEDS_REVIEW",
|
|
36
|
+
/** A la partida le falta la referencia que pide el ajuste. */
|
|
37
|
+
ADJUSTMENT_REFERENCE_MISSING = "ADJUSTMENT_REFERENCE_MISSING",
|
|
38
|
+
/** La definición de banco no tiene cuentas configuradas. */
|
|
39
|
+
BANK_ACCOUNTS_NOT_CONFIGURED = "BANK_ACCOUNTS_NOT_CONFIGURED"
|
|
24
40
|
}
|
|
@@ -25,4 +25,20 @@ 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";
|
|
38
|
+
/** El ajuste quedó con resultado incierto y se revisa a mano. */
|
|
39
|
+
ReconciliationErrorCodeEnum["ADJUSTMENT_NEEDS_REVIEW"] = "ADJUSTMENT_NEEDS_REVIEW";
|
|
40
|
+
/** A la partida le falta la referencia que pide el ajuste. */
|
|
41
|
+
ReconciliationErrorCodeEnum["ADJUSTMENT_REFERENCE_MISSING"] = "ADJUSTMENT_REFERENCE_MISSING";
|
|
42
|
+
/** La definición de banco no tiene cuentas configuradas. */
|
|
43
|
+
ReconciliationErrorCodeEnum["BANK_ACCOUNTS_NOT_CONFIGURED"] = "BANK_ACCOUNTS_NOT_CONFIGURED";
|
|
28
44
|
})(ReconciliationErrorCodeEnum || (exports.ReconciliationErrorCodeEnum = ReconciliationErrorCodeEnum = {}));
|
|
@@ -2,5 +2,9 @@
|
|
|
2
2
|
export declare enum ReconciliationResolutionArchiveReasonEnum {
|
|
3
3
|
REACTIVATED = "REACTIVATED",
|
|
4
4
|
/** La corrida encontró que ambos lados ya cuadran. */
|
|
5
|
-
MATCHED_ON_RECALCULATION = "MATCHED_ON_RECALCULATION"
|
|
5
|
+
MATCHED_ON_RECALCULATION = "MATCHED_ON_RECALCULATION",
|
|
6
|
+
/** Otra resolución la reemplazó. */
|
|
7
|
+
SUPERSEDED = "SUPERSEDED",
|
|
8
|
+
/** El dueño del dinero rechazó el ajuste. */
|
|
9
|
+
ADJUSTMENT_REJECTED = "ADJUSTMENT_REJECTED"
|
|
6
10
|
}
|
|
@@ -7,4 +7,8 @@ var ReconciliationResolutionArchiveReasonEnum;
|
|
|
7
7
|
ReconciliationResolutionArchiveReasonEnum["REACTIVATED"] = "REACTIVATED";
|
|
8
8
|
/** La corrida encontró que ambos lados ya cuadran. */
|
|
9
9
|
ReconciliationResolutionArchiveReasonEnum["MATCHED_ON_RECALCULATION"] = "MATCHED_ON_RECALCULATION";
|
|
10
|
+
/** Otra resolución la reemplazó. */
|
|
11
|
+
ReconciliationResolutionArchiveReasonEnum["SUPERSEDED"] = "SUPERSEDED";
|
|
12
|
+
/** El dueño del dinero rechazó el ajuste. */
|
|
13
|
+
ReconciliationResolutionArchiveReasonEnum["ADJUSTMENT_REJECTED"] = "ADJUSTMENT_REJECTED";
|
|
10
14
|
})(ReconciliationResolutionArchiveReasonEnum || (exports.ReconciliationResolutionArchiveReasonEnum = ReconciliationResolutionArchiveReasonEnum = {}));
|
|
@@ -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
|
|
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
|
|
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,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
|
|
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,17 @@ 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,
|
|
25
|
+
[C.ADJUSTMENT_NEEDS_REVIEW]: 409,
|
|
26
|
+
[C.ADJUSTMENT_REFERENCE_MISSING]: 422,
|
|
27
|
+
[C.BANK_ACCOUNTS_NOT_CONFIGURED]: 409,
|
|
17
28
|
};
|
|
18
29
|
|
|
19
30
|
/** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
|
|
@@ -7,5 +7,17 @@ export const RECONCILIATION_MONTH_PATTERN = /^\d{4}-(0[1-9]|1[0-2])$/;
|
|
|
7
7
|
/** Largo mínimo de una nota de investigación. */
|
|
8
8
|
export const RECONCILIATION_MIN_NOTE_LENGTH = 10;
|
|
9
9
|
|
|
10
|
+
/** Banco o cuenta del EdC: forman la ruta `EDO_CTA/{bank}/{account}/` del bucket. */
|
|
11
|
+
export const RECONCILIATION_BANK_PATH_SEGMENT_PATTERN = /^[A-Za-z0-9_-]+$/;
|
|
12
|
+
|
|
13
|
+
/** Largo máximo de un banco o una cuenta del EdC. */
|
|
14
|
+
export const RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH = 128;
|
|
15
|
+
|
|
16
|
+
/** Cuentas de banco por definición. */
|
|
17
|
+
export const RECONCILIATION_MAX_BANK_ACCOUNTS = 10;
|
|
18
|
+
|
|
19
|
+
/** Días hábiles máximos de espera del EdC. */
|
|
20
|
+
export const RECONCILIATION_MAX_STATEMENT_GRACE_BUSINESS_DAYS = 30;
|
|
21
|
+
|
|
10
22
|
/** Registros por página de un feed de dueño. */
|
|
11
23
|
export const RECONCILIATION_FEED_PAGE_SIZE = 500;
|
|
@@ -14,6 +14,12 @@ export interface ReconciliationDefinitionSource {
|
|
|
14
14
|
partName?: string;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
/** Cuenta de FSA cuyo EdC lee una definición BANK_STATEMENT. */
|
|
18
|
+
export interface ReconciliationDefinitionBankAccountView {
|
|
19
|
+
bank: string;
|
|
20
|
+
account: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
17
23
|
export interface ReconciliationDefinition {
|
|
18
24
|
tenantId: string;
|
|
19
25
|
definitionId: string;
|
|
@@ -36,6 +42,10 @@ export interface ReconciliationDefinition {
|
|
|
36
42
|
sandboxRetailerIds: string[];
|
|
37
43
|
sandboxDirectoryIds: string[];
|
|
38
44
|
activeFrom?: string;
|
|
45
|
+
/** Ajustes del EdC; solo en las definiciones BANK_STATEMENT. */
|
|
46
|
+
bankAccounts?: ReconciliationDefinitionBankAccountView[];
|
|
47
|
+
statementGraceBusinessDays?: number;
|
|
48
|
+
fillPayeeConfirmationOnCredit?: boolean;
|
|
39
49
|
version: number;
|
|
40
50
|
createdAt: string;
|
|
41
51
|
createdBy: string;
|
|
@@ -1,9 +1,46 @@
|
|
|
1
|
-
import { Expose } from 'class-transformer';
|
|
2
|
-
import {
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import {
|
|
3
|
+
ArrayMaxSize,
|
|
4
|
+
ArrayUnique,
|
|
5
|
+
IsArray,
|
|
6
|
+
IsBoolean,
|
|
7
|
+
IsEnum,
|
|
8
|
+
IsInt,
|
|
9
|
+
IsISO8601,
|
|
10
|
+
IsNotEmpty,
|
|
11
|
+
IsOptional,
|
|
12
|
+
IsString,
|
|
13
|
+
Matches,
|
|
14
|
+
Max,
|
|
15
|
+
MaxLength,
|
|
16
|
+
Min,
|
|
17
|
+
ValidateNested,
|
|
18
|
+
} from 'class-validator';
|
|
19
|
+
import {
|
|
20
|
+
RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH,
|
|
21
|
+
RECONCILIATION_BANK_PATH_SEGMENT_PATTERN,
|
|
22
|
+
RECONCILIATION_MAX_BANK_ACCOUNTS,
|
|
23
|
+
RECONCILIATION_MAX_STATEMENT_GRACE_BUSINESS_DAYS,
|
|
24
|
+
} from '../../constants/reconciliationValidation';
|
|
3
25
|
import { ReconciliationDefinitionStatusEnum } from '../../enums/ReconciliationDefinitionStatusEnum';
|
|
4
26
|
import { ReconciliationResolutionTypeEnum } from '../../enums/ReconciliationResolutionTypeEnum';
|
|
5
27
|
import { NoteText, PeriodKey, RequiredId, RequiredReason } from './reconciliationRequestDecorators';
|
|
6
28
|
|
|
29
|
+
/** Cuenta de FSA cuyo EdC lee una definición BANK_STATEMENT. */
|
|
30
|
+
export class ReconciliationDefinitionBankAccount {
|
|
31
|
+
@Expose()
|
|
32
|
+
@IsString()
|
|
33
|
+
@MaxLength(RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH)
|
|
34
|
+
@Matches(RECONCILIATION_BANK_PATH_SEGMENT_PATTERN)
|
|
35
|
+
bank!: string;
|
|
36
|
+
|
|
37
|
+
@Expose()
|
|
38
|
+
@IsString()
|
|
39
|
+
@MaxLength(RECONCILIATION_BANK_PATH_SEGMENT_MAX_LENGTH)
|
|
40
|
+
@Matches(RECONCILIATION_BANK_PATH_SEGMENT_PATTERN)
|
|
41
|
+
account!: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
7
44
|
/** Body de publicConfigureReconciliationDefinition. */
|
|
8
45
|
export class ConfigureReconciliationDefinitionRequest {
|
|
9
46
|
@Expose()
|
|
@@ -43,6 +80,27 @@ export class ConfigureReconciliationDefinitionRequest {
|
|
|
43
80
|
@IsOptional()
|
|
44
81
|
@IsISO8601()
|
|
45
82
|
activeFrom?: string;
|
|
83
|
+
|
|
84
|
+
/** Reemplaza la lista completa de cuentas del EdC. */
|
|
85
|
+
@Expose()
|
|
86
|
+
@IsOptional()
|
|
87
|
+
@IsArray()
|
|
88
|
+
@ArrayMaxSize(RECONCILIATION_MAX_BANK_ACCOUNTS)
|
|
89
|
+
@ValidateNested({ each: true })
|
|
90
|
+
@Type(() => ReconciliationDefinitionBankAccount)
|
|
91
|
+
bankAccounts?: ReconciliationDefinitionBankAccount[];
|
|
92
|
+
|
|
93
|
+
@Expose()
|
|
94
|
+
@IsOptional()
|
|
95
|
+
@IsInt()
|
|
96
|
+
@Min(0)
|
|
97
|
+
@Max(RECONCILIATION_MAX_STATEMENT_GRACE_BUSINESS_DAYS)
|
|
98
|
+
statementGraceBusinessDays?: number;
|
|
99
|
+
|
|
100
|
+
@Expose()
|
|
101
|
+
@IsOptional()
|
|
102
|
+
@IsBoolean()
|
|
103
|
+
fillPayeeConfirmationOnCredit?: boolean;
|
|
46
104
|
}
|
|
47
105
|
|
|
48
106
|
/** Body de publicRunReconciliation: responde 202 con `runId` y corre asíncrono. */
|
|
@@ -7,6 +7,7 @@ import { ReconciliationExportFormatEnum } from '../../enums/ReconciliationExport
|
|
|
7
7
|
import { ReconciliationFeedConceptEnum } from '../../enums/ReconciliationFeedConceptEnum';
|
|
8
8
|
import { ReconciliationItemStateEnum } from '../../enums/ReconciliationItemStateEnum';
|
|
9
9
|
import { ReconciliationLayerEnum } from '../../enums/ReconciliationLayerEnum';
|
|
10
|
+
import { ReconciliationResolutionStatusEnum } from '../../enums/ReconciliationResolutionStatusEnum';
|
|
10
11
|
import { ReconciliationRuleTypeEnum } from '../../enums/ReconciliationRuleTypeEnum';
|
|
11
12
|
import { ReconciliationRunStatusEnum } from '../../enums/ReconciliationRunStatusEnum';
|
|
12
13
|
import { PageLimit, PageToken, PeriodKey, RequiredId } from './reconciliationRequestDecorators';
|
|
@@ -140,6 +141,11 @@ export class ListReconciliationItemsQuery {
|
|
|
140
141
|
@IsEnum(ReconciliationExportFormatEnum)
|
|
141
142
|
format?: ReconciliationExportFormatEnum;
|
|
142
143
|
|
|
144
|
+
@Expose()
|
|
145
|
+
@IsOptional()
|
|
146
|
+
@IsEnum(ReconciliationResolutionStatusEnum)
|
|
147
|
+
resolutionStatus?: ReconciliationResolutionStatusEnum;
|
|
148
|
+
|
|
143
149
|
@PageLimit()
|
|
144
150
|
limit?: number;
|
|
145
151
|
|
|
@@ -21,4 +21,20 @@ 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',
|
|
34
|
+
/** El ajuste quedó con resultado incierto y se revisa a mano. */
|
|
35
|
+
ADJUSTMENT_NEEDS_REVIEW = 'ADJUSTMENT_NEEDS_REVIEW',
|
|
36
|
+
/** A la partida le falta la referencia que pide el ajuste. */
|
|
37
|
+
ADJUSTMENT_REFERENCE_MISSING = 'ADJUSTMENT_REFERENCE_MISSING',
|
|
38
|
+
/** La definición de banco no tiene cuentas configuradas. */
|
|
39
|
+
BANK_ACCOUNTS_NOT_CONFIGURED = 'BANK_ACCOUNTS_NOT_CONFIGURED',
|
|
24
40
|
}
|
|
@@ -3,4 +3,8 @@ export enum ReconciliationResolutionArchiveReasonEnum {
|
|
|
3
3
|
REACTIVATED = 'REACTIVATED',
|
|
4
4
|
/** La corrida encontró que ambos lados ya cuadran. */
|
|
5
5
|
MATCHED_ON_RECALCULATION = 'MATCHED_ON_RECALCULATION',
|
|
6
|
+
/** Otra resolución la reemplazó. */
|
|
7
|
+
SUPERSEDED = 'SUPERSEDED',
|
|
8
|
+
/** El dueño del dinero rechazó el ajuste. */
|
|
9
|
+
ADJUSTMENT_REJECTED = 'ADJUSTMENT_REJECTED',
|
|
6
10
|
}
|
|
@@ -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
|
|
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.
|