@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.
- package/bin/collection/dtos/ApplyCollectionResultRequest.d.ts +8 -0
- package/bin/collection/dtos/ApplyCollectionResultRequest.js +10 -2
- package/bin/collection/dtos/AuthorizeCollectionMovementRequest.d.ts +8 -0
- package/bin/collection/dtos/AuthorizeCollectionMovementRequest.js +9 -1
- package/bin/collection/dtos/AuthorizeCollectionMovementResponse.d.ts +6 -0
- package/bin/collection/dtos/AuthorizeCollectionMovementResponse.js +7 -1
- package/bin/collection/dtos/CollectRequest.d.ts +9 -0
- package/bin/collection/dtos/CollectRequest.js +10 -1
- package/bin/collection/dtos/CollectResponse.d.ts +9 -0
- package/bin/collection/dtos/CollectResponse.js +11 -2
- package/bin/collection/dtos/CollectionAttemptDto.js +1 -1
- package/bin/collection/dtos/CollectionIntentSummaryDto.js +2 -2
- package/bin/collection/dtos/CollectionMetricsDto.js +2 -2
- package/bin/collection/dtos/CollectionPricingDto.d.ts +28 -0
- package/bin/collection/dtos/CollectionPricingDto.js +55 -0
- package/bin/collection/dtos/CollectionProductConfigDto.d.ts +9 -0
- package/bin/collection/dtos/CollectionProductConfigDto.js +9 -0
- package/bin/collection/dtos/CollectionResultEvent.d.ts +3 -0
- package/bin/collection/dtos/CollectionResultEvent.js +4 -1
- package/bin/collection/dtos/CollectionSourceDto.d.ts +20 -0
- package/bin/collection/dtos/CollectionSourceDto.js +19 -0
- package/bin/collection/dtos/PendingChargeDto.d.ts +10 -0
- package/bin/collection/dtos/PendingChargeDto.js +16 -6
- package/bin/collection/dtos/RetryPolicyDto.d.ts +7 -0
- package/bin/collection/dtos/RetryPolicyDto.js +7 -0
- package/bin/collection/enums/CollectionFeeMode.d.ts +6 -0
- package/bin/collection/enums/CollectionFeeMode.js +10 -0
- package/bin/collection/enums/CollectionResultStatus.d.ts +6 -0
- package/bin/collection/enums/CollectionResultStatus.js +6 -0
- package/bin/collection/enums/CollectionState.d.ts +7 -0
- package/bin/collection/enums/CollectionState.js +7 -0
- package/bin/collection/enums/MechanismType.d.ts +7 -0
- package/bin/collection/enums/MechanismType.js +7 -0
- package/bin/collection/enums/SagaStep.d.ts +7 -0
- package/bin/collection/enums/SagaStep.js +7 -0
- package/bin/collection/index.d.ts +2 -0
- package/bin/collection/index.js +2 -0
- package/package.json +1 -1
- package/src/collection/dtos/ApplyCollectionResultRequest.ts +11 -3
- package/src/collection/dtos/AuthorizeCollectionMovementRequest.ts +12 -2
- package/src/collection/dtos/AuthorizeCollectionMovementResponse.ts +8 -2
- package/src/collection/dtos/CollectRequest.ts +11 -2
- package/src/collection/dtos/CollectResponse.ts +12 -3
- package/src/collection/dtos/CollectionAttemptDto.ts +2 -2
- package/src/collection/dtos/CollectionIntentSummaryDto.ts +3 -3
- package/src/collection/dtos/CollectionMetricsDto.ts +2 -2
- package/src/collection/dtos/CollectionPricingDto.ts +35 -0
- package/src/collection/dtos/CollectionProductConfigDto.ts +9 -0
- package/src/collection/dtos/CollectionResultEvent.ts +5 -2
- package/src/collection/dtos/CollectionSourceDto.ts +23 -1
- package/src/collection/dtos/PendingChargeDto.ts +17 -7
- package/src/collection/dtos/RetryPolicyDto.ts +7 -0
- package/src/collection/enums/CollectionFeeMode.ts +6 -0
- package/src/collection/enums/CollectionResultStatus.ts +6 -0
- package/src/collection/enums/CollectionState.ts +7 -0
- package/src/collection/enums/MechanismType.ts +7 -0
- package/src/collection/enums/SagaStep.ts +7 -0
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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';
|
package/bin/collection/index.js
CHANGED
|
@@ -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,7 +1,15 @@
|
|
|
1
|
-
import { IsString,
|
|
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
|
-
@
|
|
13
|
-
@
|
|
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,
|
|
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
|
-
@
|
|
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,
|
|
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
|
-
@
|
|
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,
|
|
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
|
-
@
|
|
18
|
+
@IsNumber() amount!: number;
|
|
10
19
|
}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
import { IsString,
|
|
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
|
-
@
|
|
8
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
13
|
-
@IsOptional() @
|
|
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
|
-
@
|
|
8
|
-
@
|
|
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,
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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() @
|
|
16
|
-
@IsOptional() @
|
|
17
|
-
@IsOptional() @
|
|
18
|
-
@IsOptional() @
|
|
19
|
-
@IsOptional() @
|
|
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',
|
package/src/collection/index.ts
CHANGED
|
@@ -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
|
|