public async Task <IActionResult> Process(int id) { var request = await _dbContext.Requests.GetRequestById(id); if ((await _authorizationService.AuthorizeAsync(User, request, Policies.Accept)).Succeeded) { if (!request.IsToBeProcessedByBroker) { _logger.LogWarning("Wrong status when trying to process request. Status: {request.Status}, RequestId: {request.RequestId}", request.Status, request.RequestId); return(RedirectToAction(nameof(View), new { id })); } if (request.Status == RequestStatus.Created) { _requestService.Acknowledge(request, _clock.SwedenNow, User.GetUserId(), User.TryGetImpersonatorId()); await _dbContext.SaveChangesAsync(); } RequestModel model = await GetModel(request); model.FileGroupKey = new Guid(); model.CombinedMaxSizeAttachments = _options.CombinedMaxSizeAttachments; model.ExpectedTravelCosts = null; model.AllowProcessing = !request.RequestGroupId.HasValue; if (model.OrderViewModel.ReplacingOrderId.HasValue) { model.ProcessReplacementRequestViewModel = RequestViewModel.GetModelFromRequest(request, request.Order.AllowExceedingTravelCost); model.ProcessReplacementRequestViewModel.LanguageAndDialect = model.OrderViewModel.LanguageAndDialect; model.ProcessReplacementRequestViewModel.RegionName = model.OrderViewModel.RegionName; model.ProcessReplacementRequestViewModel.TimeRange = model.OrderViewModel.TimeRange; model.ProcessReplacementRequestViewModel.DisplayMealBreakIncluded = model.OrderViewModel.DisplayMealBreakIncludedText; model.ProcessReplacementRequestViewModel.IsReplacingOrderRequest = true; model.ProcessReplacementRequestViewModel.RequirementAnswers = await RequestRequirementAnswerModel.GetFromList(_dbContext.OrderRequirementRequestAnswer.GetRequirementAnswersForRequest(request.RequestId)); } model.OrderViewModel.UseAttachments = true; return(View(model)); } return(Forbid()); }
public async Task <IActionResult> Answer([FromBody] RequestAnswerModel model) { if (model == null) { return(ReturnError(ErrorCodes.IncomingPayloadIsMissing)); } try { var brokerId = User.TryGetBrokerId(); var apiUserId = User.UserId(); var order = await _apiOrderService.GetOrderAsync(model.OrderNumber, brokerId.Value); if (order.OrderGroupId != null) { return(ReturnError(ErrorCodes.RequestIsPartOfAGroup)); } var user = await _apiUserService.GetBrokerUser(model.CallingUser, brokerId.Value); var request = await _dbContext.Requests.GetActiveRequestForApiWithBrokerAndOrderNumber(model.OrderNumber, User.TryGetBrokerId().Value); if (request == null) { return(ReturnError(ErrorCodes.RequestNotFound)); } if (!request.IsToBeProcessedByBroker) { return(ReturnError(ErrorCodes.RequestNotInCorrectState)); } InterpreterBroker interpreter; try { interpreter = _apiUserService.GetInterpreter(new InterpreterDetailsModel(model.Interpreter), brokerId.Value); } catch (InvalidOperationException) { return(ReturnError(ErrorCodes.InterpreterOfficialIdAlreadySaved)); } //Does not handle Kammarkollegiets tolknummer if (interpreter == null) { //Possibly the interpreter should be added, if not found?? return(ReturnError(ErrorCodes.InterpreterNotFound)); } if (model.Location == null) { return(ReturnError(ErrorCodes.RequestNotCorrectlyAnswered, "Location was missing")); } if (model.CompetenceLevel == null) { return(ReturnError(ErrorCodes.RequestNotCorrectlyAnswered, "CompetenceLevel was missing")); } var now = _timeService.SwedenNow; if (request.Status == RequestStatus.Created) { _requestService.Acknowledge(request, now, user?.Id ?? apiUserId, user != null ? (int?)apiUserId : null); } try { await _requestService.Accept( request, now, user?.Id ?? apiUserId, user != null?(int?)apiUserId : null, interpreter, EnumHelper.GetEnumByCustomName <InterpreterLocation>(model.Location).Value, EnumHelper.GetEnumByCustomName <CompetenceAndSpecialistLevel>(model.CompetenceLevel).Value, model.RequirementAnswers == null?new List <OrderRequirementRequestAnswer>() : model.RequirementAnswers.Select(ra => new OrderRequirementRequestAnswer { Answer = ra.Answer, CanSatisfyRequirement = ra.CanMeetRequirement, OrderRequirementId = ra.RequirementId, }).ToList(), //Does not handle attachments yet. new List <RequestAttachment>(), model.ExpectedTravelCosts, model.ExpectedTravelCostInfo, model.LatestAnswerTimeForCustomer, model.BrokerReferenceNumber ); await _dbContext.SaveChangesAsync(); return(Ok(new AnswerResponse { InterpreterId = interpreter.InterpreterBrokerId })); } catch (InvalidOperationException ex) { return(ReturnError(ErrorCodes.RequestNotCorrectlyAnswered, ex.Message)); } catch (ArgumentNullException ex) { return(ReturnError(ErrorCodes.RequestNotCorrectlyAnswered, ex.Message)); } } catch (InvalidApiCallException ex) { return(ReturnError(ex.ErrorCode)); } }