-- CreateEnum CREATE TYPE "tenant_status" AS ENUM ('trial', 'ativo', 'inadimplente', 'suspenso', 'cancelado'); -- CreateEnum CREATE TYPE "cobranca_status" AS ENUM ('pendente', 'pago', 'atrasado', 'cancelado'); -- CreateEnum CREATE TYPE "user_role" AS ENUM ('tenant_admin', 'vendedor', 'financeiro', 'visualizador'); -- CreateEnum CREATE TYPE "item_tipo" AS ENUM ('produto', 'servico'); -- CreateEnum CREATE TYPE "venda_status" AS ENUM ('orcamento', 'confirmada', 'cancelada', 'concluida'); -- CreateEnum CREATE TYPE "parcela_status" AS ENUM ('pendente', 'pago', 'atrasado', 'cancelado'); -- CreateTable CREATE TABLE "master_admins" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "nome" VARCHAR(150) NOT NULL, "email" VARCHAR(150) NOT NULL, "senha_hash" TEXT NOT NULL, "ativo" BOOLEAN NOT NULL DEFAULT true, "mfa_secret" TEXT, "ultimo_login" TIMESTAMPTZ(6), "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, "atualizado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "master_admins_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "evolution_api_config" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "nome" VARCHAR(100) NOT NULL, "base_url" VARCHAR(255) NOT NULL, "api_key_cripto" TEXT NOT NULL, "versao" VARCHAR(20) NOT NULL DEFAULT '2.3', "ativo" BOOLEAN NOT NULL DEFAULT true, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "evolution_api_config_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "master_email_config" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "smtp_host" VARCHAR(150) NOT NULL, "smtp_porta" INTEGER NOT NULL, "smtp_usuario" VARCHAR(150) NOT NULL, "smtp_senha_cripto" TEXT NOT NULL, "email_remetente" VARCHAR(150) NOT NULL, "ativo" BOOLEAN NOT NULL DEFAULT true, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "master_email_config_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "planos" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "nome" VARCHAR(100) NOT NULL, "descricao" TEXT, "valor_mensal" DECIMAL(10,2) NOT NULL, "limite_customers" INTEGER, "limite_usuarios" INTEGER, "limite_instancias_whatsapp" INTEGER NOT NULL DEFAULT 1, "ativo" BOOLEAN NOT NULL DEFAULT true, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "planos_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "tenants" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "razao_social" VARCHAR(200) NOT NULL, "nome_fantasia" VARCHAR(200), "documento" VARCHAR(20), "email_contato" VARCHAR(150) NOT NULL, "telefone" VARCHAR(20), "logo_url" TEXT, "cor_primaria" VARCHAR(7), "plano_id" UUID, "status" "tenant_status" NOT NULL DEFAULT 'trial', "dia_vencimento_mensalidade" SMALLINT NOT NULL DEFAULT 10, "trial_expira_em" TIMESTAMPTZ(6), "criado_por" UUID, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, "atualizado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "tenants_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "tenant_faturas" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID NOT NULL, "referencia" VARCHAR(7) NOT NULL, "valor" DECIMAL(10,2) NOT NULL, "vencimento" DATE NOT NULL, "pago_em" TIMESTAMPTZ(6), "status" "cobranca_status" NOT NULL DEFAULT 'pendente', "alerta_enviado_em" TIMESTAMPTZ(6), "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "tenant_faturas_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "tenant_users" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID NOT NULL, "nome" VARCHAR(150) NOT NULL, "email" VARCHAR(150) NOT NULL, "senha_hash" TEXT NOT NULL, "role" "user_role" NOT NULL DEFAULT 'vendedor', "ativo" BOOLEAN NOT NULL DEFAULT true, "mfa_secret" TEXT, "ultimo_login" TIMESTAMPTZ(6), "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "tenant_users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "auth_refresh_tokens" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "usuario_tipo" VARCHAR(20) NOT NULL, "usuario_id" UUID NOT NULL, "token_hash" TEXT NOT NULL, "expira_em" TIMESTAMPTZ(6) NOT NULL, "revogado" BOOLEAN NOT NULL DEFAULT false, "ip_origem" INET, "user_agent" TEXT, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "auth_refresh_tokens_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "password_reset_tokens" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "usuario_tipo" VARCHAR(20) NOT NULL, "usuario_id" UUID NOT NULL, "token_hash" TEXT NOT NULL, "expira_em" TIMESTAMPTZ(6) NOT NULL, "usado" BOOLEAN NOT NULL DEFAULT false, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "password_reset_tokens_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "login_attempts" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "email" VARCHAR(150) NOT NULL, "usuario_tipo" VARCHAR(20) NOT NULL, "sucesso" BOOLEAN NOT NULL, "ip_origem" INET, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "login_attempts_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "tenant_whatsapp_instances" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID NOT NULL, "evolution_config_id" UUID, "instance_name" VARCHAR(100) NOT NULL, "numero_conectado" VARCHAR(20), "status" VARCHAR(30) NOT NULL DEFAULT 'desconectado', "qr_code_gerado_em" TIMESTAMPTZ(6), "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "tenant_whatsapp_instances_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "tenant_email_config" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID NOT NULL, "smtp_host" VARCHAR(150), "smtp_porta" INTEGER, "smtp_usuario" VARCHAR(150), "smtp_senha_cripto" TEXT, "email_remetente" VARCHAR(150), "usar_config_padrao" BOOLEAN NOT NULL DEFAULT true, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "tenant_email_config_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "alert_templates" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID, "tipo" VARCHAR(50) NOT NULL, "canal" VARCHAR(20) NOT NULL, "assunto" VARCHAR(200), "corpo" TEXT NOT NULL, "ativo" BOOLEAN NOT NULL DEFAULT true, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "alert_templates_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "alert_logs" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID, "destinatario_tipo" VARCHAR(20) NOT NULL, "destinatario_id" UUID NOT NULL, "canal" VARCHAR(20) NOT NULL, "template_id" UUID, "conteudo_enviado" TEXT, "status" VARCHAR(20) NOT NULL DEFAULT 'enviado', "erro" TEXT, "enviado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "alert_logs_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "customers" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID NOT NULL, "razao_social" VARCHAR(200) NOT NULL, "nome_fantasia" VARCHAR(200), "documento" VARCHAR(20), "email" VARCHAR(150), "telefone_whatsapp" VARCHAR(20), "endereco" TEXT, "cidade" VARCHAR(100), "uf" CHAR(2), "observacoes" TEXT, "ativo" BOOLEAN NOT NULL DEFAULT true, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, "atualizado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "customers_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "customer_contacts" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "customer_id" UUID NOT NULL, "nome" VARCHAR(150) NOT NULL, "cargo" VARCHAR(100), "email" VARCHAR(150), "telefone_whatsapp" VARCHAR(20), "principal" BOOLEAN NOT NULL DEFAULT false, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "customer_contacts_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "products_services" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID NOT NULL, "tipo" "item_tipo" NOT NULL, "nome" VARCHAR(200) NOT NULL, "descricao" TEXT, "sku" VARCHAR(50), "valor_venda" DECIMAL(12,2) NOT NULL, "valor_custo" DECIMAL(12,2), "unidade" VARCHAR(20) NOT NULL DEFAULT 'un', "recorrente" BOOLEAN NOT NULL DEFAULT false, "ativo" BOOLEAN NOT NULL DEFAULT true, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, "atualizado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "products_services_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "sales" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID NOT NULL, "customer_id" UUID NOT NULL, "vendedor_id" UUID, "numero_venda" SERIAL NOT NULL, "status" "venda_status" NOT NULL DEFAULT 'confirmada', "valor_total" DECIMAL(12,2) NOT NULL DEFAULT 0, "desconto" DECIMAL(12,2) NOT NULL DEFAULT 0, "observacoes" TEXT, "data_venda" DATE NOT NULL DEFAULT CURRENT_TIMESTAMP, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, "atualizado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "sales_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "sale_items" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "sale_id" UUID NOT NULL, "product_service_id" UUID NOT NULL, "quantidade" DECIMAL(10,2) NOT NULL DEFAULT 1, "valor_unitario" DECIMAL(12,2) NOT NULL, "valor_total" DECIMAL(12,2) NOT NULL, CONSTRAINT "sale_items_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "sale_payments" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "sale_id" UUID NOT NULL, "numero_parcela" SMALLINT NOT NULL DEFAULT 1, "valor" DECIMAL(12,2) NOT NULL, "vencimento" DATE NOT NULL, "pago_em" TIMESTAMPTZ(6), "forma_pagamento" VARCHAR(30), "status" "parcela_status" NOT NULL DEFAULT 'pendente', "alerta_enviado_em" TIMESTAMPTZ(6), "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "sale_payments_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "audit_logs" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "tenant_id" UUID, "usuario_tipo" VARCHAR(20) NOT NULL, "usuario_id" UUID, "acao" VARCHAR(100) NOT NULL, "entidade" VARCHAR(50), "entidade_id" UUID, "detalhes" JSONB, "ip_origem" INET, "criado_em" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "master_admins_email_key" ON "master_admins"("email"); -- CreateIndex CREATE INDEX "idx_tenants_status" ON "tenants"("status"); -- CreateIndex CREATE UNIQUE INDEX "tenant_faturas_tenant_id_referencia_key" ON "tenant_faturas"("tenant_id", "referencia"); -- CreateIndex CREATE INDEX "idx_tenant_users_tenant" ON "tenant_users"("tenant_id"); -- CreateIndex CREATE UNIQUE INDEX "tenant_users_tenant_id_email_key" ON "tenant_users"("tenant_id", "email"); -- CreateIndex CREATE INDEX "idx_refresh_tokens_usuario" ON "auth_refresh_tokens"("usuario_tipo", "usuario_id"); -- CreateIndex CREATE INDEX "idx_login_attempts_email_data" ON "login_attempts"("email", "criado_em"); -- CreateIndex CREATE UNIQUE INDEX "tenant_whatsapp_instances_instance_name_key" ON "tenant_whatsapp_instances"("instance_name"); -- CreateIndex CREATE UNIQUE INDEX "tenant_email_config_tenant_id_key" ON "tenant_email_config"("tenant_id"); -- CreateIndex CREATE INDEX "idx_alert_logs_tenant" ON "alert_logs"("tenant_id", "enviado_em"); -- CreateIndex CREATE INDEX "idx_customers_tenant" ON "customers"("tenant_id"); -- CreateIndex CREATE INDEX "idx_products_tenant" ON "products_services"("tenant_id"); -- CreateIndex CREATE UNIQUE INDEX "products_services_tenant_id_sku_key" ON "products_services"("tenant_id", "sku"); -- CreateIndex CREATE INDEX "idx_sales_tenant_data" ON "sales"("tenant_id", "data_venda"); -- CreateIndex CREATE INDEX "idx_sales_customer" ON "sales"("customer_id"); -- CreateIndex CREATE INDEX "idx_sale_items_sale" ON "sale_items"("sale_id"); -- CreateIndex CREATE INDEX "idx_audit_tenant_data" ON "audit_logs"("tenant_id", "criado_em"); -- AddForeignKey ALTER TABLE "tenants" ADD CONSTRAINT "tenants_plano_id_fkey" FOREIGN KEY ("plano_id") REFERENCES "planos"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tenants" ADD CONSTRAINT "tenants_criado_por_fkey" FOREIGN KEY ("criado_por") REFERENCES "master_admins"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tenant_faturas" ADD CONSTRAINT "tenant_faturas_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tenant_users" ADD CONSTRAINT "tenant_users_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tenant_whatsapp_instances" ADD CONSTRAINT "tenant_whatsapp_instances_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tenant_whatsapp_instances" ADD CONSTRAINT "tenant_whatsapp_instances_evolution_config_id_fkey" FOREIGN KEY ("evolution_config_id") REFERENCES "evolution_api_config"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tenant_email_config" ADD CONSTRAINT "tenant_email_config_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "alert_templates" ADD CONSTRAINT "alert_templates_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "alert_logs" ADD CONSTRAINT "alert_logs_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "alert_logs" ADD CONSTRAINT "alert_logs_template_id_fkey" FOREIGN KEY ("template_id") REFERENCES "alert_templates"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "customers" ADD CONSTRAINT "customers_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "customer_contacts" ADD CONSTRAINT "customer_contacts_customer_id_fkey" FOREIGN KEY ("customer_id") REFERENCES "customers"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "products_services" ADD CONSTRAINT "products_services_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sales" ADD CONSTRAINT "sales_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sales" ADD CONSTRAINT "sales_customer_id_fkey" FOREIGN KEY ("customer_id") REFERENCES "customers"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sales" ADD CONSTRAINT "sales_vendedor_id_fkey" FOREIGN KEY ("vendedor_id") REFERENCES "tenant_users"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sale_items" ADD CONSTRAINT "sale_items_sale_id_fkey" FOREIGN KEY ("sale_id") REFERENCES "sales"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sale_items" ADD CONSTRAINT "sale_items_product_service_id_fkey" FOREIGN KEY ("product_service_id") REFERENCES "products_services"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sale_payments" ADD CONSTRAINT "sale_payments_sale_id_fkey" FOREIGN KEY ("sale_id") REFERENCES "sales"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE SET NULL ON UPDATE CASCADE;