package net.conselldemallorca.helium.core.model.dao;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import net.conselldemallorca.helium.core.model.dto.DocumentDto;
import net.conselldemallorca.helium.core.model.dto.PersonaDto;
import net.conselldemallorca.helium.core.model.exception.PluginException;
import net.conselldemallorca.helium.core.model.hibernate.Expedient;
import net.conselldemallorca.helium.core.model.hibernate.Portasignatures;
import net.conselldemallorca.helium.core.model.hibernate.Portasignatures.TipusEstat;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.integracio.plugins.portasignatures.DocumentPortasignatures;
import net.conselldemallorca.helium.integracio.plugins.portasignatures.PasSignatura;
import net.conselldemallorca.helium.integracio.plugins.portasignatures.PortasignaturesPlugin;
import net.conselldemallorca.helium.integracio.plugins.portasignatures.PortasignaturesPluginException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Component;
/**
* Dao per accedir a la funcionalitat del plugin del portasignatures.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Component
public class PluginPortasignaturesDao extends HibernateGenericDao<Portasignatures, Long> {
private PortasignaturesPlugin portasignaturesPlugin;
public PluginPortasignaturesDao() {
super(Portasignatures.class);
}
public Integer uploadDocument(
DocumentDto document,
List<DocumentDto> annexos,
PersonaDto persona,
List<PersonaDto> personesPas1,
int minSignatarisPas1,
List<PersonaDto> personesPas2,
int minSignatarisPas2,
List<PersonaDto> personesPas3,
int minSignatarisPas3,
Expedient expedient,
String importancia,
Date dataLimit) throws Exception {
try {
return getPortasignaturesPlugin().uploadDocument(
getDocumentPortasignatures(document, expedient),
getAnnexosPortasignatures(annexos, expedient),
false,
getPassesSignatura(
getSignatariIdPerPersona(persona),
personesPas1,
minSignatarisPas1,
personesPas2,
minSignatarisPas2,
personesPas3,
minSignatarisPas3),
expedient.getIdentificador(),
importancia,
dataLimit);
} catch (PortasignaturesPluginException ex) {
logger.error("Error al enviar el document al portasignatures", ex);
throw new PluginException("Error al enviar el document al portasignatures", ex);
}
}
public void deleteDocuments(
List<Integer> documentIds) throws PluginException {
try {
getPortasignaturesPlugin().deleteDocuments(documentIds);
} catch (PortasignaturesPluginException ex) {
logger.error("Error al eliminar el document al portasignatures", ex);
throw new PluginException("Error al eliminar el document al portasignatures", ex);
}
}
public List<byte[]> obtenirSignaturesDocument(
Integer documentId) throws Exception {
try {
return getPortasignaturesPlugin().obtenirSignaturesDocument(
documentId);
} catch (PortasignaturesPluginException ex) {
//logger.error("Error al rebre el document del portasignatures", ex);
throw new PluginException("Error al rebre el document del portasignatures", ex);
}
}
@SuppressWarnings("unchecked")
public Portasignatures findByDocument(Integer id) {
List<Portasignatures> list = getSession().
createQuery(
"from " +
" Portasignatures p " +
"where " +
" p.documentId=?").
setInteger(0, id).
list();
if (list.size() > 0)
return list.get(0);
return null;
}
@SuppressWarnings("unchecked")
public List<Portasignatures> findPendents() {
return getSession()
.createCriteria(getPersistentClass())
.add(Restrictions.ne("estat", TipusEstat.SIGNAT))
.add(Restrictions.ne("estat", TipusEstat.REBUTJAT))
.list();
}
@SuppressWarnings("unchecked")
public List<Portasignatures> findPendentsPerProcessInstanceId(
String processInstanceId) {
List<Portasignatures> psignas = getSession()
.createCriteria(getPersistentClass())
.add(Restrictions.eq("processInstanceId", processInstanceId))
.list();
Iterator<Portasignatures> it = psignas.iterator();
while (it.hasNext()) {
Portasignatures psigna = it.next();
if ( !TipusEstat.PENDENT.equals(psigna.getEstat()) &&
!TipusEstat.SIGNAT.equals(psigna.getEstat()) &&
!TipusEstat.REBUTJAT.equals(psigna.getEstat()) &&
!TipusEstat.ERROR.equals(psigna.getEstat())) {
it.remove();
}
}
return psignas;
}
@SuppressWarnings("unchecked")
public List<Portasignatures> findAmbErrorsPerExpedientId(
Long expedientId) {
return getSession()
.createCriteria(getPersistentClass())
.add(Restrictions.eq("expedient.id", expedientId))
.add(Restrictions.eq("estat", TipusEstat.ERROR))
.list();
}
@SuppressWarnings("rawtypes")
private PortasignaturesPlugin getPortasignaturesPlugin() {
if (portasignaturesPlugin == null) {
String pluginClass = GlobalProperties.getInstance().getProperty("app.portasignatures.plugin.class");
if ((pluginClass != null) && (pluginClass.length() > 0)) {
try {
Class clazz = Class.forName(pluginClass);
portasignaturesPlugin = (PortasignaturesPlugin)clazz.newInstance();
} catch (Exception ex) {
logger.error("No s'ha pogut crear la instància del plugin de portasignatures", ex);
throw new PluginException("No s'ha pogut crear la instància del plugin de portasignatures", ex);
}
}
}
return portasignaturesPlugin;
}
private DocumentPortasignatures getDocumentPortasignatures(
DocumentDto document,
Expedient expedient) {
DocumentPortasignatures documentPs = new DocumentPortasignatures();
documentPs.setTitol(
expedient.getIdentificador() + ": " + document.getDocumentNom());
documentPs.setArxiuNom(document.getVistaNom());
documentPs.setArxiuContingut(document.getVistaContingut());
documentPs.setTipus(document.getTipusDocPortasignatures());
documentPs.setSignat(document.isSignat());
documentPs.setReference(document.getId().toString());
return documentPs;
}
private List<DocumentPortasignatures> getAnnexosPortasignatures(
List<DocumentDto> annexos,
Expedient expedient) {
if (annexos == null)
return null;
List<DocumentPortasignatures> resposta = new ArrayList<DocumentPortasignatures>();
for (DocumentDto document: annexos)
resposta.add(getDocumentPortasignatures(document, expedient));
return resposta;
}
private PasSignatura[] getPassesSignatura(
String signatariId,
List<PersonaDto> personesPas1,
int minSignatarisPas1,
List<PersonaDto> personesPas2,
int minSignatarisPas2,
List<PersonaDto> personesPas3,
int minSignatarisPas3) {
if (personesPas1 != null && personesPas1.size() > 0) {
List<PasSignatura> passes = new ArrayList<PasSignatura>();
PasSignatura pas = new PasSignatura();
List<String> signataris = getSignatariIdsPerPersones(personesPas1);
pas.setSignataris(signataris.toArray(new String[signataris.size()]));
pas.setMinSignataris(minSignatarisPas1);
passes.add(pas);
if (personesPas2 != null && personesPas2.size() > 0) {
pas = new PasSignatura();
signataris = getSignatariIdsPerPersones(personesPas2);
pas.setSignataris(signataris.toArray(new String[signataris.size()]));
pas.setMinSignataris(minSignatarisPas2);
passes.add(pas);
}
if (personesPas3 != null && personesPas3.size() > 0) {
pas = new PasSignatura();
signataris = getSignatariIdsPerPersones(personesPas3);
pas.setSignataris(signataris.toArray(new String[signataris.size()]));
pas.setMinSignataris(minSignatarisPas3);
passes.add(pas);
}
return passes.toArray(new PasSignatura[passes.size()]);
} else if (signatariId != null) {
PasSignatura[] passes = new PasSignatura[1];
PasSignatura pas = new PasSignatura();
pas.setMinSignataris(1);
pas.setSignataris(new String[] {signatariId});
passes[0] = pas;
return passes;
} else {
PasSignatura[] passes = new PasSignatura[0];
return passes;
}
}
private List<String> getSignatariIdsPerPersones(List<PersonaDto> persones) {
List<String> signatariIds = new ArrayList<String>();
for (PersonaDto persona: persones) {
String signatariId = getSignatariIdPerPersona(persona);
if (signatariId != null)
signatariIds.add(signatariId);
}
return signatariIds;
}
private String getSignatariIdPerPersona(PersonaDto persona) {
if (persona == null)
return null;
String signatariId = persona.getDni();
if (isIdUsuariPerCodi())
signatariId = persona.getCodi();
if (isIdUsuariPerDni())
signatariId = persona.getDni();
return signatariId;
}
private boolean isIdUsuariPerDni() {
return "dni".equalsIgnoreCase(GlobalProperties.getInstance().getProperty("app.portasignatures.plugin.usuari.id"));
}
private boolean isIdUsuariPerCodi() {
return "codi".equalsIgnoreCase(GlobalProperties.getInstance().getProperty("app.portasignatures.plugin.usuari.id"));
}
private static final Log logger = LogFactory.getLog(PluginPortasignaturesDao.class);
}