From d77f3b612f0dd3efcee130dce81368985c708d7f Mon Sep 17 00:00:00 2001 From: Frede Hundewadt Date: Mon, 15 May 2023 08:36:23 +0200 Subject: [PATCH] WIP --- ...Repository.cs => CrmActivityRepository.cs} | 8 +- ...tRepository.cs => CrmContactRepository.cs} | 8 +- ...ory.cs => CrmCustomerHistoryRepository.cs} | 8 +- ...Repository.cs => CrmCustomerRepository.cs} | 8 +- .../CrmPublicProductRepository.cs | 38 ++++++ ...ository.cs => CrmSalesReportRepository.cs} | 8 +- ...Repository.cs => CrmTaskItemRepository.cs} | 8 +- ...epository.cs => CrmWorkplaceRepository.cs} | 8 +- ...epository.cs => ICrmActivityRepository.cs} | 2 +- ...Repository.cs => ICrmContactRepository.cs} | 2 +- ...ry.cs => ICrmCustomerHistoryRepository.cs} | 2 +- ...epository.cs => ICrmCustomerRepository.cs} | 2 +- .../ICrmPublicProductRepository.cs | 9 ++ ...sitory.cs => ICrmSalesReportRepository.cs} | 2 +- ...epository.cs => ICrmTaskItemRepository.cs} | 2 +- ...pository.cs => ICrmWorkplaceRepository.cs} | 13 ++- .../SystemKrvProductRepository.cs | 59 ++++++++++ .../CustomerInventoryReorderOverlay.razor.cs | 2 +- .../CustomerInvoiceViewOverlay.razor.cs | 2 +- .../ProductHistoryOverlay.razor.cs | 2 +- .../ProductPriceHistoryOverlay.razor.cs | 2 +- .../Pages/AdvisorActivityCreatePage.razor | 2 +- .../Pages/AdvisorActivityCreatePage.razor.cs | 8 +- .../AdvisorActivityTodayListPage.razor.cs | 4 +- .../AdvisorActivityViewEditPage.razor.cs | 6 +- .../AdvisorCustomerActivityListPage.razor | 4 +- .../AdvisorCustomerActivityListPage.razor.cs | 6 +- .../Pages/AdvisorCustomerCreatePage.razor.cs | 2 +- .../AdvisorCustomerInventoryListPage.razor | 4 +- .../AdvisorCustomerInventoryListPage.razor.cs | 4 +- .../AdvisorCustomerInvoiceListPage.razor | 4 +- .../AdvisorCustomerInvoiceListPage.razor.cs | 4 +- .../AdvisorCustomerPagedListPage.razor.cs | 2 +- .../Pages/AdvisorCustomerViewEditPage.razor | 18 ++- .../AdvisorCustomerViewEditPage.razor.cs | 14 +-- .../Pages/AdvisorQuoteListPage.razor.cs | 8 +- .../Pages/AdvisorReportCreatePage.razor.cs | 8 +- .../Pages/AdvisorReportListPage.razor.cs | 4 +- .../Pages/AdvisorReportViewPage.razor.cs | 4 +- .../Pages/AdvisorTaskItemListCrmPage.razor.cs | 2 +- .../Pages/AdvisorTaskItemViewCrmPage.razor.cs | 2 +- .../CrmCustomerWorkplaceDocumentAddPage.razor | 52 +++++++++ ...mCustomerWorkplaceDocumentAddPage.razor.cs | 109 ++++++++++++++++++ ...zor => CrmCustomerWorkplaceListPage.razor} | 2 +- ... => CrmCustomerWorkplaceListPage.razor.cs} | 6 +- ...azor => CrmCustomerWorkplaceNewPage.razor} | 8 +- ...s => CrmCustomerWorkplaceNewPage.razor.cs} | 14 ++- ...=> CrmCustomerWorkplaceViewEditPage.razor} | 83 +++++++------ ...CrmCustomerWorkplaceViewEditPage.razor.cs} | 27 +++-- .../Pages/OfficeOrderViewPage.razor.cs | 6 +- .../SupervisorAdvisorActivityViewPage.razor | 2 +- .../Pages/SupervisorDocumentListPage.razor | 20 ++-- .../Pages/SupervisorDocumentNewPage.razor | 8 +- .../Pages/SupervisorDocumentNewPage.razor.cs | 2 +- .../SupervisorDocumentViewEditPage.razor | 8 +- .../SupervisorDocumentViewEditPage.razor.cs | 1 + Wonky.Client/Program.cs | 15 +-- Wonky.Client/Shared/ContactModal.razor.cs | 2 +- Wonky.Client/Wonky.Client.csproj | 3 +- Wonky.Client/wwwroot/appsettings.json | 11 +- Wonky.Client/wwwroot/icon-192.png | Bin 0 -> 13959 bytes Wonky.Client/wwwroot/icon-512.png | Bin 0 -> 63324 bytes Wonky.Client/wwwroot/index.html | 2 +- Wonky.Entity/Configuration/ApiConfig.cs | 5 + Wonky.Entity/DTO/WorkplaceBopCreate.cs | 29 +++++ Wonky.Entity/Views/ExternalProductListView.cs | 21 ++++ 66 files changed, 548 insertions(+), 193 deletions(-) rename Wonky.Client/HttpRepository/{AdvisorActivityRepository.cs => CrmActivityRepository.cs} (96%) rename Wonky.Client/HttpRepository/{AdvisorContactRepository.cs => CrmContactRepository.cs} (93%) rename Wonky.Client/HttpRepository/{AdvisorCustomerHistoryRepository.cs => CrmCustomerHistoryRepository.cs} (95%) rename Wonky.Client/HttpRepository/{AdvisorCustomerRepository.cs => CrmCustomerRepository.cs} (96%) create mode 100644 Wonky.Client/HttpRepository/CrmPublicProductRepository.cs rename Wonky.Client/HttpRepository/{AdvisorReportRepository.cs => CrmSalesReportRepository.cs} (95%) rename Wonky.Client/HttpRepository/{AdvisorTaskItemRepository.cs => CrmTaskItemRepository.cs} (93%) rename Wonky.Client/HttpRepository/{AdvisorWorkplaceRepository.cs => CrmWorkplaceRepository.cs} (95%) rename Wonky.Client/HttpRepository/{IAdvisorActivityRepository.cs => ICrmActivityRepository.cs} (98%) rename Wonky.Client/HttpRepository/{IAdvisorContactRepository.cs => ICrmContactRepository.cs} (97%) rename Wonky.Client/HttpRepository/{IAdvisorCustomerHistoryRepository.cs => ICrmCustomerHistoryRepository.cs} (97%) rename Wonky.Client/HttpRepository/{IAdvisorCustomerRepository.cs => ICrmCustomerRepository.cs} (98%) create mode 100644 Wonky.Client/HttpRepository/ICrmPublicProductRepository.cs rename Wonky.Client/HttpRepository/{IAdvisorReportRepository.cs => ICrmSalesReportRepository.cs} (97%) rename Wonky.Client/HttpRepository/{IAdvisorTaskItemRepository.cs => ICrmTaskItemRepository.cs} (97%) rename Wonky.Client/HttpRepository/{IAdvisorWorkplaceRepository.cs => ICrmWorkplaceRepository.cs} (92%) create mode 100644 Wonky.Client/HttpRepository/SystemKrvProductRepository.cs create mode 100644 Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor create mode 100644 Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor.cs rename Wonky.Client/Pages/{AdvisorCustomerWorkplaceListPage.razor => CrmCustomerWorkplaceListPage.razor} (97%) rename Wonky.Client/Pages/{AdvisorCustomerWorkplaceListPage.razor.cs => CrmCustomerWorkplaceListPage.razor.cs} (90%) rename Wonky.Client/Pages/{AdvisorCustomerWorkplaceNew.razor => CrmCustomerWorkplaceNewPage.razor} (94%) rename Wonky.Client/Pages/{AdvisorCustomerWorkplaceNew.razor.cs => CrmCustomerWorkplaceNewPage.razor.cs} (86%) rename Wonky.Client/Pages/{AdvisorCustomerWorkplaceViewEditPage.razor => CrmCustomerWorkplaceViewEditPage.razor} (75%) rename Wonky.Client/Pages/{AdvisorCustomerWorkplaceViewEditPage.razor.cs => CrmCustomerWorkplaceViewEditPage.razor.cs} (91%) create mode 100644 Wonky.Client/wwwroot/icon-192.png create mode 100644 Wonky.Client/wwwroot/icon-512.png create mode 100644 Wonky.Entity/DTO/WorkplaceBopCreate.cs create mode 100644 Wonky.Entity/Views/ExternalProductListView.cs diff --git a/Wonky.Client/HttpRepository/AdvisorActivityRepository.cs b/Wonky.Client/HttpRepository/CrmActivityRepository.cs similarity index 96% rename from Wonky.Client/HttpRepository/AdvisorActivityRepository.cs rename to Wonky.Client/HttpRepository/CrmActivityRepository.cs index 1763857a..f95ca13c 100644 --- a/Wonky.Client/HttpRepository/AdvisorActivityRepository.cs +++ b/Wonky.Client/HttpRepository/CrmActivityRepository.cs @@ -26,7 +26,7 @@ namespace Wonky.Client.HttpRepository; /// /// Implementing Interface Activity CRM Http repository /// -public class AdvisorActivityRepository : IAdvisorActivityRepository +public class CrmActivityRepository : ICrmActivityRepository { private readonly JsonSerializerOptions? _options = new JsonSerializerOptions { @@ -34,12 +34,12 @@ public class AdvisorActivityRepository : IAdvisorActivityRepository }; private readonly NavigationManager _navigation; - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _api; - public AdvisorActivityRepository(HttpClient client, - ILogger logger, + public CrmActivityRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions configuration) { _client = client; diff --git a/Wonky.Client/HttpRepository/AdvisorContactRepository.cs b/Wonky.Client/HttpRepository/CrmContactRepository.cs similarity index 93% rename from Wonky.Client/HttpRepository/AdvisorContactRepository.cs rename to Wonky.Client/HttpRepository/CrmContactRepository.cs index 28de1616..df8fd670 100644 --- a/Wonky.Client/HttpRepository/AdvisorContactRepository.cs +++ b/Wonky.Client/HttpRepository/CrmContactRepository.cs @@ -22,7 +22,7 @@ using Wonky.Entity.DTO; namespace Wonky.Client.HttpRepository; -public class AdvisorContactRepository : IAdvisorContactRepository +public class CrmContactRepository : ICrmContactRepository { private readonly JsonSerializerOptions _options = new () { @@ -30,12 +30,12 @@ public class AdvisorContactRepository : IAdvisorContactRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _conf; - public AdvisorContactRepository(HttpClient client, - ILogger logger, + public CrmContactRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions apiConfig) { diff --git a/Wonky.Client/HttpRepository/AdvisorCustomerHistoryRepository.cs b/Wonky.Client/HttpRepository/CrmCustomerHistoryRepository.cs similarity index 95% rename from Wonky.Client/HttpRepository/AdvisorCustomerHistoryRepository.cs rename to Wonky.Client/HttpRepository/CrmCustomerHistoryRepository.cs index ff8cbd17..20bc2931 100644 --- a/Wonky.Client/HttpRepository/AdvisorCustomerHistoryRepository.cs +++ b/Wonky.Client/HttpRepository/CrmCustomerHistoryRepository.cs @@ -22,7 +22,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.HttpRepository; -public class AdvisorCustomerHistoryRepository : IAdvisorCustomerHistoryRepository +public class CrmCustomerHistoryRepository : ICrmCustomerHistoryRepository { private readonly JsonSerializerOptions _options = new JsonSerializerOptions { @@ -30,12 +30,12 @@ public class AdvisorCustomerHistoryRepository : IAdvisorCustomerHistoryRepositor }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _api; - public AdvisorCustomerHistoryRepository( - HttpClient client, ILogger logger, + public CrmCustomerHistoryRepository( + HttpClient client, ILogger logger, NavigationManager navigation, IOptions configuration) { _client = client; diff --git a/Wonky.Client/HttpRepository/AdvisorCustomerRepository.cs b/Wonky.Client/HttpRepository/CrmCustomerRepository.cs similarity index 96% rename from Wonky.Client/HttpRepository/AdvisorCustomerRepository.cs rename to Wonky.Client/HttpRepository/CrmCustomerRepository.cs index 2ea3a07a..d6f2bbed 100644 --- a/Wonky.Client/HttpRepository/AdvisorCustomerRepository.cs +++ b/Wonky.Client/HttpRepository/CrmCustomerRepository.cs @@ -27,7 +27,7 @@ using Wonky.Entity.Requests; namespace Wonky.Client.HttpRepository; -public class AdvisorCustomerRepository : IAdvisorCustomerRepository +public class CrmCustomerRepository : ICrmCustomerRepository { private readonly JsonSerializerOptions _options = new() { @@ -35,12 +35,12 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _conf; - public AdvisorCustomerRepository(HttpClient client, - ILogger logger, + public CrmCustomerRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions apiConfig) { diff --git a/Wonky.Client/HttpRepository/CrmPublicProductRepository.cs b/Wonky.Client/HttpRepository/CrmPublicProductRepository.cs new file mode 100644 index 00000000..1c7c0edc --- /dev/null +++ b/Wonky.Client/HttpRepository/CrmPublicProductRepository.cs @@ -0,0 +1,38 @@ +using System.Net.Http.Json; +using System.Text.Json; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; +using Wonky.Entity.Configuration; +using Wonky.Entity.DTO; +using Wonky.Entity.Views; + +namespace Wonky.Client.HttpRepository; + +public class CrmPublicProductRepository : ICrmPublicProductRepository +{ + private readonly JsonSerializerOptions? _options = new() + { + PropertyNameCaseInsensitive = true + }; + + private readonly NavigationManager _navigation; + private ILogger _logger; + private readonly HttpClient _client; + private readonly ApiConfig _api; + + public CrmPublicProductRepository(HttpClient client, ILogger logger, + NavigationManager navigation, IOptions configuration) + { + _client = client; + _logger = logger; + _navigation = navigation; + _api = configuration.Value; + } + + public async Task> GetProducts() + { + var result = await _client + .GetFromJsonAsync>(_api.PublicProducts, _options); + return result ?? new List(); + } +} \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/AdvisorReportRepository.cs b/Wonky.Client/HttpRepository/CrmSalesReportRepository.cs similarity index 95% rename from Wonky.Client/HttpRepository/AdvisorReportRepository.cs rename to Wonky.Client/HttpRepository/CrmSalesReportRepository.cs index a844a93e..a627b3c7 100644 --- a/Wonky.Client/HttpRepository/AdvisorReportRepository.cs +++ b/Wonky.Client/HttpRepository/CrmSalesReportRepository.cs @@ -23,7 +23,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.HttpRepository; -public class AdvisorReportRepository : IAdvisorReportRepository +public class CrmSalesReportRepository : ICrmSalesReportRepository { private readonly JsonSerializerOptions _options = new JsonSerializerOptions { @@ -31,12 +31,12 @@ public class AdvisorReportRepository : IAdvisorReportRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _api; - public AdvisorReportRepository(HttpClient client, - ILogger logger, + public CrmSalesReportRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions configuration) { _client = client; diff --git a/Wonky.Client/HttpRepository/AdvisorTaskItemRepository.cs b/Wonky.Client/HttpRepository/CrmTaskItemRepository.cs similarity index 93% rename from Wonky.Client/HttpRepository/AdvisorTaskItemRepository.cs rename to Wonky.Client/HttpRepository/CrmTaskItemRepository.cs index 7081b009..876cfc93 100644 --- a/Wonky.Client/HttpRepository/AdvisorTaskItemRepository.cs +++ b/Wonky.Client/HttpRepository/CrmTaskItemRepository.cs @@ -22,7 +22,7 @@ using Wonky.Entity.DTO; namespace Wonky.Client.HttpRepository; -public class AdvisorTaskItemRepository : IAdvisorTaskItemRepository +public class CrmTaskItemRepository : ICrmTaskItemRepository { private readonly JsonSerializerOptions _options = new JsonSerializerOptions { @@ -31,12 +31,12 @@ public class AdvisorTaskItemRepository : IAdvisorTaskItemRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _apiConfig; - public AdvisorTaskItemRepository(HttpClient client, - ILogger logger, + public CrmTaskItemRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions configuration) { _client = client; diff --git a/Wonky.Client/HttpRepository/AdvisorWorkplaceRepository.cs b/Wonky.Client/HttpRepository/CrmWorkplaceRepository.cs similarity index 95% rename from Wonky.Client/HttpRepository/AdvisorWorkplaceRepository.cs rename to Wonky.Client/HttpRepository/CrmWorkplaceRepository.cs index f546373e..b70714da 100644 --- a/Wonky.Client/HttpRepository/AdvisorWorkplaceRepository.cs +++ b/Wonky.Client/HttpRepository/CrmWorkplaceRepository.cs @@ -23,7 +23,7 @@ using Wonky.Entity.Views; namespace Wonky.Client.HttpRepository; -public class AdvisorWorkplaceRepository : IAdvisorWorkplaceRepository +public class CrmWorkplaceRepository : ICrmWorkplaceRepository { private readonly JsonSerializerOptions? _options = new JsonSerializerOptions { @@ -31,13 +31,13 @@ public class AdvisorWorkplaceRepository : IAdvisorWorkplaceRepository }; private readonly NavigationManager _navigation; - private ILogger _logger; + private ILogger _logger; private readonly HttpClient _client; private readonly ApiConfig _api; - public AdvisorWorkplaceRepository(HttpClient client, - ILogger logger, + public CrmWorkplaceRepository(HttpClient client, + ILogger logger, NavigationManager navigation, IOptions configuration) { diff --git a/Wonky.Client/HttpRepository/IAdvisorActivityRepository.cs b/Wonky.Client/HttpRepository/ICrmActivityRepository.cs similarity index 98% rename from Wonky.Client/HttpRepository/IAdvisorActivityRepository.cs rename to Wonky.Client/HttpRepository/ICrmActivityRepository.cs index 51f155a4..08e97092 100644 --- a/Wonky.Client/HttpRepository/IAdvisorActivityRepository.cs +++ b/Wonky.Client/HttpRepository/ICrmActivityRepository.cs @@ -21,7 +21,7 @@ namespace Wonky.Client.HttpRepository; /// /// Interface Activity CRM Http repository /// -public interface IAdvisorActivityRepository +public interface ICrmActivityRepository { /// /// Get a list of open quotes diff --git a/Wonky.Client/HttpRepository/IAdvisorContactRepository.cs b/Wonky.Client/HttpRepository/ICrmContactRepository.cs similarity index 97% rename from Wonky.Client/HttpRepository/IAdvisorContactRepository.cs rename to Wonky.Client/HttpRepository/ICrmContactRepository.cs index 377407b7..47681d20 100644 --- a/Wonky.Client/HttpRepository/IAdvisorContactRepository.cs +++ b/Wonky.Client/HttpRepository/ICrmContactRepository.cs @@ -21,7 +21,7 @@ namespace Wonky.Client.HttpRepository; /// Interface for Contacts CRM Http repository /// /// -public interface IAdvisorContactRepository +public interface ICrmContactRepository { /// /// Create Contact diff --git a/Wonky.Client/HttpRepository/IAdvisorCustomerHistoryRepository.cs b/Wonky.Client/HttpRepository/ICrmCustomerHistoryRepository.cs similarity index 97% rename from Wonky.Client/HttpRepository/IAdvisorCustomerHistoryRepository.cs rename to Wonky.Client/HttpRepository/ICrmCustomerHistoryRepository.cs index c537b544..eaabee83 100644 --- a/Wonky.Client/HttpRepository/IAdvisorCustomerHistoryRepository.cs +++ b/Wonky.Client/HttpRepository/ICrmCustomerHistoryRepository.cs @@ -20,7 +20,7 @@ namespace Wonky.Client.HttpRepository; /// /// Interface Customer History CRM Http repository /// -public interface IAdvisorCustomerHistoryRepository +public interface ICrmCustomerHistoryRepository { /// /// Fetch Invoice LIst diff --git a/Wonky.Client/HttpRepository/IAdvisorCustomerRepository.cs b/Wonky.Client/HttpRepository/ICrmCustomerRepository.cs similarity index 98% rename from Wonky.Client/HttpRepository/IAdvisorCustomerRepository.cs rename to Wonky.Client/HttpRepository/ICrmCustomerRepository.cs index 7d63daed..ef82bc9a 100644 --- a/Wonky.Client/HttpRepository/IAdvisorCustomerRepository.cs +++ b/Wonky.Client/HttpRepository/ICrmCustomerRepository.cs @@ -22,7 +22,7 @@ namespace Wonky.Client.HttpRepository; /// /// Interface Customer CRM Http repository /// -public interface IAdvisorCustomerRepository +public interface ICrmCustomerRepository { /// /// Get a list of CRM customers (SalesRep) diff --git a/Wonky.Client/HttpRepository/ICrmPublicProductRepository.cs b/Wonky.Client/HttpRepository/ICrmPublicProductRepository.cs new file mode 100644 index 00000000..4b7b6a16 --- /dev/null +++ b/Wonky.Client/HttpRepository/ICrmPublicProductRepository.cs @@ -0,0 +1,9 @@ +using Wonky.Entity.DTO; +using Wonky.Entity.Views; + +namespace Wonky.Client.HttpRepository; + +public interface ICrmPublicProductRepository +{ + Task> GetProducts(); +} \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/IAdvisorReportRepository.cs b/Wonky.Client/HttpRepository/ICrmSalesReportRepository.cs similarity index 97% rename from Wonky.Client/HttpRepository/IAdvisorReportRepository.cs rename to Wonky.Client/HttpRepository/ICrmSalesReportRepository.cs index 299d5ce1..c624886e 100644 --- a/Wonky.Client/HttpRepository/IAdvisorReportRepository.cs +++ b/Wonky.Client/HttpRepository/ICrmSalesReportRepository.cs @@ -21,7 +21,7 @@ namespace Wonky.Client.HttpRepository; /// /// Interface Report Http repository /// -public interface IAdvisorReportRepository +public interface ICrmSalesReportRepository { /// /// Report Exist for given data (SalesRep) diff --git a/Wonky.Client/HttpRepository/IAdvisorTaskItemRepository.cs b/Wonky.Client/HttpRepository/ICrmTaskItemRepository.cs similarity index 97% rename from Wonky.Client/HttpRepository/IAdvisorTaskItemRepository.cs rename to Wonky.Client/HttpRepository/ICrmTaskItemRepository.cs index d96d5f77..b20ef1ab 100644 --- a/Wonky.Client/HttpRepository/IAdvisorTaskItemRepository.cs +++ b/Wonky.Client/HttpRepository/ICrmTaskItemRepository.cs @@ -20,7 +20,7 @@ namespace Wonky.Client.HttpRepository; /// /// Interface for handling CRM Tasks http repository /// -public interface IAdvisorTaskItemRepository +public interface ICrmTaskItemRepository { /// /// Get Task List (SalesRep) diff --git a/Wonky.Client/HttpRepository/IAdvisorWorkplaceRepository.cs b/Wonky.Client/HttpRepository/ICrmWorkplaceRepository.cs similarity index 92% rename from Wonky.Client/HttpRepository/IAdvisorWorkplaceRepository.cs rename to Wonky.Client/HttpRepository/ICrmWorkplaceRepository.cs index f376da68..98f0b6e2 100644 --- a/Wonky.Client/HttpRepository/IAdvisorWorkplaceRepository.cs +++ b/Wonky.Client/HttpRepository/ICrmWorkplaceRepository.cs @@ -21,7 +21,7 @@ namespace Wonky.Client.HttpRepository; /// /// Interface for handling Customer Workplaces (chemical document service) /// -public interface IAdvisorWorkplaceRepository +public interface ICrmWorkplaceRepository { /// /// Get Workplaces for given customer id @@ -70,6 +70,15 @@ public interface IAdvisorWorkplaceRepository /// Task GetWorkplaceInventory(string companyId, string workplaceId); + /// + /// Remove single document by Id + /// + /// + /// + /// + /// + Task DeleteWorkplaceDocuments(string companyId, string workplaceId, string documentId); + /// /// Remove a document pair from the workplace /// @@ -79,6 +88,4 @@ public interface IAdvisorWorkplaceRepository /// /// Task DeleteWorkplaceDocuments(string companyId, string workplaceId, string apbDocumentId, string apvDocumentId); - - Task DeleteWorkplaceDocuments(string companyId, string workplaceId, string documentId); } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/SystemKrvProductRepository.cs b/Wonky.Client/HttpRepository/SystemKrvProductRepository.cs new file mode 100644 index 00000000..e5ccb91d --- /dev/null +++ b/Wonky.Client/HttpRepository/SystemKrvProductRepository.cs @@ -0,0 +1,59 @@ +using System.Text.Json; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; +using Wonky.Entity.Configuration; +using Wonky.Entity.DTO; + +namespace Wonky.Client.HttpRepository; + +public class SystemKrvProductRepository : ISystemKrvProductRepository +{ + private readonly JsonSerializerOptions? _options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + + private readonly NavigationManager _navigation; + private ILogger _logger; + private readonly HttpClient _client; + private readonly ApiConfig _api; + + public SystemKrvProductRepository(HttpClient client, ILogger logger, + NavigationManager navigation, IOptions configuration) + { + _client = client; + _logger = logger; + _navigation = navigation; + _api = configuration.Value; + } + + public async Task> GetProducts() + { + throw new NotImplementedException(); + } + + public async Task GetProduct(string productId) + { + throw new NotImplementedException(); + } + + public async Task CreateProduct(KrvProductDto product) + { + throw new NotImplementedException(); + } + + public async Task DeleteProduct(string productId) + { + throw new NotImplementedException(); + } + + public async Task UpdateProduct(string productId, KrvProductDto product) + { + throw new NotImplementedException(); + } + + public async Task EditProduct(string productId) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Wonky.Client/OverlayCustomer/CustomerInventoryReorderOverlay.razor.cs b/Wonky.Client/OverlayCustomer/CustomerInventoryReorderOverlay.razor.cs index 3cb5f009..0e51b0cf 100644 --- a/Wonky.Client/OverlayCustomer/CustomerInventoryReorderOverlay.razor.cs +++ b/Wonky.Client/OverlayCustomer/CustomerInventoryReorderOverlay.razor.cs @@ -27,7 +27,7 @@ public partial class CustomerInventoryReorderOverlay { [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public SalesItemView SalesItem { get; set; } = new(); - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } [Parameter] public EventCallback OnSelected { get; set; } private List? History { get; set; } = new(); private DraftItem SelectedItem { get; set; } = new(); diff --git a/Wonky.Client/OverlayCustomer/CustomerInvoiceViewOverlay.razor.cs b/Wonky.Client/OverlayCustomer/CustomerInvoiceViewOverlay.razor.cs index e2298f10..87b4a322 100644 --- a/Wonky.Client/OverlayCustomer/CustomerInvoiceViewOverlay.razor.cs +++ b/Wonky.Client/OverlayCustomer/CustomerInvoiceViewOverlay.razor.cs @@ -27,7 +27,7 @@ public partial class CustomerInvoiceViewOverlay : IDisposable [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string InvoiceId { get; set; } = ""; [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } private string _modalDisplay = ""; private bool _showBackdrop; private InvoiceView Invoice { get; set; } = new(); diff --git a/Wonky.Client/OverlayOrderCreate/ProductHistoryOverlay.razor.cs b/Wonky.Client/OverlayOrderCreate/ProductHistoryOverlay.razor.cs index d0e669b3..e9cf918c 100644 --- a/Wonky.Client/OverlayOrderCreate/ProductHistoryOverlay.razor.cs +++ b/Wonky.Client/OverlayOrderCreate/ProductHistoryOverlay.razor.cs @@ -27,7 +27,7 @@ public partial class ProductHistoryOverlay // [Parameter] public EventCallback OnSelected { get; set; } [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string ItemSku { get; set; } = ""; - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } private List? History { get; set; } private string ProductName { get; set; } = ""; private string _modalDisplay = ""; diff --git a/Wonky.Client/OverlayOrderCreate/ProductPriceHistoryOverlay.razor.cs b/Wonky.Client/OverlayOrderCreate/ProductPriceHistoryOverlay.razor.cs index a41e48b0..2cd981be 100644 --- a/Wonky.Client/OverlayOrderCreate/ProductPriceHistoryOverlay.razor.cs +++ b/Wonky.Client/OverlayOrderCreate/ProductPriceHistoryOverlay.razor.cs @@ -27,7 +27,7 @@ public partial class ProductPriceHistoryOverlay [Parameter] public EventCallback OnSelected { get; set; } [Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string Sku { get; set; } = ""; - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } private List? ProductHistory { get; set; } private string ProductName { get; set; } = ""; private string _modalDisplay = ""; diff --git a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor index 8cb1e2d9..fc12a1ab 100644 --- a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor +++ b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor @@ -387,7 +387,7 @@ else
@* diff --git a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs index ed5d2885..6f8c17ae 100644 --- a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs @@ -45,10 +45,10 @@ public partial class AdvisorActivityCreatePage : IDisposable [Inject] public NavigationManager Navigator { get; set; } [Inject] public ILocalStorageService Storage { get; set; } [Inject] public ICountryCatalogRepository CatalogRepo { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } - [Inject] public IAdvisorActivityRepository ActivityRepo { get; set; } - [Inject] public IAdvisorReportRepository ReportRepo { get; set; } - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmCustomerRepository CompanyRepo { get; set; } + [Inject] public ICrmActivityRepository ActivityRepo { get; set; } + [Inject] public ICrmSalesReportRepository ReportRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } [Inject] public IUserInfoService UserInfo { get; set; } // ############################################################# diff --git a/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor.cs b/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor.cs index 2fa27958..17d9d9ba 100644 --- a/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityTodayListPage.razor.cs @@ -33,8 +33,8 @@ public partial class AdvisorActivityTodayListPage : IDisposable [Inject] public ILogger Logger { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IAdvisorActivityRepository ActivityRepo { get; set; } - [Inject] public IAdvisorReportRepository ReportRepo { get; set; } + [Inject] public ICrmActivityRepository ActivityRepo { get; set; } + [Inject] public ICrmSalesReportRepository ReportRepo { get; set; } [Inject] public IToastService Toaster { get; set; } private ReportStatusView ReportStatusView { get; set; } = new(); private UserPreference UserPreference { get; set; } = new(); diff --git a/Wonky.Client/Pages/AdvisorActivityViewEditPage.razor.cs b/Wonky.Client/Pages/AdvisorActivityViewEditPage.razor.cs index a2da8d68..85878c6b 100644 --- a/Wonky.Client/Pages/AdvisorActivityViewEditPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityViewEditPage.razor.cs @@ -31,7 +31,7 @@ public partial class AdvisorActivityViewEditPage : 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 ICrmActivityRepository CrmActivityRepo { get; set; } [Inject] public ILogger Logger { get; set; } [Inject] public IToastService Toaster { get; set; } [Inject] public NavigationManager Navigator { get; set; } @@ -49,7 +49,7 @@ public partial class AdvisorActivityViewEditPage : IDisposable Interceptor.RegisterBeforeSendEvent(); NoteContext = new EditContext(Note); NoteContext.OnFieldChanged += HandleFieldChanged; - ReportItem = await AdvisorActivityRepo.GetReportItem(OrderId); + ReportItem = await CrmActivityRepo.GetReportItem(OrderId); Note.ActivityId = ReportItem.ActivityId; Note.OfficeNote = ReportItem.OfficeNote; Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(ReportItem)); @@ -66,7 +66,7 @@ public partial class AdvisorActivityViewEditPage : IDisposable Working = true; Disabled = true; Logger.LogDebug("OfficeNote => \n {}", JsonSerializer.Serialize(Note)); - await AdvisorActivityRepo.UpdateOfficeNote(Note); + await CrmActivityRepo.UpdateOfficeNote(Note); Toaster.ShowInfo($"{ReportItem.ESalesNumber} - notat opdateret"); Navigator.NavigateTo("/advisor/activity-today"); } diff --git a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor index d9b3efda..7770a78d 100644 --- a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor @@ -28,10 +28,10 @@

@Company.Name

diff --git a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs index e4795de5..34a5a818 100644 --- a/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerActivityListPage.razor.cs @@ -28,8 +28,8 @@ public partial class AdvisorCustomerActivityListPage : IDisposable { // ###################################################################### [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] public ICrmActivityRepository CrmActivityRepo { get; set; } + [Inject] public ICrmCustomerRepository CompanyRepo { get; set; } // ###################################################################### [Parameter] public string CompanyId { get; set; } = ""; @@ -53,7 +53,7 @@ public partial class AdvisorCustomerActivityListPage : IDisposable private async Task GetActivities() { - ActivityList = await AdvisorActivityRepo.GetCustomerActivities(CompanyId); + ActivityList = await CrmActivityRepo.GetCustomerActivities(CompanyId); if (ActivityList.Any()) ActivityList = ActivityList.OrderByDescending(x => x.OrderDate).ToList(); } diff --git a/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs index 8bc6dff8..a50f758b 100644 --- a/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerCreatePage.razor.cs @@ -38,7 +38,7 @@ public partial class AdvisorCustomerCreatePage : IDisposable [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 ICrmCustomerRepository CompanyRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public VatInfoLookupService VatService { get; set; } [Inject] public IUserInfoService UserInfoService { get; set; } diff --git a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor index d3a1362a..972acd58 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor @@ -25,10 +25,10 @@

Produkt oversigt @Company.Name

diff --git a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs index 31f4b5d3..faae3dd6 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerInventoryListPage.razor.cs @@ -32,8 +32,8 @@ namespace Wonky.Client.Pages; public partial class AdvisorCustomerInventoryListPage : IDisposable { - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } - [Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmCustomerRepository CustomerRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public IToastService Toaster { get; set; } [Inject] public ILogger Logger { get; set; } diff --git a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor index b2c7ea48..f85c5c62 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor @@ -26,10 +26,10 @@

@Company.Name

diff --git a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs index d4f135ba..aaf7f038 100644 --- a/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerInvoiceListPage.razor.cs @@ -28,9 +28,9 @@ namespace Wonky.Client.Pages; public partial class AdvisorCustomerInvoiceListPage : IDisposable { - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] public ICrmCustomerRepository CompanyRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } [Inject] public IToastService Toaster { get; set; } [Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILogger Logger { get; set; } diff --git a/Wonky.Client/Pages/AdvisorCustomerPagedListPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerPagedListPage.razor.cs index 2944c191..ea14b873 100644 --- a/Wonky.Client/Pages/AdvisorCustomerPagedListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerPagedListPage.razor.cs @@ -31,7 +31,7 @@ public partial class AdvisorCustomerPagedListPage : IDisposable // ######################################################################3 [Inject] public ILocalStorageService Storage { get; set; } [Inject] public UserPreferenceService PreferenceService { get; set; } - [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } + [Inject] public ICrmCustomerRepository CompanyRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public NavigationManager Navigator { get; set; } [Inject] public IUserInfoService UserInfoService { get; set; } diff --git a/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor b/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor index af02ab6c..6d8ba61f 100644 --- a/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor +++ b/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor @@ -19,7 +19,7 @@ @using Wonky.Entity.Configuration @attribute [Authorize(Roles = "Advisor")] @page "/advisor/customers/{CompanyId}" -Kundekort for @Company.Name +Stamkort for @Company.Name @*
@@ -50,10 +50,16 @@

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

} -
-
- @Company.Name (@Company.Account) +
+
+
+ @Company.Name (@Company.Account) +
+ +
// erp context @@ -116,12 +122,12 @@ @if (!Kanvas) { - @if (AppInfo.Value.Rc) + @if (AppInfo!.Value!.Rc) {
- + diff --git a/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor.cs b/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor.cs index a7558689..6a9e48b7 100644 --- a/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorCustomerViewEditPage.razor.cs @@ -40,9 +40,9 @@ public partial class AdvisorCustomerViewEditPage : IDisposable [Inject] public IToastService Toaster { get; set; } [Inject] public ILogger Logger { get; set; } [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; } - [Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } - [Inject] public IAdvisorContactRepository AdvisorContactRepo { get; set; } + [Inject] public ICrmCustomerRepository CustomerRepo { get; set; } + [Inject] public ICrmCustomerHistoryRepository HistoryRepo { get; set; } + [Inject] public ICrmContactRepository CrmContactRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public VatInfoLookupService VatService { get; set; } [Inject] public ILocalStorageService Storage { get; set; } @@ -206,7 +206,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable private async Task FetchContacts(string companyId) { // load contacts - Contacts = await AdvisorContactRepo.GetContacts(companyId); + Contacts = await CrmContactRepo.GetContacts(companyId); if (Contacts.Any() && Contacts.Count > 1) Contacts = Contacts.OrderBy(x => x.FirstName).ToList(); } @@ -273,14 +273,14 @@ public partial class AdvisorCustomerViewEditPage : IDisposable // new contact created Logger.LogDebug("create => {}", jsonContact); // send post request to backend - await AdvisorContactRepo.CreateContact(contact); + await CrmContactRepo.CreateContact(contact); } else { // contact modified Logger.LogDebug("update => {}", jsonContact); // send put request to backend - await AdvisorContactRepo.UpdateContact(contact); + await CrmContactRepo.UpdateContact(contact); } // reset selected contact @@ -299,7 +299,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable Working = true; Logger.LogDebug("delete {}", contactId); // send delete request to backend - await AdvisorContactRepo.DeleteContact(CompanyId, contactId); + await CrmContactRepo.DeleteContact(CompanyId, contactId); // reset selected contact SelectedContact = new ContactDto(); // reload contacts from backend diff --git a/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs b/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs index 4b900784..7ca9602d 100644 --- a/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorQuoteListPage.razor.cs @@ -29,7 +29,7 @@ namespace Wonky.Client.Pages; public partial class AdvisorQuoteListPage : IDisposable { - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] public ICrmActivityRepository CrmActivityRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public ILogger Logger { get; set; } [Inject] public IToastService Toaster { get; set; } @@ -44,7 +44,7 @@ public partial class AdvisorQuoteListPage : IDisposable Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); Working = true; - QuoteList = await AdvisorActivityRepo.GetQuotes(); + QuoteList = await CrmActivityRepo.GetQuotes(); await Storage.SetItemAsync("quotes", QuoteList.OrderBy(x => x.Company.Name)); Working = false; // filter quotes - if any - default to QStatus.NoteOpen @@ -76,12 +76,12 @@ public partial class AdvisorQuoteListPage : IDisposable quote.OrderDate = $"{DateTime.Now:yyyy-MM-dd}"; quote.QuoteStatusEnum = Utils.EnumToString(args.Status); // send update request to backend - var response = await AdvisorActivityRepo.UpdateQuoteStatus(quote); + var response = await CrmActivityRepo.UpdateQuoteStatus(quote); Toaster.ShowInfo($"{response.Message}"); // clear and reload quotes QuoteList = new List(); await Storage.RemoveItemAsync("quotes"); - QuoteList = await AdvisorActivityRepo.GetQuotes(); + QuoteList = await CrmActivityRepo.GetQuotes(); // store quotes in local storage await Storage.SetItemAsync("quotes", QuoteList.OrderBy(x => x.Company.Name)); // filter quotes - if any - based on active filter diff --git a/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs index fc36d13a..4c29fdbd 100644 --- a/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs @@ -34,7 +34,7 @@ public partial class AdvisorReportCreatePage : IDisposable // ########################################################################## [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public UserPreferenceService PreferenceService { get; set; } - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } + [Inject] public ICrmSalesReportRepository CrmSalesReportRepo { get; set; } [Inject] public NavigationManager Navigator { get; set; } [Inject] public ILogger Logger { get; set; } [Inject] public IToastService Toaster { get; set; } @@ -95,7 +95,7 @@ public partial class AdvisorReportCreatePage : IDisposable ThisWorkDate = DateTime.Parse(WorkDate); } - if (await AdvisorReportRepo.ReportExist(WorkDate)) + if (await CrmSalesReportRepo.ReportExist(WorkDate)) { Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}"); } @@ -133,7 +133,7 @@ public partial class AdvisorReportCreatePage : IDisposable InitialValues = new ReportFiguresDto(); Activities = new List(); - var data = await AdvisorReportRepo.InitializeReportData(WorkDate); + var data = await CrmSalesReportRepo.InitializeReportData(WorkDate); if(data.ReportClosed) Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}"); @@ -201,7 +201,7 @@ public partial class AdvisorReportCreatePage : IDisposable return; Working = true; - var result = await AdvisorReportRepo.CreateReport(WorkDate, Report); + var result = await CrmSalesReportRepo.CreateReport(WorkDate, Report); Logger.LogDebug("CreateReport.result => {}", JsonSerializer.Serialize(result)); // reset km and date confirmation diff --git a/Wonky.Client/Pages/AdvisorReportListPage.razor.cs b/Wonky.Client/Pages/AdvisorReportListPage.razor.cs index 53fd88f3..688a78d3 100644 --- a/Wonky.Client/Pages/AdvisorReportListPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportListPage.razor.cs @@ -24,7 +24,7 @@ namespace Wonky.Client.Pages; public partial class AdvisorReportListPage : IDisposable { - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } + [Inject] public ICrmSalesReportRepository CrmSalesReportRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public NavigationManager Navigator { get; set; } [Inject] public ILogger Logger { get; set; } @@ -39,7 +39,7 @@ public partial class AdvisorReportListPage : IDisposable Working = true; - var reports = await AdvisorReportRepo.GetReports(); + var reports = await CrmSalesReportRepo.GetReports(); if (reports.Any()) ReportList = reports.OrderByDescending(x => x.ReportDate).ToList(); diff --git a/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs b/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs index 32080ebc..fcea1381 100644 --- a/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportViewPage.razor.cs @@ -30,7 +30,7 @@ namespace Wonky.Client.Pages; public partial class AdvisorReportViewPage : IDisposable { [Parameter] public string ReportDate { get; set; } - [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } + [Inject] public ICrmSalesReportRepository CrmSalesReportRepo { get; set; } [Inject] public NavigationManager Navigator { get; set; } [Inject] public ILocalStorageService Storage { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } @@ -106,7 +106,7 @@ public partial class AdvisorReportViewPage : IDisposable Working = true; // fetch report - Report = await AdvisorReportRepo.GetReport(workDate); + Report = await CrmSalesReportRepo.GetReport(workDate); // extract activities Activities = Report.ReportItems.Where(x => x.Lines.Any()).ToList(); diff --git a/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs b/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs index 89941c8e..07114053 100644 --- a/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorTaskItemListCrmPage.razor.cs @@ -30,7 +30,7 @@ public partial class AdvisorTaskItemListCrmPage : IDisposable [Inject] public ILogger Logger { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public NavigationManager Navigator { get; set; } - [Inject] public IAdvisorTaskItemRepository TaskRepo { get; set; } + [Inject] public ICrmTaskItemRepository TaskRepo { get; set; } [Inject] public IToastService Toaster { get; set; } private UserPreference Profile { get; set; } = new(); private string WorkDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}"; diff --git a/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs b/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs index b5e3a969..62f16620 100644 --- a/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs +++ b/Wonky.Client/Pages/AdvisorTaskItemViewCrmPage.razor.cs @@ -28,7 +28,7 @@ public partial class AdvisorTaskItemViewCrmPage : IDisposable { [Parameter] public string TaskItemId { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorTaskItemRepository TaskRepo { get; set; } + [Inject] public ICrmTaskItemRepository TaskRepo { get; set; } private TaskItemDto TaskItem { get; set; } = new (); private EditContext TaskContext { get; set; } private bool Working { get; set; } = true; diff --git a/Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor b/Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor new file mode 100644 index 00000000..cf0cf948 --- /dev/null +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor @@ -0,0 +1,52 @@ +@* Copyright (C) 2022 FCS Frede's Computer Services. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] +*@ + +@using Microsoft.AspNetCore.Authorization +@using Wonky.Client.Components +@attribute [Authorize(Roles = "Advisor")] +@page "/advisor/customers/{CompanyId}/workplaces/{WorkplaceId}/newdoc" +@Workplace.CompanyName - @Workplace.Name +
+
+

@Workplace.CompanyName

+
+
+

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

+
+ + +
+ + + +@if (Working) +{ + +} + + +@* +
+
+ + + +
+
+*@ diff --git a/Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor.cs b/Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor.cs new file mode 100644 index 00000000..7b572cf6 --- /dev/null +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceDocumentAddPage.razor.cs @@ -0,0 +1,109 @@ +// Copyright (C) 2022 FCS Frede's Computer Services. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] +// + +using System.Text; +using System.Text.Json; +using Blazored.Toast.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using Wonky.Client.HttpInterceptors; +using Wonky.Client.HttpRepository; +using Wonky.Client.Local.Services; +using Wonky.Client.Models; +using Wonky.Client.Shared; +using Wonky.Entity.DTO; +using Wonky.Entity.Views; +using Wonky.Client.Helpers; + +#pragma warning disable CS8618 +namespace Wonky.Client.Pages; + +public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable +{ + // ############################################################# + [Inject] public ICrmWorkplaceRepository Workplaces { get; set; } + [Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; } + [Inject] public HttpInterceptorService Interceptor { get; set; } + [Inject] public NavigationManager Navigator { get; set; } + [Inject] public ILogger Logger { get; set; } + [Inject] public ISystemSendMailService SendMail { get; set; } + [Inject] public IToastService Toaster { get; set; } + + // ############################################################# + [Parameter] public string CompanyId { get; set; } = ""; + [Parameter] public string WorkplaceId { get; set; } = ""; + + // ############################################################# + private WorkplaceDto Workplace { get; set; } = new(); + private EditContext WorkplaceContext { get; set; } + private bool Working { get; set; } = true; + private WorkplaceInventory WorkplaceInventory { get; set; } = new(); + private List DocViews { get; set; } = new(); + private ConfirmDeleteModal ConfirmDeleteWorkplace { get; set; } + private ConfirmDeleteModal ConfirmDeleteProduct { get; set; } + private string DeleteMessage { get; set; } = ""; + private string LinkRecipients { get; set; } = ""; + private const string CopyText = "Kopier"; + private const string CopyStyle = "btn btn-primary"; + private const string SuccessText = "Kopieret"; + private const string SuccessStyle = "btn btn-success"; + private string _buttonText = CopyText; + private string _buttonStyle = CopyStyle; + + + protected override async Task OnInitializedAsync() + { + WorkplaceContext = new EditContext(Workplace); + WorkplaceContext.OnFieldChanged += HandleFieldChanged!; + WorkplaceContext.OnValidationStateChanged += ValidationChanged!; + + Interceptor.RegisterEvent(); + Interceptor.RegisterBeforeSendEvent(); + + Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId); + WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId); + + Working = false; + } + + + private void HandleFieldChanged(object sender, FieldChangedEventArgs e) + { + + WorkplaceContext.Validate(); + + StateHasChanged(); + } + + + private void ValidationChanged(object sender, ValidationStateChangedEventArgs e) + { + WorkplaceContext.OnFieldChanged -= HandleFieldChanged!; + WorkplaceContext.OnValidationStateChanged -= ValidationChanged!; + + WorkplaceContext = new EditContext(Workplace); + + WorkplaceContext.OnFieldChanged += HandleFieldChanged!; + WorkplaceContext.OnValidationStateChanged += ValidationChanged!; + } + + + public void Dispose() + { + WorkplaceContext.OnFieldChanged += HandleFieldChanged!; + WorkplaceContext.OnValidationStateChanged += ValidationChanged!; + Interceptor.DisposeEvent(); + } +} diff --git a/Wonky.Client/Pages/AdvisorCustomerWorkplaceListPage.razor b/Wonky.Client/Pages/CrmCustomerWorkplaceListPage.razor similarity index 97% rename from Wonky.Client/Pages/AdvisorCustomerWorkplaceListPage.razor rename to Wonky.Client/Pages/CrmCustomerWorkplaceListPage.razor index 1499ebc4..8e55527a 100644 --- a/Wonky.Client/Pages/AdvisorCustomerWorkplaceListPage.razor +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceListPage.razor @@ -27,7 +27,7 @@

@Company.Name

Arbejdssted diff --git a/Wonky.Client/Pages/AdvisorCustomerWorkplaceListPage.razor.cs b/Wonky.Client/Pages/CrmCustomerWorkplaceListPage.razor.cs similarity index 90% rename from Wonky.Client/Pages/AdvisorCustomerWorkplaceListPage.razor.cs rename to Wonky.Client/Pages/CrmCustomerWorkplaceListPage.razor.cs index 81fbaaa3..85bc8f49 100644 --- a/Wonky.Client/Pages/AdvisorCustomerWorkplaceListPage.razor.cs +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceListPage.razor.cs @@ -24,11 +24,11 @@ using Wonky.Entity.Views; namespace Wonky.Client.Pages; -public partial class AdvisorCustomerWorkplaceListPage : IDisposable +public partial class CrmCustomerWorkplaceListPage : IDisposable { // ############################################################### - [Inject] public IAdvisorWorkplaceRepository WorkplaceRepo { get; set; } - [Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; } + [Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; } + [Inject] public ICrmCustomerRepository CustomerRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } // ############################################################### diff --git a/Wonky.Client/Pages/AdvisorCustomerWorkplaceNew.razor b/Wonky.Client/Pages/CrmCustomerWorkplaceNewPage.razor similarity index 94% rename from Wonky.Client/Pages/AdvisorCustomerWorkplaceNew.razor rename to Wonky.Client/Pages/CrmCustomerWorkplaceNewPage.razor index 093f5e09..12ae5944 100644 --- a/Wonky.Client/Pages/AdvisorCustomerWorkplaceNew.razor +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceNewPage.razor @@ -22,11 +22,11 @@

@Company.Name Opret Arbejdssted

-
- Kundekort + - diff --git a/Wonky.Client/Pages/AdvisorCustomerWorkplaceNew.razor.cs b/Wonky.Client/Pages/CrmCustomerWorkplaceNewPage.razor.cs similarity index 86% rename from Wonky.Client/Pages/AdvisorCustomerWorkplaceNew.razor.cs rename to Wonky.Client/Pages/CrmCustomerWorkplaceNewPage.razor.cs index 246d5587..a56e76d0 100644 --- a/Wonky.Client/Pages/AdvisorCustomerWorkplaceNew.razor.cs +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceNewPage.razor.cs @@ -25,14 +25,15 @@ namespace Wonky.Client.Pages; #pragma warning disable CS8618 -public partial class AdvisorCustomerWorkplaceNew : IDisposable +public partial class CrmCustomerWorkplaceNewPage : IDisposable { // ############################################################### [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; } - [Inject] public IAdvisorWorkplaceRepository WorkplaceRepo { get; set; } + [Inject] public ICrmCustomerRepository CustomerRepo { get; set; } + [Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; } [Inject] public IToastService Toaster { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] public ILogger Logger { get; set; } + [Inject] public NavigationManager Navigator { get; set; } // ############################################################### [Parameter] public string CompanyId { get; set; } = ""; @@ -76,6 +77,11 @@ public partial class AdvisorCustomerWorkplaceNew : IDisposable Logger.LogDebug("Workplace {}", JsonSerializer.Serialize(Workplace, new JsonSerializerOptions(JsonSerializerDefaults.Web))); var result = await WorkplaceRepo.CreateWorkplace(CompanyId, Workplace); Logger.LogDebug("HTTP result {}", result); + if (!string.IsNullOrWhiteSpace(result)) + { + Navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces/{result}"); + Toaster.ShowSuccess("Arbejdssted er oprettet."); + } } private void HandleFieldChanged(object sender, FieldChangedEventArgs e) diff --git a/Wonky.Client/Pages/AdvisorCustomerWorkplaceViewEditPage.razor b/Wonky.Client/Pages/CrmCustomerWorkplaceViewEditPage.razor similarity index 75% rename from Wonky.Client/Pages/AdvisorCustomerWorkplaceViewEditPage.razor rename to Wonky.Client/Pages/CrmCustomerWorkplaceViewEditPage.razor index b253a45d..43f8eb31 100644 --- a/Wonky.Client/Pages/AdvisorCustomerWorkplaceViewEditPage.razor +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceViewEditPage.razor @@ -26,9 +26,9 @@

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

- @@ -98,49 +98,43 @@
-
- -
-
+
-
-
-
- - - -
-
-
-
- - - -
-
-
-
    -
  1. -
    -
    -
    Produkt Oversigt
    +
  2. +
    +
    +
    Produkt Oversigt
    -
    - Åbn liste med QR-koder +
    +
    +
    + + + +
    +
    +
    +
    + + + +
    +
  3. @@ -153,19 +147,19 @@
    @docView.VariantName.ToUpperInvariant()
    +
    +
    @docView.DocumentDate
    -
    - -
@@ -173,9 +167,14 @@ } +
+
+ +
+
@if (Working) { } - \ No newline at end of file + \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorCustomerWorkplaceViewEditPage.razor.cs b/Wonky.Client/Pages/CrmCustomerWorkplaceViewEditPage.razor.cs similarity index 91% rename from Wonky.Client/Pages/AdvisorCustomerWorkplaceViewEditPage.razor.cs rename to Wonky.Client/Pages/CrmCustomerWorkplaceViewEditPage.razor.cs index cfb71829..f9ab8fc5 100644 --- a/Wonky.Client/Pages/AdvisorCustomerWorkplaceViewEditPage.razor.cs +++ b/Wonky.Client/Pages/CrmCustomerWorkplaceViewEditPage.razor.cs @@ -30,15 +30,15 @@ using Wonky.Client.Helpers; #pragma warning disable CS8618 namespace Wonky.Client.Pages; -public partial class AdvisorCustomerWorkplaceViewEditPage : IDisposable +public partial class CrmCustomerWorkplaceViewEditPage : IDisposable { // ############################################################# - [Inject] public IAdvisorWorkplaceRepository Workplaces { get; set; } - [Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; } - [Inject] public IAdvisorWorkplaceRepository WorkplaceRepo { get; set; } + [Inject] public ICrmWorkplaceRepository Workplaces { get; set; } + [Inject] public ICrmCustomerRepository CustomerRepo { get; set; } + [Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public NavigationManager Navigator { get; set; } - [Inject] public ILogger Logger { get; set; } + [Inject] public ILogger Logger { get; set; } [Inject] public ISystemSendMailService SendMail { get; set; } [Inject] public IUserInfoService UserInfo { get; set; } [Inject] public IClipboardService Clipboard { get; set; } @@ -54,7 +54,8 @@ public partial class AdvisorCustomerWorkplaceViewEditPage : IDisposable private bool Working { get; set; } = true; private WorkplaceInventory WorkplaceInventory { get; set; } = new(); private List DocViews { get; set; } = new(); - private ConfirmDeleteModal ConfirmDelete { get; set; } + private ConfirmDeleteModal ConfirmDeleteWorkplace { get; set; } + private ConfirmDeleteModal ConfirmDeleteProduct { get; set; } private string DeleteMessage { get; set; } = ""; private string LinkRecipients { get; set; } = ""; private const string CopyText = "Kopier"; @@ -79,7 +80,6 @@ public partial class AdvisorCustomerWorkplaceViewEditPage : IDisposable DocViews = GenerateDocumentListView(); Working = false; - DeleteMessage = $"Bekræft at du sletter
{Workplace.Name} fra {Workplace.CompanyName}?
AL INFORMATION slettes og handlingen er uigenkaldelig."; } @@ -153,32 +153,36 @@ public partial class AdvisorCustomerWorkplaceViewEditPage : IDisposable Working = true; await Workplaces.UpdateWorkplace(CompanyId, Workplace); Working = false; + Toaster.ShowSuccess("Arbejdssted er opdateret"); } private void OnConfirmDeleteWorkplace() { + DeleteMessage = $"Bekræft at du sletter
{Workplace.Name} fra {Workplace.CompanyName}?
AL INFORMATION slettes og handlingen er uigenkaldelig."; Logger.LogDebug("ConfirmDeleteWorkplace"); - ConfirmDelete.Show(); + ConfirmDeleteWorkplace.Show(); } - private async Task OnDeleteWorkplace() + private async Task RemoveWorkplace() { Logger.LogDebug("DeleteWorkplace"); Working = true; await Workplaces.DeleteWorkplace(CompanyId, WorkplaceId); + Toaster.ShowInfo("Arbejdssted er slettet."); Navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces"); } + - - private async Task OnRemoveDocument(string productId, string variantId) + private async Task OnRemoveVariant(string productId, string variantId) { // delete the apb and apv var product = WorkplaceInventory .Products.First(x => x.ProductId == productId); var variant = product.Variants.First(x => x.VariantId == variantId); Logger.LogDebug("variant => {}", JsonSerializer.Serialize(variant, new JsonSerializerOptions(JsonSerializerDefaults.Web))); + foreach (var doc in variant.Docs) { await WorkplaceRepo.DeleteWorkplaceDocuments(CompanyId, WorkplaceId, doc.DocumentId); @@ -186,6 +190,7 @@ public partial class AdvisorCustomerWorkplaceViewEditPage : IDisposable WorkplaceInventory.Products.Remove(product); DocViews = GenerateDocumentListView(); + Toaster.ShowInfo("Produkt dokumenter er slettet."); } diff --git a/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs b/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs index 83765895..081dc7fa 100644 --- a/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs +++ b/Wonky.Client/Pages/OfficeOrderViewPage.razor.cs @@ -32,7 +32,7 @@ public partial class OfficeOrderViewPage : IDisposable { // ############################################################# [Inject] public HttpInterceptorService Interceptor { get; set; } - [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } + [Inject] public ICrmActivityRepository CrmActivityRepo { get; set; } [Inject] public ISystemSendMailService MailService { get; set; } [Inject] public ILocalStorageService Storage { get; set; } [Inject] public ICountryUserInfoRepository UserRepo { get; set; } @@ -59,7 +59,7 @@ public partial class OfficeOrderViewPage : IDisposable Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); // fetch order from backend - ReportItem = await AdvisorActivityRepo.GetReportItem(OrderId); + ReportItem = await CrmActivityRepo.GetReportItem(OrderId); Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(ReportItem, _options)); Working = false; } @@ -75,7 +75,7 @@ public partial class OfficeOrderViewPage : IDisposable Working = true; Logger.LogDebug("GetExpressState => {}", JsonSerializer.Serialize(ReportItem, _options)); // send request to backend - var responseView = await AdvisorActivityRepo.GetExpressState(ReportItem.ActivityId); + var responseView = await CrmActivityRepo.GetExpressState(ReportItem.ActivityId); Logger.LogDebug("SetExpressState => responseView <= {} ", JsonSerializer.Serialize(responseView)); // get user info from storage var user = await UserInfoService.GetUserInfo(); diff --git a/Wonky.Client/Pages/SupervisorAdvisorActivityViewPage.razor b/Wonky.Client/Pages/SupervisorAdvisorActivityViewPage.razor index d97ac3bf..7c03c483 100644 --- a/Wonky.Client/Pages/SupervisorAdvisorActivityViewPage.razor +++ b/Wonky.Client/Pages/SupervisorAdvisorActivityViewPage.razor @@ -145,7 +145,7 @@
- Kundekort + Stamkort
@ReportItem.CrmNote
diff --git a/Wonky.Client/Pages/SupervisorDocumentListPage.razor b/Wonky.Client/Pages/SupervisorDocumentListPage.razor index 9a095a60..2a011b7d 100644 --- a/Wonky.Client/Pages/SupervisorDocumentListPage.razor +++ b/Wonky.Client/Pages/SupervisorDocumentListPage.razor @@ -21,27 +21,21 @@ Support Dokumentation
-
+

@Advisor.FullName

+
+ Liste +
+
+ Opret +

Support Dokumentation

-
-
- Opret - @* -
-
- Loading... -
-
- *@ -
-
@if (Documents.Any()) diff --git a/Wonky.Client/Pages/SupervisorDocumentNewPage.razor b/Wonky.Client/Pages/SupervisorDocumentNewPage.razor index 6bad5a2e..368cc51d 100644 --- a/Wonky.Client/Pages/SupervisorDocumentNewPage.razor +++ b/Wonky.Client/Pages/SupervisorDocumentNewPage.razor @@ -22,9 +22,15 @@ Support Dokumentation
-
+

@Document.AdvisorName

+
+ Liste +
+
diff --git a/Wonky.Client/Pages/SupervisorDocumentNewPage.razor.cs b/Wonky.Client/Pages/SupervisorDocumentNewPage.razor.cs index 1d270281..852af9b5 100644 --- a/Wonky.Client/Pages/SupervisorDocumentNewPage.razor.cs +++ b/Wonky.Client/Pages/SupervisorDocumentNewPage.razor.cs @@ -94,7 +94,7 @@ public partial class SupervisorDocumentNewPage : IDisposable else { Toaster.ShowSuccess("Ok"); - Navigator.NavigateTo($"/supervisor/advisors/{AdvisorId}/documents/{x.DocumentId}"); + Navigator.NavigateTo($"/supervisor/advisors/{AdvisorId}/documents"); } Toaster.ClearAll(); } diff --git a/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor b/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor index 8e3fb4ed..a4221f88 100644 --- a/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor +++ b/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor @@ -20,9 +20,15 @@ @page "/supervisor/advisors/{AdvisorId}/documents/{DocumentId}"
-
+

@Document.AdvisorName

+
+ Liste +
+
diff --git a/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor.cs b/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor.cs index 92530e5f..2a49712f 100644 --- a/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor.cs +++ b/Wonky.Client/Pages/SupervisorDocumentViewEditPage.razor.cs @@ -78,6 +78,7 @@ public partial class SupervisorDocumentViewEditPage : IDisposable var x = await DocumentRepo.UpdateDocument(Document.DocumentId, Document); Toaster.ShowSuccess("Ok"); + Navigator.NavigateTo($"/supervisor/advisors/{AdvisorId}/documents"); } diff --git a/Wonky.Client/Program.cs b/Wonky.Client/Program.cs index 51c8732b..29a65187 100644 --- a/Wonky.Client/Program.cs +++ b/Wonky.Client/Program.cs @@ -60,13 +60,14 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); // crm repositories -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); +builder.Services.AddScoped(); +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(); diff --git a/Wonky.Client/Shared/ContactModal.razor.cs b/Wonky.Client/Shared/ContactModal.razor.cs index eebbaef0..5a642327 100644 --- a/Wonky.Client/Shared/ContactModal.razor.cs +++ b/Wonky.Client/Shared/ContactModal.razor.cs @@ -31,7 +31,7 @@ public partial class ContactModal { [Parameter] public ContactDto ParamContact { get; set; } = new(); [Parameter] public string CompanyName { get; set; } = ""; - [Parameter] public IAdvisorContactRepository ContactRepo { get; set; } + [Parameter] public ICrmContactRepository ContactRepo { get; set; } [Parameter] public HttpInterceptorService Interceptor { get; set; } [Parameter] public EventCallback OnSaveClicked { get; set; } [Parameter] public EventCallback OnDeleteClicked { get; set; } diff --git a/Wonky.Client/Wonky.Client.csproj b/Wonky.Client/Wonky.Client.csproj index 183bd9e9..650c0ab9 100644 --- a/Wonky.Client/Wonky.Client.csproj +++ b/Wonky.Client/Wonky.Client.csproj @@ -5,6 +5,7 @@ enable enable latestmajor + service-workker-assets.js @@ -26,7 +27,7 @@ - + PreserveNewest diff --git a/Wonky.Client/wwwroot/appsettings.json b/Wonky.Client/wwwroot/appsettings.json index c42c8523..e6c17b19 100644 --- a/Wonky.Client/wwwroot/appsettings.json +++ b/Wonky.Client/wwwroot/appsettings.json @@ -1,15 +1,15 @@ { "appInfo": { "name": "Wonky Online", - "version": "141.2", + "version": "142.2", "rc": true, - "sandBox": false, + "sandBox": true, "image": "grumpy-coder.png" }, "Logging": { "LogLevel": { - "Default": "None", - "System": "None", + "Default": "Debug", + "System": "Debug", "Microsoft": "None" }, "Debug": { @@ -19,7 +19,7 @@ } }, "apiConfig": { - "baseUrl": "https://zeta.innotec.dk", + "baseUrl": "https://eta.innotec.dk", "catalog": "api/v2/catalog/country", "crmCustomers": "api/v2/crm/companies", "crmInventoryExt": "history/inventory", @@ -34,6 +34,7 @@ "officeCustomers": "api/v2/office/customers", "officeReports": "api/v2/office/reports", "officeUsers": "api/v2/office/users/admin", + "publicProducts": "api/v2/public/products", "servicesGlsId": "", "servicesGlsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=", "servicesMail": "api/v2/services/sendmail", diff --git a/Wonky.Client/wwwroot/icon-192.png b/Wonky.Client/wwwroot/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..e73a8da4160842d1b7dad94c8bb869d852c98954 GIT binary patch literal 13959 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 RWKab}K}JQoLdqoMe*nBt)R6!H literal 0 HcmV?d00001 diff --git a/Wonky.Client/wwwroot/icon-512.png b/Wonky.Client/wwwroot/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..61d90191eb0a0843c0e2f172819c81aab05e5f6f GIT binary patch literal 63324 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 literal 0 HcmV?d00001 diff --git a/Wonky.Client/wwwroot/index.html b/Wonky.Client/wwwroot/index.html index 9374b8fd..7b85f5c5 100644 --- a/Wonky.Client/wwwroot/index.html +++ b/Wonky.Client/wwwroot/index.html @@ -31,6 +31,6 @@
- + diff --git a/Wonky.Entity/Configuration/ApiConfig.cs b/Wonky.Entity/Configuration/ApiConfig.cs index cb9bb86a..80111d77 100644 --- a/Wonky.Entity/Configuration/ApiConfig.cs +++ b/Wonky.Entity/Configuration/ApiConfig.cs @@ -93,6 +93,11 @@ public class ApiConfig ///
public string OfficeReports { get; set; } = ""; + /// + /// Public Product url + /// + public string PublicProducts { get; set; } = ""; + /// /// Application uri for token request /// diff --git a/Wonky.Entity/DTO/WorkplaceBopCreate.cs b/Wonky.Entity/DTO/WorkplaceBopCreate.cs new file mode 100644 index 00000000..18d747a0 --- /dev/null +++ b/Wonky.Entity/DTO/WorkplaceBopCreate.cs @@ -0,0 +1,29 @@ +namespace Wonky.Entity.DTO; + +public class WorkplaceBopCreate +{ + public string EyeCleanerLocation { get; set; } = ""; + public string FirstAidLocation { get; set; } = ""; + public string GlovesStorage { get; set; } = ""; + public string GogglesStorage { get; set; } = ""; + public string MaskStorage { get; set; } = ""; + public string ProductStorage { get; set; } = ""; + public string WasteDeposit { get; set; } = ""; + public string AuthoredBy { get; set; } = ""; + public string ApprovedBy { get; set; } = ""; + public string ApprovedDate { get; set; } = ""; + public string FollowupDate { get; set; } = ""; + + public List ProductVariants { get; set; } = new(); +} + +public class ProductVariants +{ + public string VariantId { get; set; } = ""; + public string S5A { get; set; } = ""; + public string S9A { get; set; } = ""; + + // Sweden + // yearly consumption and product exposure + // public string S11A { get; set; } = ""; +} \ No newline at end of file diff --git a/Wonky.Entity/Views/ExternalProductListView.cs b/Wonky.Entity/Views/ExternalProductListView.cs new file mode 100644 index 00000000..62c528cb --- /dev/null +++ b/Wonky.Entity/Views/ExternalProductListView.cs @@ -0,0 +1,21 @@ +namespace Wonky.Entity.Views; + +public class ExternalProductListView +{ + public string ProductId { get; set; } = ""; + public string TradingName { get; set; } = ""; + public string PictureLink { get; set; } = ""; + public string ProductCategoryEnum { get; set; } = ""; + public List Variants { get; set; } = new(); +} + +public class ExternalProductVariantView +{ + public string VariantId { get; set; } = ""; + public string Name { get; set; } = ""; + public string Sku { get; set; } = ""; + public string ErpName { get; set; } = ""; + public string ErpSku { get; set; } = ""; + public string ShortName { get; set; } = ""; + public string PictureLink { get; set; } = ""; +} \ No newline at end of file