示例#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);
        }
        public static IEnumerable <ReportComplaintRow> GetComplaintsExcelFileRows(ReportComplaintModel complaintModel, ReportType reportType)
        {
            var isBroker = EnumHelper.Parent <ReportType, ReportGroup>(reportType) == ReportGroup.BrokerReport;

            NullCheckHelper.ArgumentCheckNull(complaintModel, nameof(GetComplaintsExcelFileRows), nameof(StatisticsService));
            return(complaintModel.Complaints
                   .Select(c => new ReportComplaintRow
            {
                OrderNumber = c.OrderNumber,
                ReportDate = c.ReportDate,
                BrokerName = c.BrokerName,
                Language = c.Language,
                Region = c.Region,
                Status = c.ComplaintStatus.GetDescription(),
                InterpreterId = c.InterpreterId,
                AssignmentDate = c.AssignmentDate,
                CustomerName = c.CustomerName,
                AssignmentType = c.AssignmentType.GetDescription(),
                InterpreterCompetenceLevel = (CompetenceAndSpecialistLevel?)c.CompetenceLevel ?? CompetenceAndSpecialistLevel.NoInterpreter,
                ComplaintType = c.ComplaintType.GetDescription(),
                CustomerUnitName = c.CustomerUnitName,
                ReportPersonToDisplay = c.ReportPerson,
                Department = c.Department,
                ReferenceNumber = c.ReferenceNumber,
                InterpreterLocation = c.InterpreterLocation.HasValue ? ((InterpreterLocation)c.InterpreterLocation.Value).GetDescription() : string.Empty,
                AllowExceedingTravelCost = c.AllowExceedingTravelCost.HasValue ? isBroker ? EnumHelper.Parent <AllowExceedingTravelCost, TrueFalse>(c.AllowExceedingTravelCost.Value).GetDescription() : c.AllowExceedingTravelCost.Value.GetDescription() : string.Empty
            }).ToList().OrderBy(row => row.OrderNumber));
        }
示例#3
0
        public async Task AcknowledgeGroup(RequestGroup requestGroup, DateTimeOffset acknowledgeTime, int userId, int?impersonatorId)
        {
            NullCheckHelper.ArgumentCheckNull(requestGroup, nameof(AcknowledgeGroup), nameof(RequestService));
            requestGroup.Requests ??= await _tolkDbContext.Requests.GetRequestsForRequestGroup(requestGroup.RequestGroupId).ToListAsync();

            requestGroup.Received(acknowledgeTime, userId, impersonatorId);
        }
 public void Refute(Complaint complaint, int userId, int?impersonatorId, string message)
 {
     NullCheckHelper.ArgumentCheckNull(complaint, nameof(Refute), nameof(ComplaintService));
     complaint.AnswerDispute(_clock.SwedenNow, userId, impersonatorId, message, ComplaintStatus.DisputePendingTrial);
     _logger.LogDebug($"Refuted complaint {complaint.ComplaintId}, pending trial");
     _notificationService.ComplaintDisputePendingTrial(complaint);
 }
 public void AcceptDispute(Complaint complaint, int userId, int?impersonatorId, string message)
 {
     NullCheckHelper.ArgumentCheckNull(complaint, nameof(AcceptDispute), nameof(ComplaintService));
     complaint.AnswerDispute(_clock.SwedenNow, userId, impersonatorId, message, ComplaintStatus.TerminatedAsDisputeAccepted);
     _logger.LogDebug($"Accepted dispute on complaint {complaint.ComplaintId}");
     _notificationService.ComplaintTerminatedAsDisputeAccepted(complaint);
 }
 public void Accept(Complaint complaint, int userId, int?impersonatorId, string message = null)
 {
     NullCheckHelper.ArgumentCheckNull(complaint, nameof(Accept), nameof(ComplaintService));
     complaint.Answer(_clock.SwedenNow, userId, impersonatorId, message, ComplaintStatus.Confirmed);
     _logger.LogDebug($"Accepted complaint {complaint.ComplaintId}");
     _notificationService.ComplaintConfirmed(complaint);
 }
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            NullCheckHelper.ArgumentCheckNull(bindingContext, nameof(TimeSpanModelBinder));

            var timeValue = bindingContext.ValueProvider.GetValue($"{bindingContext.ModelName}");

            if (timeValue == ValueProviderResult.None ||
                string.IsNullOrWhiteSpace(timeValue.FirstValue))
            {
                return(Task.CompletedTask);
            }
            string timeValueSanitized;

            if (timeValue.FirstValue == "0" ||
                timeValue.FirstValue == "00")
            {
                timeValueSanitized = "00:00";
            }
            else
            {
                timeValueSanitized = timeValue.FirstValue.ContainsSwedish(":")
                    ? timeValue.FirstValue
                    : timeValue.FirstValue.Insert(timeValue.FirstValue.Length - 2, ":"); // Add colon to time if not exists
            }

            var model = timeValueSanitized.ToSwedishTimeSpan();

            bindingContext.Result = ModelBindingResult.Success(model);

            return(Task.CompletedTask);
        }
示例#8
0
 public async Task Decline(
     Request request,
     DateTimeOffset declinedAt,
     int userId,
     int?impersonatorId,
     string message,
     bool notify           = true,
     bool createNewRequest = true)
 {
     NullCheckHelper.ArgumentCheckNull(request, nameof(Decline), nameof(RequestService));
     request.Decline(declinedAt, userId, impersonatorId, message);
     if (!request.Order.ReplacingOrderId.HasValue)
     {
         if (createNewRequest)
         {
             await _orderService.CreateRequest(request.Order, request, notify : notify);
         }
         if (notify)
         {
             _notificationService.RequestDeclinedByBroker(request);
         }
     }
     else
     {
         if (notify)
         {
             _notificationService.RequestReplamentOrderDeclinedByBroker(request);
         }
     }
 }
示例#9
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);
        }
 public void CreateValidationMetadata(ValidationMetadataProviderContext context)
 {
     NullCheckHelper.ArgumentCheckNull(context, nameof(ValidationMetadataProvider));
     if (context.Attributes.OfType <ClientRequiredAttribute>().Any())
     {
         context.ValidationMetadata.IsRequired = true;
     }
 }
        public async Task Review(Requisition requisition, int userId, int?impersonatorId)
        {
            NullCheckHelper.ArgumentCheckNull(requisition, nameof(Review), nameof(RequisitionService));
            requisition.Review(_clock.SwedenNow, userId, impersonatorId);
            await _dbContext.SaveChangesAsync();

            _logger.LogDebug($"Requisition reviewed {requisition.RequisitionId}");
            await _notificationService.RequisitionReviewed(requisition);
        }
 public IModelBinder GetBinder(ModelBinderProviderContext context)
 {
     NullCheckHelper.ArgumentCheckNull(context, nameof(CheckboxGroupModelBinderProvider));
     if (context.Metadata.ModelType == typeof(CheckboxGroup))
     {
         return(new BinderTypeModelBinder(typeof(CheckboxGroupModelBinder)));
     }
     return(null);
 }
示例#13
0
        public async Task <RequestGroup> AddListsForRequestGroup(RequestGroup requestGroup)
        {
            NullCheckHelper.ArgumentCheckNull(requestGroup, nameof(AddListsForRequestGroup), nameof(RequestService));
            await AddRequestsWithConfirmationListsToRequestGroup(requestGroup);
            await AddPriceRowsToRequestsInGroup(requestGroup);
            await AddRequirementAnswersToRequestsInGroup(requestGroup);

            return(requestGroup);
        }
        public async Task Comment(Requisition requisition, int userId, int?impersonatorId, string message)
        {
            NullCheckHelper.ArgumentCheckNull(requisition, nameof(Comment), nameof(RequisitionService));
            requisition.Comment(_clock.SwedenNow, userId, impersonatorId, message);
            await _dbContext.SaveChangesAsync();

            _logger.LogDebug($"Requisition commented {requisition.RequisitionId}");
            _notificationService.RequisitionCommented(requisition);
        }
示例#15
0
 public async Task ConfirmCancellation(
     Request request,
     DateTimeOffset confirmedAt,
     int userId,
     int?impersonatorId)
 {
     NullCheckHelper.ArgumentCheckNull(request, nameof(ConfirmCancellation), nameof(RequestService));
     request.ConfirmCancellation(confirmedAt, userId, impersonatorId);
     await _tolkDbContext.SaveChangesAsync();
 }
示例#16
0
 public async Task ConfirmGroupNoAnswer(
     RequestGroup requestGroup,
     DateTimeOffset confirmedAt,
     int userId,
     int?impersonatorId)
 {
     NullCheckHelper.ArgumentCheckNull(requestGroup, nameof(ConfirmGroupNoAnswer), nameof(RequestService));
     requestGroup.ConfirmNoAnswer(confirmedAt, userId, impersonatorId);
     await _tolkDbContext.SaveChangesAsync();
 }
        public async Task ConfirmNoReview(Requisition requisition, int userId, int?impersonatorId)
        {
            NullCheckHelper.ArgumentCheckNull(requisition, nameof(ConfirmNoReview), nameof(RequisitionService));
            requisition.RequisitionStatusConfirmations = await _dbContext.RequisitionStatusConfirmations.GetRequisitionStatusConfirmationsForRequisition(requisition.RequisitionId).ToListAsync();

            requisition.CofirmNoReview(_clock.SwedenNow, userId, impersonatorId);
            await _dbContext.SaveChangesAsync();

            _logger.LogDebug($"Requisition confirmed with no review {requisition.RequisitionId}");
        }
示例#18
0
 public IModelBinder GetBinder(ModelBinderProviderContext context)
 {
     NullCheckHelper.ArgumentCheckNull(context, nameof(DateTimeOffsetModelBinderProvider));
     if (context.Metadata.ModelType == typeof(DateTimeOffset) ||
         context.Metadata.ModelType == typeof(DateTimeOffset?))
     {
         return(new BinderTypeModelBinder(typeof(DateTimeOffsetModelBinder)));
     }
     return(null);
 }
示例#19
0
 public async Task ConfirmOrderChange(
     Request request,
     List <int> confirmedOrderChangeLogEntriesId,
     DateTimeOffset confirmedAt,
     int userId,
     int?impersonatorId)
 {
     NullCheckHelper.ArgumentCheckNull(request, nameof(ConfirmOrderChange), nameof(RequestService));
     request.ConfirmOrderChange(confirmedOrderChangeLogEntriesId, confirmedAt, userId, impersonatorId);
     await _tolkDbContext.SaveChangesAsync();
 }
示例#20
0
        public async Task <RequestGroup> AddRequestsWithConfirmationListsToRequestGroup(RequestGroup requestGroup)
        {
            NullCheckHelper.ArgumentCheckNull(requestGroup, nameof(AddRequestsWithConfirmationListsToRequestGroup), nameof(RequestService));
            requestGroup.StatusConfirmations = await _tolkDbContext.RequestGroupStatusConfirmations.GetStatusConfirmationsForRequestGroup(requestGroup.RequestGroupId).ToListAsync();

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

            var requestStatusConfirmations = await _tolkDbContext.RequestStatusConfirmation.GetRequestStatusConfirmationsForRequestGroup(requestGroup.RequestGroupId).ToListAsync();

            requestGroup.Requests.ForEach(r => r.RequestStatusConfirmations = requestStatusConfirmations.Where(rsc => rsc.RequestId == r.RequestId).ToList());
            return(requestGroup);
        }
示例#21
0
        public async Task SetTemporaryEmail(AspNetUser user, string newEmail, int updatedById, int?impersonatingCreatorId = null)
        {
            NullCheckHelper.ArgumentCheckNull(user, nameof(SetTemporaryEmail), nameof(UserService));
            var emailUser = await _dbContext.Users.GetUserByIdWithTemporaryEmail(user.Id);

            var entry = emailUser.TemporaryChangedEmailEntry ?? new TemporaryChangedEmailEntry();

            entry.EmailAddress    = newEmail;
            entry.ExpirationDate  = _clock.SwedenNow.AddDays(7);
            entry.UpdatedByUserId = updatedById;
            entry.ImpersonatingUpdatedByUserId   = impersonatingCreatorId;
            emailUser.TemporaryChangedEmailEntry = entry;
            await _dbContext.SaveChangesAsync();
        }
示例#22
0
        public async Task <int?> GetOtherInterpreterIdForSameOccasion(Request request)
        {
            NullCheckHelper.ArgumentCheckNull(request, nameof(GetOtherInterpreterIdForSameOccasion), nameof(RequestService));
            List <Request> requests = null;

            if (request.Order.IsExtraInterpreterForOrder != null)
            {
                requests = await _tolkDbContext.Requests.GetRequestsForOrder(request.Order.IsExtraInterpreterForOrder.OrderId).ToListAsync();
            }
            else if (request.Order.ExtraInterpreterOrder != null)
            {
                requests = await _tolkDbContext.Requests.GetRequestsForOrder(request.Order.ExtraInterpreterOrder.OrderId).ToListAsync();
            }
            return(requests?.Where(r => r.Status == RequestStatus.Accepted || r.Status == RequestStatus.AcceptedNewInterpreterAppointed || r.Status == RequestStatus.Approved).SingleOrDefault()?.InterpreterBrokerId);
        }
示例#23
0
        public async Task DeclineGroup(
            RequestGroup requestGroup,
            DateTimeOffset declinedAt,
            int userId,
            int?impersonatorId,
            string message)
        {
            NullCheckHelper.ArgumentCheckNull(requestGroup, nameof(DeclineGroup), nameof(RequestService));
            requestGroup.Requests = await _tolkDbContext.Requests.GetRequestsForRequestGroup(requestGroup.RequestGroupId).ToListAsync();

            requestGroup.OrderGroup.Orders = await _tolkDbContext.Orders.GetOrdersForOrderGroup(requestGroup.OrderGroupId).ToListAsync();

            requestGroup.OrderGroup.RequestGroups = await _tolkDbContext.RequestGroups.GetRequestGroupsForOrderGroup(requestGroup.OrderGroupId).ToListAsync();

            requestGroup.Decline(declinedAt, userId, impersonatorId, message);
            await _orderService.CreateRequestGroup(requestGroup.OrderGroup, requestGroup);

            _notificationService.RequestGroupDeclinedByBroker(requestGroup);
        }
示例#24
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!!");
            }
        }
        public async Task Create(Request request, int userId, int?impersonatorId, string message, ComplaintType type)
        {
            NullCheckHelper.ArgumentCheckNull(request, nameof(Create), nameof(ComplaintService));
            request.Complaints = await _dbContext.Complaints.GetComplaintsForRequest(request.RequestId).ToListAsync();

            var complaint = new Complaint
            {
                Request                = request,
                ComplaintType          = type,
                ComplaintMessage       = message,
                Status                 = ComplaintStatus.Created,
                CreatedAt              = _clock.SwedenNow,
                CreatedBy              = userId,
                ImpersonatingCreatedBy = impersonatorId
            };

            request.CreateComplaint(complaint, _clock.SwedenNow);
            _notificationService.ComplaintCreated(complaint);
            _logger.LogDebug($"Created complaint for request {request.RequestId}");
        }
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            NullCheckHelper.ArgumentCheckNull(bindingContext, nameof(RadioButtonGroupModelBinder));
            var value = bindingContext.ValueProvider.GetValue($"{bindingContext.ModelName}");

            if (value == ValueProviderResult.None)
            {
                return(Task.CompletedTask);
            }

            RadioButtonGroup model = new RadioButtonGroup {
                SelectedItem = new SelectListItem {
                    Value = value.FirstValue
                }
            };

            bindingContext.Result = ModelBindingResult.Success(model);

            return(Task.CompletedTask);
        }
示例#27
0
 public OrderGroup(AspNetUser createdByUser, AspNetUser createdByImpersonator, CustomerOrganisation customerOrganisation, DateTimeOffset createdAt, IEnumerable <Order> orders, bool requireSameInterpreter = true)
 {
     NullCheckHelper.ArgumentCheckNull(customerOrganisation, nameof(OrderGroup), nameof(OrderGroup));
     //Verify that all orders have the same customer, region and language
     Validate.Ensure(orders.GroupBy(o => o.CustomerOrganisationId).Count() == 1, "A group cannot have orders connected to several customers.");
     Validate.Ensure(orders.GroupBy(o => o.LanguageId).Count() == 1, "A group cannot have orders connected to several languages.");
     Validate.Ensure(orders.GroupBy(o => o.RegionId).Count() == 1, "A group cannot have orders connected to several regions.");
     Orders = orders.ToList();
     CustomerOrganisation   = customerOrganisation;
     CustomerOrganisationId = customerOrganisation.CustomerOrganisationId;
     CreatedAt              = createdAt;
     CreatedByUser          = createdByUser;
     CreatedByImpersonator  = createdByImpersonator;
     RequestGroups          = new List <RequestGroup>();
     RequireSameInterpreter = requireSameInterpreter;
     Status                 = OrderStatus.Requested;
     Requirements           = new List <OrderGroupRequirement>();
     InterpreterLocations   = new List <OrderGroupInterpreterLocation>();
     CompetenceRequirements = new List <OrderGroupCompetenceRequirement>();
 }
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            NullCheckHelper.ArgumentCheckNull(bindingContext, nameof(CheckboxGroupModelBinder));
            var selectedValues = bindingContext.ValueProvider.GetValue($"{bindingContext.ModelName}");

            if (selectedValues == ValueProviderResult.None)
            {
                return(Task.CompletedTask);
            }

            var model = new CheckboxGroup
            {
                SelectedItems = selectedValues.Select(sv => new SelectListItem {
                    Value = sv
                })
            };

            bindingContext.Result = ModelBindingResult.Success(model);

            return(Task.CompletedTask);
        }
示例#29
0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            NullCheckHelper.ArgumentCheckNull(bindingContext, nameof(DateTimeOffsetModelBinder));
            var dateValue       = bindingContext.ValueProvider.GetValue($"{bindingContext.ModelName}.Date");
            var timeValue       = bindingContext.ValueProvider.GetValue($"{bindingContext.ModelName}.TimeOfDay");
            var timeHourValue   = bindingContext.ValueProvider.GetValue($"{bindingContext.ModelName}.Hour");
            var timeMinuteValue = bindingContext.ValueProvider.GetValue($"{bindingContext.ModelName}.Minute");

            // Date and time always required
            if (!ValueDefinedAndUsed(dateValue) || (!ValueDefinedAndUsed(timeValue) && (!ValueDefinedAndUsed(timeHourValue))))
            {
                return(Task.CompletedTask);
            }
            string timeValueSanitized;

            if (ValueDefinedAndUsed(timeValue))
            {
                if (timeValue.FirstValue == "0" ||
                    timeValue.FirstValue == "00")
                {
                    timeValueSanitized = "00:00";
                }
                else
                {
                    timeValueSanitized = timeValue.FirstValue.ContainsSwedish(":")
                        ? timeValue.FirstValue
                        : timeValue.FirstValue.Insert(timeValue.FirstValue.Length - 2, ":"); // Add colon to time if not exists
                }
            }
            else
            {
                timeValueSanitized = $"{timeHourValue.FirstValue}:{timeMinuteValue.FirstValue}";
            }
            DateTime dateTime = $"{dateValue.FirstValue} {timeValueSanitized}".ToSwedishDateTime();
            var      model    = dateTime.ToDateTimeOffsetSweden();

            bindingContext.Result = ModelBindingResult.Success(model);

            return(Task.CompletedTask);
        }
示例#30
0
        public async Task SendChangedEmailLink(AspNetUser user, string newEmailAddress, string resetLink, bool changedByAdmin = false)
        {
            NullCheckHelper.ArgumentCheckNull(user, nameof(SendChangedEmailLink), nameof(UserService));
            string message   = changedByAdmin ? $"Om du har begärt att få din e-postadress ändrad för '{user.FullName}' så logga in i {Constants.SystemName} med din gamla e-post {user.Email} och klicka eller klistra därefter in länken nedan i webbläsaren för att verifiera ändringen." : $"Om du har bytt e-postadress för '{user.FullName}' så klicka på länken Verifiera e-postadress, om du då får upp en inloggningssida så behöver du logga in med din gamla e-postadress och det vanliga lösenordet, är du redan inloggad i webbläsaren så får du direkt ett meddelande om att e-postadressen är uppdaterad.";
            var    bodyPlain =
                $@"Ändring av e-postadress för {Constants.SystemName}

{message}

{resetLink}

Om du inte har bytt/begärt byte av e-postadress kan du radera det här
meddelandet och kontakta
supporten på {_options.Support.FirstLineEmail}.";

            var bodyHtml =
                $@"<h2>Ändring av e-postadress för {Constants.SystemName} </h2>

<div>{message}</div>

<div>{HtmlHelper.GetButtonDefaultLargeTag(resetLink.AsUri(), "Verifiera e-postadress")}</div>

<div>Om du inte har bytt/begärt byte av e-postadress kan du radera det här
meddelandet och kontakta
supporten på {_options.Support.FirstLineEmail}.</div>";

            _notificationService.CreateEmail(
                newEmailAddress,
                $"Ändring av e-postadress för {Constants.SystemName}",
                bodyPlain,
                bodyHtml,
                NotificationType.ChangedEmailVerification,
                false,
                false);
            await _dbContext.SaveChangesAsync();

            _logger.LogInformation("Verification link for changed email sent to {email} for {userId}",
                                   newEmailAddress, user.Id);
        }