public IActionResult CheckOut([FromBody] JObject token) { try { StripeConfiguration.SetApiKey(StripeKey); var amount = 0; var totalVp = 0; var totalXp = 0; var key = Guid.Parse(token["cartKey"].ToString()); var cart = _lfContext.tblCart.Include(c => c.CartItems).FirstOrDefault(c => c.Key == key); if (cart == null) { return(BadRequest("Unable to retrieve cart data.")); } var player = _appDbContext.tblPlayer.FirstOrDefault(p => p.Id == cart.PlayerId).ThrowIfNull("Player"); var currentEvent = _lfContext.tblEvent.FirstOrDefault(e => e.IsActiveEvent).ThrowIfNull("Current Event"); foreach (var cartItem in cart.CartItems) { if (cartItem == cart.CartItems.First()) { amount += 40; } else { amount += 10; } amount += cartItem.PurchaseXp; totalVp += cartItem.VpToXp; totalXp = totalXp + cartItem.PurchaseXp + cartItem.VpToXp; } var options = new StripeChargeCreateOptions { Amount = amount * 100, Currency = "usd", Description = $"Pre-registration for event '{currentEvent.Title}'", SourceTokenOrExistingSourceId = token["id"].ToString() }; var service = new StripeChargeService(); var charge = service.Create(options); cart.Paid = true; _lfContext.tblCart.Update(cart); player.VolunteerPoints = player.VolunteerPoints - totalVp; player.VolunteerPoints += 10; _appDbContext.tblPlayer.Update(player); _appDbContext.SaveChanges(); var characterDetailForEmail = new List <PreRegCharacterDetail>(); foreach (var cartItem in cart.CartItems) { var characterTotalXp = 0; characterTotalXp += cartItem.PurchaseXp; characterTotalXp += cartItem.VpToXp; var character = _lfContext.tblCharacter.FirstOrDefault(c => c.Id == cartItem.CharacterId); if (character == null) { return(BadRequest("Unable to get character data for characterid " + cartItem.CharacterId)); } if (character.AccumulatedXP == null) { character.AccumulatedXP = 0; } if (character.AvailableXP == null) { character.AvailableXP = 0; } var baseXp = 40; characterTotalXp += baseXp; character.AccumulatedXP += characterTotalXp; character.AvailableXP += characterTotalXp; var newCharacterEvent = new CharacterEvent { VpToXp = cartItem.VpToXp, XpBought = cartItem.PurchaseXp, EventId = currentEvent.Id, CharacterId = cartItem.CharacterId }; _lfContext.tblCharacter.Update(character); _lfContext.tblCharacterEvents.Add(newCharacterEvent); var characterToAdd = new PreRegCharacterDetail { Character = character, CartItem = cartItem, BaseXp = baseXp, BaseXpCost = characterDetailForEmail.FirstOrDefault() == null ? 40 : 10 }; characterDetailForEmail.Add(characterToAdd); } _lfContext.SaveChanges(); var stripeResonse = JObject.Parse(charge.StripeResponse.ObjectJson); var billingDetails = charge.Source.Card; var email = token["email"].ToString(); var emailDetails = new PreRegEmailDetails { Email = email, PreRegCharacterDetails = characterDetailForEmail, OrderID = cart.Key, BillingDetails = billingDetails, GrandTotal = amount, Event = currentEvent, RemainingVp = (int)player.VolunteerPoints }; Email.SendPreRegConfirmationEmail(emailDetails); return(Ok(charge)); } catch (Exception e) { return(BadRequest("An unknown error has ocurred")); } }
public static void SendPreRegConfirmationEmail(PreRegEmailDetails details) { var toAddress = new MailAddress(details.Email, " "); var subject = $"Last Frontier Pre-Registration Confirmation for Event {details.Event.Title}"; var body = $@"<!DOCTYPE html> <html> <head> <style> * {{ font-family: Courier, sans-serif; color: #ffff; background-color: #1a2f4f; }} table {{ width: 100%; }} td, th {{ border: 1px solid #ccdef1; text-align: left; padding: 8px; line-height: 11px; }} tr:nth-child(even) {{ background-color: #304c77; }} .order-summary-container {{ background-color: #1a2f4f; width: 50%; margin-left: auto; margin-right: auto; }} td:last-child {{ background-color: #1a2f4f; border: none; text-align: right; }} th:last-child {{ background-color: #1a2f4f; border: none; text-align: right; }} .total {{ text-align: right; }} .billing-info {{ font-size: small; line-height: 7px; }} .center {{ display: block; margin-left: auto; margin-right: auto; }} .impact {{ font-family: Impact, sans-serif; }} .left-justify {{ float: left; text-align:left!important; }} .billing-info {{ border: none; padding-left: 0px; }} .width {{ width: 60%; }} </style> </head> <body> <img src='https://preview.ibb.co/bWYYa0/Email-Confermation-Header-Option-1-Copy.png' alt='Last Frontier' class='center' width=65%;> <div class='order-summary-container'> <h1 style='font-family:Impact; font-size: 30px; color: #cc9933'>★<font color='ffff' class='impact'>Order Confirmed: ${ details.OrderID }</font></h1> <p>Thank you for your purchase with Last Frontier. You have been successfully pre-registered for Event: { details.Event.Title }. All XP (detailed below) has been applied to your characters.</p> <div class='billing-info'> <p style='font-family:Impact; font-size: 20px;'>BILLED TO:</p> <table class='width'> <tr> <td class='billing-info'>{details.BillingDetails.Name}<br></br> {details.BillingDetails.AddressLine1}<br></br> {details.BillingDetails.AddressCity}, {details.BillingDetails.AddressState} { details.BillingDetails.AddressZip } </td> <td class='left-justify'> {details.Email} </td> </tr> </table> </div> <h2 style='font-family:Impact; font-size: 30px;'>Order Summary</h2> <table> <tr> <th>Character</th> <th>Base XP</th> <th>Vp to XP</th> <th>Addtl. XP</th> <th>Registration Cost</th> <th>Addtl. XP Cost</th> <th>Subtotal</th> </tr>"; foreach (var character in details.PreRegCharacterDetails) { var totalXp = character.BaseXp + character.CartItem.PurchaseXp + character.CartItem.VpToXp; var totalCost = character.BaseXpCost + character.CartItem.PurchaseXp; body += $@" <tr> <td>{character.Character.Name}</td> <td>{character.BaseXp}</td> <td>{character.CartItem.VpToXp}</td> <td>{character.CartItem.PurchaseXp}</td> <td>${character.BaseXpCost}.00</td> <td>${character.CartItem.PurchaseXp}.00</td> <td>{totalXp}XP ${totalCost}.00</td> </tr> "; } body += $@" </table> <hr> <p class='total'><strong>TOTAL:</strong> ${details.GrandTotal}.00</p> <p><strong>Remaining VP: </strong> {details.RemainingVp} </p> <img src='https://lastfrontierlarp.com/wp-content/uploads/2018/10/Last-Frontier-Logo-Transparent.png' alt='Last Frontier' class='center' width=40%;> </div> </body> </html> "; SendEmail(toAddress, subject, body); }