2021-05-08 06:50:19 +02:00
< ? 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\SendEmployeeInfoMailToSiteRH ;
use App\Jobs\SendEmployeeLockedDownMailToEmployee ;
use App\Jobs\SendEmployeeLockedDownMailToSiteRH ;
2021-07-15 02:05:00 +02:00
use App\Jobs\SendMailConfirmToEmployee ;
use App\Jobs\SendMailResetPasswordToEmployee ;
2021-05-08 06:50:19 +02:00
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 ;
2021-07-19 15:24:17 +02:00
use Illuminate\Support\Facades\View ;
2021-07-15 02:05:00 +02:00
use Kwaadpepper\CrudPolicies\Traits\CrudController ;
2021-05-08 06:50:19 +02:00
use Maatwebsite\Excel\Excel as LExcel ;
use Maatwebsite\Excel\Facades\Excel ;
use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException ;
2021-07-15 02:05:00 +02:00
class EmployeesController extends Controller
2021-05-08 06:50:19 +02:00
{
2021-07-15 02:05:00 +02:00
use CrudController ;
2021-05-08 06:50:19 +02:00
/** @var Employee */
2021-07-15 02:05:00 +02:00
public static $modelClass = Employee :: class ;
2021-05-08 06:50:19 +02:00
// BO
// Eloquent callbacks
public function indexQuery ( Builder $query ) : Builder
{
/** @var \App\Models\User */
$user = auth () -> user ();
2021-06-08 12:09:30 +02:00
return $query -> where ( 'site_id' , $user -> selected_site_id );
2021-05-08 06:50:19 +02:00
}
public function storeModel ( Model & $model )
{
/** @var \App\Models\User */
$user = auth () -> user ();
$model -> site_id = $user -> selected_site_id ;
}
2021-06-08 10:12:33 +02:00
public function storedModel ( Model & $model )
{
/** @var \App\Models\Employee */
$model = $model ;
$model -> sendMailConfirm ();
}
2021-05-08 06:50:19 +02:00
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 );
2021-07-19 15:24:17 +02:00
View :: share ( 'modelsClasses' , static :: getCrudModels ());
2021-05-08 06:50:19 +02:00
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
2021-07-15 02:05:00 +02:00
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'
);
2021-05-08 06:50:19 +02:00
} 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 (
2021-06-30 08:49:42 +02:00
" %d salariés ont été supprimés " ,
2021-05-08 06:50:19 +02:00
$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 );
2021-07-19 15:24:17 +02:00
View :: share ( 'modelsClasses' , CrudController :: getCrudModels ());
2021-05-08 06:50:19 +02:00
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
2021-07-15 02:05:00 +02:00
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'
);
2021-05-08 06:50:19 +02:00
} finally {
$message = '' ;
$errors = [];
foreach ( $employeeImport -> errorMessages as $k => $err ) {
$errors [] = sprintf (
" \n Ligne %d : \n %s \n Donnée: \n %s \n " ,
$k + 1 ,
\implode ( " \n " , $err ),
\implode ( " , " , $employeeImport -> importedFailed [ $k ] -> all ())
);
}
if ( count ( $errors )) {
$message = sprintf (
2021-07-15 02:05:00 +02:00
// phpcs:ignore Generic.Files.LineLength.TooLong
2021-06-30 08:49:42 +02:00
" %d salariés ont été importés \n %d salariés mis à jour \n %d erreurs \n Les erreurs suivantes sont apparues %s " ,
2021-05-08 06:50:19 +02:00
$employeeImport -> importedCount ,
$employeeImport -> updatedCount ,
count ( $errors ),
implode ( " \n " , $errors ),
);
} else {
$message = sprintf (
2021-06-30 08:49:42 +02:00
" %d salariés ont été importés " ,
2021-05-08 06:50:19 +02:00
$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 (
2021-06-29 15:23:42 +02:00
'Votre compte est verrouillé, veuillez contacter votre responsable RH pour le déverrouiller' ,
2021-05-08 06:50:19 +02:00
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 ) {
2022-10-27 09:13:10 +02:00
SendEmployeeLockedDownMailToEmployee :: dispatch (
2021-07-15 02:05:00 +02:00
new EmployeeLockedDown ( $employee ),
$employee
);
2022-10-27 09:13:10 +02:00
SendEmployeeLockedDownMailToSiteRH :: dispatch (
2021-07-15 02:05:00 +02:00
new EmployeeYourAccountIsLockedDown ( $employee ),
$employee
);
2021-05-08 06:50:19 +02:00
return \redirect () -> route ( 'employees.login' )
-> withErrors (
2021-07-15 02:05:00 +02:00
// phpcs:ignore Generic.Files.LineLength.TooLong
2021-06-29 15:23:42 +02:00
[ trans ( 'Votre compte est verrouillé, veuillez contacter votre responsable RH pour le déverrouiller' )],
2021-05-08 06:50:19 +02:00
'lockedDown'
) -> with ( 'site' , $employee -> site );
}
return \redirect () -> route ( 'employees.login' )
-> withErrors ([ trans ( sprintf (
// phpcs:ignore Generic.Files.LineLength.TooLong
2021-06-29 15:23:42 +02:00
'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)' ,
2021-05-08 06:50:19 +02:00
3 - $employee -> password_attempts
))], 'login' );
}
2021-06-08 12:27:32 +02:00
// reset password attempts if successful login
$employee -> password_attempts = 0 ;
$employee -> saveOrFail ();
2021-05-08 06:50:19 +02:00
$request -> session () -> regenerate ();
2021-06-23 09:17:51 +02:00
return redirect () -> intended ( route ( 'fo.access' ));
2021-05-08 06:50:19 +02:00
}
public function passwordForgottenSubmit ( EmployeeForgottenPasswordRequest $request )
{
2022-06-22 10:15:45 +02:00
/** @var \App\Models\Employee */
2021-05-08 06:50:19 +02:00
$employee = Employee :: where ( 'matricule' , $request -> matricule ) -> firstOrFail ();
2022-06-22 10:15:45 +02:00
/** @var \App\Models\EmployeeMailToken */
2022-06-30 15:05:38 +02:00
$token = EmployeeMailToken :: whereHas ( 'employee' , function ( $q ) use ( $employee ) {
$q -> where ( 'id' , $employee -> id );
}) -> firstOrNew ();
$token -> email = $employee -> email ;
$token -> employee () -> associate ( $employee );
2021-05-08 06:50:19 +02:00
$token -> saveOrFail ();
2022-06-22 10:15:45 +02:00
SendMailResetPasswordToEmployee :: dispatchAfterResponse ( $employee , $token );
2021-05-08 06:50:19 +02:00
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 ();
2021-07-22 14:05:29 +02:00
return redirect () -> route ( 'fo.access' );
2021-05-08 06:50:19 +02:00
}
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' );
}
2021-07-22 14:05:29 +02:00
return redirect () -> route ( 'fo.access' );
2021-05-08 06:50:19 +02:00
}
public function passwordChangeSubmit ( EmployeePasswordChangeRequest $request )
{
2021-07-22 14:05:29 +02:00
/** @var \app\Models\Employee */
$employee = auth ( 'employee' ) -> user ();
2021-05-08 06:50:19 +02:00
$employee -> password = $request -> newpassword ;
$employee -> saveOrFail ();
if ( Session :: has ( 'required' )) {
Session :: remove ( 'required' );
Session :: save ();
2021-06-23 09:17:51 +02:00
return redirect () -> route ( 'fo.access' )
2021-07-15 02:05:00 +02:00
-> with ( 'message' , trans ( 'Votre mot de passe a bien été mis à jour' ));
2021-05-08 06:50:19 +02:00
}
return \redirect () -> back () -> with ( 'success' , true );
}
public function mailUpdate ( EmployeeMailChangeRequest $request )
{
2021-07-22 14:05:29 +02:00
/** @var \app\Models\Employee */
$employee = auth ( 'employee' ) -> user ();
2021-05-08 06:50:19 +02:00
$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 ()
);
}
}