Versão: 1.0
Stack de referência: Laravel 13, Livewire 4, Flux Pro, PostgreSQL, Redis, Spatie Permission, Policies, Pest, Laravel Reverb (broadcast opcional), Sail, Laravel Boost.
Consolidar o estado atual do produto (estruturas e vistas), alinhar com a matriz ACL já definida (módulo Academy) e definir um plano enxuto em fases para o primeiro ciclo voltado à divulgação (valor percebido, narrativa, demos), sem depender ainda de todo o escopo operacional (presenças, Play Card credenciado, etc.).
src/Modules/| Módulo | Conteúdo principal |
|---|---|
| Identity | RoleName, PermissionName, seeds de roles/permissões |
| Venue | Venue, Court, actions de criação |
| Booking | Booking, enums, actions, conflitos |
| Player | Player (perfil atleta, localização, nível em schema) |
Não existe ainda módulo Academy / Training no código — apenas a especificação na ACL.
Kolos\Modules\Identity\Domain\Enums\RoleName — inclui Coach (coach).PermissionName: somente venue (venue.create, venue.update, …). Nenhuma permissão granular para treinador/turmas foi criada ainda.App\Support\ActorContext — o treinador aparece no switcher como «🎓 Treinador», mas não há rotas nem itens de navegação específicos para coach.routes/web.php)| Área | Rotas | Middleware |
|---|---|---|
| Público | /, /login, /cadastro |
guest onde aplicável |
| App autenticado | /dashboard, /tournaments, POST /logout |
auth, actor_context |
| Player | /booking, /community, /my-card, /my-location |
auth + role:player |
| Venue owner | /venues, /venues/{venue}/courts, .../maintenance |
auth + role:venue_owner|super_admin |
Treinador (coach): sem rotas dedicadas.
Ficheiros em resources/views/livewire/:
| Vista | Componente | Papel / notas |
|---|---|---|
home.blade.php |
Home |
Marketing / entrada |
auth/login.blade.php |
Login |
Autenticação |
onboarding/register-player.blade.php |
RegisterPlayer |
Onboarding atleta (cadastro + endereço/CEP) |
dashboard.blade.php |
Dashboard |
Hub genérico; conteúdo majoritariamente placeholder; links úteis sob @role('player') e @canany venue |
booking.blade.php |
Booking |
Atleta — reservas |
tournaments.blade.php |
Tournaments |
Acessível a qualquer user autenticado na rota (sem role:player no middleware) |
community.blade.php |
Community |
Comunidade (UI placeholder) |
my-card.blade.php |
MyCard |
Card do atleta (stats placeholder — alinhado a «Play Card» futuro) |
my-location.blade.php |
MyLocation |
Atleta — localização |
venue/my-venues.blade.php |
MyVenues |
Dono de arena |
venue/manage-courts.blade.php |
ManageCourts |
Dono de arena |
venue/declare-maintenance.blade.php |
DeclareMaintenance |
Dono de arena |
actor-switcher.blade.php |
ActorSwitcher |
Troca de contexto (inclui Treinador se tiver role) |
Shell de navegação (resources/views/components/app-shell.blade.php):
activeActor).Conclusão: a experiência «aluno» no app corresponde ao role player + onboarding + booking/card/localização. A experiência «professor / treinador» está só na documentação ACL; não há ecrãs Livewire dedicados ao coach.
Trecho já definido em kolos_acl-matriz-atores-e-acesso.md — módulo Academy (Aulas):
is_credentialed = true altera atributos técnicos no Play Card.MVP divulgação pode cortar presenças e credenciação técnica, desde que o plano deixe explícito o debt e a ordem em que isso entra.
ActorContext, Spatie + Policies quando houver mutação de dados.Kolos\Modules\Academy\ em src/Modules/Academy/ (ver README na pasta).academy.class.view, academy.class.manage_students, academy.roster.invite — nomes finais a cravar com o mesmo padrão de PermissionName.coach recebe subset; venue_owner mantém capacidades de «criar turma» conforme matriz.Objetivo: screenshots, demo ao vivo, landing interna.
| Entrega | Descrição | Tecnologias |
|---|---|---|
| B1 | Rota(s) sob role:coach + activeActor === coach: «Minhas turmas» (lista mock ou 1 turma fixa) |
Livewire, Flux, middleware role, ActorContext |
| B2 | Vista «Alunos da turma» (tabela placeholder com nomes fictícios ou seed) | Flux table/cards |
| B3 | Ajuste de navegação: quando ator = coach, sidebar / bottom nav mostram Academy e escondem ou despriorizam fluxos puramente atleta | app-shell, @if ($activeActor === $roleCoach) |
| B4 | Dashboard: bloco condicional «Modo treinador» com CTA para turmas | dashboard.blade.php + opcional lógica no componente |
Persistência opcional nesta fase: se quiserem URL estável para demo, uma migration academy_classes + academy_class_members mínima (UUID, venue_id, coach_user_id, name) já justifica Policies.
users / players), opcional convite por token.venue e por coach atribuído.is_credentialed no coach (ou tabela coach_profiles) + enforcement na Policy de atualização técnica.| Tecnologia | Uso no módulo |
|---|---|
| Livewire 4 | Páginas turmas, lista alunos, formulários |
| Flux Pro | Cards, tabelas, badges, modais |
| Spatie Permission | Permissões Academy; roles coach, venue_owner, player |
| Policies | Turma pertence à arena; coach só edita turmas onde é responsável |
| PostgreSQL | Tabelas normalizadas + índices por venue_id, coach_user_id |
| Redis | Filas (convites, notificações) quando existirem jobs |
| Pest | Feature tests por rota e Policy |
| Reverb + Echo | Fase D ou notificações live |
| Filament | Apenas se houver necessidade de back-office global (não é foco do MVP divulgação) |
| Sail | Comandos padrão vendor/bin/sail artisan test, migrate, etc. |
User ou obrigar Player existente? (Recomendação: FK para users; perfil desportivo continua em players quando existir.)active_venue_id — hoje ligado a venue_owner; pode precisar de «arena ativa» também para coach.)Documentar decisões em docs/changes/ quando fechadas.
Academy referenciadas no código.coach + permissão academy.class.view + middleware active_actor:coach.ActorContext (shell mobile/desktop por $showPlayerShell / $showCoachShell / $showVenueShell).tests/Feature/Academy/AcademyCoachRoutesTest.php.src/Modules/Academy/README.md