admin/warehouse landing page

This commit is contained in:
Frede Hundewadt 2023-01-02 16:43:58 +01:00
parent a5c5ed6883
commit e520a03666
7 changed files with 182 additions and 133 deletions

View file

@ -18,38 +18,68 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components @using Wonky.Client.Components
<div class="card m-3" style="width: 400px"> <div class="row">
<div class="col-lg-4 col-md-12 col-md-4 mb-4">
<div class="card">
<div class="card-header">Danmark</div>
<div class="card-body"> <div class="card-body">
<h4 class="card-title"> <div class="list-group list-group-flush">
Danmark <AuthorizeView Roles="Admin">
</h4> <a class="list-group-item list-group-item-action list-group-item-warning" href="/office/users/advisors/dk">
<p class="card-text"> <i class="bi-activity"></i> Sælgere
Kunder, Prisliste </a>
</p> </AuthorizeView>
<a class="btn btn-lg btn-primary d-block" href="/office/country/dk"> Danmark ....</a> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
<i class="bi-phone"></i> Tlf.Ordre
</a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/dk">
<i class="bi-file-spreadsheet"></i> Priser
</a>
</div>
</div>
</div>
</div> </div>
</div>
<div class="card m-3" style="width: 400px"> <div class="col-lg-4 col-md-12 col-md-4 mb-4">
<div class="card">
<div class="card-header">Norge</div>
<div class="card-body"> <div class="card-body">
<h4 class="card-title"> <div class="list-group">
Norge <AuthorizeView Roles="Admin">
</h4> <a class="list-group-item list-group-item-action list-group-item-warning" href="/office/users/advisors/no">
<p class="card-text"> <i class="bi-activity"></i> Sælgere
Kunder, Prisliste </a>
</p> </AuthorizeView>
<a class="btn btn-lg btn-primary d-block" href="/office/country/no"> Norge ....</a> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
<i class="bi-phone"></i> Tlf.Ordre
</a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/no">
<i class="bi-file-spreadsheet"></i> Priser
</a>
</div>
</div>
</div>
</div> </div>
</div>
<div class="card m-3" style="width: 400px"> <div class="col-lg-4 col-md-12 col-md-4 mb-4">
<div class="card">
<div class="card-header">Sverige</div>
<div class="card-body"> <div class="card-body">
<h4 class="card-title"> <div class="list-group">
Sverige <AuthorizeView Roles="Admin">
</h4> <a class="list-group-item list-group-item-action list-group-item-warning" href="/office/users/advisors/se">
<p class="card-text"> <i class="bi-activity"></i> Sælgere
Kunder, Prisliste </a>
</p> </AuthorizeView>
<a class="btn btn-lg btn-primary d-block" href="/office/country/s"> Sverige ....</a> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
<i class="bi-phone"></i> Tlf.Ordre
</a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/se">
<i class="bi-file-spreadsheet"></i> Priser
</a>
</div> </div>
</div>
</div>
</div>
</div> </div>

View file

@ -109,7 +109,7 @@ public class AdvisorCatalogRepository : IAdvisorCatalogRepository
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup, ["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
}; };
var response = await _client var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/{countryCode}/page", queryString)); .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/page", queryString));
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
{ {
@ -150,7 +150,7 @@ public class AdvisorCatalogRepository : IAdvisorCatalogRepository
/// <returns></returns> /// <returns></returns>
public async Task<SalesItemView> GetSalesItemSku(string countryCode, string sku) public async Task<SalesItemView> GetSalesItemSku(string countryCode, string sku)
{ {
var salesItem = await _client.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/{countryCode}/sku/{sku}"); var salesItem = await _client.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/sku/{countryCode}/{sku}");
return salesItem ?? new SalesItemView(); return salesItem ?? new SalesItemView();
} }

View file

@ -26,10 +26,10 @@
</div> </div>
</div> </div>
@if (!string.IsNullOrWhiteSpace(Company.Blocked)) @if (!string.IsNullOrWhiteSpace(_company.Blocked))
{ {
<div class="alert alert-danger"> <div class="alert alert-danger">
<h4>Ring til kontoret. Denne konto er spærret med kode '@Company.Blocked'</h4> <h4>Ring til kontoret. Denne konto er spærret med kode '@_company.Blocked'</h4>
</div> </div>
} }
<div class="row bg-light border-1 border-dark rounded-3 p-3"> <div class="row bg-light border-1 border-dark rounded-3 p-3">
@ -67,7 +67,7 @@ else
<div class="col-md-4"> <div class="col-md-4">
<InputSelect id="statusType" class="form-select bg-primary text-bg-primary" @bind-Value="@Activity.ActivityStatusEnum"> <InputSelect id="statusType" class="form-select bg-primary text-bg-primary" @bind-Value="@Activity.ActivityStatusEnum">
<option value="noSale">Ingen salg</option> <option value="noSale">Ingen salg</option>
@if (!string.IsNullOrEmpty(Activity.VatNumber) && !string.IsNullOrWhiteSpace(Activity.Address1) && Company.HasFolded == 0) @if (!string.IsNullOrEmpty(Activity.VatNumber) && !string.IsNullOrWhiteSpace(Activity.Address1) && _company.HasFolded == 0)
{ {
@if (DraftProvider.Draft.DraftType == "order") @if (DraftProvider.Draft.DraftType == "order")
{ {
@ -314,7 +314,7 @@ else
</EditForm> </EditForm>
<div class="row mt-5 mb-2"> <div class="row mt-5 mb-2">
<div class="col-sm-6"> <div class="col-sm-6">
<a class="btn btn-warning" href="/customers/@Company.CompanyId">Kundekort <i class="bi-arrow-left"></i></a> <a class="btn btn-warning" href="/customers/@_company.CompanyId">Kundekort <i class="bi-arrow-left"></i></a>
</div> </div>
<div class="col-sm-4 text-end"> <div class="col-sm-4 text-end">
<button type="button" class="btn btn-warning" @onclick="CallConfirmProductCheckModel" disabled="@(PoFormInvalid || Working)">Opret besøg <i class="bi-plus"></i></button> <button type="button" class="btn btn-warning" @onclick="CallConfirmProductCheckModel" disabled="@(PoFormInvalid || Working)">Opret besøg <i class="bi-plus"></i></button>

View file

@ -49,12 +49,12 @@ public partial class AdvisorCreateActivityPage : IDisposable
[Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; }
[Inject] public ICustomerHistoryRepository HistoryRepo { get; set; } [Inject] public ICustomerHistoryRepository HistoryRepo { get; set; }
// variables // variables
private readonly JsonSerializerOptions? _options = new() {PropertyNameCaseInsensitive = true}; private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true};
private SalesItemView SelectedItem { get; set; } = new(); private SalesItemView SelectedItem { get; set; } = new();
private UserPref UserPrefs { get; set; } = new(); private UserPref UserPrefs { get; set; } = new();
private ActivityDto Activity { get; set; } = new(); private ActivityDto Activity { get; set; } = new();
private CompanyDto Company = new(); private CompanyDto _company = new();
private EditContext ActivityContext { get; set; } private EditContext? ActivityContext { get; set; }
private bool PoFormInvalid { get; set; } = true; private bool PoFormInvalid { get; set; } = true;
private bool ShowItem { get; set; } private bool ShowItem { get; set; }
private string Quantity { get; set; } = "1"; private string Quantity { get; set; } = "1";
@ -62,20 +62,18 @@ public partial class AdvisorCreateActivityPage : IDisposable
private string Discount { get; set; } = "0"; private string Discount { get; set; } = "0";
private bool Sas { get; set; } private bool Sas { get; set; }
private bool InvalidActivityType { get; set; } = true; private bool InvalidActivityType { get; set; } = true;
private bool InvalidStatusType { get; set; } = true;
private bool InvalidActivity { get; set; } = true; private bool InvalidActivity { get; set; } = true;
private bool InvalidCanvas { get; set; } = true;
private bool NoHistory { get; set; } = true;
private bool ReportClosed { get; set; } private bool ReportClosed { get; set; }
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
private UserInfoView ThisUserInfo { get; set; } = new(); private UserInfoView ThisUserInfo { get; set; } = new();
private DateTime SelectedDate { get; set; } private DateTime SelectedDate { get; set; }
private string OldPhone { get; set; } = ""; private string OldPhone { get; set; } = "";
private string PromptDateConfirm { get; set; }
private string PromptDateConfirm { get; set; } = "";
// MODAL DIALOGS // MODAL DIALOGS
private PriceListModal PriceListModal { get; set; } private PriceListModal PriceListModal { get; set; } = new();
private ProductHistoryModal HistoryModal { get; set; } private ProductHistoryModal HistoryModal { get; set; } = new();
private ProductPriceHistoryModal PriceHistoryModal { get; set; } private ProductPriceHistoryModal PriceHistoryModal { get; set; } = new();
private ConfirmWorkDateModal ConfirmWorkDateModal { get; set; } = new(); private ConfirmWorkDateModal ConfirmWorkDateModal { get; set; } = new();
private ConfirmProductCheckModal ConfirmProductCheckModal { get; set; } = new(); private ConfirmProductCheckModal ConfirmProductCheckModal { get; set; } = new();
private List<ProductInventoryView> CheckList { get; set; } = new(); private List<ProductInventoryView> CheckList { get; set; } = new();
@ -97,42 +95,42 @@ public partial class AdvisorCreateActivityPage : IDisposable
// User Info // User Info
ThisUserInfo = await Storage.GetItemAsync<UserInfoView>("_xu"); ThisUserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
// Fetch Customer from http // Fetch Customer from http
Company = await CompanyRepo.GetCompanyById(CompanyId); _company = await CompanyRepo.GetCompanyById(CompanyId);
if (Company.HasFolded == 1) if (_company.HasFolded == 1)
// Company has shutdown activities // Company has shutdown activities
Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt."; Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt.";
// variable to validate if customer needs phone number update // variable to validate if customer needs phone number update
OldPhone = Company.Phone; OldPhone = _company.Phone;
if (string.IsNullOrWhiteSpace(Company.Phone) if (string.IsNullOrWhiteSpace(_company.Phone)
&& !string.IsNullOrWhiteSpace(Company.Account) && !string.IsNullOrWhiteSpace(_company.Account)
&& Company.Account != "NY" && Company.Account.Length > 7) && _company.Account != "NY" && _company.Account.Length > 7)
{ {
Company.Phone = Company.Account[..8]; _company.Phone = _company.Account[..8];
} }
// Populate base activity information // Populate base activity information
Activity.BcId = Company.BcId; Activity.BcId = _company.BcId;
Activity.ActivityStatusEnum = "noSale"; Activity.ActivityStatusEnum = "noSale";
Activity.VisitTypeEnum = Company.Account is "" or "NY" ? "new" : "recall"; Activity.VisitTypeEnum = _company.Account is "" or "NY" ? "new" : "recall";
Activity.CompanyId = Company.CompanyId; Activity.CompanyId = _company.CompanyId;
Activity.SalesRepId = ThisUserInfo.Id; Activity.SalesRepId = ThisUserInfo.Id;
Activity.SalesRep = ThisUserInfo.Advisor; Activity.SalesRep = ThisUserInfo.Advisor;
Activity.CountryCode = ThisUserInfo.CountryCode; Activity.CountryCode = ThisUserInfo.CountryCode;
Activity.Account = Company.Account; Activity.Account = _company.Account;
Activity.VatNumber = Company.VatNumber; Activity.VatNumber = _company.VatNumber;
Activity.Email = Company.Email; Activity.Email = _company.Email;
Activity.Phone = Company.Phone; Activity.Phone = _company.Phone;
Activity.Mobile = Company.Mobile; Activity.Mobile = _company.Mobile;
Activity.Name = Company.Name; Activity.Name = _company.Name;
Activity.Address1 = Company.Address1; Activity.Address1 = _company.Address1;
Activity.Address2 = Company.Address2; Activity.Address2 = _company.Address2;
Activity.ZipCode = Company.ZipCode; Activity.ZipCode = _company.ZipCode;
Activity.City = Company.City; Activity.City = _company.City;
Activity.DlvName = Company.Name; Activity.DlvName = _company.Name;
Activity.DlvAddress1 = Company.Address1; Activity.DlvAddress1 = _company.Address1;
Activity.DlvAddress2 = Company.Address2; Activity.DlvAddress2 = _company.Address2;
Activity.DlvZipCode = Company.ZipCode; Activity.DlvZipCode = _company.ZipCode;
Activity.DlvCity = Company.City; Activity.DlvCity = _company.City;
// Initialize date variable // Initialize date variable
SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate); SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate);
// raise flag if report is closed // raise flag if report is closed
@ -159,8 +157,8 @@ public partial class AdvisorCreateActivityPage : IDisposable
private async Task CallConfirmProductCheckModel() private async Task CallConfirmProductCheckModel()
{ {
// check if new account // check if new account
if (string.IsNullOrWhiteSpace(Company.Account) if (string.IsNullOrWhiteSpace(_company.Account)
|| Company.Account.ToLower() == "ny" || _company.Account.ToLower() == "ny"
|| Activity.ActivityStatusEnum.ToLower() == "quote") || Activity.ActivityStatusEnum.ToLower() == "quote")
{ {
// proceed to create activity - as there is no product check to be done // proceed to create activity - as there is no product check to be done
@ -170,37 +168,39 @@ public partial class AdvisorCreateActivityPage : IDisposable
// check if product has been checked // check if product has been checked
// fetch products from storage // fetch products from storage
var storage = await Storage.GetItemAsStringAsync($"{CompanyId}-products"); var pStorage = await Storage.GetItemAsStringAsync($"{CompanyId}-products");
Logger.LogDebug("pStorage => {}", pStorage);
// fetch pDate from storage // fetch pDate from storage
var pDate = await Storage.GetItemAsStringAsync($"{CompanyId}-pDate"); var pDate = await Storage.GetItemAsync<string>($"{CompanyId}-pDate");
Logger.LogDebug("pDate => {}", pDate);
// check if product data is valid and updated today // check if product data is valid and updated today
if (string.IsNullOrWhiteSpace(storage) || DateTime.Parse(pDate.Replace("\"", "")) < DateTime.Now) if (string.IsNullOrWhiteSpace(pStorage) || pDate.Replace("\"", "") != $"{DateTime.Now:yyyy-MM-dd}")
{ {
Working = true; Working = true;
// pop a message // pop a message
Toast.ShowError("Produkt gennemgang mangler. Vent mens produkt oversigt indlæses. Gå ikke væk fra siden!", "Produkt check ..."); Toast.ShowError("Produkt gennemgang mangler. Vent mens produkt oversigt indlæses. Gå ikke væk fra siden!", "Produkt check ...");
// product inventory has not been updated // product inventory has not been updated
// send rpc call to sync ERP to CRM // send rpc call to sync ERP to CRM
Toast.ShowInfo("Vent mens data synkroniseres ...", "ERP til CRM ..."); Toast.ShowInfo("Vent mens data synkroniseres ...", "ERP til CRM ...");
var ts = await HistoryRepo.ErpInvoiceToCrmRpc(CompanyId, Company.HistorySync); var ts = await HistoryRepo.ErpInvoiceToCrmRpc(CompanyId, _company.HistorySync);
while (string.IsNullOrWhiteSpace(ts)) while (string.IsNullOrWhiteSpace(ts))
{ await Task.Delay(500);
await Task.Delay(1000);
}
// save pDate // save pDate
await Storage.SetItemAsync($"{CompanyId}-pDate", ts); await Storage.SetItemAsync($"{CompanyId}-pDate", ts);
// request products from backend // request products from backend
Toast.ShowInfo("Vent mens produkt oversigt hentes", "CRM produkt liste"); Toast.ShowInfo("Vent mens produkt oversigt hentes", "CRM produkt liste");
CheckList = await HistoryRepo.FetchInventory(CompanyId); CheckList = await HistoryRepo.FetchInventory(CompanyId);
if(CheckList.Any())
CheckList = CheckList.OrderBy(x => x.Description).ToList(); CheckList = CheckList.OrderBy(x => x.Description).ToList();
await Storage.SetItemAsync($"{CompanyId}-products", CheckList); await Storage.SetItemAsync($"{CompanyId}-products", CheckList);
Working = false; Working = false;
} }
else else
{ {
// deserialize storage data // deserialize storage data
CheckList = JsonSerializer.Deserialize<List<ProductInventoryView>>(storage); CheckList = JsonSerializer.Deserialize<List<ProductInventoryView>>(pStorage);
if(CheckList.Any()) if(CheckList.Any())
CheckList = CheckList.OrderBy(x => x.Description).ToList(); CheckList = CheckList.OrderBy(x => x.Description).ToList();
} }
@ -210,14 +210,14 @@ public partial class AdvisorCreateActivityPage : IDisposable
} }
private async Task ConfirmProductCheckCallback() private async Task ConfirmProductCheckCallback()
{ {
ConfirmProductCheckModal.Hide();
await CreateActivity(); await CreateActivity();
foreach (var item in CheckList) foreach (var item in CheckList)
{ {
item.Check = false; item.Check = false;
} }
await Storage.SetItemAsync($"{CompanyId}-products", CheckList); await Storage.SetItemAsync($"{CompanyId}-products", CheckList);
ConfirmProductCheckModal.Hide();
} }
/// <summary> /// <summary>
@ -308,7 +308,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
Toast.ShowError("Ved bestilling skal der være en eller flere linjer i kladden."); Toast.ShowError("Ved bestilling skal der være en eller flere linjer i kladden.");
return; return;
// phone number is required if first time customer // phone number is required if first time customer
case "order" when Company.Account is "NY" or "" && string.IsNullOrWhiteSpace(Activity.Phone): case "order" when _company.Account is "NY" or "" && string.IsNullOrWhiteSpace(Activity.Phone):
Toast.ShowError("Ved bestilling til ny kunde skal telefon nummer angives."); Toast.ShowError("Ved bestilling til ny kunde skal telefon nummer angives.");
return; return;
// verify email address is a valid address // verify email address is a valid address
@ -324,8 +324,8 @@ public partial class AdvisorCreateActivityPage : IDisposable
// check if phone number need to be updated // check if phone number need to be updated
if (OldPhone != Activity.Phone) if (OldPhone != Activity.Phone)
{ {
Company.Phone = Activity.Phone; _company.Phone = Activity.Phone;
await CompanyRepo.UpdateErpData(Company.CompanyId, Company); await CompanyRepo.UpdateErpData(_company.CompanyId, _company);
} }
// begin assembling activity // begin assembling activity
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}"; Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";

View file

@ -74,7 +74,7 @@
@activity.OfficeNote @activity.OfficeNote
</div> </div>
<div class="col"> <div class="col">
ikke fuldt implementeret @activity.CrmNote
</div> </div>
</div> </div>
</div> </div>

View file

@ -17,41 +17,70 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Warehouse")] @attribute [Authorize(Roles = "Admin,Warehouse")]
@page "/office/country/{CountryCode}" @page "/office/country"
<div class="row">
<div class="col-lg-4 col-md-12 col-md-4 mb-4">
<div class="card">
<div class="card-header">Danmark</div>
<div class="card-body">
<div class="list-group list-group-flush">
<AuthorizeView Roles="Admin">
<a class="list-group-item list-group-item-action list-group-item-warning" href="/office/users/advisors/dk">
<i class="bi-activity"></i> Sælgere
</a>
</AuthorizeView>
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
<i class="bi-phone"></i> Tlf.Ordre
</a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/dk">
<i class="bi-file-spreadsheet"></i> Priser
</a>
</div>
</div>
</div>
</div>
<AuthorizeView Roles="Admin,Office"> <div class="col-lg-4 col-md-12 col-md-4 mb-4">
<div class="card m-3" style="width: 400px"> <div class="card">
<div class="card-header">Norge</div>
<div class="card-body"> <div class="card-body">
<h4 class="card-title"> <div class="list-group">
@CountryCode.ToUpper() Sælgere <AuthorizeView Roles="Admin">
</h4> <a class="list-group-item list-group-item-action list-group-item-warning" href="/office/users/advisors/no">
<p class="card-text"> <i class="bi-activity"></i> Sælgere
Sælger kundeliste, Rapporter, Stamdata </a>
</p> </AuthorizeView>
<a class="btn btn-lg btn-primary d-block" href="/office/users/advisors/@CountryCode"> Sælgere</a> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
<i class="bi-phone"></i> Tlf.Ordre
</a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/no">
<i class="bi-file-spreadsheet"></i> Priser
</a>
</div> </div>
</div> </div>
</AuthorizeView> </div>
<div class="card m-3" style="width: 400px"> </div>
<div class="col-lg-4 col-md-12 col-md-4 mb-4">
<div class="card">
<div class="card-header">Sverige</div>
<div class="card-body"> <div class="card-body">
<h4 class="card-title"> <div class="list-group">
@CountryCode.ToUpper() Kunder <AuthorizeView Roles="Admin">
</h4> <a class="list-group-item list-group-item-action list-group-item-warning" href="/office/users/advisors/se">
<p class="card-text"> <i class="bi-activity"></i> Sælgere
Filtrer og søg kunder </a>
</p> </AuthorizeView>
<a class="btn btn-lg btn-primary d-block" href="/office/customers/@CountryCode"> Kundeliste</a> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
</div> <i class="bi-phone"></i> Tlf.Ordre
</div> </a>
<div class="card m-3" style="width: 400px"> <a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/se">
<div class="card-body"> <i class="bi-file-spreadsheet"></i> Priser
<h4 class="card-title"> </a>
@CountryCode.ToUpper() Priskatalog
</h4>
<p class="card-text">
Produkter og priser
</p>
<a class="btn btn-lg btn-primary d-block" href="/office/catalog/@CountryCode"> Priskatalog</a>
</div> </div>
</div>
</div>
</div>
</div> </div>

View file

@ -46,18 +46,8 @@
<AuthorizeView Roles="Admin,Warehouse"> <AuthorizeView Roles="Admin,Warehouse">
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/office/country/dk"> <NavLink class="nav-link ps-2" href="/office/country">
<i class="bi-people pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Danmark <i class="bi-people pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Sælgere
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/office/country/no">
<i class="bi-file-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Norge
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/office/country/se">
<i class="bi-file-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Sverige
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">