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 storedModel(Model &$model) { /** @var \App\Models\Employee */ $model = $model; $model->sendMailConfirm(); } 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); View::share('modelsClasses', static::getCrudModels()); 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( // phpcs:ignore Generic.Files.LineLength.TooLong '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 ont é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); View::share('modelsClasses', CrudController::getCrudModels()); 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( // phpcs:ignore Generic.Files.LineLength.TooLong '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( // phpcs:ignore Generic.Files.LineLength.TooLong "%d salariés ont é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 ont é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 verrouillé, veuillez contacter votre responsable RH pour le déverrouiller', 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::dispatch( new EmployeeLockedDown($employee), $employee ); SendEmployeeLockedDownMailToSiteRH::dispatch( new EmployeeYourAccountIsLockedDown($employee), $employee ); return \redirect()->route('employees.login') ->withErrors( // phpcs:ignore Generic.Files.LineLength.TooLong [trans('Votre compte est verrouillé, veuillez contacter votre responsable RH pour le déverrouiller')], '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é et un mail sera envoyé à votre responsable RH (seul lui peut déverrouiller votre compte)', 3 - $employee->password_attempts ))], 'login'); } // reset password attempts if successful login $employee->password_attempts = 0; $employee->saveOrFail(); $request->session()->regenerate(); return redirect()->intended(route('fo.access')); } public function passwordForgottenSubmit(EmployeeForgottenPasswordRequest $request) { /** @var \App\Models\Employee */ $employee = Employee::where('matricule', $request->matricule)->firstOrFail(); /** @var \App\Models\EmployeeMailToken */ $token = EmployeeMailToken::whereHas('employee', function ($q) use ($employee) { $q->where('id', $employee->id); })->firstOrNew(); $token->email = $employee->email; $token->employee()->associate($employee); $token->saveOrFail(); SendMailResetPasswordToEmployee::dispatchAfterResponse($employee, $token); 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(); return redirect()->route('fo.access'); } 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'); } return redirect()->route('fo.access'); } public function passwordChangeSubmit(EmployeePasswordChangeRequest $request) { /** @var \app\Models\Employee */ $employee = auth('employee')->user(); $employee->password = $request->newpassword; $employee->saveOrFail(); if (Session::has('required')) { Session::remove('required'); Session::save(); return redirect()->route('fo.access') ->with('message', trans('Votre mot de passe a bien été mis à jour')); } return \redirect()->back()->with('success', true); } public function mailUpdate(EmployeeMailChangeRequest $request) { /** @var \app\Models\Employee */ $employee = auth('employee')->user(); $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() ); } }