Esempio n. 1
0
        public static OrderItemDigitalGoodCollection LoadForUser(Int32 userId, int maximumRows, int startRowIndex, string sortExpression)
        {
            //CREATE THE DYNAMIC SQL TO LOAD OBJECT
            StringBuilder selectQuery = new StringBuilder();

            selectQuery.Append("SELECT");
            if (maximumRows > 0)
            {
                selectQuery.Append(" TOP " + (startRowIndex + maximumRows).ToString());
            }
            selectQuery.Append(" " + OrderItemDigitalGood.GetColumnNames("OIDG"));
            selectQuery.Append(" FROM ac_OrderItemDigitalGoods OIDG INNER JOIN ac_OrderItems OI ON OIDG.OrderItemId = OI.OrderItemId ");
            selectQuery.Append(" INNER JOIN ac_Orders O ON OI.OrderId = O.OrderId ");
            selectQuery.Append(" WHERE O.UserId = @userId");
            if (!string.IsNullOrEmpty(sortExpression))
            {
                selectQuery.Append(" ORDER BY " + sortExpression);
            }

            Database  database      = Token.Instance.Database;
            DbCommand selectCommand = database.GetSqlStringCommand(selectQuery.ToString());

            database.AddInParameter(selectCommand, "@userId", System.Data.DbType.Int32, userId);
            //EXECUTE THE COMMAND
            OrderItemDigitalGoodCollection results = new OrderItemDigitalGoodCollection();
            int thisIndex = 0;
            int rowCount  = 0;

            using (IDataReader dr = database.ExecuteReader(selectCommand))
            {
                while (dr.Read() && ((maximumRows < 1) || (rowCount < maximumRows)))
                {
                    if (thisIndex >= startRowIndex)
                    {
                        OrderItemDigitalGood orderItemDigitalGood = new OrderItemDigitalGood();
                        OrderItemDigitalGood.LoadDataReader(orderItemDigitalGood, dr);
                        results.Add(orderItemDigitalGood);
                        rowCount++;
                    }
                    thisIndex++;
                }
                dr.Close();
            }
            return(results);
        }
        /// <summary>
        /// Gets the order items that would result from the addition of the given product to an order.
        /// </summary>
        /// <param name="productId">The id of the product to add.</param>
        /// <param name="quantity">The quantity of the product to add.</param>
        /// <param name="optionList">List of option choice ids if this is a variant</param>
        /// <param name="kitList">List of kit products if it is a Kit</param>
        /// <returns>The order items that would result from the addition of the given product to an order</returns>
        public static List <OrderItem> CreateForProduct(int productId, short quantity, string optionList, string kitList)
        {
            List <OrderItem> orderItems = new List <OrderItem>();
            Product          product    = ProductDataSource.Load(productId);

            if (product != null)
            {
                //CREATE THE BASE ORDER ITEM
                OrderItem baseItem = new OrderItem();
                baseItem.Name          = product.Name;
                baseItem.OrderItemType = OrderItemType.Product;
                baseItem.ProductId     = productId;
                baseItem.TaxCodeId     = product.TaxCodeId;
                baseItem.Quantity      = quantity;
                baseItem.ShippableId   = product.ShippableId;
                //CALCULATE THE PRICE OF THE PRODUCT
                ProductCalculator pcalc = ProductCalculator.LoadForProduct(productId, quantity, optionList, kitList);
                baseItem.Sku    = pcalc.Sku;
                baseItem.Price  = pcalc.Price;
                baseItem.Weight = pcalc.Weight;
                //CHECK PRODUCT VARIANT
                ProductVariant variant = ProductVariantDataSource.LoadForOptionList(productId, optionList);
                if (variant != null)
                {
                    baseItem.OptionList  = optionList;
                    baseItem.VariantName = variant.VariantName;
                }
                //CHECK FOR DIGITAL GOODS
                foreach (ProductDigitalGood dg in product.DigitalGoods)
                {
                    if (dg.DigitalGood != null && (String.IsNullOrEmpty(baseItem.OptionList) || baseItem.OptionList == dg.OptionList))
                    {
                        OrderItemDigitalGood oidg = new OrderItemDigitalGood();
                        oidg.OrderItemId   = baseItem.OrderItemId;
                        oidg.DigitalGoodId = dg.DigitalGoodId;
                        oidg.Name          = dg.DigitalGood.Name;
                        baseItem.DigitalGoods.Add(oidg);
                    }
                }
                orderItems.Add(baseItem);

                //CHECK FOR KIT ITEMS
                int[] kitProductIds = AlwaysConvert.ToIntArray(kitList);
                if (kitProductIds != null && kitProductIds.Length > 0)
                {
                    LSDecimal baseItemPrice  = baseItem.Price;
                    LSDecimal baseItemWeight = baseItem.Weight;
                    foreach (int kitProductId in kitProductIds)
                    {
                        KitProduct kitProduct = KitProductDataSource.Load(kitProductId);
                        if (kitProduct != null)
                        {
                            OrderItem kitItem = new OrderItem();
                            kitItem.Name          = kitProduct.DisplayName;
                            kitItem.OrderItemType = OrderItemType.Product;
                            kitItem.ParentItemId  = baseItem.OrderItemId;
                            kitItem.ProductId     = kitProduct.ProductId;
                            kitItem.OptionList    = kitProduct.OptionList;
                            kitItem.Quantity      = (short)(kitProduct.Quantity * baseItem.Quantity);
                            kitItem.Sku           = kitProduct.Product.Sku;
                            kitItem.TaxCodeId     = kitProduct.Product.TaxCodeId;
                            kitItem.Price         = kitProduct.CalculatedPrice / kitProduct.Quantity;
                            kitItem.Weight        = kitProduct.CalculatedWeight / kitProduct.Quantity;
                            //CHECK FOR DIGITAL GOODS
                            foreach (DigitalGood dg in kitItem.Product.DigitalGoods)
                            {
                                OrderItemDigitalGood oidg = new OrderItemDigitalGood();
                                oidg.OrderItemId   = kitItem.OrderItemId;
                                oidg.DigitalGoodId = dg.DigitalGoodId;
                                kitItem.DigitalGoods.Add(oidg);
                            }
                            baseItemPrice  -= kitProduct.CalculatedPrice;
                            baseItemWeight -= kitProduct.CalculatedWeight;
                            orderItems.Add(kitItem);
                        }
                    }
                    baseItem.Price  = baseItemPrice;
                    baseItem.Weight = baseItemWeight;
                }
            }
            return(orderItems);
        }
Esempio n. 3
0
        /// <summary>
        /// Generates digital goods from order items
        /// </summary>
        /// <param name="order">Order to generate digital goods for</param>
        internal static void GenerateOrderItemDigitalGoods(Order order)
        {
            //GENERATE ORDER ITEM DIGITAL GOODS
            List <OrderItemDigitalGood> oidgList = new List <OrderItemDigitalGood>();

            try
            {
                string    query    = "SELECT OI.OrderItemId, OI.Quantity, PDG.DigitalGoodId FROM ac_OrderItems OI, ac_Products P, ac_ProductDigitalGoods PDG WHERE OrderId = @orderId AND OI.ProductId = P.ProductId AND P.ProductId = PDG.ProductId AND ((PDG.OptionList IS NULL) OR (OI.OptionList = PDG.OptionList))";
                Database  database = Token.Instance.Database;
                DbCommand command  = database.GetSqlStringCommand(query);
                database.AddInParameter(command, "@orderId", System.Data.DbType.Int32, order.OrderId);
                using (IDataReader dr = database.ExecuteReader(command))
                {
                    while (dr.Read())
                    {
                        int   orderItemId   = dr.GetInt32(0);
                        short quantity      = dr.GetInt16(1);
                        int   digitalGoodId = dr.GetInt32(2);
                        for (short i = 0; i < quantity; i++)
                        {
                            OrderItemDigitalGood oidg = new OrderItemDigitalGood();
                            oidg.OrderItemId   = orderItemId;
                            oidg.DigitalGoodId = digitalGoodId;
                            oidgList.Add(oidg);
                        }
                    }
                    dr.Close();
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Error generating digital goods manifest for order " + order.OrderId, ex);
            }

            //SAVE THE GENERATED ITEMS TO THE DATABASE
            foreach (OrderItemDigitalGood oidg in oidgList)
            {
                DigitalGood dg = oidg.DigitalGood;
                if (dg != null)
                {
                    if (dg.ActivationMode == ActivationMode.OnOrder)
                    {
                        try
                        {
                            oidg.Activate();
                        }
                        catch (Exception ex)
                        {
                            Logger.Warn("Could not activate digital good " + oidg.DigitalGoodId + " for order " + order.OrderId, ex);
                        }
                    }

                    if (dg.FulfillmentMode == FulfillmentMode.OnOrder)
                    {
                        try
                        {
                            oidg.AcquireSerialKey();
                        }
                        catch (Exception ex)
                        {
                            Logger.Warn("Could not fulfill digital good " + oidg.DigitalGoodId + " for order " + order.OrderId, ex);
                        }
                    }
                }
                oidg.Name = dg.Name;
                oidg.Save();
            }
        }