Skip to content

Commit

Permalink
Merge pull request #81 from shipping7/cancelar-objeto-plp#79
Browse files Browse the repository at this point in the history
Possibilita cancelar um objeto da PLP pelo SDK
  • Loading branch information
ericdallo authored Jul 3, 2017
2 parents 4490384 + 8b3e549 commit 2b27b1e
Show file tree
Hide file tree
Showing 14 changed files with 488 additions and 63 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
version=0.0.18-BETA
version=0.0.19-BETA
87 changes: 39 additions & 48 deletions src/main/java/br/com/correios/api/postagem/CorreiosPostagemApi.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
package br.com.correios.api.postagem;

import static java.lang.String.format;

import com.google.common.base.Optional;

import br.com.correios.api.exception.CorreiosServicoSoapException;
import br.com.correios.api.postagem.cliente.ClienteEmpresa;
import br.com.correios.api.postagem.cliente.ClienteRetornadoDosCorreiosToClienteConverter;
import br.com.correios.api.postagem.cliente.ContratoEmpresa;
import br.com.correios.api.postagem.exception.CorreiosPostagemAutenticacaoException;
import br.com.correios.api.postagem.exception.ObjetoPlpFoiPostadoException;
import br.com.correios.api.postagem.exception.ObjetoPlpInexistenteOuJaFoiCanceladoException;
import br.com.correios.api.postagem.exception.ObjetoPlpJaFoiCanceladoException;
import br.com.correios.api.postagem.plp.CorreiosLogToPlpDocumentoConverter;
import br.com.correios.api.postagem.plp.DocumentoPlp;
import br.com.correios.api.postagem.webservice.CorreiosClienteApi;
import br.com.correios.api.postagem.plp.ObjetoPostado;
import br.com.correios.api.postagem.webservice.CorreiosClienteWebService;
import br.com.correios.api.postagem.xml.Correioslog;
import br.com.correios.api.postagem.xml.XmlPlpParser;
import br.com.correios.credentials.CorreiosCredenciais;
import br.com.correios.webservice.postagem.AutenticacaoException;
import br.com.correios.webservice.postagem.ClienteERP;
import br.com.correios.webservice.postagem.SigepClienteException;

/**
* Responsavel por chamar a API de postagem dos Correios
Expand All @@ -27,64 +23,59 @@
*/
public class CorreiosPostagemApi {

private final CorreiosCredenciais credenciais;
private final CorreiosClienteApi clienteApi;
private final CorreiosServicoPostagemAPI correiosServicoPostagemAPI;

public CorreiosPostagemApi(CorreiosCredenciais credenciais) {
this(credenciais, new CorreiosClienteWebService());
}

public CorreiosPostagemApi(CorreiosCredenciais credenciais, CorreiosClienteApi clienteApi) {
this.credenciais = credenciais;
this.clienteApi = clienteApi;
this.correiosServicoPostagemAPI = new SoapCorreiosServicoPostagemAPI(credenciais, new CorreiosClienteWebService(), new ClienteRetornadoDosCorreiosToClienteConverter(), new XmlPlpParser(), new CorreiosLogToPlpDocumentoConverter());
}

/**
* @return os serviços disponíveis no contrato para um determinado {@link ContratoEmpresa} caso haja.
*/
public Optional<ClienteEmpresa> buscaCliente(ContratoEmpresa informacoesDeCadastro) {
try {
ClienteERP clienteRetornadoDosCorreios = clienteApi
.getCorreiosWebService()
.buscaCliente(informacoesDeCadastro.getContrato(), informacoesDeCadastro.getCartaoDePostagem(), credenciais.getUsuario(), credenciais.getSenha());

if (clienteRetornadoDosCorreios != null) {
ClienteEmpresa cliente = new ClienteRetornadoDosCorreiosToClienteConverter().convert(clienteRetornadoDosCorreios);
return Optional.of(cliente);
}
} catch (AutenticacaoException e) {
throw new CorreiosPostagemAutenticacaoException(format("Ocorreu um erro ao se autenticar nos correios com a seguinte credencial: %s", credenciais));
} catch (SigepClienteException e) {
throw new CorreiosServicoSoapException(format("Ocorreu um erro ao chamar o serviço com as informações de cliente %s", informacoesDeCadastro), e);
} catch (Exception e) {
return Optional.absent();
}
return Optional.absent();
return correiosServicoPostagemAPI.buscaCliente(informacoesDeCadastro);
}

public Optional<DocumentoPlp> buscaDocumentoPlp(Long plpId) {
return correiosServicoPostagemAPI.buscaDocumentoPlp(plpId);
}

/**
* Cancela um objeto de uma PLP atraves do ID da PLP e o numero da etiqueta
* do objeto
* @param plpId da PLP que possui o objeto a ser cancelado
* @param numeroEtiqueta relacionada ao objeto a ser cancelado
* @throws ObjetoPlpFoiPostadoException se o objeto foi postado, por isso o mesmo nao pode ser cancelado
* @throws ObjetoPlpJaFoiCanceladoException se o objeto ja foi cancelado
* @throws ObjetoPlpInexistenteOuJaFoiCanceladoException se o objeto nao existe ou ja esta expirado ou ja foi cancelado, os detalhes vao vir na causa dessa exception
*/
public void cancelaObjetoDaPlp(Long plpId, String numeroEtiqueta) throws ObjetoPlpFoiPostadoException, ObjetoPlpJaFoiCanceladoException, ObjetoPlpInexistenteOuJaFoiCanceladoException {
try {
String xmlPlp = clienteApi
.getCorreiosWebService()
.solicitaXmlPlp(plpId, credenciais.getUsuario(), credenciais.getSenha());
correiosServicoPostagemAPI.cancelaObjetoDaPlp(plpId, numeroEtiqueta);
} catch (CorreiosServicoSoapException exceptionCancelamento) {

boolean xmlPlpDosCorreiosEstaValido = xmlPlp != null && !xmlPlp.isEmpty();
try {
Optional<ObjetoPostado> objeto = correiosServicoPostagemAPI.buscaDocumentoPlp(plpId, numeroEtiqueta)
.transform(documentoPlp -> documentoPlp.getObjetoPostadoComEtiqueta(numeroEtiqueta))
.or(Optional.<ObjetoPostado>absent());

if (xmlPlpDosCorreiosEstaValido) {
Optional<Correioslog> correiosPlp = new XmlPlpParser().convert(xmlPlp);
if (objeto.isPresent()) {

if (correiosPlp.isPresent()) {
return new CorreiosLogToPlpDocumentoConverter().convert(correiosPlp.get());
if (objeto.get().isPostado()) {
throw new ObjetoPlpFoiPostadoException(String.format("objeto com etiqueta %s da PLP %d nao pode ser cancelado porque este foi postado", numeroEtiqueta, plpId), exceptionCancelamento);
}

if (objeto.get().isCancelado()) {
throw new ObjetoPlpJaFoiCanceladoException(String.format("objeto com etiqueta %s da PLP %d ja foi cancelado", numeroEtiqueta, plpId), exceptionCancelamento);
}
}

} catch (CorreiosServicoSoapException exceptionBusca) {
throw new ObjetoPlpInexistenteOuJaFoiCanceladoException(String.format("objeto com etiqueta %s da PLP %d não foi encontrado ou ja foi cancelado", numeroEtiqueta, plpId), exceptionBusca);
}
} catch (AutenticacaoException e) {
throw new CorreiosPostagemAutenticacaoException(format("Ocorreu um erro ao se autenticar nos correios com a seguinte credencial: %s", credenciais));
} catch (SigepClienteException e) {
throw new CorreiosServicoSoapException(format("Ocorreu um erro ao chamar o serviço com o PLP de id %d", plpId), e);
} catch (Exception e) {
return Optional.absent();

throw exceptionCancelamento;
}
return Optional.absent();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package br.com.correios.api.postagem;

import com.google.common.base.Optional;

import br.com.correios.api.postagem.cliente.ClienteEmpresa;
import br.com.correios.api.postagem.cliente.ContratoEmpresa;
import br.com.correios.api.postagem.plp.DocumentoPlp;

public interface CorreiosServicoPostagemAPI {

Optional<ClienteEmpresa> buscaCliente(ContratoEmpresa contratoEmpresa);

Optional<DocumentoPlp> buscaDocumentoPlp(Long plpId);

Optional<DocumentoPlp> buscaDocumentoPlp(Long plpId, String etiqueta);

boolean cancelaObjetoDaPlp(Long plpId, String numeroEtiqueta);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package br.com.correios.api.postagem;

import static java.lang.String.format;

import com.google.common.base.Optional;

import br.com.correios.api.converter.Converter;
import br.com.correios.api.exception.CorreiosServicoSoapException;
import br.com.correios.api.postagem.cliente.ClienteEmpresa;
import br.com.correios.api.postagem.cliente.ContratoEmpresa;
import br.com.correios.api.postagem.exception.CorreiosPostagemAutenticacaoException;
import br.com.correios.api.postagem.plp.DocumentoPlp;
import br.com.correios.api.postagem.webservice.CorreiosClienteApi;
import br.com.correios.api.postagem.xml.Correioslog;
import br.com.correios.api.postagem.xml.XmlPlpParser;
import br.com.correios.credentials.CorreiosCredenciais;
import br.com.correios.webservice.postagem.AutenticacaoException;
import br.com.correios.webservice.postagem.ClienteERP;
import br.com.correios.webservice.postagem.Exception_Exception;
import br.com.correios.webservice.postagem.SigepClienteException;

class SoapCorreiosServicoPostagemAPI implements CorreiosServicoPostagemAPI {

private final CorreiosClienteApi clienteApi;
private final CorreiosCredenciais credenciais;
private final Converter<ClienteERP, ClienteEmpresa> clienteEmpresaConverter;
private final XmlPlpParser xmlPlpParser;
private final Converter<Correioslog, Optional<DocumentoPlp>> documentoPlpConverter;

SoapCorreiosServicoPostagemAPI(CorreiosCredenciais credenciais,
CorreiosClienteApi clienteApi,
Converter<ClienteERP, ClienteEmpresa> clienteEmpresaConverter,
XmlPlpParser xmlPlpParser,
Converter<Correioslog, Optional<DocumentoPlp>> documentoPlpConverter) {

this.credenciais = credenciais;
this.clienteApi = clienteApi;
this.clienteEmpresaConverter = clienteEmpresaConverter;
this.xmlPlpParser = xmlPlpParser;
this.documentoPlpConverter = documentoPlpConverter;
}

@Override
public Optional<ClienteEmpresa> buscaCliente(ContratoEmpresa contratoEmpresa) {
try {
ClienteERP clienteRetornadoDosCorreios = clienteApi.getCorreiosWebService().buscaCliente(contratoEmpresa.getContrato(), contratoEmpresa.getCartaoDePostagem(), credenciais.getUsuario(), credenciais.getSenha());

return Optional.fromNullable(clienteRetornadoDosCorreios)
.transform(clienteEmpresaConverter::convert)
.transform(Optional::of)
.or(Optional.<ClienteEmpresa>absent());

} catch (AutenticacaoException e) {
throw new CorreiosPostagemAutenticacaoException(format("Ocorreu um erro ao se autenticar nos correios com a seguinte credencial: %s", credenciais));
} catch (SigepClienteException e) {
throw new CorreiosServicoSoapException(format("Ocorreu um erro ao chamar o servico com as informacoes de cliente %s", contratoEmpresa), e);
}
}

@Override
public Optional<DocumentoPlp> buscaDocumentoPlp(Long plpId) {
try {
String xmlPlp = clienteApi.getCorreiosWebService().solicitaXmlPlp(plpId, credenciais.getUsuario(), credenciais.getSenha());

boolean xmlPlpDosCorreiosEstaValido = xmlPlp != null && !xmlPlp.isEmpty();

if (xmlPlpDosCorreiosEstaValido) {
return xmlPlpParser.convert(xmlPlp)
.transform(documentoPlpConverter::convert)
.or(Optional.<DocumentoPlp>absent());
}
} catch (AutenticacaoException e) {
throw new CorreiosPostagemAutenticacaoException(format("Ocorreu um erro ao se autenticar nos correios com a seguinte credencial: %s", credenciais));
} catch (SigepClienteException e) {
throw new CorreiosServicoSoapException(format("Ocorreu um erro ao chamar o servico com o PLP de id %d", plpId), e);
}

return Optional.absent();
}

@Override
public Optional<DocumentoPlp> buscaDocumentoPlp(Long plpId, String etiqueta) {
try {
String xmlPlp = clienteApi.getCorreiosWebService().solicitaPLP(plpId, etiqueta, credenciais.getUsuario(), credenciais.getSenha());

boolean xmlPlpDosCorreiosEstaValido = xmlPlp != null && !xmlPlp.isEmpty();

if (xmlPlpDosCorreiosEstaValido) {
return xmlPlpParser.convert(xmlPlp)
.transform(documentoPlpConverter::convert)
.or(Optional.<DocumentoPlp>absent());
}
} catch (AutenticacaoException e) {
throw new CorreiosPostagemAutenticacaoException(format("Ocorreu um erro ao se autenticar nos correios com a seguinte credencial: %s", credenciais));
} catch (SigepClienteException e) {
throw new CorreiosServicoSoapException(format("Ocorreu um erro ao chamar o servico com o PLP de id %d", plpId), e);
}

return Optional.absent();
}

@Override
public boolean cancelaObjetoDaPlp(Long plpId, String numeroEtiqueta) {
try {
return clienteApi.getCorreiosWebService().cancelarObjeto(plpId, numeroEtiqueta, credenciais.getUsuario(), credenciais.getSenha());
} catch (AutenticacaoException e) {
throw new CorreiosPostagemAutenticacaoException(format("Ocorreu um erro ao se autenticar nos correios com a seguinte credencial: %s", credenciais));
} catch (Exception_Exception | SigepClienteException e) {
throw new CorreiosServicoSoapException(format("Ocorreu um erro ao chamar o servico com o PLP de id %d, etiqueta %s", plpId, numeroEtiqueta), e);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import javax.xml.datatype.XMLGregorianCalendar;

import br.com.correios.api.converter.Converter;
import br.com.correios.api.postagem.cartao.StatusDoCartaoDaPostagem;
import br.com.correios.api.postagem.contrato.Contrato;
import br.com.correios.api.postagem.contrato.ContratoWebServiceToContratoCorreiosConverter;
Expand All @@ -15,8 +16,9 @@
import br.com.correios.webservice.postagem.ContratoERP;
import br.com.correios.webservice.postagem.GerenteConta;

public class ClienteRetornadoDosCorreiosToClienteConverter {
public class ClienteRetornadoDosCorreiosToClienteConverter implements Converter<ClienteERP, ClienteEmpresa> {

@Override
public ClienteEmpresa convert(ClienteERP clienteRetornadoDosCorreios) {
XMLGregorianCalendar dataDeAtualizacaoNosCorreios = clienteRetornadoDosCorreios.getDataAtualizacao();
Calendar dataDeAtualizacaoDoCliente = null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package br.com.correios.api.postagem.exception;

public class ObjetoPlpFoiPostadoException extends RuntimeException {

private static final long serialVersionUID = -3328326631056241491L;

public ObjetoPlpFoiPostadoException(String mensagem, Exception exceptionCancelamento) {
super(mensagem, exceptionCancelamento);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package br.com.correios.api.postagem.exception;

public class ObjetoPlpInexistenteOuJaFoiCanceladoException extends RuntimeException {

private static final long serialVersionUID = 8708529032418284246L;

public ObjetoPlpInexistenteOuJaFoiCanceladoException(String mensagem, Exception exception) {
super(mensagem, exception);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package br.com.correios.api.postagem.exception;

public class ObjetoPlpJaFoiCanceladoException extends RuntimeException {

private static final long serialVersionUID = -6940355031846418834L;

public ObjetoPlpJaFoiCanceladoException(String mensagem, Exception exceptionCancelamento) {
super(mensagem, exceptionCancelamento);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@

import com.google.common.base.Optional;

import br.com.correios.api.converter.Converter;
import br.com.correios.api.postagem.remetente.RemetenteDaPostagem;
import br.com.correios.api.postagem.remetente.RemetenteDosCorreiosToRemetenteConverter;
import br.com.correios.api.postagem.xml.Correioslog;
import br.com.correios.api.postagem.xml.DadosPlp;
import br.com.correios.api.postagem.xml.ObjetoPostal;
import br.com.correios.api.postagem.xml.Remetente;

public class CorreiosLogToPlpDocumentoConverter {
public class CorreiosLogToPlpDocumentoConverter implements Converter<Correioslog, Optional<DocumentoPlp>> {

@Override
public Optional<DocumentoPlp> convert(Correioslog correioslog) {
DadosPlp plpDosCorreios = correioslog.getPlp();
if (plpDosCorreios == null) {
Expand Down
16 changes: 10 additions & 6 deletions src/main/java/br/com/correios/api/postagem/plp/ObjetoPostado.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@ public class ObjetoPostado {
private String dataDaPostagemNoSistemaSara;

/**
* Contém o STATUS do processamento do objeto, deverá ser enviado a informação com valor igual a "0" pelos Correios.
* Contem o status do processamento do objeto
*
* Preenchimento não obrigatório.
*/
private boolean processado;
private StatusProcessamento statusProcessamento;

/**
* Contém o numero de comprovante de postagem.
Expand All @@ -97,7 +97,7 @@ public class ObjetoPostado {
public ObjetoPostado(String numeroEtiqueta, String codigoDeControleDoObjetoDoCliente,
String codigoDoServicoDePostagem, MedidasDoObjetoPostado medidas, ObservacoesDoCliente observacoesDoCliente,
DestinatarioDoObjeto destinatario, DadosDeEntrega dadosDeEntrega, ServicoAdicionalDoObjeto servicoAdicional,
DimensoesDoObjeto dimensaoObjeto, String dataDaPostagemNoSistemaSara, boolean processado,
DimensoesDoObjeto dimensaoObjeto, String dataDaPostagemNoSistemaSara, StatusProcessamento statusProcessamento,
String numeroDoComprovanteDePostagem, String valorCobrado) {
this.numeroEtiqueta = numeroEtiqueta;
this.codigoDeControleDoObjetoDoCliente = codigoDeControleDoObjetoDoCliente;
Expand All @@ -109,7 +109,7 @@ public ObjetoPostado(String numeroEtiqueta, String codigoDeControleDoObjetoDoCli
this.servicoAdicional = servicoAdicional;
this.dimensaoObjeto = dimensaoObjeto;
this.dataDaPostagemNoSistemaSara = dataDaPostagemNoSistemaSara;
this.processado = processado;
this.statusProcessamento = statusProcessamento;
this.numeroDoComprovanteDePostagem = numeroDoComprovanteDePostagem;
this.valorCobrado = valorCobrado;
}
Expand Down Expand Up @@ -154,8 +154,12 @@ public String getDataDaPostagemNoSistemaSara() {
return dataDaPostagemNoSistemaSara;
}

public boolean isProcessado() {
return processado;
public boolean isPostado() {
return statusProcessamento == StatusProcessamento.POSTADO;
}

public boolean isCancelado() {
return statusProcessamento == StatusProcessamento.CANCELADO;
}

public String getNumeroDoComprovanteDePostagem() {
Expand Down
Loading

0 comments on commit 2b27b1e

Please sign in to comment.