File: /var/www/gestor-horarios.bradford/app/controllers/ReportsController.php
<?php
require_once(APPPATH . 'libraries/jpgraph/src/jpgraph.php');
require_once(APPPATH . 'libraries/jpgraph/src/jpgraph_bar.php');
class ReportsController extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->helper(array('form_helper'));
$this->load->model(array('admin_model', 'reportes_model'));
$this->load->library('excel');
valida_sesion($this->session->userdata('token_usuario'));
ini_set('max_execution_time', 0);
ini_set('memory_limit', '1024M');
}
function index($value = '')
{
//$object = PHPExcel_IOFactory::load($path);
$data["mensaje_error"] = $this->session->flashdata("mensaje_error");
$data['title'] = 'Inicio';
$data['main_content'] = 'reportes/index_view';
$this->load->view('shared/layout', $data);
}
function periods($value = '')
{
$data["periodos"] = $this->reportes_model->periodos();
$data["mensaje_error"] = $this->session->flashdata("mensaje_error");
$data['title'] = 'Periodos registrados';
$data['main_content'] = 'reportes/periodos_view';
$this->load->view('shared/layout', $data);
}
function vision_general($porcentaje = "")
{
$data['por'] = $porcentaje;
$data['filtros'] = $filtros = $this->input->post();
$data['detalles'] = $this->reportes_model->vision_general($filtros, $porcentaje);
$data['cc'] = get_result_by_where('centros_costos', ['id >' => 0]);
$data["mensaje_error"] = $this->session->flashdata("mensaje_error");
$data['title'] = 'Reporte Visión general';
$data['main_content'] = 'reportes/vision_general_view';
$this->load->view('shared/layout', $data);
}
function vision_general_busqueda()
{
$data['por'] = $_GET['por'];
$data['filtros'] = $filtros = $this->input->post();
$data['detalles'] = $this->reportes_model->vision_general($filtros);
$this->load->view('reportes/_vision_general_busqueda_view', $data);
}
// function cumplimiento($periodo_id)
// {
// $data['movimientos'] = $this->reportes_model->getConsolidado($periodo_id);
// //pre($this->db->last_query());
// //pre_die($data['movimientos']);
// $data["mensaje_error"] = $this->session->flashdata("mensaje_error");
// $data['title'] = 'Reporte cumplimiento';
// $data['main_content'] = 'reportes/cumplimiento_view';
// $this->load->view('shared/layout', $data);
// }
// function cumplimiento_detalle($filtros)
// {
// //$data['movimientos'] = $this->reportes_model->getConsolidado($periodo_id);
// //pre($this->db->last_query());
// //pre_die($data['movimientos']);
// $data["mensaje_error"] = $this->session->flashdata("mensaje_error");
// $data['title'] = 'Reporte cumplimiento';
// $data['main_content'] = 'reportes/cumplimiento_view';
// $this->load->view('shared/layout', $data);
// }
function consolidado($fecha = '')
{
$data['movimientos'] = $this->reportes_model->getConsolidado($fecha);
//pre($this->db->last_query());
//pre_die($data['movimientos']);
$data["mensaje_error"] = $this->session->flashdata("mensaje_error");
$data['title'] = 'Inicio';
$data['main_content'] = 'reportes/consolidado_view';
$this->load->view('shared/layout', $data);
}
public function reporte_incidencias()
{
$data['title'] = 'Reporte de incidencias';
$data['main_content'] = 'reportes/reporte_incidencias_view';
$data['employees'] = get_result_by_where('trabajadores', ['centros_costos_id !=' => '0']);
$this->load->view('shared/layout', $data);
}
public function reporte_incidencias_pdf()
{
$get = $this->input->get();
if (empty($get) || (!isset($get['worker_id']) || empty($get['worker_id']))) {
$this->session->set_flashdata("mensaje_error", "No se encontró información de trabajador");
redirect('dashboard/reportes/incidencias');
}
if ((!isset($get['month']) || empty($get['month'])) || (!isset($get['year']) || empty($get['year']))) {
$this->session->set_flashdata("mensaje_error", "No se encontró información de periodo");
redirect('dashboard/reportes/incidencias');
}
$employee = $this->db->query("SELECT * FROM trabajadores WHERE id = " . $get['worker_id'])->row();
if (empty($employee)) {
$this->session->set_flashdata("mensaje_error", "Trabajador no existe o fue eliminado");
redirect('dashboard/reportes/incidencias');
}
$year = $get['year'];
$month = $get['month'];
$date_from = date("$year-$month-01");
$date_to = date("Y-m-t", strtotime($date_from));
$movements = $this->db->query(
"SELECT *
FROM movimientos_reloj
WHERE rut = '$employee->rut' AND fecha BETWEEN '$date_from' AND '$date_to'
"
)->result();
$dias_sin_asistencia = 0;
$dias_sin_entrada = 0;
$dias_entradas_salidas_arr = [];
$dias_sin_salida = 0;
$dias_con_atrasos = 0;
$dias_salida_temprana = 0;
$total_jornada = 0;
$total_jornada_efectiva = 0;
$total_ausencia = 0;
$total_jornada_real = 0;
foreach ($movements as $key => $movement) {
if ($movement->hora_inicio != '00:00:00' && $movement->hora_termino != '00:00:00') {
if ($movement->entrada == '00:00:00' && $movement->salida == '00:00:00') {
$dias_sin_asistencia++;
$dias_entradas_salidas_arr[] = ordenarFechaHumano($movement->fecha) . " No registra entrada ni salida";
} else {
if ($movement->entrada == '00:00:00') {
$dias_sin_entrada++;
$dias_entradas_salidas_arr[] = ordenarFechaHumano($movement->fecha) . " No registra entrada";
} else {
if (strtotime($movement->entrada) > strtotime($movement->hora_inicio)) {
$dias_con_atrasos++;
$dias_entradas_salidas_arr[] = ordenarFechaHumano($movement->fecha) . " debía entrar $movement->hora_inicio y entró $movement->entrada";
}
}
if ($movement->salida == '00:00:00') {
$dias_entradas_salidas_arr[] = ordenarFechaHumano($movement->fecha) . " No registra salida";
$dias_sin_salida++;
} else {
if (strtotime($movement->salida) < strtotime($movement->hora_termino)) {
$dias_salida_temprana++;
$dias_entradas_salidas_arr[] = ordenarFechaHumano($movement->fecha) . " debía salir $movement->hora_termino y salió $movement->salida";
}
}
if (!empty($movement->total_jornada)) {
$minutes_jornada = differenceInMinutes($movement->hora_inicio, $movement->hora_termino);
$minutes_descanso = (timeToMinutes($movement->ausencia) + $movement->minutos_descanso);
$total_jornada += timeToMinutes($movement->total_jornada);
$total_jornada_real += $minutes_jornada - $minutes_descanso;
}
if (!empty($movement->total_jornada_efectiva)) {
$total_jornada_efectiva += timeToMinutes($movement->total_jornada_efectiva);
}
if (!empty($movement->ausencia)) {
$total_ausencia += timeToMinutes($movement->ausencia);
}
}
} else {
#FERIADO
}
}
// Datos para el gráfico de barras
$data = array(
(int)$dias_sin_asistencia,
(int)$dias_sin_entrada,
(int)$dias_sin_salida,
(int)$dias_con_atrasos,
(int)$dias_salida_temprana
);
$labels = array('Sin asistencia', 'No firma entrada', 'No firma salida', 'Firma atrasado AM', 'Salida temprana');
// Crear el gráfico de barras
$graph = new Graph(650, 200, 'auto');
$graph->SetScale('textlin');
// Configuración del gráfico
$graph->SetMargin(40, 30, 20, 40); // Ajustar los márgenes
// Configuración del eje X
$graph->xaxis->SetTickLabels($labels);
$graph->xaxis->title->Set('');
// Configuración del eje Y
$graph->yaxis->title->Set('Cantidad de faltas');
$graph->yaxis->SetLabelFormat('%d'); // Mostrar los valores del eje Y como enteros
// Crear la barra de datos
$barplot = new BarPlot($data);
$barplot->SetFillColor("blue"); // Color de las barras
$barplot->SetWidth(0.55); // Ancho de las barras
// Configurar los valores mostrados dentro de las barras
$barplot->value->Show();
$barplot->value->SetColor("black");
$barplot->value->SetAlign('top'); // Alinear los valores dentro de las barras
$graph->Add($barplot);
// Generar la imagen y guardarla en un archivo temporal
$temp_image_path = UPLOAD_PATH . strtotime(nowServer()) . '.png';
$graph->Stroke($temp_image_path);
// Verificar si la imagen se ha generado correctamente
if (!file_exists($temp_image_path)) {
die('Error: No se pudo generar la imagen.');
}
$porcentaje_horas_trabajadas = calculatePercentage($total_jornada_efectiva, $total_jornada_real);
$porcentaje_horas_no_trabajadas = calculatePercentage($total_ausencia, $total_jornada_real);
// Cargar la vista y pasar la ruta de la imagen
$data_html = [
'employee' => $employee,
'month' => getMonthName($month),
'year' => date($year),
'dias_sin_asistencia' => $dias_sin_asistencia,
'dias_sin_entrada' => $dias_sin_entrada,
'dias_entradas_salidas_arr' => $dias_entradas_salidas_arr,
'dias_sin_salida' => $dias_sin_salida,
'dias_con_atrasos' => $dias_con_atrasos,
'dias_salida_temprana' => $dias_salida_temprana,
'image_base64' => $temp_image_path,
'total_jornada' => minutesToTime($total_jornada),
'total_jornada_real' => minutesToTime($total_jornada_real),
'total_jornada_efectiva' => minutesToTime($total_jornada_efectiva),
'total_ausencia' => minutesToTime($total_ausencia),
'porcentaje_horas_trabajadas' => round($porcentaje_horas_trabajadas),
'porcentaje_horas_no_trabajadas' => round($porcentaje_horas_no_trabajadas),
];
$this->load->library('Pdf');
$html = $this->load->view('reportes/report_pdf_view', $data_html, TRUE);
$pdf_response = $this->pdf->createPDF2($html, 'ver');
unlink($temp_image_path);
}
}