Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions EstateManagementUI.BlazorServer/Models/Models.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,18 @@ public class MerchantTransactionSummaryModel
public int FailedTransactionCount { get; set; }
}

public class OperatorTransactionSummaryModel
{
public Guid OperatorId { get; set; }
public string? OperatorName { get; set; }
public int TotalTransactionCount { get; set; }
public decimal TotalTransactionValue { get; set; }
public decimal AverageTransactionValue { get; set; }
public int SuccessfulTransactionCount { get; set; }
public int FailedTransactionCount { get; set; }
public decimal TotalFeesEarned { get; set; }
}

public class ProductPerformanceModel
{
public string? ProductName { get; set; }
Expand Down
1 change: 1 addition & 0 deletions EstateManagementUI.BlazorServer/Requests/Requests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public record GetLastSettlementQuery(CorrelationId CorrelationId, string AccessT
public record GetMerchantQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid MerchantId) : IRequest<Result<MerchantModel>>;
public record GetMerchantTransactionSummaryQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate, Guid? MerchantId = null, Guid? OperatorId = null, Guid? ProductId = null) : IRequest<Result<List<MerchantTransactionSummaryModel>>>;
public record GetProductPerformanceQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate) : IRequest<Result<List<ProductPerformanceModel>>>;
public record GetOperatorTransactionSummaryQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate, Guid? MerchantId = null, Guid? OperatorId = null) : IRequest<Result<List<OperatorTransactionSummaryModel>>>;
public record GetMerchantSettlementHistoryQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid? MerchantId, DateTime StartDate, DateTime EndDate) : IRequest<Result<List<MerchantSettlementHistoryModel>>>;
}

Expand Down
38 changes: 38 additions & 0 deletions EstateManagementUI.BlazorServer/Services/TestMediatorService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
Queries.GetLastSettlementQuery => Task.FromResult((TResponse)(object)Result<LastSettlementModel>.Success(GetMockLastSettlement())),
Queries.GetMerchantTransactionSummaryQuery query => Task.FromResult((TResponse)(object)Result<List<MerchantTransactionSummaryModel>>.Success(GetMockMerchantTransactionSummary(query))),
Queries.GetProductPerformanceQuery query => Task.FromResult((TResponse)(object)Result<List<ProductPerformanceModel>>.Success(GetMockProductPerformance(query))),
Queries.GetOperatorTransactionSummaryQuery query => Task.FromResult((TResponse)(object)Result<List<OperatorTransactionSummaryModel>>.Success(GetMockOperatorTransactionSummary(query))),
Queries.GetMerchantSettlementHistoryQuery query => Task.FromResult((TResponse)(object)Result<List<MerchantSettlementHistoryModel>>.Success(GetMockMerchantSettlementHistory(query))),

// Commands - execute against test data store
Expand Down Expand Up @@ -732,4 +733,41 @@
// For now, we just return success
return Result.Success();
}

private List<OperatorTransactionSummaryModel> GetMockOperatorTransactionSummary(Queries.GetOperatorTransactionSummaryQuery query)
{
var operators = _testDataStore.GetOperators(query.EstateId);
var summary = new List<OperatorTransactionSummaryModel>();
var random = new Random(42); // Use seed for consistent test data

const decimal DefaultSuccessRate = 0.92m; // 92% success rate for mock data
const decimal DefaultFeePercentage = 0.015m; // 1.5% fee rate

foreach (var op in operators)
{
// Apply operator filter if specified
if (query.OperatorId.HasValue && op.OperatorId != query.OperatorId.Value)
continue;

var totalCount = random.Next(500, 5000);

Check failure on line 752 in EstateManagementUI.BlazorServer/Services/TestMediatorService.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

EstateManagementUI.BlazorServer/Services/TestMediatorService.cs#L752

Depending on the context, generating weak random numbers may expose cryptographic functions which rely on these numbers to be exploitable.
var successfulCount = (int)(totalCount * DefaultSuccessRate);
var failedCount = totalCount - successfulCount;
var totalValue = (decimal)(random.NextDouble() * 500000 + 50000);

Check failure on line 755 in EstateManagementUI.BlazorServer/Services/TestMediatorService.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

EstateManagementUI.BlazorServer/Services/TestMediatorService.cs#L755

Depending on the context, generating weak random numbers may expose cryptographic functions which rely on these numbers to be exploitable.
var totalFees = Math.Round(totalValue * DefaultFeePercentage, 2);

summary.Add(new OperatorTransactionSummaryModel
{
OperatorId = op.OperatorId,
OperatorName = op.Name,
TotalTransactionCount = totalCount,
TotalTransactionValue = Math.Round(totalValue, 2),
AverageTransactionValue = Math.Round(totalValue / totalCount, 2),
SuccessfulTransactionCount = successfulCount,
FailedTransactionCount = failedCount,
TotalFeesEarned = totalFees
});
}

return summary;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Diagnostics.CodeAnalysis;

namespace EstateManagementUI.BusinessLogic.Models;

[ExcludeFromCodeCoverage]
public class OperatorTransactionSummaryModel
{
public Guid OperatorId { get; set; }
public string? OperatorName { get; set; }
public int TotalTransactionCount { get; set; }
public decimal TotalTransactionValue { get; set; }
public decimal AverageTransactionValue { get; set; }
public int SuccessfulTransactionCount { get; set; }
public int FailedTransactionCount { get; set; }
public decimal TotalFeesEarned { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
IRequestHandler<GetBottomOperatorDataQuery, Result<List<TopBottomOperatorDataModel>>>,
IRequestHandler<GetLastSettlementQuery, Result<LastSettlementModel>>,
IRequestHandler<GetMerchantTransactionSummaryQuery, Result<List<MerchantTransactionSummaryModel>>>,
IRequestHandler<GetProductPerformanceQuery, Result<List<ProductPerformanceModel>>> {
IRequestHandler<GetProductPerformanceQuery, Result<List<ProductPerformanceModel>>>,
IRequestHandler<GetOperatorTransactionSummaryQuery, Result<List<OperatorTransactionSummaryModel>>> {

private readonly IApiClient ApiClient;
public ReportingRequestHandler(IApiClient apiClient)
Expand Down Expand Up @@ -236,4 +237,47 @@

return Result.Success(products);
}

public async Task<Result<List<OperatorTransactionSummaryModel>>> Handle(GetOperatorTransactionSummaryQuery request,
CancellationToken cancellationToken) {
// TODO: Replace with actual API call when endpoint is available
// For now, return mock data for testing
var operators = await this.ApiClient.GetOperators(request.AccessToken, Guid.Empty, request.EstateId, cancellationToken);

if (!operators.IsSuccess) {
return Result.Failure<List<OperatorTransactionSummaryModel>>(operators.Message);
}

var summary = new List<OperatorTransactionSummaryModel>();
var random = new Random(42); // Use seed for consistent test data

const decimal DefaultSuccessRate = 0.92m; // 92% success rate for mock data
const decimal DefaultFeePercentage = 0.015m; // 1.5% fee rate

foreach (var op in operators.Data) {
var totalCount = random.Next(500, 5000);

Check failure on line 258 in EstateManagementUI.BusinessLogic/RequestHandlers/ReportingRequestHandler.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

EstateManagementUI.BusinessLogic/RequestHandlers/ReportingRequestHandler.cs#L258

Depending on the context, generating weak random numbers may expose cryptographic functions which rely on these numbers to be exploitable.
var successfulCount = (int)(totalCount * DefaultSuccessRate);
var failedCount = totalCount - successfulCount;
var totalValue = (decimal)(random.NextDouble() * 500000 + 50000);

Check failure on line 261 in EstateManagementUI.BusinessLogic/RequestHandlers/ReportingRequestHandler.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

EstateManagementUI.BusinessLogic/RequestHandlers/ReportingRequestHandler.cs#L261

Depending on the context, generating weak random numbers may expose cryptographic functions which rely on these numbers to be exploitable.
var totalFees = Math.Round(totalValue * DefaultFeePercentage, 2);

summary.Add(new OperatorTransactionSummaryModel {
OperatorId = op.Id,
OperatorName = op.Name,
TotalTransactionCount = totalCount,
TotalTransactionValue = Math.Round(totalValue, 2),
AverageTransactionValue = Math.Round(totalValue / totalCount, 2),
SuccessfulTransactionCount = successfulCount,
FailedTransactionCount = failedCount,
TotalFeesEarned = totalFees
});
}

// Apply filters if specified
if (request.OperatorId.HasValue) {
summary = summary.Where(s => s.OperatorId == request.OperatorId.Value).ToList();
}

return Result.Success(summary);
}
}
2 changes: 2 additions & 0 deletions EstateManagementUI.BusinessLogic/Requests/Queries.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,5 +72,7 @@ public record GetMerchantQuery(CorrelationId CorrelationId, String AccessToken,
public record GetMerchantTransactionSummaryQuery(CorrelationId CorrelationId, String AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate, Guid? MerchantId = null, Guid? OperatorId = null, Guid? ProductId = null) : IRequest<Result<List<MerchantTransactionSummaryModel>>>;

public record GetProductPerformanceQuery(CorrelationId CorrelationId, String AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate) : IRequest<Result<List<ProductPerformanceModel>>>;

public record GetOperatorTransactionSummaryQuery(CorrelationId CorrelationId, String AccessToken, Guid EstateId, DateTime StartDate, DateTime EndDate, Guid? MerchantId = null, Guid? OperatorId = null) : IRequest<Result<List<OperatorTransactionSummaryModel>>>;
}
}