Sistema de Reserva de Salones
Consulta fechas disponibles para reservar el salón por día completo
Panel de gestión de salones SES
El archivo incluye resumen estadístico, listado completo y metadatos del reporte.
Formatos: .xlsx · .xls · .csv · Fecha: YYYY-MM-DD o DD/MM/YYYY · Reserva por día completo
Las columnas marcadas con ★ son obligatorias. El resto es opcional pero recomendado.
| Salón ★ | Nombre ★ | Fecha ★ | Tipo Miembro | Teléfono | Inicio interno | Fin interno | Asistentes | Tipo Evento | Estado | Notas |
|---|
🏛 Salones válidos
📌 Tipos de evento
Esta acción es irreversible. Se eliminarán todos los registros. Exporta una copia antes de continuar.
Modifica el usuario y contraseña del panel Admin (no afecta al Super Usuario).
ℹ️ Credenciales actuales del Admin
Usuario:
Contraseña: oculta por seguridad
Elige qué servicio se usa para enviar los correos de reservas. EmailJS funciona directo desde el navegador; SendPulse requiere un backend/proxy propio para evitar bloqueos de CORS (ver nota abajo).
Gestiona la conexión con Firebase Firestore. Los datos se sincronizan en todos los dispositivos en tiempo real.
📊 Estado de conexión
🔑 Cambiar credenciales Firebase
Encuéntralas en console.firebase.google.com → tu proyecto → ⚙️ Configuración del proyecto → Tus apps (Web)
reservationsclient, tel, email, mtype, salon_id, date, start, end_time, attendees, type, notes, status, created (cada documento usa el ID de la reserva como ID del documento)
🛠️ Reglas de seguridad sugeridas (Firestore → Reglas)
Pégalas en Firebase Console → Firestore Database → Reglas para permitir lectura/escritura desde esta app:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return request.auth != null
&& request.auth.token.email in ['admin@sindicatoses.org','suadmin@sindicatoses.org'];
}
function validPublicReservationCreate() {
return request.resource.data.keys().hasOnly([
'client','tel','email','mtype','salon_id','date','start','end_time',
'attendees','type','notes','status','created',
'checkin_time','checkin_obs','checkout_time','checkout_obs',
'autorizador_nombre','autorizador_contacto','reminder24_sent',
'acepto_reglamento','acepto_reglamento_at','autorizo_datos','autorizo_datos_at'
])
&& request.resource.data.keys().hasAll([
'client','tel','email','mtype','salon_id','date','start','end_time',
'status','acepto_reglamento','autorizo_datos'
])
&& request.resource.data.status == 'pending'
&& request.resource.data.acepto_reglamento == true
&& request.resource.data.autorizo_datos == true
&& request.resource.data.client is string
&& request.resource.data.tel is string
&& request.resource.data.email is string
&& request.resource.data.date is string
&& request.resource.data.salon_id is int;
}
function validPublicAvailabilityCreate() {
return request.resource.data.keys().hasOnly(['salon_id','date','status','updatedAt'])
&& request.resource.data.salon_id is int
&& request.resource.data.date is string
&& request.resource.data.status == 'occupied';
}
match /reservations/{id} {
allow create: if isAdmin() || validPublicReservationCreate();
allow read, update, delete: if isAdmin();
}
match /settings/{id} {
allow read: if true;
allow write: if isAdmin();
}
match /availability/{id} {
allow read: if true;
allow create: if isAdmin() || validPublicAvailabilityCreate();
allow update, delete: if isAdmin();
}
}
}
Estas acciones son irreversibles. El backup exporta reservas + configuración completa.