Files
2026-05-06 11:04:41 +02:00

493 lines
17 KiB
PHP

<?php namespace App\Controllers;
use App\Libraries\Crud;
use App\Models\Lavoratori_Model;
class Lavoratori extends CRUDController {
// Tab: Lavoratori = ['lvIDlavoratore', 'lvNome', 'lvCognome', 'lvMail', 'lvLevel', 'lvRimborsoKm', 'lvNickname', 'lvPassword', 'lvCreatedAt', 'lvUpdatedAt', 'lvDeletedAt'];
protected $crud;
function __construct() {
$params = [
'table' => 'Lavoratori',
'dev' => false,
'fields' => $this->field_options(),
'form_title_add' => 'Add Issue',
'form_title_update' => 'Edit Issue',
'form_submit' => 'Add',
'table_title' => 'Pagina per la tabella Lavoratori',
'form_submit_update' => 'Update',
'base' => '',
'UpdatedAt' => 'lvUpdatedAt',
'DeletedAt' => 'lvDeletedAt',
];
$this->crud = new Crud($params, service('request'));
}// __construct
protected function field_options() {
$fields = [];
$fields['lvIDlavoratore'] = ['label' => 'ID Lavoratore'];
$fields['lvNome'] = ['label' => 'Nome', 'helper' => 'Nome del lavoratore (max 64 caratteri)', 'required' => true];
$fields['lvCognome'] = ['label' => 'Cognome', 'helper' => 'Cognome del lavoratore (max 64 caratteri)', 'required' => true];
$fields['lvMail'] = ['label' => 'email', 'helper' => 'Indirizzo mail del lavoratore (max 128 caratteri)', 'required' => true, 'unique' => [true, 'lvMail']];
$fields['lvLevel'] = ['label' => 'Livello', 'helper' => 'Livello di accesso alla webapp: 0=Guest; 1=Oper; 2=Inven; 3=Admin; 4=Root', 'required' => true];
$fields['lvRimborsoKm'] = ['label' => '€/Km', 'helper' => 'Rimborso chilometrico riconosciuto al lavoratore', 'required' => true];
$fields['lvNickname'] = ['label' => 'Nickname', 'helper' => 'Nickname del lavoratore nella forma CSiCoCCN', 'required' => true, 'unique' => [true, 'lvNickname']];
$fields['lvPassword'] = [
'label' => 'Password',
'required' => true,
'only_add' => true,
'type' => 'password',
'confirm' => true,
'password_hash' => true,
'helper' => 'Password per il riconoscimento del lavoratore (min 8 caratteri)'
];
$fields['lvCreatedAt'] = ['label' => 'Created at', 'helper' => 'Data di creazione del record relativo nel database', 'only_edit'=> true];
$fields['lvUpdatedAt'] = ['label' => 'Updated at', 'helper' => 'Timestamp dell\'ultimo aggiornamento del record nel database', 'type' => 'unset'];
$fields['lvDeletedAt'] = ['label' => 'Deleted at', 'helper' => 'Data di cancellazione del record relativo nel database', 'type' => 'unset'];
return $fields;
}// field_options
public function index() { return $this->CRUD_view(['lvIDlavoratore', 'lvNickname', 'lvNome', 'lvCognome', 'lvMail', 'lvLevel', 'lvRimborsoKm', 'lvCreatedAt', 'lvUpdatedAt', 'lvDeletedAt']); }
//--------------------------------------------------------------------
// Auto CRUD terminato
//--------------------------------------------------------------------
// funzione per reinizializzare un utente senza loggarsi, utile in caso di problemi per avere un nuovo amministratore e potersi collegare.
// http://localhost/Lavoratori/reinizzializza/CSiCoAlm/4/password/127
public function Reinizzializza($Nickname = 'CSiCoZZZ', $Level = '0', $Password = 'password', $CheckId = 0){
if ($CheckId<>127) {
// Se non siamo loggati
session()->setFlashdata('danger', 'Reinizzializzazione del lavoratore non autorizzata.');
return redirect()->to('/dashboard');
}
// Ricavo l'ID del lavoratore indicato:
$model = new Lavoratori_Model();
$lav = $model->where('lvNickname', $Nickname)
->first();
if (!isset($lav)) {
// Lavoratore non trovato
session()->setFlashdata('danger', 'Lavoratore da reinizzializzare non trovato.');
return redirect()->to('/dashboard');
}
// Preparo i dati per l'aggiornamento
$newData = [
'lvIDlavoratore' => $lav->lvIDlavoratore,
'lvLevel' => $Level,
'lvPassword' => $Password,
];
// Eseguo update del record
if ($model->save($newData)) {
session()->setFlashdata('success', 'Lavoratore reinizzializzato correttamente.');
return redirect()->to('/dashboard');
} else {
session()->setFlashdata('warning', 'Reinizzializzazione non riuscita.');
return redirect()->to('/dashboard');
}
} // function Reinizzializza
//--------------------------------------------------------------------
public function logout(){
session()->destroy();
return redirect()->to('/Lavoratori/login');
}//function logout
//--------------------------------------------------------------------
public function login (){
$data = [];
helper(['tools','form']);
// Gestione POST data dal form
if ($this->request->getMethod() == 'post') {
// Regole per validare i campi introdotti nel form:
$rules = [
'Nickname' => 'required|min_length[8]|max_length[8]',
'Password' => 'required|min_length[8]|max_length[255]',
];
// analisi della validazione
if (! $this->validate($rules)) {
// Validazione non passata, mostro errori sulla flash di warning
$data['validation'] = $this->validator;
session()->setFlashdata('warning', $data['validation']->listErrors());
} else {
// validazione passata
// ricavo il lavoratore dai dati inseriti
$model = new Lavoratori_Model();
$lav = $model->where('lvNickname', $this->request->getVar('Nickname'))
->first();
if (isset($lav) && (password_verify($this->request->getVar('Password'), $lav->lvPassword))) {
// Verifico se lavoratore abilitato:
if (password_verify($this->request->getVar('Password'), $lav->lvPassword)){
// Utente riconosciuto, inizio la sessione di lavoro
if (setUserSession($lav)){
session()->setFlashdata('success', 'Utente abilitato correttamente');
return redirect()->to('/dashboard');
} else {
session()->setFlashdata('warning', 'Errore durante la creazione della sessione di lavoro.<br> Riprovare e se l\'errore si ripete, contattare l\'amministratore.');
}
} else {
// utente non riconosciuto, ritorno al login
session()->setFlashdata('warning', 'Errore, lavoratore non riconosciuto.<br> Riprovare e se l\'errore si ripete, contattare l\'amministratore.');
}
} else {
// Coppia nickname/password non corretta.
session()->setFlashdata('warning', 'Errore, lavoratore non riconosciuto.<br> Riprovare e se l\'errore si ripete, contattare l\'amministratore.');
}
}// analisi della validazione
}// Gestione POST data dal form
// Show login page
echo view('pages/lavoratori/lavoratori_form_login', $data);
}//function login
//--------------------------------------------------------------------
public function profile($id = null){
$data = [];
helper(['tools','form']);
$model = new Lavoratori_Model();
// Verifico sessione e livello:
if (!CheckLevel(0)) { return redirect()->to('/dashboard'); }
// Ricavo livello del lavoratore (solo amministratori o superiori, possono editare tutte del lavoratore)
$enable = CheckLevel(3,false);
// Ricavo l'ID del lavoratore di cui editare il profilo:
if (!isset($id)) {
$id = session()->get('lavoratore')->lvIDlavoratore;
}
// Ricavo il profilo del lavoratore da editare
$lav = $model->where('lvIDlavoratore', $id)
->first();
// Gestione POST
if ($this->request->getMethod() == 'post') {
// Regole per validare i campi introdotti nel form:
//
// L'utente normale può editare solo nome, cognome e quando vuole anche la password.
// L'utente amministratore o superiore, può editare tutto dell'utente.
$rules = [
//'IDlavoratore' => '',
'Nome' => 'trim|required|min_length[3]|max_length[64]',
'Cognome' => 'trim|required|min_length[3]|max_length[64]',
];
if ($enable){
$rules['Mail'] = 'required|min_length[6]|max_length[50]|valid_email';
$rules['Nickname'] = 'trim|required|min_length[8]|max_length[8]';
$rules['RimborsoKm'] = 'required';
}
if($this->request->getPost('NewPassword') != ''){
$rules['NewPassword'] = 'required|min_length[8]|max_length[255]';
$rules['ConfirmNewPassword'] = 'matches[NewPassword]';
}
// analisi della validazione
if (! $this->validate($rules)) {
$data['validation'] = $this->validator;
session()->setFlashdata('warning', $data['validation']->listErrors());
}else{
// validazione passata
// Preparo i dati per l'aggiornamento
$newData = [
'lvIDlavoratore' => $lav->lvIDlavoratore,
'lvNome' => $this->request->getVar('Nome'),
'lvCognome' => $this->request->getVar('Cognome'),
];
if ($enable){
$newData['lvLevel'] = $this->request->getVar('Livello');
$newData['lvMail'] = $this->request->getVar('Mail');
$newData['lvNickname'] = $this->request->getVar('Nickname');
$newData['lvRimborsoKm'] = $this->request->getVar('RimborsoKm');
}
if($this->request->getPost('NewPassword') != ''){
$newData['lvPassword'] = $this->request->getPost('NewPassword');
}
if ($model->save($newData)) {
session()->setFlashdata('success', 'Successfuly Updated');
return redirect()->to('/dashboard');
} else {
session()->setFlashdata('danger', 'Errore durante l\'update del record nel DB.');
}
}// analisi validazione
}// Gestione POST
// Rileggo i dati dal DB
$data['lavoratore'] = $lav;
$data['enable'] = $enable;
// Show profile
echo view('pages/lavoratori/lavoratori_form_profile', $data);
} // function profile
//--------------------------------------------------------------------
public function delete($id = null){
$data = [];
helper(['tools','form']);
// Verifico sessione e livello:
if (!CheckLevel(3,false)) { return redirect()->to('/Lavoratori/anagrafica'); }
// Verifico di non cancellare me stesso:
if (session()->get('lavoratore')->lvIDlavoratore==$id) {
session()->setFlashdata('warning', 'L\'utente non può cancellare se stesso.');
return redirect()->to('/Lavoratori/anagrafica');
}
// Elimino il record:
$model = new Lavoratori_Model();
if ($model->delete($id)) {
session()->setFlashdata('success', 'Recors cancellato correttamente.');
} else {
session()->setFlashdata('warning', 'Errore durante la cancellazione del record.');
}
return redirect()->to('/Lavoratori/anagrafica');
} // function delete
//--------------------------------------------------------------------
public function register(){
$data = [];
helper(['tools','form']);
// // Verifico sessione e livello:
// if (CheckLevel(0,false)) { return redirect()->to('/dashboard'); } // non faccio il test così lo uso anche per creare nuovo utente dalla pagina anagrafica
// Gestione POST data dal form
if ($this->request->getMethod() == 'post') {
// Regole per validare i campi introdotti nel form:
$rules = [
'Nome' => 'required|min_length[3]|max_length[64]',
'Cognome' => 'required|min_length[3]|max_length[64]',
'Password' => 'required|min_length[8]|max_length[255]',
'PasswordConfirm' => 'matches[Password]',
];
// analisi della validazione
if (! $this->validate($rules)) {
// Validazione non passata, mostro errori sulla flash di warning
$data['validation'] = $this->validator;
session()->setFlashdata('warning', $data['validation']->listErrors());
}else{
// validazione passata
$model = new Lavoratori_Model();
$nom = $this->request->getVar('Nome');
$cogn = $this->request->getVar('Cognome');
// Preparo i dati del nuovo record
$newData = [
'lvNome' => $nom,
'lvCognome' => $cogn,
'lvMail' => strtolower($nom) . "." . strtolower($cogn) . "@csico.it",
'lvLevel' => 0,
'lvRimborsoKm' => 0.0,
'lvNickname' => 'CSiCo'.(substr(strtoupper($cogn), 0, 1)).(substr(strtolower($cogn), 1, 1)).(substr(strtolower($nom), 0, 1)),
'lvPassword' => $this->request->getVar('Password'),
];
// Inserisco il nuovo record
if ($model->save($newData)){
session()->setFlashdata('success', 'Dati acquisiti, attendere la mail di conferma per l\'abilitazione completa');
//return redirect()->to('/dashboard');
return redirect()->to('/Lavoratori/anagrafica'); // uso register anche nell'anagrafica
} else {
session()->setFlashdata('danger', 'Errore durante l\'inserimento del record nel DB.');
}
}// analisi validazione
}// Gestione POST
echo view('pages/lavoratori/lavoratori_form_register', $data);
} // function register
//--------------------------------------------------------------------
public function anagrafica(){
$data['tab'] = 'amministrazione';
helper(['tools','form']);
// Verifico sessione e livello:
if (!CheckLevel(1)) { return redirect()->to('/dashboard'); }
$model = new Lavoratori_Model();
// imposto l'ordinamento richiesto:
CheckSort('anagrafica',true);
$data['sortCol'] = session()->get('sort')['col'];
$data['sortDir'] = session()->get('sort')['dir'];
$model->orderBy($data['sortCol'], $data['sortDir']);
// // imposto l'ordinamento richiesto:
// $order_field = session()->get('sort_lavoratori_field');
// $order_direction = session()->get('sort_lavoratori_val');
// $model->orderBy($order_field, $order_direction);
$data['dataset'] = $model->paginate(session()->get('pager_num'));
$data['pager'] = $model->pager;
// Show anagrafica
echo view('pages/lavoratori/lavoratori_anagrafica', $data);
} // function anagrafica
//--------------------------------------------------------------------
// Funzione per resettare la password dell'utente indicato con la standard password.
// TODO Deve inviare mail di conferma all'utente.
public function reset($id){
$data = [];
helper(['tools','form']);
// Verifico sessione e livello:
if (!CheckLevel(0)) { return redirect()->to('/Lavoratori/login'); }
// Se non abbiamo il livello amministrativo non posso resettare la password a meno che non sia la mia.
$lav = session()->get('lavoratore');
if ((CheckLevel(3, false)) || ($lav->lvIDlavoratore==$id)){
//Resetto password con quella standard: password
// Preparo i dati per l'aggiornamento
$newData = [
'lvIDlavoratore' => $id,
'lvPassword' => 'password',
];
// Eseguo update del record
$model = new Lavoratori_Model();
if ($model->save($newData)) {
session()->setFlashdata('success', 'Password resettata correttamente.');
} else {
session()->setFlashdata('warning', 'Reset password non riuscito.');
}
} else{
// non resetto la password
session()->setFlashdata('warning', 'Reset password non consentito.');
}
return redirect()->to('/Lavoratori/anagrafica');
} // function reset
//--------------------------------------------------------------------
public function export_csv(){
helper(['tools']);
// Verifico sessione e livello:
if (!CheckLevel(1)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Lavoratori/export_csv -> Error code 001'); }
return redirect()->to('/dashboard');
}
// Ricavo le ore dell'utente:
// Tab: Lavoratori = ['lvIDlavoratore', 'lvNome', 'lvCognome', 'lvMail', 'lvLevel', 'lvRimborsoKm', 'lvNickname', 'lvPassword', 'lvCreatedAt', 'lvUpdatedAt', 'lvDeletedAt'];
$model = new Lavoratori_Model();
// imposto l'ordinamento richiesto:
CheckSort('anagrafica',true);
$sortCol = session()->get('sort')['col'];
$sortDir = session()->get('sort')['dir'];
$model->orderBy($sortCol, $sortDir);
// eseguo la query:
$data['dataset'] = $model->asArray()
->findAll();
// Imposto il nome del file da downloadare:
$filepath = $_SERVER['MRK_FILE_PATH'];
$filename = 'CSiCoDB_Lavoratori_il_' . date('Y-m-d_H-i-s') . '.csv';
// file creation
$file = fopen($filepath . $filename,"w");
// Esport header
fputcsv($file,['ID','Nome','Cognome','Mail','Level','RimborsoKm','Nickname','Hash Password','CreatedAt','UpdatedAt','DeletedAt']);
foreach ($data['dataset'] as $line){
fputcsv($file,$line);
}
// Chiudo il file
// download
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Type: application/csv; ");
readfile($filepath . $filename);
// deleting file
unlink($filepath . $filename);
exit();
}//function export_csv
//--------------------------------------------------------------------
}//class Lavoratori