diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/ProductPerformance.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/ProductPerformance.razor index 92d8b4a9..7538fa11 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/ProductPerformance.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/ProductPerformance.razor @@ -2,6 +2,7 @@ @using EstateManagementUI.BlazorServer.Factories @using EstateManagementUI.BusinessLogic.Requests @rendermode InteractiveServer +@inherits AuthorizedComponentBase @inject IMediator Mediator @inject NavigationManager Navigation @inject ILogger Logger @@ -67,9 +68,9 @@
@@ -86,7 +87,7 @@
Total Products - @totalProducts + @performanceData.Summary.TotalProducts
@@ -98,7 +99,7 @@
Total Transactions - @totalTransactions.ToString("N0") + @performanceData.Summary.TotalCount.ToString("N0")
@@ -110,7 +111,7 @@
Total Value - @totalValue.ToString("C") + @performanceData.Summary.TotalValue.ToString("C")
@@ -122,7 +123,7 @@
Average per Product - @averageValuePerProduct.ToString("C") + @performanceData.Summary.AveragePerProduct.ToString("C")
@@ -149,7 +150,7 @@
- @if (performanceData != null && performanceData.Any()) + @if (performanceData != null && performanceData.ProductDetails.Any()) { @if (!showChart) { @@ -166,25 +167,25 @@ - @foreach (var item in performanceData) + @foreach (var item in performanceData.ProductDetails) { @item.ProductName @item.TransactionCount.ToString("N0") @item.TransactionValue.ToString("C") - @item.PercentageContribution.ToString("F2")% + @item.PercentageOfTotal.ToString("F2")%
+ style="width: @(item.PercentageOfTotal)%">
} - + @* Total @totalTransactions.ToString("N0") @@ -192,7 +193,7 @@ @totalPercentage.ToString("F2")% - + *@ } @@ -201,19 +202,19 @@

Transaction Value by Product

- @foreach (var item in performanceData) + @foreach (var item in performanceData.ProductDetails) {
@item.ProductName
@item.TransactionValue.ToString("C") - (@item.PercentageContribution.ToString("F2")%) + (@item.PercentageOfTotal.ToString("F2")%)
+ style="width: @(item.PercentageOfTotal)%"> @item.TransactionCount.ToString("N0")
@@ -223,7 +224,7 @@ } - @if (Math.Abs(totalPercentage - 100) < 0.01m) + @if (Math.Abs(performanceData.ProductDetails.Sum(p=> p.PercentageOfTotal) - 100) < 0.01m) {
@@ -241,7 +242,7 @@ - Warning: Percentages sum to @totalPercentage.ToString("F2")% + Warning: Percentages sum to @performanceData.ProductDetails.Sum(p => p.PercentageOfTotal).ToString("F2")%
} @@ -260,92 +261,3 @@ }
-@code { - private bool isLoading = true; - private string? errorMessage; - private bool showChart = false; - - // Filter states - private DateOnly _startDate = DateOnly.FromDateTime(DateTime.Now.AddDays(-30)); - private DateOnly _endDate = DateOnly.FromDateTime(DateTime.Now); - - // Data - private List? performanceData; - - // KPIs - private int totalProducts = 0; - private int totalTransactions = 0; - private decimal totalValue = 0; - private decimal averageValuePerProduct = 0; - private decimal totalPercentage = 0; - - protected override async Task OnInitializedAsync() - { - await LoadData(); - } - - private async Task LoadData() - { - try - { - isLoading = true; - errorMessage = null; - StateHasChanged(); - - var correlationId = new CorrelationId(Guid.NewGuid()); - var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); - var accessToken = "stubbed-token"; - - var startDate = _startDate.ToDateTime(TimeOnly.MinValue); - var endDate = _endDate.ToDateTime(TimeOnly.MaxValue); - - var result = await Mediator.Send(new Queries.GetProductPerformanceQuery( - correlationId, - accessToken, - estateId, - startDate, - endDate - )); - - if (result.IsSuccess && result.Data != null) - { - performanceData = ModelFactory.ConvertFrom(result.Data); - CalculateKPIs(); - } - else - { - errorMessage = result.Message ?? "Failed to load product performance data"; - } - } - catch (Exception ex) - { - errorMessage = $"Failed to load data: {ex.Message}"; - Logger.LogError(ex, "Error loading product performance data"); - } - finally - { - isLoading = false; - StateHasChanged(); - } - } - - private void CalculateKPIs() - { - if (performanceData == null || !performanceData.Any()) - { - totalProducts = 0; - totalTransactions = 0; - totalValue = 0; - averageValuePerProduct = 0; - totalPercentage = 0; - return; - } - - totalProducts = performanceData.Count; - totalTransactions = performanceData.Sum(p => p.TransactionCount); - totalValue = performanceData.Sum(p => p.TransactionValue); - averageValuePerProduct = totalProducts > 0 ? totalValue / totalProducts : 0; - totalPercentage = performanceData.Sum(p => p.PercentageContribution); - } -} - diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/ProductPerformance.razor.cs b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/ProductPerformance.razor.cs new file mode 100644 index 00000000..e0666e51 --- /dev/null +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/ProductPerformance.razor.cs @@ -0,0 +1,80 @@ +using EstateManagementUI.BlazorServer.Factories; +using EstateManagementUI.BlazorServer.Models; +using EstateManagementUI.BlazorServer.Permissions; +using EstateManagementUI.BusinessLogic.Requests; +using SimpleResults; + +namespace EstateManagementUI.BlazorServer.Components.Pages.Reporting +{ + public partial class ProductPerformance + { + private bool isLoading = true; + private bool showChart = false; + + // Filter states + //private DateOnly _startDate = DateOnly.FromDateTime(DateTime.Now.AddDays(-7)); + private DateOnly _startDate = DateOnly.FromDateTime(new DateTime(2025, 12, 10)); + private DateOnly _endDate = DateOnly.FromDateTime(DateTime.Now); + + // Data + private TransactionModels.ProductPerformanceResponse? performanceData; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!firstRender) + { + return; + } + + Result result = await OnAfterRender(PermissionSection.Reporting, PermissionFunction.ProductPerformanceReport, this.LoadData); + if (result.IsFailed) + { + return; + } + } + + private async Task LoadData() + { + try + { + isLoading = true; + errorMessage = null; + StateHasChanged(); + + var correlationId = new CorrelationId(Guid.NewGuid()); + var estateId = await this.GetEstateId(); + + var startDate = _startDate.ToDateTime(TimeOnly.MinValue); + var endDate = _endDate.ToDateTime(TimeOnly.MaxValue); + + var result = await Mediator.Send(new TransactionQueries.GetProductPerformanceQuery( + correlationId, + estateId, + startDate, + endDate + )); + + if (result.IsSuccess && result.Data != null) + { + performanceData = ModelFactory.ConvertFrom(result.Data); + } + else + { + errorMessage = result.Message ?? "Failed to load product performance data"; + } + + return Result.Success(); + } + catch (Exception ex) + { + errorMessage = $"Failed to load product performance data: {ex.Message}"; + return Result.Failure(errorMessage); + } + finally + { + isLoading = false; + StateHasChanged(); + } + } + } +} diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor.cs b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor.cs index 77f507ed..284bb318 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor.cs +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor.cs @@ -28,7 +28,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) return; } - Result result = await OnAfterRender(PermissionSection.Reporting, PermissionFunction.TransactionMerchantSummaryReport, this.LoadData); + Result result = await OnAfterRender(PermissionSection.Reporting, PermissionFunction.TransactionOperatorSummaryReport, this.LoadData); if (result.IsFailed) { return; diff --git a/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs b/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs index 3746ffd6..f374b4c5 100644 --- a/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs +++ b/EstateManagementUI.BlazorServer/Factories/ModelFactory.cs @@ -1,5 +1,4 @@ using EstateManagementUI.BlazorServer.Models; -using EstateManagementUI.BusinessLogic.BackendAPI.DataTransferObjects; using EstateManagementUI.BusinessLogic.Models; using TransactionProcessor.DataTransferObjects.Responses.Contract; using ComparisonDateModel = EstateManagementUI.BlazorServer.Models.ComparisonDateModel; @@ -22,7 +21,7 @@ using MerchantTransactionSummaryModel = EstateManagementUI.BlazorServer.Models.MerchantTransactionSummaryModel; using OperatorModel = EstateManagementUI.BlazorServer.Models.OperatorModels.OperatorModel; using OperatorTransactionSummaryModel = EstateManagementUI.BlazorServer.Models.OperatorTransactionSummaryModel; -using ProductPerformanceModel = EstateManagementUI.BlazorServer.Models.ProductPerformanceModel; +using ProductPerformanceResponse = EstateManagementUI.BlazorServer.Models.TransactionModels.ProductPerformanceResponse; using RecentContractModel = EstateManagementUI.BlazorServer.Models.RecentContractModel; using RecentMerchantsModel = EstateManagementUI.BlazorServer.Models.RecentMerchantsModel; using SettlementSummaryModel = EstateManagementUI.BlazorServer.Models.SettlementSummaryModel; @@ -33,562 +32,570 @@ using TransactionDetailModel = EstateManagementUI.BlazorServer.Models.TransactionDetailModel; using TransactionModels = EstateManagementUI.BlazorServer.Models.TransactionModels; -namespace EstateManagementUI.BlazorServer.Factories { - public static class ModelFactory { - //public static EstateModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateModel model) { - // EstateModel result = new EstateModel(model.EstateId, model.EstateName, model.Reference); - // result = result with { AllOperators = new List(), AssignedOperators = new List(), RecentContracts = new List(), RecentMerchants = new List() }; - // if (model.Operators != null && model.Operators.Any()) { - // model.Operators.ForEach((o) => result.Operators.Add(ConvertFrom(o))); - // } - // if (model.Merchants != null && model.Merchants.Any()) { - // model.Merchants.ForEach((m) => result.Merchants.Add(ConvertFrom(m))); - // } - // if (model.Contracts != null && model.Contracts.Any()) { - // model.Contracts.ForEach((m) => result.Contracts.Add(ConvertFrom(m))); - // } - // if (model.Users != null && model.Users.Any()) - // { - // model.Users.ForEach((m) => result.Users.Add(ConvertFrom(m))); - // } - - // return result; - //} - - private static EstateModels.EstateUserModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateUserModel model) { - return new EstateModels.EstateUserModel() { CreatedDateTime = model.CreatedDateTime, EmailAddress = model.EmailAddress, UserId = model.UserId }; - } - - private static EstateModels.EstateContractModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateContractModel model) { - return new EstateModels.EstateContractModel() { ContractId = model.ContractId, Name = model.Name, OperatorId = model.OperatorId, OperatorName = model.OperatorName }; - } +namespace EstateManagementUI.BlazorServer.Factories; + +public static class ModelFactory { + //public static EstateModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateModel model) { + // EstateModel result = new EstateModel(model.EstateId, model.EstateName, model.Reference); + // result = result with { AllOperators = new List(), AssignedOperators = new List(), RecentContracts = new List(), RecentMerchants = new List() }; + // if (model.Operators != null && model.Operators.Any()) { + // model.Operators.ForEach((o) => result.Operators.Add(ConvertFrom(o))); + // } + // if (model.Merchants != null && model.Merchants.Any()) { + // model.Merchants.ForEach((m) => result.Merchants.Add(ConvertFrom(m))); + // } + // if (model.Contracts != null && model.Contracts.Any()) { + // model.Contracts.ForEach((m) => result.Contracts.Add(ConvertFrom(m))); + // } + // if (model.Users != null && model.Users.Any()) + // { + // model.Users.ForEach((m) => result.Users.Add(ConvertFrom(m))); + // } + + // return result; + //} + + private static EstateModels.EstateUserModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateUserModel model) { + return new EstateModels.EstateUserModel() { CreatedDateTime = model.CreatedDateTime, EmailAddress = model.EmailAddress, UserId = model.UserId }; + } - private static EstateModels.EstateMerchantModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateMerchantModel model) { - return new EstateModels.EstateMerchantModel() { Reference = model.Reference, Name = model.Name, MerchantId = model.MerchantId }; - } + private static EstateModels.EstateContractModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateContractModel model) { + return new EstateModels.EstateContractModel() { ContractId = model.ContractId, Name = model.Name, OperatorId = model.OperatorId, OperatorName = model.OperatorName }; + } - public static EstateModels.EstateOperatorModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateOperatorModel model) { - return new EstateModels.EstateOperatorModel() { Name = model.Name, OperatorId = model.OperatorId, RequireCustomMerchantNumber = model.RequireCustomMerchantNumber, RequireCustomTerminalNumber = model.RequireCustomTerminalNumber }; - } + private static EstateModels.EstateMerchantModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateMerchantModel model) { + return new EstateModels.EstateMerchantModel() { Reference = model.Reference, Name = model.Name, MerchantId = model.MerchantId }; + } - public static MerchantModel ConvertFrom(BusinessLogic.Models.MerchantModels.MerchantModel model) { - return new MerchantModel() { - MerchantId = model.MerchantId, - MerchantName = model.MerchantName, - MerchantReference = model.MerchantReference, - Balance = model.Balance, - AvailableBalance = model.AvailableBalance, - SettlementSchedule = model.SettlementSchedule, - AddressLine1 = model.AddressLine1, - AddressLine2 = model.AddressLine2, - Town = model.Town, - Region = model.Region, - PostalCode = model.PostalCode, - Country = model.Country, - ContactName = model.ContactName, - ContactEmailAddress = model.ContactEmailAddress, - ContactPhoneNumber = model.ContactPhoneNumber, - AddressId = model.AddressId, - ContactId = model.ContactId - }; - } + public static EstateModels.EstateOperatorModel ConvertFrom(BusinessLogic.Models.EstateModels.EstateOperatorModel model) { + return new EstateModels.EstateOperatorModel() { Name = model.Name, OperatorId = model.OperatorId, RequireCustomMerchantNumber = model.RequireCustomMerchantNumber, RequireCustomTerminalNumber = model.RequireCustomTerminalNumber }; + } - public static List ConvertFrom(List models) - { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static MerchantModel ConvertFrom(BusinessLogic.Models.MerchantModels.MerchantModel model) { + return new MerchantModel() { + MerchantId = model.MerchantId, + MerchantName = model.MerchantName, + MerchantReference = model.MerchantReference, + Balance = model.Balance, + AvailableBalance = model.AvailableBalance, + SettlementSchedule = model.SettlementSchedule, + AddressLine1 = model.AddressLine1, + AddressLine2 = model.AddressLine2, + Town = model.Town, + Region = model.Region, + PostalCode = model.PostalCode, + Country = model.Country, + ContactName = model.ContactName, + ContactEmailAddress = model.ContactEmailAddress, + ContactPhoneNumber = model.ContactPhoneNumber, + AddressId = model.AddressId, + ContactId = model.ContactId + }; + } - public static OperatorModel ConvertFrom(BusinessLogic.Models.OperatorModels.OperatorModel model) { - return new OperatorModel() { OperatorId = model.OperatorId, Name = model.Name, RequireCustomMerchantNumber = model.RequireCustomMerchantNumber, RequireCustomTerminalNumber = model.RequireCustomTerminalNumber }; - } + public static List ConvertFrom(List models) + { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static ContractModel ConvertFrom(BusinessLogic.Models.ContractModels.ContractModel model) { - ContractModel result = new ContractModel() { - ContractId = model.ContractId, - Description = model.Description, - OperatorId = model.OperatorId, - OperatorName = model.OperatorName, - Products = new List() - }; - if (model.Products != null && model.Products.Any()) { - model.Products.ForEach(p => result.Products.Add(ConvertFrom(p))); - } + public static OperatorModel ConvertFrom(BusinessLogic.Models.OperatorModels.OperatorModel model) { + return new OperatorModel() { OperatorId = model.OperatorId, Name = model.Name, RequireCustomMerchantNumber = model.RequireCustomMerchantNumber, RequireCustomTerminalNumber = model.RequireCustomTerminalNumber }; + } - return result; + public static ContractModel ConvertFrom(BusinessLogic.Models.ContractModels.ContractModel model) { + ContractModel result = new ContractModel() { + ContractId = model.ContractId, + Description = model.Description, + OperatorId = model.OperatorId, + OperatorName = model.OperatorName, + Products = new List() + }; + if (model.Products != null && model.Products.Any()) { + model.Products.ForEach(p => result.Products.Add(ConvertFrom(p))); } - public static List ConvertFrom(List models) - { - List result = new List(); + return result; + } - models.ForEach(p => result.Add(ConvertFrom(p))); + public static List ConvertFrom(List models) + { + List result = new List(); - return result; - } + models.ForEach(p => result.Add(ConvertFrom(p))); - public static ContractProductModel ConvertFrom(BusinessLogic.Models.ContractModels.ContractProductModel model) { - var result = new ContractProductModel() { - ContractProductId = model.ContractProductId, - ProductName = model.ProductName, - DisplayText = model.DisplayText, - Value = model.Value, - NumberOfFees = model.NumberOfFees, - ProductType = Enum.Parse(model.ProductType), - TransactionFees = new List() - }; - if (model.TransactionFees != null && model.TransactionFees.Any()) { - model.TransactionFees.ForEach(f => result.TransactionFees.Add(ConvertFrom(f))); - } + return result; + } - return result; - } + public static ContractProductModel ConvertFrom(BusinessLogic.Models.ContractModels.ContractProductModel model) { + var result = new ContractProductModel() { + ContractProductId = model.ContractProductId, + ProductName = model.ProductName, + DisplayText = model.DisplayText, + Value = model.Value, + NumberOfFees = model.NumberOfFees, + ProductType = Enum.Parse(model.ProductType), + TransactionFees = new List() + }; + if (model.TransactionFees != null && model.TransactionFees.Any()) { + model.TransactionFees.ForEach(f => result.TransactionFees.Add(ConvertFrom(f))); + } + + return result; + } - public static ContractProductTransactionFeeModel ConvertFrom(BusinessLogic.Models.ContractModels.ContractProductTransactionFeeModel model) { - return new ContractProductTransactionFeeModel() { - CalculationType = (CalculationType)model.CalculationType, - Description = model.Description, - FeeType = (FeeType)model.FeeType, - TransactionFeeId = model.TransactionFeeId, - Value = model.Value - }; - } + public static ContractProductTransactionFeeModel ConvertFrom(BusinessLogic.Models.ContractModels.ContractProductTransactionFeeModel model) { + return new ContractProductTransactionFeeModel() { + CalculationType = (CalculationType)model.CalculationType, + Description = model.Description, + FeeType = (FeeType)model.FeeType, + TransactionFeeId = model.TransactionFeeId, + Value = model.Value + }; + } - public static FileImportLogModel ConvertFrom(BusinessLogic.Models.FileImportLogModel model) { - return new FileImportLogModel() { FileImportLogId = model.FileImportLogId, FileCount = model.FileCount, FileUploadedDateTime = model.FileUploadedDateTime, ImportLogDateTime = model.ImportLogDateTime }; - } + public static FileImportLogModel ConvertFrom(BusinessLogic.Models.FileImportLogModel model) { + return new FileImportLogModel() { FileImportLogId = model.FileImportLogId, FileCount = model.FileCount, FileUploadedDateTime = model.FileUploadedDateTime, ImportLogDateTime = model.ImportLogDateTime }; + } - public static FileDetailsModel ConvertFrom(BusinessLogic.Models.FileDetailsModel model) { - return new FileDetailsModel() { - FileId = model.FileId, - FileUploadedDateTime = model.FileUploadedDateTime, - FailedLines = model.FailedLines, - FileLocation = model.FileLocation, - FileProfileName = model.FileProfileName, - IgnoredLines = model.IgnoredLines, - MerchantName = model.MerchantName, - ProcessingCompletedDateTime = model.ProcessingCompletedDateTime, - SuccessfullyProcessedLines = model.SuccessfullyProcessedLines, - TotalLines = model.TotalLines, - UserId = model.UserId - }; - } + public static FileDetailsModel ConvertFrom(BusinessLogic.Models.FileDetailsModel model) { + return new FileDetailsModel() { + FileId = model.FileId, + FileUploadedDateTime = model.FileUploadedDateTime, + FailedLines = model.FailedLines, + FileLocation = model.FileLocation, + FileProfileName = model.FileProfileName, + IgnoredLines = model.IgnoredLines, + MerchantName = model.MerchantName, + ProcessingCompletedDateTime = model.ProcessingCompletedDateTime, + SuccessfullyProcessedLines = model.SuccessfullyProcessedLines, + TotalLines = model.TotalLines, + UserId = model.UserId + }; + } - public static ComparisonDateModel ConvertFrom(BusinessLogic.Models.ComparisonDateModel model) { - return new ComparisonDateModel() { Description = model.Description, Date = model.Date }; - } + public static ComparisonDateModel ConvertFrom(BusinessLogic.Models.ComparisonDateModel model) { + return new ComparisonDateModel() { Description = model.Description, Date = model.Date }; + } - public static TodaysSalesModel ConvertFrom(BusinessLogic.Models.TodaysSalesModel model) { - return new TodaysSalesModel() { - ComparisonAverageValue = model.ComparisonAverageValue, - ComparisonSalesCount = model.ComparisonSalesCount, - ComparisonSalesValue = model.ComparisonSalesValue, - TodaysAverageValue = model.TodaysAverageValue, - TodaysSalesCount = model.TodaysSalesCount, - TodaysSalesValue = model.TodaysSalesValue - }; - } + public static TodaysSalesModel ConvertFrom(BusinessLogic.Models.TodaysSalesModel model) { + return new TodaysSalesModel() { + ComparisonAverageValue = model.ComparisonAverageValue, + ComparisonSalesCount = model.ComparisonSalesCount, + ComparisonSalesValue = model.ComparisonSalesValue, + TodaysAverageValue = model.TodaysAverageValue, + TodaysSalesCount = model.TodaysSalesCount, + TodaysSalesValue = model.TodaysSalesValue + }; + } - public static TodaysSettlementModel ConvertFrom(BusinessLogic.Models.TodaysSettlementModel model) { - return new TodaysSettlementModel() { - ComparisonSettlementCount = model.ComparisonSettlementCount, - ComparisonSettlementValue = model.ComparisonSettlementValue, - TodaysSettlementCount = model.TodaysSettlementCount, - TodaysSettlementValue = model.TodaysSettlementValue, - ComparisonPendingSettlementCount = model.ComparisonPendingSettlementCount, - ComparisonPendingSettlementValue = model.ComparisonPendingSettlementValue, - TodaysPendingSettlementCount = model.TodaysPendingSettlementCount, - TodaysPendingSettlementValue = model.TodaysPendingSettlementValue - }; - } + public static TodaysSettlementModel ConvertFrom(BusinessLogic.Models.TodaysSettlementModel model) { + return new TodaysSettlementModel() { + ComparisonSettlementCount = model.ComparisonSettlementCount, + ComparisonSettlementValue = model.ComparisonSettlementValue, + TodaysSettlementCount = model.TodaysSettlementCount, + TodaysSettlementValue = model.TodaysSettlementValue, + ComparisonPendingSettlementCount = model.ComparisonPendingSettlementCount, + ComparisonPendingSettlementValue = model.ComparisonPendingSettlementValue, + TodaysPendingSettlementCount = model.TodaysPendingSettlementCount, + TodaysPendingSettlementValue = model.TodaysPendingSettlementValue + }; + } - public static List ConvertFrom(List models) - { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) + { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static List ConvertFrom(List models) - { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) + { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static TodaysSalesCountByHourModel ConvertFrom(BusinessLogic.Models.TodaysSalesCountByHourModel model) { - return new TodaysSalesCountByHourModel() { TodaysSalesCount = model.TodaysSalesCount, ComparisonSalesCount = model.ComparisonSalesCount, Hour = model.Hour }; - } + public static TodaysSalesCountByHourModel ConvertFrom(BusinessLogic.Models.TodaysSalesCountByHourModel model) { + return new TodaysSalesCountByHourModel() { TodaysSalesCount = model.TodaysSalesCount, ComparisonSalesCount = model.ComparisonSalesCount, Hour = model.Hour }; + } - public static TodaysSalesValueByHourModel ConvertFrom(BusinessLogic.Models.TodaysSalesValueByHourModel model) { - return new TodaysSalesValueByHourModel() { TodaysSalesValue = model.TodaysSalesValue, ComparisonSalesValue = model.ComparisonSalesValue, Hour = model.Hour }; - } + public static TodaysSalesValueByHourModel ConvertFrom(BusinessLogic.Models.TodaysSalesValueByHourModel model) { + return new TodaysSalesValueByHourModel() { TodaysSalesValue = model.TodaysSalesValue, ComparisonSalesValue = model.ComparisonSalesValue, Hour = model.Hour }; + } - public static MerchantKpiModel ConvertFrom(BusinessLogic.Models.MerchantModels.MerchantKpiModel model) { - return new MerchantKpiModel() { MerchantsWithNoSaleInLast7Days = model.MerchantsWithNoSaleInLast7Days, MerchantsWithNoSaleToday = model.MerchantsWithNoSaleToday, MerchantsWithSaleInLastHour = model.MerchantsWithSaleInLastHour }; - } + public static MerchantKpiModel ConvertFrom(BusinessLogic.Models.MerchantModels.MerchantKpiModel model) { + return new MerchantKpiModel() { MerchantsWithNoSaleInLast7Days = model.MerchantsWithNoSaleInLast7Days, MerchantsWithNoSaleToday = model.MerchantsWithNoSaleToday, MerchantsWithSaleInLastHour = model.MerchantsWithSaleInLastHour }; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static SettlementSummaryModel ConvertFrom(BusinessLogic.Models.SettlementSummaryModel model) { - return new SettlementSummaryModel() { - MerchantName = model.MerchantName, - GrossTransactionValue = model.GrossTransactionValue, - MerchantId = model.MerchantId, - NetSettlementAmount = model.NetSettlementAmount, - SettlementPeriodEnd = model.SettlementPeriodEnd, - SettlementPeriodStart = model.SettlementPeriodStart, - TotalFees = model.TotalFees, - SettlementStatus = model.SettlementStatus - }; - } + public static SettlementSummaryModel ConvertFrom(BusinessLogic.Models.SettlementSummaryModel model) { + return new SettlementSummaryModel() { + MerchantName = model.MerchantName, + GrossTransactionValue = model.GrossTransactionValue, + MerchantId = model.MerchantId, + NetSettlementAmount = model.NetSettlementAmount, + SettlementPeriodEnd = model.SettlementPeriodEnd, + SettlementPeriodStart = model.SettlementPeriodStart, + TotalFees = model.TotalFees, + SettlementStatus = model.SettlementStatus + }; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static ProductPerformanceModel ConvertFrom(BusinessLogic.Models.ProductPerformanceModel model) { - return new ProductPerformanceModel() { PercentageContribution = model.PercentageContribution, ProductName = model.ProductName, TransactionCount = model.TransactionCount, TransactionValue = model.TransactionValue }; - } + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static MerchantSettlementHistoryModel ConvertFrom(BusinessLogic.Models.MerchantSettlementHistoryModel model) { + return new MerchantSettlementHistoryModel() { TransactionCount = model.TransactionCount, NetAmountPaid = model.NetAmountPaid, SettlementDate = model.SettlementDate, SettlementReference = model.SettlementReference }; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + private static TransactionDetailModel ConvertFrom(BusinessLogic.Models.TransactionDetailModel model) { + return new TransactionDetailModel() { + MerchantName = model.MerchantName, + ProductName = model.ProductName, + MerchantId = model.MerchantId, + OperatorId = model.OperatorId, + SettlementReference = model.SettlementReference, + FeesCommission = model.FeesCommission, + GrossAmount = model.GrossAmount, + TransactionType = model.TransactionType, + TransactionStatus = model.TransactionStatus, + TransactionId = model.TransactionId, + ProductId = model.ProductId, + OperatorName = model.OperatorName, + TransactionDateTime = model.TransactionDateTime, + NetAmount = model.NetAmount, + ResponseCode = model.ResponseCode, + SettlementDateTime = model.SettlementDateTime + }; - public static MerchantSettlementHistoryModel ConvertFrom(BusinessLogic.Models.MerchantSettlementHistoryModel model) { - return new MerchantSettlementHistoryModel() { TransactionCount = model.TransactionCount, NetAmountPaid = model.NetAmountPaid, SettlementDate = model.SettlementDate, SettlementReference = model.SettlementReference }; - } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + } - private static TransactionDetailModel ConvertFrom(BusinessLogic.Models.TransactionDetailModel model) { - return new TransactionDetailModel() { - MerchantName = model.MerchantName, - ProductName = model.ProductName, - MerchantId = model.MerchantId, - OperatorId = model.OperatorId, - SettlementReference = model.SettlementReference, - FeesCommission = model.FeesCommission, - GrossAmount = model.GrossAmount, - TransactionType = model.TransactionType, - TransactionStatus = model.TransactionStatus, - TransactionId = model.TransactionId, - ProductId = model.ProductId, - OperatorName = model.OperatorName, - TransactionDateTime = model.TransactionDateTime, - NetAmount = model.NetAmount, - ResponseCode = model.ResponseCode, - SettlementDateTime = model.SettlementDateTime - }; + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } + private static OperatorTransactionSummaryModel ConvertFrom(BusinessLogic.Models.OperatorTransactionSummaryModel model) { + return new OperatorTransactionSummaryModel() { + AverageTransactionValue = model.AverageTransactionValue, + FailedTransactionCount = model.FailedTransactionCount, + OperatorId = model.OperatorId, + OperatorName = model.OperatorName, + SuccessfulTransactionCount = model.SuccessfulTransactionCount, + TotalFeesEarned = model.TotalFeesEarned, + TotalTransactionCount = model.TotalTransactionCount, + TotalTransactionValue = model.TotalTransactionValue + }; + } - } + //public static List ConvertFrom(List models) { + // List result = new List(); + // models.ForEach(m => result.Add(ConvertFrom(m))); + // return result; + //} + + //private static MerchantTransactionSummaryModel ConvertFrom(BusinessLogic.Models.MerchantTransactionSummaryModel model) { + // return new MerchantTransactionSummaryModel() { + // MerchantName = model.MerchantName, + // TotalTransactionCount = model.TotalTransactionCount, + // TotalTransactionValue = model.TotalTransactionValue, + // MerchantId = model.MerchantId, + // AverageTransactionValue = model.AverageTransactionValue, + // FailedTransactionCount = model.FailedTransactionCount, + // SuccessfulTransactionCount = model.SuccessfulTransactionCount + // }; + //} + + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } - private static OperatorTransactionSummaryModel ConvertFrom(BusinessLogic.Models.OperatorTransactionSummaryModel model) { - return new OperatorTransactionSummaryModel() { - AverageTransactionValue = model.AverageTransactionValue, - FailedTransactionCount = model.FailedTransactionCount, - OperatorId = model.OperatorId, - OperatorName = model.OperatorName, - SuccessfulTransactionCount = model.SuccessfulTransactionCount, - TotalFeesEarned = model.TotalFeesEarned, - TotalTransactionCount = model.TotalTransactionCount, - TotalTransactionValue = model.TotalTransactionValue - }; - } + private static RecentMerchantsModel ConvertFrom(BusinessLogic.Models.MerchantModels.RecentMerchantsModel model) { + RecentMerchantsModel result = new RecentMerchantsModel() { + CreatedDateTime = model.CreatedDateTime, + MerchantId = model.MerchantId, + Name = model.Name, + Reference = model.Reference + }; + return result; + } - //public static List ConvertFrom(List models) { - // List result = new List(); - // models.ForEach(m => result.Add(ConvertFrom(m))); - // return result; - //} - - //private static MerchantTransactionSummaryModel ConvertFrom(BusinessLogic.Models.MerchantTransactionSummaryModel model) { - // return new MerchantTransactionSummaryModel() { - // MerchantName = model.MerchantName, - // TotalTransactionCount = model.TotalTransactionCount, - // TotalTransactionValue = model.TotalTransactionValue, - // MerchantId = model.MerchantId, - // AverageTransactionValue = model.AverageTransactionValue, - // FailedTransactionCount = model.FailedTransactionCount, - // SuccessfulTransactionCount = model.SuccessfulTransactionCount - // }; - //} - - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List ConvertFrom(List models) { + List result = new List(); + models.ForEach(m => result.Add(ConvertFrom(m))); + return result; + } + + private static RecentContractModel ConvertFrom(BusinessLogic.Models.ContractModels.RecentContractModel model) { + return new RecentContractModel { OperatorName = model.OperatorName, Description = model.Description, ContractId = model.ContractId }; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } + public static List? ConvertFrom(List resultData) { + List merchantList = new(); + foreach (BusinessLogic.Models.MerchantModels.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; + } - private static RecentMerchantsModel ConvertFrom(BusinessLogic.Models.MerchantModels.RecentMerchantsModel model) { - RecentMerchantsModel result = new RecentMerchantsModel() { - CreatedDateTime = model.CreatedDateTime, - MerchantId = model.MerchantId, - Name = model.Name, - Reference = model.Reference - }; - return result; + public static List? ConvertFrom(List resultData) { + List merchantList = new(); + foreach (BusinessLogic.Models.MerchantModels.MerchantDropDownModel merchantDropDownModel in resultData) { + merchantList.Add(new MerchantDropDownModel { + MerchantId = merchantDropDownModel.MerchantId, + MerchantReportingId = merchantDropDownModel.MerchantReportingId, + MerchantName = merchantDropDownModel.MerchantName + }); } + return merchantList; + } - public static List ConvertFrom(List models) { - List result = new List(); - models.ForEach(m => result.Add(ConvertFrom(m))); - return result; - } - - private static RecentContractModel ConvertFrom(BusinessLogic.Models.ContractModels.RecentContractModel model) { - return new RecentContractModel { OperatorName = model.OperatorName, Description = model.Description, ContractId = model.ContractId }; + public static List ConvertFrom(List resultData) { + List merchantOperators = new(); + foreach (BusinessLogic.Models.MerchantModels.MerchantOperatorModel merchantOperatorModel in resultData) + { + merchantOperators.Add(new MerchantOperatorModel + { + OperatorName = merchantOperatorModel.OperatorName, + OperatorId = merchantOperatorModel.OperatorId, + MerchantNumber = merchantOperatorModel.MerchantNumber, + TerminalNumber = merchantOperatorModel.TerminalNumber + }); } + return merchantOperators; + } - public static List? ConvertFrom(List resultData) { - List merchantList = new(); - foreach (BusinessLogic.Models.MerchantModels.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; + public static List ConvertFrom(List resultData) { + List deviceList = new(); + foreach (var merchantDevice in resultData) + { + deviceList.Add(new MerchantDeviceModel() { + DeviceId = merchantDevice.DeviceId, + DeviceIdentifier = merchantDevice.DeviceIdentifier, + IsDeleted = merchantDevice.IsDeleted, + MerchantId = merchantDevice.MerchantId + }); } - public static List? ConvertFrom(List resultData) { - List merchantList = new(); - foreach (BusinessLogic.Models.MerchantModels.MerchantDropDownModel merchantDropDownModel in resultData) { - merchantList.Add(new MerchantDropDownModel { - MerchantId = merchantDropDownModel.MerchantId, - MerchantReportingId = merchantDropDownModel.MerchantReportingId, - MerchantName = merchantDropDownModel.MerchantName - }); - } - return merchantList; - } + return deviceList; + } - public static List ConvertFrom(List resultData) { - List merchantOperators = new(); - foreach (BusinessLogic.Models.MerchantModels.MerchantOperatorModel merchantOperatorModel in resultData) + public static List ConvertFrom(List resultData) { + List merchantContracts = new(); + foreach (BusinessLogic.Models.MerchantModels.MerchantContractModel merchantContractModel in resultData) + { + var cm = new MerchantContractModel { - merchantOperators.Add(new MerchantOperatorModel - { - OperatorName = merchantOperatorModel.OperatorName, - OperatorId = merchantOperatorModel.OperatorId, - MerchantNumber = merchantOperatorModel.MerchantNumber, - TerminalNumber = merchantOperatorModel.TerminalNumber - }); - } - return merchantOperators; - } - - public static List ConvertFrom(List resultData) { - List deviceList = new(); - foreach (var merchantDevice in resultData) + ContractId = merchantContractModel.ContractId, + OperatorName = merchantContractModel.OperatorName, + ContractName = merchantContractModel.ContractName, + ContractProducts = new List() + }; + foreach (BusinessLogic.Models.MerchantModels.MerchantContractProductModel merchantContractProductModel in merchantContractModel.ContractProducts) { - deviceList.Add(new MerchantDeviceModel() { - DeviceId = merchantDevice.DeviceId, - DeviceIdentifier = merchantDevice.DeviceIdentifier, - IsDeleted = merchantDevice.IsDeleted, - MerchantId = merchantDevice.MerchantId + cm.ContractProducts.Add(new MerchantContractProductModel + { + ProductName = merchantContractProductModel.ProductName, + DisplayText = merchantContractProductModel.DisplayText, + ProductId = merchantContractProductModel.ProductId, + ProductType = merchantContractProductModel.ProductType, + ContractId = merchantContractProductModel.ContractId, + Value = merchantContractProductModel.Value, + MerchantId = merchantContractProductModel.MerchantId }); } - - return deviceList; + merchantContracts.Add(cm); } + return merchantContracts; + } - public static List ConvertFrom(List resultData) { - List merchantContracts = new(); - foreach (BusinessLogic.Models.MerchantModels.MerchantContractModel merchantContractModel in resultData) - { - var cm = new MerchantContractModel - { - ContractId = merchantContractModel.ContractId, - OperatorName = merchantContractModel.OperatorName, - ContractName = merchantContractModel.ContractName, - ContractProducts = new List() - }; - foreach (BusinessLogic.Models.MerchantModels.MerchantContractProductModel merchantContractProductModel in merchantContractModel.ContractProducts) - { - cm.ContractProducts.Add(new MerchantContractProductModel - { - ProductName = merchantContractProductModel.ProductName, - DisplayText = merchantContractProductModel.DisplayText, - ProductId = merchantContractProductModel.ProductId, - ProductType = merchantContractProductModel.ProductType, - ContractId = merchantContractProductModel.ContractId, - Value = merchantContractProductModel.Value, - MerchantId = merchantContractProductModel.MerchantId - }); - } - merchantContracts.Add(cm); - } - return merchantContracts; + public static List ConvertFrom(List resultData) { + List contractList = new(); + foreach (BusinessLogic.Models.ContractModels.ContractDropDownModel contractDropDownModel in resultData) { + contractList.Add(new ContractDropDownModel() { + ContractId = contractDropDownModel.ContractId, + Description = contractDropDownModel.Description, + OperatorName = contractDropDownModel.OperatorName + }); } - public static List ConvertFrom(List resultData) { - List contractList = new(); - foreach (BusinessLogic.Models.ContractModels.ContractDropDownModel contractDropDownModel in resultData) { - contractList.Add(new ContractDropDownModel() { - ContractId = contractDropDownModel.ContractId, - Description = contractDropDownModel.Description, - OperatorName = contractDropDownModel.OperatorName - }); - } - - return contractList; - } + return contractList; + } - public static List? ConvertFrom(List resultData) { - List operatorList = new(); - foreach (BusinessLogic.Models.OperatorModels.OperatorDropDownModel operatorDropDownModel in resultData) + public static List? ConvertFrom(List resultData) { + List operatorList = new(); + foreach (BusinessLogic.Models.OperatorModels.OperatorDropDownModel operatorDropDownModel in resultData) + { + operatorList.Add(new OperatorDropDownModel() { - operatorList.Add(new OperatorDropDownModel() - { - OperatorId = operatorDropDownModel.OperatorId, - OperatorReportingId = operatorDropDownModel.OperatorReportingId, - OperatorName = operatorDropDownModel.OperatorName - }); - } - - return operatorList; + OperatorId = operatorDropDownModel.OperatorId, + OperatorReportingId = operatorDropDownModel.OperatorReportingId, + OperatorName = operatorDropDownModel.OperatorName + }); } - public static TransactionModels.TransactionDetailReportResponse? ConvertFrom(BusinessLogic.Models.TransactionModels.TransactionDetailReportResponse resultData) { - TransactionModels.TransactionDetailReportResponse model = new(); - model.Summary = new TransactionDetailSummary { - TotalFees = resultData.Summary.TotalFees, - TotalValue = resultData.Summary.TotalValue, - TransactionCount = resultData.Summary.TransactionCount - }; - model.Transactions = new List(); - foreach (BusinessLogic.Models.TransactionModels.TransactionDetail resultDataTransaction in resultData.Transactions) { - model.Transactions.Add(new TransactionModels.TransactionDetail { - TotalFees = resultDataTransaction.TotalFees, - Value = resultDataTransaction.Value, - Status = resultDataTransaction.Status, - Type = resultDataTransaction.Type, - ProductReportingId = resultDataTransaction.ProductReportingId, - ProductId = resultDataTransaction.ProductId, - Product = resultDataTransaction.Product, - OperatorReportingId = resultDataTransaction.OperatorReportingId, - OperatorId = resultDataTransaction.OperatorId, - Operator = resultDataTransaction.Operator, - MerchantReportingId = resultDataTransaction.MerchantReportingId, - MerchantId = resultDataTransaction.MerchantId, - Merchant = resultDataTransaction.Merchant, - DateTime = resultDataTransaction.DateTime, - Id = resultDataTransaction.Id, - SettlementReference = resultDataTransaction.SettlementReference, - NetAmount = resultDataTransaction.Value - resultDataTransaction.TotalFees - }); - } - return model; - } + return operatorList; + } - public static TransactionModels.TransactionSummaryByMerchantResponse ConvertFrom(BusinessLogic.Models.TransactionModels.TransactionSummaryByMerchantResponse resultData) { - TransactionModels.TransactionSummaryByMerchantResponse model = new(); - model.Summary = new TransactionModels.MerchantDetailSummary { - AverageValue = resultData.Summary.AverageValue, - TotalCount = resultData.Summary.TotalCount, - TotalMerchants = resultData.Summary.TotalMerchants, - TotalValue = resultData.Summary.TotalValue - }; - model.Merchants = new(); - foreach (BusinessLogic.Models.TransactionModels.MerchantDetail resultDataMerchant in resultData.Merchants) { - model.Merchants.Add(new TransactionModels.MerchantDetail() { - AverageValue = resultDataMerchant.AverageValue, - DeclinedCount = resultDataMerchant.DeclinedCount, - MerchantId = resultDataMerchant.MerchantId, - MerchantReportingId = resultDataMerchant.MerchantReportingId, - MerchantName = resultDataMerchant.MerchantName, - AuthorisedPercentage = resultDataMerchant.AuthorisedPercentage, - AuthorisedCount = resultDataMerchant.AuthorisedCount, - TotalCount = resultDataMerchant.TotalCount, - TotalValue= resultDataMerchant.TotalValue - }); - } + public static TransactionModels.TransactionDetailReportResponse? ConvertFrom(BusinessLogic.Models.TransactionModels.TransactionDetailReportResponse resultData) { + TransactionModels.TransactionDetailReportResponse model = new(); + model.Summary = new TransactionModels.TransactionDetailSummary { + TotalFees = resultData.Summary.TotalFees, + TotalValue = resultData.Summary.TotalValue, + TransactionCount = resultData.Summary.TransactionCount + }; + model.Transactions = new List(); + foreach (BusinessLogic.Models.TransactionModels.TransactionDetail resultDataTransaction in resultData.Transactions) { + model.Transactions.Add(new TransactionModels.TransactionDetail { + TotalFees = resultDataTransaction.TotalFees, + Value = resultDataTransaction.Value, + Status = resultDataTransaction.Status, + Type = resultDataTransaction.Type, + ProductReportingId = resultDataTransaction.ProductReportingId, + ProductId = resultDataTransaction.ProductId, + Product = resultDataTransaction.Product, + OperatorReportingId = resultDataTransaction.OperatorReportingId, + OperatorId = resultDataTransaction.OperatorId, + Operator = resultDataTransaction.Operator, + MerchantReportingId = resultDataTransaction.MerchantReportingId, + MerchantId = resultDataTransaction.MerchantId, + Merchant = resultDataTransaction.Merchant, + DateTime = resultDataTransaction.DateTime, + Id = resultDataTransaction.Id, + SettlementReference = resultDataTransaction.SettlementReference, + NetAmount = resultDataTransaction.Value - resultDataTransaction.TotalFees + }); + } + return model; + } - return model; - } + public static TransactionModels.TransactionSummaryByMerchantResponse ConvertFrom(BusinessLogic.Models.TransactionModels.TransactionSummaryByMerchantResponse resultData) { + TransactionModels.TransactionSummaryByMerchantResponse model = new(); + model.Summary = new TransactionModels.MerchantDetailSummary { + AverageValue = resultData.Summary.AverageValue, + TotalCount = resultData.Summary.TotalCount, + TotalMerchants = resultData.Summary.TotalMerchants, + TotalValue = resultData.Summary.TotalValue + }; + model.Merchants = new(); + foreach (BusinessLogic.Models.TransactionModels.MerchantDetail resultDataMerchant in resultData.Merchants) { + model.Merchants.Add(new TransactionModels.MerchantDetail() { + AverageValue = resultDataMerchant.AverageValue, + DeclinedCount = resultDataMerchant.DeclinedCount, + MerchantId = resultDataMerchant.MerchantId, + MerchantReportingId = resultDataMerchant.MerchantReportingId, + MerchantName = resultDataMerchant.MerchantName, + AuthorisedPercentage = resultDataMerchant.AuthorisedPercentage, + AuthorisedCount = resultDataMerchant.AuthorisedCount, + TotalCount = resultDataMerchant.TotalCount, + TotalValue= resultDataMerchant.TotalValue + }); + } + + return model; + } - public static TransactionModels.TransactionSummaryByOperatorResponse ConvertFrom(BusinessLogic.Models.TransactionModels.TransactionSummaryByOperatorResponse resultData) { - TransactionModels.TransactionSummaryByOperatorResponse model = new(); - model.Summary = new TransactionModels.OperatorDetailSummary - { - AverageValue = resultData.Summary.AverageValue, - TotalCount = resultData.Summary.TotalCount, - TotalOperators = resultData.Summary.TotalOperators, - TotalValue = resultData.Summary.TotalValue - }; - model.Operators = new(); - foreach (BusinessLogic.Models.TransactionModels.OperatorDetail resultDataOperator in resultData.Operators) + public static TransactionModels.TransactionSummaryByOperatorResponse ConvertFrom(BusinessLogic.Models.TransactionModels.TransactionSummaryByOperatorResponse resultData) { + TransactionModels.TransactionSummaryByOperatorResponse model = new(); + model.Summary = new TransactionModels.OperatorDetailSummary + { + AverageValue = resultData.Summary.AverageValue, + TotalCount = resultData.Summary.TotalCount, + TotalOperators = resultData.Summary.TotalOperators, + TotalValue = resultData.Summary.TotalValue + }; + model.Operators = new(); + foreach (BusinessLogic.Models.TransactionModels.OperatorDetail resultDataOperator in resultData.Operators) + { + model.Operators.Add(new TransactionModels.OperatorDetail() { - model.Operators.Add(new TransactionModels.OperatorDetail() - { - AverageValue = resultDataOperator.AverageValue, - DeclinedCount = resultDataOperator.DeclinedCount, - OperatorId = resultDataOperator.OperatorId, - OperatorReportingId = resultDataOperator.OperatorReportingId, - OperatorName = resultDataOperator.OperatorName, - AuthorisedPercentage = resultDataOperator.AuthorisedPercentage, - AuthorisedCount = resultDataOperator.AuthorisedCount, - TotalCount = resultDataOperator.TotalCount, - TotalValue = resultDataOperator.TotalValue - }); - } + AverageValue = resultDataOperator.AverageValue, + DeclinedCount = resultDataOperator.DeclinedCount, + OperatorId = resultDataOperator.OperatorId, + OperatorReportingId = resultDataOperator.OperatorReportingId, + OperatorName = resultDataOperator.OperatorName, + AuthorisedPercentage = resultDataOperator.AuthorisedPercentage, + AuthorisedCount = resultDataOperator.AuthorisedCount, + TotalCount = resultDataOperator.TotalCount, + TotalValue = resultDataOperator.TotalValue + }); + } + + return model; + } - return model; + public static ProductPerformanceResponse ConvertFrom(BusinessLogic.Models.TransactionModels.ProductPerformanceResponse resultData) { + + var model = new ProductPerformanceResponse { Summary = new TransactionModels.ProductPerformanceSummary() { TotalValue = resultData.Summary.TotalValue, TotalCount = resultData.Summary.TotalCount, AveragePerProduct = resultData.Summary.AveragePerProduct, TotalProducts = resultData.Summary.TotalProducts } }; + model.ProductDetails = new List(); + foreach (BusinessLogic.Models.TransactionModels.ProductPerformanceDetail productPerformanceDetail in resultData.ProductDetails) { + model.ProductDetails.Add(new TransactionModels.ProductPerformanceDetail() { + ProductId = productPerformanceDetail.ProductId, + ProductName = productPerformanceDetail.ProductName, + TransactionCount = productPerformanceDetail.TransactionCount, + ContractId = productPerformanceDetail.ContractId, + ContractReportingId = productPerformanceDetail.ContractReportingId, + ProductReportingId = productPerformanceDetail.ProductReportingId, + TransactionValue = productPerformanceDetail.TransactionValue, + PercentageOfTotal = productPerformanceDetail.PercentageOfTotal, + }); } + + return model; } } \ No newline at end of file diff --git a/EstateManagementUI.BlazorServer/Models/TransactionModels.cs b/EstateManagementUI.BlazorServer/Models/TransactionModels.cs index 72e25b19..43baf400 100644 --- a/EstateManagementUI.BlazorServer/Models/TransactionModels.cs +++ b/EstateManagementUI.BlazorServer/Models/TransactionModels.cs @@ -10,6 +10,13 @@ public class TransactionDetailReportResponse public TransactionDetailSummary Summary { get; set; } } + public class TransactionDetailSummary + { + public Decimal TotalValue { get; set; } + public Decimal TotalFees { get; set; } + public Int32 TransactionCount { get; set; } + } + public class TransactionDetail { public Guid Id { get; set; } @@ -84,4 +91,30 @@ public class OperatorDetailSummary public Decimal TotalValue { get; set; } public Decimal AverageValue { get; set; } } + + public class ProductPerformanceResponse + { + public List ProductDetails { get; set; } + public ProductPerformanceSummary Summary { get; set; } + } + + public class ProductPerformanceDetail + { + public String ProductName { get; set; } + public Guid ProductId { get; set; } + public Int32 ProductReportingId { get; set; } + public Guid ContractId { get; set; } + public Int32 ContractReportingId { get; set; } + public Int32 TransactionCount { get; set; } + public Decimal TransactionValue { get; set; } + public Decimal PercentageOfTotal { get; set; } + } + + public class ProductPerformanceSummary + { + public Int32 TotalProducts { get; set; } + public Int32 TotalCount { get; set; } + public Decimal TotalValue { get; set; } + public Decimal AveragePerProduct { get; set; } + } } \ No newline at end of file diff --git a/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs b/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs index 1d6d5300..7b4902ed 100644 --- a/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs +++ b/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs @@ -18,5 +18,6 @@ public enum PermissionFunction // Reporting TransactionDetailReport, TransactionMerchantSummaryReport, - TransactionOperatorSummaryReport + TransactionOperatorSummaryReport, + ProductPerformanceReport } diff --git a/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/TransactionSummaryByMerchantResponse.cs b/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/TransactionSummaryByMerchantResponse.cs index 3f589dc1..7d7e631b 100644 --- a/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/TransactionSummaryByMerchantResponse.cs +++ b/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/TransactionSummaryByMerchantResponse.cs @@ -50,4 +50,44 @@ public class OperatorDetailSummary public Decimal TotalValue { get; set; } [JsonProperty("average_value")] public Decimal AverageValue { get; set; } +} + +public class ProductPerformanceResponse +{ + [JsonProperty("product_details")] + public List ProductDetails { get; set; } + [JsonProperty("summary")] + public ProductPerformanceSummary Summary { get; set; } +} + +public class ProductPerformanceDetail +{ + [JsonProperty("product_name")] + public String ProductName { get; set; } + [JsonProperty("product_id")] + public Guid ProductId { get; set; } + [JsonProperty("product_reporting_id")] + public Int32 ProductReportingId { get; set; } + [JsonProperty("contract_id")] + public Guid ContractId { get; set; } + [JsonProperty("contract_reporting_id")] + public Int32 ContractReportingId { get; set; } + [JsonProperty("transaction_count")] + public Int32 TransactionCount { get; set; } + [JsonProperty("transaction_value")] + public Decimal TransactionValue { get; set; } + [JsonProperty("percentage_of_total")] + public Decimal PercentageOfTotal { get; set; } +} + +public class ProductPerformanceSummary +{ + [JsonProperty("total_products")] + public Int32 TotalProducts { get; set; } + [JsonProperty("total_count")] + public Int32 TotalCount { get; set; } + [JsonProperty("total_value")] + public Decimal TotalValue { get; set; } + [JsonProperty("average_per_product")] + public Decimal AveragePerProduct { get; set; } } \ No newline at end of file diff --git a/EstateManagmentUI.BusinessLogic/BackendAPI/EstateReportingApiClient.cs b/EstateManagmentUI.BusinessLogic/BackendAPI/EstateReportingApiClient.cs index ef61c51a..97e722f7 100644 --- a/EstateManagmentUI.BusinessLogic/BackendAPI/EstateReportingApiClient.cs +++ b/EstateManagmentUI.BusinessLogic/BackendAPI/EstateReportingApiClient.cs @@ -1,9 +1,10 @@ -using SimpleResults; +using EstateManagementUI.BusinessLogic.BackendAPI.DataTransferObjects; +using Shared.Results; +using SimpleResults; using System; using System.Collections.Generic; using System.Text; -using EstateManagementUI.BusinessLogic.BackendAPI.DataTransferObjects; -using Shared.Results; +using TransactionProcessor.DataTransferObjects.Responses.Merchant; namespace EstateManagementUI.BusinessLogic.BackendAPI { @@ -88,6 +89,7 @@ Task> GetTransactionDetailReport(String Task> GetMerchantTransactionSummary(String accessToken, Guid estateId, TransactionSummaryByMerchantRequest request, CancellationToken cancellationToken); Task> GetOperatorTransactionSummary(String accessToken, Guid estateId, TransactionSummaryByOperatorRequest request, CancellationToken cancellationToken); + Task> GetProductPerformance(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, CancellationToken cancellationToken); } public class EstateReportingApiClient : ClientProxyBase.ClientProxyBase, IEstateReportingApiClient { @@ -516,6 +518,38 @@ public async Task> GetOperatorTrans } } + public async Task> GetProductPerformance(String accessToken, + Guid estateId, + DateTime startDate, + DateTime endDate, + CancellationToken cancellationToken) { + QueryStringBuilder builder = new QueryStringBuilder(); + builder.AddParameter("startDate", $"{startDate:yyyy-MM-dd}"); + builder.AddParameter("endDate", $"{endDate:yyyy-MM-dd}"); + + String requestUri = this.BuildRequestUrl($"/api/transactions/productperformancereport?{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 product performance report for estate {estateId}.", ex); + + return Result.Failure(exception.Message); + } + } + public async Task>> GetMerchantDevices(String accessToken, Guid estateId, Guid merchantId, diff --git a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs index 1f76c1a3..b4a3198a 100644 --- a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs +++ b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs @@ -175,6 +175,26 @@ public static TransactionModels.TransactionSummaryByOperatorResponse ConvertFrom } return model; } + + public static TransactionModels.ProductPerformanceResponse ConvertFrom(ProductPerformanceResponse apiResultData) { + TransactionModels.ProductPerformanceResponse model = new(); + model.Summary = new TransactionModels.ProductPerformanceSummary() { TotalValue = apiResultData.Summary.TotalValue, AveragePerProduct = apiResultData.Summary.AveragePerProduct, TotalCount = apiResultData.Summary.TotalCount, TotalProducts = apiResultData.Summary.TotalProducts }; + model.ProductDetails = new(); + foreach (ProductPerformanceDetail productPerformanceDetail in apiResultData.ProductDetails) { + model.ProductDetails.Add(new TransactionModels.ProductPerformanceDetail() { + ProductId = productPerformanceDetail.ProductId, + ProductName = productPerformanceDetail.ProductName, + PercentageOfTotal = productPerformanceDetail.PercentageOfTotal, + ProductReportingId = productPerformanceDetail.ProductReportingId, + ContractId = productPerformanceDetail.ContractId, + ContractReportingId = productPerformanceDetail.ContractReportingId, + TransactionCount = productPerformanceDetail.TransactionCount, + TransactionValue = productPerformanceDetail.TransactionValue + }); + } + + return model; + } } public static class FactoryExtensions{ diff --git a/EstateManagmentUI.BusinessLogic/Client/TransactionMethods.cs b/EstateManagmentUI.BusinessLogic/Client/TransactionMethods.cs index f99aa37c..899a3b0a 100644 --- a/EstateManagmentUI.BusinessLogic/Client/TransactionMethods.cs +++ b/EstateManagmentUI.BusinessLogic/Client/TransactionMethods.cs @@ -16,6 +16,7 @@ public partial interface IApiClient Task> GetTransactionDetailReport(TransactionQueries.GetTransactionDetailQuery request, CancellationToken cancellationToken); Task> GetMerchantTransactionSummary(TransactionQueries.GetMerchantTransactionSummaryQuery request, CancellationToken cancellationToken); Task> GetOperatorTransactionSummary(TransactionQueries.GetOperatorTransactionSummaryQuery request, CancellationToken cancellationToken); + Task> GetProductPerformance(TransactionQueries.GetProductPerformanceQuery request, CancellationToken cancellationToken); } public partial class ApiClient : IApiClient { @@ -140,5 +141,21 @@ public async Task> GetTodaysFailedSales(TransactionQuer return Result.Success(transactionSummaryByOperatorResponseModel); } + + public async Task> GetProductPerformance(TransactionQueries.GetProductPerformanceQuery request, + CancellationToken cancellationToken) { + Result token = await this.GetToken(cancellationToken); + if (token.IsFailed) + return ResultHelpers.CreateFailure(token); + + Result apiResult = await this.EstateReportingApiClient.GetProductPerformance(token.Data, request.EstateId, request.StartDate, request.EndDate, cancellationToken); + + if (apiResult.IsFailed) + return ResultHelpers.CreateFailure(apiResult); + + TransactionModels.ProductPerformanceResponse productPerformanceResponseModel = APIModelFactory.ConvertFrom(apiResult.Data); + + return Result.Success(productPerformanceResponseModel); + } } } diff --git a/EstateManagmentUI.BusinessLogic/Models/TransactionModels.cs b/EstateManagmentUI.BusinessLogic/Models/TransactionModels.cs index 5425c257..eccdfe55 100644 --- a/EstateManagmentUI.BusinessLogic/Models/TransactionModels.cs +++ b/EstateManagmentUI.BusinessLogic/Models/TransactionModels.cs @@ -94,5 +94,32 @@ public class OperatorDetailSummary public Decimal TotalValue { get; set; } public Decimal AverageValue { get; set; } } + + + public class ProductPerformanceResponse + { + public List ProductDetails { get; set; } + public ProductPerformanceSummary Summary { get; set; } + } + + public class ProductPerformanceDetail + { + public String ProductName { get; set; } + public Guid ProductId { get; set; } + public Int32 ProductReportingId { get; set; } + public Guid ContractId { get; set; } + public Int32 ContractReportingId { get; set; } + public Int32 TransactionCount { get; set; } + public Decimal TransactionValue { get; set; } + public Decimal PercentageOfTotal { get; set; } + } + + public class ProductPerformanceSummary + { + public Int32 TotalProducts { get; set; } + public Int32 TotalCount { get; set; } + public Decimal TotalValue { get; set; } + public Decimal AveragePerProduct { get; set; } + } } } diff --git a/EstateManagmentUI.BusinessLogic/RequestHandlers/TransactionRequestHandler.cs b/EstateManagmentUI.BusinessLogic/RequestHandlers/TransactionRequestHandler.cs index aebe70b0..27a0e165 100644 --- a/EstateManagmentUI.BusinessLogic/RequestHandlers/TransactionRequestHandler.cs +++ b/EstateManagmentUI.BusinessLogic/RequestHandlers/TransactionRequestHandler.cs @@ -10,7 +10,8 @@ public class TransactionRequestHandler : IRequestHandler>, IRequestHandler>, IRequestHandler>, - IRequestHandler> + IRequestHandler>, + IRequestHandler> { private readonly IApiClient ApiClient; public TransactionRequestHandler(IApiClient apiClient) { @@ -41,4 +42,9 @@ public async Task> Handle(TransactionQueries.GetTodaysF CancellationToken cancellationToken) { return await this.ApiClient.GetOperatorTransactionSummary(request, cancellationToken); } + + public async Task> Handle(TransactionQueries.GetProductPerformanceQuery request, + CancellationToken cancellationToken) { + return await this.ApiClient.GetProductPerformance(request, cancellationToken); + } } \ No newline at end of file diff --git a/EstateManagmentUI.BusinessLogic/Requests/Queries.cs b/EstateManagmentUI.BusinessLogic/Requests/Queries.cs index 2b5e4c36..582553d0 100644 --- a/EstateManagmentUI.BusinessLogic/Requests/Queries.cs +++ b/EstateManagmentUI.BusinessLogic/Requests/Queries.cs @@ -10,6 +10,7 @@ public record GetTodaysFailedSalesQuery(CorrelationId CorrelationId, Guid Estate public record GetTransactionDetailQuery(CorrelationId CorrelationId, Guid EstateId, DateTime StartDate, DateTime EndDate, List? MerchantIds = null, List? OperatorIds = null, List? ProductIds = null) : IRequest>; public record GetMerchantTransactionSummaryQuery(CorrelationId CorrelationId, Guid EstateId, DateTime StartDate, DateTime EndDate, Int32? MerchantId = null, Int32? OperatorId = null) : IRequest>; public record GetOperatorTransactionSummaryQuery(CorrelationId CorrelationId,Guid EstateId, DateTime StartDate, DateTime EndDate, Int32? MerchantId = null, Int32? OperatorId = null) : IRequest>; + public record GetProductPerformanceQuery(CorrelationId CorrelationId, Guid EstateId, DateTime StartDate, DateTime EndDate) : IRequest>; } public static class Queries @@ -35,7 +36,6 @@ public record GetBottomOperatorDataQuery(CorrelationId CorrelationId, string Acc public record GetLastSettlementQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId) : IRequest>; public record GetMerchantTransactionSummaryQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate, Guid? MerchantId = null, Guid? OperatorId = null, Guid? ProductId = null) : IRequest>>; - public record GetProductPerformanceQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate) : IRequest>>; public record GetMerchantSettlementHistoryQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid? MerchantId, DateTime StartDate, DateTime EndDate) : IRequest>>; public record GetSettlementSummaryQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate, Guid? MerchantId = null, string? Status = null) : IRequest>>; } \ No newline at end of file