public ActionResult Accept(int Id, string returnUrl = "") { requestService.Accept(Id); if (string.IsNullOrEmpty(returnUrl)) { return(View("Index", "Home")); } return(Redirect(returnUrl)); }
public async Task <IActionResult> Accept(RequestAcceptModel model) { if (ModelState.IsValid) { var request = await _dbContext.Requests.GetRequestForAcceptById(model.RequestId); if ((await _authorizationService.AuthorizeAsync(User, request, Policies.Accept)).Succeeded) { if (!request.IsToBeProcessedByBroker && model.Status != RequestStatus.AcceptedNewInterpreterAppointed) { return(RedirectToAction("Index", "Home", new { ErrorMessage = "Förfrågan är redan behandlad" })); } else if (model.Status == RequestStatus.AcceptedNewInterpreterAppointed && !request.CanChangeInterpreter(_clock.SwedenNow)) { return(RedirectToAction("Index", "Home", new { ErrorMessage = "Det gick inte att byta tolk, kontrollera tiden för uppdragsstart" })); } var requirementAnswers = model.RequiredRequirementAnswers.Select(ra => new OrderRequirementRequestAnswer { RequestId = model.Status == RequestStatus.AcceptedNewInterpreterAppointed ? 0 : request.RequestId, OrderRequirementId = ra.OrderRequirementId, Answer = ra.Answer, CanSatisfyRequirement = ra.CanMeetRequirement }).ToList(); requirementAnswers.AddRange(model.DesiredRequirementAnswers.Select(ra => new OrderRequirementRequestAnswer { RequestId = model.Status == RequestStatus.AcceptedNewInterpreterAppointed ? 0 : request.RequestId, OrderRequirementId = ra.OrderRequirementId, Answer = ra.Answer, CanSatisfyRequirement = ra.CanMeetRequirement }).ToList()); try { //if user can choose between phone/video and an interpreter location with travel, user might have set costs, LatestAnswerTimeForCustomer etc if (model.InterpreterLocation == InterpreterLocation.OffSitePhone || model.InterpreterLocation == InterpreterLocation.OffSiteVideo) { model.LatestAnswerTimeForCustomer = null; model.ExpectedTravelCostInfo = null; model.ExpectedTravelCosts = null; } //if change interpreter or normal accept (no replacementorder) if (model.Status == RequestStatus.AcceptedNewInterpreterAppointed || (!request.Order.ReplacingOrderId.HasValue && model.Status != RequestStatus.AcceptedNewInterpreterAppointed)) { var interpreter = await _interpreterService.GetInterpreter(model.InterpreterId.Value, model.GetNewInterpreterInformation(), request.Ranking.BrokerId); if (model.Status == RequestStatus.AcceptedNewInterpreterAppointed) { try { await _requestService.ChangeInterpreter( request, _clock.SwedenNow, User.GetUserId(), User.TryGetImpersonatorId(), interpreter, model.InterpreterLocation.Value, model.InterpreterCompetenceLevel.Value, requirementAnswers, model.Files?.Select(f => new RequestAttachment { AttachmentId = f.Id }) ?? Enumerable.Empty <RequestAttachment>(), model.ExpectedTravelCosts, model.ExpectedTravelCostInfo, (model.SetLatestAnswerTimeForCustomer != null && EnumHelper.Parse <TrueFalse>(model.SetLatestAnswerTimeForCustomer.SelectedItem.Value) == TrueFalse.Yes)?model.LatestAnswerTimeForCustomer : null, model.BrokerReferenceNumber ); } catch (InvalidOperationException ex) { _logger.LogError("Change Interpreter for request {model.RequestId} failed. Message: {ex.Message}", model.RequestId, ex.Message); return(RedirectToAction("Index", "Home", new { errormessage = ex.Message })); } } else { await _requestService.Accept( request, _clock.SwedenNow, User.GetUserId(), User.TryGetImpersonatorId(), interpreter, model.InterpreterLocation.Value, model.InterpreterCompetenceLevel.Value, requirementAnswers, model.Files?.Select(f => new RequestAttachment { AttachmentId = f.Id }).ToList(), model.ExpectedTravelCosts, model.ExpectedTravelCostInfo, (model.SetLatestAnswerTimeForCustomer != null && EnumHelper.Parse <TrueFalse>(model.SetLatestAnswerTimeForCustomer.SelectedItem.Value) == TrueFalse.Yes)?model.LatestAnswerTimeForCustomer : null, model.BrokerReferenceNumber ); } } else { await _requestService.AcceptReplacement( request, _clock.SwedenNow, User.GetUserId(), User.TryGetImpersonatorId(), model.InterpreterLocation.Value, model.ExpectedTravelCosts, model.ExpectedTravelCostInfo, (model.SetLatestAnswerTimeForCustomer != null && EnumHelper.Parse <TrueFalse>(model.SetLatestAnswerTimeForCustomer.SelectedItem.Value) == TrueFalse.Yes)?model.LatestAnswerTimeForCustomer : null, model.BrokerReferenceNumber ); } await _dbContext.SaveChangesAsync(); } catch (ArgumentException ex) { _logger.LogError("Accept for request {model.RequestId} failed. Message: {ex.Message}", model.RequestId, ex.Message); return(RedirectToAction("Index", "Home", new { errormessage = "Något gick fel i behandlingen av bokningsförfrågan" })); } catch (InvalidOperationException ex) { _logger.LogError("Accept for request {model.RequestId} failed. Message: {ex.Message}", model.RequestId, ex.Message); return(RedirectToAction("Index", "Home", new { errormessage = ex.Message })); } return(RedirectToAction("Index", "Home", new { message = model.Status == RequestStatus.AcceptedNewInterpreterAppointed ? "Tolk har bytts ut för uppdraget" : "Svar har skickats" })); } return(Forbid()); } return(RedirectToAction(nameof(Process), new { id = model.RequestId })); }
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)); } }