<?php class FirmaController { private $modelo; public function __construct() { require_once 'models/FirmaModel.php'; $this->modelo = new FirmaModel(); } // ───────────────────────────────────────────────────────────── // HISTORIAL - ENTREFIRMA (búsqueda y listado) // URL: index.php?controller=Firma&action=index // ───────────────────────────────────────────────────────────── public function index() { $this->verificarSesion(); $cedula_busqueda = trim($_GET['cedula'] ?? ''); $resultados = []; $entregas_agrupadas = []; if (!empty($cedula_busqueda)) { try { $data = $this->modelo->obtenerHistorialPorCedula($cedula_busqueda); $resultados = $data['plano']; $entregas_agrupadas = $data['agrupado']; } catch (Exception $e) { $error = $e->getMessage(); } } include 'views/firmadot/historial.php'; } // ───────────────────────────────────────────────────────────── // FORMULARIO DE ENTREGA / FIRMA - FORMFIRM // URL: index.php?controller=Firma&action=formulario&cedula=X&fecha=Y&modo=firma // ───────────────────────────────────────────────────────────── public function formulario() { $this->verificarSesion(); $cedula = trim($_GET['cedula'] ?? ''); $fecha_consulta = trim($_GET['fecha'] ?? date('Y-m-d')); $modo_firma = isset($_GET['modo']) && $_GET['modo'] === 'firma'; if (empty($cedula)) { echo "<div style='text-align:center;margin-top:50px;'> <h2>No se proporcionó la cédula del empleado</h2> <a href='index.php?controller=Firma&action=index' class='btn btn-primary'>Volver</a> </div>"; return; } // Si hay PDF, redirigir al visor if ($this->modelo->tienePDF($cedula, $fecha_consulta)) { header("Location: index.php?controller=Firma&action=verPDF&cedula=" . urlencode($cedula) . "&fecha=" . urlencode($fecha_consulta)); exit(); } // Datos generales $primera_entrega = $this->modelo->obtenerPrimeraEntregaDia($cedula, $fecha_consulta); if (!$primera_entrega) { echo "<div style='text-align:center;margin-top:50px;'> <h2>No se encontraron entregas para la fecha seleccionada</h2> <a href='index.php?controller=Firma&action=index' class='btn btn-primary'>Volver</a> </div>"; return; } $nombre = $primera_entrega['nombre']; $operario = $this->modelo->obtenerOperario($cedula); $cargo = $operario['cargo'] ?? 'No especificado'; // Elementos del día con tallas $dataDia = $this->modelo->obtenerElementosDia($cedula, $fecha_consulta); $elementos = $dataDia['elementos']; $hay_firma = $dataDia['hay_firma']; $hay_pdf = $dataDia['hay_pdf']; $firma_imagen = $dataDia['firma_img']; // Datos de fecha para el documento $FECHAD = date("d"); $FECHAM = date("m"); $FECHAY = date("Y"); include 'views/firmadot/formulario_firma.php'; } // ───────────────────────────────────────────────────────────── // GUARDAR FIRMA (por fecha) // POST AJAX → index.php?controller=Firma&action=guardarFirmaFecha // ───────────────────────────────────────────────────────────── public function guardarFirmaFecha() { header('Content-Type: application/json'); $this->verificarSesion(); $cedula = $_POST['cedula'] ?? ''; $fecha = $_POST['fecha'] ?? ''; $firmaData = $_POST['firma'] ?? ''; if (empty($cedula) || empty($fecha) || empty($firmaData)) { echo json_encode(['success' => false, 'message' => 'Datos incompletos']); exit(); } try { $filas = $this->modelo->guardarFirmaFecha($cedula, $fecha, $firmaData); if ($filas > 0) { echo json_encode([ 'success' => true, 'message' => "Firma guardada correctamente. Se actualizaron $filas registros." ]); } else { echo json_encode(['success' => false, 'message' => 'No se encontraron registros para actualizar']); } } catch (Exception $e) { echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); } exit(); } // ───────────────────────────────────────────────────────────── // GUARDAR FIRMA (individual por ID) // POST AJAX → index.php?controller=Firma&action=guardarFirma // ───────────────────────────────────────────────────────────── public function guardarFirma() { header('Content-Type: application/json'); $this->verificarSesion(); $id = $_POST['id'] ?? ''; $cedula = $_POST['cedula'] ?? ''; $firmaData = $_POST['firma'] ?? ''; if (empty($id) || empty($cedula) || empty($firmaData)) { echo json_encode(['success' => false, 'message' => 'Datos incompletos']); exit(); } if (!preg_match('/^data:image\/(png|jpeg);base64,/', $firmaData)) { echo json_encode(['success' => false, 'message' => 'Formato de firma no válido']); exit(); } try { $ok = $this->modelo->guardarFirmaIndividual($id, $cedula, $firmaData); if ($ok) { echo json_encode([ 'success' => true, 'message' => 'Firma guardada correctamente', 'redirect' => 'index.php?controller=Firma&action=formulario&cedula=' . urlencode($cedula) ]); } else { echo json_encode(['success' => false, 'message' => 'No se pudo guardar la firma']); } } catch (Exception $e) { echo json_encode(['success' => false, 'message' => $e->getMessage()]); } exit(); } // ───────────────────────────────────────────────────────────── // GUARDAR PDF // POST AJAX → index.php?controller=Firma&action=guardarPDF // ───────────────────────────────────────────────────────────── public function guardarPDF() { header('Content-Type: application/json'); $this->verificarSesion(); $cedula = $_POST['cedula'] ?? ''; $fecha = $_POST['fecha'] ?? ''; if (empty($cedula) || empty($fecha) || !isset($_FILES['archivoPDF'])) { echo json_encode(['success' => false, 'message' => 'Datos incompletos']); exit(); } $archivo = $_FILES['archivoPDF']; if ($archivo['error'] !== UPLOAD_ERR_OK) { echo json_encode(['success' => false, 'message' => 'Error al subir el archivo']); exit(); } if ($archivo['type'] !== 'application/pdf') { echo json_encode(['success' => false, 'message' => 'Solo se permiten archivos PDF']); exit(); } if ($archivo['size'] > 5 * 1024 * 1024) { echo json_encode(['success' => false, 'message' => 'El archivo supera el límite de 5MB']); exit(); } try { $pdfData = file_get_contents($archivo['tmp_name']); if ($pdfData === false) throw new Exception('No se pudo leer el archivo'); $filas = $this->modelo->guardarPDF($cedula, $fecha, $pdfData); if ($filas > 0) { echo json_encode([ 'success' => true, 'message' => "PDF guardado correctamente. Se actualizaron $filas registros." ]); } else { echo json_encode(['success' => false, 'message' => 'No se encontraron registros para actualizar']); } } catch (Exception $e) { echo json_encode(['success' => false, 'message' => $e->getMessage()]); } exit(); } // ───────────────────────────────────────────────────────────── // VER PDF // GET → index.php?controller=Firma&action=verPDF&cedula=X&fecha=Y // ───────────────────────────────────────────────────────────── public function verPDF() { $cedula = $_GET['cedula'] ?? ''; $fecha = $_GET['fecha'] ?? ''; if (empty($cedula) || empty($fecha)) { die('Parámetros faltantes'); } $pdfData = $this->modelo->obtenerPDF($cedula, $fecha); if ($pdfData) { header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="entrega_' . $cedula . '_' . $fecha . '.pdf"'); header('Cache-Control: private, max-age=0, must-revalidate'); echo $pdfData; } else { die('PDF no encontrado'); } exit(); } // ───────────────────────────────────────────────────────────── // EXPORTAR PDF (vista imprimible con firmas) // GET → index.php?controller=Firma&action=exportarPDF&cedula=X // ───────────────────────────────────────────────────────────── public function exportarPDF() { $this->verificarSesion(); $cedula_busqueda = trim($_GET['cedula'] ?? ''); if (empty($cedula_busqueda)) { die('Error: No se especificó la cédula del empleado.'); } $stmt = $this->modelo->exportarRegistros($cedula_busqueda); if (empty($stmt)) { die('Error: No se encontraron entregas para esta cédula.'); } $resultados = $stmt; $primer_registro = $resultados[0]; include 'views/firmadot/exportar_pdf.php'; } // ───────────────────────────────────────────────────────────── private function verificarSesion() { if (!isset($_SESSION['DIGITA']) || empty($_SESSION['DIGITA'])) { header('Location: index.php'); exit(); } } } ?>