Attendize/app/Http/Controllers/EventDashboardController.php

110 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Event;
use App\Models\EventStats;
use Carbon\Carbon;
use DateInterval;
use DatePeriod;
use DateTime;
use View;
class EventDashboardController extends MyBaseController
{
public function showDashboard($event_id = false)
{
$event = Event::scope()->findOrFail($event_id);
$num_days = 20;
/*
* This is a fairly hackish way to get the data for the dashboard charts. I'm sure someone
* with better SQL skill could do it in one simple query.
*
* Filling in the missing days here seems to be fast(ish) (with 20 days history), but the work
* should be done in the DB
*/
$chartData = EventStats::where('event_id', '=', $event->id)
->where('date', '>', Carbon::now()->subDays($num_days)->format('Y-m-d'))
->get()
->toArray();
$startDate = new DateTime("-$num_days days");
$dateItter = new DatePeriod(
$startDate, new DateInterval('P1D'), $num_days
);
$original = $chartData;
/*
* I have no idea what I was doing here, but it seems to work;
*/
$result = [];
$i = 0;
foreach ($dateItter as $date) {
$views = 0;
$sales_volume = 0;
$unique_views = 0;
$tickets_sold = 0;
$organiser_fees_volume = 0;
foreach ($original as $item) {
if ($item['date'] == $date->format('Y-m-d')) {
$views = $item['views'];
$sales_volume = $item['sales_volume'];
$organiser_fees_volume = $item['organiser_fees_volume'];
$unique_views = $item['unique_views'];
$tickets_sold = $item['tickets_sold'];
}
$i++;
}
$result[] = [
'date' => $date->format('Y-m-d'),
'views' => $views,
'unique_views' => $unique_views,
'sales_volume' => $sales_volume + $organiser_fees_volume,
'tickets_sold' => $tickets_sold,
];
}
$data = [
'event' => $event,
'chartData' => json_encode($result),
];
return View::make('ManageEvent.Dashboard', $data);
}
/**
* @param $chartData
* @param bool|false $from_date
* @param bool|false $toDate
*
* @return string
*/
public function generateChartJson($chartData, $from_date = false, $toDate = false)
{
$data = [];
$startdate = '2014-10-1';
$enddate = '2014-11-7';
$timestamp = strtotime($startdate);
while ($startdate <= $enddate) {
$startdate = date('Y-m-d', $timestamp);
$data[] = [
'date' => $startdate,
'tickets_sold' => rand(0, 7),
'views' => rand(0, 5),
'unique_views' => rand(0, 5),
];
$timestamp = strtotime('+1 days', strtotime($startdate));
}
return json_encode($data);
}
}