public async Task ApplyAsync(BaseWorkflow workflow) { if (!(workflow is ContractWorkflow)) { throw new ArgumentException($"The argument type: ${workflow.GetType()} is not {nameof(ContractWorkflow)}"); } var contractWorkflow = (ContractWorkflow)workflow; contractWorkflow.DateUpdate = DateTimeOffset.Now; if (contractWorkflow.Id < 1) { contractWorkflow.DateCreate = DateTimeOffset.Now; } await _context.ContractWorkflows.AddAsync(contractWorkflow); Domain.Entities.Contract.Contract contract = contractWorkflow.Owner ?? _context.Contracts.Single(c => c.Id == contractWorkflow.OwnerId); if (contract == null) { throw new ApplicationException($"Workflow has incorrect contract id: {contractWorkflow.OwnerId}"); } var stage = await _context.DicRouteStages.SingleOrDefaultAsync(rs => rs.Id == contractWorkflow.CurrentStageId); contract.CurrentWorkflow = contractWorkflow; contract.StatusId = stage?.ContractStatusId ?? contract.StatusId; contract.CurrentWorkflow = contractWorkflow; contract.CurrentWorkflowId = contractWorkflow.Id; contract.DateUpdate = DateTimeOffset.Now; contract.IsRead = false; contract.GosDate = stage != null && stage.Code.Equals("DK02.9.2") ? _calendarProvider.GetPublicationDate(contract.RegDate ?? contract.DateCreate) : contract.GosDate; _context.Contracts.Update(contract); await _context.SaveChangesAsync(); await _taskRegister.RegisterAsync(contract.Id); _notificationSender.ProcessContract(contract.Id); }