diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 5549c8df1978..52f23424209c 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Jobs\ExportReportResults; +use App\Jobs\LoadPostmarkStats; use App\Jobs\RunReport; use App\Models\Account; use App\Models\ScheduledReport; @@ -12,9 +13,6 @@ use Utils; use View; use Carbon; use Validator; -use stdClass; -use DateInterval; -use DatePeriod; /** @@ -189,67 +187,8 @@ class ReportController extends BaseController public function loadEmailReport($startDate, $endDate) { - $account = auth()->user()->account; - $startDate = date_create($startDate); - $endDate = date_create($endDate); - $postmark = new \Postmark\PostmarkClient(config('services.postmark')); - $obj = new stdClass; + $data = dispatch(new LoadPostmarkStats($startDate, $endDate)); - $eventTypes = ['sent', 'opened']; - - foreach ($eventTypes as $eventType) { - $data = []; - $endDate->modify('+1 day'); - $interval = new DateInterval('P1D'); - $period = new DatePeriod($startDate, $interval, $endDate); - $endDate->modify('-1 day'); - $records = []; - - if ($eventType == 'sent') { - $response = $postmark->getOutboundSendStatistics(null, request()->start_date, request()->end_date); - } else { - $response = $postmark->getOutboundOpenStatistics(null, request()->start_date, request()->end_date); - } - - foreach ($response->days as $key => $val) { - $field = $eventType == 'opened' ? 'unique' : $eventType; - $data[$val['date']] = $val[$field]; - } - - foreach ($period as $day) { - $date = $day->format('Y-m-d'); - $records[] = isset($data[$date]) ? $data[$date] : 0; - - if ($eventType == 'sent') { - $labels[] = $day->format('m/d/Y'); - } - } - - if ($eventType == 'sent') { - $color = '51,122,183'; - } elseif ($eventType == 'opened') { - $color = '54,193,87'; - } elseif ($eventType == 'bounced') { - $color = '128,128,128'; - } - - $group = new stdClass(); - $group->data = $records; - $group->label = trans("texts.{$eventType}"); - $group->lineTension = 0; - $group->borderWidth = 4; - $group->borderColor = "rgba({$color}, 1)"; - $group->backgroundColor = "rgba({$color}, 0.1)"; - $datasets[] = $group; - } - - $data = new stdClass(); - $data->labels = $labels; - $data->datasets = $datasets; - - $response = new stdClass(); - $response->data = $data; - - return response()->json($response); + return response()->json($data); } } diff --git a/app/Jobs/LoadPostmarkStats.php b/app/Jobs/LoadPostmarkStats.php new file mode 100644 index 000000000000..df101c4514e8 --- /dev/null +++ b/app/Jobs/LoadPostmarkStats.php @@ -0,0 +1,151 @@ +startDate = $startDate; + $this->endDate = $endDate; + + $this->response = new stdClass(); + $this->postmark = new \Postmark\PostmarkClient(config('services.postmark')); + $this->account = auth()->user()->account; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $this->loadOverallStats(); + $this->loadSentStats(); + $this->loadPlatformStats(); + $this->loadEmailClientStats(); + + return $this->response; + } + + private function loadOverallStats() { + $startDate = date_create($this->startDate); + $endDate = date_create($this->endDate); + + $eventTypes = ['sent', 'opened']; + + foreach ($eventTypes as $eventType) { + $data = []; + $endDate->modify('+1 day'); + $interval = new DateInterval('P1D'); + $period = new DatePeriod($startDate, $interval, $endDate); + $endDate->modify('-1 day'); + $records = []; + + if ($eventType == 'sent') { + $response = $this->postmark->getOutboundSendStatistics(null, request()->start_date, request()->end_date); + } else { + $response = $this->postmark->getOutboundOpenStatistics(null, request()->start_date, request()->end_date); + } + + foreach ($response->days as $key => $val) { + $field = $eventType == 'opened' ? 'unique' : $eventType; + $data[$val['date']] = $val[$field]; + } + + foreach ($period as $day) { + $date = $day->format('Y-m-d'); + $records[] = isset($data[$date]) ? $data[$date] : 0; + + if ($eventType == 'sent') { + $labels[] = $day->format('m/d/Y'); + } + } + + if ($eventType == 'sent') { + $color = '51,122,183'; + } elseif ($eventType == 'opened') { + $color = '54,193,87'; + } elseif ($eventType == 'bounced') { + $color = '128,128,128'; + } + + $group = new stdClass(); + $group->data = $records; + $group->label = trans("texts.{$eventType}"); + $group->lineTension = 0; + $group->borderWidth = 4; + $group->borderColor = "rgba({$color}, 1)"; + $group->backgroundColor = "rgba({$color}, 0.1)"; + $datasets[] = $group; + } + + $data = new stdClass(); + $data->labels = $labels; + $data->datasets = $datasets; + $this->response->data = $data; + } + + private function loadSentStats() { + $account = $this->account; + $data = $this->postmark->getOutboundOverviewStatistics(null, request()->start_date, request()->end_date); + $this->response->totals = [ + 'sent' => $account->formatNumber($data->sent), + 'opened' => sprintf('%s | %s%%', $account->formatNumber($data->uniqueopens), $account->formatNumber($data->uniqueopens / $data->sent * 100)), + 'bounced' => sprintf('%s | %s%%', $account->formatNumber($data->bounced), $account->formatNumber($data->bouncerate, 3)), + //'spam' => sprintf('%s | %s%%', $account->formatNumber($data->spamcomplaints), $account->formatNumber($data->spamcomplaintsrate, 3)) + ]; + } + + private function loadPlatformStats() { + $data = $this->postmark->getOutboundPlatformStatistics(null, request()->start_date, request()->end_date); + $account = $this->account; + $str = ''; + $total = 0; + + $total = $data['desktop'] + $data['mobile'] + $data['webmail']; + + foreach (['mobile', 'desktop', 'webmail'] as $platform) { + $str .= sprintf('
+ +