میخواهیم یک سایت برای خودکار کردن فرایند فروش بلیتهای سینما بنویسیم.
در این سایت امکان مشاهده فیلمهای در حال اکران وجود دارد.
کاربران میتوانند عضو سایت شوند و پس از ورود به سایت
برای هر فیلم صندلی موردنظر را رزرو کند.
بخشی از این پروژه نوشته شده است. از شما میخواهیم این پروژه را تکمیل کنید.
# پروژه اولیه
پروژه اولیه را از [اینجا](http://bayanbox.ir/download/2962970233113283136/Blit-initial.zip) دانلود کنید. ساختار این پروژه به شرح زیر است:
```
cinema
├── app
│   ├── ...
│   ├── Http
│   │   └── Controllers
│   │       ├── MovieController.php
│   │       ├── StatsController.php
│   │       └── ...
│   ├── User.php
│   ├── Movie.php
│   ├── Seat.php
│   ├── Ticket.php
├── ...
├── datbase
│   ├── ...
│   ├── seeds
│   ├── migrations
│   └── ...
├── routes
│   ├── ...
│   └── web.php
...
```
# جزئیات
در این سوال لازم است علاوه بر ایجاد seed ها، تغییراتی در Controller ها و route ها ایجاد کنید.
سه مدل به شرح زیر وجود دارد:
۱. مدل `Movie` شامل فیلدهای زیر:
* `title`: نام فیلم
* `release_year`: سال میلادی انتشار فیلم
* `play_time`: زمان اکران فیلم در سالن
 
۲. مدل `Seat` شامل فیلد زیر:
* `number`:  شماره صندلی
۳. مدل `Ticket`شامل فیلدهای زیر:
* `movie`: فیلمی که این بلیت برای آن فروخته شده است
* `user`: کاربری که این بلیت را خریده است
* `seat`: صندلی مربوط به این بلیت
* `date_bought`: تاریخی که بلیت خریده شده است
قرار است همه صندلیهای سالن و لیست فیلمها در ابتدا با استفاده از seed
به پایگاه داده اضافه شود. سپس به ازای هر بلیتی که فروخته میشود
یک شیٔ از مدل `Ticket` ساخته میشود.
مواردی که باید انجام دهید:
### ۱. نوشتن seed
از شما میخواهیم در پوشه `database/seeds` دو seed با نام کلاس
`Movies` و `Seats`
ایجاد کنید.  
+ بعد از اجرای `seed` ها میخواهیم مقادیر زیر برای مدل `Movie` در دیتابیس ایجاد شده باشد: 
زمان اکران را به صورت native (بدون TimeZone) تعریف کنید.
| id  |  نام فیلم  |   سال انتشار  |  تاریخ اکران    |     ساعت اکران        |
|:---:|:----------:|:-------------:|:-------------:|:-------------------:|
|  1  | Children of heaven |  1997  |  2018/4/20  |  22:00  |
|  2  |  About Elly  | 2009  |  2018/4/20  |  20:00   |
|  3  | A separation | 2011  |  2018/4/22 | 18:00  |
|  4  | The salesman | 2016  | 2018/4/21  |  18:00  |
|  5  | The Elephant king | 2017  | 2018/4/21 | 20:00  |
+ برای `Seat` نیز میخواهیم بعد از اجرای `seed` مربوطهاش ۱۰ صندلی با آیدی ۱ تا ۱۰ و شمارهصندلی ۳۱ تا ۴۰ ایجاد شود.
توجه کنید به هنگام داوری `seed` ها با دستور 
`artisan db:seed --class=CLASS_NAME`
اجرا میشوند پس حتما اسم کلاسها را مطابق اسمی که در صورت سوال گفته شده است قرار دهید.
### ۲. نمایش صندلیها
در این قسمت باید `Controller` مربوط به قسمت نمایش صندلیها را به نحوی تغییر دهید که فقط صندلیهایی که برای آن فیلم هنوز رزرو نشدهاند را نمایش دهد نه همه صندلیها را.
 
### ۳. رزرو صندلی
با توجه به توضیحات زیر، Controller ها را تکمیل کنید.
برای رزرو صندلی، کاربر مراحل زیر را انجام میدهد:
+ ابتدا از آدرس `/movies` بازدید میکند که لیست فیلمهایی که در حال اکران هستند
را نمایش میدهد. سپس روی فیلم مورد نظر خود کلیک کرده و صفحهی بعدی صندلیهای رزرو
نشده برای آن فیلم را نمایش میدهد. تا این مرحله کاربر نیازی به login بودن ندارد.
+ وقتی کاربر روی یکی از صندلیها کلیک کرد:
  + اگر کاربر login است، صندلی برای کاربر
  رزرو شده و دوباره به صفحهی صندلیهای همان فیلم *redirect* میشود تا
  بتواند صندلیهای دیگری را نیز رزرو کند.
  + اگر کاربر login نیست،
  به صفحهی *login* هدایت میشود و پس از وارد شدن به سایت،
  بلافاصله به صفحهی قبلی (صفحه لیست صندلیها) *redirect* میشود،
  و صندلی رزرو میشود.
  +  در صفحهی *login* اگر کاربر روی لینک *register* کلیک کرد و در سایت
  عضو شد، باید بلافاصله پس از عضویت به طور خودکار در سایت login شود
  و به صفحه لیست فیلمها *redirect* شود.
### ۴. گزارش گیری سایت
در این قسمت شما باید view مربوط به آدرس `stats` را به نحوی کامل کنید
که در پاسخ برای همه صندلیهای که حداقل
برای یک فیلم رزرو شدهاند (به ترتیب `id` صندلی)،
یک خروجی JSON به شکل زیر بازگردد:
```json
[{"seat__number": 31, "total": 3}, {"seat__number": 32, "total": 1}, ... ]
```
+ مقدار *total*، تعداد رزروهای صندلی مشخص شده است.
+ این *view* تنها باید برای افرادی که لاگین کردهاند فعال باشد و برای سایر افراد
خطای ۴۰۳ (Forbidden) برگرداند.
# نکات
+ برای حل سوال تنها فایلهایی که باید تغییر کنند فایلهای مربوط به `Controller` ها و در صورت نیاز فایل مربوط به `route` ها هستند.
+ فایلهای مربوط به `seed` ها را با اسم گفته شده در پوشه `database/seeds` قرار دهید.
+ اگر فایل `route` را تغییر دادید، نام یا آدرس `route` های موجود در فایل را تغییر ندهید. تغییراتی که شما روی پروژه انجام میدهید نباید باعث شود کاربری اصلی پروژه مختل شود.
+ همانطور که در سوال مشخص شده است، کاربر باید امکان ورود و خروج و ثبتنام در سایت را داشته باشد. برای اینکار از سیستم `Auth` از پیش آماده شده لاراول استفاده کنید و `route` های مربوطهاش را در فایل روتها اضافه کنید.
+ در قسمتهایی از سوال که گفته شده `redirect` انجام شود، حتما عملیات را به صورت `redirect` انجام دهید.
+  بدون پوشهی vendor  به صورت پس از اعمال تغییرات، کل پروژه را Zip  ارسال کنید.
+ نام فایل Zip اهمیت ندارد.
  
    
      ارسال پاسخ برای این سؤال
    
    
  
  
    
      در حال حاضر شما دسترسی ندارید.