@fiado/type-kit 3.550.0 → 3.551.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_test_/unit/retailCommission/commissionPayments.test.ts +168 -0
- package/_test_/unit/retailCommission/commissionRules.test.ts +53 -0
- package/_test_/unit/retailOrg/dtos/RetailUser.test.ts +47 -0
- package/_test_/unit/retailOrg/dtos/requests/retailUserWalletRequests.test.ts +41 -0
- package/_test_/unit/retailOrg/dtos/responses/retailUserWalletResponses.test.ts +30 -0
- package/_test_/unit/retailOrg/enums/RetailUserWalletLinkMethodEnum.test.ts +12 -0
- package/bin/retailCommission/dtos/CommissionApi.d.ts +80 -1
- package/bin/retailCommission/dtos/CommissionLedger.d.ts +96 -0
- package/bin/retailCommission/dtos/CommissionLedger.js +2 -0
- package/bin/retailCommission/dtos/CommissionRule.d.ts +14 -1
- package/bin/retailCommission/enums/CommissionBillingPeriodEnum.d.ts +10 -0
- package/bin/retailCommission/enums/CommissionBillingPeriodEnum.js +14 -0
- package/bin/retailCommission/enums/CommissionLedgerMovementKindEnum.d.ts +14 -0
- package/bin/retailCommission/enums/CommissionLedgerMovementKindEnum.js +18 -0
- package/bin/retailCommission/enums/CommissionPayTimingEnum.d.ts +13 -0
- package/bin/retailCommission/enums/CommissionPayTimingEnum.js +17 -0
- package/bin/retailCommission/enums/CommissionPayTriggerEnum.d.ts +18 -0
- package/bin/retailCommission/enums/CommissionPayTriggerEnum.js +22 -0
- package/bin/retailCommission/enums/CommissionPaymentAttentionEnum.d.ts +14 -0
- package/bin/retailCommission/enums/CommissionPaymentAttentionEnum.js +18 -0
- package/bin/retailCommission/enums/CommissionPaymentStatusEnum.d.ts +14 -0
- package/bin/retailCommission/enums/CommissionPaymentStatusEnum.js +18 -0
- package/bin/retailCommission/index.d.ts +7 -0
- package/bin/retailCommission/index.js +7 -0
- package/bin/retailOrg/dtos/RetailUser.d.ts +13 -0
- package/bin/retailOrg/dtos/RetailUser.js +39 -0
- package/bin/retailOrg/dtos/requests/LinkRetailUserWalletRequest.d.ts +10 -0
- package/bin/retailOrg/dtos/requests/LinkRetailUserWalletRequest.js +37 -0
- package/bin/retailOrg/dtos/requests/LookupRetailUserWalletRequest.d.ts +10 -0
- package/bin/retailOrg/dtos/requests/LookupRetailUserWalletRequest.js +37 -0
- package/bin/retailOrg/dtos/responses/LookupRetailUserWalletResponse.d.ts +10 -0
- package/bin/retailOrg/dtos/responses/LookupRetailUserWalletResponse.js +2 -0
- package/bin/retailOrg/dtos/responses/PrivateRetailUserWalletResponse.d.ts +8 -0
- package/bin/retailOrg/dtos/responses/PrivateRetailUserWalletResponse.js +2 -0
- package/bin/retailOrg/enums/RetailUserWalletLinkMethodEnum.d.ts +11 -0
- package/bin/retailOrg/enums/RetailUserWalletLinkMethodEnum.js +15 -0
- package/bin/retailOrg/index.d.ts +6 -0
- package/bin/retailOrg/index.js +7 -0
- package/bin/retailOrg/validators/IsSingleWalletKeyConstraint.d.ts +6 -0
- package/bin/retailOrg/validators/IsSingleWalletKeyConstraint.js +24 -0
- package/package.json +1 -1
- package/src/retailCommission/dtos/CommissionApi.ts +97 -1
- package/src/retailCommission/dtos/CommissionLedger.ts +101 -0
- package/src/retailCommission/dtos/CommissionRule.ts +15 -1
- package/src/retailCommission/enums/CommissionBillingPeriodEnum.ts +10 -0
- package/src/retailCommission/enums/CommissionLedgerMovementKindEnum.ts +14 -0
- package/src/retailCommission/enums/CommissionPayTimingEnum.ts +13 -0
- package/src/retailCommission/enums/CommissionPayTriggerEnum.ts +18 -0
- package/src/retailCommission/enums/CommissionPaymentAttentionEnum.ts +14 -0
- package/src/retailCommission/enums/CommissionPaymentStatusEnum.ts +14 -0
- package/src/retailCommission/index.ts +7 -0
- package/src/retailOrg/dtos/RetailUser.ts +39 -0
- package/src/retailOrg/dtos/requests/LinkRetailUserWalletRequest.ts +24 -0
- package/src/retailOrg/dtos/requests/LookupRetailUserWalletRequest.ts +24 -0
- package/src/retailOrg/dtos/responses/LookupRetailUserWalletResponse.ts +11 -0
- package/src/retailOrg/dtos/responses/PrivateRetailUserWalletResponse.ts +8 -0
- package/src/retailOrg/enums/RetailUserWalletLinkMethodEnum.ts +11 -0
- package/src/retailOrg/index.ts +8 -0
- package/src/retailOrg/validators/IsSingleWalletKeyConstraint.ts +18 -0
|
@@ -23,8 +23,16 @@ import type {
|
|
|
23
23
|
CommissionRuleScope,
|
|
24
24
|
CommissionRuleSetSnapshot,
|
|
25
25
|
} from './CommissionRule';
|
|
26
|
+
import type {
|
|
27
|
+
CommissionChainStatement,
|
|
28
|
+
CommissionLedgerMovement,
|
|
29
|
+
CommissionPayment,
|
|
30
|
+
CommissionSellerBalance,
|
|
31
|
+
} from './CommissionLedger';
|
|
26
32
|
import type { CommissionWindowEnum } from '../enums/CommissionWindowEnum';
|
|
33
|
+
import type { CommissionBillingPeriodEnum } from '../enums/CommissionBillingPeriodEnum';
|
|
27
34
|
import type { CommissionCountByEnum } from '../enums/CommissionCountByEnum';
|
|
35
|
+
import type { CommissionPayTimingEnum } from '../enums/CommissionPayTimingEnum';
|
|
28
36
|
import type { CommissionAggregateByEnum } from '../enums/CommissionAggregateByEnum';
|
|
29
37
|
import type { CommissionSeriesByEnum } from '../enums/CommissionSeriesByEnum';
|
|
30
38
|
import type { CommissionAccrualStatusEnum } from '../enums/CommissionAccrualStatusEnum';
|
|
@@ -254,6 +262,8 @@ export interface CommissionRuleInput {
|
|
|
254
262
|
replacesOthers: boolean;
|
|
255
263
|
/** Si la regla cuenta piezas o ventas. Ausente = `PIECE`. */
|
|
256
264
|
countBy?: CommissionCountByEnum;
|
|
265
|
+
/** Cuándo se paga lo que gana. Ausente = `ON_CUT`. */
|
|
266
|
+
payTiming?: CommissionPayTimingEnum;
|
|
257
267
|
}
|
|
258
268
|
|
|
259
269
|
/** `POST /backoffice/commissions/rules` — la regla nace en borrador. */
|
|
@@ -297,10 +307,12 @@ export interface GetPoliciesResponse {
|
|
|
297
307
|
policies: CommissionPolicies;
|
|
298
308
|
}
|
|
299
309
|
|
|
300
|
-
/** `PUT /backoffice/commissions/policies` — las
|
|
310
|
+
/** `PUT /backoffice/commissions/policies` — las políticas se guardan juntas. */
|
|
301
311
|
export interface UpdatePoliciesRequest {
|
|
302
312
|
clawback: { cancelacionDias: number; devolucionDias: number; npiM30Dias: number };
|
|
303
313
|
commissions: { multiplicadorMaxBps: number; ventanaDefault: CommissionWindowEnum };
|
|
314
|
+
/** Opcional para que un editor que todavía no la manda siga funcionando. */
|
|
315
|
+
payouts?: { walletDeposits: boolean; chainBillingPeriod: CommissionBillingPeriodEnum };
|
|
304
316
|
}
|
|
305
317
|
|
|
306
318
|
export interface UpdatePoliciesResponse {
|
|
@@ -452,6 +464,8 @@ export interface CommissionRuleView {
|
|
|
452
464
|
effectiveTo: string | null;
|
|
453
465
|
/** Si la regla cuenta piezas o ventas. Ausente = `PIECE`. */
|
|
454
466
|
countBy?: CommissionCountByEnum;
|
|
467
|
+
/** Cuándo se paga lo que gana. Ausente = `ON_CUT`. */
|
|
468
|
+
payTiming?: CommissionPayTimingEnum;
|
|
455
469
|
}
|
|
456
470
|
|
|
457
471
|
/** Lo pagado en varios cortes. */
|
|
@@ -482,3 +496,85 @@ export interface GetMyCommissionsResponse {
|
|
|
482
496
|
/** Tope del multiplicador de la política; `null` sin política. */
|
|
483
497
|
multiplierCapBps: number | null;
|
|
484
498
|
}
|
|
499
|
+
|
|
500
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
501
|
+
// Pagos a la wallet
|
|
502
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
503
|
+
|
|
504
|
+
/** `GET /backoffice/commissions/payments/attention` — el reporte "Por pagar" de la cadena. */
|
|
505
|
+
export interface GetPaymentAttentionResponse {
|
|
506
|
+
/** Saldos con exigible sin depositar, con su motivo. */
|
|
507
|
+
pending: CommissionSellerBalance[];
|
|
508
|
+
/** Depósitos sin confirmar: "Requiere revisión". */
|
|
509
|
+
unverified: CommissionPayment[];
|
|
510
|
+
/** Saldos con exigible negativo. */
|
|
511
|
+
debts: CommissionSellerBalance[];
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/** `POST /backoffice/commissions/payments/sellers/{sellerId}/paid-outside` */
|
|
515
|
+
export interface MarkPaidOutsideRequest {
|
|
516
|
+
amountCents: number;
|
|
517
|
+
/** Obligatorio: dinero que sale sin depósito tiene que poder auditarse. */
|
|
518
|
+
reason: string;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/** `POST /backoffice/commissions/payments/{paymentId}/resolve` — revisión de un depósito sin confirmar. */
|
|
522
|
+
export interface ResolvePaymentRequest {
|
|
523
|
+
/** `true` = sí se depositó; `false` = no, y el monto vuelve al exigible. */
|
|
524
|
+
accredited: boolean;
|
|
525
|
+
/** El folio, cuando sí se depositó. */
|
|
526
|
+
transactionId?: string;
|
|
527
|
+
note: string;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/** `GET /backoffice/commissions/sellers/{sellerId}/ledger` — saldo e historial de un vendedor. */
|
|
531
|
+
export interface GetSellerLedgerResponse {
|
|
532
|
+
balance: CommissionSellerBalance;
|
|
533
|
+
movements: CommissionLedgerMovement[];
|
|
534
|
+
payments: CommissionPayment[];
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/** `GET /backoffice/commissions/statements` */
|
|
538
|
+
export interface ListStatementsResponse {
|
|
539
|
+
statements: CommissionChainStatement[];
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/** `GET /backoffice/commissions/statements/{statementId}` — el estado de cuenta y sus depósitos. */
|
|
543
|
+
export interface GetStatementResponse {
|
|
544
|
+
statement: CommissionChainStatement;
|
|
545
|
+
payments: CommissionPayment[];
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/** `GET /commissions/me/payments` — los pagos del vendedor que llama. */
|
|
549
|
+
export interface GetMyPaymentsResponse {
|
|
550
|
+
/** `null` mientras no tiene nada en el libro. */
|
|
551
|
+
balance: CommissionSellerBalance | null;
|
|
552
|
+
payments: CommissionPayment[];
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/** `POST /backoffice/commissions/payments/sellers/{sellerId}/retry` (202) — el pago quedó en la cola. */
|
|
556
|
+
export interface RetrySellerPaymentView {
|
|
557
|
+
sellerId: string;
|
|
558
|
+
/** Id del disparo `RETRY` con que se encoló. */
|
|
559
|
+
triggerId: string;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/** `POST /backoffice/commissions/payments/sellers/{sellerId}/paid-outside` (201) — el saldo nuevo y el movimiento escrito. */
|
|
563
|
+
export interface MarkPaidOutsideView {
|
|
564
|
+
balance: CommissionSellerBalance;
|
|
565
|
+
movement: CommissionLedgerMovement;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/** `POST /backoffice/commissions/payments/{paymentId}/resolve` — el depósito ya resuelto. */
|
|
569
|
+
export interface ResolvePaymentView {
|
|
570
|
+
payment: CommissionPayment;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* `POST /private/retailers/{retailerId}/sellers/{sellerId}/payments/trigger?tenantId=` (202) — retail-org
|
|
575
|
+
* avisa que el vendedor vinculó su wallet. El cuerpo va vacío (`{}`).
|
|
576
|
+
*/
|
|
577
|
+
export interface PrivateTriggerSellerPaymentResponse {
|
|
578
|
+
/** `false` si la cola no lo recibió: el saldo sigue pendiente y entra en el siguiente pago. */
|
|
579
|
+
enqueued: boolean;
|
|
580
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { CommissionBillingPeriodEnum } from '../enums/CommissionBillingPeriodEnum';
|
|
2
|
+
import type { CommissionLedgerMovementKindEnum } from '../enums/CommissionLedgerMovementKindEnum';
|
|
3
|
+
import type { CommissionPayTimingEnum } from '../enums/CommissionPayTimingEnum';
|
|
4
|
+
import type { CommissionPaymentAttentionEnum } from '../enums/CommissionPaymentAttentionEnum';
|
|
5
|
+
import type { CommissionPaymentStatusEnum } from '../enums/CommissionPaymentStatusEnum';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Saldo de un vendedor en una cadena. Es parte del libro de pagos: cada peso que se le acredita, se
|
|
9
|
+
* le descuenta o se le deposita en su wallet. Montos en centavos; fechas en ISO.
|
|
10
|
+
*/
|
|
11
|
+
export interface CommissionSellerBalance {
|
|
12
|
+
retailerId: string;
|
|
13
|
+
sellerId: string;
|
|
14
|
+
/** Ganado que todavía no toca pagar (reglas al cierre del mes). */
|
|
15
|
+
retainedCents: number;
|
|
16
|
+
/** Lo que se puede depositar ya. Negativo = el vendedor debe. */
|
|
17
|
+
payableCents: number;
|
|
18
|
+
/** Apartado para un depósito en curso o sin confirmar. */
|
|
19
|
+
inTransitCents: number;
|
|
20
|
+
/** Acumulado de todo lo ganado. */
|
|
21
|
+
earnedCents: number;
|
|
22
|
+
/** Acumulado de todo lo descontado. */
|
|
23
|
+
deductedCents: number;
|
|
24
|
+
/** Acumulado de lo depositado y confirmado. */
|
|
25
|
+
accreditedCents: number;
|
|
26
|
+
/** Acumulado de lo pagado por fuera. */
|
|
27
|
+
paidOutsideCents: number;
|
|
28
|
+
/** `null` si no necesita atención. */
|
|
29
|
+
attention: CommissionPaymentAttentionEnum | null;
|
|
30
|
+
/** Código del último rechazo, p. ej. `USER_NOT_ACTIVE`. */
|
|
31
|
+
attentionCode: string | null;
|
|
32
|
+
/** Desde cuándo tiene esa atención. */
|
|
33
|
+
attentionSince: string | null;
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Lo que una regla aporta a un movimiento. */
|
|
38
|
+
export interface CommissionLedgerMovementRule {
|
|
39
|
+
ruleId: string;
|
|
40
|
+
payTiming: CommissionPayTimingEnum;
|
|
41
|
+
cents: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Un movimiento del libro. Nunca cambia. */
|
|
45
|
+
export interface CommissionLedgerMovement {
|
|
46
|
+
/** Determinista por origen: una reentrega no duplica el movimiento. */
|
|
47
|
+
movementKey: string;
|
|
48
|
+
kind: CommissionLedgerMovementKindEnum;
|
|
49
|
+
periodId: string;
|
|
50
|
+
retainedDeltaCents: number;
|
|
51
|
+
payableDeltaCents: number;
|
|
52
|
+
byRule: CommissionLedgerMovementRule[];
|
|
53
|
+
saleId: string | null;
|
|
54
|
+
adjustmentId: string | null;
|
|
55
|
+
/** `YYYY-MM` de la liberación mensual. */
|
|
56
|
+
releaseMonth: string | null;
|
|
57
|
+
/** Obligatorio en lo pagado por fuera. */
|
|
58
|
+
reason: string | null;
|
|
59
|
+
createdAt: string;
|
|
60
|
+
createdBy: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Un depósito a la wallet del vendedor. Solo cambia su estado. */
|
|
64
|
+
export interface CommissionPayment {
|
|
65
|
+
/** También es la llave de idempotencia del depósito. */
|
|
66
|
+
paymentId: string;
|
|
67
|
+
retailerId: string;
|
|
68
|
+
sellerId: string;
|
|
69
|
+
amountCents: number;
|
|
70
|
+
status: CommissionPaymentStatusEnum;
|
|
71
|
+
/** La wallet a la que se depositó. */
|
|
72
|
+
directoryId: string;
|
|
73
|
+
/** Folio del depósito; `null` mientras no se confirma. */
|
|
74
|
+
transactionId: string | null;
|
|
75
|
+
errorCode: string | null;
|
|
76
|
+
/** Lo que ve el vendedor en su wallet; máximo 120 caracteres. */
|
|
77
|
+
concept: string;
|
|
78
|
+
requestedAt: string;
|
|
79
|
+
resolvedAt: string | null;
|
|
80
|
+
resolvedBy: string | null;
|
|
81
|
+
/** Nota de quien lo revisó a mano. */
|
|
82
|
+
note: string | null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Estado de cuenta para cobrarle a la cadena: los depósitos confirmados del periodo. Lo pagado por
|
|
87
|
+
* fuera no entra. Se genera una vez y no cambia.
|
|
88
|
+
*/
|
|
89
|
+
export interface CommissionChainStatement {
|
|
90
|
+
statementId: string;
|
|
91
|
+
retailerId: string;
|
|
92
|
+
period: CommissionBillingPeriodEnum;
|
|
93
|
+
/** `YYYY-MM-DD`, inclusive. */
|
|
94
|
+
startDate: string;
|
|
95
|
+
/** `YYYY-MM-DD`, inclusive. */
|
|
96
|
+
endDate: string;
|
|
97
|
+
accreditedCents: number;
|
|
98
|
+
paymentsCount: number;
|
|
99
|
+
sellersCount: number;
|
|
100
|
+
generatedAt: string;
|
|
101
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { ProductCategoryEnum } from '../../retailCatalog/enums/ProductCategoryEnum';
|
|
2
2
|
import type { ProductTierEnum } from '../../retailCatalog/enums/ProductTierEnum';
|
|
3
|
+
import type { CommissionBillingPeriodEnum } from '../enums/CommissionBillingPeriodEnum';
|
|
3
4
|
import type { CommissionBonusModeEnum } from '../enums/CommissionBonusModeEnum';
|
|
4
5
|
import type { CommissionCountByEnum } from '../enums/CommissionCountByEnum';
|
|
5
6
|
import type { CommissionMetricEnum } from '../enums/CommissionMetricEnum';
|
|
6
7
|
import type { CommissionOperatorEnum } from '../enums/CommissionOperatorEnum';
|
|
8
|
+
import type { CommissionPayTimingEnum } from '../enums/CommissionPayTimingEnum';
|
|
7
9
|
import type { CommissionRuleStatusEnum } from '../enums/CommissionRuleStatusEnum';
|
|
8
10
|
import type { CommissionWindowEnum } from '../enums/CommissionWindowEnum';
|
|
9
11
|
|
|
@@ -84,6 +86,8 @@ export interface CommissionRule {
|
|
|
84
86
|
replacesOthers: boolean;
|
|
85
87
|
/** Si la regla cuenta piezas o ventas. Ausente = `PIECE`. */
|
|
86
88
|
countBy?: CommissionCountByEnum;
|
|
89
|
+
/** Cuándo se paga lo que gana. Ausente = `ON_CUT`. */
|
|
90
|
+
payTiming?: CommissionPayTimingEnum;
|
|
87
91
|
/** Sube en cada guardado. */
|
|
88
92
|
version: number;
|
|
89
93
|
/** La versión que está en el plan vigente. `null` si nunca se publicó. */
|
|
@@ -114,10 +118,20 @@ export interface CommissionPolicyCommissions {
|
|
|
114
118
|
editedAt: string;
|
|
115
119
|
}
|
|
116
120
|
|
|
117
|
-
/**
|
|
121
|
+
/** Política de pagos a la wallet de los vendedores. */
|
|
122
|
+
export interface CommissionPayoutPolicy {
|
|
123
|
+
/** Depositar las comisiones a la wallet. Apagado, todo se calcula y queda pendiente. */
|
|
124
|
+
walletDeposits: boolean;
|
|
125
|
+
/** Cada cuánto se le cobra a la cadena. */
|
|
126
|
+
chainBillingPeriod: CommissionBillingPeriodEnum;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Políticas de la cadena. `clawback` y `commissions` son `null` mientras la cadena no las guarda. */
|
|
118
130
|
export interface CommissionPolicies {
|
|
119
131
|
clawback: CommissionPolicyClawback | null;
|
|
120
132
|
commissions: CommissionPolicyCommissions | null;
|
|
133
|
+
/** Ausente = depósitos encendidos y cobro semanal. */
|
|
134
|
+
payouts?: CommissionPayoutPolicy;
|
|
121
135
|
}
|
|
122
136
|
|
|
123
137
|
/**
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cada cuánto se le cobra a la cadena lo que Fiado depositó a sus vendedores.
|
|
3
|
+
*
|
|
4
|
+
* WEEKLY - Semanal. Es el valor cuando la cadena no guardó la política.
|
|
5
|
+
* MONTHLY - Mensual.
|
|
6
|
+
*/
|
|
7
|
+
export enum CommissionBillingPeriodEnum {
|
|
8
|
+
WEEKLY = 'WEEKLY',
|
|
9
|
+
MONTHLY = 'MONTHLY',
|
|
10
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipo de movimiento del libro de pagos. Un movimiento nunca cambia.
|
|
3
|
+
*
|
|
4
|
+
* EARN - Ganado: suma al exigible o al retenido.
|
|
5
|
+
* DEDUCT - Descontado del exigible.
|
|
6
|
+
* RELEASE - Liberación mensual: pasa de retenido a exigible.
|
|
7
|
+
* PAID_OUTSIDE - Pagado por fuera de la wallet: sale del exigible sin depósito.
|
|
8
|
+
*/
|
|
9
|
+
export enum CommissionLedgerMovementKindEnum {
|
|
10
|
+
EARN = 'EARN',
|
|
11
|
+
DEDUCT = 'DEDUCT',
|
|
12
|
+
RELEASE = 'RELEASE',
|
|
13
|
+
PAID_OUTSIDE = 'PAID_OUTSIDE',
|
|
14
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuándo se paga lo que gana una regla.
|
|
3
|
+
*
|
|
4
|
+
* ON_SALE - Al momento: se vuelve exigible al registrar la venta. Solo para reglas que únicamente
|
|
5
|
+
* pagan bono por venta.
|
|
6
|
+
* ON_CUT - Al cierre de la semana. Es el valor cuando la regla no lo trae.
|
|
7
|
+
* MONTHLY - Al cierre del mes: se retiene hasta el día 1 del mes siguiente al lunes del corte.
|
|
8
|
+
*/
|
|
9
|
+
export enum CommissionPayTimingEnum {
|
|
10
|
+
ON_SALE = 'ON_SALE',
|
|
11
|
+
ON_CUT = 'ON_CUT',
|
|
12
|
+
MONTHLY = 'MONTHLY',
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué pidió pagarle a un vendedor.
|
|
3
|
+
*
|
|
4
|
+
* SALE - Una venta con reglas al momento.
|
|
5
|
+
* CUT - El cierre del corte.
|
|
6
|
+
* RELEASE - La liberación mensual.
|
|
7
|
+
* ADJUSTMENT - Un ajuste manual.
|
|
8
|
+
* WALLET_LINKED - Se vinculó su wallet.
|
|
9
|
+
* RETRY - "Reintentar ahora" desde "Por pagar".
|
|
10
|
+
*/
|
|
11
|
+
export enum CommissionPayTriggerEnum {
|
|
12
|
+
SALE = 'SALE',
|
|
13
|
+
CUT = 'CUT',
|
|
14
|
+
RELEASE = 'RELEASE',
|
|
15
|
+
ADJUSTMENT = 'ADJUSTMENT',
|
|
16
|
+
WALLET_LINKED = 'WALLET_LINKED',
|
|
17
|
+
RETRY = 'RETRY',
|
|
18
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Por qué el saldo de un vendedor aparece en "Por pagar".
|
|
3
|
+
*
|
|
4
|
+
* NO_WALLET - No tiene wallet vinculada.
|
|
5
|
+
* REJECTED - Su último depósito se rechazó (cuenta bloqueada, tope de nivel...); el código va aparte.
|
|
6
|
+
* PAUSED - La cadena apagó los depósitos a la wallet.
|
|
7
|
+
* DEBT - Su exigible es negativo: debe.
|
|
8
|
+
*/
|
|
9
|
+
export enum CommissionPaymentAttentionEnum {
|
|
10
|
+
NO_WALLET = 'NO_WALLET',
|
|
11
|
+
REJECTED = 'REJECTED',
|
|
12
|
+
PAUSED = 'PAUSED',
|
|
13
|
+
DEBT = 'DEBT',
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado de un depósito de comisiones a la wallet del vendedor.
|
|
3
|
+
*
|
|
4
|
+
* PENDING - El monto se apartó y el depósito está en curso.
|
|
5
|
+
* ACCREDITED - Depositado, con folio.
|
|
6
|
+
* FAILED - Rechazado sin mover dinero: el monto vuelve al exigible.
|
|
7
|
+
* UNVERIFIED - Resultado ambiguo: el monto sigue apartado y no se reintenta solo; alguien lo revisa.
|
|
8
|
+
*/
|
|
9
|
+
export enum CommissionPaymentStatusEnum {
|
|
10
|
+
PENDING = 'PENDING',
|
|
11
|
+
ACCREDITED = 'ACCREDITED',
|
|
12
|
+
FAILED = 'FAILED',
|
|
13
|
+
UNVERIFIED = 'UNVERIFIED',
|
|
14
|
+
}
|
|
@@ -21,6 +21,12 @@ export * from './enums/CommissionCountByEnum';
|
|
|
21
21
|
export * from './enums/CommissionAggregateByEnum';
|
|
22
22
|
export * from './enums/CommissionSeriesByEnum';
|
|
23
23
|
export * from './enums/CommissionSimulationSkipEnum';
|
|
24
|
+
export * from './enums/CommissionPayTimingEnum';
|
|
25
|
+
export * from './enums/CommissionBillingPeriodEnum';
|
|
26
|
+
export * from './enums/CommissionPaymentStatusEnum';
|
|
27
|
+
export * from './enums/CommissionPaymentAttentionEnum';
|
|
28
|
+
export * from './enums/CommissionLedgerMovementKindEnum';
|
|
29
|
+
export * from './enums/CommissionPayTriggerEnum';
|
|
24
30
|
|
|
25
31
|
// Entidades del dominio
|
|
26
32
|
export * from './dtos/CommissionPlan';
|
|
@@ -29,6 +35,7 @@ export * from './dtos/CommissionCouponAccrual';
|
|
|
29
35
|
export * from './dtos/CommissionCalcTrace';
|
|
30
36
|
export * from './dtos/CommissionAccrual';
|
|
31
37
|
export * from './dtos/CommissionPayout';
|
|
38
|
+
export * from './dtos/CommissionLedger';
|
|
32
39
|
|
|
33
40
|
// Contratos HTTP — uno por endpoint
|
|
34
41
|
export * from './dtos/CommissionApi';
|
|
@@ -4,6 +4,7 @@ import { regexIso8601 } from '../../helpers/constans/regex';
|
|
|
4
4
|
import { CollectorSeniorityEnum } from '../enums/CollectorSeniorityEnum';
|
|
5
5
|
import { EmploymentTypeEnum } from '../enums/EmploymentTypeEnum';
|
|
6
6
|
import { RetailUserStatusEnum } from '../enums/RetailUserStatusEnum';
|
|
7
|
+
import { RetailUserWalletLinkMethodEnum } from '../enums/RetailUserWalletLinkMethodEnum';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* RetailUser — usuario retail (empleado de tienda) de un retailer (SureKeep Fase 1 — pista Retail).
|
|
@@ -74,6 +75,44 @@ export class RetailUser {
|
|
|
74
75
|
@IsEnum(RetailUserStatusEnum)
|
|
75
76
|
status!: RetailUserStatusEnum;
|
|
76
77
|
|
|
78
|
+
/** Directorio de Fiado del dueño de la wallet PCF; `null` o ausente si no tiene wallet. */
|
|
79
|
+
@Expose()
|
|
80
|
+
@IsOptional()
|
|
81
|
+
@IsString()
|
|
82
|
+
fiadoDirectoryId?: string | null;
|
|
83
|
+
|
|
84
|
+
/** Cuenta PCF de la wallet. */
|
|
85
|
+
@Expose()
|
|
86
|
+
@IsOptional()
|
|
87
|
+
@IsString()
|
|
88
|
+
pcfAccountId?: string | null;
|
|
89
|
+
|
|
90
|
+
/** Cómo se encontró la wallet: por CLABE o por teléfono. */
|
|
91
|
+
@Expose()
|
|
92
|
+
@IsOptional()
|
|
93
|
+
@IsEnum(RetailUserWalletLinkMethodEnum)
|
|
94
|
+
walletLinkMethod?: RetailUserWalletLinkMethodEnum | null;
|
|
95
|
+
|
|
96
|
+
/** Últimos 4 dígitos de la CLABE; la CLABE completa no se guarda. */
|
|
97
|
+
@Expose()
|
|
98
|
+
@IsOptional()
|
|
99
|
+
@IsString()
|
|
100
|
+
@Matches(/^\d{4}$/, { message: 'walletClabeLast4 debe tener 4 dígitos' })
|
|
101
|
+
walletClabeLast4?: string | null;
|
|
102
|
+
|
|
103
|
+
/** Cuándo se vinculó (ISO). */
|
|
104
|
+
@Expose()
|
|
105
|
+
@IsOptional()
|
|
106
|
+
@IsString()
|
|
107
|
+
@Matches(regexIso8601, { message: 'walletLinkedAt debe ser una fecha ISO 8601' })
|
|
108
|
+
walletLinkedAt?: string | null;
|
|
109
|
+
|
|
110
|
+
/** Quién la vinculó: el actorId del usuario del back office. */
|
|
111
|
+
@Expose()
|
|
112
|
+
@IsOptional()
|
|
113
|
+
@IsString()
|
|
114
|
+
walletLinkedBy?: string | null;
|
|
115
|
+
|
|
77
116
|
@Expose()
|
|
78
117
|
@IsString()
|
|
79
118
|
@Matches(regexIso8601, { message: 'createdAt debe ser una fecha ISO 8601' })
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsOptional, IsString, Matches, Validate, ValidateIf } from 'class-validator';
|
|
3
|
+
import { IsSingleWalletKeyConstraint } from '../../validators/IsSingleWalletKeyConstraint';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Body de `PUT /retailers/{retailerId}/users/{retailUserId}/wallet`: vincula la wallet PCF del
|
|
7
|
+
* vendedor por CLABE o por teléfono, exactamente uno. El servidor vuelve a resolver la cuenta.
|
|
8
|
+
*/
|
|
9
|
+
export class LinkRetailUserWalletRequest {
|
|
10
|
+
/** CLABE PCF, 18 dígitos. Solo se guardan los últimos 4; no va a logs completa. */
|
|
11
|
+
@Expose()
|
|
12
|
+
@ValidateIf((o: LinkRetailUserWalletRequest) => o.clabe != null || o.phone == null)
|
|
13
|
+
@Validate(IsSingleWalletKeyConstraint)
|
|
14
|
+
@IsString({ message: 'clabe debe ser texto' })
|
|
15
|
+
@Matches(/^\d{18}$/, { message: 'clabe debe tener 18 dígitos' })
|
|
16
|
+
clabe?: string | null;
|
|
17
|
+
|
|
18
|
+
/** Teléfono de México: 10 dígitos, con o sin `+52`; retail-org lo normaliza a E.164. No va a logs completo. */
|
|
19
|
+
@Expose()
|
|
20
|
+
@IsOptional()
|
|
21
|
+
@IsString({ message: 'phone debe ser texto' })
|
|
22
|
+
@Matches(/^(\+52)?\d{10}$/, { message: 'phone debe tener 10 dígitos, con o sin +52' })
|
|
23
|
+
phone?: string | null;
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsOptional, IsString, Matches, Validate, ValidateIf } from 'class-validator';
|
|
3
|
+
import { IsSingleWalletKeyConstraint } from '../../validators/IsSingleWalletKeyConstraint';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Body de `POST /retailers/{retailerId}/users/wallet-lookup`: busca una wallet PCF por CLABE o por
|
|
7
|
+
* teléfono, exactamente uno. No escribe nada.
|
|
8
|
+
*/
|
|
9
|
+
export class LookupRetailUserWalletRequest {
|
|
10
|
+
/** CLABE PCF, 18 dígitos. No va a logs completa. */
|
|
11
|
+
@Expose()
|
|
12
|
+
@ValidateIf((o: LookupRetailUserWalletRequest) => o.clabe != null || o.phone == null)
|
|
13
|
+
@Validate(IsSingleWalletKeyConstraint)
|
|
14
|
+
@IsString({ message: 'clabe debe ser texto' })
|
|
15
|
+
@Matches(/^\d{18}$/, { message: 'clabe debe tener 18 dígitos' })
|
|
16
|
+
clabe?: string | null;
|
|
17
|
+
|
|
18
|
+
/** Teléfono de México: 10 dígitos, con o sin `+52`; retail-org lo normaliza a E.164. No va a logs completo. */
|
|
19
|
+
@Expose()
|
|
20
|
+
@IsOptional()
|
|
21
|
+
@IsString({ message: 'phone debe ser texto' })
|
|
22
|
+
@Matches(/^(\+52)?\d{10}$/, { message: 'phone debe tener 10 dígitos, con o sin +52' })
|
|
23
|
+
phone?: string | null;
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RetailUserWalletLinkMethodEnum } from '../../enums/RetailUserWalletLinkMethodEnum';
|
|
2
|
+
|
|
3
|
+
/** Respuesta de `POST /retailers/{retailerId}/users/wallet-lookup`. */
|
|
4
|
+
export interface LookupRetailUserWalletResponse {
|
|
5
|
+
found: boolean;
|
|
6
|
+
active: boolean;
|
|
7
|
+
/** Nombre del titular para que el administrador confirme; `null` si no se encontró. */
|
|
8
|
+
holderName: string | null;
|
|
9
|
+
/** Por dónde se buscó. */
|
|
10
|
+
method: RetailUserWalletLinkMethodEnum;
|
|
11
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Respuesta de `GET /private/retailers/{retailerId}/users/{retailUserId}/wallet`: la wallet del
|
|
3
|
+
* vendedor para el motor de comisiones. Ambos `null` si no tiene wallet vinculada.
|
|
4
|
+
*/
|
|
5
|
+
export interface PrivateRetailUserWalletResponse {
|
|
6
|
+
directoryId: string | null;
|
|
7
|
+
pcfAccountId: string | null;
|
|
8
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cómo se encontró la wallet PCF del vendedor.
|
|
3
|
+
* @enum {string}
|
|
4
|
+
*
|
|
5
|
+
* @property {string} CLABE - Por la CLABE PCF capturada en el alta.
|
|
6
|
+
* @property {string} PHONE - Por el teléfono de su usuario de Fiado.
|
|
7
|
+
*/
|
|
8
|
+
export enum RetailUserWalletLinkMethodEnum {
|
|
9
|
+
CLABE = 'CLABE',
|
|
10
|
+
PHONE = 'PHONE',
|
|
11
|
+
}
|
package/src/retailOrg/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * from './enums/StoreStatusEnum';
|
|
|
5
5
|
export * from './enums/RetailUserStatusEnum';
|
|
6
6
|
export * from './enums/EmploymentTypeEnum';
|
|
7
7
|
export * from './enums/CollectorSeniorityEnum';
|
|
8
|
+
export * from './enums/RetailUserWalletLinkMethodEnum';
|
|
8
9
|
// F3 — Portal Admin VentasLuga (metas de venta del periodo)
|
|
9
10
|
export * from './enums/GoalTargetTypeEnum';
|
|
10
11
|
|
|
@@ -26,6 +27,9 @@ export * from './dtos/validation/PrivateSellerListResponse';
|
|
|
26
27
|
// Paginación genérica
|
|
27
28
|
export * from './dtos/PaginatedResult';
|
|
28
29
|
|
|
30
|
+
// Validadores
|
|
31
|
+
export * from './validators/IsSingleWalletKeyConstraint';
|
|
32
|
+
|
|
29
33
|
// Request DTOs (input validado por endpoint)
|
|
30
34
|
export * from './dtos/requests/RetailAddressInput';
|
|
31
35
|
export * from './dtos/requests/CreateRetailerRequest';
|
|
@@ -43,6 +47,8 @@ export * from './dtos/requests/ProvisionRetailUserRequest';
|
|
|
43
47
|
export * from './dtos/requests/UpdateRetailUserRequest';
|
|
44
48
|
export * from './dtos/requests/ChangeRetailUserStatusRequest';
|
|
45
49
|
export * from './dtos/requests/TransferRetailUserRequest';
|
|
50
|
+
export * from './dtos/requests/LookupRetailUserWalletRequest';
|
|
51
|
+
export * from './dtos/requests/LinkRetailUserWalletRequest';
|
|
46
52
|
// F3 — metas y KPIs del Portal Admin VL
|
|
47
53
|
export * from './dtos/requests/GoalListQuery';
|
|
48
54
|
export * from './dtos/requests/GoalUpsertRequest';
|
|
@@ -58,3 +64,5 @@ export * from './dtos/responses/GoalUpsertResponse';
|
|
|
58
64
|
export * from './dtos/responses/PrivateGoalListResponse';
|
|
59
65
|
export * from './dtos/responses/StoreKpiResponse';
|
|
60
66
|
export * from './dtos/responses/SellerKpiResponse';
|
|
67
|
+
export * from './dtos/responses/LookupRetailUserWalletResponse';
|
|
68
|
+
export * from './dtos/responses/PrivateRetailUserWalletResponse';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ValidatorConstraint,
|
|
3
|
+
type ValidationArguments,
|
|
4
|
+
type ValidatorConstraintInterface,
|
|
5
|
+
} from 'class-validator';
|
|
6
|
+
|
|
7
|
+
/** Exige exactamente uno de `clabe` o `phone`. */
|
|
8
|
+
@ValidatorConstraint({ name: 'isSingleWalletKey', async: false })
|
|
9
|
+
export class IsSingleWalletKeyConstraint implements ValidatorConstraintInterface {
|
|
10
|
+
validate(_value: unknown, args: ValidationArguments): boolean {
|
|
11
|
+
const o = args.object as { clabe?: unknown; phone?: unknown };
|
|
12
|
+
return (o.clabe != null) !== (o.phone != null);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
defaultMessage(): string {
|
|
16
|
+
return 'debe venir clabe o phone, solo uno';
|
|
17
|
+
}
|
|
18
|
+
}
|