def test_calculate_product_discount_percentage(self):
     store = Store('effect', 123, 123, None, None)
     discount = DiscountService()
     apple = Product('apple', 'fruit', ['green', 'sweet'], 5)
     shopping_cart = ShoppingCart(store)
     start_date = datetime.datetime(2016, 2, 1, 12, 12, 12, 12)
     end_date = datetime.datetime(2020, 2, 1, 12, 12, 12, 12)
     discount.store_discount = ('StoreDiscount', 10, True, start_date,
                                end_date)
     discount.add_product_discount(apple,
                                   20,
                                   True,
                                   start_date,
                                   end_date,
                                   coupon_code=123)
     x = discount.calculate_product_discount_percentage(
         apple, shopping_cart)
     self.assertEqual(x[0], 30)
     self.assertEqual(x[1], ['CouponDiscount', 'StoreDiscount'])
     discount.add_product_discount(apple, 45, False, start_date, end_date)
     x = discount.calculate_product_discount_percentage(
         apple, shopping_cart)
     self.assertEqual(x[0], 45)
     self.assertEqual(x[1], ['RegularDiscount'])
示例#2
0
class ShoppingCart:
    def __init__(self, store_number, products):
        self.store_number = store_number
        self.products = products
        self.discount_service = None
        self.build_discount_service()

    def build_discount_service(self):
        self.discount_service = DiscountService()
        discount = get_reg_discount_of_store_db(self.store_number)
        if not (discount is False):
            self.discount_service.add_store_discount(
                discount[1], discount[2],
                datetime.datetime.strptime(discount[3], '%Y-%m-%d'),
                datetime.datetime.strptime(discount[4], '%Y-%m-%d'))
        for p in self.products:
            discount = get_reg_discount_of_product_db(p[0])
            print('discount: ', discount)
            if not (discount is False):
                self.discount_service.add_product_discount(
                    discount[0], discount[1], discount[2],
                    datetime.datetime.strptime(discount[3], '%Y-%m-%d'),
                    datetime.datetime.strptime(discount[4], '%Y-%m-%d'))
            discount = get_cond_discount_of_product_db(p[0])
            if not (discount is False):
                self.discount_service.add_product_discount(
                    discount[0],
                    discount[1],
                    discount[2],
                    datetime.datetime.strptime(discount[3], '%Y-%m-%d'),
                    datetime.datetime.strptime(discount[4], '%Y-%m-%d'),
                    condition=(discount[5], p[0], discount[6]))
            discount = get_coupon_discount_of_product_db(p[0])
            if not (discount is False):
                self.discount_service.add_product_discount(
                    discount[0],
                    discount[1],
                    discount[2],
                    datetime.datetime.strptime(discount[3], '%Y-%m-%d'),
                    datetime.datetime.strptime(discount[4], '%Y-%m-%d'),
                    coupon_code=123)

        print('\nproduct_discount_table: ',
              self.discount_service.product_discount_table)
        print('\nstore_discount: ', self.discount_service.store_discount)

    def calculate_price(self):
        price_sum = 0
        for product_dict in self.products:
            discount_percentage = \
                self.discount_service.calculate_product_discount_percentage(product_dict[0], self)
            discount_percentage = discount_percentage[0]

            print('\ndiscount_percentage:', discount_percentage)

            if discount_percentage > 80:
                discount_percentage = 80
            price_sum += (product_dict[2] * (
                (100 - discount_percentage) / 100)) * product_dict[1]
        return price_sum

    def contains_product(self, catalog_number):
        for p in self.products:
            if p[0] == catalog_number:
                return True
        return False