CashFlow: mudanças entre as edições
Linha 418: | Linha 418: | ||
==== Lançamento a partir de NFe de Compra ==== | ==== Lançamento a partir de NFe de Compra ==== | ||
[[Image:LancarDebitoNFe.png|center|link=|framed|Lançamento a partir de NFe]] | |||
Ao fazer um lançamento a partir de uma NFe, o sistema deve questionar pela chave de acesso da NFe já que é um identificador único do documento. Como alternativa o sistema deve exibir um botão de buscar a NFe, abrindo o NFePicker. | |||
* O sistema só deve permitir avançar para o próximo passo caso a NFe seja encontrada no sistema. | |||
* Ao selecionar a NFe e confirmar a UI já deve validar se a NFe selecionada já está associada a outro lançamento. Cada NFe só deve ter um lançamento de pagamento. Não faz sentido ter a mesa NFe em múltiplos lançamentos e isso evita erros de lançamentos duplicados. | |||
** Caso o lançamento seja encontrado, notificar e questionar se gostaria de editar o lançamento já existente. A ideia é não permitir que o usuário complete todo o lançamento para só depois validar que este documento já está lançado, evitando esforço e perda de tempo. | |||
* Se não paramos em validação, criar um novo lançamento e avançar para a tela de edição do "lançamento manual" com as seguintes condições: | |||
** A tela de edição não permitirá que a associação dessa NFe seja desfeita, embora permita a associação de outras NFes (para o caso de múltiplas NFes em um mesmo boleto). As NFes associadas adicionalmente poderão ser removidas. | |||
** A tela deve ler as informações dos campos de "Faturamento" do XML para obter o valor e as parcelas. Com essas informações já gerar os objetos de parcelamento. | |||
** Obter o Favorecido (PersonVO) pelo CNPJ da empresa e já deixar associado ao lançamento. Também desabilitar o campo para que não seja possível alterar/remover a associação do Favorecido. | |||
*** Caso o PersonVO com o CNPJ não exista a UI deve gerar um novo objeto e já preenche-lo com todas as informações disponíveis no XML da NFe. Posteriormente ao confirmar o lançamento o Core deverá fazer o cadastro do PersonVO no BISCore antes de persistir o lançamento. | |||
** Ao tentar confirmar a tela deve validar: | |||
*** Se os valores das parcelas lançadas para pagamento bate com o total da NFe. | |||
*** Se a todas as NFes Associadas foram emitidas para a Empresa associada ao lançamento. Além de evitar fraude, e pagamento de NFes que não são da empresa, evita o erro de pagamento de uma NFe emitida para uma empresa ser paga por outra. | |||
****; No futuro, confirmar se as NFes de uma filial podem ser pagas na conta da Matriz (e vice-versa). Caso não tenha nenhum problema contábil nessa ação essa validação precisará ser alterada para verificar apenas o prefixo do CNPJ, permitindo filiais diferentes. | |||
Edição das 14h42min de 28 de maio de 2015
Módulo responsável por gerenciar o sistema fluxo financeiro do caixa da empresa.
Requisitos
Contas Financeiras
O sistema deve gerenciar um cadastro de "Contas Financeiras" (CashFlowAccountVO). Essas contas tem a finalidade de organizar os fluxos de caixas da empresa. Seja uma conta bancária, uma conta de "caixa local", uma conta de investimentos/poupança, etc.
- Tipos de Contas:
- Contas Bancárias - são usadas para gerenciar as contas correntes da empresa em bancos e tem os seguintes requisitos:
- devem ter o número do banco (número do banco deve ser associado ao BISBankVO), agência e conta corrente definidos obrigatoriamente.
- permitem a definição dos dados da PJ da agência (associando um PersonVO), incluindo o CNPJ, endereço, contato (gerente), etc.
- Caixa Local - usada para gerenciar as contas/caixas da empresa. Como o caixa principal, um caixa menor de responsabilidade do almoxarifado para pagamento de entregas a vista, um caixa de responsabilidade do RH para pequenos pagamentos e acertos, etc.
- Contas Bancárias - são usadas para gerenciar as contas correntes da empresa em bancos e tem os seguintes requisitos:
- As contas devem ter um estado que defina a conta entre Ativa/Encerrada. O estado encerrado deveria ser como o estado excluído, e em UIs não deviam exibir as contas encerradas por padrão (sempre ter opção para exibi-las caso o usuário deseje). As contas não podem ser excluídas para que não se perca o histórico de movimentação da empresa. No entanto as contas encerradas devem de certa forma ser "invisíveis" durante a operação do sistema para não poluir nem confundir os usuários.
- A conta só pode ser encerrada se tiver o saldo zerado! Sugira que o usuário transfira o saldo para outra conta ou faça um lançamento de ajuste caso o saldo esteja errado. Ninguém encerra uma conta, seja bancária ou local e joga fora o saldo.
- Toda conta deve ser associada à uma empresa, já que filiais e empresas diferentes tem contas separadas. Para simplificar a geração de relatórios e orientar as informações financeiras da administração.
- Toda conta deve ter o nome único, ou seja, não podem existir duas contas com o mesmo nome no sistema.
Folhas de Cheque
- Para as contas do tipo 'Conta Bancária' o sistema deve permitir que sejam cadastradas folhas de cheque. O usuário deve inserir a numeração da primeira e última folha e o sistema deve criar um objeto (CashFlowCheckVO) para cada uma das folhas de cheque.
- Cada folha de cheque deve ter os seguintes estados:
- NEW: Estado inicial para as folhas de cheques recém criadas e ainda não utilizadas.
- EMITED: Estado que indica que a folha de cheque foi usada e deve estar associada ao pagamento de algum lançamento financeiro.
- COMPENSED: Este estado indica que a folha de cheque já foi compensado (Foi encontrado no extrato do banco durante a conciliação bancária).
- DISCARDED: Marca que a folha de cheque foi rasurada e descartada. Uma folha de cheque nesse estado nunca deve ser encontrada no Extrato do banco.
- Cheques podem ser predatados, a data de predatado quando presente deve ser usada como a data de previsão que o saldo precisa estar na conta para planejamento financeiro.
![]() |
|
Extrato Bancário
Contas bancárias costumam ter o extrato oferecido pelo banco. Atualmente há sempre a opção de baixar o extrato em algum formato de arquivo "importável" (txt, excel, csv, ofx, ofc, etc.). Por observação dos bancos que trabalho acredito que o arquivo OFX (usado pelo Money) é o mais popular que segue um formato padrão. Embora todos tenham arquivos txt, cada um usa um caracter diferente de separação de colunas, ou de formatação de valores, etc.
Inicialmente o sistema trabalhará apenas com a importação de arquivos OFX para simplificar. Informações sobre o formato podem ser encontradas em http://www.ofx.net/.
- O sistema deve aceitar o upload de um arquivo OFX e converte-lo:
- Ao fazer o upload o usuário deve informar a conta bancária em que este extrato deverá ser importado.
- A maioria dos arquivos OFX de extrato vêm com a informação da agência e conta corrente. Assim, na UI o sistema deve tentar lêr essa informação e se encontrar já sugerir ou simplesmente usar essa informação para realizar a importação. No Core, mesmo que o usuário forneça a conta em que deseja a importação o sistema deve validar e prevenir que o usuário importe o extrato de uma conta dentro de outra.
- O sistema deve validar se o período do extrato sendo importado coincide de alguma forma com os dados já existentes no banco de dados. De forma e evitar que o usuário importe um arquivo com poucos dias e "fiquem faltando" registros entre as importações. Ex.: Se já existe no banco a movimentação entre as datas 01/01/2015 e 25/02/2015, o sistema não deve permitir que o usuário importe um arquivo cuja data inicial seja maior ou igual à 25/02/2015. Evitando que registros fiquem sem importação. Neste caso o arquivo sendo importado deve no mínimo começar no dia 24/02/2015. Embora a validação seja "burlável" editando-se o arquivo OFX, a intenção é evitar erros do usuário não a preocupação de total imunidade a falhas.
- Caso os períodos do banco e do arquivo se sobreponham em parte, o sistema deve avaliar os registros 1 a 1 para evitar a inserção de dados duplicados. No final retornar a quantidade de novos registros importados (apenas para notificação do usuário).
![]() |
|
![]() |
|
Categoria de Lançamentos
A categoria de lançamentos tem a função de agrupar e totalizar diferentes lançamentos em grupos para simplificar relatórios de fechamentos por período e avaliação do fluxo financeiro da empresa.
- As categorias se organizam de forma hierárquica, isto é, permite que uma categoria esteja dentro da outra. Por exemplo, podemos ter uma categoria chamada 'Receitas', e dentro categorias como 'Vendas à Vista', 'Cartões Crédito', 'Cartões de Débito', 'Encomendas e Entregas', etc.
- As categorias devem ter uma definição se aceitam ou não que lançamentos sejam associados à elas. Categorias que não restringem a associação de lançamentos diretamente terão a função apenas de agrupas categorias filhas e exibir seu total.
- Categorias com lançamentos anexos não podem ser excluídas.
- Não há necessidade de desabilitar a categoria, pois basta restringir a associação de novos lançamentos à categoria para que ela não seja mais usada.
- Não tendo movimentação dentro da categoria ou em suas filhas a categoria não deve aparecer em relatórios (impressos ou em tela).
- Quando um lançamento é alterado, se ele já estava em uma categoria que tem restrição de associação (tendo sido associado em algum momento em que a associação não era restrita), a confirmação de alteração deve continuar permitindo que o lançamento continue na categoria restrita. A ideia é que se for necessário corrigir algum problema em lançamento passado, seja possível corrigir apenas o desejado sem cair em uma restrição do presente.
Lançamentos Financeiros
- Os lançamentos financeiros são o registro de qualquer movimentação financeira da empresa. Podendo ser a pagar ou a receber, já efetuada ou futura.
- O usuário de conseguir cadastrar um lançamento a pagar/receber futuro. Devendo preencher sempre a data vencimento. Mas sem a necessidade de informar de qual conta financeira será paga/recebida.
- Ao pagar/receber a conta, torna-se obrigatório associa-la a uma conta financeira para indicar a movimentação naquela conta.
- Um lançamento pode ter diversas parcelas com diferentes valores e datas de vencimentos. Podendo ainda ser pago de formas diferente. Ex: A primeira no dinheiro, a segunda e terceira no cheque predatado, e as outras no boleto. Por fim o usuário ainda esqueceu de pagar um dos boletos e teve que transformar o pagamento em um TED ou depósito para quitar a parcela.
- Em alguns momentos uma compra ou venda pode ser faturada em momentos diferentes e ter mais de um documento gerador (Ex: Nota Fiscal) e ter apenas 1 pagamento somando os documentos ao fim de um período. Ex: Uma venda de móveis com entrega em 3 etapas, com 3 notas diferentes, mas apenas 1 conta para pagar. Ou ainda, o valor total dividido em 5 parcelas iguais. Neste caso o lançamento deve permitir a associação de vários documentos de origem (NF) e permitir o cadastro de vários pagamentos.
- Todo lançamento deve estar associado à uma categoria para correta sumarização do fluxo financeiro.
- É obrigatório definir a linha de exibição do lançamento. Mesmo que a UI ofereça essa descrição para alguns casos, como por exemplo, se o lançamento de uma conta a pagar está sendo gerada a partir de uma entrada de NFe, ou de um código de barras de conta de concessionárias, etc.
- Mesmo não sendo obrigatório cadastrar a conta financeira de onde a conta será paga, deve ser permitido. Neste caso funcionará como uma previsão de planejamento para aquela conta específica.
- Os lançamentos podem ser de diversos tipos. Cada tipo tem sua característica própria, como por exemplo validações diferentes, atributos obrigatórios diferentes, diferentes tratamentos para malote eletrônico, etc.. Entre os tipos de lançamentos a serem definidos:
- [Versão Futura] Salários: Enviado por malote eletrônico ou pago em conta local. Exige número do banco, da agência e conta corrente. Nome e CPF do funcionário. Além do tipo de pagamento: Salário, Adiantamento, Férias, 13°, Rescião Contratual, Vale Transporte, etc.
- Boletos de Concessionárias: Boletos de contas de consumo como telefonia, luz, gás e normalmente impostos municipais como TFA, IPTU, etc. Devem conter um código de barras válido, valor e data de vencimento.
- Boletos Cobrança: Boletos mais comuns associados a compras e faturamento de produtos e serviços. Exige código de barras, vencimento, valor.
- GPS: Guia de Recolhimento de INSS. Exige data de competência, vencimento, validade, etc. (Rever)
- DARF: Guia de Recolhimento de DARF/IRRF. Exige data de competência, vencimento, validade, etc. (Rever).
- Depósito/Transferência/TED/DOC: Pagamento por depósito em conta. Exige banco, agência e conta corrente. Se pago de uma conta bancária de mesmo banco, é uma trasnferência/depósito eletrônico, se for de banco diferente é um TED/DOC. É necessário rever a integração bancária para análise de como enviar trasnferência e TED/DOC para os bancos por malote eletrônico.
- Caso o lançamento recebido pelo core para ser inserido ou alterado tenha um PersonVO sem ID, o sistema deve verificar se tem o CPF/CNPJ definido e tentar procurar no BISCore a existência deste Person por esta chave. Caso não encontre, o sistema deve tentar criar esse novo PersonVO automaticamente antes de criar o lançamento.
- Caso ocorra um erro ao salvar o PersonVO o sistema deve retornar o problema, não persistir o lançamento se parte das informações (a associação da PJ/PF) não serão salvas adequadamente.
Conciliação Bancária
A conciliação bancária tem a finalidade de sincronizar as informações oferecidas pelo banco (importado no sistema através de arquivo), com os lançamentos do sistema. Essa sincronização é a forma de garantir que todos os lançamentos bancários estão corretamente lançados na contabilidade da empresa. Ajudando a encontrar falhas de lançamentos e diferenças de caixa. Com o adendo de que lançamentos bem feitos resultam em dados mais confiáveis.
- O sistema deve oferecer uma interface que permita mapear as 'parcelas' dos lançamentos do sistema com os registros presente no extrato da conta bancária. O mapeamento entre o lançamento e o registro bancário é feito através de outro objeto: o 'CashFlowStatementInstallmentBankStatementVO'.
- O mapeamento entre lançamentos do extrato e do sistema deve ser do tipo 1:N, ou N:1 pois podemos ter:
- múltiplos lançamentos no sistema e um único lançamento no extrato, como boletos pagos em malote eletrônico; e,
- ter um único lançamento no sistema para múltiplos no extrato, como por exemplo os créditos de cartões de crédito de um período que não são controlados no sistema, e o usuário simples soma todos para realizar um único lançamento de crédito mensal.
- O sistema jamais deve permitir que uma 'conciliação bancária' seja do tipo N:N.
- Ao validar os valores do mapeamento o sistema deve garantir que o status do objeto seja definido adequadamente.
Contas a Pagar & Receber
O sistema deve ter uma UI que permita o usuário prever as contas que tem a pagar e receber em alguma forma de "timeline" que facilite a visualização dos saldos das contas dia a dia. Com a previsão do à pagar e o à receber, salientando os dias em que o saldo previsto está no vermelho, ou no "amarelo" quando o saldo previsto não é vermelho mas está muito perto do vermelho. O calculo do valor do amarelo deve ser vinculado proporcionalmente aos valores de contas a receber com algum índice de inadimplência (a brotar de algum lugar no futuro) ou na média dos valores a receber. Pois se alguma conta a receber não entrar, por atraso ou qualquer outro problema a previsão vai por água abaixo.
- Mesmo sem a UI idealizada ainda, ao definir que os pagamentos serão feitos em uma conta do tipo 'bancária' a UI deverá exibir a opção de "Pagar por Malote Eletrônico". Ao escolher essa opção a UI deve enviar para o Core a solicitação de gerar o arquivo de Lote passado a coleção de IDs dos lançamentos que serão pagos por malote eletrônico, uma lista de mesmo tamanho e mesma ordem com as datas de pagamento planejadas e de qual conta o pagamento será realizado. Para gerar o arquivo o core deve validar:
- Se os pagamentos ainda não estão pagos, nem em estado de 'enviado' em algum lote anterior.
- Validar se todos os pagamentos foram solicitados no malote eletrônico são suportados por aquele banco. Caso algum não seja o sistema deve abortar e retornar exceção. Para que fique o mais claro que algum pagamento não será enviado no malote e não deixar um pagamento sem ser feito.
- Validar se todas as datas de vencimento são do dia atual ou futura.
- O sistema deve permitir que um arquivo de lote possa ser baixado mais de uma vez, caso o usuário "perca" o arquivo, mas só no mesmo dia. Impedir que o usuário baixe o arquivo de lote do dia anterior para evitar que o usuário tente enviar para o banco um arquivo de lote com datas de pagamento possivelmente erradas.
Entidades
CashFlowCategoryVO - Categorias de Lançamentos
- As categorias de lançamentos são usadas para totalizar os lançamentos por grupos de interesse, de forma a mostrar relatórios de fluxo de caixa.
- As categorias devem ter uma estrutura hierárquica, de forma que o usuário possa criar sua árvore da maneira como achar conveniente ter os totais e subtotais.
As categorias devem ter os seguintes campos:
- Nome: Nome da categoria dada pelo usuário.
- Categoria Pai: A categoria pai define onde essa categoria será utilizada.
- Permite Lançamento: Define se essa categoria permite que sejam colocados lançamentos nela ou se não. Categorias que não permitem o lançamento direto nela podem ser usadas como categorias pais apenas para a sumarização das categorias abaixo dela.
- Em caso de alteração, que proíba novos lançamentos na categoria, os lançamentos antigos continuarão lançados sem problema.
- Categorias com lançamentos e lançamentos filhos devem ter os totais das filhas e dela própria sumarizados. Mesmo que sejam exibidos separados de alguma forma.
![]() |
|
CashFlowStatementVO - Lançamentos Financeiros
- Os lançamentos financeiros são usados para registrar as movimentações financeiras das empresa. Qualquer saída ou entrada de dinheiro deve ter um lançamento correspondente.
- Um lançamento financeiro pode representar tanto uma conta já paga/recebida quanto um lançamento futuro de recebimento/pagamento.
Os lançamentos devem possuir os seguintes atributos e relacionamentos:
- Empresa: Indicando à qual empresa esse lançamento pertence. [Obrigatório]
- Categoria: Categoria de pagamentos, para sumarização dos pagamentos.
- Beneficiário/Pagador: Associa uma Pessoa como Beneficiário/Pagador ao lançamento. Não deve ser obrigatório, mas permitir a associação para facilitar a busca dos pagamentos/recebimentos por cliente, fornecedor, funcionário, etc. (PersonVO)
- Documento(s) de Origem: Permite a associação de documentos que geraram o lançamento, como NFe, Guias de Impostos, Contas de Consumo, etc. Pode ser uma maneira de arquivar a guia (como arquivo binário, ou como referência para o cadastro da NFe no sistema). Algumas vezes um mesmo lançamento de pagamento (por exemplo mesmo boleto, ou mesma transferência) pode abrange a união de vários Documentos de Origem, por isso um lançamento deve permitir a associação de múltiplos documentos.
- Operação do Lançamento: Define a operação desse lançamento: [Enum]
- DEBIT: Uma saída, valor removido do caixa: conta a pagar como um boleto de fornecedor, pagamento de salário, etc.
- CREDIT: Uma entrada, valor removido do caixa: conta a receber como um boleto emitido para um convênio, recebíveis de cartões de crédito e débito, etc..
- FUNDTRANSFER: Transferência de fundos entre uma conta e outra.
- FUNDFIX: Lançamento usado para fazer correções de caixa em últimos casos. Quando não se encontra mais o problema, ou mesmo para correções de "imperfeições monetárias" como arredondamentos dos centavos durante os pagamentos em moeda.
- Tipo do Lançamento: Permite definir alguns tipos diferentes de lançamentos: [Enum]
- UNIQUE Define um pagamento único. Como o pagamento de uma nota avista, um serviço de conserto prestado, etc.
- INSTALLMENTS Define que é um pagamento parcelado. Como uma nota com o valor dividido em 3 vezes em 3 boletos, ou um pagamento de maquinário em várias parcelas.
- Nome de Exibição: Descrição 'curta' dado pelo usuário para descrever o lançamento. Este nome que será usado para exibir em telas e relatórios (como extratos das contas) que permita que o usuário identifique o pagamento.
- Observações: Campo que permita que o usuário escreva qualquer detalhamento mais específico sobre o lançamento.
CashFlowStatementInstallmentVO - Parcelas do Lançamento
O objeto "parcela do lançamento" indica as informações sobre o pagamento. Como um mesmo lançamento pode conter pagamentos parcelados e serem pagos de formas diferentes as informações sobre pagamentos ficam um objeto separado. Para lançamentos sem parcelamento (pagamento único) deve conter apenas "uma parcela" associada.
- Origin Account: Quando o lançamento for um pagamento ou transferência de fundos, é obrigatório associar a conta para indicar de onde foi tirado o valor para pagamento/transferência.
- Recipient Account: Quando o lançamento for um recebimento ou transferência de fundos, é obrigatório associar à uma conta para indicar para onde foi o valor recebido.
- Lançamento: Associa a parcela ao lançamento.
- Comprovante de Pagamento: Permite anexar o documento (arquivo) com o comprovante de pagamento.
- Cheque: Caso o pagamento seja feito com folha de cheque, a associação ao objeto que representa a folha de cheque deve ser informada.
- Dados Bancários: Em caso de pagamento com depósito, transferência essa associação é obrigatória. Assim como a informação do PersonVO (o destinatário do pagamento). Para pagamentos com boletos o Person é obrigatório, mas a informação bancária não. A informação bancária pode ser obtida de alguns boletos automaticamente.
- Forma de Pagamento: Define a forma como a conta à pagar ou receber é realizada. (não usado para lançamentos do tipo FUNDTRANSFER, neste caso sempre lançar OTHER)
- [VERSÃO FUTURA] PAYROLL: Pagamento de folha de pagamento de funcionários. (Somente Débito) Folha de pagamento é o pagamento usado por malote eletrônico ou similar.
- PUBLICSERVICES: Pagamento através de Boletos de concessionárias de serviços como telefonia, luz, gás, etc.
- PAYMENTSLIP_DARF Pagamento através de guia de pagamento DARF
- PAYMENTSLIP_GPS Pagamento através de guia de pagamento GPS
- BOLETOS: Pagamento através de boletos de pagamentos em geral
- DEPOSIT: Pagamento através de depósitos
- CHECK: Pagamento com folha de cheque
- OTHER: Pagamento feito diretamente do caixa, em dinheiro outra forma diferente das controladas pelo sistema.
- Estatus do Lançamento: Define o "passo" ou estado em que o lançamento se encontra:
- PLANNED: O pagamento está planejado (lançado no sistema) e aguardando para pagamento/recebimento.
- SENT: Estado usado para contas que são pagas por malote eletrônico, ou cobranças por geração de boleto, e indicam que já foram incluídas em um lote para enviar para o banco. Neste estado a conta já deve estar associada à uma conta bancária.
- ERROR: Estado usado para contas que foram enviadas ao banco por malote eletrônico e retornaram com algum tipo de erro da instituição bancária.
- PAID: Estado indicando que o lançamento já foi realizado. Isto é, o pagamento efetuado ou o recebível em caixa. Neste estado a associação da conta é obrigatória.
- Data de Vencimento: Data máxima para pagamento sem penalidades de multas, juros e protestos. Obrigatório
- Data de Execução: Data em que a ação de pagamento/recebimento realmente ocorreu.
- Data de Compensação: Data em que o valor realmente entrou no caixa. Normalmente a data é uma duplicata do valor de 'data de execução', no entanto para recebíveis de cartões, boletos, e cheques depositados essa data pode ser diferente da data de execução devido ao processo de compensação. Este campo nunca deve ser nulo para lançamentos 'executados' (que já ocorreram). Em casos de compensação imediata, duplicar o valor de 'data de execução' para simplificar consultas do banco de dados.
- Valor Original: Valor do lançamento. (Seguindo sempre a convenção de que todo pagamento é salvo como valor negativo no banco, e todo recebimento é salvo como valor positivo. - Nos casos de lançamentos de transferência de fundos, sempre lançar o valor positivo)
- Valor Multas: O valor de multas é aplicado para contas pagas com atraso ou outros acréscimos.
- Valor Descontos: O valor de descontos concedidos nos boletos que devem ser decrescidos do valor original do boleto.
- Valor Final: O valor final é o valor que realmente entrou ou saiu da Conta. Esse valor pode ser diferente do original devido a multas, descontos, taxas de recebíveis, etc.
- Campos do Malote Eletrônico: Abaixo está a relação de alguns campos usados no malote eletrônico.
- Mensagem de Retorno: Campo de texto livre para salvar a mensagem de retorno do banco. Esta mensagem é usada pelo sistema apenas para exibição para o usuário.
- Número de Lote: Identificador do lote de pagamento gerado pelo sistema. Quando o arquivo de lote é gerado o sistema deve definir o ID do Lote único para identificar o arquivo gerado. Esse id deve ser salvo para referência futura do retorno e para regerar o arquivo caso o usuário deseje.
- Data de Geração do Lote: Define a data de geração do lote.
- ID Pagamento: Todo pagamento enviado para em um malote eletrônico deve ter um ID único "na vida". Que não deve ser repetido preferencialmente nem em outros arquivos de Lote. Para evitar conflitos caso pagamentos de um mesmo lote tenham retorno em lotes diferentes. Esse ID é normalmente usado pelo sistema do banco.
- Número Validação: Número de validação retornado pelo banco ao autorizar um pagamento. Diferente para cada sistema bancário.
- Código de Barras: Valor do Código de barras da guia de pagamento dos pagamentos que dispõe de código de barras.
- Representação Numérica: Numeração da representação numérica do código de barras. Quando o usuário digita 1 ou outra informação o sistema deve gerar a outra automaticamente.
CashFlowAccountVO - Contas
Contas são usadas para lançar as entradas e saídas financeiras da empresa. Facilitando o controle dos saldos e valores financeiros da empresa.
Cada conta cadastrada deve ter os seguintes atributos:
- Nome: Para o usuário nomear e identificar a conta.
- Tipo da Conta:
- Conta Local: Usada para lançamento manuais de caixas locais.
- Conta Bancária: Usada para controle de contas bancárias como corrente ou conta investimento. Esse tipo de conta permitirá a conciliação de extrato bancário, bem como a exportação de “malote eletrônico” (CNAB?) para envio de pagamentos para o banco. Para contas bancárias temos os seguintes atributos adicionais:
- Banco: Número do banco (listagem já pré existente do sistema, por causa do PersonBankDataVO).
- Agência: Agência da conta.
- Número da Conta: Número da conta corrente.
- Contato Agência: Permite anexar um contato (PersonVO) da agência.
- Contato do Gerente: Permite anexar um contato (PersonVO) do gerente da conta.
- [VERSÃO FUTURA] Cartão BNDES: Usada para controlar compras e fluxo do cartão BNDES. (Para Implementação Futura)
- [VERSÃO FUTURA] Cartão de Crédito: Usada para controlar e registrar fluxos de pagamento em cartão de crédito. (Para Implementação Futura)
- [VERSÃO FUTURA] Administradoras de Cartão: Conta com a função de gerenciar os lançamentos de vendas com cartão de crédito. Para calcular taxas e saber o saldo de recebíveis, taxas e etc.. Ao receber no banco, marcamos como "Transferência de Fundos" entre as contas de administradoras e do extrato bancário.
- [VERSÃO FUTURA] Conta Aplicação: Conta usada para gerenciar os fundos de aplicações da empresa.
CashFlowBankStatementVO - Extrato Bancário
Este objeto representa um lançamento do extrato bancário, oferecido pela instituição financeira (banco).
Atributos do objeto:
- Conta Bancária: Todo lançamento obrigatoriamente deve estar associado à uma conta (CashFlowAccountVO) do tipo 'Conta Bancária'.
- Operação: Define o tipo da operação: Crédito ou Débito.
- Valor: Valor da operação financeira. Toda a operação de crédito deve ter o valor positivo, todo débito deve manter o valor negativo.
- Linha de Exibição: Descrição como exibida pela instituição financeira.
- ID Lançamento: Os extratos bancários costumam (não é regra) ter um ID que identifica aquele lançamento, permitindo que o sistema reconheça o lançamento do banco com os já existentes no sistema evitando duplicatas. Na ausência desse ID a tríade Data + Descrição + Valor deve ser usada para reconhecer o lançamento. (Embora em casos raros possa existis o lançamento exatamente igual no extrato).
CashFlowStatementInstallmentBankStatementVO - Conciliação Bancária
Este VO de nome pomposo representa a associação entre o lançamento financeiro do sistema e o extrato bancário. Além dos mapeamentos entre os objetos, este VO tem apenas mais 1 atributo: Status do Mapeamento.
- NONE: Significa que nenhum mapeamento foi feito. No banco esse estado é definido pela ausência do Vo de mapeamento.
- INCOMPLETE: Significa que algum mapeamento já foi feito entre os lançamentos e o extrato, mas os valores não estão batendo.
- DONE: Mostra que o mapeamento está completo e "satisfeito" quanto aos valores.
Métodos de Fachada
Métods de CRUD
Métodos de CRUD são os métodos de Insert, Update, Delete e os métodos de find padrão do BIS. São esperados métodos de CRUD pada as seguintes entidades:
- CashFlowCategoryVO
- CashFlowAccountVO
- CashFlowStatementsVO - Este objeto valida e persiste os seguintes objetos em cascata:
- CashFlowStatementDocVO
- CashFlowStatementInstallmentVO
Métodos de Serviços
São métodos com lógica de negócio publicados na fachada com funções específicas diferentes do padrão do 'CRUD':
Integer importBankStatementOFXFile(byte[] ofxfile, Long idcashflowaccount) throws BISException
@param ofxfile conteúdo do arquivo OFX. @param idcashflowaccount ID da Conta Bancária que estamos tentando importar os lançamentos. @return Total de registros importados.
Este método recebe o conteúdo de um arquivo OFX para importa-lo como sendo o extrato de uma determinada conta bancária (CashFlowAccountVO).
Regras de negócio:
- Caso o banco, agência e conta esteja disponível no OFX recebido, previne que o usuário importe um arquivo de extrato de um banco na conta errada.
- Só permite a importação caso a conta ainda não tenha nenhum lançamento importado, ou caso o o arquivo OFX tenha no mínimo a data inicial 1 dia anterior ao maior registro da base. Por exmeplo: Caso na base já existam os registros de 01/01/2015 à 21/01/2015. O OFX deve no mínimo ter seu primeiro registro com a data de 20/01/2015. A ideia é prevenir que o usuário "perca" registros no meio do seu extrato.
- Para evitar um "gap" entre registros no passado, deve-se validar quando a data inicial do OFX for menor que a data inicial da base: se a data final do OFX é no mínimo 1 dia maior que a primeira data da base.
- O objetivo em sobrepor sempre 1 dia é que se o usuário exportar o OFX até o "dia atual", o OFX conterá apenas os registros do dia até o momento em que é exportado. Movimentações posteriores a exportação acabariam sendo perdidas se o sistema aceitar importar arquivo apenas com a presente data.
- Os registros do OFX devem ser convertidos em objetos CashFlowBankStatementVO. E persistidos no banco. Os registros idênticos devem ser simplesmente ignorados, não causando nenhum erro.
- Ao importar um extrato com sucesso, o saldo mais recente deve ser atualizado no campo "saldo" do CashFlowAccount.
void createCheckBook(Long idaccount, Long startnumber, Long endnumber) throws BISException
@param idaccount ID da conta em que os cheques serão associados. @param startnumber Numeração do primeiro cheque do talão. @param endnumber Numeração da última folha de cheque do talão.
Este método criar novas folhas de cheque no sistema. Folhas recém criadas ganham o estatus de 'NEW', que significa que a folha está disponível para emissão na empresa mas ainda não foi utilizada para nada. Uma maneira de controlar quantas folhas estão disponíveis para na empresa. Regras de Negócio:
- O sistema só deve permitir a crição de um talão de cheques para contas do tipo 'bancárias'.
- Validar se as folhas de cheque (mesmos números) já existem para a mesma conta bancária.
byte[] createBankDirectionFile(Lond idaccount, List<Long> idstatementinstallmentlist) throws BISException
@param idaccount ID da conta bancária que desejamos gerar o arquivo @param idstatementinstallmentlist Lista de IDs das 'parcelas' dos lançamentos a serem pagas. @return Conteúdo do arquivo gerado a se enviado para o banco.
Este método gera um arquivo com as instruções de pagamento/recebimento para ser enviado ao banco correspodente. Regras de Negócio:
- O método deve validar se a conta passada é uma conta bancária.
- Para abstrair a implementação da geração de arquivo de cada banco deve-se usar o pattern de "Factory". Este deve devolver a implementação da interface 'BankDirections' de acordo com o número de banco passado, ou uma exceção de que o número de banco passado. No objeto recebido chamar o método da interface com a mesma assinatura deste método para obter o arquivo gerado corretamente.
Métodos Utilitários
String convertDigitedCodeToCodeBar(String digitedcode) throws BISException
@param digitedcode Linha digitável exibida na guia/boleto.
Este método recebe a numeração da linha digitável valida e converte para o valor do código de barras.
String convertCodeBarToDigitedCode(String codebar) throws BISException
@param codebar Código de barras da guia/boleto.
Este método faz o oposto do convertDigitedCodeToCodeBar(...), recebe o código de barras, valida e converte para a numeração numérica da linha digitável.
BankSlipDataBean createBankSlipDataFromCodeBar(String codebar) throws BISException
@param codebar Código de barras da guia/boleto.
Extrai as informações básicas e padrão de todos os boletos/guias. Como por exemplo, em todos os boletos os primeiros 3 dígitos é o número do banco, o 4° dígito a moeda do boleto, etc.
- Em seguida, depois de extraída o número do banco tenta usar o Factory do BankDirections para extrair as informações do código particular do próprio banco. Isso porque parte do código do boleto é de livre uso das instituições financeiras e cada banco utiliza um padrão próprio para a geração e identificação dos seus boletos.
BankDirections
BankDirections é uma interface com os métodos abaixo usada para abstrair a implementação da geração de arquivos de cada banco existente. Deve ser implementado um objeto para cada banco existente que o sistema der suporte. As implementações devem ser retornas a partir de 'Factory' que receba o número do banco para retornar o objeto adequado ou BISException caso o banco não seja suportado.
Esta mesma interface será usada para qualquer serviço bancário a ser implementado no futuro como geração de instruções de cobrança (Boletos), ou geração de instrução para pagamentos de salários, etc.
byte[] createBankPaymentDirectionFile(Lond idaccount, List<Long> idstatementinstallmentlist) throws BISException
@param idaccount ID da conta bancária que desejamos gerar o arquivo @param idstatementinstallmentlist Lista de IDs das 'parcelas' dos lançamentos a serem pagas. @return Conteúdo do arquivo gerado a se enviado para o banco.
Este método gera um arquivo com as instruções de pagamento/recebimento para o banco à qual a classe implementa suporte. Regras de Negócio:
- Cada pagamento solicitado deve ser avaliado e verificar se o banco suporta, caso apenas 1 deles não seja suportado deve ser lançada exceção.
- Caso o banco não suporte gerar um único arquivo com diferentes tipos de pagamentos (por exemplo boletos e guias de impostos) uma exceção deve ser lançada informando o problema.
- Caso o pagamento esteja vencido e o banco não suporte boletos com datas vencidas uma exceção deve ser lançada.
- Para os diferentes tipos de lançamentos a serem pagos a implementação de cada banco deve verificar se os campos necessários estão preenchidos adequadamente.
- Caso algum dos métodos não seja suportado pela implementação do banco, uma exceção deve ser lançada.
BankSlipDataBean completeBankSlipData(BankSlipDataBean bean, String bankcode) throws BISException
@param bean Bean já completado com as informações básicas do boleto e que receberás a informações específicas da instituição. @param bankcode Numeração do código de barras da conta que se deseja informação
Este método recebe um objeto já parcialmente completado com as informações padrões da guia e a parte do código de barras que é de uso da privado da instituição. Desse código é possível extrair algumas outras informações úteis da guia/boleto que podem otimizar o uso para o usuário. Toda a informação adicional que for possível extrair deverá ser completada no Bean e retornado.
UI Vaadin
Este tópico registra as definições para a UI padrão do BIS. Com telas e requisitos.
Lançar Débito Financeiro
O sistema deve ter uma tela de entrada de débito financeiro. Essa tela basicamente lançar as "contas á pagar", só não chamamos de Contas à Pagar para evitar confusão, afinal contas à pagar são as contas que ainda não foram pagas, e a tela permite o lançamento de contas já pagas.
A tela terá alguns passos rápidos similar a um "wizard", permitindo que passo a passo o usuário faça os lançamentos desejados respondendo apenas os campos necessários, sem que tenha que enfrentar uma tela poluída de opções que o deixem perdido.
O primeiro passo é escolher um dos métodos disponíveis para lançar um débito financeiro. Para cada opção escolhida a tela terá um comportamento diferente.

Lançamento Manual
Ao escolher a opção de Lançamento Manual, a tela deve entrar na tela de edição "padrão", que permite que o usuário preencha campo a campo as informações do lançamento. Nesta tela teremos as seguintes regras:
- O Combobox Tipo de Pagamento deve exibir as seguintes opções: "Pagamento Único" e "Parcelado". Não exibir a opção em "branco" que equivale ao "null". Sempre exibir como valor inicial o valor "Pagamento Único". Tendo em vista que a maioria dos lançamentos tem um pagamento único, oferecer essa opção permite que o preenchimento seja mais rápido.
- O combobox Empresa, no caso de termos apenas uma empresa cadastrada, deve ser desabilitado e ter essa única opção já selecionada. Evitamos assim que o foco tenha que passar por este componente já que é obrigatório e não tem outra opção.
- O campo Favorecido é uma associação de um combo com um botão de busca. O combo permite que o usuário encontre o favorecido diretamente através do atributo "displayname" do PersonVO. Já o botão buscar abre o PersonPicker, que exibe uma lista dos PersonVO do sistema e permite uma busca mais detalhada, como busca por CPF/CNPJ, nome completo, nome fantasia, etc.
- Categoria deve exibir todas as categorias cadastradas no sistema com o atributo "statementallowed" definido como true.

- Aba Fatura: Dentro da aba fatura estão as informações sobre o pagamento, ou pagamentos caso o Tipo de Pagamento tenha sido definido como "Parcelado".
- Quando o Tipo de Pagamento for definido como "Parcelado", o sistema deve exibir o painel a esquerda para organizar os números de parcelas.
- O botão "+" inclui uma nova parcela ao final da lista.
- Ao clicar no botão "+" a nova parcela adicionada ao fim da lista deve se tornar visível na tela (caso tenha scroll) e automaticamente selecionada.
- O botão "-" exclui a parcela atualmente selecionada.
- Antes de excluir uma mensagem de confirmação deve ser exibida: "Tem certeza que deseja excluir a Parcela xxx?".
- Ao excluir uma parcela, as parcelas seguintes devem ter seu índice atualizado para que não fique nenhum número "pulado".
- O botão "+" inclui uma nova parcela ao final da lista.
- O combo Conta Financeira deve exibir todas as contas de acordo com a Empresa selecionada. Para evitar que o usuário faça o pagamento de uma conta que não pertença a mesma empresa.
- Embora este campo não esteja como obrigatório no banco de dados (por causa dos lançamentos de crédito) sua informação é obrigatória.
- Forma de Pagamento: é parcialmente o campo do VO chamdo PAYKIND. No entanto as opções não devem ser copiadas do Enum, mas sim definidas manualmente e seletivamente:
- Dinheiro / Outras Esta opção define no VO o valor PAYKIND.OTHER. Deve solicitar os campos Data de Vencimento, Data de Pagamento e Valor.
- Cheque Esta opção define no VO o valor PAYKIND.CHECK. Deve solicitar os campos Data de Vencimento, Data de Pagamento, Valor e Folha de Cheque.
- Folha de Cheque um combo que deve exibir as folhas de cheque cadastradas no sistema que ainda não foram emitidas em outro pagamento.
- Depósito Esta opção define no VO o valor PAYKIND.DEPOSIT. Devendo solicitar os campos Data de Vencimento, Data de Pagamento, Valor e Dados Bancários de Destino.
- Dados Bancários de Destino Este é um combo que exibe as informações bancárias do PersonVO definido no campo Favorecido. Caso nenhum favorecido tenha sido selecionado este campo deve ficar desabilitado. Em sua caixa de ajuda popup deve constar que para selecionar os dados bancários é necessário escolher o Favorecido.
- Associado ao campo de escolha há um botão de "+". Este botão permite que o usuário adicione uma nova informação bancária para o Favorecido selecionado. (A ser melhor definido ainda)
- Dados Bancários de Destino Este é um combo que exibe as informações bancárias do PersonVO definido no campo Favorecido. Caso nenhum favorecido tenha sido selecionado este campo deve ficar desabilitado. Em sua caixa de ajuda popup deve constar que para selecionar os dados bancários é necessário escolher o Favorecido.
- Boleto Bancário Esta forma de pagamento solicita os campos Código de Barras / Linha Digitável, Data de Vencimento, Data de Pagamento e Valor. Nesta forma de pagamento o Boleto o código do boleto é solicitado antes dos outros campos para induzir o usuário a informa-lo primeiro, já que a partir desta informação podemos definir o vencimento e valor.
- O valor definido no VO deve ser definido como nulo quando esta opção for selecionada, para evitar que algum valor anterior fique definido por acidente. O valor correto só serrá definido de acordo com o conteúdo informado no campo Código de Barras / Linha Digitável.
- Código de Barras / Linha Digitável este campo receberá tanto a representação numérica quanto o valor do código de barras do boleto. Deverá identifica-la e caso o valor entrado seja de um código de barras, converte-lo para a representação numérica adequada. A representação numérica deve ser formatada de acordo com o tipo de guia.
- De acordo com o tipo de guia definir o VO com os valores PAYKIND.BOLETOS ou PAYKIND.PUBLICSERVICES.
- Comprovante de Pagamento Esta seção oferece alguns comandos para anexar o comprovante de pagamento da parcela.
- Quando não há nenhum comprovante anexado, a seção deve exibir um label com a informação "Nenhum comprovante anexado!", e do lado o botão Anexar Comprovante.
- Habilitar o drag 'n' drop de arquivo externo para anexar o comprovante. Habilitar o Drag and Drop no painel todo da parcela.
- Só permitir o upload de arquivos com a extensão pdf, jpg, jpeg e png. Com o tamanho máximo de 500KB.
- Habilitar o drag 'n' drop de arquivo externo para anexar o comprovante. Habilitar o Drag and Drop no painel todo da parcela.
- Quando houver um comprovante anexado, a seção deve exibir um label com a informação "Comprovante anexado!", e do lado os botões Visualizar, Download e Excluir.
- O botão visualizar deve abrir um popup com o conteúdo do arquivo para exibição no próprio browser.
- O botão Download deve iniciar o download do arquivo diretamente.
- O botão excluir deve exibir uma mensagem de confirmação, e se confirmado remover o comprovante anexado à parcela.
- Quando não há nenhum comprovante anexado, a seção deve exibir um label com a informação "Nenhum comprovante anexado!", e do lado o botão Anexar Comprovante.
- Quando o Tipo de Pagamento for definido como "Parcelado", o sistema deve exibir o painel a esquerda para organizar os números de parcelas.






![]() |
|
- Aba Documentos
- Quando não houver documento associado, a tela deve exibir dois botões:
- Enviar Arquivo: permitirá o upload de um arquivo externo ou a vinculação de uma NFe existente no sistema.
- Permitir que o arquivo seja arrastado (drag'n'drop) no painel para fazer o upload do arquivo.
- Só permitir o upload de arquivos com a extensão pdf, jpg, jpeg e png. Com o tamanho máximo de 2MB.
- Permitir que o arquivo seja arrastado (drag'n'drop) no painel para fazer o upload do arquivo.
- Associar NFe. Permite que uma NFe seja escolhida e associada ao lançamento.
- Enviar Arquivo: permitirá o upload de um arquivo externo ou a vinculação de uma NFe existente no sistema.
- Quando houver documento associado:
- a aba deve exibir um preview do arquivo associado (Trabalhar nisso ainda)
- deve exibir os botões:
- Visualizar: Abre um popup com a visualização no browser do documento, se for NFe abre o componente de visualização da NFe.
- Baixar Documento: inicia o download do arquivo imediatamente. (Só exibir no caso de arquivo enviado, não usado para NFe).
- Excluir: Remove a associação entre o lançamento e a NFe, ou excluí o arquivo no caso de arquivo enviado.
- Quando não houver documento associado, a tela deve exibir dois botões:


Lançamento a partir de NFe de Compra

Ao fazer um lançamento a partir de uma NFe, o sistema deve questionar pela chave de acesso da NFe já que é um identificador único do documento. Como alternativa o sistema deve exibir um botão de buscar a NFe, abrindo o NFePicker.
- O sistema só deve permitir avançar para o próximo passo caso a NFe seja encontrada no sistema.
- Ao selecionar a NFe e confirmar a UI já deve validar se a NFe selecionada já está associada a outro lançamento. Cada NFe só deve ter um lançamento de pagamento. Não faz sentido ter a mesa NFe em múltiplos lançamentos e isso evita erros de lançamentos duplicados.
- Caso o lançamento seja encontrado, notificar e questionar se gostaria de editar o lançamento já existente. A ideia é não permitir que o usuário complete todo o lançamento para só depois validar que este documento já está lançado, evitando esforço e perda de tempo.
- Se não paramos em validação, criar um novo lançamento e avançar para a tela de edição do "lançamento manual" com as seguintes condições:
- A tela de edição não permitirá que a associação dessa NFe seja desfeita, embora permita a associação de outras NFes (para o caso de múltiplas NFes em um mesmo boleto). As NFes associadas adicionalmente poderão ser removidas.
- A tela deve ler as informações dos campos de "Faturamento" do XML para obter o valor e as parcelas. Com essas informações já gerar os objetos de parcelamento.
- Obter o Favorecido (PersonVO) pelo CNPJ da empresa e já deixar associado ao lançamento. Também desabilitar o campo para que não seja possível alterar/remover a associação do Favorecido.
- Caso o PersonVO com o CNPJ não exista a UI deve gerar um novo objeto e já preenche-lo com todas as informações disponíveis no XML da NFe. Posteriormente ao confirmar o lançamento o Core deverá fazer o cadastro do PersonVO no BISCore antes de persistir o lançamento.
- Ao tentar confirmar a tela deve validar:
- Se os valores das parcelas lançadas para pagamento bate com o total da NFe.
- Se a todas as NFes Associadas foram emitidas para a Empresa associada ao lançamento. Além de evitar fraude, e pagamento de NFes que não são da empresa, evita o erro de pagamento de uma NFe emitida para uma empresa ser paga por outra.
- No futuro, confirmar se as NFes de uma filial podem ser pagas na conta da Matriz (e vice-versa). Caso não tenha nenhum problema contábil nessa ação essa validação precisará ser alterada para verificar apenas o prefixo do CNPJ, permitindo filiais diferentes.
![]() |
|