diff --git a/Wonky.Client/Components/ProcessStateComponent.razor b/Wonky.Client/Components/ProcessStateComponent.razor index 52da3cb9..c80788fd 100644 --- a/Wonky.Client/Components/ProcessStateComponent.razor +++ b/Wonky.Client/Components/ProcessStateComponent.razor @@ -30,7 +30,7 @@ "the-bad" => "file-earmark-check", "the-ugly" => "box2-fill", "the-dead" => "truck", - "accepted" => "hand-thumbs-up", + "accepted" => "printer", _ => "question-square" }; } diff --git a/Wonky.Client/HttpInterfaces/ISystemUserRepositoryGen1.cs b/Wonky.Client/HttpInterfaces/ISystemUserRepositoryGen1.cs index b47b6249..4d9be479 100644 --- a/Wonky.Client/HttpInterfaces/ISystemUserRepositoryGen1.cs +++ b/Wonky.Client/HttpInterfaces/ISystemUserRepositoryGen1.cs @@ -43,7 +43,7 @@ public interface ISystemUserRepositoryGen1 /// /// /// - Task UpdateAdvisor(string userId, UserUpdateDto model); + Task UpdateAdvisor(string userId, X_UserUpdateDto model); /// /// Get Administrative Users @@ -56,7 +56,7 @@ public interface ISystemUserRepositoryGen1 /// /// /// - Task GetAdminUserInfo(string userId); + Task GetAdminUserInfo(string userId); /// /// Update Admin user using userId and updated data @@ -64,7 +64,7 @@ public interface ISystemUserRepositoryGen1 /// /// /// - Task UpdateAdminUser(string userId, UserUpdateDto model); + Task UpdateAdminUser(string userId, X_UserUpdateDto model); /// /// Set new user password diff --git a/Wonky.Client/HttpRepository/SystemUserRepositoryGen1.cs b/Wonky.Client/HttpRepository/SystemUserRepositoryGen1.cs index 9e309ff6..34f8f3fb 100644 --- a/Wonky.Client/HttpRepository/SystemUserRepositoryGen1.cs +++ b/Wonky.Client/HttpRepository/SystemUserRepositoryGen1.cs @@ -71,7 +71,7 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1 /// /// /// - 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 /// /// /// - public async Task GetAdminUserInfo(string userId) + public async Task GetAdminUserInfo(string userId) { - return await _client.GetFromJsonAsync($"{_api.OfficeUsers}/{userId}"); + return await _client.GetFromJsonAsync($"{_api.OfficeUsers}/{userId}"); } /// @@ -101,7 +101,7 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1 /// /// /// - 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); } diff --git a/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor b/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor index d1f7ad4a..a6f8b50c 100644 --- a/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor +++ b/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor @@ -34,4 +34,4 @@ } - \ No newline at end of file + \ No newline at end of file diff --git a/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor.cs b/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor.cs index 366d2c91..076b00f6 100644 --- a/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor.cs +++ b/Wonky.Client/OverlayCustomer/CustomerInventoryListOverlay.razor.cs @@ -35,7 +35,7 @@ public partial class CustomerInventoryListOverlay : IDisposable [Parameter] public string CountryCode { get; set; } = ""; [Parameter] public List Inventory { get; set; } = new(); - [Parameter] public EventCallback OnInventorySelected { get; set; } + [Parameter] public EventCallback 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(); } diff --git a/Wonky.Client/OverlayOrderCreate/PriceCatalogOverlay.razor.cs b/Wonky.Client/OverlayOrderCreate/PriceCatalogOverlay.razor.cs index 7d1ab76a..f38ae9b1 100644 --- a/Wonky.Client/OverlayOrderCreate/PriceCatalogOverlay.razor.cs +++ b/Wonky.Client/OverlayOrderCreate/PriceCatalogOverlay.razor.cs @@ -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 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 Logger { get; set; } + // parameters + [Parameter] public string CountryCode { get; set; } = ""; + [Parameter] public EventCallback OnSelected { get; set; } + // variables private string _modalDisplay = ""; private bool _showBackdrop; private List 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) diff --git a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor index 8d2527ed..bdc35239 100644 --- a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor +++ b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor @@ -355,6 +355,6 @@ else + OnSelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" /> \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs index 89df3651..7bf11d38 100644 --- a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs @@ -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("_xu"); + SalesRep = await Storage.GetItemAsync("_xu"); // Fetch Customer from http Company = await CompanyRepo.GetCompanyById(CompanyId); if (Company.HasFolded == 1) diff --git a/Wonky.Client/Pages/AdvisorActivityViewPage.razor b/Wonky.Client/Pages/AdvisorActivityViewPage.razor index 31a1d25e..0365f2ea 100644 --- a/Wonky.Client/Pages/AdvisorActivityViewPage.razor +++ b/Wonky.Client/Pages/AdvisorActivityViewPage.razor @@ -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}" diff --git a/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs index d6fab633..409f3d74 100644 --- a/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs @@ -62,7 +62,7 @@ namespace Wonky.Client.Pages CompanyContext.OnFieldChanged += HandleFieldChanged; CompanyContext.OnValidationStateChanged += ValidationChanged; - var xu = await Storage.GetItemAsync("_xu"); + var xu = await Storage.GetItemAsync("_xu"); Dk = xu.CountryCode.ToLower() == "dk"; Company.SalesRepId = xu.Id; diff --git a/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs index c181ce47..fa5e2f3e 100644 --- a/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs @@ -35,7 +35,7 @@ namespace Wonky.Client.Pages [Inject] private NavigationManager Navigator { get; set; } private List 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("_xu"); + XUserInfo = await Storage.GetItemAsync("_xu"); Paging.OrderBy = Profiles.CompanySort; Paging.SearchColumn = Profiles.CompanySearch; Paging.PageSize = Convert.ToInt32(Profiles.PageSize); diff --git a/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs index 5e120dcd..7a94ecec 100644 --- a/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs @@ -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("_xu"); - CountryCode = UserInfo.CountryCode.ToLower(); + XUserInfo = await Storage.GetItemAsync("_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" diff --git a/Wonky.Client/Pages/AdvisorReportViewPage.razor b/Wonky.Client/Pages/AdvisorReportViewPage.razor index 3b50ff35..8a67c4ac 100644 --- a/Wonky.Client/Pages/AdvisorReportViewPage.razor +++ b/Wonky.Client/Pages/AdvisorReportViewPage.razor @@ -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}" @Report.ReportData.Name
diff --git a/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs b/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs index 64a28ff2..5256a5eb 100644 --- a/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs @@ -39,7 +39,7 @@ public partial class AdvisorReportViewPage : IDisposable private ReportView Report { get; set; } = new(); private List 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("_xu"); + XUserInfo = await Storage.GetItemAsync("_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 diff --git a/Wonky.Client/Pages/CatalogCountryPage.razor.cs b/Wonky.Client/Pages/CatalogCountryPage.razor.cs index f8bb9775..be9dbfbb 100644 --- a/Wonky.Client/Pages/CatalogCountryPage.razor.cs +++ b/Wonky.Client/Pages/CatalogCountryPage.razor.cs @@ -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("_xu"); + XUserInfo = await Storage.GetItemAsync("_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); } diff --git a/Wonky.Client/Pages/OfficeAdvisorReportViewPage.razor b/Wonky.Client/Pages/OfficeAdvisorReportViewPage.razor index 3eb8c142..9e6eed46 100644 --- a/Wonky.Client/Pages/OfficeAdvisorReportViewPage.razor +++ b/Wonky.Client/Pages/OfficeAdvisorReportViewPage.razor @@ -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}"
diff --git a/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor b/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor index 5a85d9ff..876dba40 100644 --- a/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor +++ b/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor @@ -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}" diff --git a/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor.cs b/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor.cs index a6e2a0a7..3ec44b6b 100644 --- a/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor.cs +++ b/Wonky.Client/Pages/OfficeCountryCustomerListPage.razor.cs @@ -36,7 +36,7 @@ namespace Wonky.Client.Pages [Inject] private NavigationManager Navigator { get; set; } private List 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("_xu"); + XUserInfo = await Storage.GetItemAsync("_xu"); Paging.OrderBy = Profiles.CompanySort; Paging.SearchColumn = Profiles.CompanySearch; Paging.PageSize = Convert.ToInt32(Profiles.PageSize); diff --git a/Wonky.Client/Pages/OfficeOrderCreatePage.razor b/Wonky.Client/Pages/OfficeOrderCreatePage.razor index 869e41e1..6bea9a85 100644 --- a/Wonky.Client/Pages/OfficeOrderCreatePage.razor +++ b/Wonky.Client/Pages/OfficeOrderCreatePage.razor @@ -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 @@ Telefon Ordre - @Customer.Name - @Customer.Account -
-
- @DateTime.Now.ToLongDateString() -
-
-
-
+

@Customer.Name - @Customer.Account

+
+

@DateTime.Now.ToShortDateString()

+
+
+
+
+ Loading... +
+
+
- -
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
@@ -56,7 +84,7 @@
- +
@@ -66,6 +94,18 @@
+ +
+ +
+ +
+ +
+ +
+ +
@@ -170,8 +210,9 @@
@* end draft line ------------------------------------------------- *@
+ @*
- @* Delivery address *@ + $1$ Delivery address #1#

+*@
@@ -222,4 +264,12 @@
- \ No newline at end of file + +@* *@ +@* *@ +@* *@ +@* *@ +@* *@ \ No newline at end of file diff --git a/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs b/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs index 03119474..90fd10b5 100644 --- a/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs +++ b/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs @@ -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 Inventory { get; set; } = new(); + private List CheckList { get; set; } = new(); + private InvoiceListView CompanyInvoices { get; set; } = new(); + + private List 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 { } - - /// - /// Work Date component callback - /// - /// - 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() + { + } /// diff --git a/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs b/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs index ff7e6e2b..1dc217a4 100644 --- a/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs +++ b/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs @@ -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("_xu"); + var user = await Storage.GetItemAsync("_xu"); // fetch sales rep from response var salesRep = await SystemUserRepo.GetAdvisorInfo(responseView.Id); Logger.LogDebug("SetExpressState => salesRep => {}", JsonSerializer.Serialize(salesRep)); diff --git a/Wonky.Client/Services/AuthenticationService.cs b/Wonky.Client/Services/AuthenticationService.cs index 4d4cea18..f7c4866e 100644 --- a/Wonky.Client/Services/AuthenticationService.cs +++ b/Wonky.Client/Services/AuthenticationService.cs @@ -130,19 +130,19 @@ namespace Wonky.Client.Services ((AuthStateProvider)_authStateProvider).NotifyUserLogout(); } - public async Task UserInfo(bool write = false) + public async Task 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(infoContent, _options); + var userInfo = JsonSerializer.Deserialize(content, _options); if(write) await _localStorage.SetItemAsync("_xu", userInfo); - return userInfo ?? new UserInfoView(); + return userInfo ?? new UserManagerEditView(); } } } diff --git a/Wonky.Client/Services/IAuthenticationService.cs b/Wonky.Client/Services/IAuthenticationService.cs index 34f62971..75228b13 100644 --- a/Wonky.Client/Services/IAuthenticationService.cs +++ b/Wonky.Client/Services/IAuthenticationService.cs @@ -24,7 +24,7 @@ namespace Wonky.Client.Services Task Login(CredentialDto credentials); Task Logout(); Task RefreshToken(); - Task UserInfo(bool write = false); + Task UserInfo(bool write = false); } } diff --git a/Wonky.Client/Shared/AuthStateProvider.cs b/Wonky.Client/Shared/AuthStateProvider.cs index 41aea649..d06e01ef 100644 --- a/Wonky.Client/Shared/AuthStateProvider.cs +++ b/Wonky.Client/Shared/AuthStateProvider.cs @@ -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("_xu"); + var userInfo = await _storage.GetItemAsync("_xu"); if (userInfo == null) return _anonymous; _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token); var exp = await _storage.GetItemAsync("_xe"); - var roles = ExtractRoles(userInfo); var claims = new List { - 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("_xu"); + var userInfo = await _storage.GetItemAsync("_xu"); var exp = await _storage.GetItemAsync("_xe"); - var roles = ExtractRoles(userInfo); var claims = new List { - 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 ExtractRoles(UserInfoView userInfoView) - { - var roles = new List(); - 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; - } } } diff --git a/Wonky.Client/wwwroot/appsettings.json b/Wonky.Client/wwwroot/appsettings.json index b1d8cc89..3e3653e5 100644 --- a/Wonky.Client/wwwroot/appsettings.json +++ b/Wonky.Client/wwwroot/appsettings.json @@ -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" diff --git a/Wonky.Entity/DTO/UserInfoDto.cs b/Wonky.Entity/DTO/X_UserInfoDto.cs similarity index 92% rename from Wonky.Entity/DTO/UserInfoDto.cs rename to Wonky.Entity/DTO/X_UserInfoDto.cs index 587a5aed..d87de50d 100644 --- a/Wonky.Entity/DTO/UserInfoDto.cs +++ b/Wonky.Entity/DTO/X_UserInfoDto.cs @@ -18,7 +18,7 @@ using System.ComponentModel.DataAnnotations; namespace Wonky.Entity.DTO; -public class UserInfoDto +public class X_UserInfoDto { /// /// User Id @@ -28,13 +28,13 @@ public class UserInfoDto /// Sales representative identification /// [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; } = ""; /// /// Country code /// [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; } = ""; /// /// Country name @@ -44,7 +44,7 @@ public class UserInfoDto /// Email /// [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; } = ""; /// /// First name diff --git a/Wonky.Entity/DTO/UserUpdateDto.cs b/Wonky.Entity/DTO/X_UserUpdateDto.cs similarity index 98% rename from Wonky.Entity/DTO/UserUpdateDto.cs rename to Wonky.Entity/DTO/X_UserUpdateDto.cs index 35454626..05d3c144 100644 --- a/Wonky.Entity/DTO/UserUpdateDto.cs +++ b/Wonky.Entity/DTO/X_UserUpdateDto.cs @@ -18,7 +18,7 @@ using System.ComponentModel.DataAnnotations; namespace Wonky.Entity.DTO; -public class UserUpdateDto +public class X_UserUpdateDto { /// /// User firstname diff --git a/Wonky.Entity/Views/UserInfoView.cs b/Wonky.Entity/Views/X_UserInfoView.cs similarity index 98% rename from Wonky.Entity/Views/UserInfoView.cs rename to Wonky.Entity/Views/X_UserInfoView.cs index f87cfee6..df05a66d 100644 --- a/Wonky.Entity/Views/UserInfoView.cs +++ b/Wonky.Entity/Views/X_UserInfoView.cs @@ -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; } = "";