Fields & Floors Collectors
Search every numbered sports card on eBay by print run, autograph, rookie status and price, then save searches and get an email when a new card lists.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證APP para autogestion en restaurantes
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
CAPY — Sistema de Pedidos para Restaurante/Club (MVP) Sistema web para que clientes vean la carta, hagan su pedido sin necesidad de crear cuenta, indiquen su ubicación (mesa o sector general) y paguen desde el celular. El staff (camareros y cajero/admin) ve los pedidos en un tablero en tiempo real, cambia su estado y tiene un historial completo de operaciones. No reemplaza ni se integra con el sistema de gestión del restaurante. Es un sistema independiente para tomar y pagar pedidos.檢視完整 README ↗
Sistema web para que clientes vean la carta, hagan su pedido sin necesidad de crear cuenta, indiquen su ubicación (mesa o sector general) y paguen desde el celular. El staff (camareros y cajero/admin) ve los pedidos en un tablero en tiempo real, cambia su estado y tiene un historial completo de operaciones.
No reemplaza ni se integra con el sistema de gestión del restaurante. Es un sistema independiente para tomar y pagar pedidos.
Este sistema tiene dos identidades completamente separadas:
Cliente (sin login) — la primera vez que alguien pide algo, se le pide
nombre y WhatsApp (sin contraseña). Ese dato se guarda en su dispositivo
(localStorage) junto con un token secreto, así en visitas siguientes
desde el mismo celular no se le vuelve a preguntar y puede ver sus pedidos
anteriores. El WhatsApp le sirve al mozo/cajero para contactarlo si no lo
encuentra en el sector, o si necesita avisarle algo (ej. un producto que
se agotó). No hay verificación real del número — cualquiera puede escribir
cualquier WhatsApp. Es aceptable para el objetivo operativo de este MVP
(poder contactar a alguien en el lugar), pero no es identidad verificada.
Staff (con login real) — camareros y cajero/admin entran con email y
contraseña por /admin/login, usando autenticación real de Supabase. Hay
dos roles:
camarero: ve el tablero de pedidos, cambia estados, contacta al
cliente por WhatsApp si hace falta. No edita la carta.admin: todo lo de camarero, más gestión de carta/precios/sectores,
confirmación de pagos (comprobantes y cobros en persona), e historial.restaurant-app/
├── src/
│ ├── pages/client/ # Pantallas del cliente (identificación, carta, ubicación, pago, estado)
│ ├── pages/admin/ # Pantallas del staff (tablero, historial, editor de carta)
│ ├── hooks/ # useAuth (staff), useCustomer (cliente), useCart, useOrderPolling
│ ├── lib/ # dos clientes de Supabase (staff y customer), utilidades
│ └── components/ # rutas protegidas
├── supabase/migrations/ # Esquema SQL completo + datos de ejemplo
└── .env.example
supabase/migrations/0001_init.sql (tablas, seguridad, triggers)supabase/migrations/0002_seed.sql (datos de ejemplo: 1 local, zonas, productos)supabase/migrations/0003_payment_proof.sql (soporte para comprobante de transferencia)supabase/migrations/0004_customer_identity.sql (clientes sin login + roles de staff admin/camarero)insert into profiles (id, full_name, role) values ('EL-UUID-DEL-USUARIO', 'Tu nombre', 'admin');
role = 'camarero'. No hay pantalla en la app para esto — es
intencional, para que nadie pueda otorgarse acceso de staff por su
cuenta.El cliente elige su ubicación de una lista agrupada en dos partes: Mesas
(sector restaurante/bar) y Sectores generales (tribuna, juegos, cancha
de pádel, etc — cualquier zona del club donde alguien pueda pedir sin tener
una mesa asignada). Ambos se cargan en la tabla venue_zones, diferenciados
por la columna type (mesa o zona). El seed (0002_seed.sql) ya trae
un ejemplo de cada uno; para agregar más:
insert into venue_zones (venue_id, name, type, sort_order) values
('00000000-0000-0000-0000-000000000001', 'Mesa 5', 'mesa', 9),
('00000000-0000-0000-0000-000000000001', 'Pileta', 'zona', 10);
No hay pasarela de pago online conectada todavía. El cliente elige una forma de pago al confirmar su pedido:
VITE_TRANSFER_ALIAS, esta
opción aparece. El cliente ve el alias, transfiere desde su billetera
virtual, y sube una foto del comprobante desde la app. El pedido queda
en estado "pendiente de pago" con el comprobante visible para el cajero
en el panel admin, quien lo confirma o rechaza con un botón.Si no definís VITE_TRANSFER_ALIAS, solo aparecen las opciones de efectivo
y tarjeta.
Copiar .env.example a .env y completar:
VITE_SUPABASE_URL=...
VITE_SUPABASE_ANON_KEY=...
VITE_VENUE_ID=00000000-0000-0000-0000-000000000001
VITE_TRANSFER_ALIAS=mirestaurante.mp (opcional, ver sección de pagos)
Todas estas son públicas (van al frontend) — no hay variables privadas en esta versión, porque no hay backend propio ni pasarela de pago conectada.
npm install
npm run dev
https://tu-app.vercel.app → la primera vez, ingresa nombre y WhatsApp →
ver carta → agregar items → elegir ubicación (mesa o sector general, de
una lista) → elegir forma de pago → confirmar → ver estado del pedido. En
visitas siguientes desde el mismo celular, entra directo a la carta.
https://tu-app.vercel.app/admin/login → ingresar con cuenta de rol
admin o camarero → ver comprobantes y cobros pendientes arriba del
tablero (con WhatsApp del cliente para contactarlo) → ver tablero de
pedidos → marcar siguiente estado → ver historial completo en "Historial"
→ editar la carta en "Editar carta" (solo admin).
Por seguridad, un cliente sin login no puede ver los pedidos de otro: cada dispositivo genera un token secreto (no solo un id), y las políticas de seguridad de la base de datos (RLS) exigen ese token para leer o crear pedidos — no hay tabla abierta a cualquiera con la clave pública del proyecto.
Una limitación de esto: las suscripciones en tiempo real de Supabase (Realtime/WebSocket) no propagan ese token por una limitación conocida de la plataforma. Por eso la pantalla de seguimiento del pedido del cliente usa actualización periódica (cada 6 segundos) en lugar de tiempo real instantáneo. El panel del staff sí usa tiempo real real, porque ahí la sesión es de Supabase Auth normal.
camarero: ve y gestiona todos los pedidos del local, contacta clientes.admin: igual que camarero, más gestión de carta y precios.venue). El esquema ya soporta multi-local, falta la UI.location_type = punto_mapa, columnas map_x/map_y) pero el
flujo del cliente quedó simplificado a una lista de mesas y sectores.