<?php // controllers/RequisicionController.php require_once __DIR__ . '/../models/requisicionModel.php'; require_once __DIR__ . '/../config/Database.php'; require_once __DIR__ . '/../config/EmailHelper.php'; class RequisicionController { private $db; private $requisicion; private $emailHelper; public function __construct() { $database = new Database(); $this->db = $database->connect(); $this->requisicion = new Requisicion($this->db); $this->emailHelper = new EmailHelper(); } // ✅ ACCIÓN: Mostrar formulario con áreas y cargos cargados desde DB public function formulario() { // Obtener las áreas desde la base de datos $areas = $this->requisicion->obtenerAreas(); // Obtener los cargos desde la base de datos $cargos = $this->requisicion->obtenerCargos(); // Cargar la vista pasando las áreas y cargos como variables require_once __DIR__ . '/../views/requisicion/formulario.php'; } public function crear() { if($_SERVER['REQUEST_METHOD'] == 'POST') { $datos = [ 'fecha_solicitud' => $_POST['fecha_solicitud'], 'empresa' => $_POST['empresa'] ?? 'AGROAVICOLA SANMARINO', 'regional' => $_POST['regional'], 'area' => $_POST['area'], 'ciudad_ubicacion' => $_POST['ciudad_ubicacion'], 'centro_costo' => $_POST['centro_costo'], 'nombre_cargo' => $_POST['nombre_cargo'], 'adjunto_descripcion' => $_POST['adjunto_descripcion'] ?? null, 'numero_vacantes' => $_POST['numero_vacantes'] ?? 1, 'tipo_contrato' => $_POST['tipo_contrato'], 'salario_fijo' => $_POST['salario_fijo'] ?? null, 'proporcion_flexible' => $_POST['proporcion_flexible'] ?? null, 'salario_variable' => $_POST['salario_variable'] ?? null, 'tiene_comisiones' => $_POST['tiene_comisiones'] ?? 'No', 'tiene_rodamiento' => $_POST['tiene_rodamiento'] ?? 'No', 'rango_rodamiento' => $_POST['rango_rodamiento'] ?? null, 'tabla_comisiones' => $_POST['tabla_comisiones'] ?? null, 'requiere_vehiculo' => $_POST['requiere_vehiculo'] ?? 'No', 'flexibilidad_ubicacion' => $_POST['flexibilidad_ubicacion'] ?? 'No', 'clausula_transversalidad' => $_POST['clausula_transversalidad'] ?? 'No', 'observaciones_perfil' => $_POST['observaciones_perfil'] ?? null, 'otras_condiciones' => $_POST['otras_condiciones'] ?? null, 'justificacion_requisicion' => $_POST['justificacion_requisicion'], 'tipo_busqueda' => $_POST['tipo_busqueda'] ?? 'Externa', 'firma_jefe' => $_POST['firma_jefe'] ?? null, 'firma_aprobacion' => $_POST['firma_aprobacion'] ?? null, 'usuario_solicita_id' => $_SESSION['usuario_id'] ?? null, 'email_solicita' => $_SESSION['usuario_email'] ?? $_POST['email_solicita'], 'reemplazo' => $_POST['reemplazo'] ?? null ]; $id = $this->requisicion->crear($datos); if($id) { // Obtener los datos completos de la requisición creada $reqData = $this->requisicion->obtenerPorId($id); // ✅ ENVIAR CORREO AL ADMINISTRADOR DIRECTAMENTE DESDE PHP try { $emailEnviado = $this->emailHelper->notificarNuevaRequisicion($reqData); if($emailEnviado) { error_log("✅ Notificación enviada al administrador para requisición: " . $reqData['codigo']); } else { error_log("⚠️ No se pudo enviar el correo al administrador"); } } catch(Exception $e) { error_log("❌ Error al enviar correo: " . $e->getMessage()); // Continuar aunque falle el correo - no afecta la creación de la requisición } echo json_encode([ 'success' => true, 'message' => 'Requisición creada exitosamente', 'codigo' => $reqData['codigo'], 'id' => $id, 'datos_requisicion' => $reqData ]); } else { echo json_encode(['success' => false, 'message' => 'Error al crear requisición']); } } } public function listar() { $filtros = []; if(isset($_GET['estado'])) { $filtros['estado'] = $_GET['estado']; } $requisiciones = $this->requisicion->obtenerTodas($filtros); echo json_encode(['success' => true, 'data' => $requisiciones]); } public function obtener($id) { $requisicion = $this->requisicion->obtenerPorId($id); if($requisicion) { echo json_encode(['success' => true, 'data' => $requisicion]); } else { echo json_encode(['success' => false, 'message' => 'Requisición no encontrada']); } } // ✅ ACCIÓN: Vista de detalle de la requisición public function detalle() { if(!isset($_GET['id'])) { echo "<h1>Error</h1><p>ID de requisición no proporcionado</p>"; return; } $id = $_GET['id']; $requisicion = $this->requisicion->obtenerPorId($id); if(!$requisicion) { echo "<h1>Error</h1><p>Requisición no encontrada</p>"; return; } // Cargar la vista de detalle require_once __DIR__ . '/../views/requisicion/detalle.php'; } public function actualizarEstado() { if($_SERVER['REQUEST_METHOD'] == 'POST') { $id = $_POST['id']; $nuevoEstado = $_POST['estado']; $fecha_notificacion = ($nuevoEstado == 'En Proceso') ? date('Y-m-d H:i:s') : null; // ✅ NUEVO: Obtener observación si el estado es "Anulada" $observacion_anulacion = null; if ($nuevoEstado === 'Anulada') { $observacion_anulacion = $_POST['observacion_anulacion'] ?? null; } // Actualizar el estado en la base de datos $resultado = $this->requisicion->actualizarEstado($id, $nuevoEstado, $fecha_notificacion, $observacion_anulacion); if($resultado) { // Obtener requisición actualizada con todos los datos $reqData = $this->requisicion->obtenerPorId($id); // ✅ ENVIAR CORREO AL SOLICITANTE DIRECTAMENTE DESDE PHP try { $emailEnviado = $this->emailHelper->notificarCambioEstado($reqData, $nuevoEstado); if($emailEnviado) { error_log("✅ Notificación enviada al solicitante para requisición: " . $reqData['codigo']); } else { error_log("⚠️ No se pudo enviar el correo al solicitante"); } } catch(Exception $e) { error_log("❌ Error al enviar correo: " . $e->getMessage()); // Continuar aunque falle el correo - no afecta la actualización } echo json_encode([ 'success' => true, 'message' => 'Estado actualizado correctamente', 'requisicion' => $reqData ]); } else { echo json_encode([ 'success' => false, 'message' => 'Error al actualizar el estado' ]); } } } public function estadisticas() { $stats = $this->requisicion->contarPorEstado(); echo json_encode(['success' => true, 'data' => $stats]); } } ?>