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

86 lines
3.2 KiB
PHP

<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\StatsByBrandRequest;
use App\Models\ArcadiaBrand;
use App\Models\ArcadiaBrandStat;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Schema;
use League\Csv\Writer;
/**
* @codeCoverageIgnore
*/
class StatsController extends Controller
{
/**
* Shows stats by brand.
*
* @param \App\Http\Requests\Bo\StatsByBrandRequest $request
* @return \Illuminate\Http\Response
*/
public function viewStatsByBrand(StatsByBrandRequest $request)
{
$stats = null;
if ($request->has('brand')) {
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\ArcadiaBrandStat> */
$stats = ArcadiaBrandStat::query()->whereDate('created_at', '>=', $request->start)
->whereDate('created_at', '<=', $request->end)
->whereHas('arcadiaBrand', fn (Builder $q) => $q->where('id', $request->brand))
->get();
}
return view('bo.pages.stats.view-stats-by-brands', \compact('stats'));
}
/**
* Exports stats by brand as a csv file.
*
* @param \App\Http\Requests\StatsByBrandRequest $request
* @return \Illuminate\Http\Response
*/
public function exportByBrandCsv(StatsByBrandRequest $request): \Illuminate\Http\Response
{
/** @var \App\Models\ArcadiaBrand */
$brand = ArcadiaBrand::query()->findOrFail($request->brand);
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\ArcadiaBrandStat> */
$stats = ArcadiaBrandStat::query()->with('arcadiaBrand')
->whereHas('arcadiaBrand', fn (Builder $q) => $q->where('id', $request->brand))
->whereDate('created_at', '>=', $request->start)
->whereDate('created_at', '<=', $request->end)
->get();
$columns = Schema::getColumnListing((new ArcadiaBrandStat())->getTable());
$columns = Arr::where($columns, fn ($value) => !in_array($value, ['created_at', 'brand_id']));
/** @var array<string> $columns */
$header = '"date";"marque";' . implode(';', $columns);
$w = Writer::createFromString($header . PHP_EOL);
$w->setDelimiter(';');
$w->setEnclosure('"');
$w->setOutputBOM(Writer::BOM_UTF8);
/** @var \App\Models\ArcadiaBrandStat $stat */
foreach ($stats as $stat) {
/** @var array<string,string> $cols */
$cols = [
$stat->created_at->isoFormat('YYYY-MM-DD'),
$stat->arcadiaBrand->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 $brand->label.csv\"",
'Content-Description' => 'File Transfer',
]);
}
}