/**
*
*/
package net.conselldemallorca.helium.core.helper;
import java.io.ByteArrayOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import net.conselldemallorca.helium.core.common.JbpmVars;
import net.conselldemallorca.helium.core.helperv26.MesuresTemporalsHelper;
import net.conselldemallorca.helium.core.model.hibernate.DefinicioProces;
import net.conselldemallorca.helium.core.model.hibernate.Document;
import net.conselldemallorca.helium.core.model.hibernate.DocumentStore;
import net.conselldemallorca.helium.core.model.hibernate.DocumentStore.DocumentFont;
import net.conselldemallorca.helium.core.model.hibernate.DocumentTasca;
import net.conselldemallorca.helium.core.model.hibernate.Expedient;
import net.conselldemallorca.helium.core.model.hibernate.FirmaTasca;
import net.conselldemallorca.helium.core.model.hibernate.Portasignatures;
import net.conselldemallorca.helium.core.model.hibernate.Portasignatures.TipusEstat;
import net.conselldemallorca.helium.core.util.DocumentTokenUtils;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.core.util.OpenOfficeUtils;
import net.conselldemallorca.helium.core.util.PdfUtils;
import net.conselldemallorca.helium.integracio.plugins.signatura.RespostaValidacioSignatura;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmProcessDefinition;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmProcessInstance;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmTask;
import net.conselldemallorca.helium.v3.core.api.dto.ArxiuDto;
import net.conselldemallorca.helium.v3.core.api.dto.DocumentDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDocumentDto;
import net.conselldemallorca.helium.v3.core.api.dto.RespostaValidacioSignaturaDto;
import net.conselldemallorca.helium.v3.core.api.dto.TascaDocumentDto;
import net.conselldemallorca.helium.v3.core.api.exception.SistemaExternException;
import net.conselldemallorca.helium.v3.core.repository.DefinicioProcesRepository;
import net.conselldemallorca.helium.v3.core.repository.DocumentRepository;
import net.conselldemallorca.helium.v3.core.repository.DocumentStoreRepository;
import net.conselldemallorca.helium.v3.core.repository.DocumentTascaRepository;
import net.conselldemallorca.helium.v3.core.repository.ExpedientRepository;
import net.conselldemallorca.helium.v3.core.repository.FirmaTascaRepository;
import net.conselldemallorca.helium.v3.core.repository.PortasignaturesRepository;
/**
* Helper per a gestionar els documents dels expedients
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Component
public class DocumentHelperV3 {
@Resource
private PlantillaHelper plantillaHelper;
@Resource
private DocumentRepository documentRepository;
@Resource
private DocumentStoreRepository documentStoreRepository;
@Resource
private ExpedientRepository expedientRepository;
@Resource
private DocumentTascaRepository documentTascaRepository;
@Resource
private DefinicioProcesRepository definicioProcesRepository;
@Resource
private ConversioTipusHelper conversioTipusHelper;
@Resource
private ExpedientHelper expedientHelper;
@Resource
private TascaHelper tascaHelper;
@Resource
private PluginHelper pluginHelper;
@Resource
private JbpmHelper jbpmHelper;
@Resource
private MesuresTemporalsHelper mesuresTemporalsHelper;
@Resource
private FirmaTascaRepository firmaTascaRepository;
@Resource
private PortasignaturesRepository portasignaturesRepository;
@Resource
private OpenOfficeUtils openOfficeUtils;
private PdfUtils pdfUtils;
private DocumentTokenUtils documentTokenUtils;
public ArxiuDto getArxiuPerDocumentStoreId(
Long documentStoreId,
boolean perSignar,
boolean ambSegellSignatura) {
ArxiuDto resposta = new ArxiuDto();
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
// Obtenim el contingut de l'arxiu
byte[] arxiuOrigenContingut = null;
if (documentStore.isSignat() && isSignaturaFileAttached()) {
arxiuOrigenContingut = pluginHelper.custodiaObtenirSignaturesAmbArxiu(documentStore.getReferenciaCustodia());
} else {
if (documentStore.getFont().equals(DocumentFont.INTERNA)) {
arxiuOrigenContingut = documentStore.getArxiuContingut();
} else {
arxiuOrigenContingut = pluginHelper.gestioDocumentalObtenirDocument(
documentStore.getReferenciaFont());
}
}
// Calculam el nom de l'arxiu
String arxiuNomOriginal = calcularArxiuNomOriginal(documentStore);
String extensioDesti = calcularArxiuExtensioDesti(
arxiuNomOriginal,
documentStore,
perSignar);
// Només podem convertir a extensió de destí PDF
if ("pdf".equalsIgnoreCase(extensioDesti)) {
resposta.setNom(
getNomArxiuAmbExtensio(
documentStore.getArxiuNom(),
extensioDesti));
// Si és un PDF podem estampar
try {
ByteArrayOutputStream vistaContingut = new ByteArrayOutputStream();
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm");
String dataRegistre = null;
if (documentStore.getRegistreData() != null)
dataRegistre = df.format(documentStore.getRegistreData());
String numeroRegistre = documentStore.getRegistreNumero();
String urlComprovacioSignatura = null;
if (ambSegellSignatura)
urlComprovacioSignatura = getUrlComprovacioSignatura(documentStoreId);
getPdfUtils().estampar(
arxiuNomOriginal,
arxiuOrigenContingut,
(ambSegellSignatura) ? !documentStore.isSignat() : false,
urlComprovacioSignatura,
documentStore.isRegistrat(),
numeroRegistre,
dataRegistre,
documentStore.getRegistreOficinaNom(),
documentStore.isRegistreEntrada(),
vistaContingut,
extensioDesti);
resposta.setContingut(vistaContingut.toByteArray());
} catch (Exception ex) {
Expedient expedient = expedientHelper.findExpedientByProcessInstanceId(documentStore.getProcessInstanceId());
throw SistemaExternException.tractarSistemaExternException(
expedient.getEntorn().getId(),
expedient.getEntorn().getCodi(),
expedient.getEntorn().getNom(),
expedient.getId(),
expedient.getTitol(),
expedient.getNumero(),
expedient.getTipus().getId(),
expedient.getTipus().getCodi(),
expedient.getTipus().getNom(),
"No s'ha pogut generar la vista pel document (id=" + documentStoreId + ", processInstanceId=" + documentStore.getProcessInstanceId() + ")",
ex);
}
} else {
// Si no és un pdf retornam la vista directament
resposta.setNom(arxiuNomOriginal);
resposta.setContingut(arxiuOrigenContingut);
}
return resposta;
}
public List<ExpedientDocumentDto> findDocumentsPerInstanciaProces(
String processInstanceId) {
List<ExpedientDocumentDto> resposta = new ArrayList<ExpedientDocumentDto>();
// Consulta els documents de la definició de procés
DefinicioProces definicioProces = expedientHelper.findDefinicioProcesByProcessInstanceId(
processInstanceId);
List<Document> documents = documentRepository.findByDefinicioProces(definicioProces);
// Consulta els documents de l'instància de procés
Map<String, Object> varsInstanciaProces = jbpmHelper.getProcessInstanceVariables(processInstanceId);
if (varsInstanciaProces != null) {
filtrarVariablesAmbDocuments(varsInstanciaProces);
for (String var: varsInstanciaProces.keySet()) {
Long documentStoreId = (Long)varsInstanciaProces.get(var);
if (documentStoreId != null) {
if (var.startsWith(JbpmVars.PREFIX_DOCUMENT)) {
// Afegeix el document
String documentCodi = getDocumentCodiDeVariableJbpm(var);
Document document = null;
for (Document doc: documents) {
if (doc.getCodi().equals(documentCodi)) {
document = doc;
break;
}
}
if (document != null) {
resposta.add(
crearDtoPerDocumentExpedient(
document,
documentStoreId));
} else {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
dto.setError("No s'ha trobat el document de la definició de procés (" +
"documentCodi=" + documentCodi + ")");
resposta.add(dto);
}
} else if (var.startsWith(JbpmVars.PREFIX_ADJUNT)) {
// Afegeix l'adjunt
resposta.add(
crearDtoPerAdjuntExpedient(
getAdjuntIdDeVariableJbpm(var),
documentStoreId));
}
}
}
}
return resposta;
/*String tipusExp = null;
if (MesuresTemporalsHelper.isActiu()) {
Expedient exp = expedientHelper.findExpedientByProcessInstanceId(processInstanceId);
tipusExp = (exp != null ? exp.getTipus().getNom() : null);
mesuresTemporalsHelper.mesuraIniciar("Expedient DOCUMENTS v3", "expedient", tipusExp);
mesuresTemporalsHelper.mesuraIniciar("Expedient DOCUMENTS v3", "expedient", tipusExp, null, "0");
}
DefinicioProces definicioProces = expedientHelper.findDefinicioProcesByProcessInstanceId(
processInstanceId);
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENTS v3", "expedient", tipusExp, null, "0");
mesuresTemporalsHelper.mesuraIniciar("Expedient DOCUMENTS v3", "expedient", tipusExp, null, "1");
List<Document> documents = documentRepository.findByDefinicioProces(definicioProces);
List<ExpedientDocumentDto> resposta = convertDocumentDto(documents, processInstanceId, tipusExp);
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENTS v3", "expedient", tipusExp, null, "1");
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENTS v3", "expedient",tipusExp);
return resposta;*/
}
public ExpedientDocumentDto findDocumentPerInstanciaProces(
String processInstanceId,
Long documentStoreId,
String documentCodi) {
// Consulta els documents de la definició de procés
DefinicioProces definicioProces = expedientHelper.findDefinicioProcesByProcessInstanceId(
processInstanceId);
Document document = documentRepository.findByDefinicioProcesAndCodi(definicioProces,documentCodi);
if (documentStoreId == null) {
documentStoreId = getDocumentStoreIdDeVariableJbpm(null, processInstanceId, documentCodi);
}
if (document != null) {
return crearDtoPerDocumentExpedient(
document,
documentStoreId);
} else {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
dto.setError("No s'ha trobat el document de la definició de procés (" +
"documentCodi=" + documentCodi + ")");
return dto;
}
}
public Long findDocumentStorePerInstanciaProcesAndDocumentCodi(
String processInstanceId,
String documentCodi) {
return getDocumentStoreIdDeVariableJbpm(null, processInstanceId, documentCodi);
}
public ExpedientDocumentDto findDocumentPerDocumentStoreId(
String processInstanceId,
Long documentStoreId) {
// Consulta els documents de la definició de procés
DefinicioProces definicioProces = expedientHelper.findDefinicioProcesByProcessInstanceId(
processInstanceId);
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
if (documentStore != null) {
if (documentStore.isAdjunt()) {
return this.crearDtoPerAdjuntExpedient(getAdjuntIdDeVariableJbpm(documentStore.getJbpmVariable()), documentStoreId);
} else {
Document document = documentRepository.findByDefinicioProcesAndCodi(
definicioProces,
documentStore.getCodiDocument());
if (document != null) {
return crearDtoPerDocumentExpedient(
document,
documentStoreId);
} else {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
dto.setError("No s'ha trobat el document de la definició de procés (" +
"documentCodi=" + documentStore.getCodiDocument() + ")");
return dto;
}
}
} else {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
dto.setError("No s'ha trobat el document de la definició de procés (" +
"documentStoreId=" + documentStoreId + ")");
return dto;
}
}
/*public List<ExpedientDocumentDto> convertDocumentDto(List<Document> documents, String processInstanceId, String tipusExp) {
mesuresTemporalsHelper.mesuraIniciar("Expedient DOCUMENTS v3 convertDocumentDto", "expedient", tipusExp);
mesuresTemporalsHelper.mesuraIniciar("Expedient DOCUMENTS v3 convertDocumentDto", "expedient", tipusExp, null, "0");
Map<String, Document> documentsIndexatsPerCodi = new HashMap<String, Document>();
Map<String, Object> varsInstanciaProces = jbpmHelper.getProcessInstanceVariables(processInstanceId);
for (Document document: documents)
documentsIndexatsPerCodi.put(document.getCodi(), document);
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENTS v3 convertDocumentDto", "expedient", tipusExp, null, "0");
List<ExpedientDocumentDto> resposta = new ArrayList<ExpedientDocumentDto>();
if (varsInstanciaProces != null) {
mesuresTemporalsHelper.mesuraIniciar("Expedient DOCUMENTS v3 convertDocumentDto", "expedient", tipusExp, null, "1");
filtrarVariablesAmbDocuments(varsInstanciaProces);
for (String var: varsInstanciaProces.keySet()) {
Long documentStoreId = (Long)varsInstanciaProces.get(var);
if (documentStoreId != null) {
String documentCodi = getDocumentCodiDeVariableJbpm(var);
if (documentsIndexatsPerCodi.containsKey(documentCodi)) {
ExpedientDocumentDto dto = toExpedientDocumentDto(
documentStoreId,
var.startsWith(VariableHelper.PREFIX_VAR_DOCUMENT),
documentCodi,
var.startsWith(VariableHelper.PREFIX_VAR_ADJUNT),
getAdjuntIdDeVariableJbpm(var),
documentsIndexatsPerCodi.get(documentCodi));
resposta.add(dto);
} else if (var.startsWith(DocumentHelper.PREFIX_ADJUNT)) {
// Afegeix els adjunts
resposta.add(toExpedientDocument(
documentStoreId,
documentCodi,
getAdjuntIdDeVariableJbpm(var),
getDocumentSenseContingut(documentStoreId)));
}
}
}
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENTS v3 convertDocumentDto", "expedient", tipusExp, null, "1");
}
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENTS v3 convertDocumentDto", "expedient",tipusExp);
return resposta;
}*/
/*public ExpedientDocumentDto findDocumentPerExpedientDocumentStoreId(
Expedient expedient,
Long documentStoreId,
String docCodi) {
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENT v3", "expedient", expedient.getTipus().getCodi(), null, "0");
mesuresTemporalsHelper.mesuraIniciar("Expedient DOCUMENT v3", "expedient", expedient.getTipus().getCodi(), null, "1");
DefinicioProces definicioProces = expedientHelper.findDefinicioProcesByProcessInstanceId(expedient.getProcessInstanceId());
DocumentStore documentStore = documentStoreRepository.findById(documentStoreId);
ExpedientDocumentDto resposta = null;
if (documentStore.isAdjunt()) {
resposta = toExpedientDocument(
documentStoreId,
docCodi,
getAdjuntIdDeVariableJbpm(documentStore.getJbpmVariable()),
getDocumentSenseContingut(documentStoreId));
} else {
resposta = toExpedientDocumentDto(
documentStoreId,
documentStore.getJbpmVariable().startsWith(VariableHelper.PREFIX_VAR_DOCUMENT),
docCodi,
documentStore.getJbpmVariable().startsWith(VariableHelper.PREFIX_VAR_ADJUNT),
getAdjuntIdDeVariableJbpm(documentStore.getJbpmVariable()),
documentRepository.findByDefinicioProcesAndCodi(definicioProces, docCodi));
}
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENT v3", "expedient", expedient.getTipus().getCodi(), null, "1");
mesuresTemporalsHelper.mesuraCalcular("Expedient DOCUMENT v3", "expedient",expedient.getTipus().getCodi());
return resposta;
}*/
public TascaDocumentDto findDocumentPerId(String tascaId, Long docId) {
JbpmTask task = tascaHelper.getTascaComprovacionsTramitacio(
tascaId,
true,
true);
DefinicioProces definicioProces = definicioProcesRepository.findByJbpmId(
task.getProcessDefinitionId());
DocumentTasca documentTasca = documentTascaRepository.findAmbDefinicioProcesITascaJbpmNameDocumentId(
docId,
definicioProces.getId(),
task.getTaskName());
return toTascaDocumentDto(
task,
documentTasca.getDocument(), documentTasca.isRequired(), documentTasca.isReadOnly());
}
public List<TascaDocumentDto> findDocumentsPerInstanciaTasca(JbpmTask task) {
DefinicioProces definicioProces = definicioProcesRepository.findByJbpmId(
task.getProcessDefinitionId());
List<DocumentTasca> documentsTasca = documentTascaRepository.findAmbDefinicioProcesITascaJbpmNameOrdenats(
definicioProces.getId(),
task.getTaskName());
List<TascaDocumentDto> resposta = new ArrayList<TascaDocumentDto>();
for (DocumentTasca documentTasca: documentsTasca) {
resposta.add(toTascaDocumentDto(
task,
documentTasca.getDocument(), documentTasca.isRequired(), documentTasca.isReadOnly()));
}
return resposta;
}
public boolean hasDocumentsPerInstanciaTasca(JbpmTask task) {
DefinicioProces definicioProces = definicioProcesRepository.findByJbpmId(
task.getProcessDefinitionId());
return documentTascaRepository.countAmbDefinicioProcesITascaJbpmName(
definicioProces.getId(),
task.getTaskName()) > 0;
}
public List<TascaDocumentDto> findDocumentsPerInstanciaTascaSignar(JbpmTask task) {
List<TascaDocumentDto> resposta = new ArrayList<TascaDocumentDto>();
for (FirmaTasca firmaTasca: firmaTascaRepository.findAmbTascaOrdenats(
task.getTaskName(),
task.getProcessDefinitionId())) {
resposta.add(toTascaDocumentDto(
task,
firmaTasca.getDocument(), firmaTasca.isRequired(), false));
}
return resposta;
}
public boolean hasDocumentsPerInstanciaTascaSignar(JbpmTask task) {
return firmaTascaRepository.countAmbTasca(
task.getTaskName(),
task.getProcessDefinitionId()) > 0;
}
public void guardarDadesRegistre(
Long documentStoreId,
String registreNumero,
Date registreData,
String registreOficinaCodi,
String registreOficinaNom,
boolean registreEntrada) {
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
documentStore.setRegistreNumero(registreNumero);
documentStore.setRegistreData(registreData);
documentStore.setRegistreOficinaCodi(registreOficinaCodi);
documentStore.setRegistreOficinaNom(registreOficinaNom);
documentStore.setRegistreEntrada(registreEntrada);
}
/*private ExpedientDocumentDto toExpedientDocument(
Long documentStoreId,
String documentCodi,
String adjuntId,
DocumentDto document) {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
dto.setDocumentCodi(documentCodi);
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
if (documentStore != null) {
dto.setDataCreacio(documentStore.getDataCreacio());
dto.setDataModificacio(documentStore.getDataModificacio());
dto.setDataDocument(documentStore.getDataDocument());
dto.setSignat(documentStore.isSignat());
// TODO
//dto.setPortasignaturesId(portasignaturesId);
if (documentStore.isSignat()) {
dto.setDocumentPendentSignar(documentStore.isSignat());
dto.setUrlVerificacioCustodia(
pluginCustodiaDao.getUrlComprovacioSignatura(
documentStoreId.toString()));
}
try {
dto.setTokenSignatura(getDocumentTokenUtils().xifrarToken(documentStoreId.toString()));
} catch (Exception ex) {
logger.error("No s'ha pogut generar el token pel document " + documentStoreId, ex);
}
try {
dto.setSignaturaUrlVerificacio(getUrlComprovacioSignatura(documentStoreId));
} catch (Exception ex) {
dto.setError("No s'ha pogut obtenir la URL de comprovació de signatura (id=" + documentStoreId + ",documentCodi=" + documentCodi + ")");
logger.error("No s'ha pogut obtenir la URL de comprovació de signatura (id=" + documentStoreId + ",documentCodi=" + documentCodi + ")", ex);
}
dto.setRegistrat(documentStore.isRegistrat());
dto.setRegistreEntrada(documentStore.isRegistreEntrada());
dto.setRegistreNumero(documentStore.getRegistreNumero());
dto.setRegistreData(documentStore.getRegistreData());
dto.setRegistreOficinaCodi(documentStore.getRegistreOficinaCodi());
dto.setRegistreOficinaNom(documentStore.getRegistreOficinaNom());
dto.setProcessInstanceId(documentStore.getProcessInstanceId());
dto.setDocumentId(document.getId());
dto.setDocumentNom(document.getAdjuntTitol());
dto.setDocumentContentType(document.getContentType());
dto.setDocumentCustodiaCodi(document.getCustodiaCodi());
dto.setDocumentTipusDocPortasignatures(document.getTipusDocPortasignatures());
dto.setAdjunt(true);
dto.setAdjuntId(adjuntId);
dto.setAdjuntTitol(documentStore.getAdjuntTitol());
dto.setArxiuNom(calcularArxiuNom(documentStore, false));
} else {
dto.setAdjuntId(adjuntId);
dto.setAdjunt(true);
dto.setError("No s'ha trobat el documentStore del adjunt (id=" + documentStoreId + ", adjuntId=" + adjuntId + ")");
}
return dto;
}*/
private ExpedientDocumentDto crearDtoPerDocumentExpedient(
Document document,
Long documentStoreId) {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
if (documentStore != null) {
dto.setDataCreacio(documentStore.getDataCreacio());
dto.setDataModificacio(documentStore.getDataModificacio());
dto.setDataDocument(documentStore.getDataDocument());
dto.setArxiuNom(calcularArxiuNom(documentStore, false));
dto.setProcessInstanceId(documentStore.getProcessInstanceId());
dto.setDocumentId(document.getId());
dto.setDocumentCodi(document.getCodi());
dto.setDocumentNom(document.getNom());
dto.setSignat(documentStore.isSignat());
if (documentStore.isSignat()) {
// TODO
//dto.setSignaturaPortasignaturesId(documentStore.getP);
dto.setSignaturaUrlVerificacio(
pluginHelper.custodiaObtenirUrlComprovacioSignatura(
documentStoreId.toString()));
}
dto.setRegistrat(documentStore.isRegistrat());
if (documentStore.isRegistrat()) {
dto.setRegistreEntrada(documentStore.isRegistreEntrada());
dto.setRegistreNumero(documentStore.getRegistreNumero());
dto.setRegistreData(documentStore.getRegistreData());
dto.setRegistreOficinaCodi(documentStore.getRegistreOficinaCodi());
dto.setRegistreOficinaNom(documentStore.getRegistreOficinaNom());
}
} else {
dto.setError("No s'ha trobat el documentStore del document (" +
"documentCodi=" + document.getCodi() + ", " +
"documentStoreId=" + documentStoreId + ")");
}
return dto;
}
private ExpedientDocumentDto crearDtoPerAdjuntExpedient(
String adjuntId,
Long documentStoreId) {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
if (documentStore != null) {
dto.setDataCreacio(documentStore.getDataCreacio());
dto.setDataModificacio(documentStore.getDataModificacio());
dto.setDataDocument(documentStore.getDataDocument());
dto.setArxiuNom(calcularArxiuNom(documentStore, false));
dto.setProcessInstanceId(documentStore.getProcessInstanceId());
dto.setAdjunt(true);
dto.setAdjuntId(adjuntId);
dto.setAdjuntTitol(documentStore.getAdjuntTitol());
} else {
dto.setError("No s'ha trobat el documentStore del document adjunt (" +
"adjuntId=" + adjuntId + ", " +
"documentStoreId=" + documentStoreId + ")");
}
return dto;
}
/*private ExpedientDocumentDto toExpedientDocumentDto(
Long documentStoreId,
boolean esDocument,
String documentCodi,
boolean esAdjunt,
String adjuntId,
Document document) {
ExpedientDocumentDto dto = new ExpedientDocumentDto();
dto.setId(documentStoreId);
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
if (documentStore != null) {
dto.setDataCreacio(documentStore.getDataCreacio());
dto.setDataModificacio(documentStore.getDataModificacio());
dto.setDataDocument(documentStore.getDataDocument());
dto.setSignat(documentStore.isSignat());
// TODO
//dto.setPortasignaturesId(portasignaturesId);
if (documentStore.isSignat()) {
dto.setDocumentPendentSignar(documentStore.isSignat());
dto.setUrlVerificacioCustodia(
pluginCustodiaDao.getUrlComprovacioSignatura(
documentStoreId.toString()));
}
try {
dto.setTokenSignatura(getDocumentTokenUtils().xifrarToken(documentStoreId.toString()));
} catch (Exception ex) {
logger.error("No s'ha pogut generar el token pel document " + documentStoreId, ex);
}
try {
dto.setSignaturaUrlVerificacio(getUrlComprovacioSignatura(documentStoreId));
} catch (Exception ex) {
dto.setError("No s'ha pogut obtenir la URL de comprovació de signatura (id=" + documentStoreId + ",documentCodi=" + documentCodi + ")");
logger.error("No s'ha pogut obtenir la URL de comprovació de signatura (id=" + documentStoreId + ",documentCodi=" + documentCodi + ")", ex);
}
dto.setRegistrat(documentStore.isRegistrat());
dto.setRegistreEntrada(documentStore.isRegistreEntrada());
dto.setRegistreNumero(documentStore.getRegistreNumero());
dto.setRegistreData(documentStore.getRegistreData());
dto.setRegistreOficinaCodi(documentStore.getRegistreOficinaCodi());
dto.setRegistreOficinaNom(documentStore.getRegistreOficinaNom());
dto.setProcessInstanceId(documentStore.getProcessInstanceId());
if (esDocument) {
dto.setDocumentCodi(documentCodi);
if (document != null) {
dto.setPlantilla(document.isPlantilla());
dto.setDocumentId(document.getId());
dto.setDocumentNom(document.getNom());
dto.setDocumentContentType(document.getContentType());
dto.setDocumentCustodiaCodi(document.getCustodiaCodi());
dto.setDocumentTipusDocPortasignatures(document.getTipusDocPortasignatures());
} else {
dto.setError("No s'ha trobat el document (id=" + documentStoreId + ",documentCodi=" + documentCodi + ")");
}
} else if (esAdjunt) {
dto.setAdjunt(true);
dto.setAdjuntId(adjuntId);
dto.setAdjuntTitol(documentStore.getAdjuntTitol());
}
dto.setArxiuNom(calcularArxiuNom(documentStore, false));
} else {
if (esDocument) {
dto.setDocumentCodi(documentCodi);
dto.setError("No s'ha trobat el documentStore del document (id=" + documentStoreId + ", documentCodi=" + documentCodi + ")");
} else if (esAdjunt) {
dto.setAdjuntId(adjuntId);
dto.setAdjunt(true);
dto.setError("No s'ha trobat el documentStore del adjunt (id=" + documentStoreId + ", adjuntId=" + adjuntId + ")");
} else {
dto.setError("No s'ha trobat el documentStore i no es ni document ni adjunt (id=" + documentStoreId + ")");
}
}
if (document != null && !document.getFirmes().isEmpty()) {
dto.setDocumentPendentSignar(true);
Iterator<FirmaTasca> firmas = document.getFirmes().iterator();
while (firmas.hasNext()) {
if (firmas.next().isRequired()) {
dto.setSignatRequired(true);
break;
}
}
}
return dto;
}*/
public DocumentStore getDocumentStore(
JbpmTask task,
String documentCodi) {
DocumentStore documentStore = null;
Long documentStoreId = getDocumentStoreIdDeVariableJbpm(String.valueOf(task.getTask().getId()), task.getProcessInstanceId(), documentCodi);
if (documentStoreId != null) {
documentStore = documentStoreRepository.findById(documentStoreId);
}
return documentStore;
}
public List<RespostaValidacioSignaturaDto> verificarSignatura(String tascaId, Long docId) throws Exception {
JbpmTask task = tascaHelper.getTascaComprovacionsTramitacio(
tascaId,
false,
false);
DocumentStore documentStore = getDocumentStore(task, documentRepository.findOne(docId).getCodi());
return getRespostasValidacioSignatura(documentStore);
}
public List<RespostaValidacioSignaturaDto> getRespostasValidacioSignatura(DocumentStore documentStore) {
DocumentDto document = getDocumentOriginal(documentStore.getId(), true);
if (pluginHelper.custodiaPotObtenirInfoSignatures()) {
return conversioTipusHelper.convertirList(pluginHelper.custodiaDadesValidacioSignatura(
documentStore.getReferenciaCustodia()), RespostaValidacioSignaturaDto.class);
} else if (isSignaturaFileAttached()) {
List<byte[]> signatures = pluginHelper.custodiaObtenirSignatures(documentStore.getReferenciaCustodia());
List<RespostaValidacioSignatura> resposta = new ArrayList<RespostaValidacioSignatura>();
if (!signatures.isEmpty()) {
RespostaValidacioSignatura res = pluginHelper.signaturaVerificar(
null,
signatures.get(0),
true);
resposta.add(res);
}
return conversioTipusHelper.convertirList(resposta, RespostaValidacioSignaturaDto.class);
} else {
List<RespostaValidacioSignatura> resposta = new ArrayList<RespostaValidacioSignatura>();
List<byte[]> signatures = pluginHelper.custodiaObtenirSignatures(
documentStore.getReferenciaCustodia());
for (byte[] signatura: signatures) {
RespostaValidacioSignatura res = pluginHelper.signaturaVerificar(
document.getArxiuContingut(),
signatura,
true);
resposta.add(res);
}
return conversioTipusHelper.convertirList(resposta, RespostaValidacioSignaturaDto.class);
}
}
private TascaDocumentDto toTascaDocumentDto(
JbpmTask task,
Document document,
boolean required,
boolean readonly) {
TascaDocumentDto dto = new TascaDocumentDto();
String varCodi = getVarPerDocumentCodi(
document.getCodi(),
document.isAdjuntarAuto());
dto.setId(document.getId());
dto.setVarCodi(varCodi);
dto.setDocumentCodi(document.getCodi());
dto.setDocumentNom(document.getNom());
dto.setRequired(required);
dto.setReadOnly(readonly);
dto.setPlantilla(document.isPlantilla());
dto.setExtensionsPermeses(document.getExtensionsPermeses());
dto.setAdjuntarAuto(document.isAdjuntarAuto());
dto.setArxiuNom(document.getArxiuNom());
Long documentStoreId = getDocumentStoreIdDeVariableJbpm(String.valueOf(task.getTask().getId()), task.getProcessInstanceId(), document.getCodi());
if (documentStoreId != null) {
DocumentStore documentStore = documentStoreRepository.findById(documentStoreId);
if (documentStore != null) {
dto.setDocumentStoreId(documentStoreId);
dto.setArxiuNom(documentStore.getArxiuNom());
dto.setDataCreacio(documentStore.getDataCreacio());
dto.setDataModificacio(documentStore.getDataModificacio());
dto.setDataDocument(documentStore.getDataDocument());
dto.setSignat(documentStore.isSignat());
dto.setRegistrat(documentStore.isRegistrat());
if (documentStore.isSignat()) {
dto.setUrlVerificacioCustodia(
pluginHelper.custodiaObtenirUrlComprovacioSignatura(
documentStoreId.toString()));
}
try {
dto.setTokenSignatura(getDocumentTokenUtils().xifrarToken(documentStoreId.toString()));
} catch (Exception ex) {
logger.error("No s'ha pogut generar el token pel document " + documentStoreId, ex);
}
if (documentStore.isRegistrat()) {
dto.setRegistreData(documentStore.getRegistreData());
dto.setRegistreNumero(documentStore.getRegistreNumero());
dto.setRegistreOficinaCodi(documentStore.getRegistreOficinaCodi());
dto.setRegistreOficinaNom(documentStore.getRegistreOficinaNom());
dto.setRegistreEntrada(documentStore.isRegistreEntrada());
}
}
}
return dto;
}
private String calcularArxiuNom(
DocumentStore documentStore,
boolean perSignar) {
String nomOriginal = calcularArxiuNomOriginal(documentStore);
String extensioDesti = calcularArxiuExtensioDesti(
nomOriginal,
documentStore,
perSignar);
return getNomArxiuAmbExtensio(
documentStore.getArxiuNom(),
extensioDesti);
}
private String calcularArxiuNomOriginal(
DocumentStore documentStore) {
String nomOriginal;
if (documentStore.isSignat() && isSignaturaFileAttached()) {
nomOriginal = getNomArxiuAmbExtensio(
documentStore.getArxiuNom(),
getExtensioArxiuSignat());
} else {
nomOriginal = documentStore.getArxiuNom();
}
return nomOriginal;
}
private String calcularArxiuExtensioDesti(
String nomOriginal,
DocumentStore documentStore,
boolean perSignar) {
String extensioActual = null;
int indexPunt = nomOriginal.lastIndexOf(".");
if (indexPunt != -1)
extensioActual = nomOriginal.substring(indexPunt + 1);
String extensioDesti = extensioActual;
if (perSignar && isActiuConversioSignatura()) {
extensioDesti = getExtensioArxiuSignat();
} else if (documentStore.isRegistrat()) {
extensioDesti = getExtensioArxiuRegistrat();
}
return extensioDesti;
}
private String getDocumentCodiDeVariableJbpm(String varName) {
return varName.substring(JbpmVars.PREFIX_DOCUMENT.length());
}
private String getAdjuntIdDeVariableJbpm(String varName) {
return varName.substring(JbpmVars.PREFIX_ADJUNT.length());
}
private void filtrarVariablesAmbDocuments(Map<String, Object> variables) {
if (variables != null) {
variables.remove(JbpmVars.VAR_TASCA_VALIDADA);
variables.remove(JbpmVars.VAR_TASCA_DELEGACIO);
List<String> codisEsborrar = new ArrayList<String>();
for (String codi: variables.keySet()) {
if (!codi.startsWith(JbpmVars.PREFIX_DOCUMENT) && !codi.startsWith(JbpmVars.PREFIX_ADJUNT)) {
codisEsborrar.add(codi);
}
}
for (String codi: codisEsborrar)
variables.remove(codi);
}
}
private String getNomArxiuAmbExtensio(
String arxiuNomOriginal,
String extensio) {
if (!isActiuConversioSignatura())
return arxiuNomOriginal;
if (extensio == null)
extensio = "";
int indexPunt = arxiuNomOriginal.lastIndexOf(".");
if (indexPunt != -1) {
return arxiuNomOriginal.substring(0, indexPunt) + "." + extensio;
} else {
return arxiuNomOriginal + "." + extensio;
}
}
private String getUrlComprovacioSignatura(Long documentStoreId) throws Exception {
String urlCustodia = pluginHelper.custodiaObtenirUrlComprovacioSignatura(documentStoreId.toString());
if (urlCustodia != null) {
return urlCustodia;
} else {
String baseUrl = (String)GlobalProperties.getInstance().get("app.base.verificacio.url");
if (baseUrl == null)
baseUrl = (String)GlobalProperties.getInstance().get("app.base.url");
String token = getDocumentTokenUtils().xifrarToken(documentStoreId.toString());
return baseUrl + "/signatura/verificarExtern.html?token=" + token;
}
}
private String getExtensioArxiuSignat() {
return (String)GlobalProperties.getInstance().get("app.conversio.signatura.extension");
}
private String getExtensioArxiuRegistrat() {
return (String)GlobalProperties.getInstance().get("app.conversio.registre.extension");
}
private boolean isSignaturaFileAttached() {
return "true".equalsIgnoreCase((String)GlobalProperties.getInstance().get("app.signatura.plugin.file.attached"));
}
private boolean isActiuConversioSignatura() {
String actiuConversio = (String)GlobalProperties.getInstance().get("app.conversio.actiu");
if (!"true".equalsIgnoreCase(actiuConversio))
return false;
String actiuConversioSignatura = (String)GlobalProperties.getInstance().get("app.conversio.signatura.actiu");
return "true".equalsIgnoreCase(actiuConversioSignatura);
}
private PdfUtils getPdfUtils() {
if (pdfUtils == null)
pdfUtils = new PdfUtils();
return pdfUtils;
}
private DocumentTokenUtils getDocumentTokenUtils() {
if (documentTokenUtils == null)
documentTokenUtils = new DocumentTokenUtils(
(String)GlobalProperties.getInstance().get("app.encriptacio.clau"));
return documentTokenUtils;
}
public DocumentDto signarDocumentTascaAmbToken(Long docId, String tascaId, String token, byte[] signatura) throws Exception {
DocumentDto dto = null;
Long documentStoreId = getDocumentStoreIdPerToken(token);
if (documentStoreId != null) {
DocumentStore documentStore = documentStoreRepository.findById(documentStoreId);
dto = getDocumentSenseContingut(documentStoreId);
boolean custodiat = false;
if (pluginHelper.custodiaIsPluginActiu()) {
String nomArxiu = getNomArxiuAmbExtensio(
dto.getArxiuNom(),
getExtensioArxiuSignat());
String referenciaCustodia = null;
if (pluginHelper.custodiaIsValidacioImplicita()) {
logger.info("signarDocumentTascaAmbToken : documentId: " + documentStore.getId() + ". gesdocId: " +documentStore.getReferenciaFont() + ". nomArxiuSignat: " + nomArxiu + ". codiTipusCustodia: " + dto.getCustodiaCodi());
referenciaCustodia = pluginHelper.custodiaAfegirSignatura(
documentStore.getId(),
documentStore.getReferenciaFont(),
nomArxiu,
dto.getCustodiaCodi(),
signatura);
custodiat = true;
} else {
RespostaValidacioSignatura resposta = pluginHelper.signaturaVerificar(
dto.getVistaContingut(),
signatura,
false);
if (resposta.isEstatOk()) {
referenciaCustodia = pluginHelper.custodiaAfegirSignatura(
documentStore.getId(),
documentStore.getReferenciaFont(),
nomArxiu,
dto.getCustodiaCodi(),
signatura);
custodiat = true;
}
}
documentStore.setReferenciaCustodia(referenciaCustodia);
}
if (custodiat) {
documentStore.setSignat(true);
JbpmTask task = tascaHelper.getTascaComprovacionsTramitacio(
tascaId,
true,
true);
String.valueOf(task.getTask().getId());
jbpmHelper.setTaskInstanceVariable(
tascaId,
JbpmVars.PREFIX_SIGNATURA + dto.getDocumentCodi(),
documentStore.getId());
}
}
return dto;
}
private DocumentDto toDocumentDto(
Long documentStoreId,
boolean ambContingutOriginal,
boolean ambContingutSignat,
boolean ambContingutVista,
boolean perSignar,
boolean ambSegellSignatura) {
if (documentStoreId != null) {
DocumentStore document = documentStoreRepository.findOne(documentStoreId);
if (document != null) {
DocumentDto dto = new DocumentDto();
dto.setId(document.getId());
dto.setDataCreacio(document.getDataCreacio());
dto.setDataDocument(document.getDataDocument());
dto.setArxiuNom(document.getArxiuNom());
dto.setProcessInstanceId(document.getProcessInstanceId());
dto.setSignat(document.isSignat());
dto.setAdjunt(document.isAdjunt());
dto.setAdjuntTitol(document.getAdjuntTitol());
try {
dto.setTokenSignatura(getDocumentTokenUtils().xifrarToken(documentStoreId.toString()));
} catch (Exception ex) {
logger.error("No s'ha pogut generar el token pel document " + documentStoreId, ex);
}
if (document.isSignat()) {
dto.setUrlVerificacioCustodia(
pluginHelper.custodiaObtenirUrlComprovacioSignatura(
documentStoreId.toString()));
}
String codiDocument;
if (document.isAdjunt()) {
dto.setAdjuntId(document.getJbpmVariable().substring(JbpmVars.PREFIX_ADJUNT.length()));
dto.setCodi(dto.getAdjuntId());
dto.setDocumentCodi(dto.getAdjuntId());
dto.setDocumentNom(document.getAdjuntTitol());
dto.setArxiuContingut(document.getArxiuContingut());
} else {
codiDocument = document.getJbpmVariable().substring(JbpmVars.PREFIX_DOCUMENT.length());
JbpmProcessDefinition jpd = jbpmHelper.findProcessDefinitionWithProcessInstanceId(document.getProcessInstanceId());
DefinicioProces definicioProces = definicioProcesRepository.findByJbpmKeyAndVersio(
jpd.getKey(),
jpd.getVersion());
Document doc = documentRepository.findAmbDefinicioProcesICodi(definicioProces.getId(), codiDocument);
if (doc != null) {
dto.setContentType(doc.getContentType());
dto.setCustodiaCodi(doc.getCustodiaCodi());
dto.setDocumentId(doc.getId());
dto.setDocumentCodi(doc.getCodi());
dto.setDocumentNom(doc.getNom());
dto.setTipusDocPortasignatures(doc.getTipusDocPortasignatures());
dto.setAdjuntarAuto(doc.isAdjuntarAuto());
}
}
if (ambContingutOriginal) {
dto.setArxiuContingut(
getContingutDocumentAmbFont(document));
}
if (ambContingutSignat && document.isSignat() && isSignaturaFileAttached()) {
dto.setSignatNom(
getNomArxiuAmbExtensio(
document.getArxiuNom(),
getExtensioArxiuSignat()));
byte[] signatura = pluginHelper.custodiaObtenirSignaturesAmbArxiu(document.getReferenciaCustodia());
dto.setSignatContingut(signatura);
}
if (ambContingutVista) {
String arxiuOrigenNom;
byte[] arxiuOrigenContingut;
// Obtenim l'origen per a generar la vista o bé del document original
// o bé del document signat
if (document.isSignat() && isSignaturaFileAttached()) {
if (ambContingutSignat) {
arxiuOrigenNom = dto.getSignatNom();
arxiuOrigenContingut = dto.getSignatContingut();
} else {
arxiuOrigenNom = getNomArxiuAmbExtensio(
document.getArxiuNom(),
getExtensioArxiuSignat());
arxiuOrigenContingut = pluginHelper.custodiaObtenirSignaturesAmbArxiu(document.getReferenciaCustodia());
}
} else {
arxiuOrigenNom = dto.getArxiuNom();
if (ambContingutOriginal) {
arxiuOrigenContingut = dto.getArxiuContingut();
} else {
if (document.getFont().equals(DocumentFont.INTERNA)) {
arxiuOrigenContingut = document.getArxiuContingut();
} else {
arxiuOrigenContingut = pluginHelper.gestioDocumentalObtenirDocument(
document.getReferenciaFont());
}
}
}
// Calculam l'extensió del document final de la vista
String extensioActual = null;
int indexPunt = arxiuOrigenNom.indexOf(".");
if (indexPunt != -1)
extensioActual = arxiuOrigenNom.substring(0, indexPunt);
String extensioDesti = extensioActual;
if (perSignar && isActiuConversioSignatura()) {
extensioDesti = getExtensioArxiuSignat();
} else if (document.isRegistrat()) {
extensioDesti = getExtensioArxiuRegistrat();
}
dto.setVistaNom(dto.getArxiuNomSenseExtensio() + "." + extensioDesti);
if ("pdf".equalsIgnoreCase(extensioDesti)) {
// Si és un PDF podem estampar
try {
ByteArrayOutputStream vistaContingut = new ByteArrayOutputStream();
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm");
String dataRegistre = null;
if (document.getRegistreData() != null)
dataRegistre = df.format(document.getRegistreData());
String numeroRegistre = document.getRegistreNumero();
try {
getPdfUtils().estampar(
arxiuOrigenNom,
arxiuOrigenContingut,
(ambSegellSignatura) ? !document.isSignat() : false,
(ambSegellSignatura) ? getUrlComprovacioSignatura(documentStoreId, dto.getTokenSignatura()): null,
document.isRegistrat(),
numeroRegistre,
dataRegistre,
document.getRegistreOficinaNom(),
document.isRegistreEntrada(),
vistaContingut,
extensioDesti);
} catch (Exception ex) {
throw ex;
}
dto.setVistaContingut(vistaContingut.toByteArray());
} catch (Exception ex) {
logger.error("No s'ha pogut generar la vista pel document '" + document.getCodiDocument() + "'", ex);
Expedient expedient = expedientHelper.findExpedientByProcessInstanceId(document.getProcessInstanceId());
throw SistemaExternException.tractarSistemaExternException(
expedient.getEntorn().getId(),
expedient.getEntorn().getCodi(),
expedient.getEntorn().getNom(),
expedient.getId(),
expedient.getTitol(),
expedient.getNumero(),
expedient.getTipus().getId(),
expedient.getTipus().getCodi(),
expedient.getTipus().getNom(),
"Estampar PDF '" + document.getCodiDocument() + "'",
ex);
}
} else {
// Si no és un pdf retornam la vista directament
dto.setVistaNom(arxiuOrigenNom);
dto.setVistaContingut(arxiuOrigenContingut);
}
}
if (document.isRegistrat()) {
dto.setRegistreData(document.getRegistreData());
dto.setRegistreNumero(document.getRegistreNumero());
dto.setRegistreOficinaCodi(document.getRegistreOficinaCodi());
dto.setRegistreOficinaNom(document.getRegistreOficinaNom());
dto.setRegistreEntrada(document.isRegistreEntrada());
dto.setRegistrat(true);
}
return dto;
}
}
return null;
}
public Long getDocumentStoreIdPerToken(String token) {
try {
String[] tokenDesxifrat = getDocumentTokenUtils().desxifrarTokenMultiple(token);
if (tokenDesxifrat.length == 1)
return Long.parseLong(tokenDesxifrat[0]);
else
return Long.parseLong(tokenDesxifrat[1]);
} catch (Exception ex) {
throw new RuntimeException("Format de token ('" + token + "') incorrecte", ex);
}
}
public DocumentDto getDocumentVista(
Long documentStoreId,
boolean perSignar,
boolean ambSegellSignatura) {
if (documentStoreId != null) {
return toDocumentDto(
documentStoreId,
false,
false,
true,
perSignar,
ambSegellSignatura);
} else {
return null;
}
}
public DocumentDto getDocumentOriginal(
Long documentStoreId,
boolean ambContingut) {
if (documentStoreId != null) {
return toDocumentDto(
documentStoreId,
ambContingut,
false,
false,
false,
false);
} else {
return null;
}
}
private String getUrlComprovacioSignatura(Long documentStoreId, String token) {
String urlCustodia = pluginHelper.custodiaObtenirUrlComprovacioSignatura(documentStoreId.toString());
if (urlCustodia != null) {
return urlCustodia;
} else {
String baseUrl = (String)GlobalProperties.getInstance().get("app.base.verificacio.url");
if (baseUrl == null)
baseUrl = (String)GlobalProperties.getInstance().get("app.base.url");
return baseUrl + "/signatura/verificarExtern.html?token=" + token;
}
}
private byte[] getContingutDocumentAmbFont(DocumentStore document) {
if (document.getFont().equals(DocumentFont.INTERNA))
return document.getArxiuContingut();
else
return pluginHelper.gestioDocumentalObtenirDocument(
document.getReferenciaFont());
}
public DocumentDto getDocumentSenseContingut(
Long documentStoreId) {
if (documentStoreId != null) {
DocumentDto dto = toDocumentDto(
documentStoreId,
false,
false,
false,
false,
false);
return dto;
} else {
return null;
}
}
public DocumentDto getDocumentSenseContingut(
String taskInstanceId,
String processInstanceId,
String documentCodi,
boolean perSignarEnTasca,
boolean ambInfoPsigna) {
Long documentStoreId = getDocumentStoreIdDeVariableJbpm(taskInstanceId, processInstanceId, documentCodi);
if (documentStoreId != null) {
DocumentDto dto = toDocumentDto(
documentStoreId,
false,
false,
false,
false,
false);
if (perSignarEnTasca) {
try {
dto.setTokenSignaturaMultiple(getDocumentTokenUtils().xifrarTokenMultiple(
new String[] {
taskInstanceId,
documentStoreId.toString()}));
} catch (Exception ex) {
logger.error("No s'ha pogut generar el token pel document " + documentStoreId, ex);
}
if (dto.isSignat()) {
Object signatEnTasca = jbpmHelper.getTaskInstanceVariable(taskInstanceId, JbpmVars.PREFIX_SIGNATURA + dto.getDocumentCodi());
dto.setSignatEnTasca(signatEnTasca != null);
} else {
dto.setSignatEnTasca(false);
}
}
return dto;
} else {
return null;
}
}
public Long actualitzarDocument(
String taskInstanceId,
String processInstanceId,
String documentCodi,
String documentNom,
Date documentData,
String arxiuNom,
byte[] arxiuContingut,
boolean isAdjunt) {
DocumentStore documentStore = null;
Long documentStoreId = getDocumentStoreIdDeVariableJbpm(taskInstanceId, processInstanceId, documentCodi);
if (documentStoreId != null)
documentStore = documentStoreRepository.findById(documentStoreId);
if (documentStore == null) {
// Si el document no existeix el crea
documentStore = new DocumentStore(
(pluginHelper.gestioDocumentalIsPluginActiu()) ? DocumentFont.ALFRESCO : DocumentFont.INTERNA,
processInstanceId,
getVarPerDocumentCodi(documentCodi, isAdjunt),
new Date(),
documentData,
arxiuNom);
documentStore.setAdjunt(isAdjunt);
if (isAdjunt)
documentStore.setAdjuntTitol(documentNom);
documentStore.setArxiuNom(arxiuNom);
if (!pluginHelper.gestioDocumentalIsPluginActiu())
documentStore.setArxiuContingut(arxiuContingut);
documentStore = documentStoreRepository.save(documentStore);
documentStoreRepository.flush();
} else {
// Si el document està creat l'actualitza
documentStore = documentStoreRepository.findOne(documentStoreId);
documentStore.setDataDocument(documentData);
documentStore.setDataModificacio(new Date());
if (documentStore.isAdjunt())
documentStore.setAdjuntTitol(documentNom);
documentStore.setArxiuNom(arxiuNom != null ? arxiuNom : documentStore.getArxiuNom());
if (!pluginHelper.gestioDocumentalIsPluginActiu())
documentStore.setArxiuContingut(arxiuContingut);
if (arxiuContingut != null && pluginHelper.gestioDocumentalIsPluginActiu())
pluginHelper.gestioDocumentalDeleteDocument(
documentStore.getReferenciaFont(),
expedientHelper.findExpedientByProcessInstanceId(processInstanceId));
}
// Crea el document a dins la gestió documental
if (arxiuContingut != null && pluginHelper.gestioDocumentalIsPluginActiu()) {
Expedient expedient = expedientHelper.findExpedientByProcessInstanceId(processInstanceId);
if (documentNom == null) {
Document document = getDocumentDisseny(taskInstanceId, processInstanceId, documentCodi);
documentNom = document.getNom();
}
String referenciaFont = pluginHelper.gestioDocumentalCreateDocument(
expedient,
documentStore.getId().toString(),
documentNom,
documentData,
arxiuNom,
arxiuContingut);
documentStore.setReferenciaFont(referenciaFont);
}
// Guarda la referència al nou document a dins el jBPM
if (taskInstanceId != null)
jbpmHelper.setTaskInstanceVariable(
taskInstanceId,
documentStore.getJbpmVariable(),
documentStore.getId());
else
jbpmHelper.setProcessInstanceVariable(
processInstanceId,
documentStore.getJbpmVariable(),
documentStore.getId());
return documentStore.getId();
}
public Long actualitzarAdjunt(
Long documentStoreId,
String processInstanceId,
String documentCodi,
String documentNom,
Date documentData,
String arxiuNom,
byte[] arxiuContingut,
boolean isAdjunt) {
DocumentStore documentStore = null;
documentStore = documentStoreRepository.findById(documentStoreId);
// Si el document està creat l'actualitza
documentStore = documentStoreRepository.findOne(documentStoreId);
documentStore.setDataDocument(documentData);
documentStore.setDataModificacio(new Date());
if (documentStore.isAdjunt())
documentStore.setAdjuntTitol(documentNom);
documentStore.setArxiuNom(arxiuNom);
if (!pluginHelper.gestioDocumentalIsPluginActiu())
documentStore.setArxiuContingut(arxiuContingut);
if (arxiuContingut != null && pluginHelper.gestioDocumentalIsPluginActiu())
pluginHelper.gestioDocumentalDeleteDocument(
documentStore.getReferenciaFont(),
expedientHelper.findExpedientByProcessInstanceId(processInstanceId));
// Guarda la referència al nou document a dins el jBPM
jbpmHelper.setProcessInstanceVariable(
processInstanceId,
documentStore.getJbpmVariable(),
documentStore.getId());
return documentStore.getId();
}
public void esborrarDocument(
String taskInstanceId,
String processInstanceId,
String documentCodi) {
Object varValor = null;
if (taskInstanceId != null) {
varValor = jbpmHelper.getTaskInstanceVariable(
taskInstanceId,
getVarPerDocumentCodi(documentCodi, false));
} else if (processInstanceId != null) {
varValor = jbpmHelper.getProcessInstanceVariable(
processInstanceId,
getVarPerDocumentCodi(documentCodi, false));
}
if (varValor != null && varValor instanceof Long) {
esborrarDocument(
taskInstanceId,
processInstanceId,
(Long)varValor);
}
}
public void esborrarDocument(
String taskInstanceId,
String processInstanceId,
Long documentStoreId) {
DocumentStore documentStore = documentStoreRepository.findOne(documentStoreId);
if (documentStore != null) {
if (documentStore.isSignat()) {
if (pluginHelper.custodiaIsPluginActiu()) {
pluginHelper.custodiaEsborrarSignatures(
documentStore.getReferenciaCustodia(),
expedientHelper.findExpedientByProcessInstanceId(processInstanceId));
}
}
if (documentStore.getFont().equals(DocumentFont.ALFRESCO))
pluginHelper.gestioDocumentalDeleteDocument(
documentStore.getReferenciaFont(),
expedientHelper.findExpedientByProcessInstanceId(processInstanceId));
if (processInstanceId != null) {
List<TipusEstat> estats = new ArrayList<TipusEstat>();
estats.add(TipusEstat.PENDENT);
estats.add(TipusEstat.SIGNAT);
estats.add(TipusEstat.REBUTJAT);
estats.add(TipusEstat.ERROR);
List<Portasignatures> psignaPendents = portasignaturesRepository.findByProcessInstanceIdAndEstatNotIn(
processInstanceId,
estats);
for (Portasignatures psigna: psignaPendents) {
if (psigna.getDocumentStoreId().longValue() == documentStore.getId().longValue()) {
psigna.setEstat(TipusEstat.ESBORRAT);
portasignaturesRepository.save(psigna);
}
}
}
documentStoreRepository.delete(documentStoreId);
}
if (taskInstanceId != null) {
jbpmHelper.deleteTaskInstanceVariable(
taskInstanceId,
documentStore.getJbpmVariable());
String documentCodi = getDocumentCodiPerVariableJbpm(
documentStore.getJbpmVariable());
jbpmHelper.deleteTaskInstanceVariable(
taskInstanceId,
JbpmVars.PREFIX_SIGNATURA + documentCodi);
}
if (processInstanceId != null) {
jbpmHelper.deleteProcessInstanceVariable(
processInstanceId,
documentStore.getJbpmVariable());
}
}
private Document getDocumentDisseny(
String taskInstanceId,
String processInstanceId,
String documentCodi) {
DefinicioProces definicioProces = null;
if (taskInstanceId != null) {
JbpmTask taskInstance = jbpmHelper.getTaskById(taskInstanceId);
definicioProces = definicioProcesRepository.findByJbpmId(taskInstance.getProcessDefinitionId());
} else {
JbpmProcessInstance processInstance = jbpmHelper.getProcessInstance(processInstanceId);
definicioProces = definicioProcesRepository.findByJbpmId(processInstance.getProcessDefinitionId());
}
return documentRepository.findAmbDefinicioProcesICodi(definicioProces.getId(), documentCodi);
}
private Long getDocumentStoreIdDeVariableJbpm(
String taskInstanceId,
String processInstanceId,
String documentCodi) {
Object value = null;
if (taskInstanceId != null) {
value = jbpmHelper.getTaskInstanceVariable(
taskInstanceId,
getVarPerDocumentCodi(documentCodi, false));
}
if (value == null && processInstanceId != null) {
value = jbpmHelper.getProcessInstanceVariable(
processInstanceId,
getVarPerDocumentCodi(documentCodi, false));
}
return (Long)value;
}
public String getVarPerDocumentCodi(String documentCodi, boolean isAdjunt) {
if (isAdjunt)
return JbpmVars.PREFIX_ADJUNT + documentCodi;
else
return JbpmVars.PREFIX_DOCUMENT + documentCodi;
}
public static String getDocumentCodiPerVariableJbpm(String var) {
if (var.startsWith(JbpmVars.PREFIX_DOCUMENT)) {
return var.substring(JbpmVars.PREFIX_DOCUMENT.length());
} else if (var.startsWith(JbpmVars.PREFIX_ADJUNT)) {
return var.substring(JbpmVars.PREFIX_ADJUNT.length());
} else if (var.startsWith(JbpmVars.PREFIX_SIGNATURA)) {
return var.substring(JbpmVars.PREFIX_SIGNATURA.length());
} else {
return var;
}
}
private String nomArxiuAmbExtensio(String fileName, String extensio) {
if (extensio == null || extensio.length() == 0)
return fileName;
int indexPunt = fileName.lastIndexOf(".");
if (indexPunt != -1) {
String nom = fileName.substring(0, indexPunt);
return nom + "." + extensio;
} else {
return fileName + "." + extensio;
}
}
private boolean isActiuConversioVista() {
String actiuConversio = (String)GlobalProperties.getInstance().get("app.conversio.actiu");
if (!"true".equalsIgnoreCase(actiuConversio))
return false;
String actiuConversioVista = (String)GlobalProperties.getInstance().get("app.conversio.vista.actiu");
if (actiuConversioVista == null)
actiuConversioVista = (String)GlobalProperties.getInstance().get("app.conversio.gentasca.actiu");
return "true".equalsIgnoreCase(actiuConversioVista);
}
private String getExtensioVista(Document document) {
String extensioVista = null;
if (isActiuConversioVista()) {
if (document.getConvertirExtensio() != null && document.getConvertirExtensio().length() > 0) {
extensioVista = document.getConvertirExtensio();
} else {
extensioVista = (String)GlobalProperties.getInstance().get("app.conversio.vista.extension");
if (extensioVista == null)
extensioVista = (String)GlobalProperties.getInstance().get("app.conversio.gentasca.extension");
}
}
return extensioVista;
}
public ArxiuDto generarDocumentAmbPlantillaIConvertir(
Expedient expedient,
Document document,
String taskInstanceId,
String processInstanceId,
Date dataDocument) {
if (document.isPlantilla()) {
ArxiuDto resultat = plantillaHelper.generarDocumentPlantilla(
expedient,
document,
taskInstanceId,
processInstanceId,
dataDocument);
if (isActiuConversioVista()) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
openOfficeUtils.convertir(
resultat.getNom(),
resultat.getContingut(),
getExtensioVista(document),
baos);
resultat.setNom(
nomArxiuAmbExtensio(
resultat.getNom(),
getExtensioVista(document)));
resultat.setContingut(baos.toByteArray());
} catch (Exception ex) {
throw SistemaExternException.tractarSistemaExternException(
expedient.getEntorn().getId(),
expedient.getEntorn().getCodi(),
expedient.getEntorn().getNom(),
expedient.getId(),
expedient.getTitol(),
expedient.getNumero(),
expedient.getTipus().getId(),
expedient.getTipus().getCodi(),
expedient.getTipus().getNom(),
"Error en la conversió del document",
ex);
}
}
return resultat;
} else {
ArxiuDto resultat = new ArxiuDto(
document.getArxiuNom(),
document.getArxiuContingut());
return resultat;
}
}
/*public DocumentDto generarDocumentAmbPlantilla(
String taskInstanceId,
String processInstanceId,
String documentCodi,
Date dataDocument,
boolean forsarAdjuntarAuto) throws DocumentGenerarException, DocumentConvertirException {
Expedient expedient = expedientHelper.findExpedientByProcessInstanceId(processInstanceId);
Document document = documentRepository.findByDefinicioProcesAndCodi(
expedientHelper.findDefinicioProcesByProcessInstanceId(processInstanceId),
documentCodi);
DocumentDto resposta = new DocumentDto();
resposta.setCodi(document.getCodi());
resposta.setDataCreacio(new Date());
resposta.setDataDocument(dataDocument);
resposta.setArxiuNom(expedient.getNumeroIdentificador() + "-" + document.getNom() + ".odt");
if (document.isPlantilla()) {
ArxiuDto resultat = plantillaHelper.generarDocumentPlantilla(
expedient,
document,
taskInstanceId,
processInstanceId,
dataDocument);
if (isActiuConversioVista()) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
openOfficeUtils.convertir(
resposta.getArxiuNom(),
resultat.getContingut(),
getExtensioVista(document),
baos);
resposta.setArxiuNom(
nomArxiuAmbExtensio(
resposta.getArxiuNom(),
getExtensioVista(document)));
resposta.setArxiuContingut(baos.toByteArray());
} catch (Exception ex) {
throw new DocumentConvertirException(
"Error en la conversió del document",
ex);
}
} else {
resposta.setArxiuContingut(resultat.getContingut());
}
} else {
resposta.setArxiuContingut(document.getArxiuContingut());
}
return resposta;
}*/
private static final Log logger = LogFactory.getLog(DocumentHelperV3.class);
}