Appearance
Planos & Limites
Visão Geral
O sistema usa um modelo freemium com 3 planos. Cada tenant (igreja) tem um plano associado que define limites de membros, usuários, e features habilitadas.
Plan Model
Namespace: App\Models\Plan (banco central)
| Campo | Tipo | Descrição |
|---|---|---|
| slug | string | semente, crescimento, expansao |
| name | string | Nome do plano |
| max_members | integer | Limite de membros (0 = ilimitado) |
| max_users | integer | Limite de usuários admin (0 = ilimitado) |
| price | decimal | Preço mensal |
| features | JSON | Features habilitadas |
| is_active | boolean | Disponível para contratação |
| sort_order | integer | Ordenação na UI |
Importante: O model usa getConnectionName() para sempre consultar o banco central, mesmo quando em contexto de tenant.
Planos Configurados
| Plano | Membros | Usuários | Preço | Features |
|---|---|---|---|---|
| Semente | 50 | 1 | Grátis | — |
| Crescimento | 250 | 5 | R$ 99/mês | audit_full, notifications_push, volunteers_schedule |
| Expansão | Ilimitado | Ilimitado | R$ 249/mês | Tudo do Crescimento + custom_roles, api_access, events_management |
Tenant Helpers
O model Tenant tem métodos helper:
php
tenant()->hasFeature('audit_full') // verifica plan.features + extra_features
tenant()->memberLimit() // retorna max_members do plano
tenant()->isAtMemberLimit() // true se count >= limit
tenant()->isNearMemberLimit(90) // true se count >= 90% do limit
tenant()->isAtUserLimit() // true se count >= limitLimites
Soft Limit (90%)
Quando o tenant atinge 90% do limite de membros, o MemberObserver registra um log de warning. Notificação real-time via Reverb será implementada em fase futura.
Hard Limit (100%)
Ao tentar criar o membro que excede o limite, o MemberController::store() retorna back()->with('upgrade_required', true). O frontend exibe o UpgradeModal automaticamente.
Bloqueio seletivo
Membros existentes continuam acessíveis. Apenas novas inserções são bloqueadas até o upgrade.
Feature Flags
Middleware CheckFeature para proteger rotas de módulos premium:
php
Route::middleware('feature:checkin_kids')->group(function () {
// Rotas só acessíveis se o plano tiver a feature
});Features armazenadas em dois lugares:
plans.features(JSON) — features do plano basetenants.extra_features(JSON) — add-ons comprados à parte
Painel Admin Central
Acesso via http://igreja.test/admin/tenants?token=ADMIN_TOKEN
Funcionalidades:
- Lista todos os tenants com plano, contagem de membros/users
- Troca de plano por tenant (select + save)
- Protegido por token configurado via
ADMIN_TOKENno.env
Página de Upgrade (Tenant)
Acesso via /upgrade (qualquer user autenticado).
Mostra os 3 planos com preços, limites e features. Plano atual destacado. CTA "Entrar em contato" (sem gateway de pagamento nesta fase).