Esquema de Banco de Dados D1 (Drizzle ORM & Migrações)
Estrutura do Banco de Dados Cloudflare D1 (SQLite)
Section titled “Estrutura do Banco de Dados Cloudflare D1 (SQLite)”O banco de dados de borda Cloudflare D1 utiliza uma abordagem híbrida: colunas relacionais indexadas para queries rápidas e colunas *_json para estruturas dinâmicas complexas.
🗄️ Detalhamento das Tabelas
Section titled “🗄️ Detalhamento das Tabelas”1. auth_accounts (Autenticação e Identidade)
Section titled “1. auth_accounts (Autenticação e Identidade)”Armazena todas as identidades de acesso do sistema.
CREATE TABLE auth_accounts ( id TEXT PRIMARY KEY, email TEXT UNIQUE NOT NULL, phone TEXT UNIQUE, -- E.164 canonicalizado (+44...) password_hash TEXT NOT NULL, role TEXT NOT NULL, -- 'ADMIN', 'MANAGER', 'EMPLOYEE', 'CLIENT' reference_id TEXT NOT NULL, -- ID do client ou employee correspondente must_change_password BOOLEAN DEFAULT FALSE, impersonation_only BOOLEAN DEFAULT FALSE, created_at TEXT DEFAULT CURRENT_TIMESTAMP);2. clients (Perfis de Clientes)
Section titled “2. clients (Perfis de Clientes)”CREATE TABLE clients ( id TEXT PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, phone TEXT, mobile_phone TEXT, whatsapp_authorized BOOLEAN DEFAULT TRUE, wallet_balance REAL DEFAULT 0, payment_periodicity TEXT DEFAULT 'PER_SERVICE', default_payment_method TEXT DEFAULT 'TRANSFER', addresses_json TEXT, -- Array de objetos ClientAddress (Rua, Cidade, Postcode, Lat, Lng) custom_rates_json TEXT, -- Sobregravações de preço personalizado por tipo de serviço shopping_list_json TEXT, -- Lista de produtos de limpeza solicitados created_at TEXT DEFAULT CURRENT_TIMESTAMP);3. service_requests (Atendimentos & Visitas de Limpeza)
Section titled “3. service_requests (Atendimentos & Visitas de Limpeza)”Tabela central de operações.
CREATE TABLE service_requests ( id TEXT PRIMARY KEY, client_id TEXT NOT NULL, employee_id TEXT, -- Pode ser NULL se estiver aguardando alocação service_type_id TEXT NOT NULL, status TEXT NOT NULL, -- 'REQUESTED', 'PENDING', 'CONFIRMED', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED' scheduled_date TEXT NOT NULL, start_time TEXT NOT NULL, end_time TEXT NOT NULL, total_amount REAL NOT NULL, address_snapshot_json TEXT NOT NULL, -- Cópia estática do endereço no momento do agendamento checklist_json TEXT, -- Tarefas executadas durante o serviço telemetry_json TEXT, -- Check-in/out GPS da funcionária (lat, lng, timestamp) cancellation_reason TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP);4. invoices (Faturas Fiscais)
Section titled “4. invoices (Faturas Fiscais)”CREATE TABLE invoices ( id TEXT PRIMARY KEY, request_id TEXT NOT NULL, client_id TEXT NOT NULL, amount REAL NOT NULL, vat_amount REAL DEFAULT 0, status TEXT NOT NULL, -- 'DRAFT', 'ISSUED', 'PAID', 'OVERDUE', 'CANCELLED' due_date TEXT NOT NULL, payment_method TEXT, pdf_url TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP);🛠️ Regra Obrigatória dos 3 Arquivos (Schema Drift Prevention)
Section titled “🛠️ Regra Obrigatória dos 3 Arquivos (Schema Drift Prevention)”Quando modificar qualquer estrutura do banco de dados, você SEMPRE deve manter em sincronia:
db/migrations/NNNN_*.sql(Script delta para a produção).db/schema.sql(Baseline para desenvolvimento localnpm run db:init).functions/api/db/schema.ts(Mapeamento Drizzle ORM para o TypeScript).