File "CapacitacionModel.php"

Full Path: C:/wamp64/www/Asistencia_Capacitacion/Modelos/CapacitacionModel.php
File size: 6.36 KB
MIME-type: text/x-php
Charset: utf-8

<?php
// File: Modelos/CapacitacionModel.php

require_once 'Database.php';

class CapacitacionModel {
    private $db;

    public function __construct() {
        $this->db = Database::getInstance()->getConnection();
    }

    /**
     * Inserta una nueva capacitación.
     */
    public function crearCapacitacion($codigo, $tema, $empresaId) {
        if (empty($codigo) || empty($tema) || empty($empresaId)) {
            return ['success' => false, 'message' => "El código, el tema y la empresa son campos obligatorios."];
        }

        $sql = "INSERT INTO capacitaciones (CODIGO, CAPACITACION, empresa_id) VALUES (:codigo, :tema, :empresa_id)";
        
        try {
            $stmt = $this->db->prepare($sql);
            $stmt->bindParam(':codigo',     $codigo,    PDO::PARAM_STR);
            $stmt->bindParam(':tema',       $tema,      PDO::PARAM_STR);
            $stmt->bindParam(':empresa_id', $empresaId, PDO::PARAM_INT);

            if ($stmt->execute()) {
                return ['success' => true, 'message' => "Capacitación '$tema' registrada con éxito."];
            }

            $errorInfo = $stmt->errorInfo();
            if ($errorInfo[1] == 1062) {
                return ['success' => false, 'message' => "Error: Ya existe una capacitación con el código '$codigo'."];
            }
            return ['success' => false, 'message' => "Error al registrar: " . $errorInfo[2]];

        } catch (PDOException $e) {
            if ($e->getCode() == '23000' && strpos($e->getMessage(), '1452') !== false) {
                return ['success' => false, 'message' => "Error: El ID de Empresa seleccionado no existe."];
            }
            return ['success' => false, 'message' => "Error de base de datos: " . $e->getMessage()];
        }
    }

    /**
     * Actualiza una capacitación existente identificada por su código original.
     */
    public function actualizarCapacitacion($codigoOriginal, $nuevoCodigo, $tema, $empresaId) {
        if (empty($codigoOriginal) || empty($nuevoCodigo) || empty($tema) || empty($empresaId)) {
            return ['success' => false, 'message' => "Todos los campos son obligatorios para actualizar."];
        }

        $sql = "UPDATE capacitaciones 
                SET CODIGO = :nuevo_codigo, CAPACITACION = :tema, empresa_id = :empresa_id
                WHERE CODIGO = :codigo_original";

        try {
            $stmt = $this->db->prepare($sql);
            $stmt->bindParam(':nuevo_codigo',    $nuevoCodigo,    PDO::PARAM_STR);
            $stmt->bindParam(':tema',            $tema,           PDO::PARAM_STR);
            $stmt->bindParam(':empresa_id',      $empresaId,      PDO::PARAM_INT);
            $stmt->bindParam(':codigo_original', $codigoOriginal, PDO::PARAM_STR);

            if ($stmt->execute()) {
                if ($stmt->rowCount() > 0) {
                    return ['success' => true, 'message' => "Capacitación '$nuevoCodigo' actualizada con éxito."];
                }
                return ['success' => false, 'message' => "No se encontró la capacitación con código '$codigoOriginal'."];
            }

            $errorInfo = $stmt->errorInfo();
            if ($errorInfo[1] == 1062) {
                return ['success' => false, 'message' => "Error: Ya existe una capacitación con el código '$nuevoCodigo'."];
            }
            return ['success' => false, 'message' => "Error al actualizar: " . $errorInfo[2]];

        } catch (PDOException $e) {
            if ($e->getCode() == '23000' && strpos($e->getMessage(), '1452') !== false) {
                return ['success' => false, 'message' => "Error: El ID de Empresa seleccionado no existe."];
            }
            return ['success' => false, 'message' => "Error de base de datos: " . $e->getMessage()];
        }
    }

    /**
     * Elimina una capacitación por su código.
     */
    public function eliminarCapacitacion($codigo) {
        if (empty($codigo)) {
            return ['success' => false, 'message' => "El código es obligatorio para eliminar."];
        }

        $sql = "DELETE FROM capacitaciones WHERE CODIGO = :codigo";

        try {
            $stmt = $this->db->prepare($sql);
            $stmt->bindParam(':codigo', $codigo, PDO::PARAM_STR);

            if ($stmt->execute()) {
                if ($stmt->rowCount() > 0) {
                    return ['success' => true, 'message' => "Capacitación '$codigo' eliminada con éxito."];
                }
                return ['success' => false, 'message' => "No se encontró la capacitación con código '$codigo'."];
            }

            return ['success' => false, 'message' => "Error al eliminar la capacitación."];

        } catch (PDOException $e) {
            // Error de FK: la capacitación tiene registros dependientes
            if ($e->getCode() == '23000') {
                return ['success' => false, 'message' => "No se puede eliminar: la capacitación tiene registros asociados."];
            }
            return ['success' => false, 'message' => "Error de base de datos: " . $e->getMessage()];
        }
    }

    /**
     * Obtiene una capacitación por su código (para el modo edición).
     */
    public function getCapacitacionPorCodigo($codigo) {
        $sql = "SELECT c.CODIGO, c.CAPACITACION, c.empresa_id, e.nombre_empresa
                FROM capacitaciones c
                JOIN empresa e ON c.empresa_id = e.id
                WHERE c.CODIGO = :codigo
                LIMIT 1";
        try {
            $stmt = $this->db->prepare($sql);
            $stmt->bindParam(':codigo', $codigo, PDO::PARAM_STR);
            $stmt->execute();
            return $stmt->fetch(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("CapacitacionModel ERROR getCapacitacionPorCodigo: " . $e->getMessage());
            return null;
        }
    }

    /**
     * Obtiene todas las capacitaciones (para la tabla de listado).
     */
    public function getCapacitaciones() {
        $sql = "SELECT c.CODIGO, c.CAPACITACION, c.empresa_id, e.nombre_empresa
                FROM capacitaciones c
                JOIN empresa e ON c.empresa_id = e.id
                ORDER BY c.CAPACITACION ASC";
        try {
            $stmt = $this->db->query($sql);
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("CapacitacionModel ERROR getCapacitaciones: " . $e->getMessage());
            return [];
        }
    }
}
?>