github.com/ismailbayram/bigpicture@v0.0.0-20231225173155-e4b21f5efcff/internal/browser/pyproject/baskets/strategies.py (about)

     1  from baskets.models import DiscountItem, BasketItem
     2  from reservations.enums import ReservationStatus
     3  
     4  
     5  class BasePromotionStrategy:
     6      def __init__(self, campaign, basket):
     7          self.basket = basket
     8          self.campaign = campaign
     9          self.remaining = 0
    10  
    11      def check(self):
    12          raise NotImplementedError()
    13  
    14      def get_discount_amount(self, basket_item):
    15          raise NotImplementedError()
    16  
    17      def apply(self):
    18          raise NotImplementedError()
    19  
    20  
    21  class OneFreeInNineStrategy(BasePromotionStrategy):
    22      def check(self):
    23          res_count = self.basket.customer_profile.reservation_set.filter(status=ReservationStatus.completed).count()
    24          if res_count != 0 and res_count % 9 == 0:
    25              return True
    26          self.remaining = 9 - (res_count % 9)
    27          return False
    28  
    29      def get_discount_amount(self, basket_item):
    30          product = basket_item.product
    31          return product.price(basket_item.basket.car.car_type)
    32  
    33      def apply(self):
    34          try:
    35              basket_item = self.basket.basketitem_set.get(product__is_primary=True)
    36              if basket_item.discount_item:
    37                  return
    38          except BasketItem.DoesNotExist:
    39              return
    40          DiscountItem.objects.create(campaign=self.campaign, basket=self.basket, basket_item=basket_item,
    41                                      amount=self.get_discount_amount(basket_item))