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.





  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import datetime
  5.  
  6.  
  7. PERIODOS = ["MENSUAL""QUINCENAL""SEMANAL""DIARIO""POR HORA"]
  8.  
  9. FACTOR_DIVISOR_POR_HORA 571.92
  10. FACTOR_DIVISOR_DIARIO 23.83
  11. FACTOR_DIVISOR_SEMANAL 4.33
  12. FACTOR_DIVISOR_QUINCENAL 2
  13. FACTOR_DIVISOR_MENSUAL 1
  14. FACTOR_DIVISOR = {PERIODOS[0]: FACTOR_DIVISOR_MENSUAL
  15.                   PERIODOS[1]: FACTOR_DIVISOR_QUINCENAL,
  16.                   PERIODOS[2]: FACTOR_DIVISOR_SEMANAL
  17.                   PERIODOS[3]: FACTOR_DIVISOR_DIARIO
  18.                   PERIODOS[4]: FACTOR_DIVISOR_POR_HORA}
  19.  
  20. #Entrada en vigencia del actual Codigo de Trabajo.
  21. FECHA_ENTRADA_EN_VIGENCIA_CT datetime.date(1992617
  22. ANO_ENTRADA_EN_VIGENCIA_CT FECHA_ENTRADA_EN_VIGENCIA_CT.year
  23.  
  24.  
  25. class Base(object):
  26.     """Clase base de la aplicacion"""
  27.     
  28.     def Moneda(selfnumsimbolo="$"ndec=2divmiles=","):
  29.         """Convierte un numero en formato de moneda con division por miles ---> str"""
  30.         try:
  31.             num round(numndec)
  32.         except BaseException:
  33.             return str(num)
  34.         try:
  35.             numdec str(num).split(".")
  36.         except:
  37.             numdec str(num), "0"
  38.         dec += "0" * (ndec len(dec))
  39.         num num[::-1]
  40.         = [num[pos:pos+3][::-1for pos in range(0503if (num[pos:pos+3])]
  41.         l.reverse()
  42.         num str.join(divmilesl)
  43.         return "%s %s.%s" % (simbolonumdec)
  44.     
  45.     def GetMeses(selffecha1fecha2redondear=True):
  46.         """Obtiene la cantidad de meses que hay de diferencia entre las dos fechas indicadas."""
  47.         meses float((fecha2 fecha1).days) / 30.0
  48.         if redondear:
  49.             return int(round(meses))
  50.         return meses
  51.     
  52.     def GetAnos(selffecha1fecha2):
  53.         """Obtiene la cantidad de anos que hay de diferencia entre las dos fechas indicadas."""
  54.         return (fecha2 fecha1).days 365
  55.     
  56.     def GetTiempo(selffecha1fecha2):
  57.         """Obtiene una tupla con los anos, meses y dias de diferencia entre las dos fechas indicadas.
  58.         --> tuple (years, months, days)"""
  59.         anos fecha2.year fecha1.year
  60.         meses fecha2.month fecha1.month
  61.         dias fecha2.day fecha1.day
  62.         if meses 0:
  63.             anos -= 1
  64.             meses += 12
  65.         if dias 0:
  66.             meses -= 1
  67.             dias += 30 1
  68.         return (anosmesesdias)
  69.     
  70.     def FactorDivisor(selfperiodo="DIARIO"):
  71.         """
  72.         El factor divisor diario se obtiene de  la operación siguiente:
  73.         
  74.         Los días de trabajo de la semana (5.5)   X    la cantidad de semanas del año (52)  = 286 horas,  
  75.         luego se divide entre el número de meses del año calendario (12), factor divisor = 23.83
  76.         """
  77.         return FACTOR_DIVISOR[periodo.upper()]
  78.         
  79.  
  80. class Prestaciones(Base):
  81.     
  82.     def SalarioOrdinario(selfsalario):
  83.         return float(salario self.FactorDivisor())
  84.     
  85.     def Preaviso(selfsalarioentradasalida):
  86.         u"""
  87.         Art. 76.- La parte que ejerce el derecho de desahucio debe dar aviso previo a la otra, de 
  88.         acuerdo con las reglas siguientes:
  89.         
  90.         1o. Después de un trabajo continuo no menor de tres meses ni mayor de seis, con un mínimo 
  91.         de siete días de anticipación.
  92.         
  93.         2o. Después de un trabajo continuo que exceda de seis meses y no sea mayor de un año, con 
  94.         un mínimo de catorce (14) días de anticipación.
  95.         
  96.         3o. Después de un año de trabajo continuo, con un mínimo de veintiocho días de anticipación.
  97.         """
  98.         salario_ordinario self.SalarioOrdinario(salario)
  99.         anosmesesdias self.GetTiempo(entradasalida)
  100.         
  101.         if anos 0:
  102.             return salario_ordinario 28
  103.         
  104.         if meses in (345):
  105.             return salario_ordinario 7
  106.         
  107.         if meses in (67891011):
  108.             return salario_ordinario 14
  109.         
  110.         return 0.0
  111.             
  112.     def Cesantia(selfsalarioentradasalida):
  113.         u"""
  114.         Art. 80.- El empleador que ejerza el desahucio debe pagar al trabajador un auxilio de 
  115.         cesantía cuyo importe se fijará de acuerdo con las reglas siguientes:
  116.         
  117.         1o. Después de un trabajo continuo no menor de tres meses ni mayor de seis, una suma igual 
  118.         a seis días de salario ordinario.
  119.         
  120.         2o. Después de un trabajo continuo no menor de seis meses ni mayor de un año, una suma 
  121.         igual a trece días de salario ordinario.
  122.         
  123.         3o. Después de un trabajo continuo no menor de un año ni mayor de cinco, una suma igual a 
  124.         veintiún días de salario ordinario, por cada año de servicio prestado.
  125.  
  126.         4o. Después de un trabajo continuo no menor de cinco años, una suma igual a veintitrés 
  127.         días de salario ordinario, por cada año de servicio prestado.
  128.  
  129.         Toda fracción de un año, mayor de tres meses, debe pagarse de conformidad con los 
  130.         ordinales 1o. y 2o. de este artículo.
  131.         
  132.         El cálculo del auxilio de cesantía que corresponda a los años de vigencia del contrato del 
  133.         trabajador anteriores a la promulgación de este Código, se hará en base a quince días de 
  134.         salario ordinario por cada año de servicio prestado.
  135.         """
  136.         salario_ordinario self.SalarioOrdinario(salario)
  137.         cesantia1cesantia_propcesantia_antes_1992 0.00.00.0
  138.         
  139.         if entrada FECHA_ENTRADA_EN_VIGENCIA_CT:
  140.             #Caludo diferente para los anos anteriores a la puesta en vigencia del nuevo CP.
  141.             entrada2 entrada
  142.             salida2 datetime.date(ANO_ENTRADA_EN_VIGENCIA_CT-1entrada.monthentrada.day)
  143.             entrada salida2
  144.             anosmesesdias self.GetTiempo(entrada2salida2)
  145.             cesantia_antes_1992 = (salario_ordinario 15) * anos
  146.                     
  147.         anosmesesdias self.GetTiempo(entradasalida)
  148.         
  149.         if meses 3:
  150.             cesantia_prop 0.0
  151.         
  152.         elif meses in (345):
  153.             cesantia_prop = (salario_ordinario 6)
  154.         
  155.         elif meses in (67891011):
  156.             cesantia_prop = (salario_ordinario 13)
  157.         
  158.         if anos in (1234):
  159.             cesantia1 = ((salario_ordinario 21) * anos)
  160.         
  161.         elif anos 4:
  162.             cesantia1 = ((salario_ordinario 23) * anos)
  163.         
  164.         total cesantia1 cesantia_prop cesantia_antes_1992
  165.         return (totalcesantia1cesantia_propcesantia_antes_1992)
  166.     
  167.     def Navidad(selfsalarioentradasalida):
  168.         """
  169.         Art. 219.- El empleador está obligado a pagar al trabajador en el mes de diciembre, el 
  170.         salario de navidad, consistente en la duodécima parte del salario ordinario devengado por el 
  171.         trabajador en el año calendario, sin perjuicio de los usos y prácticas de la empresa, lo 
  172.         pactado en el convenio colectivo o el derecho del empleador de otorgar por concepto de éste
  173.         una suma mayor.
  174.         Sin embargo, en ningún caso el salario de navidad será mayor del monto de cinco salarios 
  175.         mínimos legalmente establecido. Para el pago de este salario se excluyen las retribuciones 
  176.         por horas extraordinarias y el salario correspondiente a la participación en los beneficios 
  177.         de la empresa. El salario de navidad no será computado para los fines del preaviso, de la 
  178.         cesantía y de la asistencia económica prevista en este Código.
  179.         """
  180.         anosmesesdias self.GetTiempo(entradasalida)
  181.         if anos:
  182.             anosmesesdias self.GetTiempo(datetime.date(salida.year0101), salida)
  183.         return ( ( (dias self.FactorDivisor()) + meses) * salario) / 12
  184.     
  185.     def Vacaciones(selfsalarioentradasalidatrabajotemporal=False):
  186.         """
  187.         Art. 177.- (Modificado por la Ley núm. 97-97, G.O. 9955, de fecha 31 de mayo de 1997). 
  188.         
  189.         Los empleadores tienen la obligación de conceder a todo trabajador un período de vacaciones 
  190.         de catorce (14) días laborables, con disfrute de salario, conforme a la escala siguiente:
  191.  
  192.         1ro. Después de un trabajo continuo no menor de un año ni mayor de cinco, catorce días de 
  193.         salario ordinario.
  194.         
  195.         2do. Después de un trabajo continuo no menor de cinco años, dieciocho días de salario 
  196.         ordinario.
  197.         
  198.         Las vacaciones pueden ser fraccionadas por acuerdo entre el trabajador y el empleador; 
  199.         pero, en todo caso, el trabajador debe disfrutar de un período de vacaciones no inferior a 
  200.         una semana.
  201.         Se prohíbe el fraccionamiento si el trabajador es menor de edad.
  202.         ---------------------
  203.         
  204.         Art. 179.- Los trabajadores sujetos a contratos por tiempo indefinido que sin culpa alguna 
  205.         de su parte, no puedan tener oportunidad de prestar servicios ininterrumpidos durante un 
  206.         año a causa de la índole de sus labores o por cualquier otra circunstancia, tienen derecho 
  207.         a un período de vacaciones proporcional al tiempo trabajado, si éste es mayor de cinco meses.
  208.         
  209.         Art. 180.- Para la aplicación del artículo 179 rige la siguiente escala:
  210.         Trabajadores con más de cinco meses de servicios, seis días.
  211.         Trabajadores con más de seis meses de servicios, siete días.
  212.         Trabajadores con más de siete meses de servicios, ocho días.
  213.         Trabajadores con más de ocho meses de servicios, nueve días.
  214.         Trabajadores con más de nueve meses de servicios, diez días.
  215.         Trabajadores con más de diez meses de servicios, once días.
  216.         Trabajadores con más de once meses de servicios, doce días.
  217.         """
  218.         anosmesesdias self.GetTiempo(entradasalida)
  219.         
  220.         if trabajotemporal is True#art. 180 CT
  221.             
  222.             if meses 5:
  223.                 return self.SalarioOrdinario(salario) * meses
  224.             
  225.             else:
  226.                 return 0.0
  227.                 
  228.         else:
  229.             if anos in (1234):
  230.                 return self.SalarioOrdinario(salario) * 14
  231.             
  232.             elif anos 4:
  233.                 return self.SalarioOrdinario(salario) * 18
  234.             
  235.             else:
  236.                 return 0.0