File "mainJefe.php"
Full Path: C:/wamp64/www/CALIDADWEB/CALIDADWEB/FRONTED/mainJefe.php
File size: 28.25 KB
MIME-type: text/x-php
Charset: utf-8
<?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>