Projeto

Geral

Perfil

Ações

Padrão #12

Aberta

Módulo financeiro: Implementar todas as rotinas do módulo

Adicionado por matheus Oliveira 4 meses atrás. Atualizado 4 meses atrás.

Situação:
a fazer
Prioridade:
normal
Atribuído para:
matheus Oliveira
Início:
07/09/2025
Data prevista:
% Terminado:

0%

Tempo estimado:
20:00 h
Sprint:
1012
Sprint Inicial:
1012
Critério de Validação:
Todas as operações precisam estar funcionado

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


Tarefas relacionadas 2 (2 abertas0 fechada)

copiado Padrão #11: Criar um campo de busca no menua fazermatheus Oliveira07/09/2025

Ações
copiada Padrão #17: Financeiro: Rotina de Transferênciasa fazermatheus Oliveira07/09/2025

Ações
Ações #1

Atualizado por matheus Oliveira há 4 meses

  • copiado Padrão #11: Criar um campo de busca no menu adicionado
Ações #2

Atualizado por matheus Oliveira há 4 meses

  • Critério de Validação alterado de O logout automático dado a quantidade de horas de uso deve funcionar para Todas as operações precisam estar funcionado
Ações #4

Atualizado por Redmine Admin4 meses

  • copiada Padrão #17: Financeiro: Rotina de Transferências adicionado
Ações #5

Atualizado por Redmine Admin4 meses

  • Descrição atualizado(a) (diff)
Ações #6

Atualizado por Redmine Admin4 meses

  • Descrição atualizado(a) (diff)
  • Tempo estimado alterado de 15:00 h para 20:00 h
Ações

Exportar para Atom PDF