@fiado/type-kit 3.450.0 → 3.452.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/transaction/DisputeRefundEnums.test.ts +35 -0
- package/bin/remittance/dtos/RemittanceBackofficeTransaction.d.ts +27 -0
- package/bin/remittance/dtos/RemittanceBackofficeTransaction.js +6 -0
- package/bin/remittance/dtos/RemittanceReconciliation.d.ts +61 -0
- package/bin/remittance/dtos/RemittanceReconciliation.js +2 -0
- package/bin/remittance/dtos/index.d.ts +1 -0
- package/bin/remittance/dtos/index.js +1 -0
- package/bin/remittance/enums/RemittanceReconStatus.d.ts +15 -0
- package/bin/remittance/enums/RemittanceReconStatus.js +19 -0
- package/bin/remittance/enums/index.d.ts +1 -0
- package/bin/remittance/enums/index.js +1 -0
- package/bin/transaction/dtos/DisputeRefundRecord.d.ts +68 -0
- package/bin/transaction/dtos/DisputeRefundRecord.js +2 -0
- package/bin/transaction/enums/DisputeRefundStatus.d.ts +7 -0
- package/bin/transaction/enums/DisputeRefundStatus.js +11 -0
- package/bin/transaction/enums/DisputeRefundType.d.ts +4 -0
- package/bin/transaction/enums/DisputeRefundType.js +8 -0
- package/bin/transaction/enums/RefundManualExecutionStatus.d.ts +6 -0
- package/bin/transaction/enums/RefundManualExecutionStatus.js +6 -0
- package/bin/transaction/index.d.ts +3 -0
- package/bin/transaction/index.js +3 -0
- package/package.json +1 -1
- package/src/remittance/dtos/RemittanceBackofficeTransaction.ts +33 -0
- package/src/remittance/dtos/RemittanceReconciliation.ts +71 -0
- package/src/remittance/dtos/index.ts +1 -0
- package/src/remittance/enums/RemittanceReconStatus.ts +15 -0
- package/src/remittance/enums/index.ts +1 -0
- package/src/transaction/dtos/DisputeRefundRecord.ts +71 -0
- package/src/transaction/enums/DisputeRefundStatus.ts +7 -0
- package/src/transaction/enums/DisputeRefundType.ts +4 -0
- package/src/transaction/enums/RefundManualExecutionStatus.ts +6 -0
- package/src/transaction/index.ts +3 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { DisputeRefundType, DisputeRefundStatus } from '../../../src/transaction';
|
|
3
|
+
|
|
4
|
+
describe('DisputeRefundType', () => {
|
|
5
|
+
it('expone REFUND, REVERSAL', () => {
|
|
6
|
+
expect(DisputeRefundType.REFUND).toBe('REFUND');
|
|
7
|
+
expect(DisputeRefundType.REVERSAL).toBe('REVERSAL');
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('no tiene valores de más', () => {
|
|
11
|
+
expect(Object.values(DisputeRefundType).sort()).toEqual(['REFUND', 'REVERSAL'].sort());
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('DisputeRefundStatus', () => {
|
|
16
|
+
const expected = [
|
|
17
|
+
'PENDING_AUTHORIZATION',
|
|
18
|
+
'PENDING_MANUAL_EXECUTION',
|
|
19
|
+
'EXECUTED',
|
|
20
|
+
'FAILED',
|
|
21
|
+
'CANCELLED',
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
it('expone los 5 estados del ciclo de vida', () => {
|
|
25
|
+
expect(DisputeRefundStatus.PENDING_AUTHORIZATION).toBe('PENDING_AUTHORIZATION');
|
|
26
|
+
expect(DisputeRefundStatus.PENDING_MANUAL_EXECUTION).toBe('PENDING_MANUAL_EXECUTION');
|
|
27
|
+
expect(DisputeRefundStatus.EXECUTED).toBe('EXECUTED');
|
|
28
|
+
expect(DisputeRefundStatus.FAILED).toBe('FAILED');
|
|
29
|
+
expect(DisputeRefundStatus.CANCELLED).toBe('CANCELLED');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('no tiene valores de más', () => {
|
|
33
|
+
expect(Object.values(DisputeRefundStatus).sort()).toEqual(expected.sort());
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { RemittanceTxStatus } from "../enums/RemittanceTxStatus";
|
|
2
2
|
import { RemittanceCancelStageEnum } from "../enums/RemittanceCancelStageEnum";
|
|
3
3
|
import { RemittanceCancelOutcomeEnum } from "../enums/RemittanceCancelOutcomeEnum";
|
|
4
|
+
import { RemittanceReconStatus } from "../enums/RemittanceReconStatus";
|
|
4
5
|
/**
|
|
5
6
|
* Vista operativa COMPLETA de una tx para el backoffice (F9): incluye campos
|
|
6
7
|
* de trazabilidad (previewRef, idempotencyKey, marketplaceTransactionNumber
|
|
7
8
|
* para correlación con el procesador) que el DTO de usuario no expone.
|
|
9
|
+
*
|
|
10
|
+
* A partir de Fase B de Uniteller también incluye los campos de enrichment
|
|
11
|
+
* poblados por el pipeline SUTWEB38 (unitellerCostTicket, netMarginUsd,
|
|
12
|
+
* reconStatus, etc.) — todos opcionales, filas creadas antes de la
|
|
13
|
+
* implementación no los tienen. Ver `RemittanceReconciliationFields` para
|
|
14
|
+
* el shape canónico.
|
|
8
15
|
*/
|
|
9
16
|
export declare class RemittanceBackofficeTransaction {
|
|
10
17
|
directoryId: string;
|
|
@@ -68,4 +75,24 @@ export declare class RemittanceBackofficeTransaction {
|
|
|
68
75
|
updatedAt: string;
|
|
69
76
|
createdBy?: string;
|
|
70
77
|
updatedBy?: string;
|
|
78
|
+
/** Processing Fee (costo per-tx) reportado por Uniteller en TxDetails. */
|
|
79
|
+
unitellerCostTicket?: number;
|
|
80
|
+
/** Fx Gain reportado por Uniteller (para reconciliar contra cálculo local). */
|
|
81
|
+
unitellerFxGainReported?: number;
|
|
82
|
+
/** Liquidation Rate real que Uniteller aplicó (wholesale efectivo). */
|
|
83
|
+
liquidationRateReported?: number;
|
|
84
|
+
/** Retail Rate que Uniteller cobró al cliente. */
|
|
85
|
+
retailRateReported?: number;
|
|
86
|
+
/** serviceFee + fxGainUsdLocal − unitellerCostTicket. Redondeo 2 decimales. */
|
|
87
|
+
netMarginUsd?: number;
|
|
88
|
+
/** YYYY-MM-DD del reporte SUTWEB38 que pobló los campos anteriores. */
|
|
89
|
+
providerStatementDate?: string;
|
|
90
|
+
/** S3 key del CSV que pobló los campos (trazabilidad + idempotencia). */
|
|
91
|
+
providerStatementSourceKey?: string;
|
|
92
|
+
/** ISO UTC del enrichment. */
|
|
93
|
+
providerStatementAppliedAt?: string;
|
|
94
|
+
/** Estado de reconciliación calculado por AssertionEngine. */
|
|
95
|
+
reconStatus?: RemittanceReconStatus;
|
|
96
|
+
/** Detalle textual de los diffs cuando reconStatus !== OK. */
|
|
97
|
+
reconDiffDetail?: string;
|
|
71
98
|
}
|
|
@@ -5,6 +5,12 @@ exports.RemittanceBackofficeTransaction = void 0;
|
|
|
5
5
|
* Vista operativa COMPLETA de una tx para el backoffice (F9): incluye campos
|
|
6
6
|
* de trazabilidad (previewRef, idempotencyKey, marketplaceTransactionNumber
|
|
7
7
|
* para correlación con el procesador) que el DTO de usuario no expone.
|
|
8
|
+
*
|
|
9
|
+
* A partir de Fase B de Uniteller también incluye los campos de enrichment
|
|
10
|
+
* poblados por el pipeline SUTWEB38 (unitellerCostTicket, netMarginUsd,
|
|
11
|
+
* reconStatus, etc.) — todos opcionales, filas creadas antes de la
|
|
12
|
+
* implementación no los tienen. Ver `RemittanceReconciliationFields` para
|
|
13
|
+
* el shape canónico.
|
|
8
14
|
*/
|
|
9
15
|
class RemittanceBackofficeTransaction {
|
|
10
16
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RemittanceReconStatus } from "../enums/RemittanceReconStatus";
|
|
2
|
+
/**
|
|
3
|
+
* Campos de enrichment poblados en una tx local por el pipeline de ingesta
|
|
4
|
+
* SUTWEB38 del uniteller-connector, cuando aterriza el archivo TxDetails del
|
|
5
|
+
* día y matchea la tx por `txIdentifier === txNumber`. Todos son opcionales
|
|
6
|
+
* — filas de tx creadas antes de la implementación de Fase B no los tienen.
|
|
7
|
+
*
|
|
8
|
+
* Se comparte como interface (no class) para que otros DTOs (por ejemplo
|
|
9
|
+
* `RemittanceBackofficeTransaction`) la extiendan o intersecten sin duplicar
|
|
10
|
+
* definiciones.
|
|
11
|
+
*
|
|
12
|
+
* Ver spec Cap 4.2.
|
|
13
|
+
*/
|
|
14
|
+
export interface RemittanceReconciliationFields {
|
|
15
|
+
/**
|
|
16
|
+
* Processing Fee reportado por Uniteller en la fila TxDetails del SUTWEB38.
|
|
17
|
+
* Es el costo per-tx que Uniteller cobra a Fiado (consolida "UNITELLER
|
|
18
|
+
* processing Cost" + "Payer Cost" del Exhibit A del contrato firmado).
|
|
19
|
+
*/
|
|
20
|
+
unitellerCostTicket?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Fx Gain reportado por Uniteller en la fila TxDetails. Se usa para
|
|
23
|
+
* reconciliar contra el cálculo local `amountUSD × markupBps / 10000`.
|
|
24
|
+
* Diff sistemática apunta a redondeo o a que Uniteller aplicó un rate
|
|
25
|
+
* distinto al instruido.
|
|
26
|
+
*/
|
|
27
|
+
unitellerFxGainReported?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Liquidation Rate reportado por Uniteller (rate wholesale efectivamente
|
|
30
|
+
* aplicado). Se compara contra el `wholesaleRate` snapshot local para
|
|
31
|
+
* detectar drift silencioso de FX.
|
|
32
|
+
*/
|
|
33
|
+
liquidationRateReported?: number;
|
|
34
|
+
/** Retail Rate reportado por Uniteller (rate que cobró al cliente). */
|
|
35
|
+
retailRateReported?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Margen neto USD por transacción calculado como:
|
|
38
|
+
* serviceFee + (amountUSD × markupBps / 10000) − unitellerCostTicket
|
|
39
|
+
* Redondeado a 2 decimales.
|
|
40
|
+
*/
|
|
41
|
+
netMarginUsd?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Fecha del reporte SUTWEB38 (YYYY-MM-DD) que pobló los campos anteriores.
|
|
44
|
+
* Derivada del filename `SUTWEBXX_TxDetails_MMDDYYYY_MMDDYYYY.csv`.
|
|
45
|
+
*/
|
|
46
|
+
providerStatementDate?: string;
|
|
47
|
+
/**
|
|
48
|
+
* S3 key del archivo CSV que pobló los campos (para trazabilidad
|
|
49
|
+
* regulatoria y para la idempotencia por conditional write DDB).
|
|
50
|
+
*/
|
|
51
|
+
providerStatementSourceKey?: string;
|
|
52
|
+
/** ISO UTC del momento en que se aplicó el enrichment. */
|
|
53
|
+
providerStatementAppliedAt?: string;
|
|
54
|
+
/** Estado de reconciliación calculado por AssertionEngine. */
|
|
55
|
+
reconStatus?: RemittanceReconStatus;
|
|
56
|
+
/**
|
|
57
|
+
* Descripción textual concatenada de los diffs encontrados (ej.
|
|
58
|
+
* "amountUSD 150 vs stmt 151; fx local 0.585 vs stmt 2.0").
|
|
59
|
+
*/
|
|
60
|
+
reconDiffDetail?: string;
|
|
61
|
+
}
|
|
@@ -31,6 +31,7 @@ export * from "./RemittanceSmsRequest";
|
|
|
31
31
|
export * from "./RemittanceBackofficeUserView";
|
|
32
32
|
export * from "./RemittanceBackofficeDashboardSummary";
|
|
33
33
|
export * from "./RemittanceBackofficeTransaction";
|
|
34
|
+
export * from "./RemittanceReconciliation";
|
|
34
35
|
export * from "./RemittanceBackofficeUserDetail";
|
|
35
36
|
export * from "./RemittanceBackofficeUserListResponse";
|
|
36
37
|
export * from "./RemittanceBackofficeTxListResponse";
|
|
@@ -47,6 +47,7 @@ __exportStar(require("./RemittanceSmsRequest"), exports);
|
|
|
47
47
|
__exportStar(require("./RemittanceBackofficeUserView"), exports);
|
|
48
48
|
__exportStar(require("./RemittanceBackofficeDashboardSummary"), exports);
|
|
49
49
|
__exportStar(require("./RemittanceBackofficeTransaction"), exports);
|
|
50
|
+
__exportStar(require("./RemittanceReconciliation"), exports);
|
|
50
51
|
__exportStar(require("./RemittanceBackofficeUserDetail"), exports);
|
|
51
52
|
__exportStar(require("./RemittanceBackofficeUserListResponse"), exports);
|
|
52
53
|
__exportStar(require("./RemittanceBackofficeTxListResponse"), exports);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado de reconciliación de una tx local contra el reporte SUTWEB38 diario
|
|
3
|
+
* de Uniteller. Poblado por AssertionEngine del uniteller-connector al ingerir
|
|
4
|
+
* el archivo TxDetails. Ver spec de reconciliación Cap 6 (motor de aserciones).
|
|
5
|
+
*
|
|
6
|
+
* Prioridad si múltiples diffs: DIFF_COST > DIFF_FX > DIFF_RATE > DIFF_AMOUNT > OK.
|
|
7
|
+
*/
|
|
8
|
+
export declare enum RemittanceReconStatus {
|
|
9
|
+
OK = "OK",
|
|
10
|
+
DIFF_FX = "DIFF_FX",
|
|
11
|
+
DIFF_COST = "DIFF_COST",
|
|
12
|
+
DIFF_RATE = "DIFF_RATE",
|
|
13
|
+
DIFF_AMOUNT = "DIFF_AMOUNT",
|
|
14
|
+
MISSING_IN_PROVIDER = "MISSING_IN_PROVIDER"
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RemittanceReconStatus = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Estado de reconciliación de una tx local contra el reporte SUTWEB38 diario
|
|
6
|
+
* de Uniteller. Poblado por AssertionEngine del uniteller-connector al ingerir
|
|
7
|
+
* el archivo TxDetails. Ver spec de reconciliación Cap 6 (motor de aserciones).
|
|
8
|
+
*
|
|
9
|
+
* Prioridad si múltiples diffs: DIFF_COST > DIFF_FX > DIFF_RATE > DIFF_AMOUNT > OK.
|
|
10
|
+
*/
|
|
11
|
+
var RemittanceReconStatus;
|
|
12
|
+
(function (RemittanceReconStatus) {
|
|
13
|
+
RemittanceReconStatus["OK"] = "OK";
|
|
14
|
+
RemittanceReconStatus["DIFF_FX"] = "DIFF_FX";
|
|
15
|
+
RemittanceReconStatus["DIFF_COST"] = "DIFF_COST";
|
|
16
|
+
RemittanceReconStatus["DIFF_RATE"] = "DIFF_RATE";
|
|
17
|
+
RemittanceReconStatus["DIFF_AMOUNT"] = "DIFF_AMOUNT";
|
|
18
|
+
RemittanceReconStatus["MISSING_IN_PROVIDER"] = "MISSING_IN_PROVIDER";
|
|
19
|
+
})(RemittanceReconStatus || (exports.RemittanceReconStatus = RemittanceReconStatus = {}));
|
|
@@ -41,3 +41,4 @@ __exportStar(require("./RuleActionType"), exports);
|
|
|
41
41
|
__exportStar(require("./AuditResult"), exports);
|
|
42
42
|
__exportStar(require("./RemittanceExceptionCode"), exports);
|
|
43
43
|
__exportStar(require("./RemittanceFieldBelongsTo"), exports);
|
|
44
|
+
__exportStar(require("./RemittanceReconStatus"), exports);
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { RefundChannelEnum } from '../enums/RefundChannelEnum';
|
|
2
|
+
import { DisputeRefundType } from '../enums/DisputeRefundType';
|
|
3
|
+
import { DisputeRefundStatus } from '../enums/DisputeRefundStatus';
|
|
4
|
+
/**
|
|
5
|
+
* Registro canónico de un movimiento de dinero (REFUND o REVERSAL) ligado a
|
|
6
|
+
* un folio R27 de reclamación. Es el shape 1:1 de una fila de la tabla DDB
|
|
7
|
+
* `DisputeRefund_GT`.
|
|
8
|
+
*
|
|
9
|
+
* Modelo:
|
|
10
|
+
* - Un folio R27 puede tener 0, 1 o 2 filas en DisputeRefund_GT.
|
|
11
|
+
* - 1 fila `type=REFUND` cuando el reintegro se ejecutó.
|
|
12
|
+
* - 2 filas (REFUND + REVERSAL) cuando el reintegro fue revertido por
|
|
13
|
+
* dictamen tardío que confirmó 2FA original (Circular 12/2018
|
|
14
|
+
* Disposición 35.a Banxico).
|
|
15
|
+
* - `folioEventId` apunta al evento R27 específico (no solo al folio)
|
|
16
|
+
* para preservar el ligado inmutable cuando un folio reingresa (103)
|
|
17
|
+
* tras un dictamen no procedente.
|
|
18
|
+
* - `relatedRefundId` solo aplica cuando `type=REVERSAL` — apunta al `id`
|
|
19
|
+
* del REFUND que se está revirtiendo.
|
|
20
|
+
* - `txId` es `null` durante `PENDING_AUTHORIZATION`; se popula al crear
|
|
21
|
+
* la tx en el ledger (`PagoConfiadoTx_GT`).
|
|
22
|
+
*/
|
|
23
|
+
export interface DisputeRefundRecord {
|
|
24
|
+
id: string;
|
|
25
|
+
folioId: string;
|
|
26
|
+
folioEventId: string;
|
|
27
|
+
type: DisputeRefundType;
|
|
28
|
+
channel: RefundChannelEnum;
|
|
29
|
+
status: DisputeRefundStatus;
|
|
30
|
+
relatedRefundId: string | null;
|
|
31
|
+
txId: string | null;
|
|
32
|
+
amount: number;
|
|
33
|
+
currencyId: 'MXN';
|
|
34
|
+
caseFolio: string;
|
|
35
|
+
targetDirectoryId: string;
|
|
36
|
+
manualExecution: DisputeRefundManualExecution | null;
|
|
37
|
+
approval: DisputeRefundApproval;
|
|
38
|
+
reason: string | null;
|
|
39
|
+
createdAt: number;
|
|
40
|
+
updatedAt: number;
|
|
41
|
+
failureReason: string | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Metadatos específicos del canal SPEI_OUT_MANUAL. `null` cuando el canal es
|
|
45
|
+
* INTERNAL_PCF (transferencia intra-wallet sin salida SPEI).
|
|
46
|
+
*/
|
|
47
|
+
export interface DisputeRefundManualExecution {
|
|
48
|
+
targetClabe: string | null;
|
|
49
|
+
targetBankId: string | null;
|
|
50
|
+
targetName: string | null;
|
|
51
|
+
instructionS3Key: string | null;
|
|
52
|
+
confirmedTrackingKey: string | null;
|
|
53
|
+
confirmedAt: number | null;
|
|
54
|
+
confirmedByUserId: string | null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Cadena de aprobación heredada de Política SP1 §10:
|
|
58
|
+
* L1 ($5,000 MXN) → requiere checker.
|
|
59
|
+
* L2 ($50,000 MXN) → requiere checker + minuta firmada.
|
|
60
|
+
* `pldOverrideMinuteS3Key` cubre el caso en que el titular está en lista
|
|
61
|
+
* negra PLD y el reintegro procede solo con acta de comité.
|
|
62
|
+
*/
|
|
63
|
+
export interface DisputeRefundApproval {
|
|
64
|
+
makerUserId: string;
|
|
65
|
+
checkerUserId: string | null;
|
|
66
|
+
minuteS3Key: string | null;
|
|
67
|
+
pldOverrideMinuteS3Key: string | null;
|
|
68
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DisputeRefundStatus = void 0;
|
|
4
|
+
var DisputeRefundStatus;
|
|
5
|
+
(function (DisputeRefundStatus) {
|
|
6
|
+
DisputeRefundStatus["PENDING_AUTHORIZATION"] = "PENDING_AUTHORIZATION";
|
|
7
|
+
DisputeRefundStatus["PENDING_MANUAL_EXECUTION"] = "PENDING_MANUAL_EXECUTION";
|
|
8
|
+
DisputeRefundStatus["EXECUTED"] = "EXECUTED";
|
|
9
|
+
DisputeRefundStatus["FAILED"] = "FAILED";
|
|
10
|
+
DisputeRefundStatus["CANCELLED"] = "CANCELLED";
|
|
11
|
+
})(DisputeRefundStatus || (exports.DisputeRefundStatus = DisputeRefundStatus = {}));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DisputeRefundType = void 0;
|
|
4
|
+
var DisputeRefundType;
|
|
5
|
+
(function (DisputeRefundType) {
|
|
6
|
+
DisputeRefundType["REFUND"] = "REFUND";
|
|
7
|
+
DisputeRefundType["REVERSAL"] = "REVERSAL";
|
|
8
|
+
})(DisputeRefundType || (exports.DisputeRefundType = DisputeRefundType = {}));
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Use `DisputeRefundStatus` en su lugar. Este enum tiene scope
|
|
3
|
+
* estrecho (solo canal SPEI_OUT_MANUAL, sin estados de autorización previa,
|
|
4
|
+
* sin failure state) y se retira junto con la tabla `RefundManualExecution_GT`
|
|
5
|
+
* en el cleanup que sigue a la migración de código a `DisputeRefund_GT`.
|
|
6
|
+
*/
|
|
1
7
|
export declare enum RefundManualExecutionStatus {
|
|
2
8
|
PENDING_MANUAL_EXECUTION = "PENDING_MANUAL_EXECUTION",
|
|
3
9
|
EXECUTED = "EXECUTED",
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RefundManualExecutionStatus = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Use `DisputeRefundStatus` en su lugar. Este enum tiene scope
|
|
6
|
+
* estrecho (solo canal SPEI_OUT_MANUAL, sin estados de autorización previa,
|
|
7
|
+
* sin failure state) y se retira junto con la tabla `RefundManualExecution_GT`
|
|
8
|
+
* en el cleanup que sigue a la migración de código a `DisputeRefund_GT`.
|
|
9
|
+
*/
|
|
4
10
|
var RefundManualExecutionStatus;
|
|
5
11
|
(function (RefundManualExecutionStatus) {
|
|
6
12
|
RefundManualExecutionStatus["PENDING_MANUAL_EXECUTION"] = "PENDING_MANUAL_EXECUTION";
|
|
@@ -17,6 +17,7 @@ export * from './dtos/ActivityProblemGetResponse';
|
|
|
17
17
|
export * from './dtos/AuthorizeRefundRequest';
|
|
18
18
|
export * from './dtos/ReverseRefundRequest';
|
|
19
19
|
export * from './dtos/ConfirmManualExecutionRequest';
|
|
20
|
+
export * from './dtos/DisputeRefundRecord';
|
|
20
21
|
export * from './dtos/internal/BaseProviderTransaction';
|
|
21
22
|
export * from './dtos/internal/BaseProviderTransactionQueryParams';
|
|
22
23
|
export * from './dtos/internal/CentralPaymentsQueryParams';
|
|
@@ -39,3 +40,5 @@ export * from './enums/ActivityProblemStatusEnum';
|
|
|
39
40
|
export * from './enums/RefundChannelEnum';
|
|
40
41
|
export * from './enums/RefundPathTypeEnum';
|
|
41
42
|
export * from './enums/RefundManualExecutionStatus';
|
|
43
|
+
export * from './enums/DisputeRefundType';
|
|
44
|
+
export * from './enums/DisputeRefundStatus';
|
package/bin/transaction/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __exportStar(require("./dtos/ActivityProblemGetResponse"), exports);
|
|
|
34
34
|
__exportStar(require("./dtos/AuthorizeRefundRequest"), exports);
|
|
35
35
|
__exportStar(require("./dtos/ReverseRefundRequest"), exports);
|
|
36
36
|
__exportStar(require("./dtos/ConfirmManualExecutionRequest"), exports);
|
|
37
|
+
__exportStar(require("./dtos/DisputeRefundRecord"), exports);
|
|
37
38
|
__exportStar(require("./dtos/internal/BaseProviderTransaction"), exports);
|
|
38
39
|
__exportStar(require("./dtos/internal/BaseProviderTransactionQueryParams"), exports);
|
|
39
40
|
__exportStar(require("./dtos/internal/CentralPaymentsQueryParams"), exports);
|
|
@@ -57,3 +58,5 @@ __exportStar(require("./enums/ActivityProblemStatusEnum"), exports);
|
|
|
57
58
|
__exportStar(require("./enums/RefundChannelEnum"), exports);
|
|
58
59
|
__exportStar(require("./enums/RefundPathTypeEnum"), exports);
|
|
59
60
|
__exportStar(require("./enums/RefundManualExecutionStatus"), exports);
|
|
61
|
+
__exportStar(require("./enums/DisputeRefundType"), exports);
|
|
62
|
+
__exportStar(require("./enums/DisputeRefundStatus"), exports);
|
package/package.json
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import { RemittanceTxStatus } from "../enums/RemittanceTxStatus";
|
|
2
2
|
import { RemittanceCancelStageEnum } from "../enums/RemittanceCancelStageEnum";
|
|
3
3
|
import { RemittanceCancelOutcomeEnum } from "../enums/RemittanceCancelOutcomeEnum";
|
|
4
|
+
import { RemittanceReconStatus } from "../enums/RemittanceReconStatus";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Vista operativa COMPLETA de una tx para el backoffice (F9): incluye campos
|
|
7
8
|
* de trazabilidad (previewRef, idempotencyKey, marketplaceTransactionNumber
|
|
8
9
|
* para correlación con el procesador) que el DTO de usuario no expone.
|
|
10
|
+
*
|
|
11
|
+
* A partir de Fase B de Uniteller también incluye los campos de enrichment
|
|
12
|
+
* poblados por el pipeline SUTWEB38 (unitellerCostTicket, netMarginUsd,
|
|
13
|
+
* reconStatus, etc.) — todos opcionales, filas creadas antes de la
|
|
14
|
+
* implementación no los tienen. Ver `RemittanceReconciliationFields` para
|
|
15
|
+
* el shape canónico.
|
|
9
16
|
*/
|
|
10
17
|
export class RemittanceBackofficeTransaction {
|
|
11
18
|
directoryId!: string;
|
|
@@ -69,4 +76,30 @@ export class RemittanceBackofficeTransaction {
|
|
|
69
76
|
updatedAt!: string;
|
|
70
77
|
createdBy?: string;
|
|
71
78
|
updatedBy?: string;
|
|
79
|
+
|
|
80
|
+
// ─── Enrichment SUTWEB38 (Fase B Uniteller) ─────────────────────────
|
|
81
|
+
// Poblados por Sutweb38FilePipeline en uniteller-connector al aterrizar
|
|
82
|
+
// el archivo TxDetails del día que matchea txNumber. Ver
|
|
83
|
+
// RemittanceReconciliationFields para docs por campo.
|
|
84
|
+
|
|
85
|
+
/** Processing Fee (costo per-tx) reportado por Uniteller en TxDetails. */
|
|
86
|
+
unitellerCostTicket?: number;
|
|
87
|
+
/** Fx Gain reportado por Uniteller (para reconciliar contra cálculo local). */
|
|
88
|
+
unitellerFxGainReported?: number;
|
|
89
|
+
/** Liquidation Rate real que Uniteller aplicó (wholesale efectivo). */
|
|
90
|
+
liquidationRateReported?: number;
|
|
91
|
+
/** Retail Rate que Uniteller cobró al cliente. */
|
|
92
|
+
retailRateReported?: number;
|
|
93
|
+
/** serviceFee + fxGainUsdLocal − unitellerCostTicket. Redondeo 2 decimales. */
|
|
94
|
+
netMarginUsd?: number;
|
|
95
|
+
/** YYYY-MM-DD del reporte SUTWEB38 que pobló los campos anteriores. */
|
|
96
|
+
providerStatementDate?: string;
|
|
97
|
+
/** S3 key del CSV que pobló los campos (trazabilidad + idempotencia). */
|
|
98
|
+
providerStatementSourceKey?: string;
|
|
99
|
+
/** ISO UTC del enrichment. */
|
|
100
|
+
providerStatementAppliedAt?: string;
|
|
101
|
+
/** Estado de reconciliación calculado por AssertionEngine. */
|
|
102
|
+
reconStatus?: RemittanceReconStatus;
|
|
103
|
+
/** Detalle textual de los diffs cuando reconStatus !== OK. */
|
|
104
|
+
reconDiffDetail?: string;
|
|
72
105
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { RemittanceReconStatus } from "../enums/RemittanceReconStatus";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Campos de enrichment poblados en una tx local por el pipeline de ingesta
|
|
5
|
+
* SUTWEB38 del uniteller-connector, cuando aterriza el archivo TxDetails del
|
|
6
|
+
* día y matchea la tx por `txIdentifier === txNumber`. Todos son opcionales
|
|
7
|
+
* — filas de tx creadas antes de la implementación de Fase B no los tienen.
|
|
8
|
+
*
|
|
9
|
+
* Se comparte como interface (no class) para que otros DTOs (por ejemplo
|
|
10
|
+
* `RemittanceBackofficeTransaction`) la extiendan o intersecten sin duplicar
|
|
11
|
+
* definiciones.
|
|
12
|
+
*
|
|
13
|
+
* Ver spec Cap 4.2.
|
|
14
|
+
*/
|
|
15
|
+
export interface RemittanceReconciliationFields {
|
|
16
|
+
/**
|
|
17
|
+
* Processing Fee reportado por Uniteller en la fila TxDetails del SUTWEB38.
|
|
18
|
+
* Es el costo per-tx que Uniteller cobra a Fiado (consolida "UNITELLER
|
|
19
|
+
* processing Cost" + "Payer Cost" del Exhibit A del contrato firmado).
|
|
20
|
+
*/
|
|
21
|
+
unitellerCostTicket?: number;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Fx Gain reportado por Uniteller en la fila TxDetails. Se usa para
|
|
25
|
+
* reconciliar contra el cálculo local `amountUSD × markupBps / 10000`.
|
|
26
|
+
* Diff sistemática apunta a redondeo o a que Uniteller aplicó un rate
|
|
27
|
+
* distinto al instruido.
|
|
28
|
+
*/
|
|
29
|
+
unitellerFxGainReported?: number;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Liquidation Rate reportado por Uniteller (rate wholesale efectivamente
|
|
33
|
+
* aplicado). Se compara contra el `wholesaleRate` snapshot local para
|
|
34
|
+
* detectar drift silencioso de FX.
|
|
35
|
+
*/
|
|
36
|
+
liquidationRateReported?: number;
|
|
37
|
+
|
|
38
|
+
/** Retail Rate reportado por Uniteller (rate que cobró al cliente). */
|
|
39
|
+
retailRateReported?: number;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Margen neto USD por transacción calculado como:
|
|
43
|
+
* serviceFee + (amountUSD × markupBps / 10000) − unitellerCostTicket
|
|
44
|
+
* Redondeado a 2 decimales.
|
|
45
|
+
*/
|
|
46
|
+
netMarginUsd?: number;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Fecha del reporte SUTWEB38 (YYYY-MM-DD) que pobló los campos anteriores.
|
|
50
|
+
* Derivada del filename `SUTWEBXX_TxDetails_MMDDYYYY_MMDDYYYY.csv`.
|
|
51
|
+
*/
|
|
52
|
+
providerStatementDate?: string;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* S3 key del archivo CSV que pobló los campos (para trazabilidad
|
|
56
|
+
* regulatoria y para la idempotencia por conditional write DDB).
|
|
57
|
+
*/
|
|
58
|
+
providerStatementSourceKey?: string;
|
|
59
|
+
|
|
60
|
+
/** ISO UTC del momento en que se aplicó el enrichment. */
|
|
61
|
+
providerStatementAppliedAt?: string;
|
|
62
|
+
|
|
63
|
+
/** Estado de reconciliación calculado por AssertionEngine. */
|
|
64
|
+
reconStatus?: RemittanceReconStatus;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Descripción textual concatenada de los diffs encontrados (ej.
|
|
68
|
+
* "amountUSD 150 vs stmt 151; fx local 0.585 vs stmt 2.0").
|
|
69
|
+
*/
|
|
70
|
+
reconDiffDetail?: string;
|
|
71
|
+
}
|
|
@@ -31,6 +31,7 @@ export * from "./RemittanceSmsRequest";
|
|
|
31
31
|
export * from "./RemittanceBackofficeUserView";
|
|
32
32
|
export * from "./RemittanceBackofficeDashboardSummary";
|
|
33
33
|
export * from "./RemittanceBackofficeTransaction";
|
|
34
|
+
export * from "./RemittanceReconciliation";
|
|
34
35
|
export * from "./RemittanceBackofficeUserDetail";
|
|
35
36
|
export * from "./RemittanceBackofficeUserListResponse";
|
|
36
37
|
export * from "./RemittanceBackofficeTxListResponse";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado de reconciliación de una tx local contra el reporte SUTWEB38 diario
|
|
3
|
+
* de Uniteller. Poblado por AssertionEngine del uniteller-connector al ingerir
|
|
4
|
+
* el archivo TxDetails. Ver spec de reconciliación Cap 6 (motor de aserciones).
|
|
5
|
+
*
|
|
6
|
+
* Prioridad si múltiples diffs: DIFF_COST > DIFF_FX > DIFF_RATE > DIFF_AMOUNT > OK.
|
|
7
|
+
*/
|
|
8
|
+
export enum RemittanceReconStatus {
|
|
9
|
+
OK = "OK",
|
|
10
|
+
DIFF_FX = "DIFF_FX",
|
|
11
|
+
DIFF_COST = "DIFF_COST",
|
|
12
|
+
DIFF_RATE = "DIFF_RATE",
|
|
13
|
+
DIFF_AMOUNT = "DIFF_AMOUNT",
|
|
14
|
+
MISSING_IN_PROVIDER = "MISSING_IN_PROVIDER",
|
|
15
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { RefundChannelEnum } from '../enums/RefundChannelEnum';
|
|
2
|
+
import { DisputeRefundType } from '../enums/DisputeRefundType';
|
|
3
|
+
import { DisputeRefundStatus } from '../enums/DisputeRefundStatus';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Registro canónico de un movimiento de dinero (REFUND o REVERSAL) ligado a
|
|
7
|
+
* un folio R27 de reclamación. Es el shape 1:1 de una fila de la tabla DDB
|
|
8
|
+
* `DisputeRefund_GT`.
|
|
9
|
+
*
|
|
10
|
+
* Modelo:
|
|
11
|
+
* - Un folio R27 puede tener 0, 1 o 2 filas en DisputeRefund_GT.
|
|
12
|
+
* - 1 fila `type=REFUND` cuando el reintegro se ejecutó.
|
|
13
|
+
* - 2 filas (REFUND + REVERSAL) cuando el reintegro fue revertido por
|
|
14
|
+
* dictamen tardío que confirmó 2FA original (Circular 12/2018
|
|
15
|
+
* Disposición 35.a Banxico).
|
|
16
|
+
* - `folioEventId` apunta al evento R27 específico (no solo al folio)
|
|
17
|
+
* para preservar el ligado inmutable cuando un folio reingresa (103)
|
|
18
|
+
* tras un dictamen no procedente.
|
|
19
|
+
* - `relatedRefundId` solo aplica cuando `type=REVERSAL` — apunta al `id`
|
|
20
|
+
* del REFUND que se está revirtiendo.
|
|
21
|
+
* - `txId` es `null` durante `PENDING_AUTHORIZATION`; se popula al crear
|
|
22
|
+
* la tx en el ledger (`PagoConfiadoTx_GT`).
|
|
23
|
+
*/
|
|
24
|
+
export interface DisputeRefundRecord {
|
|
25
|
+
id: string;
|
|
26
|
+
folioId: string;
|
|
27
|
+
folioEventId: string;
|
|
28
|
+
type: DisputeRefundType;
|
|
29
|
+
channel: RefundChannelEnum;
|
|
30
|
+
status: DisputeRefundStatus;
|
|
31
|
+
relatedRefundId: string | null;
|
|
32
|
+
txId: string | null;
|
|
33
|
+
amount: number;
|
|
34
|
+
currencyId: 'MXN';
|
|
35
|
+
caseFolio: string;
|
|
36
|
+
targetDirectoryId: string;
|
|
37
|
+
manualExecution: DisputeRefundManualExecution | null;
|
|
38
|
+
approval: DisputeRefundApproval;
|
|
39
|
+
reason: string | null;
|
|
40
|
+
createdAt: number;
|
|
41
|
+
updatedAt: number;
|
|
42
|
+
failureReason: string | null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Metadatos específicos del canal SPEI_OUT_MANUAL. `null` cuando el canal es
|
|
47
|
+
* INTERNAL_PCF (transferencia intra-wallet sin salida SPEI).
|
|
48
|
+
*/
|
|
49
|
+
export interface DisputeRefundManualExecution {
|
|
50
|
+
targetClabe: string | null;
|
|
51
|
+
targetBankId: string | null;
|
|
52
|
+
targetName: string | null;
|
|
53
|
+
instructionS3Key: string | null;
|
|
54
|
+
confirmedTrackingKey: string | null;
|
|
55
|
+
confirmedAt: number | null;
|
|
56
|
+
confirmedByUserId: string | null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Cadena de aprobación heredada de Política SP1 §10:
|
|
61
|
+
* L1 ($5,000 MXN) → requiere checker.
|
|
62
|
+
* L2 ($50,000 MXN) → requiere checker + minuta firmada.
|
|
63
|
+
* `pldOverrideMinuteS3Key` cubre el caso en que el titular está en lista
|
|
64
|
+
* negra PLD y el reintegro procede solo con acta de comité.
|
|
65
|
+
*/
|
|
66
|
+
export interface DisputeRefundApproval {
|
|
67
|
+
makerUserId: string;
|
|
68
|
+
checkerUserId: string | null;
|
|
69
|
+
minuteS3Key: string | null;
|
|
70
|
+
pldOverrideMinuteS3Key: string | null;
|
|
71
|
+
}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Use `DisputeRefundStatus` en su lugar. Este enum tiene scope
|
|
3
|
+
* estrecho (solo canal SPEI_OUT_MANUAL, sin estados de autorización previa,
|
|
4
|
+
* sin failure state) y se retira junto con la tabla `RefundManualExecution_GT`
|
|
5
|
+
* en el cleanup que sigue a la migración de código a `DisputeRefund_GT`.
|
|
6
|
+
*/
|
|
1
7
|
export enum RefundManualExecutionStatus {
|
|
2
8
|
PENDING_MANUAL_EXECUTION = "PENDING_MANUAL_EXECUTION",
|
|
3
9
|
EXECUTED = "EXECUTED",
|
package/src/transaction/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './dtos/ActivityProblemGetResponse';
|
|
|
18
18
|
export * from './dtos/AuthorizeRefundRequest';
|
|
19
19
|
export * from './dtos/ReverseRefundRequest';
|
|
20
20
|
export * from './dtos/ConfirmManualExecutionRequest';
|
|
21
|
+
export * from './dtos/DisputeRefundRecord';
|
|
21
22
|
|
|
22
23
|
export * from './dtos/internal/BaseProviderTransaction';
|
|
23
24
|
export * from './dtos/internal/BaseProviderTransactionQueryParams';
|
|
@@ -44,3 +45,5 @@ export * from './enums/ActivityProblemStatusEnum';
|
|
|
44
45
|
export * from './enums/RefundChannelEnum';
|
|
45
46
|
export * from './enums/RefundPathTypeEnum';
|
|
46
47
|
export * from './enums/RefundManualExecutionStatus';
|
|
48
|
+
export * from './enums/DisputeRefundType';
|
|
49
|
+
export * from './enums/DisputeRefundStatus';
|