public function run()
 {
     DB::table('events')->delete();
     $currentDay = time();
     $user = User::find(1);
     // days generated before the current date
     $generatedDay = $currentDay - 370 * 24 * 60 * 60;
     // generating data for ~2 years
     for ($i = 0; $i < 750; $i++) {
         // timestamp of the current day
         $dailyTimeStamp = $generatedDay + $i * 24 * 60 * 60;
         $date = date('Y-m-d', $dailyTimeStamp);
         $monthStats = EventSeeder::monthlyStats($dailyTimeStamp);
         $eventTimes = EventSeeder::generateEventTimes($monthStats, $dailyTimeStamp);
         foreach ($eventTimes as $event) {
             $temparray = EventSeeder::getEventType($monthStats, $event);
             if ($temparray) {
                 DB::table('events')->insert(array('user' => $user->id, 'created' => date('Y-m-d H:i:s', $event), 'eventID' => $temparray['id'], 'type' => $temparray['type'], 'object' => $temparray['object'], 'provider' => 'stripe', 'previousAttributes' => $temparray['previousAttributes'], 'date' => date('Y-m-d', $event)));
             }
         }
         // set time to last timestamp +1
         $event++;
         // calculate all
         Calculator::calculateMetrics($user, $event);
     }
 }
 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function fire()
 {
     Log::info('CalculateMetrics fired');
     // going through the users
     foreach (User::all() as $user) {
         // check if user is connected and ready (in case he is just connecting), and trial not ended yet
         // or it's demo user
         if ($user->isStripeConnected() && $user->ready == 'connected' && !$user->isTrialEnded() || $user->id == 1) {
             // saving events
             Calculator::calculateMetrics($user, time());
         }
     }
     Log::info('CalculateMetrics finished');
 }
 /** 
  * daily metric calculator - called from cron script
  * @param $user
  * 
  * @return null
  */
 public static function calculateMetrics($user, $time)
 {
     // get needed time vars
     if ($time) {
         $timestamp = $time;
     } else {
         $timestamp = time();
     }
     $today = date('Y-m-d', $timestamp);
     $yesterday = date('Y-m-d', $timestamp - 86400);
     // get today's metrics
     $metrics = Metric::firstOrNew(array('user' => $user->id, 'date' => $today));
     // get yesterday's metrics
     // this should never return an empty array
     $yesterdayMetric = Metric::where('user', $user->id)->where('date', $yesterday)->first();
     if (!$yesterdayMetric) {
         Calculator::calculateMetrics($user, $timestamp - 86400);
         $yesterdayMetric = Metric::where('user', $user->id)->where('date', $yesterday)->first();
     }
     // get today's events
     $events = Event::where('user', $user->id)->where('date', $today)->get();
     // events have a provider, needs merging
     // FIXME!!!!
     // calculate all the metrics
     // monthly recurring revenue
     // return int
     $metrics->mrr = MrrStat::calculate($yesterdayMetric->mrr, $events);
     // active users
     // return int
     $metrics->au = AUStat::calculate($yesterdayMetric->au, $events);
     // annual recurring revenue
     // return int
     $metrics->arr = ArrStat::calculate($metrics->mrr);
     // average recurring revenue per active user
     // return int
     $metrics->arpu = ArpuStat::calculate($metrics->mrr, $metrics->au);
     // daily and monthly cancellations
     // return array
     list($daily, $monthly) = CancellationStat::calculate($events, $user);
     $metrics->cancellations = $daily;
     $metrics->monthlyCancellations = $monthly;
     // user churn
     // return float
     $metrics->uc = UserChurnStat::calculate($metrics->monthlyCancellations, $user, $timestamp);
     // save everything
     $metrics->save();
 }