private string GetEndMotivation(IQueryable <WorkflowProperty> properties, out DateTimeOffset?endMotivationDate) { WorkflowProperty workflowProperty = properties.FirstOrDefault(x => x.Name == WorkflowPropertyHelper.DSW_FIELD_ACTIVITY_END_MOTIVATION); endMotivationDate = workflowProperty == null ? default(DateTimeOffset?) : workflowProperty.RegistrationDate; return(workflowProperty == null ? string.Empty : workflowProperty.ValueString); }
private WorkflowAccount GetRequestorUsername(WorkflowActivity src, IQueryable <WorkflowProperty> properties) { WorkflowProperty workflowProperty = properties.FirstOrDefault(x => x.Name == WorkflowPropertyHelper.DSW_PROPERTY_PROPOSER_USER); return(workflowProperty == null ? new WorkflowAccount { AccountName = src.RegistrationUser } : JsonConvert.DeserializeObject <WorkflowAccount>(workflowProperty.ValueString)); }
private WorkflowReferenceModel GetEndReferenceModel(IQueryable <WorkflowProperty> properties) { WorkflowProperty workflowProperty = properties.FirstOrDefault(x => x.Name == WorkflowPropertyHelper.DSW_FIELD_ACTIVITY_END_REFERENCE_MODEL); string documentsSerialized = workflowProperty == null ? string.Empty : workflowProperty.ValueString; WorkflowReferenceModel workflowReferenceModel = (documentsSerialized == string.Empty || documentsSerialized == null) ? null : JsonConvert.DeserializeObject <WorkflowReferenceModel>(documentsSerialized); return(workflowReferenceModel); }
private WorkflowAccount GetAuthorizationUser(IQueryable <WorkflowProperty> properties) { WorkflowProperty workflowProperty = properties.FirstOrDefault(x => x.Name == WorkflowPropertyHelper.DSW_PROPERTY_ACCOUNTS); WorkflowProperty workflowPropertyPosition = properties.FirstOrDefault(x => x.Name == WorkflowPropertyHelper.DSW_FIELD_RECIPIENT_POSITION); int position = 0; if (workflowPropertyPosition != null && workflowPropertyPosition.ValueInt.HasValue) { position = (int)workflowPropertyPosition.ValueInt.Value; } WorkflowAccount workflowAccount = workflowProperty == null ? null : JsonConvert.DeserializeObject <List <WorkflowAccount> >(workflowProperty.ValueString).ElementAtOrDefault(position); return(workflowAccount); }
public static List <BuildValueModel> BuildValueProposerRole(WorkflowProperty dsw_p_ProposerRole, List <BuildValueModel> buildValueModels) { if (dsw_p_ProposerRole != null && !string.IsNullOrEmpty(dsw_p_ProposerRole.ValueString)) { Model.Workflow.WorkflowRole workflowRole = JsonConvert.DeserializeObject <Model.Workflow.WorkflowRole>(dsw_p_ProposerRole.ValueString, DocSuiteContext.DefaultWebAPIJsonSerializerSettings); if (workflowRole != null && !string.IsNullOrEmpty(workflowRole.Name)) { buildValueModels.Add(new BuildValueModel() { IsHTML = false, Name = "ProposerRoleName", Value = workflowRole.Name, }); } } return(buildValueModels); }
private async Task <WorkflowResult> StartWorkflowJson(WorkflowStart content) { WorkflowResult validationResult = new WorkflowResult(); WorkflowRepository workflowRepository = _unitOfWork.Repository <WorkflowRepository>().GetByName(content.WorkflowName); if (workflowRepository == null) { throw new DSWValidationException("Evaluate start workflow validation error", new List <ValidationMessageModel>() { new ValidationMessageModel { Key = "WorkflowStart", Message = $"Impossibile avviare il workflow '{content.WorkflowName}' in quanto non esiste nel repositories dei workflow validi." } }, null, DSWExceptionCode.VA_RulesetValidation); } WorkflowInstance workflowInstance = new WorkflowInstance() { Status = WorkflowStatus.Todo, WorkflowRepository = workflowRepository, Json = workflowRepository.Json, Subject = workflowRepository.Name }; WorkflowProperty prop; foreach (KeyValuePair <string, WorkflowArgument> item in content.Arguments) { prop = _workflowArgumentMapper.Map(item.Value, new WorkflowProperty()); prop.WorkflowType = WorkflowType.Workflow; workflowInstance.WorkflowProperties.Add(prop); } WorkflowProperty _dsw_p_WorkflowStartMotivationRequired = workflowInstance.WorkflowProperties.SingleOrDefault(f => f.Name == WorkflowPropertyHelper.DSW_PROPERTY_WORKFLOW_START_MOTIVATION_REQUIRED); WorkflowProperty _dsw_p_InstanceSubject = workflowInstance.WorkflowProperties.SingleOrDefault(f => f.Name == WorkflowPropertyHelper.DSW_PROPERTY_INSTANCE_SUBJECT); WorkflowProperty _dsw_v_Workflow_ActiveInstanceSubjectUnique = workflowInstance.WorkflowProperties.SingleOrDefault(f => f.Name == WorkflowPropertyHelper.DSW_VALIDATION_INSTANCE_ACTIVE_SUBJECT_UNIQUE); WorkflowProperty _dsw_v_Workflow_StartValidations = workflowInstance.WorkflowProperties.SingleOrDefault(f => f.Name == WorkflowPropertyHelper.DSW_VALIDATION_WORKFLOW_START); WorkflowProperty _dsw_p_ReferenceModel = workflowInstance.WorkflowProperties.SingleOrDefault(f => f.Name == WorkflowPropertyHelper.DSW_PROPERTY_REFERENCE_MODEL); if (_dsw_v_Workflow_StartValidations != null && !string.IsNullOrEmpty(_dsw_v_Workflow_StartValidations.ValueString)) { Dictionary <DSWEnvironmentType, WorkflowRuleDefinition> deserializedWorkflowStartValidation = JsonConvert.DeserializeObject <Dictionary <DSWEnvironmentType, WorkflowRuleDefinition> >(_dsw_v_Workflow_StartValidations.ValueString); Guid fascicleId = JsonConvert.DeserializeObject <WorkflowReferenceModel>(_dsw_p_ReferenceModel.ValueString).ReferenceId; #region Intermediate Validations if (!(deserializedWorkflowStartValidation is Dictionary <DSWEnvironmentType, WorkflowRuleDefinition>)) { throw new DSWValidationException("Evaluate start workflow validation error", new List <ValidationMessageModel>() { new ValidationMessageModel { Key = "WorkflowStart", Message = $"Impossibile avviare il workflow '{content.WorkflowName}' in quanto le definizioni delle regole di avvio non sono valide (struttura non valida)." } }, null, DSWExceptionCode.VA_RulesetValidation); } if (deserializedWorkflowStartValidation.Keys.FirstOrDefault().ToString() != EnumHelper.GetDescription(DSWEnvironmentType.Fascicle)) { throw new DSWValidationException("Evaluate start workflow validation error", new List <ValidationMessageModel>() { new ValidationMessageModel { Key = "WorkflowStart", Message = $"Impossibile avviare il workflow '{content.WorkflowName}' in quanto il motore supporta definizioni solo per il modulo Fascicoli (environment non supportato)." } }, null, DSWExceptionCode.VA_RulesetValidation); } #endregion List <ValidationMessageModel> errorResult = new List <ValidationMessageModel>(); ICollection <WorkflowRule> deserializedWorkflowRules = deserializedWorkflowStartValidation[DSWEnvironmentType.Fascicle].Rules; await ValidateWorkflowRules(fascicleId, errorResult, deserializedWorkflowRules); } if (_dsw_p_InstanceSubject != null) { workflowInstance.Subject = _dsw_p_InstanceSubject.ValueString; _logger.WriteDebug(new LogMessage($"SET INSTANCE SUBJECT: {workflowInstance.Subject}"), LogCategories); } if (_dsw_p_WorkflowStartMotivationRequired != null && _dsw_p_WorkflowStartMotivationRequired.ValueBoolean.HasValue && _dsw_p_WorkflowStartMotivationRequired.ValueBoolean.Value) { WorkflowProperty dsw_p_Subject = workflowInstance.WorkflowProperties.SingleOrDefault(f => f.Name == WorkflowPropertyHelper.DSW_PROPERTY_SUBJECT); if (dsw_p_Subject == null || string.IsNullOrEmpty(dsw_p_Subject.ValueString)) { throw new DSWValidationException("Evaluate start workflow validation error", new List <ValidationMessageModel>() { new ValidationMessageModel { Key = "WorkflowStart", Message = $"Impossibile avviare il flusso di lavoro se non è stata fornita una motivazione" } }, null, DSWExceptionCode.VA_RulesetValidation); } } if (_dsw_v_Workflow_ActiveInstanceSubjectUnique != null && _dsw_v_Workflow_ActiveInstanceSubjectUnique.ValueBoolean.HasValue && _dsw_v_Workflow_ActiveInstanceSubjectUnique.ValueBoolean.Value) { if (_unitOfWork.Repository <WorkflowInstance>().CountActiveInstances(workflowInstance.WorkflowRepository.UniqueId, workflowInstance.Subject) > 0) { throw new DSWValidationException("Evaluate start workflow validation error", new List <ValidationMessageModel>() { new ValidationMessageModel { Key = "WorkflowStart", Message = $"Impossibile avviare un nuovo flusso di lavoro in cui l'oggetto '{workflowInstance.Subject}' è stato come unico attivo. Completare i restanti flussi di lavoro attivi." } }, null, DSWExceptionCode.VA_RulesetValidation); } } _unitOfWork.BeginTransaction(); Guid instanceId = Guid.NewGuid(); workflowInstance = await _workflowInstanceService.CreateAsync(workflowInstance); await PopulateActivityAsync(workflowInstance, instanceId, workflowInstance.WorkflowRepository, workflowInstance.WorkflowProperties.Where(f => !f.Name.Equals(WorkflowPropertyHelper.DSW_ACTION_ACTIVITY_MANUAL_COMPLETE))); bool result = await _unitOfWork.SaveAsync(); _unitOfWork.BeginTransaction(); workflowInstance.Status = WorkflowStatus.Progress; if (!workflowInstance.InstanceId.HasValue) { workflowInstance.InstanceId = instanceId; } workflowInstance = await _workflowInstanceService.UpdateAsync(workflowInstance); result = await _unitOfWork.SaveAsync(); validationResult.InstanceId = workflowInstance.InstanceId; validationResult.IsValid = true; _logger.WriteInfo(new LogMessage($"Assing workflowInstance.InstanceId [{workflowInstance.InstanceId}] for {workflowInstance.WorkflowRepository.Name}"), LogCategories); return(validationResult); }
public ProtocolInitializer GetProtocolInitializer(IReadOnlyCollection <TenantModel> tenantModels, ProtocolModel protocolModel, Collaboration collaboration, WorkflowProperty dsw_p_CollaborationSignSummaryTemplateId, WorkflowProperty dsw_a_Collaboration_GenerateSignSummary, WorkflowProperty dsw_p_ProposerRole, UDSDto udsDto) { ProtocolInitializer protInitializer = new ProtocolInitializer(); // Oggetto protInitializer.Subject = protocolModel.Object; // Protocol Type protInitializer.ProtocolType = protocolModel.ProtocolType.EntityShortId; //Note protInitializer.Notes = protocolModel.Note; //Protocollo protInitializer.DocumentProtocol = protocolModel.DocumentProtocol; //Date protInitializer.DocumentDate = protocolModel.DocumentDate; // Classificazione if (protocolModel.Category != null && protocolModel.Category.IdCategory.HasValue) { protInitializer.Category = FacadeFactory.Instance.CategoryFacade.GetById(protocolModel.Category.IdCategory.Value); } if (protocolModel.Container != null && protocolModel.Container.IdContainer.HasValue) { protInitializer.Containers = new List <Data.Container> { FacadeFactory.Instance.ContainerFacade.GetById(Convert.ToInt32(protocolModel.Container.IdContainer)) }; } if (protocolModel.DocumentTypeCode != null) { protInitializer.DocumentTypeLabel = FacadeFactory.Instance.TableDocTypeFacade.GetByCode(protocolModel.DocumentTypeCode).Description; } string owner = DocSuiteContext.Current.User.UserName; // Gestione documenti if (protocolModel.MainDocument != null && !string.IsNullOrEmpty(protocolModel.MainDocument.FileName) && (protocolModel.MainDocument.ContentStream != null || protocolModel.MainDocument.DocumentId.HasValue)) { protInitializer.MainDocument = SaveStream(owner, protocolModel.MainDocument); } // Allegati IEnumerable <DocumentModel> results = null; if (protocolModel.Attachments != null && (results = protocolModel.Attachments.Where(f => !string.IsNullOrEmpty(f.FileName) && (f.ContentStream != null || f.DocumentId.HasValue))).Any()) { protInitializer.Attachments = SaveStream(owner, results); } if (collaboration != null && dsw_p_CollaborationSignSummaryTemplateId != null && dsw_a_Collaboration_GenerateSignSummary != null && dsw_a_Collaboration_GenerateSignSummary.ValueBoolean.HasValue && dsw_a_Collaboration_GenerateSignSummary.ValueBoolean.Value && dsw_p_CollaborationSignSummaryTemplateId.ValueGuid.HasValue && dsw_p_CollaborationSignSummaryTemplateId.ValueGuid.Value != Guid.Empty) { TemplateDocumentRepository templateDocumentRepository = WebAPIImpersonatorFacade.ImpersonateFinder(new TemplateDocumentRepositoryFinder(tenantModels), (impersonationType, finder) => { finder.UniqueId = dsw_p_CollaborationSignSummaryTemplateId.ValueGuid.Value; finder.EnablePaging = false; return(finder.DoSearch().SingleOrDefault()?.Entity); }); if (templateDocumentRepository != null) { BiblosChainInfo biblosChainInfo = new BiblosChainInfo(templateDocumentRepository.IdArchiveChain); DocumentInfo biblosDocumentInfo = biblosChainInfo.Documents.Single(f => !f.IsRemoved); List <BuildValueModel> buildValueModels = new List <BuildValueModel>(); buildValueModels.Add(new BuildValueModel() { IsHTML = false, Name = "oggetto", Value = protInitializer.Subject, }); DateTime signDate; string token; foreach (CollaborationSign item in collaboration.CollaborationSigns) { signDate = item.SignDate ?? item.LastChangedDate.Value.DateTime; token = signDate.DayOfWeek == DayOfWeek.Sunday ? "la" : "il"; buildValueModels.Add(new BuildValueModel() { IsHTML = false, Name = $"signer_info_{item.Incremental}", Value = $"{item.SignName} {token} {signDate.ToLongDateString()}", }); } buildValueModels = BuildValueProposerRole(dsw_p_ProposerRole, buildValueModels); buildValueModels = BuildValueUDS(udsDto, buildValueModels); byte[] pdf = Services.StampaConforme.Service.BuildPDF(biblosDocumentInfo.Stream, buildValueModels.ToArray(), string.Empty); if (protInitializer.Attachments == null) { protInitializer.Attachments = new List <DocumentInfo>(); } protInitializer.Attachments.Add(SaveStream(owner, pdf, "riepilogo_firmatari.pdf")); } } // Annessi results = null; if (protocolModel.Annexes != null && (results = protocolModel.Annexes.Where(f => !string.IsNullOrEmpty(f.FileName) && (f.ContentStream != null || f.DocumentId.HasValue))).Any()) { protInitializer.Annexed = SaveStream(owner, results); } // Contatti protInitializer.Senders = new List <Data.ContactDTO>(); protInitializer.Recipients = new List <Data.ContactDTO>(); if (protocolModel.ContactManuals != null && protocolModel.ContactManuals.Any()) { foreach (ProtocolContactManualModel protocolContactManualModel in protocolModel.ContactManuals) { Data.Contact contact = new Data.Contact(); contact.ContactType = new Data.ContactType(Data.ContactType.Aoo); contact.Description = protocolContactManualModel.Description; contact.CertifiedMail = protocolContactManualModel.CertifiedEmail; contact.EmailAddress = protocolContactManualModel.EMail; if (!string.IsNullOrEmpty(protocolContactManualModel.Address)) { contact.Address = new Data.Address(); contact.Address.Address = protocolContactManualModel.Address; } if (protocolContactManualModel.ComunicationType == ComunicationType.Sender) { protInitializer.Senders.Add(new Data.ContactDTO(contact, Data.ContactDTO.ContactType.Manual)); } else { protInitializer.Recipients.Add(new Data.ContactDTO(contact, Data.ContactDTO.ContactType.Manual)); } } } if (protocolModel.Contacts != null && protocolModel.Contacts.Any()) { foreach (ProtocolContactModel protocolContactModel in protocolModel.Contacts) { Data.Contact contact = FacadeFactory.Instance.ContactFacade.GetById(protocolContactModel.IdContact); if (protocolContactModel.ComunicationType == ComunicationType.Sender) { protInitializer.Senders.Add(new Data.ContactDTO(contact, Data.ContactDTO.ContactType.Address)); } else { protInitializer.Recipients.Add(new Data.ContactDTO(contact, Data.ContactDTO.ContactType.Address)); } } } return(protInitializer); }
private string GetStartMotivation(IQueryable <WorkflowProperty> properties) { WorkflowProperty workflowProperty = properties.FirstOrDefault(x => x.Name == WorkflowPropertyHelper.DSW_FIELD_ACTIVITY_START_MOTIVATION); return(workflowProperty == null ? string.Empty : workflowProperty.ValueString); }
public async Task ExecuteAsync(ICommandBuildCollaboration command) { _logger.WriteDebug(new LogMessage($"new collaboration request ..."), LogCategories); Collaboration collaboration = new Collaboration(); CollaborationBuildModel collaborationBuildModel = command.ContentType.ContentTypeValue; CollaborationModel collaborationModel = collaborationBuildModel.Collaboration; IdWorkflowActivity = collaborationBuildModel.IdWorkflowActivity; try { if (RetryPolicyEvaluation != null && !string.IsNullOrEmpty(RetryPolicyEvaluation.ReferenceModel)) { collaborationModel = JsonConvert.DeserializeObject <CollaborationModel>(RetryPolicyEvaluation.ReferenceModel, _serializerSettings); } else { RetryPolicyEvaluation = new EvaluationModel(); } //Attraverso le WebAPI comunicando col verbo POST col controller Rest Collaboration creare l'entità Collaboration #region Creazione l'entità Collaboration if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "ENTITY")) { collaboration.UniqueId = Guid.NewGuid(); collaboration.TemplateName = collaborationModel.TemplateName; collaboration.Subject = collaborationModel.Subject; collaboration.SignCount = (short?)collaborationModel.CollaborationSigns.Count(); collaboration.PublicationUser = collaborationModel.PublicationUser; collaboration.Note = collaborationModel.Note; collaboration.MemorandumDate = collaborationModel.MemorandumDate; collaboration.IdStatus = collaborationModel.IdStatus; collaboration.IdPriority = collaborationModel.IdPriority; collaboration.DocumentType = collaborationModel.DocumentType; collaboration.AlertDate = collaborationModel.AlertDate; collaboration.PublicationDate = collaborationModel.PublicationDate; short signerNumber = 0; foreach (CollaborationSignModel model in collaborationModel.CollaborationSigns) { signerNumber += 1; collaboration.CollaborationSigns.Add(new CollaborationSign() { Incremental = signerNumber, IsActive = false, SignUser = model.SignUser, SignName = model.SignName, SignEmail = model.SignEmail, SignDate = model.SignDate, IsRequired = model.IsRequired, IsAbsent = null }); } if (collaboration.CollaborationSigns.Count > 0) { collaboration.CollaborationSigns.First().IsActive = true; } signerNumber = 0; foreach (CollaborationUserModel model in collaborationModel.CollaborationUsers) { signerNumber += 1; collaboration.CollaborationUsers.Add(new CollaborationUser() { Incremental = signerNumber, DestinationFirst = model.DestinationFirst, DestinationType = model.DestinationType, DestinationName = model.DestinationName, DestinationEmail = model.DestinationEmail, Account = model.Account, Role = model.IdRole.HasValue ? new Role() { EntityShortId = model.IdRole.Value } : null }); } } else { StepModel collaborationStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "ENTITY"); //Posso fare first direttamente perche sono nell else collaboration = JsonConvert.DeserializeObject <Collaboration>(collaborationStatus.LocalReference); } if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "ENTITY_CREATED")) { collaboration.WorkflowName = collaborationBuildModel.WorkflowName; collaboration.IdWorkflowActivity = collaborationBuildModel.IdWorkflowActivity; collaboration.WorkflowAutoComplete = collaborationBuildModel.WorkflowAutoComplete; foreach (IWorkflowAction workflowAction in collaborationBuildModel.WorkflowActions) { collaboration.WorkflowActions.Add(workflowAction); } RetryPolicyEvaluation.Steps.Add(new StepModel() { Name = "ENTITY_CREATED", LocalReference = JsonConvert.SerializeObject(collaboration, _serializerSettings) }); } else { StepModel collaborationStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "ENTITY_CREATED"); //Posso fare first direttamente perche sono nell else collaboration = JsonConvert.DeserializeObject <Collaboration>(collaborationStatus.LocalReference); } #endregion //Attraverso il layer di BiblosDS salvare tutti gli documenti con relativa segnatura (metadato) #region Creazione Documenti if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "CREATE_DOCUMENT")) { Archive collaborationDocument = _biblosArchives.Single(f => f.Name.Equals(_collaborationLocation.ProtocolArchive, StringComparison.InvariantCultureIgnoreCase)); List <BiblosDS.BiblosDS.Attribute> attachmentAttributes = _biblosClient.Document.GetAttributesDefinition(collaborationDocument.Name); Guid? documentChainId; Content documentContent; short versioningNumber = 0; foreach (CollaborationVersioningModel collaborationVersioningModel in collaborationModel.CollaborationVersionings.Where(f => f.Document != null && f.Document.DocumentToStoreId.HasValue)) { //CREO CATENA IDENTIFICATIVA documentChainId = collaborationVersioningModel.Document.ChainId; if (!documentChainId.HasValue) { documentChainId = _biblosClient.Document.CreateDocumentChain(collaborationDocument.Name, new List <AttributeValue>()); collaborationVersioningModel.Document.ChainId = documentChainId; } List <AttributeValue> attachmentAttributeValues; int pos = collaborationModel.CollaborationVersionings.Count(f => f.Document.DocumentId.HasValue); if (!collaborationVersioningModel.Document.DocumentId.HasValue) { DocumentModel document = collaborationVersioningModel.Document; attachmentAttributeValues = new List <AttributeValue>() { new AttributeValue() { Attribute = attachmentAttributes.Single(f => f.Name.Equals(AttributeHelper.AttributeName_Filename, StringComparison.InvariantCultureIgnoreCase)), Value = document.FileName, }, new AttributeValue() { Attribute = attachmentAttributes.Single(f => f.Name.Equals(AttributeHelper.AttributeName_Signature, StringComparison.InvariantCultureIgnoreCase)), Value = document.Segnature, } }; document.ChainId = documentChainId; _logger.WriteInfo(new LogMessage($"reading document content {collaborationVersioningModel.Document.DocumentToStoreId} ..."), LogCategories); documentContent = RetryingPolicyAction(() => _biblosClient.Document.GetDocumentContentById(collaborationVersioningModel.Document.DocumentToStoreId.Value)); //CREO IL DOCUMENTO Document attachmentCollaborationDocument = new Document { Archive = collaborationDocument, Content = new Content { Blob = documentContent.Blob }, Name = document.FileName, IsVisible = true, AttributeValues = attachmentAttributeValues }; //ASSOCIO IL DOCUMENTO ALLA SUA CATENA DI COMPETENZA attachmentCollaborationDocument = _biblosClient.Document.AddDocumentToChain(attachmentCollaborationDocument, documentChainId, ContentFormat.Binary); document.DocumentId = attachmentCollaborationDocument.IdDocument; _logger.WriteDebug(new LogMessage($"biblos document {document.FileName}/{collaborationVersioningModel.DocumentGroup} archived into {collaborationDocument.Name}"), LogCategories); collaboration.CollaborationLogs.Add(new CollaborationLog() { LogType = CollaborationLogType.MODIFICA_SEMPLICE, LogDescription = $"Documento (Add): {document.FileName}" }); collaboration.CollaborationVersionings.Add(new CollaborationVersioning() { CollaborationIncremental = versioningNumber++, DocumentGroup = collaborationVersioningModel.DocumentGroup, DocumentName = document.FileName, IdDocument = attachmentCollaborationDocument.DocumentParent.IdBiblos.Value, Incremental = 1, IsActive = true }); } } RetryPolicyEvaluation.Steps.Add(new StepModel() { Name = "CREATE_DOCUMENT", LocalReference = JsonConvert.SerializeObject(collaboration, _serializerSettings) }); } else { StepModel stepModel = RetryPolicyEvaluation.Steps.FirstOrDefault(f => f.Name == "CREATE_DOCUMENT"); if (stepModel != null) { collaboration = JsonConvert.DeserializeObject <Collaboration>(stepModel.LocalReference); } } #endregion #region Creare Collaboration if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "ENTITY_CollaborationCREATED")) { _logger.WriteDebug(new LogMessage($"Inserting ..."), LogCategories); collaboration = await _webApiClient.PostEntityAsync(collaboration); _logger.WriteDebug(new LogMessage($"Collaboration {collaboration.EntityId} has been created successfully."), LogCategories); RetryPolicyEvaluation.Steps.Add(new StepModel() { Name = "ENTITY_CollaborationCREATED", LocalReference = JsonConvert.SerializeObject(collaboration, _serializerSettings) }); } else { StepModel collaborationStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "ENTITY_CollaborationCREATED"); collaboration = JsonConvert.DeserializeObject <Collaboration>(collaborationStatus.LocalReference); } #endregion #region [ Creare ProtocolDraft ] if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "ENTITY_ProtocolDraftCREATED")) { if (collaborationModel.Protocol != null) { _logger.WriteDebug(new LogMessage($"Creating ProtocolDraft for collaboration {collaboration.UniqueId}..."), LogCategories); ProtocolDraftModel protocolDraftModel = new ProtocolDraftModel(); protocolDraftModel.Object = collaborationModel.Protocol.Subject; protocolDraftModel.Notes = collaborationModel.Protocol.Note; if (collaborationModel.Protocol.ProtocolType != null) { protocolDraftModel.Type = collaborationModel.Protocol.ProtocolType.EntityShortId; } if (collaborationModel.Protocol.Container != null && collaborationModel.Protocol.Container.IdContainer.HasValue) { protocolDraftModel.Container = collaborationModel.Protocol.Container.IdContainer.Value; } if (collaborationModel.Protocol.Category != null && collaborationModel.Protocol.Category.UniqueId.HasValue) { protocolDraftModel.Category = collaborationModel.Protocol.Category.IdCategory.Value; } if (collaborationModel.Protocol.Roles != null && collaborationModel.Protocol.Roles.Count > 0) { protocolDraftModel.Authorizations.AddRange(collaborationModel.Protocol.Roles.Select(s => (int)s.IdRole.Value)); } if (collaborationModel.Protocol.ProtocolContacts != null && collaborationModel.Protocol.ProtocolContacts.Count > 0) { ContactBagDraftModel senderContactBag = BuildContactBag(collaborationModel.Protocol.ProtocolContacts, DocSuiteWeb.Model.Entities.Commons.ComunicationType.Sender); protocolDraftModel.Senders.Add(senderContactBag); ContactBagDraftModel recipientContactBag = BuildContactBag(collaborationModel.Protocol.ProtocolContacts, DocSuiteWeb.Model.Entities.Commons.ComunicationType.Recipient); protocolDraftModel.Recipients.Add(recipientContactBag); } if (collaborationModel.Protocol.ProtocolContactManuals != null && collaborationModel.Protocol.ProtocolContactManuals.Count > 0) { ContactBagDraftModel manualSenderContactBag = BuildManualContactBag(collaborationModel.Protocol.ProtocolContactManuals, DocSuiteWeb.Model.Entities.Commons.ComunicationType.Sender); protocolDraftModel.Senders.Add(manualSenderContactBag); ContactBagDraftModel manualRecipientContactBag = BuildManualContactBag(collaborationModel.Protocol.ProtocolContactManuals, DocSuiteWeb.Model.Entities.Commons.ComunicationType.Recipient); protocolDraftModel.Recipients.Add(manualRecipientContactBag); } if (collaborationBuildModel.IdWorkflowActivity.HasValue) { WorkflowProperty toFascicleProperty = await _webApiClient.GetWorkflowActivityProperty(collaborationBuildModel.IdWorkflowActivity.Value, WorkflowPropertyHelper.DSW_ACTION_TO_FASCICLE); if (toFascicleProperty != null && toFascicleProperty.ValueGuid.HasValue) { protocolDraftModel.WorkflowMetadatas.Add(new WorkflowMetadataDraftModel() { Key = WorkflowPropertyHelper.DSW_ACTION_TO_FASCICLE, Value = toFascicleProperty.ValueGuid.ToString() }); } } ProtocolDraft protocolDraft = new ProtocolDraft() { Collaboration = collaboration, Data = SerializationHelper.SerializeToStringWithoutNamespace(protocolDraftModel), Description = "Protocollo Precompilato da Collaborazione", DraftType = 0, IsActive = true }; protocolDraft = await _webApiClient.PostEntityAsync(protocolDraft); _logger.WriteDebug(new LogMessage($"ProtocolDraft {protocolDraft.UniqueId} has been created successfully."), LogCategories); RetryPolicyEvaluation.Steps.Add(new StepModel() { Name = "ENTITY_ProtocolDraftCREATED", LocalReference = JsonConvert.SerializeObject(protocolDraft, _serializerSettings) }); } } #endregion #region [ Notify Collaboration ] if (collaborationBuildModel.IdWorkflowActivity.HasValue) { _logger.WriteDebug(new LogMessage($"Notify IdCollaboration {collaboration.EntityId} for workflow activity {collaborationBuildModel.IdWorkflowActivity}."), LogCategories); WorkflowNotify workflowNotify = new WorkflowNotify(collaborationBuildModel.IdWorkflowActivity.Value); workflowNotify.OutputArguments.Add(WorkflowPropertyHelper.DSW_FIELD_COLLABORATION_ID, new WorkflowArgument { Name = WorkflowPropertyHelper.DSW_FIELD_COLLABORATION_ID, PropertyType = ArgumentType.Json, ValueInt = collaboration.EntityId }); await _webApiClient.PushWorkflowNotifyAsync(workflowNotify); } #endregion //Attraverso le WebAPI comunicando col verbo POST inviare l'evento EventoCompleteCollaborationBuild #region [ EventCompleteCollaborationBuild ] collaborationBuildModel.Collaboration.IdCollaboration = collaborationModel.IdCollaboration; IEventCompleteCollaborationBuild eventCompleteCollaborationBuild = new EventCompleteCollaborationBuild(Guid.NewGuid(), collaborationBuildModel.UniqueId, command.TenantName, command.TenantId, command.TenantAOOId, command.Identity, collaborationBuildModel, null); if (!await _webApiClient.PushEventAsync(eventCompleteCollaborationBuild)) { _logger.WriteError(new LogMessage($"EventCompleteCollaborationBuild {collaboration.GetTitle()} has not been sended"), LogCategories); throw new Exception("IEventCompleteCollaborationBuild not sended"); } _logger.WriteInfo(new LogMessage($"EventCompleteCollaborationBuild {eventCompleteCollaborationBuild.Id} has been sended"), LogCategories); #endregion #region Detach documenti archivio workflow foreach (DocumentModel attachment in collaborationModel.CollaborationVersionings.Where(f => f.Document != null && f.Document.DocumentToStoreId.HasValue).Select(f => f.Document)) { _logger.WriteInfo(new LogMessage($"detaching workflow document {attachment.DocumentToStoreId} ..."), LogCategories); RetryingPolicyAction(() => _biblosClient.Document.DocumentDetach(new Document() { IdDocument = attachment.DocumentToStoreId.Value })); } #endregion } catch (Exception ex) { RetryPolicyEvaluation.ReferenceModel = JsonConvert.SerializeObject(collaborationModel, _serializerSettings); _logger.WriteError(ex, LogCategories); throw new ServiceBusEvaluationException(RetryPolicyEvaluation); } }