@acontplus/core 1.0.6 → 1.0.9
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/README.md +8 -0
- package/package.json +13 -15
- package/src/index.d.ts +8 -0
- package/src/index.js +9 -0
- package/src/index.js.map +1 -0
- package/src/lib/adapters/axios.adapter.d.ts +9 -0
- package/src/lib/adapters/axios.adapter.js +20 -0
- package/src/lib/adapters/axios.adapter.js.map +1 -0
- package/src/lib/adapters/fetch.adapter.d.ts +8 -0
- package/src/lib/adapters/fetch.adapter.js +31 -0
- package/src/lib/adapters/fetch.adapter.js.map +1 -0
- package/src/lib/adapters/http-client-factory.d.ts +31 -0
- package/src/lib/adapters/http-client-factory.js +40 -0
- package/src/lib/adapters/http-client-factory.js.map +1 -0
- package/src/lib/adapters/index.d.ts +3 -0
- package/src/lib/adapters/index.js +4 -0
- package/src/lib/adapters/index.js.map +1 -0
- package/src/lib/constants/constants.d.ts +20 -0
- package/src/lib/constants/constants.js +24 -0
- package/src/lib/constants/constants.js.map +1 -0
- package/src/lib/constants/index.d.ts +1 -0
- package/src/lib/constants/index.js +2 -0
- package/src/lib/constants/index.js.map +1 -0
- package/src/lib/environments/environment.d.ts +7 -0
- package/src/lib/environments/environment.js +2 -0
- package/src/lib/environments/environment.js.map +1 -0
- package/src/lib/environments/index.d.ts +1 -0
- package/src/lib/environments/index.js +2 -0
- package/src/lib/environments/index.js.map +1 -0
- package/src/lib/models/api-response.d.ts +26 -0
- package/src/lib/models/api-response.js +3 -0
- package/src/lib/models/api-response.js.map +1 -0
- package/src/lib/models/base-entity.d.ts +8 -0
- package/src/lib/models/base-entity.js +2 -0
- package/src/lib/models/base-entity.js.map +1 -0
- package/src/lib/models/filter-params.d.ts +7 -0
- package/src/lib/models/filter-params.js +2 -0
- package/src/lib/models/filter-params.js.map +1 -0
- package/src/lib/models/index.d.ts +6 -0
- package/src/lib/models/index.js +7 -0
- package/src/lib/models/index.js.map +1 -0
- package/src/lib/models/legacy-api-response.d.ts +6 -0
- package/src/lib/models/legacy-api-response.js +8 -0
- package/src/lib/models/legacy-api-response.js.map +1 -0
- package/src/lib/models/paginated-result.d.ts +10 -0
- package/src/lib/models/paginated-result.js +2 -0
- package/src/lib/models/paginated-result.js.map +1 -0
- package/src/lib/models/pagination-params.d.ts +23 -0
- package/src/lib/models/pagination-params.js +55 -0
- package/src/lib/models/pagination-params.js.map +1 -0
- package/src/lib/ports/http.port.d.ts +11 -0
- package/src/lib/ports/http.port.js +2 -0
- package/src/lib/ports/http.port.js.map +1 -0
- package/src/lib/ports/index.d.ts +1 -0
- package/src/lib/ports/index.js +2 -0
- package/src/lib/ports/index.js.map +1 -0
- package/src/lib/pricing/calculations/discount.calculator.d.ts +56 -0
- package/src/lib/pricing/calculations/discount.calculator.js +99 -0
- package/src/lib/pricing/calculations/discount.calculator.js.map +1 -0
- package/src/lib/pricing/calculations/index.d.ts +5 -0
- package/src/lib/pricing/calculations/index.js +6 -0
- package/src/lib/pricing/calculations/index.js.map +1 -0
- package/src/lib/pricing/calculations/line-item.calculator.d.ts +34 -0
- package/src/lib/pricing/calculations/line-item.calculator.js +61 -0
- package/src/lib/pricing/calculations/line-item.calculator.js.map +1 -0
- package/src/lib/pricing/calculations/pricing-calculation.error.d.ts +3 -0
- package/src/lib/pricing/calculations/pricing-calculation.error.js +7 -0
- package/src/lib/pricing/calculations/pricing-calculation.error.js.map +1 -0
- package/src/lib/pricing/calculations/pricing.calculator.d.ts +15 -0
- package/src/lib/pricing/calculations/pricing.calculator.js +24 -0
- package/src/lib/pricing/calculations/pricing.calculator.js.map +1 -0
- package/src/lib/pricing/calculations/profit.calculator.d.ts +56 -0
- package/src/lib/pricing/calculations/profit.calculator.js +102 -0
- package/src/lib/pricing/calculations/profit.calculator.js.map +1 -0
- package/src/lib/pricing/calculations/tax.calculator.d.ts +57 -0
- package/src/lib/pricing/calculations/tax.calculator.js +98 -0
- package/src/lib/pricing/calculations/tax.calculator.js.map +1 -0
- package/src/lib/pricing/index.d.ts +7 -0
- package/src/lib/pricing/index.js +8 -0
- package/src/lib/pricing/index.js.map +1 -0
- package/src/lib/types/index.d.ts +1 -0
- package/src/lib/types/index.js +2 -0
- package/src/lib/types/index.js.map +1 -0
- package/src/lib/types/pricing.types.d.ts +32 -0
- package/src/lib/types/pricing.types.js +2 -0
- package/src/lib/types/pricing.types.js.map +1 -0
- package/src/lib/value-objects/base.vo.d.ts +7 -0
- package/src/lib/value-objects/base.vo.js +14 -0
- package/src/lib/value-objects/base.vo.js.map +1 -0
- package/src/lib/value-objects/entity-id.vo.d.ts +6 -0
- package/src/lib/value-objects/entity-id.vo.js +16 -0
- package/src/lib/value-objects/entity-id.vo.js.map +1 -0
- package/src/lib/value-objects/identification-number.vo.d.ts +19 -0
- package/src/lib/value-objects/identification-number.vo.js +132 -0
- package/src/lib/value-objects/identification-number.vo.js.map +1 -0
- package/src/lib/value-objects/index.d.ts +4 -0
- package/src/lib/value-objects/index.js +5 -0
- package/src/lib/value-objects/index.js.map +1 -0
- package/src/lib/value-objects/money.vo.d.ts +12 -0
- package/src/lib/value-objects/money.vo.js +21 -0
- package/src/lib/value-objects/money.vo.js.map +1 -0
- package/index.cjs.js +0 -742
- package/index.d.ts +0 -1
- package/index.esm.js +0 -724
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { DecimalConverter, ParameterValidator } from '@acontplus/utils';
|
|
2
|
+
import { PricingCalculationError } from './pricing-calculation.error';
|
|
3
|
+
/**
|
|
4
|
+
* Calculadora especializada para impuestos (IVA, IGV, etc.)
|
|
5
|
+
*/
|
|
6
|
+
export class TaxCalculator {
|
|
7
|
+
constructor(decimales = 4) {
|
|
8
|
+
this.decimales = decimales;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Calcula el valor del impuesto basado en el precio base y la tasa
|
|
12
|
+
* @param basePrice - Precio sin impuestos
|
|
13
|
+
* @param taxRate - Porcentaje del impuesto (ej: 21 para 21%)
|
|
14
|
+
* @returns Valor del impuesto calculado
|
|
15
|
+
* @throws {PricingCalculationError} Si ocurre un error en el cálculo
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const calculadora = new TaxCalculator();
|
|
19
|
+
* const valorIva = calculadora.calculateTaxAmount(100, 21); // 21
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
calculateTaxAmount(basePrice, taxRate) {
|
|
23
|
+
try {
|
|
24
|
+
ParameterValidator.validatePositiveNumber(basePrice, 'basePrice');
|
|
25
|
+
ParameterValidator.validatePositiveNumber(taxRate, 'taxRate');
|
|
26
|
+
const multiplicador = DecimalConverter.multiplyAsNumber(basePrice, taxRate);
|
|
27
|
+
return DecimalConverter.divideAsNumber(multiplicador, 100);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw new PricingCalculationError('calculateTaxAmount', error);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calcula el precio incluyendo impuestos
|
|
35
|
+
* @param basePrice - Precio sin impuestos
|
|
36
|
+
* @param taxRate - Porcentaje del impuesto
|
|
37
|
+
* @returns Precio total con impuestos incluidos
|
|
38
|
+
* @throws {PricingCalculationError} Si ocurre un error en el cálculo
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const precioConIva = calculadora.calculatePriceWithTax(100, 21); // 121
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
calculatePriceWithTax(basePrice, taxRate) {
|
|
45
|
+
try {
|
|
46
|
+
const taxAmount = this.calculateTaxAmount(basePrice, taxRate);
|
|
47
|
+
return DecimalConverter.addAsNumber(basePrice, taxAmount);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new PricingCalculationError('calculatePriceWithTax', error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calcula el precio base a partir de un precio que ya incluye impuestos
|
|
55
|
+
* @param priceWithTax - Precio que incluye impuestos
|
|
56
|
+
* @param taxRate - Porcentaje del impuesto aplicado
|
|
57
|
+
* @returns Precio base sin impuestos
|
|
58
|
+
* @throws {PricingCalculationError} Si ocurre un error en el cálculo
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const precioBase = calculadora.calculateBasePriceFromTaxIncluded(121, 21); // 100
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
calculateBasePriceFromTaxIncluded(priceWithTax, taxRate) {
|
|
65
|
+
try {
|
|
66
|
+
ParameterValidator.validatePositiveNumber(priceWithTax, 'priceWithTax');
|
|
67
|
+
ParameterValidator.validatePositiveNumber(taxRate, 'taxRate');
|
|
68
|
+
const taxMultiplier = DecimalConverter.divideAsNumber(taxRate, 100);
|
|
69
|
+
const divisor = DecimalConverter.addAsNumber(1, taxMultiplier);
|
|
70
|
+
return DecimalConverter.divideAsNumber(priceWithTax, divisor);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw new PricingCalculationError('calculateBasePriceFromTaxIncluded', error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Obtiene los detalles completos del cálculo de impuestos
|
|
78
|
+
* @param basePrice - Precio sin impuestos
|
|
79
|
+
* @param taxRate - Porcentaje del impuesto
|
|
80
|
+
* @returns Objeto con todos los detalles del cálculo
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const detalles = calculadora.getTaxCalculationDetails(100, 21);
|
|
84
|
+
* // { montoBase: 100, taxRate: 21, valorImpuesto: 21, montoTotal: 121 }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
getTaxCalculationDetails(basePrice, taxRate) {
|
|
88
|
+
const taxAmount = this.calculateTaxAmount(basePrice, taxRate);
|
|
89
|
+
const totalAmount = this.calculatePriceWithTax(basePrice, taxRate);
|
|
90
|
+
return {
|
|
91
|
+
baseAmount: basePrice,
|
|
92
|
+
taxRate,
|
|
93
|
+
taxAmount,
|
|
94
|
+
totalAmount,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=tax.calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tax.calculator.js","sourceRoot":"","sources":["../../../../../../../packages/core/src/lib/pricing/calculations/tax.calculator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAGtE;;GAEG;AACH,MAAM,OAAO,aAAa;IACxB,YAAoB,YAAY,CAAC;QAAb,cAAS,GAAT,SAAS,CAAI;IAAG,CAAC;IAErC;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,SAAiB,EAAE,OAAe;QACnD,IAAI,CAAC;YACH,kBAAkB,CAAC,sBAAsB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAClE,kBAAkB,CAAC,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC5E,OAAO,gBAAgB,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAuB,CAAC,oBAAoB,EAAE,KAAc,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,qBAAqB,CAAC,SAAiB,EAAE,OAAe;QACtD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9D,OAAO,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAuB,CAAC,uBAAuB,EAAE,KAAc,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,iCAAiC,CAAC,YAAoB,EAAE,OAAe;QACrE,IAAI,CAAC;YACH,kBAAkB,CAAC,sBAAsB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YACxE,kBAAkB,CAAC,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,aAAa,GAAG,gBAAgB,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAC/D,OAAO,gBAAgB,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAuB,CAAC,mCAAmC,EAAE,KAAc,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,wBAAwB,CAAC,SAAiB,EAAE,OAAe;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEnE,OAAO;YACL,UAAU,EAAE,SAAS;YACrB,OAAO;YACP,SAAS;YACT,WAAW;SACZ,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { PricingCalculator } from './calculations/pricing.calculator';
|
|
2
|
+
export * from './calculations/tax.calculator';
|
|
3
|
+
export * from './calculations/discount.calculator';
|
|
4
|
+
export * from './calculations/profit.calculator';
|
|
5
|
+
export * from './calculations/line-item.calculator';
|
|
6
|
+
export * from '../types/pricing.types';
|
|
7
|
+
export * from './calculations';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { PricingCalculator } from './calculations/pricing.calculator';
|
|
2
|
+
export * from './calculations/tax.calculator';
|
|
3
|
+
export * from './calculations/discount.calculator';
|
|
4
|
+
export * from './calculations/profit.calculator';
|
|
5
|
+
export * from './calculations/line-item.calculator';
|
|
6
|
+
export * from '../types/pricing.types';
|
|
7
|
+
export * from './calculations';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/pricing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './pricing.types';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface PricingConfig {
|
|
2
|
+
defaultDecimals?: number;
|
|
3
|
+
roundingMode?: 'round' | 'ceil' | 'floor';
|
|
4
|
+
errorHandling?: 'throw' | 'return-null' | 'return-default';
|
|
5
|
+
}
|
|
6
|
+
export interface TaxCalculation {
|
|
7
|
+
baseAmount: number;
|
|
8
|
+
taxRate: number;
|
|
9
|
+
taxAmount: number;
|
|
10
|
+
totalAmount: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DiscountCalculation {
|
|
13
|
+
originalPrice: number;
|
|
14
|
+
discountRate: number;
|
|
15
|
+
discountAmount: number;
|
|
16
|
+
finalPrice: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ProfitMarginCalculation {
|
|
19
|
+
salePrice: number;
|
|
20
|
+
cost: number;
|
|
21
|
+
profitAmount: number;
|
|
22
|
+
profitMargin: number;
|
|
23
|
+
}
|
|
24
|
+
export interface LineItemCalculation {
|
|
25
|
+
unitPrice: number;
|
|
26
|
+
quantity: number;
|
|
27
|
+
subtotal: number;
|
|
28
|
+
discountAmount: number;
|
|
29
|
+
subtotalAfterDiscount: number;
|
|
30
|
+
taxAmount: number;
|
|
31
|
+
total: number;
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.types.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/types/pricing.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/domain/value-objects/base.vo.ts
|
|
2
|
+
export class BaseVo {
|
|
3
|
+
constructor(value) {
|
|
4
|
+
this.value = value;
|
|
5
|
+
this.validate(value);
|
|
6
|
+
}
|
|
7
|
+
getValue() {
|
|
8
|
+
return this.value;
|
|
9
|
+
}
|
|
10
|
+
equals(other) {
|
|
11
|
+
return JSON.stringify(this.value) === JSON.stringify(other.value);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=base.vo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.vo.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/value-objects/base.vo.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,OAAgB,MAAM;IAC1B,YAAyC,KAAQ;QAAR,UAAK,GAAL,KAAK,CAAG;QAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAID,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,KAAgB;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { BaseVo } from './base.vo';
|
|
3
|
+
export class EntityIdVo extends BaseVo {
|
|
4
|
+
constructor(value) {
|
|
5
|
+
super(value);
|
|
6
|
+
}
|
|
7
|
+
static generate() {
|
|
8
|
+
return new EntityIdVo(uuidv4());
|
|
9
|
+
}
|
|
10
|
+
validate(value) {
|
|
11
|
+
if (!value || value.trim().length === 0) {
|
|
12
|
+
throw new Error('EntityIdVo cannot be empty');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=entity-id.vo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-id.vo.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/value-objects/entity-id.vo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,OAAO,UAAW,SAAQ,MAAc;IAC5C,YAAY,KAAa;QACvB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,MAAM,CAAC,QAAQ;QACb,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAES,QAAQ,CAAC,KAAa;QAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SRI_DOCUMENT_TYPE } from '../constants';
|
|
2
|
+
import { BaseVo } from './base.vo';
|
|
3
|
+
export declare class IdentificationNumberVo extends BaseVo<string> {
|
|
4
|
+
private readonly id;
|
|
5
|
+
private readonly type;
|
|
6
|
+
constructor(id: string);
|
|
7
|
+
private determineType;
|
|
8
|
+
validate(): boolean;
|
|
9
|
+
private isValidCedulaAlgorithm;
|
|
10
|
+
private isValidRucAlgorithm;
|
|
11
|
+
private isValidSociedadRuc;
|
|
12
|
+
private static validateCedula;
|
|
13
|
+
isValidCedula(): boolean;
|
|
14
|
+
isValidRuc(): boolean;
|
|
15
|
+
getId(): string;
|
|
16
|
+
getType(): SRI_DOCUMENT_TYPE;
|
|
17
|
+
static tryCreate(id: string): boolean;
|
|
18
|
+
getRucType(): string | null;
|
|
19
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { SRI_DOCUMENT_TYPE } from '../constants';
|
|
2
|
+
import { BaseVo } from './base.vo';
|
|
3
|
+
export class IdentificationNumberVo extends BaseVo {
|
|
4
|
+
constructor(id) {
|
|
5
|
+
super(id);
|
|
6
|
+
this.id = id?.trim() || '';
|
|
7
|
+
this.type = this.determineType();
|
|
8
|
+
if (!this.validate()) {
|
|
9
|
+
throw new Error(`Número de identificación inválido: ${this.id}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
determineType() {
|
|
13
|
+
if (this.id.length === 10)
|
|
14
|
+
return SRI_DOCUMENT_TYPE.CEDULA;
|
|
15
|
+
if (this.id.length === 13)
|
|
16
|
+
return SRI_DOCUMENT_TYPE.RUC;
|
|
17
|
+
throw new Error('Número de identificación debe tener 10 o 13 dígitos');
|
|
18
|
+
}
|
|
19
|
+
validate() {
|
|
20
|
+
if (this.type === SRI_DOCUMENT_TYPE.CEDULA) {
|
|
21
|
+
return this.isValidCedulaAlgorithm();
|
|
22
|
+
}
|
|
23
|
+
if (this.type === SRI_DOCUMENT_TYPE.RUC) {
|
|
24
|
+
return this.isValidRucAlgorithm();
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
// Validación completa de cédula ecuatoriana con algoritmo
|
|
29
|
+
isValidCedulaAlgorithm() {
|
|
30
|
+
if (!/^\d{10}$/.test(this.id))
|
|
31
|
+
return false;
|
|
32
|
+
// Verificar que los primeros 2 dígitos sean una provincia válida (01-24)
|
|
33
|
+
const provincia = parseInt(this.id.substring(0, 2));
|
|
34
|
+
if (provincia < 1 || provincia > 24)
|
|
35
|
+
return false;
|
|
36
|
+
// Algoritmo de validación del dígito verificador
|
|
37
|
+
const coeficientes = [2, 1, 2, 1, 2, 1, 2, 1, 2];
|
|
38
|
+
let suma = 0;
|
|
39
|
+
for (let i = 0; i < 9; i++) {
|
|
40
|
+
const valor = parseInt(this.id.charAt(i)) * coeficientes[i];
|
|
41
|
+
suma += valor > 9 ? valor - 9 : valor;
|
|
42
|
+
}
|
|
43
|
+
const digitoVerificador = suma % 10 === 0 ? 0 : 10 - (suma % 10);
|
|
44
|
+
return digitoVerificador === parseInt(this.id.charAt(9));
|
|
45
|
+
}
|
|
46
|
+
// Validación de RUC más flexible
|
|
47
|
+
isValidRucAlgorithm() {
|
|
48
|
+
if (!/^\d{13}$/.test(this.id))
|
|
49
|
+
return false;
|
|
50
|
+
// Los primeros 10 dígitos deben ser una cédula válida para personas naturales
|
|
51
|
+
// o seguir reglas específicas para sociedades
|
|
52
|
+
const tercerDigito = parseInt(this.id.charAt(2));
|
|
53
|
+
// RUC de persona natural (tercer dígito < 6)
|
|
54
|
+
if (tercerDigito < 6) {
|
|
55
|
+
const cedula = this.id.substring(0, 10);
|
|
56
|
+
const tempCedula = IdentificationNumberVo.validateCedula(cedula);
|
|
57
|
+
return tempCedula && this.id.endsWith('001');
|
|
58
|
+
}
|
|
59
|
+
// RUC de sociedad privada (tercer dígito = 9)
|
|
60
|
+
if (tercerDigito === 9) {
|
|
61
|
+
return this.isValidSociedadRuc();
|
|
62
|
+
}
|
|
63
|
+
// RUC de entidad pública (tercer dígito = 6)
|
|
64
|
+
if (tercerDigito === 6) {
|
|
65
|
+
return this.id.endsWith('0001');
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
isValidSociedadRuc() {
|
|
70
|
+
const coeficientes = [4, 3, 2, 7, 6, 5, 4, 3, 2];
|
|
71
|
+
let suma = 0;
|
|
72
|
+
for (let i = 0; i < 9; i++) {
|
|
73
|
+
suma += parseInt(this.id.charAt(i)) * coeficientes[i];
|
|
74
|
+
}
|
|
75
|
+
const residuo = suma % 11;
|
|
76
|
+
const digitoVerificador = residuo === 0 ? 0 : 11 - residuo;
|
|
77
|
+
return digitoVerificador === parseInt(this.id.charAt(9)) && this.id.endsWith('001');
|
|
78
|
+
}
|
|
79
|
+
// Método auxiliar estático para validar cédula sin crear instancia
|
|
80
|
+
static validateCedula(cedula) {
|
|
81
|
+
if (!/^\d{10}$/.test(cedula))
|
|
82
|
+
return false;
|
|
83
|
+
const provincia = parseInt(cedula.substring(0, 2));
|
|
84
|
+
if (provincia < 1 || provincia > 24)
|
|
85
|
+
return false;
|
|
86
|
+
const coeficientes = [2, 1, 2, 1, 2, 1, 2, 1, 2];
|
|
87
|
+
let suma = 0;
|
|
88
|
+
for (let i = 0; i < 9; i++) {
|
|
89
|
+
const valor = parseInt(cedula.charAt(i)) * coeficientes[i];
|
|
90
|
+
suma += valor > 9 ? valor - 9 : valor;
|
|
91
|
+
}
|
|
92
|
+
const digitoVerificador = suma % 10 === 0 ? 0 : 10 - (suma % 10);
|
|
93
|
+
return digitoVerificador === parseInt(cedula.charAt(9));
|
|
94
|
+
}
|
|
95
|
+
// Métodos públicos mejorados
|
|
96
|
+
isValidCedula() {
|
|
97
|
+
return this.type === SRI_DOCUMENT_TYPE.CEDULA && this.isValidCedulaAlgorithm();
|
|
98
|
+
}
|
|
99
|
+
isValidRuc() {
|
|
100
|
+
return this.type === SRI_DOCUMENT_TYPE.RUC && this.isValidRucAlgorithm();
|
|
101
|
+
}
|
|
102
|
+
getId() {
|
|
103
|
+
return this.id;
|
|
104
|
+
}
|
|
105
|
+
getType() {
|
|
106
|
+
return this.type;
|
|
107
|
+
}
|
|
108
|
+
// Método estático mejorado
|
|
109
|
+
static tryCreate(id) {
|
|
110
|
+
try {
|
|
111
|
+
new IdentificationNumberVo(id);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Método adicional para obtener información del tipo de RUC
|
|
119
|
+
getRucType() {
|
|
120
|
+
if (this.type !== SRI_DOCUMENT_TYPE.RUC)
|
|
121
|
+
return null;
|
|
122
|
+
const tercerDigito = parseInt(this.id.charAt(2));
|
|
123
|
+
if (tercerDigito < 6)
|
|
124
|
+
return 'Persona Natural';
|
|
125
|
+
if (tercerDigito === 6)
|
|
126
|
+
return 'Entidad Pública';
|
|
127
|
+
if (tercerDigito === 9)
|
|
128
|
+
return 'Sociedad Privada';
|
|
129
|
+
return 'Desconocido';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=identification-number.vo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identification-number.vo.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/value-objects/identification-number.vo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/value-objects/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseVo } from './base.vo';
|
|
2
|
+
export declare class MoneyVo extends BaseVo<{
|
|
3
|
+
amount: number;
|
|
4
|
+
currency: string;
|
|
5
|
+
}> {
|
|
6
|
+
constructor(amount: number, currency?: string);
|
|
7
|
+
protected validate(value: {
|
|
8
|
+
amount: number;
|
|
9
|
+
currency: string;
|
|
10
|
+
}): void;
|
|
11
|
+
add(other: MoneyVo): MoneyVo;
|
|
12
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// src/domain/value-objects/money.vo.ts
|
|
2
|
+
import { BaseVo } from './base.vo';
|
|
3
|
+
export class MoneyVo extends BaseVo {
|
|
4
|
+
constructor(amount, currency = 'USD') {
|
|
5
|
+
super({ amount, currency });
|
|
6
|
+
}
|
|
7
|
+
validate(value) {
|
|
8
|
+
if (value.amount < 0)
|
|
9
|
+
throw new Error('Amount cannot be negative');
|
|
10
|
+
if (!value.currency || value.currency.length !== 3) {
|
|
11
|
+
throw new Error('Invalid currency code');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
add(other) {
|
|
15
|
+
if (this.value.currency !== other.value.currency) {
|
|
16
|
+
throw new Error('Cannot add different currencies');
|
|
17
|
+
}
|
|
18
|
+
return new MoneyVo(this.value.amount + other.value.amount, this.value.currency);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=money.vo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.vo.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/value-objects/money.vo.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,OAAO,OAAQ,SAAQ,MAA4C;IACvE,YAAY,MAAc,EAAE,QAAQ,GAAG,KAAK;QAC1C,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9B,CAAC;IAES,QAAQ,CAAC,KAA2C;QAC5D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAc;QAChB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClF,CAAC;CACF"}
|