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
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public record TransactionQueries {
public record TodaysSalesQuery(Guid EstateId, Int32 MerchantReportingId, Int32 OperatorReportingId, DateTime ComparisonDate) : IRequest<Result<TodaysSales>>;
public record TodaysFailedSales(Guid EstateId, DateTime ComparisonDate, String ResponseCode) : IRequest<Result<TodaysSales>>;
public record TransactionDetailReportQuery(Guid EstateId, TransactionDetailReportRequest Request) : IRequest<Result<TransactionDetailReportResponse>>;

public record TransactionSummaryByMerchantQuery(Guid EstateId, TransactionSummaryByMerchantRequest Request) : IRequest<Result<TransactionSummaryByMerchantResponse>>;

public record TransactionSummaryByOperatorQuery(Guid EstateId, TransactionSummaryByOperatorRequest Request) : IRequest<Result<TransactionSummaryByOperatorResponse>>;

}
118 changes: 117 additions & 1 deletion EstateReportingAPI.BusinessLogic/ReportingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@
CancellationToken cancellationToken);
Task<Result<TransactionSummaryByMerchantResponse>> GetTransactionSummaryByMerchantReport(TransactionQueries.TransactionSummaryByMerchantQuery request,
CancellationToken cancellationToken);

Task<Result<TransactionSummaryByOperatorResponse>> GetTransactionSummaryByOperatorReport(TransactionQueries.TransactionSummaryByOperatorQuery request,
CancellationToken cancellationToken);

#endregion
}
Expand Down Expand Up @@ -974,6 +977,117 @@
return response;
}

public async Task<Result<TransactionSummaryByOperatorResponse>> GetTransactionSummaryByOperatorReport(TransactionQueries.TransactionSummaryByOperatorQuery request,

Check warning on line 980 in EstateReportingAPI.BusinessLogic/ReportingManager.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

EstateReportingAPI.BusinessLogic/ReportingManager.cs#L980

Method ReportingManager::GetTransactionSummaryByOperatorReport has 98 lines of code (limit is 50)

Check warning on line 980 in EstateReportingAPI.BusinessLogic/ReportingManager.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

EstateReportingAPI.BusinessLogic/ReportingManager.cs#L980

Method ReportingManager::GetTransactionSummaryByOperatorReport has a cyclomatic complexity of 14 (limit is 8)
CancellationToken cancellationToken) {
TransactionSummaryByOperatorResponse response = null;
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString());
await using EstateManagementContext context = resolvedContext.Context;

var query =
from t in context.Transactions
join m in context.Merchants on t.MerchantId equals m.MerchantId
join o in context.Operators on t.OperatorId equals o.OperatorId
where t.TransactionType == "Sale"
&& t.TransactionDate >= request.Request.StartDate
&& t.TransactionDate <= request.Request.EndDate
group t by new
{
t.MerchantId,
m.MerchantReportingId,
MerchantName = m.Name,
t.OperatorId,
o.OperatorReportingId,
OperatorName = o.Name
}
into g
select new
{
g.Key.MerchantId,
g.Key.MerchantReportingId,
g.Key.MerchantName,
g.Key.OperatorId,
g.Key.OperatorReportingId,
g.Key.OperatorName,
TotalCount = g.Count(),
TotalValue = g.Sum(x => x.TransactionAmount),
AuthorisedCount = g.Sum(x => x.IsAuthorised ? 1 : 0),
DeclinedCount = g.Sum(x => x.IsAuthorised ? 0 : 1)
};

// Now apply the filters
if (request.Request.Merchants != null && request.Request.Merchants.Any())
{
query = query.Where(q => request.Request.Merchants.Contains(q.MerchantReportingId));
}
if (request.Request.Operators != null && request.Request.Operators.Any())
{
query = query.Where(q => request.Request.Operators.Contains(q.OperatorReportingId));
}

var finalQuery = from x in query
group x by new
{
x.OperatorId,
x.OperatorReportingId,
OperatorName = x.OperatorName,
}
into g
select new
{
g.Key.OperatorId,
g.Key.OperatorReportingId,
g.Key.OperatorName,
TotalCount = g.Sum(x => x.TotalCount),
TotalValue = g.Sum(x => x.TotalValue),
AverageValue = g.Count() > 0 ? g.Sum(x => x.TotalValue) / g.Count() : 0m,
AuthorisedCount = g.Sum(x => x.AuthorisedCount),
DeclinedCount = g.Sum(x => x.DeclinedCount),
AuthorisedPercentage = g.Sum(x => x.TotalCount) > 0 ? (decimal)g.Sum(x => x.AuthorisedCount) / (decimal)g.Sum(x => x.TotalCount) : 0m
};

var queryResult = await ExecuteQuerySafeToList(finalQuery, cancellationToken, "Error retrieving transaction summary by operator report");

if (queryResult.IsFailed)
return ResultHelpers.CreateFailure(queryResult);

// Ok now enumerate the results
var queryResults = queryResult.Data;

if (queryResults.Any() == false)
return new TransactionSummaryByOperatorResponse
{
Summary = new OperatorDetailSummary(),
Operators = new List<OperatorDetail>()
};

// Now to translate the results
response = new TransactionSummaryByOperatorResponse
{
Operators = queryResults.Select(q => new OperatorDetail
{
OperatorId = q.OperatorId,
OperatorReportingId = q.OperatorReportingId,
OperatorName = q.OperatorName,
AuthorisedCount = q.AuthorisedCount,
AuthorisedPercentage = q.AuthorisedPercentage,
AverageValue = q.AverageValue,
DeclinedCount = q.DeclinedCount,
TotalCount = q.TotalCount,
TotalValue = q.TotalValue
}).ToList(),
Summary = new OperatorDetailSummary
{
TotalCount = queryResults.Sum(q => q.TotalCount),
TotalValue = queryResults.Sum(q => q.TotalValue),
AverageValue = this.SafeDivide(queryResults.Sum(q => q.TotalValue)
, queryResults.Sum(q => q.TotalCount)),
TotalOperators = queryResults.Count()
}
};

return response;
}

public async Task<Result<List<Merchant>>> GetMerchants(MerchantQueries.GetMerchantsQuery request,
CancellationToken cancellationToken) {
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString());
Expand Down Expand Up @@ -1041,7 +1155,9 @@
AddressLine1 = queryResult.Address.AddressLine1,
AddressLine2 = queryResult.Address.AddressLine2,
Town = queryResult.Address.Town,
Country = queryResult.Address.Country
Country = queryResult.Address.Country,
MerchantReportingId = queryResult.Merchant.MerchantReportingId

});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ namespace EstateReportingAPI.BusinessLogic.RequestHandlers;

public class TransactionRequestHandler : IRequestHandler<TransactionQueries.TodaysFailedSales, Result<TodaysSales>>,
IRequestHandler<TransactionQueries.TodaysSalesQuery, Result<TodaysSales>>,
IRequestHandler<TransactionQueries.TransactionDetailReportQuery, Result<TransactionDetailReportResponse>>,
IRequestHandler<TransactionQueries.TransactionSummaryByMerchantQuery, Result<TransactionSummaryByMerchantResponse>>
IRequestHandler<TransactionQueries.TransactionDetailReportQuery, Result<TransactionDetailReportResponse>>,
IRequestHandler<TransactionQueries.TransactionSummaryByMerchantQuery, Result<TransactionSummaryByMerchantResponse>>,
IRequestHandler<TransactionQueries.TransactionSummaryByOperatorQuery, Result<TransactionSummaryByOperatorResponse>>
{
private readonly IReportingManager Manager;

Expand Down Expand Up @@ -36,4 +37,10 @@ public async Task<Result<TransactionSummaryByMerchantResponse>> Handle(Transacti
{
return await this.Manager.GetTransactionSummaryByMerchantReport(request, cancellationToken);
}

public async Task<Result<TransactionSummaryByOperatorResponse>> Handle(TransactionQueries.TransactionSummaryByOperatorQuery request,
CancellationToken cancellationToken)
{
return await this.Manager.GetTransactionSummaryByOperatorReport(request, cancellationToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,4 @@ public class TransactionDetailReportRequest
public DateTime StartDate { get; set; }
[JsonProperty("end_date")]
public DateTime EndDate { get; set; }
}

public class TransactionSummaryByMerchantRequest
{
[JsonProperty("operators")]
public List<Int32>? Operators { get; set; }
[JsonProperty("merchants")]
public List<Int32>? Merchants { get; set; }
[JsonProperty("start_date")]
public DateTime StartDate { get; set; }
[JsonProperty("end_date")]
public DateTime EndDate { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,47 @@ public class MerchantDetailSummary {
public Decimal TotalValue { get; set; }
[JsonProperty("average_value")]
public Decimal AverageValue { get; set; }
}


public class TransactionSummaryByOperatorResponse
{
[JsonProperty("operators")]
public List<OperatorDetail> Operators { get; set; }
[JsonProperty("summary")]
public OperatorDetailSummary Summary { get; set; }
}

public class OperatorDetail
{
[JsonProperty("operator_id")]
public Guid OperatorId { get; set; }
[JsonProperty("operator_reporting_id")]
public Int32 OperatorReportingId { get; set; }
[JsonProperty("operator_name")]
public string OperatorName { get; set; }
[JsonProperty("total_count")]
public Int32 TotalCount { get; set; }
[JsonProperty("total_value")]
public Decimal TotalValue { get; set; }
[JsonProperty("average_value")]
public Decimal AverageValue { get; set; }
[JsonProperty("authorised_count")]
public Int32 AuthorisedCount { get; set; }
[JsonProperty("declined_count")]
public Int32 DeclinedCount { get; set; }
[JsonProperty("authorised_percentage")]
public Decimal AuthorisedPercentage { get; set; }
}

public class OperatorDetailSummary
{
[JsonProperty("total_operators")]
public Int32 TotalOperators { get; set; }
[JsonProperty("total_count")]
public Int32 TotalCount { get; set; }
[JsonProperty("total_value")]
public Decimal TotalValue { get; set; }
[JsonProperty("average_value")]
public Decimal AverageValue { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace EstateReportingAPI.DataTransferObjects;

public class TransactionSummaryByMerchantRequest
{
[JsonProperty("operators")]
public List<Int32>? Operators { get; set; }
[JsonProperty("merchants")]
public List<Int32>? Merchants { get; set; }
[JsonProperty("start_date")]
public DateTime StartDate { get; set; }
[JsonProperty("end_date")]
public DateTime EndDate { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace EstateReportingAPI.DataTransferObjects;

public class TransactionSummaryByOperatorRequest
{
[JsonProperty("operators")]
public List<Int32>? Operators { get; set; }
[JsonProperty("merchants")]
public List<Int32>? Merchants { get; set; }
[JsonProperty("start_date")]
public DateTime StartDate { get; set; }
[JsonProperty("end_date")]
public DateTime EndDate { get; set; }
}
Loading
Loading