package com.rjconsultores.ventaboletos.service.impl; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.zkoss.lang.Strings; import org.zkoss.util.resource.Labels; import com.rjconsultores.ventaboletos.dao.TransportadoraDAO; import com.rjconsultores.ventaboletos.dao.VoucherDAO; import com.rjconsultores.ventaboletos.entidad.ContratoCorporativo; import com.rjconsultores.ventaboletos.entidad.Parada; import com.rjconsultores.ventaboletos.entidad.Transportadora; import com.rjconsultores.ventaboletos.entidad.Voucher; import com.rjconsultores.ventaboletos.enums.SituacaoVoucher; import com.rjconsultores.ventaboletos.service.VoucherService; import com.rjconsultores.ventaboletos.utilerias.DateUtil; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; import com.rjconsultores.ventaboletos.vo.configuracioneccomerciales.VoucherVO; @Service("voucherService") public class VoucherServiceImpl implements VoucherService { @Autowired private VoucherDAO voucherDAO; @Autowired private TransportadoraDAO transportadoraDAO; public List obtenerTodos() { return voucherDAO.obtenerTodos(); } public Voucher obtenerID(Long id) { return voucherDAO.obtenerID(id); } @Transactional public Voucher suscribir(Voucher entidad) { entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); entidad.setFecModif(Calendar.getInstance().getTime()); entidad.setActivo(Boolean.TRUE); return voucherDAO.suscribir(entidad); } @Transactional public Voucher actualizacion(Voucher entidad) { entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); entidad.setFecModif(Calendar.getInstance().getTime()); return voucherDAO.actualizacion(entidad); } @Transactional public void borrar(Voucher entidad) { entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); entidad.setFecModif(Calendar.getInstance().getTime()); entidad.setActivo(Boolean.FALSE); voucherDAO.actualizacion(entidad); } @Override public List buscarConsulta(Long voucherId, String numContrato, String nit, String nomeTransportadora, Date dataInicial, Date dataFinal, Integer origemId, Integer destinoId) { return voucherDAO.buscarConsulta(voucherId, numContrato, nit, nomeTransportadora, dataInicial, dataFinal, origemId, destinoId); } @Override public List buscarListaVoucher(Long numInicial, Long numFinal, String numContrato, Long transportadora, Long grupoContratoId, Integer status, Integer origem, Integer destino) { return voucherDAO.buscarListaVoucher(numInicial, numFinal, numContrato, transportadora, grupoContratoId, status, origem, destino); } @Override @Transactional public List legalizar(Long numInicial, Long numFinal, String numContrato, Transportadora transportadora, BigDecimal valor, Parada origem, Parada destino) { List dados = voucherDAO.buscarListaVoucher(numInicial, numFinal, null, null, null, null, null, null); return efetuarLegalizacao(numContrato, transportadora, valor, origem, destino, dados); } private List efetuarLegalizacao(String numContrato, Transportadora transportadora, BigDecimal valor, Parada origem, Parada destino, List dados) { List retorno = new ArrayList(); for (Voucher vou : dados) { if( validarLegalizacao(numContrato, origem, destino, retorno, vou) ) { retorno.add(legalizar(transportadora, valor, vou)); } } return retorno; } private boolean validarLegalizacao(String numContrato, Parada origem, Parada destino, List retorno, Voucher vou) { VoucherVO vo; if( StringUtils.isNotEmpty(numContrato) && !vou.getContrato().getNumContrato().equals(numContrato)) { vo = VoucherVO.converteVoucher(vou); vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.contratoDiferente")); retorno.add(vo); return false; } if( !vou.getStatus().equals(SituacaoVoucher.EMITIDO.getValor())) { vo = VoucherVO.converteVoucher(vou); vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.statusDiferente")); retorno.add(vo); return false; } if( origem != null && !vou.getOrigenId().equals(origem.getParadaId())) { vo = VoucherVO.converteVoucher(vou); vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.origemDiferente")); retorno.add(vo); return false; } if( destino != null && !vou.getDestinoId().equals(destino.getParadaId())) { vo = VoucherVO.converteVoucher(vou); vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.destinoDiferente")); retorno.add(vo); return false; } return true; } private VoucherVO legalizar(Transportadora transportadora, BigDecimal valor, Voucher vou) { VoucherVO vo; try { vou.setValorLegalizado(valor); vou.setTransportadora(transportadora); vou.setStatus(SituacaoVoucher.LEGALIZADO.getValor()); vou.setDataLegaliza(Calendar.getInstance().getTime()); vou = voucherDAO.actualizacion(vou); vo = VoucherVO.converteVoucher(vou); vo.setMensagem(Labels.getLabel("label.sucesso")); }catch (Exception e) { vo = VoucherVO.converteVoucher(vou); vo.setMensagem(e.getMessage()); } return vo; } @Override @Transactional public List faturar(List lista, Long numFatura, Date datCorte) { for (Voucher vou : lista) { if( Strings.isBlank(vou.getNumFatura()) ) { if(numFatura != null) { vou.setNumFatura(numFatura.toString()); }else { continue; } } if( vou.getDataCorte() == null ) { if(datCorte != null) { vou.setDataCorte(datCorte); }else { continue; } } vou.setStatus(SituacaoVoucher.FATURADO.getValor()); vou.setDataFatura(Calendar.getInstance().getTime()); voucherDAO.actualizacion(vou); } return lista; } @Override @Transactional public List lerArquivo(String stream) throws Exception{ List retorno = new ArrayList(); List arquivosEnviados = processarArquivoEnviado(stream); for (VoucherVO vo : arquivosEnviados) { if( StringUtils.isNotEmpty(vo.getMensagem()) ) { retorno.add(vo); continue; } Voucher voucher = voucherDAO.obtenerID(vo.getVoucherId()); if ( !validarLegalizacao(null, null, null, retorno, voucher)) { continue; } Transportadora transportadora = transportadoraDAO.obtenerID(vo.getTransportadora().getTransportadoraId()); retorno.add(legalizar(transportadora, vo.getValorLegalizado(), voucher)); } return retorno; } private List processarArquivoEnviado(String stream) throws IOException, ParseException { String linha = null; List arquivo = new ArrayList(); InputStream inputStream = converterInputStream(stream); try( BufferedReader leitor = new BufferedReader(new InputStreamReader(inputStream))){ while ((linha = leitor.readLine()) != null) { if( linha.isEmpty() || linha.startsWith("ID;")) { continue; } VoucherVO voucher = new VoucherVO(); String[] split = linha.split(";"); voucher.setVoucherId( Long.valueOf(split[0]) ); voucher.setContrato( new ContratoCorporativo(split[1]) ); voucher.setDataValidade( DateUtil.getDateFromString(split[2], DateUtil.ddMMaaaa)); voucher.setStatus(SituacaoVoucher.EMITIDO.getValor()); voucher.setDescOrigem(split[3]); voucher.setDescDestino(split[4]); voucher.setValorLicitado( new BigDecimal(split[5].replace(',', '.')) ); if( split[6].equals("INFORMAR")) { voucher.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.faltaValor")); }else { voucher.setValorLegalizado( new BigDecimal(split[6].replace(',', '.')) ); } if( split[7].equals("INFORMAR")) { voucher.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.faltaTransportadora")); }else { voucher.setTransportadora( new Transportadora( Long.valueOf( split[7])) ); } arquivo.add(voucher); } } return arquivo; } private InputStream converterInputStream(String in){ byte[] buff = in.getBytes(StandardCharsets.UTF_8); return new ByteArrayInputStream(buff); } }