diff --git a/lib_Vacaciones.php b/lib_Vacaciones.php new file mode 100644 index 0000000..db930d3 --- /dev/null +++ b/lib_Vacaciones.php @@ -0,0 +1,552 @@ + + * @license: GNU GPL v3, Licencia Pública General de GNU 3. + * @license: CC BY-SA, Creative Commons Atribución - CompartirIgual (CC BY-SA) 4.0 Internacional. + * @category Librería. + * @package: lib_Vacaciones.php. + * @since: v0.3. + * @version: 0.6. + * @Fecha de Modificación: 04/Abril/2018 + * @Fecha de Creación: 05/Marzo/2018 + + Este programa es software libre, su uso, redistribución, y/o modificación + debe ser bajo los términos de las licencias indicadas, la GNU Licencia Pública + General (GPL) publicada por la Fundación de Software Libre(FSF) de la versión + 3 o cualquier versión posterior y la Creative Commons Atribución - Compartir + Igual (CC BY-SA) de la versión 4.0 Internacional o cualquier versión posterior. + + Este software esta creado con propósitos generales que sean requeridos, + siempre que este sujeto a las licencias indicadas, pero SIN NINGUNA GARANTÍA + Y/O RESPONSABILIDAD que recaiga a los creadores, autores y/o desarrolladores, + incluso sin la garantía implícita de COMERCIALIZACIÓN o IDONEIDAD PARA UN + PROPÓSITO PARTICULAR. Cualquier MODIFICACIÓN, ADAPTACIÓN Y/O MEJORA que se haga + a partir de este código debe ser notificada y enviada a la fuente, comunidad + o repositorio de donde fue obtenida, y/o a sus AUTORES. + **/ + +/** + Características: + * calculo según la fecha de ingreso, los periodos de vacaciones. + * calcula los años de antigüedad. + * cantidad de días correspondientes de vacaciones + * fecha de reincorporación tomando en cuenta los días no hábiles. + o no laborables y días festivos si existen. + * Lista los periodos disponibles según los usados y el tipo de persona. + + Próximamente: + * calculo de días de semana santa y carnaval para tomar en cuenta en días hábiles. + * calculo de bonos según la antigüedad. + * calculo de pagos correspondiente en las vacaciones. + * vacaciones colectivas. + + Consideraciones: + * CRBV, Constitución de la República Bolivariana de Venezuela 1999: + Titulo III, Capitulo I articulo 90. + * LOTTT, Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras: + Titulo III, Capitulo IX + * LCA, Ley de Carrera Administrativa: + Titulo II, Capitulo I. +*/ +class vacacion +{ + public $atrDiasVacaciones = 15; //días correspondientes de vacaciones según la LOTTT + public $atrTipoPersona = "R"; //tipo de persona Regular o Funcionario + + /** + * @param string $psFechaIngreso Fecha de inicio en formato Y-m-d + * @param string $piMaxPeriodos máximo acumulado 2 periodos art 199 LOTTT y 1 o no acumulativo art 19 LCA + */ + function __construct($psFechaIngreso = "", $psTipoPersona = "R") + { + $this->atrFechaIngreso = trim($psFechaIngreso); + $this->atrTipoPersona = trim($psTipoPersona); + $this->setAsignarValores(); + } //cierre del constuctor + + + + private function setAsignarValores() + { + if (strtoupper($this->atrTipoPersona) == "F") { + $this->atrMaxPeriodo = 1; + $this->atrPeriodo = 5; //cada 5 años + $this->atrTipoPeriodo = "Quinquenio"; //cada 5 años + } + else { + $this->atrMaxPeriodo = 2; + $this->atrPeriodo = 1; //cada año + $this->atrTipoPeriodo = "Año(s)"; //cada año + } + } + + + + /** + * @param string $psFechaIngreso Fecha de inicio en formato Y-m-d + * @param string $psFechaPeriodo fecha del periodo a calcular la antiguedad Y-m-d + */ + function getAntiguedad($psFechaIngreso = "", $psFechaPeriodo = "") + { + if (trim($psFechaIngreso) == "") { + $psFechaIngreso = $this->atrFechaIngreso; + } + if (trim($psFechaPeriodo) == "") { + $psFechaPeriodo = date("Y-m-d"); + } + + $objFecha_Ingreso = new DateTime($psFechaIngreso); + $objFecha_Periodo = new DateTime($psFechaPeriodo); + + $objAnos = $objFecha_Periodo->diff($objFecha_Ingreso); + $liAntiguedad = intval($objAnos->y); + + return $liAntiguedad; + } + + + + public function getPeriodosAntiguedad($psFechaIngreso = "") + { + if (trim($psFechaIngreso) == "") { + $psFechaIngreso = $this->atrFechaIngreso; + } + //$lsAno = substr($psFechaIngreso, 0, 4); + $lsAno = self::getFechaFormato($psFechaIngreso, "amd", "a"); + $liAntiguedad = $this->getAntiguedad($psFechaIngreso); + + $arrRetorno = array(); + if ($liAntiguedad > 0) { + for ($liControl = 0; $liControl <= $liAntiguedad ; $liControl ++) { + $arrRetorno[ $liControl ] = $lsAno + $liControl; + } + } + return $arrRetorno; + } + + + + public function getDetalleDiasVacacionesPeriodo($psFechaIngreso = "", $paPeriodos = array()) + { + if ($psFechaIngreso == "") { + $psFechaIngreso = $this->atrFechaIngreso; + } + if (! is_array($paPeriodos)) { + //separa la palabra en cada guin y convierte el string en arreglo + $paPeriodos = explode("-", $paPeriodos); + } + //var_dump($paPeriodos[0]); + + $lsDia = self::getFechaFormato($psFechaIngreso, "amd", "d"); + $lsMes = self::getFechaFormato($psFechaIngreso, "amd", "m"); + /* + $lsDia = substr($psFechaIngreso, 8, 2); + $lsMes = substr($psFechaIngreso, 5, 2); + $lsAno = substr($psFechaIngreso, 0, 4); + */ + $objFecha_Ingreso = new DateTime($psFechaIngreso); + $liCont = 1; + $lsVacaciones = 0; + if (count($paPeriodos) <= 0) { + $liCont = -1; + } + $arrRetorno = array(); + foreach ($paPeriodos as $key => $value) { + + $objFecha_Periodo = new DateTime($value . "-" . $lsMes . "-" . $lsDia); + $annos = $objFecha_Periodo->diff($objFecha_Ingreso); + $antiguedad = $annos->y + 1 ; + $diasvacaciones = getDiasPorAntiguedad($antiguedad); + $lsVacaciones = $lsVacaciones + $diasvacaciones ; + + $arrRetorno["periodo"][$liCont]["anno"] = $value; + $arrRetorno["periodo"][$liCont]["dias"] = $diasvacaciones; + + $liCont ++; + } + + $arrRetorno["dias_vacaciones"] = $lsVacaciones; + return $arrRetorno; + } + + + + /* + * La formula es 15 + (años de servicio -1) + * hasta llegar a 15 dias habiles (30 dias de vacaciones en total) + */ + public function getDiasVacacionesAntiguedad($piAntiguedad = "") + { + if (trim($piAntiguedad) == "") { + $piAntiguedad = $this->getAntiguedad($this->atrFechaIngreso); + } + else + $piAntiguedad = intval(trim($piAntiguedad)); + $liDiasAntiguedad = $this->atrDiasVacaciones + ($piAntiguedad - 1); + if ($liDiasAntiguedad > 30) { + $liDiasAntiguedad = 30; + } + return $liDiasAntiguedad; + } + + + + /* + * Calcula los días que corresponden según el tipo de persona + */ + public function getDiasVacaciones($psTipo = "") + { + if (trim($psTipo) == "") { + $psTipo = $this->atrTipoPersona; + } + if (strtoupper(trim($psTipo)) == "R") { + $liDiasAntiguedad = $this->getDiasVacacionesAntiguedad(); + } + else { + $liDiasAntiguedad = $this->getDiasVacacionesAntiguedadFuncionario(); + } + return $liDiasAntiguedad; + } + + + + /* + * La formula es 15 + años de servicio + */ + public function getDiasVacacionesBono($piAntiguedad = 0) + { + if (trim($piAntiguedad) == "") { + $piAntiguedad = $this->getAntiguedad($this->atrFechaIngreso); + } + else + $piAntiguedad = intval(trim($piAntiguedad)); + $liDiasBono = $this->$atrDiasVacaciones + $piAntiguedad; + if ($liDiasBono > 30) { + $liDiasBono = 30; + } + return $liDiasBono; + } + + + + public function getDiasVacacionesAntiguedadFuncionario($piAntiguedad = "") + { + if (trim($piAntiguedad) == "") { + $piAntiguedad = $this->getAntiguedad($this->atrFechaIngreso); + } + else + $piAntiguedad = intval(trim($piAntiguedad)); + $liDiasVacaciones = 0; + switch ($piAntiguedad) { + //primer quinquenio de 5 años a 9 años + case ($piAntiguedad == 5): + $liDiasVacaciones = 19; + break; + //segundo quinquenio de 10 años a 14 años + case ($piAntiguedad == 10): + $liDiasVacaciones = 20; + break; + //tercer quinquenio 15 años + case ($piAntiguedad == 15): + $liDiasVacaciones = 21; + break; + //mas de 16 años o mas + case ($piAntiguedad >= 16): + $liDiasVacaciones = 25; + break; + case ($piAntiguedad <= 0): + //default: + $liDiasVacaciones = 0; + break; + } //cierre del switch + + return $liDiasVacaciones; + } + + + + public function getListarPeriodos($paPeriodosUsados = array()) + { + if (! is_array($paPeriodosUsados)) { + //separa la palabra en cada guin y convierte el string en arreglo + if (strpos($paPeriodosUsados, "/")) + $paPeriodosUsados = explode("/", $paPeriodosUsados); + else + $paPeriodosUsados = explode("-", $paPeriodosUsados); + } + + $arrPeriodos = $this->getPeriodosAntiguedad($this->atrFechaIngreso); + $arrComparado = array_diff($arrPeriodos, $paPeriodosUsados); + $arrRetorno = array(); + if ($arrComparado) { + $arrComparado = array_slice(array_diff($arrPeriodos, $paPeriodosUsados), 0, $this->atrMaxPeriodo); + $liCont = 0; + + foreach ($arrComparado AS $key => $value) { + if ($liCont > 0) + $value = $arrComparado[ ($liCont-1) ] . "-" . $value; + $arrRetorno[$liCont] = $value; + $liCont++; + } + } + return $arrRetorno; + } + + + + //Esta pequeña función me crea una fecha de entrega sin sábados ni domingos ni días feriados + public function getFechaFinal($psFechainicio = "", $piDiasHabiles = 0, $paDiasferiados = array(), $paDiasNoHabiles = array(6,7)) + { + if (trim($psFechainicio) == "") { + $psFechainicio = date("Y-m-d"); + } + if (trim($piDiasHabiles) == 0) { + $piDiasHabiles = $this->getDiasVacacionesAntiguedad(); + } + + $fechaInicial = strtotime($psFechainicio); //obtenemos la fecha de hoy, solo para usar como referencia al usuario + //echo "$fechaInicial