<?php session_start(); if (!isset($_SESSION["rol"])) { header("location:login.php"); } else { if ($_SESSION["rol"] != 1) { header("location:login.php"); } } require_once __DIR__ . '/../BACKEND/conexiones/BD.php'; include __DIR__ . '/../BACKEND/conexiones/conexion.php'; // ====== SISTEMA DE PERMISOS POR USUARIO ====== $usuario_actual = isset($_SESSION['usuario']) ? $_SESSION['usuario'] : null; // ========== DEFINIR USUARIOS ADMINISTRADORES ========== $usuarios_admin = array('63546660','12345'); // Verificar si el usuario actual es administrador $es_admin = in_array($usuario_actual, $usuarios_admin); // Definir qué categorías/formularios puede ver cada usuario $permisos_usuario = array( '12345' => array('todas'), 'default' => array('todas') ); $categorias_permitidas = isset($permisos_usuario[$usuario_actual]) ? $permisos_usuario[$usuario_actual] : $permisos_usuario['default']; $es_acceso_restringido = !in_array('todas', $categorias_permitidas); // ========== DEFINICIÓN DE TODOS LOS BOTONES (FORMULARIOS) ========== $botones = [ ['codigo' => '03PD-F01', 'descripcion' => 'CONTROL DE PRODUCCION', 'url' => './HTML/03PD-F01.php', 'categoria' => 'produccion'], /* ['codigo' => 'FOR-E-CCI-11', 'descripcion' => 'CONTROL DE PRODUCCION', 'url' => './HTML/FOR-E-CCI-11.php', 'categoria' => 'produccion'], */ ['codigo' => 'FOR-S-CCI-11', 'descripcion' => 'VERIFICACION DE DOTACION Y BPM', 'url' => './HTML/FOR-S-CCI-11.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-E-CCI-12', 'descripcion' => 'CONTROL PREPARACION SALMUERA', 'url' => './HTML/FOR-E-CCI-12.php', 'categoria' => 'marinado'], ['codigo' => 'FOR-E-CCI-13', 'descripcion' => 'CONTROL DE CONTRA MUESTRA', 'url' => './HTML/FOR-E-CCI-13.php', 'categoria' => 'produccion'], ['codigo' => 'FOR-S-CCI-13', 'descripcion' => 'CLASIFICACION DE DEFECTOS DE CANAL - EVISCERACION', 'url' => './HTML/FOR-S-CCI-13.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-14', 'descripcion' => 'INSPECCIÓN VETERINARIA', 'url' => './HTML/FOR-S-CCI-14.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-E-CCI-15', 'descripcion' => 'CONTROL PESO PRODUCTO ADOBADO (FRISBY)', 'url' => './HTML/FOR-E-CCI-15.php', 'categoria' => 'marinado'], ['codigo' => 'FOR-S-CCI-17', 'descripcion' => 'FRECUENCIA INSPECCION', 'url' => './HTML/FOR-S-CCI-17.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-19', 'descripcion' => 'CONTROL DE PROCESOS', 'url' => './HTML/FOR-S-CCI-19.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-20', 'descripcion' => 'INSPECCIÓN CALIDAD PRODUCTO SEMI ELABORADO Y TERMINADO', 'url' => './HTML/FOR-S-CCI-20.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-21', 'descripcion' => 'CONTROL CLORO RESIDUAL AGUA POTABLE', 'url' => './HTML/FOR-S-CCI-21.php', 'categoria' => 'produccion'], ['codigo' => 'FOR-S-CCI-22', 'descripcion' => 'CONTROL DE PESO Y EMPACADO', 'url' => './HTML/FOR-S-CCI-22.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-S-CCI-23', 'descripcion' => 'CONTROL DE TEMPERATURA AMBIENTES AREAS DE PROCESO', 'url' => './HTML/FOR-S-CCI-23.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-24', 'descripcion' => 'CALENDARIO JULIANO', 'url' => './HTML/FOR-S-CCI-24.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-26', 'descripcion' => 'CONTROL TEMPERATURA DE PRODUCTOS EN CUARTOS FRIOS', 'url' => './HTML/FOR-S-CCI-26.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-S-CCI-27', 'descripcion' => 'AUDITORIA DE PROCESO', 'url' => './HTML/FOR-S-CCI-27.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-28', 'descripcion' => 'CONTROL TEMPERATURA PRODUCTOS DESPACHADOS', 'url' => './HTML/FOR-S-CCI-28.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-S-CCI-33', 'descripcion' => 'CONTROL DE INSPECCIÓN DE TOLERANCIA CERO', 'url' => './HTML/FOR-S-CCI-33.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-35', 'descripcion' => 'BIENESTAR ANIMAL', 'url' => './HTML/FOR-S-CCI-35.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-38', 'descripcion' => 'CONTROL DEFECTOS CANAL SALIDA CHILLER', 'url' => './HTML/FOR-S-CCI-38.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-44', 'descripcion' => 'CONTROL TEMPERATURA LIBERACION DE PRODUCTOS DE TUNELES', 'url' => './HTML/FOR-S-CCI-44.php', 'categoria' => 'almacen'], ['codigo' => 'FORMATO DE TRAZABILIDAD Y VIDA ÚTIL', 'descripcion' => '', 'url' => './HTML/Trazabilidad.php', 'categoria' => 'trazabilidad', 'extra_class' => 'btn-warning', 'extra_style' => 'height: 140px; border: 2px solid #000; transform: scale(1.05);'], ['codigo' => 'FOR-S-CCI-45', 'descripcion' => 'AUDITORIA DE CUARTOS DE ALMACENAMIENTO', 'url' => './HTML/FOR-S-CCI-45.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-E-CCI-46', 'descripcion' => 'AUDITORIA DE CUARTOS DE ALMACENAMIENTO', 'url' => './HTML/FOR-E-CCI-46.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-S-CCI-54', 'descripcion' => 'AUDITORIA ALMACEN-PESAJE', 'url' => './HTML/FOR-S-CCI-54.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-S-CCI-57', 'descripcion' => 'DEVOLUCIONES', 'url' => './HTML/FOR-S-CCI-57.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-S-CCI-60', 'descripcion' => 'LISTA DE CHEQUEO AREAS EXTERIORES', 'url' => './HTML/FOR-S-CCI-60.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-62', 'descripcion' => 'CONTROL DE CONSUMO DE SUSTANCIA DE LIMPIEZA Y DESINFECCION OPERATIVAS', 'url' => './HTML/FOR-S-CCI-62.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-63', 'descripcion' => 'VERIFICACION DE LOCKERS', 'url' => './HTML/FOR-S-CCI-63.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-64', 'descripcion' => 'INSPECCIÓN PRE OPERATIVO PLANTA DE SACRIFICIO', 'url' => './HTML/FOR-S-CCI-64.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-65', 'descripcion' => 'INSPECCION OPERATIVA POES', 'url' => './HTML/FOR-S-CCI-65.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-66', 'descripcion' => 'CONTROL CLORO RESIDUAL PUNTOS DE DESINFECCIÓN', 'url' => './HTML/FOR-S-CCI-66.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-67', 'descripcion' => 'CONTROL CLORO RESIDUAL PUNTOS DESINFECCION EVISCERACION', 'url' => './HTML/FOR-S-CCI-67.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-68', 'descripcion' => 'CONTROL CLORO RESIDUAL PUNTOS DESINFECCION PLATAFORMA', 'url' => './HTML/FOR-S-CCI-68.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-70', 'descripcion' => 'REGISTRO DE LIMPIEZA Y DESINFECCION', 'url' => './HTML/FOR-S-CCI-70.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-72', 'descripcion' => 'LIMPIEZA Y DESINFECCION DE VEHICULOS DE POLLO-PAVO EN PIE', 'url' => './HTML/FOR-S-CCI-72.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-73', 'descripcion' => 'FORMATO DE DESINFECCION DE HUACALES', 'url' => './HTML/FOR-S-CCI-73.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-74', 'descripcion' => 'LIMPIEZA Y DESINFECCION DE LAS AGUJAS INYECTADORAS', 'url' => './HTML/FOR-S-CCI-74.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-82', 'descripcion' => 'VERIFICACION Y LIMPIEZA DE CANASTILLAS', 'url' => './HTML/FOR-S-CCI-82.php', 'categoria' => 'almacen'], ['codigo' => 'FOR-S-CCI-89', 'descripcion' => 'CONTROL DE PROCESO ENFRIAMIENTO DE CANAL', 'url' => './HTML/FOR-S-CCI-89.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-90', 'descripcion' => 'CONTROL DE PROCESO ENFRIAMIENTO DE VISCERAS', 'url' => './HTML/FOR-S-CCI-90.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-95', 'descripcion' => 'ROTURA CONDICION LOCATIVA', 'url' => './HTML/FOR-S-CCI-95.php', 'categoria' => 'inspeccion', 'onclick' => 'openRoturaCondicion(event)'], ['codigo' => 'FOR-S-CCI-99', 'descripcion' => 'PRODUCTO NO CONFORME', 'url' => './HTML/FOR-S-CCI-99.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-S-CCI-100', 'descripcion' => 'DESINFECCION DE GUANTES', 'url' => './HTML/FOR-S-CCI-100.php', 'categoria' => 'limpieza'], ['codigo' => 'FOR-S-CCI-103', 'descripcion' => 'LISTA DE CHEQUEO MATERIAL EXTRAÑO', 'url' => './HTML/FOR-S-CCI-103.php', 'categoria' => 'inspeccion'], ['codigo' => 'FOR-E-CTR-122', 'descripcion' => 'CONTROL MATERIAL DE EMPAQUE', 'url' => './HTML/FOR-E-CTR-122.php', 'categoria' => 'produccion'], ['codigo' => 'FOR-E-CCI-83 CONTROL DE LAVANDERIA', 'descripcion' => '', 'url' => './HTML/camara.php', 'categoria' => 'limpieza'], ]; ?> <?php header("Content-Type: text/html; charset=UTF-8"); ?> <!doctype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="shortcut icon" href="./CSS/style_main.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous"> <link rel="stylesheet" href="./CSS/style_main.css"> <link rel="shortcut icon" href="./img/avicampo.png"> <link href='https://fonts.googleapis.com/css?family=Abril Fatface' rel='stylesheet'> <link href='https://unpkg.com/boxicons@2.1.2/css/boxicons.min.css' rel='stylesheet'> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs5/jszip-2.5.0/dt-1.11.5/b-2.2.2/b-colvis-2.2.2/b-html5-2.2.2/b-print-2.2.2/r-2.2.9/sb-1.3.2/sp-2.0.0/datatables.min.css" /> <title>CALIDADWEB</title> <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js" integrity="sha512-2ImtlRlf2VVmiGZsjm9bEyhjGW4dU7B6TNwh/hx/iSByxNENtj3WVE6o/9Lj4TJeVXPi4bnOIMXFIJJAeufa0A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> </head> <body class="aviCampo"> <div class="container-fluid"> <div class="row"> <div class="container" style="padding: 30px 20px 50px 20px;"> <!-- INSIGNIA DEL DESARROLLADOR --> <!-- <div style="text-align: right; margin-bottom: 15px;"> <div style="background: rgba(52, 58, 64, 0.8); backdrop-filter: blur(4px); color: white; padding: 5px 12px; border-radius: 6px; border: 1px solid rgba(255,255,255,0.1); display: inline-block; box-shadow: 0 4px 12px rgba(0,0,0,0.2);"> <div style="font-size: 9px; text-transform: uppercase; letter-spacing: 1.5px; line-height: 1; opacity: 0.7; margin-bottom: 2px;">UPDATE</div> <div style="font-size: 12px; font-weight: 800; text-transform: uppercase; color: #f89520;">KEVIN OSORIO</div> </div> </div> --> <!-- CONTENEDOR PRINCIPAL - BIENVENIDA Y LOGOS --> <div style="background: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 0%, rgba(255, 174, 0, 0.03) 100%); border-radius: 15px; padding: 15px 20px; margin-bottom: 35px; border: 2px solid rgba(255, 174, 0, 0.2); backdrop-filter: blur(15px); box-shadow: 0 8px 30px rgba(0,0,0,0.1);"> <div class="usuario-bienvenida" style="background: linear-gradient(135deg, hsla(34, 80%, 52%, 0.95) 0%, hsla(34, 75%, 48%, 0.95) 100%); padding: 12px 15px; border-radius: 12px; margin-bottom: 12px; box-shadow: 0 6px 20px rgba(255, 174, 0, 0.3); border: 2px solid rgba(255, 255, 255, 0.2); backdrop-filter: blur(10px);"> <div class="d-flex justify-content-between align-items-center flex-wrap gap-2"> <div> <p style="margin: 0; color: rgba(255, 255, 255, 0.8); font-size: 0.7rem; letter-spacing: 0.5px; text-transform: uppercase; font-weight: 600;"></p> <h2 style="margin: 5px 0 0 0; color: white; font-family: 'Abril Fatface', serif; font-size: clamp(0.9rem, 2.5vw, 1.3rem); text-shadow: 2px 3px 6px rgba(0,0,0,0.3);"> 👤 Usuario <?php echo isset($_SESSION['iduser']) ? htmlspecialchars($_SESSION['iduser']) : 'Usuario'; ?>! </h2> </div> <div style="text-align: right;"> <div style="background: rgba(255, 255, 255, 0.15); padding: 8px 12px; border-radius: 10px; border: 1px solid rgba(255, 255, 255, 0.3); backdrop-filter: blur(10px);"> <p style="margin: 0; color: rgba(255, 255, 255, 0.9); font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.5px; font-weight: 600;">✅ Sesión Iniciada</p> <p style="margin: 3px 0 0 0; color: white; font-size: 0.7rem; font-weight: 700;">Sistema CALIDADWEB</p> </div> </div> </div> </div> <h1 class="text-center fw-bold" style="font-family: 'Abril Fatface', serif; font-size: clamp(1.3rem, 4.5vw, 2rem); color: hsla(34, 80%, 52%, 1.00); margin-bottom: 12px; text-shadow: 2px 3px 6px rgba(0,0,0,0.5); letter-spacing: 1.5px; text-transform: uppercase;">CALIDAD APP</h1> <div class="logos d-flex justify-content-center align-items-center gap-2 gap-md-3 flex-wrap"> <div class="logo-item" style="transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);"> <div style="background: rgba(255, 255, 255, 0.05); padding: 6px; border-radius: 12px; border: 1px solid hsla(0, 0%, 100%, 0.8); backdrop-filter: blur(10px); box-shadow: 0 6px 15px rgba(0,0,0,0.2);"> <img src="./imagenes/LOGO.png" class="img-fluid" alt="Logo Calidadweb" style="width: 160px; height: auto; display: block; filter: drop-shadow(0 4px 10px rgba(255, 174, 0, 0.8)); transition: transform 0.3s ease;" onmouseover="this.style.transform='scale(1.08)'" onmouseout="this.style.transform='scale(1)'"> </div> </div> <div class="logo-item" style="transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);"> <div style="background: rgba(255, 255, 255, 0.05); padding: 6px; border-radius: 12px; border: 1px solid hsla(0, 0%, 100%, 0.8); backdrop-filter: blur(10px); box-shadow: 0 6px 15px rgba(0,0,0,0.2);"> <img src="./imagenes/PAVOS.png" class="img-fluid" alt="Pavos Logo" style="width: 160px; height: auto; display: block; filter: drop-shadow(0 4px 10px hsla(0, 0%, 100%, 0.95)); transition: transform 0.3s ease;" onmouseover="this.style.transform='scale(1.08)'" onmouseout="this.style.transform='scale(1)'"> </div> </div> </div> </div> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="check-circle-fill" fill="currentColor" viewBox="0 0 16 16"> <path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z" /> </symbol> <symbol id="info-fill" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z" /> </symbol> <symbol id="exclamation-triangle-fill" fill="currentColor" viewBox="0 0 16 16"> <path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z" /> </symbol> </svg> <?php if (isset($_SESSION["mensaje"])) { ?> <div class="alert alert-<?php echo $_SESSION["tipo"]; ?> d-flex align-items-center alert-dismissible fade show" style="margin-bottom:40px" role="alert"> <svg class="bi flex-shrink-0 me-2" width="24" height="24" role="img" aria-label="<?php echo $_SESSION["tipo"]; ?>:"><use xlink:href="#<?php echo $_SESSION["icon"]; ?>" /></svg> <div><?php echo $_SESSION["mensaje"]; ?></div> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> <?php unset($_SESSION["mensaje"], $_SESSION["tipo"], $_SESSION["icon"]); ?> <?php } ?> <div class=""> <!-- ========== BARRA DE FILTROS POR CATEGORÍA (RESTAURADA) ========== --> <!-- <div class="mb-4 d-flex gap-2 flex-wrap" id="filtroCategoria" style="justify-content: center;"> <?php if ($es_acceso_restringido): ?> <button class="btn btn-light btn-sm categoria-btn active" data-categoria="produccion" disabled> (Solo Disponible) </button> <?php else: ?> <button class="btn btn-light btn-sm categoria-btn active" data-categoria="todas" onclick="filtrarCategoria('todas', this)"> 📋 TODAS </button> <button class="btn btn-light btn-sm categoria-btn" data-categoria="produccion" onclick="filtrarCategoria('produccion', this)"> 🐔 PRODUCCIÓN </button> <button class="btn btn-light btn-sm categoria-btn" data-categoria="marinado" onclick="filtrarCategoria('marinado', this)"> 🧂 MARINADO </button> <button class="btn btn-light btn-sm categoria-btn" data-categoria="inspeccion" onclick="filtrarCategoria('inspeccion', this)"> ✅ INSPECCIÓN </button> <button class="btn btn-light btn-sm categoria-btn" data-categoria="limpieza" onclick="filtrarCategoria('limpieza', this)"> 🧹 LIMPIEZA </button> <button class="btn btn-light btn-sm categoria-btn" data-categoria="almacen" onclick="filtrarCategoria('almacen', this)"> 📦 ALMACÉN </button> <?php endif; ?> </div> --> <div class="contenedorBotones row"> <?php foreach ($botones as $boton): $codigo = $boton['codigo']; $descripcion = $boton['descripcion']; $url = $boton['url']; $categoria = $boton['categoria']; $extra_class = isset($boton['extra_class']) ? $boton['extra_class'] : ''; $extra_style = isset($boton['extra_style']) ? $boton['extra_style'] : ''; $onclick = isset($boton['onclick']) ? 'onclick="' . $boton['onclick'] . '"' : ''; $btn_class = 'btn btn-outline-light ' . $extra_class; $style = 'padding: 10px; height: 120px; border-radius: 10px; overflow: hidden; display: flex; flex-direction: column;' . ($extra_style ? ' ' . $extra_style : ''); ?> <div class="col-md-3 mb-3" data-categoria="<?php echo $categoria; ?>" data-codigo="<?php echo htmlspecialchars($codigo); ?>"> <a href="<?php echo $url; ?>" <?php echo $onclick; ?> class="<?php echo $btn_class; ?> d-flex flex-column align-items-center justify-content-center text-center w-100" role="button" style="<?php echo $style; ?>"> <legend class="mb-1" style="font-size: 0.8rem; font-weight: bold; width: 100%; margin: 0;"><?php echo htmlspecialchars($codigo); ?></legend> <?php if (!empty($descripcion)): ?> <span style="font-size: 0.7rem; line-height: 1.1; font-weight: bold; display: block; width: 100%; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto;"><?php echo htmlspecialchars($descripcion); ?></span> <?php endif; ?> </a> </div> <?php endforeach; ?> <!-- Botón de Cerrar Sesión --> <div class="col-md-12 d-flex align-items-center justify-content-center mt-5"> <a href="login.php?cerrar_sesion" onclick="bloqueo()" id="cerrarSesion" class="btn btn-outline-light"> <legend class="mb-0">CERRAR SESION</legend> </a> </div> </div> </div> </div> </div> </div> <!-- Modal (sin cambios) --> <div class="modal fade" id="modal1" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered" style="max-width: 1150px;" id="grande"> <div class="modal-content" id="contNewUser"> <div class="modal-header" id="headNewUser"> <h5 class="modal-title" style="color: white;" id="cabeceraGeneral">cabecera</h5> </div> <div class="modal-body" id="modalc1"> <form action="../controller/REGISTROS.php" method="POST" id="frmio"> <div class="modal-footer" id="footer1"> <div class="row"> <div class="reloj col-md-6" style="align-self: center;border: 2px solid white;border-radius: 10px;"> <span id="tiempo"> 00 : 00 : 00</span> <p style="margin-bottom: auto;" id="fecha">fecha</p> <?php if (isset($_SESSION["iduser"])) { $iduser = $_SESSION["iduser"]; } ?> <?php if (!empty($iduser)) { ?> <p style="text-shadow: 10px 10px 20px black;text-decoration: underline;">User: <?php echo " " . $iduser; ?></p> <?php } ?> </div> <div class="col-md-6" style="text-align: end; display: grid;"> <button type="reset" class="btn btn-light" style="margin-bottom:10px;" id="cancelarGeneral" data-bs-dismiss="modal">CANCELAR</button> <button type="submit" name="controlEnviar" id="controlEnviar" class="btn btn-light">ENVIAR REPORTE</button> </div> </div> </div> </form> </div> </div> </div> </div> <script> // ====== SISTEMA DE PERMISOS ====== const usuarioActual = "<?php echo $usuario_actual; ?>"; const esAccesoRestringido = <?php echo $es_acceso_restringido ? 'true' : 'false'; ?>; const categoriasPermitidas = <?php echo json_encode($categorias_permitidas); ?>; // Mapeo de formularios a categorías (respaldo) const formulariosCategorias = { '03PD-F01': 'produccion', 'FOR-E-CCI-11': 'marinado', 'FOR-S-CCI-11': 'inspeccion', 'FOR-E-CCI-12': 'marinado', 'FOR-E-CCI-13': 'produccion', 'FOR-S-CCI-13': 'inspeccion', 'FOR-S-CCI-14': 'inspeccion', 'FOR-E-CCI-15': 'marinado', 'FOR-S-CCI-17': 'inspeccion', 'FOR-S-CCI-19': 'inspeccion', 'FOR-S-CCI-20': 'inspeccion', 'FOR-S-CCI-21': 'produccion', 'FOR-S-CCI-23': 'inspeccion', 'FOR-S-CCI-26': 'almacen', 'FOR-S-CCI-27': 'inspeccion', 'FOR-S-CCI-28': 'almacen', 'FOR-S-CCI-33': 'inspeccion', 'FOR-S-CCI-38': 'inspeccion', 'FOR-S-CCI-44': 'almacen', 'FOR-S-CCI-45': 'almacen', 'FOR-E-CCI-46': 'almacen', 'FOR-S-CCI-54': 'almacen', 'FOR-S-CCI-57': 'almacen', 'FOR-S-CCI-60': 'limpieza', 'FOR-S-CCI-62': 'limpieza', 'FOR-S-CCI-63': 'limpieza', 'FOR-S-CCI-64': 'inspeccion', 'FOR-S-CCI-65': 'inspeccion', 'FOR-S-CCI-66': 'limpieza', 'FOR-S-CCI-67': 'limpieza', 'FOR-S-CCI-68': 'limpieza', 'FOR-S-CCI-70': 'limpieza', 'FOR-S-CCI-72': 'limpieza', 'FOR-S-CCI-73': 'limpieza', 'FOR-S-CCI-74': 'limpieza', 'FOR-S-CCI-82': 'almacen', 'FOR-S-CCI-89': 'inspeccion', 'FOR-S-CCI-90': 'inspeccion', 'FOR-S-CCI-95': 'inspeccion', 'FOR-S-CCI-99': 'inspeccion', 'FOR-S-CCI-100': 'limpieza', 'FOR-S-CCI-103': 'inspeccion', 'FOR-E-CTR-122': 'produccion' }; window.addEventListener('DOMContentLoaded', function() { const botones = document.querySelectorAll('.contenedorBotones [role="button"]'); botones.forEach(boton => { const columna = boton.closest('[class*="col-md"]'); if (columna && !columna.hasAttribute('data-categoria')) { const legend = boton.querySelector('legend'); if (legend) { const codigo = legend.textContent.trim(); const categoria = formulariosCategorias[codigo] || 'general'; columna.setAttribute('data-categoria', categoria); columna.setAttribute('data-codigo', codigo); } } // Si el usuario tiene acceso restringido, ocultar botones no permitidos if (esAccesoRestringido && columna) { const codigo = columna.getAttribute('data-codigo'); const categoria = columna.getAttribute('data-categoria'); const tienePermiso = categoriasPermitidas.includes(codigo) || categoriasPermitidas.includes(categoria); if (!tienePermiso) { columna.style.display = 'none'; } } }); if (esAccesoRestringido) mostrarSoloPermitidos(); }); function mostrarSoloPermitidos() { const contenedor = document.querySelector('.contenedorBotones'); const botones = contenedor.querySelectorAll('[data-categoria]'); botones.forEach(boton => { const codigo = boton.getAttribute('data-codigo'); const categoria = boton.getAttribute('data-categoria'); if (categoriasPermitidas.includes(codigo) || categoriasPermitidas.includes(categoria)) { boton.style.display = ''; boton.style.animation = 'fadeIn 0.3s ease-in'; } else { boton.style.display = 'none'; } }); } // Función de filtrado por categoría (mejorada, recibe el botón clickeado) function filtrarCategoria(categoria, btnElement) { const contenedor = document.querySelector('.contenedorBotones'); const botones = contenedor.querySelectorAll('[data-categoria]'); const btnsCategoria = document.querySelectorAll('.categoria-btn'); // Cambiar clase active en los botones de filtro btnsCategoria.forEach(btn => btn.classList.remove('active')); btnElement.classList.add('active'); // Mostrar/ocultar según categoría botones.forEach(boton => { if (categoria === 'todas') { boton.style.display = ''; boton.style.animation = 'fadeIn 0.3s ease-in'; } else { const botCategoria = boton.getAttribute('data-categoria'); if (botCategoria === categoria) { boton.style.display = ''; boton.style.animation = 'fadeIn 0.3s ease-in'; } else { boton.style.display = 'none'; } } }); } // Estilos adicionales (fadeIn, pulse, etc.) const style = document.createElement('style'); style.innerHTML = ` @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .categoria-btn { transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); font-weight: 700; font-size: 0.95rem; padding: 12px 20px !important; border-radius: 12px !important; border: 2px solid hsla(34, 80%, 52%, 0.3) !important; background-color: rgba(255, 255, 255, 0.08) !important; color: hsla(34, 80%, 52%, 1.00) !important; text-transform: uppercase; letter-spacing: 1px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); position: relative; overflow: hidden; } .categoria-btn::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent); transition: left 0.5s; } .categoria-btn:hover::before { left: 100%; } .categoria-btn:hover { transform: translateY(-4px) scale(1.08); box-shadow: 0 8px 25px rgba(255, 174, 0, 0.4); border-color: hsla(34, 80%, 52%, 0.8) !important; background-color: rgba(255, 255, 255, 0.15) !important; } .categoria-btn.active { background: linear-gradient(135deg, hsla(34, 80%, 52%, 1.00) 0%, hsla(34, 75%, 48%, 1.00) 100%) !important; color: white !important; border-color: hsla(34, 80%, 52%, 1.00) !important; box-shadow: 0 8px 25px rgba(255, 174, 0, 0.5), inset 0 1px 0 rgba(255,255,255,0.3); font-weight: 800; animation: pulse 0.6s ease-out; } .categoria-btn.active:hover { transform: translateY(-5px) scale(1.12); box-shadow: 0 12px 35px rgba(255, 174, 0, 0.6), inset 0 1px 0 rgba(255,255,255,0.3); } #filtroCategoria { padding: 25px 15px; background: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 0%, rgba(255, 174, 0, 0.03) 100%); border-radius: 15px; border: 1px solid rgba(255, 174, 0, 0.2); margin-bottom: 30px !important; backdrop-filter: blur(10px); box-shadow: 0 8px 32px rgba(0,0,0,0.1); } `; document.head.appendChild(style); </script> </body> </html>