- Create CreatePlanModal component with Headless UI Dialog - Implement dark mode support throughout plans UI - Update plans/page.tsx with professional card layout - Update plans/[id]/page.tsx with consistent styling - Add proper spacing, typography, and color consistency - Implement smooth animations and transitions - Add success/error message feedback - Improve form UX with better input styling
174 lines
5.2 KiB
Markdown
174 lines
5.2 KiB
Markdown
# Sistema de Planos - Roadmap
|
|
|
|
## Status: Estrutura Frontend Criada ✅
|
|
|
|
### O que foi criado no Frontend:
|
|
1. **Menu Item** adicionado em `/superadmin/layout.tsx`
|
|
- Nova rota: `/superadmin/plans`
|
|
|
|
2. **Página Principal de Planos** (`/superadmin/plans/page.tsx`)
|
|
- Lista todos os planos em grid
|
|
- Mostra: nome, descrição, faixa de usuários, preços, features, diferenciais
|
|
- Botão "Novo Plano"
|
|
- Botões Editar e Deletar
|
|
- Status visual (ativo/inativo)
|
|
|
|
3. **Página de Edição de Plano** (`/superadmin/plans/[id]/page.tsx`)
|
|
- Formulário completo para editar:
|
|
- Informações básicas (nome, slug, descrição)
|
|
- Faixa de usuários (min/max)
|
|
- Preços (mensal/anual)
|
|
- Armazenamento (GB)
|
|
- Status (ativo/inativo)
|
|
- TODO: Editor de Features e Diferenciais
|
|
|
|
---
|
|
|
|
## Próximos Passos - Backend
|
|
|
|
### 1. Modelo de Dados (Domain)
|
|
```go
|
|
// internal/domain/plan.go
|
|
type Plan struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Slug string `json:"slug"`
|
|
Description string `json:"description"`
|
|
MinUsers int `json:"min_users"`
|
|
MaxUsers int `json:"max_users"` // -1 = unlimited
|
|
MonthlyPrice *decimal.Decimal `json:"monthly_price"`
|
|
AnnualPrice *decimal.Decimal `json:"annual_price"`
|
|
Features pq.StringArray `json:"features"` // CRM, ERP, etc
|
|
Differentiators pq.StringArray `json:"differentiators"`
|
|
StorageGB int `json:"storage_gb"`
|
|
IsActive bool `json:"is_active"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type Subscription struct {
|
|
ID string `json:"id"`
|
|
AgencyID string `json:"agency_id"`
|
|
PlanID string `json:"plan_id"`
|
|
BillingType string `json:"billing_type"` // monthly/annual
|
|
CurrentUsers int `json:"current_users"`
|
|
Status string `json:"status"` // active/suspended/cancelled
|
|
StartDate time.Time `json:"start_date"`
|
|
RenewalDate time.Time `json:"renewal_date"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
```
|
|
|
|
### 2. Migrations
|
|
- `001_create_plans_table.sql`
|
|
- `002_create_agency_subscriptions_table.sql`
|
|
- `003_add_plan_id_to_agencies.sql`
|
|
|
|
### 3. Repository
|
|
- `PlanRepository` (CRUD)
|
|
- `SubscriptionRepository` (CRUD)
|
|
|
|
### 4. Service
|
|
- `PlanService` (validações, lógica)
|
|
- `SubscriptionService` (validar limite de usuários, etc)
|
|
|
|
### 5. Handlers (API)
|
|
```
|
|
GET /api/admin/plans - Listar planos
|
|
POST /api/admin/plans - Criar plano
|
|
GET /api/admin/plans/:id - Obter plano
|
|
PUT /api/admin/plans/:id - Atualizar plano
|
|
DELETE /api/admin/plans/:id - Deletar plano
|
|
|
|
GET /api/admin/subscriptions - Listar subscrições
|
|
```
|
|
|
|
### 6. Seeds
|
|
- Seed dos 4 planos padrão (Ignição, Órbita, Cosmos, Enterprise)
|
|
|
|
---
|
|
|
|
## Dados Padrão para Seed
|
|
|
|
```json
|
|
[
|
|
{
|
|
"name": "Ignição",
|
|
"slug": "ignition",
|
|
"description": "Ideal para pequenas agências iniciantes",
|
|
"min_users": 1,
|
|
"max_users": 30,
|
|
"monthly_price": 199.99,
|
|
"annual_price": 1919.90,
|
|
"features": ["CRM", "ERP", "Projetos", "Helpdesk", "Pagamentos", "Contratos", "Documentos"],
|
|
"differentiators": [],
|
|
"storage_gb": 1,
|
|
"is_active": true
|
|
},
|
|
{
|
|
"name": "Órbita",
|
|
"slug": "orbit",
|
|
"description": "Para agências em crescimento",
|
|
"min_users": 31,
|
|
"max_users": 100,
|
|
"monthly_price": 399.99,
|
|
"annual_price": 3839.90,
|
|
"features": ["CRM", "ERP", "Projetos", "Helpdesk", "Pagamentos", "Contratos", "Documentos"],
|
|
"differentiators": ["Suporte prioritário"],
|
|
"storage_gb": 1,
|
|
"is_active": true
|
|
},
|
|
{
|
|
"name": "Cosmos",
|
|
"slug": "cosmos",
|
|
"description": "Para agências consolidadas",
|
|
"min_users": 101,
|
|
"max_users": 300,
|
|
"monthly_price": 799.99,
|
|
"annual_price": 7679.90,
|
|
"features": ["CRM", "ERP", "Projetos", "Helpdesk", "Pagamentos", "Contratos", "Documentos"],
|
|
"differentiators": ["Gerente de conta dedicado", "API integrações"],
|
|
"storage_gb": 1,
|
|
"is_active": true
|
|
},
|
|
{
|
|
"name": "Enterprise",
|
|
"slug": "enterprise",
|
|
"description": "Solução customizada para grandes agências",
|
|
"min_users": 301,
|
|
"max_users": -1,
|
|
"monthly_price": null,
|
|
"annual_price": null,
|
|
"features": ["CRM", "ERP", "Projetos", "Helpdesk", "Pagamentos", "Contratos", "Documentos"],
|
|
"differentiators": ["Armazenamento customizado", "Treinamento personalizado"],
|
|
"storage_gb": 1,
|
|
"is_active": true
|
|
}
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
## Integração com Agências
|
|
|
|
Quando agência se cadastra:
|
|
1. Seleciona um plano
|
|
2. Sistema cria `Subscription` com status `active` ou `pending_payment`
|
|
3. Agência herda limite de usuários do plano
|
|
4. Ao criar usuário: validar se não ultrapassou limite
|
|
|
|
---
|
|
|
|
## Features Futuras
|
|
- [ ] Editor de Features e Diferenciais (drag-drop no frontend)
|
|
- [ ] Planos promocionais (duplicar existente, editar preço)
|
|
- [ ] Validações de limite de usuários por plano
|
|
- [ ] Dashboard com uso atual vs limite
|
|
- [ ] Alertas quando próximo do limite
|
|
- [ ] Integração com Stripe/PagSeguro
|
|
|
|
---
|
|
|
|
**Pronto para começar?**
|