میخواهیم یک فروشگاه آنلاین را پیادهسازی کنیم که در آن کالاهایی برای فروش بگذاریم و کاربران آنها را خریداری کنند و نظرات خود را راجع به کالاها بگذارند. بخشی از کد فروشگاه توسط فردی زده شدهاست و در حال حاضر در دسترس نیست. شما باید به آن امکاناتی اضافه کنید.
داخل پروژه ۲ فایل پایتون با نامهای `models.py` و `store.py` است. شما باید توابع ناقص فایل `store.py` را تکمیل کنید.
```python store.py
from models import Product, User
class Store:
def __init__(self):
self.products = dict()
self.users = list()
def add_product(self, product, amount=1):
self.products[product] = self.products.get(product, 0) + amount
def remove_product(self, product, amount=1):
pass
def add_user(self, username):
pass
def get_total_asset(self):
pass
def get_total_profit(self):
pass
def get_comments_by_user(self, user):
pass
def get_inflation_affected_product_names(self):
pass
def clean_old_comments(self, date):
pass
def get_comments_by_bought_users(self, product):
pass
```
## جزئیات پروژه
داخل کلاس `Store` چند تابع وجود دارد که نیاز به تکمیل دارند. همچنین `object` آن دارای کالاهای موجود و کاربران ثبت نام شدهاست. کالاها به صورت `dictonary` ذخیره شدهاند که هر `key` آن یک کالا(`Product`) است و هر `value` آن تعداد موجودی آن کالاست. کاربران هم به صورت `list` ذخیره شدهاند.
وظیفهی شما این است که توابع زیر را برای کلاس `Store` پیادهسازی کنید.
<details class="green">
<summary> **تابع** `remove_product` </summary>
این تابع وظیفهی حذف کالا از فروشگاه را دارد.در صورت موجود نبود این تعداد کالا، استثایی با پیام `Not Enough Products` پرتاب شود و هیچ کالایی از فروشگاه حذف نشود. در صورتی که موجودی یک کالا به صفر برسد باید از دیکشنری کالاها حذف شود.
</details>
<details class="green">
<summary> **تابع** `add_user` </summary>
این تابع یک کاربر را به کاربران اضافه میکند. در صورتی که نام کاربری تکراری باشد کاربری اضافه نمیکند و مقدار `None` بر میگرداند؛ در غیر این صورت، رشتهی نام کاربری آن کاربر را برمیگرداند.
</details>
<details class="green">
<summary> **تابع** `get_total_asset` </summary>
این تابع جمع کل داراییهای فروشگاه را برمیگرداند (دارایی فروشگاه برابر مجموع قیمت کالاهای موجود است.)
</details>
<details class="green">
<summary> **تابع** `get_total_profit` </summary>
این تابع مقدار سودی که فروشگاه کردهاست را برمیگرداند. مقدار سود فروشگاه برابر جمع قیمت کالاهای فروختهشده است. ( تعداد هریک از کالاهای لیست `bought_products` در کلاس `User` یک است.)
</details>
<details class="green">
<summary> **تابع** `get_comments_by_user` </summary>
این تابع لیست **متن** نظراتی که یک کاربر خاص روی محصولات موجود در فروشگاه گذاشتهاست را بر میگرداند (ترتیب آنها مهم نیست)
</details>
<details class="green">
<summary> **تابع** `get_inflation_affected_product_names` </summary>
این تابع لیستی از **نام** کالاهایی که تورم روی آنها تاثیر گذاشتهاست را برمیگرداند. (تورم روی کالاهایی اثر گذاشتهاست که کالایی هم اسم آنها ولی با قیمت کمتر داخل فروشگاه وجود داشتهباشد). توجه کنید که اگر چند قیمت از یک کالا موجود باشد، نام آن فقط یک بار باید در لیست بیاید. ترتیب اعضای لیست اهمیتی ندارد.
</details>
<details class="green">
<summary> **تابع** `clean_old_comments` </summary>
این تابع ورودی یک تاریخ از نوع `datetime` میگیرد و همهی نظراتی که قبل از آن تاریخ روی پستها گذاشته شدهاند را حذف میکند.
</details>
<details class="green">
<summary> **تابع** `get_comments_by_bought_users` </summary>
این تابع لیستی از **متن** نظراتی را بر میگرداند که صاحب آن، کالا را خریداری کردهاست.
</details>
## نکات
+ میتوانید فایل اولیه این سوال را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/21206/) دریافت کنید.
+ توابع شما نباید مقداری را چاپ کنند، بلکه باید مقادیر مورد نظر را بازگردانند.
+ شما تنها مجاز به تغییر فایل `store.py` هستید.
## نحوه ارسال
شما باید کلاس `Store` موجود در فایل `store.py` را تکمیل و سپس این فایل را ارسال کنید.