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"));
            }
        }
Beispiel #2
0
        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);
        }