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 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%