AdmMono/src/com/rjconsultores/ventaboletos/service/impl/CalculoComissaoServiceImpl....

283 lines
9.9 KiB
Java
Raw Blame History

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<BoletoComissao> 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<RegistroCalculo> registros = calculaReceitaComissao(ptovtaComissao, receitas, ultimodia, mes, ano);
for (RegistroCalculo rc : registros) {
// Inicialmente s<> ser<65> validado os calculos de comiss<73>o em baixa temporada
BigDecimal cem = BigDecimal.TEN.multiply(BigDecimal.TEN);
// Comiss<73>o BPR = Receita Comiss<73>o * (% Com BPR)
BigDecimal comissaoBPR = BigDecimal.ZERO;
comissaoBPR = rc.getReceitaBPR().multiply(ptovtaComissao.getPassagemBaixa().divide(cem));
rc.setComissaoBPR(comissaoBPR);
// Comiss<73>o Excesso = Receita Excesso Bagagem * (% Com. Exc. Bag)
BigDecimal comissaoExcessoBagagem = BigDecimal.ZERO;
comissaoExcessoBagagem = rc.getReceitaExcessoBagagem().multiply(ptovtaComissao.getExcessoBaixa().divide(cem));
rc.setComissaoExcessoBagagem(comissaoExcessoBagagem);
// Comiss<73>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<73>o <20> pagar = Comiss<73>o BPR + Comiss<73>o Excesso Bagagem + Comiss<73>o Seg. Opcional
// + Bonifica<63><61>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<RegistroCalculo> calculaReceitaComissao(PtovtaComissao ptovtaComissao, List<BoletoComissao> receitas, Integer ultimodia, Integer mes, Integer ano) {
List<RegistroCalculo> registros = new ArrayList<RegistroCalculo>();
for (int dia = 1; dia < ultimodia; dia++) {
List<BoletoComissao> 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<6C><75>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<6C><75>o Receita
if (rcc.getMotivoCancelacionId().equals(Constantes.MVO_CANCEL_DEVOLUCAO)) {
// Devolu<6C><75>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<73>o = Receita BPR + Receita GAP - GapImpressa - Internet - Cancelados - Devolu<6C><75>es Origem - Cancelados GAP - Devolu<6C><75>es GAP Origem - Devolu<6C><75>es - Devolu<6C><75>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<BoletoComissao> verificaCalculoComissaoProDia(List<BoletoComissao> list, Integer dia, Integer mes) {
List<BoletoComissao> aux = new ArrayList<BoletoComissao>();
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;
}
}