示例#1
0
        /// <summary>
        /// Check out a shopping cart
        /// </summary>
        /// <param name="purchaseItemList"></param>
        /// <param name="customer"></param>
        /// <param name="payment"></param>
        /// <param name="shippingMethod"></param>
        public static CustomerOrder Checkout(IPurchaseItemList purchaseItemList, CustomerBase customer, IPaymentMethod payment, IShippingMethod shippingMethod)
        {
            var customerOrder = new CustomerOrder();
            customerOrder.OrderDateTime = DateTime.Now;
            purchaseItemList.Items.ForEach(i => customerOrder.Items.Add(i.Clone()));
            customerOrder.Customer = customer;
            customerOrder.Status = EOrderStatus.Processing;
            customerOrder.ShippingMethod = shippingMethod.MethodName();
            customerOrder.PaymentMethod = payment.PaymentName();
            customerOrder.ProductCost = purchaseItemList.GetTotalPrice();
            customerOrder.ShippingCost = GetShippingCost(customer, shippingMethod);
            customerOrder.TotalCost = customerOrder.ProductCost + customerOrder.ShippingCost;

            payment.Charge(customerOrder.TotalCost);

            //todo : persist order

            return customerOrder;
        }
示例#2
0
        public static void CancelOrder(CustomerOrder order)
        {
            if (order == null)
            {
                throw new Exception("Order is not set in CancelOrder method.");
            }

            if (order.Status == EOrderStatus.Shipped)
            {
                throw new ShippedOrderCanNotBeCancelledException();
            }

            if (order.Status == EOrderStatus.Processing)
            {
                order.Status = EOrderStatus.Cancelled;
                //todo: persist order

                //todo: refund payment
                //var paymentMethod = PaymentMethodFactory.GetPaymentMethod(order.PaymentMethod);
                //paymentMethod.Refund(order.TotalCost);
            }
        }
示例#3
0
        public static void ShipOrder(CustomerOrder order)
        {
            order.Status = EOrderStatus.Shipped;

            //todo : persist order
        }