~marcelo-escobal/geined/Alianza

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Clases para liquidación de sueldos"""
import decimal
class Irpf():
    """Clase para liquidar irpf"""
    def __init__(self, variables, liquidacion, detalle, empleado):
        """Inicializar la clase"""
        # Parametros
        self.detalle = detalle
        self.liquidacion = liquidacion
        self.variables = variables
        self.empleado = empleado
        self.bcp = variables["bcp"]
        # Variables expuestas
        self.monto_gravado = detalle["nominal"] + detalle["aguinaldo"]
        self.monto_a_deducir = 0
        self.calculo_monto_a_deducir()
        self.tramos_irpf = list()
        self.porcentajes_irpf = list()
        self.escala_deducible = list()
        self.porcentajes_deducible = list()
        self.tramos_deducible = list()
        self.monto_gravado_irpf = list()
        self.monto_irpf = list()
        self.monto_deducible = list()
        self.ded_por_hijos = 0
        self.irpf_sobre_monto_gravado = 0
        self.irpf_total = 0
        self.deduccion_total = 0
        self.cess = 0
        self.llenar_escalas()
    def llenar_escalas(self):
        """Llenar escalas de deducible e IRPF"""
        self.tramos_irpf = [7 * self.bcp, 10 * self.bcp, 15 * self.bcp, 
            50 * self.bcp, 100 * self.bcp]
        if self.empleado["emni"] != 0:
            self.porcentajes_irpf = [10, 15, 20, 22, 25]
        else:
            self.porcentajes_irpf = [0,  10, 15, 20, 22, 25]
        self.porcentajes_deducible = [10, 15, 22, 25]
        self.tramos_deducible = [3 * self.bcp, 8 * self.bcp, 
                                 43 * self.bcp, 93 * self.bcp]
    def llenar_irpf(self):
        """Llenar valores de IRPF"""
        for contador in range(0, 4):
            self.monto_irpf[contador] = 0
        piso = 0
        cont = 0
        monto = 0
        for item in self.tramos_irpf:
            if self.monto_gravado <= piso:
                # si el monto es MENOR que el tramo anterior:
                monto = 0
            elif (self.monto_gravado > piso) and (self.monto_gravado <= item):
                # si el monto esta DENTRO del tramo:
                monto = self.monto_gravado - piso
            else: 
                # si el monto supera al tramo:
                monto = item
            self.monto_gravado_irpf.append(monto)
            monto_tramo_actual = self.monto_gravado * \
                self.porcentajes_irpf[cont]
            self.monto_irpf[cont] = monto_tramo_actual
            self.irpf_total = self.irpf_total + monto_tramo_actual
            cont = cont + 1
            piso = item
        piso = 0
        contador = 0
        monto = 0
        for item in self.tramos_deducible:
            if self.monto_deducible <= piso:
                # si el monto es MENOR que el tramo anterior
                monto = 0
            elif (self.monto_deducible > piso) and \
                (self.monto_deducible <= item):
                # si el monto esta DENTRO del tramo
                monto = self.monto_deducible - piso
            else:
                # si el monto supera el tramo
                monto = item
            monto_deduccion_actual = monto * \
                self.porcentajes_deducible[contador]
            self.monto_deducible.append(monto_deduccion_actual)
            self.deduccion_total = self.deduccion_total + monto_deduccion_actual
            contador = contador + 1
            piso = item  
    def calculo_monto_a_deducir(self):
        """Cálculo del monto a deducir"""
        # Calculo cuota mutual
        self.ded_por_hijos = self.empleado["hijos"] * 13 * \
            self.variables["bcp"] / 12
        self.cess = self.detalle["bps"] + self.detalle["disse"] + \
            self.detalle["frl"]
        self.monto_a_deducir = decimal.Decimal(str(self.ded_por_hijos)) + \
            self.cess + self.detalle["cjp"]
class Sueldos():
    """Clase para liquidar sueldos"""
    def __init__(self, variables, empleado, detalle):
        """Inicializar"""
        # Variables expuestas
        self.empleado = empleado
        self.variables = variables
        self.detalle = detalle
        self.aguinaldo = detalle["aguinaldo"]
        self.cess = self.cess = self.detalle["bps"] + self.detalle["disse"] + \
            self.detalle["frl"]
        self.aporte_jubilatorio = 0
        self.fonasa = 0
        self.porcentaje_fonasa = decimal.Decimal("0")
        self.frl = 0
        self.aporte_personal = 0
        self.monto_gravado_irpf = 0
        self.calculo_ss()
        self.calculo_partidas_percibidas()
        self.calculo_aportes_personales()
    def calculo_partidas_percibidas(self):
        """Calculo de partidas percibidas"""
        pass
    def calculo_aportes_personales(self):
        """Calculo de aportes personales"""
        self.aporte_jubilatorio = self.cess * decimal.Decimal("0.15")
        self.fonasa = self.cess * self.porcentaje_fonasa
        self.frl = self.cess * decimal.Decimal("0.0125")
        self.monto_gravado_irpf = self.detalle["nominal"] + \
            self.detalle["aguinaldo"]
    def calculo_ss(self):
        """Calculo segun codigo de Seg Soc"""
        # Cálculo de aportes a FONASA según categoría
        porcentaje = 0
        limite = self.detalle["nominal"] / \
            decimal.Decimal(str(self.variables['bcp']))
        # si el límite es <= 2.5 BCP y NO es vitalicio, el porcentaje es 3
        css = self.empleado['codigoss']
        porc = {1:[3, 6], 2:[3, 6], 5:[3, 6], 
                15:[3, 4.5], 28:[3, 4.5], 25:[3, 4.5],
                17:[5, 6.5], 27:[5, 6.5], 30:[5, 6.5],
                16:[5, 8], 26:[5, 8], 29:[5, 8],
                22:[0, 0], 21:[3, 3], 24:[2, 2], 23:[5, 5]}
        if css in porc:
            if limite < 2.5:
                porcentaje = porc[css][0]
            else:
                porcentaje = porc[css][1]
        else:
            # Error silenciado explicitamente
            # Debería ser atrapado con mensaje
            # Tengo flojera
            porcentaje = 0
        self.porcentaje_fonasa = decimal.Decimal(str(porcentaje))
if __name__ == "__main__":
    print("Es un módulo no ejecutable.")