Example #1
0
        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);
        }