Exemplo n.º 1
0
        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));
            }
        }