Spaces:
Runtime error
Runtime error
black
Browse files- app.py +24 -11
- impuestos.py +29 -6
app.py
CHANGED
@@ -26,33 +26,42 @@ def aplicar_beneficios(sueldo_bruto):
|
|
26 |
)
|
27 |
return sueldo_bruto - min(arriendo, TOPES.arriendo) - min(cuidado, TOPES.cuidado)
|
28 |
|
|
|
29 |
def itanum(x):
|
30 |
"Format number on roman style"
|
31 |
-
return format(x,
|
|
|
32 |
|
33 |
def decimal(x):
|
34 |
-
return format(x,
|
|
|
35 |
|
36 |
def main() -> None:
|
37 |
-
st.header(
|
|
|
|
|
38 |
|
39 |
with st.expander("Como se usa esta cosa?"):
|
40 |
st.write(Path("info.md").read_text())
|
41 |
|
42 |
sueldo_bruto = st.number_input(
|
43 |
-
"Sueldo Bruto Mensual",
|
|
|
|
|
|
|
44 |
)
|
45 |
|
46 |
# calcular nueva base imponible
|
47 |
sueldo_bruto_reforma = aplicar_beneficios(sueldo_bruto)
|
48 |
|
49 |
-
st.markdown(
|
50 |
-
|
|
|
51 |
|
52 |
# tabla de impuestos
|
53 |
table_section = st.container()
|
54 |
col1, col2 = table_section.columns((0.5, 0.5))
|
55 |
-
|
56 |
col1.subheader("Tabla de Impuestos Actual")
|
57 |
table, style = get_table(sueldo_bruto, TRAMOS)
|
58 |
col1.dataframe(style)
|
@@ -62,20 +71,24 @@ def main() -> None:
|
|
62 |
table, style = get_table(sueldo_bruto_reforma, TRAMOS_REFORMA)
|
63 |
col2.dataframe(style)
|
64 |
total_reforma = table["Impuesto"].sum()
|
65 |
-
|
66 |
# Resultados
|
67 |
results_section = st.container()
|
68 |
col1, col2 = results_section.columns((0.5, 0.5))
|
69 |
-
col1.markdown(
|
|
|
|
|
70 |
explanation = f"### Total Impuesto con Reforma: \nPagarás **${itanum(total_reforma)}** que representa **({decimal(100*(total_reforma/sueldo_bruto))}\%)** de tasa efectiva"
|
71 |
if total_reforma < total:
|
72 |
explanation += " (Pagas menos que antes dado que estas beneficiando del descuento propocinado por los beneficios tributarios de arriendo y/o cuidado. Tu monto imponible es mas bajo que antes)"
|
73 |
col2.markdown(explanation)
|
74 |
|
75 |
-
|
76 |
-
|
|
|
77 |
st.plotly_chart(get_curve(0), use_container_width=True)
|
78 |
|
|
|
79 |
if __name__ == "__main__":
|
80 |
st.set_page_config(
|
81 |
"Calculador de impuestos",
|
|
|
26 |
)
|
27 |
return sueldo_bruto - min(arriendo, TOPES.arriendo) - min(cuidado, TOPES.cuidado)
|
28 |
|
29 |
+
|
30 |
def itanum(x):
|
31 |
"Format number on roman style"
|
32 |
+
return format(x, ",d").replace(",", ".")
|
33 |
+
|
34 |
|
35 |
def decimal(x):
|
36 |
+
return format(x, ".2f").replace(".", ",")
|
37 |
+
|
38 |
|
39 |
def main() -> None:
|
40 |
+
st.header(
|
41 |
+
"Calcula tu impuesto a la renta :moneybag: :dollar: :bar_chart: con la Reforma Tributaria"
|
42 |
+
)
|
43 |
|
44 |
with st.expander("Como se usa esta cosa?"):
|
45 |
st.write(Path("info.md").read_text())
|
46 |
|
47 |
sueldo_bruto = st.number_input(
|
48 |
+
"Sueldo Bruto Mensual",
|
49 |
+
value=1500000,
|
50 |
+
min_value=300000,
|
51 |
+
format="%d",
|
52 |
)
|
53 |
|
54 |
# calcular nueva base imponible
|
55 |
sueldo_bruto_reforma = aplicar_beneficios(sueldo_bruto)
|
56 |
|
57 |
+
st.markdown(
|
58 |
+
f"Tu sueldo imponible antes de impuestos con la reforma es: {sueldo_bruto_reforma} (incluye los descuentos asociados a los beneficios)"
|
59 |
+
)
|
60 |
|
61 |
# tabla de impuestos
|
62 |
table_section = st.container()
|
63 |
col1, col2 = table_section.columns((0.5, 0.5))
|
64 |
+
|
65 |
col1.subheader("Tabla de Impuestos Actual")
|
66 |
table, style = get_table(sueldo_bruto, TRAMOS)
|
67 |
col1.dataframe(style)
|
|
|
71 |
table, style = get_table(sueldo_bruto_reforma, TRAMOS_REFORMA)
|
72 |
col2.dataframe(style)
|
73 |
total_reforma = table["Impuesto"].sum()
|
74 |
+
|
75 |
# Resultados
|
76 |
results_section = st.container()
|
77 |
col1, col2 = results_section.columns((0.5, 0.5))
|
78 |
+
col1.markdown(
|
79 |
+
f"### Total Impuesto: \nActualmente pagas **${itanum(total)}** que representa **({decimal(100*(total/sueldo_bruto))}\%)** de tasa efectiva"
|
80 |
+
)
|
81 |
explanation = f"### Total Impuesto con Reforma: \nPagarás **${itanum(total_reforma)}** que representa **({decimal(100*(total_reforma/sueldo_bruto))}\%)** de tasa efectiva"
|
82 |
if total_reforma < total:
|
83 |
explanation += " (Pagas menos que antes dado que estas beneficiando del descuento propocinado por los beneficios tributarios de arriendo y/o cuidado. Tu monto imponible es mas bajo que antes)"
|
84 |
col2.markdown(explanation)
|
85 |
|
86 |
+
st.markdown(
|
87 |
+
"### Objectivo de la reforma \nEn el siguiente grafico se ve claramente que la reforma empieza a tener efecto a partir de los 4 millones (pero muy lentamente 😱). Por ejemplo con 8 millones mensuales la diferencia es solo de $200.000 mensual."
|
88 |
+
)
|
89 |
st.plotly_chart(get_curve(0), use_container_width=True)
|
90 |
|
91 |
+
|
92 |
if __name__ == "__main__":
|
93 |
st.set_page_config(
|
94 |
"Calculador de impuestos",
|
impuestos.py
CHANGED
@@ -52,28 +52,51 @@ def get_table(sueldo_bruto, tramos=TRAMOS):
|
|
52 |
_tramos[:-1],
|
53 |
_tramos[1:],
|
54 |
tasas,
|
55 |
-
*descomponer_en_tramos(sueldo_bruto, tramos)
|
56 |
)
|
57 |
)
|
58 |
df = pd.DataFrame(
|
59 |
data=data,
|
60 |
columns=["Desde", "Hasta", "Tasa", "Monto imponible", "Impuesto"],
|
61 |
)
|
62 |
-
style = df.style.format(
|
|
|
63 |
"Desde": "{:,d}",
|
64 |
"Hasta": "{:,d}",
|
65 |
"Tasa": "{:.2f}",
|
66 |
"Monto imponible": "{:,d}",
|
67 |
-
"Impuesto": "{:,d}"
|
|
|
|
|
|
|
|
|
68 |
return df, style
|
69 |
|
70 |
|
71 |
-
salarios = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
|
73 |
def get_curve(descuentos):
|
74 |
def beneficios(s):
|
75 |
return max(s - descuentos, 0)
|
|
|
76 |
DF_CURVA = pd.DataFrame(columns=["actual", "reforma"], index=salarios)
|
77 |
DF_CURVA["actual"] = [sum(descomponer_en_tramos(s, TRAMOS)[1]) for s in salarios]
|
78 |
-
DF_CURVA["reforma"] = [
|
79 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
_tramos[:-1],
|
53 |
_tramos[1:],
|
54 |
tasas,
|
55 |
+
*descomponer_en_tramos(sueldo_bruto, tramos),
|
56 |
)
|
57 |
)
|
58 |
df = pd.DataFrame(
|
59 |
data=data,
|
60 |
columns=["Desde", "Hasta", "Tasa", "Monto imponible", "Impuesto"],
|
61 |
)
|
62 |
+
style = df.style.format(
|
63 |
+
{
|
64 |
"Desde": "{:,d}",
|
65 |
"Hasta": "{:,d}",
|
66 |
"Tasa": "{:.2f}",
|
67 |
"Monto imponible": "{:,d}",
|
68 |
+
"Impuesto": "{:,d}",
|
69 |
+
},
|
70 |
+
decimal=",",
|
71 |
+
thousands=".",
|
72 |
+
)
|
73 |
return df, style
|
74 |
|
75 |
|
76 |
+
salarios = [
|
77 |
+
450_000,
|
78 |
+
1000_000,
|
79 |
+
1_500_000,
|
80 |
+
2_000_000,
|
81 |
+
3_000_000,
|
82 |
+
5_000_000,
|
83 |
+
8_000_000,
|
84 |
+
10_000_000,
|
85 |
+
15_000_000,
|
86 |
+
]
|
87 |
+
|
88 |
|
89 |
def get_curve(descuentos):
|
90 |
def beneficios(s):
|
91 |
return max(s - descuentos, 0)
|
92 |
+
|
93 |
DF_CURVA = pd.DataFrame(columns=["actual", "reforma"], index=salarios)
|
94 |
DF_CURVA["actual"] = [sum(descomponer_en_tramos(s, TRAMOS)[1]) for s in salarios]
|
95 |
+
DF_CURVA["reforma"] = [
|
96 |
+
sum(descomponer_en_tramos(beneficios(s), TRAMOS_REFORMA)[1]) for s in salarios
|
97 |
+
]
|
98 |
+
return px.line(
|
99 |
+
DF_CURVA,
|
100 |
+
title="Impuesto con respecto al salario",
|
101 |
+
labels={"value": "Impuesto a pagar", "index": "Renta mensual"},
|
102 |
+
)
|