示例#1
0
 /** 
  * 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();
 }