<?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 [];
}
}
}
?>