File "FirmaModel.php"

Full Path: C:/wamp64/www/AVIDOTAPP/uploads/docs/FirmaModel.php
File size: 7.31 KB
MIME-type: text/x-php
Charset: utf-8

<?php
class FirmaModel {
    private $conexion;

    public function __construct() {
        $database = new Database();
        $this->conexion = $database->connect();
    }

    /**
     * Buscar historial completo de entregas de un empleado, agrupado por fecha
     */
    public function obtenerHistorialPorCedula($cedula) {
        $cedula = mysqli_real_escape_string($this->conexion, $cedula);
        $query = "SELECT * FROM entregasst 
                  WHERE cedula = '$cedula' 
                  ORDER BY DATE(fEntrega) DESC, fEntrega DESC";
        $result = mysqli_query($this->conexion, $query);

        if (!$result) {
            throw new Exception("Error al consultar historial: " . mysqli_error($this->conexion));
        }

        $resultados = [];
        while ($row = mysqli_fetch_assoc($result)) {
            $resultados[] = $row;
        }

        // Agrupar por fecha
        $agrupadas = [];
        foreach ($resultados as $entrega) {
            $fecha = date('Y-m-d', strtotime($entrega['fEntrega']));
            $agrupadas[$fecha][] = $entrega;
        }

        return ['plano' => $resultados, 'agrupado' => $agrupadas];
    }

    /**
     * Obtener elementos entregados de una fecha, agrupados por código+descripción (suma de cantidades)
     */
    public function obtenerElementosDia($cedula, $fecha) {
        // Primero obtener tallas del empleado
        $stmtTallas = $this->conexion->prepare(
            "SELECT TALLAPANT, TALLACAMI, TALLABOT, tallachaq, tallaimp
             FROM empleado WHERE cedula = ? LIMIT 1"
        );
        $stmtTallas->bind_param("s", $cedula);
        $stmtTallas->execute();
        $tallas = $stmtTallas->get_result()->fetch_assoc() ?? [];

        // Obtener entregas agrupadas por código + descripción, sumando cantidades
        $stmt = $this->conexion->prepare(
            "SELECT e.codigo, e.epp, SUM(e.CANTIDAD) AS CANTIDAD,
                    MAX(e.userEntrega) AS userEntrega,
                    MAX(e.fEntrega)    AS fEntrega,
                    MAX(e.FIRMA)       AS FIRMA,
                    MAX(e.PDF)         AS PDF
             FROM entregasst e
             WHERE e.cedula = ? AND DATE(e.fEntrega) = ?
             GROUP BY e.codigo, e.epp
             ORDER BY e.codigo ASC"
        );
        $stmt->bind_param("ss", $cedula, $fecha);
        $stmt->execute();
        $result = $stmt->get_result();

        $elementos = [];
        $hay_firma = false;
        $hay_pdf   = false;
        $firma_img = '';

        while ($row = $result->fetch_assoc()) {
            // Agregar tallas a cada fila
            $row['TALLAPANT'] = $tallas['TALLAPANT'] ?? '';
            $row['TALLACAMI'] = $tallas['TALLACAMI'] ?? '';
            $row['TALLABOT']  = $tallas['TALLABOT']  ?? '';
            $row['tallachaq'] = $tallas['tallachaq']  ?? '';
            $row['tallaimp']  = $tallas['tallaimp']   ?? '';

            $elementos[] = $row;

            if (!$hay_firma && !empty($row['FIRMA'])) {
                $hay_firma = true;
                $firma_img = $row['FIRMA'];
            }
            if (!$hay_pdf && !empty($row['PDF'])) {
                $hay_pdf = true;
            }
        }

        return [
            'elementos' => $elementos,
            'hay_firma' => $hay_firma,
            'hay_pdf'   => $hay_pdf,
            'firma_img' => $firma_img,
        ];
    }

    /**
     * Obtener la primera entrega de una fecha (para datos generales)
     */
    public function obtenerPrimeraEntregaDia($cedula, $fecha) {
        $stmt = $this->conexion->prepare(
            "SELECT * FROM entregasst 
             WHERE cedula = ? AND DATE(fEntrega) = ? 
             ORDER BY fEntrega ASC LIMIT 1"
        );
        $stmt->bind_param("ss", $cedula, $fecha);
        $stmt->execute();
        $result = $stmt->get_result();
        return $result->fetch_assoc();
    }

    /**
     * Verificar si existen PDFs para la fecha
     */
    public function tienePDF($cedula, $fecha) {
        $stmt = $this->conexion->prepare(
            "SELECT COUNT(*) AS total FROM entregasst 
             WHERE cedula = ? AND DATE(fEntrega) = ? AND PDF IS NOT NULL"
        );
        $stmt->bind_param("ss", $cedula, $fecha);
        $stmt->execute();
        $row = $stmt->get_result()->fetch_assoc();
        return intval($row['total']) > 0;
    }

    /**
     * Obtener datos del operario desde la tabla empleado
     */
    public function obtenerOperario($cedula) {
        $stmt = $this->conexion->prepare("SELECT * FROM empleado WHERE cedula = ?");
        $stmt->bind_param("s", $cedula);
        $stmt->execute();
        return $stmt->get_result()->fetch_assoc();
    }

    /**
     * Exportar todos los registros de un empleado para PDF imprimible
     */
    public function exportarRegistros($cedula) {
        $cedula = mysqli_real_escape_string($this->conexion, $cedula);
        $query  = "SELECT * FROM entregasst 
                   WHERE cedula = '$cedula' 
                   ORDER BY FIRMA IS NULL DESC, fEntrega DESC";
        $result = mysqli_query($this->conexion, $query);

        if (!$result) return [];

        $rows = [];
        while ($row = mysqli_fetch_assoc($result)) {
            $rows[] = $row;
        }
        return $rows;
    }

    /**
     * Obtener el primer PDF disponible para mostrar
     */
    public function obtenerPDF($cedula, $fecha) {
        $stmt = $this->conexion->prepare(
            "SELECT PDF FROM entregasst 
             WHERE cedula = ? AND DATE(fEntrega) = ? AND PDF IS NOT NULL 
             LIMIT 1"
        );
        $stmt->bind_param("ss", $cedula, $fecha);
        $stmt->execute();
        $row = $stmt->get_result()->fetch_assoc();
        return $row ? $row['PDF'] : null;
    }

    /**
     * Guardar firma digital para todas las entregas de una fecha
     */
    public function guardarFirmaFecha($cedula, $fecha, $firmaData) {
        $stmt = $this->conexion->prepare(
            "UPDATE entregasst SET FIRMA = ? WHERE cedula = ? AND DATE(fEntrega) = ?"
        );
        $stmt->bind_param("sss", $firmaData, $cedula, $fecha);

        if (!$stmt->execute()) {
            throw new Exception("Error al guardar firma: " . $stmt->error);
        }

        return $stmt->affected_rows;
    }

    /**
     * Guardar firma individual por ID
     */
    public function guardarFirmaIndividual($id, $cedula, $firmaData) {
        $stmt = $this->conexion->prepare(
            "UPDATE entregasst SET FIRMA = ? WHERE ID = ? AND cedula = ?"
        );
        $stmt->bind_param("sis", $firmaData, $id, $cedula);

        if (!$stmt->execute()) {
            throw new Exception("Error al guardar firma: " . $stmt->error);
        }

        return $stmt->affected_rows > 0;
    }

    /**
     * Guardar PDF para todas las entregas de una fecha
     */
    public function guardarPDF($cedula, $fecha, $pdfData) {
        $stmt = $this->conexion->prepare(
            "UPDATE entregasst SET PDF = ? WHERE cedula = ? AND DATE(fEntrega) = ?"
        );
        $stmt->bind_param("sss", $pdfData, $cedula, $fecha);

        if (!$stmt->execute()) {
            throw new Exception("Error al guardar PDF: " . $stmt->error);
        }

        return $stmt->affected_rows;
    }
}
?>