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); }
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!!"); } }
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); } } }
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); }
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); }
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; }
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); }
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()); }