private async Task RecursiveInsertFascicleFoldersAsync(Fascicle fascicle, FascicleFolder parent,
                                                               IEnumerable <FascicleFolder> fascicleFolders, IEnumerable <FascicleFolder> foldersToEvaluate)
        {
            if (foldersToEvaluate == null || !foldersToEvaluate.Any())
            {
                return;
            }

            FascicleFolder fascicleNode;

            foreach (FascicleFolder folder in foldersToEvaluate)
            {
                fascicleNode = new FascicleFolder
                {
                    UniqueId       = Guid.NewGuid(),
                    Fascicle       = fascicle,
                    Name           = folder.Name,
                    Category       = folder.Category,
                    Status         = FascicleFolderStatus.Active,
                    Typology       = FascicleFolderTypology.SubFascicle,
                    ParentInsertId = parent.UniqueId
                };
                _unitOfWork.Repository <FascicleFolder>().Insert(fascicleNode);
                await _unitOfWork.SaveChangesAsync();
                await RecursiveInsertFascicleFoldersAsync(fascicle, fascicleNode, fascicleFolders,
                                                          fascicleFolders.Where(f => f.ParentInsertId.HasValue && f.ParentInsertId.Value == folder.UniqueId));
            }
        }
Example #2
0
        /// <summary>
        /// protocol cat = faccicle cat || protocol cat contine fasscicle cat
        /// </summary>
        /// <param name="objectToValidate"></param>
        protected override void ValidateObject(FascicleDocumentUnitValidator objectToValidate)
        {
            if (objectToValidate.ReferenceType != ReferenceType.Fascicle)
            {
                return;
            }

            bool result = false;

            FascicleFolder fascicleFolder = objectToValidate.FascicleFolder == null ? null : CurrentUnitOfWork.Repository <FascicleFolder>().GetByFolderId(objectToValidate.FascicleFolder.UniqueId);
            DocumentUnit   documentUnit   = objectToValidate.DocumentUnit == null ? null : CurrentUnitOfWork.Repository <DocumentUnit>().GetById(objectToValidate.DocumentUnit.UniqueId).FirstOrDefault();
            Fascicle       fascicle       = objectToValidate.Fascicle == null ? null : CurrentUnitOfWork.Repository <Fascicle>().GetByUniqueId(objectToValidate.Fascicle.UniqueId);
            ICollection <CategoryFascicleTableValuedModel> categoryFascicles = CurrentUnitOfWork.Repository <CategoryFascicle>().GetCategorySubFascicles(fascicle.Category.EntityShortId);

            if (documentUnit != null && documentUnit.Category != null && fascicle != null && fascicle.Category != null &&
                (documentUnit.Category.UniqueId == fascicle.Category.UniqueId || (categoryFascicles.Any() && categoryFascicles.Any(c => c.IdCategory == documentUnit.Category.EntityShortId))))
            {
                result = true;
            }

            if (!result)
            {
                GenerateInvalidateResult();
            }
        }
        public IHttpActionResult GetFascicleSummary(Guid uniqueId)
        {
            return(ActionHelper.TryCatchWithLoggerGeneric(() =>
            {
                Fascicle fascicle = _unitOfWork.Repository <Fascicle>().GetByUniqueId(uniqueId);
                if (fascicle == null)
                {
                    throw new ArgumentNullException("Fascicle not found");
                }

                FascicleModel model = _mapper.Map <Fascicle, FascicleModel>(fascicle);
                ICollection <PrivateCommonModels.ContactTableValuedModel> contacts = _unitOfWork.Repository <Fascicle>().GetContacts(fascicle);
                List <FascicleContactModel> contactModels = _mapper.Map <ICollection <PrivateCommonModels.ContactTableValuedModel>, ICollection <FascicleContactModel> >(contacts).ToList();
                model.Contacts = contactModels;

                FascicleFolder internetFolder = _unitOfWork.Repository <FascicleFolder>().GetInternetFolderByFascicle(uniqueId).SingleOrDefault();
                if (internetFolder != null)
                {
                    ICollection <DocumentUnitTableValuedModel> documentUnits = _unitOfWork.Repository <DocumentUnit>().GetFascicleDocumentUnitsPrivate(fascicle, internetFolder.UniqueId, Guid.Empty);
                    ICollection <GenericDocumentUnitModel> genericDocumentUnits = _mapper.Map <ICollection <DocumentUnitTableValuedModel>, ICollection <GenericDocumentUnitModel> >(documentUnits).ToList();
                    model.DocumentUnits = genericDocumentUnits;
                }

                return Ok(new List <FascicleModel>()
                {
                    model
                }.AsQueryable());
            }, _logger, LogCategories));
        }
        public async Task <IHttpActionResult> GetFascicleFlatDocuments(Guid uniqueId)
        {
            return(await ActionHelper.TryCatchWithLoggerGeneric(async() =>
            {
                FascicleFolder internetFolder = _unitOfWork.Repository <FascicleFolder>().GetInternetFolderByFascicle(uniqueId).SingleOrDefault();
                if (internetFolder == null)
                {
                    return Ok(new List <FascicleModel>()
                    {
                    }.AsQueryable());
                }

                ICollection <FascicleDocument> miscellaneas = _unitOfWork.Repository <FascicleDocument>().GetByIdFascicleFolder(internetFolder.UniqueId, true).ToList();
                ICollection <FascicleDocumentUnit> documentUnits = _unitOfWork.Repository <FascicleDocumentUnit>().GetByIdFascicleFolder(internetFolder.UniqueId, true).ToList();
                ICollection <DocumentUnitChain> documentUnitChains = documentUnits.SelectMany(s => _unitOfWork.Repository <DocumentUnitChain>().GetByDocumentUnit(s.DocumentUnit, true)).ToList();
                ICollection <Guid> chains = miscellaneas.Select(s => s.IdArchiveChain).Union(documentUnitChains.Select(s => s.IdArchiveChain)).ToList();

                FascicleModel model = _mapper.Map <Fascicle, FascicleModel>(internetFolder.Fascicle);
                IList <DocumentModel> documents = new List <DocumentModel>();
                ICollection <ModelDocument.Document> biblosDocuments;
                foreach (Guid archiveChain in chains)
                {
                    biblosDocuments = await _documentService.GetDocumentsFromChainAsync(archiveChain);
                    foreach (ModelDocument.Document biblosDocument in biblosDocuments)
                    {
                        documents.Add(new DocumentModel(biblosDocument.IdDocument, biblosDocument.Name)
                        {
                            DocumentType = DocumentType.Miscellanea,
                            ChainId = biblosDocument.IdChain.Value
                        });
                    }
                }

                model.Documents = documents;

                return Ok(new List <FascicleModel>()
                {
                    model
                }.AsQueryable());
            }, _logger, LogCategories));
        }
Example #5
0
        private async Task ValidateWorkflowRules(Guid fascicleId, List <ValidationMessageModel> errorResult, ICollection <WorkflowRule> deserializedWorkflowRules)
        {
            foreach (WorkflowRule workflowRule in deserializedWorkflowRules)
            {
                WorkflowRule   wfRule         = workflowRule;
                FascicleFolder fascicleFolder = _unitOfWork.Repository <FascicleFolder>().GetByIdFascicleAndLevel(fascicleId, 2).FirstOrDefault();
                bool           isExist        = _unitOfWork.Repository <FascicleFolder>().NameAlreadyExists(wfRule.Name, fascicleFolder.UniqueId, fascicleId);
                if (isExist == false)
                {
                    errorResult.Add(new ValidationMessageModel
                    {
                        Key     = "WorkflowStart",
                        Message = $"Non esiste cartella di fascicolo {wfRule.Name}"
                    });
                }

                ValidateWorkflowRules(wfRule.HasFile, errorResult,
                                      $"Convalida del nome {EnumHelper.GetDescription(WorkflowValidationRulesType.HasFile)} non è selezionata per { wfRule.Name}",
                                      $"Non c'è valore per {wfRule.Name} - {EnumHelper.GetDescription(WorkflowValidationRulesType.HasFile)} la convalida {wfRule.HasFile}",
                                      _unitOfWork.Repository <FascicleDocument>().HasFascicleDocument(wfRule.Name, fascicleId));

                ValidateWorkflowRules(wfRule.HasDocumentUnit, errorResult,
                                      $"Convalida del nome {EnumHelper.GetDescription(WorkflowValidationRulesType.HasDocumentUnit)} non è selezionata per { wfRule.Name}",
                                      $"Non c'è valore per {wfRule.Name} - {EnumHelper.GetDescription(WorkflowValidationRulesType.HasDocumentUnit)} la convalida {wfRule.HasDocumentUnit}",
                                      _unitOfWork.Repository <FascicleDocumentUnit>().HasFascicleDocumentUnit(wfRule.Name, fascicleId));

                List <FascicleDocument> fascicleDocuments = _unitOfWork.Repository <FascicleDocument>().HasFascicleDocumentSigned(wfRule.Name, fascicleId, true).ToList();
                bool hasSignedFile = await _documentService.IsDocumentsSignedAsync(fascicleDocuments.Select(x => x.UniqueId).ToList());

                ValidateWorkflowRules(wfRule.HasSignedFile, errorResult,
                                      $"Convalida del nome {EnumHelper.GetDescription(WorkflowValidationRulesType.HasSignedFile)} non è selezionata per { wfRule.Name}",
                                      $"Non c'è valore per {wfRule.Name} - {EnumHelper.GetDescription(WorkflowValidationRulesType.HasSignedFile)} la convalida {wfRule.HasSignedFile}", hasSignedFile);
            }

            if (errorResult.Count() > 0)
            {
                throw new DSWValidationException("Evaluate start workflow validation error", errorResult, null, DSWExceptionCode.VA_RulesetValidation);
            }
        }
        protected override void AfterSave(Fascicle entity)
        {
            try
            {
                _logger.WriteDebug(new LogMessage($"VecompSoftware.DocSuite.Private.WebAPI.Controllers.Entity.Fascicles.AfterSave with entity UniqueId {entity.UniqueId}"), LogCategories);

                if (CurrentDeleteActionType.HasValue && CurrentDeleteActionType == DeleteActionType.CancelFascicle)
                {
                    IQueryable <FascicleDocumentUnit> documentUnits = _unitOfWork.Repository <FascicleDocumentUnit>().GetByFascicle(entity.UniqueId);

                    ServiceBusMessage message;
                    foreach (FascicleDocumentUnit item in documentUnits)
                    {
                        if (item.DocumentUnit.Environment == (int)DSWEnvironmentType.Protocol)
                        {
                            Protocol protocol = _unitOfWork.Repository <Protocol>().GetByUniqueId(item.DocumentUnit.UniqueId).Single();
                            message = GenerateMessage(item.DocumentUnit.Category, (int)DSWEnvironmentType.Protocol,
                                                      (categoryFascicle) => new CommandUpdateProtocol(_parameterEnvService.CurrentTenantName, _parameterEnvService.CurrentTenantId, item.DocumentUnit.TenantAOO.UniqueId, null, null, null,
                                                                                                      new IdentityContext(_currentIdentity.FullUserName), protocol, categoryFascicle, null));
                            Task.Run(async() =>
                            {
                                await _queueService.SubscribeQueue(message.ChannelName).SendToQueueAsync(message);
                            }).Wait();
                        }
                        if (item.DocumentUnit.Environment == (int)DSWEnvironmentType.Resolution)
                        {
                            Resolution      resolution      = _unitOfWork.Repository <Resolution>().GetByUniqueId(item.DocumentUnit.UniqueId).Single();
                            ResolutionModel resolutionModel = _mapper.Map(resolution, new ResolutionModel());
                            _mapper.FileResolution  = _unitOfWork.Repository <FileResolution>().GetByResolution(item.DocumentUnit.EntityId).SingleOrDefault();
                            _mapper.ResolutionRoles = _unitOfWork.Repository <ResolutionRole>().GetByResolution(item.DocumentUnit.EntityId);
                            message = GenerateMessage(item.DocumentUnit.Category, (int)DSWEnvironmentType.Resolution,
                                                      (categoryFascicle) => new CommandUpdateResolution(_parameterEnvService.CurrentTenantName, _parameterEnvService.CurrentTenantId, item.DocumentUnit.TenantAOO.UniqueId,
                                                                                                        new IdentityContext(_currentIdentity.FullUserName), resolutionModel, categoryFascicle, null));
                            Task.Run(async() =>
                            {
                                await _queueService.SubscribeQueue(message.ChannelName).SendToQueueAsync(message);
                            }).Wait();
                        }
                        if (item.DocumentUnit.Environment == (int)DSWEnvironmentType.DocumentSeries)
                        {
                            DocumentSeriesItem documentSeriesItem = _unitOfWork.Repository <DocumentSeriesItem>().GetFullByUniqueId(item.DocumentUnit.UniqueId).SingleOrDefault();
                            message = GenerateMessage(item.DocumentUnit.Category, (int)DSWEnvironmentType.DocumentSeries,
                                                      (categoryFascicle) => new CommandUpdateDocumentSeriesItem(_parameterEnvService.CurrentTenantName, _parameterEnvService.CurrentTenantId, item.DocumentUnit.TenantAOO.UniqueId, null,
                                                                                                                new IdentityContext(_currentIdentity.FullUserName), documentSeriesItem, categoryFascicle, null));
                            Task.Run(async() =>
                            {
                                await _queueService.SubscribeQueue(message.ChannelName).SendToQueueAsync(message);
                            }).Wait();
                        }
                        if (item.DocumentUnit.Environment >= 100)
                        {
                            UDSBuildModel commandModel = _mapperUnitOfwork.Repository <IDomainMapper <DocumentUnit, UDSBuildModel> >().Map(item.DocumentUnit, new UDSBuildModel());
                            commandModel.UniqueId         = item.DocumentUnit.UniqueId;
                            commandModel.RegistrationDate = item.DocumentUnit.RegistrationDate;
                            commandModel.RegistrationUser = item.DocumentUnit.RegistrationUser;
                            message = GenerateMessage(item.DocumentUnit.Category, item.DocumentUnit.Environment,
                                                      (categoryFascicle) => new CommandCQRSUpdateUDSData(_parameterEnvService.CurrentTenantName, _parameterEnvService.CurrentTenantId, item.DocumentUnit.TenantAOO.UniqueId,
                                                                                                         new IdentityContext(_currentIdentity.FullUserName), commandModel, categoryFascicle, null, null, null, null));
                            Task.Run(async() =>
                            {
                                await _queueService.SubscribeQueue(message.ChannelName).SendToQueueAsync(message);
                            }).Wait();
                        }
                    }
                }
                if (CurrentInsertActionType.HasValue || CurrentUpdateActionType.HasValue)
                {
                    if (CurrentInsertActionType.HasValue)
                    {
                        Task.Run(async() =>
                        {
                            FascicleFolder fascicleNode = new FascicleFolder
                            {
                                UniqueId = Guid.NewGuid(),
                                Fascicle = entity,
                                Name     = "Fascicolo",
                                Category = entity.Category,
                                Status   = FascicleFolderStatus.Active,
                                Typology = FascicleFolderTypology.Fascicle
                            };
                            _unitOfWork.Repository <FascicleFolder>().Insert(fascicleNode);
                            await _unitOfWork.SaveChangesAsync();
                            _logger.WriteDebug(new LogMessage($"Created principal folder from Fascicle.UniqueId {entity.UniqueId}"), LogCategories);
                            Fascicle fascicleTemplateModel = null;
                            if (entity.FascicleTemplate != null && !string.IsNullOrEmpty(entity.FascicleTemplate.JsonModel))
                            {
                                fascicleTemplateModel = JsonConvert.DeserializeObject <Fascicle>(entity.FascicleTemplate.JsonModel, Defaults.DefaultJsonSerializer);
                                if (fascicleTemplateModel != null && fascicleTemplateModel.FascicleFolders.Any())
                                {
                                    _logger.WriteDebug(new LogMessage($"Evaluating fascicle template {entity.FascicleTemplate.UniqueId} with {fascicleTemplateModel.FascicleFolders.Count} folders from Fascicle.UniqueId {entity.UniqueId}"), LogCategories);
                                    IEnumerable <FascicleFolder> results = fascicleTemplateModel.FascicleFolders.Where(f => f.Typology == FascicleFolderTypology.SubFascicle);
                                    await RecursiveInsertFascicleFoldersAsync(entity, fascicleNode, results, results.Where(f => !f.ParentInsertId.HasValue));
                                }
                            }
                        }).Wait();
                    }
                    IIdentityContext identity = new IdentityContext(_currentIdentity.FullUserName);
                    Fascicle         fascicle = _unitOfWork.Repository <Fascicle>().GetByUniqueId(entity.UniqueId);
                    ICQRS            command  = new CommandCreateFascicle(_parameterEnvService.CurrentTenantName, _parameterEnvService.CurrentTenantId, Guid.Empty, identity, fascicle);
                    if (CurrentUpdateActionType.HasValue)
                    {
                        command = new CommandUpdateFascicle(_parameterEnvService.CurrentTenantName, _parameterEnvService.CurrentTenantId, Guid.Empty, identity, fascicle);
                    }

                    foreach (IWorkflowAction workflowAction in WorkflowActions)
                    {
                        workflowAction.IdWorkflowActivity = IdWorkflowActivity;
                        command.WorkflowActions.Add(workflowAction);
                    }
                    ServiceBusMessage message = _cqrsMapper.Map(command, new ServiceBusMessage());
                    if (message == null || string.IsNullOrEmpty(message.ChannelName))
                    {
                        throw new DSWException($"Queue name to command [{command}] is not mapped", null, DSWExceptionCode.SC_Mapper);
                    }
                    Task.Run(async() =>
                    {
                        await _queueService.SubscribeQueue(message.ChannelName).SendToQueueAsync(message);
                    }).Wait();
                }
            }
            catch (DSWException ex)
            {
                _logger.WriteError(ex, LogCategories);
            }
            base.AfterSave(entity);
        }
Example #7
0
        public async Task ExecuteAsync(ICommandBuildFascicle command)
        {
            Fascicle           fascicle           = new Fascicle();
            FascicleBuildModel fascicleBuildModel = command.ContentType.ContentTypeValue;
            FascicleModel      fascicleModel      = fascicleBuildModel.Fascicle;

            IdWorkflowActivity = fascicleBuildModel.IdWorkflowActivity;
            List <DossierFolderModel> dossierFolderDoAction = new List <DossierFolderModel>();
            string fascicleInsertActionType;

            if (!fascicleModel.FascicleType.HasValue || !_fascicleTypeInsertActionDescription.TryGetValue(fascicleModel.FascicleType.Value, out fascicleInsertActionType))
            {
                _logger.WriteError(new LogMessage($"Undefined or unsupported fascicle type {fascicleModel.FascicleType}"), LogCategories);

                throw new ServiceBusEvaluationException(new EvaluationModel {
                    CommandName = nameof(command), CorrelationId = command.CorrelationId
                });
            }

            try
            {
                if (RetryPolicyEvaluation != null && !string.IsNullOrEmpty(RetryPolicyEvaluation.ReferenceModel))
                {
                    fascicleModel = JsonConvert.DeserializeObject <FascicleModel>(RetryPolicyEvaluation.ReferenceModel, _serializerSettings);
                }
                else
                {
                    RetryPolicyEvaluation = new EvaluationModel();
                }

                //Attraverso le WebAPI comunicando col verbo POST col controller Rest Fascicle creare l'entità Fascicle
                #region [ Creazione Fascicle ]

                if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "ENTITY"))
                {
                    if (!fascicleModel.Category.IdCategory.HasValue)
                    {
                        throw new ArgumentNullException("fascicleModel.Category.IdCategory", "IdCategory must be defined");
                    }

                    if (fascicleModel.UniqueId == Guid.Empty)
                    {
                        throw new ArgumentException("fascicleModel.UniqueId", $"Invalid FascicleModel UniqueId {fascicleModel.UniqueId}");
                    }

                    fascicle.MetadataValues   = fascicleModel.MetadataValues;
                    fascicle.UniqueId         = fascicleModel.UniqueId;
                    fascicle.Rack             = fascicleModel.Rack;
                    fascicle.Note             = fascicleModel.Note;
                    fascicle.Manager          = fascicleModel.Manager;
                    fascicle.FascicleObject   = fascicleModel.FascicleObject;
                    fascicle.MetadataDesigner = fascicleModel.MetadataDesigner;

                    if (fascicleModel.FascicleTemplate != null)
                    {
                        fascicle.FascicleTemplate = new ProcessFascicleTemplate
                        {
                            JsonModel        = fascicleModel.FascicleTemplate.JsonModel,
                            Name             = fascicleModel.FascicleTemplate.Name,
                            UniqueId         = fascicleModel.FascicleTemplate.UniqueId ?? Guid.NewGuid(),
                            StartDate        = fascicleModel.FascicleTemplate.StartDate,
                            EndDate          = fascicleModel.FascicleTemplate.EndDate,
                            RegistrationDate = fascicleModel.FascicleTemplate.RegistrationDate,
                            RegistrationUser = fascicleModel.FascicleTemplate.RegistrationUser
                        };
                    }

                    if (fascicleModel.MetadataRepository != null)
                    {
                        fascicle.MetadataRepository = new MetadataRepository()
                        {
                            UniqueId = fascicleModel.MetadataRepository.Id
                        };
                    }

                    if (fascicleModel.FascicleType != null)
                    {
                        fascicle.FascicleType = (DocSuiteWeb.Entity.Fascicles.FascicleType)fascicleModel.FascicleType.Value;
                    }

                    if (fascicleModel.VisibilityType != null)
                    {
                        fascicle.VisibilityType = (DocSuiteWeb.Entity.Fascicles.VisibilityType)fascicleModel.VisibilityType.Value;
                    }

                    if (fascicleModel.Conservation != null)
                    {
                        fascicle.Conservation = fascicleModel.Conservation.Value;
                    }

                    if (fascicleModel.DossierFolders.Any())
                    {
                        dossierFolderDoAction.AddRange(fascicleModel.DossierFolders.Where(f => f.Status == DocSuiteWeb.Model.Entities.Dossiers.DossierFolderStatus.DoAction));
                        List <DossierFolder> dossierFolders = new List <DossierFolder>();
                        DossierFolder        folder;
                        foreach (DossierFolderModel dossierFolderModel in fascicleModel.DossierFolders.Where(f => f.Status != DocSuiteWeb.Model.Entities.Dossiers.DossierFolderStatus.DoAction))
                        {
                            if (dossierFolderModel.Status == DocSuiteWeb.Model.Entities.Dossiers.DossierFolderStatus.Fascicle || dossierFolderModel.Status == DocSuiteWeb.Model.Entities.Dossiers.DossierFolderStatus.FascicleClose)
                            {
                                _logger.WriteWarning(new LogMessage($"Fascicle {fascicle.GetTitle()} has wrong dossierfolder({dossierFolderModel.UniqueId}) reference type and it going to replace with parent association"), LogCategories);
                                folder = await _webApiClient.GetDossierFolderParentAsync(dossierFolderModel.UniqueId);

                                folder.Category = new Category()
                                {
                                    EntityShortId = (short)fascicleModel.Category.IdCategory.Value
                                };
                                if (folder == null)
                                {
                                    _logger.WriteError(new LogMessage($"DossierFolder {dossierFolderModel.UniqueId} doesn't have parent. it will be skip"), LogCategories);
                                    continue;
                                }
                                dossierFolders.Add(folder);
                            }
                            else
                            {
                                dossierFolders.Add(new DossierFolder()
                                {
                                    UniqueId = dossierFolderModel.UniqueId,
                                    Status   = (VecompSoftware.DocSuiteWeb.Entity.Dossiers.DossierFolderStatus)dossierFolderModel.Status,
                                    Category = dossierFolderModel.IdCategory.HasValue ? new Category()
                                    {
                                        EntityShortId = dossierFolderModel.IdCategory.Value
                                    } : null
                                });
                            }
                        }
                        fascicle.DossierFolders = dossierFolders;
                    }

                    fascicle.Contacts = new List <Contact>();
                    if (fascicleModel.Contacts != null && fascicleModel.Contacts.Count > 0)
                    {
                        foreach (ContactModel contact in fascicleModel.Contacts.Where(f => f.EntityId.HasValue))
                        {
                            fascicle.Contacts.Add(new Contact()
                            {
                                EntityId = contact.EntityId.Value
                            });
                        }
                    }

                    fascicle.Category = new Category()
                    {
                        EntityShortId = (short)fascicleModel.Category.IdCategory.Value
                    };

                    fascicle.FascicleRoles = new List <FascicleRole>();
                    if (fascicleModel.FascicleRoles != null && fascicleModel.FascicleRoles.Count > 0)
                    {
                        fascicle.FascicleRoles = fascicleModel.FascicleRoles.Where(x => x.Role.IdRole.HasValue).Select(s =>
                                                                                                                       new FascicleRole()
                        {
                            Role = new Role()
                            {
                                EntityShortId = s.Role.IdRole.Value
                            },
                            IsMaster = s.IsMaster,
                            AuthorizationRoleType = (AuthorizationRoleType)s.AuthorizationRoleType
                        }).ToList();
                    }

                    RetryPolicyEvaluation.Steps.Add(new StepModel()
                    {
                        Name           = "ENTITY",
                        LocalReference = JsonConvert.SerializeObject(fascicle, _serializerSettings)
                    });
                }
                else
                {
                    StepModel messageStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "ENTITY");
                    fascicle = JsonConvert.DeserializeObject <Fascicle>(messageStatus.LocalReference);
                }

                if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "ENTITY_CREATED"))
                {
                    fascicle.WorkflowName         = fascicleBuildModel.WorkflowName;
                    fascicle.IdWorkflowActivity   = fascicleBuildModel.IdWorkflowActivity;
                    fascicle.WorkflowAutoComplete = fascicleBuildModel.WorkflowAutoComplete;
                    foreach (IWorkflowAction workflowAction in fascicleBuildModel.WorkflowActions)
                    {
                        fascicle.WorkflowActions.Add(workflowAction);
                    }

                    _logger.WriteDebug(new LogMessage(JsonConvert.SerializeObject(fascicle, _serializerSettings)), LogCategories);
                    fascicle = await _webApiClient.PostEntityAsync(fascicle, fascicleInsertActionType);

                    _logger.WriteInfo(new LogMessage($"Fascicle {fascicle.GetTitle()} has been created"), LogCategories);
                    DossierFolder dossierFolder;
                    foreach (DossierFolderModel item in dossierFolderDoAction)
                    {
                        dossierFolder = await _webApiClient.PutEntityAsync(new DossierFolder()
                        {
                            UniqueId = item.UniqueId,
                            Category = new Category()
                            {
                                EntityShortId = fascicle.Category.EntityShortId
                            },
                            Fascicle     = fascicle,
                            JsonMetadata = item.JsonMetadata,
                            Name         = item.Name,
                            Status       = DocSuiteWeb.Entity.Dossiers.DossierFolderStatus.Fascicle
                        });

                        _logger.WriteInfo(new LogMessage($"DoAction DossierFolder {item.Name} update to new fascicle"), LogCategories);
                        fascicle.DossierFolders.Add(dossierFolder);
                    }
                    RetryPolicyEvaluation.Steps.Add(new StepModel()
                    {
                        Name           = "ENTITY_CREATED",
                        LocalReference = JsonConvert.SerializeObject(fascicle, _serializerSettings)
                    });
                }
                else
                {
                    StepModel messageStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "ENTITY_CREATED"); //Posso fare first direttamente perche sono nell else
                    fascicle = JsonConvert.DeserializeObject <Fascicle>(messageStatus.LocalReference);
                }
                #endregion

                #region [ Creazione FascicleFolders ]
                if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "FASCICLE_FOLDERS"))
                {
                    if (fascicleModel.FascicleFolders.Count > 0)
                    {
                        FascicleFolder defaultFolder = await _webApiClient.GetDefaultFascicleFolderAsync(fascicle.UniqueId);

                        FascicleFolder fascicleFolder;
                        foreach (FascicleFolderModel fascicleFolderModel in fascicleModel.FascicleFolders)
                        {
                            fascicleFolder = new FascicleFolder()
                            {
                                UniqueId       = fascicleFolderModel.UniqueId,
                                Fascicle       = fascicle,
                                ParentInsertId = defaultFolder.UniqueId,
                                Name           = fascicleFolderModel.Name,
                                Status         = (DocSuiteWeb.Entity.Fascicles.FascicleFolderStatus)fascicleFolderModel.Status,
                                Typology       = (DocSuiteWeb.Entity.Fascicles.FascicleFolderTypology)fascicleFolderModel.Typology
                            };
                            await _webApiClient.PostEntityAsync(fascicleFolder);

                            _logger.WriteInfo(new LogMessage($"Fascicle folder {fascicleFolder.Name} has been created"), LogCategories);
                        }
                    }
                    RetryPolicyEvaluation.Steps.Add(new StepModel()
                    {
                        Name           = "FASCICLE_FOLDERS",
                        LocalReference = JsonConvert.SerializeObject(fascicle, _serializerSettings)
                    });
                }
                else
                {
                    StepModel messageStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "FASCICLE_FOLDERS");
                    fascicle = JsonConvert.DeserializeObject <Fascicle>(messageStatus.LocalReference);
                }
                #endregion

                //Attraverso le WebAPI comunicando col verbo POST col controller Rest FascicleDocument e inserire tutti gli inserti inseriti in Biblos popolando la navigation property FascicleDocuments (FascicleDocument table) coi relativi identificativi Guid di Biblos
                #region [ Creazione FascicleDocument ]
                if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "FASCICLE"))
                {
                    foreach (FascicleDocumentModel model in fascicleModel.FascicleDocuments)
                    {
                        fascicle.FascicleDocuments.Add(new FascicleDocument
                        {
                            UniqueId         = model.UniqueId,
                            ChainType        = (DocSuiteWeb.Entity.DocumentUnits.ChainType)model.ChainType,
                            IdArchiveChain   = model.IdArchiveChain,
                            RegistrationUser = model.RegistrationUser,
                            RegistrationDate = model.RegistrationDate.Value,
                            LastChangedUser  = model.LastChangedUser
                        });
                    }
                    RetryPolicyEvaluation.Steps.Add(new StepModel()
                    {
                        Name           = "FASCICLE",
                        LocalReference = JsonConvert.SerializeObject(fascicle, _serializerSettings)
                    });
                }
                else
                {
                    StepModel messageStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "FASCICLE");
                    fascicle = JsonConvert.DeserializeObject <Fascicle>(messageStatus.LocalReference);
                }

                if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "FASCICLE_CREATED"))
                {
                    fascicle = await _webApiClient.PutEntityAsync(fascicle, fascicle.FascicleType == DocSuiteWeb.Entity.Fascicles.FascicleType.Activity?UpdateActionType.ActivityFascicleUpdate.ToString() : string.Empty);

                    RetryPolicyEvaluation.Steps.Add(new StepModel()
                    {
                        Name           = "FASCICLE_CREATED",
                        LocalReference = JsonConvert.SerializeObject(fascicle, _serializerSettings)
                    });
                }
                else
                {
                    StepModel messageStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "FASCICLE_CREATED");
                    fascicle = JsonConvert.DeserializeObject <Fascicle>(messageStatus.LocalReference);
                }
                #endregion

                //Attraverso le WebAPI comunicando col verbo POST inviare l'evento EventoCompleteFascicleBuild
                #region [ EventoCompleteFascicleBuild ]

                fascicleModel.RegistrationDate = fascicle.RegistrationDate;
                fascicleModel.RegistrationUser = fascicle.RegistrationUser;
                fascicleModel.Year             = fascicle.Year;
                fascicleModel.Title            = fascicle.Title;
                fascicleModel.StartDate        = fascicle.StartDate;
                fascicleModel.Number           = fascicle.Number;
                fascicleBuildModel.Fascicle    = fascicleModel;
                IEventCompleteFascicleBuild eventCompleteFascicleBuild = new EventCompleteFascicleBuild(Guid.NewGuid(), command.CorrelationId ?? fascicleBuildModel.UniqueId,
                                                                                                        command.TenantName, command.TenantId, command.TenantAOOId, command.Identity, fascicleBuildModel, null);

                if (!await _webApiClient.PushEventAsync(eventCompleteFascicleBuild))
                {
                    _logger.WriteError(new LogMessage($"EventCompleteFascicleBuild {fascicle.GetTitle()} has not been sended"), LogCategories);
                    throw new Exception("IEventCompleteFascicleBuild not sended");
                }
                _logger.WriteInfo(new LogMessage($"EventCompleteFascicleBuild {eventCompleteFascicleBuild.Id} has been sended"), LogCategories);

                #endregion
            }
            catch (Exception ex)
            {
                RetryPolicyEvaluation.ReferenceModel = JsonConvert.SerializeObject(fascicleModel, _serializerSettings);

                _logger.WriteError(ex, LogCategories);
                throw new ServiceBusEvaluationException(RetryPolicyEvaluation);
            }
        }