90 lines
3.2 KiB
PHP
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',
|
|
]);
|
|
}
|
|
}
|