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
3 changes: 2 additions & 1 deletion EstateReportingAPI.BusinessLogic/DatabaseModels.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ internal sealed class MerchantContactData {
public string? PhoneNumber { get; init; }
}

internal sealed class MerchantWithAddressData {
internal sealed class MerchantWithAddressAndContactData {
public required TransactionProcessor.Database.Entities.Merchant Merchant { get; init; }
public required TransactionProcessor.Database.Entities.MerchantAddress MerchantAddress { get; init; }
public required TransactionProcessor.Database.Entities.MerchantContact MerchantContact { get; init; }
}
6 changes: 5 additions & 1 deletion EstateReportingAPI.BusinessLogic/ModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ internal static Merchant ConvertFrom(MerchantData merchant,
};
}

internal static Merchant ConvertFrom(MerchantWithAddressData merchant,
internal static Merchant ConvertFrom(MerchantWithAddressAndContactData merchant,
decimal balance) {
return new Merchant {
Balance = balance,
Expand All @@ -46,6 +46,10 @@ internal static Merchant ConvertFrom(MerchantWithAddressData merchant,
AddressLine2 = merchant.MerchantAddress.AddressLine2,
Town = merchant.MerchantAddress.Town,
Country = merchant.MerchantAddress.Country,
ContactId = merchant.MerchantContact.ContactId,
ContactName = merchant.MerchantContact.Name,
ContactEmail = merchant.MerchantContact.EmailAddress,
ContactPhone = merchant.MerchantContact.PhoneNumber,
MerchantReportingId = merchant.Merchant.MerchantReportingId
};
}
Expand Down
108 changes: 77 additions & 31 deletions EstateReportingAPI.BusinessLogic/ReportingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -231,14 +231,18 @@ public async Task<Result<List<Contract>>> GetContracts(ContractQueries.GetContra

var baseContractsQuery = (from c in context.Contracts
join o in context.Operators on c.OperatorId equals o.OperatorId into ops
from o in ops.DefaultIfEmpty()
from o in ops
join e in context.Estates on c.EstateId equals e.EstateId into estates
from e in estates
select new ContractBaseData {
EstateReportingId = e.EstateReportingId,
ContractId = c.ContractId,
ContractReportingId = c.ContractReportingId,
Description = c.Description,
EstateId = c.EstateId,
OperatorId = c.OperatorId,
OperatorName = o != null ? o.Name : null
OperatorReportingId = o.OperatorReportingId,
OperatorName = o.Name
}).OrderByDescending(x => x.Description);

var baseContractsResult = await ExecuteQuerySafeToList(baseContractsQuery, cancellationToken, "Error retrieving contracts - Step 1");
Expand Down Expand Up @@ -267,19 +271,22 @@ public async Task<Result<Contract>> GetContract(ContractQueries.GetContractQuery
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString());
await using EstateManagementContext context = resolvedContext.Context;

// Step 1: load contract with operator name via a left-join (translatable)
// Step 1: load contract with operator name
var baseContractQuery = (from c in context.Contracts
join o in context.Operators on c.OperatorId equals o.OperatorId into ops
from o in ops.DefaultIfEmpty()
from o in ops
join e in context.Estates on c.EstateId equals e.EstateId into estates
from e in estates
where c.ContractId == request.ContractId
select new {
e.EstateReportingId,
c.ContractId,
c.ContractReportingId,
c.Description,
c.EstateId,
c.OperatorId,
OperatorName = o != null ? o.Name : null
}).OrderByDescending(x => x.Description);
o.OperatorReportingId,
OperatorName = o.Name }).OrderByDescending(x => x.Description);

var baseContractQueryResult = await ExecuteQuerySafeSingleOrDefault(baseContractQuery, cancellationToken, "Error retrieving contract - Step 1");

Expand All @@ -295,12 +302,14 @@ from o in ops.DefaultIfEmpty()
return ResultHelpers.CreateFailure(productsResult);

return Result.Success(new Contract {
EstateReportingId = baseContract.EstateReportingId,
ContractId = baseContract.ContractId,
ContractReportingId = baseContract.ContractReportingId,
Description = baseContract.Description,
EstateId = baseContract.EstateId,
OperatorName = baseContract.OperatorName,
OperatorId = baseContract.OperatorId,
OperatorReportingId = baseContract.OperatorReportingId,
Products = productsResult.Data
});
}
Expand Down Expand Up @@ -368,21 +377,43 @@ public async Task<Result<List<Contract>>> GetRecentContracts(ContractQueries.Get
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString());
await using EstateManagementContext context = resolvedContext.Context;

IQueryable<Contract> contractsQuery = context.Contracts.Select(c => new Contract() {
ContractId = c.ContractId,
ContractReportingId = c.ContractReportingId,
Description = c.Description,
EstateId = c.EstateId,
OperatorName = context.Operators.Where(o => o.OperatorId == c.OperatorId).Select(o => o.Name).FirstOrDefault(),
OperatorId = c.OperatorId,
}).OrderByDescending(c => c.Description).Take(3);
var contractsQuery = (from c in context.Contracts
join o in context.Operators on c.OperatorId equals o.OperatorId into ops
from o in ops
join e in context.Estates on c.EstateId equals e.EstateId into estates
from e in estates
select new
{
e.EstateReportingId,
c.ContractId,
c.ContractReportingId,
c.Description,
c.EstateId,
c.OperatorId,
o.OperatorReportingId,
OperatorName = o.Name
}).OrderByDescending(x => x.ContractReportingId).Take(3);

Result<List<Contract>> result = await ExecuteQuerySafeToList(contractsQuery, cancellationToken, "Error retrieving recent contracts");
var result = await ExecuteQuerySafeToList(contractsQuery, cancellationToken, "Error retrieving recent contracts");

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

return result;
List<Contract> response = new List<Contract>();
foreach (var contract in result.Data) {
response.Add(new Contract {
EstateId = contract.EstateId,
EstateReportingId = contract.EstateReportingId,
ContractId = contract.ContractId,
ContractReportingId = contract.ContractReportingId,
Description = contract.Description,
OperatorName = contract.OperatorName,
OperatorId = contract.OperatorId,
OperatorReportingId = contract.OperatorReportingId,
});
}

return response;
}

public async Task<Result<TodaysSales>> GetTodaysFailedSales(TransactionQueries.TodaysFailedSales request,
Expand Down Expand Up @@ -548,12 +579,13 @@ public async Task<Result<List<Merchant>>> GetRecentMerchants(MerchantQueries.Get
Reference = m.Reference,
AddressInfo = context.MerchantAddresses.Where(ma => ma.MerchantId == m.MerchantId)
.OrderByDescending(ma => ma.CreatedDateTime)
.Select(ma => new { ma.AddressLine1, ma.AddressLine2, ma.Country, ma.PostalCode, ma.Region, ma.Town })
.Select(ma => new { ma.AddressId, ma.AddressLine1, ma.AddressLine2, ma.Country, ma.PostalCode, ma.Region, ma.Town })
.FirstOrDefault(),
ContactInfo = context.MerchantContacts.Where(mc => mc.MerchantId == m.MerchantId)
.OrderByDescending(mc => mc.CreatedDateTime)
.Select(mc => new { mc.Name, mc.EmailAddress, mc.PhoneNumber })
.FirstOrDefault()
.Select(mc => new { mc.ContactId, mc.Name, mc.EmailAddress, mc.PhoneNumber })
.FirstOrDefault(),
BalanceState = context.MerchantBalanceProjectionState.Where(mb => mb.MerchantId == m.MerchantId).SingleOrDefault()
}).OrderByDescending(m => m.CreatedDateTime).Take(3);

var recentMerchantsResult = await ExecuteQuerySafeToList(merchantsQuery, cancellationToken, "Error retrieving recent merchants");
Expand All @@ -567,8 +599,10 @@ public async Task<Result<List<Merchant>>> GetRecentMerchants(MerchantQueries.Get
Reference = merchant.Reference,
MerchantReportingId = merchant.MerchantReportingId,
CreatedDateTime = merchant.CreatedDateTime,
Balance = merchant.BalanceState.Balance
};
if (merchant.AddressInfo != null) {
model.AddressId = merchant.AddressInfo.AddressId;
model.AddressLine1 = merchant.AddressInfo.AddressLine1;
model.AddressLine2 = merchant.AddressInfo.AddressLine2;
model.Country = merchant.AddressInfo.Country;
Expand All @@ -577,6 +611,8 @@ public async Task<Result<List<Merchant>>> GetRecentMerchants(MerchantQueries.Get
model.Region = merchant.AddressInfo.Region;
}
if (merchant.ContactInfo != null) {
model.ContactId = merchant.ContactInfo.ContactId;

model.ContactName = merchant.ContactInfo.Name;
model.ContactEmail = merchant.ContactInfo.EmailAddress;
model.ContactPhone = merchant.ContactInfo.PhoneNumber;
Expand Down Expand Up @@ -1079,18 +1115,23 @@ private static IQueryable<MerchantData> BuildMerchantQuery(EstateManagementConte
.Where(m => m.MerchantId == merchantId);
}

private static IQueryable<MerchantWithAddressData> BuildMerchantWithAddressQuery(EstateManagementContext context,
Guid estateId) {
private static IQueryable<MerchantWithAddressAndContactData> BuildMerchantWithAddressQuery(EstateManagementContext context,
Guid estateId) {
return context.Merchants
.Where(m => m.EstateId == estateId)
.GroupJoin(context.MerchantAddresses,
m => m.MerchantId,
a => a.MerchantId,
(m, addresses) => new MerchantWithAddressData { Merchant = m, MerchantAddress = addresses.First() });
}

private static IQueryable<MerchantWithAddressData> ApplyMerchantFilters(IQueryable<MerchantWithAddressData> query,
MerchantQueries.MerchantQueryOptions queryOptions) {
.Select(m => new MerchantWithAddressAndContactData {
Merchant = m,
MerchantAddress = context.MerchantAddresses.Where(ma => ma.MerchantId == m.MerchantId)
.OrderByDescending(ma => ma.CreatedDateTime)
.First(),
MerchantContact = context.MerchantContacts.Where(mc => mc.MerchantId == m.MerchantId)
.OrderByDescending(mc => mc.CreatedDateTime)
.First()
});
}

private static IQueryable<MerchantWithAddressAndContactData> ApplyMerchantFilters(IQueryable<MerchantWithAddressAndContactData> query,
MerchantQueries.MerchantQueryOptions queryOptions) {
if (String.IsNullOrEmpty(queryOptions.Name) == false)
query = query.Where(m => m.Merchant.Name.Contains(queryOptions.Name));

Expand Down Expand Up @@ -1717,6 +1758,7 @@ from esu in esuJoin.DefaultIfEmpty()
join m in context.Merchants on f.MerchantId equals m.MerchantId into mJoin
from m in mJoin.DefaultIfEmpty()
join fl in context.FileLines on f.FileId equals fl.FileId
//join fp in context.FileProfileConfigurations on f.FileProfileId equals fp.FileProfileId
where fil.FileImportLogId == request.FileImportLogId
&& (request.MerchantId == null || f.MerchantId == request.MerchantId)
select new FileImportFlatData
Expand Down Expand Up @@ -1948,8 +1990,10 @@ private static List<Contract> BuildContracts(List<ContractBaseData> baseContract
ContractReportingId = b.ContractReportingId,
Description = b.Description,
EstateId = b.EstateId,
EstateReportingId = b.EstateReportingId,
OperatorName = b.OperatorName,
OperatorId = b.OperatorId,
OperatorReportingId = b.OperatorReportingId,
Products = products.Where(p => p.ContractId == b.ContractId).Select(p => new Models.ContractProduct {
ContractId = p.ContractId,
ProductId = p.ContractProductId,
Expand Down Expand Up @@ -2230,8 +2274,10 @@ private sealed class ContractBaseData {
public int ContractReportingId { get; init; }
public string? Description { get; init; }
public Guid EstateId { get; init; }
public Guid OperatorId { get; init; }
public string? OperatorName { get; init; }
public int EstateReportingId { get; init; }
public Guid OperatorId { get; init; }
public int OperatorReportingId { get; init; }
public string? OperatorName { get; init; }
}

private sealed class ContractProductData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public sealed class MetricItem
public string Description { get; set; }

public int Category { get; set; }
public Int32 Type { get; set; }
}

public sealed class DrillDownTransaction
Expand Down
6 changes: 3 additions & 3 deletions EstateReportingAPI.IntegrationTests/CalendarEndpointTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ public async Task CalendarEndpoint_GetComparisonDates_DatesReturned() {
dates.Select(d => d.Date).Contains(date.Date).ShouldBeTrue();
}

dates.Select(d => d.Description).Contains("Yesterday");
dates.Select(d => d.Description).Contains("Last Week");
dates.Select(d => d.Description).Contains("Last Month");
dates.Select(d => d.Description).Contains("Yesterday").ShouldBeTrue();
dates.Select(d => d.Description).Contains("Last Week").ShouldBeTrue();
dates.Select(d => d.Description).Contains("Last Month").ShouldBeTrue();
}

protected override async Task ClearStandingData() {
Expand Down
Loading
Loading