Пример #1
0
        public async Task ExecuteAsync(ICommandUpdateFascicleData command)
        {
            _logger.WriteInfo(new LogMessage($"{command.CommandName} is arrived"), LogCategories);

            FascicleBuildModel fascicleBuildModel = command.ContentType.ContentTypeValue;
            FascicleModel      fascicleModel      = fascicleBuildModel.Fascicle;

            try
            {
                if (RetryPolicyEvaluation != null && !string.IsNullOrEmpty(RetryPolicyEvaluation.ReferenceModel))
                {
                    _logger.WriteDebug(new LogMessage("Load reference model from RetryPolicyEvaluation"), LogCategories);
                    fascicleModel = JsonConvert.DeserializeObject <FascicleModel>(RetryPolicyEvaluation.ReferenceModel, _serializerSettings);
                }
                else
                {
                    _logger.WriteDebug(new LogMessage("Generate new RetryPolicyEvaluation model"), LogCategories);
                    RetryPolicyEvaluation = new EvaluationModel();
                }
                _logger.WriteInfo(new LogMessage($"Cancel requested for fascicle {fascicleModel.Title}/{fascicleModel.UniqueId}-{fascicleModel.FascicleObject}"), LogCategories);
                _logger.WriteDebug(new LogMessage($"Cancel requested from WorkflowName {fascicleBuildModel.WorkflowName} and IdWorkflowActivity {fascicleBuildModel.IdWorkflowActivity}"), LogCategories);

                if (!RetryPolicyEvaluation.Steps.Any(f => f.Name == "ENTITY_UPDATED"))
                {
                    Fascicle updatedFascicle = await UpdateData(fascicleBuildModel, fascicleModel);

                    _logger.WriteInfo(new LogMessage($"Fascicle {updatedFascicle.GetTitle()} has been updated"), LogCategories);
                    RetryPolicyEvaluation.Steps.Add(new StepModel()
                    {
                        Name           = "ENTITY_UPDATED",
                        LocalReference = JsonConvert.SerializeObject(fascicleModel, _serializerSettings)
                    });
                    _logger.WriteDebug(new LogMessage("Set ENTITY_UPDATED RetryPolicyEvaluation"), LogCategories);
                }
                else
                {
                    StepModel fascicleStatus = RetryPolicyEvaluation.Steps.First(f => f.Name == "ENTITY_UPDATED");
                    fascicleModel = JsonConvert.DeserializeObject <FascicleModel>(fascicleStatus.LocalReference);
                    _logger.WriteDebug(new LogMessage("Load fascicle entity from RetryPolicyEvaluation ENTITY_UPDATED"), LogCategories);
                }
            }
            catch (Exception ex)
            {
                RetryPolicyEvaluation.ReferenceModel = JsonConvert.SerializeObject(fascicleModel, _serializerSettings);
                _logger.WriteError(ex, LogCategories);
                throw new ServiceBusEvaluationException(RetryPolicyEvaluation);
            }
        }
Пример #2
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);
            }
        }