Files
CSiCoDB2/app/Controllers/Orari.php
T
2026-05-06 11:04:41 +02:00

471 lines
16 KiB
PHP

<?php namespace App\Controllers;
use App\Libraries\Crud;
use App\Models\Lavoratori_Model;
use App\Models\Commesse_Model;
use App\Models\TipoOre_Model;
use App\Models\TipiWork_Model;
use App\Models\Orari_Model;
use App\Models\Spese_Model;
class Orari extends CRUDController {
// Tab: Orari = ['orIDorario', 'orIDcommessa', 'orIDlavoratore', 'orData', 'orOre', 'orIDTipoOre', 'orIDTipoWork', 'orDescrizione'];
protected $crud;
function __construct() {
$params = [
'table' => 'Orari',
'dev' => false,
'fields' => $this->field_options(),
'form_title_add' => 'Add Orario',
'form_title_update' => 'Edit Orario',
'form_submit' => 'Add',
'table_title' => 'Pagina per la tabella Orari',
'form_submit_update' => 'Update',
'base' => '',
'UpdatedAt' => '',
'DeletedAt' => '',
];
$this->crud = new Crud($params, service('request'));
}// __construct
protected function field_options() {
$fields = [];
$fields['orIDorario'] = ['label' => 'ID', 'helper' => 'Identificativo univoco del record nel database'];
$fields['orIDcommessa'] = [
'label' => 'Commessa',
'required' => true,
'type' => 'dropdown',
'helper' => 'Commessa a cui si riferisce l\'orario',
'relation' => [
'table'=> 'Commesse',
'primary_key' => 'coIDcommessa',
'display' => ['coNome'],
'order_by' => 'coUpdatedAt',
'order' => 'DESC'
]
];
$fields['orIDlavoratore'] = [
'label' => 'Lavoratore',
'required' => true,
'type' => 'dropdown',
'helper' => 'Lavoratore a cui si riferisce l\'orario',
'relation' => [
'table'=> 'Lavoratori',
'primary_key' => 'lvIDlavoratore',
'display' => ['lvNickname', 'lvNome', 'lvCognome'], //'display' => ['lvNickname'],
'order_by' => 'lvNickname',
'order' => 'ASC'
]
];
$fields['orData'] = ['label' => 'Data', 'helper' => 'Data dell\'orario','required' => true];
$fields['orOre'] = ['label' => 'Durata', 'helper' => 'Durata dell\'orario di lavoro. Approssimare al quarto d\'ora (0.25)', 'required' => true];
$fields['orIDTipoOre'] = [
'label' => 'Tipologia',
'required' => true,
'type' => 'dropdown',
'helper' => 'Tipologia dell\'orario',
'relation' => [
'table'=> 'TipoOre',
'primary_key' => 'toIDTipoOre',
'display' => ['toDescrizione'],
'order_by' => 'toOrdinamento',
'order' => 'ASC'
]
];
$fields['orDescrizione'] = ['label' => 'Descrizione', 'helper' => 'Descrizione esaustiva di quanto fatto durante l\'orario inserito','required' => true];
return $fields;
}// field_options
public function index() { return $this->CRUD_view(['orIDorario', 'orIDcommessa', 'orIDlavoratore', 'orData', 'orOre', 'orIDTipoOre', 'orIDTipoWork', 'orDescrizione']); }
//--------------------------------------------------------------------
// Auto CRUD terminato
//--------------------------------------------------------------------
//--------------------------------------------------------------------
public function add(){
helper(['tools','form']);
$data['Data'] = date('Y-m-d');
$model = new Orari_Model();
// Verifico sessione e livello:
if (!CheckLevel(1)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/add -> Error code 001'); }
return redirect()->to('/Lavoratori/login');
}
// Ricavo livello del lavoratore (solo amministratori o superiori, possono editare tutti i campi)
$enable = CheckLevel(3, false);
// Gestione POST
if ($this->request->getMethod() == 'post') {
// Regole per validare i campi introdotti nel form:
//
$rules = [
'IDcommessa' => 'trim|required',
'Data' => 'trim|required',
'Durata' => 'trim|required',
'IDTipoOre' => 'trim|required',
'IDTipoWork' => 'trim|required',
'Descrizione' => 'trim|required|min_length[8]',
];
if ($enable){
$rules['IDlavoratore'] = 'trim|required';
}
// 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'inserimento
// Tab: Orari = ['orIDorario', 'orIDcommessa', 'orIDlavoratore', 'orData', 'orOre', 'orIDTipoOre', 'orIDTipoWork', 'orDescrizione'];
$newData = [
'orIDcommessa' => $this->request->getVar('IDcommessa'),
'orData' => $this->request->getVar('Data'),
'orOre' => $this->request->getVar('Durata'),
'orIDTipoOre' => $this->request->getVar('IDTipoOre'),
'orIDTipoWork' => $this->request->getVar('IDTipoWork'),
'orDescrizione' => $this->request->getVar('Descrizione'),
];
if ($enable){
$newData['orIDlavoratore'] = $this->request->getVar('IDlavoratore');
} else {
$newData['orIDlavoratore'] = session()->get('lavoratore')->lvIDlavoratore;
}
if ($model->save($newData)) {
session()->setFlashdata('success', 'Record inserito con successo sul DB');
UpdateCommessa($newData['orIDcommessa']);
if(isset($_POST['crea_continua'])) {
// è stato premuto il secondo pulsante, quindi inserisco un secondo valore:
//return redirect()->to('/dashboard/orari');
} else {
return redirect()->to('/dashboard/orari');
}
} else {
session()->setFlashdata('danger', 'Errore durante l\'inserimento del record nel DB.');
}
}// analisi validazione
}// Gestione POST
// Rileggo i dati dal DB
$data['enable'] = $enable;
// Ricavo i dati per il select delle commesse:
$modelCommesse = new Commesse_Model();
$data['select_commesse'] = $modelCommesse->get_select();
// Ricavo i dati per il select dei lavoratori:
$modelLavoratori = new Lavoratori_Model();
$data['select_lavoratori'] = $modelLavoratori->get_select();
// Ricavo i dati per il select deila tipologia di ore:
$modelTipoOre = new TipoOre_Model();
$data['select_tipo_ore'] = $modelTipoOre->get_select();
// Ricavo i dati per il select deila tipologia di lavoro:
$modelTipiWork = new TipiWork_Model();
$data['select_tipi_work'] = $modelTipiWork->get_select();
// Show profile
echo view('pages/orari/orari_form_add', $data);
} // function add($id)
//--------------------------------------------------------------------
public function edit($IDorario = null){
helper(['tools','form']);
$data = [];
$model = new Orari_Model();
// Verifico sessione e livello:
if (!CheckLevel(1)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/edit -> Error code 001'); }
return redirect()->to('/Lavoratori/login');
}
// Ricavo livello del lavoratore (solo amministratori o superiori, possono editare tutti i campi)
$enable = CheckLevel(3, false);
// Verifico dato introdotto:
if ($IDorario==null) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/edit -> Error code 002'); }
return redirect()->to('/dashboard');
}
// Ricavo il profilo dell'orario da editare
$orario = $model->where('orIDorario', $IDorario)
->first();
// Verifico che esista il record dell'orario:
if (null==$orario) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/edit -> Error code 003'); }
return redirect()->to('/dashboard');
}
// Verifico se posso editare il campo:
// - utente amministratore o superiore, può editare tutti i campi
// - utente normale può editare solo i propi orari
$lav = session()->get('lavoratore');
if ((!$enable) && ($lav->lvIDlavoratore<>$orario->orIDlavoratore)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/edit -> Error code 004'); }
return redirect()->to('/dashboard');
}
// Gestione POST
if ($this->request->getMethod() == 'post') {
// Regole per validare i campi introdotti nel form:
//
$rules = [
'IDorario' => 'trim|required',
'IDcommessa' => 'trim|required',
'Data' => 'trim|required',
'Durata' => 'trim|required',
'IDTipoOre' => 'trim|required',
'IDTipoWork' => 'trim|required',
'Descrizione' => 'trim|required',
];
if ($enable){
//$rules['Level'] = 'trim|required|min_length[8]|max_length[255]';
$rules['IDlavoratore'] = 'trim|required';
}
// 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 = [
'orIDorario' => $orario->orIDorario,
'orIDcommessa' => $this->request->getVar('IDcommessa'),
'orData' => $this->request->getVar('Data'),
'orOre' => $this->request->getVar('Durata'),
'orIDTipoOre' => $this->request->getVar('IDTipoOre'),
'orIDTipoWork' => $this->request->getVar('IDTipoWork'),
'orDescrizione' => $this->request->getVar('Descrizione'),
];
if ($enable){
$newData['orIDlavoratore'] = $this->request->getVar('IDlavoratore');
}
if ($model->save($newData)) {
session()->setFlashdata('success', 'Successfuly Updated');
UpdateCommessa($newData['orIDcommessa']);
return redirect()->to('/dashboard/orari');
} else {
session()->setFlashdata('danger', 'Errore durante l\'update del record nel DB.');
}
}// analisi validazione
}// Gestione POST
// Rileggo i dati dal DB
$data['orario'] = $orario;
$data['enable'] = $enable;
// Ricavo i dati per il select delle commesse:
$modelCommesse = new Commesse_Model();
$data['select_commesse'] = $modelCommesse->get_select();
// Ricavo i dati per il select dei lavoratori:
$modelLavoratori = new Lavoratori_Model();
$data['select_lavoratori'] = $modelLavoratori->get_select();
// Ricavo i dati per il select deila tipologia di ore:
$modelTipoOre = new TipoOre_Model();
$data['select_tipo_ore'] = $modelTipoOre->get_select();
// Ricavo i dati per il select deila tipologia di lavoro:
$modelTipiWork = new TipiWork_Model();
$data['select_tipi_work'] = $modelTipiWork->get_select();
// Show profile
echo view('pages/orari/orari_form_edit', $data);
} // function edit($id)
//--------------------------------------------------------------------
public function delete($IDorario = null){
helper(['tools']);
$data = [];
$model = new Orari_Model();
// Verifico sessione e livello:
if (!CheckLevel(1)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/delete -> Error code 001'); }
return redirect()->to('/Lavoratori/login');
}
// Ricavo livello del lavoratore (solo amministratori o superiori, possono editare tutti i campi)
$enable = CheckLevel(3, false);
// Verifico dato introdotto:
if ($IDorario==null) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/delete -> Error code 002'); }
return redirect()->to('/dashboard');
}
// Ricavo il record dell'orario da editare
$orario = $model->where('orIDorario', $IDorario)
->first();
// Verifico che esista il record dell'orario:
//if (null==$orario) { return redirect()->to('/dashboard'); }
if (!isset($orario)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/delete -> Error code 003'); }
return redirect()->to('/dashboard');
}
// Verifico se posso editare il record:
// - utente amministratore o superiore, cancellare qualunque orario
// - utente normale può cancellare solo i propi orari
$lav = session()->get('lavoratore');
if ((!$enable) && ($lav->IDlavoratore<>$orario->IDlavoratore)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/delete -> Error code 004'); }
return redirect()->to('/dashboard');
}
// Elimino il record:
if ($model->delete($IDorario)) {
session()->setFlashdata('success', 'Recors cancellato correttamente.');
} else {
$data['validation'] = $this->validator;
session()->setFlashdata('warning', 'Errore durante la cancellazione del record.');
}
// Show profile
return redirect()->to('/dashboard/orari');
} // function delete($id)
//--------------------------------------------------------------------
public function export_csv(){
helper(['tools','form']);
// Verifico sessione e livello:
if (!CheckLevel(1)) {
if (ENVIRONMENT === 'development') { session()->setFlashdata('warning', '/Orari/export_csv -> Error code 001'); }
return redirect()->to('/Lavoratori/login');
}
// Ricavo le ore dell'utente:
// Tab: Orari = ['orIDorario', 'orIDcommessa', 'orIDlavoratore', 'orData', 'orOre', 'orIDTipoOre', 'orDescrizione'];
// Tab: Lavoratori = ['lvIDlavoratore', 'lvNome', 'lvCognome', 'lvMail', 'lvLevel', 'lvRimborsoKm', 'lvNickname', 'lvPassword', 'lvCreatedAt', 'lvUpdatedAt', 'lvDeletedAt'];
// Tab: Commesse = ['coIDcommessa', 'coNome', 'coIDcliente', 'coDescrizione', 'coIDstatoCommessa', 'coModificatoIl', 'coCreatedAt', 'coUpdatedAt', 'coDeletedAt'];
$model = new Orari_Model();
$model->join('Lavoratori', 'Lavoratori.lvIDlavoratore = Orari.orIDlavoratore');
$model->join('Commesse', 'Commesse.coIDcommessa = Orari.orIDcommessa');
$model->join('TipoOre', 'TipoOre.toIDTipoOre = Orari.orIDTipoOre');
// Costruisco la query per selezionare le ore da esportare:
// - applico il filtro sull'intervallo temporale:
$model->where('orData >=', session()->get('filter_dal'))
->where('orData <=', session()->get('filter_al') . " 23:59:59");
// - applico eventuale filtro per lavoratore
if (session()->filter_lavoratore!='-1') { $model->where('orIDlavoratore', session()->get('filter_lavoratore')); }
// - applico eventuale filtro per commessa
if (session()->filter_commessa!='-1') { $model->where('orIDcommessa', session()->get('filter_commessa')); }
// - applico eventuale filtro per tipologia di ora:
if (session()->filter_tipo_ore!='-1') { $model->where('orIDTipoOre', session()->get('filter_tipo_ore')); }
// imposto l'ordinamento richiesto:
CheckSort('orari',true);
$data['sortCol'] = session()->get('sort')['col'];
$data['sortDir'] = session()->get('sort')['dir'];
$model->orderBy($data['sortCol'], $data['sortDir']);
// eseguo la query:
$data['dataset'] = $model->asArray()
->findAll();
// Imposto il nome del file da downloadare:
$filepath = $_SERVER['MRK_FILE_PATH'];
$filename = 'CSiCoDB_Orari_il_' . date('Y-m-d_H-i-s') . '.csv';
// file creation
$file = fopen($filepath . $filename,"w");
// Esport header
fputcsv($file,['IDorario','IDcommessa','Commessa','IDlavoratore','Lavoratore','Il','Durata','IDTipoOre','Tipologia','IDTipoWork','Descrizione']);
foreach ($data['dataset'] as $line){
//fputcsv($file,$line);
// Seleziono le colonne da esportare:
$record = [];
$record['orIDorario'] = $line['orIDorario'];
$record['orIDcommessa'] = $line['orIDcommessa'];
$record['coNome'] = $line['coNome'];
$record['orIDlavoratore'] = $line['orIDlavoratore'];
$record['lvNickname'] = $line['lvNickname'];
$record['orData'] = $line['orData'];
$record['orOre'] = $line['orOre'];
$record['orIDTipoOre'] = $line['orIDTipoOre'];
$record['toDescrizione'] = $line['toDescrizione'];
$record['orIDTipoWork'] = $line['orIDTipoWork'];
$record['orDescrizione'] = $line['orDescrizione'];
fputcsv($file,$record);
}
// Chiudo il file
fclose($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 Orari