public IHttpActionResult Put([FromBody] TicketGames.API.Models.Order.Cart cart)
        {
            try
            {
                ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

                long.TryParse(principal.Claims.Where(c => c.Type == "participant_Id").Single().Value, out this.participantId);

                Domain.Model.Cart domainCart = null;

                var key = string.Concat("Participant:Id:", this.participantId.ToString(), ":Cart");

                domainCart = CacheManager.GetObject <Domain.Model.Cart>(key);

                if (domainCart != null)
                {
                    var cartItem = domainCart.CartItems.Where(i => i.ProductId == cart.ProductId).First();

                    if (cart.Quantity > 0)
                    {
                        cartItem.Quantity = cart.Quantity;

                        CacheManager.StoreObject(key, domainCart, LifetimeProfile.Long);
                    }
                }

                return(Ok("Carrinho atualizado!"));
            }
            catch (Exception ex)
            {
                return(NotFound());
            }
        }
        public IHttpActionResult Get()
        {
            try
            {
                ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

                long.TryParse(principal.Claims.Where(c => c.Type == "participant_Id").Single().Value, out this.participantId);

                if (participantId > 0)
                {
                    Domain.Model.Cart domainCart = null;

                    var key = string.Concat("Participant:Id:", this.participantId.ToString(), ":Cart");

                    domainCart = CacheManager.GetObject <Domain.Model.Cart>(key);

                    var cart = new List <TicketGames.API.Models.Order.Cart>();

                    if (domainCart != null)
                    {
                        cart = new TicketGames.API.Models.Order.Cart().CreateCart(domainCart);
                    }
                    else
                    {
                        domainCart = this._cartService.Get(this.participantId);

                        if (domainCart.Id > 0)
                        {
                            cart = new TicketGames.API.Models.Order.Cart().CreateCart(domainCart);

                            CacheManager.StoreObject(key, domainCart, LifetimeProfile.Long);
                        }
                    }

                    return(Ok(cart));
                }
                else
                {
                    return(BadRequest());
                }
            }
            catch (Exception ex)
            {
                return(NotFound());
            }
        }
        public IHttpActionResult Redemption(Order order)
        {
            try
            {
                #region Declarations of variables and objects

                long              orderId     = 0;
                string            session     = null;
                float             total       = 0;
                ClaimsPrincipal   principal   = Request.GetRequestContext().Principal as ClaimsPrincipal;
                Participant       participant = null;
                Domain.Model.Cart domainCart  = null;
                var     carts       = new List <TicketGames.API.Models.Order.Cart>();
                Account account     = new Account();
                var     transaction = new Domain.Model.Transaction();
                var     orderDomain = new Domain.Model.Order();


                #endregion

                long.TryParse(principal.Claims.Where(c => c.Type == "participant_Id").Single().Value, out participantId);

                if (this.participantId > 0)
                {
                    #region Get Participant

                    var participantKey = string.Concat("Participant:Id:", this.participantId.ToString(), ":Register");

                    participant = CacheManager.GetObject <Participant>(participantKey);

                    if (participant == null)
                    {
                        var result = this._participantService.GetParticipant(this.participantId);

                        participant = new Participant(result);
                    }


                    var domainParticipant = participant.MappingDomain();


                    #endregion

                    #region Get Cart

                    var cartKey = string.Concat("Participant:Id:", this.participantId.ToString(), ":Cart");

                    domainCart = CacheManager.GetObject <Domain.Model.Cart>(cartKey);

                    if (domainCart == null)
                    {
                        domainCart = this._cartService.Get(this.participantId);
                    }

                    var deliveryAddressResult = this._cartService.Get(this.participantId, domainCart.Id);

                    carts = new TicketGames.API.Models.Order.Cart().CreateCart(domainCart);

                    #endregion

                    #region Get Balance

                    var transactions = this._transactionService.GetTransactions(participantId);

                    if (transactions.Count > 0)
                    {
                        account = new Account().Balances(transactions);
                    }

                    #endregion

                    #region Get Session

                    var key = string.Concat("Participant:Id:", participantId.ToString(), ":Session");

                    session = CacheManager.GetObject <string>(key);

                    #endregion


                    #region Get Settings

                    var settingsKey = "Settings:Configuration";
                    List <Domain.Model.Configuration> settings = null;
                    settings = CacheManager.GetObject <List <Domain.Model.Configuration> >(settingsKey);

                    if (settings == null)
                    {
                        settings = this._configurationService.GetSettings();

                        if (settings != null && settings.Count > 0)
                        {
                            CacheManager.StoreObject(settingsKey, settings, LifetimeProfile.Longest);
                        }
                    }

                    #endregion

                    carts.ForEach(c =>
                                  total += c.Price * c.Quantity
                                  );

                    orderDomain.ParticipantId = this.participantId;

                    //Status de pedido criado
                    orderDomain.OrderStatusId = 4;

                    orderDomain.OrderHistory.Add(new Domain.Model.OrderHistory()
                    {
                        OrderStatusId = 4
                    });

                    orderDomain.Value = total;

                    orderDomain.Money = Convert.ToSingle(total - account.Balance);

                    foreach (var cart in carts)
                    {
                        orderDomain.OrderItems.Add(new Domain.Model.OrderItem()
                        {
                            ProductId = cart.ProductId,
                            RaffleId  = cart.RaffleId,
                            Value     = cart.Price,
                            Quantity  = cart.Quantity
                        });

                        orderDomain.CartId = cart.CartId;
                    }

                    switch (order.PaymentType)
                    {
                    case PaymentType.Point:
                    {
                        break;
                    }

                    case PaymentType.Billet:
                    {
                        orderDomain.PaymentType = "Billet";

                        if (account.Balance > 0)
                        {
                            transaction.ParticipantId     = this.participantId;
                            transaction.TransactionTypeId = 2;
                            transaction.Description       = "Fechamento do pedido {0}";
                            transaction.Value             = account.Balance;

                            orderDomain.Point       = account.Balance;
                            orderDomain.PaymentType = "Point + Billet";
                        }

                        var billet = new Domain.Model.Billet();

                        billet.Name       = participant.Name;
                        billet.CPF        = participant.CPF;
                        billet.SenderHash = order.SenderHash;
                        billet.Session    = session;

                        billet.Value = orderDomain.Money;

                        var paymentBillet = order.MappingBillet(domainParticipant, deliveryAddressResult, billet);

                        orderId = this._orderService.Redemption(paymentBillet, transaction, orderDomain, settings);

                        break;
                    }

                    case PaymentType.Credit:
                    {
                        orderDomain.PaymentType = "Credit";

                        if (account.Balance > 0)
                        {
                            transaction.ParticipantId     = this.participantId;
                            transaction.TransactionTypeId = 2;
                            transaction.Description       = "Fechamento do pedido {0}";
                            transaction.Value             = account.Balance;

                            orderDomain.Point       = account.Balance;
                            orderDomain.PaymentType = "Point + Credit";
                        }

                        var credit = new Domain.Model.Credit();

                        credit.Owner           = order.Card.Owner;
                        credit.SenderHash      = order.SenderHash;
                        credit.Brand           = order.Card.Brand;
                        credit.CreditCardToken = order.Card.CreditCardToken;
                        credit.Session         = session;

                        credit.Parcel = order.Card.Parcel.Quantity;
                        credit.Value  = order.Card.Parcel.Value;

                        var paymentCredit = order.MappingCredit(domainParticipant, domainCart, deliveryAddressResult, credit);

                        orderId = this._orderService.Redemption(paymentCredit, transaction, orderDomain);

                        break;
                    }

                    default: break;
                    }

                    if (orderId > 0)
                    {
                        CacheManager.KeyDelete(cartKey);
                    }


                    var pedido = order;
                }

                return(Ok(orderId));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }
        public IHttpActionResult GetInstallments(string brand)
        {
            try
            {
                ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

                long.TryParse(principal.Claims.Where(c => c.Type == "participant_Id").Single().Value, out participantId);

                if (this.participantId > 0)
                {
                    #region Get Balance

                    Account account = new Account();

                    var result = this._transactionService.GetTransactions(participantId);

                    if (result.Count > 0)
                    {
                        account = new Account().Balances(result);
                    }

                    #endregion

                    #region Get Cart

                    Domain.Model.Cart domainCart = null;

                    var key = string.Concat("Participant:Id:", this.participantId.ToString(), ":Cart");

                    domainCart = CacheManager.GetObject <Domain.Model.Cart>(key);

                    if (domainCart == null)
                    {
                        domainCart = this._cartService.Get(this.participantId);
                    }

                    var carts = new List <TicketGames.API.Models.Order.Cart>();

                    carts = new TicketGames.API.Models.Order.Cart().CreateCart(domainCart);

                    #endregion

                    float total = 0;

                    carts.ForEach(c =>
                                  total += c.Price * c.Quantity
                                  );

                    Decimal money = Convert.ToDecimal(total - account.Balance);

                    var installments = this._orderService.Installments(money, brand, 12);

                    return(Ok(installments));
                }
                else
                {
                    return(BadRequest("Precisa está logado!"));
                }
            }
            catch (Exception ex)
            {
                return(NotFound());
            }
        }
        public IHttpActionResult Post([FromBody] TicketGames.API.Models.Order.Cart cart, bool addCart)
        {
            try
            {
                long cartId = 0;

                ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

                long.TryParse(principal.Claims.Where(c => c.Type == "participant_Id").Single().Value, out this.participantId);

                Domain.Model.Cart domainCart = null;

                var key = string.Concat("Participant:Id:", this.participantId.ToString(), ":Cart");

                domainCart = CacheManager.GetObject <Domain.Model.Cart>(key);

                if (!addCart)
                {
                    if (domainCart != null)
                    {
                        domainCart.ParticipantId = this.participantId;

                        var cartItem = domainCart.CartItems.Where(x => x.ProductId == cart.ProductId);

                        if (cartItem.Count() > 0)
                        {
                            var item = cartItem.First();

                            if (cart.Quantity >= item.Quantity)
                            {
                                item.Quantity = cart.Quantity == item.Quantity ? item.Quantity + 1 : cart.Quantity + item.Quantity;
                            }
                            else if (cart.Quantity >= 0 && cart.Quantity < item.Quantity)
                            {
                                item.Quantity++;
                            }
                            else
                            {
                                item.Quantity++;
                            }
                        }
                        else
                        {
                            Domain.Model.CartItem item = new Domain.Model.CartItem();

                            var raffle = this._raffleService.GetRaffle(cart.ProductId);
                            item.ProductId = cart.ProductId;
                            item.Product   = raffle.Product;

                            raffle.Product = null;

                            item.RaffleId = raffle.Id;
                            item.Raffle   = raffle;
                            item.Quantity = cart.Quantity <= 0 ? 1 : cart.Quantity;

                            domainCart.CartItems.Add(item);
                        }

                        CacheManager.StoreObject(key, domainCart, LifetimeProfile.Long);
                    }
                    else
                    {
                        domainCart = new Domain.Model.Cart();

                        var raffle = this._raffleService.GetRaffle(cart.ProductId);

                        domainCart.ParticipantId = this.participantId;
                        domainCart.CartStatusId  = 2;
                        Domain.Model.CartItem cartItem = new Domain.Model.CartItem();

                        cartItem.ProductId = cart.ProductId;
                        cartItem.Product   = raffle.Product;

                        raffle.Product = null;

                        cartItem.RaffleId = raffle.Id;
                        cartItem.Raffle   = raffle;
                        cartItem.Quantity = cart.Quantity;

                        domainCart.CartItems.Add(cartItem);

                        CacheManager.StoreObject(key, domainCart, LifetimeProfile.Long);
                    }
                }
                else
                {
                    domainCart = this._cartService.Add(domainCart);

                    domainCart = this._cartService.Get(this.participantId);

                    foreach (var item in domainCart.CartItems)
                    {
                        item.Cart = null;
                        item.Product.CartItems = null;
                    }

                    cartId = domainCart.Id;

                    CacheManager.StoreObject(key, domainCart, LifetimeProfile.Long);
                }

                return(Ok(cartId));
            }
            catch (Exception ex)
            {
                return(NotFound());
            }
        }