ldc-flucollector/app/Http/Controllers/Bo/StatsController.php

91 lines
3.2 KiB
PHP
Raw Normal View History

2023-09-28 13:16:56 +02:00
<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
2023-09-28 16:21:05 +02:00
use App\Http\Requests\Bo\StatsByServiceRequest;
use App\Models\Service;
use App\Models\ServiceStat;
2023-09-28 13:16:56 +02:00
use Illuminate\Database\Eloquent\Builder;
2023-09-28 16:21:05 +02:00
use Illuminate\Http\Response;
2023-09-28 13:16:56 +02:00
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Schema;
use League\Csv\Writer;
/**
* @codeCoverageIgnore
*/
class StatsController extends Controller
{
/**
2023-09-28 16:21:05 +02:00
* Shows stats by service.
2023-09-28 13:16:56 +02:00
*
2023-09-28 16:21:05 +02:00
* @param \App\Http\Requests\Bo\StatsByServiceRequest $request
2023-09-28 13:16:56 +02:00
* @return \Illuminate\Http\Response
*/
2023-09-28 16:21:05 +02:00
public function viewStatsByService(StatsByServiceRequest $request)
2023-09-28 13:16:56 +02:00
{
$stats = null;
2023-09-28 16:21:05 +02:00
if ($request->has('service')) {
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\ServiceStat> */
$stats = ServiceStat::query()
->with('service')
->whereDate('date', '>=', $request->start)
->whereDate('date', '<=', $request->end)
->whereHas('service', fn (Builder $q) => $q->where('id', $request->service))
2023-09-28 13:16:56 +02:00
->get();
}
2023-09-28 16:21:05 +02:00
return view('bo.pages.stats.view-stats-by-services', \compact('stats'));
2023-09-28 13:16:56 +02:00
}
/**
2023-09-28 16:21:05 +02:00
* Exports stats by service as a csv file.
2023-09-28 13:16:56 +02:00
*
2023-09-28 16:21:05 +02:00
* @param \App\Http\Requests\Bo\StatsByServiceRequest $request
2023-09-28 13:16:56 +02:00
* @return \Illuminate\Http\Response
*/
2023-09-28 16:21:05 +02:00
public function exportByBrandCsv(StatsByServiceRequest $request): Response
2023-09-28 13:16:56 +02:00
{
2023-09-28 16:21:05 +02:00
/** @var \App\Models\Service */
$service = Service::query()->findOrFail($request->service);
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\ServiceStat> */
$stats = ServiceStat::query()
->with('service.arcadiaBrand')
->whereDate('date', '>=', $request->start)
->whereDate('date', '<=', $request->end)
->whereHas('service', fn (Builder $q) => $q->where('id', $request->service))
2023-09-28 13:16:56 +02:00
->get();
2023-09-28 16:21:05 +02:00
$columns = Schema::getColumnListing((new ServiceStat())->getTable());
$columns = Arr::where($columns, fn ($value) => !in_array($value, ['date', 'service_id']));
2023-09-28 13:16:56 +02:00
/** @var array<string> $columns */
2023-09-28 16:21:05 +02:00
$header = '"date";"service";' . implode(';', $columns);
2023-09-28 13:16:56 +02:00
$w = Writer::createFromString($header . PHP_EOL);
$w->setDelimiter(';');
$w->setEnclosure('"');
$w->setOutputBOM(Writer::BOM_UTF8);
2023-09-28 16:21:05 +02:00
/** @var \App\Models\ServiceStat $stat */
2023-09-28 13:16:56 +02:00
foreach ($stats as $stat) {
/** @var array<string,string> $cols */
$cols = [
2023-09-28 16:21:05 +02:00
$stat->date->isoFormat('YYYY-MM-DD'),
$service->label
2023-09-28 13:16:56 +02:00
];
foreach ($columns as $colname) {
$cols[] = $stat->{$colname};
}
$w->insertOne($cols);
}
return response((string)$w, 200, [
'Content-Encoding' => 'none',
'Content-Type' => 'text/csv; charset=UTF-8',
// phpcs:ignore Generic.Files.LineLength.TooLong
2023-09-28 16:21:05 +02:00
'Content-Disposition' => "attachment; filename=\"Statistiques du {$request->start} au {$request->end} pour {$service->name}.csv\"",
2023-09-28 13:16:56 +02:00
'Content-Description' => 'File Transfer',
]);
}
}