Padrão #12
AbertaMódulo financeiro: Implementar todas as rotinas do módulo
0%
Descrição
A ideia desse card é criar a funcionalidades para o módulo, já existe todo frontend do módulo, vou pontuar por funcionalidade
Filtros
-Os filtros precisam funcionar de acordo com a seleção de usuário
-Os lançamentos financeiros (que não são contas pagar/receber) vão ser filtrados pela conta de trabalho ativa
Contas Pagar/Receber
-As contas a pagar/receber vão sempre ser listadas independente da conta de trabalho que esteja selecionada
-Vai ser possível liquidar parcialmente um título, vou sugerir uma estrutura para esse títulos do contas pagar/receber
-Quando clicar em liquidar o título deve verificar se ele possui provisão contábil, buscar e listar a provisão contábil (tanto a conta contábil como também o centro de custo) para facilitar a liquidação
Lançamentos a vista
-Os lançamentos vão ser lançados de acordo com a conta de trabalho selecionada
-Devem ficar salvos todos os campos listados no formulário, inclusive os anexos
-Abaixo vou sugerir uma estrutura proposta para essa rotina
Conciliação OFX
-Aqui vamos utilizar a estrutura de processamento já criada
-Então, vai processar o OFX, listar os lançamentos, os que já estiverem no sistema vai aparecer alguma flag, ou algo assim
-Para cada item da listagem ofx deve ser possível: Liquidar um título ou Lançar a vista ou Fazer transferência, assim como é a proposta do component de OFX
-Ótimo, quando a opção for "liquidar um título" vai abrir um modal listando os títulos em aberto e permitir ao usuário selecionar o título para liquidar
Requisitos importantes
-Um lançamento financeiro não pode ser zero ou negativo
-A somatória dos movimentos contábeis precisa ser exatamente do valor total
-Deve ser possível adicionar um ou vários anexos
-Criar uma forma de vincular lançamentos já feitos pelo ofx
-Todas as operações devem ser salvas por usuário (na próxima sprint vamos construir )
Estrutura sugerida do financeiro
-- Tabela de Fornecedores/Clientes
-- Tabela principal de Títulos (Cabeçalho) - SEM plano_conta_id
CREATE TABLE titulos (
id SERIAL PRIMARY KEY,
numero VARCHAR(50) NOT NULL,
tipo VARCHAR(20) NOT NULL CHECK (tipo IN ('PAGAR', 'RECEBER')),
pessoa_id INTEGER NOT NULL REFERENCES pessoas(id),
descricao VARCHAR(500) NOT NULL,
observacoes TEXT,
-- Valores
valor_original DECIMAL(15,2) NOT NULL,
valor_total DECIMAL(15,2) NOT NULL, -- pode incluir juros, multas, etc
valor_liquidado DECIMAL(15,2) NOT NULL DEFAULT 0,
valor_saldo DECIMAL(15,2) GENERATED ALWAYS AS (valor_total - valor_liquidado) STORED,
-- Datas
data_emissao DATE NOT NULL,
data_vencimento DATE NOT NULL,
data_liquidacao DATE,
-- Controles
status VARCHAR(20) NOT NULL DEFAULT 'ABERTO' CHECK (status IN ('ABERTO', 'PARCIAL', 'LIQUIDADO', 'CANCELADO')),
numero_parcelas INTEGER NOT NULL DEFAULT 1,
forma_pagamento VARCHAR(50), -- À vista, Boleto, PIX, Cartão, etc
-- Campos de rateio/centro de custo
permite_rateio BOOLEAN NOT NULL DEFAULT TRUE,
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER, -- referência ao usuário
-- Índices
INDEX idx_titulos_numero (numero),
INDEX idx_titulos_pessoa (pessoa_id),
INDEX idx_titulos_tipo (tipo),
INDEX idx_titulos_status (status),
INDEX idx_titulos_vencimento (data_vencimento),
INDEX idx_titulos_emissao (data_emissao),
-- Constraints
UNIQUE KEY uk_titulo_numero_tipo (numero, tipo)
);
-- Tabela de Provisão/Pré-lançamentos Contábeis do Título
CREATE TABLE titulo_provisao_contabil (
id SERIAL PRIMARY KEY,
titulo_id INTEGER NOT NULL REFERENCES titulos(id) ON DELETE CASCADE,
plano_conta_id INTEGER NOT NULL REFERENCES plano_contas(id),
-- Valores do lançamento contábil
valor DECIMAL(15,2) NOT NULL,
natureza VARCHAR(10) NOT NULL CHECK (natureza IN ('DEBITO', 'CREDITO')),
-- Descrição específica do lançamento
historico VARCHAR(500),
complemento VARCHAR(255),
-- Controle se já foi efetivado no movimento contábil
efetivado BOOLEAN NOT NULL DEFAULT FALSE,
data_efetivacao DATE,
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Índices
INDEX idx_provisao_titulo (titulo_id),
INDEX idx_provisao_conta (plano_conta_id),
INDEX idx_provisao_efetivado (efetivado)
);
-- Tabela de Rateio da Provisão Contábil por Centro de Custo
CREATE TABLE titulo_provisao_rateio (
id SERIAL PRIMARY KEY,
provisao_contabil_id INTEGER NOT NULL REFERENCES titulo_provisao_contabil(id) ON DELETE CASCADE,
centro_custo_id INTEGER NOT NULL, -- referência à tabela de centros de custo
-- Valores do rateio
porcentagem DECIMAL(5,2) NOT NULL CHECK (porcentagem > 0 AND porcentagem <= 100),
valor DECIMAL(15,2) NOT NULL,
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Índices
INDEX idx_rateio_provisao (provisao_contabil_id),
INDEX idx_rateio_centro_custo (centro_custo_id),
-- Constraint
UNIQUE KEY uk_rateio_provisao_centro (provisao_contabil_id, centro_custo_id)
);
-- Tabela de Parcelas dos Títulos
CREATE TABLE titulo_parcelas (
id SERIAL PRIMARY KEY,
titulo_id INTEGER NOT NULL REFERENCES titulos(id) ON DELETE CASCADE,
numero_parcela INTEGER NOT NULL,
-- Valores da parcela
valor_original DECIMAL(15,2) NOT NULL,
valor_juros DECIMAL(15,2) NOT NULL DEFAULT 0,
valor_multa DECIMAL(15,2) NOT NULL DEFAULT 0,
valor_desconto DECIMAL(15,2) NOT NULL DEFAULT 0,
valor_total DECIMAL(15,2) GENERATED ALWAYS AS (valor_original + valor_juros + valor_multa - valor_desconto) STORED,
valor_liquidado DECIMAL(15,2) NOT NULL DEFAULT 0,
valor_saldo DECIMAL(15,2) GENERATED ALWAYS AS (valor_total - valor_liquidado) STORED,
-- Datas
data_vencimento DATE NOT NULL,
data_liquidacao DATE,
-- Status da parcela
status VARCHAR(20) NOT NULL DEFAULT 'ABERTO' CHECK (status IN ('ABERTO', 'PARCIAL', 'LIQUIDADO', 'CANCELADO')),
-- Controles
nosso_numero VARCHAR(50), -- para boletos
linha_digitavel VARCHAR(100), -- para boletos
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Índices
INDEX idx_parcelas_titulo (titulo_id),
INDEX idx_parcelas_vencimento (data_vencimento),
INDEX idx_parcelas_status (status),
-- Constraints
UNIQUE KEY uk_parcela_titulo_numero (titulo_id, numero_parcela)
);
-- Tabela de Movimentos de Caixa/Banco
CREATE TABLE movimento_caixa (
id SERIAL PRIMARY KEY,
tipo VARCHAR(20) NOT NULL CHECK (tipo IN ('ENTRADA', 'SAIDA', 'TRANSFERENCIA')),
conta_bancaria_id INTEGER, -- referência à conta bancária/caixa
-- Dados básicos
descricao VARCHAR(500) NOT NULL,
documento VARCHAR(50),
data_movimento DATE NOT NULL,
data_compensacao DATE,
-- Valores
valor DECIMAL(15,2) NOT NULL,
-- Pessoa relacionada (opcional)
pessoa_id INTEGER REFERENCES pessoas(id),
-- Controles
status VARCHAR(20) NOT NULL DEFAULT 'PENDENTE' CHECK (status IN ('PENDENTE', 'COMPENSADO', 'CANCELADO')),
conciliado BOOLEAN NOT NULL DEFAULT FALSE,
-- Observações
observacoes TEXT,
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
-- Índices
INDEX idx_movimento_data (data_movimento),
INDEX idx_movimento_tipo (tipo),
INDEX idx_movimento_status (status),
INDEX idx_movimento_pessoa (pessoa_id)
);
-- Tabela de Lançamentos Contábeis Efetivos do Movimento
CREATE TABLE movimento_contabil (
id SERIAL PRIMARY KEY,
movimento_caixa_id INTEGER NOT NULL REFERENCES movimento_caixa(id) ON DELETE CASCADE,
plano_conta_id INTEGER NOT NULL REFERENCES plano_contas(id),
-- Valores do lançamento contábil
valor DECIMAL(15,2) NOT NULL,
natureza VARCHAR(10) NOT NULL CHECK (natureza IN ('DEBITO', 'CREDITO')),
-- Descrição do lançamento
historico VARCHAR(500),
complemento VARCHAR(255),
-- Vinculação com provisão (opcional)
provisao_contabil_id INTEGER REFERENCES titulo_provisao_contabil(id),
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Índices
INDEX idx_movimento_contabil_movimento (movimento_caixa_id),
INDEX idx_movimento_contabil_conta (plano_conta_id),
INDEX idx_movimento_contabil_provisao (provisao_contabil_id)
);
-- Tabela de Rateio do Movimento Contábil por Centro de Custo
CREATE TABLE movimento_contabil_rateio (
id SERIAL PRIMARY KEY,
movimento_contabil_id INTEGER NOT NULL REFERENCES movimento_contabil(id) ON DELETE CASCADE,
centro_custo_id INTEGER NOT NULL, -- referência à tabela de centros de custo
-- Valores do rateio
porcentagem DECIMAL(5,2) NOT NULL CHECK (porcentagem > 0 AND porcentagem <= 100),
valor DECIMAL(15,2) NOT NULL,
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Índices
INDEX idx_rateio_movimento (movimento_contabil_id),
INDEX idx_rateio_centro_custo (centro_custo_id),
-- Constraint
UNIQUE KEY uk_rateio_movimento_centro (movimento_contabil_id, centro_custo_id)
);
-- Tabela de Liquidações (Vinculação Parcela x Movimento)
CREATE TABLE titulo_liquidacoes (
id SERIAL PRIMARY KEY,
titulo_parcela_id INTEGER NOT NULL REFERENCES titulo_parcelas(id),
movimento_caixa_id INTEGER NOT NULL REFERENCES movimento_caixa(id),
-- Valor da liquidação (pode ser parcial)
valor_liquidado DECIMAL(15,2) NOT NULL,
-- Data da liquidação
data_liquidacao DATE NOT NULL,
-- Tipo de liquidação
tipo_liquidacao VARCHAR(20) NOT NULL DEFAULT 'NORMAL' CHECK (tipo_liquidacao IN ('NORMAL', 'PARCIAL', 'TOTAL')),
-- Observações específicas da liquidação
observacoes VARCHAR(500),
-- Auditoria
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
-- Índices
INDEX idx_liquidacao_parcela (titulo_parcela_id),
INDEX idx_liquidacao_movimento (movimento_caixa_id),
INDEX idx_liquidacao_data (data_liquidacao),
-- Constraint para evitar duplicação
UNIQUE KEY uk_liquidacao_parcela_movimento (titulo_parcela_id, movimento_caixa_id)
);
É só uma sugestão, caso faltou campos que existam no frontend, por gentileza, pode inserir eles nas devidas tabelas
Atualizado por matheus Oliveira há 4 meses
- copiado Padrão #11: Criar um campo de busca no menu adicionado
Atualizado por Redmine Admin há 4 meses
- copiada Padrão #17: Financeiro: Rotina de Transferências adicionado
Atualizado por Redmine Admin há 4 meses
- Descrição atualizado(a) (diff)
- Tempo estimado alterado de 15:00 h para 20:00 h