257 lines
7.3 KiB
Markdown
Executable File
257 lines
7.3 KiB
Markdown
Executable File
# 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:
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Editar el archivo `.env` con la configuración correcta:
|
|
|
|
```env
|
|
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:
|
|
|
|
```bash
|
|
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):
|
|
|
|
```bash
|
|
php -S localhost:8080 -t public
|
|
```
|
|
|
|
#### Con Apache:
|
|
|
|
Configurar el document root hacia la carpeta `public/`.
|
|
|
|
#### Con Nginx:
|
|
|
|
```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
|
|
|
|
- **Email:** admin@ibiza.com
|
|
- **Contraseña:** admin123
|
|
|
|
## 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**
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
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
|