예제 #1
0
        /// <summary>
        /// Validates the cart to ensure it is ready for ordering
        /// </summary>
        private static void ValidateCart(IEnumerable <Cart> cartItems, User user)
        {
            int availableCount = cartItems.Count(cartItem => AssetManager.GetAssetStatusForUser(cartItem.Asset, user) == AssetStatus.Available);

            if (availableCount == 0)
            {
                throw new InvalidOrderException("Cart does not contain any available assets");
            }

            if (cartItems.Any(cartItem => cartItem.RequiredByDate.HasValue && cartItem.RequiredByDate.Value < DateTime.Now.Date))
            {
                throw new InvalidOrderException("Required by date cannot be before today.  Please leave blank or choose new date.");
            }

            if ((from cartItem in cartItems
                 let asset = cartItem.Asset
                             let isAvailable = (AssetManager.GetAssetStatusForUser(asset, user) == AssetStatus.Available)
                                               let isRestricted = EntitySecurityManager.IsAssetRestricted(user, asset)
                                                                  where isAvailable && isRestricted && StringUtils.IsBlank(cartItem.Notes)
                                                                  select cartItem).Any())
            {
                throw new InvalidOrderException("Assets requiring approval must have usage notes specified.");
            }
        }
예제 #2
0
        /// <summary>
        /// Creates an order from the user's cart.
        /// </summary>
        public static Order CreateOrderFromCart(User user)
        {
            // Create new cart manager for easy access to cart
            CartManager cm = new CartManager(user);

            // Ensure that the cart contains orderable items
            ValidateCart(cm.CartList, user);

            // Create the order
            Order order = Order.New();

            order.UserId    = user.UserId.GetValueOrDefault();
            order.OrderDate = DateTime.Now;

            // Ensure there's no order items
            Debug.Assert(order.OrderItemList.Count == 0);

            // Now add the cart items to it
            foreach (Cart cartItem in cm.CartList)
            {
                Asset asset = cartItem.Asset;

                // Get the asset status for the cart item
                AssetStatus assetStatus = AssetManager.GetAssetStatusForUser(asset, user);

                // Only add assets that are actually available
                // (Ignore withdrawn and expired assets)
                if (assetStatus == AssetStatus.Available)
                {
                    // Set the order item status based on whether the item is restricted or not
                    bool isRestricted = EntitySecurityManager.IsAssetRestricted(user, asset);

                    // Create new order item
                    OrderItem orderItem = OrderItem.New();

                    // Order items that are for restricted assets are set to awaiting approval
                    // and need to be approved by the user who uploaded them by default
                    // (though this can change, and be reassigned to the BU admin or superadmin,
                    // as per the workflow and scheduled scripts)
                    if (isRestricted)
                    {
                        orderItem.OrderItemStatus  = OrderItemStatus.AwaitingApproval;
                        orderItem.AssignedToUserId = asset.UploadedByUser.GetOrderItemApproverUserId();
                    }
                    else
                    {
                        orderItem.OrderItemStatus  = OrderItemStatus.Preapproved;
                        orderItem.AssignedToUserId = null;
                    }

                    orderItem.AssetId        = cartItem.AssetId;
                    orderItem.Notes          = cartItem.Notes;
                    orderItem.RequiredByDate = cartItem.RequiredByDate;
                    orderItem.CreateDate     = DateTime.Now;
                    order.OrderItemList.Add(orderItem);
                }
            }

            // Save the order
            SaveOrder(order);

            // Log which assets were ordered
            foreach (OrderItem orderItem in order.OrderItemList)
            {
                AuditLogManager.LogAssetAction(orderItem.AssetId, user, AuditAssetAction.Ordered, string.Format("OrderId: {0}", orderItem.OrderId));
            }

            // Log order against user
            AuditLogManager.LogUserAction(user, AuditUserAction.OrderAssets, string.Format("Placed order, with OrderId: {0} containing {1} assets", order.OrderId, order.OrderItemList.Count));

            // Remove the items from the cart
            cm.EmptyCart(false);

            // Complete the order if all items have been processed
            if (AllOrderItemsProcessed(order))
            {
                // Nothing in the order required approval, so automatically complete it
                CompleteOrder(order);
            }
            else
            {
                // Fire event
                if (OrderCreated != null)
                {
                    OrderCreated(null, new OrderEventArgs(order));
                }
            }

            return(order);
        }