/**
  * Display a listing of the resource.
  * GET /reservations
  *
  * @return Response
  */
 public function getIndex()
 {
     $execResult = ['updated' => 0, 'created' => 0, 'bookings' => 0, 'cancelled' => 0, 'not_mapped' => 0];
     $propertiesChannels = PropertiesChannel::where('property_id', Property::getLoggedId())->get();
     foreach ($propertiesChannels as $channelSettings) {
         Log::debug($channelSettings);
         $channel = ChannelFactory::create($channelSettings);
         $result = $channel->getReservations();
         Log::debug($result);
         if ($result['reservations']) {
             foreach ($result['reservations'] as $reservation) {
                 $reservation['channel_id'] = $channelSettings->channel_id;
                 $reservation['property_id'] = $channelSettings->property_id;
                 $resModel = Reservation::getByKeys($channelSettings->channel_id, $channelSettings->property_id)->where('res_id', $reservation['res_id'])->first();
                 if (isset($reservation['cc_details']) && !empty($reservation['cc_details'])) {
                     $reservation['cc_details'] = Crypt::encrypt($reservation['cc_details']);
                 }
                 switch ($reservation['status']) {
                     case 'cancelled':
                         if ($resModel) {
                             $resModel->status = 'cancelled';
                             if ($reservation['res_cancel_fee']) {
                                 $resModel->res_cancel_fee = $reservation['res_cancel_fee'];
                             }
                             $resModel->cancelled_at = $resModel->freshTimestamp();
                             $resModel->save();
                             $execResult['cancelled']++;
                             //TODO: send email about cancellation
                         }
                         break;
                     case 'booked':
                         $needAddRooms = true;
                         if ($resModel) {
                             if (isset($reservation['modified']) && $reservation['modified']) {
                                 $resModel->update($reservation);
                                 $execResult['updated']++;
                                 $resModel->bookings()->delete();
                                 //TODO: send email about modification
                             } else {
                                 $needAddRooms = false;
                             }
                         } else {
                             $resModel = Reservation::create($reservation);
                             $execResult['created']++;
                         }
                         if ($reservation['rooms'] && $needAddRooms) {
                             foreach ($reservation['rooms'] as $room) {
                                 $room['reservation_id'] = $resModel->id;
                                 $room['channel_id'] = $reservation['channel_id'];
                                 $room['property_id'] = $reservation['property_id'];
                                 $mapping = InventoryMap::getMappedRoom($channelSettings->channel_id, $channelSettings->property_id, $room['inventory'], isset($room['plan']) ? $room['plan'] : null)->first();
                                 if ($mapping) {
                                     $room['room_id'] = $mapping->room_id;
                                 } else {
                                     $execResult['not_mapped']++;
                                     //TODO: send email about NOT MAPPED ROOM
                                 }
                                 Booking::create($room);
                                 $execResult['bookings']++;
                             }
                         }
                         break;
                 }
                 if ($resModel && $resModel->id) {
                     $type = $resModel->status;
                     if ($type != 'cancelled' && $resModel->modified) {
                         $type = 'modify';
                     }
                     $channel->setReservationConfirmation($resModel->id, $resModel->res_id, $type);
                 }
             }
         }
     }
     return View::make('index', compact('execResult'));
 }
 public function postUpdateRates()
 {
     $rules = ['from_date' => 'required|date_format:Y-m-d|after:' . date('Y-m-d', strtotime('yesterday')), 'to_date' => 'required|date_format:Y-m-d|after:' . date('Y-m-d', strtotime('yesterday')), 'week_day' => 'required', 'rooms' => 'required', 'rate' => 'required|numeric|min:0', 'single_rate' => 'numeric|min:0'];
     $validator = Validator::make($data = Input::all(), $rules);
     if ($validator->fails()) {
         return Response::json(['success' => false, 'errors' => $validator->getMessageBag()->toArray()], 400);
         //400 - http error code
     }
     //all ok so get rooms and plans mapping
     $weekDays = $data['week_day'];
     $errors = [];
     $property = Property::findOrFail(Property::getLoggedId());
     foreach ($data['rooms'] as $roomId) {
         //get room data
         $room = Room::findOrFail($roomId);
         $depth = 0;
         $this->updateChannelRate($room, $property, $data, $data['rate'], $weekDays, $errors, $depth);
     }
     if (!empty($errors)) {
         return Response::json(['success' => false, 'errors' => $errors], 400);
         //400 - http error code
     }
     return Response::json(['success' => true], 200);
     //200 - http success code
 }
 /**
  * Remove the specified propertieschannel from storage.
  *
  * @param  int $channelId
  * @return Response
  */
 public function getDestroy($channelId)
 {
     PropertiesChannel::where(['channel_id' => $channelId, 'property_id' => Property::getLoggedId()])->delete();
     return Redirect::action('PropertiesChannelsController@getIndex');
 }
 /**
  * Update the specified room in storage.
  *
  * @return Response
  */
 public function postMap()
 {
     $validator = Validator::make($data = Input::all(), InventoryMap::$rules);
     if ($validator->fails()) {
         return Redirect::back()->withErrors($validator)->withInput();
     }
     $data['property_id'] = Property::getLoggedId();
     InventoryMap::getByKeys($data['channel_id'], $data['property_id'], $data['room_id'])->delete();
     //get inventory room name
     if ($data['code'] && $data['plans']) {
         $inventory = Inventory::getByKeys($data['channel_id'], $data['property_id'], $data['code'])->first();
         if ($inventory) {
             $preparedData = ['name' => $inventory->name, 'room_id' => $data['room_id'], 'inventory_code' => $data['code'], 'channel_id' => $data['channel_id'], 'property_id' => $data['property_id']];
             foreach ($data['plans'] as $planCode) {
                 $plan = InventoryPlan::getByKeys($data['channel_id'], $data['property_id'], $planCode)->first();
                 if ($plan) {
                     $preparedData['plan_code'] = $plan->code;
                     $preparedData['plan_name'] = $plan->name;
                     InventoryMap::create($preparedData);
                 }
             }
         }
     }
     return Redirect::action('RoomsController@getIndex');
 }