bdpformulas 1.0.99 → 1.0.101
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/build/index.d.ts +2 -0
- package/build/index.js +3 -1
- package/build/models/eeff/balanceProyectado.d.ts +2 -3
- package/build/models/eeff/balanceProyectado.js +4 -1
- package/build/strategies/eeff/balanceProyectado/balanceHandler.js +3 -3
- package/build/strategies/eeff/balanceProyectado/balanceProyectado.strategy.js +0 -14
- package/build/strategies/eeff/balanceProyectado/eerrHandler.d.ts +1 -0
- package/build/strategies/eeff/balanceProyectado/eerrHandler.js +13 -4
- package/build/strategies/eeff/balanceProyectado/flujoCajaHandler.js +2 -4
- package/build/strategies/eeff/deudas/administracionLinea.js +1 -1
- package/build/strategies/eeff/deudas/aplicactionesCuadro.js +1 -1
- package/build/strategies/eeff/deudas/deudas.strategy.js +0 -2
- package/build/strategies/eeff/index.d.ts +0 -1
- package/build/strategies/eeff/index.js +0 -9240
- package/build/strategies/eeff/mappings/balanceProyectado.js +24 -24
- package/build/strategies/eeff/supuestos.strategy.d.ts +3 -7
- package/build/strategies/eeff/supuestos.strategy.js +51 -20
- package/package.json +1 -1
|
@@ -566,25 +566,25 @@ exports.balanceProyectadoMapping.set('X139', {
|
|
|
566
566
|
RubroId: 'ACT_FJ_10101',
|
|
567
567
|
RubroPadreId: 'ACT_FJ_10200',
|
|
568
568
|
Descripcion: 'Utilidad Neta + Gastos Financieros',
|
|
569
|
-
Clasificador: '
|
|
569
|
+
Clasificador: 'H'
|
|
570
570
|
});
|
|
571
571
|
exports.balanceProyectadoMapping.set('X140', {
|
|
572
572
|
RubroId: 'ACT_FJ_10102',
|
|
573
573
|
RubroPadreId: 'ACT_FJ_10200',
|
|
574
574
|
Descripcion: 'Gastos Financieros',
|
|
575
|
-
Clasificador: '
|
|
575
|
+
Clasificador: 'H'
|
|
576
576
|
});
|
|
577
577
|
exports.balanceProyectadoMapping.set('X141', {
|
|
578
578
|
RubroId: 'ACT_FJ_10103',
|
|
579
579
|
RubroPadreId: 'ACT_FJ_10200',
|
|
580
580
|
Descripcion: 'Depreciación',
|
|
581
|
-
Clasificador: '
|
|
581
|
+
Clasificador: 'H'
|
|
582
582
|
});
|
|
583
583
|
exports.balanceProyectadoMapping.set('X142', {
|
|
584
584
|
RubroId: 'ACT_FJ_10104',
|
|
585
585
|
RubroPadreId: 'ACT_FJ_10200',
|
|
586
586
|
Descripcion: 'Otras Cuentas que No Implican Movimiento de Fondos',
|
|
587
|
-
Clasificador: '
|
|
587
|
+
Clasificador: 'H'
|
|
588
588
|
});
|
|
589
589
|
exports.balanceProyectadoMapping.set('X143', {
|
|
590
590
|
RubroId: 'ACT_FJ_10200',
|
|
@@ -596,37 +596,37 @@ exports.balanceProyectadoMapping.set('X144', {
|
|
|
596
596
|
RubroId: 'ACT_FJ_10201',
|
|
597
597
|
RubroPadreId: 'ACT_FJ_10300',
|
|
598
598
|
Descripcion: 'Cuentas por Cobrar Comerciales (Netas de Incobrables)',
|
|
599
|
-
Clasificador: '
|
|
599
|
+
Clasificador: 'H'
|
|
600
600
|
});
|
|
601
601
|
exports.balanceProyectadoMapping.set('X145', {
|
|
602
602
|
RubroId: 'ACT_FJ_10202',
|
|
603
603
|
RubroPadreId: 'ACT_FJ_10300',
|
|
604
604
|
Descripcion: 'Cuentas Comerciales Empresas Relacionadas',
|
|
605
|
-
Clasificador: '
|
|
605
|
+
Clasificador: 'H'
|
|
606
606
|
});
|
|
607
607
|
exports.balanceProyectadoMapping.set('X146', {
|
|
608
608
|
RubroId: 'ACT_FJ_10203',
|
|
609
609
|
RubroPadreId: 'ACT_FJ_10300',
|
|
610
610
|
Descripcion: 'Realizables (Inventarios)',
|
|
611
|
-
Clasificador: '
|
|
611
|
+
Clasificador: 'H'
|
|
612
612
|
});
|
|
613
613
|
exports.balanceProyectadoMapping.set('X147', {
|
|
614
614
|
RubroId: 'ACT_FJ_10204',
|
|
615
615
|
RubroPadreId: 'ACT_FJ_10300',
|
|
616
616
|
Descripcion: 'Cuentas Comerciales por Pagar (Proveedores)',
|
|
617
|
-
Clasificador: '
|
|
617
|
+
Clasificador: 'H'
|
|
618
618
|
});
|
|
619
619
|
exports.balanceProyectadoMapping.set('X148', {
|
|
620
620
|
RubroId: 'ACT_FJ_10205',
|
|
621
621
|
RubroPadreId: 'ACT_FJ_10300',
|
|
622
622
|
Descripcion: 'Otros Activos (Operativo)',
|
|
623
|
-
Clasificador: '
|
|
623
|
+
Clasificador: 'H'
|
|
624
624
|
});
|
|
625
625
|
exports.balanceProyectadoMapping.set('X149', {
|
|
626
626
|
RubroId: 'ACT_FJ_10206',
|
|
627
627
|
RubroPadreId: 'ACT_FJ_10300',
|
|
628
628
|
Descripcion: 'Otros Pasivos (Operativo)',
|
|
629
|
-
Clasificador: '
|
|
629
|
+
Clasificador: 'H'
|
|
630
630
|
});
|
|
631
631
|
exports.balanceProyectadoMapping.set('X150', {
|
|
632
632
|
RubroId: 'ACT_FJ_10300',
|
|
@@ -638,25 +638,25 @@ exports.balanceProyectadoMapping.set('X151', {
|
|
|
638
638
|
RubroId: 'ACT_FJ_10301',
|
|
639
639
|
RubroPadreId: 'ACT_FJ_10400',
|
|
640
640
|
Descripcion: 'Activos y Pasivos Diferidos',
|
|
641
|
-
Clasificador: '
|
|
641
|
+
Clasificador: 'H'
|
|
642
642
|
});
|
|
643
643
|
exports.balanceProyectadoMapping.set('X152', {
|
|
644
644
|
RubroId: 'ACT_FJ_10302',
|
|
645
645
|
RubroPadreId: 'ACT_FJ_10400',
|
|
646
646
|
Descripcion: 'Otros Activos (No Operativo)',
|
|
647
|
-
Clasificador: '
|
|
647
|
+
Clasificador: 'H'
|
|
648
648
|
});
|
|
649
649
|
exports.balanceProyectadoMapping.set('X153', {
|
|
650
650
|
RubroId: 'ACT_FJ_10303',
|
|
651
651
|
RubroPadreId: 'ACT_FJ_10400',
|
|
652
652
|
Descripcion: 'Otros Pasivos (No Operativo)',
|
|
653
|
-
Clasificador: '
|
|
653
|
+
Clasificador: 'H'
|
|
654
654
|
});
|
|
655
655
|
exports.balanceProyectadoMapping.set('X154', {
|
|
656
656
|
RubroId: 'ACT_FJ_10304',
|
|
657
657
|
RubroPadreId: 'ACT_FJ_10400',
|
|
658
658
|
Descripcion: 'Obligaciones Fiscales y Sociales',
|
|
659
|
-
Clasificador: '
|
|
659
|
+
Clasificador: 'H'
|
|
660
660
|
});
|
|
661
661
|
exports.balanceProyectadoMapping.set('X155', {
|
|
662
662
|
RubroId: 'ACT_FJ_10400',
|
|
@@ -668,19 +668,19 @@ exports.balanceProyectadoMapping.set('X156', {
|
|
|
668
668
|
RubroId: 'ACT_FJ_10401',
|
|
669
669
|
RubroPadreId: 'ACT_FJ_10500',
|
|
670
670
|
Descripcion: 'Inversiones (-) o Ventas (+) en Activos Fijos ',
|
|
671
|
-
Clasificador: '
|
|
671
|
+
Clasificador: 'H'
|
|
672
672
|
});
|
|
673
673
|
exports.balanceProyectadoMapping.set('X157', {
|
|
674
674
|
RubroId: 'ACT_FJ_10402',
|
|
675
675
|
RubroPadreId: 'ACT_FJ_10500',
|
|
676
676
|
Descripcion: 'Variaciones en Activos por Arrendamiento Financiero',
|
|
677
|
-
Clasificador: '
|
|
677
|
+
Clasificador: 'H'
|
|
678
678
|
});
|
|
679
679
|
exports.balanceProyectadoMapping.set('X158', {
|
|
680
680
|
RubroId: 'ACT_FJ_10403',
|
|
681
681
|
RubroPadreId: 'ACT_FJ_10500',
|
|
682
682
|
Descripcion: 'Inversiones de Largo Plazo',
|
|
683
|
-
Clasificador: '
|
|
683
|
+
Clasificador: 'H'
|
|
684
684
|
});
|
|
685
685
|
exports.balanceProyectadoMapping.set('X159', {
|
|
686
686
|
RubroId: 'ACT_FJ_10500',
|
|
@@ -692,43 +692,43 @@ exports.balanceProyectadoMapping.set('X160', {
|
|
|
692
692
|
RubroId: 'ACT_FJ_10501',
|
|
693
693
|
RubroPadreId: 'ACT_FJ_10600',
|
|
694
694
|
Descripcion: 'Amortización de Deuda (Vencimiento Corriente de deuda del año anterior)',
|
|
695
|
-
Clasificador: '
|
|
695
|
+
Clasificador: 'H'
|
|
696
696
|
});
|
|
697
697
|
exports.balanceProyectadoMapping.set('X161', {
|
|
698
698
|
RubroId: 'ACT_FJ_10502',
|
|
699
699
|
RubroPadreId: 'ACT_FJ_10600',
|
|
700
700
|
Descripcion: 'Deuda Financiera de Corto Plazo',
|
|
701
|
-
Clasificador: '
|
|
701
|
+
Clasificador: 'H'
|
|
702
702
|
});
|
|
703
703
|
exports.balanceProyectadoMapping.set('X162', {
|
|
704
704
|
RubroId: 'ACT_FJ_10503',
|
|
705
705
|
RubroPadreId: 'ACT_FJ_10600',
|
|
706
706
|
Descripcion: 'Deuda Financiera de Largo Plazo y Venc. Corr. Deuda del Año',
|
|
707
|
-
Clasificador: '
|
|
707
|
+
Clasificador: 'H'
|
|
708
708
|
});
|
|
709
709
|
exports.balanceProyectadoMapping.set('X163', {
|
|
710
710
|
RubroId: 'ACT_FJ_10504',
|
|
711
711
|
RubroPadreId: 'ACT_FJ_10600',
|
|
712
712
|
Descripcion: 'Deuda Subordinada',
|
|
713
|
-
Clasificador: '
|
|
713
|
+
Clasificador: 'H'
|
|
714
714
|
});
|
|
715
715
|
exports.balanceProyectadoMapping.set('X164', {
|
|
716
716
|
RubroId: 'ACT_FJ_10505',
|
|
717
717
|
RubroPadreId: 'ACT_FJ_10600',
|
|
718
718
|
Descripcion: 'Inversiones y/o Adelantos a (de) Empresas Relacionadas',
|
|
719
|
-
Clasificador: '
|
|
719
|
+
Clasificador: 'H'
|
|
720
720
|
});
|
|
721
721
|
exports.balanceProyectadoMapping.set('X165', {
|
|
722
722
|
RubroId: 'ACT_FJ_10506',
|
|
723
723
|
RubroPadreId: 'ACT_FJ_10600',
|
|
724
724
|
Descripcion: 'Dividendos y Anticipo a Socios',
|
|
725
|
-
Clasificador: '
|
|
725
|
+
Clasificador: 'H'
|
|
726
726
|
});
|
|
727
727
|
exports.balanceProyectadoMapping.set('X166', {
|
|
728
728
|
RubroId: 'ACT_FJ_10507',
|
|
729
729
|
RubroPadreId: 'ACT_FJ_10600',
|
|
730
730
|
Descripcion: 'Ajustes Patrimoniales',
|
|
731
|
-
Clasificador: '
|
|
731
|
+
Clasificador: 'H'
|
|
732
732
|
});
|
|
733
733
|
exports.balanceProyectadoMapping.set('X167', {
|
|
734
734
|
RubroId: 'ACT_FJ_10600',
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AdministracionFinancieraCalcData } from '../../models/eeff/admFinanciera';
|
|
2
2
|
import { Strategy } from '../../strategy.interface';
|
|
3
3
|
export interface SupuestosStrategyData {
|
|
4
|
+
InicioProyeccionGestion: number;
|
|
4
5
|
CantidadProyeccion: number;
|
|
5
6
|
CantidadGestiones: number;
|
|
6
7
|
Supuestos: any[];
|
|
@@ -8,11 +9,6 @@ export interface SupuestosStrategyData {
|
|
|
8
9
|
balance: any[];
|
|
9
10
|
eerr: any[];
|
|
10
11
|
};
|
|
11
|
-
BalanceProyectado: {
|
|
12
|
-
Balance: any[];
|
|
13
|
-
EERR: any[];
|
|
14
|
-
FlujoCaja: any[];
|
|
15
|
-
};
|
|
16
12
|
AdministracionFinancieraData: AdministracionFinancieraCalcData;
|
|
17
13
|
CamposCalculados: Record<string, any>;
|
|
18
14
|
DeudaProyectada: {
|
|
@@ -26,10 +22,12 @@ export default class SupuestosStrategy implements Strategy {
|
|
|
26
22
|
data: SupuestosStrategyData | null;
|
|
27
23
|
private cantidadProyeccion;
|
|
28
24
|
private cantidadGestiones;
|
|
25
|
+
private inicioProyeccionGestion;
|
|
29
26
|
constructor();
|
|
30
27
|
private anadirPrecalculo;
|
|
31
28
|
private cleanNumber;
|
|
32
29
|
execute(data: SupuestosStrategyData): SupuestosStrategyData;
|
|
30
|
+
private getActivoFijoNeto;
|
|
33
31
|
private setDepreciacion;
|
|
34
32
|
private setDepreciacionLeasing;
|
|
35
33
|
private actualizarCampo;
|
|
@@ -37,10 +35,8 @@ export default class SupuestosStrategy implements Strategy {
|
|
|
37
35
|
private esCampoCalculado;
|
|
38
36
|
private quitarCampoCalculado;
|
|
39
37
|
private agregarCampoCalculado;
|
|
40
|
-
private applyAdministracionFinancieraData;
|
|
41
38
|
private setRotacionDiasInventario;
|
|
42
39
|
private setMontoIncremento;
|
|
43
|
-
private getTotalesActivacionLeasing;
|
|
44
40
|
private getSumaProyeccionUntil;
|
|
45
41
|
private setBalanceData;
|
|
46
42
|
private setCostoDeVentas;
|
|
@@ -9,10 +9,12 @@ class SupuestosStrategy {
|
|
|
9
9
|
data;
|
|
10
10
|
cantidadProyeccion;
|
|
11
11
|
cantidadGestiones;
|
|
12
|
+
inicioProyeccionGestion;
|
|
12
13
|
constructor() {
|
|
13
14
|
this.data = null;
|
|
14
15
|
this.cantidadGestiones = -1;
|
|
15
16
|
this.cantidadProyeccion = -1;
|
|
17
|
+
this.inicioProyeccionGestion = -1;
|
|
16
18
|
}
|
|
17
19
|
//@ts-ignore
|
|
18
20
|
anadirPrecalculo(origen, rubroOrigen, rubroDestino, percent = false) {
|
|
@@ -43,29 +45,71 @@ class SupuestosStrategy {
|
|
|
43
45
|
this.cantidadGestiones = data.CantidadGestiones;
|
|
44
46
|
if (data.CantidadProyeccion)
|
|
45
47
|
this.cantidadProyeccion = data.CantidadProyeccion;
|
|
48
|
+
if (data.InicioProyeccionGestion)
|
|
49
|
+
this.inicioProyeccionGestion = data.InicioProyeccionGestion;
|
|
46
50
|
this.setBalanceData();
|
|
51
|
+
this.setMontoIncremento();
|
|
47
52
|
this.setDepreciacion();
|
|
48
53
|
this.setDepreciacionLeasing();
|
|
49
|
-
this.applyAdministracionFinancieraData();
|
|
50
54
|
this.setDeudaProyectada();
|
|
51
55
|
return this.data;
|
|
52
56
|
}
|
|
57
|
+
getActivoFijoNeto(gestion) {
|
|
58
|
+
const balanceActivosFijosNetos = this.data?.EEFF.balance.find((el) => el.RubroId === balance_1.EEFFBalanceRubro.Activos_Fijos_Netos);
|
|
59
|
+
let res;
|
|
60
|
+
if (gestion > 0) {
|
|
61
|
+
const anterior = this.getActivoFijoNeto(gestion - 1);
|
|
62
|
+
const supuestoMontoIncremento = this.data?.Supuestos.find((el) => el.RubroId ===
|
|
63
|
+
supuestos_1.SupuestosRubro.Monto_de_Incremento_decir_en_Inversiones_en_Activos_Fijos);
|
|
64
|
+
const supuestoDepreciacion = this.data?.Supuestos.find((el) => el.RubroId === supuestos_1.SupuestosRubro.Depreciación);
|
|
65
|
+
const admFinanciera680 = (0, utils_1.ourParseFloat)(this.data?.AdministracionFinancieraData.Totales.PrestamosLeasing
|
|
66
|
+
.CuadroDefinicionOperacion[`Gestion${gestion}`]);
|
|
67
|
+
//const supuestoCoefDepreciacion = this.data?.Supuestos.find(el => el.RubroId === 'ACT_SUP_10402')
|
|
68
|
+
if (supuestoMontoIncremento?.Clasificacion === 'C') {
|
|
69
|
+
res =
|
|
70
|
+
anterior *
|
|
71
|
+
(1 +
|
|
72
|
+
(0, utils_1.ourParseFloat)(supuestoMontoIncremento?.[`Gestion${gestion}`])) -
|
|
73
|
+
admFinanciera680 -
|
|
74
|
+
(0, utils_1.ourParseFloat)(supuestoDepreciacion?.[`Gestion${gestion}`]);
|
|
75
|
+
}
|
|
76
|
+
else if (supuestoMontoIncremento?.Clasificacion === 'A') {
|
|
77
|
+
res =
|
|
78
|
+
(0, utils_1.ourParseFloat)(supuestoMontoIncremento?.[`Gestion${gestion}`]) -
|
|
79
|
+
admFinanciera680 -
|
|
80
|
+
(0, utils_1.ourParseFloat)(supuestoDepreciacion?.[`Gestion${gestion}`]);
|
|
81
|
+
}
|
|
82
|
+
else if (supuestoMontoIncremento?.Clasificacion === 'CA') {
|
|
83
|
+
res =
|
|
84
|
+
anterior +
|
|
85
|
+
(0, utils_1.ourParseFloat)(supuestoMontoIncremento?.[`Gestion${gestion}`]) -
|
|
86
|
+
admFinanciera680 -
|
|
87
|
+
(0, utils_1.ourParseFloat)(supuestoDepreciacion?.[`Gestion${gestion}`]);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
res =
|
|
92
|
+
balanceActivosFijosNetos?.[`Gestion${this.inicioProyeccionGestion}`];
|
|
93
|
+
}
|
|
94
|
+
return (0, utils_1.ourParseFloat)(res);
|
|
95
|
+
}
|
|
53
96
|
setDepreciacion() {
|
|
54
97
|
const rowDeprecCoef = this.data?.Supuestos.find((item) => item.RubroId == 'ACT_SUP_10402');
|
|
55
98
|
for (let i = 1; i <= this.cantidadProyeccion; i++) {
|
|
56
|
-
const
|
|
57
|
-
this.actualizarCampo(supuestos_1.SupuestosRubro.Depreciación, i, this.cleanNumber(rowDeprecCoef[`Gestion${i}`]) *
|
|
58
|
-
this.cleanNumber(activosFijosNetos?.[`Gestion${i}`]));
|
|
99
|
+
const activoFijoNeto = this.getActivoFijoNeto(i - 1);
|
|
100
|
+
this.actualizarCampo(supuestos_1.SupuestosRubro.Depreciación, i, this.cleanNumber(rowDeprecCoef[`Gestion${i}`]) * activoFijoNeto);
|
|
59
101
|
}
|
|
60
102
|
}
|
|
61
103
|
setDepreciacionLeasing() {
|
|
62
104
|
const rowDeprecCoefLeasing = this.data?.Supuestos.find((item) => item.RubroId ==
|
|
63
105
|
supuestos_1.SupuestosRubro.Coeficiente_de_Depreciación_Operaciones_de_Leasing);
|
|
64
|
-
const totalesActivacionLeasing = this.
|
|
65
|
-
|
|
106
|
+
const totalesActivacionLeasing = this.data?.AdministracionFinancieraData.Totales.PrestamosLeasing
|
|
107
|
+
.ActivacionOperacionLeasing ?? {};
|
|
108
|
+
const balanceActivoPorArrendamiento = (0, utils_1.ourParseFloat)(this.data?.EEFF.balance.find((el) => el.RubroId ===
|
|
109
|
+
balance_1.EEFFBalanceRubro.Activos_por_Arrendamiento_Financiero)?.[`Gestion${this.inicioProyeccionGestion}`]);
|
|
66
110
|
for (let i = 1; i <= this.cantidadProyeccion; i++) {
|
|
67
111
|
this.actualizarCampo(supuestos_1.SupuestosRubro.Depreciación_Operaciones_Leasing, i, this.cleanNumber(rowDeprecCoefLeasing[`Gestion${i}`]) *
|
|
68
|
-
(
|
|
112
|
+
(balanceActivoPorArrendamiento +
|
|
69
113
|
this.getSumaProyeccionUntil(totalesActivacionLeasing, i)));
|
|
70
114
|
}
|
|
71
115
|
}
|
|
@@ -115,9 +159,6 @@ class SupuestosStrategy {
|
|
|
115
159
|
[rubroId]: { [`Gestion${correlativo}`]: valor }
|
|
116
160
|
});
|
|
117
161
|
}
|
|
118
|
-
applyAdministracionFinancieraData() {
|
|
119
|
-
this.setMontoIncremento();
|
|
120
|
-
}
|
|
121
162
|
setRotacionDiasInventario() {
|
|
122
163
|
const realizables = this.data?.EEFF.balance.find((el) => el.RubroId == balance_1.EEFFBalanceRubro.Realizables_Inventarios);
|
|
123
164
|
const aplicaciones = this.data?.AdministracionFinancieraData.ProyeccionAplicaciones;
|
|
@@ -153,16 +194,6 @@ class SupuestosStrategy {
|
|
|
153
194
|
this.actualizarCampo(supuestos_1.SupuestosRubro.Monto_de_Incremento_decir_en_Inversiones_en_Activos_Fijos, 1, (0, utils_1.ourParseFloat)(kiPrestamoDirecto?.[`Gestion1`]) +
|
|
154
195
|
(0, utils_1.ourParseFloat)(kiKoMixta?.[`Gestion1`]));
|
|
155
196
|
}
|
|
156
|
-
getTotalesActivacionLeasing() {
|
|
157
|
-
return (this.data?.AdministracionFinancieraData.PrestamoLeasing.filter((el) => el.IndicadorABM !== 'B' && el.Clasificador !== 'T').reduce((acc, el) => {
|
|
158
|
-
for (let i = 1; i <= this.cantidadProyeccion; i++) {
|
|
159
|
-
acc[`Gestion${i}`] =
|
|
160
|
-
(0, utils_1.ourParseFloat)(acc[`Gestion${i}`]) +
|
|
161
|
-
(0, utils_1.ourParseFloat)(el.ActivacionesOperacion?.[`Gestion${i}`]);
|
|
162
|
-
}
|
|
163
|
-
return acc;
|
|
164
|
-
}, {}) ?? {});
|
|
165
|
-
}
|
|
166
197
|
getSumaProyeccionUntil(proyeccion, until) {
|
|
167
198
|
let sum = 0;
|
|
168
199
|
for (let i = 1; i <= until; i++) {
|