/** * 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(); }