WIP: office create order - refactor namespace
This commit is contained in:
parent
308876896f
commit
a2a5e8dd72
28 changed files with 179 additions and 110 deletions
|
@ -30,7 +30,7 @@
|
|||
"the-bad" => "file-earmark-check",
|
||||
"the-ugly" => "box2-fill",
|
||||
"the-dead" => "truck",
|
||||
"accepted" => "hand-thumbs-up",
|
||||
"accepted" => "printer",
|
||||
_ => "question-square"
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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" />
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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" />
|
|
@ -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)
|
||||
|
|
|
@ -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}"
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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}"
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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-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>
|
||||
|
||||
<div class="row mb-1 g-3">
|
||||
<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"/>
|
||||
|
@ -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"/> *@
|
|
@ -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()
|
||||
|
@ -143,6 +159,19 @@ public partial class OfficeOrderCreatePage : IDisposable
|
|||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void ShowInvoiceOverlay()
|
||||
{
|
||||
|
||||
}
|
||||
private void ShowVisitOverlay()
|
||||
{
|
||||
|
||||
}
|
||||
private void ShowInventoryOverlay()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void CallPriceHistoryModal()
|
||||
{
|
||||
|
||||
|
@ -167,15 +196,14 @@ 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>
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,19 +73,20 @@ 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(
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
|
@ -18,7 +18,7 @@ using System.ComponentModel.DataAnnotations;
|
|||
|
||||
namespace Wonky.Entity.DTO;
|
||||
|
||||
public class UserUpdateDto
|
||||
public class X_UserUpdateDto
|
||||
{
|
||||
/// <summary>
|
||||
/// User firstname
|
|
@ -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; } = "";
|
Loading…
Reference in a new issue