diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs index 2810238..11634ef 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs @@ -15,6 +15,7 @@ using Quartz; using SecurityService.Client; using SecurityService.DataTransferObjects.Responses; + using Shared.Logger; using TransactionProcessor.Client; using TransactionProcessor.DataTransferObjects; @@ -27,7 +28,6 @@ public class GenerateTransactionsJob : BaseJob, IJob{ #region Methods public async Task Execute(IJobExecutionContext context){ - try{ Bootstrapper.ConfigureServices(context); String clientId = context.MergedJobDataMap.GetString("ClientId"); @@ -36,14 +36,17 @@ public async Task Execute(IJobExecutionContext context){ Guid merchantId = context.MergedJobDataMap.GetGuidValueFromString("MerchantId"); Boolean requireLogon = context.MergedJobDataMap.GetBooleanValueFromString("requireLogon"); + Logger.LogInformation($"Running Job {context.JobDetail.Description}"); + Logger.LogInformation($"Client Id: [{clientId}]"); + Logger.LogInformation($"Client Secret: [{clientSecret}]"); + Logger.LogInformation($"Estate Id: [{estateId}]"); + Logger.LogInformation($"Merchant Id: [{merchantId}]"); + Logger.LogInformation($"Require Logon: [{requireLogon}]"); + ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live); await Jobs.GenerateTransactions(t, estateId, merchantId, requireLogon, context.CancellationToken); } - catch(Exception e){ - // TODO: Log the error - } - } #endregion } } \ No newline at end of file diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs index 50f4e7c..3ff3ce4 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs @@ -15,6 +15,8 @@ using MessagingService.DataTransferObjects; using Microsoft.Data.SqlClient; using Newtonsoft.Json; +using Quartz; +using Shared.Logger; public static class Jobs{ public static async Task GenerateMerchantStatements(ITransactionDataGenerator t, Guid estateId, CancellationToken cancellationToken){ @@ -27,7 +29,7 @@ public static async Task GenerateMerchantStatements(ITransactionDataGenerator t, public static async Task GenerateFileUploads(ITransactionDataGenerator t, Guid estateId, Guid merchantId, CancellationToken cancellationToken) { - MerchantResponse merchant = await t.GetMerchant( estateId, merchantId, cancellationToken); + MerchantResponse merchant = await t.GetMerchant(estateId, merchantId, cancellationToken); List contracts = await t.GetMerchantContracts(merchant, cancellationToken); DateTime fileDate = DateTime.Now; @@ -38,10 +40,17 @@ public static async Task GenerateFileUploads(ITransactionDataGenerator t, Guid e } } - public static async Task GenerateTransactions(ITransactionDataGenerator t, Guid estateId, Guid merchantId, Boolean requireLogon, CancellationToken cancellationToken) - { + public static async Task GenerateTransactions(ITransactionDataGenerator t, Guid estateId, Guid merchantId, Boolean requireLogon, CancellationToken cancellationToken){ + MerchantResponse merchant = null; // get the merchant - MerchantResponse merchant = await t.GetMerchant(estateId, merchantId, cancellationToken); + try + { + merchant = await t.GetMerchant(estateId, merchantId, cancellationToken); + } + catch(Exception e){ + Logger.LogWarning($"Error getting merchant record [{merchantId}]"); + throw new JobExecutionException(new Exception($"Error getting merchant record [{merchantId}]"), false); + } DateTime transactionDate = DateTime.Now; @@ -122,6 +131,7 @@ public static SendEmailRequest BuildSupportEmail(DateTime dateTime, htmlBuilder.AppendLine(""); + htmlBuilder.AppendLine(""); htmlBuilder.AppendLine(""); htmlBuilder.AppendLine(""); diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj index 73a30b0..7e3b52c 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj @@ -11,7 +11,7 @@ - + diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/Startup.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/Startup.cs index 3e5f2df..aadcb25 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/Startup.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/Startup.cs @@ -3,6 +3,7 @@ namespace TransactionProcessing.SchedulerService using System; using System.Collections.Generic; using System.Configuration; + using System.IO; using System.Linq; using System.Reflection; using System.Threading; @@ -13,10 +14,15 @@ namespace TransactionProcessing.SchedulerService using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; + using Microsoft.Extensions.Logging; + using NLog.Extensions.Logging; using Quartz; using Quartz.Impl; + using Shared.Logger; using SilkierQuartz; using ConfigurationManager = System.Configuration.ConfigurationManager; + using ILogger = Microsoft.Extensions.Logging.ILogger; + using SetupBuilderExtensions = NLog.SetupBuilderExtensions; /// /// @@ -74,7 +80,11 @@ public static void AddOrUpdateConnectionString(String name, } public void Configure(IApplicationBuilder app, - IWebHostEnvironment env){ + IWebHostEnvironment env, ILoggerFactory loggerFactory) + { + + String nlogConfigFilename = "nlog.config"; + if (env.IsDevelopment()){ app.UseDeveloperExceptionPage(); } @@ -82,6 +92,14 @@ public void Configure(IApplicationBuilder app, app.UseExceptionHandler("/Error"); } + + loggerFactory.ConfigureNLog(Path.Combine(env.ContentRootPath, nlogConfigFilename)); + loggerFactory.AddNLog(); + + ILogger logger = loggerFactory.CreateLogger("EstateManagement"); + + Logger.Initialise(logger); + app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.csproj b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.csproj index 45e245a..6db75b4 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.csproj +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.csproj @@ -12,6 +12,7 @@ + diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/nlog.config b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/nlog.config new file mode 100644 index 0000000..45e92d0 --- /dev/null +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService/nlog.config @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TransactionProcessor.DataGenerator/DataGenerator/Program.cs b/TransactionProcessor.DataGenerator/DataGenerator/Program.cs index abc2aca..73bf4a8 100644 --- a/TransactionProcessor.DataGenerator/DataGenerator/Program.cs +++ b/TransactionProcessor.DataGenerator/DataGenerator/Program.cs @@ -82,6 +82,10 @@ static async Task Main(string[] args){ clientSecret, RunningMode.Live); + g.TraceGenerated += arguments => { + Console.WriteLine($"{arguments.TraceLevel}|{arguments.Message}"); + }; + await Program.GenerateTransactions(g, estateId, cancellationToken); //await Program.GenerateStatements(g, estateId, cancellationToken); @@ -97,8 +101,8 @@ private static async Task GenerateStatements(ITransactionDataGenerator g, Guid e private static async Task GenerateTransactions(ITransactionDataGenerator g, Guid estateId, CancellationToken cancellationToken){ // Set the date range - DateTime startDate = new DateTime(2023, 6, 6); //27/7 - DateTime endDate = new DateTime(2023, 6, 7); // This is the date of the last generated transaction + DateTime startDate = new DateTime(2023, 6, 8); //27/7 + DateTime endDate = new DateTime(2023, 6, 8); // This is the date of the last generated transaction List dateRange = g.GenerateDateRange(startDate, endDate); diff --git a/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/ITransactionDataGenerator.cs b/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/ITransactionDataGenerator.cs index 6d063ea..2dec224 100644 --- a/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/ITransactionDataGenerator.cs +++ b/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/ITransactionDataGenerator.cs @@ -15,5 +15,26 @@ public interface ITransactionDataGenerator{ Task GetMerchant(Guid estateId, Guid merchantId, CancellationToken cancellationToken); Task GenerateMerchantStatement(Guid estateId, Guid merchantId, DateTime statementDateTime, CancellationToken cancellationToken); + event TraceHandler TraceGenerated; + + #endregion +} + +public delegate void TraceHandler(TraceEventArgs traceArguments); + +public class TraceEventArgs : EventArgs +{ + public enum Level{ + Trace, + Warning, + Error + } + + #region Properties + + public String Message { get; set; } + + public Level TraceLevel { get; set; } + #endregion } \ No newline at end of file diff --git a/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/TransactionDataGenerator.cs b/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/TransactionDataGenerator.cs index d05d0ed..cc1d115 100644 --- a/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/TransactionDataGenerator.cs +++ b/TransactionProcessor.DataGenerator/TransactionProcessing.DataGeneration/TransactionDataGenerator.cs @@ -1,5 +1,8 @@ namespace TransactionProcessing.DataGeneration; +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; using System.Net.Http.Headers; using System.Text; using EstateManagement.Client; @@ -68,7 +71,60 @@ public TransactionDataGenerator(ISecurityServiceClient securityServiceClient, #region Methods + private void WriteTrace(String message) + { + if (TraceGenerated != null){ + TraceEventArgs args = new(){ + TraceLevel = TraceEventArgs.Level.Trace, + Message = message + }; + + TraceGenerated.Invoke(args); + } + } + + private void WriteWarning(String message) + { + if (TraceGenerated != null) + { + TraceEventArgs args = new() + { + TraceLevel = TraceEventArgs.Level.Warning, + Message = message + }; + + TraceGenerated.Invoke(args); + } + } + private void WriteError(String message) + { + if (TraceGenerated != null){ + TraceEventArgs args = new(){ + TraceLevel = TraceEventArgs.Level.Error, + Message = message + }; + + TraceGenerated.Invoke(args); + } + } + + private void WriteError(Exception ex) + { + if (TraceGenerated != null) + { + TraceEventArgs args = new() + { + TraceLevel = TraceEventArgs.Level.Error, + Message = ex.ToString() + }; + + TraceGenerated.Invoke(args); + } + } + public List GenerateDateRange(DateTime startDate, DateTime endDate){ + + this.WriteTrace($"Generating date range between {startDate:dd-MM-yyyy} and {endDate:dd-MM-yyyy}"); List dateRange = new List(); if (endDate.Subtract(startDate).Days == 0){ @@ -81,20 +137,63 @@ public List GenerateDateRange(DateTime startDate, DateTime endDate){ } } + this.WriteTrace($"{dateRange.Count} dates generated"); + return dateRange; } public async Task> GetMerchantContracts(MerchantResponse merchant, CancellationToken cancellationToken){ + + List contracts = new List(); + + if (merchant == null){ + this.WriteError("Merchant is null"); + return contracts; + } + String token = await this.GetAuthToken(cancellationToken); - return await this.EstateClient.GetMerchantContracts(token, merchant.EstateId, merchant.MerchantId, cancellationToken); + + try{ + this.WriteTrace($"About to get contracts for Merchant [{merchant.MerchantId}] Estate Id [{merchant.EstateId}]"); + contracts = await this.EstateClient.GetMerchantContracts(token, merchant.EstateId, merchant.MerchantId, cancellationToken); + this.WriteTrace($"{contracts.Count} contracts returned for Merchant"); + } + catch(Exception ex){ + this.WriteError("Error getting merchant contracts"); + this.WriteError(ex); + } + + return contracts; } public async Task> GetMerchants(Guid estateId, CancellationToken cancellationToken){ + List merchants = new List(); + String token = await this.GetAuthToken(cancellationToken); - return await this.EstateClient.GetMerchants(token, estateId, cancellationToken); + + try + { + this.WriteTrace($"About to get merchants for Estate Id [{estateId}]"); + merchants = await this.EstateClient.GetMerchants(token, estateId, cancellationToken); + this.WriteTrace($"{merchants.Count} merchants returned for Estate"); + } + catch (Exception ex) + { + this.WriteError("Error getting merchant contracts"); + this.WriteError(ex); + } + + return merchants; } public async Task PerformMerchantLogon(DateTime dateTime, MerchantResponse merchant, CancellationToken cancellationToken){ + + if (merchant == null) + { + this.WriteError("Merchant is null"); + return; + } + // Build logon message String deviceIdentifier = merchant.Devices.Single().Value; LogonTransactionRequest logonTransactionRequest = new LogonTransactionRequest @@ -107,11 +206,37 @@ public async Task PerformMerchantLogon(DateTime dateTime, MerchantResponse merch TransactionType = "Logon" }; - await this.SendLogonTransaction(merchant, logonTransactionRequest, cancellationToken); + try{ + + this.WriteTrace($"About to send Logon Transaction for Merchant [{merchant.MerchantName}]"); + + await this.SendLogonTransaction(merchant, logonTransactionRequest, cancellationToken); + + this.WriteTrace($"Logon Transaction for Merchant [{merchant.MerchantName}] sent"); + + } + catch (Exception ex) + { + this.WriteError($"Error sending logon transaction for Merchant {merchant.MerchantId} Estate [{merchant.EstateId}]"); + this.WriteError(ex); + } } public async Task PerformSettlement(DateTime dateTime, Guid estateId, CancellationToken cancellationToken){ - await this.SendProcessSettlementRequest(dateTime, estateId, cancellationToken); + try + { + this.WriteTrace($"About to send Process Settlement Request for Date [{dateTime:dd-MM-yyyy}] and Estate [{estateId}]"); + + await this.SendProcessSettlementRequest(dateTime, estateId, cancellationToken); + + this.WriteTrace($"Process Settlement Request sent for Date [{dateTime:dd-MM-yyyy}] and Estate [{estateId}]"); + + } + catch (Exception ex) + { + this.WriteError($"Error sending Process Settlement Request for Date [{dateTime:dd-MM-yyyy}] and Estate [{estateId}]"); + this.WriteError(ex); + } } public async Task SendSales(DateTime dateTime, MerchantResponse merchant, ContractResponse contract, CancellationToken cancellationToken){ @@ -120,7 +245,7 @@ public async Task SendSales(DateTime dateTime, MerchantResponse merchant, Contra Decimal depositAmount = 0; (Int32 accountNumber, String accountName, Decimal balance) billDetails = default; foreach (ContractProduct contractProduct in contract.Products){ - Console.WriteLine($"product [{contractProduct.DisplayText}]"); + this.WriteTrace($"product [{contractProduct.DisplayText}]"); List<(SaleTransactionRequest request, Decimal amount)> saleRequests = null; // Get a number of sales to be sent @@ -177,7 +302,7 @@ public async Task SendUploadFile(DateTime dateTime, ContractResponse contract, M return; } if (this.RunningMode == RunningMode.WhatIf){ - Console.WriteLine($"Send File for Merchant [{merchant.MerchantName}] Contract [{contract.OperatorName}] Lines [{uploadFile.Item2.GetNumberOfLines()}]"); + this.WriteTrace($"Send File for Merchant [{merchant.MerchantName}] Contract [{contract.OperatorName}] Lines [{uploadFile.Item2.GetNumberOfLines()}]"); return; } @@ -186,38 +311,68 @@ public async Task SendUploadFile(DateTime dateTime, ContractResponse contract, M // Send the deposit await this.SendMerchantDepositRequest(merchant, depositRequest, cancellationToken); - - + await this.UploadFile(uploadFile.Item2, Guid.Empty, dateTime, cancellationToken); } public async Task GetMerchant(Guid estateId, Guid merchantId, CancellationToken cancellationToken){ + MerchantResponse merchant = new MerchantResponse(); String token = await this.GetAuthToken(cancellationToken); - return await this.EstateClient.GetMerchant(token, estateId, merchantId, cancellationToken); + + try + { + this.WriteTrace($"About to get Merchant [{merchant.MerchantId}] Estate Id [{merchant.EstateId}]"); + merchant = await this.EstateClient.GetMerchant(token, estateId, merchantId, cancellationToken); + this.WriteTrace($"Merchant retrieved successfully"); + } + catch (Exception ex) + { + this.WriteError("Error getting merchant"); + this.WriteError(ex); + } + + return merchant; + } public async Task GenerateMerchantStatement(Guid estateId, Guid merchantId, DateTime statementDateTime, CancellationToken cancellationToken) { - HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, $"{this.EstateManagementApi}/api/estates/{estateId}/merchants/{merchantId}/statements"); - var body = new - { - merchant_statement_date = statementDateTime, - }; - request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); - - if (this.RunningMode == RunningMode.WhatIf) + try { - Console.WriteLine($"Merchant Statement Generated for merchant [{merchantId}] Statement Date [{body.merchant_statement_date}]"); - } - String token = await this.GetAuthToken(cancellationToken); - request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + this.WriteTrace($"About to send Generate Merchant Statement Request for Estate [{estateId}] and Merchant [{merchantId}] StatementDate [{statementDateTime:dd-MM-yyyy}]"); + + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, $"{this.EstateManagementApi}/api/estates/{estateId}/merchants/{merchantId}/statements"); + var body = new + { + merchant_statement_date = statementDateTime, + }; + request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); - using (HttpClient client = new HttpClient()) + if (this.RunningMode == RunningMode.WhatIf) + { + this.WriteTrace($"Merchant Statement Generated for merchant [{merchantId}] Statement Date [{body.merchant_statement_date}]"); + } + String token = await this.GetAuthToken(cancellationToken); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + + using (HttpClient client = new HttpClient()) + { + await client.SendAsync(request, cancellationToken); + } + + this.WriteTrace($"Generate Merchant Statement Request sent for Estate [{estateId}] and Merchant [{merchantId}] StatementDate [{statementDateTime:dd-MM-yyyy}]"); + + } + catch (Exception ex) { - await client.SendAsync(request, cancellationToken); + this.WriteError($"Error sending Generate Merchant Statement Request for Date [{statementDateTime:dd-MM-yyyy}] and Estate [{estateId}] and Merchant [{merchantId}]"); + this.WriteError(ex); } + } + public event TraceHandler? TraceGenerated; + private List<(SaleTransactionRequest request, Decimal amount)> BuildBillPaymentSaleRequests(DateTime dateTime, MerchantResponse merchant, ContractResponse contract, ContractProduct product, (Int32 accountNumber, String accountName, Decimal balance) billDetails){ List<(SaleTransactionRequest request, Decimal amount)> requests = new List<(SaleTransactionRequest request, Decimal amount)>(); @@ -418,7 +573,7 @@ public async Task GenerateMerchantStatement(Guid estateId, Guid merchantId, Date request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); if (this.RunningMode == RunningMode.WhatIf){ - Console.WriteLine($"Bill Created Account [{body.account_number}] Balance [{body.amount}]"); + this.WriteTrace($"Bill Created Account [{body.account_number}] Balance [{body.amount}]"); return (body.account_number, body.account_name, body.amount); } @@ -455,16 +610,23 @@ private Decimal GetAmount(ContractProduct product = null){ } private async Task GetAuthToken(CancellationToken cancellationToken){ + + this.WriteTrace($"About to get auth token"); + if (this.TokenResponse == null){ + this.WriteTrace($"TokenResponse was null"); TokenResponse token = await this.SecurityServiceClient.GetToken(this.ClientId, this.ClientSecret, cancellationToken); this.TokenResponse = token; } if (this.TokenResponse.Expires.UtcDateTime.Subtract(DateTime.UtcNow) < TimeSpan.FromMinutes(2)){ + this.WriteTrace($"TokenResponse was expired"); TokenResponse token = await this.SecurityServiceClient.GetToken(this.ClientId, this.ClientSecret, cancellationToken); this.TokenResponse = token; } + this.WriteTrace($"Auth token retrieved"); + return this.TokenResponse.AccessToken; } @@ -506,7 +668,6 @@ private DateTime GetTransactionDateTime(DateTime dateTime){ return dateTime.AddHours(hours).AddMinutes(minutes).AddSeconds(seconds); } - private Int32 GetTransactionNumber(){ this.TransactionNumber++; return this.TransactionNumber; @@ -514,17 +675,26 @@ private Int32 GetTransactionNumber(){ private async Task SendMerchantDepositRequest(MerchantResponse merchant, MakeMerchantDepositRequest request, CancellationToken cancellationToken){ if (this.RunningMode == RunningMode.WhatIf){ - Console.WriteLine($"Make Deposit [{request.Amount}] for Merchant [{merchant.MerchantName}]"); + this.WriteTrace($"Make Deposit [{request.Amount}] for Merchant [{merchant.MerchantName}]"); return; } String token = await this.GetAuthToken(cancellationToken); - MakeMerchantDepositResponse response = await this.EstateClient.MakeMerchantDeposit(token, merchant.EstateId, merchant.MerchantId, request, cancellationToken); - Console.WriteLine($"Deposit [{request.Amount}] made for Merchant [{merchant.MerchantName}]"); + try{ + + this.WriteTrace($"About to make Deposit [{request.Amount}] for Merchant [{merchant.MerchantName}]"); + MakeMerchantDepositResponse response = await this.EstateClient.MakeMerchantDeposit(token, merchant.EstateId, merchant.MerchantId, request, cancellationToken); + this.WriteTrace($"Deposit [{request.Amount}] made for Merchant [{merchant.MerchantName}]"); + } + catch (Exception ex) + { + this.WriteError($"Error making merchant deposit for merchant [{merchant.MerchantName}]"); + this.WriteError(ex); + } } private async Task SendSaleTransaction(MerchantResponse merchant, SaleTransactionRequest request, CancellationToken cancellationToken){ if (this.RunningMode == RunningMode.WhatIf){ - Console.WriteLine($"Send Sale for Merchant [{merchant.MerchantName}] - {request.TransactionNumber} - {request.OperatorIdentifier} - {request.GetAmount()}"); + this.WriteTrace($"Send Sale for Merchant [{merchant.MerchantName}] - {request.TransactionNumber} - {request.OperatorIdentifier} - {request.GetAmount()}"); return; } @@ -532,6 +702,7 @@ private async Task SendSaleTransaction(MerchantResponse merchant, SaleTransactio SerialisedMessage requestSerialisedMessage = request.CreateSerialisedMessage(); SerialisedMessage responseSerialisedMessage = null; + this.WriteTrace($"About to Send sale for Merchant [{merchant.MerchantName}]"); for (int i = 0; i < 3; i++){ try { @@ -540,20 +711,20 @@ private async Task SendSaleTransaction(MerchantResponse merchant, SaleTransactio break; } catch(TaskCanceledException e){ - Console.WriteLine(e); + this.WriteError(e); } } SaleTransactionResponse saleTransactionResponse = responseSerialisedMessage.GetSerialisedMessageResponseDTO(); - Console.WriteLine($"Sale Transaction for Merchant [{merchant.MerchantName}] sent"); + this.WriteTrace($"Sale Transaction for Merchant [{merchant.MerchantName}] sent"); } private async Task SendLogonTransaction(MerchantResponse merchant, LogonTransactionRequest request, CancellationToken cancellationToken) { if (this.RunningMode == RunningMode.WhatIf) { - Console.WriteLine($"Send Logon Transaction for Merchant [{merchant.MerchantName}]"); + this.WriteTrace($"Send Logon Transaction for Merchant [{merchant.MerchantName}]"); return; } @@ -564,8 +735,6 @@ private async Task SendLogonTransaction(MerchantResponse merchant, LogonTransact await this.TransactionProcessorClient.PerformTransaction(token, requestSerialisedMessage, CancellationToken.None); SaleTransactionResponse saleTransactionResponse = responseSerialisedMessage.GetSerialisedMessageResponseDTO(); - - Console.WriteLine($"Logon Transaction for Merchant [{merchant.MerchantName}] sent"); } private async Task UploadFile(UploadFile uploadFile, Guid userId, DateTime fileDateTime, CancellationToken cancellationToken){ @@ -587,9 +756,21 @@ private async Task UploadFile(UploadFile uploadFile, Guid userId, DateTime fileD request.Headers.Authorization = new AuthenticationHeaderValue("bearer", token); HttpResponseMessage response = null; + + try + { - using(HttpClient client = new HttpClient()){ - response = await client.SendAsync(request, cancellationToken); + this.WriteTrace($"About to upload file for Merchant [{uploadFile.MerchantId}]"); + using (HttpClient client = new HttpClient()) + { + response = await client.SendAsync(request, cancellationToken); + } + this.WriteTrace($"File uploaded for Merchant [{uploadFile.MerchantId}]"); + } + catch (Exception ex) + { + this.WriteError($"Error uploading file for merchant [{uploadFile.MerchantId}]"); + this.WriteError(ex); } } @@ -597,7 +778,7 @@ private async Task SendProcessSettlementRequest(DateTime dateTime, Guid estateId { if (this.RunningMode == RunningMode.WhatIf) { - Console.WriteLine($"Sending Settlement for Date [{dateTime.Date}] Estate [{estateId}]"); + this.WriteTrace($"Sending Settlement for Date [{dateTime.Date}] Estate [{estateId}]"); return; }