Cálculo de Prestaciones Laborales (Código Fuente)
Código fuente Python para el cálculo de las prestaciones laborales según la legislación dominicana.
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
-
- import datetime
-
-
- PERIODOS = ["MENSUAL", "QUINCENAL", "SEMANAL", "DIARIO", "POR HORA"]
-
- FACTOR_DIVISOR_POR_HORA = 571.92
- FACTOR_DIVISOR_DIARIO = 23.83
- FACTOR_DIVISOR_SEMANAL = 4.33
- FACTOR_DIVISOR_QUINCENAL = 2
- FACTOR_DIVISOR_MENSUAL = 1
- FACTOR_DIVISOR = {PERIODOS[0]: FACTOR_DIVISOR_MENSUAL,
- PERIODOS[1]: FACTOR_DIVISOR_QUINCENAL,
- PERIODOS[2]: FACTOR_DIVISOR_SEMANAL,
- PERIODOS[3]: FACTOR_DIVISOR_DIARIO,
- PERIODOS[4]: FACTOR_DIVISOR_POR_HORA}
-
- #Entrada en vigencia del actual Codigo de Trabajo.
- FECHA_ENTRADA_EN_VIGENCIA_CT = datetime.date(1992, 6, 17)
- ANO_ENTRADA_EN_VIGENCIA_CT = FECHA_ENTRADA_EN_VIGENCIA_CT.year
-
-
- class Base(object):
- """Clase base de la aplicacion"""
-
- def Moneda(self, num, simbolo="$", ndec=2, divmiles=","):
- """Convierte un numero en formato de moneda con division por miles ---> str"""
- try:
- num = round(num, ndec)
- except BaseException:
- return str(num)
- try:
- num, dec = str(num).split(".")
- except:
- num, dec = str(num), "0"
- dec += "0" * (ndec - len(dec))
- num = num[::-1]
- l = [num[pos:pos+3][::-1] for pos in range(0, 50, 3) if (num[pos:pos+3])]
- l.reverse()
- num = str.join(divmiles, l)
- return "%s %s.%s" % (simbolo, num, dec)
-
- def GetMeses(self, fecha1, fecha2, redondear=True):
- """Obtiene la cantidad de meses que hay de diferencia entre las dos fechas indicadas."""
- meses = float((fecha2 - fecha1).days) / 30.0
- if redondear:
- return int(round(meses))
- return meses
-
- def GetAnos(self, fecha1, fecha2):
- """Obtiene la cantidad de anos que hay de diferencia entre las dos fechas indicadas."""
- return (fecha2 - fecha1).days / 365
-
- def GetTiempo(self, fecha1, fecha2):
- """Obtiene una tupla con los anos, meses y dias de diferencia entre las dos fechas indicadas.
- --> tuple (years, months, days)"""
- anos = fecha2.year - fecha1.year
- meses = fecha2.month - fecha1.month
- dias = fecha2.day - fecha1.day
- if meses < 0:
- anos -= 1
- meses += 12
- if dias < 0:
- meses -= 1
- dias += 30 + 1
- return (anos, meses, dias)
-
- def FactorDivisor(self, periodo="DIARIO"):
- """
- El factor divisor diario se obtiene de la operación siguiente:
-
- Los días de trabajo de la semana (5.5) X la cantidad de semanas del año (52) = 286 horas,
- luego se divide entre el número de meses del año calendario (12), factor divisor = 23.83
- """
- return FACTOR_DIVISOR[periodo.upper()]
-
-
- class Prestaciones(Base):
-
- def SalarioOrdinario(self, salario):
- return float(salario / self.FactorDivisor())
-
- def Preaviso(self, salario, entrada, salida):
- u"""
- Art. 76.- La parte que ejerce el derecho de desahucio debe dar aviso previo a la otra, de
- acuerdo con las reglas siguientes:
-
- 1o. Después de un trabajo continuo no menor de tres meses ni mayor de seis, con un mínimo
- de siete días de anticipación.
-
- 2o. Después de un trabajo continuo que exceda de seis meses y no sea mayor de un año, con
- un mínimo de catorce (14) días de anticipación.
-
- 3o. Después de un año de trabajo continuo, con un mínimo de veintiocho días de anticipación.
- """
- salario_ordinario = self.SalarioOrdinario(salario)
- anos, meses, dias = self.GetTiempo(entrada, salida)
-
- if anos > 0:
- return salario_ordinario * 28
-
- if meses in (3, 4, 5):
- return salario_ordinario * 7
-
- if meses in (6, 7, 8, 9, 10, 11):
- return salario_ordinario * 14
-
- return 0.0
-
- def Cesantia(self, salario, entrada, salida):
- u"""
- Art. 80.- El empleador que ejerza el desahucio debe pagar al trabajador un auxilio de
- cesantía cuyo importe se fijará de acuerdo con las reglas siguientes:
-
- 1o. Después de un trabajo continuo no menor de tres meses ni mayor de seis, una suma igual
- a seis días de salario ordinario.
-
- 2o. Después de un trabajo continuo no menor de seis meses ni mayor de un año, una suma
- igual a trece días de salario ordinario.
-
- 3o. Después de un trabajo continuo no menor de un año ni mayor de cinco, una suma igual a
- veintiún días de salario ordinario, por cada año de servicio prestado.
-
- 4o. Después de un trabajo continuo no menor de cinco años, una suma igual a veintitrés
- días de salario ordinario, por cada año de servicio prestado.
-
- Toda fracción de un año, mayor de tres meses, debe pagarse de conformidad con los
- ordinales 1o. y 2o. de este artículo.
-
- El cálculo del auxilio de cesantía que corresponda a los años de vigencia del contrato del
- trabajador anteriores a la promulgación de este Código, se hará en base a quince días de
- salario ordinario por cada año de servicio prestado.
- """
- salario_ordinario = self.SalarioOrdinario(salario)
- cesantia1, cesantia_prop, cesantia_antes_1992 = 0.0, 0.0, 0.0
-
- if entrada < FECHA_ENTRADA_EN_VIGENCIA_CT:
- #Caludo diferente para los anos anteriores a la puesta en vigencia del nuevo CP.
- entrada2 = entrada
- salida2 = datetime.date(ANO_ENTRADA_EN_VIGENCIA_CT-1, entrada.month, entrada.day)
- entrada = salida2
- anos, meses, dias = self.GetTiempo(entrada2, salida2)
- cesantia_antes_1992 = (salario_ordinario * 15) * anos
-
- anos, meses, dias = self.GetTiempo(entrada, salida)
-
- if meses < 3:
- cesantia_prop = 0.0
-
- elif meses in (3, 4, 5):
- cesantia_prop = (salario_ordinario * 6)
-
- elif meses in (6, 7, 8, 9, 10, 11):
- cesantia_prop = (salario_ordinario * 13)
-
- if anos in (1, 2, 3, 4):
- cesantia1 = ((salario_ordinario * 21) * anos)
-
- elif anos > 4:
- cesantia1 = ((salario_ordinario * 23) * anos)
-
- total = cesantia1 + cesantia_prop + cesantia_antes_1992
- return (total, cesantia1, cesantia_prop, cesantia_antes_1992)
-
- def Navidad(self, salario, entrada, salida):
- """
- Art. 219.- El empleador está obligado a pagar al trabajador en el mes de diciembre, el
- salario de navidad, consistente en la duodécima parte del salario ordinario devengado por el
- trabajador en el año calendario, sin perjuicio de los usos y prácticas de la empresa, lo
- pactado en el convenio colectivo o el derecho del empleador de otorgar por concepto de éste
- una suma mayor.
- Sin embargo, en ningún caso el salario de navidad será mayor del monto de cinco salarios
- mínimos legalmente establecido. Para el pago de este salario se excluyen las retribuciones
- por horas extraordinarias y el salario correspondiente a la participación en los beneficios
- de la empresa. El salario de navidad no será computado para los fines del preaviso, de la
- cesantía y de la asistencia económica prevista en este Código.
- """
- anos, meses, dias = self.GetTiempo(entrada, salida)
- if anos:
- anos, meses, dias = self.GetTiempo(datetime.date(salida.year, 01, 01), salida)
- return ( ( (dias / self.FactorDivisor()) + meses) * salario) / 12
-
- def Vacaciones(self, salario, entrada, salida, trabajotemporal=False):
- """
- Art. 177.- (Modificado por la Ley núm. 97-97, G.O. 9955, de fecha 31 de mayo de 1997).
-
- Los empleadores tienen la obligación de conceder a todo trabajador un período de vacaciones
- de catorce (14) días laborables, con disfrute de salario, conforme a la escala siguiente:
-
- 1ro. Después de un trabajo continuo no menor de un año ni mayor de cinco, catorce días de
- salario ordinario.
-
- 2do. Después de un trabajo continuo no menor de cinco años, dieciocho días de salario
- ordinario.
-
- Las vacaciones pueden ser fraccionadas por acuerdo entre el trabajador y el empleador;
- pero, en todo caso, el trabajador debe disfrutar de un período de vacaciones no inferior a
- una semana.
- Se prohíbe el fraccionamiento si el trabajador es menor de edad.
- ---------------------
-
- Art. 179.- Los trabajadores sujetos a contratos por tiempo indefinido que sin culpa alguna
- de su parte, no puedan tener oportunidad de prestar servicios ininterrumpidos durante un
- año a causa de la índole de sus labores o por cualquier otra circunstancia, tienen derecho
- a un período de vacaciones proporcional al tiempo trabajado, si éste es mayor de cinco meses.
-
- Art. 180.- Para la aplicación del artículo 179 rige la siguiente escala:
- Trabajadores con más de cinco meses de servicios, seis días.
- Trabajadores con más de seis meses de servicios, siete días.
- Trabajadores con más de siete meses de servicios, ocho días.
- Trabajadores con más de ocho meses de servicios, nueve días.
- Trabajadores con más de nueve meses de servicios, diez días.
- Trabajadores con más de diez meses de servicios, once días.
- Trabajadores con más de once meses de servicios, doce días.
- """
- anos, meses, dias = self.GetTiempo(entrada, salida)
-
- if trabajotemporal is True: #art. 180 CT
-
- if meses > 5:
- return self.SalarioOrdinario(salario) * meses
-
- else:
- return 0.0
-
- else:
- if anos in (1, 2, 3, 4):
- return self.SalarioOrdinario(salario) * 14
-
- elif anos > 4:
- return self.SalarioOrdinario(salario) * 18
-
- else:
- return 0.0