@fiado/type-kit 3.381.0 → 3.383.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 (58) hide show
  1. package/bin/collection/dtos/ApplyCollectionResultRequest.d.ts +8 -0
  2. package/bin/collection/dtos/ApplyCollectionResultRequest.js +10 -2
  3. package/bin/collection/dtos/AuthorizeCollectionMovementRequest.d.ts +8 -0
  4. package/bin/collection/dtos/AuthorizeCollectionMovementRequest.js +9 -1
  5. package/bin/collection/dtos/AuthorizeCollectionMovementResponse.d.ts +6 -0
  6. package/bin/collection/dtos/AuthorizeCollectionMovementResponse.js +7 -1
  7. package/bin/collection/dtos/CollectRequest.d.ts +9 -0
  8. package/bin/collection/dtos/CollectRequest.js +10 -1
  9. package/bin/collection/dtos/CollectResponse.d.ts +9 -0
  10. package/bin/collection/dtos/CollectResponse.js +11 -2
  11. package/bin/collection/dtos/CollectionAttemptDto.js +1 -1
  12. package/bin/collection/dtos/CollectionIntentSummaryDto.js +2 -2
  13. package/bin/collection/dtos/CollectionMetricsDto.js +2 -2
  14. package/bin/collection/dtos/CollectionPricingDto.d.ts +28 -0
  15. package/bin/collection/dtos/CollectionPricingDto.js +55 -0
  16. package/bin/collection/dtos/CollectionProductConfigDto.d.ts +9 -0
  17. package/bin/collection/dtos/CollectionProductConfigDto.js +9 -0
  18. package/bin/collection/dtos/CollectionResultEvent.d.ts +3 -0
  19. package/bin/collection/dtos/CollectionResultEvent.js +4 -1
  20. package/bin/collection/dtos/CollectionSourceDto.d.ts +20 -0
  21. package/bin/collection/dtos/CollectionSourceDto.js +19 -0
  22. package/bin/collection/dtos/PendingChargeDto.d.ts +10 -0
  23. package/bin/collection/dtos/PendingChargeDto.js +16 -6
  24. package/bin/collection/dtos/RetryPolicyDto.d.ts +7 -0
  25. package/bin/collection/dtos/RetryPolicyDto.js +7 -0
  26. package/bin/collection/enums/CollectionFeeMode.d.ts +6 -0
  27. package/bin/collection/enums/CollectionFeeMode.js +10 -0
  28. package/bin/collection/enums/CollectionResultStatus.d.ts +6 -0
  29. package/bin/collection/enums/CollectionResultStatus.js +6 -0
  30. package/bin/collection/enums/CollectionState.d.ts +7 -0
  31. package/bin/collection/enums/CollectionState.js +7 -0
  32. package/bin/collection/enums/MechanismType.d.ts +7 -0
  33. package/bin/collection/enums/MechanismType.js +7 -0
  34. package/bin/collection/enums/SagaStep.d.ts +7 -0
  35. package/bin/collection/enums/SagaStep.js +7 -0
  36. package/bin/collection/index.d.ts +2 -0
  37. package/bin/collection/index.js +2 -0
  38. package/package.json +1 -1
  39. package/src/collection/dtos/ApplyCollectionResultRequest.ts +11 -3
  40. package/src/collection/dtos/AuthorizeCollectionMovementRequest.ts +12 -2
  41. package/src/collection/dtos/AuthorizeCollectionMovementResponse.ts +8 -2
  42. package/src/collection/dtos/CollectRequest.ts +11 -2
  43. package/src/collection/dtos/CollectResponse.ts +12 -3
  44. package/src/collection/dtos/CollectionAttemptDto.ts +2 -2
  45. package/src/collection/dtos/CollectionIntentSummaryDto.ts +3 -3
  46. package/src/collection/dtos/CollectionMetricsDto.ts +2 -2
  47. package/src/collection/dtos/CollectionPricingDto.ts +35 -0
  48. package/src/collection/dtos/CollectionProductConfigDto.ts +9 -0
  49. package/src/collection/dtos/CollectionResultEvent.ts +5 -2
  50. package/src/collection/dtos/CollectionSourceDto.ts +23 -1
  51. package/src/collection/dtos/PendingChargeDto.ts +17 -7
  52. package/src/collection/dtos/RetryPolicyDto.ts +7 -0
  53. package/src/collection/enums/CollectionFeeMode.ts +6 -0
  54. package/src/collection/enums/CollectionResultStatus.ts +6 -0
  55. package/src/collection/enums/CollectionState.ts +7 -0
  56. package/src/collection/enums/MechanismType.ts +7 -0
  57. package/src/collection/enums/SagaStep.ts +7 -0
  58. package/src/collection/index.ts +2 -0
@@ -1,5 +1,13 @@
1
1
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
2
2
  import { MechanismType } from '../enums/MechanismType';
3
+ /**
4
+ * Resultado de un intento de cobro, tal como el motor se lo entrega al dominio dueño de la deuda.
5
+ *
6
+ * Se entrega con reintentos hasta que el dominio la acepta respondiendo `true`. Cualquier otra
7
+ * respuesta se lee como no entregada y el mismo resultado vuelve más tarde, así que aplicarlo tiene
8
+ * que ser idempotente: el dominio deduplica por `attemptId`, que identifica ESE intento y no el cobro
9
+ * entero.
10
+ */
3
11
  export declare class ApplyCollectionResultRequest {
4
12
  attemptId: string;
5
13
  intentId: string;
@@ -13,6 +13,14 @@ exports.ApplyCollectionResultRequest = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
14
  const CollectionResultStatus_1 = require("../enums/CollectionResultStatus");
15
15
  const MechanismType_1 = require("../enums/MechanismType");
16
+ /**
17
+ * Resultado de un intento de cobro, tal como el motor se lo entrega al dominio dueño de la deuda.
18
+ *
19
+ * Se entrega con reintentos hasta que el dominio la acepta respondiendo `true`. Cualquier otra
20
+ * respuesta se lee como no entregada y el mismo resultado vuelve más tarde, así que aplicarlo tiene
21
+ * que ser idempotente: el dominio deduplica por `attemptId`, que identifica ESE intento y no el cobro
22
+ * entero.
23
+ */
16
24
  class ApplyCollectionResultRequest {
17
25
  }
18
26
  exports.ApplyCollectionResultRequest = ApplyCollectionResultRequest;
@@ -41,11 +49,11 @@ __decorate([
41
49
  __metadata("design:type", String)
42
50
  ], ApplyCollectionResultRequest.prototype, "result", void 0);
43
51
  __decorate([
44
- (0, class_validator_1.IsInt)(),
52
+ (0, class_validator_1.IsNumber)(),
45
53
  __metadata("design:type", Number)
46
54
  ], ApplyCollectionResultRequest.prototype, "amountCollected", void 0);
47
55
  __decorate([
48
- (0, class_validator_1.IsInt)(),
56
+ (0, class_validator_1.IsNumber)(),
49
57
  __metadata("design:type", Number)
50
58
  ], ApplyCollectionResultRequest.prototype, "amountReserved", void 0);
51
59
  __decorate([
@@ -1,5 +1,6 @@
1
1
  import { MechanismType } from '../enums/MechanismType';
2
2
  import { CurrencyId } from '../../currency/enums/CurrencyId';
3
+ import { CollectionPricingDto } from './CollectionPricingDto';
3
4
  export declare class AuthorizeCollectionMovementRequest {
4
5
  executionId: string;
5
6
  directoryId: string;
@@ -10,4 +11,11 @@ export declare class AuthorizeCollectionMovementRequest {
10
11
  intentId?: string;
11
12
  chargeId?: string;
12
13
  holdTxId?: string;
14
+ /**
15
+ * Tarifa con la que se registra el cobro. Presente, el movimiento deja además una transacción
16
+ * Fiado: asiento contable, historial visible para el cliente y comisión declarada. Ausente, el
17
+ * dinero se mueve igual pero sin ese registro — es el comportamiento anterior, y se conserva para
18
+ * no romper a quien todavía no manda tarifa.
19
+ */
20
+ pricing?: CollectionPricingDto;
13
21
  }
@@ -11,8 +11,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AuthorizeCollectionMovementRequest = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
+ const class_transformer_1 = require("class-transformer");
14
15
  const MechanismType_1 = require("../enums/MechanismType");
15
16
  const CurrencyId_1 = require("../../currency/enums/CurrencyId");
17
+ const CollectionPricingDto_1 = require("./CollectionPricingDto");
16
18
  class AuthorizeCollectionMovementRequest {
17
19
  }
18
20
  exports.AuthorizeCollectionMovementRequest = AuthorizeCollectionMovementRequest;
@@ -33,7 +35,7 @@ __decorate([
33
35
  __metadata("design:type", String)
34
36
  ], AuthorizeCollectionMovementRequest.prototype, "mechanism", void 0);
35
37
  __decorate([
36
- (0, class_validator_1.IsInt)(),
38
+ (0, class_validator_1.IsNumber)(),
37
39
  __metadata("design:type", Number)
38
40
  ], AuthorizeCollectionMovementRequest.prototype, "amount", void 0);
39
41
  __decorate([
@@ -55,3 +57,9 @@ __decorate([
55
57
  (0, class_validator_1.IsString)(),
56
58
  __metadata("design:type", String)
57
59
  ], AuthorizeCollectionMovementRequest.prototype, "holdTxId", void 0);
60
+ __decorate([
61
+ (0, class_validator_1.IsOptional)(),
62
+ (0, class_validator_1.ValidateNested)(),
63
+ (0, class_transformer_1.Type)(() => CollectionPricingDto_1.CollectionPricingDto),
64
+ __metadata("design:type", CollectionPricingDto_1.CollectionPricingDto)
65
+ ], AuthorizeCollectionMovementRequest.prototype, "pricing", void 0);
@@ -1,4 +1,10 @@
1
1
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
2
+ /**
3
+ * Lo que el procesador responde tras ejecutar un movimiento de cobro.
4
+ *
5
+ * `amount` es lo reservado o lo cobrado según el mecanismo, y `holdTxId` sólo viene cuando se reservó:
6
+ * es con lo que después se captura o se libera la retención.
7
+ */
2
8
  export declare class AuthorizeCollectionMovementResponse {
3
9
  status: CollectionResultStatus;
4
10
  amount: number;
@@ -12,6 +12,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AuthorizeCollectionMovementResponse = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
14
  const CollectionResultStatus_1 = require("../enums/CollectionResultStatus");
15
+ /**
16
+ * Lo que el procesador responde tras ejecutar un movimiento de cobro.
17
+ *
18
+ * `amount` es lo reservado o lo cobrado según el mecanismo, y `holdTxId` sólo viene cuando se reservó:
19
+ * es con lo que después se captura o se libera la retención.
20
+ */
15
21
  class AuthorizeCollectionMovementResponse {
16
22
  }
17
23
  exports.AuthorizeCollectionMovementResponse = AuthorizeCollectionMovementResponse;
@@ -20,7 +26,7 @@ __decorate([
20
26
  __metadata("design:type", String)
21
27
  ], AuthorizeCollectionMovementResponse.prototype, "status", void 0);
22
28
  __decorate([
23
- (0, class_validator_1.IsInt)(),
29
+ (0, class_validator_1.IsNumber)(),
24
30
  __metadata("design:type", Number)
25
31
  ], AuthorizeCollectionMovementResponse.prototype, "amount", void 0);
26
32
  __decorate([
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Cobro inmediato y síncrono, con el importe ya resuelto por el dominio.
3
+ *
4
+ * Es para cuando alguien espera la respuesta —un botón, una liquidación anticipada—. La cobranza
5
+ * recurrente no va por aquí: para eso está el alta, donde el motor se encarga de perseguir el cargo.
6
+ *
7
+ * Idempotente por dominio y cargo: repetirlo sobre un cargo ya cobrado devuelve el resultado anterior
8
+ * sin volver a mover dinero.
9
+ */
1
10
  export declare class CollectRequest {
2
11
  directoryId: string;
3
12
  tenantId: string;
@@ -11,6 +11,15 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.CollectRequest = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
+ /**
15
+ * Cobro inmediato y síncrono, con el importe ya resuelto por el dominio.
16
+ *
17
+ * Es para cuando alguien espera la respuesta —un botón, una liquidación anticipada—. La cobranza
18
+ * recurrente no va por aquí: para eso está el alta, donde el motor se encarga de perseguir el cargo.
19
+ *
20
+ * Idempotente por dominio y cargo: repetirlo sobre un cargo ya cobrado devuelve el resultado anterior
21
+ * sin volver a mover dinero.
22
+ */
14
23
  class CollectRequest {
15
24
  }
16
25
  exports.CollectRequest = CollectRequest;
@@ -35,6 +44,6 @@ __decorate([
35
44
  __metadata("design:type", String)
36
45
  ], CollectRequest.prototype, "chargeId", void 0);
37
46
  __decorate([
38
- (0, class_validator_1.IsInt)(),
47
+ (0, class_validator_1.IsNumber)(),
39
48
  __metadata("design:type", Number)
40
49
  ], CollectRequest.prototype, "amount", void 0);
@@ -1,4 +1,13 @@
1
1
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
2
+ /**
3
+ * Desenlace de un cobro.
4
+ *
5
+ * Lo cobrado y lo reservado van separados porque no son lo mismo: lo primero ya salió de la cuenta y
6
+ * el dominio debe aplicarlo a su cartera; lo segundo sigue siendo del titular, congelado, esperando
7
+ * que alguien capture la retención.
8
+ *
9
+ * `NONE` no es un fallo: el cargo queda vivo esperando fondos, y el motor lo reintenta solo.
10
+ */
2
11
  export declare class CollectResponse {
3
12
  intentId: string;
4
13
  status: CollectionResultStatus;
@@ -12,6 +12,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.CollectResponse = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
14
  const CollectionResultStatus_1 = require("../enums/CollectionResultStatus");
15
+ /**
16
+ * Desenlace de un cobro.
17
+ *
18
+ * Lo cobrado y lo reservado van separados porque no son lo mismo: lo primero ya salió de la cuenta y
19
+ * el dominio debe aplicarlo a su cartera; lo segundo sigue siendo del titular, congelado, esperando
20
+ * que alguien capture la retención.
21
+ *
22
+ * `NONE` no es un fallo: el cargo queda vivo esperando fondos, y el motor lo reintenta solo.
23
+ */
15
24
  class CollectResponse {
16
25
  }
17
26
  exports.CollectResponse = CollectResponse;
@@ -24,10 +33,10 @@ __decorate([
24
33
  __metadata("design:type", String)
25
34
  ], CollectResponse.prototype, "status", void 0);
26
35
  __decorate([
27
- (0, class_validator_1.IsInt)(),
36
+ (0, class_validator_1.IsNumber)(),
28
37
  __metadata("design:type", Number)
29
38
  ], CollectResponse.prototype, "amountReserved", void 0);
30
39
  __decorate([
31
- (0, class_validator_1.IsInt)(),
40
+ (0, class_validator_1.IsNumber)(),
32
41
  __metadata("design:type", Number)
33
42
  ], CollectResponse.prototype, "amountCollected", void 0);
@@ -34,7 +34,7 @@ __decorate([
34
34
  __metadata("design:type", String)
35
35
  ], CollectionAttemptDto.prototype, "mechanism", void 0);
36
36
  __decorate([
37
- (0, class_validator_1.IsInt)(),
37
+ (0, class_validator_1.IsNumber)(),
38
38
  __metadata("design:type", Number)
39
39
  ], CollectionAttemptDto.prototype, "amount", void 0);
40
40
  __decorate([
@@ -38,12 +38,12 @@ __decorate([
38
38
  __metadata("design:type", String)
39
39
  ], CollectionIntentSummaryDto.prototype, "chargeId", void 0);
40
40
  __decorate([
41
- (0, class_validator_1.IsInt)(),
41
+ (0, class_validator_1.IsNumber)(),
42
42
  __metadata("design:type", Number)
43
43
  ], CollectionIntentSummaryDto.prototype, "amount", void 0);
44
44
  __decorate([
45
45
  (0, class_validator_1.IsOptional)(),
46
- (0, class_validator_1.IsInt)(),
46
+ (0, class_validator_1.IsNumber)(),
47
47
  __metadata("design:type", Number)
48
48
  ], CollectionIntentSummaryDto.prototype, "reserved", void 0);
49
49
  __decorate([
@@ -24,11 +24,11 @@ __decorate([
24
24
  __metadata("design:type", Number)
25
25
  ], CollectionMetricsDto.prototype, "successRate", void 0);
26
26
  __decorate([
27
- (0, class_validator_1.IsInt)(),
27
+ (0, class_validator_1.IsNumber)(),
28
28
  __metadata("design:type", Number)
29
29
  ], CollectionMetricsDto.prototype, "amountReserved", void 0);
30
30
  __decorate([
31
- (0, class_validator_1.IsInt)(),
31
+ (0, class_validator_1.IsNumber)(),
32
32
  __metadata("design:type", Number)
33
33
  ], CollectionMetricsDto.prototype, "amountCollected", void 0);
34
34
  __decorate([
@@ -0,0 +1,28 @@
1
+ import { ProductTaxFeeTypeEnum } from '../../productCatalog';
2
+ import { CollectionFeeMode } from '../enums/CollectionFeeMode';
3
+ /**
4
+ * Tarifa de un cobro, tal como la manda quien lo pide.
5
+ *
6
+ * La regla viaja aquí y no sale del catálogo de productos porque quien conoce las condiciones
7
+ * comerciales de una cartera es el dominio dueño de la deuda, no el procesador: la misma mecánica de
8
+ * cobro se tarifa distinto según el producto, el tenant o el convenio.
9
+ *
10
+ * Viaja la REGLA, no el importe ya calculado. Así la aritmética y el redondeo son los mismos que los
11
+ * del resto de las transacciones, en vez de que cada dominio reimplemente los suyos y los números
12
+ * dejen de cuadrar entre sí.
13
+ */
14
+ export declare class CollectionPricingDto {
15
+ /**
16
+ * Fila de `ProductCatalog_GT` con la que se clasifica la transacción resultante — de ahí salen su
17
+ * tipo y subtipo. La tarifa NO sale de ahí: sale de los campos de abajo.
18
+ */
19
+ productCatalogId: string;
20
+ /** Comisión: porcentaje sobre el monto, o importe fijo, según `feeType`. */
21
+ fee: number;
22
+ feeType: ProductTaxFeeTypeEnum;
23
+ /** Impuesto: porcentaje SOBRE LA COMISIÓN, o importe fijo, según `taxType`. */
24
+ tax: number;
25
+ taxType: ProductTaxFeeTypeEnum;
26
+ /** Quién absorbe la comisión: el cliente por encima de su deuda, o el destino al recibir menos. */
27
+ feeMode: CollectionFeeMode;
28
+ }
@@ -0,0 +1,55 @@
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.CollectionPricingDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ const productCatalog_1 = require("../../productCatalog");
15
+ const CollectionFeeMode_1 = require("../enums/CollectionFeeMode");
16
+ /**
17
+ * Tarifa de un cobro, tal como la manda quien lo pide.
18
+ *
19
+ * La regla viaja aquí y no sale del catálogo de productos porque quien conoce las condiciones
20
+ * comerciales de una cartera es el dominio dueño de la deuda, no el procesador: la misma mecánica de
21
+ * cobro se tarifa distinto según el producto, el tenant o el convenio.
22
+ *
23
+ * Viaja la REGLA, no el importe ya calculado. Así la aritmética y el redondeo son los mismos que los
24
+ * del resto de las transacciones, en vez de que cada dominio reimplemente los suyos y los números
25
+ * dejen de cuadrar entre sí.
26
+ */
27
+ class CollectionPricingDto {
28
+ }
29
+ exports.CollectionPricingDto = CollectionPricingDto;
30
+ __decorate([
31
+ (0, class_validator_1.IsString)(),
32
+ __metadata("design:type", String)
33
+ ], CollectionPricingDto.prototype, "productCatalogId", void 0);
34
+ __decorate([
35
+ (0, class_validator_1.IsNumber)(),
36
+ (0, class_validator_1.Min)(0),
37
+ __metadata("design:type", Number)
38
+ ], CollectionPricingDto.prototype, "fee", void 0);
39
+ __decorate([
40
+ (0, class_validator_1.IsEnum)(productCatalog_1.ProductTaxFeeTypeEnum),
41
+ __metadata("design:type", String)
42
+ ], CollectionPricingDto.prototype, "feeType", void 0);
43
+ __decorate([
44
+ (0, class_validator_1.IsNumber)(),
45
+ (0, class_validator_1.Min)(0),
46
+ __metadata("design:type", Number)
47
+ ], CollectionPricingDto.prototype, "tax", void 0);
48
+ __decorate([
49
+ (0, class_validator_1.IsEnum)(productCatalog_1.ProductTaxFeeTypeEnum),
50
+ __metadata("design:type", String)
51
+ ], CollectionPricingDto.prototype, "taxType", void 0);
52
+ __decorate([
53
+ (0, class_validator_1.IsEnum)(CollectionFeeMode_1.CollectionFeeMode),
54
+ __metadata("design:type", String)
55
+ ], CollectionPricingDto.prototype, "feeMode", void 0);
@@ -1,5 +1,14 @@
1
1
  import { CollectionSourceDto } from './CollectionSourceDto';
2
2
  import { RetryPolicyDto } from './RetryPolicyDto';
3
+ /**
4
+ * Cómo se cobra un producto: de qué cuentas, en qué orden, y con cuánta insistencia.
5
+ *
6
+ * `allowPartial` decide si una fuente puede aportar una parte y el resto se busca en la siguiente, o
7
+ * si sólo sirve la que cubra el total.
8
+ *
9
+ * Versionada: cambiar la cascada de un producto crea una versión nueva en vez de reescribir la
10
+ * anterior, para que un cobro pueda explicarse con la configuración que regía cuando ocurrió.
11
+ */
3
12
  export declare class CollectionProductConfigDto {
4
13
  tenantId: string;
5
14
  productId: string;
@@ -14,6 +14,15 @@ const class_validator_1 = require("class-validator");
14
14
  const class_transformer_1 = require("class-transformer");
15
15
  const CollectionSourceDto_1 = require("./CollectionSourceDto");
16
16
  const RetryPolicyDto_1 = require("./RetryPolicyDto");
17
+ /**
18
+ * Cómo se cobra un producto: de qué cuentas, en qué orden, y con cuánta insistencia.
19
+ *
20
+ * `allowPartial` decide si una fuente puede aportar una parte y el resto se busca en la siguiente, o
21
+ * si sólo sirve la que cubra el total.
22
+ *
23
+ * Versionada: cambiar la cascada de un producto crea una versión nueva en vez de reescribir la
24
+ * anterior, para que un cobro pueda explicarse con la configuración que regía cuando ocurrió.
25
+ */
17
26
  class CollectionProductConfigDto {
18
27
  }
19
28
  exports.CollectionProductConfigDto = CollectionProductConfigDto;
@@ -1,5 +1,8 @@
1
1
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
2
2
  import { MechanismType } from '../enums/MechanismType';
3
+ /**
4
+ * El resultado de un cobro, en la forma en que se anuncia hacia afuera del motor.
5
+ */
3
6
  export declare class CollectionResultEvent {
4
7
  attemptId: string;
5
8
  intentId: string;
@@ -13,6 +13,9 @@ exports.CollectionResultEvent = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
14
  const CollectionResultStatus_1 = require("../enums/CollectionResultStatus");
15
15
  const MechanismType_1 = require("../enums/MechanismType");
16
+ /**
17
+ * El resultado de un cobro, en la forma en que se anuncia hacia afuera del motor.
18
+ */
16
19
  class CollectionResultEvent {
17
20
  }
18
21
  exports.CollectionResultEvent = CollectionResultEvent;
@@ -45,6 +48,6 @@ __decorate([
45
48
  __metadata("design:type", String)
46
49
  ], CollectionResultEvent.prototype, "mechanism", void 0);
47
50
  __decorate([
48
- (0, class_validator_1.IsInt)(),
51
+ (0, class_validator_1.IsNumber)(),
49
52
  __metadata("design:type", Number)
50
53
  ], CollectionResultEvent.prototype, "amount", void 0);
@@ -1,5 +1,17 @@
1
1
  import { MechanismType } from '../enums/MechanismType';
2
2
  import { CurrencyId } from '../../currency/enums/CurrencyId';
3
+ import { CollectionPricingDto } from './CollectionPricingDto';
4
+ /**
5
+ * Una fuente de la cascada de cobro: de qué cuenta se intenta cobrar, con qué mecanismo y en qué
6
+ * posición.
7
+ *
8
+ * `order` es lo que decide si primero se intenta en pesos o en dólares. El motor las recorre de menor
9
+ * a mayor y salta las ya intentadas en esa corrida.
10
+ *
11
+ * `currency` tiene que corresponder al `mechanism` —el mecanismo fija su moneda al ejecutar— y
12
+ * `provider` tiene que ser único entre las fuentes de un producto: es la identidad con la que el motor
13
+ * distingue un intento de otro.
14
+ */
3
15
  export declare class CollectionSourceDto {
4
16
  order: number;
5
17
  wallet: string;
@@ -7,4 +19,12 @@ export declare class CollectionSourceDto {
7
19
  mechanism: MechanismType;
8
20
  provider: string;
9
21
  fxPolicy?: string;
22
+ /**
23
+ * Con qué se tarifa un cobro por esta fuente. Va por fuente y no por producto porque la misma deuda
24
+ * puede costar distinto según de dónde se cobre: mover dólares no cuesta lo mismo que mover pesos.
25
+ *
26
+ * Sin tarifa el cobro se ejecuta igual, pero no deja transacción — sin asiento contable, sin
27
+ * aparecer en el historial del cliente y sin comisión declarada.
28
+ */
29
+ pricing?: CollectionPricingDto;
10
30
  }
@@ -11,8 +11,21 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.CollectionSourceDto = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
+ const class_transformer_1 = require("class-transformer");
14
15
  const MechanismType_1 = require("../enums/MechanismType");
15
16
  const CurrencyId_1 = require("../../currency/enums/CurrencyId");
17
+ const CollectionPricingDto_1 = require("./CollectionPricingDto");
18
+ /**
19
+ * Una fuente de la cascada de cobro: de qué cuenta se intenta cobrar, con qué mecanismo y en qué
20
+ * posición.
21
+ *
22
+ * `order` es lo que decide si primero se intenta en pesos o en dólares. El motor las recorre de menor
23
+ * a mayor y salta las ya intentadas en esa corrida.
24
+ *
25
+ * `currency` tiene que corresponder al `mechanism` —el mecanismo fija su moneda al ejecutar— y
26
+ * `provider` tiene que ser único entre las fuentes de un producto: es la identidad con la que el motor
27
+ * distingue un intento de otro.
28
+ */
16
29
  class CollectionSourceDto {
17
30
  }
18
31
  exports.CollectionSourceDto = CollectionSourceDto;
@@ -41,3 +54,9 @@ __decorate([
41
54
  (0, class_validator_1.IsString)(),
42
55
  __metadata("design:type", String)
43
56
  ], CollectionSourceDto.prototype, "fxPolicy", void 0);
57
+ __decorate([
58
+ (0, class_validator_1.IsOptional)(),
59
+ (0, class_validator_1.ValidateNested)(),
60
+ (0, class_transformer_1.Type)(() => CollectionPricingDto_1.CollectionPricingDto),
61
+ __metadata("design:type", CollectionPricingDto_1.CollectionPricingDto)
62
+ ], CollectionSourceDto.prototype, "pricing", void 0);
@@ -1,4 +1,14 @@
1
1
  import { CurrencyId } from '../../currency/enums/CurrencyId';
2
+ /**
3
+ * Un cargo vivo, según el dominio que lleva la deuda.
4
+ *
5
+ * `amount` es lo que queda por cobrar AHORA, con las reglas del dominio ya aplicadas —mora corrida,
6
+ * pagos recibidos por otra vía—. El motor no lo recalcula ni lo valida contra nada: cobra lo que aquí
7
+ * se declare.
8
+ *
9
+ * El desglose (capital, interés, impuesto) es opcional y no participa del cobro: viaja para que el
10
+ * asiento y los reportes puedan reconstruirlo.
11
+ */
2
12
  export declare class PendingChargeDto {
3
13
  chargeId: string;
4
14
  directoryId: string;
@@ -12,6 +12,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.PendingChargeDto = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
14
  const CurrencyId_1 = require("../../currency/enums/CurrencyId");
15
+ /**
16
+ * Un cargo vivo, según el dominio que lleva la deuda.
17
+ *
18
+ * `amount` es lo que queda por cobrar AHORA, con las reglas del dominio ya aplicadas —mora corrida,
19
+ * pagos recibidos por otra vía—. El motor no lo recalcula ni lo valida contra nada: cobra lo que aquí
20
+ * se declare.
21
+ *
22
+ * El desglose (capital, interés, impuesto) es opcional y no participa del cobro: viaja para que el
23
+ * asiento y los reportes puedan reconstruirlo.
24
+ */
15
25
  class PendingChargeDto {
16
26
  }
17
27
  exports.PendingChargeDto = PendingChargeDto;
@@ -40,7 +50,7 @@ __decorate([
40
50
  __metadata("design:type", Number)
41
51
  ], PendingChargeDto.prototype, "installmentNumber", void 0);
42
52
  __decorate([
43
- (0, class_validator_1.IsInt)(),
53
+ (0, class_validator_1.IsNumber)(),
44
54
  __metadata("design:type", Number)
45
55
  ], PendingChargeDto.prototype, "amount", void 0);
46
56
  __decorate([
@@ -57,27 +67,27 @@ __decorate([
57
67
  ], PendingChargeDto.prototype, "status", void 0);
58
68
  __decorate([
59
69
  (0, class_validator_1.IsOptional)(),
60
- (0, class_validator_1.IsInt)(),
70
+ (0, class_validator_1.IsNumber)(),
61
71
  __metadata("design:type", Number)
62
72
  ], PendingChargeDto.prototype, "principalAmount", void 0);
63
73
  __decorate([
64
74
  (0, class_validator_1.IsOptional)(),
65
- (0, class_validator_1.IsInt)(),
75
+ (0, class_validator_1.IsNumber)(),
66
76
  __metadata("design:type", Number)
67
77
  ], PendingChargeDto.prototype, "interestAmount", void 0);
68
78
  __decorate([
69
79
  (0, class_validator_1.IsOptional)(),
70
- (0, class_validator_1.IsInt)(),
80
+ (0, class_validator_1.IsNumber)(),
71
81
  __metadata("design:type", Number)
72
82
  ], PendingChargeDto.prototype, "taxAmount", void 0);
73
83
  __decorate([
74
84
  (0, class_validator_1.IsOptional)(),
75
- (0, class_validator_1.IsInt)(),
85
+ (0, class_validator_1.IsNumber)(),
76
86
  __metadata("design:type", Number)
77
87
  ], PendingChargeDto.prototype, "outstandingBalance", void 0);
78
88
  __decorate([
79
89
  (0, class_validator_1.IsOptional)(),
80
- (0, class_validator_1.IsInt)(),
90
+ (0, class_validator_1.IsNumber)(),
81
91
  __metadata("design:type", Number)
82
92
  ], PendingChargeDto.prototype, "amountCollected", void 0);
83
93
  __decorate([
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Cada cuánto y hasta cuándo insistir con un cobro que no avanza.
3
+ *
4
+ * `backoffSeconds` es la base de una espera que se duplica en cada intento, no un intervalo fijo.
5
+ * `awaitingWindowDays` acota cuánto tiempo tiene sentido seguir esperando fondos antes de que el cargo
6
+ * requiera una decisión humana.
7
+ */
1
8
  export declare class RetryPolicyDto {
2
9
  maxAttempts: number;
3
10
  backoffSeconds: number;
@@ -11,6 +11,13 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.RetryPolicyDto = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
+ /**
15
+ * Cada cuánto y hasta cuándo insistir con un cobro que no avanza.
16
+ *
17
+ * `backoffSeconds` es la base de una espera que se duplica en cada intento, no un intervalo fijo.
18
+ * `awaitingWindowDays` acota cuánto tiempo tiene sentido seguir esperando fondos antes de que el cargo
19
+ * requiera una decisión humana.
20
+ */
14
21
  class RetryPolicyDto {
15
22
  }
16
23
  exports.RetryPolicyDto = RetryPolicyDto;
@@ -0,0 +1,6 @@
1
+ export declare enum CollectionFeeMode {
2
+ /** El cliente paga la deuda MÁS la comisión: se le debita `monto + fee + IVA`. */
3
+ ON_TOP = "ON_TOP",
4
+ /** El cliente paga sólo la deuda: se le debita el monto, y la comisión se retiene de lo que se remite. */
5
+ RETAINED = "RETAINED"
6
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CollectionFeeMode = void 0;
4
+ var CollectionFeeMode;
5
+ (function (CollectionFeeMode) {
6
+ /** El cliente paga la deuda MÁS la comisión: se le debita `monto + fee + IVA`. */
7
+ CollectionFeeMode["ON_TOP"] = "ON_TOP";
8
+ /** El cliente paga sólo la deuda: se le debita el monto, y la comisión se retiene de lo que se remite. */
9
+ CollectionFeeMode["RETAINED"] = "RETAINED";
10
+ })(CollectionFeeMode || (exports.CollectionFeeMode = CollectionFeeMode = {}));
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Desenlace de un intento de cobro.
3
+ *
4
+ * `NONE` no es un fallo: es que no había con qué cobrar. Un error de sistema —el procesador no
5
+ * responde, el dominio no contesta— no viaja por aquí, viaja como excepción.
6
+ */
1
7
  export declare enum CollectionResultStatus {
2
8
  FULL = "FULL",
3
9
  PARTIAL = "PARTIAL",
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CollectionResultStatus = void 0;
4
+ /**
5
+ * Desenlace de un intento de cobro.
6
+ *
7
+ * `NONE` no es un fallo: es que no había con qué cobrar. Un error de sistema —el procesador no
8
+ * responde, el dominio no contesta— no viaja por aquí, viaja como excepción.
9
+ */
4
10
  var CollectionResultStatus;
5
11
  (function (CollectionResultStatus) {
6
12
  CollectionResultStatus["FULL"] = "FULL";
@@ -1,3 +1,10 @@
1
+ /**
2
+ * En qué punto de su vida está un cobro.
3
+ *
4
+ * `COLLECTED` y `CANCELLED` son terminales: no se reintentan ni se revierten. `AWAITING_FUNDS` es el
5
+ * estado en el que un cobro pasa la mayor parte del tiempo — hay deuda, y falta que el titular tenga
6
+ * con qué pagarla.
7
+ */
1
8
  export declare enum CollectionState {
2
9
  PENDING = "PENDING",
3
10
  ATTEMPT = "ATTEMPT",
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CollectionState = void 0;
4
+ /**
5
+ * En qué punto de su vida está un cobro.
6
+ *
7
+ * `COLLECTED` y `CANCELLED` son terminales: no se reintentan ni se revierten. `AWAITING_FUNDS` es el
8
+ * estado en el que un cobro pasa la mayor parte del tiempo — hay deuda, y falta que el titular tenga
9
+ * con qué pagarla.
10
+ */
4
11
  var CollectionState;
5
12
  (function (CollectionState) {
6
13
  CollectionState["PENDING"] = "PENDING";
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Cómo se mueve el dinero en un cobro. Determina la moneda, la cuenta y si el importe se cobra o sólo
3
+ * se reserva.
4
+ *
5
+ * Los dos `DIRECT` cobran: el dinero sale de la cuenta en el acto. `USD_PREAUTH` sólo congela — el
6
+ * importe sigue siendo del titular hasta que alguien capture la retención.
7
+ */
1
8
  export declare enum MechanismType {
2
9
  USD_PREAUTH = "USD_PREAUTH",
3
10
  USD_DIRECT = "USD_DIRECT",
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MechanismType = void 0;
4
+ /**
5
+ * Cómo se mueve el dinero en un cobro. Determina la moneda, la cuenta y si el importe se cobra o sólo
6
+ * se reserva.
7
+ *
8
+ * Los dos `DIRECT` cobran: el dinero sale de la cuenta en el acto. `USD_PREAUTH` sólo congela — el
9
+ * importe sigue siendo del titular hasta que alguien capture la retención.
10
+ */
4
11
  var MechanismType;
5
12
  (function (MechanismType) {
6
13
  MechanismType["USD_PREAUTH"] = "USD_PREAUTH";
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Paso de la saga de cobro en el que quedó un intent, y desde el que se reanuda.
3
+ *
4
+ * El orden es RESOLVE (preguntarle al dominio cuánto se debe) → PICK_SOURCE (elegir de dónde) →
5
+ * EXECUTE (mover el dinero) → PERSIST (registrarlo) → DISPATCH (avisar al dominio). Un intent
6
+ * reanudado retoma desde el último paso COMPLETADO, no desde el que falló.
7
+ */
1
8
  export declare enum SagaStep {
2
9
  RESOLVE = "RESOLVE",
3
10
  PICK_SOURCE = "PICK_SOURCE",
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SagaStep = void 0;
4
+ /**
5
+ * Paso de la saga de cobro en el que quedó un intent, y desde el que se reanuda.
6
+ *
7
+ * El orden es RESOLVE (preguntarle al dominio cuánto se debe) → PICK_SOURCE (elegir de dónde) →
8
+ * EXECUTE (mover el dinero) → PERSIST (registrarlo) → DISPATCH (avisar al dominio). Un intent
9
+ * reanudado retoma desde el último paso COMPLETADO, no desde el que falló.
10
+ */
4
11
  var SagaStep;
5
12
  (function (SagaStep) {
6
13
  SagaStep["RESOLVE"] = "RESOLVE";
@@ -4,6 +4,7 @@ export * from './enums/SagaStep';
4
4
  export * from './enums/CollectionResultStatus';
5
5
  export * from './enums/DeregisterChargeStatus';
6
6
  export * from './enums/RegisterCollectibleStatus';
7
+ export * from './enums/CollectionFeeMode';
7
8
  export * from './dtos/PendingChargeDto';
8
9
  export * from './dtos/CollectRequest';
9
10
  export * from './dtos/CollectResponse';
@@ -18,6 +19,7 @@ export * from './dtos/UpsertProductConfigRequest';
18
19
  export * from './dtos/ApplyCollectionResultRequest';
19
20
  export * from './dtos/DeregisterChargeResponse';
20
21
  export * from './dtos/RegisterCollectibleResponse';
22
+ export * from './dtos/CollectionPricingDto';
21
23
  export * from './dtos/ResolvePendingChargesRequest';
22
24
  export * from './dtos/MoneyInEvent';
23
25
  export * from './dtos/CollectionIntentSummaryDto';
@@ -21,6 +21,7 @@ __exportStar(require("./enums/SagaStep"), exports);
21
21
  __exportStar(require("./enums/CollectionResultStatus"), exports);
22
22
  __exportStar(require("./enums/DeregisterChargeStatus"), exports);
23
23
  __exportStar(require("./enums/RegisterCollectibleStatus"), exports);
24
+ __exportStar(require("./enums/CollectionFeeMode"), exports);
24
25
  // DTOs
25
26
  __exportStar(require("./dtos/PendingChargeDto"), exports);
26
27
  __exportStar(require("./dtos/CollectRequest"), exports);
@@ -36,6 +37,7 @@ __exportStar(require("./dtos/UpsertProductConfigRequest"), exports);
36
37
  __exportStar(require("./dtos/ApplyCollectionResultRequest"), exports);
37
38
  __exportStar(require("./dtos/DeregisterChargeResponse"), exports);
38
39
  __exportStar(require("./dtos/RegisterCollectibleResponse"), exports);
40
+ __exportStar(require("./dtos/CollectionPricingDto"), exports);
39
41
  __exportStar(require("./dtos/ResolvePendingChargesRequest"), exports);
40
42
  __exportStar(require("./dtos/MoneyInEvent"), exports);
41
43
  // DTOs — backoffice de monitoreo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.381.0",
3
+ "version": "3.383.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -1,7 +1,15 @@
1
- import { IsString, IsInt, IsEnum, IsOptional } from 'class-validator';
1
+ import { IsString, IsEnum, IsOptional, IsNumber } from 'class-validator';
2
2
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
3
3
  import { MechanismType } from '../enums/MechanismType';
4
4
 
5
+ /**
6
+ * Resultado de un intento de cobro, tal como el motor se lo entrega al dominio dueño de la deuda.
7
+ *
8
+ * Se entrega con reintentos hasta que el dominio la acepta respondiendo `true`. Cualquier otra
9
+ * respuesta se lee como no entregada y el mismo resultado vuelve más tarde, así que aplicarlo tiene
10
+ * que ser idempotente: el dominio deduplica por `attemptId`, que identifica ESE intento y no el cobro
11
+ * entero.
12
+ */
5
13
  export class ApplyCollectionResultRequest {
6
14
  @IsString() attemptId!: string; // dedupe idempotente en el dominio
7
15
  @IsString() intentId!: string;
@@ -9,8 +17,8 @@ export class ApplyCollectionResultRequest {
9
17
  @IsString() domain!: string;
10
18
  @IsString() tenantId!: string;
11
19
  @IsEnum(CollectionResultStatus) result!: CollectionResultStatus;
12
- @IsInt() amountCollected!: number;
13
- @IsInt() amountReserved!: number;
20
+ @IsNumber() amountCollected!: number;
21
+ @IsNumber() amountReserved!: number;
14
22
  @IsEnum(MechanismType) mechanism!: MechanismType;
15
23
  @IsOptional() @IsString() holdTxId?: string;
16
24
  }
@@ -1,15 +1,25 @@
1
- import { IsString, IsInt, IsEnum, IsOptional } from 'class-validator';
1
+ import { IsString, IsEnum, IsOptional, ValidateNested, IsNumber } from 'class-validator';
2
+ import { Type } from 'class-transformer';
2
3
  import { MechanismType } from '../enums/MechanismType';
3
4
  import { CurrencyId } from '../../currency/enums/CurrencyId';
5
+ import { CollectionPricingDto } from './CollectionPricingDto';
4
6
 
5
7
  export class AuthorizeCollectionMovementRequest {
6
8
  @IsString() executionId!: string; // idempotencia (@IdempotencyController)
7
9
  @IsString() directoryId!: string;
8
10
  @IsString() provider!: string; // lo pone el motor desde la config
9
11
  @IsEnum(MechanismType) mechanism!: MechanismType;
10
- @IsInt() amount!: number; // ya convertido por el motor (FX previo)
12
+ @IsNumber() amount!: number; // ya convertido por el motor (FX previo)
11
13
  @IsEnum(CurrencyId) currencyId!: CurrencyId;
12
14
  @IsOptional() @IsString() intentId?: string;
13
15
  @IsOptional() @IsString() chargeId?: string;
14
16
  @IsOptional() @IsString() holdTxId?: string;
17
+
18
+ /**
19
+ * Tarifa con la que se registra el cobro. Presente, el movimiento deja además una transacción
20
+ * Fiado: asiento contable, historial visible para el cliente y comisión declarada. Ausente, el
21
+ * dinero se mueve igual pero sin ese registro — es el comportamiento anterior, y se conserva para
22
+ * no romper a quien todavía no manda tarifa.
23
+ */
24
+ @IsOptional() @ValidateNested() @Type(() => CollectionPricingDto) pricing?: CollectionPricingDto;
15
25
  }
@@ -1,9 +1,15 @@
1
- import { IsString, IsInt, IsEnum, IsOptional } from 'class-validator';
1
+ import { IsString, IsEnum, IsOptional, IsNumber } from 'class-validator';
2
2
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
3
3
 
4
+ /**
5
+ * Lo que el procesador responde tras ejecutar un movimiento de cobro.
6
+ *
7
+ * `amount` es lo reservado o lo cobrado según el mecanismo, y `holdTxId` sólo viene cuando se reservó:
8
+ * es con lo que después se captura o se libera la retención.
9
+ */
4
10
  export class AuthorizeCollectionMovementResponse {
5
11
  @IsEnum(CollectionResultStatus) status!: CollectionResultStatus;
6
- @IsInt() amount!: number; // reservado o cobrado
12
+ @IsNumber() amount!: number; // reservado o cobrado
7
13
  @IsOptional() @IsString() holdTxId?: string;
8
14
  @IsOptional() @IsString() transactionId?: string;
9
15
  }
@@ -1,10 +1,19 @@
1
- import { IsString, IsInt } from 'class-validator';
1
+ import { IsString, IsNumber } from 'class-validator';
2
2
 
3
+ /**
4
+ * Cobro inmediato y síncrono, con el importe ya resuelto por el dominio.
5
+ *
6
+ * Es para cuando alguien espera la respuesta —un botón, una liquidación anticipada—. La cobranza
7
+ * recurrente no va por aquí: para eso está el alta, donde el motor se encarga de perseguir el cargo.
8
+ *
9
+ * Idempotente por dominio y cargo: repetirlo sobre un cargo ya cobrado devuelve el resultado anterior
10
+ * sin volver a mover dinero.
11
+ */
3
12
  export class CollectRequest {
4
13
  @IsString() directoryId!: string;
5
14
  @IsString() tenantId!: string;
6
15
  @IsString() domain!: string;
7
16
  @IsString() productId!: string;
8
17
  @IsString() chargeId!: string;
9
- @IsInt() amount!: number;
18
+ @IsNumber() amount!: number;
10
19
  }
@@ -1,9 +1,18 @@
1
- import { IsString, IsInt, IsEnum } from 'class-validator';
1
+ import { IsString, IsEnum, IsNumber } from 'class-validator';
2
2
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
3
3
 
4
+ /**
5
+ * Desenlace de un cobro.
6
+ *
7
+ * Lo cobrado y lo reservado van separados porque no son lo mismo: lo primero ya salió de la cuenta y
8
+ * el dominio debe aplicarlo a su cartera; lo segundo sigue siendo del titular, congelado, esperando
9
+ * que alguien capture la retención.
10
+ *
11
+ * `NONE` no es un fallo: el cargo queda vivo esperando fondos, y el motor lo reintenta solo.
12
+ */
4
13
  export class CollectResponse {
5
14
  @IsString() intentId!: string;
6
15
  @IsEnum(CollectionResultStatus) status!: CollectionResultStatus;
7
- @IsInt() amountReserved!: number;
8
- @IsInt() amountCollected!: number;
16
+ @IsNumber() amountReserved!: number;
17
+ @IsNumber() amountCollected!: number;
9
18
  }
@@ -1,4 +1,4 @@
1
- import { IsString, IsInt, IsEnum, IsOptional } from 'class-validator';
1
+ import { IsString, IsInt, IsEnum, IsOptional, IsNumber } from 'class-validator';
2
2
  import { MechanismType } from '../enums/MechanismType';
3
3
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
4
4
 
@@ -8,7 +8,7 @@ export class CollectionAttemptDto {
8
8
  @IsString() intentId!: string;
9
9
  @IsString() source!: string;
10
10
  @IsEnum(MechanismType) mechanism!: MechanismType;
11
- @IsInt() amount!: number;
11
+ @IsNumber() amount!: number;
12
12
  @IsOptional() @IsString() holdTxId?: string;
13
13
  @IsOptional() @IsEnum(CollectionResultStatus) result?: CollectionResultStatus;
14
14
  @IsOptional() @IsString() errorCode?: string;
@@ -1,4 +1,4 @@
1
- import { IsString, IsInt, IsBoolean, IsEnum, IsOptional } from 'class-validator';
1
+ import { IsString, IsInt, IsBoolean, IsEnum, IsOptional, IsNumber } from 'class-validator';
2
2
  import { CollectionState } from '../enums/CollectionState';
3
3
  import { SagaStep } from '../enums/SagaStep';
4
4
 
@@ -9,8 +9,8 @@ export class CollectionIntentSummaryDto {
9
9
  @IsString() tenantId!: string;
10
10
  @IsString() domain!: string;
11
11
  @IsString() chargeId!: string;
12
- @IsInt() amount!: number;
13
- @IsOptional() @IsInt() reserved?: number;
12
+ @IsNumber() amount!: number;
13
+ @IsOptional() @IsNumber() reserved?: number;
14
14
  @IsEnum(CollectionState) state!: CollectionState;
15
15
  @IsEnum(SagaStep) sagaStep!: SagaStep;
16
16
  @IsOptional() @IsBoolean() attention?: boolean;
@@ -4,8 +4,8 @@ import { IsInt, IsNumber, IsObject } from 'class-validator';
4
4
  export class CollectionMetricsDto {
5
5
  @IsObject() countsByState!: Record<string, number>;
6
6
  @IsNumber() successRate!: number;
7
- @IsInt() amountReserved!: number;
8
- @IsInt() amountCollected!: number;
7
+ @IsNumber() amountReserved!: number;
8
+ @IsNumber() amountCollected!: number;
9
9
  @IsInt() backlogAwaitingFunds!: number;
10
10
  @IsInt() dlqCount!: number;
11
11
  }
@@ -0,0 +1,35 @@
1
+ import { IsEnum, IsNumber, IsString, Min } from 'class-validator';
2
+ import { ProductTaxFeeTypeEnum } from '../../productCatalog';
3
+ import { CollectionFeeMode } from '../enums/CollectionFeeMode';
4
+
5
+ /**
6
+ * Tarifa de un cobro, tal como la manda quien lo pide.
7
+ *
8
+ * La regla viaja aquí y no sale del catálogo de productos porque quien conoce las condiciones
9
+ * comerciales de una cartera es el dominio dueño de la deuda, no el procesador: la misma mecánica de
10
+ * cobro se tarifa distinto según el producto, el tenant o el convenio.
11
+ *
12
+ * Viaja la REGLA, no el importe ya calculado. Así la aritmética y el redondeo son los mismos que los
13
+ * del resto de las transacciones, en vez de que cada dominio reimplemente los suyos y los números
14
+ * dejen de cuadrar entre sí.
15
+ */
16
+ export class CollectionPricingDto {
17
+ /**
18
+ * Fila de `ProductCatalog_GT` con la que se clasifica la transacción resultante — de ahí salen su
19
+ * tipo y subtipo. La tarifa NO sale de ahí: sale de los campos de abajo.
20
+ */
21
+ @IsString() productCatalogId!: string;
22
+
23
+ /** Comisión: porcentaje sobre el monto, o importe fijo, según `feeType`. */
24
+ @IsNumber() @Min(0) fee!: number;
25
+
26
+ @IsEnum(ProductTaxFeeTypeEnum) feeType!: ProductTaxFeeTypeEnum;
27
+
28
+ /** Impuesto: porcentaje SOBRE LA COMISIÓN, o importe fijo, según `taxType`. */
29
+ @IsNumber() @Min(0) tax!: number;
30
+
31
+ @IsEnum(ProductTaxFeeTypeEnum) taxType!: ProductTaxFeeTypeEnum;
32
+
33
+ /** Quién absorbe la comisión: el cliente por encima de su deuda, o el destino al recibir menos. */
34
+ @IsEnum(CollectionFeeMode) feeMode!: CollectionFeeMode;
35
+ }
@@ -3,6 +3,15 @@ import { Type } from 'class-transformer';
3
3
  import { CollectionSourceDto } from './CollectionSourceDto';
4
4
  import { RetryPolicyDto } from './RetryPolicyDto';
5
5
 
6
+ /**
7
+ * Cómo se cobra un producto: de qué cuentas, en qué orden, y con cuánta insistencia.
8
+ *
9
+ * `allowPartial` decide si una fuente puede aportar una parte y el resto se busca en la siguiente, o
10
+ * si sólo sirve la que cubra el total.
11
+ *
12
+ * Versionada: cambiar la cascada de un producto crea una versión nueva en vez de reescribir la
13
+ * anterior, para que un cobro pueda explicarse con la configuración que regía cuando ocurrió.
14
+ */
6
15
  export class CollectionProductConfigDto {
7
16
  @IsString() tenantId!: string;
8
17
  @IsString() productId!: string;
@@ -1,7 +1,10 @@
1
- import { IsString, IsInt, IsEnum } from 'class-validator';
1
+ import { IsString, IsEnum, IsNumber } from 'class-validator';
2
2
  import { CollectionResultStatus } from '../enums/CollectionResultStatus';
3
3
  import { MechanismType } from '../enums/MechanismType';
4
4
 
5
+ /**
6
+ * El resultado de un cobro, en la forma en que se anuncia hacia afuera del motor.
7
+ */
5
8
  export class CollectionResultEvent {
6
9
  @IsString() attemptId!: string; // dedupe en el consumidor
7
10
  @IsString() intentId!: string;
@@ -10,5 +13,5 @@ export class CollectionResultEvent {
10
13
  @IsString() chargeId!: string;
11
14
  @IsEnum(CollectionResultStatus) status!: CollectionResultStatus;
12
15
  @IsEnum(MechanismType) mechanism!: MechanismType;
13
- @IsInt() amount!: number; // reservado o cobrado según mecanismo
16
+ @IsNumber() amount!: number; // reservado o cobrado según mecanismo
14
17
  }
@@ -1,7 +1,20 @@
1
- import { IsString, IsInt, IsEnum, IsOptional } from 'class-validator';
1
+ import { IsString, IsInt, IsEnum, IsOptional, ValidateNested } from 'class-validator';
2
+ import { Type } from 'class-transformer';
2
3
  import { MechanismType } from '../enums/MechanismType';
3
4
  import { CurrencyId } from '../../currency/enums/CurrencyId';
5
+ import { CollectionPricingDto } from './CollectionPricingDto';
4
6
 
7
+ /**
8
+ * Una fuente de la cascada de cobro: de qué cuenta se intenta cobrar, con qué mecanismo y en qué
9
+ * posición.
10
+ *
11
+ * `order` es lo que decide si primero se intenta en pesos o en dólares. El motor las recorre de menor
12
+ * a mayor y salta las ya intentadas en esa corrida.
13
+ *
14
+ * `currency` tiene que corresponder al `mechanism` —el mecanismo fija su moneda al ejecutar— y
15
+ * `provider` tiene que ser único entre las fuentes de un producto: es la identidad con la que el motor
16
+ * distingue un intento de otro.
17
+ */
5
18
  export class CollectionSourceDto {
6
19
  @IsInt() order!: number;
7
20
  @IsString() wallet!: string;
@@ -9,4 +22,13 @@ export class CollectionSourceDto {
9
22
  @IsEnum(MechanismType) mechanism!: MechanismType;
10
23
  @IsString() provider!: string;
11
24
  @IsOptional() @IsString() fxPolicy?: string;
25
+
26
+ /**
27
+ * Con qué se tarifa un cobro por esta fuente. Va por fuente y no por producto porque la misma deuda
28
+ * puede costar distinto según de dónde se cobre: mover dólares no cuesta lo mismo que mover pesos.
29
+ *
30
+ * Sin tarifa el cobro se ejecuta igual, pero no deja transacción — sin asiento contable, sin
31
+ * aparecer en el historial del cliente y sin comisión declarada.
32
+ */
33
+ @IsOptional() @ValidateNested() @Type(() => CollectionPricingDto) pricing?: CollectionPricingDto;
12
34
  }
@@ -1,6 +1,16 @@
1
- import { IsString, IsInt, IsOptional, IsEnum, IsObject } from 'class-validator';
1
+ import { IsString, IsInt, IsOptional, IsEnum, IsObject, IsNumber } from 'class-validator';
2
2
  import { CurrencyId } from '../../currency/enums/CurrencyId';
3
3
 
4
+ /**
5
+ * Un cargo vivo, según el dominio que lleva la deuda.
6
+ *
7
+ * `amount` es lo que queda por cobrar AHORA, con las reglas del dominio ya aplicadas —mora corrida,
8
+ * pagos recibidos por otra vía—. El motor no lo recalcula ni lo valida contra nada: cobra lo que aquí
9
+ * se declare.
10
+ *
11
+ * El desglose (capital, interés, impuesto) es opcional y no participa del cobro: viaja para que el
12
+ * asiento y los reportes puedan reconstruirlo.
13
+ */
4
14
  export class PendingChargeDto {
5
15
  @IsString() chargeId!: string; // record_id / INSTALLMENT#n
6
16
  @IsString() directoryId!: string;
@@ -8,14 +18,14 @@ export class PendingChargeDto {
8
18
  @IsString() domain!: string; // une-credit | surekeep-retail
9
19
  @IsString() parentDebtId!: string; // credit_id / CREDIT#id
10
20
  @IsInt() installmentNumber!: number; // coupon_number / installment_number
11
- @IsInt() amount!: number; // centavos
21
+ @IsNumber() amount!: number; // centavos
12
22
  @IsEnum(CurrencyId) currency!: CurrencyId;
13
23
  @IsString() dueDate!: string; // ISO date
14
24
  @IsString() status!: string; // estado del cargo en el dominio (normalizado por el motor)
15
- @IsOptional() @IsInt() principalAmount?: number;
16
- @IsOptional() @IsInt() interestAmount?: number;
17
- @IsOptional() @IsInt() taxAmount?: number;
18
- @IsOptional() @IsInt() outstandingBalance?: number;
19
- @IsOptional() @IsInt() amountCollected?: number;
25
+ @IsOptional() @IsNumber() principalAmount?: number;
26
+ @IsOptional() @IsNumber() interestAmount?: number;
27
+ @IsOptional() @IsNumber() taxAmount?: number;
28
+ @IsOptional() @IsNumber() outstandingBalance?: number;
29
+ @IsOptional() @IsNumber() amountCollected?: number;
20
30
  @IsOptional() @IsObject() metadata?: Record<string, unknown>; // por-dominio (fiado_/loanco_interest, imei…)
21
31
  }
@@ -1,5 +1,12 @@
1
1
  import { IsInt, IsOptional } from 'class-validator';
2
2
 
3
+ /**
4
+ * Cada cuánto y hasta cuándo insistir con un cobro que no avanza.
5
+ *
6
+ * `backoffSeconds` es la base de una espera que se duplica en cada intento, no un intervalo fijo.
7
+ * `awaitingWindowDays` acota cuánto tiempo tiene sentido seguir esperando fondos antes de que el cargo
8
+ * requiera una decisión humana.
9
+ */
3
10
  export class RetryPolicyDto {
4
11
  @IsInt() maxAttempts!: number;
5
12
  @IsInt() backoffSeconds!: number;
@@ -0,0 +1,6 @@
1
+ export enum CollectionFeeMode {
2
+ /** El cliente paga la deuda MÁS la comisión: se le debita `monto + fee + IVA`. */
3
+ ON_TOP = 'ON_TOP',
4
+ /** El cliente paga sólo la deuda: se le debita el monto, y la comisión se retiene de lo que se remite. */
5
+ RETAINED = 'RETAINED',
6
+ }
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Desenlace de un intento de cobro.
3
+ *
4
+ * `NONE` no es un fallo: es que no había con qué cobrar. Un error de sistema —el procesador no
5
+ * responde, el dominio no contesta— no viaja por aquí, viaja como excepción.
6
+ */
1
7
  export enum CollectionResultStatus {
2
8
  FULL = 'FULL',
3
9
  PARTIAL = 'PARTIAL',
@@ -1,3 +1,10 @@
1
+ /**
2
+ * En qué punto de su vida está un cobro.
3
+ *
4
+ * `COLLECTED` y `CANCELLED` son terminales: no se reintentan ni se revierten. `AWAITING_FUNDS` es el
5
+ * estado en el que un cobro pasa la mayor parte del tiempo — hay deuda, y falta que el titular tenga
6
+ * con qué pagarla.
7
+ */
1
8
  export enum CollectionState {
2
9
  PENDING = 'PENDING',
3
10
  ATTEMPT = 'ATTEMPT',
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Cómo se mueve el dinero en un cobro. Determina la moneda, la cuenta y si el importe se cobra o sólo
3
+ * se reserva.
4
+ *
5
+ * Los dos `DIRECT` cobran: el dinero sale de la cuenta en el acto. `USD_PREAUTH` sólo congela — el
6
+ * importe sigue siendo del titular hasta que alguien capture la retención.
7
+ */
1
8
  export enum MechanismType {
2
9
  USD_PREAUTH = 'USD_PREAUTH',
3
10
  USD_DIRECT = 'USD_DIRECT',
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Paso de la saga de cobro en el que quedó un intent, y desde el que se reanuda.
3
+ *
4
+ * El orden es RESOLVE (preguntarle al dominio cuánto se debe) → PICK_SOURCE (elegir de dónde) →
5
+ * EXECUTE (mover el dinero) → PERSIST (registrarlo) → DISPATCH (avisar al dominio). Un intent
6
+ * reanudado retoma desde el último paso COMPLETADO, no desde el que falló.
7
+ */
1
8
  export enum SagaStep {
2
9
  RESOLVE = 'RESOLVE',
3
10
  PICK_SOURCE = 'PICK_SOURCE',
@@ -5,6 +5,7 @@ export * from './enums/SagaStep';
5
5
  export * from './enums/CollectionResultStatus';
6
6
  export * from './enums/DeregisterChargeStatus';
7
7
  export * from './enums/RegisterCollectibleStatus';
8
+ export * from './enums/CollectionFeeMode';
8
9
 
9
10
  // DTOs
10
11
  export * from './dtos/PendingChargeDto';
@@ -21,6 +22,7 @@ export * from './dtos/UpsertProductConfigRequest';
21
22
  export * from './dtos/ApplyCollectionResultRequest';
22
23
  export * from './dtos/DeregisterChargeResponse';
23
24
  export * from './dtos/RegisterCollectibleResponse';
25
+ export * from './dtos/CollectionPricingDto';
24
26
  export * from './dtos/ResolvePendingChargesRequest';
25
27
  export * from './dtos/MoneyInEvent';
26
28