using MySql.Data.MySqlClient; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using TMTCronJob.Model; namespace TMTCronJob.Services { public class PaymentService { MySqlConnection con; //Logger logger; public PaymentService(MySqlConnection con) { this.con = con; //logger = new Logger(con); } const string base_url = "http://192.168.0.41:8080/"; public bool LoadInfringements(string statement, List iForceInfridgments, List eNatisInfridgments) { var cmd = new MySqlCommand(); cmd.Connection = con; cmd.CommandText = statement; cmd.ExecuteNonQuery(); MySqlDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { if (string.Equals(reader["strInfringementSource"].ToString().ToUpper(), "IFORCE"))//name for our iforce source { iForceInfridgments.Add(new InfringementPayment { InfringementID = Convert.ToInt32(reader["InfringementID"]), TransactionId = Convert.ToInt32(reader["TransactionID"]), NoticeNumber = reader["strInfringementNumber"].ToString(), strStatus = reader["strStatus"].ToString(), PaymentAmount = Convert.ToDouble(reader["strAmount"]), PaymentDate = reader["dtPaid"].ToString(), IssuingAuthority = reader["strIssuingAuthority"].ToString(), ReceiptNumber = reader["strRecieptNumber"].ToString(), PaymentProvider = reader["strProviderName"].ToString(), IntSettlementTries = Convert.ToInt32(reader["intSettlementTries"]), //Need this in the db }); } else { eNatisInfridgments.Add(new InfringementPayment { InfringementID = Convert.ToInt32(reader["InfringementID"]), NoticeNumber = reader["strInfringementNumber"].ToString(), strStatus = reader["strStatus"].ToString(), PaymentAmount = Convert.ToDouble(reader["strAmount"]), PaymentDate = reader["dtPaid"].ToString(), IssuingAuthority = reader["strIssuingAuthority"].ToString(), ReceiptNumber = reader["strRecieptNumber"].ToString(), PaymentProvider = reader["strProviderName"].ToString(), IntSettlementTries = Convert.ToInt32(reader["intSettlementTries"]), //Need this in the db }); } } reader.Close(); return true; } reader.Close(); return false; } public async Task ProcessENatisPayments(List infridgments, List problemInfridgments) { string statement = ""; var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = Helper.Helper.ServerCertificateCustomValidation }; var client = new HttpClient(handler) { BaseAddress = new Uri(base_url) }; string jsonInfringement = ""; StringContent content; HttpResponseMessage eNatisResponse; string body = ""; var cmd = new MySqlCommand(); cmd.Connection = con; foreach (var row in infridgments) { //call enatis again jsonInfringement = JsonConvert.SerializeObject(new PayEnatisInfringement { infringementNoticeNumber = row.NoticeNumber, amount = row.PaymentAmount }); content = new StringContent(jsonInfringement, Encoding.UTF8, "application/json"); eNatisResponse = await client.PostAsync("infringement/payinfringement", content); body = await eNatisResponse.Content.ReadAsStringAsync(); //logger.WriteLog("Cronjob Payment To Source", jsonInfringement, $"Transaction: {row.TransactionId}", "TMT"); if (eNatisResponse.StatusCode == HttpStatusCode.OK) { statement = $"Update transaction SET intPaid = 'SETTLED', dtLastEdit = NOW() WHERE TransactionID = '{row.TransactionId}'"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); var response = JsonConvert.DeserializeObject(body); statement = $"UPDATE infringement set strStatus = 'Source Approved Payment', strSourceResponse = 'PayResult: {response.payResult}. InvoiceNumber: {response.invoiceNumber} ReceiptNumber: {response.receiptNumber}' WHERE InfringementID = {row.InfringementID}"; } else { int settlementTries = row.IntSettlementTries + 1; var response = JsonConvert.DeserializeObject(body); //logger.WriteLog("Cronjob Payment To Source", $"StatusCode: {response.statusCode}. Description: {response.message}", $"Transaction: {row.TransactionId}", "TMT"); statement = $"UPDATE infringement set intSettlementTries = {settlementTries}, strSourceResponse = 'StatusCode: {response.statusCode}. Description: {response.message}' WHERE InfringementID = {row.InfringementID}"; if (settlementTries > 3) { problemInfridgments.Add(row); } } cmd.CommandText = statement; cmd.ExecuteNonQuery(); } return true; } public async Task ProcessENatisPayments(List infridgments) { string statement = ""; var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = Helper.Helper.ServerCertificateCustomValidation }; var client = new HttpClient(handler) { BaseAddress = new Uri(base_url) }; string jsonInfringement = ""; StringContent content; HttpResponseMessage eNatisResponse; string body = ""; var cmd = new MySqlCommand(); cmd.Connection = con; foreach (var row in infridgments) { //call enatis again jsonInfringement = JsonConvert.SerializeObject(new PayEnatisInfringement { infringementNoticeNumber = row.NoticeNumber, amount = row.PaymentAmount }); content = new StringContent(jsonInfringement, Encoding.UTF8, "application/json"); eNatisResponse = await client.PostAsync("infringement/payinfringement", content); body = await eNatisResponse.Content.ReadAsStringAsync(); // logger.WriteLog("Cronjob Payment To Source", jsonInfringement, $"Transaction: {row.TransactionId}", "TMT"); if (eNatisResponse.StatusCode == HttpStatusCode.OK) { statement = $"Update transaction SET intPaid = 'SETTLED', dtLastEdit = NOW() WHERE TransactionID = '{row.TransactionId}'"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); var response = JsonConvert.DeserializeObject(body); statement = $"UPDATE infringement set strStatus = 'Source Approved Payment', strSourceResponse = 'PayResult: {response.payResult}. InvoiceNumber: {response.invoiceNumber} ReceiptNumber: {response.receiptNumber}' WHERE InfringementID = {row.InfringementID}"; } else { var response = JsonConvert.DeserializeObject(body); //logger.WriteLog("Cronjob Payment To Source", $"StatusCode: {response.statusCode}. Description: {response.message}", $"Transaction: {row.TransactionId}", "TMT"); statement = $"Update transaction SET strStatus = 'Source Failed Payment', dtLastEdit = NOW() WHERE TransactionID = '{row.TransactionId}'"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); statement = $"UPDATE infringement set intSettlementTries = 1, strStatus = 'Source Failed Payment', strSourceResponse = 'StatusCode: {response.statusCode}. Description: {response.message}' WHERE InfringementID = {row.InfringementID}"; } cmd.CommandText = statement; cmd.ExecuteNonQuery(); } return true; } public async Task ProcessIForcePayments(List infridgments, List problemInfridgments) { string statement = ""; var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = Helper.Helper.ServerCertificateCustomValidation }; var client = new HttpClient(handler) { BaseAddress = new Uri(base_url) }; string jsonInfringement = ""; StringContent content; HttpResponseMessage iForceResponse; string body = ""; var cmd = new MySqlCommand(); cmd.Connection = con; foreach (var row in infridgments) { //call enatis again jsonInfringement = JsonConvert.SerializeObject(new PayIForceInfringement { freshFine = true, issuingAuthorityCode = row.IssuingAuthority, noticeNumber = row.NoticeNumber, paymentAmount = row.PaymentAmount, paymentDate = row.PaymentDate, paymentProvider = row.PaymentProvider, terminalId = 0, //what goes here?? receiptNumber = row.ReceiptNumber }); content = new StringContent(jsonInfringement, Encoding.UTF8, "application/json"); iForceResponse = await client.PostAsync("IForce/registerpayment", content); body = await iForceResponse.Content.ReadAsStringAsync(); //logger.WriteLog("Cronjob Payment To Source", jsonInfringement, $"Transaction: {row.TransactionId}", "TMT"); if (iForceResponse.StatusCode == HttpStatusCode.OK) { statement = $"Update transaction SET intPaid = 'SETTLED', dtLastEdit = NOW() WHERE TransactionID = '{row.TransactionId}'"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); var response = JsonConvert.DeserializeObject(body); //logger.WriteLog("Cronjob Payment To Source", $"TransactionID: {response.transactionId}. ResultDescription: {response.resultDescription}", $"Transaction: {row.TransactionId}", "TMT"); statement = $"UPDATE infringement set strStatus = 'Source Approved Payment', strSourceResponse = 'TransactionID: {response.transactionId}. ResultDescription: {response.resultDescription}' WHERE InfringementID = {row.InfringementID}"; } else { int settlementTries = row.IntSettlementTries + 1; var response = JsonConvert.DeserializeObject(body); //logger.WriteLog("Cronjob Payment To Source", $"StatusCode: {response.statusCode}. Description: {response.message}", $"Transaction: {row.TransactionId}", "TMT"); statement = $"Update transaction SET strStatus = 'Source Failed Payment', dtLastEdit = NOW() WHERE TransactionID = '{row.TransactionId}'"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); statement = $"UPDATE infringement set intSettlementTries = {settlementTries}, strStatus = 'Source Failed Payment', strSourceResponse = 'StatusCode: {response.statusCode}. Description: {response.message}' WHERE InfringementID = {row.InfringementID}"; if (settlementTries > 3) { problemInfridgments.Add(row); } } cmd.CommandText = statement; cmd.ExecuteNonQuery(); } return true; } public async Task ProcessIForcePayments(List infridgments) { string statement = ""; var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = Helper.Helper.ServerCertificateCustomValidation }; var client = new HttpClient(handler) { BaseAddress = new Uri(base_url) }; string jsonInfringement = ""; StringContent content; HttpResponseMessage iForceResponse; string body = ""; var cmd = new MySqlCommand(); cmd.Connection = con; foreach (var row in infridgments) { //call enatis again jsonInfringement = JsonConvert.SerializeObject(new PayIForceInfringement { freshFine = true, issuingAuthorityCode = row.IssuingAuthority, noticeNumber = row.NoticeNumber, paymentAmount = row.PaymentAmount, paymentDate = row.PaymentDate, paymentProvider = row.PaymentProvider, terminalId = 0, //what goes here?? receiptNumber = row.ReceiptNumber }); content = new StringContent(jsonInfringement, Encoding.UTF8, "application/json"); iForceResponse = await client.PostAsync("IForce/registerpayment", content); body = await iForceResponse.Content.ReadAsStringAsync(); //logger.WriteLog("Cronjob Payment To Source", jsonInfringement, $"Transaction: {row.TransactionId}", "TMT"); if (iForceResponse.StatusCode == HttpStatusCode.OK) { statement = $"Update transaction SET intPaid = 'SETTLED', dtLastEdit = NOW() WHERE TransactionID = '{row.TransactionId}'"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); var response = JsonConvert.DeserializeObject(body); //logger.WriteLog("Cronjob Payment To Source", $"TransactionID: {response.transactionId}. ResultDescription: {response.resultDescription}", $"Transaction: {row.TransactionId}", "TMT"); statement = $"UPDATE infringement set strStatus = 'Source Approved Payment', strSourceResponse = 'TransactionID: {response.transactionId}. ResultDescription: {response.resultDescription}' WHERE InfringementID = {row.InfringementID}"; } else { var response = JsonConvert.DeserializeObject(body); //logger.WriteLog("Cronjob Payment To Source", $"StatusCode: {response.statusCode}. Description: {response.message}", $"Transaction: {row.TransactionId}", "TMT"); statement = $"UPDATE infringement set intSettlementTries = 1, strStatus = 'Source Failed Payment', strSourceResponse = 'StatusCode: {response.statusCode}. Description: {response.message}' WHERE InfringementID = {row.InfringementID}"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); statement = $"UPDATE transaction set strStatus = 'Source Failed Payment' WHERE TransactionID = {row.TransactionId}"; } cmd.CommandText = statement; cmd.ExecuteNonQuery(); } return true; } } }