diff --git a/Wonky.Client.sln.DotSettings b/Wonky.Client.sln.DotSettings index 22a99637..95725125 100644 --- a/Wonky.Client.sln.DotSettings +++ b/Wonky.Client.sln.DotSettings @@ -2,9 +2,12 @@ True True True + True True True + True True + True True True True \ No newline at end of file diff --git a/Wonky.Client/Components/AdvisorActivityKmStartComponent.razor b/Wonky.Client/Components/AdvisorActivityKmStartComponent.razor index 242a2670..749f83e6 100644 --- a/Wonky.Client/Components/AdvisorActivityKmStartComponent.razor +++ b/Wonky.Client/Components/AdvisorActivityKmStartComponent.razor @@ -8,7 +8,7 @@ @code { - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } private int KmMorning { get; set; } private UserPref Prefs { get; set; } = new(); diff --git a/Wonky.Client/Components/ActivityListComponent.razor b/Wonky.Client/Components/AdvisorActivityListComponent.razor similarity index 92% rename from Wonky.Client/Components/ActivityListComponent.razor rename to Wonky.Client/Components/AdvisorActivityListComponent.razor index 833ebb8b..6edc5e8e 100644 --- a/Wonky.Client/Components/ActivityListComponent.razor +++ b/Wonky.Client/Components/AdvisorActivityListComponent.razor @@ -18,7 +18,7 @@ @if (ActivityList.Any()) { - +
@@ -38,7 +38,7 @@ @foreach (var activity in ActivityList) { - + diff --git a/Wonky.Client/Components/ActivityListComponent.razor.cs b/Wonky.Client/Components/AdvisorActivityListComponent.razor.cs similarity index 89% rename from Wonky.Client/Components/ActivityListComponent.razor.cs rename to Wonky.Client/Components/AdvisorActivityListComponent.razor.cs index 37969a3b..c7c528e9 100644 --- a/Wonky.Client/Components/ActivityListComponent.razor.cs +++ b/Wonky.Client/Components/AdvisorActivityListComponent.razor.cs @@ -18,9 +18,9 @@ using Wonky.Entity.Views; namespace Wonky.Client.Components; -public partial class ActivityListComponent +public partial class AdvisorActivityListComponent { [Parameter] public List ActivityList { get; set; } = new(); - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private NavigationManager Navigator { get; set; } } \ No newline at end of file diff --git a/Wonky.Client/Components/AdvisorCompanyTableComponent.razor b/Wonky.Client/Components/AdvisorCustomerListComponent.razor similarity index 97% rename from Wonky.Client/Components/AdvisorCompanyTableComponent.razor rename to Wonky.Client/Components/AdvisorCustomerListComponent.razor index 378ac3ce..db093cce 100644 --- a/Wonky.Client/Components/AdvisorCompanyTableComponent.razor +++ b/Wonky.Client/Components/AdvisorCustomerListComponent.razor @@ -58,7 +58,7 @@ @company.City diff --git a/Wonky.Client/Components/AdvisorCompanyTableComponent.razor.cs b/Wonky.Client/Components/AdvisorCustomerListComponent.razor.cs similarity index 88% rename from Wonky.Client/Components/AdvisorCompanyTableComponent.razor.cs rename to Wonky.Client/Components/AdvisorCustomerListComponent.razor.cs index dcd88100..4cfb03fb 100644 --- a/Wonky.Client/Components/AdvisorCompanyTableComponent.razor.cs +++ b/Wonky.Client/Components/AdvisorCustomerListComponent.razor.cs @@ -27,13 +27,13 @@ using Wonky.Entity.Views; namespace Wonky.Client.Components { - public partial class AdvisorCompanyTableComponent + public partial class AdvisorCustomerListComponent { [Parameter] public List CompanyList { get; set; } = new(); [Parameter] public EventCallback OnDelete { get; set; } [Parameter] public EventCallback OnSelect { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IJSRuntime Js { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private IJSRuntime Js { get; set; } private Lazy BsTooltip = new(); @@ -43,7 +43,7 @@ namespace Wonky.Client.Components private void ViewCustomer(string companyId) { - Navigator.NavigateTo($"/customers/{companyId}"); + Navigator.NavigateTo($"/advisor/customers/{companyId}"); } private void CallInformationModal(string info) diff --git a/Wonky.Client/Components/AdvisorReportActivityLedgerComponent.razor b/Wonky.Client/Components/AdvisorReportActivityLedgerComponent.razor new file mode 100644 index 00000000..bb2f8831 --- /dev/null +++ b/Wonky.Client/Components/AdvisorReportActivityLedgerComponent.razor @@ -0,0 +1,93 @@ +@using Wonky.Entity.Views +@using Wonky.Entity.DTO +@* +// Copyright (C) 2022 FCS Frede's Computer Services. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] +// +*@ + +
Kunde
@activity.Company.Name@activity.Company.Name @activity.Company.City @activity.Demo @activity.Sales -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dagens Demo @(ReportData.NewDemoCount + ReportData.RecallDemoCount)Dagens ResultatMåneds Resultat
BesøgDemoSalgBeløbBesøgDemoSalgBeløb
N@ReportData.NewVisitCount@ReportData.NewDemoCount@ReportData.NewSaleCount@ReportData.NewTurnover@ReportData.NewVisitCountMonth@ReportData.NewDemoCountMonth@ReportData.NewSaleCountMonth@ReportData.NewTurnoverMonth
R@ReportData.RecallVisitCount@ReportData.RecallDemoCount@ReportData.RecallSaleCount@ReportData.RecallTurnover@ReportData.RecallVisitCountMonth@ReportData.RecallDemoCountMonth@ReportData.RecallSaleCountMonth@ReportData.RecallTurnoverMonth
SAS@ReportData.SasCount@ReportData.SasTurnover@ReportData.SasCountMonth@ReportData.SasTurnoverMonth
TOTAL@ReportData.TotalVisitCount@ReportData.TotalDemoCount@ReportData.TotalSaleCount@ReportData.TotalTurnover@ReportData.TotalVisitCountMonth@ReportData.TotalDemoCountMonth@ReportData.TotalSaleCountMonth@ReportData.TotalTurnoverMonth
+ +@code{ + + [Parameter] + public ReportFiguresDto ReportData { get; set; } = new(); + +} \ No newline at end of file diff --git a/Wonky.Client/Components/CatalogGroupComponent.razor.cs b/Wonky.Client/Components/CatalogGroupComponent.razor.cs index cd9a7b30..72f23c18 100644 --- a/Wonky.Client/Components/CatalogGroupComponent.razor.cs +++ b/Wonky.Client/Components/CatalogGroupComponent.razor.cs @@ -22,8 +22,8 @@ namespace Wonky.Client.Components; public partial class CatalogGroupComponent { - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } [Parameter] public EventCallback OnChanged { get; set; } private Dictionary Items { get; set; } = new(); private UserPref Prefs = new(); diff --git a/Wonky.Client/Components/CatalogListComponent.razor.cs b/Wonky.Client/Components/CatalogListComponent.razor.cs index 12927c43..1f173552 100644 --- a/Wonky.Client/Components/CatalogListComponent.razor.cs +++ b/Wonky.Client/Components/CatalogListComponent.razor.cs @@ -24,5 +24,5 @@ namespace Wonky.Client.Components; public partial class CatalogListComponent { [Parameter] public List ItemList { get; set; } = new(); - [Inject] public IToastService ToastService { get; set; } + [Inject] private IToastService ToastService { get; set; } } \ No newline at end of file diff --git a/Wonky.Client/Components/CatalogSearchComponent.razor b/Wonky.Client/Components/CatalogSearchComponent.razor index 64fb9429..e5e76efc 100644 --- a/Wonky.Client/Components/CatalogSearchComponent.razor +++ b/Wonky.Client/Components/CatalogSearchComponent.razor @@ -17,7 +17,7 @@ \ No newline at end of file diff --git a/Wonky.Client/Components/CatalogSearchComponent.razor.cs b/Wonky.Client/Components/CatalogSearchComponent.razor.cs index dee1c3a4..eee8cf03 100644 --- a/Wonky.Client/Components/CatalogSearchComponent.razor.cs +++ b/Wonky.Client/Components/CatalogSearchComponent.razor.cs @@ -24,7 +24,7 @@ public partial class CatalogSearchComponent : IDisposable /// /// User preference service /// - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } /// /// OnChanged event callback diff --git a/Wonky.Client/Components/CatalogSortComponent.razor b/Wonky.Client/Components/CatalogSortComponent.razor index 09dedc9b..6d92ab1e 100644 --- a/Wonky.Client/Components/CatalogSortComponent.razor +++ b/Wonky.Client/Components/CatalogSortComponent.razor @@ -17,6 +17,6 @@ \ No newline at end of file diff --git a/Wonky.Client/Components/CatalogSortComponent.razor.cs b/Wonky.Client/Components/CatalogSortComponent.razor.cs index b009fb81..989c3ee1 100644 --- a/Wonky.Client/Components/CatalogSortComponent.razor.cs +++ b/Wonky.Client/Components/CatalogSortComponent.razor.cs @@ -24,7 +24,7 @@ public partial class CatalogSortComponent : IDisposable /// /// User preference service /// - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } /// /// OnChanged callback function diff --git a/Wonky.Client/Components/CustomerInventoryListComponent.razor.cs b/Wonky.Client/Components/CustomerInventoryListComponent.razor.cs index 7dae353c..173b1a55 100644 --- a/Wonky.Client/Components/CustomerInventoryListComponent.razor.cs +++ b/Wonky.Client/Components/CustomerInventoryListComponent.razor.cs @@ -27,7 +27,7 @@ namespace Wonky.Client.Components; public partial class CustomerInventoryListComponent { - [Inject] public ILocalStorageService Storage { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } // Parameters [Parameter] public List Inventory { get; set; } = new(); [Parameter] public string CompanyId { get; set; } = ""; diff --git a/Wonky.Client/Components/CustomerInvoiceListComponent.razor b/Wonky.Client/Components/CustomerInvoiceListComponent.razor index a734ceab..365e56e3 100644 --- a/Wonky.Client/Components/CustomerInvoiceListComponent.razor +++ b/Wonky.Client/Components/CustomerInvoiceListComponent.razor @@ -37,7 +37,7 @@ {
-
+
@invoice.OrderNote
} diff --git a/Wonky.Client/Components/CustomerProductCheckListComponent.razor.cs b/Wonky.Client/Components/CustomerProductCheckListComponent.razor.cs index 57fea05e..9559e57a 100644 --- a/Wonky.Client/Components/CustomerProductCheckListComponent.razor.cs +++ b/Wonky.Client/Components/CustomerProductCheckListComponent.razor.cs @@ -28,7 +28,7 @@ public partial class CustomerProductCheckListComponent { [Parameter] public List ProductList { get; set; } = new(); [Parameter] public string CompanyId { get; set; } = ""; - [Inject] public ILocalStorageService Storage { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } // private variables private bool Descending { get; set; } diff --git a/Wonky.Client/Components/CompanySearchColumnComponent.razor b/Wonky.Client/Components/CustomerSearchColumnComponent.razor similarity index 81% rename from Wonky.Client/Components/CompanySearchColumnComponent.razor rename to Wonky.Client/Components/CustomerSearchColumnComponent.razor index 3d6d41b6..bd08fc0a 100644 --- a/Wonky.Client/Components/CompanySearchColumnComponent.razor +++ b/Wonky.Client/Components/CustomerSearchColumnComponent.razor @@ -17,9 +17,9 @@ diff --git a/Wonky.Client/Components/CompanySearchColumnComponent.razor.cs b/Wonky.Client/Components/CustomerSearchColumnComponent.razor.cs similarity index 90% rename from Wonky.Client/Components/CompanySearchColumnComponent.razor.cs rename to Wonky.Client/Components/CustomerSearchColumnComponent.razor.cs index 3b4777bb..e771be7d 100644 --- a/Wonky.Client/Components/CompanySearchColumnComponent.razor.cs +++ b/Wonky.Client/Components/CustomerSearchColumnComponent.razor.cs @@ -22,10 +22,10 @@ using Wonky.Client.Services; namespace Wonky.Client.Components; -public partial class CompanySearchColumnComponent : IDisposable +public partial class CustomerSearchColumnComponent : IDisposable { - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } [Parameter] public EventCallback OnChanged { get; set; } private Dictionary Items { get; set; } = new(); private UserPref Prefs { get; set; } = new(); diff --git a/Wonky.Client/Components/CompanySearchPhraseComponent.razor b/Wonky.Client/Components/CustomerSearchPhraseComponent.razor similarity index 100% rename from Wonky.Client/Components/CompanySearchPhraseComponent.razor rename to Wonky.Client/Components/CustomerSearchPhraseComponent.razor diff --git a/Wonky.Client/Components/CompanySearchPhraseComponent.razor.cs b/Wonky.Client/Components/CustomerSearchPhraseComponent.razor.cs similarity index 94% rename from Wonky.Client/Components/CompanySearchPhraseComponent.razor.cs rename to Wonky.Client/Components/CustomerSearchPhraseComponent.razor.cs index aceec932..158b33eb 100644 --- a/Wonky.Client/Components/CompanySearchPhraseComponent.razor.cs +++ b/Wonky.Client/Components/CustomerSearchPhraseComponent.razor.cs @@ -20,12 +20,12 @@ using Timer = System.Timers.Timer; namespace Wonky.Client.Components { - public partial class CompanySearchPhraseComponent + public partial class CustomerSearchPhraseComponent { private Timer InputTimer { get; set; } = new(); private string SearchTerm { get; set; } = ""; private UserPref Prefs { get; set; } = new (); - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } [Parameter] public EventCallback OnChanged { get; set; } protected override async Task OnInitializedAsync() diff --git a/Wonky.Client/Components/CompanySortComponent.razor b/Wonky.Client/Components/CustomerSortComponent.razor similarity index 91% rename from Wonky.Client/Components/CompanySortComponent.razor rename to Wonky.Client/Components/CustomerSortComponent.razor index 4540f25c..0fe514a0 100644 --- a/Wonky.Client/Components/CompanySortComponent.razor +++ b/Wonky.Client/Components/CustomerSortComponent.razor @@ -17,6 +17,6 @@ \ No newline at end of file diff --git a/Wonky.Client/Components/CompanySortComponent.razor.cs b/Wonky.Client/Components/CustomerSortComponent.razor.cs similarity index 90% rename from Wonky.Client/Components/CompanySortComponent.razor.cs rename to Wonky.Client/Components/CustomerSortComponent.razor.cs index 045ce0d7..f2f5567f 100644 --- a/Wonky.Client/Components/CompanySortComponent.razor.cs +++ b/Wonky.Client/Components/CustomerSortComponent.razor.cs @@ -21,10 +21,10 @@ using Wonky.Client.Services; namespace Wonky.Client.Components { - public partial class CompanySortComponent : IDisposable + public partial class CustomerSortComponent : IDisposable { - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } [Parameter] public EventCallback OnChanged { get; set; } private Dictionary Items { get; set; } = new(); private UserPref Prefs = new(); diff --git a/Wonky.Client/Components/CustomerVisitListComponent.razor b/Wonky.Client/Components/CustomerVisitListComponent.razor new file mode 100644 index 00000000..2d50f39f --- /dev/null +++ b/Wonky.Client/Components/CustomerVisitListComponent.razor @@ -0,0 +1,75 @@ +@* +// Copyright (C) 2022 FCS Frede's Computer Services. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] +// +*@ + +
+
+
+
+

Dato

+
+
+

Demo

+
+
+

Salg

+
+
+

Ordre Note

+
+
+

Ordre Note

+
+
+
+ @if (Activities.Any()) + { + @foreach (var activity in Activities) + { +
+
+
+ @activity.OrderDate +
+
+ @activity.Demo +
+
+ @activity.Sales +
+
+ @activity.OfficeNote +
+
+ @activity.CrmNote +
+
+
+ } + } + else + { +
+
+
+ Ingen data +
+
+
+ } +
+ + \ No newline at end of file diff --git a/Wonky.Client/Components/CustomerVisitListComponent.razor.cs b/Wonky.Client/Components/CustomerVisitListComponent.razor.cs new file mode 100644 index 00000000..e33aaf63 --- /dev/null +++ b/Wonky.Client/Components/CustomerVisitListComponent.razor.cs @@ -0,0 +1,41 @@ +// Copyright (C) 2022 FCS Frede's Computer Services. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] +// + +using System.Globalization; +using System.Runtime.InteropServices; +using Blazored.LocalStorage; +using Microsoft.AspNetCore.Components; +using Wonky.Client.HttpInterfaces; +using Wonky.Client.Models; +using Wonky.Client.Shared; +using Wonky.Entity.DTO; +using Wonky.Entity.Views; + +namespace Wonky.Client.Components; + +public partial class CustomerVisitListComponent +{ + [Parameter] public List Activities { get; set; } = new(); + private CustomerActivityViewModalOverlay ActivityViewOverlay { get; set; } = new(); + + private ReportItemView Activity { get; set; } = new(); + + private void ShowVisitOverlay(string activityId) + { + Activity = Activities.First(x => x.ActivityId == activityId); + ActivityViewOverlay.Show(); + } + +} \ No newline at end of file diff --git a/Wonky.Client/Components/InfoAdvisorComponent.razor b/Wonky.Client/Components/InfoAdvisorComponent.razor new file mode 100644 index 00000000..092c4913 --- /dev/null +++ b/Wonky.Client/Components/InfoAdvisorComponent.razor @@ -0,0 +1,47 @@ +

Sælger

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymbolBetydning
+ + ToDo liste
+ + Pris katalog
+ + Firmaer/Kunder
+ + Aftaler/Tilbud
+ + Aktivitet
+ + Dagsrapporter
\ No newline at end of file diff --git a/Wonky.Client/Components/InfoColorCustomerComponent.razor.css b/Wonky.Client/Components/InfoColorCustomerComponent.razor.css index 002017f5..d28e2116 100644 --- a/Wonky.Client/Components/InfoColorCustomerComponent.razor.css +++ b/Wonky.Client/Components/InfoColorCustomerComponent.razor.css @@ -1,4 +1,6 @@ - +.pictogram { + max-width: 30px; +} .color-code { - max-width: 40px; + max-width: 30px; } \ No newline at end of file diff --git a/Wonky.Client/Components/InfoColorPackageComponent.razor.css b/Wonky.Client/Components/InfoColorPackageComponent.razor.css index 002017f5..d28e2116 100644 --- a/Wonky.Client/Components/InfoColorPackageComponent.razor.css +++ b/Wonky.Client/Components/InfoColorPackageComponent.razor.css @@ -1,4 +1,6 @@ - +.pictogram { + max-width: 30px; +} .color-code { - max-width: 40px; + max-width: 30px; } \ No newline at end of file diff --git a/Wonky.Client/Components/InfoCommonComponent.razor b/Wonky.Client/Components/InfoCommonComponent.razor new file mode 100644 index 00000000..e1f25bd4 --- /dev/null +++ b/Wonky.Client/Components/InfoCommonComponent.razor @@ -0,0 +1,41 @@ +

Fælles

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymbolBetydning
Gem data
Søg
Opret
Notat
Udskrivning
Indstillinger
Log af
Hjælp/Info
diff --git a/Wonky.Client/Components/InfoOfficeComponent.razor b/Wonky.Client/Components/InfoOfficeComponent.razor new file mode 100644 index 00000000..abe77131 --- /dev/null +++ b/Wonky.Client/Components/InfoOfficeComponent.razor @@ -0,0 +1,17 @@ +

Kontor

+ + + + + + + + + + + + + +
SymbolBetydning
+ + Brugere
\ No newline at end of file diff --git a/Wonky.Client/Components/InfoProcessStateComponent.razor b/Wonky.Client/Components/InfoProcessStateComponent.razor index 5edd239d..95e75e79 100644 --- a/Wonky.Client/Components/InfoProcessStateComponent.razor +++ b/Wonky.Client/Components/InfoProcessStateComponent.razor @@ -1,5 +1,5 @@ -

Aktivitet Oversigt

+

Bestilling Status

@@ -18,6 +18,10 @@ + + + + @@ -28,7 +32,7 @@ - +
Ubehandlet
Accepteret
Plukket
AfhentetLeveret
diff --git a/Wonky.Client/Components/InfoWarehouseComponent.razor b/Wonky.Client/Components/InfoWarehouseComponent.razor new file mode 100644 index 00000000..ee8efefd --- /dev/null +++ b/Wonky.Client/Components/InfoWarehouseComponent.razor @@ -0,0 +1,17 @@ +

Lager

+ + + + + + + + + + + + + +
SymbolBetydning
+ + Pakning / Forsendelse
\ No newline at end of file diff --git a/Wonky.Client/Components/LandingComponentAdvisor.razor b/Wonky.Client/Components/LandingComponentAdvisor.razor index 0b238fc5..a97d1535 100644 --- a/Wonky.Client/Components/LandingComponentAdvisor.razor +++ b/Wonky.Client/Components/LandingComponentAdvisor.razor @@ -18,8 +18,6 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components -Innotec Rådgiver -
diff --git a/Wonky.Client/Components/LandingComponentAdvisor.razor.cs b/Wonky.Client/Components/LandingComponentAdvisor.razor.cs index 2282ccd3..d341023e 100644 --- a/Wonky.Client/Components/LandingComponentAdvisor.razor.cs +++ b/Wonky.Client/Components/LandingComponentAdvisor.razor.cs @@ -32,7 +32,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.Components; public partial class LandingComponentAdvisor { - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } private readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions { diff --git a/Wonky.Client/Components/LandingComponentAdmin.razor b/Wonky.Client/Components/LandingComponentOffice.razor similarity index 87% rename from Wonky.Client/Components/LandingComponentAdmin.razor rename to Wonky.Client/Components/LandingComponentOffice.razor index c7d9ef7e..8cd7ab49 100644 --- a/Wonky.Client/Components/LandingComponentAdmin.razor +++ b/Wonky.Client/Components/LandingComponentOffice.razor @@ -24,15 +24,17 @@
Danmark
@@ -45,15 +47,17 @@
Norge
@@ -66,15 +70,17 @@
Sverige
diff --git a/Wonky.Client/Components/LandingComponentAdmin.razor.cs b/Wonky.Client/Components/LandingComponentOffice.razor.cs similarity index 94% rename from Wonky.Client/Components/LandingComponentAdmin.razor.cs rename to Wonky.Client/Components/LandingComponentOffice.razor.cs index ecc05952..b210bb90 100644 --- a/Wonky.Client/Components/LandingComponentAdmin.razor.cs +++ b/Wonky.Client/Components/LandingComponentOffice.razor.cs @@ -30,9 +30,9 @@ using Wonky.Entity.Models; using Wonky.Entity.Views; namespace Wonky.Client.Components; -public partial class LandingComponentAdmin +public partial class LandingComponentOffice { - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } private readonly JsonSerializerOptions _options = new JsonSerializerOptions { diff --git a/Wonky.Client/Components/OfficeActivityListComponent.razor b/Wonky.Client/Components/OfficeActivityListComponent.razor new file mode 100644 index 00000000..13ed7bfa --- /dev/null +++ b/Wonky.Client/Components/OfficeActivityListComponent.razor @@ -0,0 +1,92 @@ +@* +// Copyright (C) 2022 FCS Frede's Computer Services. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] +// +*@ +@using Wonky.Entity.Views + +@* Report activities *@ + + + + + + + + + + + + + + + + + + @foreach (var activity in Activities) + { + + + + + + + + + + + + + + } + + + + + + + +
KundeBynavnDemoSalgNotesasBeløb + + + + + + + +
@activity.Company.Name@activity.Company.City@activity.Demo@activity.Sales@activity.OfficeNote@($"{activity.SasAmount:N2}")@(activity.StatusTypeEnum.Contains("Quote") ? $"{0:N2}" : $"{activity.OrderAmount:N2}") + @if (activity.OurRef.Contains("T:")) + { + + } + + @if (activity.Express) + { + + } + + @if (activity.StatusTypeEnum == "Quote") + { + + } + + +
Total@Activities.Where(x => x.StatusTypeEnum != "Quote").Sum(x => x.OrderAmount)
+ +@code { + + [Parameter] + public List Activities { get; set; } = new(); + +} \ No newline at end of file diff --git a/Wonky.Client/Components/CountrySalesRepListComponent.razor b/Wonky.Client/Components/OfficeCountryAdvisorListComponent.razor similarity index 84% rename from Wonky.Client/Components/CountrySalesRepListComponent.razor rename to Wonky.Client/Components/OfficeCountryAdvisorListComponent.razor index c3afd16f..63e0165e 100644 --- a/Wonky.Client/Components/CountrySalesRepListComponent.razor +++ b/Wonky.Client/Components/OfficeCountryAdvisorListComponent.razor @@ -32,7 +32,11 @@ Kunder
- Rediger + + + Rediger + +
diff --git a/Wonky.Client/Components/CountrySalesRepListComponent.razor.cs b/Wonky.Client/Components/OfficeCountryAdvisorListComponent.razor.cs similarity index 94% rename from Wonky.Client/Components/CountrySalesRepListComponent.razor.cs rename to Wonky.Client/Components/OfficeCountryAdvisorListComponent.razor.cs index c9048872..b8a57bbc 100644 --- a/Wonky.Client/Components/CountrySalesRepListComponent.razor.cs +++ b/Wonky.Client/Components/OfficeCountryAdvisorListComponent.razor.cs @@ -19,7 +19,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.Components; -public partial class CountrySalesRepListComponent +public partial class OfficeCountryAdvisorListComponent { [Parameter] public List UserList { get; set; } = new(); } \ No newline at end of file diff --git a/Wonky.Client/Components/CountryCustomerListComponent.razor b/Wonky.Client/Components/OfficeCountryCustomerListComponent.razor similarity index 58% rename from Wonky.Client/Components/CountryCustomerListComponent.razor rename to Wonky.Client/Components/OfficeCountryCustomerListComponent.razor index f928c6c4..6127319b 100644 --- a/Wonky.Client/Components/CountryCustomerListComponent.razor +++ b/Wonky.Client/Components/OfficeCountryCustomerListComponent.razor @@ -20,6 +20,7 @@ @if (CompanyList.Any()) { + @*
@@ -40,9 +41,40 @@
+ *@ + } diff --git a/Wonky.Client/Components/CountryCustomerListComponent.razor.cs b/Wonky.Client/Components/OfficeCountryCustomerListComponent.razor.cs similarity index 95% rename from Wonky.Client/Components/CountryCustomerListComponent.razor.cs rename to Wonky.Client/Components/OfficeCountryCustomerListComponent.razor.cs index 627ecbc9..aa8efc17 100644 --- a/Wonky.Client/Components/CountryCustomerListComponent.razor.cs +++ b/Wonky.Client/Components/OfficeCountryCustomerListComponent.razor.cs @@ -24,7 +24,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.Components { - public partial class CountryCustomerListComponent + public partial class OfficeCountryCustomerListComponent { [Parameter] public List CompanyList { get; set; } = new(); [Parameter] public string CountryCode { get; set; } = ""; diff --git a/Wonky.Client/Components/CountryUserListComponent.razor b/Wonky.Client/Components/OfficeCountryUserListComponent.razor similarity index 100% rename from Wonky.Client/Components/CountryUserListComponent.razor rename to Wonky.Client/Components/OfficeCountryUserListComponent.razor diff --git a/Wonky.Client/Components/CountryUserListComponent.razor.cs b/Wonky.Client/Components/OfficeCountryUserListComponent.razor.cs similarity index 94% rename from Wonky.Client/Components/CountryUserListComponent.razor.cs rename to Wonky.Client/Components/OfficeCountryUserListComponent.razor.cs index ad2b5be5..1d098669 100644 --- a/Wonky.Client/Components/CountryUserListComponent.razor.cs +++ b/Wonky.Client/Components/OfficeCountryUserListComponent.razor.cs @@ -18,7 +18,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.Components; -public partial class CountryUserListComponent +public partial class OfficeCountryUserListComponent { [Parameter] public List UserList { get; set; } = new(); } \ No newline at end of file diff --git a/Wonky.Client/Components/ReportActivityTableOfficeComponent.razor b/Wonky.Client/Components/OfficeReportActivityListComponent.razor similarity index 83% rename from Wonky.Client/Components/ReportActivityTableOfficeComponent.razor rename to Wonky.Client/Components/OfficeReportActivityListComponent.razor index a9cf370e..cee0fd5a 100644 --- a/Wonky.Client/Components/ReportActivityTableOfficeComponent.razor +++ b/Wonky.Client/Components/OfficeReportActivityListComponent.razor @@ -1,3 +1,4 @@ +@using Wonky.Client.Helpers @* // Copyright (C) 2022 FCS Frede's Computer Services. // This program is free software: you can redistribute it and/or modify @@ -15,9 +16,10 @@ // *@ +@using Wonky.Client.Helpers @if (ActivityList.Any()) { - +
@@ -27,10 +29,10 @@ - - - - + + + + @@ -59,7 +61,7 @@ diff --git a/Wonky.Client/Components/ReportActivityLedgerComponent.razor.cs b/Wonky.Client/Components/OfficeReportActivityListComponent.razor.cs similarity index 71% rename from Wonky.Client/Components/ReportActivityLedgerComponent.razor.cs rename to Wonky.Client/Components/OfficeReportActivityListComponent.razor.cs index 870de4ef..ba5e64e5 100644 --- a/Wonky.Client/Components/ReportActivityLedgerComponent.razor.cs +++ b/Wonky.Client/Components/OfficeReportActivityListComponent.razor.cs @@ -13,12 +13,18 @@ // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // -using Wonky.Entity.Views; using Microsoft.AspNetCore.Components; +using Wonky.Entity.Views; namespace Wonky.Client.Components; -public partial class ReportActivityLedgerComponent +public partial class OfficeReportActivityListComponent { - [Parameter] public ReportData ReportData { get; set; } = new(); + [Parameter] public List ActivityList { get; set; } = new(); + [Inject] private NavigationManager Navigator { get; set; } + + private void ShowOrder(string companyId, string orderId) + { + Navigator.NavigateTo($"/office/customers/{companyId}/orders/{orderId}"); + } } \ No newline at end of file diff --git a/Wonky.Client/Components/ReportListOfficeComponent.razor b/Wonky.Client/Components/OfficeReportListComponent.razor similarity index 100% rename from Wonky.Client/Components/ReportListOfficeComponent.razor rename to Wonky.Client/Components/OfficeReportListComponent.razor diff --git a/Wonky.Client/Components/ReportListOfficeComponent.razor.cs b/Wonky.Client/Components/OfficeReportListComponent.razor.cs similarity index 96% rename from Wonky.Client/Components/ReportListOfficeComponent.razor.cs rename to Wonky.Client/Components/OfficeReportListComponent.razor.cs index 61cb0c30..463369d9 100644 --- a/Wonky.Client/Components/ReportListOfficeComponent.razor.cs +++ b/Wonky.Client/Components/OfficeReportListComponent.razor.cs @@ -18,7 +18,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.Components; -public partial class ReportListOfficeComponent +public partial class OfficeReportListComponent { [Parameter] public List ReportList { get; set; } = new(); [Parameter] public string UserId { get; set; } = ""; diff --git a/Wonky.Client/Components/PageSizeComponent.razor.cs b/Wonky.Client/Components/PageSizeComponent.razor.cs index 62f3fe9d..f0ea009b 100644 --- a/Wonky.Client/Components/PageSizeComponent.razor.cs +++ b/Wonky.Client/Components/PageSizeComponent.razor.cs @@ -23,18 +23,20 @@ namespace Wonky.Client.Components { public partial class PageSizeComponent : IDisposable { - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } [Parameter] public EventCallback OnChanged { get; set; } private Dictionary Items { get; set; } = new(); private UserPref Prefs = new(); private string PageSize { get; set; } = ""; + protected override async Task OnInitializedAsync() { ProfileService.OnChange += ProfileServiceOnOnChange; Prefs = await ProfileService.GetPreferences(); PageSize = Prefs.PageSize; } + private async Task OnSelectChanged(ChangeEventArgs e) { var val = e.Value.ToString(); @@ -42,11 +44,13 @@ namespace Wonky.Client.Components await OnChanged.InvokeAsync(val); await ProfileService.SetPageSize(val); } + private void ProfileServiceOnOnChange(UserPref newUserPref) { Prefs = newUserPref; StateHasChanged(); } + public void Dispose() { ProfileService.OnChange -= ProfileServiceOnOnChange; diff --git a/Wonky.Client/Components/ProcessStateComponent.razor b/Wonky.Client/Components/ProcessStateComponent.razor index c28e80ea..11b9d7eb 100644 --- a/Wonky.Client/Components/ProcessStateComponent.razor +++ b/Wonky.Client/Components/ProcessStateComponent.razor @@ -30,6 +30,7 @@ "the-bad" => "file-earmark-check", "the-ugly" => "box2-fill", "the-dead" => "truck", + "accepted" => "hand-thumbs-up", _ => "question-square" }; } diff --git a/Wonky.Client/Components/QuoteListComponent.razor b/Wonky.Client/Components/QuoteListComponent.razor index c07e912e..e7231e02 100644 --- a/Wonky.Client/Components/QuoteListComponent.razor +++ b/Wonky.Client/Components/QuoteListComponent.razor @@ -64,20 +64,20 @@
@quote.ESalesNumber + href="/advisor/customers/@quote.Company.CompanyId/quotes/@quote.ActivityId">@quote.ESalesNumber
@if (!string.IsNullOrWhiteSpace(quote.OfficeNote)) { -
Note
+
Kontor
- @quote.OfficeNote + @quote.OfficeNote
} @if (!string.IsNullOrWhiteSpace(quote.CrmNote)) { -
CRM note
+
CRM
- @quote.CrmNote + @quote.CrmNote
} diff --git a/Wonky.Client/Components/QuoteListComponent.razor.cs b/Wonky.Client/Components/QuoteListComponent.razor.cs index 6df5a184..d5fcb0d6 100644 --- a/Wonky.Client/Components/QuoteListComponent.razor.cs +++ b/Wonky.Client/Components/QuoteListComponent.razor.cs @@ -8,11 +8,11 @@ public partial class QuoteListComponent { [Parameter] public List Quotes { get; set; } = new(); - [Parameter] public EventCallback OnChangedCallback { get; set; } + [Parameter] public EventCallback OnChangedCallback { get; set; } private async Task SetQuote(string eSalesNumber, QStatus status) { - var args = new QuoteCallbackArgs() + var args = new QCallbackArgs() { ESalesNumber = eSalesNumber, Status = status diff --git a/Wonky.Client/Components/ReportActivityLedgerComponent.razor b/Wonky.Client/Components/ReportActivityLedgerComponent.razor index 153d2759..6e804234 100644 --- a/Wonky.Client/Components/ReportActivityLedgerComponent.razor +++ b/Wonky.Client/Components/ReportActivityLedgerComponent.razor @@ -1,3 +1,4 @@ +@using Wonky.Entity.Views @* // Copyright (C) 2022 FCS Frede's Computer Services. // This program is free software: you can redistribute it and/or modify @@ -84,4 +85,8 @@
KundeNote sas Beløb
@if (activity.Lines.Any() && activity.StatusTypeEnum == "Order") { - + }
-
\ No newline at end of file + + +@code{ + [Parameter] public ReportData ReportData { get; set; } = new(); +} \ No newline at end of file diff --git a/Wonky.Client/Components/ReportActivityTableOfficeComponent.razor.cs b/Wonky.Client/Components/ReportActivityTableOfficeComponent.razor.cs deleted file mode 100644 index 2246eb19..00000000 --- a/Wonky.Client/Components/ReportActivityTableOfficeComponent.razor.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2022 FCS Frede's Computer Services. -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] -// - -using Microsoft.AspNetCore.Components; -using Wonky.Entity.Views; - -namespace Wonky.Client.Components; - -public partial class ReportActivityTableOfficeComponent -{ - [Parameter] public List ActivityList { get; set; } = new(); - [Inject] public NavigationManager Navigator { get; set; } - - private static string GetProcessStatus(string processStatus) - { - return processStatus.ToLower() switch - { - "express" => "the-fast", - "none" => "the-good", - "picked" => "the-bad", - "packed" => "the-ugly", - "shipped" => "the-dead", - _ => "the-draw" - }; - } - - private void ShowOrder(string companyId, string orderId) - { - Navigator.NavigateTo($"office/customers/{companyId}/orders/{orderId}"); - } -} \ No newline at end of file diff --git a/Wonky.Client/Components/ReportItemComponent.razor b/Wonky.Client/Components/ReportItemComponent.razor index ea3dedab..d37c73e6 100644 --- a/Wonky.Client/Components/ReportItemComponent.razor +++ b/Wonky.Client/Components/ReportItemComponent.razor @@ -22,7 +22,7 @@ -
+

@ReportItem.Company.Name

@if (ReportItem.Express) { @@ -134,10 +134,10 @@ @if (!string.IsNullOrWhiteSpace(@ReportItem.OfficeNote)) { -
-

+
+

@ReportItem.OfficeNote -

+

}
diff --git a/Wonky.Client/Components/TaskItemTableComponent.razor b/Wonky.Client/Components/TaskItemTableComponent.razor index 43068588..6281fa74 100644 --- a/Wonky.Client/Components/TaskItemTableComponent.razor +++ b/Wonky.Client/Components/TaskItemTableComponent.razor @@ -47,7 +47,7 @@ - + @@ -64,7 +64,7 @@ @if (task.TaskTypeEnum is "Recall") { - + } @@ -81,7 +81,7 @@ } - + } else { diff --git a/Wonky.Client/Components/TaskItemTableComponent.razor.cs b/Wonky.Client/Components/TaskItemTableComponent.razor.cs index 2ee6e492..eb192f1f 100644 --- a/Wonky.Client/Components/TaskItemTableComponent.razor.cs +++ b/Wonky.Client/Components/TaskItemTableComponent.razor.cs @@ -61,6 +61,10 @@ namespace Wonky.Client.Components _confirmationModal.Show(); } + private void OnCancelCallback() + { + _confirmationModal.Hide(); + } /// /// Delete task call back /// diff --git a/Wonky.Client/Components/TopbarNavigation.razor b/Wonky.Client/Components/TopbarNavigation.razor index 98f967d5..d67b2685 100644 --- a/Wonky.Client/Components/TopbarNavigation.razor +++ b/Wonky.Client/Components/TopbarNavigation.razor @@ -19,9 +19,9 @@
- - - + + +
\ No newline at end of file diff --git a/Wonky.Client/Components/WorkDateComponent.razor b/Wonky.Client/Components/WorkDateComponent.razor index e9e1d862..6a10e4f0 100644 --- a/Wonky.Client/Components/WorkDateComponent.razor +++ b/Wonky.Client/Components/WorkDateComponent.razor @@ -21,8 +21,8 @@
-
- @SelectedDate.ToLongDateString() +
+ d. @(SelectedDate.Day)/@(SelectedDate.Month)
diff --git a/Wonky.Client/Components/WorkplaceListComponent.razor b/Wonky.Client/Components/WorkplaceListComponent.razor index 1c86ad95..04aedadf 100644 --- a/Wonky.Client/Components/WorkplaceListComponent.razor +++ b/Wonky.Client/Components/WorkplaceListComponent.razor @@ -14,7 +14,7 @@
@foreach (var workplace in Workplaces) { - +
@workplace.Name diff --git a/Wonky.Client/Helpers/Utils.cs b/Wonky.Client/Helpers/Utils.cs index 74fd9cdb..58d333b2 100644 --- a/Wonky.Client/Helpers/Utils.cs +++ b/Wonky.Client/Helpers/Utils.cs @@ -18,9 +18,27 @@ using System.Net.Mail; using Wonky.Entity.DTO; namespace Wonky.Client.Helpers; - +/// +/// Utilities +/// public static class Utils { + /// + /// return Country Name from countryCode + /// + /// + /// + public static string CountryName(string countryCode) + { + return countryCode.ToLower() switch + { + "dk" => "Danmark", + "no" => "Norge", + "se" => "Sverige", + _ => "" + }; + } + /// /// Helper to parse querystring /// @@ -128,7 +146,8 @@ public static class Utils "picked" => "the-bad", "packed" => "the-ugly", "shipped" => "the-dead", - _ => "question-square" + "accepted" => "accepted", + _ => "question" }; } } \ No newline at end of file diff --git a/Wonky.Client/Helpers/VatUtils.cs b/Wonky.Client/Helpers/VatUtils.cs index c2e05e51..d01aa955 100644 --- a/Wonky.Client/Helpers/VatUtils.cs +++ b/Wonky.Client/Helpers/VatUtils.cs @@ -14,6 +14,9 @@ // using System.Globalization; +using System.Reflection.Metadata.Ecma335; +using System.Runtime.CompilerServices; +using System.Text.RegularExpressions; namespace Wonky.Client.Helpers; @@ -29,11 +32,11 @@ public class VatUtils /// public static bool ValidateFormat(string countryCode, string vatNumber) { - if (string.IsNullOrWhiteSpace(vatNumber) || string.IsNullOrWhiteSpace(countryCode) || !IsDigitsOnly(vatNumber)) + if (string.IsNullOrWhiteSpace(vatNumber) || string.IsNullOrWhiteSpace(countryCode)) return false; - + var sanitisedVat = SanitizeVatNumber(vatNumber); - + return countryCode.ToUpperInvariant() switch { "DK" => ValidateFormatDk(sanitisedVat), @@ -43,6 +46,19 @@ public class VatUtils }; } + /// + /// Sanitize Vat remove everything but digits + /// + /// + /// + public static string SanitizeVatNumber(string vatNumber) + { + if (string.IsNullOrWhiteSpace(vatNumber)) + return ""; + var regexObj = new Regex(@"[^\d]"); + return regexObj.Replace(vatNumber, ""); + } + /// /// Validate string is only numbers /// @@ -96,6 +112,34 @@ public class VatUtils /// /// private static bool ValidateFormatSe(string vatNumber) + { + var vatToCheck = vatNumber; + if (long.Parse(vatToCheck) == 0) + return false; + + switch (vatToCheck.Length) + { + // if less than 10 chars validate as SSI + case 6: + return ValidateFormatSeExt(vatToCheck); + case < 10: + return false; + case > 10: + vatNumber = vatNumber[..10]; + break; + } + // calculate check digit + var c10 = C10(vatToCheck); + // return comparison + return $"{vatToCheck[..9]}{c10}" == vatNumber; + } + + /// + /// Calculate check digit for swedish org number + /// + /// + /// + private static int C10(string orgNumber) { // https://wiki.scn.sap.com/wiki/display/CRM/Sweden // 12 digits 0 to 9 @@ -104,23 +148,57 @@ public class VatUtils // Si = int(Ci/5) + (Ci*2)MOD10) // https://www.skatteverket.se/skatter/mervardesskattmoms/momsregistreringsnummer.4.18e1b10334ebe8bc80002649.html // C11 C12 == 01 (De två sista siffrorna är alltid 01) - var vatToCheck = vatNumber; - if (vatToCheck.Length < 10 || long.Parse(vatToCheck) == 0) - return false; - + var r = new[] { 0, 2, 4, 6, 8 } - .Sum(m => (int)char.GetNumericValue(vatToCheck[m]) / 5 + - (int)char.GetNumericValue(vatToCheck[m]) * 2 % 10); - var c1 = new[] { 1, 3, 5, 7 }.Sum(m => (int)char.GetNumericValue(vatToCheck[m])); - var c10 = (10 - (r + c1) % 10) % 10; - if (vatToCheck.Length == 10) - { - return $"{vatToCheck[..9]}{c10}" == vatNumber; - } + .Sum(m => (int)char.GetNumericValue(orgNumber[m]) / 5 + + (int)char.GetNumericValue(orgNumber[m]) * 2 % 10); + var c1 = new[] { 1, 3, 5, 7 }.Sum(m => (int)char.GetNumericValue(orgNumber[m])); + var c10 = (10 - (r + c1) % 10) % 10; + return c10; + // end check digit calculation - return $"{vatToCheck[..9]}{c10}01" == vatNumber; } - + /// + /// + /// + /// + /// + private static bool ValidateFormatSeExt(string data) + { + // Swedish personally held companies uses SSN number + // a relaxed validation is required as only first 6 digits is supplied + // birthday format e.g. 991231 yyMMdd + + var y = int.Parse(data[..2]); + var m = int.Parse(data[2..4]); + var d = int.Parse(data[4..6]); + // this calculation is only valid within 21st century + var leap = y % 4 == 0; // 2000 was a leap year; + // day + if(d is < 1 or > 31) + return false; + // month + switch (m) + { + // feb + case 2: + { + if (leap) + return d <= 29; + return d <= 28; + } + // apr, jun, sep, nov + case 4 or 6 or 9 or 11: + return d <= 30; + // jan, mar, may, july, aug, oct, dec + case 1 or 3 or 5 or 7 or 8 or 10 or 12: + return true; + // does not exist + default: + return false; + } + } + /// /// Modulus11 validator /// @@ -139,19 +217,4 @@ public class VatUtils return sum % 11 == 0; } - - /// - /// Sanitize Vat number to it's raw numbers - /// - /// - /// - private static string SanitizeVatNumber(string vatNumber) - { - return vatNumber.Replace(" ", "") - .Replace("-", "") - .Replace("DK", "") - .Replace("NO", "") - .Replace("SE", "") - .Replace("MVA", ""); - } } \ No newline at end of file diff --git a/Wonky.Client/HttpInterceptors/HttpInterceptorService.cs b/Wonky.Client/HttpInterceptors/HttpInterceptorService.cs index de952483..59ea29f4 100644 --- a/Wonky.Client/HttpInterceptors/HttpInterceptorService.cs +++ b/Wonky.Client/HttpInterceptors/HttpInterceptorService.cs @@ -15,6 +15,7 @@ using System.Net; using System.Net.Http.Headers; +using System.Text.Json; using System.Threading.Tasks; using Blazored.LocalStorage; using Blazored.Toast.Services; @@ -31,7 +32,7 @@ namespace Wonky.Client.HttpInterceptors private readonly NavigationManager _navigation; private readonly IToastService _toast; private readonly RefreshTokenService _refreshTokenService; - private ILogger _logger; + private readonly ILogger _logger; private readonly ILocalStorageService _storage; private readonly IAuthenticationService _authenticationService; @@ -86,35 +87,37 @@ namespace Wonky.Client.HttpInterceptors if (e.Response == null || e.Response.IsSuccessStatusCode) return; - var message = "En fejl er opstået"; + var message = $"En fejl er opstået \n {JsonSerializer.Serialize(e)}"; var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri); if (currDoc.Contains("login/")) currDoc = ""; switch (e.Response.StatusCode) { - case HttpStatusCode.NotFound: + case HttpStatusCode.NotFound: _logger.LogDebug("NotFound <= {}", currDoc); break; case HttpStatusCode.BadRequest: _logger.LogDebug("BadRequest <= {}", currDoc); + _logger.LogDebug("{}", message); break; case HttpStatusCode.Unauthorized: + _logger.LogDebug("Unauthorized <= {}", currDoc); + _logger.LogDebug("{}", message); _authenticationService.Logout(); _navigation.NavigateTo($"/login/{currDoc}"); - message = "Venligst login ..."; - _toast.ShowInfo(message); + _toast.ShowInfo("Venligst Login. Tak."); break; case HttpStatusCode.Conflict: _logger.LogDebug("Conflict <= {}", currDoc); + _logger.LogDebug("{}", message); break; case HttpStatusCode.InternalServerError: - // message = "Der er interne problemer på serveren ..."; - // _toast.ShowError(message); _logger.LogDebug("InternalServerError <= {}", currDoc); + _logger.LogDebug("{}", message); break; default: - _toast.ShowError(message); + _logger.LogDebug("{}", message); break; } // throw new HttpResponseException(message); diff --git a/Wonky.Client/HttpInterfaces/IAdvisorCatalogRepository.cs b/Wonky.Client/HttpInterfaces/IAdvisorCatalogRepository.cs deleted file mode 100644 index ad55f29b..00000000 --- a/Wonky.Client/HttpInterfaces/IAdvisorCatalogRepository.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2022 FCS Frede's Computer Services. -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] -// - -using Wonky.Client.Features; -using Wonky.Entity.Requests; -using Wonky.Entity.Views; - -namespace Wonky.Client.HttpInterfaces; - -/// -/// Interface Catalog Http repository -/// -public interface IAdvisorCatalogRepository -{ - /// - /// Get a paged sales item list - /// - /// - /// - Task> GetSalesItemsPaged(CatalogPaging pagingParameters); - - /// - /// Get sales item by id - /// - /// - /// - Task GetSalesItemId(string salesItemId); - - /// - /// Overload Get sales item by sku and country code - /// - /// - /// - /// - Task GetSalesItemSku(string countryCode, string sku); - - /// - /// Get sales item by variant id - /// - /// - /// - Task GetSalesVariantId(string variantId); - - /// - /// Complete catalog for print - /// - /// - Task> GetPriceList(); - - /// - /// Complete catalog for print country - /// - /// - /// - Task> GetPriceList(string countryCode); -} \ No newline at end of file diff --git a/Wonky.Client/HttpInterfaces/IAdvisorCustomerHistoryRepository.cs b/Wonky.Client/HttpInterfaces/IAdvisorCustomerHistoryRepository.cs index b02c3ae5..8233c00d 100644 --- a/Wonky.Client/HttpInterfaces/IAdvisorCustomerHistoryRepository.cs +++ b/Wonky.Client/HttpInterfaces/IAdvisorCustomerHistoryRepository.cs @@ -66,5 +66,5 @@ public interface IAdvisorCustomerHistoryRepository /// /// /// - Task ErpInvoiceToCrmRpc(string companyId, string syncDate); + Task InvoiceErpToCrmRpc(string companyId, string syncDate); } \ No newline at end of file diff --git a/Wonky.Client/HttpInterfaces/IWorkplaceRepository.cs b/Wonky.Client/HttpInterfaces/IAdvisorWorkplaceRepository.cs similarity index 98% rename from Wonky.Client/HttpInterfaces/IWorkplaceRepository.cs rename to Wonky.Client/HttpInterfaces/IAdvisorWorkplaceRepository.cs index 1b290d2f..2bbf1c44 100644 --- a/Wonky.Client/HttpInterfaces/IWorkplaceRepository.cs +++ b/Wonky.Client/HttpInterfaces/IAdvisorWorkplaceRepository.cs @@ -21,7 +21,7 @@ namespace Wonky.Client.HttpInterfaces; /// /// Interface for handling Customer Workplaces (chemical document service) /// -public interface IWorkplaceRepository +public interface IAdvisorWorkplaceRepository { /// /// Get Workplaces for given customer id diff --git a/Wonky.Client/HttpInterfaces/ICountryCatalogRepository.cs b/Wonky.Client/HttpInterfaces/IOfficeCatalogRepository.cs similarity index 96% rename from Wonky.Client/HttpInterfaces/ICountryCatalogRepository.cs rename to Wonky.Client/HttpInterfaces/IOfficeCatalogRepository.cs index 599f493d..f905a02d 100644 --- a/Wonky.Client/HttpInterfaces/ICountryCatalogRepository.cs +++ b/Wonky.Client/HttpInterfaces/IOfficeCatalogRepository.cs @@ -28,9 +28,9 @@ public interface ICountryCatalogRepository /// Get a paged sales item list /// /// - /// + /// /// - Task> GetSalesItemsPaged(string countryCode, CatalogPaging paging); + Task> GetSalesItemsPaged(string countryCode, CatalogPager pager); /// /// Get sales item by id diff --git a/Wonky.Client/HttpInterfaces/ICountryCustomerHistoryRepository.cs b/Wonky.Client/HttpInterfaces/IOfficeCustomerHistoryRepository.cs similarity index 97% rename from Wonky.Client/HttpInterfaces/ICountryCustomerHistoryRepository.cs rename to Wonky.Client/HttpInterfaces/IOfficeCustomerHistoryRepository.cs index f6cc466d..1fa695b4 100644 --- a/Wonky.Client/HttpInterfaces/ICountryCustomerHistoryRepository.cs +++ b/Wonky.Client/HttpInterfaces/IOfficeCustomerHistoryRepository.cs @@ -66,5 +66,5 @@ public interface ICountryCustomerHistoryRepository /// /// /// - Task ErpInvoiceToCrmRpc(string countryCode, string companyId, string syncDate); + Task InvoiceErpToCrmRpc(string countryCode, string companyId, string syncDate); } \ No newline at end of file diff --git a/Wonky.Client/HttpInterfaces/ICountryCustomerRepository.cs b/Wonky.Client/HttpInterfaces/IOfficeCustomerRepository.cs similarity index 100% rename from Wonky.Client/HttpInterfaces/ICountryCustomerRepository.cs rename to Wonky.Client/HttpInterfaces/IOfficeCustomerRepository.cs diff --git a/Wonky.Client/HttpInterfaces/ICountryReportRepository.cs b/Wonky.Client/HttpInterfaces/IOfficeReportRepository.cs similarity index 100% rename from Wonky.Client/HttpInterfaces/ICountryReportRepository.cs rename to Wonky.Client/HttpInterfaces/IOfficeReportRepository.cs diff --git a/Wonky.Client/HttpInterfaces/IWarehouseRepository.cs b/Wonky.Client/HttpInterfaces/IOrderProcessRepository.cs similarity index 90% rename from Wonky.Client/HttpInterfaces/IWarehouseRepository.cs rename to Wonky.Client/HttpInterfaces/IOrderProcessRepository.cs index 7d5eeefd..033184d2 100644 --- a/Wonky.Client/HttpInterfaces/IWarehouseRepository.cs +++ b/Wonky.Client/HttpInterfaces/IOrderProcessRepository.cs @@ -13,6 +13,7 @@ // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // +using Wonky.Entity.DTO; using Wonky.Entity.Views; namespace Wonky.Client.HttpInterfaces; @@ -20,7 +21,7 @@ namespace Wonky.Client.HttpInterfaces; /// /// Interface for processing orders in warehouse /// -public interface IWarehouseRepository +public interface IOrderProcessRepository { /// /// Get warehouse order list by date @@ -47,7 +48,7 @@ public interface IWarehouseRepository /// /// Update Order status setting new process status /// - /// + /// /// - Task UpdateWarehouseOrderStatus(WarehouseProcess process); + Task UpdateWarehouseOrderStatus(OrderProcessState processState); } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/AdvisorActivityRepository.cs b/Wonky.Client/HttpRepository/AdvisorActivityRepository.cs index 098a089c..fd63cc42 100644 --- a/Wonky.Client/HttpRepository/AdvisorActivityRepository.cs +++ b/Wonky.Client/HttpRepository/AdvisorActivityRepository.cs @@ -36,7 +36,7 @@ public class AdvisorActivityRepository : IAdvisorActivityRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private readonly ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _api; @@ -166,7 +166,7 @@ public class AdvisorActivityRepository : IAdvisorActivityRepository { Code = 404, IsSuccess = false, - Message = "Uventet svare fra server", + Message = "Uventet svar fra server", Id = "" }; } diff --git a/Wonky.Client/HttpRepository/AdvisorCatalogRepository.cs b/Wonky.Client/HttpRepository/AdvisorCatalogRepository.cs deleted file mode 100644 index 63d270cb..00000000 --- a/Wonky.Client/HttpRepository/AdvisorCatalogRepository.cs +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (C) 2022 FCS Frede's Computer Services. -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] -// - -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Json; -using System.Text.Json; -using System.Threading.Tasks; -using Wonky.Client.Features; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.WebUtilities; -using Microsoft.Extensions.Options; -using Wonky.Client.HttpInterfaces; -using Wonky.Entity.Configuration; -using Wonky.Entity.DTO; -using Wonky.Entity.Requests; -using Wonky.Entity.Views; - -namespace Wonky.Client.HttpRepository; - -public class AdvisorCatalogRepository : IAdvisorCatalogRepository -{ - private readonly JsonSerializerOptions _options = new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - }; - - private readonly NavigationManager _navigation; - private ILogger _logger; - private readonly HttpClient _client; - private readonly ApiConfig _apiConfig; - - public AdvisorCatalogRepository(HttpClient client, - ILogger logger, - NavigationManager navigation, IOptions configuration) - { - _client = client; - _logger = logger; - _navigation = navigation; - _apiConfig = configuration.Value; - } - - /// - /// Get a paged sales item list - /// - /// - /// - public async Task> GetSalesItemsPaged(CatalogPaging pagingParameters) - { - var queryString = new Dictionary - { - ["pageNumber"] = pagingParameters.PageNumber.ToString(), - ["pageSize"] = pagingParameters.PageSize.ToString(), - ["orderBy"] = pagingParameters.OrderBy, - ["searchColumn"] = pagingParameters.SearchColumn, - ["searchTerm"] = pagingParameters.SearchTerm, - ["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup, - }; - var response = await _client - .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/page", queryString)); - - if (!response.IsSuccessStatusCode) - { - return new PagingResponse - { - Items = new List(), - MetaData = new MetaData() - }; - } - var content = await response.Content.ReadAsStringAsync(); - - var pagingResponse = new PagingResponse - { - Items = JsonSerializer.Deserialize>(content, _options), - MetaData = JsonSerializer.Deserialize( - response.Headers.GetValues("X-Pagination").First(), _options) - }; - return pagingResponse; - } - - /// - /// Get a paged sales item list for country - /// - /// - /// - /// - public async Task> GetSalesItemsPaged(CatalogPaging pagingParameters, string countryCode) - { - var queryString = new Dictionary - { - ["pageNumber"] = pagingParameters.PageNumber.ToString(), - ["pageSize"] = pagingParameters.PageSize.ToString(), - ["orderBy"] = pagingParameters.OrderBy, - ["searchColumn"] = pagingParameters.SearchColumn, - ["searchTerm"] = pagingParameters.SearchTerm, - ["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup, - }; - var response = await _client - .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/page", queryString)); - - if (!response.IsSuccessStatusCode) - { - return new PagingResponse - { - Items = new List(), - MetaData = new MetaData() - }; - } - var content = await response.Content.ReadAsStringAsync(); - - var pagingResponse = new PagingResponse - { - Items = JsonSerializer.Deserialize>(content, _options), - MetaData = JsonSerializer.Deserialize( - response.Headers.GetValues("X-Pagination").First(), _options) - }; - return pagingResponse; - } - - /// - /// Get sales item by id - /// - /// - /// - public async Task GetSalesItemId(string salesItemId) - { - var salesItem = await _client - .GetFromJsonAsync($"{_apiConfig.Catalog}/{salesItemId}"); - return salesItem ?? new SalesItemView(); - } - - /// - /// Overload Get sales item by sku and country code - /// - /// - /// - /// - public async Task GetSalesItemSku(string countryCode, string sku) - { - var salesItem = await _client.GetFromJsonAsync($"{_apiConfig.Catalog}/sku/{countryCode}/{sku}"); - return salesItem ?? new SalesItemView(); - } - - /// - /// Get sales item by variant id - /// - /// - /// - public async Task GetSalesVariantId(string variantId) - { - var salesItem = await _client - .GetFromJsonAsync($"{_apiConfig.Catalog}/variant/{variantId}"); - return salesItem ?? new SalesItemView(); - } - - /// - /// Complete catalog for print - /// - /// - public async Task> GetPriceList() - { - return await _client.GetFromJsonAsync>($"{_apiConfig.Catalog}", _options); - } - - /// - /// Complete catalog for print country - /// - /// - /// - public async Task> GetPriceList(string countryCode) - { - return await _client.GetFromJsonAsync>($"{_apiConfig.Catalog}/{countryCode}", _options); - } -} \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/AdvisorCustomerHistoryRepository.cs b/Wonky.Client/HttpRepository/AdvisorCustomerHistoryRepository.cs index 3024b837..fc292b80 100644 --- a/Wonky.Client/HttpRepository/AdvisorCustomerHistoryRepository.cs +++ b/Wonky.Client/HttpRepository/AdvisorCustomerHistoryRepository.cs @@ -128,9 +128,9 @@ public class AdvisorCustomerHistoryRepository : IAdvisorCustomerHistoryRepositor /// /// /// - public async Task ErpInvoiceToCrmRpc(string companyId, string syncDate) + public async Task InvoiceErpToCrmRpc(string companyId, string syncDate) { - var x = await _client.GetAsync($"{_api.CrmCustomers}/{companyId}/{_api.CrmRpcSyncExt}/{syncDate}"); + var x = await _client.GetAsync($"{_api.SyncRpc}/companies/{companyId}/{_api.SyncRpcInvoiceExt}/{syncDate}"); if (!x.IsSuccessStatusCode) return string.Empty; var content = await x.Content.ReadAsStringAsync(); diff --git a/Wonky.Client/HttpRepository/AdvisorCustomerRepository.cs b/Wonky.Client/HttpRepository/AdvisorCustomerRepository.cs index 63ba1bcd..1c74a002 100644 --- a/Wonky.Client/HttpRepository/AdvisorCustomerRepository.cs +++ b/Wonky.Client/HttpRepository/AdvisorCustomerRepository.cs @@ -189,6 +189,8 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository }; var response = await _client.PutAsJsonAsync($"{_conf.CrmCustomers}/{companyId}/vat", model, _options); var content = await response.Content.ReadAsStringAsync(); - return JsonSerializer.Deserialize(content); + return response.IsSuccessStatusCode + ? JsonSerializer.Deserialize(content) + : new CompanyDto{Name = "ERROR", VatNumber = vatNumber, CrmNotes = $"FEJL: {content}"}; } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/AdvisorReportRepository.cs b/Wonky.Client/HttpRepository/AdvisorReportRepository.cs index 4f09c0b2..03454ca0 100644 --- a/Wonky.Client/HttpRepository/AdvisorReportRepository.cs +++ b/Wonky.Client/HttpRepository/AdvisorReportRepository.cs @@ -35,7 +35,7 @@ public class AdvisorReportRepository : IAdvisorReportRepository private readonly NavigationManager _navigation; private ILogger _logger; private readonly HttpClient _client; - private readonly ApiConfig _apiConfig; + private readonly ApiConfig _api; public AdvisorReportRepository(HttpClient client, ILogger logger, @@ -44,7 +44,7 @@ public class AdvisorReportRepository : IAdvisorReportRepository _client = client; _logger = logger; _navigation = navigation; - _apiConfig = configuration.Value; + _api = configuration.Value; } /// @@ -55,7 +55,7 @@ public class AdvisorReportRepository : IAdvisorReportRepository public async Task ReportExist(string workDate) { var result = await _client.GetFromJsonAsync( - $"{_apiConfig.CrmReports}/exist/{workDate}"); + $"{_api.CrmReports}/exist/{workDate}"); return result.ReportClosed; } @@ -65,7 +65,7 @@ public class AdvisorReportRepository : IAdvisorReportRepository /// public async Task> GetReports() { - var result = await _client.GetAsync($"{_apiConfig.CrmReports}"); + var result = await _client.GetAsync($"{_api.CrmReports}"); if (!result.IsSuccessStatusCode) return new List(); return await result.Content.ReadFromJsonAsync>(); @@ -78,7 +78,7 @@ public class AdvisorReportRepository : IAdvisorReportRepository /// public async Task GetReport(string workDate) { - var result = await _client.GetFromJsonAsync($"{_apiConfig.CrmReports}/{workDate}"); + var result = await _client.GetFromJsonAsync($"{_api.CrmReports}/{workDate}"); return result ?? new ReportView(); } @@ -90,7 +90,7 @@ public class AdvisorReportRepository : IAdvisorReportRepository public async Task InitializeReportData(string workDate) { var initData = await _client - .GetFromJsonAsync($"{_apiConfig.CrmReports}/init/{workDate}"); + .GetFromJsonAsync($"{_api.CrmReports}/init/{workDate}"); return initData ?? new ReportInitDto(); } @@ -103,7 +103,7 @@ public class AdvisorReportRepository : IAdvisorReportRepository public async Task CreateReport(string workDate, ReportDto reportDto) { var response = await _client - .PostAsJsonAsync($"{_apiConfig.CrmReports}/{workDate}", reportDto, _options); + .PostAsJsonAsync($"{_api.CrmReports}/{workDate}", reportDto, _options); if (!response.IsSuccessStatusCode) return new ApiResponseView { diff --git a/Wonky.Client/HttpRepository/WorkplaceRepository.cs b/Wonky.Client/HttpRepository/AdvisorWorkplaceRepository.cs similarity index 94% rename from Wonky.Client/HttpRepository/WorkplaceRepository.cs rename to Wonky.Client/HttpRepository/AdvisorWorkplaceRepository.cs index 5bd5b54d..ec67ba9a 100644 --- a/Wonky.Client/HttpRepository/WorkplaceRepository.cs +++ b/Wonky.Client/HttpRepository/AdvisorWorkplaceRepository.cs @@ -24,7 +24,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.HttpRepository; -public class WorkplaceRepository : IWorkplaceRepository +public class AdvisorWorkplaceRepository : IAdvisorWorkplaceRepository { private readonly JsonSerializerOptions? _options = new JsonSerializerOptions { @@ -32,12 +32,12 @@ public class WorkplaceRepository : IWorkplaceRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _api; - public WorkplaceRepository(HttpClient client, - ILogger logger, + public AdvisorWorkplaceRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions configuration) { diff --git a/Wonky.Client/HttpRepository/CountryCatalogRepository.cs b/Wonky.Client/HttpRepository/CountryCatalogRepository.cs index a1006d0d..f8f18e64 100644 --- a/Wonky.Client/HttpRepository/CountryCatalogRepository.cs +++ b/Wonky.Client/HttpRepository/CountryCatalogRepository.cs @@ -41,7 +41,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository private readonly NavigationManager _navigation; private ILogger _logger; private readonly HttpClient _client; - private readonly ApiConfig _apiConfig; + private readonly ApiConfig _api; public CountryCatalogRepository(HttpClient client, ILogger logger, @@ -50,28 +50,28 @@ public class CountryCatalogRepository : ICountryCatalogRepository _client = client; _logger = logger; _navigation = navigation; - _apiConfig = configuration.Value; + _api = configuration.Value; } /// /// Get a paged sales item list /// /// - /// + /// /// - public async Task> GetSalesItemsPaged(string countryCode, CatalogPaging paging) + public async Task> GetSalesItemsPaged(string countryCode, CatalogPager pager) { var queryString = new Dictionary { - ["pageNumber"] = paging.PageNumber.ToString(), - ["pageSize"] = paging.PageSize.ToString(), - ["orderBy"] = paging.OrderBy, - ["searchColumn"] = paging.SearchColumn, - ["searchTerm"] = paging.SearchTerm, - ["selectGroup"] = paging.SelectGroup == "0" ? "" : paging.SelectGroup + ["pageNumber"] = pager.PageNumber.ToString(), + ["pageSize"] = pager.PageSize.ToString(), + ["orderBy"] = pager.OrderBy, + ["searchColumn"] = pager.SearchColumn, + ["searchTerm"] = pager.SearchTerm, + ["selectGroup"] = pager.SelectGroup == "0" ? "" : pager.SelectGroup }; var response = await _client - .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/country/{countryCode}/page", queryString)); + .GetAsync(QueryHelpers.AddQueryString($"{_api.Catalog}/{countryCode}/page", queryString)); if (!response.IsSuccessStatusCode) { @@ -102,7 +102,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository public async Task GetSalesItemId(string countryCode, string salesItemId) { var salesItem = await _client - .GetFromJsonAsync($"{_apiConfig.Catalog}/country/{countryCode}/{salesItemId}"); + .GetFromJsonAsync($"{_api.Catalog}/{countryCode}/{salesItemId}"); return salesItem ?? new SalesItemView(); } @@ -114,7 +114,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository /// public async Task GetSalesItemSku(string countryCode, string sku) { - var salesItem = await _client.GetFromJsonAsync($"{_apiConfig.Catalog}/country/{countryCode}/sku/{sku}"); + var salesItem = await _client.GetFromJsonAsync($"{_api.Catalog}/{countryCode}/sku/{sku}"); return salesItem ?? new SalesItemView(); } @@ -127,7 +127,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository public async Task GetSalesVariantId(string countryCode, string variantId) { var salesItem = await _client - .GetFromJsonAsync($"{_apiConfig.Catalog}/country/{countryCode}/variant/{variantId}"); + .GetFromJsonAsync($"{_api.Catalog}/{countryCode}/variant/{variantId}"); return salesItem ?? new SalesItemView(); } @@ -138,6 +138,6 @@ public class CountryCatalogRepository : ICountryCatalogRepository /// public async Task> GetPriceList(string countryCode) { - return await _client.GetFromJsonAsync>($"{_apiConfig.Catalog}/country/{countryCode}", _options); + return await _client.GetFromJsonAsync>($"{_api.Catalog}/{countryCode}", _options); } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/CountryCustomerHistoryRepository.cs b/Wonky.Client/HttpRepository/OfficeCustomerHistoryRepository.cs similarity index 97% rename from Wonky.Client/HttpRepository/CountryCustomerHistoryRepository.cs rename to Wonky.Client/HttpRepository/OfficeCustomerHistoryRepository.cs index 93e9aa77..5b3a9e54 100644 --- a/Wonky.Client/HttpRepository/CountryCustomerHistoryRepository.cs +++ b/Wonky.Client/HttpRepository/OfficeCustomerHistoryRepository.cs @@ -134,9 +134,9 @@ public class CountryCustomerHistoryRepository : ICountryCustomerHistoryRepositor /// /// /// - public async Task ErpInvoiceToCrmRpc(string countryCode, string companyId, string syncDate) + public async Task InvoiceErpToCrmRpc(string countryCode, string companyId, string syncDate) { - var x = await _client.GetAsync($"{_api.OfficeCustomers}/{countryCode}/{companyId}/{_api.CrmRpcSyncExt}/{syncDate}"); + var x = await _client.GetAsync($"{_api.OfficeCustomers}/{countryCode}/{companyId}/{_api.SyncRpcInvoiceExt}/{syncDate}"); if (!x.IsSuccessStatusCode) return string.Empty; var content = await x.Content.ReadAsStringAsync(); diff --git a/Wonky.Client/HttpRepository/CountryCustomerRepository.cs b/Wonky.Client/HttpRepository/OfficeCustomerRepository.cs similarity index 99% rename from Wonky.Client/HttpRepository/CountryCustomerRepository.cs rename to Wonky.Client/HttpRepository/OfficeCustomerRepository.cs index 5669600f..8cc6b9b8 100644 --- a/Wonky.Client/HttpRepository/CountryCustomerRepository.cs +++ b/Wonky.Client/HttpRepository/OfficeCustomerRepository.cs @@ -145,5 +145,4 @@ public class CountryCustomerRepository : ICountryCustomerRepository Console.WriteLine(content); return response.IsSuccessStatusCode; } - } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/CountryReportRepository.cs b/Wonky.Client/HttpRepository/OfficeReportRepository.cs similarity index 97% rename from Wonky.Client/HttpRepository/CountryReportRepository.cs rename to Wonky.Client/HttpRepository/OfficeReportRepository.cs index 38b67849..79e2192f 100644 --- a/Wonky.Client/HttpRepository/CountryReportRepository.cs +++ b/Wonky.Client/HttpRepository/OfficeReportRepository.cs @@ -55,7 +55,7 @@ public class CountryReportRepository : ICountryReportRepository public async Task ReportExist(string salesRepId, string workDate) { var result = await _client.GetFromJsonAsync( - $"{_apiConfig.OfficeReports}/exist/{workDate}"); + $"{_apiConfig.OfficeReports}/{salesRepId}/{workDate}/exist"); return result.ReportClosed; } /// diff --git a/Wonky.Client/HttpRepository/WarehouseRepository.cs b/Wonky.Client/HttpRepository/OrderProcessRepository.cs similarity index 87% rename from Wonky.Client/HttpRepository/WarehouseRepository.cs rename to Wonky.Client/HttpRepository/OrderProcessRepository.cs index d5e8df73..edf9f3a0 100644 --- a/Wonky.Client/HttpRepository/WarehouseRepository.cs +++ b/Wonky.Client/HttpRepository/OrderProcessRepository.cs @@ -19,11 +19,12 @@ using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Options; using Wonky.Client.HttpInterfaces; using Wonky.Entity.Configuration; +using Wonky.Entity.DTO; using Wonky.Entity.Views; namespace Wonky.Client.HttpRepository; -public class WarehouseRepository : IWarehouseRepository +public class OrderProcessRepository : IOrderProcessRepository { private readonly JsonSerializerOptions? _options = new JsonSerializerOptions { @@ -31,12 +32,12 @@ public class WarehouseRepository : IWarehouseRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _api; - public WarehouseRepository(HttpClient client, - ILogger logger, + public OrderProcessRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions configuration) { @@ -81,11 +82,11 @@ public class WarehouseRepository : IWarehouseRepository /// /// Update Order status setting new process status /// - /// + /// /// - public async Task UpdateWarehouseOrderStatus(WarehouseProcess process) + public async Task UpdateWarehouseOrderStatus(OrderProcessState processState) { - _logger.LogDebug("process => {}", JsonSerializer.Serialize(process, _options)); - await _client.PutAsJsonAsync($"{_api.Warehouse}/{process.OrderId}", process, _options); + _logger.LogDebug("process => {}", JsonSerializer.Serialize(processState, _options)); + await _client.PutAsJsonAsync($"{_api.Warehouse}/{processState.OrderId}", processState, _options); } } \ No newline at end of file diff --git a/Wonky.Client/Models/PStatus.cs b/Wonky.Client/Models/PStatus.cs index bb693341..efc39909 100644 --- a/Wonky.Client/Models/PStatus.cs +++ b/Wonky.Client/Models/PStatus.cs @@ -7,5 +7,6 @@ public enum PStatus Packed, Shipped, All, - Express + Express, + Accepted } \ No newline at end of file diff --git a/Wonky.Client/Models/QuoteCallbackArgs.cs b/Wonky.Client/Models/QCallbackArgs.cs similarity index 88% rename from Wonky.Client/Models/QuoteCallbackArgs.cs rename to Wonky.Client/Models/QCallbackArgs.cs index 3116308a..7813233f 100644 --- a/Wonky.Client/Models/QuoteCallbackArgs.cs +++ b/Wonky.Client/Models/QCallbackArgs.cs @@ -1,6 +1,6 @@ namespace Wonky.Client.Models; -public class QuoteCallbackArgs +public class QCallbackArgs { /// /// ESalesNumber diff --git a/Wonky.Client/Pages/AdvisorCreateActivityPage.razor b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor similarity index 70% rename from Wonky.Client/Pages/AdvisorCreateActivityPage.razor rename to Wonky.Client/Pages/AdvisorActivityCreatePage.razor index 1aa03ab5..2261bb63 100644 --- a/Wonky.Client/Pages/AdvisorCreateActivityPage.razor +++ b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor @@ -18,21 +18,23 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components @attribute [Authorize(Roles = "Advisor")] -@page "/customers/{CompanyId}/activities/new" +@page "/advisor/customers/{CompanyId}/activities/new" + +Ny aktivitet - @Company.Name
- +
-@if (!string.IsNullOrWhiteSpace(_company.Blocked)) +@if (!string.IsNullOrWhiteSpace(Company.Blocked)) {
-

Ring til kontoret. Denne konto er spærret med kode '@_company.Blocked'

+

Ring til kontoret. Denne konto er spærret med kode '@Company.Blocked'

} -
+

@Activity.Name - @Activity.Account

@@ -52,9 +54,9 @@ else -
- -
+
+ +
@@ -63,11 +65,11 @@ else
- -
+ +
- @if (!string.IsNullOrEmpty(Activity.VatNumber) && !string.IsNullOrWhiteSpace(Activity.Address1) && _company.HasFolded == 0) + @if (!string.IsNullOrEmpty(Activity.VatNumber) && !string.IsNullOrWhiteSpace(Activity.Address1) && Company.HasFolded == 0) { @if (DraftProvider.Draft.DraftType == "order") { @@ -97,66 +99,78 @@ else
}
-
-
- -
+ +
- -
+ +
-
-
- -
+ +
- -
+ +
-
-
- -
- - -
- - -
- - -
-
- -
- -
+ +
- -
+ +
-
+ + +
+ + +
+ +
+ + +
+ +
+ +
+ + +
+
+ +
+
+ +
+
+ + @* *@ +
+
+ +
+
+
- @* Order lines -----------------------------------------------------*@ + @* Draft lines in draft -----------------------------------------------------*@
@@ -207,7 +221,7 @@ else @@ -216,7 +230,7 @@ else
@($"{DraftProvider.Draft.Total:N2}") -
- @* draft line ----------------------------------------------------- *@ + @* Create Draft line ----------------------------------------------------- *@
@if (!string.IsNullOrWhiteSpace(SelectedItem.Name) && ShowItem) @@ -227,9 +241,9 @@ else Kladdelinje - Antal - Pris - Rabat + Antal + Pris + Rabat SAS Varenr. @@ -237,18 +251,18 @@ else - + - +
-
- + @@ -256,7 +270,7 @@ else @SelectedItem.Sku - + @@ -278,31 +292,31 @@ else aria-labelledby="deliveryHeader" data-bs-parent="#crmActivity">
- +
- +
- +
- +
- +
@@ -314,16 +328,31 @@ else
- +
} - - - - - \ No newline at end of file + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorCreateActivityPage.razor.cs b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs similarity index 60% rename from Wonky.Client/Pages/AdvisorCreateActivityPage.razor.cs rename to Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs index e8a016c8..ec4393f7 100644 --- a/Wonky.Client/Pages/AdvisorCreateActivityPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs @@ -30,29 +30,30 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class AdvisorCreateActivityPage : IDisposable +public partial class AdvisorActivityCreatePage : IDisposable { - // Parameters - [CascadingParameter] DraftStateProvider DraftProvider { get; set; } - [Parameter] public string CompanyId { get; set; } // Services - [Inject] public ILogger Logger { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public UserProfileService Profiles { get; set; } - [Inject] public IToastService Toast { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public IAdvisorCatalogRepository AdvisorCatalogCrm { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private UserProfileService Profiles { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private ICountryCatalogRepository CatalogRepo { get; set; } + [Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] private IAdvisorActivityRepository ActivityRepo { get; set; } + [Inject] private IAdvisorReportRepository ReportRepo { get; set; } + [Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + + [CascadingParameter] private DraftStateProvider DraftProvider { get; set; } = new(); + [Parameter] public string CompanyId { get; set; } + // variables private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true}; private SalesItemView SelectedItem { get; set; } = new(); private UserPref UserPrefs { get; set; } = new(); private ActivityDto Activity { get; set; } = new(); - private CompanyDto _company = new(); + private CompanyDto Company = new(); private EditContext? ActivityContext { get; set; } private bool PoFormInvalid { get; set; } = true; private bool ShowItem { get; set; } @@ -64,21 +65,30 @@ public partial class AdvisorCreateActivityPage : IDisposable private bool InvalidActivity { get; set; } = true; private bool ReportClosed { get; set; } private bool Working { get; set; } = true; - private UserInfoView ThisUserInfo { get; set; } = new(); + private UserInfoView SalesRep { get; set; } = new(); private DateTime SelectedDate { get; set; } private string OldPhone { get; set; } = ""; - private string PromptDateConfirm { get; set; } = ""; - // MODAL DIALOGS - private PriceListModal PriceListModal { get; set; } = new(); - private ProductHistoryModal HistoryModal { get; set; } = new(); - private ProductPriceHistoryModal PriceHistoryModal { get; set; } = new(); - private ConfirmWorkDateModal ConfirmWorkDateModal { get; set; } = new(); - private ConfirmProductCheckModal ConfirmProductCheckModal { get; set; } = new(); + + // OVERLAY PAGES + private PriceCatalogModalOverlay CatalogOverlay { get; set; } = new(); + private ProductHistoryModalOverlay ProductOverlay { get; set; } = new(); + private ProductPriceHistoryModal PriceOverlay { get; set; } = new(); + private ConfirmWorkDateModalOverlay WorkDateOverlay { get; set; } = new(); + private ConfirmProductCheckModalOverlay ProductCheckOverlay { get; set; } = new(); + private CustomerInvoiceListModalOverlay InvoiceListOverlay { get; set; } = new(); + private CustomerInventoryListModalOverlay InventoryListOverlay { get; set; } = new(); + private CustomerActivityListModalOverlay 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(); + + private string ButtonText { get; set; } = "Gem besøg"; - - + private bool OrgWarning { get; set; } + /// /// Page initialization /// @@ -93,54 +103,55 @@ public partial class AdvisorCreateActivityPage : IDisposable // User Preferences UserPrefs = await Profiles.GetPreferences(); // User Info - ThisUserInfo = await Storage.GetItemAsync("_xu"); + SalesRep = await Storage.GetItemAsync("_xu"); // Fetch Customer from http - _company = await CompanyRepo.GetCompanyById(CompanyId); - if (_company.HasFolded == 1) + Company = await CompanyRepo.GetCompanyById(CompanyId); + if (Company.HasFolded == 1) // Company has shutdown activities Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt."; + // variable to validate if customer needs phone number update - OldPhone = _company.Phone; - if (string.IsNullOrWhiteSpace(_company.Phone) - && !string.IsNullOrWhiteSpace(_company.Account) - && _company.Account != "NY" && _company.Account.Length > 7) + OldPhone = Company.Phone; + if (string.IsNullOrWhiteSpace(Company.Phone) + && !string.IsNullOrWhiteSpace(Company.Account) + && Company.Account != "NY" && Company.Account.Length > 7) { - _company.Phone = _company.Account[..8]; + Company.Phone = Company.Account[..8]; } // Populate base activity information - Activity.BcId = _company.BcId; + Activity.BcId = Company.BcId; Activity.ActivityStatusEnum = "noSale"; - Activity.VisitTypeEnum = _company.Account is "" or "NY" ? "new" : "recall"; - Activity.CompanyId = _company.CompanyId; - Activity.SalesRepId = ThisUserInfo.Id; - Activity.SalesRep = ThisUserInfo.Advisor; - Activity.CountryCode = ThisUserInfo.CountryCode; - Activity.Account = _company.Account; - Activity.VatNumber = _company.VatNumber; - Activity.Email = _company.Email; - Activity.Phone = _company.Phone; - Activity.Mobile = _company.Mobile; - Activity.Name = _company.Name; - Activity.Address1 = _company.Address1; - Activity.Address2 = _company.Address2; - Activity.ZipCode = _company.ZipCode; - Activity.City = _company.City; - Activity.DlvName = _company.Name; - Activity.DlvAddress1 = _company.Address1; - Activity.DlvAddress2 = _company.Address2; - Activity.DlvZipCode = _company.ZipCode; - Activity.DlvCity = _company.City; + Activity.VisitTypeEnum = Company.Account is "" or "NY" ? "new" : "recall"; + Activity.CompanyId = Company.CompanyId; + Activity.SalesRepId = SalesRep.Id; + Activity.SalesRep = SalesRep.Advisor; + Activity.CountryCode = SalesRep.CountryCode; + Activity.Account = Company.Account; + Activity.VatNumber = Company.VatNumber; + Activity.Email = Company.Email; + Activity.Phone = Company.Phone; + Activity.Mobile = Company.Mobile; + Activity.Name = Company.Name; + Activity.Address1 = Company.Address1; + Activity.Address2 = Company.Address2; + Activity.ZipCode = Company.ZipCode; + Activity.City = Company.City; + Activity.DlvName = Company.Name; + Activity.DlvAddress1 = Company.Address1; + Activity.DlvAddress2 = Company.Address2; + Activity.DlvZipCode = Company.ZipCode; + Activity.DlvCity = Company.City; // Initialize date variable SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate); // raise flag if report is closed - ReportClosed = await AdvisorReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}"); + ReportClosed = await ReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}"); // Ask for confirmation of date Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed); if (!UserPrefs.DateConfirmed) { PromptDateConfirm = $"Aktiviteter oprettes med dato {SelectedDate.ToShortDateString()}. Er dette OK?"; - ConfirmWorkDateModal.Show(); + WorkDateOverlay.Show(); } // Lines may already have been added from the company inventory page if (DraftProvider.Draft.DraftType == "order") @@ -151,14 +162,90 @@ public partial class AdvisorCreateActivityPage : IDisposable PoFormInvalid = false; } Working = false; - //StateHasChanged(); } - private async Task CallConfirmProductCheckModel() + private async Task ShowVisitOverlay() + { + Logger.LogDebug("ShowInventoryOverlay - wait for visits"); + + ActivityListOverlay.Show(); + + Activities = await ActivityRepo.GetCustomerActivities(CompanyId); + + await Task.Delay(500); + } + + private async Task ShowInventoryOverlay() + { + Logger.LogDebug("ShowInventoryOverlay - wait for inventory"); + + InventoryListOverlay.Show(); + + Inventory = await HistoryRepo.FetchInventory(CompanyId); + + await Task.Delay(500); + } + + private async Task OnInventoryCallback(DraftItem item) + { + Activity.ActivityStatusEnum = "order"; + DraftProvider.Draft.DraftType = "order"; + DraftProvider.Draft.Items.Add(item); + StateHasChanged(); + } + + private async Task ShowInvoiceOverlay() + { + Logger.LogDebug("ShowInvoiceOverlay - wait for invoices"); + + InvoiceListOverlay.Show(); + CompanyInvoices = await FetchCompanyInvoices(); + await Task.Delay(500); + } + + private async Task FetchCompanyInvoices() + { + // fetch from storage + var storage = await Storage.GetItemAsStringAsync($"{CompanyId}-invoices"); + await Task.Delay(500); + var iDate = await Storage.GetItemAsStringAsync($"{CompanyId}-iDate"); + + // if we have a list and iDate was today return the list + if (!string.IsNullOrWhiteSpace(storage) && (!string.IsNullOrWhiteSpace(iDate) && DateTime.Parse(iDate.Replace("\"", "")) >= DateTime.Now)) + { + Logger.LogDebug("fetching invoices from storage"); + Logger.LogDebug("storage contains <= {}", storage); + return JsonSerializer.Deserialize(storage); + } + + Logger.LogDebug("pulling invoices from backend"); + // pull invoices + var companyInvoices = await HistoryRepo.FetchInvoiceList(CompanyId); + // send invoices to storage + await Storage.SetItemAsync($"{CompanyId}-invoices", companyInvoices); + await Storage.SetItemAsync($"{CompanyId}-iDate", $"{DateTime.Now:yyyy-MM-dd}"); + Logger.LogDebug(" --> return invoices from backend"); + Working = false; + Logger.LogDebug("backend contains <= {}", JsonSerializer.Serialize(companyInvoices)); + return companyInvoices; + } + + private void ShowOrgWarning() + { + if (OrgWarning) + return; + OrgWarning = true; + if (Company.CountryCode.ToLower() == "se" && VatUtils.SanitizeVatNumber(Activity.VatNumber).Length < 10 && Activity.ActivityStatusEnum == "order") + { + Toaster.ShowWarning("Org nummer er ufuldstændig. Skal opdateres før bestilling kan sendes. ", "ADVARSEL"); + } + } + + private async Task CallConfirmCheckOverlay() { // check if new account - if (string.IsNullOrWhiteSpace(_company.Account) - || _company.Account.ToLower() == "ny" + if (string.IsNullOrWhiteSpace(Company.Account) + || Company.Account.ToLower() == "ny" || Activity.ActivityStatusEnum.ToLower() == "quote") { // proceed to create activity - as there is no product check to be done @@ -172,23 +259,26 @@ public partial class AdvisorCreateActivityPage : IDisposable Logger.LogDebug("pStorage => {}", pStorage); // fetch pDate from storage var pDate = await Storage.GetItemAsync($"{CompanyId}-pDate"); + if (string.IsNullOrWhiteSpace(pDate)) + pDate = $"{DateTime.Now.AddDays(-1):yyyy-MM-dd}"; Logger.LogDebug("pDate => {}", pDate); + // check if product data is valid and updated today if (string.IsNullOrWhiteSpace(pStorage) || pDate.Replace("\"", "") != $"{DateTime.Now:yyyy-MM-dd}") { Working = true; // pop a message - Toast.ShowError("Produkt gennemgang mangler. Vent mens produkt oversigt indlæses. Gå ikke væk fra siden!", "Produkt check ..."); + Toaster.ShowError("Produkt gennemgang mangler. Vent mens produkt oversigt indlæses. Gå ikke væk fra siden!", "Produkt check ..."); // product inventory has not been updated // send rpc call to sync ERP to CRM - Toast.ShowInfo("Vent mens data synkroniseres ...", "ERP til CRM ..."); - var ts = await HistoryRepo.ErpInvoiceToCrmRpc(CompanyId, _company.HistorySync); + Toaster.ShowInfo("Vent mens data synkroniseres ...", "ERP til CRM ..."); + var ts = await HistoryRepo.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync); while (string.IsNullOrWhiteSpace(ts)) await Task.Delay(500); // save pDate await Storage.SetItemAsync($"{CompanyId}-pDate", ts); // request products from backend - Toast.ShowInfo("Vent mens produkt oversigt hentes", "CRM produkt liste"); + Toaster.ShowInfo("Vent mens produkt oversigt hentes", "CRM produkt liste"); CheckList = await HistoryRepo.FetchInventory(CompanyId); if(CheckList.Any()) @@ -206,11 +296,12 @@ public partial class AdvisorCreateActivityPage : IDisposable } // Show CheckList modal - ConfirmProductCheckModal.Show(); + ProductCheckOverlay.Show(); } + private async Task ConfirmProductCheckCallback() { - ConfirmProductCheckModal.Hide(); + ProductCheckOverlay.Hide(); await CreateActivity(); foreach (var item in CheckList) { @@ -226,7 +317,7 @@ public partial class AdvisorCreateActivityPage : IDisposable private async Task WorkDateConfirmCallback() { await Profiles.SetDateConfirmed(true); - ConfirmWorkDateModal.Hide(); + WorkDateOverlay.Hide(); StateHasChanged(); } @@ -236,7 +327,7 @@ public partial class AdvisorCreateActivityPage : IDisposable /// private async Task WorkDateComponentCallback(string workDate) { - ReportClosed = await AdvisorReportRepo.ReportExist(workDate); + ReportClosed = await ReportRepo.ReportExist(workDate); SelectedDate = DateTime.Parse(workDate); Activity.ActivityDate = workDate; } @@ -244,9 +335,9 @@ public partial class AdvisorCreateActivityPage : IDisposable /// /// Show Price list modal /// - private void CallPriceListModal() + private void ShowPriceListOverlay() { - PriceListModal.Show(); + CatalogOverlay.Show(); } ///
@@ -258,7 +349,7 @@ public partial class AdvisorCreateActivityPage : IDisposable // get selected item if (string.IsNullOrWhiteSpace(sku.ItemId)) return; - SelectedItem = await AdvisorCatalogCrm.GetSalesItemId(sku.ItemId); + SelectedItem = await CatalogRepo.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId); ShowItem = true; Price = sku.Rate; Quantity = sku.Quantity; @@ -268,10 +359,10 @@ public partial class AdvisorCreateActivityPage : IDisposable /// /// Show Price History modal /// - private void CallPriceHistoryModal() + private void ShowPriceHistoryOverlay() { if(ShowItem) - PriceHistoryModal.Show(); + PriceOverlay.Show(); } /// @@ -294,26 +385,35 @@ public partial class AdvisorCreateActivityPage : IDisposable // avoid duplication if (Working) return; - // validate customer address1 - this is a required input + // validate customer address1 + // - this is a required input if (string.IsNullOrWhiteSpace(Activity.Address1)) { - Toast.ShowError("Kunde adresse er ufuldstændig."); + Toaster.ShowError("Kunde adresse er ufuldstændig."); return; } - // + // validate org number + // - this is a required input + // - must validate according to country rules. + if (!VatUtils.ValidateFormat(Company.CountryCode, Activity.VatNumber)) + { + Toaster.ShowError("Firma registreringsnummer er ikke korrekt."); + return; + } + // validate input according to status switch (Activity.ActivityStatusEnum) { // don't accept order with no lines case "order" when DraftProvider.Draft.Items.Count == 0: - Toast.ShowError("Ved bestilling skal der være en eller flere linjer i kladden."); + Toaster.ShowError("Ved bestilling skal der være en eller flere linjer i kladden."); return; // phone number is required if first time customer - case "order" when _company.Account is "NY" or "" && string.IsNullOrWhiteSpace(Activity.Phone): - Toast.ShowError("Ved bestilling til ny kunde skal telefon nummer angives."); + case "order" when Company.Account is "NY" or "" && string.IsNullOrWhiteSpace(Activity.Phone): + Toaster.ShowError("Ved bestilling til ny kunde skal telefon nummer angives."); return; // verify email address is a valid address case "quote" when !Utils.IsValidEmail(Activity.Email): - Toast.ShowError("Ved tilbud skal en gyldig email adresse angives."); + Toaster.ShowError("Ved tilbud skal en gyldig email adresse angives."); return; } // raise working flag @@ -324,15 +424,16 @@ public partial class AdvisorCreateActivityPage : IDisposable // check if phone number need to be updated if (OldPhone != Activity.Phone) { - _company.Phone = Activity.Phone; - await CompanyRepo.UpdateErpData(_company.CompanyId, _company); + Company.Phone = Activity.Phone; + Activity.OrderMessage = $"Telefonnr. opdateret.\n{Activity.OrderMessage}"; + await CompanyRepo.UpdateErpData(Company.CompanyId, Company); } // begin assembling activity Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}"; Activity.OurRef = Activity.ActivityTypeEnum switch { - "phone" => $"T:{ThisUserInfo.FullName.Split(" ")[0]}", - "onSite" => $"B:{ThisUserInfo.FullName.Split(" ")[0]}", + "phone" => $"T:{SalesRep.FullName.Split(" ")[0]}", + "onSite" => $"B:{SalesRep.FullName.Split(" ")[0]}", _ => "" }; if (Activity.Express) @@ -361,22 +462,22 @@ public partial class AdvisorCreateActivityPage : IDisposable // debug logging Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity)); // post to api - var result = await AdvisorActivityRepo.CreateActivity(Activity); + var result = await ActivityRepo.CreateActivity(Activity); // debug logging Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result)); // show result message if (result.IsSuccess) { - Toast.ShowSuccess($"{result.Message}", + Toaster.ShowSuccess($"{result.Message}", DraftProvider.Draft.Items.Count == 0 ? "Besøg er oprettet" : "Bestilling/Tilbud er oprettet"); await DeleteDraft(); - Navigator.NavigateTo($"/customers"); + Navigator.NavigateTo($"/advisor/customers"); return; } // lower working flag Working = false; // show error message - Toast.ShowError(result.Message, "ORDRE FEJL"); + Toaster.ShowError(result.Message, "ORDRE FEJL"); } /// @@ -446,12 +547,11 @@ public partial class AdvisorCreateActivityPage : IDisposable DraftProvider.Draft.Items = new List(); } - ButtonText = Activity.ActivityStatusEnum switch + ButtonText = Activity.ActivityStatusEnum.ToLower() switch { - "noSale" => "Gem Besøg", - "order" => "Gem Bestilling", - "quote" => "Gem Tilbud", - _ => ButtonText + "nosale" => "Gem Besøg", + "order" => "Send Bestilling", + "quote" => "Send Tilbud" }; // InvalidCanvas = InvalidActivityType; @@ -477,10 +577,20 @@ public partial class AdvisorCreateActivityPage : IDisposable { if (string.IsNullOrEmpty(Activity.ActivityTypeEnum) && !ReportClosed) { - Toast.ShowWarning("Aktivitet type kan ikke være tom"); + Toaster.ShowWarning("Aktivitet type kan ikke være tom"); PoFormInvalid = true; return; } + + if (Activity.ActivityStatusEnum.ToLower() is "order" or "quote" + && Company.CountryCode.ToLower() == "se" + && VatUtils.SanitizeVatNumber(Activity.VatNumber).Length < 10) + { + ShowOrgWarning(); + PoFormInvalid = true; + return; + } + PoFormInvalid = false; ActivityContext.OnFieldChanged -= HandleFieldChanged; ActivityContext.OnValidationStateChanged -= ValidationChanged; diff --git a/Wonky.Client/Pages/AdvisorTodayActivityListPage.razor b/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor similarity index 74% rename from Wonky.Client/Pages/AdvisorTodayActivityListPage.razor rename to Wonky.Client/Pages/AdvisorActivityTodayListPage.razor index c7eb3057..f22b29a2 100644 --- a/Wonky.Client/Pages/AdvisorTodayActivityListPage.razor +++ b/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor @@ -18,8 +18,8 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components @attribute [Authorize(Roles = "Advisor")] -@page "/activity-today" - +@page "/advisor/activity-today" +Aktiviteter for @($"{SelectedDate:yyyy-MM-dd}")
@if (ReportStatusView.ReportItems.Any()) { - + } @if (Working) { diff --git a/Wonky.Client/Pages/AdvisorTodayActivityListPage.razor.cs b/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor.cs similarity index 81% rename from Wonky.Client/Pages/AdvisorTodayActivityListPage.razor.cs rename to Wonky.Client/Pages/AdvisorActivityTodayListPage.razor.cs index 7005d5b8..729fc543 100644 --- a/Wonky.Client/Pages/AdvisorTodayActivityListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor.cs @@ -25,15 +25,15 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class AdvisorTodayActivityListPage : IDisposable +public partial class AdvisorActivityTodayListPage : IDisposable { - [Inject] public UserProfileService UserProfileService { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } - [Inject] public IToastService Toaster { get; set; } + [Inject] private UserProfileService UserProfileService { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] private IAdvisorReportRepository AdvisorReportRepo { get; set; } + [Inject] private IToastService Toaster { get; set; } private ReportStatusView? ReportStatusView { get; set; } = new(); private UserPref UserPref { get; set; } = new(); private DateTime SelectedDate { get; set; } diff --git a/Wonky.Client/Pages/AdvisorViewActivityPage.razor b/Wonky.Client/Pages/AdvisorActivityViewPage.razor similarity index 95% rename from Wonky.Client/Pages/AdvisorViewActivityPage.razor rename to Wonky.Client/Pages/AdvisorActivityViewPage.razor index 9fa87e67..31a1d25e 100644 --- a/Wonky.Client/Pages/AdvisorViewActivityPage.razor +++ b/Wonky.Client/Pages/AdvisorActivityViewPage.razor @@ -19,9 +19,10 @@ @using Wonky.Client.Components @attribute [Authorize(Roles = "Admin,Advisor,Warehouse")] -@page "/customers/{CompanyId}/orders/{OrderId}" -@page "/customers/{CompanyId}/quotes/{OrderId}" +@page "/advisor/customers/{CompanyId}/orders/{OrderId}" +@page "/advisor/customers/{CompanyId}/quotes/{OrderId}" +@ReportItem.Company.Name @ReportItem.OrderDate @* *@ @@ -129,7 +130,7 @@
@* Office Note *@ -@if (ReportItem.ProcessStatusEnum == "None" && !ReportItem.Express && AllowOfficeNoteUpdate()) +@if (ReportItem is { ProcessStatusEnum: "None",Express: false } && AllowOfficeNoteUpdate()) {
diff --git a/Wonky.Client/Pages/AdvisorViewActivityPage.razor.cs b/Wonky.Client/Pages/AdvisorActivityViewPage.razor.cs similarity index 86% rename from Wonky.Client/Pages/AdvisorViewActivityPage.razor.cs rename to Wonky.Client/Pages/AdvisorActivityViewPage.razor.cs index 369db7df..63fa537b 100644 --- a/Wonky.Client/Pages/AdvisorViewActivityPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityViewPage.razor.cs @@ -29,15 +29,15 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class AdvisorViewActivityPage : IDisposable +public partial class AdvisorActivityViewPage : IDisposable { [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string OrderId { get; set; } = ""; - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public IToastService Toaster { get; set; } - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private NavigationManager Navigator { get; set; } private ReportItemView ReportItem { get; set; } = new(); private ActivityOfficeNote Note { get; set; } = new(); private EditContext NoteContext { get; set; } @@ -70,7 +70,7 @@ public partial class AdvisorViewActivityPage : IDisposable Logger.LogDebug("OfficeNote => \n {}", JsonSerializer.Serialize(Note)); await AdvisorActivityRepo.UpdateOfficeNote(Note); Toaster.ShowInfo($"{ReportItem.ESalesNumber} - notat opdateret"); - Navigator.NavigateTo("/activity-today"); + Navigator.NavigateTo("/advisor/activity-today"); } private bool AllowOfficeNoteUpdate() diff --git a/Wonky.Client/Pages/AdvisorCatalogPage.razor b/Wonky.Client/Pages/AdvisorCatalogPage.razor deleted file mode 100644 index 6bd639cc..00000000 --- a/Wonky.Client/Pages/AdvisorCatalogPage.razor +++ /dev/null @@ -1,52 +0,0 @@ -@* -// Copyright (C) 2022 FCS Frede's Computer Services. -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] -// -*@ - -@using Wonky.Client.Components -@using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Advisor")] -@page "/price-catalog" - -
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
- -
-
- -@if (Working) -{ - -} diff --git a/Wonky.Client/Pages/AdvisorCatalogPage.razor.cs b/Wonky.Client/Pages/AdvisorCatalogPage.razor.cs deleted file mode 100644 index ef9426af..00000000 --- a/Wonky.Client/Pages/AdvisorCatalogPage.razor.cs +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (C) 2022 FCS Frede's Computer Services. -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] -// - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Blazored.LocalStorage; -using Wonky.Client.HttpInterceptors; -using Wonky.Client.HttpRepository; -using Microsoft.AspNetCore.Components; -using Wonky.Client.Components; -using Wonky.Client.HttpInterfaces; -using Wonky.Client.Services; -using Wonky.Entity.DTO; -using Wonky.Entity.Requests; -using Wonky.Entity.Views; - -namespace Wonky.Client.Pages; - -public partial class AdvisorCatalogPage : IDisposable -{ - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public IAdvisorCatalogRepository ItemRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } - private List Items { get; set; } = new(); - private MetaData MetaInfo { get; set; } = new(); - private CatalogPaging _page = new(); - private UserPref Prefs = new(); - private UserInfoView UserInfo { get; set; } = new(); - private bool Working { get; set; } = true; - - protected override async Task OnInitializedAsync() - { - Prefs = await ProfileService.GetPreferences(); - UserInfo = await Storage.GetItemAsync("_xu"); - - _page.OrderBy = Prefs.ItemSort; - _page.SearchColumn = Prefs.ItemSearch; - _page.PageSize = Convert.ToInt32(Prefs.PageSize); - - Interceptor.RegisterEvent(); - Interceptor.RegisterBeforeSendEvent(); - - await FetchSalesItems(); - } - - private async Task SetSearchPhrase(string searchTerm) - { - Items = new List(); - _page.PageNumber = 1; - _page.SearchTerm = searchTerm; - await FetchSalesItems(); - } - - private async Task SetPageSize(string pageSize) - { - Items = new List(); - _page.PageSize = Convert.ToInt32(pageSize); - _page.PageNumber = 1; - await FetchSalesItems(); - } - - private async Task SetSearchCol(string columnName) - { - Items = new List(); - _page.PageNumber = 1; - _page.SearchColumn = columnName; - await FetchSalesItems(); - } - - private async Task SetSortCol(string orderBy) - { - Items = new List(); - _page.OrderBy = orderBy; - await FetchSalesItems(); - } - - private async Task SetSelectedPage(int page) - { - Items = new List(); - _page.PageNumber = page; - await FetchSalesItems(); - } - - private async Task SetGroupCol(string groupFilter) - { - Items = new List(); - _page.PageNumber = 1; - _page.SelectGroup = groupFilter; - await FetchSalesItems(); - } - - private async Task FetchSalesItems() - { - Working = true; - var pagingResponse = await ItemRepo.GetSalesItemsPaged(_page); - Working = false; - Items = pagingResponse.Items!; - MetaInfo = pagingResponse.MetaData; - - } - - - public void Dispose() => Interceptor.DisposeEvent(); - -} \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor index 1d54ce4b..080a68da 100644 --- a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor @@ -18,7 +18,9 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization @attribute [Authorize(Roles = "Advisor")] -@page "/customers/{CompanyId}/activities" +@page "/advisor/customers/{CompanyId}/activities" + +Rådgiver Aktiviteter for @Company.Name @if (!string.IsNullOrWhiteSpace(Company.Name)) { @@ -27,70 +29,14 @@

@Company.Name

-
-
-
-
-

Dato

-
-
-

Demo

-
-
-

Salg

-
-
-

Note /Kontor

-
-
-

Note /Selv

-
-
-
- - @if (Activities.Any()) - { - @foreach (var activity in Activities) - { -
-
-
- @activity.OrderDate -
-
- @activity.Demo -
-
- @activity.Sales -
-
- @activity.OfficeNote -
-
- @activity.CrmNote -
-
-
- } - } - else - { -
-
-
- Ingen data -
-
-
- } -
+ } @if (Working) { diff --git a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs index b0571288..7e9279d2 100644 --- a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs @@ -28,9 +28,9 @@ namespace Wonky.Client.Pages; public partial class AdvisorCustomerActivityListPage : IDisposable { [Parameter] public string CompanyId { get; set; } = ""; - [Inject] public HttpInterceptorService _interceptor { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] private HttpInterceptorService _interceptor { get; set; } + [Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; } private List Activities { get; set; } = new(); private CompanyDto Company { get; set; } = new(); private bool Working { get; set; } = true; diff --git a/Wonky.Client/Pages/AdvisorCreateCustomerPage.razor b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor similarity index 86% rename from Wonky.Client/Pages/AdvisorCreateCustomerPage.razor rename to Wonky.Client/Pages/AdvisorCustomerCreatePage.razor index fbd4df92..baf37c9f 100644 --- a/Wonky.Client/Pages/AdvisorCreateCustomerPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor @@ -15,12 +15,13 @@ // *@ -@page "/customers/new" +@page "/advisor/customers/new" @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components @using System.Xml @attribute [Authorize(Roles = "Advisor")] +Rådgiver Opret Kunde

Opret kunde

@@ -30,7 +31,20 @@
@* vat lookup *@
- +
+ @switch (Company.CountryCode) + { + case "dk": + + break; + case "no": + Firma søgning + break; + case "se": + Firma søgning + break; + } +
@* entity name *@ @@ -69,7 +83,7 @@
@* entity vat number *@ - +
@@ -99,7 +113,7 @@

-
+
@@ -124,7 +138,7 @@
-
+
diff --git a/Wonky.Client/Pages/AdvisorCreateCustomerPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs similarity index 91% rename from Wonky.Client/Pages/AdvisorCreateCustomerPage.razor.cs rename to Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs index 9f116c88..2de4916b 100644 --- a/Wonky.Client/Pages/AdvisorCreateCustomerPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs @@ -37,15 +37,15 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages { - public partial class AdvisorCreateCustomerPage : IDisposable + public partial class AdvisorCustomerCreatePage : IDisposable { - [Inject] public IToastService Toaster { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public VatInfoLookupService VatService { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private VatInfoLookupService VatService { get; set; } private EditContext CompanyContext { get; set; } private CompanyDto Company { get; set; } = new(); private VirkRegInfo CompanyRegInfo { get; set; } = new(); @@ -136,7 +136,7 @@ namespace Wonky.Client.Pages /// private void SelectCompanyCallback(VirkRegInfo regInfo) { - Logger.LogDebug($"CrmCompanyView => SelectCompanyCallback => {JsonSerializer.Serialize(regInfo)}"); + Logger.LogDebug("CrmCompanyView => SelectCompanyCallback => {}", JsonSerializer.Serialize(regInfo)); // this can be removed in favor of the new data returned from updating the VatNumber RegState = regInfo.States[0].State.ToLower() == "normal" ? "the-good" : "the-dead"; @@ -177,7 +177,7 @@ namespace Wonky.Client.Pages if (!string.IsNullOrWhiteSpace(newId)) { Toaster.ShowSuccess($"'{Company.Name}' er oprettet i CRM."); - Navigator.NavigateTo($"/customers/{newId}"); + Navigator.NavigateTo($"/advisor/customers/{newId}"); } else { diff --git a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor index f8584e60..8bc6700e 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor @@ -17,24 +17,24 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@page "/customers/{CompanyId}/h/i" +@page "/advisor/customers/{CompanyId}/h/i" @attribute [Authorize(Roles = "Advisor")] - +Produkt oversigt for @Company.Name - + @if (Working) { diff --git a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs index a79447c9..5c969cc4 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs @@ -28,13 +28,13 @@ namespace Wonky.Client.Pages; public partial class AdvisorCustomerInventoryListPage : IDisposable { - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IToastService Toaster { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public IAdvisorCatalogRepository AdvisorCatalogRepo { get; set; } + [Inject] private IAdvisorCustomerHistoryRepository CustomerHistory { get; set; } + [Inject] private IAdvisorCustomerRepository Customers { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private ICountryCatalogRepository Catalog { get; set; } [CascadingParameter] public DraftStateProvider DraftStateProvider { get; set; } = new(); [Parameter] public string CompanyId { get; set; } = ""; @@ -44,7 +44,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable private CompanyDto Company { get; set; } = new(); private bool Working { get; set; } = true; private SalesItemView SalesItem { get; set; } = new(); - private InventoryReorderModal ReorderModal { get; set; } = new(); + private CustomerInventoryReorderModalOverlay CustomerInventoryReorderOverlay { get; set; } = new(); private List Inventory { get; set; } = new(); @@ -53,7 +53,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); - Company = await CompanyRepo.GetCompanyById(CompanyId); + Company = await Customers.GetCompanyById(CompanyId); // fetch product inventory await FetchProductInventory(); @@ -64,8 +64,8 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable private async Task OnReorderCallback(string sku) { // fetch item from http repo - SalesItem = await AdvisorCatalogRepo.GetSalesItemSku(Company.CountryCode.ToLower(), sku); - ReorderModal.Show(); + SalesItem = await Catalog.GetSalesItemSku(Company.CountryCode.ToLower(), sku); + CustomerInventoryReorderOverlay.Show(); } private async Task OnSelectedItem(DraftItem draftItem) @@ -92,7 +92,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable } Logger.LogDebug("pulling products from backend"); // fetch product history - Inventory = await HistoryRepo.FetchInventory(CompanyId); + Inventory = await CustomerHistory.FetchInventory(CompanyId); // default sort order by description if (Inventory.Any()) Inventory = Inventory.OrderBy(x => x.Description).ToList(); diff --git a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor index 879724c7..48aeb824 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor @@ -16,9 +16,9 @@ *@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@page "/customers/{CompanyId}/invoices" +@page "/advisor/customers/{CompanyId}/invoices" @attribute [Authorize(Roles = "Advisor")] - +Faktura Oversigt for @Company.Name @if (!string.IsNullOrWhiteSpace(Company.Name)) {
@@ -26,14 +26,14 @@

@Company.Name

- + } @if (Working) diff --git a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs index 12d81396..0ecc83b7 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs @@ -15,17 +15,17 @@ namespace Wonky.Client.Pages; public partial class AdvisorCustomerInvoiceListPage : IDisposable { [Parameter] public string CompanyId { get; set; } = ""; - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } - [Inject] public IToastService Toaster { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private ILogger Logger { get; set; } private InvoiceListView CompanyInvoices { get; set; } = new(); private CompanyDto Company { get; set; } = new(); - private bool Working { get; set; } - private InvoiceViewModal InvoiceView { get; set; } = new(); + private CustomerInvoiceViewModalOverlay CustomerInvoiceView { get; set; } = new(); private string InvoiceId { get; set; } = ""; + private bool Working { get; set; } private bool AllSet { get; set; } private string _companyId = ""; @@ -63,7 +63,7 @@ public partial class AdvisorCustomerInvoiceListPage : IDisposable private void CallInvoiceModal(string invoiceId) { InvoiceId = invoiceId; - InvoiceView.Show(); + CustomerInvoiceView.Show(); } private async Task FetchCompanyInvoices() @@ -80,13 +80,18 @@ public partial class AdvisorCustomerInvoiceListPage : IDisposable } Logger.LogDebug("pulling invoices from backend"); // pull invoices - var invoices = await HistoryRepo.FetchInvoiceList(_companyId); + var companyInvoices = await HistoryRepo.FetchInvoiceList(_companyId); + if (companyInvoices.Invoices.Any()) + companyInvoices.Invoices = companyInvoices.Invoices + .OrderByDescending(x => x.DocumentDate) + .ToList(); + // send invoices to storage - await Storage.SetItemAsync($"{_companyId}-invoices", invoices); + await Storage.SetItemAsync($"{_companyId}-invoices", companyInvoices); await Storage.SetItemAsync($"{_companyId}-iDate", $"{DateTime.Now:yyyy-MM-dd}"); Logger.LogDebug("return invoices from backend"); Working = false; - return invoices; + return companyInvoices; } public void Dispose() diff --git a/Wonky.Client/Pages/AdvisorCustomerListPage.razor b/Wonky.Client/Pages/AdvisorCustomerListPage.razor index 6cd8f5fe..2b6b0e17 100644 --- a/Wonky.Client/Pages/AdvisorCustomerListPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerListPage.razor @@ -17,39 +17,46 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@page "/customers" +@page "/advisor/customers" @attribute [Authorize(Roles = "Advisor")] - +Kunde oversigt
- +
- +
- +
+ + + @*
+ *@
- + @if (Working) { diff --git a/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs index 96d68f32..8b1cf069 100644 --- a/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerListPage.razor.cs @@ -30,11 +30,11 @@ namespace Wonky.Client.Pages { public partial class AdvisorCustomerListPage : IDisposable { - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } + [Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private NavigationManager Navigator { get; set; } private List Companies { get; set; } = new(); private UserPref Prefs { get; set; } = new(); private UserInfoView UserInfo { get; set; } = new(); @@ -43,6 +43,7 @@ namespace Wonky.Client.Pages private bool Working { get; set; } = true; private MetaData PageData { get; set; } = new(); private CustomerPaging Paging { get; set; } = new(); + private string ButtonFoldedText { get; set; } = "Vis Ophørte"; protected override void OnParametersSet() { @@ -66,24 +67,26 @@ namespace Wonky.Client.Pages Paging.SearchTerm = SavedSearch; // get companies - await FetchCompanies(); + await FetchCustomers(); Working = false; } private async Task OnFoldedClick() { + Working = true; IncludeFolded = !IncludeFolded; + ButtonFoldedText = IncludeFolded ? "Vis Aktive" : "Vis Ophørte"; Companies = new List(); Paging.PageNumber = 1; Paging.HasFolded = IncludeFolded ? 1 : 0; - await FetchCompanies(); + await FetchCustomers(); } private async Task SelectedPage(int page) { Companies = new List(); Paging.PageNumber = page; - await FetchCompanies(); + await FetchCustomers(); } private async Task SetSearchCol(string searchColumn) @@ -91,14 +94,14 @@ namespace Wonky.Client.Pages Companies = new List(); Paging.SearchColumn = searchColumn; Paging.PageNumber = 1; - await FetchCompanies(); + await FetchCustomers(); } private async Task SetPageSize(string pageSize) { Companies = new List(); Paging.PageSize = Convert.ToInt32(pageSize); Paging.PageNumber = 1; - await FetchCompanies(); + await FetchCustomers(); } private async Task SetSearchPhrase(string searchTerm) @@ -106,14 +109,14 @@ namespace Wonky.Client.Pages Companies = new List(); Paging.PageNumber = 1; Paging.SearchTerm = searchTerm; - await FetchCompanies(); + await FetchCustomers(); } private async Task SetSortCol(string orderBy) { Companies = new List(); Paging.OrderBy = orderBy; - await FetchCompanies(); + await FetchCustomers(); } /// @@ -126,10 +129,10 @@ namespace Wonky.Client.Pages await CompanyRepo.DeleteCompany(companyId); if (Paging.PageNumber > 1 && Companies.Count == 1) Paging.PageNumber--; - await FetchCompanies(); + await FetchCustomers(); } - private async Task FetchCompanies() + private async Task FetchCustomers() { Working = true; var pageRes = await CompanyRepo.GetCompanies(Paging); diff --git a/Wonky.Client/Pages/AdvisorCustomerViewPage.razor b/Wonky.Client/Pages/AdvisorCustomerViewPage.razor index 3d2c2909..1e9c1f9f 100644 --- a/Wonky.Client/Pages/AdvisorCustomerViewPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerViewPage.razor @@ -19,8 +19,8 @@ @using Microsoft.AspNetCore.Components @using Wonky.Client.Components @attribute [Authorize(Roles = "Advisor")] -@page "/customers/{CompanyId}" - +@page "/advisor/customers/{CompanyId}" +Kundekort for @Company.Name @if (!string.IsNullOrWhiteSpace(Company.Account)) { @@ -92,10 +92,10 @@
- +
- +
@* account *@ @@ -104,7 +104,7 @@
@* vat number*@ - +
@@ -116,11 +116,22 @@
@* vat lookup *@
- + @switch (CountryCode) + { + case "dk": + + break; + case "no": + Firma opslag + break; + case "se": + Firma opslag + break; + }
@* save vat number *@
- +
@@ -128,13 +139,13 @@ @* activity buttons *@
@* Save CRM data button *@
- +
@* crm context - contacts *@ diff --git a/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs index 87ee73fc..6a8cdefe 100644 --- a/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerViewPage.razor.cs @@ -34,15 +34,15 @@ namespace Wonky.Client.Pages; public partial class AdvisorCustomerViewPage : IDisposable { [Parameter] public string CompanyId { get; set; } = ""; - [Inject] public IToastService Toaster { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } - [Inject] public IAdvisorContactRepository AdvisorContactRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public VatInfoLookupService VatService { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] private IAdvisorContactRepository AdvisorContactRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private VatInfoLookupService VatService { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } private readonly JsonSerializerOptions _options = new () { PropertyNameCaseInsensitive = true }; private CompanyDto Company { get; set; } = new(); private EditContext ErpContext { get; set; } @@ -115,7 +115,7 @@ public partial class AdvisorCustomerViewPage : IDisposable // display urgency of next visit VisitState = Utils.GetVisitState($"{NextVisit:yyyy-MM-dd}"); // action link passed to activity button component - ActionLink = $"/customers/{CompanyId}/activities/new"; // used when drawing visit button + ActionLink = $"/advisor/customers/{CompanyId}/activities/new"; // used when drawing visit button // handle company out of business case if(Company.HasFolded == 1) { @@ -139,10 +139,19 @@ public partial class AdvisorCustomerViewPage : IDisposable await FetchContacts(CompanyId); - var ts = await HistoryRepo.ErpInvoiceToCrmRpc(CompanyId, Company.HistorySync); - // remove loading image Working = false; + + await RequestErpUpdate(); + } + + private async Task RequestErpUpdate() + { + if(Working) + return; + Working = true; + await HistoryRepo.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync); + Working = false; } /// @@ -265,11 +274,13 @@ public partial class AdvisorCustomerViewPage : IDisposable Company.NextVisit = $"{NextVisit:yyyy-MM-dd}"; Company.IsHidden = 0; var result = await CompanyRepo.UpdateCrmData(CompanyId, Company); - if (!string.IsNullOrWhiteSpace(result.Name)) + if (!string.IsNullOrWhiteSpace(result.CompanyId)) { Company = result; + StateHasChanged(); } Working = false; + Toaster.ClearAll(); } /// @@ -283,11 +294,13 @@ public partial class AdvisorCustomerViewPage : IDisposable Working = true; Toaster.ShowInfo("Vent venligst ...", "OPDATERER STAM DATA"); var result = await CompanyRepo.UpdateErpData(CompanyId, Company); - if (!string.IsNullOrWhiteSpace(result.Name)) + if (!string.IsNullOrWhiteSpace(result.CompanyId)) { Company = result; + StateHasChanged(); } Working = false; + Toaster.ClearAll(); } /// @@ -307,11 +320,12 @@ public partial class AdvisorCustomerViewPage : IDisposable Working = true; Toaster.ShowInfo("Vent venligst ...", "OPDATERER MOMS NUMMER"); var result = await CompanyRepo.UpdateCompanyVat(CompanyId, Company.VatNumber); - if (!string.IsNullOrWhiteSpace(result.Name)) + if (!string.IsNullOrWhiteSpace(result.CompanyId)) { Company = result; StateHasChanged(); } + Toaster.ClearAll(); Working = false; } diff --git a/Wonky.Client/Pages/AdvisorQuoteListPage.razor b/Wonky.Client/Pages/AdvisorQuoteListPage.razor index b1d69a00..1243c563 100644 --- a/Wonky.Client/Pages/AdvisorQuoteListPage.razor +++ b/Wonky.Client/Pages/AdvisorQuoteListPage.razor @@ -18,8 +18,8 @@ @using Wonky.Client.Models @using Microsoft.AspNetCore.Authorization @attribute [Authorize(Roles = "Advisor")] -@page "/open-quotes" - +@page "/advisor/agreements" +Aftaler og Tilbud - Oversigt

Aftaler og Tilbud

diff --git a/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs b/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs index 882d02b4..7bb21584 100644 --- a/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs @@ -16,11 +16,11 @@ namespace Wonky.Client.Pages; public partial class AdvisorQuoteListPage : IDisposable { - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public IToastService Toaster { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } + [Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } private List Quotes { get; set; } = new(); private List _quotes { get; set; } = new(); private bool Working { get; set; } @@ -54,7 +54,7 @@ public partial class AdvisorQuoteListPage : IDisposable }; } - private async Task UpdateQuoteCallback(QuoteCallbackArgs args) + private async Task UpdateQuoteCallback(QCallbackArgs args) { Working = true; // find the quote to update diff --git a/Wonky.Client/Pages/AdvisorReportCreatePage.razor b/Wonky.Client/Pages/AdvisorReportCreatePage.razor index 28706842..071563a7 100644 --- a/Wonky.Client/Pages/AdvisorReportCreatePage.razor +++ b/Wonky.Client/Pages/AdvisorReportCreatePage.razor @@ -17,8 +17,11 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components +@using Wonky.Entity.Views @attribute [Authorize(Roles = "Advisor")] -@page "/sales-reports/new" +@page "/advisor/reports/new" + +Opret Dagsrapport for @_workDate @* report header *@
@@ -36,7 +39,7 @@
- + @@ -61,13 +64,13 @@ @if (Report.DayTypeEnum.ToLower().Contains("leave")) { + Report.Figures.KmMorning = 0; - Report.Figures.KmMorning = 0; } else { @@ -105,9 +108,9 @@ @* details input *@
Dag / Periode Begyndt Afsluttet
- - - + + + @@ -129,10 +132,11 @@ @* distance ledger input *@
TekstSupervisor
BeskrivelseMin medkørende supervisor
- + - + + @@ -145,10 +149,34 @@ + + + + +
Km aften Km morgenKm privatKm dagKm måned
+ + + +
+ + + + + + + + + +
Km privatKm privat måned
+ +
@@ -156,148 +184,16 @@ @if (Activities.Any()) {
- @* Report activities *@ - - - - - - - - - - - - - - - - - - @foreach (var activity in Activities) - { - - - - - - - - - - - - - - } - - - - - - - -
KundeBynavnDemoSalgNotesasBeløb - - - - - - - -
@activity.Company.Name@activity.Company.City@activity.Demo@activity.Sales@activity.OfficeNote@($"{activity.SasAmount:N2}")@(activity.StatusTypeEnum.Contains("Quote") ? $"{0:N2}" : $"{activity.OrderAmount:N2}") - @if (activity.OurRef.Contains("T:")) - { - - } - - @if (activity.Express) - { - - } - - @if (activity.StatusTypeEnum == "Quote") - { - - } - - -
Total@Activities.Where(x => x.StatusTypeEnum != "Quote").Sum(x => x.OrderAmount)
+
} }
@* ledger summaries calculated *@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Dagens Demo @(Report.Figures.NewDemoCount + Report.Figures.RecallDemoCount)Dagens ResultatMåneds Resultat
BesøgDemoSalgBeløbBesøgDemoSalgBeløb
N@Report.Figures.NewVisitCount@Report.Figures.NewDemoCount@Report.Figures.NewSaleCount@Report.Figures.NewTurnover@Report.Figures.NewVisitCountMonth@Report.Figures.NewDemoCountMonth@Report.Figures.NewSaleCountMonth@Report.Figures.NewTurnoverMonth
R@Report.Figures.RecallVisitCount@Report.Figures.RecallDemoCount@Report.Figures.RecallSaleCount@Report.Figures.RecallTurnover@Report.Figures.RecallVisitCountMonth@Report.Figures.RecallDemoCountMonth@Report.Figures.RecallSaleCountMonth@Report.Figures.RecallTurnoverMonth
SAS@Report.Figures.SasCount@Report.Figures.SasTurnover@Report.Figures.SasCountMonth@Report.Figures.SasTurnoverMonth
TOTAL@Report.Figures.TotalVisitCount@Report.Figures.TotalDemoCount@Report.Figures.TotalSaleCount@Report.Figures.TotalTurnover@Report.Figures.TotalVisitCountMonth@Report.Figures.TotalDemoCountMonth@Report.Figures.TotalSaleCountMonth@Report.Figures.TotalTurnoverMonth
+
- + @if (Working) { diff --git a/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs index db488281..5e520614 100644 --- a/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs @@ -29,13 +29,13 @@ namespace Wonky.Client.Pages; public partial class AdvisorReportCreatePage : IDisposable { - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public IToastService Toaster { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } + [Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] private IAdvisorReportRepository AdvisorReportRepo { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private IToastService Toaster { get; set; } private EditContext ReportContext { get; set; } private ReportDto Report { get; set; } = new(); private List Activities { get; set; } = new(); @@ -43,7 +43,7 @@ public partial class AdvisorReportCreatePage : IDisposable private UserPref Prefs { get; set; } = new(); private bool FormInvalid { get; set; } = true; private bool NoFigures { get; set; } = true; - private bool Working { get; set; } = true; + private bool Working { get; set; } private DateTime _workDate { get; set; } private TimeOnly _checkIn { get; set; } = new(12, 0); private TimeOnly _checkOut { get; set; } = new(12, 0); @@ -51,7 +51,10 @@ public partial class AdvisorReportCreatePage : IDisposable private DateTime EndLeave { get; set; } = DateTime.Now; private ConfirmationModal ConfirmReportModal { get; set; } private string Prompt { get; set; } = ""; - + private string WorkDate { get; set; } = ""; + private int currKmMonth { get; set; } + private int currKmPrivate { get; set; } + /// /// OnInitialized /// @@ -64,13 +67,24 @@ public partial class AdvisorReportCreatePage : IDisposable ReportContext.OnFieldChanged += HandleFieldChanged; ReportContext.OnValidationStateChanged += ValidationChanged; + ProfileService.OnChange += ProfileServiceOnOnChange; Prefs = await ProfileService.GetPreferences(); - _workDate = DateTime.Now; - if (!string.IsNullOrWhiteSpace(Prefs.WorkDate)) - _workDate = DateTime.Parse(Prefs.WorkDate); - - if(await AdvisorReportRepo.ReportExist(Prefs.WorkDate)) - Navigator.NavigateTo($"/sales-reports/view/{_workDate:yyyy-MM-dd}"); + Logger.LogDebug("{}", JsonSerializer.Serialize(Prefs)); + + WorkDate = Prefs.WorkDate; + if (string.IsNullOrWhiteSpace(WorkDate)) + { + _workDate = DateTime.Now; + WorkDate = $"{_workDate:yyyy-MM-dd}"; + await ProfileService.SetWorkDate(_workDate); + } + else + { + _workDate = DateTime.Parse(WorkDate); + } + + if(await AdvisorReportRepo.ReportExist(WorkDate)) + Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}"); BeginLeave = _workDate; EndLeave = _workDate; @@ -81,13 +95,54 @@ public partial class AdvisorReportCreatePage : IDisposable Report.Figures.KmMorning = 0; Report.Figures.KmEvening = 0; Report.Figures.Distance = 0; + Report.Figures.DistancePrivate = 0; Report.Figures.DistancePrivateMonth = 0; - - Working = false; - Logger.LogDebug("OnInitializedAsync => GetKeyFigures"); + await GetKeyFigures(); + Logger.LogDebug("OnInitializedAsync => GetKeyFigures <= {}", JsonSerializer.Serialize(Report)); } + private void ProfileServiceOnOnChange(UserPref userPref) + { + Prefs = userPref; + WorkDate = Prefs.WorkDate; + StateHasChanged(); + } + + private async Task GetKeyFigures() + { + if (Working) + return; + Working = true; + + Report.Figures = new ReportFiguresDto(); + InitialValues = new ReportFiguresDto(); + Activities = new List(); + + var data = await AdvisorReportRepo.InitializeReportData(WorkDate); + if(data.ReportClosed) + Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}"); + + Report.Figures = data.ReportData; + InitialValues = data.ReportData; + Activities = data.ReportItems; + currKmMonth = data.ReportData.DistanceMonth; + currKmPrivate = data.ReportData.DistancePrivate; + if (Report.DayTypeEnum.ToLower().Contains("leave")) + { + // ensure no distances in calculation + Report.Figures.KmMorning = 0; + Report.Figures.KmEvening = 0; + Report.Figures.DistancePrivate = 0; + } + else + { + Report.Figures.KmMorning = Prefs.KmMorning; + } + + NoFigures = false; + Working = false; + } /// /// Field data change event /// @@ -97,11 +152,13 @@ public partial class AdvisorReportCreatePage : IDisposable { // Console.WriteLine($"e FieldName => {e.FieldIdentifier.FieldName}"); FormInvalid = !ReportContext.Validate(); - if (Report.Figures.KmEvening - Report.Figures.KmMorning > 1000) + Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning; + Report.Figures.DistanceMonth = Report.Figures.Distance + currKmMonth; + Report.Figures.DistancePrivateMonth = Report.Figures.DistancePrivate + currKmPrivate; + if (Report.Figures.Distance is > 1000 or < 0) { - Toaster.ShowError($"KM tal '{Report.Figures.KmEvening - Report.Figures.KmMorning}'. Er du sikker på at det er rigtigt?", "KM tal"); + Toaster.ShowError($"Kørte km for rapporten er '{Report.Figures.Distance}'. Er du sikker på at det er rigtigt?", "KM tal"); } - StateHasChanged(); } @@ -130,15 +187,16 @@ public partial class AdvisorReportCreatePage : IDisposable return; Working = true; - var result = await AdvisorReportRepo.CreateReport($"{_workDate:yyyy-MM-dd}", Report); + var result = await AdvisorReportRepo.CreateReport(WorkDate, Report); Logger.LogDebug("CreateReport.result => {}", JsonSerializer.Serialize(result)); // reset km and date confirmation await ProfileService.SetKmMorning(0); // reset date confirmed await ProfileService.SetDateConfirmed(false); - Navigator.NavigateTo($"/sales-reports/view/{_workDate:yyyy-MM-dd}"); + Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}"); } + /// /// Submit report /// @@ -178,29 +236,26 @@ public partial class AdvisorReportCreatePage : IDisposable // format report date time input Report.FromDateTime = checkIn.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); Report.ToDateTime = checkOut.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); - - // assign final distance numbers - if (Report.DayTypeEnum.ToLower().Contains("leave")) - { - Report.Figures.KmEvening = 0; - Report.Figures.KmMorning = 0; - } - // calculate distance - Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning; - // add distance to distance month - Report.Figures.DistanceMonth += Report.Figures.Distance; - // add private distance to month - Report.Figures.DistancePrivateMonth += Report.Figures.DistancePrivate; - Logger.LogDebug("_workDate => {workDate}", $"{_workDate:yyyy-MM-dd}"); Logger.LogDebug("_report => {report}", JsonSerializer.Serialize(Report)); + if (Report.DayTypeEnum is "leave" or "sickLeave") + { + // reset distance calculation + Report.Figures.KmEvening = 0; + Report.Figures.KmMorning = 0; + Report.Figures.DistanceMonth = currKmMonth; + Report.Figures.DistancePrivateMonth = currKmPrivate; + } + // pop confirmation // create a prompt for popup confirmation var warning = Report.Figures.KmEvening - Report.Figures.KmMorning > 1000 ? - $"KM tal '{Report.Figures.KmEvening - Report.Figures.KmMorning}'. Er du sikker på at det er rigtigt?

" : ""; - Prompt = $"{warning}Gem rapport for {_workDate.ToLongDateString()}?"; + $"Kørte km for rapporten er '{Report.Figures.KmEvening - Report.Figures.KmMorning}'. Er du sikker på at det er rigtigt?
" : ""; + + Prompt = $"{warning}
Gem rapport for {_workDate.ToLongDateString()}?"; + ConfirmReportModal.Show(); } @@ -222,11 +277,14 @@ public partial class AdvisorReportCreatePage : IDisposable /// private void SetWorkDateCallback(string workDate) { + WorkDate = workDate; _workDate = DateTime.Parse(workDate); + NoFigures = true; Report.Figures = new ReportFiguresDto(); InitialValues = new ReportFiguresDto(); Activities = new List(); + Report.Figures.KmEvening = 0; Report.Figures.KmMorning = 0; Report.Figures.Distance = 0; @@ -236,46 +294,16 @@ public partial class AdvisorReportCreatePage : IDisposable Report.FromDateTime = $"{_workDate:yyyy-MM-dd'T'12:00}"; Report.ToDateTime = $"{_workDate:yyyy-MM-dd'T'12:00}"; } - - /// - /// Get key figures from backend - /// - private async Task GetKeyFigures() + + private void OnCancelCallback() { - if (Working) - return; - Working = true; - - Report.Figures = new ReportFiguresDto(); - InitialValues = new ReportFiguresDto(); - Activities = new List(); - - var data = await AdvisorReportRepo.InitializeReportData($"{_workDate:yyyy-MM-dd}"); - if(data.ReportClosed) - Navigator.NavigateTo($"/sales-reports/view/{_workDate:yyyy-MM-dd}"); - - Report.Figures = data.ReportData; - InitialValues = data.ReportData; - Activities = data.ReportItems; - - if (Report.DayTypeEnum.ToLower().Contains("leave")) - { - Report.Figures.KmMorning = 0; - Report.Figures.KmEvening = 0; - } - else - { - Report.Figures.KmMorning = Prefs.KmMorning; - } - - NoFigures = false; - Working = false; - } - + ConfirmReportModal.Hide(); + } public void Dispose() { Interceptor.DisposeEvent(); ReportContext.OnFieldChanged -= HandleFieldChanged; ReportContext.OnValidationStateChanged -= ValidationChanged; + ProfileService.OnChange -= ProfileServiceOnOnChange; } } \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorReportListPage.razor b/Wonky.Client/Pages/AdvisorReportListPage.razor index 4dcf398a..d91ff99b 100644 --- a/Wonky.Client/Pages/AdvisorReportListPage.razor +++ b/Wonky.Client/Pages/AdvisorReportListPage.razor @@ -18,8 +18,8 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization @attribute [Authorize(Roles = "Advisor")] -@page "/sales-reports" - +@page "/advisor/reports" +Rapport Arkiv

Rapport Arkiv

diff --git a/Wonky.Client/Pages/AdvisorReportListPage.razor.cs b/Wonky.Client/Pages/AdvisorReportListPage.razor.cs index 9288e255..ce407b70 100644 --- a/Wonky.Client/Pages/AdvisorReportListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportListPage.razor.cs @@ -24,10 +24,10 @@ namespace Wonky.Client.Pages; public partial class AdvisorReportListPage : IDisposable { - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] private IAdvisorReportRepository AdvisorReportRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private ILogger Logger { get; set; } private List ReportList { get; set; } = new(); private bool Working { get; set; } @@ -49,7 +49,7 @@ public partial class AdvisorReportListPage : IDisposable private void ShowThisReport(string reportDate) { Logger.LogDebug("CrmReportListPage => ShowThisReport <= {}", reportDate); - Navigator.NavigateTo($"/sales-reports/view/{reportDate}"); + Navigator.NavigateTo($"/advisor/reports/view/{reportDate}"); } public void Dispose() diff --git a/Wonky.Client/Pages/AdvisorReportViewPage.razor b/Wonky.Client/Pages/AdvisorReportViewPage.razor index bc7d335a..3b50ff35 100644 --- a/Wonky.Client/Pages/AdvisorReportViewPage.razor +++ b/Wonky.Client/Pages/AdvisorReportViewPage.razor @@ -19,8 +19,8 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Models @attribute [Authorize(Roles = "Advisor,Admin")] -@page "/sales-reports/view/{ReportDate}" - +@page "/advisor/reports/view/{ReportDate}" +@Report.ReportData.Name
@@ -36,7 +36,7 @@
-
+
@if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum)) { @Report.ReportData.Name @@ -51,7 +51,7 @@
- + } else diff --git a/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs b/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs index b1e91957..34a1c68f 100644 --- a/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs @@ -26,12 +26,12 @@ namespace Wonky.Client.Pages; public partial class AdvisorReportViewPage : IDisposable { [Parameter] public string ReportDate { get; set; } - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private IAdvisorReportRepository AdvisorReportRepo { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } private UserPref Prefs { get; set; } = new(); private ReportView Report { get; set; } = new(); @@ -61,10 +61,10 @@ public partial class AdvisorReportViewPage : IDisposable switch (target) { case PTarget.OrderPage: - Navigator.NavigateTo($"/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}"); + Navigator.NavigateTo($"/report/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}"); break; case PTarget.FrontPage: - Navigator.NavigateTo($"/print/report/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}"); + Navigator.NavigateTo($"/report/print/summary/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}"); break; case PTarget.None: break; @@ -85,7 +85,7 @@ public partial class AdvisorReportViewPage : IDisposable } // ensure the browser address bar contains the correct link - Navigator.NavigateTo($"/sales-reports/view/{workDate}", false, true); + Navigator.NavigateTo($"/advisor/reports/view/{workDate}", false, true); // return if we are already at it if (Working) diff --git a/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor b/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor index 69ec18fa..56d129d5 100644 --- a/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor +++ b/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor @@ -18,8 +18,8 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization @attribute [Authorize(Roles = "Advisor")] -@page "/task-items" - +@page "/advisor/task-items" +Opgave Oversigt
@@ -30,7 +30,7 @@
diff --git a/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs b/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs index be336254..d5829d4a 100644 --- a/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs @@ -27,12 +27,12 @@ namespace Wonky.Client.Pages; public partial class AdvisorTaskItemListCrmPage : IDisposable { - [Inject] public UserProfileService UserProfileService { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IAdvisorTaskItemRepository AdvisorTaskRepo { get; set; } - [Inject] public IToastService Toaster { get; set; } + [Inject] private UserProfileService UserProfileService { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private IAdvisorTaskItemRepository AdvisorTaskRepo { get; set; } + [Inject] private IToastService Toaster { get; set; } private UserPref Prefs { get; set; } = new(); private string WorkDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}"; private bool ReportExist = false; diff --git a/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor b/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor index 2f26a641..e08ea6b4 100644 --- a/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor +++ b/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor @@ -18,8 +18,8 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components @attribute [Authorize(Roles = "Advisor")] -@page "/tasks/{TaskItemId}" - +@page "/advisor/tasks/{TaskItemId}" +Opgave kort

Opgave

diff --git a/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs b/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs index e418bb54..567f4b75 100644 --- a/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs @@ -27,8 +27,8 @@ namespace Wonky.Client.Pages; public partial class AdvisorTaskItemViewCrmPage : IDisposable { [Parameter] public string TaskItemId { get; set; } - [Inject] public HttpInterceptorService _interceptor { get; set; } - [Inject] public IAdvisorTaskItemRepository AdvisorTaskRepo { get; set; } + [Inject] private HttpInterceptorService _interceptor { get; set; } + [Inject] private IAdvisorTaskItemRepository AdvisorTaskRepo { get; set; } private TaskItemDto _taskItem = new (); private EditContext _editContext { get; set; } private bool Working { get; set; } = true; diff --git a/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor b/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor index 15f157e5..bdb7da82 100644 --- a/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor +++ b/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor @@ -18,8 +18,9 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components @attribute [Authorize(Roles = "Advisor")] -@page "/customers/{CompanyId}/workplaces/{WorkplaceId}/documents" +@page "/advisor/customers/{CompanyId}/workplaces/{WorkplaceId}/documents" +Dokumenter for Arbejdssted

Dokumenter

@if (Working) diff --git a/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor.cs b/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor.cs index 2a6985d6..6dacf017 100644 --- a/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorWorkplaceDocumentListPage.razor.cs @@ -26,8 +26,8 @@ public partial class AdvisorWorkplaceDocumentListPage [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string WorkplaceId { get; set; } = ""; - [Inject] public HttpInterceptorService _interceptor { get; set; } - [Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; } + [Inject] private HttpInterceptorService _interceptor { get; set; } + [Inject] private IAdvisorWorkplaceRepository Workplaces { get; set; } private bool Working { get; set; } = true; } \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor b/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor index e26c8218..ee86f86e 100644 --- a/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor +++ b/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor @@ -18,11 +18,11 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components @attribute [Authorize(Roles = "Advisor")] -@page "/customers/{CompanyId}/workplaces" - +@page "/advisor/customers/{CompanyId}/workplaces" +@Company.Name arbejdssteder
-

@_company.Name

+

@Company.Name

diff --git a/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor.cs b/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor.cs index 0c8e3bd7..63a8afa9 100644 --- a/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorWorkplaceListPage.razor.cs @@ -27,25 +27,25 @@ namespace Wonky.Client.Pages; public partial class AdvisorWorkplaceListPage : IDisposable { [Parameter] public string CompanyId { get; set; } = ""; - [Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; } - [Inject] public IAdvisorCustomerRepository _companyRepo { get; set; } - [Inject] public HttpInterceptorService _interceptor { get; set; } + [Inject] private IAdvisorWorkplaceRepository Workplaces { get; set; } + [Inject] private IAdvisorCustomerRepository _companyRepo { get; set; } + [Inject] private HttpInterceptorService _interceptor { get; set; } private List _workplaces { get; set; } = new(); - private CompanyDto _company { get; set; } = new(); + private CompanyDto Company { get; set; } = new(); private bool Working { get; set; } = true; protected override async Task OnParametersSetAsync() { _interceptor.RegisterEvent(); _interceptor.RegisterBeforeSendEvent(); - _company = await _companyRepo.GetCompanyById(CompanyId); + Company = await _companyRepo.GetCompanyById(CompanyId); Working = false; } protected override async Task OnInitializedAsync() { Working = true; - _workplaces = await WorkplaceCrmRepo.GetWorkplaces(CompanyId); + _workplaces = await Workplaces.GetWorkplaces(CompanyId); Working = false; } diff --git a/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor b/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor index 9c920599..307977ba 100644 --- a/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor +++ b/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor @@ -19,13 +19,13 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components @attribute [Authorize(Roles = "Advisor")] -@page "/customers/{CompanyId}/workplaces/{WorkplaceId}" - +@page "/advisor/customers/{CompanyId}/workplaces/{WorkplaceId}" +@Workplace.CompanyName - @Workplace.Name
-

@_workplace.CompanyName

-

@_workplace.Name @(!string.IsNullOrWhiteSpace(_workplace.Description) ? $"- {_workplace.Description}" : "")

+

@Workplace.CompanyName

+

@Workplace.Name @(!string.IsNullOrWhiteSpace(Workplace.Description) ? $"- {Workplace.Description}" : "")

@@ -44,13 +44,13 @@ Navn - - + + Beskrivelse - - + + @@ -59,48 +59,48 @@ Produkter - - + + Masker - - + + Øjenskylleflaske - - + + Handsker - - + + Førstehjælp - - + + Sikkerhedsbriller - - + + Affald - - + + @@ -114,7 +114,7 @@
diff --git a/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor.cs b/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor.cs index 7f1bac00..f40f8ce2 100644 --- a/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorWorkplaceViewPage.razor.cs @@ -29,11 +29,11 @@ public partial class AdvisorWorkplaceViewPage : IDisposable { [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string WorkplaceId { get; set; } = ""; - [Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; } - [Inject] public IAdvisorCustomerRepository _companyRepo { get; set; } - [Inject] public HttpInterceptorService _interceptor { get; set; } - [Inject] public NavigationManager _navigator { get; set; } - private WorkplaceDto _workplace { get; set; } = new(); + [Inject] private IAdvisorWorkplaceRepository Workplaces { get; set; } + [Inject] private IAdvisorCustomerRepository _companyRepo { get; set; } + [Inject] private HttpInterceptorService _interceptor { get; set; } + [Inject] private NavigationManager _navigator { get; set; } + private WorkplaceDto Workplace { get; set; } = new(); private EditContext _editContext { get; set; } private bool Working { get; set; } = true; @@ -42,27 +42,27 @@ public partial class AdvisorWorkplaceViewPage : IDisposable _interceptor.RegisterEvent(); _interceptor.RegisterBeforeSendEvent(); - _workplace = await WorkplaceCrmRepo.GetWorkplace(CompanyId, WorkplaceId); + Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId); Working = false; } protected override void OnInitialized() { - _editContext = new EditContext(_workplace); + _editContext = new EditContext(Workplace); } private async Task SubmitUpdate() { Working = true; - await WorkplaceCrmRepo.UpdateWorkplace(CompanyId, _workplace); + await Workplaces.UpdateWorkplace(CompanyId, Workplace); Working = false; } private async Task DeleteWorkplace() { Working = true; - await WorkplaceCrmRepo.DeleteWorkplace(CompanyId, _workplace.WorkplaceId); - _navigator.NavigateTo($"/customers/{CompanyId}/workplaces"); + await Workplaces.DeleteWorkplace(CompanyId, Workplace.WorkplaceId); + _navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces"); } public void Dispose() diff --git a/Wonky.Client/Pages/CountryCatalogPage.razor b/Wonky.Client/Pages/CatalogCountryPage.razor similarity index 85% rename from Wonky.Client/Pages/CountryCatalogPage.razor rename to Wonky.Client/Pages/CatalogCountryPage.razor index 31a64d03..49bbfd1e 100644 --- a/Wonky.Client/Pages/CountryCatalogPage.razor +++ b/Wonky.Client/Pages/CatalogCountryPage.razor @@ -15,11 +15,14 @@ // *@ -@using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Warehouse")] -@page "/office/catalog/{CountryCode}" +@using Wonky.Client.Components +@attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")] +@page "/catalog" +@page "/catalog/{CountryCode}" + +Produkt Katalog @CountryName
@@ -42,7 +45,7 @@
diff --git a/Wonky.Client/Pages/CountryCatalogPage.razor.cs b/Wonky.Client/Pages/CatalogCountryPage.razor.cs similarity index 51% rename from Wonky.Client/Pages/CountryCatalogPage.razor.cs rename to Wonky.Client/Pages/CatalogCountryPage.razor.cs index 2be19ada..b8d085dc 100644 --- a/Wonky.Client/Pages/CountryCatalogPage.razor.cs +++ b/Wonky.Client/Pages/CatalogCountryPage.razor.cs @@ -13,9 +13,11 @@ // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // +using System.Text.Json; using Blazored.LocalStorage; using Wonky.Client.HttpInterceptors; using Microsoft.AspNetCore.Components; +using Wonky.Client.Helpers; using Wonky.Client.HttpInterfaces; using Wonky.Client.Services; using Wonky.Entity.Requests; @@ -23,90 +25,108 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class CountryCatalogPage : IDisposable +public partial class CatalogCountryPage : IDisposable { - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public ICountryCatalogRepository Catalog { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private ICountryCatalogRepository Catalog { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private NavigationManager Navigator { get; set; } [Parameter] public string CountryCode { get; set; } = ""; - + private List Items { get; set; } = new(); private MetaData MetaInfo { get; set; } = new(); - private CatalogPaging Paging = new(); - private UserPref Prefs = new(); + private CatalogPager Pager { get; set; } = new(); + private UserPref Prefs { get; set; } = new(); private UserInfoView UserInfo { get; set; } = new(); - private bool Working { get; set; } = true; + private bool Working { get; set; } + private string CountryName { get; set; } = ""; - protected override async Task OnParametersSetAsync() + protected override async Task OnInitializedAsync() { Prefs = await ProfileService.GetPreferences(); UserInfo = await Storage.GetItemAsync("_xu"); + + Pager.OrderBy = Prefs.ItemSort; - Paging.OrderBy = Prefs.ItemSort; - Paging.SearchColumn = Prefs.ItemSearch; - Paging.PageSize = Convert.ToInt32(Prefs.PageSize); + Pager.SearchColumn = Prefs.ItemSearch; + Pager.PageSize = Convert.ToInt32(Prefs.PageSize); Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); + + if (string.IsNullOrWhiteSpace(CountryCode)) + { + while (string.IsNullOrWhiteSpace(UserInfo.CountryCode)) + await Task.Delay(500); + + CountryCode = UserInfo.CountryCode.ToLower(); + Navigator.NavigateTo($"/catalog/{CountryCode}", false, true); + } - await FetchSalesItems(); + CountryName = Utils.CountryName(CountryCode); + await GetCatalogPaged(); } private async Task SetSearchPhrase(string searchTerm) { Items = new List(); - Paging.PageNumber = 1; - Paging.SearchTerm = searchTerm; - await FetchSalesItems(); + Pager.PageNumber = 1; + Pager.SearchTerm = searchTerm; + await GetCatalogPaged(); } private async Task SetPageSize(string pageSize) { Items = new List(); - Paging.PageSize = Convert.ToInt32(pageSize); - Paging.PageNumber = 1; - await FetchSalesItems(); + Pager.PageSize = Convert.ToInt32(pageSize); + Pager.PageNumber = 1; + await GetCatalogPaged(); } private async Task SetSearchCol(string columnName) { Items = new List(); - Paging.PageNumber = 1; - Paging.SearchColumn = columnName; - await FetchSalesItems(); + Pager.PageNumber = 1; + Pager.SearchColumn = columnName; + await GetCatalogPaged(); } private async Task SetSortCol(string orderBy) { Items = new List(); - Paging.OrderBy = orderBy; - await FetchSalesItems(); + Pager.OrderBy = orderBy; + await GetCatalogPaged(); } private async Task SetSelectedPage(int page) { Items = new List(); - Paging.PageNumber = page; - await FetchSalesItems(); + Pager.PageNumber = page; + await GetCatalogPaged(); } private async Task SetGroupCol(string groupFilter) { Items = new List(); - Paging.PageNumber = 1; - Paging.SelectGroup = groupFilter; - await FetchSalesItems(); + Pager.PageNumber = 1; + Pager.SelectGroup = groupFilter; + await GetCatalogPaged(); } - - private async Task FetchSalesItems() + + private async Task GetCatalogPaged() { + if (string.IsNullOrWhiteSpace(CountryCode)) + return; + if (Working) + return; Working = true; - var pagingResponse = await Catalog.GetSalesItemsPaged(CountryCode, Paging); + var page = await Catalog.GetSalesItemsPaged(CountryCode, Pager); + Items = page.Items!; + MetaInfo = page.MetaData!; Working = false; - Items = pagingResponse.Items!; - MetaInfo = pagingResponse.MetaData!; } public void Dispose() => Interceptor.DisposeEvent(); diff --git a/Wonky.Client/Pages/PrintCatalogPage.razor b/Wonky.Client/Pages/CatalogCountryPrintPage.razor similarity index 78% rename from Wonky.Client/Pages/PrintCatalogPage.razor rename to Wonky.Client/Pages/CatalogCountryPrintPage.razor index 5236afb3..6c8cb462 100644 --- a/Wonky.Client/Pages/PrintCatalogPage.razor +++ b/Wonky.Client/Pages/CatalogCountryPrintPage.razor @@ -17,10 +17,12 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Advisor,Warehouse")] -@page "/print/catalog" +@attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")] +@page "/catalog/{CountryCode}/print" - +Udskriv Katalog for @CountryName + + @if (Working) { diff --git a/Wonky.Client/Pages/CountryPrintCatalogPage.razor.cs b/Wonky.Client/Pages/CatalogCountryPrintPage.razor.cs similarity index 81% rename from Wonky.Client/Pages/CountryPrintCatalogPage.razor.cs rename to Wonky.Client/Pages/CatalogCountryPrintPage.razor.cs index 82216fa7..82605594 100644 --- a/Wonky.Client/Pages/CountryPrintCatalogPage.razor.cs +++ b/Wonky.Client/Pages/CatalogCountryPrintPage.razor.cs @@ -21,6 +21,7 @@ using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpRepository; using Microsoft.AspNetCore.Components; using Wonky.Client.Components; +using Wonky.Client.Helpers; using Wonky.Client.HttpInterfaces; using Wonky.Client.Services; using Wonky.Entity.DTO; @@ -29,24 +30,22 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class CountryPrintCatalogPage : IDisposable +public partial class CatalogCountryPrintPage : IDisposable { - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public ICountryCatalogRepository Catalog { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private ICountryCatalogRepository Catalog { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } [Parameter] public string CountryCode { get; set; } = ""; private List Items { get; set; } = new(); - private UserInfoView UserInfo { get; set; } = new(); private bool Working { get; set; } = true; + private string CountryName { get; set; } = ""; protected override async Task OnParametersSetAsync() { Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); - UserInfo = await Storage.GetItemAsync("_xu"); - Items = await Catalog.GetPriceList(CountryCode); - + CountryName = Utils.CountryName(CountryCode); Working = false; } diff --git a/Wonky.Client/Pages/CountryPrintCatalogPage.razor b/Wonky.Client/Pages/CountryPrintCatalogPage.razor deleted file mode 100644 index 3210d3d4..00000000 --- a/Wonky.Client/Pages/CountryPrintCatalogPage.razor +++ /dev/null @@ -1,29 +0,0 @@ -@* -// Copyright (C) 2022 FCS Frede's Computer Services. -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] -// -*@ - -@using Wonky.Client.Components -@using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Warehouse")] -@page "/print/catalog/{CountryCode}" - - - -@if (Working) -{ - -} - diff --git a/Wonky.Client/Pages/ErrorPage401.razor b/Wonky.Client/Pages/ErrorPage401.razor index dfd9abb3..1a57ddf5 100644 --- a/Wonky.Client/Pages/ErrorPage401.razor +++ b/Wonky.Client/Pages/ErrorPage401.razor @@ -16,6 +16,7 @@ *@ @page "/401" +Fejl 401
diff --git a/Wonky.Client/Pages/ErrorPage404.razor b/Wonky.Client/Pages/ErrorPage404.razor index fec60876..eeb6b1e7 100644 --- a/Wonky.Client/Pages/ErrorPage404.razor +++ b/Wonky.Client/Pages/ErrorPage404.razor @@ -17,6 +17,7 @@ @page "/page404" @page "/404" +Fejl 404
diff --git a/Wonky.Client/Pages/ErrorPage404.razor.cs b/Wonky.Client/Pages/ErrorPage404.razor.cs index c22a2502..33f18895 100644 --- a/Wonky.Client/Pages/ErrorPage404.razor.cs +++ b/Wonky.Client/Pages/ErrorPage404.razor.cs @@ -19,9 +19,9 @@ namespace Wonky.Client.Pages; public partial class ErrorPage404 { - [Inject] public NavigationManager NavigationManager { get; set; } + [Inject] private NavigationManager NavigationManager { get; set; } - public void NavigateToHome() + private void NavigateToHome() { // preserving the uri for later navigation var currUri = NavigationManager.Uri; diff --git a/Wonky.Client/Pages/ErrorPage500.razor b/Wonky.Client/Pages/ErrorPage500.razor index 17a568d0..ac123d2f 100644 --- a/Wonky.Client/Pages/ErrorPage500.razor +++ b/Wonky.Client/Pages/ErrorPage500.razor @@ -17,6 +17,7 @@ @page "/error" @page "/500" +Fejl 500
diff --git a/Wonky.Client/Pages/ErrorReportPage.razor b/Wonky.Client/Pages/ErrorReportPage.razor index da38f683..a29acc6f 100644 --- a/Wonky.Client/Pages/ErrorReportPage.razor +++ b/Wonky.Client/Pages/ErrorReportPage.razor @@ -16,6 +16,7 @@ *@ @page "/report-error/{errorCode:int}/{errorDescription}" +Fejlrapport

@ErrorCode

@ErrorDescription

diff --git a/Wonky.Client/Pages/Index.razor b/Wonky.Client/Pages/Index.razor index 81ff821d..b24eddcf 100644 --- a/Wonky.Client/Pages/Index.razor +++ b/Wonky.Client/Pages/Index.razor @@ -17,17 +17,17 @@ @using Wonky.Client.Components; @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Advisor,Admin,Office,Supervisor,Warehouse")] +@attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")] @page "/" @page "/index" @page "/home" - +Innotec Danmark A/S - - + + @code{ diff --git a/Wonky.Client/Pages/InfoPage.razor b/Wonky.Client/Pages/InfoPage.razor index fbb87db4..a6e68da8 100644 --- a/Wonky.Client/Pages/InfoPage.razor +++ b/Wonky.Client/Pages/InfoPage.razor @@ -20,8 +20,8 @@ @using Wonky.Entity.Configuration @using Microsoft.AspNetCore.Authorization @page "/info" - -@attribute [Authorize(Roles = "Advisor,Admin,Office,Warehouse")] +App Information +@attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")]
@@ -39,11 +39,23 @@
- +
+
+ +
+
+ +
+
+ +
+
+ +
diff --git a/Wonky.Client/Pages/Login.razor b/Wonky.Client/Pages/Login.razor index 5be25076..f036bff5 100644 --- a/Wonky.Client/Pages/Login.razor +++ b/Wonky.Client/Pages/Login.razor @@ -17,7 +17,7 @@ @using Wonky.Client.Components @page "/login/{returnUrl?}" - +App Login
@if (ShowAuthError) { diff --git a/Wonky.Client/Pages/Login.razor.cs b/Wonky.Client/Pages/Login.razor.cs index 3b08dffd..3cc13839 100644 --- a/Wonky.Client/Pages/Login.razor.cs +++ b/Wonky.Client/Pages/Login.razor.cs @@ -22,9 +22,9 @@ namespace Wonky.Client.Pages; public partial class Login { - [Inject] public NavigationManager NavigationManager { get; set; } - [Inject] public IAuthenticationService AuthenticationService { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] private NavigationManager NavigationManager { get; set; } + [Inject] private IAuthenticationService AuthenticationService { get; set; } + [Inject] private ILogger Logger { get; set; } [Parameter] public string ReturnUrl { get; set; } private CredentialDto _credentialDto = new (); private bool ShowAuthError { get; set; } @@ -45,7 +45,7 @@ public partial class Login } else { - Logger.LogInformation($"returnUrl={ReturnUrl}"); + Logger.LogInformation("returnUrl={}", ReturnUrl); var returnUrl = string.IsNullOrWhiteSpace(ReturnUrl) ? "/" : ReturnUrl; NavigationManager.NavigateTo(returnUrl); } diff --git a/Wonky.Client/Pages/Logout.razor.cs b/Wonky.Client/Pages/Logout.razor.cs index a855c368..5a9fed52 100644 --- a/Wonky.Client/Pages/Logout.razor.cs +++ b/Wonky.Client/Pages/Logout.razor.cs @@ -22,9 +22,9 @@ namespace Wonky.Client.Pages; public partial class Logout { - [Inject] public IAuthenticationService AuthenticationService { get; set; } - [Inject] public NavigationManager NavigationManager { get; set; } - [Inject] public ILocalStorageService LocalStorage { get; set; } + [Inject] private IAuthenticationService AuthenticationService { get; set; } + [Inject] private NavigationManager NavigationManager { get; set; } + [Inject] private ILocalStorageService LocalStorage { get; set; } protected override async Task OnInitializedAsync() { diff --git a/Wonky.Client/Pages/CountryCustomerListPage.razor b/Wonky.Client/Pages/OfficeCustomerCountryListPage.razor similarity index 60% rename from Wonky.Client/Pages/CountryCustomerListPage.razor rename to Wonky.Client/Pages/OfficeCustomerCountryListPage.razor index 1b0df42b..703ef319 100644 --- a/Wonky.Client/Pages/CountryCustomerListPage.razor +++ b/Wonky.Client/Pages/OfficeCustomerCountryListPage.razor @@ -17,37 +17,51 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Warehouse")] +@attribute [Authorize(Roles = "Admin,Office,Warehouse")] + @page "/office/customers/{countryCode}" +Kunde oversigt @CountryCode
- +
- +
- +
+ + @*
+ *@
- + +
+
+
+
+ Loading... +
+
-
- + @if (Working) { diff --git a/Wonky.Client/Pages/CountryCustomerListPage.razor.cs b/Wonky.Client/Pages/OfficeCustomerCountryListPage.razor.cs similarity index 77% rename from Wonky.Client/Pages/CountryCustomerListPage.razor.cs rename to Wonky.Client/Pages/OfficeCustomerCountryListPage.razor.cs index 43562e4d..1cc9acc2 100644 --- a/Wonky.Client/Pages/CountryCustomerListPage.razor.cs +++ b/Wonky.Client/Pages/OfficeCustomerCountryListPage.razor.cs @@ -28,28 +28,31 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages { - public partial class CountryCustomerListPage : IDisposable + public partial class OfficeCustomerCountryListPage : IDisposable { [Parameter] public string CountryCode { get; set; } = ""; - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public UserProfileService ProfileService { get; set; } - [Inject] public ICountryCustomerRepository Customers { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } + [Inject] private ICountryCustomerRepository CustomerRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private NavigationManager Navigator { get; set; } private List Companies { get; set; } = new(); private UserPref Prefs { get; set; } = new(); private UserInfoView UserInfo { get; set; } = new(); private string SavedSearch { get; set; } = ""; private bool IncludeFolded { get; set; } private bool Working { get; set; } = true; - private MetaData ResponseMeta { get; set; } = new(); + private MetaData PageData { get; set; } = new(); private CustomerPaging Paging { get; set; } = new(); + private string ButtonFoldedText { get; set; } = "Vis Ophørte"; protected override async Task OnParametersSetAsync() { + Working = true; + Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); - + // set preferences Prefs = await ProfileService.GetPreferences(); UserInfo = await Storage.GetItemAsync("_xu"); @@ -64,13 +67,13 @@ namespace Wonky.Client.Pages // get companies await FetchCustomers(); - Working = false; - } private async Task OnFoldedClick() { + Working = true; IncludeFolded = !IncludeFolded; + ButtonFoldedText = IncludeFolded ? "Vis Aktive" : "Vis Ophørte"; Companies = new List(); Paging.PageNumber = 1; Paging.HasFolded = IncludeFolded ? 1 : 0; @@ -79,6 +82,7 @@ namespace Wonky.Client.Pages private async Task SelectedPage(int page) { + Working = true; Companies = new List(); Paging.PageNumber = page; await FetchCustomers(); @@ -86,6 +90,7 @@ namespace Wonky.Client.Pages private async Task SetSearchCol(string searchColumn) { + Working = true; Companies = new List(); Paging.SearchColumn = searchColumn; Paging.PageNumber = 1; @@ -93,6 +98,7 @@ namespace Wonky.Client.Pages } private async Task SetPageSize(string pageSize) { + Working = true; Companies = new List(); Paging.PageSize = Convert.ToInt32(pageSize); Paging.PageNumber = 1; @@ -101,6 +107,7 @@ namespace Wonky.Client.Pages private async Task SetSearchPhrase(string searchTerm) { + Working = true; Companies = new List(); Paging.PageNumber = 1; Paging.SearchTerm = searchTerm; @@ -109,6 +116,7 @@ namespace Wonky.Client.Pages private async Task SetSortCol(string orderBy) { + Working = true; Companies = new List(); Paging.OrderBy = orderBy; await FetchCustomers(); @@ -117,10 +125,18 @@ namespace Wonky.Client.Pages private async Task FetchCustomers() { Working = true; - var pageRes = await Customers.GetCompaniesPaged(CountryCode, Paging); + var response = await CustomerRepo.GetCompaniesPaged(CountryCode, Paging); Working = false; - Companies = pageRes.Items; - ResponseMeta = pageRes.MetaData; + if (response.Items.Any()) + { + Companies = response.Items; + PageData = response.MetaData; + } + else + { + Companies = new List(); + PageData = new MetaData(); + } } public void Dispose() => Interceptor.DisposeEvent(); diff --git a/Wonky.Client/Pages/CountryCreateNewOrderPage.razor b/Wonky.Client/Pages/OfficeCustomerCreatePhoneOrderPage.razor similarity index 84% rename from Wonky.Client/Pages/CountryCreateNewOrderPage.razor rename to Wonky.Client/Pages/OfficeCustomerCreatePhoneOrderPage.razor index 1827437f..481cc0d6 100644 --- a/Wonky.Client/Pages/CountryCreateNewOrderPage.razor +++ b/Wonky.Client/Pages/OfficeCustomerCreatePhoneOrderPage.razor @@ -15,9 +15,12 @@ // *@ +@using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Warehouse")] -@page "/office/customers/{CountryCode}/{CompanyId}/view" +@attribute [Authorize(Roles = "Admin,Office,Warehouse")] +@page "/office/customers/{CountryCode}/{CompanyId}/order" + +Telefon Ordre - @Customer.Name - @Customer.Account
@@ -25,61 +28,47 @@
-
-
-

@Activity.Name - @Activity.Account

+
+
+

@Customer.Name - @Customer.Account

-@if (ReportClosed) -{ -
-
-

Der kan ikke oprettes bestilling når der findes rapport for @SelectedDate.ToShortDateString()

-
-
- -} -else -{ - + -
-
- - +
+ +
+ +
-
-
- -
+ +
- -
- - -
-
- -
- -
+ +
-
-
- -
+ +
+
+
+
+ + +
+
+
@@ -89,7 +78,7 @@ else -
+ Ordrekladde Global kladde (udløber efter @(DraftProvider.Draft.TimeToLiveInSeconds / 60)m inaktivitet) @@ -163,14 +152,14 @@ else
- +
- + @SelectedItem.Sku @@ -229,10 +218,11 @@ else - -
-
- -
+ +
+
+
-} +
+ + \ No newline at end of file diff --git a/Wonky.Client/Pages/CountryCreateNewOrderPage.razor.cs b/Wonky.Client/Pages/OfficeCustomerCreatePhoneOrderPage.razor.cs similarity index 54% rename from Wonky.Client/Pages/CountryCreateNewOrderPage.razor.cs rename to Wonky.Client/Pages/OfficeCustomerCreatePhoneOrderPage.razor.cs index 028a50e6..d729f0ef 100644 --- a/Wonky.Client/Pages/CountryCreateNewOrderPage.razor.cs +++ b/Wonky.Client/Pages/OfficeCustomerCreatePhoneOrderPage.razor.cs @@ -26,28 +26,32 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class CountryCreateNewOrderPage : IDisposable +public partial class OfficeCustomerCreatePhoneOrderPage : IDisposable { + [Inject] private ILogger Logger { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private ICountryCustomerRepository CustomerRepo { get; set; } + [Inject] private ICountryCustomerHistoryRepository InventoryRepo { get; set; } + [Inject] private ICountryReportRepository ReportRepo { get; set; } + [Inject] private ISystemUserRepository UserRepo { get; set; } + [Inject] private ICountryCatalogRepository Catalog { get; set; } + // parameters [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = ""; - [CascadingParameter] public DraftStateProvider DraftProvider { get; set; } - - [Inject] public ILogger Logger { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public ICountryCustomerRepository CustomerRepo { get; set; } - [Inject] public ICountryCustomerHistoryRepository InventoryRepo { get; set; } - [Inject] public ICountryReportRepository ReportRepo { get; set; } - [Inject] public ISystemUserRepository UserRepo { get; set; } - private DateTime SelectedDate { get; set; } - private CompanyDto _company { get; set; } = new(); - private List CustomerInventory { get; set; } = new(); + // private variables private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true}; + // class objects + private CompanyDto Customer { get; set; } = new(); + private List CustomerInventory { get; set; } = new(); private SalesItemView SelectedItem { get; set; } = new(); - private UserPref UserPrefs { get; set; } = new(); private ActivityDto Activity { get; set; } = new(); + private WebUserInfoView SalesRep { get; set; } = new(); + // edit context private EditContext ActivityContext { get; set; } + // variables + private DateTime SelectedDate { get; set; } private bool ShowItem { get; set; } private string Quantity { get; set; } = "1"; private string Price { get; set; } = "0"; @@ -55,67 +59,93 @@ public partial class CountryCreateNewOrderPage : IDisposable private bool ReportClosed { get; set; } private bool PoFormInvalid { get; set; } = true; private bool Working { get; set; } - private WebUserInfoView ThisUserInfo { get; set; } = new(); + private PriceCatalogModalOverlay CatalogOverlay { get; set; } = new(); protected override async Task OnInitializedAsync() { + Interceptor.RegisterEvent(); + Interceptor.RegisterBeforeSendEvent(); + + // setup edit context ActivityContext = new EditContext(Activity); ActivityContext.OnFieldChanged += HandleFieldChanged; ActivityContext.OnValidationStateChanged += ValidationChanged; - - Interceptor.RegisterEvent(); - Interceptor.RegisterBeforeSendEvent(); - _company = await CustomerRepo.GetByCustomerId(CountryCode, CompanyId); - var today = $"{DateTime.Now:yyyy-MM-dd}"; - var ts = _company.HistorySync; - if (ts != today) - ts = await InventoryRepo.ErpInvoiceToCrmRpc(CountryCode, CompanyId, ts); - while (ts != today) - await Task.Delay(500); - // raise flag if report is closed - ReportClosed = await ReportRepo.ReportExist(_company.SalesRepId, ts); - // customer inventory - CustomerInventory = await InventoryRepo.FetchInventory(CountryCode, CompanyId); - // get sales rep info - ThisUserInfo = await UserRepo.GetAdvisorInfo(_company.SalesRepId); - // setting up base data - Activity.BcId = _company.BcId; - Activity.ActivityStatusEnum = "noSale"; - Activity.VisitTypeEnum = _company.Account is "" or "NY" ? "new" : "recall"; - Activity.ActivityTypeEnum = "phone"; - Activity.ActivityStatusEnum = "order"; - Activity.CompanyId = _company.CompanyId; - Activity.SalesRepId = _company.SalesRepId; - Activity.SalesRep = ThisUserInfo.Advisor; - Activity.CountryCode = ThisUserInfo.CountryCode; - Activity.Account = _company.Account; - Activity.VatNumber = _company.VatNumber; - Activity.Email = _company.Email; - Activity.Phone = _company.Phone; - Activity.Mobile = _company.Mobile; - Activity.Name = _company.Name; - Activity.Address1 = _company.Address1; - Activity.Address2 = _company.Address2; - Activity.ZipCode = _company.ZipCode; - Activity.City = _company.City; - Activity.DlvName = _company.Name; - Activity.DlvAddress1 = _company.Address1; - Activity.DlvAddress2 = _company.Address2; - Activity.DlvZipCode = _company.ZipCode; - Activity.DlvCity = _company.City; - // Initialize date variable - SelectedDate = DateTime.Now; + + // fetch customer + Customer = await CustomerRepo.GetByCustomerId(CountryCode, CompanyId); + Logger.LogDebug("Customer => {}", JsonSerializer.Serialize(Customer)); + // + // var today = $"{DateTime.Now:yyyy-MM-dd}"; + // + // // initiate a sync to ensure up-to-date product history + // if (Customer.HistorySync != today) + // Customer.HistorySync = await InventoryRepo.InvoiceErpToCrmRpc(CountryCode, CompanyId, Customer.HistorySync); + // + // // fetch customer inventory + // CustomerInventory = await InventoryRepo.FetchInventory(CountryCode, CompanyId); + // Logger.LogDebug("Inventory => {}", JsonSerializer.Serialize(CustomerInventory)); + // + // // get sales rep info + // SalesRep = await UserRepo.GetAdvisorInfo(Customer.SalesRepId); + // Logger.LogDebug("SalesRep => {}", JsonSerializer.Serialize(SalesRep)); + // + // // set activity salesRep and countryCode + // Activity.SalesRep = SalesRep.Advisor; + // Activity.CountryCode = SalesRep.CountryCode; + // + // // add customer info into activity properties + // Activity.Account = Customer.Account; + // Activity.VatNumber = Customer.VatNumber; + // Activity.Email = Customer.Email; + // Activity.Phone = Customer.Phone; + // Activity.Mobile = Customer.Mobile; + // Activity.Name = Customer.Name; + // Activity.Address1 = Customer.Address1; + // Activity.Address2 = Customer.Address2; + // Activity.ZipCode = Customer.ZipCode; + // Activity.City = Customer.City; + // Activity.DlvName = Customer.Name; + // Activity.DlvAddress1 = Customer.Address1; + // Activity.DlvAddress2 = Customer.Address2; + // Activity.DlvZipCode = Customer.ZipCode; + // Activity.DlvCity = Customer.City; + // Activity.BcId = Customer.BcId; + // Activity.CompanyId = Customer.CompanyId; + // Activity.SalesRepId = Customer.SalesRepId; + // + // // setting up activity properties + // Activity.ActivityStatusEnum = "noSale"; + // Activity.VisitTypeEnum = "recall"; + // Activity.ActivityTypeEnum = "phone"; + // Activity.ActivityStatusEnum = "order"; + // + // // Initialize date variable + // SelectedDate = DateTime.Now; } private void CallPriceListModal() { - + CatalogOverlay.Show(); } + + private async Task PriceListCallback(SelectedSku sku) + { + // get selected item + if (string.IsNullOrWhiteSpace(sku.ItemId)) + return; + SelectedItem = await Catalog.GetSalesItemId(CountryCode, sku.ItemId); + ShowItem = true; + Price = sku.Rate; + Quantity = sku.Quantity; + StateHasChanged(); + } + private void CallPriceHistoryModal() { } + private void DeleteDraft() { @@ -141,7 +171,7 @@ public partial class CountryCreateNewOrderPage : IDisposable /// private async Task WorkDateComponentCallback(string workDate) { - ReportClosed = await ReportRepo.ReportExist(_company.SalesRepId, workDate); + ReportClosed = await ReportRepo.ReportExist(Customer.SalesRepId, workDate); SelectedDate = DateTime.Parse(workDate); Activity.ActivityDate = workDate; } @@ -153,21 +183,6 @@ public partial class CountryCreateNewOrderPage : IDisposable /// private void HandleFieldChanged(object sender, FieldChangedEventArgs e) { - Logger.LogDebug("ActivityNewPage => HandleFieldChanged => ActivityStatusEnum <= '{}'", Activity.ActivityStatusEnum); - DraftProvider.Draft.DraftType = Activity.ActivityStatusEnum; - if (Activity.ActivityStatusEnum == "noSale") - { - Logger.LogDebug("ActivityNewPage => ActivityStatusEnum == 'noSale' <= remove items"); - DraftProvider.Draft.Items = new List(); - - } - - // InvalidCanvas = InvalidActivityType; - if (Activity.YourRef.Length > 35 || Activity.ReferenceNumber.Length > 20 || DraftProvider.Draft.Items.Count == 0) - { - PoFormInvalid = true; - return; - } PoFormInvalid = !ActivityContext.Validate(); StateHasChanged(); } @@ -179,11 +194,6 @@ public partial class CountryCreateNewOrderPage : IDisposable /// private void ValidationChanged(object sender, ValidationStateChangedEventArgs e) { - if (string.IsNullOrEmpty(Activity.ActivityTypeEnum) && !ReportClosed) - { - PoFormInvalid = true; - return; - } PoFormInvalid = false; ActivityContext.OnFieldChanged -= HandleFieldChanged; ActivityContext.OnValidationStateChanged -= ValidationChanged; diff --git a/Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor b/Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor similarity index 78% rename from Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor rename to Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor index 3a96a0d4..abb27222 100644 --- a/Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor +++ b/Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor @@ -17,36 +17,38 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components -@attribute [Authorize(Roles = "Admin,Advisor,Warehouse")] +@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @page "/office/customers/{CompanyId}/orders/{OrderId}" - +@_reportItem.ESalesNumber - @_reportItem.Company.Name
- @if (_reportItem.Express) - { -
- +
+
+
+
- @if (_reportItem.ProcessStatusEnum == "None") + @if (_reportItem.Express) { - - -
-
-
- -
-
- -
+ @* +
+ +
+ *@ + @if (_reportItem.ProcessStatusEnum == "None") + { + + +
+
-
- - + + + } } - } +
+

@_reportItem.Company.Name

@if (_reportItem.Express) @@ -158,4 +160,4 @@ @if (Working) { -} +} \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor.cs b/Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor.cs similarity index 88% rename from Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor.cs rename to Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor.cs index f8ee5031..07d9324b 100644 --- a/Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor.cs +++ b/Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor.cs @@ -30,17 +30,17 @@ using Wonky.Client.Services; namespace Wonky.Client.Pages; -public partial class AdvisorCustomerOrderViewPage : IDisposable +public partial class OfficeCustomerOrderViewPage : IDisposable { [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string OrderId { get; set; } = ""; - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public ISystemSendMailService MailService { get; set; } - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public ISystemUserRepository SystemUserRepo { get; set; } - [Inject] public ILogger Logger { get; set; } - [Inject] public IToastService Toast { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] private ISystemSendMailService MailService { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private ISystemUserRepository SystemUserRepo { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private IToastService Toast { get; set; } private ReportItemView _reportItem { get; set; } = new(); private bool _isNotified { get; set; } private bool Working { get; set; } = true; @@ -109,6 +109,7 @@ public partial class AdvisorCustomerOrderViewPage : IDisposable Logger.LogDebug("SetExpressState Notification => \n {}", JsonSerializer.Serialize(msg)); // send a system generated email var sendMail = await MailService.SendMail("System", msg); + // result notification if (sendMail.IsSuccess) { @@ -122,6 +123,7 @@ public partial class AdvisorCustomerOrderViewPage : IDisposable .ShowWarning( $"Notifikation til {salesRep.FirstName} kunne ikke sendes. {sendMail.Message}", "ADVARSEL"); } + Logger.LogDebug("SendMail Result => \n {}", JsonSerializer.Serialize(sendMail)); // disable further notifications _isNotified = true; Working = false; diff --git a/Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor.css b/Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor.css similarity index 50% rename from Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor.css rename to Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor.css index 6396fa53..fed02a26 100644 --- a/Wonky.Client/Pages/AdvisorCustomerOrderViewPage.razor.css +++ b/Wonky.Client/Pages/OfficeCustomerOrderViewPage.razor.css @@ -1,6 +1,6 @@ #watermark { - position: fixed; - z-index: 999; + position: absolute; + z-index: -999; top: 10px; right: 0; } \ No newline at end of file diff --git a/Wonky.Client/Pages/CountryLandingPage.razor b/Wonky.Client/Pages/OfficeLandingPage.razor similarity index 89% rename from Wonky.Client/Pages/CountryLandingPage.razor rename to Wonky.Client/Pages/OfficeLandingPage.razor index 6efa458d..8115bb09 100644 --- a/Wonky.Client/Pages/CountryLandingPage.razor +++ b/Wonky.Client/Pages/OfficeLandingPage.razor @@ -16,16 +16,16 @@ *@ @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Warehouse")] +@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @page "/office/country" - +Kunde oversigt @CountryCode
Danmark
@@ -46,7 +46,7 @@
Norge
@@ -67,7 +67,7 @@
Sverige
diff --git a/Wonky.Client/Pages/CountryLandingPage.razor.cs b/Wonky.Client/Pages/OfficeLandingPage.razor.cs similarity index 82% rename from Wonky.Client/Pages/CountryLandingPage.razor.cs rename to Wonky.Client/Pages/OfficeLandingPage.razor.cs index 393bc45c..4e2ca41c 100644 --- a/Wonky.Client/Pages/CountryLandingPage.razor.cs +++ b/Wonky.Client/Pages/OfficeLandingPage.razor.cs @@ -4,7 +4,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class CountryLandingPage +public partial class OfficeLandingPage { [Parameter] public string CountryCode { get; set; } = ""; } \ No newline at end of file diff --git a/Wonky.Client/Pages/CountrySalesRepCustomerListPage.razor b/Wonky.Client/Pages/OfficeUserAdvisorCustomerListPage.razor similarity index 78% rename from Wonky.Client/Pages/CountrySalesRepCustomerListPage.razor rename to Wonky.Client/Pages/OfficeUserAdvisorCustomerListPage.razor index 6cca392e..3fa5f28e 100644 --- a/Wonky.Client/Pages/CountrySalesRepCustomerListPage.razor +++ b/Wonky.Client/Pages/OfficeUserAdvisorCustomerListPage.razor @@ -17,20 +17,22 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Warehouse")] +@attribute [Authorize(Roles = "Admin,Office")] @page "/office/users/advisors/{CountryCode}/{UserId}/customers" +Kundeliste for @SalesRep.FirstName @SalesRep.LastName +
- +
- +
- +
@@ -47,13 +49,13 @@
- + @if (Working) { diff --git a/Wonky.Client/Pages/CountrySalesRepCustomerListPage.razor.cs b/Wonky.Client/Pages/OfficeUserAdvisorCustomerListPage.razor.cs similarity index 88% rename from Wonky.Client/Pages/CountrySalesRepCustomerListPage.razor.cs rename to Wonky.Client/Pages/OfficeUserAdvisorCustomerListPage.razor.cs index 6b37dbb3..bca81efe 100644 --- a/Wonky.Client/Pages/CountrySalesRepCustomerListPage.razor.cs +++ b/Wonky.Client/Pages/OfficeUserAdvisorCustomerListPage.razor.cs @@ -19,16 +19,18 @@ using Wonky.Client.HttpInterfaces; using Wonky.Client.Services; using Wonky.Entity.DTO; using Wonky.Entity.Requests; +using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class CountrySalesRepCustomerListPage : IDisposable +public partial class OfficeUserAdvisorCustomerListPage : IDisposable { [Parameter] public string UserId { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "dk"; - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public ICountryCustomerRepository CustomerRepo { get; set; } - [Inject] public UserProfileService UserProfileService { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private ICountryCustomerRepository CustomerRepo { get; set; } + [Inject] private UserProfileService UserProfileService { get; set; } + [Inject] private ISystemUserRepository UserRepo { get; set; } private List CompanyList { get; set; } = new(); private MetaData ResponseMeta { get; set; } = new(); private CustomerPaging Paging = new(); @@ -36,12 +38,15 @@ public partial class CountrySalesRepCustomerListPage : IDisposable private string SavedSearch { get; set; } = ""; private bool IncludeFolded { get; set; } private bool Working { get; set; } = true; + private WebUserInfoView SalesRep { get; set; } = new(); protected override async Task OnParametersSetAsync() { Interceptor.DisposeEvent(); Interceptor.RegisterBeforeSendEvent(); + SalesRep = await UserRepo.GetAdvisorInfo(UserId); + // set preferences UserPref = await UserProfileService.GetPreferences(); Paging.OrderBy = UserPref.CompanySort; diff --git a/Wonky.Client/Pages/AdminSalesRepListPage.razor b/Wonky.Client/Pages/OfficeUserAdvisorListPage.razor similarity index 86% rename from Wonky.Client/Pages/AdminSalesRepListPage.razor rename to Wonky.Client/Pages/OfficeUserAdvisorListPage.razor index cc9ae0f3..eb5dcc36 100644 --- a/Wonky.Client/Pages/AdminSalesRepListPage.razor +++ b/Wonky.Client/Pages/OfficeUserAdvisorListPage.razor @@ -17,15 +17,17 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin")] +@attribute [Authorize(Roles = "Admin,Office")] @page "/office/users/advisors/{CountryCode}" +Sælger Oversigt @CountryName +

Sælgere

- +
diff --git a/Wonky.Client/Pages/AdminSalesRepListPage.razor.cs b/Wonky.Client/Pages/OfficeUserAdvisorListPage.razor.cs similarity index 71% rename from Wonky.Client/Pages/AdminSalesRepListPage.razor.cs rename to Wonky.Client/Pages/OfficeUserAdvisorListPage.razor.cs index 7a56e6ec..53bb4e7e 100644 --- a/Wonky.Client/Pages/AdminSalesRepListPage.razor.cs +++ b/Wonky.Client/Pages/OfficeUserAdvisorListPage.razor.cs @@ -1,22 +1,25 @@ using Microsoft.AspNetCore.Components; +using Wonky.Client.Helpers; using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterfaces; using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class AdminSalesRepListPage +public partial class OfficeUserAdvisorListPage :IDisposable { - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public ISystemUserRepository SystemUserRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private ISystemUserRepository SystemUserRepo { get; set; } [Parameter] public string CountryCode { get; set; } = ""; private List SalesReps { get; set; } = new(); private bool Working { get; set; } = true; + private string CountryName { get; set; } = ""; protected override async Task OnInitializedAsync() { Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); + CountryName = Utils.CountryName(CountryCode); var AdvisorList = await SystemUserRepo.GetAdvisors(); SalesReps = AdvisorList .Where(x => x.CountryCode.ToLower() == CountryCode && Convert.ToInt32(x.SalesRep) < 100) diff --git a/Wonky.Client/Pages/AdminReportListPage.razor b/Wonky.Client/Pages/OfficeUserAdvisorReportListPage.razor similarity index 86% rename from Wonky.Client/Pages/AdminReportListPage.razor rename to Wonky.Client/Pages/OfficeUserAdvisorReportListPage.razor index ae1bda17..92939bfd 100644 --- a/Wonky.Client/Pages/AdminReportListPage.razor +++ b/Wonky.Client/Pages/OfficeUserAdvisorReportListPage.razor @@ -17,14 +17,15 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin")] +@attribute [Authorize(Roles = "Admin,Office")] @page "/office/users/advisors/{CountryCode}/{UserId}/reports" +Rapport Arkiv @UserInfo.FirstName @UserInfo.LastName

Rapport Arkiv - @UserInfo.FirstName @UserInfo.LastName

- +
diff --git a/Wonky.Client/Pages/AdminReportListPage.razor.cs b/Wonky.Client/Pages/OfficeUserAdvisorReportListPage.razor.cs similarity index 88% rename from Wonky.Client/Pages/AdminReportListPage.razor.cs rename to Wonky.Client/Pages/OfficeUserAdvisorReportListPage.razor.cs index fe7abf87..5e41ba3c 100644 --- a/Wonky.Client/Pages/AdminReportListPage.razor.cs +++ b/Wonky.Client/Pages/OfficeUserAdvisorReportListPage.razor.cs @@ -23,14 +23,14 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class AdminReportListPage : IDisposable +public partial class OfficeUserAdvisorReportListPage : IDisposable { [Parameter] public string UserId { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = ""; - [Inject] public ICountryReportRepository ReportRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public ISystemUserRepository SystemUserRepo { get; set; } - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private ICountryReportRepository ReportRepo { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private ISystemUserRepository SystemUserRepo { get; set; } + [Inject] private NavigationManager Navigator { get; set; } private List ActivityReports { get; set; } = new(); private bool Working { get; set; } = true; private WebUserInfoView UserInfo { get; set; } = new(); diff --git a/Wonky.Client/Pages/AdminReportViewPage.razor b/Wonky.Client/Pages/OfficeUserAdvisorReportViewPage.razor similarity index 88% rename from Wonky.Client/Pages/AdminReportViewPage.razor rename to Wonky.Client/Pages/OfficeUserAdvisorReportViewPage.razor index 3977d043..3eb8c142 100644 --- a/Wonky.Client/Pages/AdminReportViewPage.razor +++ b/Wonky.Client/Pages/OfficeUserAdvisorReportViewPage.razor @@ -18,7 +18,7 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Models -@attribute [Authorize(Roles = "Admin")] +@attribute [Authorize(Roles = "Admin,Office")] @page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
@@ -32,7 +32,7 @@
- +
@@ -41,7 +41,7 @@ { @Report.ReportData.Name
-
+

@Report.ReportData.Name

@@ -53,7 +53,7 @@
- + } else diff --git a/Wonky.Client/Pages/AdminReportViewPage.razor.cs b/Wonky.Client/Pages/OfficeUserAdvisorReportViewPage.razor.cs similarity index 63% rename from Wonky.Client/Pages/AdminReportViewPage.razor.cs rename to Wonky.Client/Pages/OfficeUserAdvisorReportViewPage.razor.cs index 4c429c78..77c815ec 100644 --- a/Wonky.Client/Pages/AdminReportViewPage.razor.cs +++ b/Wonky.Client/Pages/OfficeUserAdvisorReportViewPage.razor.cs @@ -14,78 +14,42 @@ // using Blazored.LocalStorage; +using Blazored.Toast.Services; using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using Wonky.Client.Helpers; using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterfaces; using Wonky.Client.Models; using Wonky.Client.Services; +using Wonky.Client.Shared; +using Wonky.Entity.DTO; using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class AdminReportViewPage : IDisposable +public partial class OfficeUserAdvisorReportViewPage : IDisposable { - /// - /// Country code from url parameter - /// - [Parameter] - public string CountryCode { get; set; } = ""; - - /// - /// User entity Id from url parameter - /// - [Parameter] - public string UserId { get; set; } = ""; - - /// - /// Report Date - /// - [Parameter] - public string ReportDate { get; set; } = ""; - - /// - /// Injected interceptor service - /// - [Inject] - public HttpInterceptorService Interceptor { get; set; } - - /// - /// Injected administrative report http repo - /// - [Inject] - public ICountryReportRepository ReportRepo { get; set; } - - /// - /// Navigation Manager - /// - [Inject] - public NavigationManager Navigator { get; set; } - - /// - /// Logger service - /// - [Inject] - public ILogger Logger { get; set; } - - /// - /// Storage service - /// - [Inject] - public ILocalStorageService Storage { get; set; } - - /// - /// Preference service - /// - [Inject] - public UserProfileService ProfileService { get; set; } - + [Parameter] public string CountryCode { get; set; } = ""; + [Parameter] public string UserId { get; set; } = ""; + [Parameter] public string ReportDate { get; set; } = ""; + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private ICountryReportRepository ReportRepo { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private UserProfileService ProfileService { get; set; } + [Inject] private IJSRuntime JSRuntime { get; set; } + [Inject] private IToastService Toaster { get; set; } + [Inject] private IOrderProcessRepository ProcessRepo { get; set; } + private IJSObjectReference JsModule { get; set; } private ReportView Report { get; set; } = new(); private List Activities { get; set; } = new(); private bool Working { get; set; } = true; private UserPref Prefs = new(); private string ReturnUrl = ""; private string PrintUrl = ""; - + protected override async Task OnParametersSetAsync() { Interceptor.RegisterEvent(); @@ -97,16 +61,24 @@ public partial class AdminReportViewPage : IDisposable await FetchUserReport(ReportDate); } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + JsModule = await JSRuntime + .InvokeAsync("import", "/scripts/print-invoke.js"); + } + } private void Print(PTarget target) { ReturnUrl = new Uri(Navigator.Uri).AbsolutePath; switch (target) { case PTarget.OrderPage: - Navigator.NavigateTo($"/print/orders/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}"); + Navigator.NavigateTo($"/report/print/orders/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}"); break; case PTarget.FrontPage: - Navigator.NavigateTo($"/print/report/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}"); + Navigator.NavigateTo($"/report/print/summary/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}"); break; case PTarget.None: break; @@ -116,7 +88,26 @@ public partial class AdminReportViewPage : IDisposable throw new ArgumentOutOfRangeException(nameof(target), target, null); } } - + + private async Task Print() + { + var current = 0; + var orders = Report.ReportItems + .Where(x => x is { StatusTypeEnum: "Order", ProcessStatusEnum: "None" } ); + var count = orders.Count(); + foreach (var item in orders) + { + Toaster.ShowInfo($"Behandler {current++} af {count} ordrer. Vent venligst"); + await ProcessRepo.UpdateWarehouseOrderStatus(new OrderProcessState + { + OrderId = item.ActivityId, + ProcessStatusEnum = Utils.EnumToString(PStatus.Accepted) + }); + } + Toaster.ClearAll(); + await JsModule.InvokeVoidAsync("printInvoke"); + } + /// /// Work date component event handler /// diff --git a/Wonky.Client/Pages/BackendAdminSalesRepViewPage.razor b/Wonky.Client/Pages/OfficeUserAdvisorViewEditPage.razor similarity index 95% rename from Wonky.Client/Pages/BackendAdminSalesRepViewPage.razor rename to Wonky.Client/Pages/OfficeUserAdvisorViewEditPage.razor index 4326eb50..0afeab52 100644 --- a/Wonky.Client/Pages/BackendAdminSalesRepViewPage.razor +++ b/Wonky.Client/Pages/OfficeUserAdvisorViewEditPage.razor @@ -107,6 +107,11 @@

NULSTIL ADGANGSKODE

+
+

Password politik

+

Mindst 10 tegn bestående af store og små bogstaver samt tal.

+

Du kan teste pasword og danne stærke password på pw.nix.dk

+
diff --git a/Wonky.Client/Pages/BackendAdminSalesRepViewPage.razor.cs b/Wonky.Client/Pages/OfficeUserAdvisorViewEditPage.razor.cs similarity index 83% rename from Wonky.Client/Pages/BackendAdminSalesRepViewPage.razor.cs rename to Wonky.Client/Pages/OfficeUserAdvisorViewEditPage.razor.cs index bd2c117d..f178d85c 100644 --- a/Wonky.Client/Pages/BackendAdminSalesRepViewPage.razor.cs +++ b/Wonky.Client/Pages/OfficeUserAdvisorViewEditPage.razor.cs @@ -26,19 +26,19 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class BackendAdminSalesRepViewPage : IDisposable +public partial class OfficeUserAdvisorViewEditPage : IDisposable { [Parameter] public string UserId { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = ""; - [Inject] public HttpInterceptorService _interceptor { get; set; } - [Inject] public ISystemUserRepository SystemUserRepo { get; set; } - [Inject] public ILogger _logger { get; set; } - [Inject] public NavigationManager _navigator { get; set; } - [Inject] public IToastService _toast { get; set; } + [Inject] private HttpInterceptorService _interceptor { get; set; } + [Inject] private ISystemUserRepository SystemUserRepo { get; set; } + [Inject] private ILogger _logger { get; set; } + [Inject] private NavigationManager _navigator { get; set; } + [Inject] private IToastService _toast { get; set; } private WebUserInfoView UserInfo { get; set; } = new(); private EditContext _editContext { get; set; } private UserUpdateDto _updateInfo { get; set; } = new(); - private AdminResetPasswordDto _passwords { get; set; } = new(); + private ResetPasswordDto _passwords { get; set; } = new(); private EditContext _passwdContext { get; set; } private bool _pwInvalid { get; set; } = true; private bool Working { get; set; } = true; @@ -77,6 +77,8 @@ public partial class BackendAdminSalesRepViewPage : IDisposable _toast.ShowInfo("Sender data til server ..."); await SystemUserRepo.UpdateAdvisor(UserId, _updateInfo); Working = false; + _toast.ShowInfo("Sælger er opdateret ..."); + // _navigator.NavigateTo($"/office/users/advisors/{CountryCode}/{UserId}"); } private void PwHandleFieldChanged(object sender, FieldChangedEventArgs e) @@ -103,11 +105,13 @@ public partial class BackendAdminSalesRepViewPage : IDisposable if (Working) return; Working = true; + _toast.ShowInfo("Nulstiller adgangskode."); await SystemUserRepo.ResetUserPassword(UserId, _passwords.NewPassword, _passwords.ConfirmPassword); - _toast.ShowInfo("Password er nulstillet."); _passwords.NewPassword = ""; _passwords.ConfirmPassword = ""; Working = false; + _toast.ShowInfo("Adgangskode er nulstillet."); + // _navigator.NavigateTo($"/office/users/advisors/{CountryCode}/{UserId}"); } public void Dispose() { diff --git a/Wonky.Client/Pages/PreferencesPage.razor b/Wonky.Client/Pages/PreferencesPage.razor index 48011910..928f22d8 100644 --- a/Wonky.Client/Pages/PreferencesPage.razor +++ b/Wonky.Client/Pages/PreferencesPage.razor @@ -22,35 +22,35 @@
- +
- +
- +
- +
- +
diff --git a/Wonky.Client/Pages/PrintCatalogPage.razor.cs b/Wonky.Client/Pages/PrintCatalogPage.razor.cs deleted file mode 100644 index 7b054de0..00000000 --- a/Wonky.Client/Pages/PrintCatalogPage.razor.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (C) 2022 FCS Frede's Computer Services. -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] -// - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Blazored.LocalStorage; -using Wonky.Client.HttpInterceptors; -using Wonky.Client.HttpRepository; -using Microsoft.AspNetCore.Components; -using Wonky.Client.Components; -using Wonky.Client.HttpInterfaces; -using Wonky.Client.Services; -using Wonky.Entity.DTO; -using Wonky.Entity.Requests; -using Wonky.Entity.Views; - -namespace Wonky.Client.Pages; - -public partial class PrintCatalogPage : IDisposable -{ - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public IAdvisorCatalogRepository ItemRepo { get; set; } - [Inject] public HttpInterceptorService Interceptor { get; set; } - private List Items { get; set; } = new(); - private UserInfoView UserInfo { get; set; } = new(); - private bool Working { get; set; } = true; - - protected override async Task OnInitializedAsync() - { - Interceptor.RegisterEvent(); - Interceptor.RegisterBeforeSendEvent(); - UserInfo = await Storage.GetItemAsync("_xu"); - - Items = await ItemRepo.GetPriceList(); - Working = false; - } - - public void Dispose() => Interceptor.DisposeEvent(); - -} \ No newline at end of file diff --git a/Wonky.Client/Pages/PrintOrderPage.razor b/Wonky.Client/Pages/ReportPrintOrderPage.razor similarity index 72% rename from Wonky.Client/Pages/PrintOrderPage.razor rename to Wonky.Client/Pages/ReportPrintOrderPage.razor index f2371a6f..384751d5 100644 --- a/Wonky.Client/Pages/PrintOrderPage.razor +++ b/Wonky.Client/Pages/ReportPrintOrderPage.razor @@ -17,15 +17,21 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Advisor")] -@page "/print/orders/{CountryCode}/{UserId}/{ReportDate}" +@attribute [Authorize(Roles = "Admin,Office,Advisor")] +@page "/report/print/orders/{CountryCode}/{UserId}/{ReportDate}"
- + + + + + + +
@@ -33,7 +39,7 @@ { foreach (var item in Items.Where(item => item.StatusTypeEnum.ToLower() == "order" && item.ProcessStatusEnum.ToLower() == "none")) { - + } } else @@ -43,4 +49,4 @@ else

Der er ingen ordrer til udskrivning

-} +} \ No newline at end of file diff --git a/Wonky.Client/Pages/PrintOrderPage.razor.cs b/Wonky.Client/Pages/ReportPrintOrderPage.razor.cs similarity index 65% rename from Wonky.Client/Pages/PrintOrderPage.razor.cs rename to Wonky.Client/Pages/ReportPrintOrderPage.razor.cs index f42ceb12..aadd874d 100644 --- a/Wonky.Client/Pages/PrintOrderPage.razor.cs +++ b/Wonky.Client/Pages/ReportPrintOrderPage.razor.cs @@ -14,26 +14,34 @@ // using Blazored.LocalStorage; +using Blazored.Toast.Services; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using Wonky.Client.Helpers; +using Wonky.Client.HttpInterfaces; +using Wonky.Client.Models; +using Wonky.Client.Shared; +using Wonky.Entity.DTO; using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class PrintOrderPage +public partial class ReportPrintOrderPage { [Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string UserId { get; set; } = ""; [Parameter] public string ReportDate { get; set; } = ""; - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private IOrderProcessRepository ProcessRepo { get; set; } [Inject] private IJSRuntime JSRuntime { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] private ILogger Logger { get; set; } + [Inject] private IToastService Toaster { get; set; } private ReportView Report { get; set; } = new(); private List Items { get; set; } = new(); private IJSObjectReference JsModule { get; set; } private string ReturnUrl { get; set; } = ""; + protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) @@ -52,11 +60,30 @@ public partial class PrintOrderPage Report = await Storage.GetItemAsync($"{UserId}-{ReportDate}"); Items = Report.ReportItems; } + + private async Task OfficePrint() + { + var current = 0; + var orders = Report.ReportItems + .Where(x => x is { StatusTypeEnum: "Order", ProcessStatusEnum: "None" } ); + var count = orders.Count(); + foreach (var item in orders) + { + Toaster.ShowInfo($"Behandler {current++} af {count} ordrer. Vent venligst"); + await ProcessRepo.UpdateWarehouseOrderStatus(new OrderProcessState + { + OrderId = item.ActivityId, + ProcessStatusEnum = Utils.EnumToString(PStatus.Accepted) + }); + } + Toaster.ClearAll(); + await JsModule.InvokeVoidAsync("printInvoke"); + Navigator.NavigateTo(ReturnUrl); + } private async Task Print() { await JsModule.InvokeVoidAsync("printInvoke"); - Navigator.NavigateTo(ReturnUrl); } diff --git a/Wonky.Client/Pages/PrintFrontPage.razor b/Wonky.Client/Pages/ReportPrintSummaryPage.razor similarity index 79% rename from Wonky.Client/Pages/PrintFrontPage.razor rename to Wonky.Client/Pages/ReportPrintSummaryPage.razor index 7d2a0ebc..ef738bb0 100644 --- a/Wonky.Client/Pages/PrintFrontPage.razor +++ b/Wonky.Client/Pages/ReportPrintSummaryPage.razor @@ -17,8 +17,8 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Advisor")] -@page "/print/report/{CountryCode}/{UserId}/{ReportDate}" +@attribute [Authorize(Roles = "Admin,Office,Advisor")] +@page "/report/print/summary/{CountryCode}/{UserId}/{ReportDate}"
@@ -29,11 +29,13 @@
-
+
@Report.ReportData.Name
-
-

@Report.ReportData.Name

+
+
+

@Report.ReportData.Name

+
@@ -44,6 +46,6 @@
- +
\ No newline at end of file diff --git a/Wonky.Client/Pages/PrintFrontPage.razor.cs b/Wonky.Client/Pages/ReportPrintSummaryPage.razor.cs similarity index 90% rename from Wonky.Client/Pages/PrintFrontPage.razor.cs rename to Wonky.Client/Pages/ReportPrintSummaryPage.razor.cs index 11ccbd1a..f1646300 100644 --- a/Wonky.Client/Pages/PrintFrontPage.razor.cs +++ b/Wonky.Client/Pages/ReportPrintSummaryPage.razor.cs @@ -22,15 +22,15 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class PrintFrontPage +public partial class ReportPrintSummaryPage { [Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string UserId { get; set; } = ""; [Parameter] public string ReportDate { get; set; } = ""; - [Inject] public ILocalStorageService Storage { get; set; } - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private ILocalStorageService Storage { get; set; } + [Inject] private NavigationManager Navigator { get; set; } [Inject] private IJSRuntime JSRuntime { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] private ILogger Logger { get; set; } private ReportView Report { get; set; } = new(); private IJSObjectReference JsModule { get; set; } private string ReturnUrl { get; set; } = ""; diff --git a/Wonky.Client/Pages/WarehouseOrderListPage.razor b/Wonky.Client/Pages/WarehouseOrderListPage.razor index 8a2b7315..515e3c67 100644 --- a/Wonky.Client/Pages/WarehouseOrderListPage.razor +++ b/Wonky.Client/Pages/WarehouseOrderListPage.razor @@ -17,7 +17,7 @@ @using Wonky.Client.Components @using Microsoft.AspNetCore.Authorization -@attribute [Authorize(Roles = "Admin,Warehouse")] +@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @page "/warehouse/orders/{Status}"
@@ -33,4 +33,4 @@
\ No newline at end of file + OnGetStatus="GetStatusCallback" OnSetShipped="@SetShippedCallback" OnQPak="QPakCallback" /> \ No newline at end of file diff --git a/Wonky.Client/Pages/WarehouseOrderListPage.razor.cs b/Wonky.Client/Pages/WarehouseOrderListPage.razor.cs index 5e40b2f6..5fe729c9 100644 --- a/Wonky.Client/Pages/WarehouseOrderListPage.razor.cs +++ b/Wonky.Client/Pages/WarehouseOrderListPage.razor.cs @@ -3,6 +3,7 @@ using Wonky.Client.Helpers; using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterfaces; using Wonky.Client.Models; +using Wonky.Entity.DTO; using Wonky.Entity.Views; namespace Wonky.Client.Pages; @@ -11,9 +12,9 @@ public partial class WarehouseOrderListPage : IDisposable { [Parameter] public string Status { get; set; } = "none"; - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IWarehouseRepository WarehouseRepo { get; set; } - [Inject] public NavigationManager Navigator { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private IOrderProcessRepository OrderProcessRepo { get; set; } + [Inject] private NavigationManager Navigator { get; set; } private List OrderList { get; set; } private bool Working { get; set; } = true; private string Header { get; set; } = "Ubehandlet"; @@ -31,7 +32,7 @@ public partial class WarehouseOrderListPage : IDisposable OrderList = new List(); switch (status) { - case PStatus.None: + case PStatus.None or PStatus.Accepted: Header = "Ubehandlede ordrer"; ReadyToShip = false; break; @@ -66,12 +67,12 @@ public partial class WarehouseOrderListPage : IDisposable Working = true; var order = OrderList.First(x => x.OrderId == orderId); order.ProcessStatusEnum = "packed"; - var process = new WarehouseProcess + var process = new OrderProcessState { OrderId = order.OrderId, ProcessStatusEnum = "packed" }; - await WarehouseRepo.UpdateWarehouseOrderStatus(process); + await OrderProcessRepo.UpdateWarehouseOrderStatus(process); OrderList.Remove(order); Working = false; } @@ -84,12 +85,12 @@ public partial class WarehouseOrderListPage : IDisposable foreach (var order in OrderList.Where(order => order.ProcessStatusEnum.ToLower() == "packed")) { order.ProcessStatusEnum = "shipped"; - var process = new WarehouseProcess + var process = new OrderProcessState { OrderId = order.OrderId, ProcessStatusEnum = "shipped" }; - await WarehouseRepo.UpdateWarehouseOrderStatus(process); + await OrderProcessRepo.UpdateWarehouseOrderStatus(process); } Working = false; } @@ -97,7 +98,7 @@ public partial class WarehouseOrderListPage : IDisposable private async Task> FetchOrders(string status) { Working = true; - var orderList = await WarehouseRepo.GetWarehouseOrderListByStatus(status.ToLower()); + var orderList = await OrderProcessRepo.GetWarehouseOrderListByStatus(status.ToLower()); if(orderList.Any(x => x.Express)) orderList = orderList.OrderByDescending(x => x.Express).ToList(); Working = false; diff --git a/Wonky.Client/Pages/WarehouseOrderViewPage.razor b/Wonky.Client/Pages/WarehouseOrderViewPage.razor index 3d8f45e3..cb95d92f 100644 --- a/Wonky.Client/Pages/WarehouseOrderViewPage.razor +++ b/Wonky.Client/Pages/WarehouseOrderViewPage.razor @@ -17,7 +17,7 @@ @using Microsoft.AspNetCore.Authorization @using Wonky.Client.Components -@attribute [Authorize(Roles = "Admin,Warehouse")] +@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @page "/warehouse/orders/process/{OrderId}" @if (!string.IsNullOrWhiteSpace(Order.OrderDate)) @@ -106,7 +106,7 @@
- @if (Order.ProcessStatusEnum.ToLower() == "none") + @if (Order.ProcessStatusEnum.ToLower() is "none" or "accepted") { } diff --git a/Wonky.Client/Pages/WarehouseOrderViewPage.razor.cs b/Wonky.Client/Pages/WarehouseOrderViewPage.razor.cs index 8242936b..d562feb2 100644 --- a/Wonky.Client/Pages/WarehouseOrderViewPage.razor.cs +++ b/Wonky.Client/Pages/WarehouseOrderViewPage.razor.cs @@ -21,6 +21,7 @@ using Microsoft.AspNetCore.Components; using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterfaces; using Wonky.Client.HttpRepository; +using Wonky.Entity.DTO; using Wonky.Entity.Views; namespace Wonky.Client.Pages; @@ -28,11 +29,11 @@ namespace Wonky.Client.Pages; public partial class WarehouseOrderViewPage : IDisposable { [Parameter] public string OrderId { get; set; } = ""; - [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IWarehouseRepository WarehouseRepo { get; set; } - [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IToastService Toast { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] private HttpInterceptorService Interceptor { get; set; } + [Inject] private IOrderProcessRepository OrderProcessRepo { get; set; } + [Inject] private NavigationManager Navigator { get; set; } + [Inject] private IToastService Toast { get; set; } + [Inject] private ILogger Logger { get; set; } private WarehouseOrderView Order { get; set; } = new(); private bool Working { get; set; } = true; @@ -42,7 +43,7 @@ public partial class WarehouseOrderViewPage : IDisposable Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); if (!string.IsNullOrWhiteSpace(OrderId)) - Order = await WarehouseRepo.GetWarehouseOrder(OrderId); + Order = await OrderProcessRepo.GetWarehouseOrder(OrderId); Logger.LogDebug("Warehouse OrderView =>\n{}", JsonSerializer.Serialize(Order)); Working = false; @@ -54,12 +55,12 @@ public partial class WarehouseOrderViewPage : IDisposable return; Working = true; - var process = new WarehouseProcess + var process = new OrderProcessState { OrderId = Order.OrderId, ProcessStatusEnum = "picked" }; - await WarehouseRepo.UpdateWarehouseOrderStatus(process); + await OrderProcessRepo.UpdateWarehouseOrderStatus(process); Navigator.NavigateTo("/warehouse/orders/none"); } @@ -68,12 +69,12 @@ public partial class WarehouseOrderViewPage : IDisposable if (Working) return; Working = true; - var process = new WarehouseProcess + var process = new OrderProcessState { OrderId = Order.OrderId, ProcessStatusEnum = "packed" }; - await WarehouseRepo.UpdateWarehouseOrderStatus(process); + await OrderProcessRepo.UpdateWarehouseOrderStatus(process); Navigator.NavigateTo("/warehouse/orders/picked"); } @@ -82,12 +83,12 @@ public partial class WarehouseOrderViewPage : IDisposable if (Working) return; Working = true; - var process = new WarehouseProcess + var process = new OrderProcessState { OrderId = Order.OrderId, ProcessStatusEnum = "shipped" }; - await WarehouseRepo.UpdateWarehouseOrderStatus(process); + await OrderProcessRepo.UpdateWarehouseOrderStatus(process); Navigator.NavigateTo("/warehouse/orders/none"); } diff --git a/Wonky.Client/Program.cs b/Wonky.Client/Program.cs index a51e9c15..453bc5dc 100644 --- a/Wonky.Client/Program.cs +++ b/Wonky.Client/Program.cs @@ -60,8 +60,7 @@ builder.Services.AddScoped( builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); +builder.Services.AddScoped(); // administrative repositories builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -69,7 +68,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); // warehouse repository -builder.Services.AddScoped(); +builder.Services.AddScoped(); // mail service builder.Services.AddScoped(); // interceptor diff --git a/Wonky.Client/Services/AuthenticationService.cs b/Wonky.Client/Services/AuthenticationService.cs index 7856b45b..3c85b4ad 100644 --- a/Wonky.Client/Services/AuthenticationService.cs +++ b/Wonky.Client/Services/AuthenticationService.cs @@ -120,7 +120,9 @@ namespace Wonky.Client.Services { ((AuthStateProvider)_authStateProvider).NotifyUserLogout(); _client.DefaultRequestHeaders.Authorization = null; + var backupPreferences = _localStorage.GetItemAsync("preferences"); await _localStorage.ClearAsync(); + await _localStorage.SetItemAsync("preferences", backupPreferences); } public async Task UserInfo(bool write = false) diff --git a/Wonky.Client/Services/UserProfileService.cs b/Wonky.Client/Services/UserProfileService.cs index 58a9ee32..74618eb5 100644 --- a/Wonky.Client/Services/UserProfileService.cs +++ b/Wonky.Client/Services/UserProfileService.cs @@ -18,11 +18,11 @@ namespace Wonky.Client.Services; public record UserPref { - public string? CompanyFilterPhrase { get; set; } = ""; - public string? CompanySearch { get; set; } = "name"; - public string? CompanySort { get; set; } = "name"; - public string? ItemSearch { get; set; } = "name"; - public string? ItemSort { get; set; } = "name"; + public string CompanyFilterPhrase { get; set; } = ""; + public string CompanySearch { get; set; } = "name"; + public string CompanySort { get; set; } = "name"; + public string ItemSearch { get; set; } = "name"; + public string ItemSort { get; set; } = "name"; public string PageSize { get; set; } = "10"; public string WorkDate { get; set; } = ""; public int KmMorning { get; set; } @@ -32,6 +32,7 @@ public record UserPref public class UserProfileService { private readonly ILocalStorageService _localStorageService; + private const string KeyName = "preferences"; public event Action? OnChange; public UserProfileService(ILocalStorageService localStorageService) { @@ -46,7 +47,7 @@ public class UserProfileService { DateConfirmed = confirmed }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -58,7 +59,7 @@ public class UserProfileService { KmMorning = kmMorning }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -70,7 +71,7 @@ public class UserProfileService { CompanyFilterPhrase = filterPhrase }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -82,7 +83,7 @@ public class UserProfileService { WorkDate = $"{workDate:yyyy-MM-dd}" }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -91,7 +92,7 @@ public class UserProfileService var preferences = await GetPreferences(); var newPreferences = preferences with { CompanySearch = companySearch }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -100,7 +101,7 @@ public class UserProfileService var preferences = await GetPreferences(); var newPreferences = preferences with { CompanySort = companySort }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -109,7 +110,7 @@ public class UserProfileService var preferences = await GetPreferences(); var newPreferences = preferences with { ItemSearch = itemSearch }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -118,7 +119,7 @@ public class UserProfileService var preferences = await GetPreferences(); var newPreferences = preferences with { ItemSort = itemSort }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } @@ -127,13 +128,12 @@ public class UserProfileService var preferences = await GetPreferences(); var newPreferences = preferences with { PageSize = pageSize }; - await _localStorageService.SetItemAsync("preferences", newPreferences); + await _localStorageService.SetItemAsync(KeyName, newPreferences); OnChange?.Invoke(newPreferences); } public async Task GetPreferences() { - return await _localStorageService.GetItemAsync("preferences").ConfigureAwait(true) - ?? new UserPref(); + return await _localStorageService.GetItemAsync(KeyName) ?? new UserPref(); } } \ No newline at end of file diff --git a/Wonky.Client/Shared/ConfirmProductCheckModal.razor b/Wonky.Client/Shared/ConfirmProductCheckModalOverlay.razor similarity index 96% rename from Wonky.Client/Shared/ConfirmProductCheckModal.razor rename to Wonky.Client/Shared/ConfirmProductCheckModalOverlay.razor index 6aa75cee..34432c14 100644 --- a/Wonky.Client/Shared/ConfirmProductCheckModal.razor +++ b/Wonky.Client/Shared/ConfirmProductCheckModalOverlay.razor @@ -16,7 +16,7 @@ *@ @using Wonky.Client.Components