public async Task <IActionResult> Process(int id) { var requestGroup = await _dbContext.RequestGroups.GetRequestGroupToView(id); if ((await _authorizationService.AuthorizeAsync(User, requestGroup, Policies.Accept)).Succeeded) { if (!requestGroup.IsToBeProcessedByBroker) { _logger.LogWarning("Wrong status when trying to process request group. Status: {request.Status}, RequestGroupId: {request.RequestGroupId}", requestGroup.Status, requestGroup.RequestGroupId); return(RedirectToAction(nameof(View), new { id })); } if (requestGroup.Status == RequestStatus.Created) { await _requestService.AcknowledgeGroup(requestGroup, _clock.SwedenNow, User.GetUserId(), User.TryGetImpersonatorId()); await _dbContext.SaveChangesAsync(); } OrderGroup orderGroup = await _dbContext.OrderGroups.GetFullOrderGroupById(requestGroup.OrderGroupId); await _orderService.AddOrdersWithListsForGroup(orderGroup); await _requestService.AddListsForRequestGroup(requestGroup); requestGroup.Requests.ForEach(r => r.Order = orderGroup.Orders.Where(o => o.OrderId == r.OrderId).SingleOrDefault()); var model = RequestGroupProcessModel.GetModelFromRequestGroup(requestGroup, Guid.NewGuid(), _options.CombinedMaxSizeAttachments, _options.AllowDeclineExtraInterpreterOnRequestGroups); await _listToModelService.AddInformationFromListsToModel(model, User.GetUserId()); model.CustomerInformationModel.IsCustomer = false; model.CustomerInformationModel.UseSelfInvoicingInterpreter = _cacheService.CustomerSettings.Any(c => c.CustomerOrganisationId == requestGroup.OrderGroup.CustomerOrganisationId && c.UsedCustomerSettingTypes.Any(cs => cs == CustomerSettingType.UseSelfInvoicingInterpreter)); //if not first broker in rank (requests are not answered and have no pricerows) we need to get a calculated price with correct broker fee if (requestGroup.Ranking.Rank != 1) { List <OrderOccasionDisplayModel> tempOccasionList = new List <OrderOccasionDisplayModel>(); foreach (OrderOccasionDisplayModel occasion in model.OccasionList.Occasions) { var request = requestGroup.Requests.Single(r => r.RequestId == occasion.RouteId); tempOccasionList.Add(OrderOccasionDisplayModel.GetModelFromOrder(request.Order, GetPriceinformationOrderToDisplay(request, model.RequestedCompetenceLevels.ToList()), request)); } model.OccasionList.Occasions = tempOccasionList; } return(View(model)); } return(Forbid()); }
public async Task <IActionResult> Answer([FromBody] RequestGroupAnswerModel model) { if (model == null) { return(ReturnError(ErrorCodes.IncomingPayloadIsMissing)); } try { var brokerId = User.TryGetBrokerId().Value; var apiUserId = User.UserId(); var user = await _apiUserService.GetBrokerUser(model.CallingUser, brokerId); var requestGroup = await _dbContext.RequestGroups.GetFullRequestGroupForApiWithBrokerAndOrderNumber(model.OrderGroupNumber, brokerId); if (requestGroup == null) { return(ReturnError(ErrorCodes.RequestGroupNotFound)); } if (!(requestGroup.Status == RequestStatus.Created || requestGroup.Status == RequestStatus.Received)) { return(ReturnError(ErrorCodes.RequestGroupNotInCorrectState)); } var mainInterpreterAnswer = _apiUserService.GetInterpreterModel(model.InterpreterAnswer, brokerId); InterpreterAnswerDto extraInterpreterAnswer = null; requestGroup.OrderGroup.Orders = await _dbContext.Orders.GetOrdersForOrderGroup(requestGroup.OrderGroup.OrderGroupId).ToListAsync(); if (requestGroup.HasExtraInterpreter) { extraInterpreterAnswer = _apiUserService.GetInterpreterModel(model.ExtraInterpreterAnswer, brokerId, false); } var now = _timeService.SwedenNow; if (requestGroup.Status == RequestStatus.Created) { await _requestService.AcknowledgeGroup(requestGroup, now, user?.Id ?? apiUserId, (user != null ? (int?)apiUserId : null)); } try { await _requestService.AcceptGroup( requestGroup, now, user?.Id ?? apiUserId, user != null?(int?)apiUserId : null, EnumHelper.GetEnumByCustomName <InterpreterLocation>(model.InterpreterLocation).Value, mainInterpreterAnswer, extraInterpreterAnswer, //Does not handle attachments yet. new List <RequestGroupAttachment>(), model.LatestAnswerTimeForCustomer, model.BrokerReferenceNumber ); await _dbContext.SaveChangesAsync(); //End of service return(Ok(new GroupAnswerResponse { InterpreterId = mainInterpreterAnswer.Interpreter.InterpreterBrokerId, ExtraInterpreterId = extraInterpreterAnswer?.Interpreter?.InterpreterBrokerId })); } catch (InvalidOperationException ex) { return(ReturnError(ErrorCodes.RequestNotCorrectlyAnswered, ex.Message)); } } catch (InvalidApiCallException ex) { return(ReturnError(ex.ErrorCode)); } catch (Exception ex) { _logger.LogError(ex, "Failed to handle request group answer"); return(ReturnError(ErrorCodes.UnspecifiedProblem)); } }