Ejemplo n.º 1
0
        public async Task AcceptReplacement(
            Request request,
            DateTimeOffset acceptTime,
            int userId,
            int?impersonatorId,
            InterpreterLocation interpreterLocation,
            decimal?expectedTravelCosts,
            string expectedTravelCostInfo,
            DateTimeOffset?latestAnswerTimeForCustomer,
            string brokerReferenceNumber
            )
        {
            NullCheckHelper.ArgumentCheckNull(request, nameof(AcceptReplacement), nameof(RequestService));
            CheckSetLatestAnswerTimeForCustomerValid(latestAnswerTimeForCustomer, nameof(AcceptReplacement));
            request.Order.InterpreterLocations = await _tolkDbContext.OrderInterpreterLocation.GetOrderedInterpreterLocationsForOrder(request.Order.OrderId).ToListAsync();

            request.AcceptReplacementOrder(
                acceptTime,
                userId,
                impersonatorId,
                expectedTravelCostInfo,
                interpreterLocation,
                _priceCalculationService.GetPrices(request, (CompetenceAndSpecialistLevel)request.CompetenceLevel, expectedTravelCosts),
                latestAnswerTimeForCustomer,
                brokerReferenceNumber
                );
            _notificationService.RequestReplamentOrderAccepted(request);
        }
Ejemplo n.º 2
0
        public async Task Accept(
            Request request,
            DateTimeOffset acceptTime,
            int userId,
            int?impersonatorId,
            InterpreterBroker interpreter,
            InterpreterLocation interpreterLocation,
            CompetenceAndSpecialistLevel competenceLevel,
            List <OrderRequirementRequestAnswer> requirementAnswers,
            List <RequestAttachment> attachedFiles,
            decimal?expectedTravelCosts,
            string expectedTravelCostInfo,
            DateTimeOffset?latestAnswerTimeForCustomer,
            string brokerReferenceNumber
            )
        {
            NullCheckHelper.ArgumentCheckNull(request, nameof(Accept), nameof(RequestService));
            NullCheckHelper.ArgumentCheckNull(interpreter, nameof(Accept), nameof(RequestService));
            //maybe should be moved to AcceptRequest depending on ordergroup requesting each...
            request.Order.Requirements = await _tolkDbContext.OrderRequirements.GetRequirementsForOrder(request.Order.OrderId).ToListAsync();

            request.Order.InterpreterLocations = await _tolkDbContext.OrderInterpreterLocation.GetOrderedInterpreterLocationsForOrder(request.Order.OrderId).ToListAsync();

            request.Order.CompetenceRequirements = await _tolkDbContext.OrderCompetenceRequirements.GetOrderedCompetenceRequirementsForOrder(request.Order.OrderId).ToListAsync();

            CheckSetLatestAnswerTimeForCustomerValid(latestAnswerTimeForCustomer, nameof(Accept));
            AcceptRequest(request, acceptTime, userId, impersonatorId, interpreter, interpreterLocation, competenceLevel, requirementAnswers, attachedFiles, expectedTravelCosts, expectedTravelCostInfo, await VerifyInterpreter(request.OrderId, interpreter, competenceLevel), latestAnswerTimeForCustomer: latestAnswerTimeForCustomer, brokerReferenceNumber);
            //Create notification
            switch (request.Status)
            {
            case RequestStatus.Accepted:
                _notificationService.RequestAccepted(request);
                break;

            case RequestStatus.Approved:
                _notificationService.RequestAnswerAutomaticallyApproved(request);
                break;

            default:
                throw new NotImplementedException("NOT OK!!");
            }
        }
Ejemplo n.º 3
0
        public async Task AcceptGroup(
            RequestGroup requestGroup,
            DateTimeOffset answerTime,
            int userId,
            int?impersonatorId,
            InterpreterLocation interpreterLocation,
            InterpreterAnswerDto interpreter,
            InterpreterAnswerDto extraInterpreter,
            List <RequestGroupAttachment> attachedFiles,
            DateTimeOffset?latestAnswerTimeForCustomer,
            string brokerReferenceNumber
            )
        {
            NullCheckHelper.ArgumentCheckNull(requestGroup, nameof(AcceptGroup), nameof(RequestService));
            NullCheckHelper.ArgumentCheckNull(interpreter, nameof(AcceptGroup), nameof(RequestService));
            CheckSetLatestAnswerTimeForCustomerValid(latestAnswerTimeForCustomer, nameof(AcceptGroup));

            var declinedRequests = new List <Request>();
            await _orderService.AddOrdersWithListsForGroupToProcess(requestGroup.OrderGroup);

            bool isSingleOccasion    = requestGroup.OrderGroup.IsSingleOccasion;
            bool hasExtraInterpreter = requestGroup.HasExtraInterpreter;

            if (hasExtraInterpreter)
            {
                NullCheckHelper.ArgumentCheckNull(extraInterpreter, nameof(AcceptGroup), nameof(RequestService));
            }
            ValidateInterpreters(interpreter, extraInterpreter, hasExtraInterpreter);

            bool hasTravelCosts = (interpreter.ExpectedTravelCosts ?? 0) > 0 || (extraInterpreter?.ExpectedTravelCosts ?? 0) > 0;
            var  travelCostsShouldBeApproved = hasTravelCosts && requestGroup.OrderGroup.AllowExceedingTravelCost == AllowExceedingTravelCost.YesShouldBeApproved;
            bool partialAnswer = false;

            //1. Get the verification results for the interpreter(s)
            var verificationResult = await VerifyInterpreter(requestGroup.OrderGroup.FirstOrder.OrderId, interpreter.Interpreter, interpreter.CompetenceLevel);

            var extraInterpreterVerificationResult = hasExtraInterpreter && extraInterpreter.Accepted ?
                                                     await VerifyInterpreter(requestGroup.OrderGroup.FirstOrder.OrderId, extraInterpreter.Interpreter, extraInterpreter.CompetenceLevel) :
                                                     null;

            requestGroup.Requests = await _tolkDbContext.Requests.GetRequestsForRequestGroup(requestGroup.RequestGroupId).ToListAsync();
            await AddPriceRowsToRequestsInGroup(requestGroup);
            await AddRequirementAnswersToRequestsInGroup(requestGroup);

            requestGroup.Requests.ForEach(r => r.Order = requestGroup.OrderGroup.Orders.Where(o => o.OrderId == r.OrderId).SingleOrDefault());
            foreach (var request in requestGroup.Requests)
            {
                bool isExtraInterpreterOccasion = request.Order.IsExtraInterpreterForOrderId.HasValue;
                if (isExtraInterpreterOccasion)
                {
                    if (extraInterpreter.Accepted)
                    {
                        AcceptReqestGroupRequest(request,
                                                 answerTime,
                                                 userId,
                                                 impersonatorId,
                                                 extraInterpreter,
                                                 interpreterLocation,
                                                 Enumerable.Empty <RequestAttachment>().ToList(),
                                                 extraInterpreterVerificationResult,
                                                 latestAnswerTimeForCustomer,
                                                 travelCostsShouldBeApproved
                                                 );
                    }
                    else
                    {
                        partialAnswer = true;
                        await Decline(request, answerTime, userId, impersonatorId, extraInterpreter.DeclineMessage, false, false);

                        declinedRequests.Add(request);
                    }
                }
                else
                {
                    AcceptReqestGroupRequest(request,
                                             answerTime,
                                             userId,
                                             impersonatorId,
                                             interpreter,
                                             interpreterLocation,
                                             Enumerable.Empty <RequestAttachment>().ToList(),
                                             verificationResult,
                                             latestAnswerTimeForCustomer,
                                             travelCostsShouldBeApproved
                                             );
                }
            }

            // add the attachments to the group...
            requestGroup.Accept(answerTime, userId, impersonatorId, attachedFiles, hasTravelCosts, partialAnswer, latestAnswerTimeForCustomer, brokerReferenceNumber);

            if (partialAnswer)
            {
                //Need to split the declined part of the group, and make a separate order- and request group for that, to forward to the next in line. if any...
                await _orderService.CreatePartialRequestGroup(requestGroup, declinedRequests);

                if (requestGroup.RequiresApproval(hasTravelCosts))
                {
                    _notificationService.PartialRequestGroupAnswerAccepted(requestGroup);
                }
                else
                {
                    _notificationService.PartialRequestGroupAnswerAutomaticallyApproved(requestGroup);
                }
            }
            else
            {
                //2. Set the request group and order group in correct state
                if (requestGroup.RequiresApproval(hasTravelCosts))
                {
                    _notificationService.RequestGroupAccepted(requestGroup);
                }
                else
                {
                    _notificationService.RequestGroupAnswerAutomaticallyApproved(requestGroup);
                }
            }
        }
Ejemplo n.º 4
0
 private void AcceptReqestGroupRequest(Request request, DateTimeOffset acceptTime, int userId, int?impersonatorId, InterpreterAnswerDto interpreter, InterpreterLocation interpreterLocation, List <RequestAttachment> attachedFiles, VerificationResult?verificationResult, DateTimeOffset?latestAnswerTimeForCustomer, bool overrideRequireAccept = false)
 {
     AcceptRequest(request, acceptTime, userId, impersonatorId, interpreter.Interpreter, interpreterLocation, interpreter.CompetenceLevel, ReplaceIds(request.Order.Requirements, interpreter.RequirementAnswers).ToList(), attachedFiles, interpreter.ExpectedTravelCosts, interpreter.ExpectedTravelCostInfo, verificationResult, latestAnswerTimeForCustomer, string.Empty, overrideRequireAccept);
 }
Ejemplo n.º 5
0
        private void AcceptRequest(Request request, DateTimeOffset acceptTime, int userId, int?impersonatorId, InterpreterBroker interpreter, InterpreterLocation interpreterLocation, CompetenceAndSpecialistLevel competenceLevel, List <OrderRequirementRequestAnswer> requirementAnswers, List <RequestAttachment> attachedFiles, decimal?expectedTravelCosts, string expectedTravelCostInfo, VerificationResult?verificationResult, DateTimeOffset?latestAnswerTimeForCustomer, string brokerReferenceNumber, bool overrideRequireAccept = false)
        {
            NullCheckHelper.ArgumentCheckNull(request, nameof(AcceptRequest), nameof(RequestService));
            //Get prices
            var prices = _priceCalculationService.GetPrices(request, competenceLevel, expectedTravelCosts);

            request.Accept(acceptTime, userId, impersonatorId, interpreter, interpreterLocation, competenceLevel, requirementAnswers, attachedFiles, prices, expectedTravelCostInfo, latestAnswerTimeForCustomer, brokerReferenceNumber, verificationResult, overrideRequireAccept);
        }
Ejemplo n.º 6
0
        public async Task ChangeInterpreter(
            Request request,
            DateTimeOffset changedAt,
            int userId,
            int?impersonatorId,
            InterpreterBroker interpreter,
            InterpreterLocation interpreterLocation,
            CompetenceAndSpecialistLevel competenceLevel,
            List <OrderRequirementRequestAnswer> requirementAnswers,
            IEnumerable <RequestAttachment> attachedFiles,
            decimal?expectedTravelCosts,
            string expectedTravelCostInfo,
            DateTimeOffset?latestAnswerTimeForCustomer,
            string brokerReferenceNumber
            )
        {
            NullCheckHelper.ArgumentCheckNull(request, nameof(ChangeInterpreter), nameof(RequestService));
            NullCheckHelper.ArgumentCheckNull(interpreter, nameof(ChangeInterpreter), nameof(RequestService));
            CheckSetLatestAnswerTimeForCustomerValid(latestAnswerTimeForCustomer, nameof(ChangeInterpreter));
            request.Order.Requirements = await _tolkDbContext.OrderRequirements.GetRequirementsForOrder(request.Order.OrderId).ToListAsync();

            request.Order.InterpreterLocations = await _tolkDbContext.OrderInterpreterLocation.GetOrderedInterpreterLocationsForOrder(request.Order.OrderId).ToListAsync();

            request.Order.CompetenceRequirements = await _tolkDbContext.OrderCompetenceRequirements.GetOrderedCompetenceRequirementsForOrder(request.Order.OrderId).ToListAsync();

            if (interpreter.InterpreterBrokerId == await GetOtherInterpreterIdForSameOccasion(request) && !(interpreter.Interpreter?.IsProtected ?? false))
            {
                throw new InvalidOperationException("Det går inte att tillsätta samma tolk som redan är tillsatt som extra tolk för samma tillfälle.");
            }

            Request newRequest = new Request(request.Ranking, request.ExpiresAt, changedAt, isChangeInterpreter: true, requestGroup: request.RequestGroup)
            {
                Order  = request.Order,
                Status = RequestStatus.AcceptedNewInterpreterAppointed
            };
            bool noNeedForUserAccept = await NoNeedForUserAccept(request, expectedTravelCosts);

            request.Order.Requests.Add(newRequest);
            VerificationResult?verificationResult = null;

            if (competenceLevel != CompetenceAndSpecialistLevel.OtherInterpreter && _tolkBaseOptions.Tellus.IsActivated)
            {
                //Only check if the selected level is other than other.
                verificationResult = await _verificationService.VerifyInterpreter(interpreter.OfficialInterpreterId, request.OrderId, competenceLevel);
            }

            newRequest.ReplaceInterpreter(changedAt,
                                          userId,
                                          impersonatorId,
                                          interpreter,
                                          interpreterLocation,
                                          competenceLevel,
                                          requirementAnswers,
                                          attachedFiles,
                                          _priceCalculationService.GetPrices(request, competenceLevel, expectedTravelCosts),
                                          noNeedForUserAccept,
                                          request,
                                          expectedTravelCostInfo,
                                          brokerReferenceNumber,
                                          verificationResult,
                                          latestAnswerTimeForCustomer
                                          );
            // need requestid for the link
            await _tolkDbContext.SaveChangesAsync();

            if (noNeedForUserAccept)
            {
                _notificationService.RequestChangedInterpreterAccepted(newRequest, InterpereterChangeAcceptOrigin.NoNeedForUserAccept);
            }
            else
            {
                _notificationService.RequestChangedInterpreter(newRequest);
            }
            request.Status = RequestStatus.InterpreterReplaced;
        }
Ejemplo n.º 7
0
        public void Accept_Valid(bool receive, bool hasTravelCosts, bool partialAnswer, InterpreterLocation actualLocation)
        {
            var orderGroup          = MockOrderGroups.Single(og => og.OrderGroupNumber == "REQUESTGROUPALLOWEXCEEDINGJUSTCREATED");
            var requestGroup        = orderGroup.RequestGroups.First();
            var expectedOrderStatus = hasTravelCosts && actualLocation == InterpreterLocation.OnSite ?
                                      partialAnswer ? OrderStatus.RequestAwaitingPartialAccept : OrderStatus.RequestResponded :
                                      partialAnswer ? OrderStatus.GroupAwaitingPartialResponse : OrderStatus.ResponseAccepted;
            var expectedRequestGroupStatus = hasTravelCosts && actualLocation == InterpreterLocation.OnSite ?
                                             partialAnswer ? RequestStatus.PartiallyAccepted : RequestStatus.Accepted :
                                             partialAnswer ? RequestStatus.PartiallyApproved : RequestStatus.Approved;

            var acceptAt       = DateTime.Now;
            var userId         = 10;
            var impersonatorId = (int?)null;

            if (receive)
            {
                requestGroup.Received(acceptAt, userId, impersonatorId);
            }
            requestGroup.Requests.ForEach(r => r.InterpreterLocation = (int?)actualLocation);
            requestGroup.Accept(acceptAt, userId, impersonatorId, Enumerable.Empty <RequestGroupAttachment>().ToList(), hasTravelCosts, partialAnswer, null, "12345");

            Assert.Equal(expectedOrderStatus, requestGroup.OrderGroup.Status);
            Assert.Equal(expectedRequestGroupStatus, requestGroup.Status);
            Assert.Equal(acceptAt, requestGroup.AnswerDate);
            Assert.Equal(userId, requestGroup.AnsweredBy);
            if (hasTravelCosts && actualLocation == InterpreterLocation.OnSite)
            {
                Assert.Null(requestGroup.AnswerProcessedAt);
            }
            else
            {
                Assert.Equal(acceptAt, requestGroup.AnswerProcessedAt);
            }
            Assert.Equal(impersonatorId, requestGroup.ImpersonatingAnsweredBy);
        }
Ejemplo n.º 8
0
        private async Task <string> GetOrderChangeTextToDisplay(int brokerId, List <OrderInterpreterLocation> interpreterLocations, InterpreterLocation interpreterLocation, List <OrderChangeLogEntry> orderChanges, string description, string unitName, string invoiceRef, string custRefNo)
        {
            StringBuilder sb = new StringBuilder();
            var           unconfirmedOrderChangeLogEntries = orderChanges
                                                             .Where(oc => oc.OrderChangeConfirmation == null && oc.BrokerId == brokerId)
                                                             .OrderBy(oc => oc.OrderChangeLogEntryId);

            var    orderChangeLogEntries   = unconfirmedOrderChangeLogEntries.Where(oc => oc.OrderChangeLogType == OrderChangeLogType.OrderInformationFields || oc.OrderChangeLogType == OrderChangeLogType.AttachmentAndOrderInformationFields).ToList();
            string interpreterLocationText = interpreterLocation == InterpreterLocation.OffSitePhone || interpreterLocation == InterpreterLocation.OffSiteVideo ?
                                             interpreterLocations.Where(il => il.InterpreterLocation == interpreterLocation).Single().OffSiteContactInformation :
                                             interpreterLocations.Where(il => il.InterpreterLocation == interpreterLocation).Single().Street;
            int i = 0;
            var orderHistories = await _dbContext.OrderHistoryEntries.GetOrderHistoriesForOrderChangeConfirmations(orderChangeLogEntries.Select(o => o.OrderChangeLogEntryId).ToList()).ToListAsync();

            foreach (OrderChangeLogEntry oce in orderChangeLogEntries)
            {
                i++;
                var nextToCompareTo = orderChangeLogEntries.Count > i ? orderChangeLogEntries[i] : null;
                var date            = $"{oce.LoggedAt.ToSwedishString("yyyy-MM-dd HH:mm")} - ";
                foreach (OrderHistoryEntry oh in orderHistories.Where(oh => oh.OrderChangeLogEntryId == oce.OrderChangeLogEntryId))
                {
                    switch (oh.ChangeOrderType)
                    {
                    case ChangeOrderType.LocationStreet:
                        sb.Append(GetOrderFieldText(date, oh, nextToCompareTo == null ? interpreterLocationText : orderHistories.Where(ohe => ohe.OrderChangeLogEntryId == nextToCompareTo.OrderChangeLogEntryId).SingleOrDefault(o => o.ChangeOrderType == ChangeOrderType.LocationStreet).Value));
                        break;

                    case ChangeOrderType.OffSiteContactInformation:
                        sb.Append(GetOrderFieldText(date, oh, nextToCompareTo == null ? interpreterLocationText : orderHistories.Where(ohe => ohe.OrderChangeLogEntryId == nextToCompareTo.OrderChangeLogEntryId).SingleOrDefault(o => o.ChangeOrderType == ChangeOrderType.OffSiteContactInformation).Value));
                        break;

                    case ChangeOrderType.Description:
                        sb.Append(GetOrderFieldText(date, oh, nextToCompareTo == null ? description : orderHistories.Where(ohe => ohe.OrderChangeLogEntryId == nextToCompareTo.OrderChangeLogEntryId).SingleOrDefault(o => o.ChangeOrderType == ChangeOrderType.Description).Value));
                        break;

                    case ChangeOrderType.InvoiceReference:
                        sb.Append(GetOrderFieldText(date, oh, nextToCompareTo == null ? invoiceRef : orderHistories.Where(ohe => ohe.OrderChangeLogEntryId == nextToCompareTo.OrderChangeLogEntryId).SingleOrDefault(o => o.ChangeOrderType == ChangeOrderType.InvoiceReference).Value));
                        break;

                    case ChangeOrderType.CustomerReferenceNumber:
                        sb.Append(GetOrderFieldText(date, oh, nextToCompareTo == null ? custRefNo : orderHistories.Where(ohe => ohe.OrderChangeLogEntryId == nextToCompareTo.OrderChangeLogEntryId).SingleOrDefault(o => o.ChangeOrderType == ChangeOrderType.CustomerReferenceNumber).Value));
                        break;

                    case ChangeOrderType.CustomerDepartment:
                        sb.Append(GetOrderFieldText(date, oh, nextToCompareTo == null ? unitName : orderHistories.Where(ohe => ohe.OrderChangeLogEntryId == nextToCompareTo.OrderChangeLogEntryId).SingleOrDefault(o => o.ChangeOrderType == ChangeOrderType.CustomerDepartment).Value));
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }
            }
            var orderAttachmentChangeLogEntries = unconfirmedOrderChangeLogEntries.Where(oc => oc.OrderChangeLogType == OrderChangeLogType.Attachment || oc.OrderChangeLogType == OrderChangeLogType.AttachmentAndOrderInformationFields).ToList();

            if (orderAttachmentChangeLogEntries.Any())
            {
                sb.Append("\n");
                foreach (OrderChangeLogEntry oce in orderAttachmentChangeLogEntries)
                {
                    sb.Append($"{oce.LoggedAt.ToSwedishString("yyyy-MM-dd HH:mm")} - Bifogade bilagor ändrade\n");
                }
            }
            return(sb.ToString());
        }