using System; using System.Collections.Generic; using Amazon.Lambda.Core; using Amazon.Lambda.APIGatewayEvents; using Newtonsoft.Json; using MySqlConnector; using Newtonsoft.Json.Linq; using System.Data; using classes; using System.Threading.Tasks; using Model.ResponseModel; using System.Net.Http; using System.Net; using System.Diagnostics; namespace PMF { public class RecordPaymentTransaction: Pmfbase { public async Task PostIveriLiteTransaction(APIGatewayProxyRequest request, ILambdaContext context) { string statement = "iVeri-Lite::PostIVeriLiteTransaction"; string userId = ""; string transactionId = ""; string intPaid = "NO"; string dtPaid = "NULL"; string strVeriResponse = ""; string infringementNumber = ""; string refInfringementID = ""; APIGatewayProxyResponse response; Object resultResponse = null; Dictionary dict = new Dictionary(); //MySqlTransaction trans = null; MySqlDataReader _reader = null; try { string validationMessage = string.Empty; if (request != null && request.Body != null) { context.Logger.Log(request.Body); if (_con.State == ConnectionState.Closed) _con.Open(); var data = JsonConvert.DeserializeObject(request.Body); var validRequest = Helper.ValidateRequestParameters(ref validationMessage, data, "striVeriNumber", "userId", "strStatus"); //--check jo if (validRequest) { userId = Helper.CleanInput(data["userId"].ToString()); using var cmd = new MySqlCommand(); cmd.Connection = _con; intPaid = (data["intPaid"] != null ? data["intPaid"].ToString() : intPaid); dtPaid = (data["dtPaid"] != null ? data["dtPaid"].ToString() : dtPaid); statement = $"INSERT INTO transaction (striVeriNumber, refClientID, intPaid, dtPaid, dtPayment, refPaymentProviderID, strStatus, strAmount, strVeriResponse, dtFirstEdit) VALUES ('{Helper.CleanInput(data["striVeriNumber"].ToString())}', '{Helper.CleanInput(data["userId"].ToString())}', '{Helper.CleanInput(intPaid)}', 'NO', NOW(), 1, '{Helper.CleanInput(data["strStatus"].ToString())}','{Helper.CleanInput(data["strAmount"].ToString())}','{Helper.CleanInput(strVeriResponse)}', NOW())"; //trans = _con.BeginTransaction(); cmd.CommandText = statement; //cmd.Transaction = trans; cmd.ExecuteNonQuery(); transactionId = cmd.LastInsertedId.ToString(); foreach (var infringement in data["infringements"]) //CHECK Infringement does not include conv amount as this is separate { infringementNumber = Helper.CleanInput(infringement["strInfringementNumber"].ToString()); statement = $@"INSERT INTO infringement ( refTrasactionID, strInfringementSource, strIdNumber, dtInfringementDate, refClientID, strInfringementNumber, intPaid, dtPaid, strIssuingAuthority, strVechicleRegistration, strStatus, strConvenienceAmount, strAmount, intDemeritPoints ) VALUES ( '{transactionId}', '{Helper.CleanInput(infringement["strInfringementSource"].ToString())}', '{Helper.CleanInput(infringement["strIdNumber"]?.ToString())}', '{Helper.CleanInput(infringement["dtInfringementDate"]?.ToString())}', {userId}, '{Helper.CleanInput(infringement["strInfringementNumber"].ToString())}', '{Helper.CleanInput(intPaid)}', '{dtPaid}', '{Helper.CleanInput(infringement["strIssuingAuthority"]?.ToString())}', '{Helper.CleanInput(infringement["strVechicleRegistration"]?.ToString())}', '{Helper.CleanInput(data["strStatus"].ToString())}', '{Helper.CleanInput(infringement["strConvenienceAmount"].ToString())}', '{Helper.CleanInput(infringement["strAmount"].ToString())}', '{Helper.CleanInput(infringement["intDemeritPoints"].ToString())}' )"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); refInfringementID = cmd.LastInsertedId.ToString(); } //commit transaction //trans.Commit(); string sqlSelectTransaction = $"SELECT * FROM transaction WHERE TransactionID = '{transactionId}'"; cmd.CommandText = sqlSelectTransaction; cmd.ExecuteNonQuery(); MySqlDataReader readUpdate = cmd.ExecuteReader(); while (readUpdate.Read()) { dict.Add(readUpdate.GetName(0), readUpdate.GetValue(0).ToString()); //TransactionID dict.Add(readUpdate.GetName(1), readUpdate.GetValue(1).ToString()); //striVeriNumber dict.Add(readUpdate.GetName(3), readUpdate.GetValue(3).ToString()); //intPaid dict.Add(readUpdate.GetName(4), readUpdate.GetValue(4).ToString()); //dtPaid dict.Add(readUpdate.GetName(5), readUpdate.GetValue(5).ToString()); //dtPayment --> Only add it to the response when it is available dict.Add(readUpdate.GetName(7), readUpdate.GetValue(7).ToString()); //strStatus dict.Add(readUpdate.GetName(8), readUpdate.GetValue(8).ToString()); //strAmount } resultResponse = new { data = dict }; _logger.WriteLog("Transaction", "Processed transction", $"TransactionID: {dict["TransactionID"].ToString()} , Status: {dict["strStatus"].ToString()}", "TMT"); } else { response = HttpService.CreateResponse(400, payload: $"{validationMessage}"); _logger.WriteLog(userId, statement, $"Please add parameter(s) : {validationMessage}", "DB"); return response; } } else { response = HttpService.CreateResponse(400, payload: "Please provide parameters"); _logger.WriteLog(userId, statement, "Please provide parameters", "DB"); return response; } response = HttpService.CreateResponse(200, resultResponse); _logger.WriteLog(userId, statement, response.Body.ToString(), "DB"); } catch (Exception ex) { //if (trans != null) trans.Rollback(); string lineNumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber().ToString(); string function = (new StackTrace(ex, true)).GetFrame(0).GetMethod().Name.ToString(); _logger.WriteLog(userId, ex.Message, $"Exception Function: {function}, Line {lineNumber}", "DB"); return HttpService.CreateResponse(500, payload: ex.Message); //SERVER ERROR DO NOT PROCEED ON FRONTEND } finally { if (_reader != null) _reader.Close(); if (_con != null || _con.State == ConnectionState.Open) _con.Close(); } return response; } //Fetch Charge from IForce private async Task> GetIForceInfringementCharge(string noticeNumber) { var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = Helper.ServerCertificateCustomValidation; var client = new HttpClient(handler) { BaseAddress = new Uri(baseUrl), Timeout = TimeSpan.FromSeconds(Constants.TimeDefaultValue) }; try { var iForceResponse = await client.GetAsync($"IForce/querycharge?NoticeNumber={noticeNumber}"); var body = await iForceResponse.Content.ReadAsStringAsync(); if (iForceResponse.StatusCode == HttpStatusCode.OK) { var payload = JsonConvert.DeserializeObject>(body); return payload; } else { var error = JsonConvert.DeserializeObject(body); throw new Exception($"Error: {error.message}"); } } catch (Exception ex) { throw (ex); } } //Fetch Charge from Enatis private async Task> GetENatisInfringementCharge(string noticeNumber) { var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = Helper.ServerCertificateCustomValidation }; var client = new HttpClient(handler) { BaseAddress = new Uri(baseUrl) }; try { var eNatisResponse = await client.GetAsync($"infringement/queryinfringement?InfringementNoticeNumber={noticeNumber}"); var body = await eNatisResponse.Content.ReadAsStringAsync(); if (eNatisResponse.StatusCode == HttpStatusCode.OK) { var responseBody = JsonConvert.DeserializeObject>(body); foreach (var fine in responseBody) { return fine.charge; } return new List(); } else { var error = JsonConvert.DeserializeObject(body); throw new Exception($"Error: {error.message}"); } } catch (Exception ex) { throw ex; } } } }