File "RequisicionController.php"
Full Path: C:/wamp64/www/Seleccion/node_modules/side-channel-map/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]);
}
}
?>