package com.rjconsultores.ventaboletos.service.impl; import java.math.BigDecimal; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.rjconsultores.ventaboletos.constantes.Constantes; import com.rjconsultores.ventaboletos.dao.ComissaoDAO; import com.rjconsultores.ventaboletos.entidad.PtovtaComissao; import com.rjconsultores.ventaboletos.enums.IndStatusBoleto; import com.rjconsultores.ventaboletos.service.CalculoComissaoService; import com.rjconsultores.ventaboletos.service.PtovtaComissaoService; import com.rjconsultores.ventaboletos.utilerias.DateUtil; import com.rjconsultores.ventaboletos.vo.comissao.BoletoComissao; import com.rjconsultores.ventaboletos.vo.comissao.RegistroCalculo; @Service("calculoComissaoService") public class CalculoComissaoServiceImpl implements CalculoComissaoService { private static final Logger log = LoggerFactory.getLogger(CalculoComissaoServiceImpl.class); @Autowired private PtovtaComissaoService ptovtaComissaoService; @Autowired private ComissaoDAO comissaoDAO; public void buscaParametrosComissao(Integer puntoVentaId, Integer empresaId, Date periodo) { PtovtaComissao ptovtaComissao = ptovtaComissaoService.buscarPuntaVentaEmpresa(puntoVentaId, empresaId); List receitas = comissaoDAO.buscarReceitasComissoes(puntoVentaId, empresaId, periodo); Calendar calendario = Calendar.getInstance(); calendario.setTime(periodo); int ultimodia = calendario.getActualMaximum(Calendar.DAY_OF_MONTH); int mes = calendario.get(Calendar.MONTH) + 1; int ano = calendario.get(Calendar.YEAR); List registros = calculaReceitaComissao(ptovtaComissao, receitas, ultimodia, mes, ano); for (RegistroCalculo rc : registros) { // Inicialmente só será validado os calculos de comissão em baixa temporada BigDecimal cem = BigDecimal.TEN.multiply(BigDecimal.TEN); // Comissão BPR = Receita Comissão * (% Com BPR) BigDecimal comissaoBPR = BigDecimal.ZERO; comissaoBPR = rc.getReceitaBPR().multiply(ptovtaComissao.getPassagemBaixa().divide(cem)); rc.setComissaoBPR(comissaoBPR); // Comissão Excesso = Receita Excesso Bagagem * (% Com. Exc. Bag) BigDecimal comissaoExcessoBagagem = BigDecimal.ZERO; comissaoExcessoBagagem = rc.getReceitaExcessoBagagem().multiply(ptovtaComissao.getExcessoBaixa().divide(cem)); rc.setComissaoExcessoBagagem(comissaoExcessoBagagem); // Comissão Seg. Opcional = Receita Seguro Opcional * (% Com. Seg. Pol) BigDecimal comissaoSegOpcional = BigDecimal.ZERO; comissaoSegOpcional = rc.getReceitaSeguroOpcional().multiply(ptovtaComissao.getSeguroBaixa().divide(cem)); rc.setComissaoSegOpcional(comissaoSegOpcional); // Comissão à pagar = Comissão BPR + Comissão Excesso Bagagem + Comissão Seg. Opcional // + Bonificação Metas + Internet(EntregaPassagem) // - Descontos (Fixos e Eventuais) - Royaties - ISS retido BigDecimal comissaoPagar = BigDecimal.ZERO; comissaoPagar = comissaoBPR.add(comissaoExcessoBagagem).add(comissaoSegOpcional).add(comissaoSegOpcional); rc.setComissaoPagar(comissaoPagar); log.info(rc.toString()); } // BigDecimal descontos; // BigDecimal royaties; // BigDecimal retidoISS; // BigDecimal bonificacao; } private List calculaReceitaComissao(PtovtaComissao ptovtaComissao, List receitas, Integer ultimodia, Integer mes, Integer ano) { List registros = new ArrayList(); for (int dia = 1; dia < ultimodia; dia++) { List list = verificaCalculoComissaoProDia(receitas, dia, mes); Calendar dataRegistro = Calendar.getInstance(); dataRegistro.set(Calendar.DAY_OF_MONTH, dia); dataRegistro.set(Calendar.MONTH, mes - 1); dataRegistro.set(Calendar.YEAR, ano); RegistroCalculo rc = new RegistroCalculo(); rc.setData(dataRegistro.getTime()); BigDecimal receitaComissao = BigDecimal.ZERO; BigDecimal receitaBPR = BigDecimal.ZERO; BigDecimal receitaGAP = BigDecimal.ZERO; BigDecimal internet = BigDecimal.ZERO; BigDecimal receitaExcessoBagagem = BigDecimal.ZERO; BigDecimal receitaSeguroOpcional = BigDecimal.ZERO; BigDecimal receitaSeguroOutros = BigDecimal.ZERO; BigDecimal cancelados = BigDecimal.ZERO; BigDecimal devolvidos = BigDecimal.ZERO; BigDecimal devolvidosOrigem = BigDecimal.ZERO; BigDecimal canceladosGAP = BigDecimal.ZERO; BigDecimal devolvidosGAP = BigDecimal.ZERO; BigDecimal devolvidosGAPOrigem = BigDecimal.ZERO; BigDecimal gapImpressa = BigDecimal.ZERO; int contImpressa = 0; for (BoletoComissao rcc : list) { BigDecimal receitaItem = BigDecimal.ZERO; BigDecimal receitaDevItem = BigDecimal.ZERO; // Totais if (ptovtaComissao.getTarifaReceita()) { receitaItem = receitaItem.add(rcc.getValorpagado()); } if (ptovtaComissao.getTaxaReceita()) { receitaItem = receitaItem.add(rcc.getEmbarque()); } if (ptovtaComissao.getSeguroReceita()) { receitaItem = receitaItem.add(rcc.getSeguro()); } if (ptovtaComissao.getPedagioReceita()) { receitaItem = receitaItem.add(rcc.getPedagio()); } // Totais de Devolução / Cancelamento if (ptovtaComissao.getTarifaDev()) { receitaDevItem = receitaDevItem.add(rcc.getValorpagado()); } if (ptovtaComissao.getTaxaDev()) { receitaDevItem = receitaDevItem.add(rcc.getEmbarque()); } if (ptovtaComissao.getSeguroDev()) { receitaDevItem = receitaDevItem.add(rcc.getSeguro()); } if (ptovtaComissao.getPedagioDev()) { receitaDevItem = receitaDevItem.add(rcc.getPedagio()); } if (rcc.getMotivoCancelacionId() == null) { IndStatusBoleto statusBoleto = IndStatusBoleto.valueOf(rcc.getIndstatusboleto()); // Boletos impressos no punto venta if (statusBoleto.equals(IndStatusBoleto.E)) { contImpressa++; gapImpressa = gapImpressa.add(receitaItem); } else { // Receitas calculadas sempre receitaExcessoBagagem = receitaExcessoBagagem.add(rcc.getExcessoBagagem()); receitaSeguroOpcional = receitaSeguroOpcional.add(rcc.getSeguroOpcional()); receitaSeguroOutros = receitaSeguroOutros.add(rcc.getSeguroOutros()); // Receita GAP if (rcc.getTipoVenta().equals(Constantes.TPV_BOLETO_REMOTO.intValue())) { receitaGAP = receitaGAP.add(receitaItem); } // Internet else if (rcc.getTipoVenta().equals(Constantes.TPV_POR_INTERNET.intValue())) { internet = internet.add(receitaItem); } // Receita BPR else { receitaBPR = receitaBPR.add(receitaItem); } } } else { // Cancelamento Receita if (rcc.getMotivoCancelacionId().equals(Constantes.MVO_CANCEL_CANCELACION)) { // Cancelamento Receita GAP if (rcc.getTipoVenta().equals(Constantes.TPV_BOLETO_REMOTO.intValue())) { canceladosGAP = canceladosGAP.add(receitaDevItem); } else { cancelados = cancelados.add(receitaDevItem); } } // Devolução Receita if (rcc.getMotivoCancelacionId().equals(Constantes.MVO_CANCEL_DEVOLUCAO)) { // Devolução Receita GAP if (rcc.getTipoVenta().equals(Constantes.TPV_BOLETO_REMOTO.intValue())) { // Impresso Venta de otro punto venta if (rcc.isPtoVtaOrigem()) { devolvidosGAPOrigem = devolvidosGAPOrigem.add(receitaDevItem); } devolvidosGAP = devolvidosGAP.add(receitaDevItem); } else { // Impresso Venta de otro punto venta if (rcc.isPtoVtaOrigem()) { devolvidosOrigem = devolvidosOrigem.add(receitaDevItem); } devolvidos = devolvidos.add(receitaDevItem); } } } } rc.setCancelados(cancelados); rc.setCanceladosGAP(canceladosGAP); rc.setDevolvidos(devolvidos); rc.setDevolvidosGAP(devolvidosGAP); rc.setDevolucoesOrigem(devolvidosOrigem); rc.setDevolucoesOrigemGAP(devolvidosGAPOrigem); rc.setReceitaBPR(receitaBPR); rc.setReceitaExcessoBagagem(receitaExcessoBagagem); rc.setReceitaGAP(receitaGAP); rc.setReceitaSeguroOpcional(receitaSeguroOpcional); rc.setInternet(internet); rc.setGapImpressa(gapImpressa); rc.setContImpressa(contImpressa); // Receita Comissão = Receita BPR + Receita GAP - GapImpressa - Internet - Cancelados - Devoluções Origem - Cancelados GAP - Devoluções GAP Origem - Devoluções - Devoluções GAP receitaComissao = receitaComissao.add(receitaBPR).add(receitaGAP); receitaComissao = receitaComissao.add(gapImpressa.negate()).add(internet.negate()).add(cancelados.negate()); receitaComissao = receitaComissao.add(devolvidosOrigem.negate()).add(devolvidos.negate()).add(canceladosGAP.negate()); receitaComissao = receitaComissao.add(devolvidosGAPOrigem.negate()).add(devolvidosGAP.negate()); rc.setReceitaComissao(receitaComissao); registros.add(rc); } return registros; } private List verificaCalculoComissaoProDia(List list, Integer dia, Integer mes) { List aux = new ArrayList(); for (BoletoComissao rcc : list) { try { Calendar calendario = Calendar.getInstance(); calendario.setTime(DateUtil.getDateFromString(rcc.getDatavenda(), "dd-MM-yyyy")); int diaItem = calendario.get(Calendar.DAY_OF_MONTH); int mesItem = calendario.get(Calendar.MONTH) + 1; if (dia.equals(diaItem) && mes.equals(mesItem)) { aux.add(rcc); } } catch (ParseException e) { log.error("ERRO - ao converter data", e); } } return aux; } }