WIP refactor namespace
This commit is contained in:
parent
7c43c7d196
commit
431fef2d4b
82 changed files with 335 additions and 1095 deletions
|
@ -32,7 +32,7 @@
|
||||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
|
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
|
||||||
<i class="bi-phone"></i> Tlf.Ordre
|
<i class="bi-phone"></i> Tlf.Ordre
|
||||||
</a>
|
</a>
|
||||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/dk">
|
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/dk">
|
||||||
<i class="bi-file-spreadsheet"></i> Priser
|
<i class="bi-file-spreadsheet"></i> Priser
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -53,7 +53,7 @@
|
||||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
|
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
|
||||||
<i class="bi-phone"></i> Tlf.Ordre
|
<i class="bi-phone"></i> Tlf.Ordre
|
||||||
</a>
|
</a>
|
||||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/no">
|
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/no">
|
||||||
<i class="bi-file-spreadsheet"></i> Priser
|
<i class="bi-file-spreadsheet"></i> Priser
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
|
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
|
||||||
<i class="bi-phone"></i> Tlf.Ordre
|
<i class="bi-phone"></i> Tlf.Ordre
|
||||||
</a>
|
</a>
|
||||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/se">
|
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/se">
|
||||||
<i class="bi-file-spreadsheet"></i> Priser
|
<i class="bi-file-spreadsheet"></i> Priser
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -29,12 +29,14 @@ namespace Wonky.Client.Components
|
||||||
private Dictionary<string, string> Items { get; set; } = new();
|
private Dictionary<string, string> Items { get; set; } = new();
|
||||||
private UserPref Prefs = new();
|
private UserPref Prefs = new();
|
||||||
private string PageSize { get; set; } = "";
|
private string PageSize { get; set; } = "";
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
ProfileService.OnChange += ProfileServiceOnOnChange;
|
ProfileService.OnChange += ProfileServiceOnOnChange;
|
||||||
Prefs = await ProfileService.GetPreferences();
|
Prefs = await ProfileService.GetPreferences();
|
||||||
PageSize = Prefs.PageSize;
|
PageSize = Prefs.PageSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnSelectChanged(ChangeEventArgs e)
|
private async Task OnSelectChanged(ChangeEventArgs e)
|
||||||
{
|
{
|
||||||
var val = e.Value.ToString();
|
var val = e.Value.ToString();
|
||||||
|
@ -42,11 +44,13 @@ namespace Wonky.Client.Components
|
||||||
await OnChanged.InvokeAsync(val);
|
await OnChanged.InvokeAsync(val);
|
||||||
await ProfileService.SetPageSize(val);
|
await ProfileService.SetPageSize(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ProfileServiceOnOnChange(UserPref newUserPref)
|
private void ProfileServiceOnOnChange(UserPref newUserPref)
|
||||||
{
|
{
|
||||||
Prefs = newUserPref;
|
Prefs = newUserPref;
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
ProfileService.OnChange -= ProfileServiceOnOnChange;
|
ProfileService.OnChange -= ProfileServiceOnOnChange;
|
||||||
|
|
|
@ -8,11 +8,11 @@ public partial class QuoteListComponent
|
||||||
{
|
{
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public List<ReportItemView> Quotes { get; set; } = new();
|
public List<ReportItemView> Quotes { get; set; } = new();
|
||||||
[Parameter] public EventCallback<QuoteCallbackArgs> OnChangedCallback { get; set; }
|
[Parameter] public EventCallback<QCallbackArgs> OnChangedCallback { get; set; }
|
||||||
|
|
||||||
private async Task SetQuote(string eSalesNumber, QStatus status)
|
private async Task SetQuote(string eSalesNumber, QStatus status)
|
||||||
{
|
{
|
||||||
var args = new QuoteCallbackArgs()
|
var args = new QCallbackArgs()
|
||||||
{
|
{
|
||||||
ESalesNumber = eSalesNumber,
|
ESalesNumber = eSalesNumber,
|
||||||
Status = status
|
Status = status
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
<EditForm EditContext="WorkDateContext">
|
<EditForm EditContext="WorkDateContext">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="row align-items-center">
|
<div class="row align-items-center">
|
||||||
<div class="col-sm-7 work-date">
|
<div class="col-sm-7 fw-bold">
|
||||||
@SelectedDate.ToLongDateString()
|
@SelectedDate.DayOfWeek d. @(SelectedDate.Day)/@(SelectedDate.Month)
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<InputDate class="form-control calendar" @bind-Value="SelectedDate" @oninput="OnDateChanged"/>
|
<InputDate class="form-control calendar" @bind-Value="SelectedDate" @oninput="OnDateChanged"/>
|
||||||
|
|
|
@ -86,7 +86,7 @@ namespace Wonky.Client.HttpInterceptors
|
||||||
if (e.Response == null || e.Response.IsSuccessStatusCode)
|
if (e.Response == null || e.Response.IsSuccessStatusCode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var message = "En fejl er opstået";
|
var message = $"En fejl er opstået \n {e.Response.Content}";
|
||||||
var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri);
|
var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri);
|
||||||
if (currDoc.Contains("login/"))
|
if (currDoc.Contains("login/"))
|
||||||
currDoc = "";
|
currDoc = "";
|
||||||
|
@ -98,20 +98,23 @@ namespace Wonky.Client.HttpInterceptors
|
||||||
break;
|
break;
|
||||||
case HttpStatusCode.BadRequest:
|
case HttpStatusCode.BadRequest:
|
||||||
_logger.LogDebug("BadRequest <= {}", currDoc);
|
_logger.LogDebug("BadRequest <= {}", currDoc);
|
||||||
|
_logger.LogDebug("{}", message);
|
||||||
break;
|
break;
|
||||||
case HttpStatusCode.Unauthorized:
|
case HttpStatusCode.Unauthorized:
|
||||||
_authenticationService.Logout();
|
_logger.LogDebug("Unauthorized <= {}", currDoc);
|
||||||
|
_logger.LogDebug("{}", message);
|
||||||
|
|
||||||
|
//_authenticationService.Logout();
|
||||||
_navigation.NavigateTo($"/login/{currDoc}");
|
_navigation.NavigateTo($"/login/{currDoc}");
|
||||||
message = "Venligst login ...";
|
|
||||||
_toast.ShowInfo(message);
|
_toast.ShowInfo(message);
|
||||||
break;
|
break;
|
||||||
case HttpStatusCode.Conflict:
|
case HttpStatusCode.Conflict:
|
||||||
_logger.LogDebug("Conflict <= {}", currDoc);
|
_logger.LogDebug("Conflict <= {}", currDoc);
|
||||||
|
_logger.LogDebug("{}", message);
|
||||||
break;
|
break;
|
||||||
case HttpStatusCode.InternalServerError:
|
case HttpStatusCode.InternalServerError:
|
||||||
// message = "Der er interne problemer på serveren ...";
|
|
||||||
// _toast.ShowError(message);
|
|
||||||
_logger.LogDebug("InternalServerError <= {}", currDoc);
|
_logger.LogDebug("InternalServerError <= {}", currDoc);
|
||||||
|
_logger.LogDebug("{}", message);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
_toast.ShowError(message);
|
_toast.ShowError(message);
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
|
|
||||||
using Wonky.Client.Features;
|
|
||||||
using Wonky.Entity.Requests;
|
|
||||||
using Wonky.Entity.Views;
|
|
||||||
|
|
||||||
namespace Wonky.Client.HttpInterfaces;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface Catalog Http repository
|
|
||||||
/// </summary>
|
|
||||||
public interface IAdvisorCatalogRepository
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Get a paged sales item list
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="pagingParameters"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(CatalogPaging pagingParameters);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get sales item by id
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="salesItemId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<SalesItemView> GetSalesItemId(string salesItemId);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Overload Get sales item by sku and country code
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sku"></param>
|
|
||||||
/// <param name="countryCode"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<SalesItemView> GetSalesItemSku(string countryCode, string sku);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get sales item by variant id
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="variantId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<SalesItemView> GetSalesVariantId(string variantId);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Complete catalog for print
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<SalesItemView>> GetPriceList();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Complete catalog for print country
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="countryCode"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<SalesItemView>> GetPriceList(string countryCode);
|
|
||||||
}
|
|
|
@ -21,7 +21,7 @@ namespace Wonky.Client.HttpInterfaces;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for handling Customer Workplaces (chemical document service)
|
/// Interface for handling Customer Workplaces (chemical document service)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IWorkplaceRepository
|
public interface IAdvisorWorkplaceRepository
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get Workplaces for given customer id
|
/// Get Workplaces for given customer id
|
|
@ -28,9 +28,9 @@ public interface ICountryCatalogRepository
|
||||||
/// Get a paged sales item list
|
/// Get a paged sales item list
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="countryCode"></param>
|
/// <param name="countryCode"></param>
|
||||||
/// <param name="paging"></param>
|
/// <param name="pager"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPaging paging);
|
Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPager pager);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get sales item by id
|
/// Get sales item by id
|
|
@ -36,7 +36,7 @@ public class AdvisorActivityRepository : IAdvisorActivityRepository
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly NavigationManager _navigation;
|
private readonly NavigationManager _navigation;
|
||||||
private ILogger<AdvisorActivityRepository> _logger;
|
private readonly ILogger<AdvisorActivityRepository> _logger;
|
||||||
private readonly HttpClient _client;
|
private readonly HttpClient _client;
|
||||||
private readonly ApiConfig _api;
|
private readonly ApiConfig _api;
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ public class AdvisorActivityRepository : IAdvisorActivityRepository
|
||||||
{
|
{
|
||||||
Code = 404,
|
Code = 404,
|
||||||
IsSuccess = false,
|
IsSuccess = false,
|
||||||
Message = "Uventet svare fra server",
|
Message = "Uventet svar fra server",
|
||||||
Id = ""
|
Id = ""
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,187 +0,0 @@
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Net.Http.Json;
|
|
||||||
using System.Text.Json;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Wonky.Client.Features;
|
|
||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
using Microsoft.AspNetCore.WebUtilities;
|
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
using Wonky.Client.HttpInterfaces;
|
|
||||||
using Wonky.Entity.Configuration;
|
|
||||||
using Wonky.Entity.DTO;
|
|
||||||
using Wonky.Entity.Requests;
|
|
||||||
using Wonky.Entity.Views;
|
|
||||||
|
|
||||||
namespace Wonky.Client.HttpRepository;
|
|
||||||
|
|
||||||
public class AdvisorCatalogRepository : IAdvisorCatalogRepository
|
|
||||||
{
|
|
||||||
private readonly JsonSerializerOptions _options = new JsonSerializerOptions
|
|
||||||
{
|
|
||||||
PropertyNameCaseInsensitive = true
|
|
||||||
};
|
|
||||||
|
|
||||||
private readonly NavigationManager _navigation;
|
|
||||||
private ILogger<AdvisorCatalogRepository> _logger;
|
|
||||||
private readonly HttpClient _client;
|
|
||||||
private readonly ApiConfig _apiConfig;
|
|
||||||
|
|
||||||
public AdvisorCatalogRepository(HttpClient client,
|
|
||||||
ILogger<AdvisorCatalogRepository> logger,
|
|
||||||
NavigationManager navigation, IOptions<ApiConfig> configuration)
|
|
||||||
{
|
|
||||||
_client = client;
|
|
||||||
_logger = logger;
|
|
||||||
_navigation = navigation;
|
|
||||||
_apiConfig = configuration.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get a paged sales item list
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="pagingParameters"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(CatalogPaging pagingParameters)
|
|
||||||
{
|
|
||||||
var queryString = new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
["pageNumber"] = pagingParameters.PageNumber.ToString(),
|
|
||||||
["pageSize"] = pagingParameters.PageSize.ToString(),
|
|
||||||
["orderBy"] = pagingParameters.OrderBy,
|
|
||||||
["searchColumn"] = pagingParameters.SearchColumn,
|
|
||||||
["searchTerm"] = pagingParameters.SearchTerm,
|
|
||||||
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
|
|
||||||
};
|
|
||||||
var response = await _client
|
|
||||||
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/page", queryString));
|
|
||||||
|
|
||||||
if (!response.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
return new PagingResponse<SalesItemView>
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>(),
|
|
||||||
MetaData = new MetaData()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
var pagingResponse = new PagingResponse<SalesItemView>
|
|
||||||
{
|
|
||||||
Items = JsonSerializer.Deserialize<List<SalesItemView>>(content, _options),
|
|
||||||
MetaData = JsonSerializer.Deserialize<MetaData>(
|
|
||||||
response.Headers.GetValues("X-Pagination").First(), _options)
|
|
||||||
};
|
|
||||||
return pagingResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get a paged sales item list for country
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="pagingParameters"></param>
|
|
||||||
/// <param name="countryCode"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(CatalogPaging pagingParameters, string countryCode)
|
|
||||||
{
|
|
||||||
var queryString = new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
["pageNumber"] = pagingParameters.PageNumber.ToString(),
|
|
||||||
["pageSize"] = pagingParameters.PageSize.ToString(),
|
|
||||||
["orderBy"] = pagingParameters.OrderBy,
|
|
||||||
["searchColumn"] = pagingParameters.SearchColumn,
|
|
||||||
["searchTerm"] = pagingParameters.SearchTerm,
|
|
||||||
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
|
|
||||||
};
|
|
||||||
var response = await _client
|
|
||||||
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/page", queryString));
|
|
||||||
|
|
||||||
if (!response.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
return new PagingResponse<SalesItemView>
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>(),
|
|
||||||
MetaData = new MetaData()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
var pagingResponse = new PagingResponse<SalesItemView>
|
|
||||||
{
|
|
||||||
Items = JsonSerializer.Deserialize<List<SalesItemView>>(content, _options),
|
|
||||||
MetaData = JsonSerializer.Deserialize<MetaData>(
|
|
||||||
response.Headers.GetValues("X-Pagination").First(), _options)
|
|
||||||
};
|
|
||||||
return pagingResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get sales item by id
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="salesItemId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<SalesItemView> GetSalesItemId(string salesItemId)
|
|
||||||
{
|
|
||||||
var salesItem = await _client
|
|
||||||
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/{salesItemId}");
|
|
||||||
return salesItem ?? new SalesItemView();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Overload Get sales item by sku and country code
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sku"></param>
|
|
||||||
/// <param name="countryCode"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<SalesItemView> GetSalesItemSku(string countryCode, string sku)
|
|
||||||
{
|
|
||||||
var salesItem = await _client.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/sku/{countryCode}/{sku}");
|
|
||||||
return salesItem ?? new SalesItemView();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get sales item by variant id
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="variantId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<SalesItemView> GetSalesVariantId(string variantId)
|
|
||||||
{
|
|
||||||
var salesItem = await _client
|
|
||||||
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/variant/{variantId}");
|
|
||||||
return salesItem ?? new SalesItemView();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Complete catalog for print
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<List<SalesItemView>> GetPriceList()
|
|
||||||
{
|
|
||||||
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_apiConfig.Catalog}", _options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Complete catalog for print country
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="countryCode"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<List<SalesItemView>> GetPriceList(string countryCode)
|
|
||||||
{
|
|
||||||
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_apiConfig.Catalog}/{countryCode}", _options);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -24,7 +24,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.HttpRepository;
|
namespace Wonky.Client.HttpRepository;
|
||||||
|
|
||||||
public class WorkplaceRepository : IWorkplaceRepository
|
public class AdvisorWorkplaceRepository : IAdvisorWorkplaceRepository
|
||||||
{
|
{
|
||||||
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
|
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
|
||||||
{
|
{
|
||||||
|
@ -32,12 +32,12 @@ public class WorkplaceRepository : IWorkplaceRepository
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly NavigationManager _navigation;
|
private readonly NavigationManager _navigation;
|
||||||
private ILogger<WorkplaceRepository> _logger;
|
private ILogger<AdvisorWorkplaceRepository> _logger;
|
||||||
private readonly HttpClient _client;
|
private readonly HttpClient _client;
|
||||||
private readonly ApiConfig _api;
|
private readonly ApiConfig _api;
|
||||||
|
|
||||||
public WorkplaceRepository(HttpClient client,
|
public AdvisorWorkplaceRepository(HttpClient client,
|
||||||
ILogger<WorkplaceRepository> logger,
|
ILogger<AdvisorWorkplaceRepository> logger,
|
||||||
NavigationManager navigation,
|
NavigationManager navigation,
|
||||||
IOptions<ApiConfig> configuration)
|
IOptions<ApiConfig> configuration)
|
||||||
{
|
{
|
|
@ -41,7 +41,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
|
||||||
private readonly NavigationManager _navigation;
|
private readonly NavigationManager _navigation;
|
||||||
private ILogger<CountryCatalogRepository> _logger;
|
private ILogger<CountryCatalogRepository> _logger;
|
||||||
private readonly HttpClient _client;
|
private readonly HttpClient _client;
|
||||||
private readonly ApiConfig _apiConfig;
|
private readonly ApiConfig _api;
|
||||||
|
|
||||||
public CountryCatalogRepository(HttpClient client,
|
public CountryCatalogRepository(HttpClient client,
|
||||||
ILogger<CountryCatalogRepository> logger,
|
ILogger<CountryCatalogRepository> logger,
|
||||||
|
@ -50,28 +50,28 @@ public class CountryCatalogRepository : ICountryCatalogRepository
|
||||||
_client = client;
|
_client = client;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_navigation = navigation;
|
_navigation = navigation;
|
||||||
_apiConfig = configuration.Value;
|
_api = configuration.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get a paged sales item list
|
/// Get a paged sales item list
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="countryCode"></param>
|
/// <param name="countryCode"></param>
|
||||||
/// <param name="paging"></param>
|
/// <param name="pager"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPaging paging)
|
public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPager pager)
|
||||||
{
|
{
|
||||||
var queryString = new Dictionary<string, string>
|
var queryString = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
["pageNumber"] = paging.PageNumber.ToString(),
|
["pageNumber"] = pager.PageNumber.ToString(),
|
||||||
["pageSize"] = paging.PageSize.ToString(),
|
["pageSize"] = pager.PageSize.ToString(),
|
||||||
["orderBy"] = paging.OrderBy,
|
["orderBy"] = pager.OrderBy,
|
||||||
["searchColumn"] = paging.SearchColumn,
|
["searchColumn"] = pager.SearchColumn,
|
||||||
["searchTerm"] = paging.SearchTerm,
|
["searchTerm"] = pager.SearchTerm,
|
||||||
["selectGroup"] = paging.SelectGroup == "0" ? "" : paging.SelectGroup
|
["selectGroup"] = pager.SelectGroup == "0" ? "" : pager.SelectGroup
|
||||||
};
|
};
|
||||||
var response = await _client
|
var response = await _client
|
||||||
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/country/{countryCode}/page", queryString));
|
.GetAsync(QueryHelpers.AddQueryString($"{_api.Catalog}/{countryCode}/page", queryString));
|
||||||
|
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
|
@ -102,7 +102,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
|
||||||
public async Task<SalesItemView> GetSalesItemId(string countryCode, string salesItemId)
|
public async Task<SalesItemView> GetSalesItemId(string countryCode, string salesItemId)
|
||||||
{
|
{
|
||||||
var salesItem = await _client
|
var salesItem = await _client
|
||||||
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/country/{countryCode}/{salesItemId}");
|
.GetFromJsonAsync<SalesItemView>($"{_api.Catalog}/{countryCode}/{salesItemId}");
|
||||||
return salesItem ?? new SalesItemView();
|
return salesItem ?? new SalesItemView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
|
||||||
/// <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}/country/{countryCode}/sku/{sku}");
|
var salesItem = await _client.GetFromJsonAsync<SalesItemView>($"{_api.Catalog}/{countryCode}/sku/{sku}");
|
||||||
return salesItem ?? new SalesItemView();
|
return salesItem ?? new SalesItemView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
|
||||||
public async Task<SalesItemView> GetSalesVariantId(string countryCode, string variantId)
|
public async Task<SalesItemView> GetSalesVariantId(string countryCode, string variantId)
|
||||||
{
|
{
|
||||||
var salesItem = await _client
|
var salesItem = await _client
|
||||||
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/country/{countryCode}/variant/{variantId}");
|
.GetFromJsonAsync<SalesItemView>($"{_api.Catalog}/{countryCode}/variant/{variantId}");
|
||||||
return salesItem ?? new SalesItemView();
|
return salesItem ?? new SalesItemView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +138,6 @@ public class CountryCatalogRepository : ICountryCatalogRepository
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<List<SalesItemView>> GetPriceList(string countryCode)
|
public async Task<List<SalesItemView>> GetPriceList(string countryCode)
|
||||||
{
|
{
|
||||||
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_apiConfig.Catalog}/country/{countryCode}", _options);
|
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_api.Catalog}/{countryCode}", _options);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
namespace Wonky.Client.Models;
|
namespace Wonky.Client.Models;
|
||||||
|
|
||||||
public class QuoteCallbackArgs
|
public class QCallbackArgs
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ESalesNumber
|
/// ESalesNumber
|
|
@ -325,7 +325,7 @@ else
|
||||||
}
|
}
|
||||||
|
|
||||||
<ConfirmWorkDateModal BodyMessage="@PromptDateConfirm" OnOkClicked="WorkDateConfirmCallback" @ref="ConfirmWorkDateModal"/>
|
<ConfirmWorkDateModal BodyMessage="@PromptDateConfirm" OnOkClicked="WorkDateConfirmCallback" @ref="ConfirmWorkDateModal"/>
|
||||||
<PriceListModal OnSelected="PriceListCallback" @ref="PriceListModal"/>
|
<PriceCatalogModal CountryCode="@Company.CountryCode.ToLower()" OnSelected="PriceListCallback" @ref="PriceCatalogModal"/>
|
||||||
<ProductHistoryModal CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="HistoryModal"/>
|
<ProductHistoryModal CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="HistoryModal"/>
|
||||||
<ProductPriceHistoryModal OnSelected="PriceHistoryCallback" CompanyId="@CompanyId" Sku="@SelectedItem.Sku" @ref="PriceHistoryModal"/>
|
<ProductPriceHistoryModal OnSelected="PriceHistoryCallback" CompanyId="@CompanyId" Sku="@SelectedItem.Sku" @ref="PriceHistoryModal"/>
|
||||||
<ConfirmProductCheckModal BodyMessage="" CompanyId="@CompanyId" Products="CheckList" OnOkClicked="ConfirmProductCheckCallback" @ref="ConfirmProductCheckModal" />
|
<ConfirmProductCheckModal BodyMessage="" CompanyId="@CompanyId" Products="CheckList" OnOkClicked="ConfirmProductCheckCallback" @ref="ConfirmProductCheckModal" />
|
|
@ -30,23 +30,23 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class AdvisorCreateActivityPage : IDisposable
|
public partial class AdvisorActivityCreatePage : IDisposable
|
||||||
{
|
{
|
||||||
// Parameters
|
// Parameters
|
||||||
[CascadingParameter] DraftStateProvider DraftProvider { get; set; }
|
[CascadingParameter] DraftStateProvider DraftProvider { get; set; }
|
||||||
[Parameter] public string CompanyId { get; set; }
|
[Parameter] public string CompanyId { get; set; }
|
||||||
// Services
|
// Services
|
||||||
[Inject] public ILogger<AdvisorCreateActivityPage> Logger { get; set; }
|
[Inject] public ILogger<AdvisorActivityCreatePage> Logger { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public UserProfileService Profiles { get; set; }
|
[Inject] public UserProfileService Profiles { get; set; }
|
||||||
[Inject] public IToastService Toast { get; set; }
|
[Inject] public IToastService Toast { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { get; set; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
[Inject] public IAdvisorCatalogRepository AdvisorCatalogCrm { get; set; }
|
[Inject] public ICountryCatalogRepository Catalog { get; set; }
|
||||||
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; }
|
[Inject] public IAdvisorCustomerRepository Companies { get; set; }
|
||||||
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
[Inject] public IAdvisorActivityRepository Actitivites { get; set; }
|
||||||
[Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; }
|
[Inject] public IAdvisorReportRepository Reports { get; set; }
|
||||||
[Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
|
[Inject] public IAdvisorCustomerHistoryRepository CustomerHistory { 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();
|
||||||
|
@ -64,13 +64,13 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
private bool InvalidActivity { get; set; } = true;
|
private bool InvalidActivity { 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 SalesRep { 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; } = new();
|
private PriceCatalogModal PriceCatalogModal { get; set; } = new();
|
||||||
private ProductHistoryModal HistoryModal { get; set; } = new();
|
private ProductHistoryModal HistoryModal { get; set; } = new();
|
||||||
private ProductPriceHistoryModal PriceHistoryModal { get; set; } = new();
|
private ProductPriceHistoryModal PriceHistoryModal { get; set; } = new();
|
||||||
private ConfirmWorkDateModal ConfirmWorkDateModal { get; set; } = new();
|
private ConfirmWorkDateModal ConfirmWorkDateModal { get; set; } = new();
|
||||||
|
@ -93,9 +93,9 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
// User Preferences
|
// User Preferences
|
||||||
UserPrefs = await Profiles.GetPreferences();
|
UserPrefs = await Profiles.GetPreferences();
|
||||||
// User Info
|
// User Info
|
||||||
ThisUserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu");
|
||||||
// Fetch Customer from http
|
// Fetch Customer from http
|
||||||
Company = await CompanyRepo.GetCompanyById(CompanyId);
|
Company = await Companies.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.";
|
||||||
|
@ -113,9 +113,9 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
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 = SalesRep.Id;
|
||||||
Activity.SalesRep = ThisUserInfo.Advisor;
|
Activity.SalesRep = SalesRep.Advisor;
|
||||||
Activity.CountryCode = ThisUserInfo.CountryCode;
|
Activity.CountryCode = SalesRep.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;
|
||||||
|
@ -134,7 +134,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
// 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
|
||||||
ReportClosed = await AdvisorReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
|
ReportClosed = await Reports.ReportExist($"{SelectedDate:yyyy-MM-dd}");
|
||||||
// Ask for confirmation of date
|
// Ask for confirmation of date
|
||||||
Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed);
|
Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed);
|
||||||
if (!UserPrefs.DateConfirmed)
|
if (!UserPrefs.DateConfirmed)
|
||||||
|
@ -182,7 +182,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
// 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.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync);
|
var ts = await CustomerHistory.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync);
|
||||||
while (string.IsNullOrWhiteSpace(ts))
|
while (string.IsNullOrWhiteSpace(ts))
|
||||||
await Task.Delay(500);
|
await Task.Delay(500);
|
||||||
// save pDate
|
// save pDate
|
||||||
|
@ -190,7 +190,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
// 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 CustomerHistory.FetchInventory(CompanyId);
|
||||||
if(CheckList.Any())
|
if(CheckList.Any())
|
||||||
CheckList = CheckList.OrderBy(x => x.Description).ToList();
|
CheckList = CheckList.OrderBy(x => x.Description).ToList();
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
/// <param name="workDate"></param>
|
/// <param name="workDate"></param>
|
||||||
private async Task WorkDateComponentCallback(string workDate)
|
private async Task WorkDateComponentCallback(string workDate)
|
||||||
{
|
{
|
||||||
ReportClosed = await AdvisorReportRepo.ReportExist(workDate);
|
ReportClosed = await Reports.ReportExist(workDate);
|
||||||
SelectedDate = DateTime.Parse(workDate);
|
SelectedDate = DateTime.Parse(workDate);
|
||||||
Activity.ActivityDate = workDate;
|
Activity.ActivityDate = workDate;
|
||||||
}
|
}
|
||||||
|
@ -246,7 +246,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void CallPriceListModal()
|
private void CallPriceListModal()
|
||||||
{
|
{
|
||||||
PriceListModal.Show();
|
PriceCatalogModal.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -258,7 +258,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
// get selected item
|
// get selected item
|
||||||
if (string.IsNullOrWhiteSpace(sku.ItemId))
|
if (string.IsNullOrWhiteSpace(sku.ItemId))
|
||||||
return;
|
return;
|
||||||
SelectedItem = await AdvisorCatalogCrm.GetSalesItemId(sku.ItemId);
|
SelectedItem = await Catalog.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId);
|
||||||
ShowItem = true;
|
ShowItem = true;
|
||||||
Price = sku.Rate;
|
Price = sku.Rate;
|
||||||
Quantity = sku.Quantity;
|
Quantity = sku.Quantity;
|
||||||
|
@ -325,14 +325,14 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
if (OldPhone != Activity.Phone)
|
if (OldPhone != Activity.Phone)
|
||||||
{
|
{
|
||||||
Company.Phone = Activity.Phone;
|
Company.Phone = Activity.Phone;
|
||||||
await CompanyRepo.UpdateErpData(Company.CompanyId, Company);
|
await Companies.UpdateErpData(Company.CompanyId, Company);
|
||||||
}
|
}
|
||||||
// begin assembling activity
|
// begin assembling activity
|
||||||
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";
|
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";
|
||||||
Activity.OurRef = Activity.ActivityTypeEnum switch
|
Activity.OurRef = Activity.ActivityTypeEnum switch
|
||||||
{
|
{
|
||||||
"phone" => $"T:{ThisUserInfo.FullName.Split(" ")[0]}",
|
"phone" => $"T:{SalesRep.FullName.Split(" ")[0]}",
|
||||||
"onSite" => $"B:{ThisUserInfo.FullName.Split(" ")[0]}",
|
"onSite" => $"B:{SalesRep.FullName.Split(" ")[0]}",
|
||||||
_ => ""
|
_ => ""
|
||||||
};
|
};
|
||||||
if (Activity.Express)
|
if (Activity.Express)
|
||||||
|
@ -361,7 +361,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
|
||||||
// debug logging
|
// debug logging
|
||||||
Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity));
|
Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity));
|
||||||
// post to api
|
// post to api
|
||||||
var result = await AdvisorActivityRepo.CreateActivity(Activity);
|
var result = await Actitivites.CreateActivity(Activity);
|
||||||
// debug logging
|
// debug logging
|
||||||
Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result));
|
Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result));
|
||||||
// show result message
|
// show result message
|
|
@ -30,11 +30,11 @@
|
||||||
<div class="col-sm-2 text-end">
|
<div class="col-sm-2 text-end">
|
||||||
@if (ReportExist)
|
@if (ReportExist)
|
||||||
{
|
{
|
||||||
<a class="btn btn-info" href="/advisor/sales-reports/view/@($"{SelectedDate:yyyy-MM-dd}")">Rapport <i style="font-size: 1.2em;" class="bi-info-lg"></i></a>
|
<a class="btn btn-info" href="/advisor/reports/view/@($"{SelectedDate:yyyy-MM-dd}")">Rapport <i style="font-size: 1.2em;" class="bi-info-lg"></i></a>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<a class="btn btn-primary" href="/advisor/sales-reports/new">Rapport <i style="font-size:1.2em;" class="bi-plus-lg"></i></a>
|
<a class="btn btn-primary" href="/advisor/reports/new">Rapport <i style="font-size:1.2em;" class="bi-plus-lg"></i></a>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
|
@ -25,10 +25,10 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class AdvisorTodayActivityListPage : IDisposable
|
public partial class AdvisorActivityTodayListPage : IDisposable
|
||||||
{
|
{
|
||||||
[Inject] public UserProfileService UserProfileService { get; set; }
|
[Inject] public UserProfileService UserProfileService { get; set; }
|
||||||
[Inject] public ILogger<AdvisorTodayActivityListPage> Logger { get; set; }
|
[Inject] public ILogger<AdvisorActivityTodayListPage> Logger { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { get; set; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
|
@ -29,13 +29,13 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class AdvisorViewActivityPage : IDisposable
|
public partial class AdvisorActivityViewPage : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Parameter] public string OrderId { get; set; } = "";
|
[Parameter] public string OrderId { get; set; } = "";
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
||||||
[Inject] public ILogger<AdvisorViewActivityPage> Logger { get; set; }
|
[Inject] public ILogger<AdvisorActivityViewPage> Logger { get; set; }
|
||||||
[Inject] public IToastService Toaster { get; set; }
|
[Inject] public IToastService Toaster { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { get; set; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
private ReportItemView ReportItem { get; set; } = new();
|
private ReportItemView ReportItem { get; set; } = new();
|
|
@ -1,52 +0,0 @@
|
||||||
@*
|
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
*@
|
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
|
||||||
@using Microsoft.AspNetCore.Authorization
|
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
|
||||||
@page "/advisor/price-catalog"
|
|
||||||
<PageTitle>Innotec Produkt Katalog</PageTitle>
|
|
||||||
<div class="sticky-top bg-dark rounded-2 px-3">
|
|
||||||
<div class="row g-3 mb-3">
|
|
||||||
<div class="col-sm-2">
|
|
||||||
<CatalogGroupComponent OnChanged="SetGroupCol"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-2">
|
|
||||||
<CatalogSearchComponent OnChanged="SetSearchCol"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<CatalogSearchPhraseComponent OnChanged="SetSearchPhrase"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-2">
|
|
||||||
<CatalogSortComponent OnChanged="SetSortCol"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-2">
|
|
||||||
<PageSizeComponent OnChanged="SetPageSize"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-2 text-end">
|
|
||||||
<a class="btn btn-secondary" href="/print/catalog"><i class="bi-printer"></i> Udskriv</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<CatalogListComponent ItemList="Items"/>
|
|
||||||
@if (Working)
|
|
||||||
{
|
|
||||||
<WorkingThreeDots />
|
|
||||||
}
|
|
|
@ -1,119 +0,0 @@
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Blazored.LocalStorage;
|
|
||||||
using Wonky.Client.HttpInterceptors;
|
|
||||||
using Wonky.Client.HttpRepository;
|
|
||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
using Wonky.Client.Components;
|
|
||||||
using Wonky.Client.HttpInterfaces;
|
|
||||||
using Wonky.Client.Services;
|
|
||||||
using Wonky.Entity.DTO;
|
|
||||||
using Wonky.Entity.Requests;
|
|
||||||
using Wonky.Entity.Views;
|
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
|
||||||
|
|
||||||
public partial class AdvisorCatalogPage : IDisposable
|
|
||||||
{
|
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
|
||||||
[Inject] public IAdvisorCatalogRepository ItemRepo { get; set; }
|
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
|
||||||
[Inject] public UserProfileService ProfileService { get; set; }
|
|
||||||
private List<SalesItemView> Items { get; set; } = new();
|
|
||||||
private MetaData MetaInfo { get; set; } = new();
|
|
||||||
private CatalogPaging _page = new();
|
|
||||||
private UserPref Prefs = new();
|
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
|
||||||
private bool Working { get; set; } = true;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
Prefs = await ProfileService.GetPreferences();
|
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
|
||||||
|
|
||||||
_page.OrderBy = Prefs.ItemSort;
|
|
||||||
_page.SearchColumn = Prefs.ItemSearch;
|
|
||||||
_page.PageSize = Convert.ToInt32(Prefs.PageSize);
|
|
||||||
|
|
||||||
Interceptor.RegisterEvent();
|
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
|
||||||
|
|
||||||
await FetchSalesItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SetSearchPhrase(string searchTerm)
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>();
|
|
||||||
_page.PageNumber = 1;
|
|
||||||
_page.SearchTerm = searchTerm;
|
|
||||||
await FetchSalesItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SetPageSize(string pageSize)
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>();
|
|
||||||
_page.PageSize = Convert.ToInt32(pageSize);
|
|
||||||
_page.PageNumber = 1;
|
|
||||||
await FetchSalesItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SetSearchCol(string columnName)
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>();
|
|
||||||
_page.PageNumber = 1;
|
|
||||||
_page.SearchColumn = columnName;
|
|
||||||
await FetchSalesItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SetSortCol(string orderBy)
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>();
|
|
||||||
_page.OrderBy = orderBy;
|
|
||||||
await FetchSalesItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SetSelectedPage(int page)
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>();
|
|
||||||
_page.PageNumber = page;
|
|
||||||
await FetchSalesItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SetGroupCol(string groupFilter)
|
|
||||||
{
|
|
||||||
Items = new List<SalesItemView>();
|
|
||||||
_page.PageNumber = 1;
|
|
||||||
_page.SelectGroup = groupFilter;
|
|
||||||
await FetchSalesItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task FetchSalesItems()
|
|
||||||
{
|
|
||||||
Working = true;
|
|
||||||
var pagingResponse = await ItemRepo.GetSalesItemsPaged(_page);
|
|
||||||
Working = false;
|
|
||||||
Items = pagingResponse.Items!;
|
|
||||||
MetaInfo = pagingResponse.MetaData;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void Dispose() => Interceptor.DisposeEvent();
|
|
||||||
|
|
||||||
}
|
|
|
@ -37,10 +37,10 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages
|
namespace Wonky.Client.Pages
|
||||||
{
|
{
|
||||||
public partial class AdvisorCreateCustomerPage : IDisposable
|
public partial class AdvisorCustomerCreatePage : IDisposable
|
||||||
{
|
{
|
||||||
[Inject] public IToastService Toaster { get; set; }
|
[Inject] public IToastService Toaster { get; set; }
|
||||||
[Inject] public ILogger<AdvisorCreateCustomerPage> Logger { get; set; }
|
[Inject] public ILogger<AdvisorCustomerCreatePage> Logger { get; set; }
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { get; set; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; }
|
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; }
|
|
@ -25,7 +25,7 @@
|
||||||
<h4 class="pt-1">@Company.Name</h4>
|
<h4 class="pt-1">@Company.Name</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 align-content-end">
|
<div class="col-sm-3 align-content-end">
|
||||||
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId"><i class="bi-arrow-left"></i> Kundekort</a>
|
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId"><i class="bi-arrow-right"></i> Kundekort</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 align-content-end">
|
<div class="col-sm-3 align-content-end">
|
||||||
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId/activities/new"><i class="bi-arrow-right"></i> Nyt Besøg</a>
|
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId/activities/new"><i class="bi-arrow-right"></i> Nyt Besøg</a>
|
||||||
|
|
|
@ -28,13 +28,13 @@ namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class AdvisorCustomerInventoryListPage : IDisposable
|
public partial class AdvisorCustomerInventoryListPage : IDisposable
|
||||||
{
|
{
|
||||||
[Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
|
[Inject] public IAdvisorCustomerHistoryRepository CustomerHistory { get; set; }
|
||||||
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; }
|
[Inject] public IAdvisorCustomerRepository Customers { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public IToastService Toaster { get; set; }
|
[Inject] public IToastService Toaster { get; set; }
|
||||||
[Inject] public ILogger<AdvisorCustomerInventoryListPage> Logger { get; set; }
|
[Inject] public ILogger<AdvisorCustomerInventoryListPage> Logger { get; set; }
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
[Inject] public IAdvisorCatalogRepository AdvisorCatalogRepo { get; set; }
|
[Inject] public ICountryCatalogRepository Catalog { get; set; }
|
||||||
|
|
||||||
[CascadingParameter] public DraftStateProvider DraftStateProvider { get; set; } = new();
|
[CascadingParameter] public DraftStateProvider DraftStateProvider { get; set; } = new();
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
|
@ -53,7 +53,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
|
|
||||||
Company = await CompanyRepo.GetCompanyById(CompanyId);
|
Company = await Customers.GetCompanyById(CompanyId);
|
||||||
|
|
||||||
// fetch product inventory
|
// fetch product inventory
|
||||||
await FetchProductInventory();
|
await FetchProductInventory();
|
||||||
|
@ -64,7 +64,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
||||||
private async Task OnReorderCallback(string sku)
|
private async Task OnReorderCallback(string sku)
|
||||||
{
|
{
|
||||||
// fetch item from http repo
|
// fetch item from http repo
|
||||||
SalesItem = await AdvisorCatalogRepo.GetSalesItemSku(Company.CountryCode.ToLower(), sku);
|
SalesItem = await Catalog.GetSalesItemSku(Company.CountryCode.ToLower(), sku);
|
||||||
ReorderModal.Show();
|
ReorderModal.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
||||||
}
|
}
|
||||||
Logger.LogDebug("pulling products from backend");
|
Logger.LogDebug("pulling products from backend");
|
||||||
// fetch product history
|
// fetch product history
|
||||||
Inventory = await HistoryRepo.FetchInventory(CompanyId);
|
Inventory = await CustomerHistory.FetchInventory(CompanyId);
|
||||||
// default sort order by description
|
// default sort order by description
|
||||||
if (Inventory.Any())
|
if (Inventory.Any())
|
||||||
Inventory = Inventory.OrderBy(x => x.Description).ToList();
|
Inventory = Inventory.OrderBy(x => x.Description).ToList();
|
||||||
|
|
|
@ -1,144 +0,0 @@
|
||||||
@*
|
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
*@
|
|
||||||
|
|
||||||
@using Microsoft.AspNetCore.Authorization
|
|
||||||
@using Wonky.Client.Components
|
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
|
||||||
@page "/advisor/customers/{CompanyId}/orders/{OrderId}"
|
|
||||||
<PageTitle>@_reportItem.ESalesNumber - @_reportItem.Company.Name</PageTitle>
|
|
||||||
<table class="table table-sm table-striped d-print-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="p-0" colspan="4">
|
|
||||||
@if (_reportItem.Express)
|
|
||||||
{
|
|
||||||
<div id="watermark">
|
|
||||||
<i class="bi-lightning-charge text-dark" style="font-size: 11rem;"></i>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
<div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2">
|
|
||||||
<h2 class="fw-bold text-center">@_reportItem.Company.Name</h2>
|
|
||||||
@if (_reportItem.Express)
|
|
||||||
{
|
|
||||||
<h2 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 2rem;"></i> HASTER</h2>
|
|
||||||
}
|
|
||||||
@if (_reportItem.VisitTypeEnum.ToLower() == "phone" || _reportItem.OurRef.Contains("T:"))
|
|
||||||
{
|
|
||||||
<h5 class="text-center">TELEFONORDRE</h5>
|
|
||||||
}
|
|
||||||
@if (_reportItem.StatusTypeEnum is "Quote")
|
|
||||||
{
|
|
||||||
<h5 class="text-center">TILBUD</h5>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">Dato</th>
|
|
||||||
<td>@_reportItem.OrderDate</td>
|
|
||||||
<th scope="row">Konto</th>
|
|
||||||
<td>@_reportItem.Company.Account</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Telefon</th>
|
|
||||||
<td>@_reportItem.Company.Phone</td>
|
|
||||||
<th scope="col">Køber</th>
|
|
||||||
<td>@_reportItem.YourRef</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">CVR/VAT</th>
|
|
||||||
<td>@_reportItem.Company.VatNumber</td>
|
|
||||||
<th scope="col">Rekvisition</th>
|
|
||||||
<td>@_reportItem.ReferenceNumber</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Navn</th>
|
|
||||||
<td>@_reportItem.Company.Name</td>
|
|
||||||
<th scope="col">Lev.Navn</th>
|
|
||||||
<td>@_reportItem.DlvName</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Adresse</th>
|
|
||||||
<td>@_reportItem.Company.Address1</td>
|
|
||||||
<th scope="col">Lev.Adresse</th>
|
|
||||||
<td>@_reportItem.DlvAddress1</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Adresse</th>
|
|
||||||
<td>@_reportItem.Company.Address2</td>
|
|
||||||
<th scope="col">Lev.Adresse</th>
|
|
||||||
<td>@_reportItem.DlvAddress2</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Postnr By</th>
|
|
||||||
<td>@_reportItem.Company.ZipCode @_reportItem.Company.City</td>
|
|
||||||
<th scope="col">Lev.Postnr By</th>
|
|
||||||
<td>@_reportItem.DlvZipCity</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<table class="table table-sm table-striped table-bordered">
|
|
||||||
<thead>
|
|
||||||
<tr class="bg-light text-black">
|
|
||||||
<th scope="col">Antal</th>
|
|
||||||
<th scope="col">Varnr</th>
|
|
||||||
<th scope="col">Beskrivelse</th>
|
|
||||||
<th class="text-end" scope="col">Pris</th>
|
|
||||||
<th class="text-end" scope="col">R%</th>
|
|
||||||
<th class="text-end" scope="col">Beløb</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var line in _reportItem.Lines)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td>@line.Quantity</td>
|
|
||||||
<td>@line.Sku</td>
|
|
||||||
<td>@line.Description</td>
|
|
||||||
<td class="text-end">@($"{line.Price:N2}")</td>
|
|
||||||
<td class="text-end">@($"{line.Discount:N2}")</td>
|
|
||||||
<td class="text-end">@($"{line.LineSum:N2}")</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
<tr>
|
|
||||||
<td colspan="4"></td>
|
|
||||||
<td>Ordresum</td>
|
|
||||||
<td class="text-end">@_reportItem.OrderAmount</td>
|
|
||||||
</tr>
|
|
||||||
@if (_reportItem.Express)
|
|
||||||
{
|
|
||||||
<td class="bg-dark" colspan="4"></td>
|
|
||||||
<td class="text-end" colspan="2">
|
|
||||||
<h5 class="fw-bold"><i class="bi-lightning-charge the-fast" style="font-size: 2rem;"></i> HASTER</h5>
|
|
||||||
</td>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
@if (!string.IsNullOrWhiteSpace(_reportItem.OfficeNote))
|
|
||||||
{
|
|
||||||
<div class="alert alert-dark">
|
|
||||||
<h4 class="text-center">@_reportItem.OfficeNote</h4>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@if (Working)
|
|
||||||
{
|
|
||||||
<WorkingThreeDots/>
|
|
||||||
}
|
|
|
@ -1,134 +0,0 @@
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.Json;
|
|
||||||
using Blazored.Toast.Services;
|
|
||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
using Microsoft.AspNetCore.Components.Forms;
|
|
||||||
using Wonky.Client.HttpInterceptors;
|
|
||||||
using Wonky.Client.HttpInterfaces;
|
|
||||||
using Wonky.Client.HttpRepository;
|
|
||||||
using Wonky.Entity.DTO;
|
|
||||||
using Wonky.Entity.Views;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using Blazored.LocalStorage;
|
|
||||||
using Wonky.Client.Services;
|
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
|
||||||
|
|
||||||
public partial class AdvisorCustomerOrderViewPage : IDisposable
|
|
||||||
{
|
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
|
||||||
[Parameter] public string OrderId { get; set; } = "";
|
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
|
||||||
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
|
||||||
[Inject] public ISystemSendMailService MailService { get; set; }
|
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
|
||||||
[Inject] public ISystemUserRepository SystemUserRepo { get; set; }
|
|
||||||
[Inject] public ILogger<OfficeCustomerOrderViewPage> Logger { get; set; }
|
|
||||||
[Inject] public IToastService Toast { get; set; }
|
|
||||||
private ReportItemView _reportItem { get; set; } = new();
|
|
||||||
private bool _isNotified { get; set; }
|
|
||||||
private bool Working { get; set; } = true;
|
|
||||||
|
|
||||||
private readonly JsonSerializerOptions _options = new JsonSerializerOptions
|
|
||||||
{
|
|
||||||
PropertyNameCaseInsensitive = true
|
|
||||||
};
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
Interceptor.RegisterEvent();
|
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
|
||||||
// fetch order from backend
|
|
||||||
_reportItem = await AdvisorActivityRepo.GetReportItem(OrderId);
|
|
||||||
Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(_reportItem, _options));
|
|
||||||
Working = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set activity process state to express. Send confirmation notification to salesRep
|
|
||||||
/// </summary>
|
|
||||||
private async Task SetExpressState()
|
|
||||||
{
|
|
||||||
// disable doubled actions
|
|
||||||
if (Working)
|
|
||||||
return;
|
|
||||||
Working = true;
|
|
||||||
Logger.LogDebug("GetExpressState => {}", JsonSerializer.Serialize(_reportItem, _options));
|
|
||||||
// send request to backend
|
|
||||||
var responseView = await AdvisorActivityRepo.GetExpressState(_reportItem.ActivityId);
|
|
||||||
Logger.LogDebug("SetExpressState => responseView <= {} ", JsonSerializer.Serialize(responseView));
|
|
||||||
// get user info from storage
|
|
||||||
var user = await Storage.GetItemAsync<UserInfoView>("_xu");
|
|
||||||
// fetch sales rep from response
|
|
||||||
var salesRep = await SystemUserRepo.GetAdvisorInfo(responseView.Id);
|
|
||||||
Logger.LogDebug("SetExpressState => salesRep => {}", JsonSerializer.Serialize(salesRep));
|
|
||||||
// create email notification body
|
|
||||||
var body = new StringBuilder();
|
|
||||||
body.AppendLine($"Kvittering for modtagelse af hasteordre {_reportItem.ESalesNumber}");
|
|
||||||
body.AppendLine($"Konto : {_reportItem.Company.Account}");
|
|
||||||
body.AppendLine($"Navn : {_reportItem.Company.Name}");
|
|
||||||
body.AppendLine(
|
|
||||||
$"Post By : {salesRep.CountryCode.ToUpper()}-{_reportItem.Company.ZipCode} {_reportItem.Company.City}");
|
|
||||||
body.AppendLine();
|
|
||||||
body.AppendLine("Med venlig hilsen");
|
|
||||||
body.AppendLine($"{user.FullName}");
|
|
||||||
body.AppendLine($"{user.PhoneNumber}");
|
|
||||||
// create a list of mail addresses
|
|
||||||
var sendTo = new List<EmailContact>
|
|
||||||
{
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
Email = salesRep.Email,
|
|
||||||
Name = $"{salesRep.FirstName} {salesRep.LastName}"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// create an email
|
|
||||||
var msg = new EmailMessage
|
|
||||||
{
|
|
||||||
Body = body.ToString(),
|
|
||||||
Subject = $"Haste ordre til {_reportItem.Company.Name} er modtaget.",
|
|
||||||
To = sendTo,
|
|
||||||
IsBodyHtml = false
|
|
||||||
};
|
|
||||||
Logger.LogDebug("SetExpressState Notification => \n {}", JsonSerializer.Serialize(msg));
|
|
||||||
// send a system generated email
|
|
||||||
var sendMail = await MailService.SendMail("System", msg);
|
|
||||||
// result notification
|
|
||||||
if (sendMail.IsSuccess)
|
|
||||||
{
|
|
||||||
Toast
|
|
||||||
.ShowSuccess(
|
|
||||||
$"Status er opdateret og notifikation sendt til {salesRep.FirstName}.", "OK");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Toast
|
|
||||||
.ShowWarning(
|
|
||||||
$"Notifikation til {salesRep.FirstName} kunne ikke sendes. {sendMail.Message}", "ADVARSEL");
|
|
||||||
}
|
|
||||||
// disable further notifications
|
|
||||||
_isNotified = true;
|
|
||||||
Working = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Interceptor.DisposeEvent();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
#watermark {
|
|
||||||
position: fixed;
|
|
||||||
z-index: 999;
|
|
||||||
top: 10px;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
|
@ -18,7 +18,7 @@
|
||||||
@using Wonky.Client.Models
|
@using Wonky.Client.Models
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
@page "/advisor/open-quotes"
|
@page "/advisor/agreements"
|
||||||
<PageTitle>Aftaler og Tilbud - Oversigt</PageTitle>
|
<PageTitle>Aftaler og Tilbud - Oversigt</PageTitle>
|
||||||
<div class="row g-3 align-items-center">
|
<div class="row g-3 align-items-center">
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
|
|
@ -54,7 +54,7 @@ public partial class AdvisorQuoteListPage : IDisposable
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateQuoteCallback(QuoteCallbackArgs args)
|
private async Task UpdateQuoteCallback(QCallbackArgs args)
|
||||||
{
|
{
|
||||||
Working = true;
|
Working = true;
|
||||||
// find the quote to update
|
// find the quote to update
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Wonky.Entity.Views
|
@using Wonky.Entity.Views
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
@page "/advisor/sales-reports/new"
|
@page "/advisor/reports/new"
|
||||||
|
|
||||||
<PageTitle>Opret Dagsrapport for @_workDate</PageTitle>
|
<PageTitle>Opret Dagsrapport for @_workDate</PageTitle>
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ public partial class AdvisorReportCreatePage : IDisposable
|
||||||
_workDate = DateTime.Parse(Prefs.WorkDate);
|
_workDate = DateTime.Parse(Prefs.WorkDate);
|
||||||
|
|
||||||
if(await AdvisorReportRepo.ReportExist(Prefs.WorkDate))
|
if(await AdvisorReportRepo.ReportExist(Prefs.WorkDate))
|
||||||
Navigator.NavigateTo($"/advisor/sales-reports/view/{_workDate:yyyy-MM-dd}");
|
Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
|
||||||
|
|
||||||
BeginLeave = _workDate;
|
BeginLeave = _workDate;
|
||||||
EndLeave = _workDate;
|
EndLeave = _workDate;
|
||||||
|
@ -137,7 +137,7 @@ public partial class AdvisorReportCreatePage : IDisposable
|
||||||
await ProfileService.SetKmMorning(0);
|
await ProfileService.SetKmMorning(0);
|
||||||
// reset date confirmed
|
// reset date confirmed
|
||||||
await ProfileService.SetDateConfirmed(false);
|
await ProfileService.SetDateConfirmed(false);
|
||||||
Navigator.NavigateTo($"/advisor/sales-reports/view/{_workDate:yyyy-MM-dd}");
|
Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Submit report
|
/// Submit report
|
||||||
|
@ -252,7 +252,7 @@ public partial class AdvisorReportCreatePage : IDisposable
|
||||||
|
|
||||||
var data = await AdvisorReportRepo.InitializeReportData($"{_workDate:yyyy-MM-dd}");
|
var data = await AdvisorReportRepo.InitializeReportData($"{_workDate:yyyy-MM-dd}");
|
||||||
if(data.ReportClosed)
|
if(data.ReportClosed)
|
||||||
Navigator.NavigateTo($"/advisor/sales-reports/view/{_workDate:yyyy-MM-dd}");
|
Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
|
||||||
|
|
||||||
Report.Figures = data.ReportData;
|
Report.Figures = data.ReportData;
|
||||||
InitialValues = data.ReportData;
|
InitialValues = data.ReportData;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
@page "/advisor/sales-reports"
|
@page "/advisor/reports"
|
||||||
<PageTitle>Rapport Arkiv</PageTitle>
|
<PageTitle>Rapport Arkiv</PageTitle>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header bg-dark text-white">
|
<div class="card-header bg-dark text-white">
|
||||||
|
|
|
@ -49,7 +49,7 @@ public partial class AdvisorReportListPage : IDisposable
|
||||||
private void ShowThisReport(string reportDate)
|
private void ShowThisReport(string reportDate)
|
||||||
{
|
{
|
||||||
Logger.LogDebug("CrmReportListPage => ShowThisReport <= {}", reportDate);
|
Logger.LogDebug("CrmReportListPage => ShowThisReport <= {}", reportDate);
|
||||||
Navigator.NavigateTo($"/advisor/sales-reports/view/{reportDate}");
|
Navigator.NavigateTo($"/advisor/reports/view/{reportDate}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@using Wonky.Client.Models
|
@using Wonky.Client.Models
|
||||||
@attribute [Authorize(Roles = "Advisor,Admin")]
|
@attribute [Authorize(Roles = "Advisor,Admin")]
|
||||||
@page "/advisor/sales-reports/view/{ReportDate}"
|
@page "/advisor/reports/view/{ReportDate}"
|
||||||
<PageTitle>@Report.ReportData.Name</PageTitle>
|
<PageTitle>@Report.ReportData.Name</PageTitle>
|
||||||
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center d-print-none">
|
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center d-print-none">
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
<ReportDistanceLedgerComponent ReportData="Report.ReportData"/>
|
<ReportDistanceLedgerComponent ReportData="Report.ReportData"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<OfficeReportActivityListComponent ActivityList="Report.ReportItems"/>
|
<AdvisorActivityListComponent ActivityList="Report.ReportItems"/>
|
||||||
<ReportActivityLedgerComponent ReportData="Report.ReportData"/>
|
<ReportActivityLedgerComponent ReportData="Report.ReportData"/>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -61,10 +61,10 @@ public partial class AdvisorReportViewPage : IDisposable
|
||||||
switch (target)
|
switch (target)
|
||||||
{
|
{
|
||||||
case PTarget.OrderPage:
|
case PTarget.OrderPage:
|
||||||
Navigator.NavigateTo($"/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
Navigator.NavigateTo($"/report/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
||||||
break;
|
break;
|
||||||
case PTarget.FrontPage:
|
case PTarget.FrontPage:
|
||||||
Navigator.NavigateTo($"/print/report/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
Navigator.NavigateTo($"/report/print/summary/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
||||||
break;
|
break;
|
||||||
case PTarget.None:
|
case PTarget.None:
|
||||||
break;
|
break;
|
||||||
|
@ -85,7 +85,7 @@ public partial class AdvisorReportViewPage : IDisposable
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure the browser address bar contains the correct link
|
// ensure the browser address bar contains the correct link
|
||||||
Navigator.NavigateTo($"/advisor/sales-reports/view/{workDate}", false, true);
|
Navigator.NavigateTo($"/advisor/reports/view/{workDate}", false, true);
|
||||||
|
|
||||||
// return if we are already at it
|
// return if we are already at it
|
||||||
if (Working)
|
if (Working)
|
||||||
|
|
|
@ -27,7 +27,7 @@ public partial class AdvisorWorkplaceDocumentListPage
|
||||||
[Parameter] public string WorkplaceId { get; set; } = "";
|
[Parameter] public string WorkplaceId { get; set; } = "";
|
||||||
|
|
||||||
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
||||||
[Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; }
|
[Inject] public IAdvisorWorkplaceRepository Workplaces { get; set; }
|
||||||
private bool Working { get; set; } = true;
|
private bool Working { get; set; } = true;
|
||||||
|
|
||||||
}
|
}
|
|
@ -27,7 +27,7 @@ namespace Wonky.Client.Pages;
|
||||||
public partial class AdvisorWorkplaceListPage : IDisposable
|
public partial class AdvisorWorkplaceListPage : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; }
|
[Inject] public IAdvisorWorkplaceRepository Workplaces { get; set; }
|
||||||
[Inject] public IAdvisorCustomerRepository _companyRepo { get; set; }
|
[Inject] public IAdvisorCustomerRepository _companyRepo { get; set; }
|
||||||
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
||||||
private List<WorkplaceListView> _workplaces { get; set; } = new();
|
private List<WorkplaceListView> _workplaces { get; set; } = new();
|
||||||
|
@ -45,7 +45,7 @@ public partial class AdvisorWorkplaceListPage : IDisposable
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
Working = true;
|
Working = true;
|
||||||
_workplaces = await WorkplaceCrmRepo.GetWorkplaces(CompanyId);
|
_workplaces = await Workplaces.GetWorkplaces(CompanyId);
|
||||||
Working = false;
|
Working = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ public partial class AdvisorWorkplaceViewPage : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Parameter] public string WorkplaceId { get; set; } = "";
|
[Parameter] public string WorkplaceId { get; set; } = "";
|
||||||
[Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; }
|
[Inject] public IAdvisorWorkplaceRepository Workplaces { get; set; }
|
||||||
[Inject] public IAdvisorCustomerRepository _companyRepo { get; set; }
|
[Inject] public IAdvisorCustomerRepository _companyRepo { get; set; }
|
||||||
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
||||||
[Inject] public NavigationManager _navigator { get; set; }
|
[Inject] public NavigationManager _navigator { get; set; }
|
||||||
|
@ -42,7 +42,7 @@ public partial class AdvisorWorkplaceViewPage : IDisposable
|
||||||
_interceptor.RegisterEvent();
|
_interceptor.RegisterEvent();
|
||||||
_interceptor.RegisterBeforeSendEvent();
|
_interceptor.RegisterBeforeSendEvent();
|
||||||
|
|
||||||
Workplace = await WorkplaceCrmRepo.GetWorkplace(CompanyId, WorkplaceId);
|
Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId);
|
||||||
Working = false;
|
Working = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,14 +54,14 @@ public partial class AdvisorWorkplaceViewPage : IDisposable
|
||||||
private async Task SubmitUpdate()
|
private async Task SubmitUpdate()
|
||||||
{
|
{
|
||||||
Working = true;
|
Working = true;
|
||||||
await WorkplaceCrmRepo.UpdateWorkplace(CompanyId, Workplace);
|
await Workplaces.UpdateWorkplace(CompanyId, Workplace);
|
||||||
Working = false;
|
Working = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DeleteWorkplace()
|
private async Task DeleteWorkplace()
|
||||||
{
|
{
|
||||||
Working = true;
|
Working = true;
|
||||||
await WorkplaceCrmRepo.DeleteWorkplace(CompanyId, Workplace.WorkplaceId);
|
await Workplaces.DeleteWorkplace(CompanyId, Workplace.WorkplaceId);
|
||||||
_navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces");
|
_navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,14 @@
|
||||||
//
|
//
|
||||||
*@
|
*@
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin,Office,Warehouse")]
|
@using Wonky.Client.Components
|
||||||
@page "/office/catalog/{CountryCode}"
|
|
||||||
<PageTitle>Produkt Katalog @CountryCode</PageTitle>
|
@attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")]
|
||||||
|
@page "/catalog"
|
||||||
|
@page "/catalog/{CountryCode}"
|
||||||
|
|
||||||
|
<PageTitle>Produkt Katalog @CountryName</PageTitle>
|
||||||
|
|
||||||
<div class="sticky-top bg-dark rounded-2 px-3">
|
<div class="sticky-top bg-dark rounded-2 px-3">
|
||||||
<div class="row g-3 mb-3">
|
<div class="row g-3 mb-3">
|
||||||
|
@ -42,7 +45,7 @@
|
||||||
<PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/>
|
<PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 text-end">
|
<div class="col-sm-2 text-end">
|
||||||
<a class="btn btn-secondary" href="/print/catalog/@CountryCode"><i class="bi-printer"></i> Udskriv</a>
|
<a class="btn btn-secondary" href="/catalog/@CountryCode/print"><i class="bi-printer"></i> Udskriv</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
|
@ -13,9 +13,11 @@
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||||
//
|
//
|
||||||
|
|
||||||
|
using System.Text.Json;
|
||||||
using Blazored.LocalStorage;
|
using Blazored.LocalStorage;
|
||||||
using Wonky.Client.HttpInterceptors;
|
using Wonky.Client.HttpInterceptors;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Wonky.Client.Helpers;
|
||||||
using Wonky.Client.HttpInterfaces;
|
using Wonky.Client.HttpInterfaces;
|
||||||
using Wonky.Client.Services;
|
using Wonky.Client.Services;
|
||||||
using Wonky.Entity.Requests;
|
using Wonky.Entity.Requests;
|
||||||
|
@ -23,90 +25,108 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OfficeCountryCatalogPage : IDisposable
|
public partial class CatalogCountryPage : IDisposable
|
||||||
{
|
{
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
[Inject] public ICountryCatalogRepository Catalog { get; set; }
|
[Inject] public ICountryCatalogRepository Catalog { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public UserProfileService ProfileService { get; set; }
|
[Inject] public UserProfileService ProfileService { get; set; }
|
||||||
|
[Inject] public ILogger<CatalogCountryPage> Logger { get; set; }
|
||||||
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
|
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
|
|
||||||
private List<SalesItemView> Items { get; set; } = new();
|
private List<SalesItemView> Items { get; set; } = new();
|
||||||
private MetaData MetaInfo { get; set; } = new();
|
private MetaData MetaInfo { get; set; } = new();
|
||||||
private CatalogPaging Paging = new();
|
private CatalogPager Pager { get; set; } = new();
|
||||||
private UserPref Prefs = new();
|
private UserPref Prefs { get; set; } = new();
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
private UserInfoView UserInfo { get; set; } = new();
|
||||||
private bool Working { get; set; } = true;
|
private bool Working { get; set; }
|
||||||
|
private string CountryName { get; set; } = "";
|
||||||
|
|
||||||
protected override async Task OnParametersSetAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
Prefs = await ProfileService.GetPreferences();
|
Prefs = await ProfileService.GetPreferences();
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
||||||
|
|
||||||
Paging.OrderBy = Prefs.ItemSort;
|
Pager.OrderBy = Prefs.ItemSort;
|
||||||
Paging.SearchColumn = Prefs.ItemSearch;
|
|
||||||
Paging.PageSize = Convert.ToInt32(Prefs.PageSize);
|
Pager.SearchColumn = Prefs.ItemSearch;
|
||||||
|
Pager.PageSize = Convert.ToInt32(Prefs.PageSize);
|
||||||
|
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
|
|
||||||
await FetchSalesItems();
|
if (string.IsNullOrWhiteSpace(CountryCode))
|
||||||
|
{
|
||||||
|
while (string.IsNullOrWhiteSpace(UserInfo.CountryCode))
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
CountryCode = UserInfo.CountryCode.ToLower();
|
||||||
|
Navigator.NavigateTo($"/catalog/{CountryCode}", false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
CountryName = Utils.CountryName(CountryCode);
|
||||||
|
await GetCatalogPaged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSearchPhrase(string searchTerm)
|
private async Task SetSearchPhrase(string searchTerm)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
Paging.PageNumber = 1;
|
Pager.PageNumber = 1;
|
||||||
Paging.SearchTerm = searchTerm;
|
Pager.SearchTerm = searchTerm;
|
||||||
await FetchSalesItems();
|
await GetCatalogPaged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetPageSize(string pageSize)
|
private async Task SetPageSize(string pageSize)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
Paging.PageSize = Convert.ToInt32(pageSize);
|
Pager.PageSize = Convert.ToInt32(pageSize);
|
||||||
Paging.PageNumber = 1;
|
Pager.PageNumber = 1;
|
||||||
await FetchSalesItems();
|
await GetCatalogPaged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSearchCol(string columnName)
|
private async Task SetSearchCol(string columnName)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
Paging.PageNumber = 1;
|
Pager.PageNumber = 1;
|
||||||
Paging.SearchColumn = columnName;
|
Pager.SearchColumn = columnName;
|
||||||
await FetchSalesItems();
|
await GetCatalogPaged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSortCol(string orderBy)
|
private async Task SetSortCol(string orderBy)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
Paging.OrderBy = orderBy;
|
Pager.OrderBy = orderBy;
|
||||||
await FetchSalesItems();
|
await GetCatalogPaged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSelectedPage(int page)
|
private async Task SetSelectedPage(int page)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
Paging.PageNumber = page;
|
Pager.PageNumber = page;
|
||||||
await FetchSalesItems();
|
await GetCatalogPaged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetGroupCol(string groupFilter)
|
private async Task SetGroupCol(string groupFilter)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
Paging.PageNumber = 1;
|
Pager.PageNumber = 1;
|
||||||
Paging.SelectGroup = groupFilter;
|
Pager.SelectGroup = groupFilter;
|
||||||
await FetchSalesItems();
|
await GetCatalogPaged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task FetchSalesItems()
|
private async Task GetCatalogPaged()
|
||||||
{
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(CountryCode))
|
||||||
|
return;
|
||||||
|
if (Working)
|
||||||
|
return;
|
||||||
Working = true;
|
Working = true;
|
||||||
var pagingResponse = await Catalog.GetSalesItemsPaged(CountryCode, Paging);
|
var page = await Catalog.GetSalesItemsPaged(CountryCode, Pager);
|
||||||
|
Items = page.Items!;
|
||||||
|
MetaInfo = page.MetaData!;
|
||||||
Working = false;
|
Working = false;
|
||||||
Items = pagingResponse.Items!;
|
|
||||||
MetaInfo = pagingResponse.MetaData!;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose() => Interceptor.DisposeEvent();
|
public void Dispose() => Interceptor.DisposeEvent();
|
|
@ -17,8 +17,8 @@
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin,Office,Warehouse")]
|
@attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")]
|
||||||
@page "/print/catalog/{CountryCode}"
|
@page "/catalog/{CountryCode}/print"
|
||||||
|
|
||||||
<PageTitle>Udskriv Katalog for @CountryName</PageTitle>
|
<PageTitle>Udskriv Katalog for @CountryName</PageTitle>
|
||||||
|
|
|
@ -30,14 +30,13 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OfficeCountryPrintCatalogPage : IDisposable
|
public partial class CatalogCountryPrintPage : IDisposable
|
||||||
{
|
{
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
[Inject] public ICountryCatalogRepository Catalog { get; set; }
|
[Inject] public ICountryCatalogRepository Catalog { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
private List<SalesItemView> Items { get; set; } = new();
|
private List<SalesItemView> Items { get; set; } = new();
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
|
||||||
private bool Working { get; set; } = true;
|
private bool Working { get; set; } = true;
|
||||||
private string CountryName { get; set; } = "";
|
private string CountryName { get; set; } = "";
|
||||||
|
|
||||||
|
@ -45,8 +44,6 @@ public partial class OfficeCountryPrintCatalogPage : IDisposable
|
||||||
{
|
{
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
|
||||||
|
|
||||||
Items = await Catalog.GetPriceList(CountryCode);
|
Items = await Catalog.GetPriceList(CountryCode);
|
||||||
CountryName = Utils.CountryName(CountryCode);
|
CountryName = Utils.CountryName(CountryCode);
|
||||||
Working = false;
|
Working = false;
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin, Office")]
|
@attribute [Authorize(Roles = "Admin,Office")]
|
||||||
@page "/office/users/advisors/{CountryCode}/{UserId}/customers"
|
@page "/office/users/advisors/{CountryCode}/{UserId}/customers"
|
||||||
|
|
||||||
<PageTitle>Kundeliste for @SalesRep.FirstName @SalesRep.LastName</PageTitle>
|
<PageTitle>Kundeliste for @SalesRep.FirstName @SalesRep.LastName</PageTitle>
|
|
@ -23,7 +23,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OfficeCountrySalesRepCustomerListPage : IDisposable
|
public partial class OfficeAdvisorCustomerListPage : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string UserId { get; set; } = "";
|
[Parameter] public string UserId { get; set; } = "";
|
||||||
[Parameter] public string CountryCode { get; set; } = "dk";
|
[Parameter] public string CountryCode { get; set; } = "dk";
|
|
@ -26,13 +26,13 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class AdminSalesRepViewPage : IDisposable
|
public partial class OfficeAdvisorViewPage : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string UserId { get; set; } = "";
|
[Parameter] public string UserId { get; set; } = "";
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
||||||
[Inject] public ISystemUserRepository SystemUserRepo { get; set; }
|
[Inject] public ISystemUserRepository SystemUserRepo { get; set; }
|
||||||
[Inject] public ILogger<AdminSalesRepViewPage> _logger { get; set; }
|
[Inject] public ILogger<OfficeAdvisorViewPage> _logger { get; set; }
|
||||||
[Inject] public NavigationManager _navigator { get; set; }
|
[Inject] public NavigationManager _navigator { get; set; }
|
||||||
[Inject] public IToastService _toast { get; set; }
|
[Inject] public IToastService _toast { get; set; }
|
||||||
private WebUserInfoView UserInfo { get; set; } = new();
|
private WebUserInfoView UserInfo { get; set; } = new();
|
|
@ -33,7 +33,7 @@
|
||||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
|
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
|
||||||
<i class="bi-phone"></i> Tlf.Ordre
|
<i class="bi-phone"></i> Tlf.Ordre
|
||||||
</a>
|
</a>
|
||||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/dk">
|
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/dk">
|
||||||
<i class="bi-file-spreadsheet"></i> Priser
|
<i class="bi-file-spreadsheet"></i> Priser
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
|
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
|
||||||
<i class="bi-phone"></i> Tlf.Ordre
|
<i class="bi-phone"></i> Tlf.Ordre
|
||||||
</a>
|
</a>
|
||||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/no">
|
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/no">
|
||||||
<i class="bi-file-spreadsheet"></i> Priser
|
<i class="bi-file-spreadsheet"></i> Priser
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -75,7 +75,7 @@
|
||||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
|
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
|
||||||
<i class="bi-phone"></i> Tlf.Ordre
|
<i class="bi-phone"></i> Tlf.Ordre
|
||||||
</a>
|
</a>
|
||||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/se">
|
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/se">
|
||||||
<i class="bi-file-spreadsheet"></i> Priser
|
<i class="bi-file-spreadsheet"></i> Priser
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -225,4 +225,4 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<PriceListModal OnSelected="PriceListCallback" @ref="PriceList"/>
|
<PriceCatalogModal OnSelected="PriceListCallback" @ref="PriceCatalog"/>
|
|
@ -26,9 +26,9 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OfficeCountryCreateOrderPage : IDisposable
|
public partial class OfficeCustomerCountryCreateOrderPage : IDisposable
|
||||||
{
|
{
|
||||||
[Inject] public ILogger<OfficeCountryCreateOrderPage> Logger { get; set; }
|
[Inject] public ILogger<OfficeCustomerCountryCreateOrderPage> Logger { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public ICountryCustomerRepository CustomerRepo { get; set; }
|
[Inject] public ICountryCustomerRepository CustomerRepo { get; set; }
|
||||||
[Inject] public ICountryCustomerHistoryRepository InventoryRepo { get; set; }
|
[Inject] public ICountryCustomerHistoryRepository InventoryRepo { get; set; }
|
||||||
|
@ -59,7 +59,7 @@ public partial class OfficeCountryCreateOrderPage : IDisposable
|
||||||
private bool ReportClosed { get; set; }
|
private bool ReportClosed { get; set; }
|
||||||
private bool PoFormInvalid { get; set; } = true;
|
private bool PoFormInvalid { get; set; } = true;
|
||||||
private bool Working { get; set; }
|
private bool Working { get; set; }
|
||||||
private PriceListModal PriceList { get; set; } = new();
|
private PriceCatalogModal PriceCatalog { get; set; } = new();
|
||||||
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
|
@ -75,58 +75,58 @@ public partial class OfficeCountryCreateOrderPage : IDisposable
|
||||||
// fetch customer
|
// fetch customer
|
||||||
Customer = await CustomerRepo.GetByCustomerId(CountryCode, CompanyId);
|
Customer = await CustomerRepo.GetByCustomerId(CountryCode, CompanyId);
|
||||||
Logger.LogDebug("Customer => {}", JsonSerializer.Serialize(Customer));
|
Logger.LogDebug("Customer => {}", JsonSerializer.Serialize(Customer));
|
||||||
|
//
|
||||||
var today = $"{DateTime.Now:yyyy-MM-dd}";
|
// var today = $"{DateTime.Now:yyyy-MM-dd}";
|
||||||
|
//
|
||||||
// initiate a sync to ensure up-to-date product history
|
// // initiate a sync to ensure up-to-date product history
|
||||||
if (Customer.HistorySync != today)
|
// if (Customer.HistorySync != today)
|
||||||
Customer.HistorySync = await InventoryRepo.InvoiceErpToCrmRpc(CountryCode, CompanyId, Customer.HistorySync);
|
// Customer.HistorySync = await InventoryRepo.InvoiceErpToCrmRpc(CountryCode, CompanyId, Customer.HistorySync);
|
||||||
|
//
|
||||||
// fetch customer inventory
|
// // fetch customer inventory
|
||||||
CustomerInventory = await InventoryRepo.FetchInventory(CountryCode, CompanyId);
|
// CustomerInventory = await InventoryRepo.FetchInventory(CountryCode, CompanyId);
|
||||||
Logger.LogDebug("Inventory => {}", JsonSerializer.Serialize(CustomerInventory));
|
// Logger.LogDebug("Inventory => {}", JsonSerializer.Serialize(CustomerInventory));
|
||||||
|
//
|
||||||
// get sales rep info
|
// // get sales rep info
|
||||||
SalesRep = await UserRepo.GetAdvisorInfo(Customer.SalesRepId);
|
// SalesRep = await UserRepo.GetAdvisorInfo(Customer.SalesRepId);
|
||||||
Logger.LogDebug("SalesRep => {}", JsonSerializer.Serialize(SalesRep));
|
// Logger.LogDebug("SalesRep => {}", JsonSerializer.Serialize(SalesRep));
|
||||||
|
//
|
||||||
// set activity salesRep and countryCode
|
// // set activity salesRep and countryCode
|
||||||
Activity.SalesRep = SalesRep.Advisor;
|
// Activity.SalesRep = SalesRep.Advisor;
|
||||||
Activity.CountryCode = SalesRep.CountryCode;
|
// Activity.CountryCode = SalesRep.CountryCode;
|
||||||
|
//
|
||||||
// add customer info into activity properties
|
// // add customer info into activity properties
|
||||||
Activity.Account = Customer.Account;
|
// Activity.Account = Customer.Account;
|
||||||
Activity.VatNumber = Customer.VatNumber;
|
// Activity.VatNumber = Customer.VatNumber;
|
||||||
Activity.Email = Customer.Email;
|
// Activity.Email = Customer.Email;
|
||||||
Activity.Phone = Customer.Phone;
|
// Activity.Phone = Customer.Phone;
|
||||||
Activity.Mobile = Customer.Mobile;
|
// Activity.Mobile = Customer.Mobile;
|
||||||
Activity.Name = Customer.Name;
|
// Activity.Name = Customer.Name;
|
||||||
Activity.Address1 = Customer.Address1;
|
// Activity.Address1 = Customer.Address1;
|
||||||
Activity.Address2 = Customer.Address2;
|
// Activity.Address2 = Customer.Address2;
|
||||||
Activity.ZipCode = Customer.ZipCode;
|
// Activity.ZipCode = Customer.ZipCode;
|
||||||
Activity.City = Customer.City;
|
// Activity.City = Customer.City;
|
||||||
Activity.DlvName = Customer.Name;
|
// Activity.DlvName = Customer.Name;
|
||||||
Activity.DlvAddress1 = Customer.Address1;
|
// Activity.DlvAddress1 = Customer.Address1;
|
||||||
Activity.DlvAddress2 = Customer.Address2;
|
// Activity.DlvAddress2 = Customer.Address2;
|
||||||
Activity.DlvZipCode = Customer.ZipCode;
|
// Activity.DlvZipCode = Customer.ZipCode;
|
||||||
Activity.DlvCity = Customer.City;
|
// Activity.DlvCity = Customer.City;
|
||||||
Activity.BcId = Customer.BcId;
|
// Activity.BcId = Customer.BcId;
|
||||||
Activity.CompanyId = Customer.CompanyId;
|
// Activity.CompanyId = Customer.CompanyId;
|
||||||
Activity.SalesRepId = Customer.SalesRepId;
|
// Activity.SalesRepId = Customer.SalesRepId;
|
||||||
|
//
|
||||||
// setting up activity properties
|
// // setting up activity properties
|
||||||
Activity.ActivityStatusEnum = "noSale";
|
// Activity.ActivityStatusEnum = "noSale";
|
||||||
Activity.VisitTypeEnum = "recall";
|
// Activity.VisitTypeEnum = "recall";
|
||||||
Activity.ActivityTypeEnum = "phone";
|
// Activity.ActivityTypeEnum = "phone";
|
||||||
Activity.ActivityStatusEnum = "order";
|
// Activity.ActivityStatusEnum = "order";
|
||||||
|
//
|
||||||
// Initialize date variable
|
// // Initialize date variable
|
||||||
SelectedDate = DateTime.Now;
|
// SelectedDate = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CallPriceListModal()
|
private void CallPriceListModal()
|
||||||
{
|
{
|
||||||
PriceList.Show();
|
PriceCatalog.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task PriceListCallback(SelectedSku sku)
|
private async Task PriceListCallback(SelectedSku sku)
|
|
@ -28,7 +28,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages
|
namespace Wonky.Client.Pages
|
||||||
{
|
{
|
||||||
public partial class OfficeCountryCustomerListPage : IDisposable
|
public partial class OfficeCustomerCountryListPage : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
|
@ -24,29 +24,29 @@
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="p-0" colspan="4">
|
<th class="p-0" colspan="4">
|
||||||
@if (_reportItem.Express)
|
<div class="d-print-none">
|
||||||
{
|
<div class="row">
|
||||||
<div id="watermark">
|
<div class="col-sm-1">
|
||||||
<i class="bi-lightning-charge text-dark" style="font-size: 11rem;"></i>
|
<button type="button" class="btn btn-warning d-block" onclick="window.print();">PRINT</button>
|
||||||
</div>
|
</div>
|
||||||
@if (_reportItem.ProcessStatusEnum == "None")
|
@if (_reportItem.Express)
|
||||||
{
|
{
|
||||||
<AuthorizeView Roles="Admin,Office,Warehouse">
|
<div id="watermark">
|
||||||
<Authorized>
|
<i class="bi-lightning-charge text-dark" style="font-size: 11rem;"></i>
|
||||||
<div class="d-print-none">
|
</div>
|
||||||
<div class="row">
|
@if (_reportItem.ProcessStatusEnum == "None")
|
||||||
<div class="col-sm-1">
|
{
|
||||||
<button type="button" class="btn btn-warning d-block" onclick="window.print();">PRINT</button>
|
<AuthorizeView Roles="Admin,Office,Warehouse">
|
||||||
</div>
|
<Authorized>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<button type="button" class="btn btn-warning d-block" @onclick="SetExpressState" disabled="@_isNotified">Kvitter for modtagelse</button>
|
<button type="button" class="btn btn-warning d-block" @onclick="SetExpressState" disabled="@_isNotified">Kvitter for modtagelse</button>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Authorized>
|
||||||
</Authorized>
|
</AuthorizeView>
|
||||||
</AuthorizeView>
|
}
|
||||||
}
|
}
|
||||||
}
|
</div>
|
||||||
|
</div>
|
||||||
<div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2">
|
<div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2">
|
||||||
<h2 class="fw-bold text-center">@_reportItem.Company.Name</h2>
|
<h2 class="fw-bold text-center">@_reportItem.Company.Name</h2>
|
||||||
@if (_reportItem.Express)
|
@if (_reportItem.Express)
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin, Office")]
|
@attribute [Authorize(Roles = "Admin,Office")]
|
||||||
@page "/office/users/advisors/{CountryCode}"
|
@page "/office/users/advisors/{CountryCode}"
|
||||||
|
|
||||||
<PageTitle>Sælger Oversigt @CountryName</PageTitle>
|
<PageTitle>Sælger Oversigt @CountryName</PageTitle>
|
|
@ -6,7 +6,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OfficeSalesRepListPage :IDisposable
|
public partial class OfficeUserAdvisorCountryListPage :IDisposable
|
||||||
{
|
{
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public ISystemUserRepository SystemUserRepo { get; set; }
|
[Inject] public ISystemUserRepository SystemUserRepo { get; set; }
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin, Office")]
|
@attribute [Authorize(Roles = "Admin,Office")]
|
||||||
@page "/office/users/advisors/{CountryCode}/{UserId}/reports"
|
@page "/office/users/advisors/{CountryCode}/{UserId}/reports"
|
||||||
|
|
||||||
<PageTitle>Rapport Arkiv @UserInfo.FirstName @UserInfo.LastName</PageTitle>
|
<PageTitle>Rapport Arkiv @UserInfo.FirstName @UserInfo.LastName</PageTitle>
|
|
@ -23,7 +23,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OfficeReportListPage : IDisposable
|
public partial class OfficeUserAdvisorCountryReportListPage : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string UserId { get; set; } = "";
|
[Parameter] public string UserId { get; set; } = "";
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
|
@ -18,7 +18,7 @@
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@using Wonky.Client.Models
|
@using Wonky.Client.Models
|
||||||
@attribute [Authorize(Roles = "Admin, Office")]
|
@attribute [Authorize(Roles = "Admin,Office")]
|
||||||
@page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
|
@page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
|
||||||
|
|
||||||
<div class="row pt-2 pb-2 mb-3 rounded-2 d-print-none bg-dark text-white">
|
<div class="row pt-2 pb-2 mb-3 rounded-2 d-print-none bg-dark text-white">
|
|
@ -23,7 +23,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OfficeReportViewPage : IDisposable
|
public partial class OfficeUserAdvisorCountryReportViewPage : IDisposable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Country code from url parameter
|
/// Country code from url parameter
|
||||||
|
@ -65,7 +65,7 @@ public partial class OfficeReportViewPage : IDisposable
|
||||||
/// Logger service
|
/// Logger service
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Inject]
|
[Inject]
|
||||||
public ILogger<OfficeReportViewPage> Logger { get; set; }
|
public ILogger<OfficeUserAdvisorCountryReportViewPage> Logger { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Storage service
|
/// Storage service
|
||||||
|
@ -103,10 +103,10 @@ public partial class OfficeReportViewPage : IDisposable
|
||||||
switch (target)
|
switch (target)
|
||||||
{
|
{
|
||||||
case PTarget.OrderPage:
|
case PTarget.OrderPage:
|
||||||
Navigator.NavigateTo($"/print/orders/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
|
Navigator.NavigateTo($"/report/print/orders/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
|
||||||
break;
|
break;
|
||||||
case PTarget.FrontPage:
|
case PTarget.FrontPage:
|
||||||
Navigator.NavigateTo($"/print/report/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
|
Navigator.NavigateTo($"/report/print/summary/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
|
||||||
break;
|
break;
|
||||||
case PTarget.None:
|
case PTarget.None:
|
||||||
break;
|
break;
|
|
@ -22,35 +22,35 @@
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<label class="col-md-3 col-form-label">Side længde</label>
|
<label class="col-md-3 col-form-label">Side længde</label>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<PageSizeComponent ></PageSizeComponent>
|
<PageSizeComponent />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<label class="col-md-3 col-form-label">Kunde søgning</label>
|
<label class="col-md-3 col-form-label">Kunde søgning</label>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<CustomerSearchColumnComponent ></CustomerSearchColumnComponent>
|
<CustomerSearchColumnComponent />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<label class="col-md-3 col-form-label">Kunde sortering</label>
|
<label class="col-md-3 col-form-label">Kunde sortering</label>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<CustomerSortComponent ></CustomerSortComponent>
|
<CustomerSortComponent />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<label class="col-md-3 col-form-label">Produkt søgning</label>
|
<label class="col-md-3 col-form-label">Produkt søgning</label>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<CatalogSearchComponent ></CatalogSearchComponent>
|
<CatalogSearchComponent />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<label class="col-md-3 col-form-label">Produkt sortering</label>
|
<label class="col-md-3 col-form-label">Produkt sortering</label>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<CatalogSortComponent ></CatalogSortComponent>
|
<CatalogSortComponent />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
@*
|
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
*@
|
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
|
||||||
@using Microsoft.AspNetCore.Authorization
|
|
||||||
@attribute [Authorize(Roles = "Admin,Office,Advisor,Warehouse")]
|
|
||||||
@page "/print/catalog"
|
|
||||||
|
|
||||||
<CatalogPrintComponent ItemList="Items" CountryName="@UserInfo.CountryName" />
|
|
||||||
|
|
||||||
@if (Working)
|
|
||||||
{
|
|
||||||
<WorkingThreeDots/>
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
//
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Blazored.LocalStorage;
|
|
||||||
using Wonky.Client.HttpInterceptors;
|
|
||||||
using Wonky.Client.HttpRepository;
|
|
||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
using Wonky.Client.Components;
|
|
||||||
using Wonky.Client.HttpInterfaces;
|
|
||||||
using Wonky.Client.Services;
|
|
||||||
using Wonky.Entity.DTO;
|
|
||||||
using Wonky.Entity.Requests;
|
|
||||||
using Wonky.Entity.Views;
|
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
|
||||||
|
|
||||||
public partial class PrintCatalogPage : IDisposable
|
|
||||||
{
|
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
|
||||||
[Inject] public IAdvisorCatalogRepository ItemRepo { get; set; }
|
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
|
||||||
|
|
||||||
private List<SalesItemView> Items { get; set; } = new();
|
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
|
||||||
|
|
||||||
private bool Working { get; set; } = true;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
Interceptor.RegisterEvent();
|
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
|
||||||
|
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
|
||||||
|
|
||||||
Items = await ItemRepo.GetPriceList();
|
|
||||||
Working = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose() => Interceptor.DisposeEvent();
|
|
||||||
|
|
||||||
}
|
|
|
@ -18,7 +18,7 @@
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin,Office,Advisor")]
|
@attribute [Authorize(Roles = "Admin,Office,Advisor")]
|
||||||
@page "/print/orders/{CountryCode}/{UserId}/{ReportDate}"
|
@page "/report/print/orders/{CountryCode}/{UserId}/{ReportDate}"
|
||||||
|
|
||||||
<div class="row mb-3 d-print-none">
|
<div class="row mb-3 d-print-none">
|
||||||
<div class="col-sm-6 d-grid">
|
<div class="col-sm-6 d-grid">
|
|
@ -21,7 +21,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class PrintOrderPage
|
public partial class ReportPrintOrderPage
|
||||||
{
|
{
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
[Parameter] public string UserId { get; set; } = "";
|
[Parameter] public string UserId { get; set; } = "";
|
||||||
|
@ -29,7 +29,7 @@ public partial class PrintOrderPage
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { get; set; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
[Inject] private IJSRuntime JSRuntime { get; set; }
|
[Inject] private IJSRuntime JSRuntime { get; set; }
|
||||||
[Inject] public ILogger<PrintOrderPage> Logger { get; set; }
|
[Inject] public ILogger<ReportPrintOrderPage> Logger { get; set; }
|
||||||
private ReportView Report { get; set; } = new();
|
private ReportView Report { get; set; } = new();
|
||||||
private List<ReportItemView> Items { get; set; } = new();
|
private List<ReportItemView> Items { get; set; } = new();
|
||||||
private IJSObjectReference JsModule { get; set; }
|
private IJSObjectReference JsModule { get; set; }
|
|
@ -18,7 +18,7 @@
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin,Office,Advisor")]
|
@attribute [Authorize(Roles = "Admin,Office,Advisor")]
|
||||||
@page "/print/report/{CountryCode}/{UserId}/{ReportDate}"
|
@page "/report/print/summary/{CountryCode}/{UserId}/{ReportDate}"
|
||||||
|
|
||||||
<div class="row mb-3 d-print-none">
|
<div class="row mb-3 d-print-none">
|
||||||
<div class="col-sm-6 d-grid">
|
<div class="col-sm-6 d-grid">
|
|
@ -22,7 +22,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class PrintFrontPage
|
public partial class ReportPrintSummaryPage
|
||||||
{
|
{
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
[Parameter] public string UserId { get; set; } = "";
|
[Parameter] public string UserId { get; set; } = "";
|
||||||
|
@ -30,7 +30,7 @@ public partial class PrintFrontPage
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { get; set; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
[Inject] private IJSRuntime JSRuntime { get; set; }
|
[Inject] private IJSRuntime JSRuntime { get; set; }
|
||||||
[Inject] public ILogger<PrintFrontPage> Logger { get; set; }
|
[Inject] public ILogger<ReportPrintSummaryPage> Logger { get; set; }
|
||||||
private ReportView Report { get; set; } = new();
|
private ReportView Report { get; set; } = new();
|
||||||
private IJSObjectReference JsModule { get; set; }
|
private IJSObjectReference JsModule { get; set; }
|
||||||
private string ReturnUrl { get; set; } = "";
|
private string ReturnUrl { get; set; } = "";
|
|
@ -33,4 +33,4 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<WarehouseListComponent Header="@Header" OrderList="@OrderList" ReadyToShip="@ReadyToShip"
|
<WarehouseListComponent Header="@Header" OrderList="@OrderList" ReadyToShip="@ReadyToShip"
|
||||||
OnGetStatus="GetStatusCallback" OnSetShipped="@SetShippedCallback" OnQPak="QPakCallback"/>
|
OnGetStatus="GetStatusCallback" OnSetShipped="@SetShippedCallback" OnQPak="QPakCallback" />
|
|
@ -60,8 +60,7 @@ builder.Services.AddScoped<IAdvisorContactRepository, AdvisorContactRepository>(
|
||||||
builder.Services.AddScoped<IAdvisorCustomerHistoryRepository, AdvisorCustomerHistoryRepository>();
|
builder.Services.AddScoped<IAdvisorCustomerHistoryRepository, AdvisorCustomerHistoryRepository>();
|
||||||
builder.Services.AddScoped<IAdvisorTaskItemRepository, AdvisorTaskItemRepository>();
|
builder.Services.AddScoped<IAdvisorTaskItemRepository, AdvisorTaskItemRepository>();
|
||||||
builder.Services.AddScoped<IAdvisorReportRepository, AdvisorReportRepository>();
|
builder.Services.AddScoped<IAdvisorReportRepository, AdvisorReportRepository>();
|
||||||
builder.Services.AddScoped<IWorkplaceRepository, WorkplaceRepository>();
|
builder.Services.AddScoped<IAdvisorWorkplaceRepository, AdvisorWorkplaceRepository>();
|
||||||
builder.Services.AddScoped<IAdvisorCatalogRepository, AdvisorCatalogRepository>();
|
|
||||||
// administrative repositories
|
// administrative repositories
|
||||||
builder.Services.AddScoped<ICountryCustomerHistoryRepository, CountryCustomerHistoryRepository>();
|
builder.Services.AddScoped<ICountryCustomerHistoryRepository, CountryCustomerHistoryRepository>();
|
||||||
builder.Services.AddScoped<ICountryCatalogRepository, CountryCatalogRepository>();
|
builder.Services.AddScoped<ICountryCatalogRepository, CountryCatalogRepository>();
|
||||||
|
|
|
@ -18,11 +18,11 @@ namespace Wonky.Client.Services;
|
||||||
|
|
||||||
public record UserPref
|
public record UserPref
|
||||||
{
|
{
|
||||||
public string? CompanyFilterPhrase { get; set; } = "";
|
public string CompanyFilterPhrase { get; set; } = "";
|
||||||
public string? CompanySearch { get; set; } = "name";
|
public string CompanySearch { get; set; } = "name";
|
||||||
public string? CompanySort { get; set; } = "name";
|
public string CompanySort { get; set; } = "name";
|
||||||
public string? ItemSearch { get; set; } = "name";
|
public string ItemSearch { get; set; } = "name";
|
||||||
public string? ItemSort { get; set; } = "name";
|
public string ItemSort { get; set; } = "name";
|
||||||
public string PageSize { get; set; } = "10";
|
public string PageSize { get; set; } = "10";
|
||||||
public string WorkDate { get; set; } = "";
|
public string WorkDate { get; set; } = "";
|
||||||
public int KmMorning { get; set; }
|
public int KmMorning { get; set; }
|
||||||
|
@ -32,6 +32,7 @@ public record UserPref
|
||||||
public class UserProfileService
|
public class UserProfileService
|
||||||
{
|
{
|
||||||
private readonly ILocalStorageService _localStorageService;
|
private readonly ILocalStorageService _localStorageService;
|
||||||
|
private const string KeyName = "preferences";
|
||||||
public event Action<UserPref>? OnChange;
|
public event Action<UserPref>? OnChange;
|
||||||
public UserProfileService(ILocalStorageService localStorageService)
|
public UserProfileService(ILocalStorageService localStorageService)
|
||||||
{
|
{
|
||||||
|
@ -46,7 +47,7 @@ public class UserProfileService
|
||||||
{
|
{
|
||||||
DateConfirmed = confirmed
|
DateConfirmed = confirmed
|
||||||
};
|
};
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +59,7 @@ public class UserProfileService
|
||||||
{
|
{
|
||||||
KmMorning = kmMorning
|
KmMorning = kmMorning
|
||||||
};
|
};
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +71,7 @@ public class UserProfileService
|
||||||
{
|
{
|
||||||
CompanyFilterPhrase = filterPhrase
|
CompanyFilterPhrase = filterPhrase
|
||||||
};
|
};
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +83,7 @@ public class UserProfileService
|
||||||
{
|
{
|
||||||
WorkDate = $"{workDate:yyyy-MM-dd}"
|
WorkDate = $"{workDate:yyyy-MM-dd}"
|
||||||
};
|
};
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +92,7 @@ public class UserProfileService
|
||||||
var preferences = await GetPreferences();
|
var preferences = await GetPreferences();
|
||||||
var newPreferences = preferences
|
var newPreferences = preferences
|
||||||
with { CompanySearch = companySearch };
|
with { CompanySearch = companySearch };
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +101,7 @@ public class UserProfileService
|
||||||
var preferences = await GetPreferences();
|
var preferences = await GetPreferences();
|
||||||
var newPreferences = preferences
|
var newPreferences = preferences
|
||||||
with { CompanySort = companySort };
|
with { CompanySort = companySort };
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +110,7 @@ public class UserProfileService
|
||||||
var preferences = await GetPreferences();
|
var preferences = await GetPreferences();
|
||||||
var newPreferences = preferences
|
var newPreferences = preferences
|
||||||
with { ItemSearch = itemSearch };
|
with { ItemSearch = itemSearch };
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +119,7 @@ public class UserProfileService
|
||||||
var preferences = await GetPreferences();
|
var preferences = await GetPreferences();
|
||||||
var newPreferences = preferences
|
var newPreferences = preferences
|
||||||
with { ItemSort = itemSort };
|
with { ItemSort = itemSort };
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,13 +128,12 @@ public class UserProfileService
|
||||||
var preferences = await GetPreferences();
|
var preferences = await GetPreferences();
|
||||||
var newPreferences = preferences
|
var newPreferences = preferences
|
||||||
with { PageSize = pageSize };
|
with { PageSize = pageSize };
|
||||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
await _localStorageService.SetItemAsync(KeyName, newPreferences);
|
||||||
OnChange?.Invoke(newPreferences);
|
OnChange?.Invoke(newPreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<UserPref> GetPreferences()
|
public async Task<UserPref> GetPreferences()
|
||||||
{
|
{
|
||||||
return await _localStorageService.GetItemAsync<UserPref>("preferences").ConfigureAwait(true)
|
return await _localStorageService.GetItemAsync<UserPref>(KeyName) ?? new UserPref();
|
||||||
?? new UserPref();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -17,6 +17,9 @@
|
||||||
|
|
||||||
@inject IWebAssemblyHostEnvironment HostEnvironment
|
@inject IWebAssemblyHostEnvironment HostEnvironment
|
||||||
@using Wonky.Client.Components;
|
@using Wonky.Client.Components;
|
||||||
|
@using Wonky.Client.Services
|
||||||
|
@using Wonky.Entity.Views
|
||||||
|
@using Blazored.LocalStorage
|
||||||
|
|
||||||
<div class="top-row ps-3 navbar navbar-dark">
|
<div class="top-row ps-3 navbar navbar-dark">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
|
@ -64,18 +67,18 @@
|
||||||
<i class="bi-calendar pe-2" style="font-size:1.3em;" aria-hidden="true"></i> ToDo
|
<i class="bi-calendar pe-2" style="font-size:1.3em;" aria-hidden="true"></i> ToDo
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="nav-item px-3">
|
||||||
|
<NavLink class="nav-link ps-2" href="/catalog">
|
||||||
|
<i class="bi-file-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Priskatalog
|
||||||
|
</NavLink>
|
||||||
|
</div>
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/customers">
|
<NavLink class="nav-link ps-2" href="/advisor/customers">
|
||||||
<i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Firmaer
|
<i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Firmaer
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/price-catalog">
|
<NavLink class="nav-link ps-2" href="/advisor/agreements">
|
||||||
<i class="bi-file-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Priskatalog
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/open-quotes">
|
|
||||||
<i class="bi-calculator pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Aftaler/Tilbud
|
<i class="bi-calculator pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Aftaler/Tilbud
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
@ -85,7 +88,7 @@
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/sales-reports">
|
<NavLink class="nav-link ps-2" href="/advisor/reports">
|
||||||
<i class="bi-file-earmark-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Dagsrapporter
|
<i class="bi-file-earmark-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Dagsrapporter
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
@ -101,6 +104,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
|
||||||
private bool collapseNavMenu = true;
|
private bool collapseNavMenu = true;
|
||||||
|
|
||||||
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
|
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
|
||||||
|
@ -110,4 +114,5 @@
|
||||||
collapseNavMenu = !collapseNavMenu;
|
collapseNavMenu = !collapseNavMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -41,7 +41,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<PaginationComponent MetaData="ResponseMeta" Spread="2" SelectedPage="SelectedPage" />
|
<PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SelectedPage" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row text-white">
|
<div class="row text-white">
|
|
@ -24,31 +24,41 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Shared;
|
namespace Wonky.Client.Shared;
|
||||||
|
|
||||||
public partial class PriceListModal : IDisposable
|
public partial class PriceCatalogModal : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string CountryCode { get; set; } = "dk";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }
|
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }
|
||||||
[Inject] public IAdvisorCatalogRepository Catalog { get; set; }
|
[Inject] public ICountryCatalogRepository Catalog { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public UserProfileService ProfileService { get; set; }
|
[Inject] public UserProfileService ProfileService { get; set; }
|
||||||
|
|
||||||
private string _modalDisplay = "";
|
private string _modalDisplay = "";
|
||||||
private bool _showBackdrop;
|
private bool _showBackdrop;
|
||||||
private List<SalesItemView> Items { get; set; } = new();
|
private List<SalesItemView> Items { get; set; } = new();
|
||||||
private MetaData? ResponseMeta { get; set; } = new();
|
private MetaData? MetaInfo { get; set; } = new();
|
||||||
private CatalogPaging _paging = new();
|
private CatalogPager _pager = new();
|
||||||
private UserPref _userPref = new();
|
private UserPref _userPref = new();
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnParametersSetAsync()
|
||||||
{
|
{
|
||||||
_userPref = await ProfileService.GetPreferences();
|
|
||||||
_paging.OrderBy = _userPref.ItemSort;
|
|
||||||
_paging.SearchColumn = _userPref.ItemSearch;
|
|
||||||
_paging.PageSize = Convert.ToInt32(_userPref.PageSize);
|
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
await GetSalesItems();
|
await GetSalesItems();
|
||||||
}
|
}
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
_userPref = await ProfileService.GetPreferences();
|
||||||
|
_pager.OrderBy = _userPref.ItemSort;
|
||||||
|
_pager.SearchColumn = _userPref.ItemSearch;
|
||||||
|
_pager.PageSize = Convert.ToInt32(_userPref.PageSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task GetSalesItems()
|
||||||
|
{
|
||||||
|
var pagingResponse = await Catalog.GetSalesItemsPaged(CountryCode, _pager);
|
||||||
|
Items = pagingResponse.Items!;
|
||||||
|
MetaInfo = pagingResponse.MetaData;
|
||||||
|
}
|
||||||
|
|
||||||
private void SelectItem(string itemId, string quantity, string rate)
|
private void SelectItem(string itemId, string quantity, string rate)
|
||||||
{
|
{
|
||||||
|
@ -59,44 +69,37 @@ public partial class PriceListModal : IDisposable
|
||||||
private async Task SelectedPage(int page)
|
private async Task SelectedPage(int page)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
_paging.PageNumber = page;
|
_pager.PageNumber = page;
|
||||||
await GetSalesItems();
|
await GetSalesItems();
|
||||||
}
|
}
|
||||||
private async Task SetSearchPhrase(string searchTerm)
|
private async Task SetSearchPhrase(string searchTerm)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
_paging.PageNumber = 1;
|
_pager.PageNumber = 1;
|
||||||
_paging.SearchTerm = searchTerm;
|
_pager.SearchTerm = searchTerm;
|
||||||
await GetSalesItems();
|
await GetSalesItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task GetSalesItems()
|
|
||||||
{
|
|
||||||
var pagingResponse = await Catalog.GetSalesItemsPaged(_paging);
|
|
||||||
Items = pagingResponse.Items!;
|
|
||||||
ResponseMeta = pagingResponse.MetaData;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SetPageSize(string pageSize)
|
private async Task SetPageSize(string pageSize)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
_paging.PageSize = Convert.ToInt32(pageSize);
|
_pager.PageSize = Convert.ToInt32(pageSize);
|
||||||
_paging.PageNumber = 1;
|
_pager.PageNumber = 1;
|
||||||
await GetSalesItems();
|
await GetSalesItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSearchCol(string columnName)
|
private async Task SetSearchCol(string columnName)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
_paging.PageNumber = 1;
|
_pager.PageNumber = 1;
|
||||||
_paging.SearchColumn = columnName;
|
_pager.SearchColumn = columnName;
|
||||||
await GetSalesItems();
|
await GetSalesItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSortCol(string orderBy)
|
private async Task SetSortCol(string orderBy)
|
||||||
{
|
{
|
||||||
Items = new List<SalesItemView>();
|
Items = new List<SalesItemView>();
|
||||||
_paging.OrderBy = orderBy;
|
_pager.OrderBy = orderBy;
|
||||||
await GetSalesItems();
|
await GetSalesItems();
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Remove="wwwroot\icons\**" />
|
<Content Remove="wwwroot\icons\**" />
|
||||||
|
<Content Remove="Pages\AdvisorCustomerOrderViewPage.razor" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -3783,6 +3784,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="wwwroot\icons\**" />
|
<Compile Remove="wwwroot\icons\**" />
|
||||||
|
<Compile Remove="Pages\AdvisorCustomerOrderViewPage.razor.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
{
|
{
|
||||||
"appInfo": {
|
"appInfo": {
|
||||||
"name": "Wonky Client",
|
"name": "Wonky Client",
|
||||||
"version": "0.97.x",
|
"version": "0.97.1",
|
||||||
"rc": true,
|
"rc": true,
|
||||||
"sandBox": false,
|
"sandBox": false,
|
||||||
"image": "grumpy-coder.png"
|
"image": "grumpy-coder.png"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"baseUrl": "https://dev.innotec.dk",
|
"baseUrl": "https://zeta.innotec.dk",
|
||||||
"catalog": "api/v2/catalog",
|
"catalog": "api/v2/catalog/country",
|
||||||
"crmCustomers": "api/v2/crm/companies",
|
"crmCustomers": "api/v2/crm/companies",
|
||||||
"crmInventoryExt": "history/inventory",
|
"crmInventoryExt": "history/inventory",
|
||||||
"crmProductExt": "history/products",
|
"crmProductExt": "history/products",
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
"servicesVatNo": "api/v2/services/brReg",
|
"servicesVatNo": "api/v2/services/brReg",
|
||||||
"servicesAuth": "token",
|
"servicesAuth": "token",
|
||||||
"syncRpc": "api/v2/rpc",
|
"syncRpc": "api/v2/rpc",
|
||||||
"syncRpcInvoiceExt": "invoices/rpc",
|
"syncRpcInvoiceExt": "invoices",
|
||||||
"userInfo": "api/auth/userinfo",
|
"userInfo": "api/auth/userinfo",
|
||||||
"warehouse": "api/v2/warehouse/packages"
|
"warehouse": "api/v2/warehouse/packages"
|
||||||
},
|
},
|
||||||
|
|
|
@ -16,7 +16,6 @@ body {
|
||||||
.workDate {
|
.workDate {
|
||||||
font-variant: small-caps;
|
font-variant: small-caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn.btn-edit {
|
.btn.btn-edit {
|
||||||
color: #030303;
|
color: #030303;
|
||||||
background-color: #a2a2ec;
|
background-color: #a2a2ec;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
namespace Wonky.Entity.Requests;
|
namespace Wonky.Entity.Requests;
|
||||||
|
|
||||||
public class CatalogPaging
|
public class CatalogPager
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// internal default page size
|
/// internal default page size
|
Loading…
Reference in a new issue