public function run()
 {
     $faker = Faker\Factory::create();
     for ($i = 0; $i < 70; $i++) {
         $user = User::where('roles', 'applicant')->get()->shuffle()->first();
         $board = null;
         while (null == $board) {
             $day_type = array('internal' => self::INTERNAL_DAYS, 'external' => self::EXTERNAL_DAYS, 'union' => self::UNION_DAYS);
             $type = $faker->randomElement(['internal', 'external', 'union']);
             $days = $day_type[$type] - 1;
             $from = date_format($faker->dateTimeBetween('-3 months', '+3 months'), 'Y-m-d');
             $end = date('Y-m-d', strtotime("{$from} + {$days} days"));
             $board = Board::where('type', '!=', 'large')->isEmpty($from, $end)->get()->shuffle()->first();
         }
         ApplyRecord::create(array('board_id' => $board->id, 'user_id' => $user->id, 'event_name' => $faker->company(), 'event_type' => $type, 'post_from' => $from, 'post_end' => $end));
     }
     for ($i = 0; $i < 30; $i++) {
         $user = User::where('roles', 'applicant')->get()->shuffle()->first();
         $board = null;
         while (null == $board) {
             $type = $faker->randomElement(['internal', 'external', 'union']);
             $days = self::LARGE_POSTER_DAYS - 1;
             $from = date_format($faker->dateTimeBetween('-3 months', '+3 months'), 'Y-m-d');
             $end = date('Y-m-d', strtotime("{$from} + {$days} days"));
             $board = Board::where('type', 'large')->isEmpty($from, $end)->get()->shuffle()->first();
         }
         ApplyRecord::create(array('board_id' => $board->id, 'user_id' => $user->id, 'event_name' => $faker->company(), 'event_type' => $type, 'post_from' => $from, 'post_end' => $end));
     }
 }
 /**
  * Store a newly created resource in storage.
  *
  * @return Response
  */
 public function store()
 {
     # Config
     $config = Config::get('poster');
     $event_types = $config['event_types'];
     $days = $config['days'];
     # Form Validation
     $rules = array('code' => 'required|exists:boards,code', 'program' => 'required|between:3,32', 'type' => 'required|in:' . implode(',', $event_types), 'from' => 'required|date_format:Y-m-d', 'end' => 'required|date_format:Y-m-d');
     $validator = Validator::make(Input::all(), $rules);
     if ($validator->fails()) {
         return Response::json(['success' => false, 'messages' => $validator->errors()]);
     }
     if (Input::get('from') > Input::get('end')) {
         $msg = 'Begin date is later than end date.';
         return Response::json(['success' => false, 'messages' => $msg]);
     }
     # Poster Status Validation
     $board = Board::where('code', Input::get('code'))->first();
     $from = Input::get('from');
     $end = Input::get('end');
     $days_diff = round((strtotime($end) - strtotime($from)) / 60 / 60 / 24);
     if ($board->getUsingStatus($from, $end)) {
         $msg = 'Board has been applied.';
         return Response::json(['success' => false, 'messages' => $msg]);
     }
     # Days Validation
     if ($board->type == 'large' and $days_diff > $days['large_poster']) {
         $msg = "You can't applied over {$days['large_poster']} days!";
         return Response::json(['success' => false, 'messages' => $msg]);
     }
     if ($days_diff > $days[Input::get('type')]) {
         $msg = "You can't applied over {$days[Input::get('type')]} days!";
         return Response::json(['success' => false, 'messages' => $msg]);
     }
     # Times Validation
     $boards = Board::where('type', $board->type)->lists('id');
     $records = ApplyRecord::date($from, $end)->where('user_id', Auth::id());
     $amount = $records->whereIn('board_id', $boards)->count();
     $quota = Config::get('poster.meanwhile_quota')[$board->type];
     if ($amount >= $quota) {
         return Response::json(['success' => false, 'messages' => 'You can\'t apply more than ' . $quota . ' times in same time.']);
     }
     # Continuously Validation
     if ($board->type != 'stairs') {
         $cold_down = Config::get('poster.cold_down');
         $from_cd = date('Y-m-d', strtotime($from . " - {$cold_down} days"));
         $end_cd = date('Y-m-d', strtotime($end . " + {$cold_down} days"));
         $record_cd = ApplyRecord::where('board_id', $board->id)->date($from_cd, $end_cd)->where('user_id', Auth::id())->count();
         if ($cold_down != 0 and 0 < $record_cd) {
             $msg = 'You can\'t apply same board continuously.';
             return Response::json(['success' => false, 'messages' => $msg]);
         }
     }
     # Create
     ApplyRecord::create(['board_id' => $board->id, 'user_id' => Auth::id(), 'event_name' => Input::get('program'), 'event_type' => Input::get('type'), 'post_from' => $from, 'post_end' => $end]);
     return Response::json(['success' => true]);
 }