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