{ "container": "supabase_db_agenciapsi-primesakai", "database": "postgres", "user": "postgres", "backupRetentionDays": 30, "schema": "schema/00_full/schema.sql", "migrationsDir": "migrations", "seedsDir": "seeds", "fixesDir": "fixes", "seeds": { "users": [ "seed_001_fixed.sql", "seed_002.sql", "seed_003.sql" ], "system": [ "seed_010_plans.sql", "seed_011_features.sql", "seed_012_plan_features.sql", "seed_013_subscriptions.sql", "seed_014_global_data.sql", "seed_015_document_templates.sql", "seed_030_dev_phases_items.sql", "seed_031_dev_auditoria.sql", "seed_032_dev_competitors.sql" ], "test_data": [ "seed_020_test_data.sql" ] }, "fixes": [ "fix_addon_credits_fk.sql", "fix_addon_rls_saas_admin.sql", "fix_missing_subscriptions.sql", "fix_notification_templates_rls_admin.sql", "fix_seed_patient_groups.sql", "fix_subscriptions_validate_scope.sql", "fix_template_keys_match_populate.sql", "fix_encoding_accents.sql" ], "verify": { "tables": [ { "name": "auth.users", "min": 1 }, { "name": "profiles", "min": 1 }, { "name": "tenants", "min": 1 }, { "name": "plans", "min": 7 }, { "name": "features", "min": 20 }, { "name": "plan_features", "min": 50 }, { "name": "subscriptions", "min": 1 }, { "name": "email_templates_global", "min": 10 }, { "name": "notification_templates", "min": 5 }, { "name": "document_templates", "min": 1 } ], "views": [ "v_tenant_entitlements", "v_tenant_active_subscription" ] }, "status": { "tables": [ "auth.users", "profiles", "tenants", "tenant_members", "plans", "features", "plan_features", "subscriptions", "patients", "agenda_eventos", "services", "financial_records", "document_templates", "documents", "email_templates_global", "notification_templates" ] }, "domains": { "SaaS / Planos": [ "plans", "plan_features", "plan_prices", "plan_public", "plan_public_bullets", "features", "modules", "module_features", "subscriptions", "subscription_events", "subscription_intents_legacy", "subscription_intents_personal", "subscription_intents_tenant", "tenant_modules", "tenant_features", "tenant_feature_exceptions_log", "billing_contracts", "entitlements_invalidation" ], "Addons / Créditos": [ "addon_products", "addon_credits", "addon_transactions" ], "Tenants / Multi-tenant": [ "tenants", "profiles", "user_settings", "tenant_invites", "tenant_members", "company_profiles", "support_sessions", "saas_admins", "owner_users", "dev_user_credentials" ], "Pacientes": [ "patients", "patient_contacts", "patient_support_contacts", "patient_groups", "patient_group_patient", "patient_tags", "patient_patient_tag", "patient_discounts", "patient_intake_requests", "patient_invites", "patient_status_history", "patient_timeline" ], "Agenda / Agendamento": [ "agenda_eventos", "agenda_bloqueios", "agenda_configuracoes", "agenda_excecoes", "agenda_online_slots", "agenda_regras_semanais", "agenda_slots_bloqueados_semanais", "agenda_slots_regras", "agendador_configuracoes", "agendador_solicitacoes" ], "Financeiro": [ "financial_categories", "financial_exceptions", "financial_records", "payment_settings", "professional_pricing", "therapist_payouts", "therapist_payout_records", "recurrence_rules", "recurrence_exceptions", "recurrence_rule_services" ], "Serviços / Prontuários": [ "services", "commitment_services", "commitment_time_logs", "determined_commitments", "determined_commitment_fields", "insurance_plans", "insurance_plan_services", "medicos" ], "Documentos": [ "documents", "document_templates", "document_generated", "document_access_logs", "document_share_links", "document_signatures" ], "Comunicação / Notificações": [ "email_templates_global", "email_templates_tenant", "email_layout_config", "notification_templates", "notification_channels", "notification_preferences", "notification_logs", "notification_schedules", "notification_queue", "notifications", "notice_dismissals", "global_notices", "login_carousel_slides", "twilio_subaccount_usage" ], "Central SaaS (docs/FAQ)": [ "saas_docs", "saas_doc_votos", "saas_faq", "saas_faq_itens" ], "Estrutura / Calendário": [ "feriados" ] }, "domainColors": { "SaaS / Planos": "#4f8cff", "Addons / Créditos": "#a78bfa", "Tenants / Multi-tenant": "#6ee7b7", "Pacientes": "#f472b6", "Agenda / Agendamento": "#38bdf8", "Financeiro": "#f87171", "Serviços / Prontuários": "#34d399", "Documentos": "#0ea5e9", "Comunicação / Notificações": "#fbbf24", "Central SaaS (docs/FAQ)": "#c084fc", "Estrutura / Calendário": "#fb923c" }, "infrastructure": { "Banco & Backend": { "color": "#4f8cff", "items": [ { "name": "Supabase", "role": "Postgres + Auth + Storage + Realtime + Edge Functions", "env": "Local (Docker) + Cloud", "status": "ativo", "notes": "Stack principal. Migrations em database-novo/migrations/. Functions em supabase/functions/. CLI via npx supabase." }, { "name": "PostgreSQL 15", "role": "Banco de dados relacional (via container supabase_db_agenciapsi-primesakai)", "env": "Local (Docker)", "status": "ativo", "notes": "RLS habilitada em todas as tabelas públicas. Multi-tenant via tenant_id. SECURITY DEFINER em RPCs sensíveis." }, { "name": "Docker + Docker Compose", "role": "Orquestração dos containers do stack Supabase local + Evolution API", "env": "Local", "status": "ativo", "notes": "docker-compose.yml na raiz. Iniciado via npx supabase start." } ] }, "Email": { "color": "#fbbf24", "items": [ { "name": "Mailpit (Supabase inbucket)", "role": "Inbox SMTP local para capturar emails de teste", "env": "Local (Docker)", "status": "ativo", "notes": "Container supabase_inbucket. Usado em dev para validar templates sem enviar email real." }, { "name": "SMTP produção", "role": "Envio real de emails transacionais (faturas, convites, notificações)", "env": "Cloud (pendente)", "status": "pendente", "notes": "Requer SMTP_HOST/PORT/USER/PASS/FROM nos secrets das edge functions." } ] }, "WhatsApp / SMS": { "color": "#34d399", "items": [ { "name": "Evolution API", "role": "Integração WhatsApp Business (envio/recebimento)", "env": "Local (Docker)", "status": "ativo", "notes": "Container via evolution-api/. whatsapp_instances e notification_channels já cadastrados. Integração real está sendo costurada." }, { "name": "Twilio (SMS/Voz)", "role": "Provedor de SMS e voz para notificações", "env": "Cloud", "status": "ativo", "notes": "twilio_subaccount_usage rastreia consumo por tenant. SaasTwilioWhatsappPage gerencia contas." } ] }, "Geração de documentos": { "color": "#38bdf8", "items": [ { "name": "pdfmake 0.3.7", "role": "Geração de PDF client-side (atestados, laudos, recibos)", "env": "Browser", "status": "ativo", "notes": "UMD/webpack. Requer optimizeDeps.include explícito no vite.config.mjs." }, { "name": "html-to-pdfmake / html2pdf.js / jsPDF", "role": "Conversão HTML→PDF para documentos ricos", "env": "Browser", "status": "ativo", "notes": "Usado em document_templates e documents gerados para pacientes." }, { "name": "Jodit + Quill", "role": "Editores de texto rico para templates de documentos", "env": "Browser", "status": "ativo", "notes": "Jodit em DocumentTemplateEditor; Quill em páginas legadas. Migração em andamento." }, { "name": "html2canvas-pro", "role": "Captura de screenshots de DOM (preview/export)", "env": "Browser", "status": "ativo", "notes": "Usado para thumbnails de templates e previews." } ] }, "Frontend": { "color": "#a78bfa", "items": [ { "name": "Vue 3 + Composition API", "role": "Framework principal (script setup)", "env": "Browser", "status": "ativo", "notes": "~487 componentes Vue. Pinia para state management." }, { "name": "Vite 5", "role": "Build tool e dev server", "env": "Node.js", "status": "ativo", "notes": "vite-plugin-compression (Brotli/Gzip), unplugin-auto-import para PrimeVue e Vue. rollup-plugin-visualizer para análise de bundle." }, { "name": "PrimeVue 4 (tema Sakai)", "role": "Biblioteca de componentes UI", "env": "Browser", "status": "ativo", "notes": "@primeuix/themes. auto-import-resolver. DataTable, Dialog, DatePicker, Popover, Toast, ConfirmDialog headless." }, { "name": "Tailwind CSS v4", "role": "Utility-first CSS", "env": "Browser", "status": "ativo", "notes": "@tailwindcss/vite + tailwindcss-primeui. Surface tokens do PrimeVue (var(--surface-card), var(--text-color-secondary))." }, { "name": "Vue Router", "role": "Roteamento SPA com guards por role/tenant", "env": "Browser", "status": "ativo", "notes": "Grupos de rota: therapist, admin, supervisor, saas, billing, account, configuracoes, features." }, { "name": "FullCalendar 6", "role": "Calendário para agenda de terapeutas", "env": "Browser", "status": "ativo", "notes": "Plugins: daygrid, timegrid, interaction, list, resource, resource-timegrid." }, { "name": "Chart.js 3", "role": "Gráficos para dashboards (financeiro, KPIs)", "env": "Browser", "status": "ativo", "notes": "Usado em dashboards do therapist e clinic." } ] }, "Dev / Tooling": { "color": "#94a3b8", "items": [ { "name": "Supabase CLI", "role": "Gerencia ambiente local, migrations, edge functions", "env": "Node.js", "status": "ativo", "notes": "Via npx supabase. Start/stop/status/db-push/functions-deploy." }, { "name": "db.cjs (este projeto)", "role": "CLI auxiliar pra setup/backup/restore/migrate/verify via docker exec", "env": "Node.js", "status": "ativo", "notes": "Complementa o supabase CLI com fluxo schema + fixes + seeds + migrations. Encoding UTF-8 preservado." }, { "name": "generate-dashboard.cjs", "role": "Gera dashboard HTML estático do schema (tabelas, FKs, infra)", "env": "Node.js", "status": "ativo", "notes": "Standalone, sem dependências externas. Lê config de db.config.json e schema do backup mais recente." }, { "name": "Vitest 4", "role": "Runner de testes unitários", "env": "Node.js", "status": "ativo", "notes": "npm test / test:watch / test:ui. Bateria inicial em src/**/__tests__." }, { "name": "ESLint + Prettier", "role": "Lint + formatação automática", "env": "Node.js", "status": "ativo", "notes": "@vue/eslint-config-prettier. Rodado via npm run lint." } ] } } }