nickpons666 4c7f298acd refactor: Centralizar y corregir la comunicación con la API de Telegram
Se refactoriza toda la comunicación con la API de Telegram para solucionar un problema de latencia severa en el entorno Docker. El problema era causado por un retraso en la resolución de red.

- Se mejora la función  en  para forzar el uso de IPv4, añadir timeouts y soportar métodos GET/POST.
- Se centraliza la lógica de la API en la clase , añadiendo los métodos ,  y .
- Se modifica  para que utilice los nuevos métodos centralizados, eliminando código cURL duplicado y aplicando la solución de red.
- Se mantiene la instrumentación en  para futuros diagnósticos, según lo solicitado.
2026-01-20 20:20:59 -06:00
2026-01-19 15:20:36 -06:00
2026-01-19 15:20:36 -06:00
2026-01-19 17:10:54 -06:00
2026-01-19 15:20:36 -06:00
2026-01-19 15:20:36 -06:00
2026-01-19 15:20:36 -06:00
2026-01-19 15:20:36 -06:00

Sistema de Administración de Apertura y Cierre de Contenedor

Descripción

Sistema web en PHP + MySQL para administrar la apertura y cierre de un contenedor de basura, asignando turnos semanales a personas con horarios configurables.

Requisitos

  • PHP 7.4 o superior
  • MySQL 5.7 o superior
  • Extensión PHP PDO MySQL
  • Composer (opcional)
  • Servidor web (Apache/Nginx/PHP built-in)

Instalación

1. Clonar o copiar los archivos

Copiar todos los archivos del proyecto al directorio del servidor web.

2. Configurar variables de entorno

Copiar el archivo de ejemplo:

cp .env.example .env

Editar el archivo .env con la configuración correcta:

DB_HOST=localhost
DB_NAME=contenedor_ibiza
DB_USER=root
DB_PASS=tu_password

SITE_URL=http://localhost:8080

TELEGRAM_BOT_TOKEN=tu_token_de_telegram

3. Crear la base de datos

Ejecutar el script SQL:

mysql -u root -p < sql/schema.sql

O importar el archivo sql/schema.sql desde phpMyAdmin o cualquier cliente MySQL.

4. Configurar el servidor web

Con PHP built-in (desarrollo):

php -S localhost:8080 -t public

Con Apache:

Configurar el document root hacia la carpeta public/.

Con Nginx:

server {
    listen 80;
    server_name localhost;
    root /path/to/project/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

5. Credenciales de acceso

Estructura del Proyecto

contenedor/
├── .env.example          # Variables de entorno
├── config/
│   └── config.php        # Configuración general
├── public/               # Archivos públicos
│   ├── index.php         # Redirección según rol
│   ├── login.php         # Página de login
│   ├── logout.php        # Cierre de sesión
│   ├── ayudante.php      # Panel del ayudante
│   ├── admin/            # Panel de administración
│   │   ├── index.php     # Dashboard
│   │   ├── usuarios.php  # CRUD de usuarios
│   │   ├── horarios.php  # Configuración de horarios
│   │   ├── asignaciones.php # Asignación de turnos con reordenamiento
│   │   └── webhook.php   # Configuración del webhook del bot
│   └── partials/         # Compartials/
│       └── navbar.php    # Barra de navegación
├── src/                  # Código fuente
│   ├── Database.php      # Conexión a BD
│   ├── Auth.php          # Autenticación
│   ├── User.php          # Modelo de usuarios
│   ├── DiasHorarios.php  # Modelo de horarios
│   └── Asignacion.php    # Modelo de asignaciones y rotación automática
├── bot/                  # Bot de Telegram
│   ├── TelegramBot.php   # Clase del bot con teclado de menú
│   ├── webhook.php       # Webhook del bot
│   └── setup_webhook.php # Script CLI para configurar webhook
├── sql/
│   └── schema.sql        # Esquema de base de datos
├── scripts/              # Scripts CLI
│   └── rotar_automatico.php # Script de rotación automática
└── assets/               # Recursos estáticos
    ├── css/
    └── js/

Configuración del Bot de Telegram

1. Crear un bot

  1. Talking to @BotFather on Telegram
  2. Send /newbot to create a new bot
  3. Follow the instructions to set a name and username
  4. Copy the API token

2. Configurar el webhook

El webhook puede configurarse de tres formas:

Opción A: Desde el panel de administración

  1. Ir a Administración > Webhook
  2. Ingresar la URL del bot
  3. Click en "Configurar Webhook"

Opción B: Con script CLI

php bot/setup_webhook.php

Opción C: Manualmente

https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://tu-dominio.com/bot/webhook.php

3. Usar el bot

El bot tiene un teclado de menú con las siguientes opciones:

  • 📅 Ver Turnos - Muestra todos los turnos de la semana actual
  • 🔍 ¿Qué Semana Es? - Indica la semana actual del ciclo de rotación
  • 📋 Ayuda - Muestra los comandos disponibles

Comandos disponibles:

  • /start - Iniciar el bot
  • /menu - Mostrar el teclado de menú
  • /turnos - Ver turnos de la semana actual
  • /semana - Ver qué semana es del ciclo de rotación

Configuración de Rotación Automática

Para configurar la rotación automática de turnos cada semana, agregar al crontab:

# Rotar turnos cada domingo a las 00:00
0 0 * * 0 /usr/bin/php /path/to/project/scripts/rotar_automatico.php >> /var/log/rotacion.log 2>&1

O ejecutar manualmente:

php scripts/rotar_automatico.php

Funcionalidades

Administrador

  • Crear, editar y desactivar usuarios
  • Asignar turnos por semana con selector agrupado por mes
  • Visualizar asignaciones con contador "Semana X de 4"
  • Reordenar rotación - Arrastrar y soltar para cambiar el orden de la rotación
  • Recálculo automático de asignaciones futuras al reordenar
  • Configurar días activos de apertura
  • Configurar horarios de apertura y cierre por día
  • Visualizar todas las asignaciones
  • Rotar turnos manualmente
  • Configurar webhook del bot de Telegram

Ayudante

  • Visualizar únicamente los días y horarios que le corresponden
  • Ver información de su turno actual
  • Calendario de Turnos - Tabla con todos los turnos de las próximas 5 semanas

Bot de Telegram

  • Teclado de menú con botones interactivos
  • /start - Iniciar conversación con el bot
  • /menu - Mostrar teclado de opciones
  • /turnos - Ver todos los turnos de la semana actual
  • /semana - Ver qué semana es del ciclo de rotación (1-4)
  • Configuración de webhook desde el panel de administración

Personalización

Agregar más personas

  1. Ir al panel de administración > Usuarios
  2. Click en "Nuevo Usuario"
  3. Completar los datos

Modificar horarios

  1. Ir al panel de administración > Horarios
  2. Modificar las horas de apertura y cierre
  3. Activar/desactivar días según necesidad

Cambiar configuración de turnos

Los turnos pueden asignarse manualmente desde el panel de administración > Asignaciones.

Seguridad

  • Las contraseñas se almacenan usando password_hash() de PHP
  • Las sesiones son únicas por usuario
  • Los accesos están protegidos por autenticación
  • Las consultas usan prepared statements para prevenir SQL injection

Solución de Problemas

Error de conexión a la base de datos

  • Verificar las credenciales en el archivo .env
  • Asegurarse de que MySQL esté ejecutándose

El bot de Telegram no responde

  • Verificar que el token sea correcto en .env
  • Confirmar que el webhook esté configurado correctamente
  • Usar el panel de administración > Webhook para verificar
  • Revisar los logs del servidor

Error "Todos los campos son obligatorios" al guardar horarios

  • Verificar que las variables de horario coincidan con los nombres del formulario

Error en rotación de turnos

  • Verificar que exista al menos un usuario activo
  • Verificar que la tabla asignaciones_turnos tenga registros previos
  • El ciclo de rotación inicia el domingo 28 de diciembre de 2024
Description
No description provided
Readme 14 MiB
Languages
PHP 99%
Shell 0.6%
Dockerfile 0.3%