WIP: office create order - refactor namespace

This commit is contained in:
Frede Hundewadt 2023-02-21 10:57:41 +01:00
parent 308876896f
commit a2a5e8dd72
28 changed files with 179 additions and 110 deletions

View file

@ -30,7 +30,7 @@
"the-bad" => "file-earmark-check",
"the-ugly" => "box2-fill",
"the-dead" => "truck",
"accepted" => "hand-thumbs-up",
"accepted" => "printer",
_ => "question-square"
};
}

View file

@ -43,7 +43,7 @@ public interface ISystemUserRepositoryGen1
/// <param name="userId"></param>
/// <param name="model"></param>
/// <returns></returns>
Task UpdateAdvisor(string userId, UserUpdateDto model);
Task UpdateAdvisor(string userId, X_UserUpdateDto model);
/// <summary>
/// Get Administrative Users
@ -56,7 +56,7 @@ public interface ISystemUserRepositoryGen1
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
Task<UserInfoDto> GetAdminUserInfo(string userId);
Task<X_UserInfoDto> GetAdminUserInfo(string userId);
/// <summary>
/// Update Admin user using userId and updated data
@ -64,7 +64,7 @@ public interface ISystemUserRepositoryGen1
/// <param name="userId"></param>
/// <param name="model"></param>
/// <returns></returns>
Task UpdateAdminUser(string userId, UserUpdateDto model);
Task UpdateAdminUser(string userId, X_UserUpdateDto model);
/// <summary>
/// Set new user password

View file

@ -71,7 +71,7 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1
/// <param name="userId"></param>
/// <param name="model"></param>
/// <returns></returns>
public async Task UpdateAdvisor(string userId, UserUpdateDto model)
public async Task UpdateAdvisor(string userId, X_UserUpdateDto model)
{
await _client.PutAsJsonAsync($"{_api.OfficeAdvisors}/{userId}", model, _options);
}
@ -90,9 +90,9 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<UserInfoDto> GetAdminUserInfo(string userId)
public async Task<X_UserInfoDto> GetAdminUserInfo(string userId)
{
return await _client.GetFromJsonAsync<UserInfoDto>($"{_api.OfficeUsers}/{userId}");
return await _client.GetFromJsonAsync<X_UserInfoDto>($"{_api.OfficeUsers}/{userId}");
}
/// <summary>
@ -101,7 +101,7 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1
/// <param name="userId"></param>
/// <param name="model"></param>
/// <returns></returns>
public async Task UpdateAdminUser(string userId, UserUpdateDto model)
public async Task UpdateAdminUser(string userId, X_UserUpdateDto model)
{
await _client.PutAsJsonAsync($"{_api.OfficeUsers}/{userId}", model, _options);
}

View file

@ -34,4 +34,4 @@
<div class="modal-backdrop fade show"></div>
}
<CustomerInventoryReorderOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="ReorderOverlay" />
<CustomerInventoryReorderOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnSelected" @ref="ReorderOverlay" />

View file

@ -35,7 +35,7 @@ public partial class CustomerInventoryListOverlay : IDisposable
[Parameter] public string CountryCode { get; set; } = "";
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
[Parameter] public EventCallback<DraftItem> OnInventorySelected { get; set; }
[Parameter] public EventCallback<DraftItem> OnSelected { get; set; }
private string _modalDisplay = "";
private bool _showBackdrop;
@ -60,7 +60,7 @@ public partial class CustomerInventoryListOverlay : IDisposable
private async Task OnSelectedItem(DraftItem draftItem)
{
await OnInventorySelected.InvokeAsync(draftItem);
await OnSelected.InvokeAsync(draftItem);
Hide();
}

View file

@ -13,6 +13,7 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Text.Json;
using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpInterfaces;
@ -27,12 +28,15 @@ namespace Wonky.Client.OverlayOrderCreate;
public partial class PriceCatalogOverlay : IDisposable
{
[Parameter] public string CountryCode { get; set; } = "";
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }
// injections
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
[Inject] private HttpInterceptorService Interceptor { get; set; }
[Inject] private UserProfileService ProfileService { get; set; }
[Inject] private ILogger<PriceCatalogOverlay> Logger { get; set; }
// parameters
[Parameter] public string CountryCode { get; set; } = "";
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }
// variables
private string _modalDisplay = "";
private bool _showBackdrop;
private List<SalesItemView> Items { get; set; } = new();
@ -46,6 +50,7 @@ public partial class PriceCatalogOverlay : IDisposable
Interceptor.RegisterBeforeSendEvent();
await GetSalesItems();
}
protected override async Task OnInitializedAsync()
{
_userProfile = await ProfileService.GetPreferences();
@ -57,8 +62,11 @@ public partial class PriceCatalogOverlay : IDisposable
private async Task GetSalesItems()
{
var pagingResponse = await CatalogRepo.GetSalesItemsPaged(CountryCode, _pager);
if (pagingResponse == null)
Task.Delay(250);
Items = pagingResponse.Items!;
MetaInfo = pagingResponse.MetaData;
Logger.LogDebug("PriceCatalogOverlay => Items <= {}", JsonSerializer.Serialize(Items));
}
private void SelectItem(string itemId, string quantity, string rate)

View file

@ -355,6 +355,6 @@ else
<CustomerInvoiceListOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceListOverlay" />
<CustomerInventoryListOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
OnInventorySelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" />
OnSelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" />
<CustomerActivityListOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay" />

View file

@ -69,7 +69,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
private bool InvalidActivity { get; set; } = true;
private bool ReportClosed { get; set; }
private bool Working { get; set; } = true;
private UserInfoView SalesRep { get; set; } = new();
private X_UserInfoView SalesRep { get; set; } = new();
private DateTime SelectedDate { get; set; }
private string OldPhone { get; set; } = "";
private string PromptDateConfirm { get; set; } = "";
@ -107,7 +107,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// User Preferences
UserProfile = await ProfileService.GetPreferences();
// User Info
SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu");
SalesRep = await Storage.GetItemAsync<X_UserInfoView>("_xu");
// Fetch Customer from http
Company = await CompanyRepo.GetCompanyById(CompanyId);
if (Company.HasFolded == 1)

View file

@ -18,7 +18,7 @@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Admin,Advisor,Warehouse")]
@attribute [Authorize(Roles = "Advisor")]
@page "/advisor/customers/{CompanyId}/orders/{OrderId}"
@page "/advisor/customers/{CompanyId}/quotes/{OrderId}"

View file

@ -62,7 +62,7 @@ namespace Wonky.Client.Pages
CompanyContext.OnFieldChanged += HandleFieldChanged;
CompanyContext.OnValidationStateChanged += ValidationChanged;
var xu = await Storage.GetItemAsync<UserInfoView>("_xu");
var xu = await Storage.GetItemAsync<X_UserInfoView>("_xu");
Dk = xu.CountryCode.ToLower() == "dk";
Company.SalesRepId = xu.Id;

View file

@ -35,7 +35,7 @@ namespace Wonky.Client.Pages
[Inject] private NavigationManager Navigator { get; set; }
private List<CompanyDto> CompanyList { get; set; } = new();
private UserProfile Profiles { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private X_UserInfoView XUserInfo { get; set; } = new();
private string SavedSearch { get; set; } = "";
private bool IncludeFolded { get; set; }
private bool Working { get; set; } = true;
@ -54,7 +54,7 @@ namespace Wonky.Client.Pages
{
// set preferences
Profiles = await ProfileService.GetPreferences();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
Paging.OrderBy = Profiles.CompanySort;
Paging.SearchColumn = Profiles.CompanySearch;
Paging.PageSize = Convert.ToInt32(Profiles.PageSize);

View file

@ -67,7 +67,7 @@ public partial class AdvisorCustomerViewPage : IDisposable
private ContactDto SelectedContact { get; set; } = new();
private ContactDto DefaultContact { get; set; } = new();
private ContactModal ContactPopup { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private X_UserInfoView XUserInfo { get; set; } = new();
protected override async Task OnInitializedAsync()
{
@ -85,8 +85,8 @@ public partial class AdvisorCustomerViewPage : IDisposable
ErpContext.OnValidationStateChanged += ValidationChanged;
// fetch user info from local storage
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
CountryCode = UserInfo.CountryCode.ToLower();
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
CountryCode = XUserInfo.CountryCode.ToLower();
CountryIsDk = CountryCode == "dk";
Logger.LogDebug("companyId => {}", CompanyId);
@ -97,7 +97,7 @@ public partial class AdvisorCustomerViewPage : IDisposable
CurrentVat = Company.VatNumber;
Company.CountryCode = UserInfo.CountryCode.ToLower();
Company.CountryCode = XUserInfo.CountryCode.ToLower();
// internal flag
EnableActivity = Company.ValidVat;
// override if canvas which has account property as empty string or "NY"

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Models
@attribute [Authorize(Roles = "Advisor,Admin")]
@attribute [Authorize(Roles = "Advisor")]
@page "/advisor/reports/view/{ReportDate}"
<PageTitle>@Report.ReportData.Name</PageTitle>
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center d-print-none">

View file

@ -39,7 +39,7 @@ public partial class AdvisorReportViewPage : IDisposable
private ReportView Report { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new ();
private bool Working { get; set; }
private UserInfoView UserInfo { get; set; } = new();
private X_UserInfoView XUserInfo { get; set; } = new();
private string ReturnUrl { get; set; } = "";
protected override async Task OnInitializedAsync()
@ -47,7 +47,7 @@ public partial class AdvisorReportViewPage : IDisposable
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
ProfileService.OnChange += ProfileServiceOnOnChange;
await ProfileService.SetWorkDate(DateTime.Parse(ReportDate));
@ -63,10 +63,10 @@ public partial class AdvisorReportViewPage : IDisposable
switch (target)
{
case PTarget.OrderPage:
Navigator.NavigateTo($"/report/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
Navigator.NavigateTo($"/report/print/orders/{XUserInfo.CountryCode.ToLower()}/{XUserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
break;
case PTarget.FrontPage:
Navigator.NavigateTo($"/report/print/summary/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
Navigator.NavigateTo($"/report/print/summary/{XUserInfo.CountryCode.ToLower()}/{XUserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
break;
case PTarget.None:
break;
@ -111,7 +111,7 @@ public partial class AdvisorReportViewPage : IDisposable
// store the report locally
if (!string.IsNullOrWhiteSpace(Report.ReportData.ReportDate))
{
await Storage.SetItemAsync($"{UserInfo.Id}-{Report.ReportData.ReportDate}", Report);
await Storage.SetItemAsync($"{XUserInfo.Id}-{Report.ReportData.ReportDate}", Report);
}
// remove busy signal

View file

@ -41,14 +41,14 @@ public partial class CatalogCountryPage : IDisposable
private MetaData MetaInfo { get; set; } = new();
private CatalogPager Pager { get; set; } = new();
private UserProfile Profiles { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private X_UserInfoView XUserInfo { get; set; } = new();
private bool Working { get; set; }
private string CountryName { get; set; } = "";
protected override async Task OnInitializedAsync()
{
Profiles = await ProfileService.GetPreferences();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
Pager.OrderBy = Profiles.ItemSort;
@ -60,10 +60,10 @@ public partial class CatalogCountryPage : IDisposable
if (string.IsNullOrWhiteSpace(CountryCode))
{
while (string.IsNullOrWhiteSpace(UserInfo.CountryCode))
while (string.IsNullOrWhiteSpace(XUserInfo.CountryCode))
await Task.Delay(500);
CountryCode = UserInfo.CountryCode.ToLower();
CountryCode = XUserInfo.CountryCode.ToLower();
Navigator.NavigateTo($"/catalog/{CountryCode}", false, true);
}

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Models
@attribute [Authorize(Roles = "Admin,Office")]
@attribute [Authorize(Roles = "Admin,Office,Supervisor")]
@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">

View file

@ -17,7 +17,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Warehouse")]
@attribute [Authorize(Roles = "Admin,Office,Supervisor,Warehouse")]
@page "/office/customers/{countryCode}"

View file

@ -36,7 +36,7 @@ namespace Wonky.Client.Pages
[Inject] private NavigationManager Navigator { get; set; }
private List<CompanyDto> Companies { get; set; } = new();
private UserProfile Profiles { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private X_UserInfoView XUserInfo { get; set; } = new();
private string SavedSearch { get; set; } = "";
private bool ShowFolded { get; set; }
private bool Working { get; set; } = true;
@ -53,7 +53,7 @@ namespace Wonky.Client.Pages
// set preferences
Profiles = await ProfileService.GetPreferences();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
Paging.OrderBy = Profiles.CompanySort;
Paging.SearchColumn = Profiles.CompanySearch;
Paging.PageSize = Convert.ToInt32(Profiles.PageSize);

View file

@ -15,7 +15,7 @@
//
*@
@using Wonky.Client.Components
@using Wonky.Client.OverlayCustomer
@using Wonky.Client.OverlayOrderCreate
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Supervisor,Warehouse")]
@ -23,22 +23,50 @@
<PageTitle>Telefon Ordre - @Customer.Name - @Customer.Account</PageTitle>
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center">
<div class="col text-center">
@DateTime.Now.ToLongDateString()
</div>
</div>
<div class="row bg-light border-2 border-dark rounded-3 p-3">
<div class="col-sm-12">
<div class="col-sm-8">
<h3>@Customer.Name - @Customer.Account</h3>
</div>
<div class="col-sm-3">
<h3>@DateTime.Now.ToShortDateString()</h3>
</div>
<div class="col-sm-1">
<div class="busy-signal" style="display:@(Working ? "block" : "none")">
<div class="spinner-grow text-info" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
</div>
</div>
<EditForm EditContext="ActivityContext">
<DataAnnotationsValidator/>
<div class="row mb-1 g-3">
<div class="row mb-3 g-3">
<label for="dlvName" class="col-md-2 col-form-label">Lev. Navn</label>
<div class="col-md-10">
<InputText id="dlvName" class="form-control" @bind-Value="Activity.DlvName"/>
</div>
<label for="dlvAddress1" class="col-md-2 col-form-label">Lev. Adresse</label>
<div class="col-md-10">
<InputText id="dlvAddress1" class="form-control" @bind-Value="Activity.DlvAddress1"/>
</div>
<label for="dlvAddress2" class="col-md-2 col-form-label">Lev. Adresse</label>
<div class="col-md-10">
<InputText id="dlvAddress2" class="form-control" @bind-Value="Activity.DlvAddress2"/>
</div>
<label for="dlvZipCode" class="col-md-2 col-form-label">Lev. Postnr</label>
<div class="col-md-2">
<InputText id="dlvZipCode" class="form-control" @bind-Value="Activity.DlvZipCode"/>
</div>
<label for="dlvCity" class="col-md-2 col-form-label">Lev. Bynavn</label>
<div class="col-md-6">
<InputText id="dlvCity" class="form-control" @bind-Value="Activity.DlvCity"/>
</div>
<label for="yourRef" class="col-sm-2 col-md-2 col-form-label">Indkøber</label>
<div class="col-sm-10 col-md-4">
<InputText id="yourRef" class="form-control" @bind-Value="Activity.YourRef"/>
@ -56,7 +84,7 @@
<InputTextArea id="orderMessage" class="form-control" @bind-Value="Activity.OrderMessage"/>
<ValidationMessage For="@(() => Activity.OrderMessage)"></ValidationMessage>
</div>
<label for="phone" class="col-sm-2 col-md-2 col-form-label">Tlf.</label>
<div class="col-sm-10 col-md-4">
<InputText id="phone" class="form-control" @bind-Value="Activity.Phone"/>
@ -66,6 +94,18 @@
<label class="form-check-label" for="express">Express</label>
</div>
</div>
<div class="col-sm-4 d-grid mx-auto">
<button class="btn btn-danger" @onclick="ShowInvoiceOverlay">Faktura</button>
</div>
<div class="col-sm-4 d-grid mx-auto">
<button class="btn btn-warning" @onclick="ShowVisitOverlay">Tidl. besøg</button>
</div>
<div class="col-sm-4 d-grid mx-auto">
<button class="btn btn-success" @onclick="ShowInventoryOverlay">Produkter</button>
</div>
</div>
<div id="this-draft" style="@(Activity.ActivityStatusEnum is "order" or "quote" ? "display: block" : "display:none")">
@ -170,8 +210,9 @@
</div>
@* end draft line ------------------------------------------------- *@
</div>
@*
<div class="accordion" id="crmActivity">
@* Delivery address *@
$1$ Delivery address #1#
<div class="accordion-item" style="@(Activity.ActivityStatusEnum == "order" ? "display: block" : "display:none")">
<h2 class="accordion-header" id="deliveryHeader">
<button class="accordion-button collapsed bg-light" type="button" data-bs-toggle="collapse" data-bs-target="#deliveryBody" aria-expanded="false" aria-controls="deliveryBody">
@ -215,6 +256,7 @@
</div>
</div>
</div>
*@
</EditForm>
<div class="row mt-5 mb-2">
<div class="col-sm-10 text-end">
@ -222,4 +264,12 @@
</div>
</div>
<PriceCatalogOverlay OnSelected="PriceListCallback" @ref="CatalogOverlay"/>
<PriceCatalogOverlay @ref="CatalogOverlay" CountryCode="@CountryCode" OnSelected="PriceListCallback"/>
@* <ProductHistoryOverlay @ref="ProductOverlay" CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku"/> *@
@* <ProductPriceHistoryOverlay @ref="PriceOverlay" CompanyId="@CompanyId" Sku="@SelectedItem.Sku" *@
@* OnSelected="PriceHistoryCallback"/> *@
@* <CustomerInvoiceListOverlay @ref="InvoiceListOverlay" CustomerInvoices="CompanyInvoices"/> *@
@* <CustomerInventoryListOverlay @ref="InventoryListOverlay" CompanyName="@Customer.Name" CompanyId="@CompanyId" *@
@* CountryCode="@CountryCode" Inventory="Inventory" *@
@* OnSelected="InventoryCallback"/> *@
@* <CustomerActivityListOverlay @ref="ActivityListOverlay" Activities="Activities" CompanyName="@Customer.Name"/> *@

View file

@ -20,6 +20,7 @@ using Microsoft.AspNetCore.Components.Forms;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpInterfaces;
using Wonky.Client.Models;
using Wonky.Client.OverlayCustomer;
using Wonky.Client.OverlayOrderCreate;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
@ -60,8 +61,20 @@ public partial class OfficeOrderCreatePage : IDisposable
private string Discount { get; set; } = "0";
private bool ReportClosed { get; set; }
private bool PoFormInvalid { get; set; } = true;
private bool Working { get; set; }
private bool Working { get; set; } = true;
private PriceCatalogOverlay CatalogOverlay { get; set; } = new();
private ProductHistoryOverlay ProductOverlay { get; set; } = new();
private ProductPriceHistoryOverlay PriceOverlay { get; set; } = new();
private ConfirmWorkDateModal ConfirmWorkDate { get; set; } = new();
private ProductCheckConfirmationOverlay ConfirmationCheckOverlay { get; set; } = new();
private CustomerInvoiceListOverlay InvoiceListOverlay { get; set; } = new();
private CustomerInventoryListOverlay InventoryListOverlay { get; set; } = new();
private CustomerActivityListOverlay ActivityListOverlay { get; set; } = new();
private List<ProductInventoryView> Inventory { get; set; } = new();
private List<ProductInventoryView> CheckList { get; set; } = new();
private InvoiceListView CompanyInvoices { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new();
protected override async Task OnInitializedAsync()
@ -76,21 +89,23 @@ public partial class OfficeOrderCreatePage : IDisposable
// fetch customer
Customer = await CustomerRepo.GetByCustomerId(CountryCode, CompanyId);
Logger.LogDebug("Customer => {}", JsonSerializer.Serialize(Customer));
Logger.LogDebug("OfficeOrderCreate => Customer => {}", JsonSerializer.Serialize(Customer));
var today = $"{DateTime.Now:yyyy-MM-dd}";
Activity.ActivityDate = today;
// initiate a sync to ensure up-to-date product history
if (Customer.HistorySync != today)
Logger.LogDebug("OfficeOrderCreate => ");
Customer.HistorySync = await InventoryRepo.RequestErpToCrmSync(CountryCode, CompanyId, Customer.HistorySync);
// fetch customer inventory
CustomerInventory = await InventoryRepo.RequestInventory(CountryCode, CompanyId);
Logger.LogDebug("Inventory => {}", JsonSerializer.Serialize(CustomerInventory));
Logger.LogDebug("OfficeOrderCreate => Inventory => {}", JsonSerializer.Serialize(CustomerInventory));
// get sales rep info
SalesRep = await UserRepo.GetAdvisorInfo(Customer.SalesRepId);
Logger.LogDebug("SalesRep => {}", JsonSerializer.Serialize(SalesRep));
Logger.LogDebug("OfficeOrderCreate => SalesRep => {}", JsonSerializer.Serialize(SalesRep));
// set activity salesRep and countryCode
Activity.SalesRep = SalesRep.Advisor;
@ -124,6 +139,7 @@ public partial class OfficeOrderCreatePage : IDisposable
// Initialize date variable
SelectedDate = DateTime.Now;
Working = false;
}
private void CallPriceListModal()
@ -142,7 +158,20 @@ public partial class OfficeOrderCreatePage : IDisposable
Quantity = sku.Quantity;
StateHasChanged();
}
private void ShowInvoiceOverlay()
{
}
private void ShowVisitOverlay()
{
}
private void ShowInventoryOverlay()
{
}
private void CallPriceHistoryModal()
{
@ -166,16 +195,15 @@ public partial class OfficeOrderCreatePage : IDisposable
{
}
/// <summary>
/// Work Date component callback
/// </summary>
/// <param name="workDate"></param>
private async Task WorkDateComponentCallback(string workDate)
private void PriceHistoryCallback()
{
ReportClosed = await ReportRepo.ReportExist(Customer.SalesRepId, workDate);
SelectedDate = DateTime.Parse(workDate);
Activity.ActivityDate = workDate;
}
private void InventoryCallback()
{
}
/// <summary>

View file

@ -71,7 +71,7 @@ public partial class OfficeOrderViewPage : IDisposable
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");
var user = await Storage.GetItemAsync<X_UserInfoView>("_xu");
// fetch sales rep from response
var salesRep = await SystemUserRepo.GetAdvisorInfo(responseView.Id);
Logger.LogDebug("SetExpressState => salesRep => {}", JsonSerializer.Serialize(salesRep));

View file

@ -130,19 +130,19 @@ namespace Wonky.Client.Services
((AuthStateProvider)_authStateProvider).NotifyUserLogout();
}
public async Task<UserInfoView> UserInfo(bool write = false)
public async Task<UserManagerEditView> UserInfo(bool write = false)
{
_logger.LogDebug("sending userinfo request");
var infoResponse = await _client.GetAsync(_apiConfig.Value.UserInfo).ConfigureAwait(true);
var response = await _client.GetAsync(_apiConfig.Value.UserInfo).ConfigureAwait(true);
var infoContent = await infoResponse.Content.ReadAsStringAsync();
var content = await response.Content.ReadAsStringAsync();
_logger.LogDebug("UserInfo <= {}", infoContent);
_logger.LogDebug("UserInfo <= {}", content);
var userInfo = JsonSerializer.Deserialize<UserInfoView>(infoContent, _options);
var userInfo = JsonSerializer.Deserialize<UserManagerEditView>(content, _options);
if(write)
await _localStorage.SetItemAsync("_xu", userInfo);
return userInfo ?? new UserInfoView();
return userInfo ?? new UserManagerEditView();
}
}
}

View file

@ -24,7 +24,7 @@ namespace Wonky.Client.Services
Task<AuthResponseView> Login(CredentialDto credentials);
Task Logout();
Task<string> RefreshToken();
Task<UserInfoView> UserInfo(bool write = false);
Task<UserManagerEditView> UserInfo(bool write = false);
}
}

View file

@ -18,6 +18,7 @@ using System.Net.Http.Headers;
using System.Security.Claims;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Authorization;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Shared
@ -41,22 +42,23 @@ namespace Wonky.Client.Shared
if (string.IsNullOrEmpty(token))
return _anonymous;
var userInfo = await _storage.GetItemAsync<UserInfoView>("_xu");
var userInfo = await _storage.GetItemAsync<UserManagerEditView>("_xu");
if (userInfo == null)
return _anonymous;
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
var exp = await _storage.GetItemAsync<string>("_xe");
var roles = ExtractRoles(userInfo);
var claims = new List<Claim>
{
new(ClaimTypes.Name, userInfo.FullName),
new(ClaimTypes.Name, $"{userInfo.FirstName} {userInfo.LastName}"),
new(ClaimTypes.Email, userInfo.Email),
new(ClaimTypes.Country, userInfo.CountryCode),
new(ClaimTypes.MobilePhone, userInfo.PhoneNumber),
new(ClaimTypes.Expiration, exp)
};
claims.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));
claims.AddRange(
from role in userInfo.AssignedRoles
where role.Assigned select new Claim(ClaimTypes.Role, role.Name));
// return the authState for the user
return new AuthenticationState(
@ -71,20 +73,21 @@ namespace Wonky.Client.Shared
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
var userInfo = await _storage.GetItemAsync<UserInfoView>("_xu");
var userInfo = await _storage.GetItemAsync<UserManagerEditView>("_xu");
var exp = await _storage.GetItemAsync<string>("_xe");
var roles = ExtractRoles(userInfo);
var claims = new List<Claim>
{
new(ClaimTypes.Name, userInfo.FullName),
new(ClaimTypes.Name, $"{userInfo.FirstName} {userInfo.LastName}"),
new(ClaimTypes.Email, userInfo.Email),
new(ClaimTypes.Country, userInfo.CountryCode),
new(ClaimTypes.MobilePhone, userInfo.PhoneNumber),
new(ClaimTypes.Expiration, exp)
};
claims.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));
claims.AddRange(
from role in userInfo.AssignedRoles
where role.Assigned select new Claim(ClaimTypes.Role, role.Name));
var authState = Task.FromResult(
new AuthenticationState(
new ClaimsPrincipal(
@ -97,26 +100,6 @@ namespace Wonky.Client.Shared
var authState = Task.FromResult(_anonymous);
NotifyAuthenticationStateChanged(authState);
}
private static IEnumerable<string> ExtractRoles(UserInfoView userInfoView)
{
var roles = new List<string>();
if (userInfoView.IsAdmin)
roles.Add("Admin");
if (userInfoView.IsAdvisor)
roles.Add("Advisor");
if (userInfoView.IsSupervisor)
roles.Add("Supervisor");
if(userInfoView.IsEDoc)
roles.Add("EDoc");
if (userInfoView.IsEShop)
roles.Add("EShop");
if (userInfoView.IsOffice)
roles.Add("Office");
if (userInfoView.IsWareHouse)
roles.Add("Warehouse");
return roles;
}
}
}

View file

@ -42,7 +42,7 @@
"servicesAuth": "token",
"syncRpc": "api/v2/rpc",
"syncRpcInvoiceExt": "invoices",
"userInfo": "api/auth/userinfo",
"userInfo": "api/v2/auth/userinfo",
"userManager": "api/v2/app/manage/users",
"userManagerSetPasswd": "api/v2/app/manage/users/passwd",
"warehouse": "api/v2/warehouse/packages"

View file

@ -18,7 +18,7 @@ using System.ComponentModel.DataAnnotations;
namespace Wonky.Entity.DTO;
public class UserInfoDto
public class X_UserInfoDto
{
/// <summary>
/// User Id
@ -28,13 +28,13 @@ public class UserInfoDto
/// Sales representative identification
/// </summary>
[Required(ErrorMessage = "Sælger identifikation skal angives.")]
[MaxLength(50,ErrorMessage = "Der kan højst bruges 20 tegn.")]
[MaxLength(20,ErrorMessage = "Der kan højst bruges 20 tegn.")]
public string Advisor { get; set; } = "";
/// <summary>
/// Country code
/// </summary>
[Required(ErrorMessage = "Landekode skal angives.")]
[MaxLength(50,ErrorMessage = "Der kan højst bruges 3 tegn.")]
[MaxLength(3,ErrorMessage = "Der kan højst bruges 3 tegn.")]
public string CountryCode { get; set; } = "";
/// <summary>
/// Country name
@ -44,7 +44,7 @@ public class UserInfoDto
/// Email
/// </summary>
[Required(ErrorMessage = "Email skal angives.")]
[MaxLength(50, ErrorMessage = "Der kan højst bruges 80 tegn.")]
[MaxLength(80, ErrorMessage = "Der kan højst bruges 80 tegn.")]
public string Email { get; set; } = "";
/// <summary>
/// First name

View file

@ -18,7 +18,7 @@ using System.ComponentModel.DataAnnotations;
namespace Wonky.Entity.DTO;
public class UserUpdateDto
public class X_UserUpdateDto
{
/// <summary>
/// User firstname

View file

@ -18,7 +18,7 @@ using System.Text.Json.Serialization;
namespace Wonky.Entity.Views;
public class UserInfoView
public class X_UserInfoView
{
[JsonPropertyName("advisor")] public string Advisor { get; set; } = "";
[JsonPropertyName("companyId")] public string ReferenceId { get; set; } = "";