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);
 }
Пример #6
0
        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);
        }
Пример #9
0
        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);
            }
        }