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
74 changes: 64 additions & 10 deletions TransactionProcessing.SchedulerService/DataGenerator/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using Microsoft.Extensions.Logging;
using SimpleResults;
using TransactionProcessing.SchedulerService.DataGenerator;
using TransactionProcessor.DataTransferObjects.Responses.Contract;
Expand All @@ -23,8 +24,10 @@ class Program{
private static TransactionProcessorClient TransactionProcessorClient;

private static Func<String, String> baseAddressFunc;

static async Task Main(string[] args){


HttpClientHandler handler = new HttpClientHandler{
ServerCertificateCustomValidationCallback = (message,
cert,
Expand Down Expand Up @@ -58,7 +61,7 @@ static async Task Main(string[] args){

return null;
};

Shared.Logger.Logger.Initialise(new ConsoleLogger());
Program.SecurityServiceClient = new SecurityServiceClient(baseAddressFunc, httpClient);

Program.TransactionProcessorClient = new TransactionProcessorClient(baseAddressFunc, httpClient);
Expand Down Expand Up @@ -90,16 +93,19 @@ static async Task Main(string[] args){
}

private static async Task GenerateStatements(ITransactionDataGeneratorService g, Guid estateId, CancellationToken cancellationToken){
List<MerchantResponse> merchants = await g.GetMerchants(estateId, cancellationToken);
Result<List<MerchantResponse>> getMerchantsResult = await g.GetMerchants(estateId, cancellationToken);
if (getMerchantsResult.IsFailed)
return;
List<MerchantResponse>? merchants = getMerchantsResult.Data;
foreach (MerchantResponse merchant in merchants){
await g.GenerateMerchantStatement(merchant.EstateId, merchant.MerchantId, DateTime.Now.AddMonths(-2), cancellationToken);
}
}

private static async Task GenerateTransactions(ITransactionDataGeneratorService g, Guid estateId, CancellationToken cancellationToken){
// Set the date range
DateTime startDate = new DateTime(2025, 4, 14); //27/7
DateTime endDate = new DateTime(2025, 4,30); // This is the date of the last generated transaction
DateTime startDate = new DateTime(2025, 4, 16); //27/7
DateTime endDate = new DateTime(2025, 4,16); // This is the date of the last generated transaction

Result<List<DateTime>> dateRangeResult = g.GenerateDateRange(startDate, endDate);
if (dateRangeResult.IsFailed)
Expand Down Expand Up @@ -174,8 +180,12 @@ await g.MakeFloatDeposit(dateTime, estateId, contractResponse.ContractId,
{
foreach (MerchantResponse merchant in merchantsResult.Data) {
// Get the merchants contracts
List<ContractResponse> contracts = await g.GetMerchantContracts(merchant, cancellationToken);
foreach (ContractResponse contract in contracts) {
Result<List<ContractResponse>> getMerchantContractsResult = await g.GetMerchantContracts(merchant, cancellationToken);
if (getMerchantContractsResult.IsFailed) {
Console.WriteLine($"Failed to get merchant contracts: {getMerchantContractsResult.Message}");
break;
}
foreach (ContractResponse contract in getMerchantContractsResult.Data) {
// Generate and send some sales

await g.SendSales(dateTime, merchant, contract, 0, cancellationToken);
Expand All @@ -187,9 +197,13 @@ await g.MakeFloatDeposit(dateTime, estateId, contractResponse.ContractId,
if ((dataToSend & DataToSend.Files) == DataToSend.Files) {
foreach (MerchantResponse merchant in merchantsResult.Data) {
// Get the merchants contracts
List<ContractResponse> contracts = await g.GetMerchantContracts(merchant, cancellationToken);

foreach (ContractResponse contract in contracts) {
Result<List<ContractResponse>> getMerchantContractsResult = await g.GetMerchantContracts(merchant, cancellationToken);
if (getMerchantContractsResult.IsFailed)
{
Console.WriteLine($"Failed to get merchant contracts: {getMerchantContractsResult.Message}");
break;
}
foreach (ContractResponse contract in getMerchantContractsResult.Data) {
// Generate a file and upload
await g.SendUploadFile(dateTime, contract, merchant, Guid.Empty, cancellationToken);

Expand Down Expand Up @@ -223,4 +237,44 @@ enum DataToSend {
Settlement = 16
}
}

public class ConsoleLogger : Shared.Logger.ILogger {
public void LogCritical(Exception exception) {
Console.WriteLine(exception);
}

public void LogCritical(String message,
Exception exception) {
Console.WriteLine(message);
Console.WriteLine(exception);
}

public void LogDebug(String message) {
Console.WriteLine(message);
}

public void LogError(Exception exception) {
Console.WriteLine(exception);
}

public void LogError(String message,
Exception exception) {
Console.WriteLine(message);
Console.WriteLine(exception);
}

public void LogInformation(String message) {
Console.WriteLine(message);
}

public void LogTrace(String message) {
Console.WriteLine(message);
}

public void LogWarning(String message) {
Console.WriteLine(message);
}

public Boolean IsInitialised { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
using Polly;
using SecurityService.Client;
using SecurityService.DataTransferObjects.Responses;
using Shared.Results;
Expand Down Expand Up @@ -156,7 +157,10 @@ public async Task<Result<SerialisedMessage>> PerformMerchantLogon(DateTime dateT
public async Task<Result> PerformSettlement(DateTime dateTime,
Guid estateId,
CancellationToken cancellationToken) {
List<MerchantResponse> merchants = await this.GetMerchants(estateId, cancellationToken);
Result<List<MerchantResponse>> getMerchantsResult = await this.GetMerchants(estateId, cancellationToken);
if (getMerchantsResult.IsFailed)
return Result.Failure("Error getting merchants");
List<MerchantResponse>? merchants = getMerchantsResult.Data;
List<String> errors = new List<String>();
foreach (MerchantResponse merchantResponse in merchants) {
this.WriteTrace($"About to send Process Settlement Request for Date [{dateTime:dd-MM-yyyy}] and Estate [{estateId}] and Merchant [{merchantResponse.MerchantId}]");
Expand Down Expand Up @@ -379,7 +383,10 @@ private static async Task<Guid> GetFileProfileIdFromOperator(String operatorName
if (tokenResult.IsFailed)
return ResultHelpers.CreateFailure(tokenResult);

EstateResponse estate = await this.TransactionProcessorClient.GetEstate(tokenResult.Data, merchant.EstateId, cancellationToken);
var getEstate = await this.TransactionProcessorClient.GetEstate(tokenResult.Data, merchant.EstateId, cancellationToken);
if (getEstate.IsFailed)
return Result.Failure("Get Estate failed");
var estate = getEstate.Data;
Guid userId = estate.SecurityUsers.First().SecurityUserId;
Decimal depositAmount = 0;
if (productType == ProductType.MobileTopup)
Expand Down Expand Up @@ -587,7 +594,23 @@ private async Task<Result> SendProcessSettlementRequest(DateTime dateTime, Guid
Result<String> tokenResult = await this.GetAuthToken(cancellationToken);
if (tokenResult.IsFailed)
return ResultHelpers.CreateFailure(tokenResult);
return await this.TransactionProcessorClient.ProcessSettlement(tokenResult.Data, dateTime, estateId, merchantId, cancellationToken);

// Create a retry policy
IAsyncPolicy<Result> policy = PolicyFactory.CreatePolicy<Result>(2, retryDelay: TimeSpan.FromSeconds(5), policyTag: "TestPolicy", null, ShouldRetryException);

Result result = await PolicyFactory.ExecuteWithPolicyAsync(async () =>
await this.TransactionProcessorClient.ProcessSettlement(tokenResult.Data, dateTime, estateId, merchantId, cancellationToken),
policy, "TransactionDataGeneratorService - SendProcessSettlementRequest");
return result;
}

private static bool ShouldRetryException(Exception exception)
{
return exception switch
{
TaskCanceledException { InnerException: TimeoutException } => true,
_ => false
};
}

public async Task<Result<MerchantResponse>> GetMerchant(Guid estateId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="SecurityService.Client" Version="2025.1.1" />
<PackageReference Include="Shared" Version="2025.3.1" />
<PackageReference Include="SimpleResults" Version="3.0.1" />
<PackageReference Include="TransactionProcessor.Client" Version="2025.2.10" />
<PackageReference Include="SecurityService.Client" Version="2025.3.1" />
<PackageReference Include="Shared" Version="2025.5.2" />
<PackageReference Include="Shared.Results" Version="2025.5.2" />
<PackageReference Include="TransactionProcessor.Client" Version="2025.4.10" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,14 @@ public static class Jobs
{
public static async Task<Result> GenerateMerchantStatements(ITransactionDataGeneratorService t, MerchantStatementJobConfig config, CancellationToken cancellationToken)
{
List<MerchantResponse> merchants = await t.GetMerchants(config.EstateId, cancellationToken);
var getMerchantsResult = await t.GetMerchants(config.EstateId, cancellationToken);

if (merchants.Any() == false)
if (getMerchantsResult.IsFailed)
{
return Result.Failure($"No merchants returned for Estate [{config.EstateId}]");
}

var merchants = getMerchantsResult.Data;
List<string> results = new();
foreach (MerchantResponse merchantResponse in merchants)
{
Expand All @@ -55,17 +56,23 @@ public static async Task<Result> GenerateMerchantStatements(ITransactionDataGene

public static async Task<Result> GenerateFileUploads(ITransactionDataGeneratorService t, FileUploadJobConfig config, CancellationToken cancellationToken)
{
MerchantResponse merchant = await t.GetMerchant(config.EstateId, config.MerchantId, cancellationToken);
Result<MerchantResponse> merchantResult = await t.GetMerchant(config.EstateId, config.MerchantId, cancellationToken);

if (merchant == default)
if (merchantResult.IsFailed)
{
return Result.Failure($"No merchant returned for Estate Id [{config.EstateId}] Merchant Id [{config.MerchantId}]");
}

List<ContractResponse> contracts = await t.GetMerchantContracts(merchant, cancellationToken);
MerchantResponse merchant = merchantResult.Data;
Result<List<ContractResponse>> getMerchantContractsResult = await t.GetMerchantContracts(merchant, cancellationToken);
if (getMerchantContractsResult.IsFailed)
{
Console.WriteLine($"Failed to get merchant contracts: {getMerchantContractsResult.Message}");
return Result.Failure();
}
DateTime fileDate = DateTime.Now.Date;
List<string> results = new List<string>();
foreach (ContractResponse contract in contracts)
foreach (ContractResponse contract in getMerchantContractsResult.Data)
{
if (config.ContractNames.Contains(contract.Description) == false)
continue;
Expand Down Expand Up @@ -129,19 +136,19 @@ public static async Task<Result> GenerateFloatCredits(ITransactionDataGeneratorS
public static async Task<Result> GenerateTransactions(ITransactionDataGeneratorService t, TransactionJobConfig config, CancellationToken cancellationToken)
{
// get the merchant
var merchantResult = await t.GetMerchant(config.EstateId, config.MerchantId, cancellationToken);
Result<MerchantResponse> merchantResult = await t.GetMerchant(config.EstateId, config.MerchantId, cancellationToken);

if (merchantResult.IsFailed)
{
return Result.Failure($"Error getting Merchant Id [{config.MerchantId}] for Estate Id [{config.EstateId}]");
}

var merchant = merchantResult.Data;
MerchantResponse merchant = merchantResult.Data;

DateTime transactionDate = DateTime.Now;

// Get the merchants contracts
var contractResult = await t.GetMerchantContracts(merchant, cancellationToken);
Result<List<ContractResponse>> contractResult = await t.GetMerchantContracts(merchant, cancellationToken);

if (contractResult.IsFailed) {
return Result.Failure($"Error getting contracts for Merchant [{merchant.MerchantName}]");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

<PackageReference Include="EventStore.Client.Grpc.PersistentSubscriptions" Version="23.3.8" />

<PackageReference Include="MessagingService.Client" Version="2025.1.4" />
<PackageReference Include="MessagingService.Client" Version="2025.3.1" />

<PackageReference Include="Microsoft.Data.SqlClient" Version="6.0.1" />
<PackageReference Include="Shared" Version="2025.3.1" />
<PackageReference Include="Shared" Version="2025.5.2" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Quartz" Version="3.14.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.14.0" />
<PackageReference Include="Quartz.Plugins.TimeZoneConverter" Version="3.14.0" />
<PackageReference Include="Quartz.Serialization.Json" Version="3.14.0" />
<PackageReference Include="Shared" Version="2025.3.1" />
<PackageReference Include="Shared" Version="2025.5.2" />
<PackageReference Include="SilkierQuartz" Version="5.0.375" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
Expand Down