File size: 2,210 Bytes
b60b332
ba1a530
b60b332
7ac420f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b60b332
 
 
 
 
 
 
 
 
 
 
7ac420f
b60b332
7ac420f
b60b332
 
 
7ac420f
b60b332
 
 
 
7ac420f
b60b332
7ac420f
 
 
 
 
b82068f
7ac420f
 
 
 
fd04087
7ac420f
b82068f
 
6649697
 
 
fd04087
b82068f
 
 
 
 
6649697
ba1a530
 
b82068f
c3edc91
 
 
b82068f
ba1a530
 
 
 
b82068f
ba1a530
 
b82068f
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import pandas as pd
import plotly.express as px

# Valores de Junio 2022
TRAMOS = {
    777000: 0,
    1727000: 0.04,
    2878000: 0.08,
    4029000: 0.135,
    5180000: 0.23,
    6906000: 0.304,
    17842000: 0.35,
    99999999: 0.4,
}

TRAMOS_REFORMA = {
    777000: 0,
    1727000: 0.04,
    2878000: 0.08,
    4030000: 0.135,
    5242320: 0.26,
    6331000: 0.35,
    8057000: 0.40,
    99999999: 0.43,
}


def descomponer_en_tramos(sueldo_bruto, tramos=TRAMOS):
    """
    Descompone un sueldo bruto en tramos de impuesto
    """
    descomp = []
    impuestos = []
    tramo_anterior = 0
    for tramo, descuento in tramos.items():
        delta = min(sueldo_bruto, tramo) - tramo_anterior
        if delta > 0:
            descomp.append(delta)
            impuestos.append(int(delta * descuento))
        tramo_anterior = tramo
    return descomp, impuestos


def get_table(sueldo_bruto, tramos=TRAMOS):
    """
    Tabla de Impuestos por tramo
    """
    _tramos = [0] + list(tramos.keys())
    tasas = tramos.values()
    data = list(
        zip(
            _tramos[:-1],
            _tramos[1:],
            tasas,
            *descomponer_en_tramos(sueldo_bruto, tramos),
        )
    )
    df = pd.DataFrame(
        data=data,
        columns=["Desde", "Hasta", "Tasa", "Monto", "Impuesto"],
    )
    style = df.style.format(
        {
            "Desde": "{:,d}",
            "Hasta": "{:,d}",
            "Tasa": "{:.2f}",
            "Monto": "{:,d}",
            "Impuesto": "{:,d}",
        },
        decimal=",",
        thousands=".",
    )
    return df, style


salarios = [
    500_000,
    750_000,
] + [1_000_000 * i for i in range(20)]


def get_curve(descuentos):
    def beneficios(s):
        return max(s - descuentos, 0)

    DF_CURVA = pd.DataFrame(columns=["actual", "reforma"], index=salarios)
    DF_CURVA["actual"] = [sum(descomponer_en_tramos(s, TRAMOS)[1]) for s in salarios]
    DF_CURVA["reforma"] = [
        sum(descomponer_en_tramos(beneficios(s), TRAMOS_REFORMA)[1]) for s in salarios
    ]
    return px.line(
        DF_CURVA,
        title="Impuesto con respecto al salario",
        labels={"value": "Impuesto a pagar", "index": "Renta mensual"},
    )