diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eebc23c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__/ +*.__pycache__ +.pytest_cache/ \ No newline at end of file diff --git a/shoe_store/logic/__init__.py b/shoe_store/logic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/shoe_store/logic/product_calculator.py b/shoe_store/logic/product_calculator.py new file mode 100644 index 0000000..0b244b2 --- /dev/null +++ b/shoe_store/logic/product_calculator.py @@ -0,0 +1,44 @@ +"""Расчет показателей товара для каталога.""" + +from datetime import timedelta + +DISCOUNT_PERCENT = 25 +MANY_QUANTITY_THRESHOLD = 5 + + +def calculate_discounted_price(price, order_dates, calculation_date): + """Возвращает цену товара с учетом скидки. + + Скидка 25% предоставляется, если в предыдущем календарном месяце + (относительно даты расчета) по товару не было заказов. + + :param price: цена товара в рублях + :param order_dates: список дат заказов товара (datetime.date), может быть пустым + :param calculation_date: дата расчета (datetime.date) + :return: цена с учетом скидки, округленная до копеек + """ + if price < 0: + raise ValueError("Цена не может быть отрицательной.") + + current_month_start = calculation_date.replace(day=1) + previous_month_start = (current_month_start - timedelta(days=1)).replace(day=1) + has_orders_in_previous_month = any( + previous_month_start <= order_date < current_month_start + for order_date in order_dates + ) + + if has_orders_in_previous_month: + return price + return round(price * (100 - DISCOUNT_PERCENT) / 100, 2) + + +def get_quantity_label(total_quantity): + """Возвращает «много», если пар больше пяти, иначе «мало». + + :param total_quantity: количество пар суммарно по всем размерам + """ + if total_quantity < 0: + raise ValueError("Количество не может быть отрицательным.") + if total_quantity > MANY_QUANTITY_THRESHOLD: + return "много" + return "мало" diff --git a/shoe_store/tests/__init__.py b/shoe_store/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/shoe_store/tests/test_product_calculator.py b/shoe_store/tests/test_product_calculator.py new file mode 100644 index 0000000..088de04 --- /dev/null +++ b/shoe_store/tests/test_product_calculator.py @@ -0,0 +1,34 @@ +from datetime import date +from logic.product_calculator import calculate_discounted_price, get_quantity_label + + +def test_discounted_price_no_orders_in_previous_month_returns_price_with_discount(): + price = 2000 + order_dates = [] + calculation_date = date(2027, 6, 15) + + result = calculate_discounted_price(price, order_dates, calculation_date) + + assert result == 1500 + + +def test_discounted_price_order_in_previous_month_returns_price_without_discount(): + price = 2000 + order_dates = [date(2027, 5, 10)] + calculation_date = date(2027, 6, 15) + + result = calculate_discounted_price(price, order_dates, calculation_date) + + assert result == 2000 + + +def test_quantity_label_five_pairs_returns_few(): + result = get_quantity_label(5) + + assert result == "мало" + + +def test_quantity_label_six_pairs_returns_many(): + result = get_quantity_label(6) + + assert result == "много" \ No newline at end of file diff --git a/shoe_store/tests_result.png b/shoe_store/tests_result.png new file mode 100644 index 0000000..1916260 Binary files /dev/null and b/shoe_store/tests_result.png differ