7.0 KiB
7.0 KiB
Banco de Dados - DRE Gerencial
Visão Geral
O sistema utiliza PostgreSQL como banco de dados principal, com Drizzle ORM para type-safe database operations. A estrutura é baseada em views materializadas para performance otimizada.
Configuração do Banco
Variáveis de Ambiente
POSTGRES_DB=dre_gerencial
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=sua_senha
Conexão (src/db/index.ts)
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
import * as schema from './schema';
const pool = new Pool({
database: process.env.POSTGRES_DB,
host: process.env.POSTGRES_HOST,
port: Number(process.env.POSTGRES_PORT),
user: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
});
const db = drizzle({
client: pool,
schema,
});
Schema do Banco
View Principal (src/db/schema.ts)
export const view = pgView('view_dre_gerencial', {
codfilial: text(),
data_competencia: date(),
data_caixa: date(),
grupo: text(),
subgrupo: text(),
centro_custo: text(),
codigo_conta: integer(),
conta: text(),
valor: numeric(),
});
Estrutura da View
A view view_dre_gerencial consolida dados de múltiplas tabelas para fornecer uma estrutura hierárquica otimizada:
| Campo | Tipo | Descrição |
|---|---|---|
codfilial |
text | Código da filial |
data_competencia |
date | Data de competência do lançamento |
data_caixa |
date | Data de caixa |
grupo |
text | Descrição do grupo (ex: "01 - RECEITAS") |
subgrupo |
text | Descrição do subgrupo |
centro_custo |
text | Centro de custo |
codigo_conta |
integer | Código numérico da conta |
conta |
text | Descrição da conta |
valor |
numeric | Valor do lançamento |
Tabelas Base (Inferidas)
Tabela Principal: fato_financeiro_analitico
Baseada na API analítica, esta tabela contém os dados detalhados:
| Campo | Tipo | Descrição |
|---|---|---|
id |
integer | ID único |
codfilial |
text | Código da filial |
recnum |
integer | Número do registro |
data_competencia |
date | Data de competência |
data_vencimento |
date | Data de vencimento |
data_pagamento |
date | Data de pagamento |
data_caixa |
date | Data de caixa |
codigo_conta |
text | Código da conta |
conta |
text | Descrição da conta |
codigo_centrocusto |
text | Código do centro de custo |
codigo_fornecedor |
text | Código do fornecedor |
nome_fornecedor |
text | Nome do fornecedor |
valor |
numeric | Valor do lançamento |
historico |
text | Histórico principal |
historico2 |
text | Histórico secundário |
created_at |
timestamp | Data de criação |
updated_at |
timestamp | Data de atualização |
Queries Principais
1. Dados DRE Gerencial
SELECT * FROM view_dre_gerencial
- Uso: Carregamento inicial da interface hierárquica
- Performance: Otimizada via view materializada
2. Dados Analíticos com Filtros
SELECT
ffa.codigo_fornecedor,
ffa.nome_fornecedor,
ffa.id,
ffa.codfilial,
ffa.recnum,
ffa.data_competencia,
ffa.data_vencimento,
ffa.data_pagamento,
ffa.data_caixa,
ffa.codigo_conta,
ffa.conta,
ffa.codigo_centrocusto,
ffa.valor,
ffa.historico,
ffa.historico2,
ffa.created_at,
ffa.updated_at
FROM fato_financeiro_analitico AS ffa
WHERE to_char(ffa.data_competencia, 'YYYY-MM') BETWEEN $1 AND $2
AND ffa.codigo_centrocusto = $3 -- Opcional
AND ffa.codigo_conta = $4 -- Opcional
3. Query com Filtros de Grupo/Subgrupo
SELECT ffa.*
FROM fato_financeiro_analitico AS ffa
WHERE EXISTS (
SELECT 1 FROM public.view_dre_gerencial AS dre
WHERE ffa.codigo_conta = dre.codigo_conta::text
AND ffa.codigo_centrocusto = dre.centro_custo
AND to_char(ffa.data_competencia, 'YYYY-MM') = to_char(dre.data_competencia, 'YYYY-MM')
AND SUBSTRING(dre.grupo FROM '^\\s*(\\d+)\\s*\\.') = $1
AND SUBSTRING(dre.subgrupo FROM '^\\s*(\\d+(?:\\.\\d+)+)\\s*-') = $2
)
AND to_char(ffa.data_competencia, 'YYYY-MM') BETWEEN $3 AND $4
Índices Recomendados
Índices para Performance
-- Índice para filtros por data
CREATE INDEX idx_fato_financeiro_data_competencia
ON fato_financeiro_analitico (data_competencia);
-- Índice para filtros por centro de custo
CREATE INDEX idx_fato_financeiro_centro_custo
ON fato_financeiro_analitico (codigo_centrocusto);
-- Índice para filtros por conta
CREATE INDEX idx_fato_financeiro_conta
ON fato_financeiro_analitico (codigo_conta);
-- Índice composto para queries analíticas
CREATE INDEX idx_fato_financeiro_analitico_composto
ON fato_financeiro_analitico (data_competencia, codigo_centrocusto, codigo_conta);
Migrações e Versionamento
Drizzle Kit Configuration
// drizzle.config.ts
export default defineConfig({
out: './drizzle',
schema: './src/db/schema.ts',
dialect: 'postgresql',
dbCredentials: {
database: process.env.POSTGRES_DB || 'dre_gerencial',
host: process.env.POSTGRES_HOST || 'localhost',
port: Number(process.env.POSTGRES_PORT) || 5432,
user: process.env.POSTGRES_USER || 'postgres',
password: process.env.POSTGRES_PASSWORD || '',
},
});
Comandos de Migração
# Gerar migração
npx drizzle-kit generate
# Aplicar migração
npx drizzle-kit migrate
# Visualizar schema
npx drizzle-kit studio
Backup e Manutenção
Backup Automático
# Backup diário
pg_dump -h localhost -U postgres -d dre_gerencial > backup_$(date +%Y%m%d).sql
# Restore
psql -h localhost -U postgres -d dre_gerencial < backup_20240101.sql
Manutenção da View
-- Refresh da view materializada (se aplicável)
REFRESH MATERIALIZED VIEW view_dre_gerencial;
-- Análise de performance
ANALYZE fato_financeiro_analitico;
ANALYZE view_dre_gerencial;
Monitoramento
Queries de Monitoramento
-- Tamanho das tabelas
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- Queries lentas
SELECT query, mean_time, calls
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
Troubleshooting
Problemas Comuns
-
Conexão Recusada
- Verificar se PostgreSQL está rodando
- Validar credenciais de conexão
- Verificar firewall/portas
-
Performance Lenta
- Verificar índices existentes
- Analisar query execution plan
- Considerar particionamento por data
-
Dados Inconsistentes
- Verificar refresh da view
- Validar integridade referencial
- Executar VACUUM ANALYZE
Próximos Passos
- Implementar Cache Redis para queries frequentes
- Adicionar Particionamento por data para tabelas grandes
- Implementar Replicação para alta disponibilidade
- Adicionar Monitoramento de performance em tempo real
- Implementar Backup Automático com retenção configurável