-- ============================================================
-- Sistema de Cobrança de Empréstimo - Schema PostgreSQL
-- ============================================================

CREATE EXTENSION IF NOT EXISTS "pgcrypto";

-- Clientes (quem toma o empréstimo)
CREATE TABLE clientes (
    id SERIAL PRIMARY KEY,
    captador_id INTEGER REFERENCES captadores(id) ON DELETE SET NULL,
    nome VARCHAR(150) NOT NULL,
    cpf VARCHAR(14) UNIQUE,
    rg VARCHAR(20),
    data_nascimento DATE,
    estado_civil VARCHAR(30),
    nome_mae VARCHAR(150),
    profissao VARCHAR(100),
    renda_mensal NUMERIC(12,2),
    email VARCHAR(150),
    telefone VARCHAR(20),
    whatsapp VARCHAR(20) NOT NULL,
    cep VARCHAR(10),
    endereco VARCHAR(200),
    numero VARCHAR(20),
    bairro VARCHAR(100),
    cidade VARCHAR(100),
    estado VARCHAR(2),
    referencia_nome VARCHAR(150),
    referencia_telefone VARCHAR(20),
    referencia_parentesco VARCHAR(50),
    observacoes TEXT,
    status VARCHAR(20) NOT NULL DEFAULT 'ativo', -- ativo, inativo, bloqueado
    origem VARCHAR(20) NOT NULL DEFAULT 'manual', -- manual, formulario_publico
    criado_em TIMESTAMP NOT NULL DEFAULT NOW(),
    atualizado_em TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_clientes_captador ON clientes(captador_id);

-- Anexos dos clientes (documentos, comprovantes, fotos)
CREATE TABLE cliente_anexos (
    id SERIAL PRIMARY KEY,
    cliente_id INTEGER NOT NULL REFERENCES clientes(id) ON DELETE CASCADE,
    nome_original VARCHAR(255) NOT NULL,
    caminho_arquivo VARCHAR(500) NOT NULL,
    tipo_documento VARCHAR(50), -- rg, cpf, comprovante_residencia, comprovante_renda, outro
    tamanho_bytes INTEGER,
    criado_em TIMESTAMP NOT NULL DEFAULT NOW()
);

-- Empréstimos
CREATE TABLE emprestimos (
    id SERIAL PRIMARY KEY,
    cliente_id INTEGER NOT NULL REFERENCES clientes(id) ON DELETE CASCADE,
    captador_id INTEGER REFERENCES captadores(id) ON DELETE SET NULL,
    valor_emprestado NUMERIC(12,2) NOT NULL,
    valor_total_devido NUMERIC(12,2) NOT NULL,
    qtd_parcelas INTEGER NOT NULL,
    frequencia VARCHAR(20) NOT NULL DEFAULT 'mensal', -- semanal, quinzenal, mensal
    data_primeira_parcela DATE NOT NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'ativo', -- ativo, quitado, cancelado
    observacoes TEXT,
    criado_por INTEGER REFERENCES usuarios(id),
    criado_em TIMESTAMP NOT NULL DEFAULT NOW(),
    atualizado_em TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_emprestimos_cliente ON emprestimos(cliente_id);
CREATE INDEX idx_emprestimos_status ON emprestimos(status);

-- Parcelas
CREATE TABLE parcelas (
    id SERIAL PRIMARY KEY,
    emprestimo_id INTEGER NOT NULL REFERENCES emprestimos(id) ON DELETE CASCADE,
    numero_parcela INTEGER NOT NULL,
    valor_previsto NUMERIC(12,2) NOT NULL,
    valor_pago NUMERIC(12,2) NOT NULL DEFAULT 0,
    data_vencimento DATE NOT NULL,
    data_ultimo_pagamento DATE,
    status VARCHAR(20) NOT NULL DEFAULT 'pendente', -- pendente, parcial, pago
    criado_em TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_parcelas_emprestimo ON parcelas(emprestimo_id);
CREATE INDEX idx_parcelas_vencimento ON parcelas(data_vencimento);
CREATE INDEX idx_parcelas_status ON parcelas(status);

-- Histórico de pagamentos recebidos dos clientes
CREATE TABLE pagamentos (
    id SERIAL PRIMARY KEY,
    parcela_id INTEGER NOT NULL REFERENCES parcelas(id) ON DELETE CASCADE,
    valor_pago NUMERIC(12,2) NOT NULL,
    data_pagamento DATE NOT NULL,
    forma_pagamento VARCHAR(30), -- pix, dinheiro, transferencia, outro
    observacao TEXT,
    registrado_por INTEGER REFERENCES usuarios(id),
    criado_em TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_pagamentos_parcela ON pagamentos(parcela_id);

-- Pagamentos feitos AO captador (comissão)
CREATE TABLE pagamentos_captador (
    id SERIAL PRIMARY KEY,
    captador_id INTEGER NOT NULL REFERENCES captadores(id) ON DELETE CASCADE,
    valor NUMERIC(12,2) NOT NULL,
    data_pagamento DATE NOT NULL,
    observacao TEXT,
    registrado_por INTEGER REFERENCES usuarios(id),
    criado_em TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_pagcaptador_captador ON pagamentos_captador(captador_id);

-- Tabela de sessões (usada pelo connect-pg-simple para login)
CREATE TABLE "session" (
    "sid" varchar NOT NULL COLLATE "default",
    "sess" json NOT NULL,
    "expire" timestamp(6) NOT NULL
)
WITH (OIDS=FALSE);
ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;
CREATE INDEX "IDX_session_expire" ON "session" ("expire");
