public async Task <ActionResult> InitializeTransaction([FromBody] TicketRequest ticketRequest) { PayStackResponse paystackresponse = new PayStackResponse(); PayRequest payRequest = new PayRequest(); var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var configuration = builder.Build(); string secretkey = configuration["paystacksk"]; string endpoint = configuration["paystackitendpoint"]; string twilsid = configuration["twiliosid"]; string twiltoken = configuration["twilioauthtoken"]; string twilphone = configuration["twiliophone"]; //fetchdraw //fetch amount //var amount = _context.Items // .Where(u => u.Itemname == ticketRequest.itemname) // .Select(u => u.Ticketamount) // .SingleOrDefault(); DateTime curentdate = DateTime.Parse(DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss")); //get item var item = await _context.Items.Where(u => u.Itemname == ticketRequest.itemname).FirstOrDefaultAsync(); //get draw for item var draw = await _context.Draws.Where(u => u.Itemid == item.Id).FirstOrDefaultAsync(); if (draw.Drawdate < curentdate) { paystackresponse.Status = "fail"; paystackresponse.Message = "Oopsy, you are a tiny bit late to this party. Please ensure to enter earlier for any of our Giveaways. All our giveaways end at 19:30"; paystackresponse.AuthorizationUrl = "null"; paystackresponse.AccessCode = "null"; paystackresponse.Reference = "null"; } else { if (draw.DrawType == DrawType.Paid) { var totalamount = Convert.ToDecimal(item.Ticketamount) * Convert.ToDecimal(ticketRequest.quantity); //paystack request params payRequest.email = ticketRequest.email; payRequest.amount = totalamount.ToString().Replace(".", ""); //payRequest.amount += "00"; DateTime curdate = DateTime.Parse(DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss")); //DateTime nigerianTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(curdate, "W. Central Africa Standard Time"); HttpClient client = CreateWebRequest(); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + secretkey); var resp = await client.PostAsJsonAsync(endpoint, payRequest); if (!resp.IsSuccessStatusCode) { Logger.LogInfo(" Customer Enquiry - error saving response:::" + resp.RequestMessage.ToString()); paystackresponse.Status = "fail"; paystackresponse.Message = "A Network Error Occurred"; paystackresponse.AuthorizationUrl = "null"; paystackresponse.AccessCode = "null"; paystackresponse.Reference = "null"; } else { var res = await resp.Content.ReadAsStringAsync(); var result = (TopLevel)JsonConvert.DeserializeObject(res, typeof(TopLevel)); //paystackresponse.Status = result.Status.ToString(); paystackresponse.Status = "success"; paystackresponse.Message = result.Message; paystackresponse.AuthorizationUrl = result.Data.AuthorizationUrl.ToString(); paystackresponse.AccessCode = result.Data.AccessCode; paystackresponse.Reference = result.Data.Reference; //saveticket in database //if (paystackresponse.Status == "Success") //{ //var tickets = new Tickets(); //tickets.Drawid = draw.Id; //tickets.Firstname = ticketRequest.firstname; //tickets.Lastname = ticketRequest.lastname; //tickets.Emailaddress = ticketRequest.email; //tickets.Phonenumber = ticketRequest.phonenumber; //Create tickets * quantity (Validate Method actually creates the ticket references) IList <Tickets> newcustomer = new List <Tickets>(); // add to context for (int i = 0; i < Convert.ToInt32(ticketRequest.quantity); i++) { Tickets ticket = new Tickets { Firstname = ticketRequest.firstname, Lastname = ticketRequest.lastname, Emailaddress = ticketRequest.email, Phonenumber = ticketRequest.phonenumber, Drawid = draw.Id, AccessCode = paystackresponse.AccessCode, PaystackReference = paystackresponse.Reference, ConfirmStatus = ConfirmStatus.Pending, Datemodified = curdate, Winstatus = WinStatus.NotWon }; newcustomer.Add(ticket); } ; _context.Tickets.AddRange(newcustomer); //} } //END PAID await _context.SaveChangesAsync(); } //draw type is free else { DateTime curdate = DateTime.Parse(DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss")); //var potentialrecord = await _context.Tickets.Where(x => x.Drawid == draw.Id && x.Firstname == ticketRequest.firstname && x.Lastname == ticketRequest.lastname && x.Phonenumber == ticketRequest.phonenumber).FirstOrDefaultAsync(); var potentialrecord = await _context.Tickets.Where(x => x.Drawid == draw.Id && (x.Phonenumber == ticketRequest.phonenumber || x.Emailaddress == ticketRequest.email)).FirstOrDefaultAsync(); if (potentialrecord == null) { //generate ticket ref Random generator = new Random(); String r2, r; r2 = generator.Next(0, 99).ToString("D2"); r = generator.Next(0, 999999).ToString("D6"); var ticketRef = ticketRequest.firstname.Substring(0, 1).ToUpper() + ticketRequest.lastname.Substring(0, 1).ToUpper() + r2 + DateTime.Now.ToString("ss") + r; Tickets ticket = new Tickets { Firstname = ticketRequest.firstname, Lastname = ticketRequest.lastname, Emailaddress = ticketRequest.email, Phonenumber = ticketRequest.phonenumber, Drawid = draw.Id, AccessCode = paystackresponse.AccessCode, PaystackReference = paystackresponse.Reference, ConfirmStatus = ConfirmStatus.Confirmed, Datemodified = curdate, Ticketreference = ticketRef, Winstatus = WinStatus.NotWon }; _context.Tickets.Add(ticket); await _context.SaveChangesAsync(); // paystackresponse.Status = "success"; paystackresponse.Message = "Free ticket successfully procured"; paystackresponse.AccessCode = "Free"; //send email string sqlFormattedDate = draw.Drawdate.HasValue ? draw.Drawdate.Value.ToString("dd-MMMM-yyyy") : "<not available>"; //List<string> stringofticketids = new List<string>(); StringBuilder ticketrows = new StringBuilder(); //int i = 1; //send ticketrows.Append("<tr><td>1</td> <td>" + ticketRef + "</td></tr>"); var subject = "Ticket Request Successful"; //string ticketss = String.Join(",", stringofticketids); var body = ""; string body2 = @"<!DOCTYPE html> <html> <head> <style> </style> </head> <body> <img style='display:block;' align='right' src='https://www.dropbox.com/s/0p1flnq0voo7hn9/oftcoftlogosmall.jpg?raw=1' alt = 'felt lucky'></a>" + "<h1 style = 'font-family: Arial, sans-serif; font-size: 250%; color:#9370DB;'> Congratulations!!!" + ticket.Firstname + "</h1>" + "<p style = 'font-family: Gill Sans, sans-serif; font-size: 160%; color:#666666;'> You have successfully entered into the National Giveaways Draw. Find draw details and ticket reference(s) below</p>" + "<p style = 'font-family: Gill Sans, sans-serif; font-size: 160%; color:#666666;'> Draw Date: " + sqlFormattedDate + "</p>" + "<p style = 'font-family: Gill Sans, sans-serif; font-size: 160%; color:#666666;'> Draw Date: " + item.Itemdescription + "</p>" + "<p style = 'font-family: Gill Sans, sans-serif; font-size: 160%; color:#666666;'> Ticket Reference(s)</p>" + "<table style='border:1px solid #d9d9d9;width:50%;font-family:Gill Sans, sans-serif;text-align:left; font-size: 130%; color:#666666;'>" + "<tr style='background-color:#595959; color:#FFFFFF'><td>S/N</td><td>Ticket Reference</td></tr> " + ticketrows + // "</table>" + "<p></p>" + "<a href='https://www.nationalgiveaway.com'><img style='display:block; width:100%;height:100%;' src='https://www.dropbox.com/s/medm6f3npfr4gh5/freegift.jpg?raw=1' alt = 'feeling lucky'></a>" + "</body>" + "</html>"; //EmailSender sender = new EmailSender(); try { //await sender.Execute2(ticket.Emailaddress, subject, body, body2); await _emailService.ExecuteAsync(ticket.Emailaddress, subject, body, body2); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } //end send email } else { paystackresponse.Status = "fail"; paystackresponse.Message = "You have already entered this giveaway"; } } } //string JSONresult = JsonConvert.SerializeObject(paystackresponse); return(new JsonResult(paystackresponse)); }
public async Task <ActionResult> PostItems([FromBody] TicketRequest ticketRequest) { PayStackResponse paystackresponse = new PayStackResponse(); PayRequest payRequest = new PayRequest(); var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var configuration = builder.Build(); string secretkey = configuration["paystacksk"]; string endpoint = configuration["paystackitendpoint"]; //fetchdraw //fetch amount //var amount = _context.Items // .Where(u => u.Itemname == ticketRequest.itemname) // .Select(u => u.Ticketamount) // .SingleOrDefault(); var item = await _context.Items.Where(u => u.Itemname == ticketRequest.itemname).FirstOrDefaultAsync(); var draw = await _context.Draws.Where(u => u.Itemid == item.Id).FirstOrDefaultAsync(); if (draw.DrawType == DrawType.Paid) { var totalamount = Convert.ToDecimal(item.Ticketamount) * Convert.ToDecimal(ticketRequest.quantity); //paystack request params payRequest.email = ticketRequest.email; payRequest.amount = totalamount.ToString().Replace(".", ""); //payRequest.amount += "00"; DateTime curdate = DateTime.Parse(DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss")); //DateTime nigerianTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(curdate, "W. Central Africa Standard Time"); HttpClient client = CreateWebRequest(); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + secretkey); var resp = await client.PostAsJsonAsync(endpoint, payRequest); if (!resp.IsSuccessStatusCode) { paystackresponse.Status = "false"; paystackresponse.Message = "A Network Error Occurred"; paystackresponse.AuthorizationUrl = "null"; paystackresponse.AccessCode = "null"; paystackresponse.Reference = "null"; } else { var res = await resp.Content.ReadAsStringAsync(); var result = (TopLevel)JsonConvert.DeserializeObject(res, typeof(TopLevel)); paystackresponse.Status = result.Status.ToString(); paystackresponse.Message = result.Message; paystackresponse.AuthorizationUrl = result.Data.AuthorizationUrl.ToString(); paystackresponse.AccessCode = result.Data.AccessCode; paystackresponse.Reference = result.Data.Reference; //saveticket in database if (paystackresponse.Status == "True") { //var tickets = new Tickets(); //tickets.Drawid = draw.Id; //tickets.Firstname = ticketRequest.firstname; //tickets.Lastname = ticketRequest.lastname; //tickets.Emailaddress = ticketRequest.email; //tickets.Phonenumber = ticketRequest.phonenumber; IList <Tickets> newcustomer = new List <Tickets>(); // add to context for (int i = 0; i < Convert.ToInt32(ticketRequest.quantity); i++) { Tickets ticket = new Tickets { Firstname = ticketRequest.firstname, Lastname = ticketRequest.lastname, Emailaddress = ticketRequest.email, Phonenumber = ticketRequest.phonenumber, Drawid = draw.Id, AccessCode = paystackresponse.AccessCode, PaystackReference = paystackresponse.Reference, ConfirmStatus = ConfirmStatus.Pending }; newcustomer.Add(ticket); } ; _context.Tickets.AddRange(newcustomer); } } //END PAID await _context.SaveChangesAsync(); } //draw type is free else { //var potentialrecord = await _context.Tickets.Where(x => x.Drawid == draw.Id && x.Firstname == ticketRequest.firstname && x.Lastname == ticketRequest.lastname && x.Phonenumber == ticketRequest.phonenumber).FirstOrDefaultAsync(); var potentialrecord = await _context.Tickets.Where(x => x.Drawid == draw.Id && (x.Firstname == ticketRequest.firstname || x.Lastname == ticketRequest.lastname || x.Phonenumber == ticketRequest.phonenumber || x.Emailaddress == ticketRequest.email)).FirstOrDefaultAsync(); if (potentialrecord == null) { Tickets ticket = new Tickets { Firstname = ticketRequest.firstname, Lastname = ticketRequest.lastname, Emailaddress = ticketRequest.email, Phonenumber = ticketRequest.phonenumber, Drawid = draw.Id, AccessCode = paystackresponse.AccessCode, PaystackReference = paystackresponse.Reference, ConfirmStatus = ConfirmStatus.Pending }; _context.Tickets.Add(ticket); await _context.SaveChangesAsync(); // paystackresponse.Status = "Success"; paystackresponse.Message = "Free ticket successfully procured"; } else { paystackresponse.Status = "Fail"; paystackresponse.Message = "Customer has already procured a ticket"; } } //string JSONresult = JsonConvert.SerializeObject(paystackresponse); return(new JsonResult(paystackresponse)); }