ldc-flucollector/app/Http/Controllers/Bo/StatsController.php
2023-09-28 16:50:15 +02:00

90 lines
3.2 KiB
PHP

<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\StatsByServiceRequest;
use App\Models\Service;
use App\Models\ServiceStat;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Response;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Schema;
use League\Csv\Writer;
/**
* @codeCoverageIgnore
*/
class StatsController extends Controller
{
/**
* Shows stats by service.
*
* @param \App\Http\Requests\Bo\StatsByServiceRequest $request
* @return \Illuminate\Http\Response
*/
public function viewStatsByService(StatsByServiceRequest $request)
{
$stats = null;
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))
->get();
}
return view('bo.pages.stats.view-stats-by-services', \compact('stats'));
}
/**
* Exports stats by service as a csv file.
*
* @param \App\Http\Requests\Bo\StatsByServiceRequest $request
* @return \Illuminate\Http\Response
*/
public function exportByBrandCsv(StatsByServiceRequest $request): Response
{
/** @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))
->get();
$columns = Schema::getColumnListing((new ServiceStat())->getTable());
$columns = Arr::where($columns, fn ($value) => !in_array($value, ['date', 'service_id']));
/** @var array<string> $columns */
$header = '"date";"service";' . implode(';', $columns);
$w = Writer::createFromString($header . PHP_EOL);
$w->setDelimiter(';');
$w->setEnclosure('"');
$w->setOutputBOM(Writer::BOM_UTF8);
/** @var \App\Models\ServiceStat $stat */
foreach ($stats as $stat) {
/** @var array<string,string> $cols */
$cols = [
$stat->date->isoFormat('YYYY-MM-DD'),
$service->label
];
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
'Content-Disposition' => "attachment; filename=\"Statistiques du {$request->start} au {$request->end} pour {$service->name}.csv\"",
'Content-Description' => 'File Transfer',
]);
}
}