/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.edu.ifnmg.RetornoPagSeguro.Application;
import br.com.uol.pagseguro.domain.AccountCredentials;
import br.com.uol.pagseguro.domain.Transaction;
import br.com.uol.pagseguro.domain.TransactionSearchResult;
import br.com.uol.pagseguro.domain.TransactionSummary;
import br.com.uol.pagseguro.enums.TransactionStatus;
import br.com.uol.pagseguro.exception.PagSeguroServiceException;
import br.com.uol.pagseguro.service.*;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Inscricao;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.InscricaoItem;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.InscricaoStatus;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Lancamento;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.LancamentoStatus;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.PagSeguroPerfil;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.InscricaoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.LancamentoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.PagSeguroPerfilRepositorio;
import br.edu.ifnmg.RetornoPagSeguro.DataAccess.InscricaoDAO;
import br.edu.ifnmg.RetornoPagSeguro.DataAccess.LancamentoDAO;
import br.edu.ifnmg.RetornoPagSeguro.DataAccess.PagSeguroPerfilDAO;
import java.util.Date;
import java.util.List;
/**
*
* @author petronio
*/
public class PagSeguroService {
LancamentoRepositorio lancDAO = new LancamentoDAO();
InscricaoRepositorio inscDAO = new InscricaoDAO();
LogServiceImpl log = new LogServiceImpl();
public void Sincronizar(Date dataInicio, Date dataFim) throws PagSeguroServiceException {
PagSeguroPerfilRepositorio perfDAO = new PagSeguroPerfilDAO();
List<PagSeguroPerfil> perfis = perfDAO.Buscar();
int sucesso = 0;
int erro = 0;
for (PagSeguroPerfil perfil : perfis) {
AccountCredentials cred = new AccountCredentials(
perfil.getEmail(),
perfil.getToken(),
perfil.getTokenSandbox());
TransactionSearchResult res = TransactionSearchService.searchByDate(cred, dataFim, dataInicio, 1, 5000);
for (TransactionSummary t : res.getTransactionSummaries()) {
try {
Long id = Long.parseLong(t.getReference());
Lancamento l = lancDAO.Abrir(id);
if (l != null) {
if (l.getStatus() == LancamentoStatus.AguardandoConfirmacao || l.getStatus() == LancamentoStatus.Aberto) {
l.setTransacaoPagSeguro(t.getCode());
LancamentoStatus s = ConverteStatus(t.getStatus());
l = AtualizaLancamento(l, s);
if (lancDAO.Salvar(l)) {
sucesso++;
//log.Append("Atualizando lançamento " + l.getId().toString() + " no PagSeguro. Situacção: " + t.getStatus());
} else {
erro++;
log.Append("Falha ao atualizar lançamento " + l.getId().toString() + " no PagSeguro. Situacção: " + t.getStatus());
}
}
}
} catch(Exception e){
erro++;
log.Append("Falha ao atualizar lançamento " + t.getReference() + ", " + t.getPaymentLink());
}
}
}
log.Append("Final da atualização de lançamentos no PagSeguro: Sucessos: " + sucesso + " . Falhas: " + erro);
}
public LancamentoStatus receber(Lancamento l) throws Exception {
Transaction transaction = null;
if (l.getInscricoes().isEmpty()) {
throw new Exception("Sem inscrições associadas!");
}
Inscricao i = l.getInscricoes().get(0);
AccountCredentials cred = new AccountCredentials(
i.getEvento().getPagSeguroPerfil().getEmail(),
i.getEvento().getPagSeguroPerfil().getToken(),
i.getEvento().getPagSeguroPerfil().getTokenSandbox());
transaction = TransactionSearchService.searchByCode(cred, l.getTransacaoPagSeguro());
return ConverteStatus(transaction.getStatus());
}
protected LancamentoStatus ConverteStatus(TransactionStatus s) {
switch (s) {
case CANCELLED:
case CONTESTATION:
case IN_DISPUTE:
return LancamentoStatus.Cancelado;
case PAID:
case AVAILABLE:
return LancamentoStatus.Baixado;
case INITIATED:
case IN_ANALYSIS:
case WAITING_PAYMENT:
default:
return LancamentoStatus.AguardandoConfirmacao;
}
}
protected Lancamento AtualizaLancamento(Lancamento l, LancamentoStatus s) {
switch (s) {
default:
case AguardandoConfirmacao:
return l;
case Baixado:
l.baixar(l.getCliente());
for (Inscricao i : l.getInscricoes()) {
i.setStatus(InscricaoStatus.Confirmada);
i.setPago(true);
for (InscricaoItem it : i.getItens()) {
i.setStatus(InscricaoStatus.Confirmada);
i.setPago(true);
}
inscDAO.Salvar(i);
}
return l;
case Cancelado:
l.cancelar(l.getCliente());
for (Inscricao i : l.getInscricoes()) {
i.setStatus(InscricaoStatus.Criada);
i.setPago(false);
for (InscricaoItem it : i.getItens()) {
i.setStatus(InscricaoStatus.Criada);
i.setPago(false);
}
inscDAO.Salvar(i);
}
return l;
}
}
}