. */ namespace App\Libraries; use Illuminate\Support\Facades\DB; use Carbon\Carbon; use Carbon\CarbonPeriod; use Carbon\CarbonInterval; use App\Account; class StatisticsCruncher { public static function month() { $data = self::getAccountFrom(Carbon::now()->subMonth()) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataAliases = self::getAccountFrom(Carbon::now()->subMonth()) ->whereIn('id', function ($query) { $query->select('account_id') ->from('aliases'); }) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataActivated = self::getAccountFrom(Carbon::now()->subMonth()) ->where('activated', true) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataAliasesActivated = self::getAccountFrom(Carbon::now()->subMonth()) ->where('activated', true) ->whereIn('id', function ($query) { $query->select('account_id') ->from('aliases'); }) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); return self::compileStatistics( collect(CarbonPeriod::create(Carbon::now()->subMonth(), Carbon::now()))->map->format('Y-m-d'), $data, $dataAliases, $dataActivated, $dataAliasesActivated ); } public static function week() { $data = self::getAccountFrom(Carbon::now()->subWeek()) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataAliases = self::getAccountFrom(Carbon::now()->subWeek()) ->whereIn('id', function ($query) { $query->select('account_id') ->from('aliases'); }) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataActivated = self::getAccountFrom(Carbon::now()->subWeek()) ->where('activated', true) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataAliasesActivated = self::getAccountFrom(Carbon::now()->subWeek()) ->where('activated', true) ->whereIn('id', function ($query) { $query->select('account_id') ->from('aliases'); }) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); return self::compileStatistics( collect(CarbonPeriod::create(Carbon::now()->subWeek(), Carbon::now()))->map->format('Y-m-d'), $data, $dataAliases, $dataActivated, $dataAliasesActivated ); } public static function day() { $data = self::getAccountFrom(Carbon::now()->subDay()) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d %H') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataAliases = self::getAccountFrom(Carbon::now()->subDay()) ->whereIn('id', function ($query) { $query->select('account_id') ->from('aliases'); }) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d %H') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataActivated = self::getAccountFrom(Carbon::now()->subDay()) ->where('activated', true) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d %H') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); $dataAliasesActivated = self::getAccountFrom(Carbon::now()->subDay()) ->where('activated', true) ->whereIn('id', function ($query) { $query->select('account_id') ->from('aliases'); }) ->get(array( DB::raw("date_format(creation_time,'%Y-%m-%d %H') as moment"), DB::raw('COUNT(*) as "count"') ))->each->setAppends([])->pluck('count', 'moment'); return self::compileStatistics( collect(CarbonInterval::hour()->toPeriod(Carbon::now()->subDay(), Carbon::now()))->map->format('Y-m-d H'), $data, $dataAliases, $dataActivated, $dataAliasesActivated ); } private static function getAccountFrom($date) { return Account::where('creation_time', '>=', $date) ->groupBy('moment') ->orderBy('moment', 'DESC') ->setEagerLoads([]); } private static function compileStatistics($period, $data, $dataAliases, $dataActivated, $dataAliasesActivated) { $stats = []; foreach ($period as $moment) { $all = $data[$moment] ?? 0; $aliases = $dataAliases[$moment] ?? 0; $activated = $dataActivated[$moment] ?? 0; $activatedAliases = $dataAliasesActivated[$moment] ?? 0; $stats[$moment] = [ 'all' => $all, 'phone' => $aliases, 'email' => $all - $aliases, 'activated_phone' => $activatedAliases, 'activated_email' => $activated - $activatedAliases ]; } return $stats; } }