From bf23c8f8397599d25bfe0c0effea8e45c5cd0a07 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Wed, 21 Jan 2026 16:34:47 +0000 Subject: [PATCH 1/3] wip --- .../Components/Pages/Merchants/Index.razor | 196 +-------------- .../Components/Pages/Merchants/Index.razor.cs | 232 ++++++++++++++++++ .../Reporting/MerchantSettlementHistory.razor | 3 +- .../Pages/Reporting/SettlementSummary.razor | 2 +- .../Pages/Reporting/TransactionDetail.razor | 2 +- .../TransactionSummaryMerchant.razor | 2 +- .../TransactionSummaryOperator.razor | 2 +- .../Factories/ModelFactory.cs | 47 +++- .../Models/Models.cs | 1 - EstateManagementUI.BlazorServer/Program.cs | 2 +- .../DataTransferObjects.cs | 6 +- .../BackendAPI/IEstateReportingApiClient.cs | 46 ++++ .../Client/APIModelFactory.cs | 24 ++ .../Client/MerchantMethods.cs | 19 ++ .../Models/Models.cs | 13 + .../RequestHandlers/DateRequestHandler.cs | 8 +- .../Requests/Requests.cs | 2 +- 17 files changed, 399 insertions(+), 208 deletions(-) create mode 100644 EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor index c40f1fa1..213a67a1 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor @@ -51,9 +51,9 @@
@@ -227,193 +227,3 @@ }
-@code { - private bool isLoading = true; - private List? allMerchants; - - // Filter fields - private string _filterName = ""; - private string filterName - { - get => _filterName; - set { _filterName = value; currentPage = 1; UpdateFilteredMerchants(); } - } - - private string _filterReference = ""; - private string filterReference - { - get => _filterReference; - set { _filterReference = value; currentPage = 1; UpdateFilteredMerchants(); } - } - - private string _filterSettlementSchedule = ""; - private string filterSettlementSchedule - { - get => _filterSettlementSchedule; - set { _filterSettlementSchedule = value; currentPage = 1; UpdateFilteredMerchants(); } - } - - private string _filterRegion = ""; - private string filterRegion - { - get => _filterRegion; - set { _filterRegion = value; currentPage = 1; UpdateFilteredMerchants(); } - } - - private string _filterPostcode = ""; - private string filterPostcode - { - get => _filterPostcode; - set { _filterPostcode = value; currentPage = 1; UpdateFilteredMerchants(); } - } - - // Pagination fields - private int _currentPage = 1; - private int currentPage - { - get => _currentPage; - set { _currentPage = value; UpdatePagedMerchants(); } - } - - private int _pageSize = 10; - private int pageSize - { - get => _pageSize; - set { _pageSize = value; _currentPage = 1; UpdateFilteredMerchants(); } - } - - // Cached results - private List _filteredMerchants = new(); - private List filteredMerchants => _filteredMerchants; - - private List _pagedMerchants = new(); - private List pagedMerchants => _pagedMerchants; - - private int _totalPages = 1; - private int totalPages => _totalPages; - - protected override async Task OnInitializedAsync() - { - try - { - await RequirePermission(PermissionSection.Merchant, PermissionFunction.List); - - var correlationId = new CorrelationId(Guid.NewGuid()); - var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); - - var result = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); - if (result.IsSuccess) - { - allMerchants = ModelFactory.ConvertFrom(result.Data); - UpdateFilteredMerchants(); - } - } - finally - { - isLoading = false; - } - } - - private void UpdateFilteredMerchants() - { - if (allMerchants == null) - { - _filteredMerchants = new List(); - _totalPages = 1; - UpdatePagedMerchants(); - return; - } - - // Apply all filters in a single pass using a combined predicate - _filteredMerchants = allMerchants.Where(m => - (string.IsNullOrWhiteSpace(_filterName) || (m.MerchantName?.Contains(_filterName, StringComparison.OrdinalIgnoreCase) ?? false)) && - (string.IsNullOrWhiteSpace(_filterReference) || (m.MerchantReference?.Contains(_filterReference, StringComparison.OrdinalIgnoreCase) ?? false)) && - (string.IsNullOrWhiteSpace(_filterSettlementSchedule) || (m.SettlementSchedule?.Equals(_filterSettlementSchedule, StringComparison.OrdinalIgnoreCase) ?? false)) && - (string.IsNullOrWhiteSpace(_filterRegion) || (m.Region?.Contains(_filterRegion, StringComparison.OrdinalIgnoreCase) ?? false)) && - (string.IsNullOrWhiteSpace(_filterPostcode) || (m.PostalCode?.Contains(_filterPostcode, StringComparison.OrdinalIgnoreCase) ?? false)) - ).ToList(); - - _totalPages = _filteredMerchants.Count > 0 ? (int)Math.Ceiling(_filteredMerchants.Count / (double)_pageSize) : 1; - - // Ensure currentPage is valid - if (_currentPage > _totalPages && _totalPages > 0) - { - _currentPage = _totalPages; - } - - UpdatePagedMerchants(); - } - - private void UpdatePagedMerchants() - { - _pagedMerchants = _filteredMerchants.Skip((_currentPage - 1) * _pageSize).Take(_pageSize).ToList(); - } - - private void ClearFilters() - { - _filterName = ""; - _filterReference = ""; - _filterSettlementSchedule = ""; - _filterRegion = ""; - _filterPostcode = ""; - _currentPage = 1; - UpdateFilteredMerchants(); - } - - private void FirstPage() - { - if (_currentPage != 1) - { - _currentPage = 1; - UpdatePagedMerchants(); - } - } - - private void PreviousPage() - { - if (_currentPage > 1) - { - _currentPage--; - UpdatePagedMerchants(); - } - } - - private void NextPage() - { - if (_currentPage < _totalPages) - { - _currentPage++; - UpdatePagedMerchants(); - } - } - - private void LastPage() - { - var lastPage = _totalPages > 0 ? _totalPages : 1; - if (_currentPage != lastPage) - { - _currentPage = lastPage; - UpdatePagedMerchants(); - } - } - - private void ViewMerchant(Guid merchantId) - { - NavigationManager.NavigateTo($"/merchants/{merchantId}"); - } - - private void EditMerchant(Guid merchantId) - { - NavigationManager.NavigateTo($"/merchants/{merchantId}/edit"); - } - - private void MakeDeposit(Guid merchantId) - { - NavigationManager.NavigateTo($"/merchants/{merchantId}/deposit"); - } - - private void NavigateToNewMerchant() - { - NavigationManager.NavigateTo("/merchants/new"); - } -} diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs new file mode 100644 index 00000000..a154ef4e --- /dev/null +++ b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs @@ -0,0 +1,232 @@ +using EstateManagementUI.BlazorServer.Common; +using EstateManagementUI.BlazorServer.Factories; +using EstateManagementUI.BlazorServer.Models; +using EstateManagementUI.BlazorServer.Permissions; +using EstateManagementUI.BusinessLogic.Models; +using EstateManagementUI.BusinessLogic.Requests; + +namespace EstateManagementUI.BlazorServer.Components.Pages.Merchants +{ + public partial class Index + { + private bool isLoading = true; + private List? allMerchants; + + // Filter fields + private string _filterName = ""; + private string filterName + { + get => _filterName; + set { _filterName = value; currentPage = 1; } + } + + private string _filterReference = ""; + private string filterReference + { + get => _filterReference; + set { _filterReference = value; currentPage = 1; } + } + + private string _filterSettlementSchedule = ""; + private string filterSettlementSchedule + { + get => _filterSettlementSchedule; + set { _filterSettlementSchedule = value; currentPage = 1; } + } + + private string _filterRegion = ""; + private string filterRegion + { + get => _filterRegion; + set { _filterRegion = value; currentPage = 1; } + } + + private string _filterPostcode = ""; + private string filterPostcode + { + get => _filterPostcode; + set { _filterPostcode = value; currentPage = 1; } + } + + // Pagination fields + private int _currentPage = 1; + private int currentPage + { + get => _currentPage; + set { _currentPage = value; } + } + + private int _pageSize = 10; + private int pageSize + { + get => _pageSize; + set { _pageSize = value; _currentPage = 1; } + } + + // Cached results + private List _filteredMerchants = new(); + private List filteredMerchants => _filteredMerchants; + + private List _pagedMerchants = new(); + private List pagedMerchants => _pagedMerchants; + + private int _totalPages = 1; + private int totalPages => _totalPages; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!firstRender) + { + await base.OnAfterRenderAsync(firstRender); + return; + } + try + { + await base.OnInitializedAsync(); + + await RequirePermission(PermissionSection.Merchant, PermissionFunction.List); + CorrelationId correlationId = new(Guid.NewGuid()); + Guid estateId = await this.GetEstateId(); + var result = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, this._filterName, this._filterReference, Int32.Parse(_filterSettlementSchedule), + this._filterRegion, this._filterPostcode)); + if (result.IsFailed) + { + this.NavigationManager.NavigateToErrorPage(); + } + + allMerchants = ModelFactory.ConvertFrom(result.Data); + } + finally + { + isLoading = false; + this.StateHasChanged(); + } + } + + //protected override async Task OnInitializedAsync() + //{ + // try + // { + // await RequirePermission(PermissionSection.Merchant, PermissionFunction.List); + + // var correlationId = new CorrelationId(Guid.NewGuid()); + // var estateId = await this.GetEstateId(); + + // var result = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, this._filterName, this._filterReference, Int32.Parse(_filterSettlementSchedule), + // this._filterRegion, this._filterPostcode)); + // if (result.IsSuccess) + // { + // allMerchants = ModelFactory.ConvertFrom(result.Data); + // //UpdateFilteredMerchants(); + // } + // } + // finally + // { + // isLoading = false; + // } + //} + + //private void UpdateFilteredMerchants() + //{ + // if (allMerchants == null) + // { + // _filteredMerchants = new List(); + // _totalPages = 1; + // UpdatePagedMerchants(); + // return; + // } + + // // Apply all filters in a single pass using a combined predicate + // _filteredMerchants = allMerchants.Where(m => + // (string.IsNullOrWhiteSpace(_filterName) || (m.MerchantName?.Contains(_filterName, StringComparison.OrdinalIgnoreCase) ?? false)) && + // (string.IsNullOrWhiteSpace(_filterReference) || (m.MerchantReference?.Contains(_filterReference, StringComparison.OrdinalIgnoreCase) ?? false)) && + // (string.IsNullOrWhiteSpace(_filterSettlementSchedule) || (m.SettlementSchedule?.Equals(_filterSettlementSchedule, StringComparison.OrdinalIgnoreCase) ?? false)) && + // (string.IsNullOrWhiteSpace(_filterRegion) || (m.Region?.Contains(_filterRegion, StringComparison.OrdinalIgnoreCase) ?? false)) && + // (string.IsNullOrWhiteSpace(_filterPostcode) || (m.PostalCode?.Contains(_filterPostcode, StringComparison.OrdinalIgnoreCase) ?? false)) + // ).ToList(); + + // _totalPages = _filteredMerchants.Count > 0 ? (int)Math.Ceiling(_filteredMerchants.Count / (double)_pageSize) : 1; + + // // Ensure currentPage is valid + // if (_currentPage > _totalPages && _totalPages > 0) + // { + // _currentPage = _totalPages; + // } + + // UpdatePagedMerchants(); + //} + + //private void UpdatePagedMerchants() + //{ + // _pagedMerchants = _filteredMerchants.Skip((_currentPage - 1) * _pageSize).Take(_pageSize).ToList(); + //} + + private void ClearFilters() + { + _filterName = ""; + _filterReference = ""; + _filterSettlementSchedule = ""; + _filterRegion = ""; + _filterPostcode = ""; + _currentPage = 1; + //UpdateFilteredMerchants(); + } + + private void FirstPage() + { + if (_currentPage != 1) + { + _currentPage = 1; + //UpdatePagedMerchants(); + } + } + + private void PreviousPage() + { + if (_currentPage > 1) + { + _currentPage--; + //UpdatePagedMerchants(); + } + } + + private void NextPage() + { + if (_currentPage < _totalPages) + { + _currentPage++; + // UpdatePagedMerchants(); + } + } + + private void LastPage() + { + var lastPage = _totalPages > 0 ? _totalPages : 1; + if (_currentPage != lastPage) + { + _currentPage = lastPage; + // UpdatePagedMerchants(); + } + } + + private void ViewMerchant(Guid merchantId) + { + NavigationManager.NavigateTo($"/merchants/{merchantId}"); + } + + private void EditMerchant(Guid merchantId) + { + NavigationManager.NavigateTo($"/merchants/{merchantId}/edit"); + } + + private void MakeDeposit(Guid merchantId) + { + NavigationManager.NavigateTo($"/merchants/{merchantId}/deposit"); + } + + private void NavigateToNewMerchant() + { + NavigationManager.NavigateTo("/merchants/new"); + } + } +} diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor index b4d5640d..a7ad54d9 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor @@ -219,8 +219,7 @@ var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); // Test estate ID var query = new Queries.GetMerchantsQuery( CorrelationIdHelper.New(), - estateId - ); + estateId, null, null, null, null, null); var result = await Mediator.Send(query); if (result.IsSuccess) diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor index 3a2bb67a..04059527 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor @@ -269,7 +269,7 @@ var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); // Load filter options - var merchantsResult = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); + var merchantsResult = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); if (merchantsResult.IsSuccess) merchants = ModelFactory.ConvertFrom(merchantsResult.Data); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor index c3a92bff..23b7bc2a 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor @@ -426,7 +426,7 @@ var accessToken = DEFAULT_ACCESS_TOKEN; // Load filter options - var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); + var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); var contractsTask = Mediator.Send(new Queries.GetContractsQuery(correlationId, accessToken, estateId)); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor index 6dc73dad..ec1ac25f 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor @@ -272,7 +272,7 @@ var accessToken = "stubbed-token"; // Load filter options - var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); + var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); await Task.WhenAll(merchantsTask, operatorsTask); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor index 651744d4..6c49b6c2 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor @@ -280,7 +280,7 @@ var accessToken = "stubbed-token"; // Load filter options - var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); + var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); await Task.WhenAll(merchantsTask, operatorsTask); diff --git a/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs b/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs index 39f3c3b3..f1d5dac2 100644 --- a/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs +++ b/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs @@ -1,4 +1,30 @@ -using EstateManagementUI.BlazorServer.Models; +using EstateManagementUI.BusinessLogic.Models; +using ComparisonDateModel = EstateManagementUI.BlazorServer.Models.ComparisonDateModel; +using ContractModel = EstateManagementUI.BlazorServer.Models.ContractModel; +using ContractProductModel = EstateManagementUI.BlazorServer.Models.ContractProductModel; +using ContractProductTransactionFeeModel = EstateManagementUI.BlazorServer.Models.ContractProductTransactionFeeModel; +using EstateContractModel = EstateManagementUI.BlazorServer.Models.EstateContractModel; +using EstateMerchantModel = EstateManagementUI.BlazorServer.Models.EstateMerchantModel; +using EstateModel = EstateManagementUI.BlazorServer.Models.EstateModel; +using EstateOperatorModel = EstateManagementUI.BlazorServer.Models.EstateOperatorModel; +using EstateUserModel = EstateManagementUI.BlazorServer.Models.EstateUserModel; +using FileDetailsModel = EstateManagementUI.BlazorServer.Models.FileDetailsModel; +using FileImportLogModel = EstateManagementUI.BlazorServer.Models.FileImportLogModel; +using MerchantKpiModel = EstateManagementUI.BlazorServer.Models.MerchantKpiModel; +using MerchantModel = EstateManagementUI.BlazorServer.Models.MerchantModel; +using MerchantSettlementHistoryModel = EstateManagementUI.BlazorServer.Models.MerchantSettlementHistoryModel; +using MerchantTransactionSummaryModel = EstateManagementUI.BlazorServer.Models.MerchantTransactionSummaryModel; +using OperatorModel = EstateManagementUI.BlazorServer.Models.OperatorModel; +using OperatorTransactionSummaryModel = EstateManagementUI.BlazorServer.Models.OperatorTransactionSummaryModel; +using ProductPerformanceModel = EstateManagementUI.BlazorServer.Models.ProductPerformanceModel; +using RecentContractModel = EstateManagementUI.BlazorServer.Models.RecentContractModel; +using RecentMerchantsModel = EstateManagementUI.BlazorServer.Models.RecentMerchantsModel; +using SettlementSummaryModel = EstateManagementUI.BlazorServer.Models.SettlementSummaryModel; +using TodaysSalesCountByHourModel = EstateManagementUI.BlazorServer.Models.TodaysSalesCountByHourModel; +using TodaysSalesModel = EstateManagementUI.BlazorServer.Models.TodaysSalesModel; +using TodaysSalesValueByHourModel = EstateManagementUI.BlazorServer.Models.TodaysSalesValueByHourModel; +using TodaysSettlementModel = EstateManagementUI.BlazorServer.Models.TodaysSettlementModel; +using TransactionDetailModel = EstateManagementUI.BlazorServer.Models.TransactionDetailModel; namespace EstateManagementUI.BlazorServer.Factories { public static class ModelFactory { @@ -362,5 +388,24 @@ public static List ConvertFrom(List? ConvertFrom(List resultData) { + List merchantList = new(); + foreach (MerchantListModel merchantListModel in resultData) { + merchantList.Add(new MerchantListModel { + CreatedDateTime = merchantListModel.CreatedDateTime, + AvailableBalance = merchantListModel.AvailableBalance, + Balance = merchantListModel.Balance, + MerchantId = merchantListModel.MerchantId, + MerchantName = merchantListModel.MerchantName, + MerchantReference = merchantListModel.MerchantReference, + Region = merchantListModel.Region, + PostalCode = merchantListModel.PostalCode, + SettlementSchedule = merchantListModel.SettlementSchedule + }); + } + + return merchantList; + } } } \ No newline at end of file diff --git a/EstateManagementUI.BlazorServer/Models/Models.cs b/EstateManagementUI.BlazorServer/Models/Models.cs index 12fb4e78..c9af0a96 100644 --- a/EstateManagementUI.BlazorServer/Models/Models.cs +++ b/EstateManagementUI.BlazorServer/Models/Models.cs @@ -44,7 +44,6 @@ public class EstateMerchantModel public string? Reference { get; set; } } -// Merchant Models public class MerchantModel { public Guid MerchantId { get; set; } diff --git a/EstateManagementUI.BlazorServer/Program.cs b/EstateManagementUI.BlazorServer/Program.cs index 27b5d09e..71e3479a 100644 --- a/EstateManagementUI.BlazorServer/Program.cs +++ b/EstateManagementUI.BlazorServer/Program.cs @@ -322,7 +322,7 @@ public static void RegisterEstateRequestHandler(this IServiceCollection services } public static void RegisterMerchantRequestHandler(this IServiceCollection services) { - services.AddSingleton>>, MerchantRequestHandler>(); + services.AddSingleton>>, MerchantRequestHandler>(); services.AddSingleton>, MerchantRequestHandler>(); services.AddSingleton, MerchantRequestHandler>(); services.AddSingleton, MerchantRequestHandler>(); diff --git a/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs b/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs index 75847e55..6d885202 100644 --- a/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs +++ b/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs @@ -66,7 +66,11 @@ public class Merchant public String Region { get; set; } [JsonProperty("town")] public String Town { get; set; } - + [JsonProperty("balance")] + public Decimal Balance { get; set; } + [JsonProperty("settlement_schedule")] + public Int32 SettlementSchedule { get; set; } + #endregion } diff --git a/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs b/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs index 67caab39..3dd7e157 100644 --- a/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs +++ b/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs @@ -25,6 +25,14 @@ Task>> GetOperators(String accessToken, Task>> GetRecentMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task>> GetMerchants(String accessToken, + Guid estateId, + String? name, + String? reference, + Int32? settlementSchedule, + String? region, + String? postCode, + CancellationToken cancellationToken); Task>> GetRecentContracts(String accessToken, Guid estateId, CancellationToken cancellationToken); @@ -206,6 +214,44 @@ public async Task>> GetRecentMerchants(String accessToken, } } + public async Task>> GetMerchants(String accessToken, + Guid estateId, + String? name, + String? reference, + Int32? settlementSchedule, + String? region, + String? postCode, + CancellationToken cancellationToken) { + QueryStringBuilder builder = new QueryStringBuilder(); + builder.AddParameter("name",name); + builder.AddParameter("reference", reference); + builder.AddParameter("settlementSchedule", settlementSchedule); + builder.AddParameter("region", region); + builder.AddParameter("postCode", postCode); + + String requestUri = this.BuildRequestUrl($"/api/merchants?{builder.BuildQueryString()}"); + + try + { + List<(String headerName, String headerValue)> additionalHeaders = [ + (EstateIdHeaderName, estateId.ToString()) + ]; + Result> result = await this.SendHttpGetRequest>(requestUri, accessToken, additionalHeaders, cancellationToken); + + if (result.IsFailed) + return ResultHelpers.CreateFailure(result); + + return result; + } + catch (Exception ex) + { + // An exception has occurred, add some additional information to the message + Exception exception = new Exception($"Error getting merchants for estate {estateId}.", ex); + + return Result.Failure(exception.Message); + } + } + public async Task>> GetRecentContracts(String accessToken, Guid estateId, CancellationToken cancellationToken) { diff --git a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs index a08619ab..af8d7889 100644 --- a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs +++ b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs @@ -1,6 +1,7 @@ using EstateManagementUI.BusinessLogic.BackendAPI.DataTransferObjects; using EstateManagementUI.BusinessLogic.Models; using TransactionProcessor.DataTransferObjects.Responses.Estate; +using TransactionProcessor.DataTransferObjects.Responses.Merchant; namespace EstateManagementUI.BusinessLogic.Client; @@ -68,6 +69,29 @@ public static List ConvertFrom(List apiResultDat return merchants; } + public static List ConvertFromX(List apiResultData) + { + List merchants = new(); + + foreach (Merchant merchant in apiResultData) + { + merchants.Add(new MerchantListModel + { + CreatedDateTime = merchant.CreatedDateTime, + MerchantId = merchant.MerchantId, + Balance = merchant.Balance, + AvailableBalance = 0, // TODO: remove this + MerchantName= merchant.Name, + PostalCode = merchant.PostCode, + MerchantReference = merchant.Reference, + Region = merchant.Region, + SettlementSchedule = ((SettlementSchedule)merchant.SettlementSchedule).ToString(), + }); + } + + return merchants; + } + public static EstateModel ConvertFrom(Estate apiResultData) { EstateModel model = new() { Reference = apiResultData.Reference, diff --git a/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs b/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs index 6a286f9c..cf897548 100644 --- a/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs +++ b/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs @@ -12,6 +12,7 @@ public partial interface IApiClient Task> GetMerchantKpi(Queries.GetMerchantKpiQuery request, CancellationToken cancellationToken); Task>> GetRecentMerchants(Queries.GetRecentMerchantsQuery request, CancellationToken cancellationToken); Task>> GetRecentContracts(Queries.GetRecentContractsQuery request, CancellationToken cancellationToken); + Task>> GetMerchants(Queries.GetMerchantsQuery request, CancellationToken cancellationToken); } public partial class ApiClient : IApiClient { @@ -64,5 +65,23 @@ public async Task>> GetRecentContracts(Queries. return Result.Success(recentContractModels); } + + public async Task>> GetMerchants(Queries.GetMerchantsQuery request, + CancellationToken cancellationToken) + { + Result token = await this.GetToken(cancellationToken); + if (token.IsFailed) + return ResultHelpers.CreateFailure(token); + + Result> apiResult = await this.EstateReportingApiClient.GetMerchants(token.Data, request.EstateId, + request.Name, request.Reference, request.SettlementSchedule, request.Region, request.PostCode,cancellationToken); + + if (apiResult.IsFailed) + return ResultHelpers.CreateFailure(apiResult); + + List recentMerchantsModels = APIModelFactory.ConvertFromX(apiResult.Data); + + return Result.Success(recentMerchantsModels); + } } } diff --git a/EstateManagmentUI.BusinessLogic/Models/Models.cs b/EstateManagmentUI.BusinessLogic/Models/Models.cs index 7e26641f..a208b75f 100644 --- a/EstateManagmentUI.BusinessLogic/Models/Models.cs +++ b/EstateManagmentUI.BusinessLogic/Models/Models.cs @@ -64,6 +64,19 @@ public class MerchantModel public DateTime CreatedDateTime { get; set; } } +public class MerchantListModel +{ + public Guid MerchantId { get; set; } + public string? MerchantName { get; set; } + public string? MerchantReference { get; set; } + public decimal? Balance { get; set; } + public decimal? AvailableBalance { get; set; } + public string? SettlementSchedule { get; set; } + public string? Region { get; set; } + public string? PostalCode { get; set; } + public DateTime CreatedDateTime { get; set; } +} + // Operator Models public class OperatorModel { diff --git a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs index b279660b..76c32976 100644 --- a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs +++ b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs @@ -50,7 +50,7 @@ public async Task>> Handle(Queries.GetAssignedOperato } } - public class MerchantRequestHandler : IRequestHandler>>, + public class MerchantRequestHandler : IRequestHandler>>, IRequestHandler>, IRequestHandler, IRequestHandler, @@ -73,9 +73,9 @@ public MerchantRequestHandler(IApiClient apiClient) this.ApiClient = apiClient; } - public async Task>> Handle(Queries.GetMerchantsQuery request, - CancellationToken cancellationToken) { - return Result.Success(StubTestData.GetMockMerchants()); + public async Task>> Handle(Queries.GetMerchantsQuery request, + CancellationToken cancellationToken) { + return await this.ApiClient.GetMerchants(request, cancellationToken); } public async Task Handle(Commands.AddMerchantDeviceCommand request, diff --git a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs index 9a314acf..a8800c57 100644 --- a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs +++ b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs @@ -15,7 +15,7 @@ public static class Queries { public record GetEstateQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>; public record GetAssignedOperatorsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; - public record GetMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; + public record GetMerchantsQuery(CorrelationId CorrelationId, Guid EstateId, String? Name, String? Reference,Int32? SettlementSchedule, String? Region,String? PostCode) : IRequest>>; public record GetRecentMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetRecentContractsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetOperatorsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; From 38bfe06aed618843b9bbdf2eee75e7ce94629cd0 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Thu, 22 Jan 2026 09:29:14 +0000 Subject: [PATCH 2/3] Refactor merchant models and update dropdown/query usage - Moved merchant-related models to MerchantModels.cs and removed unused properties. - Replaced MerchantModel/MerchantListModel with MerchantDropDownModel where appropriate. - Updated Blazor pages, tests, and filters to use new models and improved filter/pagination logic. - Refactored APIModelFactory with extension methods for model conversion. - Added GetMerchantsForDropDownQuery and handler; updated IApiClient. - Cleaned up obsolete model definitions and standardized filter defaults. --- .../Merchants/MerchantsIndexPageTests.cs | 98 +++++----------- .../Components/Pages/Merchants/Index.razor | 103 ++++++++-------- .../Components/Pages/Merchants/Index.razor.cs | 47 ++++---- .../Reporting/MerchantSettlementHistory.razor | 9 +- .../Pages/Reporting/SettlementSummary.razor | 6 +- .../Pages/Reporting/TransactionDetail.razor | 11 +- .../TransactionSummaryMerchant.razor | 7 +- .../TransactionSummaryOperator.razor | 7 +- .../Factories/ModelFactory.cs | 21 ++-- .../Models/Models.cs | 8 -- .../Client/APIModelFactory.cs | 110 ++++++++++-------- .../Client/MerchantMethods.cs | 24 +++- .../Models/MerchantModels.cs | 53 +++++++++ .../Models/Models.cs | 51 -------- .../RequestHandlers/DateRequestHandler.cs | 9 +- .../Requests/Requests.cs | 3 + 16 files changed, 300 insertions(+), 267 deletions(-) create mode 100644 EstateManagmentUI.BusinessLogic/Models/MerchantModels.cs diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs index 61fefd77..c7f2c85b 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs @@ -20,20 +20,16 @@ public class MerchantsIndexPageTests : BaseTest public void MerchantsIndex_InitialState_ShowsLoadingIndicator() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantModel + new MerchantDropDownModel { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant", - MerchantReference = "REF001", - Balance = 1000m, - AvailableBalance = 500m, - SettlementSchedule = "Daily" + MerchantName = "Test Merchant" } }; - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); // Act @@ -47,8 +43,8 @@ public void MerchantsIndex_InitialState_ShowsLoadingIndicator() public void MerchantsIndex_WithNoMerchants_ShowsEmptyState() { // Arrange - var emptyList = new List(); - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + var emptyList = new List(); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(emptyList)); // Act @@ -63,29 +59,21 @@ public void MerchantsIndex_WithNoMerchants_ShowsEmptyState() public void MerchantsIndex_WithMerchants_DisplaysMerchantList() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantModel + new MerchantDropDownModel() { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant 1", - MerchantReference = "REF001", - Balance = 1000m, - AvailableBalance = 500m, - SettlementSchedule = "Daily" + MerchantName = "Test Merchant 1" }, - new MerchantModel + new MerchantDropDownModel { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant 2", - MerchantReference = "REF002", - Balance = 2000m, - AvailableBalance = 1500m, - SettlementSchedule = "Weekly" + MerchantName = "Test Merchant 2" } }; - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); // Act @@ -103,27 +91,21 @@ public void MerchantsIndex_WithMerchants_DisplaysMerchantList() public void MerchantsIndex_WithMerchants_DisplaysSummaryCards() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantModel + new MerchantDropDownModel { MerchantId = Guid.NewGuid(), - MerchantName = "Merchant 1", - MerchantReference = "REF001", - Balance = 1000m, - AvailableBalance = 500m + MerchantName = "Merchant 1" }, - new MerchantModel + new MerchantDropDownModel { MerchantId = Guid.NewGuid(), - MerchantName = "Merchant 2", - MerchantReference = "REF002", - Balance = 2000m, - AvailableBalance = 1500m + MerchantName = "Merchant 2" } }; - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); // Act @@ -140,8 +122,8 @@ public void MerchantsIndex_WithMerchants_DisplaysSummaryCards() public void MerchantsIndex_HasCorrectPageTitle() { // Arrange - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) - .ReturnsAsync(Result.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result.Success(new List())); // Act var cut = RenderComponent(); @@ -155,22 +137,16 @@ public void MerchantsIndex_HasCorrectPageTitle() public void MerchantsIndex_WithMerchants_DisplaysFilters() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantModel + new MerchantDropDownModel { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant", - MerchantReference = "REF001", - Balance = 1000m, - AvailableBalance = 500m, - SettlementSchedule = "Daily", - Region = "North", - PostalCode = "12345" + MerchantName = "Test Merchant" } }; - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); // Act @@ -190,19 +166,13 @@ public void MerchantsIndex_WithMerchants_DisplaysFilters() public void MerchantsIndex_WithManyMerchants_DisplaysPagination() { // Arrange - Create more than 10 merchants to trigger pagination - var merchants = Enumerable.Range(1, 12).Select(i => new MerchantModel + var merchants = Enumerable.Range(1, 12).Select(i => new MerchantDropDownModel { MerchantId = Guid.NewGuid(), - MerchantName = $"Merchant {i}", - MerchantReference = $"REF{i:000}", - Balance = 1000m * i, - AvailableBalance = 500m * i, - SettlementSchedule = "Daily", - Region = "North", - PostalCode = "12345" + MerchantName = $"Merchant {i}" }).ToList(); - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); // Act @@ -219,22 +189,16 @@ public void MerchantsIndex_WithManyMerchants_DisplaysPagination() public void MerchantsIndex_WithMerchants_DisplaysRegionAndPostcode() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantModel + new MerchantDropDownModel { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant", - MerchantReference = "REF001", - Balance = 1000m, - AvailableBalance = 500m, - SettlementSchedule = "Daily", - Region = "North Region", - PostalCode = "12345" + MerchantName = "Test Merchant" } }; - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); // Act diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor index 213a67a1..70c68b36 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor @@ -23,6 +23,53 @@ + + +
+
+

Filters

+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
@if (isLoading) { @@ -32,47 +79,6 @@ } else if (allMerchants != null && allMerchants.Any()) { - -
-
-

Filters

-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- -
-
-
-
@@ -143,16 +149,17 @@ - @if (totalPages > 1 || filteredMerchants.Count > 0) + @if (totalPages > 1 || pagedMerchants.Count > 0) {
- @if (filteredMerchants.Count > 0) + @if (pagedMerchants.Count > 0) { Showing @((currentPage - 1) * pageSize + 1) to - @Math.Min(currentPage * pageSize, filteredMerchants.Count) of - @filteredMerchants.Count results + @Math.Min(currentPage * pageSize, pagedMerchants.Count) of + @pagedMerchants.Count results + } else { @@ -201,15 +208,15 @@

Total Merchants

-

@filteredMerchants.Count

+

@pagedMerchants.Count

Total Balance

-

@filteredMerchants.Sum(m => m.Balance ?? 0).ToString("C")

+

@pagedMerchants.Sum(m => m.Balance ?? 0).ToString("C")

Available Balance

-

@filteredMerchants.Sum(m => m.AvailableBalance ?? 0).ToString("C")

+

@pagedMerchants.Sum(m => m.AvailableBalance ?? 0).ToString("C")

} diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs index a154ef4e..793f395c 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs +++ b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Index.razor.cs @@ -27,7 +27,7 @@ private string filterReference set { _filterReference = value; currentPage = 1; } } - private string _filterSettlementSchedule = ""; + private string _filterSettlementSchedule = "-1"; private string filterSettlementSchedule { get => _filterSettlementSchedule; @@ -64,8 +64,8 @@ private int pageSize } // Cached results - private List _filteredMerchants = new(); - private List filteredMerchants => _filteredMerchants; + //private List _filteredMerchants = new(); + //private List filteredMerchants => _filteredMerchants; private List _pagedMerchants = new(); private List pagedMerchants => _pagedMerchants; @@ -85,16 +85,9 @@ protected override async Task OnAfterRenderAsync(bool firstRender) await base.OnInitializedAsync(); await RequirePermission(PermissionSection.Merchant, PermissionFunction.List); - CorrelationId correlationId = new(Guid.NewGuid()); - Guid estateId = await this.GetEstateId(); - var result = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, this._filterName, this._filterReference, Int32.Parse(_filterSettlementSchedule), - this._filterRegion, this._filterPostcode)); - if (result.IsFailed) - { - this.NavigationManager.NavigateToErrorPage(); - } - - allMerchants = ModelFactory.ConvertFrom(result.Data); + + await this.LoadMerchants(); + } finally { @@ -103,6 +96,20 @@ protected override async Task OnAfterRenderAsync(bool firstRender) } } + private async Task LoadMerchants() { + CorrelationId correlationId = new(Guid.NewGuid()); + Guid estateId = await this.GetEstateId(); + var result = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, this._filterName, this._filterReference, Int32.Parse(_filterSettlementSchedule), + this._filterRegion, this._filterPostcode)); + if (result.IsFailed) + { + this.NavigationManager.NavigateToErrorPage(); + } + + allMerchants = ModelFactory.ConvertFrom(result.Data); + this.UpdatePagedMerchants(); + } + //protected override async Task OnInitializedAsync() //{ // try @@ -156,20 +163,20 @@ protected override async Task OnAfterRenderAsync(bool firstRender) // UpdatePagedMerchants(); //} - //private void UpdatePagedMerchants() - //{ - // _pagedMerchants = _filteredMerchants.Skip((_currentPage - 1) * _pageSize).Take(_pageSize).ToList(); - //} + private void UpdatePagedMerchants() + { + _pagedMerchants = this.allMerchants.Skip((_currentPage - 1) * _pageSize).Take(_pageSize).ToList(); + } - private void ClearFilters() + private async Task ClearFilters() { _filterName = ""; _filterReference = ""; - _filterSettlementSchedule = ""; + _filterSettlementSchedule = "-1"; _filterRegion = ""; _filterPostcode = ""; _currentPage = 1; - //UpdateFilteredMerchants(); + await this.LoadMerchants(); } private void FirstPage() diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor index a7ad54d9..4d3770d2 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/MerchantSettlementHistory.razor @@ -1,6 +1,8 @@ @page "/reporting/merchant-settlement-history" @using EstateManagementUI.BlazorServer.Factories +@using EstateManagementUI.BusinessLogic.Models @using EstateManagementUI.BusinessLogic.Requests +@using MerchantSettlementHistoryModel = EstateManagementUI.BlazorServer.Models.MerchantSettlementHistoryModel @rendermode InteractiveServer @inject IMediator Mediator @inject NavigationManager NavigationManager @@ -197,7 +199,7 @@
@code { - private List? merchants; + private List? merchants; private List? settlements; private bool isLoading = false; private string? errorMessage; @@ -217,9 +219,8 @@ try { var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); // Test estate ID - var query = new Queries.GetMerchantsQuery( - CorrelationIdHelper.New(), - estateId, null, null, null, null, null); + var query = new Queries.GetMerchantsForDropDownQuery( + CorrelationIdHelper.New(),estateId); var result = await Mediator.Send(query); if (result.IsSuccess) diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor index 04059527..bfb5e50c 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/SettlementSummary.razor @@ -1,6 +1,8 @@ @page "/reporting/settlement-summary" @using EstateManagementUI.BlazorServer.Factories +@using EstateManagementUI.BusinessLogic.Models @using EstateManagementUI.BusinessLogic.Requests +@using SettlementSummaryModel = EstateManagementUI.BlazorServer.Models.SettlementSummaryModel @rendermode InteractiveServer @inject IMediator Mediator @inject NavigationManager Navigation @@ -244,7 +246,7 @@ // Data private List? summaryData; - private List? merchants; + private List? merchants; // KPIs private int totalMerchants = 0; @@ -269,7 +271,7 @@ var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); // Load filter options - var merchantsResult = await Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); + var merchantsResult = await Mediator.Send(new Queries.GetMerchantsForDropDownQuery(correlationId, estateId)); if (merchantsResult.IsSuccess) merchants = ModelFactory.ConvertFrom(merchantsResult.Data); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor index 23b7bc2a..991d4f70 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor @@ -3,7 +3,12 @@ @using System.Text @using EstateManagementUI.BlazorServer.Factories @using EstateManagementUI.BlazorServer.Components.Shared +@using EstateManagementUI.BusinessLogic.Models @using EstateManagementUI.BusinessLogic.Requests +@using ContractProductModel = EstateManagementUI.BlazorServer.Models.ContractProductModel +@using MerchantModel = EstateManagementUI.BlazorServer.Models.MerchantModel +@using OperatorModel = EstateManagementUI.BlazorServer.Models.OperatorModel +@using TransactionDetailModel = EstateManagementUI.BlazorServer.Models.TransactionDetailModel @inject IMediator Mediator @inject NavigationManager Navigation @inject ILogger Logger @@ -72,7 +77,7 @@
- ? detailData; - private List? merchants; + private List? merchants; private List? operators; private List? products; @@ -426,7 +431,7 @@ var accessToken = DEFAULT_ACCESS_TOKEN; // Load filter options - var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); + var merchantsTask = Mediator.Send(new Queries.GetMerchantsForDropDownQuery(correlationId, estateId)); var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); var contractsTask = Mediator.Send(new Queries.GetContractsQuery(correlationId, accessToken, estateId)); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor index ec1ac25f..a82a9917 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor @@ -1,6 +1,9 @@ @page "/reporting/transaction-summary-merchant" @using EstateManagementUI.BlazorServer.Factories +@using EstateManagementUI.BusinessLogic.Models @using EstateManagementUI.BusinessLogic.Requests +@using MerchantTransactionSummaryModel = EstateManagementUI.BlazorServer.Models.MerchantTransactionSummaryModel +@using OperatorModel = EstateManagementUI.BlazorServer.Models.OperatorModel @rendermode InteractiveServer @inject IMediator Mediator @inject NavigationManager Navigation @@ -245,7 +248,7 @@ // Data private List? summaryData; - private List? merchants; + private List? merchants; private List? operators; // KPIs @@ -272,7 +275,7 @@ var accessToken = "stubbed-token"; // Load filter options - var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); + var merchantsTask = Mediator.Send(new Queries.GetMerchantsForDropDownQuery(correlationId, estateId)); var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); await Task.WhenAll(merchantsTask, operatorsTask); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor index 6c49b6c2..c2701c75 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor @@ -1,6 +1,9 @@ @page "/reporting/transaction-summary-operator" @using EstateManagementUI.BlazorServer.Factories +@using EstateManagementUI.BusinessLogic.Models @using EstateManagementUI.BusinessLogic.Requests +@using OperatorModel = EstateManagementUI.BlazorServer.Models.OperatorModel +@using OperatorTransactionSummaryModel = EstateManagementUI.BlazorServer.Models.OperatorTransactionSummaryModel @rendermode InteractiveServer @inject IMediator Mediator @inject NavigationManager Navigation @@ -251,7 +254,7 @@ // Data private List? summaryData; - private List? merchants; + private List? merchants; private List? operators; // KPIs @@ -280,7 +283,7 @@ var accessToken = "stubbed-token"; // Load filter options - var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId, null, null, null, null, null)); + var merchantsTask = Mediator.Send(new Queries.GetMerchantsForDropDownQuery(correlationId, estateId)); var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); await Task.WhenAll(merchantsTask, operatorsTask); diff --git a/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs b/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs index f1d5dac2..25ed05ab 100644 --- a/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs +++ b/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs @@ -364,17 +364,9 @@ public static List ConvertFrom(List? ConvertFrom(List resultData) { + List merchantList = new(); + foreach (MerchantDropDownModel merchantDropDownModel in resultData) { + merchantList.Add(new MerchantDropDownModel { + MerchantId = merchantDropDownModel.MerchantId, + MerchantName = merchantDropDownModel.MerchantName + }); + } + return merchantList; + } } } \ No newline at end of file diff --git a/EstateManagementUI.BlazorServer/Models/Models.cs b/EstateManagementUI.BlazorServer/Models/Models.cs index c9af0a96..ea714429 100644 --- a/EstateManagementUI.BlazorServer/Models/Models.cs +++ b/EstateManagementUI.BlazorServer/Models/Models.cs @@ -262,17 +262,9 @@ public class TransactionDetailModel public class RecentMerchantsModel { public DateTime CreatedDateTime { get; set; } - public Int32 EstateReportingId { get; set; } - public DateTime LastSale { get; set; } - public DateTime LastSaleDateTime { get; set; } - public DateTime LastStatement { get; set; } public Guid MerchantId { get; set; } - public Int32 MerchantReportingId { get; set; } public String Name { get; set; } - public String PostCode { get; set; } public String Reference { get; set; } - public String Region { get; set; } - public String Town { get; set; } } public class RecentContractModel diff --git a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs index af8d7889..7b3d3657 100644 --- a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs +++ b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs @@ -45,52 +45,7 @@ public static TodaysSalesModel ConvertFrom(TodaysSales apiResultData) { return model; } - public static List ConvertFrom(List apiResultData) { - List merchants = new(); - - foreach (Merchant merchant in apiResultData) { - merchants.Add(new RecentMerchantsModel - { - CreatedDateTime = merchant.CreatedDateTime, - EstateReportingId = merchant.EstateReportingId, - LastSale = merchant.LastSale, - LastSaleDateTime = merchant.LastSaleDateTime, - LastStatement = merchant.LastStatement, - MerchantId = merchant.MerchantId, - MerchantReportingId = merchant.MerchantReportingId, - Name = merchant.Name, - PostCode = merchant.PostCode, - Reference = merchant.Reference, - Region = merchant.Region, - Town = merchant.Town - }); - } - - return merchants; - } - - public static List ConvertFromX(List apiResultData) - { - List merchants = new(); - - foreach (Merchant merchant in apiResultData) - { - merchants.Add(new MerchantListModel - { - CreatedDateTime = merchant.CreatedDateTime, - MerchantId = merchant.MerchantId, - Balance = merchant.Balance, - AvailableBalance = 0, // TODO: remove this - MerchantName= merchant.Name, - PostalCode = merchant.PostCode, - MerchantReference = merchant.Reference, - Region = merchant.Region, - SettlementSchedule = ((SettlementSchedule)merchant.SettlementSchedule).ToString(), - }); - } - - return merchants; - } + public static EstateModel ConvertFrom(Estate apiResultData) { EstateModel model = new() { @@ -183,4 +138,67 @@ public static List ConvertFrom(List apiResultData) { } return operators; } +} + +public static class FactoryExtensions{ + public static List ToRecentMerchant(this List apiResultData) + { + List merchants = new(); + + foreach (Merchant merchant in apiResultData) + { + merchants.Add(new RecentMerchantsModel + { + CreatedDateTime = merchant.CreatedDateTime, + MerchantId = merchant.MerchantId, + Name = merchant.Name, + Reference = merchant.Reference, + }); + } + + return merchants; + } + + public static List ToMerchantList(this List apiResultData) + { + List merchants = new(); + + foreach (Merchant merchant in apiResultData) + { + merchants.Add(new MerchantListModel + { + CreatedDateTime = merchant.CreatedDateTime, + MerchantId = merchant.MerchantId, + Balance = merchant.Balance, + AvailableBalance = 0, // TODO: remove this + MerchantName = merchant.Name, + PostalCode = merchant.PostCode, + MerchantReference = merchant.Reference, + Region = merchant.Region, + SettlementSchedule = ((SettlementSchedule)merchant.SettlementSchedule).ToString(), + }); + } + + return merchants; + } + + public static List ToMerchantDropDown(this List apiResultData) + { + List merchants = new(); + + foreach (Merchant merchant in apiResultData) + { + merchants.Add(new MerchantDropDownModel + { + MerchantId = merchant.MerchantId, + MerchantName = merchant.Name, + }); + } + + return merchants; + } + + public static MerchantModel ToMerchant(this Merchant apiResultData) { + return default; + } } \ No newline at end of file diff --git a/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs b/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs index cf897548..48c5999e 100644 --- a/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs +++ b/EstateManagmentUI.BusinessLogic/Client/MerchantMethods.cs @@ -13,6 +13,7 @@ public partial interface IApiClient Task>> GetRecentMerchants(Queries.GetRecentMerchantsQuery request, CancellationToken cancellationToken); Task>> GetRecentContracts(Queries.GetRecentContractsQuery request, CancellationToken cancellationToken); Task>> GetMerchants(Queries.GetMerchantsQuery request, CancellationToken cancellationToken); + Task>> GetMerchants(Queries.GetMerchantsForDropDownQuery request, CancellationToken cancellationToken); } public partial class ApiClient : IApiClient { @@ -45,7 +46,7 @@ public async Task>> GetRecentMerchants(Queries if (apiResult.IsFailed) return ResultHelpers.CreateFailure(apiResult); - List recentMerchantsModels = APIModelFactory.ConvertFrom(apiResult.Data); + List recentMerchantsModels = apiResult.Data.ToRecentMerchant(); return Result.Success(recentMerchantsModels); } @@ -79,9 +80,26 @@ public async Task>> GetMerchants(Queries.GetMerch if (apiResult.IsFailed) return ResultHelpers.CreateFailure(apiResult); - List recentMerchantsModels = APIModelFactory.ConvertFromX(apiResult.Data); + List merchantList = apiResult.Data.ToMerchantList(); - return Result.Success(recentMerchantsModels); + return Result.Success(merchantList); + } + + public async Task>> GetMerchants(Queries.GetMerchantsForDropDownQuery request, + CancellationToken cancellationToken) { + Result token = await this.GetToken(cancellationToken); + if (token.IsFailed) + return ResultHelpers.CreateFailure(token); + + Result> apiResult = await this.EstateReportingApiClient.GetMerchants(token.Data, request.EstateId,null,null,null,null, + null, cancellationToken); + + if (apiResult.IsFailed) + return ResultHelpers.CreateFailure(apiResult); + + List merchantDropDownModels = apiResult.Data.ToMerchantDropDown(); + + return Result.Success(merchantDropDownModels); } } } diff --git a/EstateManagmentUI.BusinessLogic/Models/MerchantModels.cs b/EstateManagmentUI.BusinessLogic/Models/MerchantModels.cs new file mode 100644 index 00000000..07ed0e0a --- /dev/null +++ b/EstateManagmentUI.BusinessLogic/Models/MerchantModels.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace EstateManagementUI.BusinessLogic.Models +{ + public class MerchantModel + { + public Guid MerchantId { get; set; } + public string? MerchantName { get; set; } + public string? MerchantReference { get; set; } + public decimal? Balance { get; set; } + public decimal? AvailableBalance { get; set; } + public string? SettlementSchedule { get; set; } + public string? AddressLine1 { get; set; } + public string? AddressLine2 { get; set; } + public string? Town { get; set; } + public string? Region { get; set; } + public string? PostalCode { get; set; } + public string? Country { get; set; } + public string? ContactName { get; set; } + public string? ContactEmailAddress { get; set; } + public string? ContactPhoneNumber { get; set; } + public DateTime CreatedDateTime { get; set; } + } + + public class MerchantListModel + { + public Guid MerchantId { get; set; } + public string? MerchantName { get; set; } + public string? MerchantReference { get; set; } + public decimal? Balance { get; set; } + public decimal? AvailableBalance { get; set; } + public string? SettlementSchedule { get; set; } + public string? Region { get; set; } + public string? PostalCode { get; set; } + public DateTime CreatedDateTime { get; set; } + } + + public class MerchantDropDownModel + { + public Guid MerchantId { get; set; } + public string? MerchantName { get; set; } + } + + public class RecentMerchantsModel + { + public DateTime CreatedDateTime { get; set; } + public Guid MerchantId { get; set; } + public String Name { get; set; } + public String Reference { get; set; } + } +} diff --git a/EstateManagmentUI.BusinessLogic/Models/Models.cs b/EstateManagmentUI.BusinessLogic/Models/Models.cs index a208b75f..c58f07e7 100644 --- a/EstateManagmentUI.BusinessLogic/Models/Models.cs +++ b/EstateManagmentUI.BusinessLogic/Models/Models.cs @@ -43,40 +43,6 @@ public class EstateMerchantModel { } -// Merchant Models -public class MerchantModel -{ - public Guid MerchantId { get; set; } - public string? MerchantName { get; set; } - public string? MerchantReference { get; set; } - public decimal? Balance { get; set; } - public decimal? AvailableBalance { get; set; } - public string? SettlementSchedule { get; set; } - public string? AddressLine1 { get; set; } - public string? AddressLine2 { get; set; } - public string? Town { get; set; } - public string? Region { get; set; } - public string? PostalCode { get; set; } - public string? Country { get; set; } - public string? ContactName { get; set; } - public string? ContactEmailAddress { get; set; } - public string? ContactPhoneNumber { get; set; } - public DateTime CreatedDateTime { get; set; } -} - -public class MerchantListModel -{ - public Guid MerchantId { get; set; } - public string? MerchantName { get; set; } - public string? MerchantReference { get; set; } - public decimal? Balance { get; set; } - public decimal? AvailableBalance { get; set; } - public string? SettlementSchedule { get; set; } - public string? Region { get; set; } - public string? PostalCode { get; set; } - public DateTime CreatedDateTime { get; set; } -} - // Operator Models public class OperatorModel { @@ -295,23 +261,6 @@ public class TransactionDetailModel public string? ResponseCode { get; set; } public DateTime? SettlementDateTime { get; set; } } - -public class RecentMerchantsModel -{ - public DateTime CreatedDateTime { get; set; } - public Int32 EstateReportingId { get; set; } - public DateTime LastSale { get; set; } - public DateTime LastSaleDateTime { get; set; } - public DateTime LastStatement { get; set; } - public Guid MerchantId { get; set; } - public Int32 MerchantReportingId { get; set; } - public String Name { get; set; } - public String PostCode { get; set; } - public String Reference { get; set; } - public String Region { get; set; } - public String Town { get; set; } -} - public class RecentContractModel { public Guid ContractId { get; set; } diff --git a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs index 76c32976..a032f0fe 100644 --- a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs +++ b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs @@ -64,8 +64,8 @@ public class MerchantRequestHandler : IRequestHandler, IRequestHandler, IRequestHandler, - IRequestHandler>> - { + IRequestHandler>>, + IRequestHandler>> { private readonly IApiClient ApiClient; public MerchantRequestHandler(IApiClient apiClient) @@ -147,6 +147,11 @@ public async Task>> Handle(Queries.GetRecentMe CancellationToken cancellationToken) { return await this.ApiClient.GetRecentMerchants(request, cancellationToken); } + + public async Task>> Handle(Queries.GetMerchantsForDropDownQuery request, + CancellationToken cancellationToken) { + throw new NotImplementedException(); + } } public class ContractRequestHandler : IRequestHandler>>, diff --git a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs index a8800c57..45e26d7d 100644 --- a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs +++ b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs @@ -16,6 +16,9 @@ public static class Queries public record GetEstateQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>; public record GetAssignedOperatorsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetMerchantsQuery(CorrelationId CorrelationId, Guid EstateId, String? Name, String? Reference,Int32? SettlementSchedule, String? Region,String? PostCode) : IRequest>>; + + public record GetMerchantsForDropDownQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; + public record GetRecentMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetRecentContractsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetOperatorsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; From 1ae4116db7715e80057729ff51ef18c989871b8e Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Thu, 22 Jan 2026 09:47:26 +0000 Subject: [PATCH 3/3] fix test failures --- .../Merchants/MerchantsIndexPageTests.cs | 85 ++++++++++--------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs index c7f2c85b..ff2142e5 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs @@ -2,6 +2,7 @@ using EstateManagementUI.BlazorServer.Components.Permissions; using EstateManagementUI.BlazorServer.Permissions; using EstateManagementUI.BlazorServer.Tests.Pages.FileProcessing; +using EstateManagementUI.BusinessLogic.BackendAPI.DataTransferObjects; using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.Requests; using MediatR; @@ -20,18 +21,18 @@ public class MerchantsIndexPageTests : BaseTest public void MerchantsIndex_InitialState_ShowsLoadingIndicator() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantDropDownModel + new MerchantListModel { MerchantId = Guid.NewGuid(), MerchantName = "Test Merchant" } }; - - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); - + // Act var cut = RenderComponent(); @@ -43,10 +44,10 @@ public void MerchantsIndex_InitialState_ShowsLoadingIndicator() public void MerchantsIndex_WithNoMerchants_ShowsEmptyState() { // Arrange - var emptyList = new List(); - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) - .ReturnsAsync(Result.Success(emptyList)); - + var merchants = new List(); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result.Success(merchants)); + // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin")); @@ -59,23 +60,25 @@ public void MerchantsIndex_WithNoMerchants_ShowsEmptyState() public void MerchantsIndex_WithMerchants_DisplaysMerchantList() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantDropDownModel() + new MerchantListModel() { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant 1" + MerchantName = "Test Merchant 1", + MerchantReference = "REF001" }, - new MerchantDropDownModel + new MerchantListModel() { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant 2" + MerchantName = "Test Merchant 2", + MerchantReference = "REF002" } }; - - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); - + // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -91,23 +94,23 @@ public void MerchantsIndex_WithMerchants_DisplaysMerchantList() public void MerchantsIndex_WithMerchants_DisplaysSummaryCards() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantDropDownModel + new() { MerchantId = Guid.NewGuid(), MerchantName = "Merchant 1" }, - new MerchantDropDownModel + new() { MerchantId = Guid.NewGuid(), MerchantName = "Merchant 2" } }; - - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); - + // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -122,8 +125,8 @@ public void MerchantsIndex_WithMerchants_DisplaysSummaryCards() public void MerchantsIndex_HasCorrectPageTitle() { // Arrange - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) - .ReturnsAsync(Result.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result.Success(new List())); // Act var cut = RenderComponent(); @@ -137,18 +140,18 @@ public void MerchantsIndex_HasCorrectPageTitle() public void MerchantsIndex_WithMerchants_DisplaysFilters() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantDropDownModel + new MerchantListModel() { MerchantId = Guid.NewGuid(), MerchantName = "Test Merchant" } }; - - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); - + // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -166,15 +169,15 @@ public void MerchantsIndex_WithMerchants_DisplaysFilters() public void MerchantsIndex_WithManyMerchants_DisplaysPagination() { // Arrange - Create more than 10 merchants to trigger pagination - var merchants = Enumerable.Range(1, 12).Select(i => new MerchantDropDownModel + var merchants = Enumerable.Range(1, 12).Select(i => new MerchantListModel() { MerchantId = Guid.NewGuid(), MerchantName = $"Merchant {i}" }).ToList(); - - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); - + // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -189,18 +192,20 @@ public void MerchantsIndex_WithManyMerchants_DisplaysPagination() public void MerchantsIndex_WithMerchants_DisplaysRegionAndPostcode() { // Arrange - var merchants = new List + var merchants = new List { - new MerchantDropDownModel + new MerchantListModel { MerchantId = Guid.NewGuid(), - MerchantName = "Test Merchant" + MerchantName = "Test Merchant", + Region = "North Region", + PostalCode = "12345" } }; - - _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(merchants)); - + // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5));