ldc-portsalaries/app/Http/Controllers/EmployeesController.php
2021-06-07 18:28:25 +02:00

384 lines
14 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\EmployeeAddressUpdateRequest;
use App\Http\Requests\EmployeeBankUpdateRequest;
use App\Http\Requests\EmployeeFamilyUpdateRequest;
use App\Http\Requests\EmployeeForgottenPasswordRequest;
use App\Http\Requests\EmployeeFormationQuestionRequest;
use App\Http\Requests\EmployeeLoginRequest;
use App\Http\Requests\EmployeeMailChangeRequest;
use App\Http\Requests\EmployeePasswordChangeRequest;
use App\Http\Requests\EmployeeRdvQuestionRequest;
use App\Http\Requests\EmployeeResetPasswordRequest;
use App\Http\Requests\ImportEmployeesCsvFile;
use App\Imports\EmployeeImport;
use App\Imports\EmployeeSortie;
use App\Jobs\SendMailConfirmToEmployee;
use App\Jobs\SendMailResetPasswordToEmployee;
use App\Jobs\SendEmployeeInfoMailToSiteRH;
use App\Jobs\SendEmployeeLockedDownMailToEmployee;
use App\Jobs\SendEmployeeLockedDownMailToSiteRH;
use App\Mail\EmployeeInfoAddress;
use App\Mail\EmployeeInfoBank;
use App\Mail\EmployeeInfoFamily;
use App\Mail\EmployeeLockedDown;
use App\Mail\EmployeeQuestionFormation;
use App\Mail\EmployeeQuestionRdv;
use App\Mail\EmployeeYourAccountIsLockedDown;
use App\Models\Employee;
use App\Models\EmployeeMailToken;
use App\Models\Site;
use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Excel as LExcel;
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Validators\ValidationException;
use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
class EmployeesController extends CrudController
{
/** @var Employee */
protected static $modelClass = Employee::class;
// BO
// Eloquent callbacks
public function indexQuery(Builder $query): Builder
{
/** @var \App\Models\User */
$user = auth()->user();
return $query->whereIn('site_id', $user->sites()->pluck('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;
}
public function importExit()
{
$this->authorize('importExit', Employee::class);
CrudController::shareCrudModelsClassesToView();
return view('back.employees.import-exit');
}
public function importExitSubmit(ImportEmployeesCsvFile $request)
{
$this->authorize('import', Employee::class);
/** @var \App\Models\User */
$user = auth()->user();
/** @var \App\Models\Site */
$site = Site::where('id', $user->selected_site_id)->firstOrFail();
$employeeImport = null;
try {
$employeeImport = new EmployeeSortie($site);
Excel::import(
$employeeImport,
$request->file,
null,
LExcel::CSV
);
} catch (ReaderException $e) {
// this time cannot read anything
return redirect()->back()->withErrors('Echec lors de l\'import le fichier doit être conforme à celui fourni lors du developement de l\'application');
} catch (Exception $e) {
// $employeeImport->errorMessages
// this time cannot read anything
return redirect()->back()->withErrors(sprintf(
'Echec lors de l\'import %s',
$e->getMessage()
));
} finally {
$message = sprintf(
"%d salariés on été supprimés",
$employeeImport->removedCount,
);
if (count($employeeImport->importedFailed)) {
$message .= sprintf(
"\n %d echecs\n Les lignes suivantes ont été ignorés \n%s\n",
count($employeeImport->importedFailed),
\collect($employeeImport->importedFailed)->map(function ($d) {
return $d->implode(',');
})->implode("\n"),
);
}
if (count($employeeImport->errorMessages)) {
$message .= sprintf(
"\n %d erreurs\n Les erreurs suivantes sont apparues %s",
count($employeeImport->errorMessages),
implode("\n", $employeeImport->errorMessages),
);
}
return redirect()->route('bo.employees.importExit')
->with('success', $message);
}
}
public function import()
{
$this->authorize('import', Employee::class);
CrudController::shareCrudModelsClassesToView();
return view('back.employees.import');
}
public function importSubmit(ImportEmployeesCsvFile $request)
{
$this->authorize('import', Employee::class);
/** @var \App\Models\User */
$user = auth()->user();
/** @var \App\Models\Site */
$site = Site::where('id', $user->selected_site_id)->firstOrFail();
$employeeImport = null;
try {
$employeeImport = new EmployeeImport($site);
Excel::import(
$employeeImport,
$request->file,
null,
LExcel::CSV
);
} catch (Exception $e) {
// this time cannot read anything
return redirect()->back()->withErrors(sprintf(
'Echec lors de l\'import %s',
$e->getMessage()
));
} catch (ReaderException $e) {
// this time cannot read anything
return redirect()->back()->withErrors('Echec lors de l\'import le fichier doit être conforme à celui fourni lors du developement de l\'application');
} finally {
$message = '';
$errors = [];
foreach ($employeeImport->errorMessages as $k => $err) {
$errors[] = sprintf(
"\nLigne %d :\n%s\nDonnée:\n%s\n",
$k + 1,
\implode("\n", $err),
\implode(", ", $employeeImport->importedFailed[$k]->all())
);
}
if (count($errors)) {
$message = sprintf(
"%d salariés on été importés \n %d salariés mis à jour\n %d erreurs\n Les erreurs suivantes sont apparues %s",
$employeeImport->importedCount,
$employeeImport->updatedCount,
count($errors),
implode("\n", $errors),
);
} else {
$message = sprintf(
"%d salariés on été importés",
$employeeImport->importedCount,
);
}
return redirect()->route('bo.employees.import')
->with('success', $message);
}
}
// FO
public function logout()
{
/** @var \Illuminate\Auth\SessionGuard */
$guard = Auth::guard('employee');
$guard->logout();
return redirect()->route('employees.login');
}
public function loginSubmit(EmployeeLoginRequest $request)
{
/** @var \Illuminate\Auth\SessionGuard */
$guard = Auth::guard('employee');
if (!($employee = Employee::where('matricule', $request->login)->first())) {
return \redirect()->route('employees.login')
->withErrors(['Les identifiants fournis sont incorrects'], 'login');
}
// Is employee locked down ?
if ($employee->password_attempts >= 3) {
return \redirect()->route('employees.login')
->withErrors([trans(sprintf(
'Votre compte est verouillé, il vous faut contacter votre responsable RH pour le deverouiller',
3 - $employee->password_attempts
))], 'lockedDown')->with('site', $employee->site);
}
// phpcs:ignore Generic.Files.LineLength.TooLong
if (!$guard->attempt(['matricule' => $request->login, 'password' => $request->password], $request->rememberMe)) {
$employee->password_attempts = $employee->password_attempts + 1;
$employee->saveOrFail();
// Is employee locked down ?
if ($employee->password_attempts >= 3) {
SendEmployeeLockedDownMailToEmployee::dispatchAfterResponse(new EmployeeLockedDown($employee), $employee);
SendEmployeeLockedDownMailToSiteRH::dispatchAfterResponse(new EmployeeYourAccountIsLockedDown($employee), $employee);
return \redirect()->route('employees.login')
->withErrors(
[trans('Votre compte est verouillé, il vous faut contacter votre responsable RH pour le deverouiller')],
'lockedDown'
)->with('site', $employee->site);
}
return \redirect()->route('employees.login')
->withErrors([trans(sprintf(
// phpcs:ignore Generic.Files.LineLength.TooLong
'Attention plus que %d essais, après cela votre compte sera verrouillé, un mail à été envoyé pour prévenir votre responsable RH (seul lui peux déverouiller votre compte)',
3 - $employee->password_attempts
))], 'login');
}
$request->session()->regenerate();
return redirect()->intended(route('fo.flash.index'));
}
public function passwordForgottenSubmit(EmployeeForgottenPasswordRequest $request)
{
$employee = Employee::where('matricule', $request->matricule)->firstOrFail();
$token = $employee->token ?? new EmployeeMailToken();
$token->fill([
'email' => $employee->email,
'employee_id' => $employee->id
]);
$token->saveOrFail();
$token->employee()->associate($token);
SendMailResetPasswordToEmployee::dispatchAfterResponse($employee);
return \redirect()->back()->with('successMail', true);
}
public function resetPassword(EmployeeMailToken $token = null)
{
if ($token) {
Session::put('resetMail', time());
Session::put('resetMailEmployee', $token->employee);
Session::save();
$token->delete();
}
// If token has been consumed and we has a resetMail in Session then pass trough
if (Session::has('resetMail') and (Session::get('resetMail') + 60 * 4) > time()) {
return view('front.employees.changePassword', ['reset' => true]);
}
Session::forget('resetMail');
Session::forget('resetMailEmployee');
Session::save();
abort(redirect()->route('fo.flash.index'));
}
public function resetPasswordSubmit(EmployeeResetPasswordRequest $request)
{
/** @var Employee */
if ($employee = Session::get('resetMailEmployee', null)) {
$employee->password = $request->newpassword;
$employee->saveOrFail();
Session::forget('resetMail');
Session::forget('resetMailEmployee');
Session::save();
return redirect()->route('employees.done-reset-password');
}
abort(redirect()->route('fo.flash.index'));
}
public function passwordChangeSubmit(EmployeePasswordChangeRequest $request)
{
$employee = $this->getEmployee();
$employee->password = $request->newpassword;
$employee->saveOrFail();
if (Session::has('required')) {
Session::remove('required');
Session::save();
return redirect()->route('fo.flash.index')
->with('message', trans('Votre mot de passe à bien été mis à jour'));
}
return \redirect()->back()->with('success', true);
}
public function mailUpdate(EmployeeMailChangeRequest $request)
{
$employee = $this->getEmployee();
$token = $employee->token ?? new EmployeeMailToken();
$token->fill([
'email' => $request->email,
'employee_id' => $employee->id
]);
$token->saveOrFail();
$token->employee()->associate($token);
SendMailConfirmToEmployee::dispatchAfterResponse($employee);
return \redirect()->back()->with('successMail', true)
->with('message', trans('Informations mises à jour'));
}
public function confirmMail(EmployeeMailToken $token)
{
$employee = $token->employee;
$employee->email = $token->email;
$employee->saveOrFail();
$token->delete();
return view('front.emailActivated');
}
public function familyUpdate(EmployeeFamilyUpdateRequest $request)
{
$this->sendInfo(EmployeeInfoFamily::class, $request);
return \redirect()->back()->with('success', true)
->with('message', trans('Informations transmises'));
}
public function addressUpdate(EmployeeAddressUpdateRequest $request)
{
$this->sendInfo(EmployeeInfoAddress::class, $request);
return \redirect()->back()->with('success', true)
->with('message', trans('Informations transmises'));
}
public function bankUpdate(EmployeeBankUpdateRequest $request)
{
$this->sendInfo(EmployeeInfoBank::class, $request);
return \redirect()->back()->with('success', true)
->with('message', trans('Informations transmises'));
}
public function questionFormation(EmployeeFormationQuestionRequest $request)
{
$this->sendInfo(EmployeeQuestionFormation::class, $request);
return \redirect()->back()->with('success', true)
->with('message', trans('Informations transmises'));
}
public function questionRdv(EmployeeRdvQuestionRequest $request)
{
$this->sendInfo(EmployeeQuestionRdv::class, $request);
return \redirect()->back()->with('success', true)
->with('message', trans('Informations transmises'));
}
private function sendInfo(string $mailClass, FormRequest $request)
{
SendEmployeeInfoMailToSiteRH::dispatchAfterResponse(
new $mailClass(
array_merge(
['employee' => auth('employee')->user()],
$request->validated()
)
),
auth('employee')->user()
);
}
}