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 @@ -7,6 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="MediatR" Version="12.4.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.DynamicLinq" Version="8.3.10" />
<PackageReference Include="Shared" Version="2024.11.4" />
<PackageReference Include="EstateManagement.Database" Version="2024.8.2-build128" />
Expand Down
65 changes: 65 additions & 0 deletions EstateReportingAPI.BusinessLogic/Queries/Queries.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EstateReportingAPI.Models;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.WebUtilities;
using SimpleResults;

namespace EstateReportingAPI.BusinessLogic.Queries
{
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 TodaysSalesCountByHour(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate) : IRequest<Result<List<Models.TodaysSalesCountByHour>>>;
public record TodaysSalesValueByHour(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate) : IRequest<Result<List<Models.TodaysSalesValueByHour>>>;

public record TransactionSearchQuery(Guid estateId, TransactionSearchRequest request, PagingRequest pagingRequest, Models.SortingRequest sortingRequest) : IRequest<Result<List<Models.TransactionResult>>>;
}

public record CalendarQueries {
public record GetComparisonDatesQuery(Guid EstateId) : IRequest<Result<List<Calendar>>>;
public record GetAllDatesQuery(Guid EstateId) : IRequest<Result<List<Calendar>>>;
public record GetYearsQuery(Guid EstateId) : IRequest<Result<List<Int32>>>;
}

public record MerchantQueries {
public record GetMerchantsQuery(Guid EstateId) : IRequest<Result<List<Merchant>>>;
public record GetTransactionKpisQuery(Guid EstateId) : IRequest<Result<MerchantKpi>>;
public record GetByLastSaleQuery(Guid EstateId, DateTime StartDateTime, DateTime EndDateTime) : IRequest<Result<List<Merchant>>>;
public record GetTopMerchantsBySalesValueQuery(Guid EstateId, Int32 numberOfMerchants) : IRequest<Result<List<TopBottomData>>>;
public record GetBottomMerchantsBySalesValueQuery(Guid EstateId, Int32 numberOfMerchants) : IRequest<Result<List<TopBottomData>>>;
public record GetMerchantPerformanceQuery(Guid EstateId, DateTime comparisonDate, List<Int32> merchantReportingIds) : IRequest<Result<TodaysSales>>;
}

public record OperatorQueries {
public record GetOperatorsQuery(Guid EstateId) : IRequest<Result<List<Operator>>>;
public record GetOperatorPerformanceQuery(Guid EstateId, DateTime comparisonDate, List<Int32> operatorReportingIds) : IRequest<Result<TodaysSales>>;
public record GetTopOperatorsBySalesValueQuery(Guid EstateId, Int32 numberOfOperators) : IRequest<Result<List<TopBottomData>>>;
public record GetBottomOperatorsBySalesValueQuery(Guid EstateId, Int32 numberOfOperators) : IRequest<Result<List<TopBottomData>>>;
}

public record ProductQueries
{
public record GetProductPerformanceQuery(Guid EstateId, DateTime comparisonDate, List<Int32> productReportingIds) : IRequest<Result<TodaysSales>>;
public record GetTopProductsBySalesValueQuery(Guid EstateId, Int32 numberOfProducts) : IRequest<Result<List<TopBottomData>>>;
public record GetBottomProductsBySalesValueQuery(Guid EstateId, Int32 numberOfProducts) : IRequest<Result<List<TopBottomData>>>;
}

public record ResponseCodeQueries {
public record GetResponseCodesQuery(Guid EstateId) : IRequest<Result<List<ResponseCode>>>;
}

public record SettlementQueries {
public record GetTodaysSettlementQuery(Guid EstateId, Int32 MerchantReportingId, Int32 OperatorReportingId, DateTime ComparisonDate) : IRequest<Result<TodaysSettlement>>;

public record GetLastSettlementQuery(Guid EstateId) : IRequest<Result<LastSettlement>>;

public record GetUnsettledFeesQuery(Guid EstateId,DateTime StartDate, DateTime EndDate, List<Int32> MerchantIdFilter, List<Int32> OperatorIdFilter, List<Int32> ProductIdFilter, GroupByOption GroupByOption) : IRequest<Result<List<UnsettledFee>>>;

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EstateReportingAPI.BusinessLogic.Queries;
using EstateReportingAPI.Models;
using MediatR;
using SimpleResults;

namespace EstateReportingAPI.BusinessLogic.RequestHandlers
{
public class TransactionRequestHandler : IRequestHandler<TransactionQueries.TodaysFailedSales, Result<TodaysSales>>,
IRequestHandler<TransactionQueries.TodaysSalesQuery, Result<TodaysSales>>,
IRequestHandler<TransactionQueries.TodaysSalesCountByHour, Result<List<TodaysSalesCountByHour>>>,
IRequestHandler<TransactionQueries.TodaysSalesValueByHour, Result<List<TodaysSalesValueByHour>>>,
IRequestHandler<TransactionQueries.TransactionSearchQuery, Result<List<Models.TransactionResult>>> {
private readonly IReportingManager Manager;

public TransactionRequestHandler(IReportingManager manager) {
this.Manager = manager;
}

public async Task<Result<TodaysSales>> Handle(TransactionQueries.TodaysFailedSales request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTodaysFailedSales(request.estateId, request.comparisonDate, request.responseCode, cancellationToken);
return Result.Success(result);
}

public async Task<Result<TodaysSales>> Handle(TransactionQueries.TodaysSalesQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTodaysSales(request.estateId, request.merchantReportingId, request.operatorReportingId, request.comparisonDate, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TodaysSalesCountByHour>>> Handle(TransactionQueries.TodaysSalesCountByHour request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTodaysSalesCountByHour(request.estateId, request.merchantReportingId, request.operatorReportingId, request.comparisonDate, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TodaysSalesValueByHour>>> Handle(TransactionQueries.TodaysSalesValueByHour request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTodaysSalesValueByHour(request.estateId, request.merchantReportingId, request.operatorReportingId, request.comparisonDate, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TransactionResult>>> Handle(TransactionQueries.TransactionSearchQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.TransactionSearch(request.estateId, request.request, request.pagingRequest, request.sortingRequest, cancellationToken);
return Result.Success(result);
}


}



public class CalendarRequestHandler : IRequestHandler<CalendarQueries.GetAllDatesQuery, Result<List<Calendar>>>,
IRequestHandler<CalendarQueries.GetComparisonDatesQuery, Result<List<Calendar>>>,
IRequestHandler<CalendarQueries.GetYearsQuery, Result<List<Int32>>> {
private readonly IReportingManager Manager;
public CalendarRequestHandler(IReportingManager manager) {
this.Manager = manager;
}
public async Task<Result<List<Calendar>>> Handle(CalendarQueries.GetAllDatesQuery request,
CancellationToken cancellationToken) {
List<Calendar> result = await this.Manager.GetCalendarDates(request.EstateId, cancellationToken);

if (result.Any() == false) {
return Result.NotFound("No calendar dates found");
}

return Result.Success(result);

}

public async Task<Result<List<Calendar>>> Handle(CalendarQueries.GetComparisonDatesQuery request,
CancellationToken cancellationToken) {
List<Calendar> result = await this.Manager.GetCalendarComparisonDates(request.EstateId, cancellationToken);
if (result.Any() == false)
{
return Result.NotFound("No calendar comparison dates found");
}

return Result.Success(result);
}

public async Task<Result<List<Int32>>> Handle(CalendarQueries.GetYearsQuery request,
CancellationToken cancellationToken) {
List<Int32> result = await this.Manager.GetCalendarYears(request.EstateId, cancellationToken);
if (result.Any() == false)
{
return Result.NotFound("No calendar years found");
}

return Result.Success(result);
}
}

public class MerchantRequestHandler :IRequestHandler<MerchantQueries.GetMerchantsQuery, Result<List<Merchant>>>,
IRequestHandler<MerchantQueries.GetByLastSaleQuery, Result<List<Merchant>>>,
IRequestHandler<MerchantQueries.GetMerchantPerformanceQuery, Result<TodaysSales>>,
IRequestHandler<MerchantQueries.GetTransactionKpisQuery, Result<MerchantKpi>>,
IRequestHandler<MerchantQueries.GetBottomMerchantsBySalesValueQuery, Result<List<TopBottomData>>>,
IRequestHandler<MerchantQueries.GetTopMerchantsBySalesValueQuery, Result<List<TopBottomData>>>
{
private readonly IReportingManager Manager;
public MerchantRequestHandler(IReportingManager manager)
{
this.Manager = manager;
}
public async Task<Result<List<Merchant>>> Handle(MerchantQueries.GetMerchantsQuery request,
CancellationToken cancellationToken) {
List<Merchant> result = await this.Manager.GetMerchants(request.EstateId, cancellationToken);
if (result.Any() == false)
{
return Result.NotFound("No merchants found");
}

return Result.Success(result);
}

public async Task<Result<List<Merchant>>> Handle(MerchantQueries.GetByLastSaleQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetMerchantsByLastSale(request.EstateId, request.StartDateTime, request.EndDateTime, cancellationToken);
return Result.Success(result);
}

public async Task<Result<TodaysSales>> Handle(MerchantQueries.GetMerchantPerformanceQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetMerchantPerformance(request.EstateId, request.comparisonDate, request.merchantReportingIds, cancellationToken);
return Result.Success(result);
}

public async Task<Result<MerchantKpi>> Handle(MerchantQueries.GetTransactionKpisQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetMerchantsTransactionKpis(request.EstateId, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TopBottomData>>> Handle(MerchantQueries.GetBottomMerchantsBySalesValueQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Bottom, request.numberOfMerchants, Dimension.Merchant, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TopBottomData>>> Handle(MerchantQueries.GetTopMerchantsBySalesValueQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Top, request.numberOfMerchants, Dimension.Merchant, cancellationToken);
return Result.Success(result);
}
}

public class OperatorRequestHandler : IRequestHandler<OperatorQueries.GetOperatorsQuery, Result<List<Operator>>>,
IRequestHandler<OperatorQueries.GetOperatorPerformanceQuery, Result<TodaysSales>>,
IRequestHandler<OperatorQueries.GetTopOperatorsBySalesValueQuery, Result<List<TopBottomData>>>,
IRequestHandler<OperatorQueries.GetBottomOperatorsBySalesValueQuery, Result<List<TopBottomData>>>
{
private readonly IReportingManager Manager;
public OperatorRequestHandler(IReportingManager manager)
{
this.Manager = manager;
}

public async Task<Result<List<Operator>>> Handle(OperatorQueries.GetOperatorsQuery request,
CancellationToken cancellationToken)
{
List<Operator> result = await this.Manager.GetOperators(request.EstateId, cancellationToken);
if (result.Any() == false)
{
return Result.NotFound("No operators found");
}

return Result.Success(result);
}

public async Task<Result<TodaysSales>> Handle(OperatorQueries.GetOperatorPerformanceQuery request,
CancellationToken cancellationToken)
{
var result = await this.Manager.GetOperatorPerformance(request.EstateId, request.comparisonDate, request.operatorReportingIds, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TopBottomData>>> Handle(OperatorQueries.GetTopOperatorsBySalesValueQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Top, request.numberOfOperators, Dimension.Operator, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TopBottomData>>> Handle(OperatorQueries.GetBottomOperatorsBySalesValueQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Bottom, request.numberOfOperators, Dimension.Operator, cancellationToken);
return Result.Success(result);
}
}

public class ResponseCodeRequestHandler : IRequestHandler<ResponseCodeQueries.GetResponseCodesQuery, Result<List<ResponseCode>>> {
private readonly IReportingManager Manager;

public ResponseCodeRequestHandler(IReportingManager manager) {
this.Manager = manager;
}

public async Task<Result<List<ResponseCode>>> Handle(ResponseCodeQueries.GetResponseCodesQuery request,
CancellationToken cancellationToken) {
List<ResponseCode> result = await this.Manager.GetResponseCodes(request.EstateId, cancellationToken);
if (result.Any() == false) {
return Result.NotFound("No response codes found");
}

return Result.Success(result);
}
}

public class SettlementRequestHandler : IRequestHandler<SettlementQueries.GetTodaysSettlementQuery, Result<TodaysSettlement>>,
IRequestHandler<SettlementQueries.GetLastSettlementQuery, Result<LastSettlement>>,
IRequestHandler<SettlementQueries.GetUnsettledFeesQuery, Result<List<UnsettledFee>>> {
private readonly IReportingManager Manager;
public SettlementRequestHandler(IReportingManager manager)
{
this.Manager = manager;
}

public async Task<Result<TodaysSettlement>> Handle(SettlementQueries.GetTodaysSettlementQuery request,
CancellationToken cancellationToken) {
Models.TodaysSettlement model = await this.Manager.GetTodaysSettlement(request.EstateId, request.MerchantReportingId, request.OperatorReportingId, request.ComparisonDate, cancellationToken);

return Result.Success(model);
}

public async Task<Result<LastSettlement>> Handle(SettlementQueries.GetLastSettlementQuery request,
CancellationToken cancellationToken)
{
LastSettlement model = await this.Manager.GetLastSettlement(request.EstateId, cancellationToken);

return Result.Success(model);
}

public async Task<Result<List<UnsettledFee>>> Handle(SettlementQueries.GetUnsettledFeesQuery request,
CancellationToken cancellationToken) {
List<UnsettledFee> model = await this.Manager.GetUnsettledFees(request.EstateId, request.StartDate, request.EndDate, request.MerchantIdFilter, request.OperatorIdFilter, request.ProductIdFilter, request.GroupByOption, cancellationToken);
return Result.Success(model);
}
}

public class ProductRequestHandler : IRequestHandler<ProductQueries.GetProductPerformanceQuery, Result<TodaysSales>>,
IRequestHandler<ProductQueries.GetTopProductsBySalesValueQuery, Result<List<TopBottomData>>>,
IRequestHandler<ProductQueries.GetBottomProductsBySalesValueQuery, Result<List<TopBottomData>>>
{
private readonly IReportingManager Manager;

public ProductRequestHandler(IReportingManager manager) {
this.Manager = manager;
}
public async Task<Result<TodaysSales>> Handle(ProductQueries.GetProductPerformanceQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetProductPerformance(request.EstateId, request.comparisonDate, request.productReportingIds, cancellationToken);

return Result.Success(result);
}

public async Task<Result<List<TopBottomData>>> Handle(ProductQueries.GetTopProductsBySalesValueQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Top, request.numberOfProducts, Dimension.Product, cancellationToken);
return Result.Success(result);
}

public async Task<Result<List<TopBottomData>>> Handle(ProductQueries.GetBottomProductsBySalesValueQuery request,
CancellationToken cancellationToken) {
var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Bottom, request.numberOfProducts, Dimension.Product, cancellationToken);
return Result.Success(result);
}
}
}
1 change: 1 addition & 0 deletions EstateReportingAPI.Client/EstateReportingAPI.Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<ItemGroup>
<PackageReference Include="ClientProxyBase" Version="2024.11.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Shared.Results" Version="2024.11.4" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading
Loading