@fiado/type-kit 3.279.0 → 3.281.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/index.d.ts +1 -0
- package/bin/index.js +6 -2
- package/bin/phoneSales/DeviceVariantPriceRequestDto.d.ts +9 -0
- package/bin/{walletFunding/dtos/CancelWalletFundingRequest.js → phoneSales/DeviceVariantPriceRequestDto.js} +14 -6
- package/bin/phoneSales/DeviceVariantPriceResponseDto.d.ts +6 -0
- package/bin/phoneSales/DeviceVariantPriceResponseDto.js +7 -0
- package/bin/phoneSales/SaleResponseDto.d.ts +8 -0
- package/bin/phoneSales/SetDeviceVariantPricesRequestDto.d.ts +8 -0
- package/bin/{walletFunding/dtos/CancelFundingReferenceRequest.js → phoneSales/SetDeviceVariantPricesRequestDto.js} +13 -17
- package/bin/phoneSales/enums/DeviceVariantStatusEnum.d.ts +4 -0
- package/bin/phoneSales/enums/DeviceVariantStatusEnum.js +8 -0
- package/bin/phoneSales/index.d.ts +4 -0
- package/bin/phoneSales/index.js +4 -0
- package/bin/retailCommission/dtos/CommissionAccrual.d.ts +78 -0
- package/bin/retailCommission/dtos/CommissionAccrual.js +2 -0
- package/bin/retailCommission/dtos/CommissionApi.d.ts +169 -0
- package/bin/retailCommission/dtos/CommissionApi.js +2 -0
- package/bin/retailCommission/dtos/CommissionCalcTrace.d.ts +73 -0
- package/bin/retailCommission/dtos/CommissionCalcTrace.js +2 -0
- package/bin/retailCommission/dtos/CommissionPayout.d.ts +73 -0
- package/bin/retailCommission/dtos/CommissionPayout.js +2 -0
- package/bin/retailCommission/dtos/CommissionPlan.d.ts +182 -0
- package/bin/retailCommission/dtos/CommissionPlan.js +2 -0
- package/bin/retailCommission/enums/CommissionAccrualStatusEnum.d.ts +14 -0
- package/bin/retailCommission/enums/CommissionAccrualStatusEnum.js +18 -0
- package/bin/retailCommission/enums/CommissionCalcStepEnum.d.ts +23 -0
- package/bin/retailCommission/enums/CommissionCalcStepEnum.js +27 -0
- package/bin/retailCommission/enums/CommissionExceptionTypeEnum.d.ts +14 -0
- package/bin/retailCommission/enums/CommissionExceptionTypeEnum.js +18 -0
- package/bin/retailCommission/enums/CommissionMechanicTypeEnum.d.ts +24 -0
- package/bin/retailCommission/enums/CommissionMechanicTypeEnum.js +28 -0
- package/bin/retailCommission/enums/CommissionPayeeTypeEnum.d.ts +13 -0
- package/bin/retailCommission/enums/CommissionPayeeTypeEnum.js +17 -0
- package/bin/retailCommission/enums/CommissionPayoutStatusEnum.d.ts +18 -0
- package/bin/retailCommission/enums/CommissionPayoutStatusEnum.js +22 -0
- package/bin/retailCommission/enums/CommissionPeriodTypeEnum.d.ts +17 -0
- package/bin/retailCommission/enums/CommissionPeriodTypeEnum.js +21 -0
- package/bin/retailCommission/enums/CommissionPlanStatusEnum.d.ts +14 -0
- package/bin/retailCommission/enums/CommissionPlanStatusEnum.js +18 -0
- package/bin/retailCommission/enums/CommissionPriceReferenceEnum.d.ts +18 -0
- package/bin/retailCommission/enums/CommissionPriceReferenceEnum.js +22 -0
- package/bin/retailCommission/enums/CommissionQuotaMeasureEnum.d.ts +12 -0
- package/bin/retailCommission/enums/CommissionQuotaMeasureEnum.js +16 -0
- package/bin/retailCommission/enums/CommissionQuotaModeEnum.d.ts +13 -0
- package/bin/retailCommission/enums/CommissionQuotaModeEnum.js +17 -0
- package/bin/retailCommission/enums/CommissionQuotaSubjectEnum.d.ts +12 -0
- package/bin/retailCommission/enums/CommissionQuotaSubjectEnum.js +16 -0
- package/bin/retailCommission/enums/CommissionQuotaTypeEnum.d.ts +12 -0
- package/bin/retailCommission/enums/CommissionQuotaTypeEnum.js +16 -0
- package/bin/retailCommission/index.d.ts +18 -0
- package/bin/retailCommission/index.js +37 -0
- package/package.json +1 -1
- package/src/index.ts +4 -0
- package/src/phoneSales/DeviceVariantPriceRequestDto.ts +14 -0
- package/src/phoneSales/DeviceVariantPriceResponseDto.ts +7 -0
- package/src/phoneSales/SaleResponseDto.ts +9 -0
- package/src/phoneSales/SetDeviceVariantPricesRequestDto.ts +13 -0
- package/src/phoneSales/enums/DeviceVariantStatusEnum.ts +4 -0
- package/src/phoneSales/index.ts +4 -0
- package/src/retailCommission/dtos/CommissionAccrual.ts +81 -0
- package/src/retailCommission/dtos/CommissionApi.ts +205 -0
- package/src/retailCommission/dtos/CommissionCalcTrace.ts +64 -0
- package/src/retailCommission/dtos/CommissionPayout.ts +76 -0
- package/src/retailCommission/dtos/CommissionPlan.ts +199 -0
- package/src/retailCommission/enums/CommissionAccrualStatusEnum.ts +14 -0
- package/src/retailCommission/enums/CommissionCalcStepEnum.ts +23 -0
- package/src/retailCommission/enums/CommissionExceptionTypeEnum.ts +14 -0
- package/src/retailCommission/enums/CommissionMechanicTypeEnum.ts +24 -0
- package/src/retailCommission/enums/CommissionPayeeTypeEnum.ts +13 -0
- package/src/retailCommission/enums/CommissionPayoutStatusEnum.ts +18 -0
- package/src/retailCommission/enums/CommissionPeriodTypeEnum.ts +17 -0
- package/src/retailCommission/enums/CommissionPlanStatusEnum.ts +14 -0
- package/src/retailCommission/enums/CommissionPriceReferenceEnum.ts +18 -0
- package/src/retailCommission/enums/CommissionQuotaMeasureEnum.ts +12 -0
- package/src/retailCommission/enums/CommissionQuotaModeEnum.ts +13 -0
- package/src/retailCommission/enums/CommissionQuotaSubjectEnum.ts +12 -0
- package/src/retailCommission/enums/CommissionQuotaTypeEnum.ts +12 -0
- package/src/retailCommission/index.ts +23 -0
- package/bin/benefitCenter/enums/BenefitFlowEnum.d.ts +0 -11
- package/bin/benefitCenter/enums/BenefitFlowEnum.js +0 -15
- package/bin/loanCredit/dtos/requests/UpdateActivationChecklistRequest.d.ts +0 -11
- package/bin/loanCredit/dtos/requests/UpdateActivationChecklistRequest.js +0 -46
- package/bin/loanCredit/enums/ClientLevelEnum.d.ts +0 -11
- package/bin/loanCredit/enums/ClientLevelEnum.js +0 -15
- package/bin/walletFunding/dtos/CancelFundingReferenceRequest.d.ts +0 -6
- package/bin/walletFunding/dtos/CancelFundingReferenceResponse.d.ts +0 -7
- package/bin/walletFunding/dtos/CancelFundingReferenceResponse.js +0 -6
- package/bin/walletFunding/dtos/CancelFundingRequest.d.ts +0 -11
- package/bin/walletFunding/dtos/CancelFundingRequest.js +0 -33
- package/bin/walletFunding/dtos/CancelFundingResponse.d.ts +0 -14
- package/bin/walletFunding/dtos/CancelFundingResponse.js +0 -12
- package/bin/walletFunding/dtos/CancelWalletFundingRequest.d.ts +0 -3
- package/bin/walletFunding/dtos/CancelWalletFundingResponse.d.ts +0 -7
- package/bin/walletFunding/dtos/CancelWalletFundingResponse.js +0 -6
package/bin/index.d.ts
CHANGED
|
@@ -91,6 +91,7 @@ export * as Modelias from './modelias';
|
|
|
91
91
|
export * as NetworkConnector from './networkConnector';
|
|
92
92
|
export * as EmailVerification from './emailVerification';
|
|
93
93
|
export * as RetailOrg from './retailOrg';
|
|
94
|
+
export * as RetailCommission from './retailCommission';
|
|
94
95
|
export * as RetailCatalog from './retailCatalog';
|
|
95
96
|
export * as RetailCards from './retailCards';
|
|
96
97
|
export * as RetailCustomer from './retailCustomer';
|
package/bin/index.js
CHANGED
|
@@ -37,8 +37,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.IssuanceBusiness = exports.Blacklist = exports.CentralPayments = exports.Helpdesk = exports.FiadoApiResponse = exports.Auth = exports.LegalDocumentsBusiness = exports.Role = exports.STPAccount = exports.RiskProfile = exports.FraudPreventionEngine = exports.BBVARst = exports.Stp = exports.BenefitCenter = exports.BankAccount = exports.P2pContact = exports.CreditContract = exports.Contract = exports.ProductCatalog = exports.ContactInfo = exports.TransactionAnalytics = exports.Transaction = exports.TransactionProcessor = exports.GenericMessage = exports.EventBridgeMessage = exports.SessionActivity = exports.NotificationMessages = exports.ServicePayment = exports.Header = exports.Identity = exports.UserTags = exports.Group = exports.File = exports.ExchangeRate = exports.Directory = exports.Currency = exports.Country = exports.Card = exports.Authentication = exports.AppContent = exports.App = exports.Offices = exports.Places = exports.Address = exports.Beneficiary = exports.Activity = exports.Biometrics = exports.MetamapConnector = exports.Account = exports.Crypto = void 0;
|
|
40
|
-
exports.
|
|
41
|
-
exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = void 0;
|
|
40
|
+
exports.LoanConfig = exports.DatalakeQuery = exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailCommission = exports.RetailOrg = exports.EmailVerification = exports.NetworkConnector = exports.Modelias = exports.TotpSecurity = exports.Passport = exports.WalletFunding = exports.Remittance = exports.PlatformRbac = exports.CognitoBackofficeConnector = exports.TwilioConnector = exports.MessagesConnector = exports.Mdm = exports.MilestoneBusiness = exports.CirculoCredito = exports.CreditStatements = exports.Sentry = exports.AiEngine = exports.Funnel = exports.TeamsConnector = exports.PlatformErrorEvents = exports.CustomerFile = exports.CreditBackoffice = exports.CreditDashboard = exports.CreditEngine = exports.Credit = exports.ComissionBusiness = exports.ReferralBusiness = exports.ZendeskMessaging = exports.NotificationWS = exports.Event = exports.PayrollBusiness = exports.Cnbv = exports.DirectorySetting = exports.InvoiceCollector = exports.Collector = exports.Pricelist = exports.Company = exports.Services = exports.AccountIssuanceBusiness = exports.AppSelectionData = exports.Device = exports.Observations = void 0;
|
|
41
|
+
exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = void 0;
|
|
42
42
|
exports.Crypto = __importStar(require("./crypto"));
|
|
43
43
|
exports.Account = __importStar(require("./account"));
|
|
44
44
|
exports.MetamapConnector = __importStar(require("./metamapConnector"));
|
|
@@ -146,6 +146,10 @@ exports.EmailVerification = __importStar(require("./emailVerification"));
|
|
|
146
146
|
// RetailOrg: DTOs/enums del lambda retail-org-business (SureKeep Fase 1 — pista Retail).
|
|
147
147
|
// Dominio de retailers → zonas → tiendas → usuarios retail.
|
|
148
148
|
exports.RetailOrg = __importStar(require("./retailOrg"));
|
|
149
|
+
// RetailCommission: DTOs/enums del lambda retail-commission-business (SureKeep Fase 3 — pista
|
|
150
|
+
// Retail). El motor de comisiones de VentasLuga: el plan versionado por snapshot, el devengo por
|
|
151
|
+
// venta y el corte semanal.
|
|
152
|
+
exports.RetailCommission = __importStar(require("./retailCommission"));
|
|
149
153
|
// RetailCatalog: DTOs/enums del lambda retail-catalog-business (comp 05 — catálogo de productos
|
|
150
154
|
// por SKU + inventario por IMEI; SureKeep Fase 1 — pista Retail).
|
|
151
155
|
exports.RetailCatalog = __importStar(require("./retailCatalog"));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CurrencyId } from '../currency';
|
|
2
|
+
/**
|
|
3
|
+
* Item de precio usado dentro de `SetDeviceVariantPricesRequestDto.prices`.
|
|
4
|
+
* No se expone como endpoint propio, solo como elemento anidado validado.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DeviceVariantPriceRequestDto {
|
|
7
|
+
currencyId: CurrencyId;
|
|
8
|
+
price: number;
|
|
9
|
+
}
|
|
@@ -9,13 +9,21 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.DeviceVariantPriceRequestDto = void 0;
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
|
-
|
|
14
|
+
const currency_1 = require("../currency");
|
|
15
|
+
/**
|
|
16
|
+
* Item de precio usado dentro de `SetDeviceVariantPricesRequestDto.prices`.
|
|
17
|
+
* No se expone como endpoint propio, solo como elemento anidado validado.
|
|
18
|
+
*/
|
|
19
|
+
class DeviceVariantPriceRequestDto {
|
|
15
20
|
}
|
|
16
|
-
exports.
|
|
21
|
+
exports.DeviceVariantPriceRequestDto = DeviceVariantPriceRequestDto;
|
|
17
22
|
__decorate([
|
|
18
|
-
(0, class_validator_1.
|
|
19
|
-
(0, class_validator_1.MaxLength)(64),
|
|
23
|
+
(0, class_validator_1.IsEnum)(currency_1.CurrencyId),
|
|
20
24
|
__metadata("design:type", String)
|
|
21
|
-
],
|
|
25
|
+
], DeviceVariantPriceRequestDto.prototype, "currencyId", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_validator_1.IsNumber)(),
|
|
28
|
+
__metadata("design:type", Number)
|
|
29
|
+
], DeviceVariantPriceRequestDto.prototype, "price", void 0);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeviceVariantPriceResponseDto = void 0;
|
|
4
|
+
/** Precio de una variante de dispositivo en una moneda especifica. */
|
|
5
|
+
class DeviceVariantPriceResponseDto {
|
|
6
|
+
}
|
|
7
|
+
exports.DeviceVariantPriceResponseDto = DeviceVariantPriceResponseDto;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CurrencyId } from '../currency';
|
|
1
2
|
export declare class SaleResponseDto {
|
|
2
3
|
id: string;
|
|
3
4
|
referenceCode: string;
|
|
@@ -16,4 +17,11 @@ export declare class SaleResponseDto {
|
|
|
16
17
|
variantModel: string | null;
|
|
17
18
|
/** Color de la variante — mismo criterio de resolución/degradación que `variantModel`. */
|
|
18
19
|
variantColor: string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Monto realmente cobrado, congelado al momento de la venta (multi-moneda).
|
|
22
|
+
* `null` en ventas anteriores a la feature de multi-moneda — no tenían este dato.
|
|
23
|
+
*/
|
|
24
|
+
chargedAmount: number | null;
|
|
25
|
+
/** Moneda en la que se cobró `chargedAmount` — mismo motivo de nullability. */
|
|
26
|
+
chargedCurrencyId: CurrencyId | null;
|
|
19
27
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DeviceVariantPriceRequestDto } from './DeviceVariantPriceRequestDto';
|
|
2
|
+
/**
|
|
3
|
+
* Upsert bulk de todos los precios (por moneda) de una variante de dispositivo.
|
|
4
|
+
* Reemplaza el set completo — no hay historial/versionado de precios previos.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SetDeviceVariantPricesRequestDto {
|
|
7
|
+
prices: DeviceVariantPriceRequestDto[];
|
|
8
|
+
}
|
|
@@ -9,23 +9,19 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.SetDeviceVariantPricesRequestDto = void 0;
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
|
-
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const DeviceVariantPriceRequestDto_1 = require("./DeviceVariantPriceRequestDto");
|
|
16
|
+
/**
|
|
17
|
+
* Upsert bulk de todos los precios (por moneda) de una variante de dispositivo.
|
|
18
|
+
* Reemplaza el set completo — no hay historial/versionado de precios previos.
|
|
19
|
+
*/
|
|
20
|
+
class SetDeviceVariantPricesRequestDto {
|
|
15
21
|
}
|
|
16
|
-
exports.
|
|
22
|
+
exports.SetDeviceVariantPricesRequestDto = SetDeviceVariantPricesRequestDto;
|
|
17
23
|
__decorate([
|
|
18
|
-
(0, class_validator_1.
|
|
19
|
-
(0,
|
|
20
|
-
__metadata("design:type",
|
|
21
|
-
],
|
|
22
|
-
__decorate([
|
|
23
|
-
(0, class_validator_1.IsString)(),
|
|
24
|
-
(0, class_validator_1.MaxLength)(64),
|
|
25
|
-
__metadata("design:type", String)
|
|
26
|
-
], CancelFundingReferenceRequest.prototype, "directoryId", void 0);
|
|
27
|
-
__decorate([
|
|
28
|
-
(0, class_validator_1.IsString)(),
|
|
29
|
-
(0, class_validator_1.MaxLength)(64),
|
|
30
|
-
__metadata("design:type", String)
|
|
31
|
-
], CancelFundingReferenceRequest.prototype, "idempotencyKey", void 0);
|
|
24
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
25
|
+
(0, class_transformer_1.Type)(() => DeviceVariantPriceRequestDto_1.DeviceVariantPriceRequestDto),
|
|
26
|
+
__metadata("design:type", Array)
|
|
27
|
+
], SetDeviceVariantPricesRequestDto.prototype, "prices", void 0);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeviceVariantStatusEnum = void 0;
|
|
4
|
+
var DeviceVariantStatusEnum;
|
|
5
|
+
(function (DeviceVariantStatusEnum) {
|
|
6
|
+
DeviceVariantStatusEnum["ACTIVE"] = "ACTIVE";
|
|
7
|
+
DeviceVariantStatusEnum["HIDDEN"] = "HIDDEN";
|
|
8
|
+
})(DeviceVariantStatusEnum || (exports.DeviceVariantStatusEnum = DeviceVariantStatusEnum = {}));
|
|
@@ -6,4 +6,8 @@ export * from './SaleResponseDto';
|
|
|
6
6
|
export * from './RedeemSaleCodeRequestDto';
|
|
7
7
|
export * from './DeviceVariantImageUploadUrlRequestDto';
|
|
8
8
|
export * from './DeviceVariantImageUploadUrlResponseDto';
|
|
9
|
+
export * from './DeviceVariantPriceResponseDto';
|
|
10
|
+
export * from './DeviceVariantPriceRequestDto';
|
|
11
|
+
export * from './SetDeviceVariantPricesRequestDto';
|
|
9
12
|
export * from './enums/DeviceImageContentTypeEnum';
|
|
13
|
+
export * from './enums/DeviceVariantStatusEnum';
|
package/bin/phoneSales/index.js
CHANGED
|
@@ -22,4 +22,8 @@ __exportStar(require("./SaleResponseDto"), exports);
|
|
|
22
22
|
__exportStar(require("./RedeemSaleCodeRequestDto"), exports);
|
|
23
23
|
__exportStar(require("./DeviceVariantImageUploadUrlRequestDto"), exports);
|
|
24
24
|
__exportStar(require("./DeviceVariantImageUploadUrlResponseDto"), exports);
|
|
25
|
+
__exportStar(require("./DeviceVariantPriceResponseDto"), exports);
|
|
26
|
+
__exportStar(require("./DeviceVariantPriceRequestDto"), exports);
|
|
27
|
+
__exportStar(require("./SetDeviceVariantPricesRequestDto"), exports);
|
|
25
28
|
__exportStar(require("./enums/DeviceImageContentTypeEnum"), exports);
|
|
29
|
+
__exportStar(require("./enums/DeviceVariantStatusEnum"), exports);
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { CommissionAccrualStatusEnum } from '../enums/CommissionAccrualStatusEnum';
|
|
2
|
+
import type { CommissionPayeeTypeEnum } from '../enums/CommissionPayeeTypeEnum';
|
|
3
|
+
import type { SaleFinancierEnum } from '../../retailWizard/enums/SaleFinancierEnum';
|
|
4
|
+
import type { CommissionCalcTrace } from './CommissionCalcTrace';
|
|
5
|
+
/**
|
|
6
|
+
* El devengo: lo que se le debe a un vendedor por UNA venta.
|
|
7
|
+
* SureKeep Fase 3 — pista Retail.
|
|
8
|
+
*
|
|
9
|
+
* **Se comisiona la venta, no la línea.** Una `RetailSale` es de un solo producto: no hay `lines[]`
|
|
10
|
+
* que repartir.
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ **Append-only solo hasta el cierre.** Al devengar se escriben el monto base y la traza; al
|
|
13
|
+
* cerrar el corte se escriben `quotaMet`, `quotaFactorBps`, `settledAmountCents`, `payoutId` y el
|
|
14
|
+
* `status`. Es un mutable con historia, no un log inmutable.
|
|
15
|
+
*/
|
|
16
|
+
export interface CommissionAccrual {
|
|
17
|
+
sellerId: string;
|
|
18
|
+
periodId: string;
|
|
19
|
+
saleId: string;
|
|
20
|
+
/** Denormalizados: son lo que hace posible aislar por retailer sin un GSI. */
|
|
21
|
+
retailerId: string;
|
|
22
|
+
storeId: string;
|
|
23
|
+
payeeType: CommissionPayeeTypeEnum;
|
|
24
|
+
status: CommissionAccrualStatusEnum;
|
|
25
|
+
/** Con qué versión del plan se calculó. Apunta a un `SNAPSHOT#<ulid>` consultable. */
|
|
26
|
+
planSnapshotId: string;
|
|
27
|
+
/**
|
|
28
|
+
* Versión del motor que lo calculó.
|
|
29
|
+
*
|
|
30
|
+
* El snapshot congela el PLAN, no el CÓDIGO. Sin este campo, un cambio en el evaluador vuelve
|
|
31
|
+
* imposible reproducir un monto viejo aunque el plan esté intacto.
|
|
32
|
+
*/
|
|
33
|
+
calcEngineVersion: string;
|
|
34
|
+
categoryId: string | null;
|
|
35
|
+
mechanicType: string | null;
|
|
36
|
+
/** Resultado de mecánica + excepciones + add-ons. **Sin cuota ni acelerador.** */
|
|
37
|
+
baseAmountCents: number;
|
|
38
|
+
/** Derivada de `type` + `externalProvider` con `financierOfSale` del type-kit. */
|
|
39
|
+
financier: SaleFinancierEnum;
|
|
40
|
+
/** Al CERRAR: si el vendedor alcanzó la cuota de su categoría. */
|
|
41
|
+
quotaMet: boolean | null;
|
|
42
|
+
/** Al CERRAR: factor del acelerador. 10000 = 1.0×. */
|
|
43
|
+
quotaFactorBps: number | null;
|
|
44
|
+
/**
|
|
45
|
+
* Al CERRAR: el total liquidado.
|
|
46
|
+
*
|
|
47
|
+
* Se llama así —y no `amountCents`— para que nadie lo lea como definitivo antes del cierre.
|
|
48
|
+
*/
|
|
49
|
+
settledAmountCents: number | null;
|
|
50
|
+
payoutId: string | null;
|
|
51
|
+
reversalReason: string | null;
|
|
52
|
+
calcTrace: CommissionCalcTrace;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Lo mínimo de una venta para devengarla. Es lo que llega por la cola y lo que se reconstruye
|
|
56
|
+
* desde el data lake al simular — por eso vive en el type-kit y no dentro del motor.
|
|
57
|
+
*/
|
|
58
|
+
export interface CommissionSaleInput {
|
|
59
|
+
saleId: string;
|
|
60
|
+
sellerId: string;
|
|
61
|
+
retailerId: string;
|
|
62
|
+
storeId: string;
|
|
63
|
+
sku: string;
|
|
64
|
+
brand: string | null;
|
|
65
|
+
/**
|
|
66
|
+
* 🔴 **La base de comisión es el PRECIO DEL EQUIPO, no lo cobrado en caja.**
|
|
67
|
+
*
|
|
68
|
+
* En una venta a crédito `amountCents` es SOLO el enganche: comisionar sobre él pagaría una
|
|
69
|
+
* fracción de lo que corresponde. Se usa `equipmentPriceCents` y se cae a `amountCents` solo
|
|
70
|
+
* cuando no está (ventas viejas sin el dato).
|
|
71
|
+
*/
|
|
72
|
+
equipmentPriceCents: number | null;
|
|
73
|
+
amountCents: number;
|
|
74
|
+
financier: SaleFinancierEnum;
|
|
75
|
+
/** `CASH` | `CREDIT`, para `PERCENT_BY_PAYMENT`. */
|
|
76
|
+
paymentType: string;
|
|
77
|
+
soldAt: string;
|
|
78
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { CommissionPlanStatusEnum } from '../enums/CommissionPlanStatusEnum';
|
|
2
|
+
import type { CommissionPayoutStatusEnum } from '../enums/CommissionPayoutStatusEnum';
|
|
3
|
+
import type { CommissionAddOn, CommissionCategory, CommissionPlanSnapshot, CommissionQuota } from './CommissionPlan';
|
|
4
|
+
import type { CommissionAccrual, CommissionSaleInput } from './CommissionAccrual';
|
|
5
|
+
import type { CommissionAdjustment, CommissionPayout, CommissionPayoutSeller } from './CommissionPayout';
|
|
6
|
+
/**
|
|
7
|
+
* Los contratos HTTP del motor de comisiones — uno por endpoint, sin reutilizar.
|
|
8
|
+
* SureKeep Fase 3 — pista Retail.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ **El `retailerId` NO aparece en ningún request.** Sale siempre del token: el silo aísla por
|
|
11
|
+
* *tenant*, no por *retailer*, y SureKeep tiene varios. Si un request lo mandara, se ignoraría — pero
|
|
12
|
+
* la mejor forma de que no se ignore mal es que no exista el campo.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* `GET /backoffice/commissions/plan`
|
|
16
|
+
*
|
|
17
|
+
* `active: null` es un estado legítimo, no un 404: una cadena recién dada de alta todavía no publicó
|
|
18
|
+
* su primer plan. Devolver 404 obligaría al front a tratar el arranque normal como excepción, y esa
|
|
19
|
+
* rama solo se ejercita el primer día de cada cadena — o sea, nunca se prueba.
|
|
20
|
+
*/
|
|
21
|
+
export interface GetCommissionPlanResponse {
|
|
22
|
+
active: CommissionPlanSnapshot | null;
|
|
23
|
+
draft: CommissionPlanSnapshot | null;
|
|
24
|
+
}
|
|
25
|
+
/** `GET /backoffice/commissions/plan/snapshots` — solo cabeceras, sin el contenido del plan. */
|
|
26
|
+
export interface CommissionPlanSnapshotSummary {
|
|
27
|
+
snapshotId: string;
|
|
28
|
+
status: CommissionPlanStatusEnum;
|
|
29
|
+
effectiveFrom: string;
|
|
30
|
+
publishedBy: string | null;
|
|
31
|
+
publishedAt: string | null;
|
|
32
|
+
changeNote: string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Calculado contra el puntero `ACTIVE`, **nunca desde `status`**.
|
|
35
|
+
*
|
|
36
|
+
* Son dos registros del mismo hecho: `status` son N ítems y el puntero es uno solo. Si alguna vez
|
|
37
|
+
* se desincronizan, el puntero es el que no puede mentir. `status` viaja igual para que la
|
|
38
|
+
* discrepancia se VEA en la respuesta en vez de quedar escondida.
|
|
39
|
+
*/
|
|
40
|
+
active: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface ListPlanSnapshotsResponse {
|
|
43
|
+
snapshots: CommissionPlanSnapshotSummary[];
|
|
44
|
+
nextCursor: string | null;
|
|
45
|
+
}
|
|
46
|
+
/** `GET /backoffice/commissions/plan/snapshots/{snapshotId}` — el plan completo de una versión vieja. */
|
|
47
|
+
export interface GetPlanSnapshotResponse {
|
|
48
|
+
snapshot: CommissionPlanSnapshot;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* `PUT /backoffice/commissions/plan/draft`
|
|
52
|
+
*
|
|
53
|
+
* Se manda el documento COMPLETO, no el pedazo editado: `sk = DRAFT` es un ítem único y un `put`
|
|
54
|
+
* entero es una escritura atómica, sin merge del lado del servidor. Los 7 modales de la pantalla
|
|
55
|
+
* pegan a este mismo endpoint.
|
|
56
|
+
*/
|
|
57
|
+
export interface UpdatePlanDraftRequest {
|
|
58
|
+
/**
|
|
59
|
+
* El `updatedAt` que el editor tenía al cargar. Control de concurrencia optimista.
|
|
60
|
+
*
|
|
61
|
+
* Sin él, dos admins editando a la vez terminan en last-write-wins silencioso: el segundo pisa
|
|
62
|
+
* al primero, y el primero se entera cuando ve que su excepción desapareció. `null` solo cuando
|
|
63
|
+
* todavía no existe borrador.
|
|
64
|
+
*/
|
|
65
|
+
expectedUpdatedAt: string | null;
|
|
66
|
+
categories: CommissionCategory[];
|
|
67
|
+
quotas: CommissionQuota[];
|
|
68
|
+
addOns: CommissionAddOn[];
|
|
69
|
+
storeOverrideBps: Record<string, number>;
|
|
70
|
+
effectiveFrom: string;
|
|
71
|
+
}
|
|
72
|
+
export interface UpdatePlanDraftResponse {
|
|
73
|
+
draft: CommissionPlanSnapshot;
|
|
74
|
+
updatedAt: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* `POST /backoffice/commissions/plan/publish`
|
|
78
|
+
*
|
|
79
|
+
* El `changeNote` se pide ACÁ y no al guardar: la nota describe qué cambió **en esta versión**, y eso
|
|
80
|
+
* solo se sabe al sellarla. Pedirla en cada guardado sería pedirle al admin que justifique cada click.
|
|
81
|
+
*/
|
|
82
|
+
export interface PublishPlanRequest {
|
|
83
|
+
changeNote: string;
|
|
84
|
+
/** El `snapshotId` que el editor cree vigente. `null` en la PRIMERA publicación de la cadena. */
|
|
85
|
+
expectedActiveSnapshotId: string | null;
|
|
86
|
+
}
|
|
87
|
+
export interface PublishPlanResponse {
|
|
88
|
+
snapshotId: string;
|
|
89
|
+
publishedAt: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* `POST /backoffice/commissions/plan/simulate`
|
|
93
|
+
*
|
|
94
|
+
* Contra un periodo real YA CERRADO. Un corte en curso daría un número que cambia con cada venta y
|
|
95
|
+
* que el Admin leería como predicción.
|
|
96
|
+
*/
|
|
97
|
+
export interface SimulatePlanRequest {
|
|
98
|
+
periodId: string;
|
|
99
|
+
}
|
|
100
|
+
export interface SimulatePlanSellerResult {
|
|
101
|
+
sellerId: string;
|
|
102
|
+
wouldPayCents: number;
|
|
103
|
+
currentPlanCents: number;
|
|
104
|
+
deltaCents: number;
|
|
105
|
+
}
|
|
106
|
+
export interface SimulatePlanResponse {
|
|
107
|
+
periodId: string;
|
|
108
|
+
totalCents: number;
|
|
109
|
+
/**
|
|
110
|
+
* 🔑 **El número que importa.** Un total de $184 000 no dice nada solo; «$12 400 más que el plan
|
|
111
|
+
* vigente» es una decisión.
|
|
112
|
+
*/
|
|
113
|
+
vsCurrentPlanCents: number;
|
|
114
|
+
salesEvaluated: number;
|
|
115
|
+
/**
|
|
116
|
+
* `true` si el periodo tenía más ventas que el tope del data lake (10 000 filas).
|
|
117
|
+
*
|
|
118
|
+
* Un total de dinero calculado sobre filas truncadas **sin decirlo** es peor que un error: se ve
|
|
119
|
+
* exacto y no lo es.
|
|
120
|
+
*/
|
|
121
|
+
truncated: boolean;
|
|
122
|
+
bySeller: SimulatePlanSellerResult[];
|
|
123
|
+
}
|
|
124
|
+
/** `GET /backoffice/commissions/payouts` */
|
|
125
|
+
export interface ListPayoutsResponse {
|
|
126
|
+
payouts: CommissionPayout[];
|
|
127
|
+
nextCursor: string | null;
|
|
128
|
+
}
|
|
129
|
+
/** `GET /backoffice/commissions/payouts/{periodId}` — una sola Query trae las tres cosas. */
|
|
130
|
+
export interface GetPayoutResponse {
|
|
131
|
+
payout: CommissionPayout;
|
|
132
|
+
sellers: CommissionPayoutSeller[];
|
|
133
|
+
adjustments: CommissionAdjustment[];
|
|
134
|
+
}
|
|
135
|
+
/** `GET /backoffice/commissions/payouts/{periodId}/sellers/{sellerId}` */
|
|
136
|
+
export interface GetPayoutSellerResponse {
|
|
137
|
+
seller: CommissionPayoutSeller;
|
|
138
|
+
accruals: CommissionAccrual[];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* `POST /backoffice/commissions/payouts/{periodId}/adjustments`
|
|
142
|
+
*
|
|
143
|
+
* La única escritura de dinero sin una venta detrás. Va con header `Idempotency-Key`.
|
|
144
|
+
*/
|
|
145
|
+
export interface CreateAdjustmentRequest {
|
|
146
|
+
sellerId: string;
|
|
147
|
+
/** Puede ser negativo. */
|
|
148
|
+
amountCents: number;
|
|
149
|
+
/** Obligatorio: un movimiento de dinero sin motivo no se puede auditar. */
|
|
150
|
+
reason: string;
|
|
151
|
+
saleId: string | null;
|
|
152
|
+
date: string;
|
|
153
|
+
}
|
|
154
|
+
export interface CreateAdjustmentResponse {
|
|
155
|
+
adjustment: CommissionAdjustment;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* `POST /backoffice/commissions/payouts/{periodId}/close`
|
|
159
|
+
*
|
|
160
|
+
* Responde **202**, no 200: con 200 vendedores y 3 000 devengos el trabajo son ~200 Queries más ~120
|
|
161
|
+
* BatchWrites, y API Gateway corta a los 29 segundos. No es una preferencia de diseño: no cabe.
|
|
162
|
+
*/
|
|
163
|
+
export interface ClosePayoutResponse {
|
|
164
|
+
periodId: string;
|
|
165
|
+
status: CommissionPayoutStatusEnum;
|
|
166
|
+
startedAt: string;
|
|
167
|
+
}
|
|
168
|
+
/** Lo que el simulador reconstruye desde el data lake para volver a correr el motor. */
|
|
169
|
+
export type CommissionSimulationSale = CommissionSaleInput;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { CommissionCalcStepEnum } from '../enums/CommissionCalcStepEnum';
|
|
2
|
+
import type { CommissionExceptionTypeEnum } from '../enums/CommissionExceptionTypeEnum';
|
|
3
|
+
/**
|
|
4
|
+
* La traza de cálculo: el paso a paso de por qué un vendedor cobró ese monto.
|
|
5
|
+
* SureKeep Fase 3 — pista Retail.
|
|
6
|
+
*
|
|
7
|
+
* 🔴 **Es una unión CERRADA por `step`, no un mapa abierto.** Cada variante declara exactamente qué
|
|
8
|
+
* campos lleva su `detail`, y ninguno es libre.
|
|
9
|
+
*
|
|
10
|
+
* La razón es de PII: la traza se persiste junto al devengo y viaja a la pantalla de desglose, así
|
|
11
|
+
* que es el vehículo más probable de fuga de datos del comprador. **Sin campos libres no hay dónde
|
|
12
|
+
* meterlos.** Tipar el `detail` como `Record<string, unknown>` sería llamarlo whitelist sin
|
|
13
|
+
* implementarla — un control afirmado y no aplicado es peor que uno ausente.
|
|
14
|
+
*
|
|
15
|
+
* Sin traza no se puede explicar un monto, y explicar un monto es exactamente lo que hace falta
|
|
16
|
+
* cuando alguien reclama su comisión.
|
|
17
|
+
*/
|
|
18
|
+
export type CommissionCalcTraceEntry = {
|
|
19
|
+
step: CommissionCalcStepEnum.MECHANIC;
|
|
20
|
+
label: string;
|
|
21
|
+
outputCents: number;
|
|
22
|
+
detail: {
|
|
23
|
+
categoryId: string;
|
|
24
|
+
mechanicType: string;
|
|
25
|
+
};
|
|
26
|
+
} | {
|
|
27
|
+
step: CommissionCalcStepEnum.EXCEPTION;
|
|
28
|
+
label: string;
|
|
29
|
+
outputCents: number;
|
|
30
|
+
detail: {
|
|
31
|
+
exceptionId: string;
|
|
32
|
+
matchedOn: CommissionExceptionTypeEnum;
|
|
33
|
+
};
|
|
34
|
+
} | {
|
|
35
|
+
step: CommissionCalcStepEnum.ADDON;
|
|
36
|
+
label: string;
|
|
37
|
+
outputCents: number;
|
|
38
|
+
detail: {
|
|
39
|
+
addOnId: string;
|
|
40
|
+
};
|
|
41
|
+
} | {
|
|
42
|
+
step: CommissionCalcStepEnum.QUOTA;
|
|
43
|
+
label: string;
|
|
44
|
+
inputCents: number;
|
|
45
|
+
outputCents: number;
|
|
46
|
+
detail: {
|
|
47
|
+
quotaId: string;
|
|
48
|
+
met: boolean;
|
|
49
|
+
factorBps: number;
|
|
50
|
+
};
|
|
51
|
+
} | {
|
|
52
|
+
step: CommissionCalcStepEnum.ADJUSTMENT;
|
|
53
|
+
label: string;
|
|
54
|
+
outputCents: number;
|
|
55
|
+
detail: {
|
|
56
|
+
adjustmentId: string;
|
|
57
|
+
};
|
|
58
|
+
} | {
|
|
59
|
+
/**
|
|
60
|
+
* El SKU no matcheó ninguna categoría del plan.
|
|
61
|
+
*
|
|
62
|
+
* Devenga 0 y queda VISIBLE en el corte, en vez de mandarse a la DLQ. Un mensaje en la DLQ
|
|
63
|
+
* no lo mira nadie hasta que hay un reclamo; una fila en 0 la ve quien revisa el corte.
|
|
64
|
+
*/
|
|
65
|
+
step: CommissionCalcStepEnum.NO_CATEGORY;
|
|
66
|
+
label: string;
|
|
67
|
+
outputCents: number;
|
|
68
|
+
detail: {
|
|
69
|
+
sku: string;
|
|
70
|
+
brand: string | null;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
export type CommissionCalcTrace = CommissionCalcTraceEntry[];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { CommissionPayoutStatusEnum } from '../enums/CommissionPayoutStatusEnum';
|
|
2
|
+
/**
|
|
3
|
+
* El corte semanal y todo lo que cuelga de él.
|
|
4
|
+
* SureKeep Fase 3 — pista Retail.
|
|
5
|
+
*
|
|
6
|
+
* Los tres tipos de ítem viven en la misma partición del retailer y se separan por el sort key
|
|
7
|
+
* (`…#META`, `…#ADJ#<id>`, `…#SELLER#<id>`), así que **una sola Query trae el corte completo**:
|
|
8
|
+
* totales, ajustes y roster.
|
|
9
|
+
*
|
|
10
|
+
* El sufijo `#META` no es decorativo: sin él, un `between` por rango de semanas arrastraría también
|
|
11
|
+
* los ajustes y el roster de cada corte y rompería la paginación.
|
|
12
|
+
*/
|
|
13
|
+
export interface CommissionPayout {
|
|
14
|
+
retailerId: string;
|
|
15
|
+
periodId: string;
|
|
16
|
+
periodStart: string;
|
|
17
|
+
periodEnd: string;
|
|
18
|
+
status: CommissionPayoutStatusEnum;
|
|
19
|
+
/** Suma de los devengos liquidados. Se sella al cerrar. */
|
|
20
|
+
grossCents: number | null;
|
|
21
|
+
/** Suma de los ajustes manuales, con signo. */
|
|
22
|
+
adjustmentsCents: number | null;
|
|
23
|
+
netCents: number | null;
|
|
24
|
+
sellerCount: number | null;
|
|
25
|
+
accrualCount: number | null;
|
|
26
|
+
closedBy: string | null;
|
|
27
|
+
closedAt: string | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* El roster: un ítem por vendedor con devengos en el corte, escrito AL DEVENGAR.
|
|
31
|
+
*
|
|
32
|
+
* 🔑 **Es lo que hace el cierre autocontenido.** El fan-out itera este roster, no la lista que
|
|
33
|
+
* devuelva `retail-org-business`. Un vendedor dado de baja, transferido o creado a mitad de semana
|
|
34
|
+
* sigue acá — si el fan-out saliera del padrón, sus devengos nunca pasarían a `PAID`, nunca entrarían
|
|
35
|
+
* al total, y nadie se enteraría.
|
|
36
|
+
*
|
|
37
|
+
* Los dos contadores se acumulan con `ADD` al devengar. Son lo que permite pintar el desglose de un
|
|
38
|
+
* corte ABIERTO sin barrer todos los devengos en cada carga de pantalla.
|
|
39
|
+
*/
|
|
40
|
+
export interface CommissionPayoutSeller {
|
|
41
|
+
retailerId: string;
|
|
42
|
+
periodId: string;
|
|
43
|
+
sellerId: string;
|
|
44
|
+
accruedCount: number;
|
|
45
|
+
baseAmountCents: number;
|
|
46
|
+
/** Al cerrar: lo que efectivamente se le liquidó. */
|
|
47
|
+
settledAmountCents: number | null;
|
|
48
|
+
/** Al cerrar: si alcanzó su cuota. */
|
|
49
|
+
quotaMet: boolean | null;
|
|
50
|
+
quotaFactorBps: number | null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Un ajuste manual sobre el corte.
|
|
54
|
+
*
|
|
55
|
+
* Es la **única escritura de dinero sin una venta que la respalde**, y por eso es la única operación
|
|
56
|
+
* del motor con guard de idempotencia. El devengo no lo necesita: su clave es determinista.
|
|
57
|
+
*/
|
|
58
|
+
export interface CommissionAdjustment {
|
|
59
|
+
retailerId: string;
|
|
60
|
+
periodId: string;
|
|
61
|
+
adjustmentId: string;
|
|
62
|
+
sellerId: string;
|
|
63
|
+
date: string;
|
|
64
|
+
/** El ticket al que se refiere, si aplica. */
|
|
65
|
+
saleId: string | null;
|
|
66
|
+
/** **Puede ser negativo.** Una reversa de un corte ya cerrado entra como ajuste negativo. */
|
|
67
|
+
amountCents: number;
|
|
68
|
+
/** Obligatorio. Un movimiento de dinero sin motivo no se puede auditar. */
|
|
69
|
+
reason: string;
|
|
70
|
+
/** Email de quien lo hizo, o `system` en los automáticos por cancelación. */
|
|
71
|
+
author: string;
|
|
72
|
+
createdAt: string;
|
|
73
|
+
}
|