برای یک فروشگاه موبایل، با کمک شما قصد داریم برنامه مدیریت این فروشگاه را طراحی کنیم.
کالاهای این فروشگاه موبایل های با برند Apple ،htc و Samsung هستند.
----------
# فایل های اولیه
**در صورت سوال نام توابع برای python توضیح داده شده برای بقیه زبانها نیز مشابه میباشد.**
ابتدا فایل مربوط به خود را دانلود کرده و محتوای آن را ببینید (همچنین ورودی ها و خروجی های توابع) :
**فایلهای مربوط به زبان python : ** [دریافت](http://bayanbox.ir/download/6672722507619215381/initial-python-2.zip)
**فایلهای مربوط به زبان java: ** [دریافت](http://bayanbox.ir/download/5624849933454820033/initial-java-2.zip)
**فایلهای مربوط به زبان C#: ** [دریافت](http://bayanbox.ir/download/991252906425990967/MobileStore-csharp-2.zip)
----------
# امکانات فروشگاه
+ در بعضی از ماه های سال این فروشگاه بر روی کل محصولات خود درصدی تخفیف میدهد.
+ **علاوه بر تخفیف کلی** هر کدام از برند ها هم تخفیف مخصوص خود را دارند.
+ این فروشگاه بعد از فروختن بعضی از گوشی ها، درصورتی که مشتری یکسری شرایط را داشته باشد آنها را پس میگیرد.
----------
# ساختار کلاس ها
برای هر کدام از کلاسها تعدادی از تابعهایی که نیاز به توضیح داشته باشند توضیح آمده است.
**ویژگی های کلاس Mobile :** نام، قیمت
+ `can_purchase`: چک میکند که آیا کاربر مشخص شده در ماه مشخص شده قادر به خرید این موبایل هست یا خیر. توجه کنید اگر این تابع `True` برگرداند یعنی امکان خرید این محصول توسط کاربر وجود دارد و بلافاصله میتوان عملیات خرید را انجام داد.
+ `reverse_payment_price`: قیمتی که قرار است در حالت بازگشت محصول برگردانده شود را برمیگرداند. این تابع توسط کلاس `Shop` فراخوانی میشود.
+ `get_final_price`: قیمت موبایل را با احتساب تخفیفهای مختلف محاسبه کرده، برمیگرداند. توجه کنید اگر دو تخفیف به یک محصول تعلق بگیرد تخفیفها در هم ضرب میشوند مثلا جنس ۱۰۰۰ تومانی پس از دو تخفیف ۱۰ درصدی ۸۱۰ تومان خواهد بود. تست ها طوری طراحی میشوند که مقادیر پس از تخفیف اعشاری نباشند.
**ویژگی های کلاس Shop :** موبایل های موجود فروشگاه، درآمد فروشگاه (موجودی)
+ `get_available_mobile_count`: تعداد mobile هایی که فروشگاه دارد را برمیگرداند.
+ `get_available_mobile_of_type`: تعداد mobile هایی از نوع ورودی که در فروشگاه وجود دارد را برمیگرداند.
+ `add_number_of_mobile`: به تعداد ورودی به موجودی موبایلی که در ورودی آمده است به فروشگاه اضافه میکند.
+ `remove_one_mobile`: یکی از موجودی موبایلهای از نوع ورودی فروشگاه کم میکند.
+ `buy_mobile_request`: موبایل مورد نظر به کاربر فروخته میشود. باید موجودی کاربر کم شده، موبایل مورد نظر از لیست دارایی های فروشگاه حذف شود و به لیست موبایل های خریده شده کاربر اضافه شود. اگر درست انجام شود `True` وگرنه `False` برمیگرداند.
+ `giveback_request`: فروشگاه موبایل مورد نظر را پس میگیرد. موبایل بازگشته شده باید از موبایل های خریداری شده کاربر حذف شده و به موجودی فروشگاه اضافه شود. همچنین موجود (پول) کاربر و فروشگاه نیز باید به درستی تغییر کند. اگر درست انجام شود `True` وگرنه `False` برمیگرداند.
+ `get_instance`: کلاس Shop باید singleton باشد و تنها نمونهی آن، از طریق این تابع بازگردانده میشود.
**ویژگی های کلاس User :** نام، موبایل های خریده شده، سن، مقدار پول
+ `get_mobile_count`: تعداد موبایلهای فرد را برمیگرداند.
+ `get_mobiles`: یک dict برمیگرداند که کلید آن موبایل و مقدار هر کدام تعداد از این نوع موبایل است.
+ `purchase`: درخواست خرید موبایل مورد نظر را به فروشگاه میدهد.
+ `refund`: مبلغ مشخص شده را به کاربر بازمیگرداند.
+ `has_mobile_in_month`: اگر کاربر اکنون موبایلی از نوع ورودی دارد که در ماه ورودی خریده باشد مقدار `True` وگرنه `False` برمیگرداند.
----------
## شرایط تخفیف کلی فروشگاه
در سه ماه تابستان این فروشگاه ۱۰ درصد به مشتریان تخفیف میدهد.
----------
## گوشی های htc
+ اگر مشتری اکنون گوشی اپل نداشته باشد این فروشگاه گوشی htc را پس میگیرد و تمام پول مشتری را پس میدهد.
+ اگر مشتری اکنون هیچ گوشی ای نداشته باشد و الان برندی که میخرد htc باشد این فروشگاه 15 درصد به او تخفیف میدهد.
+ اگر کلمه `iran` در اسم فرد باشد (به همین صورت و با حروف کوچک) این شرکت به او گوشی نمیفروشد. مثلا اگر کسی اسمش `moiraniom` باشد این شرکت به او گوشی نمیفروشد. چون شاید با گوشی اورانیم غنی کند!
## گوشی های Samsung
+ اگر تمام گوشی های خریده شده مشتری از سامسونگ باشد این فروشگاه گوشی Samsung را پس میگیرد و تمام پول مشتری را پس میدهد. توجه کندی که باید در لحظه پس دادن همه گوشیها از نوع سامسونگ باشند.
+ این فروشگاه در ماه های اسفند و فروردین ۱۰ درصد به مشتری تخفیف میدهد.
## گوشی های Apple
+ این برند در هر صورتی گوشی مشتری را پس میگیرد ولی ۹۰ درصد پول آن را به مشتری برمیگرداند.
+ اگر مشتری تا به حال گوشی Samsung و htc نخریده باشد این فروشگاه به او 10 درصد تخفیف میدهد.
+ اگر سن مشتری کوچکتر مساوی 15 سال باشد این فروشگاه به او گوشی Apple نمیفروشد!!!
----------
# نکات و راهنمایی ها
+ هنگام فروش موبایل باید حواستان به موجودی حساب فروشگاه و موجودی حساب مشتری باشد!
+ برای راحتی مسئله گوشی دست دوم نداریم و گوشی ای که پس گرفته میشود فرقی با گوشی ای تا به حال فروخته شده ندارد.
+ فروشگاه وقتی گوشی را پس میگیرد به اندازه قیمتی که مشتری داده به مشتری پول میدهد مثلا اگر قیمت گوشی ۲۰۰۰ (دلار!) باشد و مشتری با تخفیف آن را ۱۶۰۰ خریده هنگام پس دادن ۱۶۰۰ دریافت میکند (البته برای گوشی های Apple نود درصد قیمت یعنی ۱۴۴۰ دریافت میکند)
+ مثال برای تخفیف دومرحله ای این گونه است: فرض کنید در ماه تابستان قرار داریم و همچنین مشتری تا به حال گوشی samsung و htc نخریده و قصد خرید apple دارد؛ در این صورت فروشگاه باید یکبار ۱۰ درصد و بار دیگر از قیمت بدست آمده ۱۰ درصد تخفیف دهد. مثلا جنس ۱۰۰۰ تومانی پس از دو تخفیف ۱۰ درصدی ۸۱۰ تومان خواهد بود. تست ها طوری طراحی میشوند که مقادیر پس از تخفیف اعشاری نباشند.
+ نکته مهم آنکه هرگاه فرد بخواهد گوشی را پس بدهد با وضعیت فعلی او گوشی پس گرفته میشود یعنی مثلا برای گوشیهای سامسونگ در لحظه پس دادن باید تمام گوشیهای فرد از نوع سامسونگ باشد.
# نکات پیاده سازی
+ کلاس Shop باید singleton باشد و تنها نمونهی آن، از طریق متد get_instance قابل دسترس باشد.
+ تمامی توابع مشخص شده در کلاس ها باید پیاده سازی شوند.
+ برای پیاده سازی این سوال لازم است خودتان فیلد هایی را به کلاس های کاربر و فروشگاه اضافه کنید. نام این فیلد ها و نوعشان مهم نیست. تنها برنامه در مجموع باید کارا باشد.
+ نام موبایل مشخص کننده مدل آن است. برند موبایل را نوع کلاس های فرزند مشخص میکنند.
# نکات ارسال
توجه داشته باشید که تمام فایلها باید در ریشه فایل zip باشند برای c# بایستی `MobileStore.csproj` در ریشه فایل zip قرار گیرد. یعنی پس از باز کردن فایل zip تمامی فایل کلاسها قابل مشاهده باشد.