Padrão #12
Atualizado por Redmine Admin há 6 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