--- title: Projeto QFila aliases: - QFila - qfila.com.br tags: - claude-memory/project - qfila - flutter - codeigniter - mysql type: project created: 2026-04-17 updated: 2026-04-17 status: em-desenvolvimento domain: qfila.com.br --- # Projeto QFila > [!abstract] Resumo > Sistema de **filas inteligentes e organização**. Multi-tenant (cada comércio isolado por `establishment_id`). Composto por dois apps Flutter (gestor + cliente) e site institucional + API REST em CodeIgniter 4 hospedado em cPanel. ## Apps Flutter | App | Caminho | Estado | | -------------- | ----------------------------------------------- | ----------------------------- | | QFila (gestor) | `D:\xampp\htdocs\PROJETOS FLUTTER\QFila` | **Integrado com API real** | | QFilaCliente | `D:\xampp\htdocs\PROJETOS FLUTTER\QFilaCliente` | **100% mockado** — NÃO integrado | - Package Android: `com.qfila.qfila` — label "QFila Gestor" - Estrutura `lib/`: `core`, `models`, `providers`, `screens`, `services` - APKs: `C:\Users\Jesiel\Desktop\APP - QFila\` - Logo: `C:\Users\Jesiel\Desktop\APP - QFila\Design sem nome.png` - QR code (2026-04-17): `C:\Users\Jesiel\Desktop\QFila-QRCode-QFILA01.png` → `https://qfila.com.br/e/QFILA01` ## Hospedagem > [!info] Ambiente > cPanel em `server.whmservidor.com` (WHMServidor). Shared hosting — usuário `qfila` sem shell. | Item | Valor | | ------------------ | ---------------------------------------- | | Domínio | `qfila.com.br` | | Servidor / IP | `server.whmservidor.com` (107.150.43.90) | | cPanel user | `qfila` (homedir `/home/qfila`) | | DocumentRoot | `/home/qfila/public_html` | | PHP / Composer | 8.1.33 + ionCube 13.3.1 / `/opt/cpanel/composer/bin/composer` | | CI4 core | `/home/qfila/ci4/` | > [!warning] Shell > User `qfila` **sem shell**. Manutenção via **root** por plink, depois `chown qfila:qfila`. ## Banco MySQL | Campo | Valor | | -------- | ------------------------------ | | Database | `qfila_qfiladb` | | User | `qfila_api` | | Senha | `GzHXNGoLSzVROiBkExPKGe31` | | Host | `localhost` | | Driver | `MySQLi` | ### Tabelas - `establishments` — tem `code` (UNIQUE) para identificação via QR. Admin demo: `QFILA01`. - `users` — vinculado a `establishment_id`; roles: `owner`, `manager`, `attendant`. - `queues` — tem `attendant_label` (default `'Atendente'`) e `segment`. Tipos suportados: Atendente, Guichê, Profissional, Sala, Mesa, Consultório, Posto, Cabine ou personalizado. - `queue_entries` — tem `customer_photo_url` opcional. - `api_tokens` — Bearer tokens SHA-256, TTL 30 dias. - `subscriptions` — plano mensal por estabelecimento (default "Essencial" R$ 49,90). - `invoices` — faturas (pending/paid) vinculadas à subscription. > [!warning] Credenciais > Trocar senha do banco e admin em produção real. ## API REST — `https://qfila.com.br/api/*` - Bearer token (hash SHA-256 no DB) - `.htaccess` com `CGIPassAuth On` + CORS - **Admin inicial:** `admin@qfila.com.br` / `Qfila@2026` ### Endpoints | Método | Rota | Observação | | ---------------- | -------------------------------- | ----------------------------------- | | POST | `/auth/login` | Retorna `{token, user}` | | POST | `/auth/logout` | | | GET | `/auth/me` | | | GET / PUT | `/establishment` | Do user logado | | GET / POST | `/users` | | | GET / PUT / DEL | `/users/{id}` | | | GET / POST | `/queues` | | | GET / PUT / DEL | `/queues/{id}` | | | GET / POST | `/queues/{id}/entries` | | | GET / PUT | `/entries/{id}` | | | PUT | `/entries/{id}/call\|serve\|absent` | | | GET | `/dashboard` | | | GET | `/reports/daily?date=YYYY-MM-DD` | | ## Multi-tenant > [!success] Isolamento > Todos os controllers filtram por `$this->authEstab()` (do token). `queues.establishment_id` com FK CASCADE. Empresas não se cruzam. ## Estado do app Gestor (2026-04-17) - `AppConstants.baseUrl = 'https://qfila.com.br/api'` - `INTERNET` permission no **main** manifest (descoberta crítica — ver [[feedback_flutter_android_internet]]) - Providers API-first: `AuthProvider`, `QueueProvider`, `EstablishmentProvider`, `UsersProvider` - Models com helper `asInt(v)` nos `fromJson` — MySQL retorna números como string - `HomeScreen.initState` → `loadQueues()` + `establishment.load()` - `QueueDetailScreen.initState` → `refreshQueue(queueId)` - UI: - Avatares circulares (`CustomerAvatar` widget) com iniciais ou foto - Textos completos: "Tempo estimado", "Aguardando há X min" - Seletor "Tipo de atendimento" na criação da fila (chips + personalizado) - Botão "Rechamar" removido da aba Em atendimento - FAB bottom padding 140 — não sobrepõe cards ## Pendente - [ ] Tela "Minha Assinatura" no app do gestor (pagamento PIX / Mercado Pago / Asaas) - [ ] Endpoint público `GET /api/public/establishment/{code}` para o cliente - [ ] Integrar [[project_qfila|QFilaCliente]] com API - [ ] Deep link do QR no app do cliente (escanear → abre preenchido) - [ ] Trocar senha admin em produção ## Device de teste - Samsung A53 `RQCT6049QXE` (Android 16, API 36) - `adb`: `C:/Users/Jesiel/AppData/Local/Android/Sdk/platform-tools/adb.exe` ## Links - [[feedback_obsidian_memory]] - [[feedback_flutter_android_internet]] - [[reference_obsidian_vault]]