package br.com.caelum.stella.gateway.pagseguro;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import br.com.caelum.stella.gateway.core.BigDecimalFormatter;
import br.com.caelum.stella.gateway.core.CalendarFormatter;
import br.com.caelum.stella.gateway.core.EnumComCodigoFinder;
import br.com.caelum.stella.gateway.core.IntegrationHandler;
/**
* Classe para montar o retorno baseado na requisição do PagSeguro.
*
* @author Alberto Pc
*
*/
public class PagSeguroVerificaRetornoAutorizacao implements
IntegrationHandler<PagSeguroAutorizacaoReturn> {
private HttpServletRequest request;
private PagSeguroVerificadorRetorno verificadorRetorno;
private PagSeguroDadosConfiguracao dadosConfiguracao;
private final RemoverAcentos removedorAcentos = new RemoverAcentos();
public PagSeguroVerificaRetornoAutorizacao(HttpServletRequest request,
PagSeguroVerificadorRetorno pagSeguroVerificadorRetorno,
PagSeguroDadosConfiguracao dadosConfiguracao) {
this.request = request;
this.verificadorRetorno = pagSeguroVerificadorRetorno;
this.dadosConfiguracao = dadosConfiguracao;
}
public PagSeguroVerificaRetornoAutorizacao(HttpServletRequest request,
PagSeguroVerificadorRetorno verificadorRetorno) {
this(request, verificadorRetorno, new PagSeguroDadosConfiguracao());
}
public PagSeguroAutorizacaoReturn handle() {
// TODO Auto-generated method stub
String transacaoId = request.getParameter("TransacaoID");
if (transacaoId != null && !"".equals(transacaoId)) {
if (verificadorRetorno
.verificaSeRetornoFoiEnviadoPelaPagSeguro(dadosConfiguracao)) {
String emailVendedor = request.getParameter("VendedorEmail");
String referencia = request.getParameter("Referencia");
EnumComCodigoFinder enumFinder = new EnumComCodigoFinder();
PagSeguroTipoFrete tipoFrete = enumFinder
.descobreAEnumPeloCodigo(PagSeguroTipoFrete.class,
request.getParameter("TipoFrete"));
BigDecimal valorTotalFrete = transformaValorComVirgulaParaBigDecimal(request
.getParameter("ValorFrete"));
String anotacao = request.getParameter("Anotacao");
Calendar dataTransacao = new CalendarFormatter()
.stringToCalendar(
request.getParameter("DataTransacao"),
"dd/MM/yyyy HH:mm:ss");
PagSeguroTipoPagamento tipoPagamento = enumFinder
.descobreAEnumPeloCodigo(PagSeguroTipoPagamento.class,
removeAcentoEDeixarComLetraMaiscula(request
.getParameter("TipoPagamento")));
PagSeguroStatusTransacao statusTransacao = enumFinder
.descobreAEnumPeloCodigo(
PagSeguroStatusTransacao.class,
removeAcentoEDeixarComLetraMaiscula(request
.getParameter("StatusTransacao")));
PagSeguroDadosCliente dadosCliente = criarDadosCliente();
int numeroItens = Integer.valueOf(request
.getParameter("NumItens"));
Collection<PagSeguroItem> itens = montaItensDoCarrinho(numeroItens);
PagSeguroCheckout checkout = new PagSeguroCheckout(referencia,
tipoFrete, dadosCliente, itens);
PagSeguroAutorizacaoReturn autorizacaoReturn = new PagSeguroAutorizacaoReturn(
dadosConfiguracao, transacaoId, checkout,
valorTotalFrete, anotacao, dataTransacao,
tipoPagamento, statusTransacao);
return autorizacaoReturn;
} else {
throw new PagSeguroRequisicaoInvalidaException(
"Provavelmente foi realizada uma requisição maliciosa para aprovar a compra ");
}
}
throw new NaoEhRoboPagSeguroException("A requisição foi feita a partir do browser.");
}
private Collection<PagSeguroItem> montaItensDoCarrinho(int numeroItens) {
Collection<PagSeguroItem> itens = new ArrayList<PagSeguroItem>();
for (int i = 1; i <= numeroItens; i++) {
PagSeguroItem item = new PagSeguroItem(request
.getParameter("ProdID_" + i), request
.getParameter("ProdDescricao_" + i), Integer
.valueOf(request.getParameter("ProdQuantidade_" + i)),
new BigDecimalFormatter().stringInCentsToBigDecimal(request
.getParameter("ProdValor_" + i)),
transformaValorComVirgulaParaBigDecimal(request
.getParameter("ProdFrete_" + i)),
transformaValorComVirgulaParaBigDecimal(request
.getParameter("ProdExtras_" + i)));
itens.add(item);
}
return itens;
}
private PagSeguroDadosCliente criarDadosCliente() {
String[] telefoneCompletoComDDD = request.getParameter("CliTelefone")
.split(" ");
return new PagSeguroDadosCliente(request.getParameter("CliCEP"),
request.getParameter("CliCidade"), request
.getParameter("CliEndereco"), request
.getParameter("CliNome"), request
.getParameter("CliEstado"), request
.getParameter("CliNumero"), request
.getParameter("CliComplemento"), request
.getParameter("CliBairro"), telefoneCompletoComDDD[0],
telefoneCompletoComDDD[1], request.getParameter("CliEmail"));
}
private BigDecimal transformaValorComVirgulaParaBigDecimal(String valor) {
return new BigDecimal(valor.replace(",", ".")).setScale(
BigDecimalFormatter.SCALE, BigDecimalFormatter.ROUNDING_MODE);
}
private String removeAcentoEDeixarComLetraMaiscula(String valor) {
return removedorAcentos.remover(valor).toUpperCase();
}
}