62 lines
2.3 KiB
PHP
62 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Forms;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\FormStatsRequest;
|
|
use Carbon\CarbonPeriod;
|
|
use Carbon\CarbonInterval;
|
|
use Illuminate\Http\Request;
|
|
|
|
class FormStatsController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware('auth');
|
|
}
|
|
|
|
public function getFormStats(FormStatsRequest $request)
|
|
{
|
|
$form = $request->form; // Added by ProForm middleware
|
|
$this->authorize('view', $form);
|
|
|
|
$formStats = $form->statistics()->whereBetween('date', [$request->date_from, $request->date_to])->get();
|
|
$periodStats = ['views' => [], 'submissions' => []];
|
|
foreach (CarbonPeriod::create($request->date_from, $request->date_to) as $dateObj) {
|
|
$date = $dateObj->format('d-m-Y');
|
|
|
|
$statisticData = $formStats->where('date', $dateObj->format('Y-m-d'))->first();
|
|
$periodStats['views'][$date] = $statisticData->data['views'] ?? 0;
|
|
$periodStats['submissions'][$date] = $form->submissions()->whereDate('created_at', $dateObj)->count();
|
|
|
|
if ($dateObj->toDateString() === now()->toDateString()) {
|
|
$periodStats['views'][$date] += $form->views()->count();
|
|
}
|
|
}
|
|
|
|
return $periodStats;
|
|
}
|
|
|
|
public function getFormStatsDetails(Request $request)
|
|
{
|
|
$form = $request->form; // Added by ProForm middleware
|
|
$this->authorize('view', $form);
|
|
|
|
$totalViews = $form->views_count;
|
|
$totalSubmissions = $form->submissions_count;
|
|
|
|
$averageDuration = \Cache::remember('form_stats_average_duration_' . $form->id, 1800, function () use ($form) {
|
|
$submissionsWithDuration = $form->submissions()->whereNotNull('completion_time')->count() ?? 0;
|
|
$totalDuration = $form->submissions()->whereNotNull('completion_time')->sum('completion_time') ?? 0;
|
|
return $submissionsWithDuration > 0 ? round($totalDuration / $submissionsWithDuration) : null;
|
|
});
|
|
|
|
return [
|
|
'views' => $totalViews,
|
|
'submissions' => $totalSubmissions,
|
|
'completion_rate' => $totalViews > 0 ? round(($totalSubmissions / $totalViews) * 100, 2) : 0,
|
|
'average_duration' => $averageDuration ? CarbonInterval::seconds($averageDuration)->cascade()->forHumans(null, true) : null
|
|
];
|
|
}
|
|
}
|