@fiado/type-kit 3.491.0 → 3.492.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 (67) hide show
  1. package/_test_/unit/loanCredit/installmentPaidEvent.test.ts +17 -0
  2. package/_test_/unit/retailCommission/commissionPayout.test.ts +104 -0
  3. package/_test_/unit/retailCommission/commissionRent.test.ts +33 -0
  4. package/_test_/unit/retailCommission/commissionRules.test.ts +249 -0
  5. package/_test_/unit/retailCommission/commissionSimulation.test.ts +43 -0
  6. package/_test_/unit/retailCommission/myCommissions.test.ts +29 -0
  7. package/_test_/unit/retailWizard/ventaSagaMessages.test.ts +108 -11
  8. package/bin/loanCredit/dtos/InstallmentPaidEvent.d.ts +18 -0
  9. package/bin/loanCredit/dtos/InstallmentPaidEvent.js +5 -0
  10. package/bin/loanCredit/index.d.ts +1 -0
  11. package/bin/loanCredit/index.js +1 -0
  12. package/bin/retailCommission/dtos/CommissionAccrual.d.ts +36 -0
  13. package/bin/retailCommission/dtos/CommissionApi.d.ts +241 -2
  14. package/bin/retailCommission/dtos/CommissionCalcTrace.d.ts +10 -0
  15. package/bin/retailCommission/dtos/CommissionCouponAccrual.d.ts +31 -0
  16. package/bin/retailCommission/dtos/CommissionCouponAccrual.js +2 -0
  17. package/bin/retailCommission/dtos/CommissionPayout.d.ts +84 -0
  18. package/bin/retailCommission/dtos/CommissionRule.d.ts +119 -0
  19. package/bin/retailCommission/dtos/CommissionRule.js +2 -0
  20. package/bin/retailCommission/enums/CommissionAggregateByEnum.d.ts +14 -0
  21. package/bin/retailCommission/enums/CommissionAggregateByEnum.js +18 -0
  22. package/bin/retailCommission/enums/CommissionBonusModeEnum.d.ts +10 -0
  23. package/bin/retailCommission/enums/CommissionBonusModeEnum.js +14 -0
  24. package/bin/retailCommission/enums/CommissionCalcStepEnum.d.ts +3 -1
  25. package/bin/retailCommission/enums/CommissionCalcStepEnum.js +2 -0
  26. package/bin/retailCommission/enums/CommissionMetricEnum.d.ts +14 -0
  27. package/bin/retailCommission/enums/CommissionMetricEnum.js +18 -0
  28. package/bin/retailCommission/enums/CommissionOperatorEnum.d.ts +15 -0
  29. package/bin/retailCommission/enums/CommissionOperatorEnum.js +19 -0
  30. package/bin/retailCommission/enums/CommissionRuleStatusEnum.d.ts +16 -0
  31. package/bin/retailCommission/enums/CommissionRuleStatusEnum.js +20 -0
  32. package/bin/retailCommission/enums/CommissionSeriesByEnum.d.ts +14 -0
  33. package/bin/retailCommission/enums/CommissionSeriesByEnum.js +18 -0
  34. package/bin/retailCommission/enums/CommissionSimulationSkipEnum.d.ts +14 -0
  35. package/bin/retailCommission/enums/CommissionSimulationSkipEnum.js +18 -0
  36. package/bin/retailCommission/enums/CommissionWindowEnum.d.ts +12 -0
  37. package/bin/retailCommission/enums/CommissionWindowEnum.js +16 -0
  38. package/bin/retailCommission/index.d.ts +10 -0
  39. package/bin/retailCommission/index.js +10 -0
  40. package/bin/retailWizard/enums/RetailCommissionInboundMessageTypeEnum.d.ts +5 -0
  41. package/bin/retailWizard/enums/RetailCommissionInboundMessageTypeEnum.js +9 -0
  42. package/bin/retailWizard/events/RetailCommissionInboundMessage.d.ts +27 -1
  43. package/bin/retailWizard/events/RetailCommissionInboundMessage.js +70 -1
  44. package/bin/retailWizard/index.d.ts +1 -0
  45. package/bin/retailWizard/index.js +1 -0
  46. package/package.json +1 -1
  47. package/src/loanCredit/dtos/InstallmentPaidEvent.ts +20 -0
  48. package/src/loanCredit/index.ts +1 -0
  49. package/src/retailCommission/dtos/CommissionAccrual.ts +38 -0
  50. package/src/retailCommission/dtos/CommissionApi.ts +276 -2
  51. package/src/retailCommission/dtos/CommissionCalcTrace.ts +7 -0
  52. package/src/retailCommission/dtos/CommissionCouponAccrual.ts +33 -0
  53. package/src/retailCommission/dtos/CommissionPayout.ts +91 -0
  54. package/src/retailCommission/dtos/CommissionRule.ts +132 -0
  55. package/src/retailCommission/enums/CommissionAggregateByEnum.ts +14 -0
  56. package/src/retailCommission/enums/CommissionBonusModeEnum.ts +10 -0
  57. package/src/retailCommission/enums/CommissionCalcStepEnum.ts +2 -0
  58. package/src/retailCommission/enums/CommissionMetricEnum.ts +14 -0
  59. package/src/retailCommission/enums/CommissionOperatorEnum.ts +15 -0
  60. package/src/retailCommission/enums/CommissionRuleStatusEnum.ts +16 -0
  61. package/src/retailCommission/enums/CommissionSeriesByEnum.ts +14 -0
  62. package/src/retailCommission/enums/CommissionSimulationSkipEnum.ts +14 -0
  63. package/src/retailCommission/enums/CommissionWindowEnum.ts +12 -0
  64. package/src/retailCommission/index.ts +10 -0
  65. package/src/retailWizard/enums/RetailCommissionInboundMessageTypeEnum.ts +5 -0
  66. package/src/retailWizard/events/RetailCommissionInboundMessage.ts +75 -2
  67. package/src/retailWizard/index.ts +1 -0
@@ -27,6 +27,7 @@ __exportStar(require("./dtos/LoanBorrower"), exports);
27
27
  __exportStar(require("./dtos/LoanBeneficiary"), exports);
28
28
  __exportStar(require("./dtos/LoanCredit"), exports);
29
29
  __exportStar(require("./dtos/LoanInstallment"), exports);
30
+ __exportStar(require("./dtos/InstallmentPaidEvent"), exports);
30
31
  __exportStar(require("./dtos/LoanContract"), exports);
31
32
  __exportStar(require("./dtos/ActivationChecklist"), exports);
32
33
  __exportStar(require("./dtos/AppliedPromotionSnapshot"), exports);
@@ -2,6 +2,11 @@ import type { CommissionAccrualStatusEnum } from '../enums/CommissionAccrualStat
2
2
  import type { CommissionPayeeTypeEnum } from '../enums/CommissionPayeeTypeEnum';
3
3
  import type { SaleFinancierEnum } from '../../retailWizard/enums/SaleFinancierEnum';
4
4
  import type { CommissionCalcTrace } from './CommissionCalcTrace';
5
+ import type { CommissionBonusModeEnum } from '../enums/CommissionBonusModeEnum';
6
+ import type { ProductCategoryEnum } from '../../retailCatalog/enums/ProductCategoryEnum';
7
+ import type { ProductTierEnum } from '../../retailCatalog/enums/ProductTierEnum';
8
+ import type { LinePaymentTypeEnum } from '../../retailWizard/enums/LinePaymentTypeEnum';
9
+ import type { WizardLineRoleEnum } from '../../retailWizard/enums/WizardLineRoleEnum';
5
10
  /**
6
11
  * El devengo: lo que se le debe a un vendedor por UNA venta.
7
12
  * SureKeep Fase 3 — pista Retail.
@@ -50,6 +55,10 @@ export interface CommissionAccrual {
50
55
  payoutId: string | null;
51
56
  reversalReason: string | null;
52
57
  calcTrace: CommissionCalcTrace;
58
+ /** Los bonos por venta que sumaron, uno por regla y por pieza. Solo en devengos calculados con reglas. */
59
+ appliedBonuses?: CommissionAppliedBonus[];
60
+ /** Suma de `appliedBonuses`. Solo en devengos calculados con reglas. */
61
+ subtotalBonusCents?: number;
53
62
  }
54
63
  /**
55
64
  * Lo mínimo de una venta para devengarla. Es lo que llega por la cola y lo que se reconstruye
@@ -75,4 +84,31 @@ export interface CommissionSaleInput {
75
84
  /** `CASH` | `CREDIT`, para `PERCENT_BY_PAYMENT`. */
76
85
  paymentType: string;
77
86
  soldAt: string;
87
+ /** Las líneas de la venta. Las ventas que se calculan con reglas siempre las traen. */
88
+ lines?: CommissionSaleLine[];
89
+ }
90
+ /** Una línea de la venta, congelada en el devengo. */
91
+ export interface CommissionSaleLine {
92
+ lineId: string;
93
+ sku: string;
94
+ qty: number;
95
+ /** Precio neto de la línea completa (todas sus piezas). */
96
+ netCents: number;
97
+ category: ProductCategoryEnum | null;
98
+ tier: ProductTierEnum | null;
99
+ brand: string | null;
100
+ paymentType: LinePaymentTypeEnum;
101
+ /** `GIFT` = regalo: no comisiona ni cuenta en la posición. */
102
+ role?: WizardLineRoleEnum;
103
+ }
104
+ /** Un bono por venta que sumó en el devengo. */
105
+ export interface CommissionAppliedBonus {
106
+ ruleId: string;
107
+ name: string;
108
+ lineId: string;
109
+ sku: string;
110
+ /** Posición de la pieza en el contador de la regla dentro del periodo. */
111
+ position: number;
112
+ mode: CommissionBonusModeEnum;
113
+ amountCents: number;
78
114
  }
@@ -1,8 +1,16 @@
1
1
  import type { CommissionPlanStatusEnum } from '../enums/CommissionPlanStatusEnum';
2
2
  import type { CommissionPayoutStatusEnum } from '../enums/CommissionPayoutStatusEnum';
3
3
  import type { CommissionAddOn, CommissionCategory, CommissionPlanSnapshot, CommissionQuota } from './CommissionPlan';
4
- import type { CommissionAccrual, CommissionSaleInput } from './CommissionAccrual';
5
- import type { CommissionAdjustment, CommissionPayout, CommissionPayoutSeller } from './CommissionPayout';
4
+ import type { CommissionAccrual, CommissionAppliedBonus, CommissionSaleInput, CommissionSaleLine } from './CommissionAccrual';
5
+ import type { CommissionAdjustment, CommissionAppliedMultiplier, CommissionAppliedThreshold, CommissionPayout, CommissionPayoutSeller, CommissionSellerBreakdown } from './CommissionPayout';
6
+ import type { CommissionPolicies, CommissionRule, CommissionRuleCondition, CommissionRuleLevers, CommissionRuleScope, CommissionRuleSetSnapshot } from './CommissionRule';
7
+ import type { CommissionWindowEnum } from '../enums/CommissionWindowEnum';
8
+ import type { CommissionAggregateByEnum } from '../enums/CommissionAggregateByEnum';
9
+ import type { CommissionSeriesByEnum } from '../enums/CommissionSeriesByEnum';
10
+ import type { CommissionAccrualStatusEnum } from '../enums/CommissionAccrualStatusEnum';
11
+ import type { CommissionSimulationSkipEnum } from '../enums/CommissionSimulationSkipEnum';
12
+ import type { ProductCategoryEnum } from '../../retailCatalog/enums/ProductCategoryEnum';
13
+ import type { ProductTierEnum } from '../../retailCatalog/enums/ProductTierEnum';
6
14
  /**
7
15
  * Los contratos HTTP del motor de comisiones — uno por endpoint, sin reutilizar.
8
16
  * SureKeep Fase 3 — pista Retail.
@@ -167,3 +175,234 @@ export interface ClosePayoutResponse {
167
175
  }
168
176
  /** Lo que el simulador reconstruye desde el data lake para volver a correr el motor. */
169
177
  export type CommissionSimulationSale = CommissionSaleInput;
178
+ /** `GET /backoffice/commissions/plan` — el plan vigente con reglas. `null` mientras no se publica nada. */
179
+ export interface GetRuleSetResponse {
180
+ active: CommissionRuleSetSnapshot | null;
181
+ }
182
+ /** `GET /backoffice/commissions/rules` — la última versión de cada regla. */
183
+ export interface ListRulesResponse {
184
+ rules: CommissionRule[];
185
+ }
186
+ /** Lo que el editor manda al crear o guardar una regla. */
187
+ export interface CommissionRuleInput {
188
+ name: string;
189
+ description: string | null;
190
+ levers: CommissionRuleLevers;
191
+ scope: CommissionRuleScope;
192
+ condition: CommissionRuleCondition | null;
193
+ effectiveFrom: string;
194
+ effectiveTo: string | null;
195
+ priority: number;
196
+ replacesOthers: boolean;
197
+ }
198
+ /** `POST /backoffice/commissions/rules` — la regla nace en borrador. */
199
+ export type CreateRuleRequest = CommissionRuleInput;
200
+ /** `PUT /backoffice/commissions/rules/{ruleId}` — `expectedVersion` es la versión que el editor cargó. */
201
+ export interface UpdateRuleRequest extends CommissionRuleInput {
202
+ expectedVersion: number;
203
+ }
204
+ export interface RuleResponse {
205
+ rule: CommissionRule;
206
+ }
207
+ /** `POST /backoffice/commissions/rules/{ruleId}/publish | pause | resume | expire` */
208
+ export interface RuleActionRequest {
209
+ expectedVersion: number;
210
+ }
211
+ /** Las acciones que cambian el plan vigente devuelven la regla y el snapshot nuevo. */
212
+ export interface RuleActionResponse {
213
+ rule: CommissionRule;
214
+ snapshotId: string;
215
+ }
216
+ /** Un evento del historial de una regla. */
217
+ export interface CommissionRuleEvent {
218
+ at: string;
219
+ action: string;
220
+ performedBy: string;
221
+ version: number | null;
222
+ }
223
+ /** `GET /backoffice/commissions/rules/{ruleId}/history` — del más nuevo al más viejo. */
224
+ export interface RuleHistoryResponse {
225
+ events: CommissionRuleEvent[];
226
+ }
227
+ /** `GET /backoffice/commissions/policies` */
228
+ export interface GetPoliciesResponse {
229
+ policies: CommissionPolicies;
230
+ }
231
+ /** `PUT /backoffice/commissions/policies` — las dos políticas se guardan juntas. */
232
+ export interface UpdatePoliciesRequest {
233
+ clawback: {
234
+ cancelacionDias: number;
235
+ devolucionDias: number;
236
+ npiM30Dias: number;
237
+ };
238
+ commissions: {
239
+ multiplicadorMaxBps: number;
240
+ ventanaDefault: CommissionWindowEnum;
241
+ };
242
+ }
243
+ export interface UpdatePoliciesResponse {
244
+ policies: CommissionPolicies;
245
+ snapshotId: string;
246
+ }
247
+ /** `GET /backoffice/commissions/live?periodId=` — el corte calculado al momento, sin escribir nada. */
248
+ export interface GetLivePayoutResponse {
249
+ periodId: string;
250
+ periodStart: string;
251
+ periodEnd: string;
252
+ status: CommissionPayoutStatusEnum;
253
+ sellers: CommissionSellerBreakdown[];
254
+ }
255
+ /** Una venta del vendedor en el corte, con sus bonos recalculados en orden. Sin datos del cliente. */
256
+ export interface CommissionLiveSale {
257
+ saleId: string;
258
+ soldAt: string;
259
+ storeId: string;
260
+ status: CommissionAccrualStatusEnum;
261
+ /** El snapshot con el que se devengó: es el que se usa para recalcularla. */
262
+ planSnapshotId: string;
263
+ lines: CommissionSaleLine[];
264
+ appliedBonuses: CommissionAppliedBonus[];
265
+ subtotalBonusCents: number;
266
+ }
267
+ /** `GET /backoffice/commissions/live/sellers/{sellerId}?periodId=` */
268
+ export interface GetLiveSellerResponse {
269
+ periodId: string;
270
+ seller: CommissionSellerBreakdown;
271
+ sales: CommissionLiveSale[];
272
+ }
273
+ /** Un renglón del agregado. `name` es el de la regla; tienda, SKU y vendedor los resuelve el front. */
274
+ export interface CommissionAggregateRow {
275
+ key: string;
276
+ name: string | null;
277
+ sellersCount: number;
278
+ salesCount: number;
279
+ unitsCount: number;
280
+ placementCents: number;
281
+ paidCents: number;
282
+ }
283
+ /** `GET /backoffice/commissions/payouts/aggregates?by=&from=&to=` — sobre los cortes cerrados del rango. */
284
+ export interface GetPayoutAggregatesResponse {
285
+ by: CommissionAggregateByEnum;
286
+ from: string;
287
+ to: string;
288
+ /** Los cortes cerrados que entraron. */
289
+ periodIds: string[];
290
+ rows: CommissionAggregateRow[];
291
+ totalPaidCents: number;
292
+ }
293
+ /** Un punto de la serie: un corte cerrado. */
294
+ export interface CommissionSeriesPoint {
295
+ periodId: string;
296
+ salesCount: number;
297
+ unitsCount: number;
298
+ placementCents: number;
299
+ paidCents: number;
300
+ }
301
+ /** `GET /backoffice/commissions/payouts/series?by=&id=&weeks=` — del corte más viejo al más nuevo. */
302
+ export interface GetPayoutSeriesResponse {
303
+ by: CommissionSeriesByEnum;
304
+ id: string;
305
+ points: CommissionSeriesPoint[];
306
+ }
307
+ /** El vendedor modelo: cómo va su semana. */
308
+ export interface CommissionSimulationProfile {
309
+ unitsInWeek: number;
310
+ placementCents: number;
311
+ distinctSkus: number;
312
+ }
313
+ /** El producto que vende en la simulación. */
314
+ export interface CommissionSimulationProduct {
315
+ sku: string;
316
+ category: ProductCategoryEnum | null;
317
+ tier: ProductTierEnum | null;
318
+ netCents: number;
319
+ }
320
+ /** `POST /backoffice/commissions/rules/simulate` */
321
+ export interface SimulateRulesRequest {
322
+ /** Reglas por id, en su última versión, como si estuvieran publicadas. Vacío = el plan vigente. */
323
+ ruleIds: string[];
324
+ profile: CommissionSimulationProfile;
325
+ product: CommissionSimulationProduct;
326
+ /** Con tienda se evalúa el alcance por tienda; sin ella, se ignora. */
327
+ storeId: string | null;
328
+ /** `YYYY-MM-DD`. `null` = hoy. */
329
+ date: string | null;
330
+ }
331
+ /** Lo que una regla de bono por venta pagaría en una posición, o por qué no. */
332
+ export interface CommissionSimulatedRule {
333
+ ruleId: string;
334
+ name: string;
335
+ amountCents: number;
336
+ skipped: CommissionSimulationSkipEnum | null;
337
+ }
338
+ export interface SimulateRulesResponse {
339
+ date: string;
340
+ /** La venta siguiente, en la posición `unitsInWeek + 1`. */
341
+ nextSale: {
342
+ position: number;
343
+ subtotalBonusCents: number;
344
+ rules: CommissionSimulatedRule[];
345
+ };
346
+ /** Las piezas de la semana, en las posiciones 1 a `unitsInWeek`. */
347
+ progression: Array<{
348
+ position: number;
349
+ subtotalBonusCents: number;
350
+ cumulativeBonusCents: number;
351
+ }>;
352
+ /** El corte de esa semana. */
353
+ week: {
354
+ subtotalBonusCents: number;
355
+ multiplierBps: number;
356
+ multiplierBeforeCapBps: number;
357
+ multipliers: CommissionAppliedMultiplier[];
358
+ thresholdBonusCents: number;
359
+ thresholds: CommissionAppliedThreshold[];
360
+ releasedCents: number;
361
+ };
362
+ }
363
+ /** Una regla como la ve el vendedor: sin estado interno ni datos de auditoría. */
364
+ export interface CommissionRuleView {
365
+ ruleId: string;
366
+ name: string;
367
+ description: string | null;
368
+ levers: CommissionRuleLevers;
369
+ scope: CommissionRuleScope;
370
+ condition: CommissionRuleCondition | null;
371
+ effectiveFrom: string;
372
+ effectiveTo: string | null;
373
+ }
374
+ /** Lo pagado en varios cortes. */
375
+ export interface MyCommissionsTotals {
376
+ periodsCount: number;
377
+ salesCount: number;
378
+ unitsCount: number;
379
+ netCents: number;
380
+ }
381
+ /**
382
+ * `GET /commissions/me?weeks=` — las comisiones del vendedor que llama. El vendedor sale del token;
383
+ * no se puede pedir el de otro.
384
+ */
385
+ export interface GetMyCommissionsResponse {
386
+ seller: {
387
+ sellerId: string;
388
+ name: string | null;
389
+ storeId: string | null;
390
+ };
391
+ period: {
392
+ periodId: string;
393
+ periodStart: string;
394
+ periodEnd: string;
395
+ };
396
+ /** El corte en curso; `null` si todavía no tiene ventas, renta ni ajustes. */
397
+ week: CommissionSellerBreakdown | null;
398
+ /** Cortes cuya semana empieza en el mes de hoy: cerrados, el anterior aún sin cerrar y el en curso. */
399
+ month: MyCommissionsTotals;
400
+ /** Cortes cuya semana empieza en el año de hoy: cerrados, el anterior aún sin cerrar y el en curso. */
401
+ year: MyCommissionsTotals;
402
+ /** Los cortes cerrados de las últimas `weeks` semanas, del más viejo al más nuevo. `paidCents` es el neto. */
403
+ history: CommissionSeriesPoint[];
404
+ /** Las reglas vigentes hoy que pueden pagarle: las de corte, las sin tienda y las de su tienda o de donde vendió. */
405
+ rules: CommissionRuleView[];
406
+ /** Tope del multiplicador de la política; `null` sin política. */
407
+ multiplierCapBps: number | null;
408
+ }
@@ -69,5 +69,15 @@ export type CommissionCalcTraceEntry = {
69
69
  sku: string;
70
70
  brand: string | null;
71
71
  };
72
+ } | {
73
+ /** Una regla con bono por venta sumó por una pieza. */
74
+ step: CommissionCalcStepEnum.BONUS_PER_SALE;
75
+ label: string;
76
+ outputCents: number;
77
+ detail: {
78
+ ruleId: string;
79
+ lineId: string;
80
+ position: number;
81
+ };
72
82
  };
73
83
  export type CommissionCalcTrace = CommissionCalcTraceEntry[];
@@ -0,0 +1,31 @@
1
+ import type { CommissionAccrualStatusEnum } from '../enums/CommissionAccrualStatusEnum';
2
+ import type { CommissionBonusModeEnum } from '../enums/CommissionBonusModeEnum';
3
+ /** Lo que paga una regla de renta de cartera por una cuota cobrada. */
4
+ export interface CommissionCouponAppliedBonus {
5
+ ruleId: string;
6
+ name: string;
7
+ mode: CommissionBonusModeEnum;
8
+ amountCents: number;
9
+ }
10
+ /**
11
+ * La renta de cartera de una cuota pagada, en el corte de su pago.
12
+ * Clave `SELLER#<sellerId>` · `COUPON#<periodId>#<creditId>#<cuota>`: determinista, idempotente.
13
+ */
14
+ export interface CommissionCouponAccrual {
15
+ sellerId: string;
16
+ retailerId: string;
17
+ periodId: string;
18
+ creditId: string;
19
+ /** La venta que originó el crédito. */
20
+ saleId: string;
21
+ installmentNumber: number;
22
+ /** Lo pagado de la cuota (capital + interés + IVA). */
23
+ couponAmountCents: number;
24
+ paidAt: string;
25
+ /** El snapshot con que se evaluó: de ahí salen las condiciones al cerrar el corte. */
26
+ planSnapshotId: string;
27
+ bonuses: CommissionCouponAppliedBonus[];
28
+ subtotalCents: number;
29
+ status: CommissionAccrualStatusEnum;
30
+ createdAt: string;
31
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -48,6 +48,8 @@ export interface CommissionPayoutSeller {
48
48
  /** Al cerrar: si alcanzó su cuota. */
49
49
  quotaMet: boolean | null;
50
50
  quotaFactorBps: number | null;
51
+ /** El corte del vendedor calculado con reglas. Lo escribe el cierre. */
52
+ breakdown?: CommissionSellerBreakdown;
51
53
  }
52
54
  /**
53
55
  * Un ajuste manual sobre el corte.
@@ -71,3 +73,85 @@ export interface CommissionAdjustment {
71
73
  author: string;
72
74
  createdAt: string;
73
75
  }
76
+ /** Lo que una regla de bono por venta aportó al corte del vendedor. */
77
+ export interface CommissionRuleContribution {
78
+ ruleId: string;
79
+ name: string;
80
+ /** Piezas que pagaron esta regla. */
81
+ unitsCount: number;
82
+ bonusCents: number;
83
+ /** Su parte del multiplicador, en proporción a su bono. */
84
+ multiplierShareCents: number;
85
+ }
86
+ /** Un multiplicador que disparó en el corte. */
87
+ export interface CommissionAppliedMultiplier {
88
+ ruleId: string;
89
+ name: string;
90
+ factorBps: number;
91
+ }
92
+ /** Un bono por umbral que disparó en el corte. */
93
+ export interface CommissionAppliedThreshold {
94
+ ruleId: string;
95
+ name: string;
96
+ amountCents: number;
97
+ }
98
+ /** Lo vendido y lo pagado del vendedor en una tienda. Lo pagado no incluye umbrales. */
99
+ export interface CommissionStoreContribution {
100
+ storeId: string;
101
+ salesCount: number;
102
+ unitsCount: number;
103
+ placementCents: number;
104
+ paidCents: number;
105
+ }
106
+ /** Lo vendido y lo pagado del vendedor por un SKU. Lo pagado no incluye umbrales. */
107
+ export interface CommissionSkuContribution {
108
+ sku: string;
109
+ unitsCount: number;
110
+ placementCents: number;
111
+ paidCents: number;
112
+ }
113
+ /** La renta de cartera que pagó una regla en el corte. */
114
+ export interface CommissionAppliedRent {
115
+ ruleId: string;
116
+ name: string;
117
+ /** Cuotas cobradas que pagaron esta regla. */
118
+ couponsCount: number;
119
+ amountCents: number;
120
+ }
121
+ /**
122
+ * El corte de un vendedor calculado con las reglas.
123
+ *
124
+ * liberado = round(subtotal × multiplicador) + umbral + renta · neto = liberado + ajustes.
125
+ */
126
+ export interface CommissionSellerBreakdown {
127
+ sellerId: string;
128
+ /** Ventas del periodo sin las revertidas. */
129
+ salesCount: number;
130
+ /** Piezas de esas ventas: lo que cuentan las reglas. */
131
+ unitsCount: number;
132
+ /** Suma del precio neto de las piezas. */
133
+ placementCents: number;
134
+ subtotalBonusCents: number;
135
+ /** Multiplicador aplicado, ya con el tope. 10000 = ×1. */
136
+ multiplierBps: number;
137
+ multiplierBeforeCapBps: number;
138
+ multipliers: CommissionAppliedMultiplier[];
139
+ thresholdBonusCents: number;
140
+ thresholds: CommissionAppliedThreshold[];
141
+ portfolioRentCents: number;
142
+ releasedCents: number;
143
+ /** Ajustes del vendedor en el periodo: manuales, ventas tardías y reversas. */
144
+ adjustmentsCents: number;
145
+ /** Reversas de ventas de cortes ya cerrados, en positivo. Ya están dentro de `adjustmentsCents`. */
146
+ clawbackCents: number;
147
+ netCents: number;
148
+ byRule: CommissionRuleContribution[];
149
+ byStore: CommissionStoreContribution[];
150
+ bySku: CommissionSkuContribution[];
151
+ /** La renta por regla; suma `portfolioRentCents`. Ausente en cortes de antes de la renta. */
152
+ rentByRule?: CommissionAppliedRent[];
153
+ /** NPI M30 del vendedor con que se evaluaron las condiciones, en bps. `null` sin créditos que contar. */
154
+ npiM30Bps?: number | null;
155
+ /** Créditos que contaron para el NPI. */
156
+ npiSample?: number;
157
+ }
@@ -0,0 +1,119 @@
1
+ import type { ProductCategoryEnum } from '../../retailCatalog/enums/ProductCategoryEnum';
2
+ import type { ProductTierEnum } from '../../retailCatalog/enums/ProductTierEnum';
3
+ import type { CommissionBonusModeEnum } from '../enums/CommissionBonusModeEnum';
4
+ import type { CommissionMetricEnum } from '../enums/CommissionMetricEnum';
5
+ import type { CommissionOperatorEnum } from '../enums/CommissionOperatorEnum';
6
+ import type { CommissionRuleStatusEnum } from '../enums/CommissionRuleStatusEnum';
7
+ import type { CommissionWindowEnum } from '../enums/CommissionWindowEnum';
8
+ /**
9
+ * Reglas de comisión de VentasLuga: cada regla es independiente y se apila con las demás.
10
+ *
11
+ * Montos en centavos (`*Cents`); porcentajes y factores en puntos base (`*Bps`, 10000 = 100% = ×1).
12
+ */
13
+ /** Bono por pieza vendida: monto fijo (`FIXED`, centavos) o porcentaje de su precio neto (`PERCENT`, bps). */
14
+ export interface CommissionBonusPerSale {
15
+ mode: CommissionBonusModeEnum;
16
+ value: number;
17
+ }
18
+ /** Monto fijo, una vez por corte, cuando se cumple la condición. */
19
+ export interface CommissionThresholdBonus {
20
+ amountCents: number;
21
+ }
22
+ /** Multiplica el subtotal de bonos por venta del corte. */
23
+ export interface CommissionMultiplier {
24
+ factorBps: number;
25
+ }
26
+ /** Renta de cartera: un bono por cada cupón que el cliente paga. */
27
+ export interface CommissionCouponBonus {
28
+ mode: CommissionBonusModeEnum;
29
+ value: number;
30
+ }
31
+ /** Las palancas de una regla. Una regla publicable trae al menos una. */
32
+ export interface CommissionRuleLevers {
33
+ bonoPorVenta: CommissionBonusPerSale | null;
34
+ bonoUmbral: CommissionThresholdBonus | null;
35
+ multiplicador: CommissionMultiplier | null;
36
+ bonoPorCuponPagado: CommissionCouponBonus | null;
37
+ }
38
+ /** A qué piezas aplica la regla. Una lista vacía es "todas". */
39
+ export interface CommissionRuleScope {
40
+ tipos: ProductCategoryEnum[];
41
+ gamas: ProductTierEnum[];
42
+ skus: string[];
43
+ tiendas: string[];
44
+ }
45
+ /**
46
+ * Condición para que la regla dispare.
47
+ *
48
+ * `value` es un número, `[min, max]` con `BETWEEN` o la lista con `IN`. `minSample` solo aplica a
49
+ * `NPI_M30_VENDEDOR`: sin esa muestra la condición no dispara.
50
+ */
51
+ export interface CommissionRuleCondition {
52
+ metric: CommissionMetricEnum;
53
+ operator: CommissionOperatorEnum;
54
+ value: number | number[];
55
+ minSample: number | null;
56
+ }
57
+ /** Una regla de comisión, en su última versión. */
58
+ export interface CommissionRule {
59
+ ruleId: string;
60
+ retailerId: string;
61
+ name: string;
62
+ description: string | null;
63
+ status: CommissionRuleStatusEnum;
64
+ levers: CommissionRuleLevers;
65
+ scope: CommissionRuleScope;
66
+ condition: CommissionRuleCondition | null;
67
+ /** `YYYY-MM-DD`, inclusive. */
68
+ effectiveFrom: string;
69
+ /** `YYYY-MM-DD`, inclusive. `null` = permanente. */
70
+ effectiveTo: string | null;
71
+ /** Desempata multiplicadores exclusivos: gana la mayor. */
72
+ priority: number;
73
+ /** Solo con multiplicador: si dispara, es el único multiplicador del corte. */
74
+ replacesOthers: boolean;
75
+ /** Sube en cada guardado. */
76
+ version: number;
77
+ /** La versión que está en el plan vigente. `null` si nunca se publicó. */
78
+ publishedVersion: number | null;
79
+ publishedBy: string | null;
80
+ publishedAt: string | null;
81
+ createdBy: string;
82
+ updatedBy: string;
83
+ createdAt: string;
84
+ updatedAt: string;
85
+ }
86
+ /** Ventanas del clawback, en días. */
87
+ export interface CommissionPolicyClawback {
88
+ cancelacionDias: number;
89
+ devolucionDias: number;
90
+ npiM30Dias: number;
91
+ editedBy: string;
92
+ editedAt: string;
93
+ }
94
+ /** Política de comisiones de la cadena. */
95
+ export interface CommissionPolicyCommissions {
96
+ /** Tope del multiplicador acumulado del corte. 25000 = ×2.5. */
97
+ multiplicadorMaxBps: number;
98
+ ventanaDefault: CommissionWindowEnum;
99
+ editedBy: string;
100
+ editedAt: string;
101
+ }
102
+ /** Políticas de la cadena. Cada una es `null` mientras la cadena no la guarda. */
103
+ export interface CommissionPolicies {
104
+ clawback: CommissionPolicyClawback | null;
105
+ commissions: CommissionPolicyCommissions | null;
106
+ }
107
+ /**
108
+ * El plan vigente: las reglas publicadas y las políticas, congeladas en un snapshot inmutable.
109
+ * Cada devengo apunta al snapshot con que se calculó.
110
+ */
111
+ export interface CommissionRuleSetSnapshot {
112
+ retailerId: string;
113
+ snapshotId: string;
114
+ rules: CommissionRule[];
115
+ policies: CommissionPolicies;
116
+ changeNote: string;
117
+ publishedBy: string;
118
+ publishedAt: string;
119
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Por qué se agrega lo pagado en los cortes cerrados.
3
+ *
4
+ * RULE - Por regla: bonos por venta con su parte del multiplicador, y umbrales.
5
+ * STORE - Por tienda donde se vendió.
6
+ * SKU - Por producto.
7
+ * SELLER - Por vendedor: su neto.
8
+ */
9
+ export declare enum CommissionAggregateByEnum {
10
+ RULE = "RULE",
11
+ STORE = "STORE",
12
+ SKU = "SKU",
13
+ SELLER = "SELLER"
14
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommissionAggregateByEnum = void 0;
4
+ /**
5
+ * Por qué se agrega lo pagado en los cortes cerrados.
6
+ *
7
+ * RULE - Por regla: bonos por venta con su parte del multiplicador, y umbrales.
8
+ * STORE - Por tienda donde se vendió.
9
+ * SKU - Por producto.
10
+ * SELLER - Por vendedor: su neto.
11
+ */
12
+ var CommissionAggregateByEnum;
13
+ (function (CommissionAggregateByEnum) {
14
+ CommissionAggregateByEnum["RULE"] = "RULE";
15
+ CommissionAggregateByEnum["STORE"] = "STORE";
16
+ CommissionAggregateByEnum["SKU"] = "SKU";
17
+ CommissionAggregateByEnum["SELLER"] = "SELLER";
18
+ })(CommissionAggregateByEnum || (exports.CommissionAggregateByEnum = CommissionAggregateByEnum = {}));
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cómo se calcula un bono.
3
+ *
4
+ * FIXED - Monto fijo en centavos por pieza.
5
+ * PERCENT - Puntos base sobre el precio neto de la pieza (10000 = 100%).
6
+ */
7
+ export declare enum CommissionBonusModeEnum {
8
+ FIXED = "FIXED",
9
+ PERCENT = "PERCENT"
10
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommissionBonusModeEnum = void 0;
4
+ /**
5
+ * Cómo se calcula un bono.
6
+ *
7
+ * FIXED - Monto fijo en centavos por pieza.
8
+ * PERCENT - Puntos base sobre el precio neto de la pieza (10000 = 100%).
9
+ */
10
+ var CommissionBonusModeEnum;
11
+ (function (CommissionBonusModeEnum) {
12
+ CommissionBonusModeEnum["FIXED"] = "FIXED";
13
+ CommissionBonusModeEnum["PERCENT"] = "PERCENT";
14
+ })(CommissionBonusModeEnum || (exports.CommissionBonusModeEnum = CommissionBonusModeEnum = {}));
@@ -10,6 +10,7 @@
10
10
  * QUOTA - Se resolvió la cuota (binaria o escalonada). Ocurre al CERRAR, no al devengar.
11
11
  * ADJUSTMENT - Un ajuste manual del corte.
12
12
  * NO_CATEGORY - El SKU no matcheó ninguna categoría del plan: devenga 0 y queda visible.
13
+ * BONUS_PER_SALE - Una regla con bono por venta sumó por una pieza de la venta.
13
14
  *
14
15
  * SureKeep Fase 3 — pista Retail. Motor de comisiones de VentasLuga.
15
16
  */
@@ -19,5 +20,6 @@ export declare enum CommissionCalcStepEnum {
19
20
  ADDON = "ADDON",
20
21
  QUOTA = "QUOTA",
21
22
  ADJUSTMENT = "ADJUSTMENT",
22
- NO_CATEGORY = "NO_CATEGORY"
23
+ NO_CATEGORY = "NO_CATEGORY",
24
+ BONUS_PER_SALE = "BONUS_PER_SALE"
23
25
  }
@@ -13,6 +13,7 @@ exports.CommissionCalcStepEnum = void 0;
13
13
  * QUOTA - Se resolvió la cuota (binaria o escalonada). Ocurre al CERRAR, no al devengar.
14
14
  * ADJUSTMENT - Un ajuste manual del corte.
15
15
  * NO_CATEGORY - El SKU no matcheó ninguna categoría del plan: devenga 0 y queda visible.
16
+ * BONUS_PER_SALE - Una regla con bono por venta sumó por una pieza de la venta.
16
17
  *
17
18
  * SureKeep Fase 3 — pista Retail. Motor de comisiones de VentasLuga.
18
19
  */
@@ -24,4 +25,5 @@ var CommissionCalcStepEnum;
24
25
  CommissionCalcStepEnum["QUOTA"] = "QUOTA";
25
26
  CommissionCalcStepEnum["ADJUSTMENT"] = "ADJUSTMENT";
26
27
  CommissionCalcStepEnum["NO_CATEGORY"] = "NO_CATEGORY";
28
+ CommissionCalcStepEnum["BONUS_PER_SALE"] = "BONUS_PER_SALE";
27
29
  })(CommissionCalcStepEnum || (exports.CommissionCalcStepEnum = CommissionCalcStepEnum = {}));