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