File "RequisicionController.php"

Full Path: C:/wamp64/www/Seleccion/node_modules/inherits/RequisicionController.php
File size: 7.92 KB
MIME-type: text/x-php
Charset: utf-8

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