@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.
Files changed (32) hide show
  1. package/_test_/unit/transaction/DisputeRefundEnums.test.ts +35 -0
  2. package/bin/remittance/dtos/RemittanceBackofficeTransaction.d.ts +27 -0
  3. package/bin/remittance/dtos/RemittanceBackofficeTransaction.js +6 -0
  4. package/bin/remittance/dtos/RemittanceReconciliation.d.ts +61 -0
  5. package/bin/remittance/dtos/RemittanceReconciliation.js +2 -0
  6. package/bin/remittance/dtos/index.d.ts +1 -0
  7. package/bin/remittance/dtos/index.js +1 -0
  8. package/bin/remittance/enums/RemittanceReconStatus.d.ts +15 -0
  9. package/bin/remittance/enums/RemittanceReconStatus.js +19 -0
  10. package/bin/remittance/enums/index.d.ts +1 -0
  11. package/bin/remittance/enums/index.js +1 -0
  12. package/bin/transaction/dtos/DisputeRefundRecord.d.ts +68 -0
  13. package/bin/transaction/dtos/DisputeRefundRecord.js +2 -0
  14. package/bin/transaction/enums/DisputeRefundStatus.d.ts +7 -0
  15. package/bin/transaction/enums/DisputeRefundStatus.js +11 -0
  16. package/bin/transaction/enums/DisputeRefundType.d.ts +4 -0
  17. package/bin/transaction/enums/DisputeRefundType.js +8 -0
  18. package/bin/transaction/enums/RefundManualExecutionStatus.d.ts +6 -0
  19. package/bin/transaction/enums/RefundManualExecutionStatus.js +6 -0
  20. package/bin/transaction/index.d.ts +3 -0
  21. package/bin/transaction/index.js +3 -0
  22. package/package.json +1 -1
  23. package/src/remittance/dtos/RemittanceBackofficeTransaction.ts +33 -0
  24. package/src/remittance/dtos/RemittanceReconciliation.ts +71 -0
  25. package/src/remittance/dtos/index.ts +1 -0
  26. package/src/remittance/enums/RemittanceReconStatus.ts +15 -0
  27. package/src/remittance/enums/index.ts +1 -0
  28. package/src/transaction/dtos/DisputeRefundRecord.ts +71 -0
  29. package/src/transaction/enums/DisputeRefundStatus.ts +7 -0
  30. package/src/transaction/enums/DisputeRefundType.ts +4 -0
  31. package/src/transaction/enums/RefundManualExecutionStatus.ts +6 -0
  32. 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
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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 = {}));
@@ -25,3 +25,4 @@ export * from "./RuleActionType";
25
25
  export * from "./AuditResult";
26
26
  export * from "./RemittanceExceptionCode";
27
27
  export * from "./RemittanceFieldBelongsTo";
28
+ export * from "./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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ export declare enum DisputeRefundStatus {
2
+ PENDING_AUTHORIZATION = "PENDING_AUTHORIZATION",
3
+ PENDING_MANUAL_EXECUTION = "PENDING_MANUAL_EXECUTION",
4
+ EXECUTED = "EXECUTED",
5
+ FAILED = "FAILED",
6
+ CANCELLED = "CANCELLED"
7
+ }
@@ -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,4 @@
1
+ export declare enum DisputeRefundType {
2
+ REFUND = "REFUND",
3
+ REVERSAL = "REVERSAL"
4
+ }
@@ -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';
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.450.0",
3
+ "version": "3.452.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -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
+ }
@@ -25,3 +25,4 @@ export * from "./RuleActionType";
25
25
  export * from "./AuditResult";
26
26
  export * from "./RemittanceExceptionCode";
27
27
  export * from "./RemittanceFieldBelongsTo";
28
+ export * from "./RemittanceReconStatus";
@@ -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
+ }
@@ -0,0 +1,7 @@
1
+ export enum DisputeRefundStatus {
2
+ PENDING_AUTHORIZATION = "PENDING_AUTHORIZATION",
3
+ PENDING_MANUAL_EXECUTION = "PENDING_MANUAL_EXECUTION",
4
+ EXECUTED = "EXECUTED",
5
+ FAILED = "FAILED",
6
+ CANCELLED = "CANCELLED",
7
+ }
@@ -0,0 +1,4 @@
1
+ export enum DisputeRefundType {
2
+ REFUND = "REFUND",
3
+ REVERSAL = "REVERSAL",
4
+ }
@@ -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",
@@ -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';