@fiado/type-kit 3.617.0 → 3.619.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/account/BankAccountMCSendTransfer.test.ts +43 -0
- package/_test_/unit/collection/authorizeCollectionMovementRequest.test.ts +33 -0
- package/_test_/unit/reconciliation/reconciliationCatalogs.test.ts +9 -0
- package/bin/account/dtos/BankAccountMCSendTransferRequest.d.ts +8 -2
- package/bin/account/dtos/BankAccountMCSendTransferResponse.d.ts +3 -0
- package/bin/collection/dtos/AuthorizeCollectionMovementRequest.d.ts +1 -0
- package/bin/collection/dtos/AuthorizeCollectionMovementRequest.js +6 -0
- package/bin/reconciliation/constants/reconciliationErrorHttpStatus.d.ts +7 -3
- package/bin/reconciliation/constants/reconciliationErrorHttpStatus.js +4 -1
- package/bin/reconciliation/enums/ReconciliationFeedErrorCodeEnum.d.ts +4 -1
- package/bin/reconciliation/enums/ReconciliationFeedErrorCodeEnum.js +3 -0
- package/package.json +1 -1
- package/src/account/dtos/BankAccountMCSendTransferRequest.ts +8 -2
- package/src/account/dtos/BankAccountMCSendTransferResponse.ts +3 -0
- package/src/collection/dtos/AuthorizeCollectionMovementRequest.ts +3 -1
- package/src/reconciliation/constants/reconciliationErrorHttpStatus.ts +6 -3
- package/src/reconciliation/enums/ReconciliationFeedErrorCodeEnum.ts +3 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { BankAccountMCSendTransferRequest, BankAccountMCSendTransferResponse } from '../../../src/account/index';
|
|
3
|
+
import { TransactionStatusEnum } from '../../../src/transaction';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* MC Send directo a una tarjeta del programa (CARD_PUSH_FUNDS): el request admite el cd_ del
|
|
7
|
+
* beneficiario y entonces email y teléfono dejan de ser obligatorios; la respuesta expone el id
|
|
8
|
+
* de la network transfer de CP (mt_) además de los tx_.
|
|
9
|
+
*/
|
|
10
|
+
describe('BankAccountMCSendTransferRequest', () => {
|
|
11
|
+
it('acepta un push directo a tarjeta sin email ni teléfono del beneficiario', () => {
|
|
12
|
+
const request: BankAccountMCSendTransferRequest = {
|
|
13
|
+
transactionNumber: 'T1',
|
|
14
|
+
amount: 1,
|
|
15
|
+
externalAccountId: 'cd_origen',
|
|
16
|
+
beneficiaryExternalAccountId: 'cd_destino',
|
|
17
|
+
};
|
|
18
|
+
expect(request.beneficiaryExternalAccountId).toBe('cd_destino');
|
|
19
|
+
expect(request.beneficiaryEmail).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('sigue aceptando la intención por email y teléfono', () => {
|
|
23
|
+
const request: BankAccountMCSendTransferRequest = {
|
|
24
|
+
transactionNumber: 'T2',
|
|
25
|
+
amount: 1,
|
|
26
|
+
beneficiaryEmail: 'a@b.com',
|
|
27
|
+
beneficiaryPhoneNumber: '3055550100',
|
|
28
|
+
};
|
|
29
|
+
expect(request.beneficiaryExternalAccountId).toBeUndefined();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('BankAccountMCSendTransferResponse', () => {
|
|
34
|
+
it('expone externalTransferId (mt_) junto a externalTransactionId (tx_)', () => {
|
|
35
|
+
const response: BankAccountMCSendTransferResponse = {
|
|
36
|
+
externalTransactionId: 'tx_1|tx_2',
|
|
37
|
+
externalTransferId: 'mt_1',
|
|
38
|
+
transactionStatus: TransactionStatusEnum.COMPLETED,
|
|
39
|
+
transactionNumber: 'T1',
|
|
40
|
+
};
|
|
41
|
+
expect(response.externalTransferId).toBe('mt_1');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { AuthorizeCollectionMovementRequest } from '../../../src/collection/index';
|
|
5
|
+
|
|
6
|
+
const VALID = {
|
|
7
|
+
executionId: 'exec-1',
|
|
8
|
+
directoryId: 'dir-1',
|
|
9
|
+
provider: 'wallet',
|
|
10
|
+
mechanism: 'MXN_DIRECT',
|
|
11
|
+
amount: 100,
|
|
12
|
+
currencyId: 'MXN',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
async function invalidProperties(body: Record<string, unknown>): Promise<string[]> {
|
|
16
|
+
const dto = plainToInstance(AuthorizeCollectionMovementRequest, body);
|
|
17
|
+
return (await validate(dto as object)).map((e) => e.property);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
describe('AuthorizeCollectionMovementRequest.tenantId', () => {
|
|
21
|
+
it('acepta el request sin tenantId', async () => {
|
|
22
|
+
expect(await invalidProperties(VALID)).toEqual([]);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('acepta el tenant SOFOM del intento de cobro', async () => {
|
|
26
|
+
expect(await invalidProperties({ ...VALID, tenantId: 'surekeep' })).toEqual([]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('rechaza tenantId vacío o no string', async () => {
|
|
30
|
+
expect(await invalidProperties({ ...VALID, tenantId: '' })).toEqual(['tenantId']);
|
|
31
|
+
expect(await invalidProperties({ ...VALID, tenantId: 42 })).toEqual(['tenantId']);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -106,6 +106,15 @@ describe('catálogos de reconciliation', () => {
|
|
|
106
106
|
expect(RECONCILIATION_FEED_ERROR_HTTP_STATUS[ReconciliationFeedErrorCodeEnum.FEED_RECORD_NOT_FOUND]).toBe(404);
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
+
it('codes del feed genérico con su status', () => {
|
|
110
|
+
expect(Object.values(ReconciliationFeedErrorCodeEnum).sort()).toEqual(
|
|
111
|
+
['FEED_CONCEPT_NOT_SUPPORTED', 'FEED_RECORD_NOT_FOUND', 'FEED_SOURCE_UNAVAILABLE', 'INVALID_FEED_QUERY'],
|
|
112
|
+
);
|
|
113
|
+
expect(RECONCILIATION_FEED_ERROR_HTTP_STATUS[ReconciliationFeedErrorCodeEnum.FEED_CONCEPT_NOT_SUPPORTED]).toBe(400);
|
|
114
|
+
expect(RECONCILIATION_FEED_ERROR_HTTP_STATUS[ReconciliationFeedErrorCodeEnum.INVALID_FEED_QUERY]).toBe(400);
|
|
115
|
+
expect(RECONCILIATION_FEED_ERROR_HTTP_STATUS[ReconciliationFeedErrorCodeEnum.FEED_SOURCE_UNAVAILABLE]).toBe(502);
|
|
116
|
+
});
|
|
117
|
+
|
|
109
118
|
it('nombres de los eventos que publica y consume el motor', () => {
|
|
110
119
|
expect(RECONCILIATION_EVENTS_SOURCE).toBe('fiado.reconciliation');
|
|
111
120
|
expect(ReconciliationEventDetailTypeEnum.RECONCILIATION_ITEM_MATCHED).toBe('reconciliation.ReconciliationItemMatched');
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
export declare class BankAccountMCSendTransferRequest {
|
|
2
2
|
transactionNumber: string;
|
|
3
3
|
amount: number;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/** Intención por email/teléfono: obligatorios salvo que venga beneficiaryExternalAccountId. */
|
|
5
|
+
beneficiaryEmail?: string;
|
|
6
|
+
beneficiaryPhoneNumber?: string;
|
|
6
7
|
beneficiaryName?: string;
|
|
7
8
|
beneficiaryLastName?: string;
|
|
8
9
|
concept?: string;
|
|
9
10
|
externalAccountId?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Push directo a una tarjeta del mismo programa (CARD_PUSH_FUNDS): cd_ de la tarjeta del
|
|
13
|
+
* beneficiario, usuario de Fiado. Si viene, CP acredita en la misma llamada sin intención.
|
|
14
|
+
*/
|
|
15
|
+
beneficiaryExternalAccountId?: string;
|
|
10
16
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { TransactionStatusEnum } from "../../transaction";
|
|
2
2
|
export declare class BankAccountMCSendTransferResponse {
|
|
3
|
+
/** Ids tx_ de los movimientos contables en CP, unidos por "|". */
|
|
3
4
|
externalTransactionId: string;
|
|
5
|
+
/** Id mt_ de la network transfer en CP: sirve para consultar, cancelar o auditar el envío. */
|
|
6
|
+
externalTransferId?: string;
|
|
4
7
|
transactionStatus: TransactionStatusEnum;
|
|
5
8
|
transactionNumber: string;
|
|
6
9
|
}
|
|
@@ -11,6 +11,7 @@ export declare class AuthorizeCollectionMovementRequest {
|
|
|
11
11
|
intentId?: string;
|
|
12
12
|
chargeId?: string;
|
|
13
13
|
holdTxId?: string;
|
|
14
|
+
tenantId?: string;
|
|
14
15
|
/**
|
|
15
16
|
* Tarifa con la que se registra el cobro. Presente, el movimiento deja además una transacción
|
|
16
17
|
* Fiado: asiento contable, historial visible para el cliente y comisión declarada. Ausente, el
|
|
@@ -57,6 +57,12 @@ __decorate([
|
|
|
57
57
|
(0, class_validator_1.IsString)(),
|
|
58
58
|
__metadata("design:type", String)
|
|
59
59
|
], AuthorizeCollectionMovementRequest.prototype, "holdTxId", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, class_validator_1.IsOptional)(),
|
|
62
|
+
(0, class_validator_1.IsString)(),
|
|
63
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
64
|
+
__metadata("design:type", String)
|
|
65
|
+
], AuthorizeCollectionMovementRequest.prototype, "tenantId", void 0);
|
|
60
66
|
__decorate([
|
|
61
67
|
(0, class_validator_1.IsOptional)(),
|
|
62
68
|
(0, class_validator_1.ValidateNested)(),
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { ReconciliationErrorCodeEnum as C } from '../enums/ReconciliationErrorCodeEnum';
|
|
2
|
-
import { ReconciliationFeedErrorCodeEnum } from '../enums/ReconciliationFeedErrorCodeEnum';
|
|
3
2
|
/** Status HTTP de cada code: 404 no existe · 409 conflicto de estado · 422 regla de negocio · 502 falló el dueño del dinero. */
|
|
4
3
|
export declare const RECONCILIATION_ERROR_HTTP_STATUS: Readonly<Record<C, 404 | 409 | 422 | 502>>;
|
|
5
|
-
/** Status HTTP de los codes del feed genérico. */
|
|
6
|
-
export declare const RECONCILIATION_FEED_ERROR_HTTP_STATUS:
|
|
4
|
+
/** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
|
|
5
|
+
export declare const RECONCILIATION_FEED_ERROR_HTTP_STATUS: {
|
|
6
|
+
readonly FEED_RECORD_NOT_FOUND: 404;
|
|
7
|
+
readonly FEED_CONCEPT_NOT_SUPPORTED: 400;
|
|
8
|
+
readonly INVALID_FEED_QUERY: 400;
|
|
9
|
+
readonly FEED_SOURCE_UNAVAILABLE: 502;
|
|
10
|
+
};
|
|
@@ -17,7 +17,10 @@ exports.RECONCILIATION_ERROR_HTTP_STATUS = {
|
|
|
17
17
|
[ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.ITEM_ADJUSTED]: 409,
|
|
18
18
|
[ReconciliationErrorCodeEnum_1.ReconciliationErrorCodeEnum.AUTHOR_NOT_ALLOWED]: 422,
|
|
19
19
|
};
|
|
20
|
-
/** Status HTTP de los codes del feed genérico. */
|
|
20
|
+
/** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
|
|
21
21
|
exports.RECONCILIATION_FEED_ERROR_HTTP_STATUS = {
|
|
22
22
|
[ReconciliationFeedErrorCodeEnum_1.ReconciliationFeedErrorCodeEnum.FEED_RECORD_NOT_FOUND]: 404,
|
|
23
|
+
[ReconciliationFeedErrorCodeEnum_1.ReconciliationFeedErrorCodeEnum.FEED_CONCEPT_NOT_SUPPORTED]: 400,
|
|
24
|
+
[ReconciliationFeedErrorCodeEnum_1.ReconciliationFeedErrorCodeEnum.INVALID_FEED_QUERY]: 400,
|
|
25
|
+
[ReconciliationFeedErrorCodeEnum_1.ReconciliationFeedErrorCodeEnum.FEED_SOURCE_UNAVAILABLE]: 502,
|
|
23
26
|
};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
/** Codes del feed genérico que implementa cada dueño del dato. */
|
|
2
2
|
export declare enum ReconciliationFeedErrorCodeEnum {
|
|
3
|
-
FEED_RECORD_NOT_FOUND = "FEED_RECORD_NOT_FOUND"
|
|
3
|
+
FEED_RECORD_NOT_FOUND = "FEED_RECORD_NOT_FOUND",
|
|
4
|
+
FEED_CONCEPT_NOT_SUPPORTED = "FEED_CONCEPT_NOT_SUPPORTED",
|
|
5
|
+
INVALID_FEED_QUERY = "INVALID_FEED_QUERY",
|
|
6
|
+
FEED_SOURCE_UNAVAILABLE = "FEED_SOURCE_UNAVAILABLE"
|
|
4
7
|
}
|
|
@@ -5,4 +5,7 @@ exports.ReconciliationFeedErrorCodeEnum = void 0;
|
|
|
5
5
|
var ReconciliationFeedErrorCodeEnum;
|
|
6
6
|
(function (ReconciliationFeedErrorCodeEnum) {
|
|
7
7
|
ReconciliationFeedErrorCodeEnum["FEED_RECORD_NOT_FOUND"] = "FEED_RECORD_NOT_FOUND";
|
|
8
|
+
ReconciliationFeedErrorCodeEnum["FEED_CONCEPT_NOT_SUPPORTED"] = "FEED_CONCEPT_NOT_SUPPORTED";
|
|
9
|
+
ReconciliationFeedErrorCodeEnum["INVALID_FEED_QUERY"] = "INVALID_FEED_QUERY";
|
|
10
|
+
ReconciliationFeedErrorCodeEnum["FEED_SOURCE_UNAVAILABLE"] = "FEED_SOURCE_UNAVAILABLE";
|
|
8
11
|
})(ReconciliationFeedErrorCodeEnum || (exports.ReconciliationFeedErrorCodeEnum = ReconciliationFeedErrorCodeEnum = {}));
|
package/package.json
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
export class BankAccountMCSendTransferRequest {
|
|
2
2
|
transactionNumber!: string;
|
|
3
3
|
amount!: number;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/** Intención por email/teléfono: obligatorios salvo que venga beneficiaryExternalAccountId. */
|
|
5
|
+
beneficiaryEmail?: string;
|
|
6
|
+
beneficiaryPhoneNumber?: string;
|
|
6
7
|
beneficiaryName?: string;
|
|
7
8
|
beneficiaryLastName?: string;
|
|
8
9
|
concept?: string;
|
|
9
10
|
externalAccountId?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Push directo a una tarjeta del mismo programa (CARD_PUSH_FUNDS): cd_ de la tarjeta del
|
|
13
|
+
* beneficiario, usuario de Fiado. Si viene, CP acredita en la misma llamada sin intención.
|
|
14
|
+
*/
|
|
15
|
+
beneficiaryExternalAccountId?: string;
|
|
10
16
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { TransactionStatusEnum } from "../../transaction";
|
|
2
2
|
|
|
3
3
|
export class BankAccountMCSendTransferResponse {
|
|
4
|
+
/** Ids tx_ de los movimientos contables en CP, unidos por "|". */
|
|
4
5
|
externalTransactionId!: string;
|
|
6
|
+
/** Id mt_ de la network transfer en CP: sirve para consultar, cancelar o auditar el envío. */
|
|
7
|
+
externalTransferId?: string;
|
|
5
8
|
transactionStatus!: TransactionStatusEnum;
|
|
6
9
|
transactionNumber!: string;
|
|
7
10
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IsString, IsEnum, IsOptional, ValidateNested, IsNumber, IsBoolean } from 'class-validator';
|
|
1
|
+
import { IsString, IsEnum, IsOptional, ValidateNested, IsNumber, IsBoolean, IsNotEmpty } from 'class-validator';
|
|
2
2
|
import { Type } from 'class-transformer';
|
|
3
3
|
import { MechanismType } from '../enums/MechanismType';
|
|
4
4
|
import { CurrencyId } from '../../currency/enums/CurrencyId';
|
|
@@ -14,6 +14,8 @@ export class AuthorizeCollectionMovementRequest {
|
|
|
14
14
|
@IsOptional() @IsString() intentId?: string;
|
|
15
15
|
@IsOptional() @IsString() chargeId?: string;
|
|
16
16
|
@IsOptional() @IsString() holdTxId?: string;
|
|
17
|
+
// Tenant SOFOM del intento de cobro; transaction-processor lo asienta como `sofomTenantId`.
|
|
18
|
+
@IsOptional() @IsString() @IsNotEmpty() tenantId?: string;
|
|
17
19
|
|
|
18
20
|
/**
|
|
19
21
|
* Tarifa con la que se registra el cobro. Presente, el movimiento deja además una transacción
|
|
@@ -16,7 +16,10 @@ export const RECONCILIATION_ERROR_HTTP_STATUS: Readonly<Record<C, 404 | 409 | 42
|
|
|
16
16
|
[C.AUTHOR_NOT_ALLOWED]: 422,
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
-
/** Status HTTP de los codes del feed genérico. */
|
|
20
|
-
export const RECONCILIATION_FEED_ERROR_HTTP_STATUS
|
|
19
|
+
/** Status HTTP de los codes del feed genérico: 400 request inválido · 404 no existe · 502 falló la fuente. */
|
|
20
|
+
export const RECONCILIATION_FEED_ERROR_HTTP_STATUS = {
|
|
21
21
|
[ReconciliationFeedErrorCodeEnum.FEED_RECORD_NOT_FOUND]: 404,
|
|
22
|
-
|
|
22
|
+
[ReconciliationFeedErrorCodeEnum.FEED_CONCEPT_NOT_SUPPORTED]: 400,
|
|
23
|
+
[ReconciliationFeedErrorCodeEnum.INVALID_FEED_QUERY]: 400,
|
|
24
|
+
[ReconciliationFeedErrorCodeEnum.FEED_SOURCE_UNAVAILABLE]: 502,
|
|
25
|
+
} as const satisfies Readonly<Record<ReconciliationFeedErrorCodeEnum, 400 | 404 | 502>>;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
/** Codes del feed genérico que implementa cada dueño del dato. */
|
|
2
2
|
export enum ReconciliationFeedErrorCodeEnum {
|
|
3
3
|
FEED_RECORD_NOT_FOUND = 'FEED_RECORD_NOT_FOUND',
|
|
4
|
+
FEED_CONCEPT_NOT_SUPPORTED = 'FEED_CONCEPT_NOT_SUPPORTED',
|
|
5
|
+
INVALID_FEED_QUERY = 'INVALID_FEED_QUERY',
|
|
6
|
+
FEED_SOURCE_UNAVAILABLE = 'FEED_SOURCE_UNAVAILABLE',
|
|
4
7
|
}
|