/// <summary> /// Determina se un documento si trova in uno stato di consolidamento particolare /// </summary> /// <param name="userInfo"></param> /// <param name="idDocument"></param> /// <param name="requestedState">Stato di consolidamento richiesto</param> /// <returns></returns> public static bool IsDocumentConsoldated(DocsPaVO.utente.InfoUtente userInfo, string idDocument, DocsPaVO.documento.DocumentConsolidationStateEnum requestedState) { // Reperimento stato di consolidamento del documento richiesto DocsPaVO.documento.DocumentConsolidationStateInfo actualState = GetState(userInfo, idDocument); return(actualState.State >= requestedState); }
/// <summary> /// Modifica dello stato di consolidamento di un documento /// </summary> /// <param name="idDocument"></param> /// <param name="state"></param> public DocsPaVO.documento.DocumentConsolidationStateInfo SetState(string idDocument, DocsPaVO.documento.DocumentConsolidationStateEnum toState) { DocsPaVO.documento.DocumentConsolidationStateInfo retValue = null; // Reperimento stato attuale DocsPaVO.documento.DocumentConsolidationStateInfo actualState = GetState(idDocument); if (actualState.State >= toState) { throw new ApplicationException(string.Format("Stato di consolidamento non valido per il documento con id {0}", idDocument)); } if (actualState.State == DocsPaVO.documento.DocumentConsolidationStateEnum.None && toState == DocsPaVO.documento.DocumentConsolidationStateEnum.Step2) { // Richiesta due passaggi di consolidamento in un'unica operazione this.InternalSetState(idDocument, DocsPaVO.documento.DocumentConsolidationStateEnum.Step1); retValue = this.InternalSetState(idDocument, DocsPaVO.documento.DocumentConsolidationStateEnum.Step2); } else { retValue = this.InternalSetState(idDocument, toState); } return(retValue); }
///// <summary> ///// Verifica se l'utente può consolidare il documento fornito ///// </summary> ///// <param name="userInfo"></param> ///// <param name="idDocument"></param> ///// <returns></returns> //public static bool HasDocumentConsolidationRights(DocsPaVO.utente.InfoUtente userInfo, string idDocument) //{ // bool enabled = false; // // Verifica // enabled = (HasDocumentConsolidationRights(userInfo)); // if (enabled) // { // // Verifica se l'utente dispone dei diritti di lettura / scrittura sul documento // DocsPaDB.Query_DocsPAWS.Security securityDb = new DocsPaDB.Query_DocsPAWS.Security(); // enabled = securityDb.HasReadWriteAccessRights(idDocument, userInfo.idPeople, userInfo.idGruppo); // } // return enabled; //} /// <summary> /// Verifica se, in base allo stato di consolidamento del documento, l'utente è autorizzato ad effettuare una determinata azione /// </summary> /// <param name="userInfo"></param> /// <param name="idDocument"></param> /// <param name="action"></param> /// <param name="throwOnError"></param> /// <returns></returns> public static bool CanExecuteAction(DocsPaVO.utente.InfoUtente userInfo, string idDocument, ConsolidationActionsDeniedEnum action, bool throwOnError) { if (IsConfigEnabled()) { DocsPaVO.documento.DocumentConsolidationStateInfo actualState = GetState(userInfo, idDocument); if (actualState.State == DocsPaVO.documento.DocumentConsolidationStateEnum.None) { return(true); } else { // Determina, dai metadati dell'enumeration, a quale stato di consolidamento si riferisce l'azione richiesta DocsPaVO.documento.DocumentConsolidationStateEnum actionApplyState = DocumentConsolidationAttribute.GetState(action); bool canExecute = (actualState.State < actionApplyState); if (!canExecute && throwOnError) { throw new ApplicationException("L'azione non può essere eseguita, il documento risulta in stato consolidato"); } return(canExecute); } } else { return(true); } }
/// <summary> /// Reperimento delle informazioni di stato consolidamento di un documento /// </summary> /// <param name="idDocument"></param> /// <returns></returns> public DocsPaVO.documento.DocumentConsolidationStateInfo GetState(string idDocument) { logger.Info("BEGIN"); try { DocsPaVO.documento.DocumentConsolidationStateInfo retValue = null; using (DocsPaDB.DBProvider dbProvider = new DBProvider()) { DocsPaUtils.Query queryDef = DocsPaUtils.InitQuery.getInstance().getQuery("S_GET_DOCUMENT_CONSOLIDATION_STATE"); queryDef.setParam("idDocument", idDocument); string commandText = queryDef.getSQL(); logger.Debug(commandText); using (System.Data.IDataReader reader = dbProvider.ExecuteReader(commandText)) { if (reader.Read()) { retValue = new DocsPaVO.documento.DocumentConsolidationStateInfo { State = (DocsPaVO.documento.DocumentConsolidationStateEnum) Enum.Parse(typeof(DocsPaVO.documento.DocumentConsolidationStateEnum), DocsPaUtils.Data.DataReaderHelper.GetValue <string>(reader, "CONSOLIDATION_STATE", true, "0"), true), Author = DocsPaUtils.Data.DataReaderHelper.GetValue <object>(reader, "CONSOLIDATION_AUTHOR", true, string.Empty).ToString(), Role = DocsPaUtils.Data.DataReaderHelper.GetValue <object>(reader, "CONSOLIDATION_ROLE", true, string.Empty).ToString(), Date = DocsPaUtils.Data.DataReaderHelper.GetValue <DateTime>(reader, "CONSOLIDATION_DATE", true).ToString() }; } else { throw new Exception(string.Format("Documento con id {0} non trovato: impossibile determinare lo stato di consolidamento", idDocument)); } } } logger.Info("END"); return(retValue); } catch (Exception ex) { string errorMessage = string.Format("Errore nel reperimento dello stato di consolidamento del documento con id {0}", idDocument); logger.Error(errorMessage, ex); throw new ApplicationException(errorMessage, ex); } }
/// <summary> /// Verifica se, in base allo stato di consolidamento del documento, l'utente è autorizzato ad effettuare modifiche ai metadati del documento /// </summary> /// <param name="userInfo"></param> /// <param name="idDocument"></param> /// <param name="action"></param> /// <returns></returns> public static bool CanChangeMetadata( DocsPaVO.utente.InfoUtente userInfo, string idDocument, ConsolidationMetadataChangeDeniedEnum metadata) { DocsPaVO.documento.DocumentConsolidationStateInfo actualState = GetState(userInfo, idDocument); if (actualState.State == DocsPaVO.documento.DocumentConsolidationStateEnum.None) { return(true); } else { // Determina, dai metadati dell'enumeration, a quale stato di consolidamento si riferisce la modifica dei metadati DocsPaVO.documento.DocumentConsolidationStateEnum actionApplyState = DocumentConsolidationAttribute.GetState(metadata); return(actualState.State < actionApplyState); } }
/// <summary> /// /// </summary> /// <param name="idDocument"></param> /// <param name="toState"></param> /// <returns></returns> protected virtual DocsPaVO.documento.DocumentConsolidationStateInfo InternalSetState(string idDocument, DocsPaVO.documento.DocumentConsolidationStateEnum toState) { try { DocsPaVO.documento.DocumentConsolidationStateInfo retValue = null; using (DocsPaDB.DBProvider dbProvider = new DBProvider()) { DocsPaUtils.Query queryDef = DocsPaUtils.InitQuery.getInstance().getQuery("S_SET_DOCUMENT_CONSOLIDATION_STATE"); queryDef.setParam("state", ((int)toState).ToString()); queryDef.setParam("author", this.UserInfo.idPeople); queryDef.setParam("role", this.UserInfo.idGruppo); queryDef.setParam("date", DocsPaDbManagement.Functions.Functions.GetDate()); queryDef.setParam("idDocument", idDocument); string commandText = queryDef.getSQL(); logger.Debug(commandText); int rowsAffected; if (dbProvider.ExecuteNonQuery(commandText, out rowsAffected)) { // Reperimento stato di consolidamento aggiornato retValue = this.GetState(idDocument); if (toState == DocsPaVO.documento.DocumentConsolidationStateEnum.Step2) { // Inserimento dei dati fondamentali del documento consolidato nella tabella dello storico queryDef = DocsPaUtils.InitQuery.getInstance().getQuery("I_INSERT_CONSOLIDATED_DOCUMENT"); queryDef.setParam("idDocument", idDocument); queryDef.setParam("userdb", DocsPaDbManagement.Functions.Functions.GetDbUserSession()); commandText = queryDef.getSQL(); logger.Debug(commandText); if (dbProvider.ExecuteNonQuery(commandText, out rowsAffected)) { if (rowsAffected == 0) { throw new ApplicationException("Errore nella storicizzazione dei dati del documento consolidato"); } } else { throw new ApplicationException("Errore nell'esecuzione della query I_INSERT_CONSOLIDATED_DOCUMENT"); } } } else { throw new ApplicationException("Errore nell'esecuzione della query U_SET_DOCUMENT_CONSOLIDATION_STATE"); } return(retValue); } } catch (Exception ex) { string errorMessage = string.Format("Errore nell'impostazione dello stato di consolidamento del documento con id {0}", idDocument); logger.Debug(errorMessage, ex); throw new ApplicationException(errorMessage, ex); } }
/// <summary> /// /// </summary> /// <param name="userInfo"></param> /// <param name="idDocument"></param> /// <param name="toState"></param> /// <param name="bypassFinalStateCheck"> /// Se true, indica di non effettuare i controlli sul consolidamento di un documento in stato finale /// </param> /// <returns></returns> internal static DocsPaVO.documento.DocumentConsolidationStateInfo ConsolidateNoSecurity(DocsPaVO.utente.InfoUtente userInfo, string idDocument, DocsPaVO.documento.DocumentConsolidationStateEnum toState, bool bypassFinalStateCheck) { bool cont = true; //if (!HasDocumentConsolidationRights(userInfo)) // throw new ApplicationException(string.Format("L'utente {0} non dispone dei diritti necessari per effettuare l'operazione di consolidamento", userInfo.userId)); // Reperimento stato di consolidamento del documento richiesto DocsPaVO.documento.SchedaDocumento savedDocument = BusinessLogic.Documenti.DocManager.getDettaglioNoSecurity(userInfo, idDocument); if (savedDocument.documentoPrincipale != null) { cont = false; } if (savedDocument.checkOutStatus != null) { cont = false; } // Verifica sei il documento si trova nello stato finale if (!bypassFinalStateCheck) { DocsPaVO.DiagrammaStato.Stato workflowState = BusinessLogic.DiagrammiStato.DiagrammiStato.getStatoDoc(savedDocument.docNumber); if (workflowState != null && workflowState.STATO_FINALE) { cont = false; } } //// Verifica dei diritti di lettura / scrittura sul documento //int accessRights; //Int32.TryParse(savedDocument.accessRights, out accessRights); //if (accessRights > 0 && accessRights < 63) // throw new ApplicationException(string.Format("L'utente {0} non dispone dei diritti di lettura / scrittura sul documento necessari per effettuare l'operazione di consolidamento", userInfo.userId)); DocsPaVO.documento.DocumentConsolidationStateInfo state = savedDocument.ConsolidationState; // Controllo sullo stato di destinazione if (toState <= state.State) { cont = false; } // Un documento predisposto alla protocollazione non può essere consolidato in quanto rappresenta uno stato intermedio if (savedDocument.predisponiProtocollazione) { cont = false; } if (cont) { using (DocsPaDB.TransactionContext transactionalContext = new DocsPaDB.TransactionContext()) { // Operazione di consolidamento DocsPaDB.Query_DocsPAWS.DocumentConsolidation consolidationDb = new DocsPaDB.Query_DocsPAWS.DocumentConsolidation(userInfo); state = consolidationDb.SetState(idDocument, toState); // Operazione di consolidamento sui singoli allegati del documento foreach (DocsPaVO.documento.Allegato attatchment in AllegatiManager.getAllegati(idDocument, string.Empty)) { DocsPaVO.documento.DocumentConsolidationStateInfo attState = null; attState = consolidationDb.SetState(attatchment.docNumber, toState); } transactionalContext.Complete(); } } return(state); }
/// <summary> /// /// </summary> /// <param name="userInfo"></param> /// <param name="idDocument"></param> /// <param name="toState"></param> /// <param name="bypassFinalStateCheck"> /// Se true, indica di non effettuare i controlli sul consolidamento di un documento in stato finale /// </param> /// <returns></returns> internal static DocsPaVO.documento.DocumentConsolidationStateInfo Consolidate(DocsPaVO.utente.InfoUtente userInfo, string idDocument, DocsPaVO.documento.DocumentConsolidationStateEnum toState, bool bypassFinalStateCheck) { if (!HasDocumentConsolidationRights(userInfo)) { throw new ApplicationException(string.Format("L'utente {0} non dispone dei diritti necessari per effettuare l'operazione di consolidamento", userInfo.userId)); } // Reperimento stato di consolidamento del documento richiesto DocsPaVO.documento.SchedaDocumento savedDocument = BusinessLogic.Documenti.DocManager.getDettaglio(userInfo, idDocument, idDocument); if (savedDocument.documentoPrincipale != null) { throw new ApplicationException("Il documento risulta un allegato di un altro documento, pertanto non può essere consolidato singolarmente"); } if (savedDocument.checkOutStatus != null) { throw new ApplicationException(string.Format("Il documento risulta bloccato dall'utente {0}, pertanto non può essere consolidato", savedDocument.checkOutStatus.UserName)); } if (BusinessLogic.LibroFirma.LibroFirmaManager.IsDocOrAllInLibroFirma(savedDocument.docNumber)) { throw new ApplicationException("Il documento o uno dei suoi allegati risulta coinvolto in un processo di firma, pertanto non può essere consolidato "); } // Verifica sei il documento si trova nello stato finale if (!bypassFinalStateCheck) { DocsPaVO.DiagrammaStato.Stato workflowState = BusinessLogic.DiagrammiStato.DiagrammiStato.getStatoDoc(savedDocument.docNumber); if (workflowState != null && workflowState.STATO_FINALE) { throw new ApplicationException("Il documento risulta in stato finale"); } } // Verifica dei diritti di lettura / scrittura sul documento int accessRights; Int32.TryParse(savedDocument.accessRights, out accessRights); if (accessRights > 0 && accessRights < 63) { throw new ApplicationException(string.Format("L'utente {0} non dispone dei diritti di lettura / scrittura sul documento necessari per effettuare l'operazione di consolidamento", userInfo.userId)); } DocsPaVO.documento.DocumentConsolidationStateInfo state = savedDocument.ConsolidationState; // Controllo sullo stato di destinazione if (toState <= state.State) { throw new ApplicationException(string.Format("Il documento è attualmente in stato '{1}'", idDocument, DocsPaVO.documento.DocumentConsolidationStateDescriptionAttribute.GetDescription(state.State))); } // Un documento predisposto alla protocollazione non può essere consolidato in quanto rappresenta uno stato intermedio if (savedDocument.predisponiProtocollazione) { throw new ApplicationException("Il documento risulta predisposto alla protocollazione e non può essere consolidato"); } using (DocsPaDB.TransactionContext transactionalContext = new DocsPaDB.TransactionContext()) { // Operazione di consolidamento DocsPaDB.Query_DocsPAWS.DocumentConsolidation consolidationDb = new DocsPaDB.Query_DocsPAWS.DocumentConsolidation(userInfo); state = consolidationDb.SetState(idDocument, toState); // Operazione di consolidamento sui singoli allegati del documento foreach (DocsPaVO.documento.Allegato attatchment in AllegatiManager.getAllegati(idDocument, string.Empty)) { DocsPaVO.documento.DocumentConsolidationStateInfo attState = null; attState = consolidationDb.SetState(attatchment.docNumber, toState); } transactionalContext.Complete(); } return(state); }
/// <summary> /// Verifica se, in base allo stato di consolidamento del documento, l'utente è autorizzato ad effettuare modifiche ai metadati del documento /// </summary> /// <param name="userInfo"></param> /// <param name="document"></param> /// <param name="throwOnError"> /// Se true, lancia un'eccezione se i dati non possono essere modificati /// </param> /// <returns></returns> public static bool CanChangeMetadata(DocsPaVO.utente.InfoUtente userInfo, DocsPaVO.documento.SchedaDocumento document, bool throwOnError) { bool canChange = false; DocsPaVO.documento.DocumentConsolidationStateInfo actualState = GetState(userInfo, document.systemId); if (actualState.State == DocsPaVO.documento.DocumentConsolidationStateEnum.None || actualState.State == DocsPaVO.documento.DocumentConsolidationStateEnum.Step1) { // Il primo stato di consolidamento consente ancora di modificare tutti i metadati?? canChange = true; } else if (actualState.State == DocsPaVO.documento.DocumentConsolidationStateEnum.Step2) { // Nome del campo oggetto del controllo string fieldName = string.Empty; // Reperimento dati del documento salvati DocsPaVO.documento.SchedaDocumento savedDocument = BusinessLogic.Documenti.DocManager.getDettaglio(userInfo, document.systemId, document.docNumber); // 1. Verifica oggetto fieldName = "dell'oggetto"; canChange = AreEquals(document.oggetto, savedDocument.oggetto); if (canChange && document.protocollo != null && savedDocument.protocollo != null) { // 2. Verifica mittenti / destinatari fieldName = "dei mittenti o destinatari"; canChange = AreEquals(document.protocollo, savedDocument.protocollo); } if (canChange) { // 3. Verifica data arrivo fieldName = "della data arrivo"; string dataArrivoAsString = string.Empty; string savedDataArrivoAsString = string.Empty; if (document.documenti != null && document.documenti.Count > 0) { DocsPaVO.documento.Documento firstDoc = document.documenti[0] as DocsPaVO.documento.Documento; if (firstDoc != null) { dataArrivoAsString = firstDoc.dataArrivo; } } if (savedDocument.documenti != null && savedDocument.documenti.Count > 0) { DocsPaVO.documento.Documento firstDoc = savedDocument.documenti[0] as DocsPaVO.documento.Documento; if (firstDoc != null) { savedDataArrivoAsString = firstDoc.dataArrivo; } } DateTime dataArrivo; DateTime savedDataArrivo; DateTime.TryParse(dataArrivoAsString, out dataArrivo); DateTime.TryParse(savedDataArrivoAsString, out savedDataArrivo); canChange = (DateTime.Compare(dataArrivo, savedDataArrivo) == 0); } if (!canChange && throwOnError) { throw new ApplicationException(string.Format("La modifica {0} non può essere effettuata in quanto il documento risulta in stato consolidato nei metadati", fieldName)); } } return(canChange); }