@fiado/type-kit 3.163.0 → 3.164.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/remittance/resolveExceptionCode.test.ts +37 -0
- package/bin/cognitoBackofficeConnector/dtos/MfaPoolConfig.d.ts +7 -0
- package/bin/cognitoBackofficeConnector/dtos/MfaPoolConfig.js +36 -0
- package/bin/cognitoBackofficeConnector/dtos/PoolConfigResponse.d.ts +20 -0
- package/bin/cognitoBackofficeConnector/dtos/PoolConfigResponse.js +11 -0
- package/bin/cognitoBackofficeConnector/dtos/PoolsListResponse.d.ts +4 -0
- package/bin/cognitoBackofficeConnector/dtos/PoolsListResponse.js +6 -0
- package/bin/cognitoBackofficeConnector/validators/MfaTypesRequiresOne.d.ts +17 -0
- package/bin/cognitoBackofficeConnector/validators/MfaTypesRequiresOne.js +39 -0
- package/bin/places/dtos/CashInFeeDto.d.ts +17 -0
- package/bin/places/dtos/CashInFeeDto.js +12 -0
- package/bin/rbac/enums/PoolKind.d.ts +16 -0
- package/bin/rbac/enums/PoolKind.js +20 -0
- package/bin/rbac/index.d.ts +1 -0
- package/bin/rbac/index.js +17 -0
- package/bin/remittance/dtos/RemittanceExceptionCatalog.d.ts +13 -0
- package/bin/remittance/dtos/RemittanceExceptionCatalog.js +88 -0
- package/bin/remittance/dtos/index.d.ts +1 -0
- package/bin/remittance/dtos/index.js +1 -0
- package/bin/remittance/enums/RemittanceExceptionCode.d.ts +16 -0
- package/bin/remittance/enums/RemittanceExceptionCode.js +24 -0
- package/bin/remittance/enums/index.d.ts +1 -0
- package/bin/remittance/enums/index.js +1 -0
- package/bin/walletFunding/dtos/CancelFundingReferenceRequest.d.ts +1 -2
- package/bin/walletFunding/dtos/CancelFundingReferenceRequest.js +1 -1
- package/bin/walletFunding/dtos/CancelFundingReferenceResponse.d.ts +1 -1
- package/bin/walletFunding/dtos/CancelFundingRequest.d.ts +1 -1
- package/bin/walletFunding/dtos/CancelFundingRequest.js +1 -1
- package/bin/walletFunding/dtos/CancelFundingResponse.d.ts +1 -1
- package/bin/walletFunding/dtos/CancelWalletFundingResponse.d.ts +1 -1
- package/package.json +1 -1
- package/src/remittance/dtos/RemittanceExceptionCatalog.ts +97 -0
- package/src/remittance/dtos/index.ts +1 -0
- package/src/remittance/enums/RemittanceExceptionCode.ts +20 -0
- package/src/remittance/enums/index.ts +1 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { RemittanceExceptionCode } from "../../../src/remittance/enums/RemittanceExceptionCode";
|
|
2
|
+
import {
|
|
3
|
+
REMITTANCE_EXCEPTION_CATALOG,
|
|
4
|
+
resolveExceptionCode,
|
|
5
|
+
} from "../../../src/remittance/dtos/RemittanceExceptionCatalog";
|
|
6
|
+
|
|
7
|
+
describe("resolveExceptionCode", () => {
|
|
8
|
+
it("HOLD con sub-status de timeout → HOLD_PROVIDER_TIMEOUT", () => {
|
|
9
|
+
expect(resolveExceptionCode("HOLD", "SENDMONEY_TIMEOUT")).toBe(RemittanceExceptionCode.HOLD_PROVIDER_TIMEOUT);
|
|
10
|
+
});
|
|
11
|
+
it("HOLD sin sub-status → HOLD_GENERIC", () => {
|
|
12
|
+
expect(resolveExceptionCode("HOLD")).toBe(RemittanceExceptionCode.HOLD_GENERIC);
|
|
13
|
+
});
|
|
14
|
+
it("CANCELLATION con cancelReason USER_REQUESTED → CANCEL_USER_REQUESTED", () => {
|
|
15
|
+
expect(resolveExceptionCode("CANCELLATION_IN_PROGRESS", undefined, "USER_REQUESTED")).toBe(RemittanceExceptionCode.CANCEL_USER_REQUESTED);
|
|
16
|
+
});
|
|
17
|
+
it("IN_PROCESS → INPROCESS_STALE_24H", () => {
|
|
18
|
+
expect(resolveExceptionCode("IN_PROCESS")).toBe(RemittanceExceptionCode.INPROCESS_STALE_24H);
|
|
19
|
+
});
|
|
20
|
+
it("HOLD con sub-status desconocido → HOLD_GENERIC (no UNKNOWN)", () => {
|
|
21
|
+
const code = resolveExceptionCode("HOLD", "ZZZ_NUEVO_CODIGO_UNIR");
|
|
22
|
+
expect(code).toBe(RemittanceExceptionCode.HOLD_GENERIC);
|
|
23
|
+
expect(REMITTANCE_EXCEPTION_CATALOG[code]).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
it("status totalmente inesperado → UNKNOWN con catálogo definido", () => {
|
|
26
|
+
const code = resolveExceptionCode("PLASMA");
|
|
27
|
+
expect(code).toBe(RemittanceExceptionCode.UNKNOWN);
|
|
28
|
+
expect(REMITTANCE_EXCEPTION_CATALOG[code].motivo.length).toBeGreaterThan(0);
|
|
29
|
+
});
|
|
30
|
+
it("todo our-code tiene entrada de catálogo (motivo+acción no vacíos)", () => {
|
|
31
|
+
for (const code of Object.values(RemittanceExceptionCode)) {
|
|
32
|
+
const entry = REMITTANCE_EXCEPTION_CATALOG[code];
|
|
33
|
+
expect(entry?.motivo?.length ?? 0).toBeGreaterThan(0);
|
|
34
|
+
expect(entry?.accionSugerida?.length ?? 0).toBeGreaterThan(0);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MfaPoolConfig = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const MfaTypesRequiresOne_1 = require("../validators/MfaTypesRequiresOne");
|
|
16
|
+
// EMAIL_OTP removido (3.41.0): el cognito-backoffice-connector no provisiona
|
|
17
|
+
// EmailMfaConfiguration a nivel pool (requiere infra SES que no está montada
|
|
18
|
+
// y la integración con messages-lambda aún no tiene diseño). Ver TD-020 +
|
|
19
|
+
// DEC-001 en cognito-backoffice-connector/docs/. Si se reintroduce, agregar
|
|
20
|
+
// 'EMAIL_OTP' a este array.
|
|
21
|
+
const ALLOWED_MFA_TYPES = ['SOFTWARE_TOKEN_MFA'];
|
|
22
|
+
class MfaPoolConfig {
|
|
23
|
+
}
|
|
24
|
+
exports.MfaPoolConfig = MfaPoolConfig;
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_transformer_1.Expose)(),
|
|
27
|
+
(0, class_validator_1.IsBoolean)(),
|
|
28
|
+
__metadata("design:type", Boolean)
|
|
29
|
+
], MfaPoolConfig.prototype, "requireMfa", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, class_transformer_1.Expose)(),
|
|
32
|
+
(0, class_validator_1.IsArray)(),
|
|
33
|
+
(0, class_validator_1.IsIn)(ALLOWED_MFA_TYPES, { each: true }),
|
|
34
|
+
(0, class_validator_1.Validate)(MfaTypesRequiresOne_1.MfaTypesRequiresOne),
|
|
35
|
+
__metadata("design:type", Array)
|
|
36
|
+
], MfaPoolConfig.prototype, "mfaTypes", void 0);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PoolKind } from '../../rbac/enums/PoolKind';
|
|
2
|
+
/**
|
|
3
|
+
* Shape del `PoolConfigRow` expuesto al caller (BFF M18 / otros lambdas Fiado).
|
|
4
|
+
* Refleja la configuración de un Cognito User Pool registrado en la tabla
|
|
5
|
+
* `PoolConfigs_GT` del lambda `cognito-backoffice-connector`.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PoolConfigResponse {
|
|
8
|
+
userPoolId: string;
|
|
9
|
+
userPoolArn: string;
|
|
10
|
+
region: string;
|
|
11
|
+
poolKind: PoolKind;
|
|
12
|
+
displayName: string;
|
|
13
|
+
appClients: Record<string, {
|
|
14
|
+
clientId: string;
|
|
15
|
+
clientName: string;
|
|
16
|
+
}>;
|
|
17
|
+
status: 'active' | 'deprecated';
|
|
18
|
+
createdAt: number;
|
|
19
|
+
updatedAt: number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PoolConfigResponse = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Shape del `PoolConfigRow` expuesto al caller (BFF M18 / otros lambdas Fiado).
|
|
6
|
+
* Refleja la configuración de un Cognito User Pool registrado en la tabla
|
|
7
|
+
* `PoolConfigs_GT` del lambda `cognito-backoffice-connector`.
|
|
8
|
+
*/
|
|
9
|
+
class PoolConfigResponse {
|
|
10
|
+
}
|
|
11
|
+
exports.PoolConfigResponse = PoolConfigResponse;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ValidatorConstraintInterface, ValidationArguments } from 'class-validator';
|
|
2
|
+
/**
|
|
3
|
+
* Cross-field validator: si `requireMfa: true`, entonces `mfaTypes` debe tener
|
|
4
|
+
* al menos 1 elemento. Si `requireMfa: false`, `mfaTypes` puede ser vacío.
|
|
5
|
+
*
|
|
6
|
+
* Razón: cuando el pool nace con MFA habilitado, el connector llama
|
|
7
|
+
* `SetUserPoolMfaConfigCommand` con la lista de tipos del DTO. Si el array
|
|
8
|
+
* llega vacío con `requireMfa: true`, el SDK rechaza con InvalidParameterException
|
|
9
|
+
* y el pool queda en estado inconsistente (MfaConfiguration:'ON' sin tipos).
|
|
10
|
+
* Mejor rechazar en validación del DTO antes de tocar AWS.
|
|
11
|
+
*
|
|
12
|
+
* Ver pivote v1.4.1 TD-017 cerrado + spec doc §1 R3.
|
|
13
|
+
*/
|
|
14
|
+
export declare class MfaTypesRequiresOne implements ValidatorConstraintInterface {
|
|
15
|
+
validate(mfaTypes: unknown, args: ValidationArguments): boolean;
|
|
16
|
+
defaultMessage(): string;
|
|
17
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MfaTypesRequiresOne = void 0;
|
|
10
|
+
const class_validator_1 = require("class-validator");
|
|
11
|
+
/**
|
|
12
|
+
* Cross-field validator: si `requireMfa: true`, entonces `mfaTypes` debe tener
|
|
13
|
+
* al menos 1 elemento. Si `requireMfa: false`, `mfaTypes` puede ser vacío.
|
|
14
|
+
*
|
|
15
|
+
* Razón: cuando el pool nace con MFA habilitado, el connector llama
|
|
16
|
+
* `SetUserPoolMfaConfigCommand` con la lista de tipos del DTO. Si el array
|
|
17
|
+
* llega vacío con `requireMfa: true`, el SDK rechaza con InvalidParameterException
|
|
18
|
+
* y el pool queda en estado inconsistente (MfaConfiguration:'ON' sin tipos).
|
|
19
|
+
* Mejor rechazar en validación del DTO antes de tocar AWS.
|
|
20
|
+
*
|
|
21
|
+
* Ver pivote v1.4.1 TD-017 cerrado + spec doc §1 R3.
|
|
22
|
+
*/
|
|
23
|
+
let MfaTypesRequiresOne = class MfaTypesRequiresOne {
|
|
24
|
+
validate(mfaTypes, args) {
|
|
25
|
+
const obj = args.object;
|
|
26
|
+
if (obj.requireMfa === true) {
|
|
27
|
+
return Array.isArray(mfaTypes) && mfaTypes.length >= 1;
|
|
28
|
+
}
|
|
29
|
+
// requireMfa: false → cualquier mfaTypes pasa.
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
defaultMessage() {
|
|
33
|
+
return 'mfaTypes requiere al menos un tipo cuando requireMfa=true';
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.MfaTypesRequiresOne = MfaTypesRequiresOne;
|
|
37
|
+
exports.MfaTypesRequiresOne = MfaTypesRequiresOne = __decorate([
|
|
38
|
+
(0, class_validator_1.ValidatorConstraint)({ name: 'MfaTypesRequiresOneWhenMfaRequired', async: false })
|
|
39
|
+
], MfaTypesRequiresOne);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CurrencyId } from '../../currency/enums/CurrencyId';
|
|
2
|
+
/**
|
|
3
|
+
* Comisión que cobra un punto de cash-in (lo que el lambda MUESTRA, no cobra).
|
|
4
|
+
* - GreenDot (US): representativo por cadena → `fixed` + `cap` (cada tienda cobra hasta el tope).
|
|
5
|
+
* - Passport (MX): por red → `fixed` + `percentage`.
|
|
6
|
+
* Response DTO — sin decoradores de validación.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CashInFeeDto {
|
|
9
|
+
/** Comisión fija, en la moneda del país. */
|
|
10
|
+
fixed?: number;
|
|
11
|
+
/** Porcentaje del monto depositado (0–100). */
|
|
12
|
+
percentage?: number;
|
|
13
|
+
/** Tope máximo de comisión (GreenDot: el asociado cobra hasta este cap). */
|
|
14
|
+
cap?: number;
|
|
15
|
+
/** Moneda del fee: USD (GreenDot) | MXN (Passport). */
|
|
16
|
+
currency: CurrencyId;
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CashInFeeDto = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Comisión que cobra un punto de cash-in (lo que el lambda MUESTRA, no cobra).
|
|
6
|
+
* - GreenDot (US): representativo por cadena → `fixed` + `cap` (cada tienda cobra hasta el tope).
|
|
7
|
+
* - Passport (MX): por red → `fixed` + `percentage`.
|
|
8
|
+
* Response DTO — sin decoradores de validación.
|
|
9
|
+
*/
|
|
10
|
+
class CashInFeeDto {
|
|
11
|
+
}
|
|
12
|
+
exports.CashInFeeDto = CashInFeeDto;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipo de User Pool de Cognito desde la perspectiva del modelo RBAC Fiado.
|
|
3
|
+
*
|
|
4
|
+
* Origen: spec del proyecto `cognito-backoffice-connector` (Fase 0, componente 01
|
|
5
|
+
* documento `docs/superpowers/specs/2026-05-26-cognito-connector-decisiones-pendientes-design.md`).
|
|
6
|
+
*
|
|
7
|
+
* Decisión (TD-003): el proyecto converge en estos 2 valores. El documento componente 03
|
|
8
|
+
* lista 3 valores (incluyendo una variante adicional) pero queda como outlier — la
|
|
9
|
+
* decisión vigente en los 6 docs restantes y en el plan de implementación es 2 valores:
|
|
10
|
+
* - BACKOFFICE_PLATFORM — pool del backoffice de plataforma (cross-tenant)
|
|
11
|
+
* - BACKOFFICE_TENANT — pool por tenant (multi-tenant isolation)
|
|
12
|
+
*/
|
|
13
|
+
export declare enum PoolKind {
|
|
14
|
+
BACKOFFICE_PLATFORM = "BACKOFFICE_PLATFORM",
|
|
15
|
+
BACKOFFICE_TENANT = "BACKOFFICE_TENANT"
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PoolKind = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tipo de User Pool de Cognito desde la perspectiva del modelo RBAC Fiado.
|
|
6
|
+
*
|
|
7
|
+
* Origen: spec del proyecto `cognito-backoffice-connector` (Fase 0, componente 01
|
|
8
|
+
* documento `docs/superpowers/specs/2026-05-26-cognito-connector-decisiones-pendientes-design.md`).
|
|
9
|
+
*
|
|
10
|
+
* Decisión (TD-003): el proyecto converge en estos 2 valores. El documento componente 03
|
|
11
|
+
* lista 3 valores (incluyendo una variante adicional) pero queda como outlier — la
|
|
12
|
+
* decisión vigente en los 6 docs restantes y en el plan de implementación es 2 valores:
|
|
13
|
+
* - BACKOFFICE_PLATFORM — pool del backoffice de plataforma (cross-tenant)
|
|
14
|
+
* - BACKOFFICE_TENANT — pool por tenant (multi-tenant isolation)
|
|
15
|
+
*/
|
|
16
|
+
var PoolKind;
|
|
17
|
+
(function (PoolKind) {
|
|
18
|
+
PoolKind["BACKOFFICE_PLATFORM"] = "BACKOFFICE_PLATFORM";
|
|
19
|
+
PoolKind["BACKOFFICE_TENANT"] = "BACKOFFICE_TENANT";
|
|
20
|
+
})(PoolKind || (exports.PoolKind = PoolKind = {}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './enums/PoolKind';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./enums/PoolKind"), exports);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RemittanceExceptionCode } from "../enums/RemittanceExceptionCode";
|
|
2
|
+
export interface ExceptionCatalogEntry {
|
|
3
|
+
motivo: string;
|
|
4
|
+
accionSugerida: string;
|
|
5
|
+
}
|
|
6
|
+
/** our-code → texto ya traducido (español). El front lo muestra tal cual. */
|
|
7
|
+
export declare const REMITTANCE_EXCEPTION_CATALOG: Record<RemittanceExceptionCode, ExceptionCatalogEntry>;
|
|
8
|
+
/**
|
|
9
|
+
* Resuelve el our-code a partir del status + los códigos crudos de UNIR.
|
|
10
|
+
* Fallback por bucket (HOLD_GENERIC / CANCEL_GENERIC / INPROCESS_STALE_24H) y
|
|
11
|
+
* UNKNOWN para status inesperados. Nunca lanza.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveExceptionCode(status: string, unirSubStatus?: string | null, cancelReason?: string | null): RemittanceExceptionCode;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REMITTANCE_EXCEPTION_CATALOG = void 0;
|
|
4
|
+
exports.resolveExceptionCode = resolveExceptionCode;
|
|
5
|
+
const RemittanceExceptionCode_1 = require("../enums/RemittanceExceptionCode");
|
|
6
|
+
/** our-code → texto ya traducido (español). El front lo muestra tal cual. */
|
|
7
|
+
exports.REMITTANCE_EXCEPTION_CATALOG = {
|
|
8
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_DISPERSAL_UNCONFIRMED]: {
|
|
9
|
+
motivo: "El proveedor no ha confirmado la dispersión de fondos.",
|
|
10
|
+
accionSugerida: "Investigar el estado de la dispersión. Si supera 48h en HOLD, escalar a soporte del proveedor.",
|
|
11
|
+
},
|
|
12
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_PROVIDER_TIMEOUT]: {
|
|
13
|
+
motivo: "Tiempo de espera agotado con el proveedor · sin confirmar dispersión.",
|
|
14
|
+
accionSugerida: "Investigar el estado de la transacción. Si supera 48h en HOLD, escalar a soporte del proveedor.",
|
|
15
|
+
},
|
|
16
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_COMPLIANCE_REVIEW]: {
|
|
17
|
+
motivo: "El proveedor puso la transacción en revisión de cumplimiento.",
|
|
18
|
+
accionSugerida: "Monitorear. Si el proveedor no libera en 72h, escalar a soporte.",
|
|
19
|
+
},
|
|
20
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_GENERIC]: {
|
|
21
|
+
motivo: "El proveedor marcó la transacción con un problema.",
|
|
22
|
+
accionSugerida: "Investigar el estado de la transacción. Si supera 48h en HOLD, escalar a soporte del proveedor.",
|
|
23
|
+
},
|
|
24
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_USER_REQUESTED]: {
|
|
25
|
+
motivo: "El cliente canceló la transacción. Esperando que el proveedor confirme la devolución de fondos.",
|
|
26
|
+
accionSugerida: "Monitorear. La devolución al monedero se dispara automáticamente al confirmar el proveedor. Si supera 72h, escalar a tesorería.",
|
|
27
|
+
},
|
|
28
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_PROVIDER_INITIATED]: {
|
|
29
|
+
motivo: "El proveedor inició la cancelación de la transacción.",
|
|
30
|
+
accionSugerida: "Monitorear la confirmación de devolución. Si supera 72h, escalar a tesorería.",
|
|
31
|
+
},
|
|
32
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_GENERIC]: {
|
|
33
|
+
motivo: "Cancelación en proceso. Esperando confirmación del proveedor.",
|
|
34
|
+
accionSugerida: "Monitorear. Si supera 72h sin confirmación, escalar a tesorería.",
|
|
35
|
+
},
|
|
36
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.INPROCESS_STALE_24H]: {
|
|
37
|
+
motivo: "La transacción lleva más de 24h sin avanzar a PAYABLE/PAID.",
|
|
38
|
+
accionSugerida: "Verificar el sync con el proveedor. Si no responde, escalar a soporte con el número de transacción.",
|
|
39
|
+
},
|
|
40
|
+
[RemittanceExceptionCode_1.RemittanceExceptionCode.UNKNOWN]: {
|
|
41
|
+
motivo: "Situación no catalogada.",
|
|
42
|
+
accionSugerida: "Revisar manualmente el detalle de la transacción y escalar si aplica.",
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Mapa de códigos CRUDOS de UNIR (sub-status) → our-code.
|
|
47
|
+
* Se amplía minando el PDF de UNIR (tarea aparte). Las claves se normalizan a MAYÚSCULAS.
|
|
48
|
+
*/
|
|
49
|
+
const UNIR_HOLD_SUBSTATUS_TO_CODE = {
|
|
50
|
+
SENDMONEY_TIMEOUT: RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_PROVIDER_TIMEOUT,
|
|
51
|
+
TIMEOUT: RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_PROVIDER_TIMEOUT,
|
|
52
|
+
DISPERSAL_UNCONFIRMED: RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_DISPERSAL_UNCONFIRMED,
|
|
53
|
+
COMPLIANCE_REVIEW: RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_COMPLIANCE_REVIEW,
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Mapa de cancelReason → our-code.
|
|
57
|
+
* Incluye tanto los valores reales de RemittanceCancelledByEnum (USER / SYSTEM)
|
|
58
|
+
* como los códigos semánticos de UNIR (USER_REQUESTED / PROVIDER_INITIATED).
|
|
59
|
+
*/
|
|
60
|
+
const UNIR_CANCEL_REASON_TO_CODE = {
|
|
61
|
+
// Valores de RemittanceCancelledByEnum
|
|
62
|
+
USER: RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_USER_REQUESTED,
|
|
63
|
+
SYSTEM: RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_GENERIC,
|
|
64
|
+
// Códigos semánticos de UNIR
|
|
65
|
+
USER_REQUESTED: RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_USER_REQUESTED,
|
|
66
|
+
PROVIDER_INITIATED: RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_PROVIDER_INITIATED,
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Resuelve el our-code a partir del status + los códigos crudos de UNIR.
|
|
70
|
+
* Fallback por bucket (HOLD_GENERIC / CANCEL_GENERIC / INPROCESS_STALE_24H) y
|
|
71
|
+
* UNKNOWN para status inesperados. Nunca lanza.
|
|
72
|
+
*/
|
|
73
|
+
function resolveExceptionCode(status, unirSubStatus, cancelReason) {
|
|
74
|
+
switch (status) {
|
|
75
|
+
case "HOLD": {
|
|
76
|
+
const key = (unirSubStatus ?? "").trim().toUpperCase();
|
|
77
|
+
return UNIR_HOLD_SUBSTATUS_TO_CODE[key] ?? RemittanceExceptionCode_1.RemittanceExceptionCode.HOLD_GENERIC;
|
|
78
|
+
}
|
|
79
|
+
case "CANCELLATION_IN_PROGRESS": {
|
|
80
|
+
const key = (cancelReason ?? "").trim().toUpperCase();
|
|
81
|
+
return UNIR_CANCEL_REASON_TO_CODE[key] ?? RemittanceExceptionCode_1.RemittanceExceptionCode.CANCEL_GENERIC;
|
|
82
|
+
}
|
|
83
|
+
case "IN_PROCESS":
|
|
84
|
+
return RemittanceExceptionCode_1.RemittanceExceptionCode.INPROCESS_STALE_24H;
|
|
85
|
+
default:
|
|
86
|
+
return RemittanceExceptionCode_1.RemittanceExceptionCode.UNKNOWN;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -60,3 +60,4 @@ __exportStar(require("./RemittancePricing"), exports);
|
|
|
60
60
|
__exportStar(require("./RemittancePromotion"), exports);
|
|
61
61
|
__exportStar(require("./RemittanceRule"), exports);
|
|
62
62
|
__exportStar(require("./RemittancePricingTable"), exports);
|
|
63
|
+
__exportStar(require("./RemittanceExceptionCatalog"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Códigos propios ("our-code") de excepciones de remesas. Traducimos los códigos
|
|
3
|
+
* crudos de UNIR a ESTE formato; los crudos NUNCA se exponen. UNKNOWN es el
|
|
4
|
+
* fallback para sub-status/motivos no catalogados (nuevos o desconocidos).
|
|
5
|
+
*/
|
|
6
|
+
export declare enum RemittanceExceptionCode {
|
|
7
|
+
HOLD_DISPERSAL_UNCONFIRMED = "HOLD_DISPERSAL_UNCONFIRMED",
|
|
8
|
+
HOLD_PROVIDER_TIMEOUT = "HOLD_PROVIDER_TIMEOUT",
|
|
9
|
+
HOLD_COMPLIANCE_REVIEW = "HOLD_COMPLIANCE_REVIEW",
|
|
10
|
+
HOLD_GENERIC = "HOLD_GENERIC",
|
|
11
|
+
CANCEL_USER_REQUESTED = "CANCEL_USER_REQUESTED",
|
|
12
|
+
CANCEL_PROVIDER_INITIATED = "CANCEL_PROVIDER_INITIATED",
|
|
13
|
+
CANCEL_GENERIC = "CANCEL_GENERIC",
|
|
14
|
+
INPROCESS_STALE_24H = "INPROCESS_STALE_24H",
|
|
15
|
+
UNKNOWN = "UNKNOWN"
|
|
16
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RemittanceExceptionCode = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Códigos propios ("our-code") de excepciones de remesas. Traducimos los códigos
|
|
6
|
+
* crudos de UNIR a ESTE formato; los crudos NUNCA se exponen. UNKNOWN es el
|
|
7
|
+
* fallback para sub-status/motivos no catalogados (nuevos o desconocidos).
|
|
8
|
+
*/
|
|
9
|
+
var RemittanceExceptionCode;
|
|
10
|
+
(function (RemittanceExceptionCode) {
|
|
11
|
+
// HOLD (el proveedor marcó la tx)
|
|
12
|
+
RemittanceExceptionCode["HOLD_DISPERSAL_UNCONFIRMED"] = "HOLD_DISPERSAL_UNCONFIRMED";
|
|
13
|
+
RemittanceExceptionCode["HOLD_PROVIDER_TIMEOUT"] = "HOLD_PROVIDER_TIMEOUT";
|
|
14
|
+
RemittanceExceptionCode["HOLD_COMPLIANCE_REVIEW"] = "HOLD_COMPLIANCE_REVIEW";
|
|
15
|
+
RemittanceExceptionCode["HOLD_GENERIC"] = "HOLD_GENERIC";
|
|
16
|
+
// Cancelación en proceso
|
|
17
|
+
RemittanceExceptionCode["CANCEL_USER_REQUESTED"] = "CANCEL_USER_REQUESTED";
|
|
18
|
+
RemittanceExceptionCode["CANCEL_PROVIDER_INITIATED"] = "CANCEL_PROVIDER_INITIATED";
|
|
19
|
+
RemittanceExceptionCode["CANCEL_GENERIC"] = "CANCEL_GENERIC";
|
|
20
|
+
// In-process atorada > 24h
|
|
21
|
+
RemittanceExceptionCode["INPROCESS_STALE_24H"] = "INPROCESS_STALE_24H";
|
|
22
|
+
// Fallback
|
|
23
|
+
RemittanceExceptionCode["UNKNOWN"] = "UNKNOWN";
|
|
24
|
+
})(RemittanceExceptionCode || (exports.RemittanceExceptionCode = RemittanceExceptionCode = {}));
|
|
@@ -18,7 +18,7 @@ __decorate([
|
|
|
18
18
|
(0, class_validator_1.IsString)(),
|
|
19
19
|
(0, class_validator_1.MaxLength)(64),
|
|
20
20
|
__metadata("design:type", String)
|
|
21
|
-
], CancelFundingReferenceRequest.prototype, "
|
|
21
|
+
], CancelFundingReferenceRequest.prototype, "fundingId", void 0);
|
|
22
22
|
__decorate([
|
|
23
23
|
(0, class_validator_1.IsString)(),
|
|
24
24
|
(0, class_validator_1.MaxLength)(64),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BenefitPaymentStatusEnum } from "../../benefitCenter/enums/BenefitPaymentStatusEnum";
|
|
2
2
|
import { WalletFundingErrorCodeEnum } from "../enums/WalletFundingErrorCodeEnum";
|
|
3
3
|
export declare class CancelFundingReferenceResponse {
|
|
4
|
-
|
|
4
|
+
fundingId: string;
|
|
5
5
|
status: BenefitPaymentStatusEnum;
|
|
6
6
|
errorCode?: WalletFundingErrorCodeEnum;
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Request del cancel via Centro de Beneficios (spec 13 v2.0).
|
|
3
|
-
* `
|
|
3
|
+
* `fundingId` viaja en el path, `directoryId` se resuelve del JWT.
|
|
4
4
|
* `providerModuleName` permite al marketplace rutear al publisher correcto
|
|
5
5
|
* sin tener que persistir el mapping (el wallet-app sabe el moduleName
|
|
6
6
|
* porque vino en la respuesta del authorize).
|
|
@@ -13,7 +13,7 @@ exports.CancelFundingRequest = void 0;
|
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
14
|
/**
|
|
15
15
|
* Request del cancel via Centro de Beneficios (spec 13 v2.0).
|
|
16
|
-
* `
|
|
16
|
+
* `fundingId` viaja en el path, `directoryId` se resuelve del JWT.
|
|
17
17
|
* `providerModuleName` permite al marketplace rutear al publisher correcto
|
|
18
18
|
* sin tener que persistir el mapping (el wallet-app sabe el moduleName
|
|
19
19
|
* porque vino en la respuesta del authorize).
|
|
@@ -7,7 +7,7 @@ import { WalletFundingErrorCodeEnum } from "../enums/WalletFundingErrorCodeEnum"
|
|
|
7
7
|
* (marketplace ↔ connector). Idempotente: re-cancelar devuelve APPROVED.
|
|
8
8
|
*/
|
|
9
9
|
export declare class CancelFundingResponse {
|
|
10
|
-
|
|
10
|
+
fundingId: string;
|
|
11
11
|
status: BenefitPaymentStatusEnum;
|
|
12
12
|
errorCode?: WalletFundingErrorCodeEnum;
|
|
13
13
|
message?: string;
|
package/package.json
CHANGED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { RemittanceExceptionCode } from "../enums/RemittanceExceptionCode";
|
|
2
|
+
|
|
3
|
+
export interface ExceptionCatalogEntry {
|
|
4
|
+
motivo: string;
|
|
5
|
+
accionSugerida: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** our-code → texto ya traducido (español). El front lo muestra tal cual. */
|
|
9
|
+
export const REMITTANCE_EXCEPTION_CATALOG: Record<RemittanceExceptionCode, ExceptionCatalogEntry> = {
|
|
10
|
+
[RemittanceExceptionCode.HOLD_DISPERSAL_UNCONFIRMED]: {
|
|
11
|
+
motivo: "El proveedor no ha confirmado la dispersión de fondos.",
|
|
12
|
+
accionSugerida: "Investigar el estado de la dispersión. Si supera 48h en HOLD, escalar a soporte del proveedor.",
|
|
13
|
+
},
|
|
14
|
+
[RemittanceExceptionCode.HOLD_PROVIDER_TIMEOUT]: {
|
|
15
|
+
motivo: "Tiempo de espera agotado con el proveedor · sin confirmar dispersión.",
|
|
16
|
+
accionSugerida: "Investigar el estado de la transacción. Si supera 48h en HOLD, escalar a soporte del proveedor.",
|
|
17
|
+
},
|
|
18
|
+
[RemittanceExceptionCode.HOLD_COMPLIANCE_REVIEW]: {
|
|
19
|
+
motivo: "El proveedor puso la transacción en revisión de cumplimiento.",
|
|
20
|
+
accionSugerida: "Monitorear. Si el proveedor no libera en 72h, escalar a soporte.",
|
|
21
|
+
},
|
|
22
|
+
[RemittanceExceptionCode.HOLD_GENERIC]: {
|
|
23
|
+
motivo: "El proveedor marcó la transacción con un problema.",
|
|
24
|
+
accionSugerida: "Investigar el estado de la transacción. Si supera 48h en HOLD, escalar a soporte del proveedor.",
|
|
25
|
+
},
|
|
26
|
+
[RemittanceExceptionCode.CANCEL_USER_REQUESTED]: {
|
|
27
|
+
motivo: "El cliente canceló la transacción. Esperando que el proveedor confirme la devolución de fondos.",
|
|
28
|
+
accionSugerida: "Monitorear. La devolución al monedero se dispara automáticamente al confirmar el proveedor. Si supera 72h, escalar a tesorería.",
|
|
29
|
+
},
|
|
30
|
+
[RemittanceExceptionCode.CANCEL_PROVIDER_INITIATED]: {
|
|
31
|
+
motivo: "El proveedor inició la cancelación de la transacción.",
|
|
32
|
+
accionSugerida: "Monitorear la confirmación de devolución. Si supera 72h, escalar a tesorería.",
|
|
33
|
+
},
|
|
34
|
+
[RemittanceExceptionCode.CANCEL_GENERIC]: {
|
|
35
|
+
motivo: "Cancelación en proceso. Esperando confirmación del proveedor.",
|
|
36
|
+
accionSugerida: "Monitorear. Si supera 72h sin confirmación, escalar a tesorería.",
|
|
37
|
+
},
|
|
38
|
+
[RemittanceExceptionCode.INPROCESS_STALE_24H]: {
|
|
39
|
+
motivo: "La transacción lleva más de 24h sin avanzar a PAYABLE/PAID.",
|
|
40
|
+
accionSugerida: "Verificar el sync con el proveedor. Si no responde, escalar a soporte con el número de transacción.",
|
|
41
|
+
},
|
|
42
|
+
[RemittanceExceptionCode.UNKNOWN]: {
|
|
43
|
+
motivo: "Situación no catalogada.",
|
|
44
|
+
accionSugerida: "Revisar manualmente el detalle de la transacción y escalar si aplica.",
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Mapa de códigos CRUDOS de UNIR (sub-status) → our-code.
|
|
50
|
+
* Se amplía minando el PDF de UNIR (tarea aparte). Las claves se normalizan a MAYÚSCULAS.
|
|
51
|
+
*/
|
|
52
|
+
const UNIR_HOLD_SUBSTATUS_TO_CODE: Record<string, RemittanceExceptionCode> = {
|
|
53
|
+
SENDMONEY_TIMEOUT: RemittanceExceptionCode.HOLD_PROVIDER_TIMEOUT,
|
|
54
|
+
TIMEOUT: RemittanceExceptionCode.HOLD_PROVIDER_TIMEOUT,
|
|
55
|
+
DISPERSAL_UNCONFIRMED: RemittanceExceptionCode.HOLD_DISPERSAL_UNCONFIRMED,
|
|
56
|
+
COMPLIANCE_REVIEW: RemittanceExceptionCode.HOLD_COMPLIANCE_REVIEW,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Mapa de cancelReason → our-code.
|
|
61
|
+
* Incluye tanto los valores reales de RemittanceCancelledByEnum (USER / SYSTEM)
|
|
62
|
+
* como los códigos semánticos de UNIR (USER_REQUESTED / PROVIDER_INITIATED).
|
|
63
|
+
*/
|
|
64
|
+
const UNIR_CANCEL_REASON_TO_CODE: Record<string, RemittanceExceptionCode> = {
|
|
65
|
+
// Valores de RemittanceCancelledByEnum
|
|
66
|
+
USER: RemittanceExceptionCode.CANCEL_USER_REQUESTED,
|
|
67
|
+
SYSTEM: RemittanceExceptionCode.CANCEL_GENERIC,
|
|
68
|
+
// Códigos semánticos de UNIR
|
|
69
|
+
USER_REQUESTED: RemittanceExceptionCode.CANCEL_USER_REQUESTED,
|
|
70
|
+
PROVIDER_INITIATED: RemittanceExceptionCode.CANCEL_PROVIDER_INITIATED,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Resuelve el our-code a partir del status + los códigos crudos de UNIR.
|
|
75
|
+
* Fallback por bucket (HOLD_GENERIC / CANCEL_GENERIC / INPROCESS_STALE_24H) y
|
|
76
|
+
* UNKNOWN para status inesperados. Nunca lanza.
|
|
77
|
+
*/
|
|
78
|
+
export function resolveExceptionCode(
|
|
79
|
+
status: string,
|
|
80
|
+
unirSubStatus?: string | null,
|
|
81
|
+
cancelReason?: string | null,
|
|
82
|
+
): RemittanceExceptionCode {
|
|
83
|
+
switch (status) {
|
|
84
|
+
case "HOLD": {
|
|
85
|
+
const key = (unirSubStatus ?? "").trim().toUpperCase();
|
|
86
|
+
return UNIR_HOLD_SUBSTATUS_TO_CODE[key] ?? RemittanceExceptionCode.HOLD_GENERIC;
|
|
87
|
+
}
|
|
88
|
+
case "CANCELLATION_IN_PROGRESS": {
|
|
89
|
+
const key = (cancelReason ?? "").trim().toUpperCase();
|
|
90
|
+
return UNIR_CANCEL_REASON_TO_CODE[key] ?? RemittanceExceptionCode.CANCEL_GENERIC;
|
|
91
|
+
}
|
|
92
|
+
case "IN_PROCESS":
|
|
93
|
+
return RemittanceExceptionCode.INPROCESS_STALE_24H;
|
|
94
|
+
default:
|
|
95
|
+
return RemittanceExceptionCode.UNKNOWN;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Códigos propios ("our-code") de excepciones de remesas. Traducimos los códigos
|
|
3
|
+
* crudos de UNIR a ESTE formato; los crudos NUNCA se exponen. UNKNOWN es el
|
|
4
|
+
* fallback para sub-status/motivos no catalogados (nuevos o desconocidos).
|
|
5
|
+
*/
|
|
6
|
+
export enum RemittanceExceptionCode {
|
|
7
|
+
// HOLD (el proveedor marcó la tx)
|
|
8
|
+
HOLD_DISPERSAL_UNCONFIRMED = "HOLD_DISPERSAL_UNCONFIRMED",
|
|
9
|
+
HOLD_PROVIDER_TIMEOUT = "HOLD_PROVIDER_TIMEOUT",
|
|
10
|
+
HOLD_COMPLIANCE_REVIEW = "HOLD_COMPLIANCE_REVIEW",
|
|
11
|
+
HOLD_GENERIC = "HOLD_GENERIC",
|
|
12
|
+
// Cancelación en proceso
|
|
13
|
+
CANCEL_USER_REQUESTED = "CANCEL_USER_REQUESTED",
|
|
14
|
+
CANCEL_PROVIDER_INITIATED = "CANCEL_PROVIDER_INITIATED",
|
|
15
|
+
CANCEL_GENERIC = "CANCEL_GENERIC",
|
|
16
|
+
// In-process atorada > 24h
|
|
17
|
+
INPROCESS_STALE_24H = "INPROCESS_STALE_24H",
|
|
18
|
+
// Fallback
|
|
19
|
+
UNKNOWN = "UNKNOWN",
|
|
20
|
+
}
|