protected override async Task <Result> DoTheJob(ApproveTypiconClaimJob job) { var r = _dbContext.GetTypiconClaim(job.TypiconId); if (r.Value is TypiconClaim claim) { if (!claim.TemplateId.HasValue) { var err = $"Шаблон Устава не указан. Копирование Версии Устава не возможно."; //SendMessage to Owner and sender return(Fail(job, err)); } else if (claim.Status == TypiconClaimStatus.WatingForReview) { try { //TypiconClaim claim.Status = TypiconClaimStatus.InProcess; await _dbContext.UpdateTypiconClaimAsync(claim); int templateId = claim.TemplateId.Value; var version = _dbContext.GetPublishedVersion(templateId); if (version.Success) { //TypiconVersion var clone = version.Value.Clone(); clone.Name = new ItemText(claim.Name); clone.Description = new ItemText(claim.Description); //Ставим статус "черновик" clone.BDate = null; clone.VersionNumber = 1; clone.TypiconId = job.TypiconId; //ставим true для возможности сразу опубликовать Устав clone.IsModified = true; //new TypiconEntity var entity = new TypiconEntity() { SystemName = claim.SystemName, DefaultLanguage = claim.DefaultLanguage, OwnerId = claim.OwnerId, Status = TypiconStatus.Approving, TemplateId = claim.TemplateId }; entity.Versions.Add(clone); //добавляем Устав и его первую пустую версию await _dbContext.AddTypiconEntityAsync(entity); //добавляем вложенные коллекции в версию version.Value.CopyChildrenTo(clone); await _dbContext.UpdateTypiconVersionAsync(clone); //TypiconEntity entity.Status = TypiconStatus.Draft; await _dbContext.UpdateTypiconEntityAsync(entity); //remove claim await _dbContext.RemoveTypiconClaimAsync(claim); //SendMessage to Owner and sender //nothing yet... return(Finish(job)); } else { var err = $"Указанный Устав Id={templateId} либо не существует, либо не существует его опубликованная версия."; //SendMessage to Owner and sender await FailClaimAsync(claim, err); return(Fail(job, err)); } } catch (DbUpdateException ex) { await FailClaimAsync(claim, "при сохранении в БД"); return(Fail(job, ex.Message)); } } else { var err = $"Статус Устава Id={job.TypiconId} не находится в состоянии ожидания на утверждение."; await FailClaimAsync(claim, err); //SendMessage to Owner and sender return(Fail(job, err)); } } else { //SendMessage to Owner and sender return(Fail(job, r.Error)); }; }