~marcelo-escobal/geined/Alianza

68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
108 by Marcelo Escobal
Info sobre la base de datos
3
"""Clases para liquidación de sueldos"""
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
4
import decimal
5
class Irpf():
6
    """Clase para liquidar irpf"""
7
    def __init__(self, variables, liquidacion, detalle, empleado):
8
        """Inicializar la clase"""
9
        # Parametros
10
        self.detalle = detalle
11
        self.liquidacion = liquidacion
12
        self.variables = variables
13
        self.empleado = empleado
14
        self.bcp = variables["bcp"]
15
        # Variables expuestas
16
        self.monto_gravado = detalle["nominal"] + detalle["aguinaldo"]
17
        self.monto_a_deducir = 0
18
        self.calculo_monto_a_deducir()
19
        self.tramos_irpf = list()
20
        self.porcentajes_irpf = list()
21
        self.escala_deducible = list()
22
        self.porcentajes_deducible = list()
23
        self.tramos_deducible = list()
24
        self.monto_gravado_irpf = list()
25
        self.monto_irpf = list()
26
        self.monto_deducible = list()
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
27
        self.ded_por_hijos = 0
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
28
        self.irpf_sobre_monto_gravado = 0
29
        self.irpf_total = 0
30
        self.deduccion_total = 0
31
        self.cess = 0
32
        self.llenar_escalas()
33
    def llenar_escalas(self):
34
        """Llenar escalas de deducible e IRPF"""
35
        self.tramos_irpf = [7 * self.bcp, 10 * self.bcp, 15 * self.bcp, 
36
            50 * self.bcp, 100 * self.bcp]
37
        if self.empleado["emni"] != 0:
38
            self.porcentajes_irpf = [10, 15, 20, 22, 25]
39
        else:
40
            self.porcentajes_irpf = [0,  10, 15, 20, 22, 25]
41
        self.porcentajes_deducible = [10, 15, 22, 25]
108 by Marcelo Escobal
Info sobre la base de datos
42
        self.tramos_deducible = [3 * self.bcp, 8 * self.bcp, 
43
                                 43 * self.bcp, 93 * self.bcp]
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
44
    def llenar_irpf(self):
45
        """Llenar valores de IRPF"""
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
46
        for contador in range(0, 4):
47
            self.monto_irpf[contador] = 0
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
48
        piso = 0
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
49
        cont = 0
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
50
        monto = 0
51
        for item in self.tramos_irpf:
52
            if self.monto_gravado <= piso:
53
                # si el monto es MENOR que el tramo anterior:
54
                monto = 0
55
            elif (self.monto_gravado > piso) and (self.monto_gravado <= item):
56
                # si el monto esta DENTRO del tramo:
57
                monto = self.monto_gravado - piso
58
            else: 
59
                # si el monto supera al tramo:
60
                monto = item
61
            self.monto_gravado_irpf.append(monto)
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
62
            monto_tramo_actual = self.monto_gravado * \
63
                self.porcentajes_irpf[cont]
64
            self.monto_irpf[cont] = monto_tramo_actual
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
65
            self.irpf_total = self.irpf_total + monto_tramo_actual
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
66
            cont = cont + 1
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
67
            piso = item
68
        piso = 0
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
69
        contador = 0
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
70
        monto = 0
71
        for item in self.tramos_deducible:
72
            if self.monto_deducible <= piso:
73
                # si el monto es MENOR que el tramo anterior
74
                monto = 0
108 by Marcelo Escobal
Info sobre la base de datos
75
            elif (self.monto_deducible > piso) and \
76
                (self.monto_deducible <= item):
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
77
                # si el monto esta DENTRO del tramo
78
                monto = self.monto_deducible - piso
79
            else:
80
                # si el monto supera el tramo
81
                monto = item
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
82
            monto_deduccion_actual = monto * \
83
                self.porcentajes_deducible[contador]
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
84
            self.monto_deducible.append(monto_deduccion_actual)
85
            self.deduccion_total = self.deduccion_total + monto_deduccion_actual
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
86
            contador = contador + 1
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
87
            piso = item  
88
    def calculo_monto_a_deducir(self):
89
        """Cálculo del monto a deducir"""
90
        # Calculo cuota mutual
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
91
        self.ded_por_hijos = self.empleado["hijos"] * 13 * \
108 by Marcelo Escobal
Info sobre la base de datos
92
            self.variables["bcp"] / 12
93
        self.cess = self.detalle["bps"] + self.detalle["disse"] + \
94
            self.detalle["frl"]
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
95
        self.monto_a_deducir = decimal.Decimal(str(self.ded_por_hijos)) + \
108 by Marcelo Escobal
Info sobre la base de datos
96
            self.cess + self.detalle["cjp"]
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
97
class Sueldos():
98
    """Clase para liquidar sueldos"""
99
    def __init__(self, variables, empleado, detalle):
100
        """Inicializar"""
101
        # Variables expuestas
102
        self.empleado = empleado
103
        self.variables = variables
104
        self.detalle = detalle
105
        self.aguinaldo = detalle["aguinaldo"]
108 by Marcelo Escobal
Info sobre la base de datos
106
        self.cess = self.cess = self.detalle["bps"] + self.detalle["disse"] + \
107
            self.detalle["frl"]
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
108
        self.aporte_jubilatorio = 0
109
        self.fonasa = 0
81 by Marcelo escobal
Nuevo calculo de sueldos
110
        self.porcentaje_fonasa = decimal.Decimal("0")
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
111
        self.frl = 0
112
        self.aporte_personal = 0
113
        self.monto_gravado_irpf = 0
114
        self.calculo_ss()
115
        self.calculo_partidas_percibidas()
116
        self.calculo_aportes_personales()
117
    def calculo_partidas_percibidas(self):
118
        """Calculo de partidas percibidas"""
119
        pass
120
    def calculo_aportes_personales(self):
121
        """Calculo de aportes personales"""
81 by Marcelo escobal
Nuevo calculo de sueldos
122
        self.aporte_jubilatorio = self.cess * decimal.Decimal("0.15")
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
123
        self.fonasa = self.cess * self.porcentaje_fonasa
81 by Marcelo escobal
Nuevo calculo de sueldos
124
        self.frl = self.cess * decimal.Decimal("0.0125")
108 by Marcelo Escobal
Info sobre la base de datos
125
        self.monto_gravado_irpf = self.detalle["nominal"] + \
126
            self.detalle["aguinaldo"]
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
127
    def calculo_ss(self):
128
        """Calculo segun codigo de Seg Soc"""
108 by Marcelo Escobal
Info sobre la base de datos
129
        # Cálculo de aportes a FONASA según categoría
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
130
        porcentaje = 0
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
131
        limite = self.detalle["nominal"] / \
132
            decimal.Decimal(str(self.variables['bcp']))
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
133
        # si el límite es <= 2.5 BCP y NO es vitalicio, el porcentaje es 3
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
134
        css = self.empleado['codigoss']
135
        porc = {1:[3, 6], 2:[3, 6], 5:[3, 6], 
136
                15:[3, 4.5], 28:[3, 4.5], 25:[3, 4.5],
137
                17:[5, 6.5], 27:[5, 6.5], 30:[5, 6.5],
138
                16:[5, 8], 26:[5, 8], 29:[5, 8],
139
                22:[0, 0], 21:[3, 3], 24:[2, 2], 23:[5, 5]}
140
        if css in porc:
141
            if limite < 2.5:
142
                porcentaje = porc[css][0]
143
            else:
144
                porcentaje = porc[css][1]
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
145
        else:
109 by Marcelo Escobal
Conversión cálculo aportes fonasa
146
            # Error silenciado explicitamente
147
            # Debería ser atrapado con mensaje
148
            # Tengo flojera
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
149
            porcentaje = 0
81 by Marcelo escobal
Nuevo calculo de sueldos
150
        self.porcentaje_fonasa = decimal.Decimal(str(porcentaje))
68 by Marcelo escobal
Parte de nueva liquidacion de sueldos. Commit previo a viaje
151
if __name__ == "__main__":
81 by Marcelo escobal
Nuevo calculo de sueldos
152
    print("Es un módulo no ejecutable.")