Correcao Sidebar Classico e Rail, Correcao Layout, Ajuste de Breakpoint para Tailwind, Ajuste AppTopbar, Ajuste Menu PopOver, Recriado Paleta de Cores, Inserido algumas animações leves, Reajuste Cor items NOVOS da tabela, Drawer Ajuda Corrigido no Logout, Whatsapp, sms, email, recursos extras
This commit is contained in:
176
database-novo/docs/business_rules.md
Normal file
176
database-novo/docs/business_rules.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# Regras de Negócio — Banco de Dados AgenciaPsi
|
||||
|
||||
## 1. Planos e Targets
|
||||
|
||||
| Target | Planos | Escopo da Subscription |
|
||||
|--------|--------|----------------------|
|
||||
| `patient` | patient_free | `user_id` (sem tenant_id) |
|
||||
| `therapist` | therapist_free, therapist_pro | `user_id` (sem tenant_id) |
|
||||
| `clinic` | clinic_free, clinic_pro | `tenant_id` (sem user_id) |
|
||||
| `supervisor` | supervisor_free, supervisor_pro | `user_id` (sem tenant_id) |
|
||||
|
||||
**Constraint `subscriptions_owner_xor`**: Uma subscription DEVE ter `tenant_id` XOR `user_id`, nunca ambos.
|
||||
|
||||
**Trigger `subscriptions_validate_scope`**: Valida que o target do plano casa com o escopo:
|
||||
- `clinic` → exige `tenant_id`, rejeita `user_id`
|
||||
- `therapist`, `supervisor`, `patient` → exige `user_id`, rejeita `tenant_id`
|
||||
|
||||
## 2. Planos Core (protegidos)
|
||||
|
||||
Os planos `clinic_free`, `clinic_pro`, `therapist_free`, `therapist_pro` são **core**:
|
||||
- **Não podem ter `key` alterada** (trigger `trg_no_change_core_plan_key`)
|
||||
- **Não podem ter `target` alterado** (trigger `trg_no_change_plan_target`)
|
||||
- **Não podem ser deletados** (trigger `trg_no_delete_core_plans`)
|
||||
|
||||
Para bypass (migração): `SET LOCAL app.plan_migration_bypass = '1'`
|
||||
|
||||
## 3. Entitlements (Features)
|
||||
|
||||
### Resolução de features para TENANTS (clínicas)
|
||||
```
|
||||
tenant_has_feature(tenant_id, feature_key) =
|
||||
EXISTS em v_tenant_entitlements (via plano)
|
||||
OR
|
||||
EXISTS em tenant_features (override direto)
|
||||
```
|
||||
|
||||
### Resolução de features para USERS (terapeutas, supervisores)
|
||||
```
|
||||
user_has_feature(user_id, feature_key) =
|
||||
EXISTS em v_user_entitlements (via plano pessoal)
|
||||
```
|
||||
|
||||
### Cadeia de resolução
|
||||
```
|
||||
subscription → plan → plan_features → features
|
||||
↓
|
||||
plan_features.limits (jsonb) → limites quantitativos
|
||||
```
|
||||
|
||||
### Views de entitlements
|
||||
- `v_tenant_active_subscription` → subscription ativa do tenant
|
||||
- `v_user_active_subscription` → subscription ativa do user
|
||||
- `v_tenant_entitlements` → feature_key + allowed
|
||||
- `v_tenant_entitlements_full` → + limits + plan_id + plan_key
|
||||
- `v_user_entitlements` → feature_key + allowed (para planos pessoais)
|
||||
|
||||
## 4. Tipos de Tenant
|
||||
|
||||
| kind | Descrição | Criação |
|
||||
|------|-----------|---------|
|
||||
| `therapist` | Terapeuta solo | Automático ao criar conta de terapeuta |
|
||||
| `clinic_coworking` | Clínica coworking | Manual |
|
||||
| `clinic_reception` | Clínica com recepção | Manual |
|
||||
| `clinic_full` | Clínica completa | Manual |
|
||||
| `supervisor` | Supervisor | Automático |
|
||||
| `saas` | Sistema (legado) | — |
|
||||
| `clinic` | Legado | — |
|
||||
|
||||
**O `kind` é imutável após criação** (trigger `trg_tenant_kind_immutable`).
|
||||
|
||||
## 5. Roles e Permissões
|
||||
|
||||
### Profile roles
|
||||
| Role | Descrição |
|
||||
|------|-----------|
|
||||
| `saas_admin` | Administrador da plataforma |
|
||||
| `tenant_member` | Membro de um ou mais tenants |
|
||||
| `portal_user` | Paciente (acesso ao portal) |
|
||||
| `patient` | Paciente (legado) |
|
||||
|
||||
### Tenant member roles
|
||||
| Role | Descrição |
|
||||
|------|-----------|
|
||||
| `tenant_admin` | Admin do tenant (dono) |
|
||||
| `therapist` | Terapeuta membro |
|
||||
| `clinic_admin` | Admin da clínica (secretária com poderes) |
|
||||
| `secretary` | Secretária |
|
||||
| `supervisor` | Supervisor |
|
||||
| `patient` | Paciente do tenant |
|
||||
|
||||
### Platform roles (array em profiles)
|
||||
| Role | Descrição |
|
||||
|------|-----------|
|
||||
| `editor` | Editor de conteúdo da plataforma |
|
||||
|
||||
## 6. Compromissos Determinados
|
||||
|
||||
A função `seed_determined_commitments(tenant_id)` cria 5 tipos nativos:
|
||||
|
||||
| native_key | Nome | locked | active |
|
||||
|------------|------|--------|--------|
|
||||
| `session` | Sessão | true | true |
|
||||
| `reading` | Leitura | false | true |
|
||||
| `supervision` | Supervisão | false | true |
|
||||
| `class` | Aula | false | **false** |
|
||||
| `analysis` | Análise Pessoal | false | true |
|
||||
|
||||
- `session` é **locked** (não pode ser editado/deletado)
|
||||
- O `native_key = 'session'` é usado pelo agendador online para identificar o compromisso padrão
|
||||
|
||||
## 7. Grupos de Pacientes Padrão
|
||||
|
||||
A função `seed_default_patient_groups(tenant_id)` cria 3 grupos sistema:
|
||||
|
||||
| Nome | Cor | is_system |
|
||||
|------|-----|-----------|
|
||||
| Crianças | #60a5fa | true |
|
||||
| Adolescentes | #a78bfa | true |
|
||||
| Idosos | #34d399 | true |
|
||||
|
||||
Grupos sistema não podem ser editados/deletados (trigger `prevent_system_group_changes`).
|
||||
|
||||
## 8. Subscriptions — Status
|
||||
|
||||
| Status | Descrição |
|
||||
|--------|-----------|
|
||||
| `pending` | Aguardando ativação |
|
||||
| `active` | Ativa |
|
||||
| `past_due` | Pagamento atrasado |
|
||||
| `suspended` | Suspensa |
|
||||
| `cancelled` | Cancelada |
|
||||
| `expired` | Expirada |
|
||||
|
||||
## 9. Templates de Email
|
||||
|
||||
**Globais** (`email_templates_global`): templates padrão da plataforma, gerenciados pelo saas_admin.
|
||||
|
||||
**Tenant** (`email_templates_tenant`): overrides por tenant. Se existir, usa o do tenant; se não, usa o global.
|
||||
|
||||
### Keys de template
|
||||
| Domínio | Templates |
|
||||
|---------|-----------|
|
||||
| session | reminder, confirmation, cancellation, rescheduled |
|
||||
| intake | received, approved, rejected |
|
||||
| scheduler | request_accepted, request_rejected |
|
||||
| system | welcome, password_reset |
|
||||
|
||||
Canais: `email`, `whatsapp`, `sms`
|
||||
|
||||
## 10. Notificações — Sistema
|
||||
|
||||
| Canal | Tipos |
|
||||
|-------|-------|
|
||||
| WhatsApp | lembrete_sessao, confirmacao_sessao, cancelamento_sessao |
|
||||
| SMS | lembrete_sessao |
|
||||
|
||||
### Schedule keys
|
||||
| Key | Descrição |
|
||||
|-----|-----------|
|
||||
| `lembrete_24h` | 24 horas antes |
|
||||
| `lembrete_2h` | 2 horas antes |
|
||||
| `lembrete_30min` | 30 minutos antes |
|
||||
| `confirmacao_imediata` | Imediato após confirmar |
|
||||
| `cancelamento_imediato` | Imediato após cancelar |
|
||||
|
||||
## 11. RLS (Row Level Security)
|
||||
|
||||
Todas as tabelas do schema `public` têm RLS habilitado. As policies usam:
|
||||
- `auth.uid()` — ID do usuário autenticado
|
||||
- `is_saas_admin()` — verifica se é admin da plataforma
|
||||
- `is_tenant_member(tenant_id)` — verifica se pertence ao tenant
|
||||
- `is_tenant_admin(tenant_id)` — verifica se é admin do tenant
|
||||
- `current_member_role(tenant_id)` — role do membro no tenant
|
||||
- `tenant_has_feature(tenant_id, feature_key)` — verifica feature
|
||||
|
||||
**Se as features/plan_features não existirem no banco, as policies de RLS bloqueiam o acesso.**
|
||||
191
database-novo/docs/schema_map.md
Normal file
191
database-novo/docs/schema_map.md
Normal file
@@ -0,0 +1,191 @@
|
||||
# Schema Map — AgenciaPsi
|
||||
|
||||
Mapa completo do banco de dados PostgreSQL 17, extraído de `schema.sql` (2026-03-23).
|
||||
**84 tabelas** no schema `public` + tabelas de infraestrutura (auth, storage, realtime).
|
||||
|
||||
## Domínios
|
||||
|
||||
### Core (11 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `profiles` | Perfil do usuário (role, account_type, full_name, platform_roles) |
|
||||
| `tenants` | Organizações (clínicas, terapeutas solo, supervisores) |
|
||||
| `tenant_members` | Vínculo usuário↔tenant com role (tenant_admin, therapist, secretary, etc.) |
|
||||
| `tenant_invites` | Convites pendentes para ingressar em um tenant |
|
||||
| `tenant_features` | Overrides de features por tenant (exceções comerciais) |
|
||||
| `tenant_feature_exceptions_log` | Log de alterações em tenant_features |
|
||||
| `saas_admins` | Administradores da plataforma |
|
||||
| `owner_users` | Mapeamento owner_id→user_id para RLS |
|
||||
| `user_settings` | Configurações pessoais do usuário |
|
||||
| `company_profiles` | Perfil da empresa/clínica (logo, endereço, etc.) |
|
||||
| `dev_user_credentials` | Credenciais de teste (apenas dev) |
|
||||
|
||||
### Plans & Billing (20 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `plans` | Planos disponíveis (key, target, price_cents, max_supervisees) |
|
||||
| `plan_prices` | Preços por intervalo (month/year) com versionamento |
|
||||
| `plan_features` | Vínculo plano↔feature com limites (limits jsonb) |
|
||||
| `plan_public` | Info pública dos planos (para página de preços) |
|
||||
| `plan_public_bullets` | Bullets de marketing dos planos |
|
||||
| `features` | Features do sistema (key, name, descricao) |
|
||||
| `entitlements_invalidation` | Cache invalidation de entitlements |
|
||||
| `subscriptions` | Assinaturas ativas (user_id XOR tenant_id) |
|
||||
| `subscription_events` | Histórico de eventos de assinatura |
|
||||
| `subscription_intents_personal` | Intenções de assinatura pessoal |
|
||||
| `subscription_intents_tenant` | Intenções de assinatura de tenant |
|
||||
| `subscription_intents_legacy` | Intenções legadas |
|
||||
| `billing_contracts` | Contratos de cobrança |
|
||||
| `addon_credits` | Créditos de add-ons por tenant |
|
||||
| `addon_products` | Produtos add-on disponíveis |
|
||||
| `addon_transactions` | Transações de add-ons |
|
||||
| `modules` | Módulos do sistema |
|
||||
| `module_features` | Features por módulo |
|
||||
| `tenant_modules` | Módulos ativos por tenant |
|
||||
|
||||
### Agenda (11 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `agenda_bloqueios` | Bloqueios de horário |
|
||||
| `agenda_configuracoes` | Configurações da agenda por tenant_member |
|
||||
| `agenda_eventos` | Eventos da agenda (sessões, bloqueios) |
|
||||
| `agenda_excecoes` | Exceções na agenda (horários extras, bloqueios pontuais) |
|
||||
| `agenda_online_slots` | Slots de agendamento online |
|
||||
| `agenda_regras_semanais` | Regras semanais de disponibilidade |
|
||||
| `agenda_slots_bloqueados_semanais` | Slots bloqueados na semana |
|
||||
| `agenda_slots_regras` | Regras de slots |
|
||||
| `recurrence_rules` | Regras de recorrência de sessões |
|
||||
| `recurrence_exceptions` | Exceções a recorrências |
|
||||
| `recurrence_rule_services` | Serviços vinculados a recorrências |
|
||||
|
||||
### Agendador Online (2 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `agendador_configuracoes` | Configurações do agendador online público |
|
||||
| `agendador_solicitacoes` | Solicitações de agendamento recebidas |
|
||||
|
||||
### Pacientes (8 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `patients` | Pacientes vinculados a um tenant |
|
||||
| `patient_groups` | Grupos de pacientes (sistema + customizados) |
|
||||
| `patient_group_patient` | Vínculo paciente↔grupo |
|
||||
| `patient_tags` | Tags personalizadas |
|
||||
| `patient_patient_tag` | Vínculo paciente↔tag |
|
||||
| `patient_intake_requests` | Solicitações de cadastro (triagem) |
|
||||
| `patient_invites` | Convites para portal do paciente |
|
||||
| `patient_discounts` | Descontos por paciente |
|
||||
|
||||
### Compromissos Determinados (4 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `determined_commitments` | Tipos de compromisso (sessão, leitura, supervisão, etc.) |
|
||||
| `determined_commitment_fields` | Campos customizados por tipo de compromisso |
|
||||
| `commitment_services` | Serviços vinculados a compromissos |
|
||||
| `commitment_time_logs` | Logs de tempo por compromisso |
|
||||
|
||||
### Financeiro (9 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `financial_records` | Lançamentos financeiros (receita/despesa) |
|
||||
| `financial_categories` | Categorias de lançamento |
|
||||
| `financial_exceptions` | Exceções financeiras |
|
||||
| `payment_settings` | Configurações de pagamento por tenant |
|
||||
| `professional_pricing` | Precificação por profissional |
|
||||
| `therapist_payouts` | Repasses a terapeutas |
|
||||
| `therapist_payout_records` | Registros de repasse |
|
||||
| `services` | Serviços oferecidos |
|
||||
| `insurance_plans` + `insurance_plan_services` | Convênios e serviços por convênio |
|
||||
|
||||
### Notificações (10 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `notification_channels` | Canais de notificação por tenant |
|
||||
| `notification_logs` | Logs de envio |
|
||||
| `notification_preferences` | Preferências do paciente (opt-in/out) |
|
||||
| `notification_queue` | Fila de envio |
|
||||
| `notification_schedules` | Agendamentos de notificação |
|
||||
| `notification_templates` | Templates WhatsApp/SMS (default + tenant) |
|
||||
| `notifications` | Notificações in-app |
|
||||
| `email_templates_global` | Templates de email globais (plataforma) |
|
||||
| `email_templates_tenant` | Overrides de templates por tenant |
|
||||
| `email_layout_config` | Configuração de layout de email |
|
||||
|
||||
### SaaS Admin / UI (8 tabelas)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `saas_docs` | Documentação da plataforma |
|
||||
| `saas_doc_votos` | Votos em docs |
|
||||
| `saas_faq` | Categorias de FAQ |
|
||||
| `saas_faq_itens` | Itens de FAQ |
|
||||
| `feriados` | Feriados nacionais/regionais |
|
||||
| `global_notices` | Avisos globais da plataforma |
|
||||
| `login_carousel_slides` | Slides do carrossel de login |
|
||||
| `notice_dismissals` | Dismissals de avisos por usuário |
|
||||
|
||||
### Suporte (1 tabela)
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `support_sessions` | Sessões de suporte técnico |
|
||||
|
||||
---
|
||||
|
||||
## Views Principais
|
||||
|
||||
| View | Descrição |
|
||||
|------|-----------|
|
||||
| `v_tenant_active_subscription` | Subscription ativa por tenant |
|
||||
| `v_user_active_subscription` | Subscription ativa por user |
|
||||
| `v_tenant_entitlements` | Features habilitadas por tenant (via plano) |
|
||||
| `v_tenant_entitlements_full` | Entitlements + limits + plan info |
|
||||
| `v_tenant_entitlements_json` | Entitlements agregados como JSON |
|
||||
| `v_user_entitlements` | Features habilitadas por user (via plano) |
|
||||
| `v_tenant_members_with_profiles` | Membros do tenant com dados do perfil |
|
||||
| `v_tenant_staff` | Staff do tenant (membros + convites) |
|
||||
| `v_tenant_people` | Todas as pessoas do tenant |
|
||||
| `v_plan_active_prices` | Preços ativos dos planos |
|
||||
| `v_public_pricing` | Preços públicos para página de marketing |
|
||||
| `v_subscription_health` | Saúde das subscriptions |
|
||||
| `v_cashflow_projection` | Projeção de fluxo de caixa |
|
||||
| `v_commitment_totals` | Totais de compromissos |
|
||||
| `v_patient_groups_with_counts` | Grupos com contagem de pacientes |
|
||||
| `v_tag_patient_counts` | Tags com contagem de pacientes |
|
||||
| `subscription_intents` | View unificada de intenções (com INSTEAD OF trigger) |
|
||||
| `owner_feature_entitlements` | Entitlements por owner |
|
||||
| `current_tenant_id` | Tenant ativo do usuário corrente |
|
||||
|
||||
---
|
||||
|
||||
## Funções Críticas
|
||||
|
||||
| Função | Tipo | Descrição |
|
||||
|--------|------|-----------|
|
||||
| `tenant_has_feature(uuid, text)` | Query | Verifica se tenant tem feature (plano + override) |
|
||||
| `user_has_feature(uuid, text)` | Query | Verifica se user tem feature via plano pessoal |
|
||||
| `has_feature(uuid, text)` | Query | Alias genérico |
|
||||
| `seed_determined_commitments(uuid)` | Seed | Cria 5 tipos de compromisso nativos por tenant |
|
||||
| `seed_default_patient_groups(uuid)` | Seed | Cria 3 grupos de pacientes padrão |
|
||||
| `seed_default_financial_categories(uuid)` | Seed | Cria categorias financeiras padrão |
|
||||
| `subscriptions_validate_scope()` | Trigger | Valida XOR (user_id vs tenant_id) por target |
|
||||
| `activate_subscription_from_intent(uuid)` | RPC | Ativa subscription a partir de intent |
|
||||
| `handle_new_user()` | Trigger | Cria profile + tenant pessoal ao cadastrar |
|
||||
| `ensure_personal_tenant()` | RPC | Garante que o user tem um tenant pessoal |
|
||||
| `populate_notification_queue()` | Cron | Popula fila de notificações |
|
||||
| `agendador_slots_disponiveis(text, date)` | RPC | Retorna slots disponíveis para agendamento |
|
||||
|
||||
---
|
||||
|
||||
## Enums (public schema)
|
||||
|
||||
| Tipo | Valores |
|
||||
|------|---------|
|
||||
| `commitment_log_source` | manual, auto |
|
||||
| `determined_field_type` | text, textarea, number, date, select, boolean |
|
||||
| `financial_record_type` | receita, despesa |
|
||||
| `recurrence_exception_type` | cancel_session, reschedule_session, patient_missed, therapist_canceled, holiday_block |
|
||||
| `recurrence_type` | weekly, biweekly, monthly, yearly, custom_weekdays |
|
||||
| `status_agenda_serie` | ativo, pausado, cancelado |
|
||||
| `status_evento_agenda` | agendado, realizado, faltou, cancelado, remarcar |
|
||||
| `status_excecao_agenda` | pendente, ativo, arquivado |
|
||||
| `tipo_evento_agenda` | sessao, bloqueio |
|
||||
| `tipo_excecao_agenda` | bloqueio, horario_extra |
|
||||
297
database-novo/docs/setup_guide.md
Normal file
297
database-novo/docs/setup_guide.md
Normal file
@@ -0,0 +1,297 @@
|
||||
# Guia de Instalação e Uso — AgenciaPsi Database
|
||||
|
||||
## Pré-requisitos
|
||||
|
||||
1. **Docker Desktop** instalado e rodando
|
||||
2. **Node.js** 18+ instalado
|
||||
3. **Supabase CLI** instalado (`npm install -g supabase`)
|
||||
|
||||
## Instalação do Zero (banco vazio)
|
||||
|
||||
### 1. Iniciar o Supabase
|
||||
|
||||
```bash
|
||||
# Na raiz do projeto (agenciapsi-primesakai/)
|
||||
npx supabase start
|
||||
```
|
||||
|
||||
Aguarde até o container `supabase_db_agenciapsi-primesakai` estar rodando.
|
||||
|
||||
### 2. Verificar se o container está ok
|
||||
|
||||
```bash
|
||||
docker ps | grep supabase_db
|
||||
```
|
||||
|
||||
Deve mostrar o container com status `Up`.
|
||||
|
||||
### 3. Instalar o banco completo
|
||||
|
||||
```bash
|
||||
cd database-novo
|
||||
node db.cjs setup
|
||||
```
|
||||
|
||||
Isso faz tudo automaticamente:
|
||||
- Aplica o schema completo (84 tabelas, funções, triggers, policies)
|
||||
- Aplica os 7 fixes conhecidos
|
||||
- Cria os 11 usuários de teste
|
||||
- Cria os 7 planos + 4 preços
|
||||
- Cria as 26 features + 85 vínculos plano↔feature
|
||||
- Cria as 9 subscriptions + compromissos determinados
|
||||
- Cria os templates de email, notificação e carousel
|
||||
- Cria backup automático pós-instalação
|
||||
- Verifica integridade no final
|
||||
|
||||
### 4. Verificar
|
||||
|
||||
```bash
|
||||
node db.cjs status
|
||||
```
|
||||
|
||||
Deve mostrar todos os counts verdes.
|
||||
|
||||
## Backup
|
||||
|
||||
### Criar backup manual
|
||||
|
||||
```bash
|
||||
node db.cjs backup
|
||||
```
|
||||
|
||||
Salva em `backups/YYYY-MM-DD/` com 3 arquivos:
|
||||
- `schema.sql` — estrutura do banco
|
||||
- `data.sql` — dados (sem schemas de infra)
|
||||
- `full_dump.sql` — tudo junto
|
||||
|
||||
### Backup automático
|
||||
|
||||
O backup é feito automaticamente:
|
||||
- Após o `setup`
|
||||
- Antes de cada `migrate`
|
||||
- Antes de cada `restore`
|
||||
- Antes de cada `reset`
|
||||
|
||||
### Retenção
|
||||
|
||||
Backups com mais de 30 dias são removidos automaticamente. Para alterar, edite `backupRetentionDays` no `db.config.json`.
|
||||
|
||||
## Restaurar o Banco
|
||||
|
||||
### Restaurar do último backup
|
||||
|
||||
```bash
|
||||
node db.cjs restore
|
||||
```
|
||||
|
||||
### Restaurar de uma data específica
|
||||
|
||||
```bash
|
||||
node db.cjs restore 2026-03-23
|
||||
```
|
||||
|
||||
O restore:
|
||||
1. Cria backup de segurança do estado atual
|
||||
2. Limpa o schema public
|
||||
3. Aplica o full_dump.sql do backup
|
||||
4. Verifica integridade
|
||||
|
||||
## Migrations (alterações no banco)
|
||||
|
||||
### Criar uma migration
|
||||
|
||||
Crie um arquivo SQL na pasta `migrations/` com nome sequencial:
|
||||
|
||||
```
|
||||
migrations/
|
||||
├── 001_add_column_x.sql
|
||||
├── 002_create_table_y.sql
|
||||
└── 003_fix_something.sql
|
||||
```
|
||||
|
||||
O nome deve começar com número para garantir a ordem.
|
||||
|
||||
### Aplicar migrations pendentes
|
||||
|
||||
```bash
|
||||
node db.cjs migrate
|
||||
```
|
||||
|
||||
O CLI:
|
||||
1. Cria backup automático
|
||||
2. Compara com a tabela `_db_migrations` no banco
|
||||
3. Aplica apenas as que ainda não foram executadas
|
||||
4. Registra cada migration aplicada
|
||||
5. Se uma falhar, para imediatamente (use `restore` para voltar)
|
||||
|
||||
### Ver migrations aplicadas
|
||||
|
||||
```bash
|
||||
node db.cjs status
|
||||
```
|
||||
|
||||
## Seeds (dados de teste)
|
||||
|
||||
### Rodar todos os seeds
|
||||
|
||||
```bash
|
||||
node db.cjs seed all # ou simplesmente: node db.cjs seed
|
||||
```
|
||||
|
||||
### Rodar grupo específico
|
||||
|
||||
```bash
|
||||
node db.cjs seed users # Apenas usuários (seed_001 a 003)
|
||||
node db.cjs seed system # Apenas sistema (seed_010 a 014)
|
||||
node db.cjs seed test_data # Dados de teste (seed_020)
|
||||
```
|
||||
|
||||
### Ordem dos seeds
|
||||
|
||||
| # | Arquivo | O que faz |
|
||||
|---|---------|-----------|
|
||||
| 1 | `seed_001_fixed.sql` | 6 usuários base + tenants |
|
||||
| 2 | `seed_002.sql` | Supervisor + Editor |
|
||||
| 3 | `seed_003.sql` | Therapist2, Therapist3, Secretary |
|
||||
| 4 | `seed_010_plans.sql` | 7 planos + 4 preços |
|
||||
| 5 | `seed_011_features.sql` | 26 features |
|
||||
| 6 | `seed_012_plan_features.sql` | 85 vínculos plano↔feature |
|
||||
| 7 | `seed_013_subscriptions.sql` | 9 subscriptions + compromissos |
|
||||
| 8 | `seed_014_global_data.sql` | Templates + carousel |
|
||||
|
||||
## Outros Comandos
|
||||
|
||||
### Ver status
|
||||
|
||||
```bash
|
||||
node db.cjs status
|
||||
```
|
||||
|
||||
Mostra: container, backups, migrations aplicadas/pendentes, counts de todas as tabelas.
|
||||
|
||||
### Comparar mudanças
|
||||
|
||||
```bash
|
||||
node db.cjs diff
|
||||
```
|
||||
|
||||
Compara o schema atual no banco com o último backup. Mostra tabelas adicionadas, removidas ou alteradas.
|
||||
|
||||
### Verificar integridade
|
||||
|
||||
```bash
|
||||
node db.cjs verify
|
||||
```
|
||||
|
||||
Checa se os dados essenciais existem (plans, features, subscriptions, etc).
|
||||
|
||||
### Reset completo
|
||||
|
||||
```bash
|
||||
node db.cjs reset
|
||||
```
|
||||
|
||||
**⚠ CUIDADO**: Apaga tudo e reinstala do zero. Cria backup antes.
|
||||
|
||||
## Estrutura de Pastas
|
||||
|
||||
```
|
||||
database-novo/
|
||||
├── db.js ← CLI principal
|
||||
├── db.config.json ← Configuração (container, seeds, fixes)
|
||||
│
|
||||
├── schema/ ← Schema SQL separado por seção
|
||||
│ ├── 00_full/ ← Schema completo (referência)
|
||||
│ ├── 01_extensions/ ← Extensões PostgreSQL
|
||||
│ ├── 02_types/ ← Enums e tipos
|
||||
│ ├── 03_functions/ ← Funções (11 arquivos por domínio)
|
||||
│ ├── 04_tables/ ← Tabelas (10 arquivos por domínio)
|
||||
│ ├── 05_views/ ← 24 views
|
||||
│ ├── 06_indexes/ ← Índices
|
||||
│ ├── 07_foreign_keys/ ← PKs, FKs, constraints
|
||||
│ ├── 08_triggers/ ← Triggers
|
||||
│ ├── 09_policies/ ← 217 RLS policies
|
||||
│ └── 10_grants/ ← Grants
|
||||
│
|
||||
├── seeds/ ← Seeds de dados
|
||||
│ ├── seed_001_fixed.sql
|
||||
│ ├── ...
|
||||
│ └── run_all_seeds.sh
|
||||
│
|
||||
├── migrations/ ← Migrations (alterações incrementais)
|
||||
│
|
||||
├── fixes/ ← Correções aplicadas
|
||||
│
|
||||
├── backups/ ← Backups com data
|
||||
│ ├── 2026-03-23/
|
||||
│ └── ...
|
||||
│
|
||||
└── docs/ ← Documentação
|
||||
├── setup_guide.md ← Este arquivo
|
||||
├── schema_map.md ← Mapa de 84 tabelas
|
||||
├── business_rules.md ← Regras de negócio
|
||||
└── users_test.md ← Usuários de teste
|
||||
```
|
||||
|
||||
## Credenciais de Teste
|
||||
|
||||
| Email | Senha | Tipo |
|
||||
|-------|-------|------|
|
||||
| paciente@agenciapsi.com.br | Teste@123 | Paciente |
|
||||
| terapeuta@agenciapsi.com.br | Teste@123 | Terapeuta solo |
|
||||
| clinica1@agenciapsi.com.br | Teste@123 | Clínica coworking |
|
||||
| clinica2@agenciapsi.com.br | Teste@123 | Clínica recepção |
|
||||
| clinica3@agenciapsi.com.br | Teste@123 | Clínica full |
|
||||
| saas@agenciapsi.com.br | Teste@123 | Admin plataforma |
|
||||
| supervisor@agenciapsi.com.br | Teste@123 | Supervisor |
|
||||
| editor@agenciapsi.com.br | Teste@123 | Editor |
|
||||
| therapist2@agenciapsi.com.br | Teste@123 | Terapeuta |
|
||||
| therapist3@agenciapsi.com.br | Teste@123 | Terapeuta |
|
||||
| secretary@agenciapsi.com.br | Teste@123 | Secretária |
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Container não está rodando"
|
||||
|
||||
```bash
|
||||
# Verificar
|
||||
docker ps | grep supabase
|
||||
|
||||
# Reiniciar
|
||||
npx supabase stop
|
||||
npx supabase start
|
||||
```
|
||||
|
||||
### "Tabela não existe" após setup
|
||||
|
||||
O schema pode não ter sido aplicado corretamente. Rode:
|
||||
|
||||
```bash
|
||||
node db.cjs reset
|
||||
```
|
||||
|
||||
### "Permission denied" / RLS bloqueando
|
||||
|
||||
Se features/plan_features estiverem vazios, o RLS bloqueia tudo. Rode:
|
||||
|
||||
```bash
|
||||
node db.cjs seed system
|
||||
```
|
||||
|
||||
### Migration falhou no meio
|
||||
|
||||
```bash
|
||||
# Voltar ao estado anterior
|
||||
node db.cjs restore
|
||||
|
||||
# Corrigir o SQL da migration, depois tentar de novo
|
||||
node db.cjs migrate
|
||||
```
|
||||
|
||||
### Quero começar do zero
|
||||
|
||||
```bash
|
||||
node db.cjs reset
|
||||
```
|
||||
|
||||
Isso apaga tudo, reaplica schema, fixes, seeds, e verifica.
|
||||
90
database-novo/docs/users_test.md
Normal file
90
database-novo/docs/users_test.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# Usuários de Teste — AgenciaPsi
|
||||
|
||||
Senha de todos: `Teste@123`
|
||||
|
||||
## Mapa de UUIDs
|
||||
|
||||
### Users (auth.users.id = profiles.id)
|
||||
| Email | UUID | Nome |
|
||||
|-------|------|------|
|
||||
| paciente@agenciapsi.com.br | `aaaaaaaa-0001-0001-0001-000000000001` | Ana Paciente |
|
||||
| terapeuta@agenciapsi.com.br | `aaaaaaaa-0002-0002-0002-000000000002` | Bruno Terapeuta |
|
||||
| clinica1@agenciapsi.com.br | `aaaaaaaa-0003-0003-0003-000000000003` | Clínica Espaço Psi |
|
||||
| clinica2@agenciapsi.com.br | `aaaaaaaa-0004-0004-0004-000000000004` | Clínica Mente sã |
|
||||
| clinica3@agenciapsi.com.br | `aaaaaaaa-0005-0005-0005-000000000005` | Clínica Bem Estar |
|
||||
| saas@agenciapsi.com.br | `aaaaaaaa-0006-0006-0006-000000000006` | Admin Plataforma |
|
||||
| supervisor@agenciapsi.com.br | `aaaaaaaa-0007-0007-0007-000000000007` | Carlos Supervisor |
|
||||
| editor@agenciapsi.com.br | `aaaaaaaa-0008-0008-0008-000000000008` | Diana Editora |
|
||||
| therapist2@agenciapsi.com.br | `aaaaaaaa-0009-0009-0009-000000000009` | Eva Terapeuta |
|
||||
| therapist3@agenciapsi.com.br | `aaaaaaaa-0010-0010-0010-000000000010` | Felipe Terapeuta |
|
||||
| secretary@agenciapsi.com.br | `aaaaaaaa-0011-0011-0011-000000000011` | Gabriela Secretária |
|
||||
|
||||
### Tenants
|
||||
| Nome | UUID | Kind |
|
||||
|------|------|------|
|
||||
| Bruno Terapeuta | `bbbbbbbb-0002-0002-0002-000000000002` | therapist |
|
||||
| Clínica Espaço Psi | `bbbbbbbb-0003-0003-0003-000000000003` | clinic_coworking |
|
||||
| Clínica Mente sã | `bbbbbbbb-0004-0004-0004-000000000004` | clinic_reception |
|
||||
| Clínica Bem Estar | `bbbbbbbb-0005-0005-0005-000000000005` | clinic_full |
|
||||
| Eva Terapeuta | `bbbbbbbb-0009-0009-0009-000000000009` | therapist |
|
||||
| Felipe Terapeuta | `bbbbbbbb-0010-0010-0010-000000000010` | therapist |
|
||||
|
||||
## Mapa de Vínculos
|
||||
|
||||
```
|
||||
paciente@ → portal_user / patient_free (user_id)
|
||||
Sem tenant próprio
|
||||
|
||||
terapeuta@ → tenant_member / therapist
|
||||
Tenant: bbbbbbbb-0002 (therapist) → tenant_admin
|
||||
Clínica 3: bbbbbbbb-0005 → therapist
|
||||
Subscription: therapist_free (user_id)
|
||||
|
||||
clinica1@ → tenant_member / clinic
|
||||
Tenant: bbbbbbbb-0003 (clinic_coworking) → tenant_admin
|
||||
Subscription: clinic_free (tenant_id)
|
||||
|
||||
clinica2@ → tenant_member / clinic
|
||||
Tenant: bbbbbbbb-0004 (clinic_reception) → tenant_admin
|
||||
Subscription: clinic_free (tenant_id)
|
||||
|
||||
clinica3@ → tenant_member / clinic
|
||||
Tenant: bbbbbbbb-0005 (clinic_full) → tenant_admin
|
||||
Subscription: clinic_free (tenant_id)
|
||||
|
||||
saas@ → saas_admin
|
||||
Sem tenant, sem subscription
|
||||
|
||||
supervisor@ → tenant_member / therapist
|
||||
Clínica 3: bbbbbbbb-0005 → supervisor
|
||||
Subscription: supervisor_free (user_id)
|
||||
|
||||
editor@ → tenant_member / therapist + platform_roles: {editor}
|
||||
Clínica 3: bbbbbbbb-0005 → therapist
|
||||
Subscription: therapist_free (user_id)
|
||||
|
||||
therapist2@ → tenant_member / therapist
|
||||
Tenant: bbbbbbbb-0009 (therapist) → tenant_admin
|
||||
Clínica 3: bbbbbbbb-0005 → therapist
|
||||
Subscription: therapist_free (user_id)
|
||||
|
||||
therapist3@ → tenant_member / therapist
|
||||
Tenant: bbbbbbbb-0010 (therapist) → tenant_admin
|
||||
Clínica 3: bbbbbbbb-0005 → therapist
|
||||
Subscription: therapist_free (user_id)
|
||||
|
||||
secretary@ → tenant_member / therapist (profile)
|
||||
Clínica 2: bbbbbbbb-0004 → clinic_admin
|
||||
Sem subscription própria (usa plano da Clínica 2)
|
||||
```
|
||||
|
||||
## Clínica 3 — Bem Estar (Full) — Membros
|
||||
|
||||
| Membro | Role |
|
||||
|--------|------|
|
||||
| clinica3@ | tenant_admin |
|
||||
| terapeuta@ | therapist |
|
||||
| supervisor@ | supervisor |
|
||||
| editor@ | therapist |
|
||||
| therapist2@ | therapist |
|
||||
| therapist3@ | therapist |
|
||||
Reference in New Issue
Block a user