using System; using System.Collections.Generic; using Amazon.Lambda.Core; using Amazon.Lambda.APIGatewayEvents; using MySqlConnector; using System.Data; using classes; using System.Threading.Tasks; using Model; using System.Diagnostics; using Services; namespace PMF { public class CronJob: Pmfbase { MySqlDataReader _reader; public async Task RunCronJob(APIGatewayProxyRequest request, ILambdaContext context) { string cronLog = $"DB::CronJob::{DateTime.Now.ToString("yyyy-MM-dd h:mm:ss tt")}"; //log when cron ran string statement = "DB::CronJob"; List eNatisInfridgments = new List(); List iForceInfridgments = new List(); List problemInfridgments = new List(); try { if (_con.State == ConnectionState.Closed) _con.Open(); //First try out the previous failed payments statement = @"SELECT InfringementID, strInfringementNumber, transaction.strStatus, transaction.TransactionID, (infringement.strAmount) as strAmount, transaction.dtPaid, strIssuingAuthority, strRecieptNumber, strProviderName, strInfringementSource, intSettlementTries FROM infringement INNER JOIN transaction ON infringement.refTrasactionID = transaction.TransactionID INNER JOIN paymentProvider ON transaction.refPaymentProviderID = paymentProvider.PaymentProviderID WHERE infringement.strStatus = 'Source Failed Payment' AND intSettlementTries < 4"; //Need to limit on an upper limit of tries max var cmd = new MySqlCommand(); cmd.Connection = _con; var paymentService = new PaymentService(dbUser); bool hasRows = paymentService.LoadInfringements(statement, iForceInfridgments, eNatisInfridgments); if (hasRows) { //Process previously failed payments based on source var iforcePaymentResult = await paymentService.ProcessIForcePayments(iForceInfridgments, problemInfridgments); var eNatisPaymentResult = await paymentService.ProcessENatisPayments(eNatisInfridgments, problemInfridgments); if (problemInfridgments.Count > 0) { string adminLabel = "[" + (char)34 + "ADMIN" + (char)34 + "]"; //statement = $"SELECT * FROM user WHERE strRole ='{adminLabel}' and UserID = 1 "; //Admin tag //cmd.CommandText = statement; //cmd.ExecuteNonQuery(); //_reader = cmd.ExecuteReader(); //List adminUsers = new List { }; //if (_reader.HasRows) //{ // while (_reader.Read()) // { // adminUsers.Add(_reader.GetString(5)); //email add // } // _reader.Close(); //} List adminUsers = new List(); var mailer = new PMF.Services.Mailer(); mailer.SendEmail(problemInfridgments, adminUsers); } iForceInfridgments.Clear(); eNatisInfridgments.Clear(); } else { statement = "NO Failed Payments Found"; _logger.WriteLog("CRONJOB", statement, cronLog, "TMT"); } //Then try out the new payments which have not attempted to be settled statement = @"SELECT TransactionID, InfringementID, strInfringementNumber, infringement.strStatus, infringement.strAmount, infringement.dtPaid, strIssuingAuthority, strRecieptNumber, strProviderName, strInfringementSource, intSettlementTries FROM infringement INNER JOIN transaction ON infringement.refTrasactionID = transaction.TransactionID INNER JOIN paymentProvider ON transaction.refPaymentProviderID = paymentProvider.PaymentProviderID WHERE infringement.intPaid = 'YES' AND infringement.strStatus='success'"; hasRows = paymentService.LoadInfringements(statement, iForceInfridgments, eNatisInfridgments); if (hasRows) { //Process new payments. var iforcePaymentResult = await paymentService.ProcessIForcePayments(iForceInfridgments); var eNatisPaymentResult = await paymentService.ProcessENatisPayments(eNatisInfridgments); _logger.WriteLog("CRONJOB", $"Processed iForce: {iForceInfridgments.Count} Processed eNatis: {eNatisInfridgments.Count} ", cronLog, "TMT"); } else { statement = "NO New Payments Found"; _logger.WriteLog("CRONJOB", statement, cronLog, "TMT"); } } catch (Exception ex) { string lineNumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber().ToString(); _logger.WriteLog("CRONJOB", ex.Message, $"Exception Line: {lineNumber}", "TMT"); } finally { if (_reader != null) _reader.Close(); if (_con != null || _con.State == ConnectionState.Open) _con.Close(); } return HttpService.CreateResponse(200, payload: "Cronjob completed"); } } }