package net.conselldemallorca.helium.integracio.plugins.registre;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import es.caib.regweb.ws.model.ErrorEntrada;
import es.caib.regweb.ws.model.ErrorSalida;
import es.caib.regweb.ws.model.ListaResultados;
import es.caib.regweb.ws.model.ParametrosRegistroEntradaWS;
import es.caib.regweb.ws.model.ParametrosRegistroSalidaWS;
import es.caib.regweb.ws.services.regwebfacade.RegwebFacadeServiceLocator;
import es.caib.regweb.ws.services.regwebfacade.RegwebFacade_PortType;
/**
* Implementació del plugin de registre per a la interficie de
* serveis web del registre de la CAIB.
*
* @author Limit Tecnologies <limit@limit.es>
*/
public class RegistrePluginRegwebWs implements RegistrePlugin {
private static final String SEPARADOR_ENTITAT = "-";
private static final String SEPARADOR_NUMERO = "/";
public RespostaAnotacioRegistre registrarEntrada(
RegistreEntrada registreEntrada) throws RegistrePluginException {
try {
Date ara = new Date();
ParametrosRegistroEntradaWS paramsws = new ParametrosRegistroEntradaWS();
paramsws.setUsuarioConexion(getUsuarioConexion());
paramsws.setPassword(getPassword());
paramsws.setUsuarioRegistro(getUsuariRegistre());
paramsws.setDataentrada(new SimpleDateFormat("dd/MM/yyyy").format(ara));
paramsws.setHora(new SimpleDateFormat("HH:mm").format(ara));
if (registreEntrada.getDadesOficina() != null) {
String oficinaCodi = registreEntrada.getDadesOficina().getOficinaCodi();
if (oficinaCodi != null) {
int indexBarra = oficinaCodi.indexOf(SEPARADOR_ENTITAT);
if (indexBarra != -1) {
paramsws.setOficina(oficinaCodi.substring(0, indexBarra));
paramsws.setOficinafisica(oficinaCodi.substring(indexBarra + 1));
}
}
if (registreEntrada.getDadesOficina().getOrganCodi() != null)
paramsws.setDestinatari(
registreEntrada.getDadesOficina().getOrganCodi());
}
if (registreEntrada.getDadesInteressat() != null) {
String entitatCodi = registreEntrada.getDadesInteressat().getEntitatCodi();
if (entitatCodi != null) {
int indexBarra = entitatCodi.indexOf(SEPARADOR_ENTITAT);
if (indexBarra != -1) {
paramsws.setEntidad1(entitatCodi.substring(0, indexBarra));
paramsws.setEntidad2(entitatCodi.substring(indexBarra + 1));
paramsws.setEntidadCastellano(paramsws.getEntidad1());
}
}
if (registreEntrada.getDadesInteressat().getNomAmbCognoms() != null)
paramsws.setAltres(
registreEntrada.getDadesInteressat().getNomAmbCognoms());
if (registreEntrada.getDadesInteressat().getMunicipiCodi() != null)
paramsws.setBalears(
registreEntrada.getDadesInteressat().getMunicipiCodi());
if (registreEntrada.getDadesInteressat().getMunicipiNom() != null)
paramsws.setFora(
registreEntrada.getDadesInteressat().getMunicipiNom());
}
if (registreEntrada.getDadesAssumpte() != null) {
if (registreEntrada.getDadesAssumpte().getTipus() != null)
paramsws.setTipo(
registreEntrada.getDadesAssumpte().getTipus());
if (registreEntrada.getDadesAssumpte().getRegistreNumero() != null) {
paramsws.setSalida1(
registreEntrada.getDadesAssumpte().getRegistreNumero());
paramsws.setSalida2(
registreEntrada.getDadesAssumpte().getRegistreAny());
}
if (registreEntrada.getDadesAssumpte().getIdiomaCodi() != null)
paramsws.setIdioex(
convertirIdioma(registreEntrada.getDadesAssumpte().getIdiomaCodi()));
if (registreEntrada.getDadesAssumpte().getAssumpte() != null)
paramsws.setComentario(
registreEntrada.getDadesAssumpte().getAssumpte());
}
if (registreEntrada.getDocuments() != null && registreEntrada.getDocuments().size() > 0) {
if (registreEntrada.getDocuments().size() == 1) {
DocumentRegistre document = registreEntrada.getDocuments().get(0);
paramsws.setData(
new SimpleDateFormat("dd/MM/yyyy").format(document.getData()));
paramsws.setIdioma(
convertirIdioma(document.getIdiomaCodi()));
} else {
throw new RegistrePluginException("Nomes es pot registrar un document alhora");
}
} else {
throw new RegistrePluginException("S'ha d'especificar algun document per registrar");
}
ParametrosRegistroEntradaWS respostaValidacio = getRegistreService().validarEntrada(paramsws);
if (respostaValidacio.getValidado()) {
ParametrosRegistroEntradaWS respostaGrabacio = getRegistreService().grabarEntrada(paramsws);
RespostaAnotacioRegistre resposta = new RespostaAnotacioRegistre();
if (respostaGrabacio.getRegistroGrabado()) {
resposta.setErrorCodi(RespostaAnotacioRegistre.ERROR_CODI_OK);
resposta.setNumero(
respostaGrabacio.getNumeroEntrada() +
SEPARADOR_NUMERO +
respostaGrabacio.getAnoEntrada());
resposta.setData(ara);
return resposta;
} else {
throw new RegistrePluginException("No s'ha pogut guardar l'entrada");
}
} else {
StringBuilder sb = new StringBuilder();
sb.append("Errors de validació:\n");
if (respostaValidacio.getErrores() != null) {
for (ErrorEntrada error: respostaValidacio.getErrores().getErrores()) {
sb.append(" | [" + error.getCodigo() + "] " + error.getDescripcion());
}
}
throw new RegistrePluginException("S'han produit errors de validació de l'entrada: " + sb.toString());
}
} catch (Exception ex) {
logger.error("Error al registrar l'entrada", ex);
throw new RegistrePluginException("Error al registrar l'entrada", ex);
}
}
public RespostaConsulta consultarEntrada(
String organCodi,
String oficinaCodi,
String registreNumero) throws RegistrePluginException {
try {
ParametrosRegistroEntradaWS paramsws = new ParametrosRegistroEntradaWS();
paramsws.setUsuarioConexion(getUsuarioConexion());
paramsws.setPassword(getPassword());
paramsws.setUsuarioRegistro(getUsuariRegistre());
paramsws.setOficina(organCodi);
paramsws.setOficinafisica(oficinaCodi);
int index = registreNumero.indexOf(SEPARADOR_NUMERO);
if (index == -1)
throw new RegistrePluginException("El número de registre a consultar (" + registreNumero + ") no té el format correcte");
paramsws.setNumeroEntrada(registreNumero.substring(0, index));
paramsws.setAnoEntrada(registreNumero.substring(index + 1));
ParametrosRegistroEntradaWS llegit = getRegistreService().leerEntrada(paramsws);
RespostaConsulta resposta = new RespostaConsulta();
resposta.setRegistreNumero(registreNumero);
resposta.setRegistreData(new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(llegit.getDataentrada() + " " + llegit.getHora()));
DadesOficina dadesOficina = new DadesOficina();
dadesOficina.setOrganCodi(llegit.getDestinatari());
dadesOficina.setOficinaCodi(llegit.getOficina() + SEPARADOR_ENTITAT + llegit.getOficinafisica());
resposta.setDadesOficina(dadesOficina);
DadesInteressat dadesInteressat = new DadesInteressat();
if (llegit.getEntidad1() != null && !"".equals(llegit.getEntidad1()))
dadesInteressat.setEntitatCodi(
llegit.getEntidad1() + SEPARADOR_ENTITAT + llegit.getEntidad2());
dadesInteressat.setNomAmbCognoms(llegit.getAltres());
dadesInteressat.setMunicipiCodi(llegit.getBalears());
dadesInteressat.setMunicipiNom(llegit.getFora());
resposta.setDadesInteressat(dadesInteressat);
DadesAssumpte dadesAssumpte = new DadesAssumpte();
dadesAssumpte.setIdiomaCodi(llegit.getIdioex());
dadesAssumpte.setTipus(llegit.getTipo());
dadesAssumpte.setAssumpte(llegit.getComentario());
resposta.setDadesAssumpte(dadesAssumpte);
List<DocumentRegistre> documents = new ArrayList<DocumentRegistre>();
DocumentRegistre document = new DocumentRegistre();
document.setIdiomaCodi(llegit.getIdioma());
if (llegit.getData() != null)
document.setData(new SimpleDateFormat("dd/MM/yyyy").parse(llegit.getData()));
documents.add(document);
resposta.setDocuments(documents);
return resposta;
} catch (Exception ex) {
logger.error("Error al consultar l'entrada", ex);
throw new RegistrePluginException("Error al consultar l'entrada", ex);
}
}
public RespostaAnotacioRegistre registrarSortida(
RegistreSortida registreSortida) throws RegistrePluginException {
try {
Date ara = new Date();
ParametrosRegistroSalidaWS paramsws = new ParametrosRegistroSalidaWS();
paramsws.setUsuarioConexion(getUsuarioConexion());
paramsws.setPassword(getPassword());
paramsws.setUsuarioRegistro(getUsuariRegistre());
paramsws.setDatasalida(new SimpleDateFormat("dd/MM/yyyy").format(ara));
paramsws.setHora(new SimpleDateFormat("HH:mm").format(ara));
if (registreSortida.getDadesOficina() != null) {
String oficinaCodi = registreSortida.getDadesOficina().getOficinaCodi();
if (oficinaCodi != null) {
int indexBarra = oficinaCodi.indexOf(SEPARADOR_ENTITAT);
if (indexBarra != -1) {
paramsws.setOficina(oficinaCodi.substring(0, indexBarra));
paramsws.setOficinafisica(oficinaCodi.substring(indexBarra + 1));
}
}
if (registreSortida.getDadesOficina().getOrganCodi() != null)
paramsws.setRemitent(
registreSortida.getDadesOficina().getOrganCodi());
}
if (registreSortida.getDadesInteressat() != null) {
String entitatCodi = registreSortida.getDadesInteressat().getEntitatCodi();
if (entitatCodi != null) {
int indexBarra = entitatCodi.indexOf(SEPARADOR_ENTITAT);
if (indexBarra != -1) {
paramsws.setEntidad1(entitatCodi.substring(0, indexBarra));
paramsws.setEntidad2(entitatCodi.substring(indexBarra + 1));
paramsws.setEntidadCastellano(paramsws.getEntidad1());
}
}
if (registreSortida.getDadesInteressat().getNomAmbCognoms() != null)
paramsws.setAltres(
registreSortida.getDadesInteressat().getNomAmbCognoms());
if (registreSortida.getDadesInteressat().getMunicipiCodi() != null)
paramsws.setBalears(
registreSortida.getDadesInteressat().getMunicipiCodi());
if (registreSortida.getDadesInteressat().getMunicipiNom() != null)
paramsws.setFora(
registreSortida.getDadesInteressat().getMunicipiNom());
}
if (registreSortida.getDadesAssumpte() != null) {
if (registreSortida.getDadesAssumpte().getTipus() != null)
paramsws.setTipo(
registreSortida.getDadesAssumpte().getTipus());
if (registreSortida.getDadesAssumpte().getRegistreNumero() != null) {
paramsws.setEntrada1(
registreSortida.getDadesAssumpte().getRegistreNumero());
paramsws.setEntrada2(
registreSortida.getDadesAssumpte().getRegistreAny());
}
if (registreSortida.getDadesAssumpte().getIdiomaCodi() != null)
paramsws.setIdioex(
convertirIdioma(registreSortida.getDadesAssumpte().getIdiomaCodi()));
if (registreSortida.getDadesAssumpte().getAssumpte() != null)
paramsws.setComentario(
registreSortida.getDadesAssumpte().getAssumpte());
}
if (registreSortida.getDocuments() != null && registreSortida.getDocuments().size() > 0) {
if (registreSortida.getDocuments().size() == 1) {
DocumentRegistre document = registreSortida.getDocuments().get(0);
paramsws.setData(
new SimpleDateFormat("dd/MM/yyyy").format(document.getData()));
paramsws.setIdioma(
convertirIdioma(document.getIdiomaCodi()));
} else {
throw new RegistrePluginException("Nomes es pot registrar un document alhora");
}
} else {
throw new RegistrePluginException("S'ha d'especificar algun document per registrar");
}
ParametrosRegistroSalidaWS respostaValidacio = getRegistreService().validarSalida(paramsws);
if (respostaValidacio.getValidado()) {
ParametrosRegistroSalidaWS respostaGrabacio = getRegistreService().grabarSalida(paramsws);
RespostaAnotacioRegistre resposta = new RespostaAnotacioRegistre();
if (respostaGrabacio.getRegistroSalidaGrabado()) {
resposta.setErrorCodi(RespostaAnotacioRegistre.ERROR_CODI_OK);
resposta.setNumero(
respostaGrabacio.getNumeroSalida() +
SEPARADOR_NUMERO +
respostaGrabacio.getAnoSalida());
resposta.setData(ara);
return resposta;
} else {
throw new RegistrePluginException("No s'ha pogut guardar la sortida");
}
} else {
StringBuilder sb = new StringBuilder();
sb.append("Errors de validació:\n");
if (respostaValidacio.getErrores() != null) {
for (ErrorSalida error: respostaValidacio.getErrores().getErrores()) {
sb.append(" | [" + error.getCodigo() + "] " + error.getDescripcion());
}
}
throw new RegistrePluginException("S'han produit errors de validació de la sortida: " + sb.toString());
}
} catch (Exception ex) {
logger.error("Error al registrar la sortida", ex);
throw new RegistrePluginException("Error al registrar la sortida", ex);
}
}
public RespostaConsulta consultarSortida(
String organCodi,
String oficinaCodi,
String registreNumero) throws RegistrePluginException {
try {
ParametrosRegistroSalidaWS paramsws = new ParametrosRegistroSalidaWS();
paramsws.setUsuarioConexion(getUsuarioConexion());
paramsws.setPassword(getPassword());
paramsws.setUsuarioRegistro(getUsuariRegistre());
paramsws.setOficina(organCodi);
paramsws.setOficinafisica(oficinaCodi);
int index = registreNumero.indexOf(SEPARADOR_NUMERO);
if (index == -1)
throw new RegistrePluginException("El número de registre a consultar (" + registreNumero + ") no té el format correcte");
paramsws.setNumeroSalida(registreNumero.substring(0, index));
paramsws.setAnoSalida(registreNumero.substring(index + 1));
ParametrosRegistroSalidaWS llegit = getRegistreService().leerSalida(paramsws);
RespostaConsulta resposta = new RespostaConsulta();
resposta.setRegistreNumero(registreNumero);
resposta.setRegistreData(new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(llegit.getDatasalida() + " " + llegit.getHora()));
DadesOficina dadesOficina = new DadesOficina();
dadesOficina.setOrganCodi(llegit.getRemitent());
dadesOficina.setOficinaCodi(llegit.getOficina() + SEPARADOR_ENTITAT + llegit.getOficinafisica());
resposta.setDadesOficina(dadesOficina);
DadesInteressat dadesInteressat = new DadesInteressat();
if (llegit.getEntidad1() != null && !"".equals(llegit.getEntidad1()))
dadesInteressat.setEntitatCodi(
llegit.getEntidad1() + SEPARADOR_ENTITAT + llegit.getEntidad2());
dadesInteressat.setNomAmbCognoms(llegit.getAltres());
dadesInteressat.setMunicipiCodi(llegit.getBalears());
dadesInteressat.setMunicipiNom(llegit.getFora());
resposta.setDadesInteressat(dadesInteressat);
DadesAssumpte dadesAssumpte = new DadesAssumpte();
dadesAssumpte.setUnitatAdministrativa(llegit.getRemitent());
dadesAssumpte.setIdiomaCodi(llegit.getIdioex());
dadesAssumpte.setTipus(llegit.getTipo());
dadesAssumpte.setAssumpte(llegit.getComentario());
resposta.setDadesAssumpte(dadesAssumpte);
List<DocumentRegistre> documents = new ArrayList<DocumentRegistre>();
DocumentRegistre document = new DocumentRegistre();
document.setIdiomaCodi(llegit.getIdioma());
if (llegit.getData() != null)
document.setData(new SimpleDateFormat("dd/MM/yyyy").parse(llegit.getData()));
documents.add(document);
resposta.setDocuments(documents);
return resposta;
} catch (Exception ex) {
logger.error("Error al consultar la sortida", ex);
throw new RegistrePluginException("Error al consultar la sortida", ex);
}
}
public RespostaAnotacioRegistre registrarNotificacio(
RegistreNotificacio registreNotificacio) throws RegistrePluginException {
throw new RegistrePluginException("Mètode no implementat en aquest plugin");
}
public RespostaJustificantRecepcio obtenirJustificantRecepcio(
String numeroRegistre) throws RegistrePluginException {
throw new RegistrePluginException("Mètode no implementat en aquest plugin");
}
public String obtenirNomOficina(String oficinaCodi) throws RegistrePluginException {
try {
if (oficinaCodi != null) {
int indexBarra = oficinaCodi.indexOf(SEPARADOR_ENTITAT);
if (indexBarra != -1) {
ListaResultados lr = getRegistreService().buscarOficinasFisicasDescripcion(
getUsuarioConexion(),
getPassword(),
"tots",
"totes");
Iterator<String> it = Arrays.asList(lr.getResultado()).iterator();
while (it.hasNext()) {
String codiOficina = it.next();
String codiOficinaFisica = it.next();
@SuppressWarnings("unused")
String nomOficinaFisica = it.next();
String nomOficina = it.next();
String textComparacio = codiOficina + SEPARADOR_ENTITAT + codiOficinaFisica;
if (textComparacio.equals(oficinaCodi))
return nomOficina;
}
}
}
return null;
} catch (Exception ex) {
logger.error("Error al obtenir el nom de l'oficina " + oficinaCodi, ex);
throw new RegistrePluginException("Error al obtenir el nom de l'oficina " + oficinaCodi, ex);
}
}
private RegwebFacade_PortType getRegistreService() throws Exception {
String url = GlobalProperties.getInstance().getProperty("app.registre.plugin.ws.url") + "?wsdl";
RegwebFacadeServiceLocator service = new RegwebFacadeServiceLocator();
service.setRegwebFacadeEndpointAddress(url);
return service.getRegwebFacade();
}
private String getUsuariRegistre() {
String usuari = null;
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null)
usuari = auth.getName();
return usuari;
/*if (usuari != null)
return usuari;
else
return getUsuarioConexion();*/
}
private String getUsuarioConexion() {
return GlobalProperties.getInstance().getProperty("app.registre.plugin.ws.usuari");
}
private String getPassword() {
return GlobalProperties.getInstance().getProperty("app.registre.plugin.ws.password");
}
private String convertirIdioma(String iso6391) {
if ("es".equalsIgnoreCase(iso6391)) {
return "1";
} else if ("ca".equalsIgnoreCase(iso6391)) {
return "2";
} else if ("eu".equalsIgnoreCase(iso6391)) {
return "4";
} else if ("gl".equalsIgnoreCase(iso6391)) {
return "5";
} else if ("as".equalsIgnoreCase(iso6391)) {
return "6";
} else if ("de".equalsIgnoreCase(iso6391)) {
return "C";
} else if ("en".equalsIgnoreCase(iso6391)) {
return "A";
} else if ("fr".equalsIgnoreCase(iso6391)) {
return "B";
} else if ("it".equalsIgnoreCase(iso6391)) {
return "E";
} else if ("pt".equalsIgnoreCase(iso6391)) {
return "F";
}
return "2";
}
private static final Log logger = LogFactory.getLog(RegistrePluginRegwebWs.class);
}