HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/gestor-horarios.bradford/app/models/reportes_model.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

class Reportes_model extends CI_Model
{

	public function vision_general($filtros, $por = "")
	{
		$where ="";
		$having = "";
		if (!empty($filtros['porcentaje']))
		{
			$por = $filtros['porcentaje'];
		}
		if($por == "100")
		{
			$having .= "having 100 - (round(SUM(TIME_TO_SEC(atraso) / 60) + SUM(TIME_TO_SEC(ausencia ) / 60)) / round(SUM(TIME_TO_SEC(total_jornada) / 60)) * 100) > 90 ";
		}
		if($por == "90")
		{
			$having .= "having 100 - (round(SUM(TIME_TO_SEC(atraso) / 60) + SUM(TIME_TO_SEC(ausencia ) / 60)) / round(SUM(TIME_TO_SEC(total_jornada) / 60)) * 100) between 85 and 90 ";
		}
		if($por == "85")
		{
			$having .= "having 100 - (round(SUM(TIME_TO_SEC(atraso) / 60) + SUM(TIME_TO_SEC(ausencia ) / 60)) / round(SUM(TIME_TO_SEC(total_jornada) / 60)) * 100) < 85 ";
		}
		if(!empty($filtros['fecha_desde']))
		{
			$where .= "and fecha >=  '$filtros[fecha_desde]' ";
		}
		if(!empty($filtros['fecha_desde']))
		{
			$where .= "and fecha >=  '$filtros[fecha_desde]' ";
		}

		if(!empty($filtros['fecha_desde']))
		{
			$where .= "and fecha >=  '$filtros[fecha_desde]' ";
		}
		if(!empty($filtros['fecha_hasta']))
		{
			$where .= "and fecha <=  '$filtros[fecha_hasta]' ";
		}
		if(!empty($filtros['rut']))
		{
			$filtros['rut'] = trim($filtros['rut']);
			$where .= "and movimientos_reloj.rut =  '$filtros[rut]' ";
		}
		if(!empty($filtros['grupo']))
		{
			switch ($filtros['grupo']) {

				case 'mes':
					$group = "group by DATE_FORMAT(fecha, '%Y-%m')";
					$select_group = "DATE_FORMAT(fecha, '%Y-%m') fecha";
					$orderby = " order by fecha desc";
					break;
				case 'rut_dia':
					$group = "group by movimientos_reloj.rut";
					$select_group = "fecha, movimientos_reloj.rut, CONCAT(trabajadores.nombres, ' ', trabajadores.apellido_p) nombre";
					break;
				case 'rut_mes':
					$group = "group by DATE_FORMAT(fecha, '%Y-%m'), movimientos_reloj.rut";
					$select_group = "DATE_FORMAT(fecha, '%Y-%m') fecha, movimientos_reloj.rut, CONCAT(trabajadores.nombres, ' ', trabajadores.apellido_p) nombre";
					$orderby = " order by fecha desc,  movimientos_reloj.rut";
					break;
				default:
					$group = "group by DATE_FORMAT(fecha, '%Y-%m'), movimientos_reloj.rut";
					$select_group = "DATE_FORMAT(fecha, '%Y-%m') fecha, movimientos_reloj.rut, CONCAT(trabajadores.nombres, ' ', trabajadores.apellido_p) nombre";
					$orderby = " order by fecha desc,  movimientos_reloj.rut";
					break;
			}
		}
		if(empty($filtros['grupo'])){
			$group = "group by DATE_FORMAT(fecha, '%Y-%m'), movimientos_reloj.rut";
			$select_group = "DATE_FORMAT(fecha, '%Y-%m') fecha, movimientos_reloj.rut, CONCAT(trabajadores.nombres, ' ', trabajadores.apellido_p) nombre";
			$orderby = " order by fecha desc,  movimientos_reloj.rut";
		}
		$query = $this->db->query("select $select_group,
									COUNT(CASE WHEN entrada = '00:00:00' AND salida = '00:00:00' THEN 1 END) AS num_ausencias,
									COUNT(CASE WHEN salida < hora_termino THEN 1 END) AS salidas_antes_horario,
									round(SUM(TIME_TO_SEC(atraso) / 60) + SUM(TIME_TO_SEC(ausencia ) / 60)) minutos_ausencias,
									round(SUM(TIME_TO_SEC(total_jornada) / 60)) jornada_minutos,
									round(SUM(TIME_TO_SEC(total_jornada_efectiva ) / 60)) total_jornada_efectiva
									from movimientos_reloj as movimientos_reloj
									inner join trabajadores on trabajadores.id = movimientos_reloj.trabajadores_id
									$where 
									$group
									$having
									$orderby
									");
		return $query->result();
	}

	public function periodos()
	{
		$query = $this->db->query("select count(id) movimientos, DATE_FORMAT(fecha, '%Y-%m') fecha from movimientos_reloj
									group by DATE_FORMAT(fecha, '%Y-%m')
									order by fecha desc");
		return $query->result();
	}
	public function getConsolidado($fecha){
		$this->db->select("m.id mov_id, t.id id_trabajador, t.rut, concat(t.nombres, ' ', t.apellido_p) nombre, t.email, t2.nombres jefe,
						cc.nombre centro_costo,
						m.fecha, horario_evento, m.minutos_descanso, hora_inicio, hora_termino, entrada, salida, descanso_entrada, descanso_salida,
						salida_especial_registrada, DATE_FORMAT(total_jornada, '%H:%i') total_jornada, DATE_FORMAT(descanso, '%H:%i') descanso, 
						DATE_FORMAT(atraso, '%H:%i') atraso, DATE_FORMAT(salida_temprano, '%H:%i') salida_temprano, DATE_FORMAT(ausencia, '%H:%i') ausencia,
						diferencia_ingreso, diferencia_salida
						", false);
		$this->db->from('movimientos_reloj m');
		$this->db->join('trabajadores t','t.rut = m.rut');
		$this->db->join('trabajadores t2','t2.id = t.jefe_id');
		$this->db->join('centros_costos cc','cc.id = t.centros_costos_id');
		$this->db->where("DATE_FORMAT(m.fecha, '%Y-%m') = '$fecha'", null);
		$this->db->limit(50);
		$get = $this->db->get();
		return $get->result();
	}
	
	public function getTrabajadores($where = array(), $select = '')
	{
		$select = trim($select);
		if (!empty($select)) {
			$this->db->select($select);
		}
		if (!empty($where)) {
			$this->db->where($where);
		} else {
			$this->db->where("eliminado", 0);
		}
		$this->db->from("trabajadores");
		$this->db->order_by("nombres", "asc");
		$resultado = $this->db->get();
		return $resultado->result();
	}

	public function getTrabajadoresInfo($where, $resultado_tipo = '')
	{
		if (!empty($where)) {
			$where = 'WHERE ' . $where;
		} else {
			$where = 'WHERE eliminado = 0';
		}
		$query = $this->db->query("SELECT t.id, t.nombres, t.apellido_p, t.apellido_m, t.fecha_nacimiento,
									t.sexo, t.nacionalidad, t.es_jefe, t.jefe_id,
									CONCAT(IFNULL(t.nombres,'N/A'), ' ', t.apellido_p, ' ', t.apellido_m) AS nombre_evaludor,
									CASE WHEN t.jefe_id > 0 THEN CONCAT(IFNULL(j.nombres,'N/A'), ' ', j.apellido_p, ' ', j.apellido_m)
										ELSE 'N/A' 
									END AS nombre_jefe, UPPER(u.nombre) AS nom_area, UPPER(c.nombre) AS cargo, UPPER(s.nombre) AS sucusal
									FROM trabajadores t 			
									LEFT JOIN unidades u ON t.unidades_id = u.id	
									LEFT JOIN trabajadores j ON t.jefe_id = j.id									 
									LEFT JOIN cargos c ON t.cargos_id = c.id		
									LEFT JOIN sucursales s ON t.sucursales_id = s.id			
									$where");
		if (trim(strtolower($resultado_tipo)) == 'row') {
			return $query->row();
		} else {
			return $query->result();
		}
	}
}