br.com.hslife.orcamento.service.ImportacaoLancamentoService.java Source code

Java tutorial

Introduction

Here is the source code for br.com.hslife.orcamento.service.ImportacaoLancamentoService.java

Source

/***
      
 Copyright (c) 2012 - 2020 Hrcules S. S. Jos
    
Este arquivo  parte do programa Oramento Domstico.
    
    
Oramento Domstico  um software livre; voc pode redistribui-lo e/ou 
    
modific-lo dentro dos termos da Licena Pblica Geral Menor GNU como 
    
publicada pela Fundao do Software Livre (FSF); na verso 2.1 da 
    
Licena.
    
    
Este programa  distribudo na esperana que possa ser til, 
    
mas SEM NENHUMA GARANTIA; sem uma garantia implcita de ADEQUAO a 
    
qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica 
    
Geral Menor GNU em portugus para maiores detalhes.
    
    
Voc deve ter recebido uma cpia da Licena Pblica Geral Menor GNU sob o 
    
nome de "LICENSE.TXT" junto com este programa, se no, acesse o site do
    
projeto no endereco https://github.com/herculeshssj/orcamento ou escreva 
    
para a Fundao do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, 
    
Boston, MA  02110-1301, USA.
    
    
Para mais informaes sobre o programa Oramento Domstico e seu autor entre  
    
em contato pelo e-mail herculeshssj@outlook.com, ou ainda escreva para 
    
Hrcules S. S. Jos, Av. Ministro Lafaeyte de Andrade, 1683 - Bl. 3 Apt 404, 
    
Marco II - Nova Iguau, RJ, Brasil.
      
***/

package br.com.hslife.orcamento.service;

import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.hslife.orcamento.component.OpcaoSistemaComponent;
import br.com.hslife.orcamento.component.UsuarioComponent;
import br.com.hslife.orcamento.entity.Arquivo;
import br.com.hslife.orcamento.entity.Conta;
import br.com.hslife.orcamento.entity.LancamentoConta;
import br.com.hslife.orcamento.entity.LancamentoImportado;
import br.com.hslife.orcamento.entity.Moeda;
import br.com.hslife.orcamento.entity.TaxaConversao;
import br.com.hslife.orcamento.entity.Usuario;
import br.com.hslife.orcamento.enumeration.StatusLancamentoConta;
import br.com.hslife.orcamento.enumeration.TipoCategoria;
import br.com.hslife.orcamento.enumeration.TipoConta;
import br.com.hslife.orcamento.enumeration.TipoLancamento;
import br.com.hslife.orcamento.exception.ApplicationException;
import br.com.hslife.orcamento.exception.BusinessException;
import br.com.hslife.orcamento.facade.ICategoria;
import br.com.hslife.orcamento.facade.IFavorecido;
import br.com.hslife.orcamento.facade.IImportacaoLancamento;
import br.com.hslife.orcamento.facade.IMeioPagamento;
import br.com.hslife.orcamento.facade.IMoeda;
import br.com.hslife.orcamento.facade.IRegraImportacao;
import br.com.hslife.orcamento.model.InfoOFX;
import br.com.hslife.orcamento.repository.LancamentoContaRepository;
import br.com.hslife.orcamento.repository.LancamentoImportadoRepository;
import br.com.hslife.orcamento.util.LancamentoContaComparator;
import br.com.hslife.orcamento.util.Util;
import net.sf.ofx4j.domain.data.MessageSetType;
import net.sf.ofx4j.domain.data.ResponseEnvelope;
import net.sf.ofx4j.domain.data.ResponseMessageSet;
import net.sf.ofx4j.domain.data.banking.BankStatementResponseTransaction;
import net.sf.ofx4j.domain.data.banking.BankingResponseMessageSet;
import net.sf.ofx4j.domain.data.common.Transaction;
import net.sf.ofx4j.domain.data.creditcard.CreditCardResponseMessageSet;
import net.sf.ofx4j.domain.data.creditcard.CreditCardStatementResponseTransaction;
import net.sf.ofx4j.domain.data.signon.SignonResponse;
import net.sf.ofx4j.io.AggregateUnmarshaller;

@Service("importacaoLancamentoService")
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { ApplicationException.class })
public class ImportacaoLancamentoService implements IImportacaoLancamento {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private ICategoria categoriaService;

    @Autowired
    private IFavorecido favorecidoService;

    @Autowired
    private IMeioPagamento meioPagamentoService;

    @Autowired
    private IMoeda moedaService;

    @Autowired
    private IRegraImportacao regraImportacaoService;

    @Autowired
    private LancamentoImportadoRepository repository;

    @Autowired
    private LancamentoContaRepository lancamentoContaRepository;

    @Autowired
    private UsuarioComponent usuarioComponent;

    @Autowired
    private OpcaoSistemaComponent opcaoSistemaComponent;

    public LancamentoImportadoRepository getRepository() {
        this.repository.setSessionFactory(this.sessionFactory);
        return repository;
    }

    public ICategoria getCategoriaService() {
        return categoriaService;
    }

    public IFavorecido getFavorecidoService() {
        return favorecidoService;
    }

    public IMeioPagamento getMeioPagamentoService() {
        return meioPagamentoService;
    }

    public IMoeda getMoedaService() {
        return moedaService;
    }

    public IRegraImportacao getRegraImportacaoService() {
        return regraImportacaoService;
    }

    public LancamentoContaRepository getLancamentoContaRepository() {
        this.lancamentoContaRepository.setSessionFactory(this.sessionFactory);
        return lancamentoContaRepository;
    }

    public UsuarioComponent getUsuarioComponent() {
        return usuarioComponent;
    }

    public OpcaoSistemaComponent getOpcaoSistemaComponent() {
        return opcaoSistemaComponent;
    }

    @Override
    public List<LancamentoImportado> buscarLancamentoImportadoPorConta(Conta conta) {
        return getRepository().findByConta(conta);
    }

    @Override
    public void excluirLancamentoImportado(LancamentoImportado entity) {
        getRepository().delete(entity);
    }

    @Override
    public void atualizarLancamentoImportado(LancamentoImportado entity) {
        getRepository().update(entity);
    }

    public LancamentoImportado buscarPorID(Long id) {
        return getRepository().findByID(id);
    }

    @Override
    public void processarArquivoImportado(Arquivo arquivo, Conta conta) throws ApplicationException {
        switch (conta.getTipoConta()) {
        case CORRENTE:
            this.processarArquivoImportadoContaCorrente(arquivo, conta);
            break;
        case POUPANCA:
            this.processarArquivoImportadoContaPoupanca(arquivo, conta);
            break;
        case CARTAO:
            this.processarArquivoImportadoCartaoCredito(arquivo, conta);
            break;
        default:
            throw new BusinessException("Opo invlida para conta!");
        }
    }

    @Override
    public List<LancamentoConta> buscarLancamentoContaACriarAtualizar(Conta conta,
            List<LancamentoImportado> lancamentosImportados) {
        return this.buscarLancamentoContaACriarAtualizar(conta, lancamentosImportados, false);
    }

    @Override
    public List<LancamentoConta> buscarLancamentoContaACriarAtualizar(Conta conta,
            List<LancamentoImportado> lancamentosImportados, boolean quitarAutomaticamente) {
        // Armazena o usurio logado para diminuir o acesso a base
        Usuario usuarioLogado = getUsuarioComponent().getUsuarioLogado();

        List<LancamentoConta> lancamentos = new ArrayList<LancamentoConta>();

        // Itera a lista de todas as moedas existentes e guarda em um Map todas elas
        // e na varivel moedaPadrao a moeda padro do usurio. 
        Moeda moedaPadrao = new Moeda();
        Map<String, Moeda> moedas = new HashMap<String, Moeda>();
        for (Moeda moeda : getMoedaService().buscarPorUsuario(usuarioLogado)) {
            if (moeda.isPadrao()) {
                moedaPadrao = moeda;
            }
            moedas.put(moeda.getCodigoMonetario(), moeda);
        }

        LancamentoConta lc = null;

        // Itera a lista de lanamentos importados para gerar os lanamentos da conta correspondentes
        for (LancamentoImportado li : lancamentosImportados) {

            lc = getLancamentoContaRepository().findByHash(li.getHash());

            if (lc == null) {

                lc = new LancamentoConta();

                if (li.getValor() > 0 || (li.getTipo() != null && li.getTipo().equalsIgnoreCase("CREDITO"))) {
                    lc.setTipoLancamento(TipoLancamento.RECEITA);
                    lc.setCategoria(getCategoriaService().buscarCategoria(li.getCategoria(), TipoCategoria.CREDITO,
                            usuarioLogado));
                } else {
                    lc.setTipoLancamento(TipoLancamento.DESPESA);
                    lc.setCategoria(getCategoriaService().buscarCategoria(li.getCategoria(), TipoCategoria.DEBITO,
                            usuarioLogado));
                }

                lc.setFavorecido(getFavorecidoService().buscarFavorecido(li.getFavorecido(), usuarioLogado));
                lc.setMeioPagamento(
                        getMeioPagamentoService().buscarMeioPagamento(li.getMeiopagamento(), usuarioLogado));

                // Seta a moeda a partir do cdigo monetrio. Caso no encontre, seta a moeda padro.
                lc.setMoeda(moedas.get(li.getMoeda()) == null ? moedaPadrao : moedas.get(li.getMoeda()));

                lc.setConta(li.getConta());
                lc.setDataPagamento(li.getData());
                lc.setDescricao(li.getHistorico());
                lc.setHistorico(li.getHistorico());
                lc.setNumeroDocumento(li.getDocumento());
                lc.setValorPago(Math.abs(li.getValor()));
                lc.setHashImportacao(li.getHash());
                lc.setObservacao(li.getObservacao());
                lc.setSelecionado(true);

                // Seta o status do lanamento a ser inserido
                if (li.getData().after(new Date())) {
                    lc.setStatusLancamentoConta(StatusLancamentoConta.AGENDADO);
                } else if (lc.getStatusLancamentoConta().equals(StatusLancamentoConta.AGENDADO)) {
                    lc.setStatusLancamentoConta(StatusLancamentoConta.REGISTRADO);
                }

                // Define a taxa de converso
                if (lc.getConta().getTipoConta().equals(TipoConta.CARTAO)) {
                    lc.setTaxaConversao(new TaxaConversao(lc.getMoeda(), lc.getValorPago(),
                            lc.getConta().getMoeda(), lc.getMoeda().getValorConversao()));
                }

                // Seta o lanamento como quitado caso a opo do sistema correspondente seja true
                if (quitarAutomaticamente) {
                    lc.setStatusLancamentoConta(StatusLancamentoConta.QUITADO);
                }

                lancamentos.add(lc);
            } else {
                lc.setSelecionado(false);

                // Seta o status do lanamento a ser atualizado
                if (li.getData().after(new Date())) {
                    lc.setStatusLancamentoConta(StatusLancamentoConta.AGENDADO);
                } else if (lc.getStatusLancamentoConta().equals(StatusLancamentoConta.AGENDADO)) {
                    lc.setStatusLancamentoConta(StatusLancamentoConta.REGISTRADO);
                }

                // Seta o lanamento como quitado caso a opo do sistema correspondente seja true
                if (quitarAutomaticamente) {
                    lc.setStatusLancamentoConta(StatusLancamentoConta.QUITADO);
                }

                lancamentos.add(lc);
            }
        }
        if (lancamentos.isEmpty())
            return lancamentos;
        else {
            // Ordena os lanamentos
            Collections.sort(lancamentos, new LancamentoContaComparator());
            return getRegraImportacaoService().processarRegras(conta, lancamentos);
        }
    }

    @Override
    public void processarLancamentos(Conta conta, List<LancamentoConta> lancamentos) {
        for (LancamentoConta l : lancamentos) {
            if (l.isSelecionado()) {
                if (l.getId() == null) {
                    // Salva o lanamento da conta
                    getLancamentoContaRepository().save(l);
                    // Exclui o lanamento importado
                    getRepository().delete(getRepository().findByHash(l.getHashImportacao()));
                } else {
                    // Atualiza o lanamento da conta
                    getLancamentoContaRepository().update(l);
                    // Exclui o lanamento importado
                    getRepository().delete(getRepository().findByHash(l.getHashImportacao()));
                }
            }
        }
    }

    @Override
    public void importarLancamento(LancamentoImportado entity) {
        this.importarLancamento(entity, false);
    }

    @Override
    public void importarLancamento(LancamentoImportado entity, boolean quitarAutomaticamente) {
        // Armazena o usurio logado para diminuir o acesso a base
        Usuario usuarioLogado = getUsuarioComponent().getUsuarioLogado();

        LancamentoConta l = getLancamentoContaRepository().findByHash(entity.getHash());
        if (l == null) {
            // Cria um novo lanamento
            l = new LancamentoConta();

            Moeda moedaPadrao = getMoedaService().buscarPadraoPorUsuario(usuarioLogado);

            if (entity.getValor() > 0) {
                l.setTipoLancamento(TipoLancamento.RECEITA);
                l.setCategoria(getCategoriaService().buscarCategoria(entity.getCategoria(), TipoCategoria.CREDITO,
                        usuarioLogado));
            } else {
                l.setTipoLancamento(TipoLancamento.DESPESA);
                l.setCategoria(getCategoriaService().buscarCategoria(entity.getCategoria(), TipoCategoria.DEBITO,
                        usuarioLogado));
            }

            // Seta o status do lanamento a ser inserido
            if (entity.getData().after(new Date())) {
                l.setStatusLancamentoConta(StatusLancamentoConta.AGENDADO);
            } else if (l.getStatusLancamentoConta().equals(StatusLancamentoConta.AGENDADO)) {
                l.setStatusLancamentoConta(StatusLancamentoConta.REGISTRADO);
            }

            // Seta o lanamento como quitado caso a opo do sistema correspondente seja true
            if (quitarAutomaticamente) {
                l.setStatusLancamentoConta(StatusLancamentoConta.QUITADO);
            }

            l.setFavorecido(getFavorecidoService().buscarFavorecido(entity.getFavorecido(), usuarioLogado));
            l.setMeioPagamento(
                    getMeioPagamentoService().buscarMeioPagamento(entity.getMeiopagamento(), usuarioLogado));

            l.setConta(entity.getConta());
            l.setDataPagamento(entity.getData());
            l.setDescricao(entity.getHistorico());
            l.setHistorico(entity.getHistorico());
            l.setNumeroDocumento(entity.getDocumento());
            l.setValorPago(Math.abs(entity.getValor()));
            l.setHashImportacao(entity.getHash());
            l.setObservacao(entity.getObservacao());
            l.setMoeda(getMoedaService().buscarCodigoMonetarioPorUsuario(entity.getMoeda(), usuarioLogado) == null
                    ? moedaPadrao
                    : getMoedaService().buscarCodigoMonetarioPorUsuario(entity.getMoeda(), usuarioLogado));

            // Define a taxa de converso
            if (l.getConta().getTipoConta().equals(TipoConta.CARTAO)) {
                l.setTaxaConversao(new TaxaConversao(l.getMoeda(), l.getValorPago(), l.getConta().getMoeda(),
                        l.getMoeda().getValorConversao()));
            }

            // Salva o lanamento
            getLancamentoContaRepository().save(getRegraImportacaoService().processarRegras(entity.getConta(), l));

            // Exclui o lanamento importado
            getRepository().delete(entity);
        } else {
            // Atualiza o lanamento existente

            l.setDataPagamento(entity.getData());
            l.setHistorico(entity.getHistorico());
            l.setNumeroDocumento(entity.getDocumento());
            l.setValorPago(Math.abs(entity.getValor()));

            if (entity.getValor() > 0) {
                l.setTipoLancamento(TipoLancamento.RECEITA);
            } else {
                l.setTipoLancamento(TipoLancamento.DESPESA);
            }

            // Seta o status do lanamento a ser atualizado
            if (entity.getData().after(new Date())) {
                l.setStatusLancamentoConta(StatusLancamentoConta.AGENDADO);
            } else if (l.getStatusLancamentoConta().equals(StatusLancamentoConta.AGENDADO)) {
                l.setStatusLancamentoConta(StatusLancamentoConta.REGISTRADO);
            }

            // Define a taxa de converso
            if (l.getConta().getTipoConta().equals(TipoConta.CARTAO)) {
                l.setTaxaConversao(new TaxaConversao(l.getMoeda(), l.getValorPago(), l.getConta().getMoeda(),
                        l.getMoeda().getValorConversao()));
            }

            // Seta o lanamento como quitado caso a opo do sistema correspondente seja true
            if (quitarAutomaticamente) {
                l.setStatusLancamentoConta(StatusLancamentoConta.QUITADO);
            }

            getLancamentoContaRepository().update(l);

            // Exclui o lanamento importado
            getRepository().delete(entity);
        }
    }

    @Override
    @SuppressWarnings({ "unchecked", "unused", "rawtypes" })
    public InfoOFX obterInformacaoArquivoImportado(Arquivo arquivo, Conta conta) throws ApplicationException {
        InfoOFX info = new InfoOFX();
        try {
            if (conta.getTipoConta().equals(TipoConta.CARTAO)) {
                AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);
                ResponseEnvelope re = (ResponseEnvelope) a.unmarshal(
                        new InputStreamReader(new ByteArrayInputStream(arquivo.getDados()), "ISO-8859-1"));
                CreditCardResponseMessageSet message = (CreditCardResponseMessageSet) re
                        .getMessageSet(MessageSetType.creditcard);
                if (message != null) {
                    List<CreditCardStatementResponseTransaction> creditcard = message.getStatementResponses();
                    for (CreditCardStatementResponseTransaction c : creditcard) {
                        info.setQuantidadeTransacao(c.getMessage().getTransactionList().getTransactions().size());
                        info.setMoedaPadrao(c.getMessage().getCurrencyCode());
                        info.setInicioTransacoes(c.getMessage().getTransactionList().getStart());
                        info.setFimTransacoes(c.getMessage().getTransactionList().getEnd());
                    }
                }
            } else {
                AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);
                ResponseEnvelope re = (ResponseEnvelope) a.unmarshal(
                        new InputStreamReader(new ByteArrayInputStream(arquivo.getDados()), "ISO-8859-1"));
                SignonResponse sr = re.getSignonResponse();
                MessageSetType type = MessageSetType.banking;
                ResponseMessageSet message = re.getMessageSet(type);
                if (message != null) {
                    List<BankStatementResponseTransaction> bank = ((BankingResponseMessageSet) message)
                            .getStatementResponses();
                    for (BankStatementResponseTransaction b : bank) {
                        info.setBancoID(b.getMessage().getAccount().getBankId());
                        info.setConta(b.getMessage().getAccount().getAccountNumber());
                        info.setAgencia(b.getMessage().getAccount().getBranchId());
                        info.setTipoConta(b.getMessage().getAccount().getAccountType().name());
                        info.setBalancoFinal(b.getMessage().getLedgerBalance().getAmount());
                        info.setDataArquivo(b.getMessage().getLedgerBalance().getAsOfDate());
                        info.setMoedaPadrao(b.getMessage().getCurrencyCode());
                        info.setQuantidadeTransacao(b.getMessage().getTransactionList().getTransactions().size());
                        info.setInicioTransacoes(b.getMessage().getTransactionList().getStart());
                        info.setFimTransacoes(b.getMessage().getTransactionList().getEnd());
                    }
                }
            }
        } catch (Exception e) {
            throw new ApplicationException("Erro ao ler o arquivo OFX:" + e.getMessage(), e);
        }
        return info;
    }

    @SuppressWarnings({ "unchecked", "unused", "rawtypes" })
    private void processarArquivoImportadoContaCorrente(Arquivo arquivo, Conta conta) throws ApplicationException {
        try {
            // Incluindo o cdigo do projeto OFXImport na forma que est. Futuramente este cdigo sofrer refatorao (assim espero... :/ )

            AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);
            ResponseEnvelope re = (ResponseEnvelope) a
                    .unmarshal(new InputStreamReader(new ByteArrayInputStream(arquivo.getDados()), "ISO-8859-1"));

            //objeto contendo informaes como instituio financeira, idioma, data da conta.
            SignonResponse sr = re.getSignonResponse();

            //como no existe esse get "BankStatementResponse bsr = re.getBankStatementResponse();"
            //fiz esse codigo para capturar a lista de transaes
            MessageSetType type = MessageSetType.banking;
            ResponseMessageSet message = re.getMessageSet(type);

            if (message != null) {
                List<BankStatementResponseTransaction> bank = ((BankingResponseMessageSet) message)
                        .getStatementResponses();
                for (BankStatementResponseTransaction b : bank) {

                    /* Aqui comea meu cdigo de validao de conta */

                    if (!conta.getBanco().getNumero().equals(b.getMessage().getAccount().getBankId())) {
                        throw new ApplicationException("Nmero do banco " + conta.getBanco().getNumero()
                                + " no confere com do arquivo (" + b.getMessage().getAccount().getBankId()
                                + ")!");
                    }
                    if (!conta.getAgencia().equals(b.getMessage().getAccount().getBranchId())) {
                        throw new ApplicationException(
                                "Nmero da agncia " + conta.getAgencia() + " no confere com do arquivo ("
                                        + b.getMessage().getAccount().getBranchId() + ")!");
                    }
                    if (!conta.getContaCorrente().equals(b.getMessage().getAccount().getAccountNumber())) {
                        throw new ApplicationException(
                                "Nmero da conta " + conta.getContaCorrente() + " no confere com do arquivo ("
                                        + b.getMessage().getAccount().getAccountNumber() + ")!");
                    }
                    if (!conta.getTipoConta().equals(TipoConta.CORRENTE)) {
                        throw new ApplicationException("Somente contas correntes so aceitas!");
                    }

                    /* Trmino do cdigo do meu cdigo de validao de conta */

                    List<Transaction> list = b.getMessage().getTransactionList().getTransactions();
                    for (Transaction transaction : list) {

                        /* Aqui comea meu cdigo */
                        LancamentoImportado li = getRepository().findByHash(Util.MD5(transaction.getId()));
                        if (li == null) {
                            // Cria os lanamentos se a data do movimento for posterior  data de abertura da conta
                            if (transaction.getDatePosted().after(conta.getDataAbertura())) {
                                li = new LancamentoImportado();
                                li.setConta(conta);
                                li.setData(transaction.getDatePosted());
                                li.setMoeda(transaction.getCurrency() == null ? b.getMessage().getCurrencyCode()
                                        : transaction.getCurrency().getCode());
                                li.setDocumento(transaction.getReferenceNumber());
                                li.setHash(Util.MD5(transaction.getId()));
                                li.setHistorico(transaction.getMemo());
                                li.setValor(transaction.getAmount());

                                getRepository().save(li);
                            }
                        } else {
                            // Caso o lanamento importado j exista, o mesmo ser atualizado
                            li.setConta(conta);
                            li.setData(transaction.getDatePosted());
                            li.setMoeda(transaction.getCurrency() == null ? b.getMessage().getCurrencyCode()
                                    : transaction.getCurrency().getCode());
                            li.setDocumento(transaction.getReferenceNumber());
                            li.setHash(Util.MD5(transaction.getId()));
                            li.setHistorico(transaction.getMemo());
                            li.setValor(transaction.getAmount());

                            getRepository().update(li);
                        }

                        /* Fim do meu cdigo */
                    }
                }
            }
        } catch (Exception e) {
            throw new ApplicationException("Erro ao processar o arquivo OFX:" + e.getMessage(), e);
        }
    }

    @SuppressWarnings({ "unchecked", "unused", "rawtypes" })
    private void processarArquivoImportadoContaPoupanca(Arquivo arquivo, Conta conta) throws ApplicationException {
        try {
            // Incluindo o cdigo do projeto OFXImport na forma que est. Futuramente este cdigo sofrer refatorao (assim espero... :/ )

            AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);
            ResponseEnvelope re = (ResponseEnvelope) a
                    .unmarshal(new InputStreamReader(new ByteArrayInputStream(arquivo.getDados()), "ISO-8859-1"));

            //objeto contendo informaes como instituio financeira, idioma, data da conta.
            SignonResponse sr = re.getSignonResponse();

            //como no existe esse get "BankStatementResponse bsr = re.getBankStatementResponse();"
            //fiz esse codigo para capturar a lista de transaes
            MessageSetType type = MessageSetType.banking;
            ResponseMessageSet message = re.getMessageSet(type);

            if (message != null) {
                List<BankStatementResponseTransaction> bank = ((BankingResponseMessageSet) message)
                        .getStatementResponses();
                for (BankStatementResponseTransaction b : bank) {

                    /* Aqui comea meu cdigo de validao de conta */

                    if (!conta.getBanco().getNumero().equals(b.getMessage().getAccount().getBankId())) {
                        throw new ApplicationException("Nmero do banco " + conta.getBanco().getNumero()
                                + " no confere com do arquivo (" + b.getMessage().getAccount().getBankId()
                                + ")!");
                    }
                    if (!conta.getAgencia().equals(b.getMessage().getAccount().getBranchId())) {
                        throw new ApplicationException(
                                "Nmero da agncia " + conta.getAgencia() + " no confere com do arquivo ("
                                        + b.getMessage().getAccount().getBranchId() + ")!");
                    }
                    if (!conta.getContaCorrente().equals(b.getMessage().getAccount().getAccountNumber())) {
                        throw new ApplicationException(
                                "Nmero da conta " + conta.getContaCorrente() + " no confere com do arquivo ("
                                        + b.getMessage().getAccount().getAccountNumber() + ")!");
                    }
                    if (!conta.getTipoConta().equals(TipoConta.POUPANCA)) {
                        throw new ApplicationException("Somente contas correntes so aceitas!");
                    }

                    /* Trmino do cdigo do meu cdigo de validao de conta */

                    List<Transaction> list = b.getMessage().getTransactionList().getTransactions();
                    for (Transaction transaction : list) {

                        /* Aqui comea meu cdigo */
                        LancamentoImportado li = getRepository().findByHash(Util.MD5(transaction.getId()));
                        if (li == null) {
                            // Cria os lanamentos se a data do movimento for posterior  data de abertura da conta
                            if (transaction.getDatePosted().after(conta.getDataAbertura())) {
                                li = new LancamentoImportado();
                                li.setConta(conta);
                                li.setData(transaction.getDatePosted());
                                li.setMoeda(transaction.getCurrency() == null ? b.getMessage().getCurrencyCode()
                                        : transaction.getCurrency().getCode());
                                li.setDocumento(transaction.getReferenceNumber());
                                li.setHash(Util.MD5(transaction.getId()));
                                li.setHistorico(transaction.getMemo());
                                li.setValor(transaction.getAmount());

                                getRepository().save(li);
                            }
                        } else {
                            // Caso o lanamento j exista ele ser atualizado
                            li.setConta(conta);
                            li.setData(transaction.getDatePosted());
                            li.setMoeda(transaction.getCurrency() == null ? b.getMessage().getCurrencyCode()
                                    : transaction.getCurrency().getCode());
                            li.setDocumento(transaction.getReferenceNumber());
                            li.setHash(Util.MD5(transaction.getId()));
                            li.setHistorico(transaction.getMemo());
                            li.setValor(transaction.getAmount());

                            getRepository().update(li);
                        }

                        /* Fim do meu cdigo */
                    }
                }
            }
        } catch (Exception e) {
            throw new ApplicationException("Erro ao processar o arquivo OFX:" + e.getMessage(), e);
        }
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private void processarArquivoImportadoCartaoCredito(Arquivo arquivo, Conta conta) throws ApplicationException {
        try {
            AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);
            ResponseEnvelope re = (ResponseEnvelope) a
                    .unmarshal(new InputStreamReader(new ByteArrayInputStream(arquivo.getDados()), "ISO-8859-1"));
            CreditCardResponseMessageSet message = (CreditCardResponseMessageSet) re
                    .getMessageSet(MessageSetType.creditcard);
            if (message != null) {
                List<CreditCardStatementResponseTransaction> creditcard = message.getStatementResponses();
                for (CreditCardStatementResponseTransaction c : creditcard) {

                    // Valida o nmero do carto de crdito
                    if (conta.getCartaoCredito().getNumeroCartao() == null || !conta.getCartaoCredito()
                            .getNumeroCartao().equals(Util.SHA1(c.getMessage().getAccount().getAccountNumber()))) {
                        throw new BusinessException("Nmero do carto informado no confere com do arquivo!");
                    }

                    List<Transaction> list = c.getMessage().getTransactionList().getTransactions();
                    for (Transaction transaction : list) {
                        LancamentoImportado li = getRepository().findByHash(Util.MD5(transaction.getId()));
                        if (li == null) {
                            li = new LancamentoImportado();
                            li.setConta(conta);
                            li.setData(transaction.getDatePosted());
                            li.setMoeda(transaction.getCurrency() == null ? c.getMessage().getCurrencyCode()
                                    : transaction.getCurrency().getCode());
                            li.setHash(Util.MD5(transaction.getId()));
                            li.setHistorico(transaction.getMemo());
                            li.setValor(transaction.getAmount());

                            getRepository().save(li);
                        } else {
                            // Caso o lanamento j exista o mesmo ser atualizado
                            li.setConta(conta);
                            li.setData(transaction.getDatePosted());
                            li.setMoeda(transaction.getCurrency() == null ? c.getMessage().getCurrencyCode()
                                    : transaction.getCurrency().getCode());
                            li.setHash(Util.MD5(transaction.getId()));
                            li.setHistorico(transaction.getMemo());
                            li.setValor(transaction.getAmount());

                            getRepository().update(li);
                        }
                    }
                }
            }
        } catch (Exception e) {
            throw new ApplicationException("Erro ao processar o arquivo OFX: " + e.getMessage(), e);
        }
    }

    @Override
    public void processarArquivoCSVImportado(Arquivo arquivo, Conta conta) throws ApplicationException {
        try {
            // Declarao e leitura dos dados do CSV
            final Reader reader = new InputStreamReader(new ByteArrayInputStream(arquivo.getDados()), "UTF-8");
            final CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader());

            // Declarao das variveis
            LancamentoImportado lancamentoImportado = new LancamentoImportado();

            for (CSVRecord record : parser) {

                int quantidade = Integer.parseInt(record.get("QUANTIDADE"));

                lancamentoImportado.setConta(conta);
                lancamentoImportado.setData(new SimpleDateFormat("yyyy-MM-dd").parse(record.get("DATA")));
                lancamentoImportado.setHistorico(record.get("HISTORICO"));
                lancamentoImportado.setValor(Double.parseDouble(record.get("VALOR")));
                lancamentoImportado.setMoeda(record.get("MOEDA"));
                lancamentoImportado.setDocumento(record.get("DOCUMENTO"));
                lancamentoImportado.setObservacao(record.get("OBSERVACAO"));
                lancamentoImportado.setCategoria(record.get("CATEGORIA"));
                lancamentoImportado.setFavorecido(record.get("FAVORECIDO"));
                lancamentoImportado.setMeiopagamento(record.get("MEIOPAGAMENTO"));
                lancamentoImportado.setHash(lancamentoImportado.getFullLabel());

                // Insere o lanamento importado X vezes de acordo com o campo QUANTIDADE
                for (int i = 1; i <= quantidade; i++) {
                    getRepository().save(lancamentoImportado.clonarLancamento(i));
                }
            }

            // Fecha os streams
            parser.close();
            reader.close();

        } catch (Exception e) {
            throw new ApplicationException(e);
        }
    }

    @Override
    public void apagarLancamentosImportados(Conta conta) {
        List<LancamentoImportado> lancamentos = getRepository().findByConta(conta);
        for (LancamentoImportado li : lancamentos) {
            getRepository().delete(li);
        }
    }
}