Projeto

Geral

Perfil

Padrão #12

Atualizado por Redmine Admin6 meses

A ideia desse card é criar a funcionalidades para o módulo, já existe todo frontend do módulo, vou pontuar por funcionalidade 



 **Filtros** 
 -Os 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 usuário, 


 **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** 
 ``` sql 
 -- 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

Voltar