bdpformulas 1.0.56 → 1.0.58
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/context.d.ts +1 -1
- package/build/index.d.ts +13 -1
- package/build/strategies/agriculture/flujoProyAgr.strategy.d.ts +1 -1
- package/build/strategies/agriculture/flujoProyAgr.strategy.js +16 -7
- package/build/strategies/agriculture/ventas.detail/ventas.calc.js +8 -5
- package/build/strategies/analisisFinancieros.strategy.d.ts +1 -1
- package/build/strategies/analisisFinancieros.strategy.js +10 -6
- package/build/strategies/balance.strategy.d.ts +0 -12
- package/build/strategies/common/analisisFinCalculos/analisisDupont.calc.js +35 -17
- package/build/strategies/common/analisisFinCalculos/analisisGrafico.calc.d.ts +1 -0
- package/build/strategies/common/analisisFinCalculos/analisisGrafico.calc.js +17 -9
- package/build/strategies/common/analisisFinCalculos/apalancamiento.calc.js +49 -26
- package/build/strategies/common/analisisFinCalculos/puntoEquilibrio.calc.js +25 -12
- package/build/strategies/common/analisisFinCalculos/ratios.calc.js +114 -62
- package/build/strategies/common/declaracionJurada.calc.js +1 -1
- package/build/strategies/common/flujoCalculos/flujoConstructor.d.ts +4 -0
- package/build/strategies/common/flujoCalculos/flujoConstructor.js +231 -96
- package/build/strategies/common/flujoCalculos/supuestos.calc.js +21 -27
- package/build/strategies/common/flujoProyectado.calc.js +4 -1
- package/build/strategies/flujoProyectado.strategy.d.ts +1 -1
- package/build/strategies/flujoProyectado.strategy.js +2 -1
- package/build/strategies/index.js +2645 -7280
- package/build/strategies/utils.d.ts +2 -1
- package/build/strategies/utils.js +7 -1
- package/package.json +1 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("../../eeff/admFinanciera/utils");
|
|
4
|
+
const utils_2 = require("../../utils");
|
|
3
5
|
class FlujoConstructor {
|
|
4
6
|
tipo;
|
|
5
7
|
rango;
|
|
@@ -28,9 +30,10 @@ class FlujoConstructor {
|
|
|
28
30
|
this.proyectarCosto();
|
|
29
31
|
this.proyectarGasto();
|
|
30
32
|
this.agregarQuitarClones();
|
|
33
|
+
this.setearCamposAnual();
|
|
31
34
|
// this.moverDetalledesdeMensual()
|
|
32
|
-
this.calcularTotalDetalle(['ACT_CNFL_73000'], 'ACT_CNFL_73900')
|
|
33
|
-
this.calcularTotalDetalle(['ACT_CNFL_61001'], 'ACT_CNFL_61900')
|
|
35
|
+
/* this.calcularTotalDetalle(['ACT_CNFL_73000'], 'ACT_CNFL_73900')
|
|
36
|
+
this.calcularTotalDetalle(['ACT_CNFL_61001'], 'ACT_CNFL_61900') */
|
|
34
37
|
this.calcularOtrosIngresosAnuales();
|
|
35
38
|
this.calcularGastosFamiliares();
|
|
36
39
|
this.calcularFlujoInversiones();
|
|
@@ -44,18 +47,21 @@ class FlujoConstructor {
|
|
|
44
47
|
this.calcularResta('ACT_CNFL_70001', 'ACT_CNFL_70002', 'ACT_CNFL_72000'); //Total Otros Ingresos e Egresos
|
|
45
48
|
this.calcularTotal(['ACT_CNFL_73000'], 'ACT_CNFL_73900');
|
|
46
49
|
this.calcularResta('ACT_CNFL_72000', 'ACT_CNFL_73900', 'ACT_CNFL_79000'); //Resultado Otros Ingresos e Egresos
|
|
47
|
-
this.
|
|
50
|
+
this.calcularTotal(['ACT_CNFL_69999', 'ACT_CNFL_79000'], 'ACT_CNFL_79999'); //Utilidad Neta
|
|
51
|
+
if (this.tipo == 'MENSUAL') {
|
|
52
|
+
this.replicarCuenta('ACT_CNFL_81001', 'ACT_CNFL_80001'); //financiamiento BDP
|
|
53
|
+
}
|
|
48
54
|
this.calcularTotal(['ACT_CNFL_80001', 'ACT_CNFL_80002'], 'ACT_CNFL_80900'); //Total Flujo de Inversión
|
|
49
55
|
this.calcularTotal(['ACT_CNFL_81001'], 'ACT_CNFL_81090'); //subtotal Ingresos de Efectivo
|
|
50
56
|
this.calcularTotal(['ACT_CNFL_81200'], 'ACT_CNFL_81290'); //subtotal Cuota BDP
|
|
51
57
|
this.calcularResta('ACT_CNFL_81090', 'ACT_CNFL_81290', 'ACT_CNFL_82100'); //Total Flujo financiero
|
|
52
58
|
if (this.tipo == 'MENSUAL') {
|
|
53
|
-
this.
|
|
59
|
+
this.calcularFlujoCajaMensual();
|
|
54
60
|
this.calcularFlujoAcumuladoMensual(this.data);
|
|
55
61
|
}
|
|
56
62
|
else if (this.tipo == 'ANUAL') {
|
|
63
|
+
this.calcularExcedenteDeficit();
|
|
57
64
|
this.calcularFlujoAcumuladoAnual();
|
|
58
|
-
this.calcularTotal(['ACT_CNFL_79999', 'ACT_CNFL_80900', 'ACT_CNFL_82100'], 'ACT_CNFL_82110');
|
|
59
65
|
this.adicionarCapacidadPago();
|
|
60
66
|
this.getFlujoEfectivo();
|
|
61
67
|
}
|
|
@@ -70,41 +76,100 @@ class FlujoConstructor {
|
|
|
70
76
|
this.calcularPorcentajeIngresCostos();
|
|
71
77
|
}
|
|
72
78
|
};
|
|
79
|
+
calcularExcedenteDeficit() {
|
|
80
|
+
const filaUtilidad = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_79999_0');
|
|
81
|
+
const filaFlujoInversiones = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_80900_0');
|
|
82
|
+
const filaFlujoFinanciero = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_82100_0');
|
|
83
|
+
const filaExcedente = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_82110_0');
|
|
84
|
+
for (let i = 1; i <= this.rango; i++) {
|
|
85
|
+
filaExcedente[`Monto${i}`] =
|
|
86
|
+
(0, utils_1.ourParseFloat)(filaUtilidad?.[`Monto${i}`]) +
|
|
87
|
+
(0, utils_1.ourParseFloat)(filaFlujoFinanciero?.[`Monto${i}`]) -
|
|
88
|
+
(0, utils_1.ourParseFloat)(filaFlujoInversiones?.[`Monto${i}`]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
setearCamposAnual() {
|
|
92
|
+
const mensualFinanciamientoBdp = (0, utils_2.searchByKeyInMap)(this.data.FlujoProyectadoMensualMap, 'ACT_CNFL_81001');
|
|
93
|
+
const anualFinanciamientoBdp = (0, utils_2.searchByKeyInMap)(this.data.FlujoProyectadoAnualMap, 'ACT_CNFL_81001');
|
|
94
|
+
const anualInversionConFinanciamientoBdp = (0, utils_2.searchByKeyInMap)(this.data.FlujoProyectadoAnualMap, 'ACT_CNFL_80001');
|
|
95
|
+
if (mensualFinanciamientoBdp) {
|
|
96
|
+
const value = (0, utils_1.ourParseFloat)(mensualFinanciamientoBdp.MontoTotal);
|
|
97
|
+
if (anualFinanciamientoBdp)
|
|
98
|
+
anualFinanciamientoBdp['Monto1'] = value;
|
|
99
|
+
if (anualInversionConFinanciamientoBdp)
|
|
100
|
+
anualInversionConFinanciamientoBdp['Monto1'] = value;
|
|
101
|
+
}
|
|
102
|
+
const mensualAportePropio = (0, utils_2.searchByKeyInMap)(this.data.FlujoProyectadoMensualMap, 'ACT_CNFL_80002');
|
|
103
|
+
if (mensualAportePropio) {
|
|
104
|
+
const anualAportePropio = (0, utils_2.searchByKeyInMap)(this.data.FlujoProyectadoAnualMap, 'ACT_CNFL_80002');
|
|
105
|
+
if (anualAportePropio) {
|
|
106
|
+
anualAportePropio['Monto1'] = (0, utils_1.ourParseFloat)(mensualAportePropio.MontoTotal);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
73
110
|
limpiarCamposCalculados = () => {
|
|
74
|
-
|
|
111
|
+
const filter = this.array.filter((item) => item.Clasificador == 'C');
|
|
75
112
|
filter.forEach((item) => {
|
|
76
113
|
for (let i = 1; i <= this.rango; i++) {
|
|
77
114
|
item[`Monto${i}`] = 0;
|
|
78
115
|
}
|
|
79
116
|
});
|
|
80
117
|
};
|
|
118
|
+
calcularFlujoCajaMensual() {
|
|
119
|
+
const utilidad = this.mapObject.get(`ACT_CNFL_79999_0`);
|
|
120
|
+
const totalFlujo = this.mapObject.get(`ACT_CNFL_82100_0`);
|
|
121
|
+
const totalFlujoInversiones = this.mapObject.get(`ACT_CNFL_80900_0`);
|
|
122
|
+
const flujoCajaMensual = this.mapObject.get(`ACT_CNFL_82200_0`);
|
|
123
|
+
for (let i = 1; i <= this.rango; i++) {
|
|
124
|
+
flujoCajaMensual[`Monto${i}`] =
|
|
125
|
+
(0, utils_1.ourParseFloat)(utilidad[`Monto${i}`]) +
|
|
126
|
+
(0, utils_1.ourParseFloat)(totalFlujo[`Monto${i}`]) -
|
|
127
|
+
(0, utils_1.ourParseFloat)(totalFlujoInversiones[`Monto${i}`]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
81
130
|
calcularFlujoAcumuladoMensual = (data) => {
|
|
82
|
-
|
|
83
|
-
|
|
131
|
+
const rowTotal = this.mapObject.get(`ACT_CNFL_82200_0`);
|
|
132
|
+
const rowAcumulado = this.mapObject.get(`ACT_CNFL_82300_0`);
|
|
84
133
|
for (let i = 1; i <= this.rango; i++) {
|
|
85
134
|
if (i == 1) {
|
|
86
|
-
rowAcumulado[`Monto${i}`] =
|
|
135
|
+
rowAcumulado[`Monto${i}`] =
|
|
136
|
+
parseFloat(rowTotal[`Monto${i}`]) +
|
|
137
|
+
parseFloat(data.CajaInicial);
|
|
87
138
|
}
|
|
88
139
|
else {
|
|
89
|
-
rowAcumulado[`Monto${i}`] =
|
|
140
|
+
rowAcumulado[`Monto${i}`] =
|
|
141
|
+
rowTotal[`Monto${i}`] + rowAcumulado[`Monto${i - 1}`];
|
|
90
142
|
}
|
|
91
|
-
rowAcumulado[`Monto${i}`] =
|
|
143
|
+
rowAcumulado[`Monto${i}`] =
|
|
144
|
+
Math.round(rowAcumulado[`Monto${i}`] * 100) / 100;
|
|
92
145
|
}
|
|
93
146
|
};
|
|
94
147
|
calcularTotal = (sumandosArray, total) => {
|
|
95
148
|
const rows = this.array.filter((item) => sumandosArray.includes(item.RubroId));
|
|
96
|
-
|
|
149
|
+
const destino = this.mapObject.get(`${total}_0`);
|
|
97
150
|
rows.map((item) => {
|
|
98
151
|
for (let i = 1; i <= this.rango; i++) {
|
|
99
152
|
destino[`Monto${i}`] += parseFloat(item[`Monto${i}`]);
|
|
100
|
-
destino[`Monto${i}`] =
|
|
153
|
+
destino[`Monto${i}`] =
|
|
154
|
+
Math.round(destino[`Monto${i}`] * 100) / 100;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
replicarCuenta = (cuentaOrigen, cuentaDestino) => {
|
|
159
|
+
const rows = this.array.filter((item) => item.RubroId === cuentaOrigen);
|
|
160
|
+
const destino = this.mapObject.get(`${cuentaDestino}_0`);
|
|
161
|
+
rows.map((item) => {
|
|
162
|
+
for (let i = 1; i <= this.rango; i++) {
|
|
163
|
+
destino[`Monto${i}`] = parseFloat(item[`Monto${i}`]);
|
|
164
|
+
destino[`Monto${i}`] =
|
|
165
|
+
Math.round(destino[`Monto${i}`] * 100) / 100;
|
|
101
166
|
}
|
|
102
167
|
});
|
|
103
168
|
};
|
|
104
169
|
calcularResta = (positivoRubro, negativoRubro, destinoRubro) => {
|
|
105
170
|
const positivo = this.mapObject.get(`${positivoRubro}_0`);
|
|
106
171
|
const negativo = this.mapObject.get(`${negativoRubro}_0`);
|
|
107
|
-
|
|
172
|
+
const destino = this.mapObject.get(`${destinoRubro}_0`);
|
|
108
173
|
for (let i = 1; i <= this.rango; i++) {
|
|
109
174
|
destino[`Monto${i}`] = positivo[`Monto${i}`] - negativo[`Monto${i}`];
|
|
110
175
|
destino[`Monto${i}`] = Math.round(destino[`Monto${i}`] * 100) / 100;
|
|
@@ -116,20 +181,24 @@ class FlujoConstructor {
|
|
|
116
181
|
const rowIngresos = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_40001_0');
|
|
117
182
|
const I10 = 0;
|
|
118
183
|
for (let i = 1; i <= this.rango; i++) {
|
|
184
|
+
const variacion = (0, utils_1.ourParseFloat)(rowVariacionIngresos[`Monto${i}`]) / 100;
|
|
119
185
|
if (i == 1) {
|
|
120
|
-
|
|
186
|
+
const totalIngresos = (0, utils_1.ourParseFloat)(rowTotalIngresoM[`MontoTotal`]);
|
|
187
|
+
rowIngresos[`Monto${i}`] = totalIngresos * (1 + variacion + I10);
|
|
121
188
|
}
|
|
122
189
|
else {
|
|
123
|
-
|
|
190
|
+
const anterior = (0, utils_1.ourParseFloat)(rowIngresos[`Monto${i - 1}`]);
|
|
191
|
+
rowIngresos[`Monto${i}`] = anterior * (1 + variacion + I10);
|
|
124
192
|
}
|
|
125
|
-
rowIngresos[`Monto${i}`] = Math.round(rowIngresos[`Monto${i}`] * 100) / 100;
|
|
126
193
|
}
|
|
127
194
|
if (this.data.TipoConsolidad == 'GANADERIA' &&
|
|
128
195
|
this.data.ParametrosEngorde.Conclusion == 'DESARROLLO_HATO') {
|
|
129
196
|
for (let i = 1; i <= this.rango; i++) {
|
|
130
|
-
rowIngresos[`Monto${i}`] =
|
|
131
|
-
|
|
132
|
-
|
|
197
|
+
rowIngresos[`Monto${i}`] =
|
|
198
|
+
this.data.ParametrosEngorde.SumaDesarrolloAnual[`C-${i}`] *
|
|
199
|
+
(1 + rowVariacionIngresos[`Monto${i}`] + I10);
|
|
200
|
+
rowIngresos[`Monto${i}`] =
|
|
201
|
+
Math.round(rowIngresos[`Monto${i}`] * 100) / 100;
|
|
133
202
|
}
|
|
134
203
|
}
|
|
135
204
|
};
|
|
@@ -139,24 +208,38 @@ class FlujoConstructor {
|
|
|
139
208
|
const rowCosto = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_50001_0');
|
|
140
209
|
const rowTotalIngresoM = this.data.FlujoProyectadoMensualMap.get('ACT_CNFL_49000_0');
|
|
141
210
|
for (let i = 1; i <= this.rango; i++) {
|
|
211
|
+
const variacion = (0, utils_1.ourParseFloat)(rowVariacionCostos[`Monto${i}`]) / 100;
|
|
142
212
|
if (i == 1) {
|
|
143
|
-
|
|
213
|
+
const valorSupuestosCosto = (0, utils_1.ourParseFloat)(this.data.Supuestos.at(0)?.ValorFlujo);
|
|
214
|
+
rowCosto['MontoCajaPercent'] = valorSupuestosCosto;
|
|
215
|
+
rowCosto[`Monto1`] =
|
|
216
|
+
(((0, utils_1.ourParseFloat)(rowIngresos[`Monto1`]) *
|
|
217
|
+
valorSupuestosCosto) /
|
|
218
|
+
100) *
|
|
219
|
+
(1 + variacion);
|
|
144
220
|
}
|
|
145
221
|
else {
|
|
146
|
-
rowCosto[`Monto${i}`] =
|
|
222
|
+
rowCosto[`Monto${i}`] =
|
|
223
|
+
(0, utils_1.ourParseFloat)(rowCosto[`Monto${i - 1}`]) * (1 + variacion);
|
|
147
224
|
}
|
|
148
|
-
rowCosto[`Monto${i}`] = Math.round(rowCosto[`Monto${i}`] * 100) / 100;
|
|
149
225
|
}
|
|
150
226
|
if (this.data.TipoConsolidad == 'GANADERIA' &&
|
|
151
227
|
this.data.ParametrosEngorde.Conclusion != 'DESARROLLO_HATO') {
|
|
152
228
|
for (let i = 1; i <= this.rango; i++) {
|
|
153
229
|
if (i == 1) {
|
|
154
|
-
rowCosto[`Monto1`] =
|
|
230
|
+
rowCosto[`Monto1`] =
|
|
231
|
+
((rowTotalIngresoM[`MontoTotal`] *
|
|
232
|
+
rowCosto.MontoCajaPercent) /
|
|
233
|
+
100) *
|
|
234
|
+
(1 + rowVariacionCostos[`Monto${i}`]);
|
|
155
235
|
}
|
|
156
236
|
else {
|
|
157
|
-
rowCosto[`Monto${i}`] =
|
|
237
|
+
rowCosto[`Monto${i}`] =
|
|
238
|
+
rowIngresos[`Monto${i - 1}`] *
|
|
239
|
+
(1 + rowVariacionCostos[`Monto${i}`]);
|
|
158
240
|
}
|
|
159
|
-
rowCosto[`Monto${i}`] =
|
|
241
|
+
rowCosto[`Monto${i}`] =
|
|
242
|
+
Math.round(rowCosto[`Monto${i}`] * 100) / 100;
|
|
160
243
|
}
|
|
161
244
|
}
|
|
162
245
|
};
|
|
@@ -165,21 +248,27 @@ class FlujoConstructor {
|
|
|
165
248
|
const rowVariacionGastos = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_30003_0');
|
|
166
249
|
const rowGasto = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_60001_0');
|
|
167
250
|
for (let i = 1; i <= this.rango; i++) {
|
|
251
|
+
const variacion = (0, utils_1.ourParseFloat)(rowVariacionGastos[`Monto${i}`]) / 100;
|
|
168
252
|
if (i == 1) {
|
|
169
|
-
|
|
170
|
-
|
|
253
|
+
const valorSupuestosGasto = (0, utils_1.ourParseFloat)(this.data.Supuestos.at(1)?.ValorFlujo);
|
|
254
|
+
rowGasto['MontoCajaPercent'] = valorSupuestosGasto;
|
|
255
|
+
rowGasto[`Monto1`] =
|
|
256
|
+
(((0, utils_1.ourParseFloat)(rowIngresos[`Monto1`]) *
|
|
257
|
+
valorSupuestosGasto) /
|
|
258
|
+
100) *
|
|
259
|
+
(1 + variacion);
|
|
171
260
|
}
|
|
172
261
|
else {
|
|
173
|
-
rowGasto[`Monto${i}`] =
|
|
262
|
+
rowGasto[`Monto${i}`] =
|
|
263
|
+
(0, utils_1.ourParseFloat)(rowGasto[`Monto${i - 1}`]) * (1 + variacion);
|
|
174
264
|
}
|
|
175
|
-
rowGasto[`Monto${i}`] = Math.round(rowGasto[`Monto${i}`] * 100) / 100;
|
|
176
265
|
}
|
|
177
266
|
};
|
|
178
267
|
agregarQuitarClones = () => {
|
|
179
|
-
|
|
268
|
+
const filter = this.data.FlujoProyectadoMensual.filter((item) => item.Clasificador == 'DETL' || item.Clasificador == 'HABM');
|
|
180
269
|
filter.map((item) => {
|
|
181
270
|
if (!this.mapObject.has(`${item.RubroId}_CLONE_${item.UUID}`)) {
|
|
182
|
-
|
|
271
|
+
const newItem = {
|
|
183
272
|
ActividadId: item.ActividadId,
|
|
184
273
|
RubroId: item.RubroId,
|
|
185
274
|
RubroPadreId: item.RubroPadreId,
|
|
@@ -191,7 +280,7 @@ class FlujoConstructor {
|
|
|
191
280
|
Comprar: item.Comprar,
|
|
192
281
|
Variable: item.Variable,
|
|
193
282
|
IndicadorABM: item.IndicadorABM,
|
|
194
|
-
MontoCajaPercent: item.MontoCajaPercent
|
|
283
|
+
MontoCajaPercent: item.MontoCajaPercent
|
|
195
284
|
};
|
|
196
285
|
for (let i = 1; i <= this.rango; i++) {
|
|
197
286
|
newItem[`Monto${i}`] = 0;
|
|
@@ -200,19 +289,22 @@ class FlujoConstructor {
|
|
|
200
289
|
this.mapObject.set(`${item.RubroId}_CLONE_${item.UUID}`, newItem);
|
|
201
290
|
}
|
|
202
291
|
});
|
|
203
|
-
|
|
204
|
-
for (
|
|
205
|
-
|
|
206
|
-
if (!this.data.FlujoProyectadoMensualMap.has(key) &&
|
|
207
|
-
|
|
292
|
+
const anuales = this.array.filter((item) => item.Clasificador == 'DETL' || item.Clasificador == 'HABM');
|
|
293
|
+
for (const anualItem of anuales) {
|
|
294
|
+
const key = `${anualItem.RubroId}_${anualItem.UUID}`.replace('_CLONE', '');
|
|
295
|
+
if (!this.data.FlujoProyectadoMensualMap.has(key) &&
|
|
296
|
+
anualItem.UUID) {
|
|
297
|
+
this.data.FlujoProyectadoAnual =
|
|
298
|
+
this.data.FlujoProyectadoAnual.filter((item) => item.UUID != anualItem.UUID);
|
|
208
299
|
}
|
|
209
300
|
}
|
|
210
301
|
};
|
|
211
302
|
moverDetalledesdeMensual = () => {
|
|
212
|
-
|
|
303
|
+
const filter = this.data.FlujoProyectadoMensual.filter((item) => item.RubroId == 'ACT_CNFL_61001' ||
|
|
304
|
+
item.RubroId == 'ACT_CNFL_73000');
|
|
213
305
|
filter.map((item) => {
|
|
214
306
|
if (this.mapObject.has(`${item.RubroId}_CLONE_${item.UUID}`)) {
|
|
215
|
-
|
|
307
|
+
const detalle = this.mapObject.get(`${item.RubroId}_CLONE_${item.UUID}`);
|
|
216
308
|
if (detalle.Monto1 == 0)
|
|
217
309
|
detalle.Monto1 = item.MontoTotal;
|
|
218
310
|
}
|
|
@@ -220,129 +312,172 @@ class FlujoConstructor {
|
|
|
220
312
|
};
|
|
221
313
|
calcularTotalDetalle = (sumandosArray, total) => {
|
|
222
314
|
const rows = this.array.filter((item) => sumandosArray.includes(item.RubroId) && item.Comprar == 'NO');
|
|
223
|
-
|
|
315
|
+
const destino = this.mapObject.get(`${total}_0`);
|
|
224
316
|
rows.map((item) => {
|
|
225
317
|
for (let i = 1; i <= this.rango; i++) {
|
|
226
318
|
destino[`Monto${i}`] += parseFloat(item[`Monto${i}`]);
|
|
227
|
-
destino[`Monto${i}`] =
|
|
319
|
+
destino[`Monto${i}`] =
|
|
320
|
+
Math.round(destino[`Monto${i}`] * 100) / 100;
|
|
228
321
|
}
|
|
229
322
|
});
|
|
230
323
|
};
|
|
231
324
|
calcularPorcentajeIngresCostos = () => {
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
325
|
+
const filaIngresos = this.array.find((el) => el.RubroId === 'ACT_CNFL_40001');
|
|
326
|
+
const filaCostos = this.array.find((el) => el.RubroId === 'ACT_CNFL_50001');
|
|
327
|
+
const filaGastos = this.array.find((el) => el.RubroId === 'ACT_CNFL_60001');
|
|
328
|
+
if (filaCostos) {
|
|
329
|
+
filaCostos.MontoCajaPercent = Math.abs(((0, utils_1.ourParseFloat)(filaCostos.MontoTotal) /
|
|
330
|
+
(0, utils_1.ourParseFloat)(filaIngresos?.MontoTotal)) *
|
|
331
|
+
100);
|
|
332
|
+
}
|
|
333
|
+
if (filaGastos) {
|
|
334
|
+
filaGastos.MontoCajaPercent = Math.abs(((0, utils_1.ourParseFloat)(filaGastos.MontoTotal) /
|
|
335
|
+
(0, utils_1.ourParseFloat)(filaIngresos?.MontoTotal)) *
|
|
336
|
+
100);
|
|
337
|
+
}
|
|
338
|
+
const otrosIngresos = this.array.filter((el) => el.RubroId === 'ACT_CNFL_40002' && el.IndicadorABM !== 'B');
|
|
339
|
+
const otrosCostos = this.array.filter((el) => el.RubroId === 'ACT_CNFL_50002' && el.IndicadorABM !== 'B');
|
|
340
|
+
otrosCostos.forEach((el, i) => {
|
|
341
|
+
const otroIngresoMonto = (0, utils_1.ourParseFloat)(otrosIngresos.at(i)?.MontoTotal);
|
|
342
|
+
if (otroIngresoMonto > 0) {
|
|
343
|
+
el.MontoCajaPercent = Math.abs(((0, utils_1.ourParseFloat)(el.MontoTotal) / otroIngresoMonto) * 100);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
const otrosGastos = this.array.filter((el) => el.RubroId === 'ACT_CNFL_60002' && el.IndicadorABM !== 'B');
|
|
347
|
+
otrosGastos.forEach((el, i) => {
|
|
348
|
+
const otroIngresoMonto = (0, utils_1.ourParseFloat)(otrosIngresos.at(i)?.MontoTotal);
|
|
349
|
+
if (otroIngresoMonto > 0) {
|
|
350
|
+
el.MontoCajaPercent = Math.abs(((0, utils_1.ourParseFloat)(el.MontoTotal) / otroIngresoMonto) * 100);
|
|
243
351
|
}
|
|
244
352
|
});
|
|
245
353
|
this.data.FlujoProyectadoMensualMap.get('ACT_CNFL_82300_0').MontoCajaPercent = this.data.CajaInicial;
|
|
246
354
|
};
|
|
247
355
|
calcularOtrosIngresosAnuales = () => {
|
|
248
356
|
const rowOtrosIngresosM = this.data.FlujoProyectadoMensualMap.get('ACT_CNFL_70001_0');
|
|
249
|
-
|
|
357
|
+
const rowOtrosIngresosA = this.mapObject.get('ACT_CNFL_70001_0');
|
|
250
358
|
for (let i = 1; i <= this.rango; i++) {
|
|
251
359
|
rowOtrosIngresosA[`Monto${i}`] = rowOtrosIngresosM.MontoTotal;
|
|
252
|
-
rowOtrosIngresosA[`Monto${i}`] =
|
|
360
|
+
rowOtrosIngresosA[`Monto${i}`] =
|
|
361
|
+
Math.round(rowOtrosIngresosA[`Monto${i}`] * 100) / 100;
|
|
253
362
|
}
|
|
254
363
|
};
|
|
255
364
|
calcularGastosFamiliares = () => {
|
|
256
365
|
const rowOtrosIngresosM = this.data.FlujoProyectadoMensualMap.get('ACT_CNFL_70002_0');
|
|
257
|
-
|
|
366
|
+
const rowGastosFamiliares = this.mapObject.get('ACT_CNFL_70002_0');
|
|
258
367
|
if (!rowGastosFamiliares.MontoCajaPercent)
|
|
259
368
|
rowGastosFamiliares.MontoCajaPercent = 0;
|
|
260
369
|
for (let i = 1; i <= this.rango; i++) {
|
|
261
370
|
if (i == 1) {
|
|
262
|
-
rowGastosFamiliares[`Monto${i}`] =
|
|
263
|
-
|
|
371
|
+
rowGastosFamiliares[`Monto${i}`] =
|
|
372
|
+
rowOtrosIngresosM.MontoTotal *
|
|
373
|
+
(1 + rowGastosFamiliares.MontoCajaPercent / 100);
|
|
264
374
|
}
|
|
265
375
|
else {
|
|
266
|
-
rowGastosFamiliares[`Monto${i}`] =
|
|
267
|
-
|
|
376
|
+
rowGastosFamiliares[`Monto${i}`] =
|
|
377
|
+
rowGastosFamiliares[`Monto${i - 1}`] *
|
|
378
|
+
(1 + rowGastosFamiliares.MontoCajaPercent / 100);
|
|
268
379
|
}
|
|
269
|
-
rowGastosFamiliares[`Monto${i}`] =
|
|
380
|
+
rowGastosFamiliares[`Monto${i}`] =
|
|
381
|
+
Math.round(rowGastosFamiliares[`Monto${i}`] * 100) / 100;
|
|
270
382
|
}
|
|
271
383
|
};
|
|
272
384
|
calcularFlujoInversiones = () => {
|
|
273
385
|
const rowInversionM = this.data.FlujoProyectadoMensualMap.get('ACT_CNFL_80001_0');
|
|
274
386
|
const rowAportePropioM = this.data.FlujoProyectadoMensualMap.get('ACT_CNFL_80002_0');
|
|
275
|
-
|
|
276
|
-
|
|
387
|
+
const rowInversion = this.mapObject.get('ACT_CNFL_80001_0');
|
|
388
|
+
const rowAportePropio = this.mapObject.get('ACT_CNFL_80002_0');
|
|
277
389
|
if (rowInversion.Monto1 > 0)
|
|
278
390
|
rowInversion.Monto1 = rowInversionM.MontoTotal;
|
|
279
391
|
if (rowAportePropio.Monto1 > 0)
|
|
280
392
|
rowAportePropio.Monto1 = rowAportePropioM.MontoTotal;
|
|
281
393
|
};
|
|
282
394
|
calcularFlujoAcumuladoAnual = () => {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
395
|
+
const flujoAcumulado = this.mapObject.get('ACT_CNFL_82300_0');
|
|
396
|
+
const excedente = this.mapObject.get('ACT_CNFL_82110_0');
|
|
397
|
+
const saldoInicialCaja = this.mapObject.get('ACT_CNFL_82120_0');
|
|
286
398
|
saldoInicialCaja.Monto1 = this.data.CajaInicial;
|
|
287
399
|
for (let i = 1; i <= this.rango; i++) {
|
|
288
400
|
if (i == 1) {
|
|
289
|
-
flujoAcumulado[`Monto${i}`] =
|
|
290
|
-
parseFloat(
|
|
401
|
+
flujoAcumulado[`Monto${i}`] =
|
|
402
|
+
parseFloat(excedente[`Monto${i}`]) +
|
|
403
|
+
parseFloat(saldoInicialCaja[`Monto${i}`]);
|
|
291
404
|
}
|
|
292
405
|
else {
|
|
293
|
-
flujoAcumulado[`Monto${i}`] =
|
|
294
|
-
parseFloat(
|
|
406
|
+
flujoAcumulado[`Monto${i}`] =
|
|
407
|
+
parseFloat(flujoAcumulado[`Monto${i - 1}`]) +
|
|
408
|
+
parseFloat(excedente[`Monto${i}`]);
|
|
295
409
|
}
|
|
296
|
-
flujoAcumulado[`Monto${i}`] = Math.round(flujoAcumulado[`Monto${i}`] * 100) / 100;
|
|
297
410
|
}
|
|
298
411
|
};
|
|
299
412
|
adicionarCapacidadPago = () => {
|
|
300
|
-
const utilidadNeta = this.mapObject.get('
|
|
301
|
-
const cuotaBdp = this.mapObject.get('
|
|
302
|
-
|
|
413
|
+
const utilidadNeta = this.mapObject.get('ACT_CNFL_79999_0');
|
|
414
|
+
const cuotaBdp = this.mapObject.get('ACT_CNFL_81290_0');
|
|
415
|
+
const result = {};
|
|
303
416
|
let acumulado = 0;
|
|
417
|
+
let acumuladoCapacidad = 0;
|
|
304
418
|
for (let i = 2; i <= this.rango; i++) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
419
|
+
const utilidad = (0, utils_1.ourParseFloat)(utilidadNeta?.[`Monto${i - 1}`]);
|
|
420
|
+
if (utilidad) {
|
|
421
|
+
result[`Monto${i}`] =
|
|
422
|
+
Math.abs((0, utils_1.ourParseFloat)(cuotaBdp?.[`Monto${i - 1}`]) / utilidad) * 100;
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
308
425
|
result[`Monto${i}`] = 0;
|
|
309
|
-
|
|
310
|
-
|
|
426
|
+
}
|
|
427
|
+
if (i <= this.rango - 1)
|
|
428
|
+
acumulado += result[`Monto${i}`];
|
|
429
|
+
if (i <= 10)
|
|
430
|
+
acumuladoCapacidad += result[`Monto${i}`];
|
|
311
431
|
}
|
|
312
|
-
|
|
313
|
-
result.
|
|
432
|
+
const plazoAños = (0, utils_1.ourParseFloat)(this.data.Parametros.PlazoCredito);
|
|
433
|
+
result.PorcentajePromedio = plazoAños > 0 ? acumulado / plazoAños : 0;
|
|
434
|
+
result.CapacidadMaxima =
|
|
435
|
+
acumuladoCapacidad / 10 <= 80 ? 'VERDADERO' : 'FALSO';
|
|
314
436
|
this.data.Pie = result;
|
|
315
437
|
};
|
|
316
438
|
getFlujoEfectivo = () => {
|
|
317
|
-
const tasaDescuento =
|
|
439
|
+
const tasaDescuento = (0, utils_1.ourParseFloat)(this.data.Parametros.TasaDescuento) / 100;
|
|
318
440
|
const totalFlujoInversiones = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_80900_0');
|
|
319
441
|
const excedente = this.data.FlujoProyectadoAnualMap.get('ACT_CNFL_82110_0');
|
|
320
|
-
|
|
321
|
-
|
|
442
|
+
const result = [];
|
|
443
|
+
const resultMap = new Map();
|
|
322
444
|
let indiceRentabilidad = 0;
|
|
323
445
|
for (let i = 0; i <= this.rango; i++) {
|
|
324
446
|
let value = {};
|
|
325
447
|
if (i == 0) {
|
|
326
|
-
value = {
|
|
448
|
+
value = {
|
|
449
|
+
Anno: i,
|
|
450
|
+
FlujoDeEfectivo: -totalFlujoInversiones[`Monto1`],
|
|
451
|
+
FlujoEfectivoDescontado: 0
|
|
452
|
+
};
|
|
327
453
|
result.push(value);
|
|
328
454
|
resultMap.set(i, value);
|
|
329
455
|
}
|
|
330
456
|
else {
|
|
331
|
-
value = {
|
|
457
|
+
value = {
|
|
458
|
+
Anno: i,
|
|
459
|
+
FlujoDeEfectivo: excedente[`Monto${i}`],
|
|
460
|
+
FlujoEfectivoDescontado: 0
|
|
461
|
+
};
|
|
332
462
|
result.push(value);
|
|
333
463
|
resultMap.set(i, value);
|
|
334
464
|
}
|
|
335
|
-
|
|
336
|
-
|
|
465
|
+
const valueFlujo = value.FlujoDeEfectivo / Math.pow(1 + tasaDescuento, i);
|
|
466
|
+
value.FlujoEfectivoDescontado = valueFlujo;
|
|
467
|
+
if (i > 0) {
|
|
468
|
+
indiceRentabilidad += valueFlujo;
|
|
469
|
+
}
|
|
337
470
|
}
|
|
338
|
-
indiceRentabilidad
|
|
339
|
-
const VAN = calcularVAN(tasaDescuento, result
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
471
|
+
indiceRentabilidad /= -totalFlujoInversiones[`Monto1`];
|
|
472
|
+
const VAN = calcularVAN(tasaDescuento, result
|
|
473
|
+
.filter((item) => item.Anno > 0)
|
|
474
|
+
.map((item) => item.FlujoDeEfectivo), totalFlujoInversiones[`Monto1`]);
|
|
475
|
+
const TIR = calcularTIR(result.map((item) => item.FlujoDeEfectivo), totalFlujoInversiones[`Monto1`]);
|
|
476
|
+
const vars = [
|
|
477
|
+
{ Descripcion: 'Tasa de descuento', Valor: tasaDescuento },
|
|
343
478
|
{ Descripcion: 'VAN', Valor: VAN },
|
|
344
479
|
{ Descripcion: 'TIR', Valor: TIR },
|
|
345
|
-
{ Descripcion: 'Índice de Rentabilidad', Valor: indiceRentabilidad }
|
|
480
|
+
{ Descripcion: 'Índice de Rentabilidad', Valor: indiceRentabilidad }
|
|
346
481
|
];
|
|
347
482
|
this.data.FlujoDeEfectivo = result;
|
|
348
483
|
this.data.FlujoEfectivoVars = vars;
|
|
@@ -360,8 +495,8 @@ const calcularTIR = (flujosDeCaja, inversionInicial, precision = 1e-6) => {
|
|
|
360
495
|
let tasaMin = 0;
|
|
361
496
|
let tasaMax = 1;
|
|
362
497
|
let tasaMed = (tasaMin + tasaMax) / 2;
|
|
363
|
-
while (
|
|
364
|
-
|
|
498
|
+
while (tasaMax - tasaMin > precision) {
|
|
499
|
+
const VAN = calcularVAN(tasaMed, flujosDeCaja, inversionInicial);
|
|
365
500
|
if (VAN > 0) {
|
|
366
501
|
tasaMin = tasaMed;
|
|
367
502
|
}
|