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();
}
}
}