Entao, ai esta o bloco da verificacao…
// o ultimo pacote aberto eh fechado
pacotePedido.setNro(nroPacote + "");
pacotePedido.setPesoTotal(pesoParcial);
log.debug("Fechado ultimo pacote:" + nroPacote);
pacotes.add(pacotePedido);
BigDecimal freteParcial = calcularFretePacote(trans, pacotes, pedido);
log.debug("Frete parcial (sem taxa veiculos):" + freteParcial);
// calculo a taxa de entrega da veiculos
BigDecimal taxaEntregaveiculos = new BigDecimal(controle.getTaxaEntrega());
BigDecimal valorFreteveiculos = freteParcial.multiply(taxaEntregaveiculos);
log.debug("Valor frete veiculos:" + valorFreteveiculos);
BigDecimal freteTotal = new BigDecimal(freteParcial.doubleValue() + valorFreteveiculos.doubleValue(), mc);
log.debug("Total do frete:" + freteTotal);
log.debug("Saiu de calcularFrete(...)");
return freteTotal;
} finally {
em.close();
trans = null;
itnsPedido = null;
it = null;
itemTmp = null;
produto = null;
pacotes.clear();
pacotePedido = null;
controle = null;
}
}
private PacotePedidoHelper fechaPacote(int nro, Produto produto, long qtde,
double peso, BigDecimal precoItemPedido) {
log.debug("FechaPacote:" + nro);
log.debug("Total do peso do pacote:" + peso);
PacotePedidoHelper pacotePedido = new PacotePedidoHelper();
BigDecimal valorTotalPacote = new BigDecimal(0);
for (int i = 0; i < qtde; i++) {
pacotePedido.getProdutosPacote().add(produto);
valorTotalPacote = valorTotalPacote.add(precoItemPedido);
}
pacotePedido.setPesoTotal(peso);
pacotePedido.setNro(nro + "");
pacotePedido.setValorTotalProdutos(valorTotalPacote);
return pacotePedido;
}
/**
* Calcula o frete do pacote para a transportadora, cep, estado e peso
* @param trans
* @param ra
* @param pacotes
* @return
*/
private BigDecimal calcularFretePacote(Transportadora trans, ArrayList<PacotePedidoHelper> pacotes, Pedido pedido) throws TransportadoraPrecoNotFoundException {
BigDecimal valorFrete = new BigDecimal(0);
BigDecimal totalFrete = new BigDecimal(0);
Iterator<PacotePedidoHelper> it;
log.debug("Entrou em calcularFretePacote()");
try {
it = pacotes.iterator();
log.debug("Qtde de pacotes:" + pacotes.size());
PacotePedidoHelper pph;
while (it.hasNext()) {
pph = it.next();
log.debug("Nro do pacote:" + pph.getNro());
log.debug("Peso do pacote:" + pph.getPesoTotal());
log.debug("Valor do pacote:" + pph.getValorTotalProdutos());
log.debug("Qtde produtos no pacote:" + pph.getProdutosPacote().size());
//TransportadoraPreco tp = buscaTP(trans, ra.getRegiao(), pph.getPesoTotal());
TransportadoraPreco tp = calcularEntrega(trans, pph.getPesoTotal(), pedido.getEntregaEstado().getUnidfed(), pedido.getEntregaCep());
BigDecimal frete = tp.getValor();
log.debug("Frete=" + frete);
BigDecimal tarifa = calculaTarifa(trans.getTransportadorTarifaCollection(), pph.getPesoTotal(), pph.getValorTotalProdutos());
log.debug("Tarifa=" + tarifa);
valorFrete = frete.add(tarifa);
pph.setFrete(valorFrete);
log.debug("valorFrete=" + valorFrete);
log.debug("totalFrete antes =" + totalFrete);
totalFrete = totalFrete.add(valorFrete);
log.debug("totalFrete depois =" + totalFrete);
}
log.debug("Saiu de calcularFretePacote(...)");
return totalFrete;
} finally {
it = null;
valorFrete = null;
}
}
/**
* Calcula o valor da entrega para os dados informados
* @param trans
* @param peso
* @param estado
* @param cep
* @return
* @throws br.com.veiculos.ecommerce.exception.TransportadoraPrecoNotFoundException
*/
private TransportadoraPreco calcularEntrega(Transportadora trans, double peso, String estado, String cep) throws TransportadoraPrecoNotFoundException {
log.debug("Entrou em calcularEntrega(" + trans.getCodTransport() + "," + peso + ")");
EntityManager em = this.jpaResourceBean.getEMF().createEntityManager();
String cep5caracter = cep.toString();
long cepBusca = Long.parseLong(cep5caracter.substring(0, 5));
log.debug("Cep Busca: "+cepBusca);
try {
Query query = em.createQuery("SELECT t FROM TransportadoraPreco t, RegiaoAbrangencia ra " +
" WHERE " +
" ra.transportador = :transp AND " +
" ((ra.tipoAtendimento = 'E' AND ra.estadual = :estado) OR " +
" (ra.tipoAtendimento = 'M' AND ra.cepInicial <= :cep AND ra.cepFinal >= :cep)) AND " +
" t.regiao = ra.regiao AND " +
" t.transportadora = ra.transportador AND " +
" t.pesoAte >= :peso " +
" ORDER BY t.pesoAte").setParameter("estado", estado).setParameter("cep", cepBusca).setParameter("transp", trans).setParameter("peso", peso).setMaxResults(1);
TransportadoraPreco tp = (TransportadoraPreco) query.getResultList().get(0);
log.debug("Preco encontrado:" + tp.getValor());
this.prazoEntrega = tp.getRegiaoTrans().getPrazoEntrega();
log.debug("Prazo encontrado:" + this.prazoEntrega);
log.debug("Saiu de calcularEntrega");
return tp;
} catch (java.lang.IndexOutOfBoundsException e) {
throw new TransportadoraPrecoNotFoundException("Nao foi encontrado preco para a transportadora:" + trans.getCodTransport() + ", estado:" + estado + ", cep:" + cep + ", peso:" + peso + " informados!");
} finally {
em.close();
}
}
/**
* Calcula a tarifa da transportadora para o valor e peso informados
* @param transportadorTarifaCollection colecao de tarifas da transportadora
* @param peso Peso total do pedido
* @param totalPedido Valor total do pedido
* @return
*/
private BigDecimal calculaTarifa(Set<TransportadorTarifa> transportadorTarifaCollection, double peso, BigDecimal totalPedido) {
log.debug("Entrou em calculaTarifa");
BigDecimal tarifa = new BigDecimal(0.0);
Iterator<TransportadorTarifa> it = transportadorTarifaCollection.iterator();
TransportadorTarifa tt = null;
TarifaEntrega te = null;
BigDecimal aux = new BigDecimal(0.0);
BigDecimal qtde = new BigDecimal(0);
MathContext mc = new MathContext(2);
while (it.hasNext()) {
tt = it.next();
te = tt.getCodTarifa();
// verificando as condicoes e calculando a tarifa
log.debug("Cod. Tarifa:" + te.getCodTarifa());
log.debug("Tipo Tarifa:" + te.getTipoTarifa());
log.debug("Qdo Cobrar:" + te.getQdoCobrar() + " Igual a 'S'?-" + te.getQdoCobrar().equalsIgnoreCase("S"));
log.debug("Valor Fixo:" + te.getValorFixo().doubleValue());
log.debug("Valor total do pedido:" + totalPedido.doubleValue());
/** nao cobra tarifa */
if (te.getTipoTarifa().equalsIgnoreCase("F")) {
if (te.getQdoCobrar().equalsIgnoreCase("V")) {
if (totalPedido.doubleValue() > te.getValorMaiorQue().doubleValue()) {
aux = te.getValorFixo();
}
/* */
} else if (te.getQdoCobrar().equalsIgnoreCase("S")) {
aux = te.getValorFixo();
} else if (te.getQdoCobrar().equalsIgnoreCase("K")) {
qtde = new BigDecimal(peso / te.getKilos().doubleValue());
qtde = qtde.round(mc);
log.debug("Qtde arredondada: " + qtde);
aux = qtde.multiply(te.getValorFixo());
}
// começo da verificacao do codigo para pac e sedex 1% e 0.5 %
} else if (te.getTipoTarifa().equalsIgnoreCase("P")) {
if (te.getQdoCobrar().equalsIgnoreCase("V")) {
if (totalPedido.doubleValue() > te.getValorMaiorQue().doubleValue()) {
aux = te.getPorcentagemTotal().divide(new BigDecimal(100)).multiply(totalPedido);
}
} else if (te.getQdoCobrar().equalsIgnoreCase("S")) {
aux = te.getPorcentagemTotal().divide(new BigDecimal(100)).multiply(totalPedido);
} else if (te.getQdoCobrar().equalsIgnoreCase("K")) {
qtde = new BigDecimal(peso / te.getKilos().doubleValue());
qtde = qtde.round(mc);
log.debug("Qtde arredondada: " + qtde);
aux = qtde.multiply(te.getPorcentagemTotal().divide(new BigDecimal(100)).multiply(totalPedido));
}
}
// fica com o valor maior
log.debug("tarifa=" + tarifa + " e aux=" + aux);
if (aux.doubleValue() > tarifa.doubleValue()) {
tarifa = aux;
}
}
log.debug("Saiu de calculaTarifa");
return tarifa;
}
/** Busca a regiao do frete a ser calculado
* @param trans Transportadora da regiao
* @param estado
* @param cep
* @return
* @throws Exception
* @throws Exception
* @deprecated
*/
@Deprecated
private RegiaoAbrangencia buscaRA(Transportadora trans, String estado, String cep) throws RegiaoAbrangenciaNotFoundException {
log.debug("Entrou em buscaRA");
EntityManager em = this.jpaResourceBean.getEMF().createEntityManager();
RegiaoAbrangencia ra = null;
long cepPedido;
try {
cepPedido = Long.parseLong(cep);
} catch (Exception e) {
cepPedido = FormatacaoHelper.recuperaValorNumericoCep(cep);
}
try {
// tratando o estado, caso seja nullo
if (estado == null) {
log.debug("Procurando estado do cep:" + cep);
Query query = em.createNamedQuery("EstadoFaixa.recuperaEstado").setParameter("cep", Long.parseLong(cep));
EstadoFaixa ef = (EstadoFaixa) query.getSingleResult();
estado = ef.getSigla();
log.debug("Estado=" + estado);
}
log.debug("buscando a RegiaoAbrangencia");
Query query = em.createNamedQuery("RegiaoAbrangencia.recuperaRA").setParameter("transportadora", trans).setParameter("estado", estado).setParameter("cep", cepPedido);
log.debug("RegiaoAbrangencia buscada!");
if (query == null) {
log.debug("A query eh nula");
}
try {
ra = (RegiaoAbrangencia) query.getSingleResult();
} catch (javax.persistence.NonUniqueResultException e) {
ra = (RegiaoAbrangencia) query.getResultList().get(0);
}
log.debug("Saiu de buscaRA");
} catch (javax.persistence.NoResultException e) {
log.warn("Nao foi encontrada o RegiaoAbrangencia para transportadora=" + trans.getCodTransport() + " estado=" + estado + " ou cep=" + cep);
throw new RegiaoAbrangenciaNotFoundException(trans.getCodTransport());
} finally {
em.close();
}
return ra;
}
}
é neste bloco q faz a verificacao…