/// <summary> /// Aggiornamento di un documento /// </summary> /// <remarks> /// Il metodo aggiorna creando una nuova versione solo se ci sono delle modifiche apportate al file o ai metadati /// </remarks> /// <param name="request"> /// <see cref="AggiornaDocumentoRequest">request</see> /// </param> /// <returns> /// <see cref="AggiornaDocumentoResponse">response</see> /// </returns> /// <example> /// var request = new AggiornaDocumentoRequest /// { /// IdClient = "desktop", /// IdRichiesta = "20081128000001", /// IdCliente = "ClienteTest", /// TipoDocumento = "DDT_ATH_TEST2", /// Chiave = "IVA0000001", /// IdDocumento = new Guid("dbd44243-d746-4e5d-b3c4-2caf4cf9ac32") /// }; /// /// request.Metadati.Add(new MetadatoItem { Name = "TipoDocumento", Value = "IVA" }); /// request.Metadati.Add(new MetadatoItem { Name = "Tipologia", Value = "IVA" }); /// request.Metadati.Add(new MetadatoItem { Name = "ProgressivoDocumento", Value = 1 }); /// request.Metadati.Add(new MetadatoItem { Name = "NomeArchivio", Value = "Test" }); /// request.Metadati.Add(new MetadatoItem { Name = "idBiblos", Value = 1 }); /// request.Metadati.Add(new MetadatoItem { Name = "DataInserimentoDocumento", Value = DateTime.Now }); /// /// AggiornaDocumentoResponse actual; /// actual = DocumentoFacade.AggiornaDocumento(request); /// Assert.AreEqual(actual.CodiceEsito, CodiceErrore.NessunErrore); /// </example> public static AggiornaDocumentoResponse AggiornaDocumento(AggiornaDocumentoRequest request) { var response = new AggiornaDocumentoResponse(); try { logger.DebugFormat("AggiornaDocumento request:{0}", request.ToString()); response.TokenInfo = Helpers.ValidaToken(request); if (response.TokenInfo == null) { response.CodiceEsito = CodiceErrore.TokenNonValidoOScaduto; } else { var checkRequestResult = request.CheckRequest(response); if (checkRequestResult != CodiceErrore.NessunErrore) { response.CodiceEsito = checkRequestResult; response.Eseguito = false; } else { //Recupero Archive var idArchive = Helpers.GetArchive(request); if (!idArchive.HasValue) { response.CodiceEsito = CodiceErrore.ArchivioNonDefinito; response.Eseguito = false; } else { EseguiAggiornamento(request.Metadati, request.File, request.IdClient, request.IdDocumento, idArchive.Value, response); logger.DebugFormat("AggiornaDocumento response:{0}", response.ToString()); } } } } catch (Exception ex) { logger.Error(ex); response.Eseguito = false; response.CodiceEsito = CodiceErrore.ErroreGenerico; response.MessaggioErrore = ex.ToString(); } response.CheckResponse(); return(response); }
private static void EseguiAggiornamento(IEnumerable <MetadatoItem> metadati, FileItem file, string idClient, Guid idDocumento, Guid idArchive, AggiornaDocumentoResponse response) { try { var documento = new Document(); var metadata = Helpers.GetBiblosDSMetadataStructure(idArchive); documento.AttributeValues = new BindingList <DocumentAttributeValue>(metadati.Convert(metadata)); documento.Archive = new DocumentArchive(idArchive); documento.IdDocument = idDocumento; //TODO gestire gli allegati using (var client = new DocumentsClient()) { var isCheckOut = false; try { var forceUndo = true; var checkOutDocument = client.DocumentCheckOut(idDocumento, true, idClient); isCheckOut = true; DocumentContent content = null; if (file != null) { documento.Content = new DocumentContent(file.Blob); content = documento.Content; logger.DebugFormat("Check Document Status: {0}", checkOutDocument.Status == null ? "Null" : checkOutDocument.Status.IdStatus.ToString()); if (checkOutDocument.DocumentLink != null || (checkOutDocument.Status != null && checkOutDocument.Status.IdStatus != (short)DocumentStatus.ProfileOnly)) { content = client.GetDocumentContentById(documento.IdDocument); //Verifica se i file sono modificati if (content != null) { if (Helpers.GetDocumentHash(content) != Helpers.GetDocumentHash(documento.Content)) { content = documento.Content; forceUndo = false; documento.Name = Path.GetFileName(file.Nome); } else { content = null; } } } else { documento.Name = Path.GetFileName(file.Nome); } } foreach (var item in documento.AttributeValues) { if (checkOutDocument.AttributeValues.Any(x => x.Attribute.IdAttribute == item.IdAttribute)) { if (item.Value != checkOutDocument.AttributeValues.First(x => x.Attribute.IdAttribute == item.IdAttribute).Value) { checkOutDocument.AttributeValues.First(x => x.Attribute.IdAttribute == item.IdAttribute).Value = item.Value; forceUndo = false; } } else { checkOutDocument.AttributeValues.Add(item); forceUndo = false; } } Guid newId = documento.IdDocument; if (forceUndo) { client.DocumentUndoCheckOut(idDocumento, idClient); } else { checkOutDocument.Content = content; checkOutDocument.Name = documento.Name; newId = client.DocumentCheckIn(checkOutDocument, idClient); Helpers.UpdateDocumentIdByIdDocument(idDocumento, newId); response.Eseguito = true; } //TODO Popolare Chiavi = response.Documento = new DocumentoItem { IdDocumento = newId, Stato = forceUndo ? Operazione.Default : Operazione.Update, Chiavi = documento.AttributeValues.Where(x => x.Attribute.IsRequired).Select(x => new MetadatoItem { Name = x.Attribute.Name, Value = x.Value }).ToList(), Nome = documento.Name }; } catch (FaultException <BiblosDsException> faultEx) { logger.Error(faultEx); response.Eseguito = false; ParseBiblosDSFaultException(response, faultEx); } catch (Exception ex) { logger.Error(ex); if (isCheckOut) { try { client.DocumentUndoCheckOut(idDocumento, idClient); } catch (Exception exUndo) { logger.Fatal(exUndo); } } response.Eseguito = false; response.CodiceEsito = CodiceErrore.ErroreGenerico; response.MessaggioErrore = ex.ToString(); } } } catch (AttributoNonTrovato ex) { logger.Error(ex); response.Eseguito = false; response.CodiceEsito = CodiceErrore.AttributoNonTrovato; } catch (Exception ex) { logger.Error(ex); response.Eseguito = false; response.CodiceEsito = CodiceErrore.ErroreGenerico; } }