Exemplo n.º 1
0
 public ActionResult Accept(int Id, string returnUrl = "")
 {
     requestService.Accept(Id);
     if (string.IsNullOrEmpty(returnUrl))
     {
         return(View("Index", "Home"));
     }
     return(Redirect(returnUrl));
 }
Exemplo n.º 2
0
        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 }));
        }
Exemplo n.º 3
0
        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));
            }
        }