Advertisement
sergioivashyn

Untitled

Feb 9th, 2023 (edited)
834
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.65 KB | None | 0 0
  1. from dataclasses import dataclass
  2.  
  3. CONSTANT_TERM_RANGE_MIN: int = 1
  4. CONSTANT_TERM_RANGE_MAX: int = 9999999999
  5. CONSTANT_KEY: str = f'{CONSTANT_TERM_RANGE_MIN}_{CONSTANT_TERM_RANGE_MAX}'
  6.  
  7.  
  8. @dataclass
  9. class PriceType:
  10.     term_range_min: int
  11.     term_range_max: int
  12.     price: int
  13.  
  14.     @property
  15.     def days_in_range(self) -> int:
  16.         return self.term_range_max - self.term_range_min + 1
  17.  
  18.     def calculate_sum(self, days_count: int):
  19.         range_len: int = self.days_in_range if days_count >= self.days_in_range else days_count
  20.         result: int = range_len * self.price
  21.         return result
  22.  
  23.     def __str__(self):
  24.         return f'{self.term_range_min}_{self.term_range_max}'
  25.  
  26.  
  27. def get_item_sum(days_count: int, price_types: list[PriceType]) -> int:
  28.     """
  29.    Функция реализует для бизнеса просчет стоимости аренды инструмента в зависимости от количества дней (days_count)
  30.    и промежутков оплаты аренды (price_types)
  31.    (
  32.    К примеру клиент арендует инструмент на 9 дней
  33.    В первом промежутке за 1 и 3-й день клиент заплатит 600 грн (по 200 грн в день)
  34.    Во втором за 4 - 7-й день 190 грн день клиент заплатит 760 грн (по 190 грн в день)
  35.    В третьем 8-й и 9-й - 300 грн (по 150 грн в день)
  36.    В сумме клиент заплатит 600 + 760 + 300 = 1660
  37.    Но, если промежуток аренды равен от 1 до максимального кол ва дней (константа с 1С) то просто перемножаем кол во дней
  38.     и сумму.
  39.    )
  40.    :param days_count:
  41.    :param price_types:
  42.    :return int:
  43.    """
  44.     if len(price_types) == 1 and str(price_types[0]) == CONSTANT_KEY:
  45.         return days_count * price_types[0].price
  46.     price_sum: int = 0
  47.     i: int = 0
  48.     new_days_count: int = days_count
  49.     new_price_types: list[PriceType] = sorted(price_types, key=lambda x: x.term_range_max)
  50.     while new_days_count > 0:
  51.         price_sum += new_price_types[i].calculate_sum(new_days_count)
  52.         new_days_count -= new_price_types[i].days_in_range
  53.         i += 1
  54.     return price_sum
  55.  
  56.  
  57. arr: list[PriceType] = [
  58.     PriceType(term_range_min=1, term_range_max=3, price=200),
  59.     PriceType(term_range_min=4, term_range_max=7, price=190),
  60.     PriceType(term_range_min=8, term_range_max=CONSTANT_TERM_RANGE_MAX, price=150),
  61. ]
  62. days_in_rent: int = 9
  63. print(get_price_sum(days_in_rent, arr))
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement