File "CandidatoController.php"

Full Path: C:/wamp64/www/Seleccion/controllers/CandidatoController.php
File size: 10.69 KB
MIME-type: text/x-php
Charset: utf-8

<?php
// controllers/CandidatoController.php

require_once __DIR__ . '/../models/candidatoModel.php';
require_once __DIR__ . '/../models/entrevistaModel.php';
require_once __DIR__ . '/../models/examenModel.php';
require_once __DIR__ . '/../config/Database.php';

class CandidatoController {
    private $db;
    private $candidato;
    private $entrevista;
    private $examen;

    public function __construct() {
        $database = new Database();
        $this->db = $database->connect();
        $this->candidato = new Candidato($this->db);
        $this->entrevista = new Entrevista($this->db);
        $this->examen = new Examen($this->db);
    }

    // ✅ NUEVO: Buscar candidatos por múltiples cédulas
    public function buscarPorCedulas() {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            // Obtener el JSON del body
            $json = file_get_contents('php://input');
            $datos = json_decode($json, true);
            
            if(!isset($datos['cedulas']) || !is_array($datos['cedulas'])) {
                echo json_encode([
                    'success' => false,
                    'message' => 'Formato de datos inválido'
                ]);
                return;
            }
            
            $cedulas = array_slice($datos['cedulas'], 0, 10); // Limitar a 10
            
            if(count($cedulas) === 0) {
                echo json_encode([
                    'success' => false,
                    'message' => 'No se proporcionaron cédulas para buscar'
                ]);
                return;
            }
            
            // Buscar historial de cada cédula
            $resultados = [];
            foreach($cedulas as $cedula) {
                $historial = $this->candidato->obtenerHistorialPorCedula($cedula);
                $resultados[$cedula] = $historial;
            }
            
            echo json_encode([
                'success' => true,
                'data' => $resultados,
                'total_cedulas' => count($cedulas)
            ]);
        }
    }

    // FASE 1: Crear candidato
    public function crearFase1() {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            $datos = [
                'requisicion_id' => $_POST['requisicion_id'],
                'cedula' => $_POST['cedula'],
                'nombres_apellidos' => $_POST['nombres_apellidos'],
                'antecedentes' => $_POST['antecedentes'] ?? 'Pendiente',
                'celular' => $_POST['celular']
            ];

            $id = $this->candidato->crear($datos);

            if($id) {
                $veces = $this->candidato->obtenerVecesProceso($datos['cedula']);
                
                echo json_encode([
                    'success' => true,
                    'message' => 'Candidato registrado en Fase 1',
                    'id' => $id,
                    'alerta' => $veces > 1 ? "ALERTA: Este candidato ha estado en proceso $veces veces" : null,
                    'veces_proceso' => $veces
                ]);
            } else {
                echo json_encode(['success' => false, 'message' => 'Error al registrar candidato']);
            }
        }
    }

    // FASE 2: Registrar entrevista
    public function crearFase2() {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            $candidato_id = $_POST['candidato_id'];
            
            $datos = [
                'candidato_id' => $candidato_id,
                'referidor_nombre' => $_POST['referidor_nombre'] ?? null,
                'referidor_cedula' => $_POST['referidor_cedula'] ?? null,
                'referidor_area' => $_POST['referidor_area'] ?? null,
                'centro_costos' => $_POST['centro_costos'] ?? null,
                'area' => $_POST['area'] ?? null,
                'cargo' => $_POST['cargo'] ?? null,
                'ciudad_vacante' => $_POST['ciudad_vacante'] ?? null,
                'entidad_reclutadora' => $_POST['entidad_reclutadora'] ?? null,
                'fecha_entrevista' => $_POST['fecha_entrevista'] ?? null,
                'supervisor_entrevista' => $_POST['supervisor_entrevista'] ?? null,
                'concepto_entrevista' => $_POST['concepto_entrevista'] ?? null,
                'resultado_entrevista' => $_POST['resultado_entrevista'] ?? 'Pendiente'
            ];

            $id = $this->entrevista->crear($datos);

            if($id) {
                // Actualizar fase del candidato
                $this->candidato->actualizarFase($candidato_id, 'fase2');
                
                echo json_encode([
                    'success' => true,
                    'message' => 'Entrevista registrada - Fase 2 completada',
                    'id' => $id
                ]);
            } else {
                echo json_encode(['success' => false, 'message' => 'Error al registrar entrevista']);
            }
        }
    }

    // FASE 3: Registrar exámenes
    public function crearFase3() {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            $candidato_id = $_POST['candidato_id'];
            
            $datos = [
                'candidato_id' => $candidato_id,
                'examenes_medicos' => $_POST['examenes_medicos'] ?? 'Pendiente',
                'poligrafo' => $_POST['poligrafo'] ?? 'Pendiente',
                'contratado' => $_POST['contratado'] ?? 'No',
                'fecha_contratacion' => !empty($_POST['fecha_contratacion']) ? $_POST['fecha_contratacion'] : date('Y-m-d'),
                'observaciones' => $_POST['observaciones'] ?? null,
                'motivo_rechazo_examen' => $_POST['observacion_rechazada'] ?? null
            ];

            $id = $this->examen->crear($datos);

            if($id) {
                // Actualizar fase y estado del candidato
                $this->candidato->actualizarFase($candidato_id, 'fase3');
                
                if($datos['contratado'] == 'Si') {
                    $this->candidato->actualizarEstado($candidato_id, 'Contratado');
                    $this->candidato->actualizarFase($candidato_id, 'contratado');
                }
                
                echo json_encode([
                    'success' => true,
                    'message' => 'Exámenes registrados - Fase 3 completada',
                    'id' => $id
                ]);
            } else {
                echo json_encode(['success' => false, 'message' => 'Error al registrar exámenes']);
            }
        }
    }

    // Listar candidatos por fase
    public function listarPorFase() {
        $fase = $_GET['fase'] ?? 'fase1';
        $candidatos = $this->candidato->obtenerTodosPorFase($fase);
        echo json_encode(['success' => true, 'data' => $candidatos]);
    }

    // Obtener detalle completo de candidato
    public function obtenerCompleto($id) {
        $candidato = $this->candidato->obtenerCompleto($id);
        $entrevista = $this->entrevista->obtenerPorCandidato($id);
        $examen = $this->examen->obtenerPorCandidato($id);
        
        echo json_encode([
            'success' => true,
            'data' => [
                'candidato' => $candidato,
                'entrevista' => $entrevista,
                'examen' => $examen
            ]
        ]);
    }

    // Obtener alertas de un candidato
    public function obtenerAlertas() {
        $cedula = $_GET['cedula'];
        $alertas = $this->candidato->obtenerAlertas($cedula);
        
        echo json_encode([
            'success' => true,
            'data' => $alertas,
            'total' => count($alertas)
        ]);
    }

    // Actualizar fase 2
    public function actualizarFase2() {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            $id = $_POST['id'];
            
            $datos = [
                'referidor_nombre' => $_POST['referidor_nombre'],
                'referidor_cedula' => $_POST['referidor_cedula'],
                'referidor_area' => $_POST['referidor_area'],
                'centro_costos' => $_POST['centro_costos'],
                'area' => $_POST['area'],
                'cargo' => $_POST['cargo'],
                'ciudad_vacante' => $_POST['ciudad_vacante'],
                'entidad_reclutadora' => $_POST['entidad_reclutadora'],
                'fecha_entrevista' => $_POST['fecha_entrevista'],
                'supervisor_entrevista' => $_POST['supervisor_entrevista'],
                'concepto_entrevista' => $_POST['concepto_entrevista'],
                'resultado_entrevista' => $_POST['resultado_entrevista']
            ];

            $resultado = $this->entrevista->actualizar($id, $datos);
            echo json_encode(['success' => $resultado]);
        }
    }

    // Vista de detalle completo del candidato por fases
    public function detalleCandidato() {
        $id = $_GET['id'] ?? null;

        if (!$id) {
            header('Location: index.php?controller=candidato&action=gestion');
            exit;
        }

        // Obtener datos de las 3 fuentes
        $candidatoRaw = $this->candidato->obtenerCompleto($id);

        // Si la vista no devuelve los campos de requisicion, buscar por ID directo
        if (empty($candidatoRaw)) {
            $stmt = $this->db->prepare(
                "SELECT c.*, r.codigo as requisicion_codigo, r.nombre_cargo, r.area
                 FROM candidatos c
                 LEFT JOIN requisiciones r ON c.requisicion_id = r.id
                 WHERE c.id = :id"
            );
            $stmt->bindValue(':id', $id);
            $stmt->execute();
            $candidatoRaw = $stmt->fetch();
        }

        $candidato  = $candidatoRaw;
        $entrevista = $this->entrevista->obtenerPorCandidato($id);
        $examen     = $this->examen->obtenerPorCandidato($id);

        require_once 'views/candidato/detalleCandidato.php';
    }

    // Actualizar fase 3
    public function actualizarFase3() {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            $id = $_POST['id'];
            $candidato_id = $_POST['candidato_id'];
            
            $datos = [
                'examenes_medicos' => $_POST['examenes_medicos'],
                'poligrafo' => $_POST['poligrafo'],
                'contratado' => $_POST['contratado'],
                'fecha_contratacion' => !empty($_POST['fecha_contratacion']) ? $_POST['fecha_contratacion'] : date('Y-m-d'),
                'observaciones' => $_POST['observaciones'],
                'motivo_rechazo_examen' => $_POST['observacion_rechazada'] ?? null
            ];

            $resultado = $this->examen->actualizar($id, $datos);
            
            if($resultado && $datos['contratado'] == 'Si') {
                $this->candidato->actualizarEstado($candidato_id, 'Contratado');
                $this->candidato->actualizarFase($candidato_id, 'contratado');
            }
            
            echo json_encode(['success' => $resultado]);
        }
    }
}
?>