ldc-portsalaries/app/Http/Controllers/SondagesController.php

174 lines
5.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\SondageResponsesRequest;
use App\Http\Requests\UpdateCrudModel;
use App\Http\Requests\UpdateSondage;
use App\Models\ReponseSondage;
use App\Models\Sondage;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
use Kwaadpepper\CrudPolicies\Traits\CrudController;
use League\Csv\Writer;
class SondagesController extends Controller
{
use CrudController;
/** @var Sondage */
public static $modelClass = Sondage::class;
// Eloquent callbacks
public function indexQuery(Builder $query): Builder
{
/** @var \App\Models\User */
$user = auth()->user();
return $query->where('site_id', $user->selected_site_id);
}
public function storeModel(Model &$model)
{
/** @var \App\Models\User */
$user = auth()->user();
$model->site_id = $user->selected_site_id;
}
public function updateModel(Model &$model)
{
/** @var \App\Models\User */
$user = auth()->user();
$model->site_id = $user->selected_site_id;
}
// BO
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
public function show(Model $model)
{
return view('crudOverLoad.sondages.show', compact('model'));
}
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
public function edit(Model $model)
{
return view('crudOverLoad.sondages.edit', compact('model'));
}
public function updateSondage(UpdateSondage $request, Sondage $model)
{
$data = $request->validated();
$model->fill($data);
$model->saveOrFail();
$model->reponseSondages()->delete();
foreach ($data['reponses'] as $reponse) {
$reponse = new ReponseSondage([
'value' => $reponse
]);
$reponse->sondage()->associate($model);
$reponse->saveorFail();
}
return \redirect()->route(sprintf('bo.%s.edit', $model->getTable()), $model)
->with('success', trans(':model a bien été enregistré.', ['model' => $model->getModelName()]));
}
public function export(Sondage $model)
{
$this->authorize('export', $model);
$anwsers = $model->reponseSondages->load('employees');
$header = '"employee_matricule";' . implode(';', $anwsers->map(function ($answer) {
return "\"$answer->value\"";
})->all());
$w = Writer::createFromString($header . PHP_EOL);
$w->setDelimiter(';');
$w->setEnclosure('"');
$w->setOutputBOM(Writer::BOM_UTF8);
$tmpl = [
0 => '0',
];
foreach ($anwsers as $k => $answer) {
$tmpl[$k + 1] = '0';
}
$res = [];
foreach ($anwsers as $k => $answer) {
$answer->employees->map(function ($employee) use ($answer, $k, &$res) {
if (!array_key_exists($employee->id, $res)) {
$res[$employee->id] = [
'employee' => $employee,
'answers' => []
];
}
$res[$employee->id]['answers'][$k + 2] = 1;
});
}
foreach ($res as $customerIntel) {
$identifier = sprintf(
'%s %s %s',
$customerIntel['employee']->matricule,
$customerIntel['employee']->firstname,
$customerIntel['employee']->lastname
);
$w->insertOne(array_replace(
$tmpl,
[
$identifier,
],
$customerIntel['answers']
));
}
return response((string)$w, 200, [
'Content-Encoding' => 'none',
'Content-Type' => 'text/csv; charset=UTF-8',
'Content-Disposition' => sprintf(
'attachment; filename="Résultats Sondage %s - %s.csv',
Str::slug($model->question),
Str::slug(date('d_m_Y-H_i_s'))
),
'Content-Description' => 'File Transfer',
]);
}
// FO
public function sondages()
{
$sondages = $this->getEmployee()->unAnsweredSondages()
->filter(function (Sondage $sondage) {
return $sondage->status;
});
return view('front.sondages.index', compact('sondages'));
}
//phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
public function sondagesShow(Sondage $sondage)
{
if (!$sondage->status) {
abort(404);
}
$employee = $this->getEmployee();
if ($employee->hasAnweredToSondage($sondage)) {
return view('front.sondages.saved', ['answered' => true]);
}
return view('front.sondages.show', compact('sondage'));
}
//phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed
public function sondagesSubmit(SondageResponsesRequest $request, Sondage $sondage)
{
if (!$sondage->status) {
abort(400);
}
$employee = $this->getEmployee();
if ($employee->hasAnweredToSondage($sondage)) {
return view('front.sondages.saved', ['answered' => true, 'sondage' => $sondage]);
}
$employee->reponseSondages()->syncWithoutDetaching($request->reponses);
return view('front.sondages.saved', compact('sondage'));
}
}