Esse artigo descreve o processo de retorno do arquivo de pagamento eletrônico. Após esse processo o sistema irá gerar o extrato e enviá-lo automaticamente ao locador.
Regras de negócio
O sistema não liquida duas vezes o mesmo documento a pagar;
Não deve ser alterado o campo código de integração, pois é por ele que o sistema realizada a baixa.
Retornar arquivo de liquidação de Pagamento
Com o pagamento dos títulos no banco, é necessário retornar o arquivo de pagamento para o sistema realizar a liquidação dos documentos e, para isso, é necessário realizar o seguinte procedimento:
Entre na guia "Documentos a pagar".
Clique no botão "Enviar Retorno".
Selecione a conta financeira que refere-se o arquivo .
Clique em “Carregar Arquivos” e informe o arquivo que se deseja importar.
Clique em enviar.
Para baixar o arquivo de retorno bancário, se desejar, o sistema gravou uma cópia no no objeto “Contas Correntes”.
Clique na conta financeira utilizada.
Clique na guia “Retorno de Cobrança”.
Após o retorno o sistema realiza as seguintes alterações:
No repasse:
altera a situação do repasse para “Pago”;
conta corrente: irá preencher com a conta corrente do pagamento;
data do pagamento: irá preencher com a data do pagamento;
valor total pago: irá preencher com o valor total pago;
Na conta corrente:
cria um lançamento do valor do crédito na conta corrente na data do pagamento;
Na parcela do documento a pagar:
altera a situação da integração para “efetuado”;
altera a situação do pagamento para “Paga”;
preenche o campo data de pagamento com a data do pagamento.
preenche o campo Pagamento com o número do lançamento de gerado na conta corrente.
No lançamento do contrato:
altera a situação dos lançamentos do repasse para “Pago”;
preenche o campo data de pagamento com a data do pagamento, que será utilizado para o informe de rendimento.
No contábil:
criar um lançamento contábil, nas contas contábeis pré-configuradas, na data do pagamento e com o valor pago.
Notas para o desenvolvedor:
Usuário selecionar o componente aura “pesquisarContaPagar“ do SnapERP para pesquisar os registros de pagamento.
Usuário clica no botão “Enviar retorno“ para processar o arquivo de retorno.
Sistema abre o componente “enviarRetornoPagamento“.
Usuário selecionar a conta corrente e anexa o arquivo de retorno do banco.
Usuário clica no botão “Enviar”.
Sistema executa o método “salvarRetornoPagamento“ da classe “PagamentoController“.
Sistema executa o método “carregarArquivoRetorno“ da classe “RetornoPagamentoServico“.
Recupera o arquivo de retorno salvo
Cria registro no objeto “snap_finan__retorno_pagamento__c” com a situação igual a “Aguardando processamento“ e o arquivo anexado.
Executa o método (future) “processarArquivoRetorno“ da classe “RetornoPagamentoItauServico“.
Para cada parcela de pagamento do arquivo:
Código da ocorrência = '00' (pagamento efetuado):
Code Block parcela.situacao__c = 'Paga'; parcela.data_pagamento__c = Date.newInstance(Integer.valueOf(processamento.data_efetiva_pagamento.substring(4)), Integer.valueOf(processamento.data_efetiva_pagamento.substring(2,4)), Integer.valueOf(processamento.data_efetiva_pagamento.substring(0,2))); parcela.integracao_bancaria__c = 'Efetuado'; // situação da integração parcela.snap_finan__erro_pagamento_eletronico__c = false; item.snap_finan__operacao__c = 'Documento Pago'; //01012010 item.snap_finan__data_prevista_pagamento__c = Date.newInstance(Integer.valueOf(processamento.data_efetiva_pagamento.substring(4)), Integer.valueOf(processamento.data_efetiva_pagamento.substring(2,4)), Integer.valueOf(processamento.data_efetiva_pagamento.substring(0,2))); temPagamento = true;
Código da ocorrência = ‘BD’(pagamento agendado):
Code Block parcela.integracao_bancaria__c = 'Agendado'; // situação da integração parcela.snap_finan__erro_pagamento_eletronico__c = false; item.snap_finan__operacao__c = 'Entrada Confirmada';
Código da ocorrência = ‘RJ’ (pagamento rejeitado):
Code Block parcela.integracao_bancaria__c = 'Rejeitado'; // situação da integração String mensagemErro = ''; for (Integer i=0; i< processamento.codigo_ocorrencia.length()/2; i++){ system.debug(processamento.codigo_ocorrencia.mid(i*2, 2)); mensagemErro += mapa_ocorrencia.get(processamento.codigo_ocorrencia.mid(i*2, 2)) + '; '; } system.debug('mensagem de erro: ' + mensagemErro); parcela.mensagem_pagamento_eletronico__c = mensagemErro; parcela.snap_finan__erro_pagamento_eletronico__c = true; item.snap_finan__operacao__c = 'Erro';
Cria os registros para novos itens do retorno de pagamento (
snap_finan__item_retorno_pagamento__c
)Atualiza o registro do retorno de pagamento com a situação igual a “Processado com sucesso“.
Atualiza as parcelas de pagamento.
Cria um evento de pagamento:
Code Block Pagamento__e pagamento = new Pagamento__e(); pagamento.id_registro__c = idRetorno; pagamento.origem_pagamento__c = PagamentoServico.origem_retorno; EventBus.publish(pagamento);
No SnapProperty (process builder “Pagamento”):
Quando uma “Parcela a pagar” é atualizada e “Situação” for igual a “Paga” e o tipo de registro for igual a “Repasse”:
Executa o método “parcelaPaga“ da classe “RepassePago“:
Executa o método
gerarLancamentoFinanceiro
da classe “RepasseServico“:Para cada parcela:
Cria um lançamento (
snap_finan__Movimento__c)
Code Block lancamento.snap_finan__Conta__c = parcela.snap_finan__modelo_pagamento__r.snap_finan__conta__c; lancamento.snap_finan__Contabilizado__c = false; lancamento.snap_finan__Data__c = parcela.snap_finan__data_pagamento__c; lancamento.snap_finan__Entidade__c = parcela.snap_finan__Empresa__c; lancamento.snap_finan__Historico__c = String.format('Pagamento da parcela: {0} - R$ {1}', new String[]{parcela.Name, String.valueOf(parcela.snap_finan__Valor_total__c.setScale(2))}); lancamento.snap_finan__Lancamento_contabil__c = null; lancamento.snap_finan__Documento__c = null; lancamento.snap_finan__Tipo__c = null; lancamento.snap_finan__Valor__c = (parcela.snap_finan__Valor_total__c * (-1)); lancamento.snap_finan__Valor_saida__c = parcela.snap_finan__Valor_total__c;
Cria os registros dos lançamentos.
Atualiza as parcelas com o campo
Code Block parcela.snap_finan__Movimento__c = lancamento.Id;
Executa o método
atualizarRepassesPagos
da classe “RepasseServico“:Recupera os repasses relacionados com as parcelas pagas.
Para cada repasse:
Code Block // atualizar o regitro do repasse repasse.Conta_contabil_credito__c = parcela.snap_finan__movimento__r.snap_finan__Conta__r.snap_finan__Conta_contabil__c; repasse.Data_pagamento__c = parcela.snap_finan__data_pagamento__c; repasse.Situacao__c = 'Pago'; repasse.Valor_desconto__c = parcela.snap_finan__desconto__c; repasse.Valor_juro__c = parcela.snap_finan__juros__c; repasse.Valor_multa__c = parcela.snap_finan__multa__c;
Atualiza os repasses pagos.
Executa o método
contabilizarRepassesPagos
da classe “RepasseServico“:Recupera os repasses pagos na etapa anterior.
Para cada repasse:
Executa o método “contabilizarPagamentoRepasse” da classe “ContabilidadeServico“:
Cria objeto para lançamento contábil (
snap_finan__lancamento_contabil__c
) do repasse:Code Block lancamento.snap_finan__data__c = repasse.Data_pagamento__c; lancamento.snap_finan__entidade__c = repasse.Empresa__c; lancamento.snap_brok__Repasse__c = repasse.id; lancamento.snap_finan__historico__c = historico; lancamento.snap_finan__periodo__c = periodo.Id; lancamento.snap_finan__situacao__c = 'Contabilizado'; lancamento.RecordTypeId = Schema.SObjectType.snap_finan__lancamento_contabil__c.getRecordTypeInfosByName().get('Pagamento do repasse').getRecordTypeId();
Cria um item para debitar cada item do repasse:
Code Block itens.add(debitarLancamento(lancamento, repasse.Locador__c, configuracao.Conta_contabil_debito__c, itemRepasse.Valor_item__c));
Atualiza a situação do repasse para “Contabilizado”.
Atualiza os registros dos repasses.
Recupera os itens do repasse (
Item_Repasse__c
).…
Cria os registros dos lançamentos contábeis
Cria os registros dos itens dos lançamentos contábeis.
Processo sistêmico após o pagamento de um repasse
...