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); }
/// <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(); } }