package com.rjconsultores.ventaboletos.service.impl; import java.math.BigDecimal; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.zkoss.util.resource.Labels; import com.rjconsultores.ventaboletos.dao.GP_PricingOcupaAntecipaDAO; import com.rjconsultores.ventaboletos.entidad.GP_Pricing; import com.rjconsultores.ventaboletos.entidad.GP_PricingOcupaAntecipa; import com.rjconsultores.ventaboletos.exception.BusinessException; import com.rjconsultores.ventaboletos.service.GP_PricingOcupaAntecipaService; import com.rjconsultores.ventaboletos.utilerias.TraslaparUtil; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; import com.rjconsultores.ventaboletos.vo.pricing.GP_PricingOcupaAntecipaLegendaVO; import com.rjconsultores.ventaboletos.vo.pricing.GP_PricingOcupaAntecipaLegendaVO.GP_PricingOcupaAtencipaLegendaItemVO; import com.rjconsultores.ventaboletos.vo.pricing.GP_PricingOcupaAntecipaPoltronasVO; import com.rjconsultores.ventaboletos.vo.pricing.GP_PricingOcupaAntecipaVO; @Service("gp_pricingOcupacionService") public class GP_PricingOcupaAntecipaServiceImpl implements GP_PricingOcupaAntecipaService { private static final Logger log = LogManager.getLogger(GP_PricingOcupaAntecipaServiceImpl.class); @Autowired private GP_PricingOcupaAntecipaDAO pricingOcupacionDAO; @Transactional public GP_PricingOcupaAntecipa suscribir(GP_PricingOcupaAntecipa entidad) throws BusinessException { traslapa(entidad); entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); entidad.setFecmodif(Calendar.getInstance().getTime()); entidad.setActivo(GP_Pricing.ATIVO); return pricingOcupacionDAO.suscribir(entidad); } @Transactional(rollbackFor = BusinessException.class) public GP_PricingOcupaAntecipa actualizacion(GP_PricingOcupaAntecipa entidad) throws BusinessException { traslapa(entidad); entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); entidad.setFecmodif(Calendar.getInstance().getTime()); entidad.setActivo(GP_Pricing.ATIVO); return pricingOcupacionDAO.actualizacion(entidad); } @Transactional public void borrar(GP_PricingOcupaAntecipa entidad) { entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); entidad.setFecmodif(Calendar.getInstance().getTime()); entidad.setActivo(GP_Pricing.EXCLUIDO); pricingOcupacionDAO.actualizacion(entidad); } public List updateList(GP_PricingOcupaAntecipa pricingOcupaAntecipa) { List lsSalvos = pricingOcupacionDAO.buscarOcupaAntecipaPricing(pricingOcupaAntecipa.getPricing().getPricingId()); return lsSalvos; } private void traslapa(GP_PricingOcupaAntecipa pricingOcupaAntecipa) throws BusinessException { List lsSalvos = pricingOcupacionDAO.buscarOcupaAntecipaPricing(pricingOcupaAntecipa.getPricing().getPricingId()); // removo o pricing que eu estou validando lsSalvos.remove(pricingOcupaAntecipa); BigDecimal cantocupaini = pricingOcupaAntecipa.getOcupacioninicial(); BigDecimal cantocupafin = pricingOcupaAntecipa.getOcupacionfinal(); boolean validaCantPorcentaje = ((cantocupaini != null) && (cantocupafin != null)); Integer cantasientosmin = pricingOcupaAntecipa.getCantasientosmin(); Integer cantasientosmax = pricingOcupaAntecipa.getCantasientosmax(); boolean validaCantAsientos = ((cantasientosmin != null) && (cantasientosmax != null)); Integer cantdiasmin = pricingOcupaAntecipa.getCantdiasmin(); Integer cantdiasmax = pricingOcupaAntecipa.getCantdiasmax(); boolean validaCantDias = ((cantdiasmin != null) && (cantdiasmax != null)); for (GP_PricingOcupaAntecipa poa : lsSalvos) { boolean traslapaCantPorcentaje = false; if (validaCantPorcentaje) { if ((poa.getOcupacioninicial() != null) && (poa.getOcupacionfinal() != null)) { traslapaCantPorcentaje = TraslaparUtil.intersectNum(poa.getOcupacioninicial(), poa.getOcupacionfinal(), cantocupaini, cantocupafin); } } boolean traslapaCantAsiento = false; if (validaCantAsientos) { if ((poa.getCantasientosmin() != null) && (poa.getCantasientosmax() != null)) { traslapaCantAsiento = TraslaparUtil.intersectNum(poa.getCantasientosmin(), poa.getCantasientosmax(), cantasientosmin, cantasientosmax); } } boolean traslapaCantDias = false; if (validaCantDias) { if ((poa.getCantdiasmin() != null) && (poa.getCantdiasmax() != null)) { traslapaCantDias = TraslaparUtil.intersectNum(poa.getCantdiasmin(), poa.getCantdiasmax(), cantdiasmin, cantdiasmax); } } if ((traslapaCantPorcentaje || traslapaCantAsiento ) && traslapaCantDias ){ List args = new ArrayList(); String dias = poa.getCantdiasmin() + "-" + poa.getCantdiasmax(); args.add(dias); String faixa = null; if(traslapaCantPorcentaje) { faixa = poa.getOcupacioninicial() + "-" + poa.getOcupacionfinal(); } if(traslapaCantAsiento) { faixa = poa.getCantasientosmin() + "-" + poa.getCantasientosmax(); } args.add(faixa); log.info("registro que traslapa PricingOcupaAntecipa id =" + poa.getPricingocupaantecipaId()); throw new BusinessException("PricingOcupaAntecipaServiceImpl.msg.traslapa", args.toArray()); } } } @Override public List carregarPricingOcupaAntecipaVO(Integer pricingId) { List pricingOcupaAntecipas = carregarPricingOcupaAntecipa(pricingId); return carregarPricingOcupaAntecipaVO(pricingOcupaAntecipas); } @Override public List carregarPricingOcupaAntecipaVO(List pricingOcupaAntecipas) { List aux = new ArrayList(); for (GP_PricingOcupaAntecipa ocupacaoAntecipa: pricingOcupaAntecipas) { Integer cantdiasmax = ocupacaoAntecipa.getCantdiasmax() != null ? ocupacaoAntecipa.getCantdiasmax() : GP_PricingOcupaAntecipaVO.CANTDIASMAXDEFAULT; GP_PricingOcupaAntecipaVO ocupacao = new GP_PricingOcupaAntecipaVO(); ocupacao.setPricingocupaantecipaId(ocupacaoAntecipa.getPricingocupaantecipaId()); ocupacao.setDias(ocupacaoAntecipa.getCantdiasmin() + "-" + cantdiasmax); ocupacao.setDiaMin(ocupacaoAntecipa.getCantdiasmin()); int linhaMax = cantdiasmax.equals(GP_PricingOcupaAntecipaVO.CANTDIASMAXDEFAULT) ? ocupacaoAntecipa.getCantdiasmin() + 10 : cantdiasmax; if(linhaMax > GP_PricingOcupaAntecipaVO.CANTDIASMAXDEFAULT) { linhaMax = GP_PricingOcupaAntecipaVO.CANTDIASMAXDEFAULT; } ocupacao.setDiaMax(linhaMax); if(ocupacaoAntecipa.getOcupacioninicial() != null && ocupacaoAntecipa.getOcupacionfinal() != null) { ocupacao.setOcupMin(ocupacaoAntecipa.getOcupacioninicial().intValue()); ocupacao.setOcupMax(ocupacaoAntecipa.getOcupacionfinal().intValue()); } else if(ocupacaoAntecipa.getCantasientosmin() != null && ocupacaoAntecipa.getCantasientosmax() != null) { ocupacao.setOcupMin(ocupacaoAntecipa.getCantasientosmin().intValue()); ocupacao.setOcupMax(ocupacaoAntecipa.getCantasientosmax().intValue()); } ocupacao.setCor(ocupacaoAntecipa.getCor()); ocupacao.setPercentual(ocupacaoAntecipa.getPorcentaje()); ocupacao.marcarPoltronas(); aux.add(ocupacao); } Collections.sort(aux, new Comparator() { @Override public int compare(GP_PricingOcupaAntecipaVO o1, GP_PricingOcupaAntecipaVO o2) { int retorno = o1.getDiaMin().compareTo(o2.getDiaMax()); return retorno; } }); List retorno = new ArrayList(); for (GP_PricingOcupaAntecipaVO pricingOcupacaoAntecipa : aux) { retorno.addAll(gerarDados(pricingOcupacaoAntecipa)); } retorno = agruparMesmoDias(retorno); if(retorno.size() >= 3) { retorno.get(retorno.size() - 2).setAuxDesc("..."); } if(retorno.size() >= 2) { retorno.get(retorno.size() - 1).setAuxDesc(GP_PricingOcupaAntecipaVO.CANTDIASMAXDEFAULT.toString()); } return retorno; } private List agruparMesmoDias(List lsOcupacaoAntecipas) { List retorno = new ArrayList(); for (GP_PricingOcupaAntecipaVO pricingOcupacaoAntecipa : lsOcupacaoAntecipas) { GP_PricingOcupaAntecipaVO aux = new GP_PricingOcupaAntecipaVO(pricingOcupacaoAntecipa, true); if(retorno.isEmpty() || !retorno.contains(aux)) { retorno.add(aux); } else { int index = retorno.indexOf(pricingOcupacaoAntecipa); retorno.get(index).getPoltronas().addAll(aux.getPoltronas()); } } adicionarPoltronasNaoMarcadas(retorno); return retorno; } private void adicionarPoltronasNaoMarcadas(List lsRetorno) { for (GP_PricingOcupaAntecipaVO pricingOcupacaoAntecipa : lsRetorno) { List poltronasPadrao = GP_PricingOcupaAntecipaPoltronasVO.carregarPoltronasPadrao(); poltronasPadrao.removeAll(pricingOcupacaoAntecipa.getPoltronas()); pricingOcupacaoAntecipa.getPoltronas().addAll(poltronasPadrao); Collections.sort(pricingOcupacaoAntecipa.getPoltronas(), new Comparator() { @Override public int compare(GP_PricingOcupaAntecipaPoltronasVO o1, GP_PricingOcupaAntecipaPoltronasVO o2) { return o1.getPoltrona().compareTo(o2.getPoltrona()); } }); } } private List gerarDados(GP_PricingOcupaAntecipaVO ocupacao) { List retorno = new ArrayList(); for (int i = ocupacao.getDiaMin(); i <= ocupacao.getDiaMax(); i++) { GP_PricingOcupaAntecipaVO pricingOcupacao = new GP_PricingOcupaAntecipaVO(ocupacao); pricingOcupacao.setAntecipacao(i); retorno.add(pricingOcupacao); } return retorno; } @Override public List carregarPricingOcupaAntecipaLegenda(Integer pricingId) { List lsPricingOcupaAntecipa = carregarPricingOcupaAntecipa(pricingId); return carregarPricingOcupaAntecipaLegenda(lsPricingOcupaAntecipa); } @Override public List carregarPricingOcupaAntecipaLegenda(List lsPricingOcupaAntecipa) { NumberFormat nf = NumberFormat.getPercentInstance(); nf.setMaximumFractionDigits(2); nf.setMinimumFractionDigits(2); GP_PricingOcupaAntecipaLegendaVO legendaDias = new GP_PricingOcupaAntecipaLegendaVO(); GP_PricingOcupaAntecipaLegendaVO legendaPercentuais = new GP_PricingOcupaAntecipaLegendaVO(); legendaDias.setLegenda(Labels.getLabel("editarPricingController.legenda.label")); legendaDias.setItens(new ArrayList()); legendaPercentuais.setItens(new ArrayList()); for (GP_PricingOcupaAntecipa ocupaAntecipa : lsPricingOcupaAntecipa) { Integer cantdiasmax = ocupaAntecipa.getCantdiasmax() != null ? ocupaAntecipa.getCantdiasmax() : GP_PricingOcupaAntecipaVO.CANTDIASMAXDEFAULT; String dias = ocupaAntecipa.getCantdiasmin() + "-" + cantdiasmax; GP_PricingOcupaAtencipaLegendaItemVO auxDias = legendaDias.new GP_PricingOcupaAtencipaLegendaItemVO(dias, nf.format(ocupaAntecipa.getPorcentaje().doubleValue()/100), ocupaAntecipa.getCor(), dias, ocupaAntecipa.getPricingocupaantecipaId()); GP_PricingOcupaAtencipaLegendaItemVO auxPercentual = legendaDias.new GP_PricingOcupaAtencipaLegendaItemVO(nf.format(ocupaAntecipa.getPorcentaje().doubleValue()/100), nf.format(ocupaAntecipa.getPorcentaje().doubleValue()/100), ocupaAntecipa.getCor(), dias, ocupaAntecipa.getPricingocupaantecipaId()); if(!legendaDias.getItens().contains(auxDias)) { legendaDias.getItens().add(auxDias); legendaPercentuais.getItens().add(auxPercentual); } } List retorno = new ArrayList(); retorno.add(legendaDias); retorno.add(legendaPercentuais); return retorno; } @Override public GP_PricingOcupaAntecipa obtenerID(Integer pricingocupaantecipaId) throws BusinessException { return pricingOcupacionDAO.obtenerID(pricingocupaantecipaId); } @Override public List carregarPricingOcupaAntecipa(Integer pricingId) { return pricingOcupacionDAO.buscarOcupaAntecipaPricingAtivos(pricingId); } @Override public List obtenerTodoPorPricing(GP_Pricing pricing) { return pricingOcupacionDAO.obtenerTodoPorPricing(pricing); } }