File "FirmaController-20260419140658.php"

Full Path: C:/wamp64/www/AVIDOTAPP/controllers/FirmaController-20260419140658.php
File size: 11.97 KB
MIME-type: text/x-php
Charset: utf-8

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