/**
  * Execute the console command.
  *
  * @return mixed
  */
 public function fire()
 {
     $users = User::all();
     foreach ($users as $user) {
         if ($user->isTrialEnded()) {
             if ($user->plan == 'trial') {
                 // this is the first time we are checking it
                 $user->plan = 'trial_ended';
                 $user->save();
                 // create intercom event
                 IntercomHelper::trialEnded($user, 'now');
                 // send email
             }
         }
         if ($user->trialWillEndExactlyInDays(3)) {
             // create intercom event
             IntercomHelper::trialWillEnd($user, 3);
             // send email
             $data = array('user' => $user);
             Mailman::make('emails.trialWillEnd')->with($data)->to($user->email)->subject('[Fruit Analytics] Your free trial is ending.')->send();
         }
         if ($user->trialWillEndExactlyInDays(-1)) {
             // create intercom event
             IntercomHelper::trialEnded($user, '1-day-ago');
             // send email
             $data = array('user' => $user);
             Mailman::make('emails.trialEndedFirst')->with($data)->to($user->email)->subject('[Fruit Analytics] Your free trial is ended')->send();
         }
         if ($user->trialWillEndExactlyInDays(-7)) {
             // create intercom event
             IntercomHelper::trialEnded($user, '7-days-ago');
             // send email
             $data = array('user' => $user);
             Mailman::make('emails.trialEndedSecond')->with($data)->to($user->email)->subject('[Fruit Analytics] ')->send();
         }
         if ($user->trialWillEndExactlyInDays(-14)) {
             /// create intercom event
             IntercomHelper::trialEnded($user, '14-days-ago');
             // send email
             $data = array('user' => $user);
             Mailman::make('emails.trialEndedThird')->with($data)->to($user->email)->subject('[Fruit Analytics]')->send();
         }
     }
 }
 public function doConnect()
 {
     // Validation
     $rules = array('stripe' => 'min:16|max:64|required');
     // run the validation rules on the inputs
     $validator = Validator::make(Input::all(), $rules);
     if ($validator->fails()) {
         // validation error -> sending back
         $failedAttribute = $validator->invalid();
         return Redirect::back()->with('error', $validator->errors()->get(key($failedAttribute))[0])->withInput();
         // sending back data
     } else {
         // validator success
         try {
             // trying to login with this key
             Stripe\Stripe::setApiKey(Input::get('stripe'));
             $account = Stripe\Account::retrieve();
             // catchable line
             // success
             $returned_object = json_decode(strstr($account, '{'), true);
             // updating the user
             $user = Auth::user();
             $user->ready = 'connecting';
             // setting key
             $user->stripe_key = Input::get('stripe');
             // setting name if is null
             if (strlen($user->name) == 0) {
                 $user->name = $returned_object['display_name'];
             }
             if (strlen($user->zoneinfo) == 0) {
                 $user->zoneinfo = $returned_object['country'];
             }
             // saving user
             $user->save();
             IntercomHelper::connected($user, 'stripe');
             Queue::push('CalculateFirstTime', array('userID' => $user->id));
         } catch (Stripe\Error\Authentication $e) {
             // code was invalid
             return Redirect::back()->with('error', "Authentication unsuccessful!");
         }
         // redirect to get stripe
         return Redirect::route('auth.dashboard')->with(array('success' => 'Stripe connected.'));
     }
 }
 public function doCancelSubscription()
 {
     $user = Auth::user();
     if ($user->subscriptionId) {
         try {
             $result = Braintree_Subscription::cancel($user->subscriptionId);
         } catch (Exception $e) {
             return Redirect::back()->with('error', "Couldn't process subscription, try again later.");
         }
         $user->subscriptionId = '';
         $user->plan = 'cancelled';
         $user->save();
         IntercomHelper::cancelled($user);
         return Redirect::route('auth.plan')->with('success', 'Unsubscribed successfully');
     } else {
         Redirect::back()->with('error', 'No valid subscription');
     }
 }
 public static function wizard($step = NULL)
 {
     # user is the authenticated user
     $user = Auth::user();
     # we will need a client for spreadsheet feeds + email + offline (to get a refreshtoken)
     $client = GooglespreadsheetHelper::setGoogleClient();
     switch ($step) {
         case 'init':
             # render wizard step #1
             return View::make('connect.connect-googlespreadsheet')->with(array('step' => 'choose-type', 'isBackgroundOn' => Auth::user()->isBackgroundOn, 'dailyBackgroundURL' => Auth::user()->dailyBackgroundURL()));
             break;
             # /case 'init'
         # /case 'init'
         case 'set-type':
             Log::info("session - " . Session::get('type'));
             # save the widget type in SESSION
             if (Input::get('type')) {
                 Session::put('type', Input::get('type'));
             }
             Log::info("session - " . Session::get('type'));
             if (!$user->isGoogleSpreadsheetConnected()) {
                 # if the user hasn't authorized with google
                 # go to google oauth page
                 $url = $client->createAuthUrl();
                 return Redirect::to($url);
                 break;
             } else {
                 # otherwise render the spreadsheet chooser wizard page
                 # get the spreadsheet list
                 $access_token = GooglespreadsheetHelper::getGoogleAccessToken($client, $user);
                 $serviceRequest = new DefaultServiceRequest($access_token);
                 ServiceRequestFactory::setInstance($serviceRequest);
                 $spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
                 $spreadsheetFeed = $spreadsheetService->getSpreadsheets();
                 # render choose-spreadsheet wizard step
                 return View::make('connect.connect-googlespreadsheet')->with(array('step' => 'choose-spreadsheet', 'spreadsheetFeed' => $spreadsheetFeed, 'isBackgroundOn' => Auth::user()->isBackgroundOn, 'dailyBackgroundURL' => Auth::user()->dailyBackgroundURL(), 'type' => Session::get('type')));
             }
             break;
             # / case 'set-type'
         # / case 'set-type'
         case 'set-spreadsheet':
             Log::info("session - " . Session::get('type'));
             if (Input::get('type')) {
                 Session::put('type', Input::get('type'));
             }
             Log::info("session - " . Session::get('type'));
             # save the spreadsheet ID in SESSION
             Session::put("spreadsheetId", Input::get('spreadsheetId'));
             # init service
             $access_token = GooglespreadsheetHelper::getGoogleAccessToken($client, $user);
             $serviceRequest = new DefaultServiceRequest($access_token);
             ServiceRequestFactory::setInstance($serviceRequest);
             # get the spreadsheet they asked for in the POST
             $spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
             $spreadsheet = $spreadsheetService->getSpreadsheetById(Input::get('spreadsheetId'));
             # save the spreadsheet name in SESSION
             Session::put("spreadsheetName", $spreadsheet->getTitle());
             # get the worksheet list for the selected spreadsheet
             $worksheetFeed = $spreadsheet->getWorksheets();
             # render choose-worksheet wizard step
             return View::make('connect.connect-googlespreadsheet')->with(array('step' => 'choose-worksheet', 'worksheetFeed' => $worksheetFeed, 'isBackgroundOn' => Auth::user()->isBackgroundOn, 'dailyBackgroundURL' => Auth::user()->dailyBackgroundURL(), 'type' => Session::get('type')));
             break;
             # /case 'set-spreadsheet'
         # /case 'set-spreadsheet'
         case 'set-worksheet':
             Log::info("session - " . Session::get('type'));
             if (Input::get('type')) {
                 Session::put('type', Input::get('type'));
             }
             Log::info("session - " . Session::get('type'));
             # save the worksheet name in SESSION
             Session::put("worksheetName", Input::get('worksheetName'));
             # save the widget
             $widget_data = array('googleSpreadsheetId' => Session::get('spreadsheetId'), 'googleWorksheetName' => Session::get('worksheetName'));
             $widget_json = json_encode($widget_data);
             $widget = new Widget();
             $widget->widget_name = Session::get('worksheetName') . ' - ' . Session::get('spreadsheetName');
             $widget->widget_type = Session::get('type');
             $widget->widget_provider = 'googlespreadsheet';
             $widget->widget_source = $widget_json;
             $widget->widget_ready = false;
             $widget->dashboard_id = $user->dashboards()->first()->id;
             $widget->position = '{"size_x":3,"size_y":4,"col":1,"row":1}';
             $widget->save();
             return Redirect::route('dashboard.dashboard')->with('success', 'Google Spreadsheet widget added.');
             break;
             # / case 'set-worksheet'
         # / case 'set-worksheet'
         default:
             // input has no step, this is the google auth return part
             # we got a code in GET from google
             if (Input::has('code')) {
                 # lets get an access token
                 try {
                     $client->authenticate(Input::get('code'));
                 } catch (Exception $e) {
                     GooglespreadsheetHelper::disconnect();
                     return Redirect::route('connect.connect')->with('error', 'Something went wrong, try again please.');
                 }
                 $credentials = $client->getAccessToken();
                 // big JSON stuff
                 # lets make it an associative array
                 $tokens_decoded = json_decode($credentials, true);
                 # lets check if we have a refresh token already
                 $refresh_token = $user->googleSpreadsheetRefreshToken;
                 if (strlen($refresh_token) < 10) {
                     # nope, let's use the one we got now
                     $refresh_token = $tokens_decoded['refresh_token'];
                 }
                 # database save the access-stuff-JSON and the refresh token
                 $user->googleSpreadsheetCredentials = $credentials;
                 $user->googleSpreadsheetRefreshToken = $refresh_token;
                 $user->save();
                 # good job, notify intercom
                 IntercomHelper::connected($user, 'googlespreadsheet');
                 # auth
                 $access_token = GooglespreadsheetHelper::getGoogleAccessToken($client, $user);
                 # get the spreadsheet list
                 $serviceRequest = new DefaultServiceRequest($access_token);
                 ServiceRequestFactory::setInstance($serviceRequest);
                 $spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
                 $spreadsheetFeed = $spreadsheetService->getSpreadsheets();
                 # render choose-spreadsheet wizard step
                 return View::make('connect.connect-googlespreadsheet')->with(array('step' => 'choose-spreadsheet', 'spreadsheetFeed' => $spreadsheetFeed, 'isBackgroundOn' => Auth::user()->isBackgroundOn, 'dailyBackgroundURL' => Auth::user()->dailyBackgroundURL()));
             } else {
                 return View::make('connect.connect')->with(array('error' => 'Something went wrong with the Google authentication.', 'isBackgroundOn' => Auth::user()->isBackgroundOn, 'dailyBackgroundURL' => Auth::user()->dailyBackgroundURL()));
             }
             break;
             # / default
     }
     # /switch ($step)
 }