Bugfix e miglioramenti

Fix di alcuni bug distribuiti nei vari moduli e aggiornamento dei campi "idutente" del database a "id_utente" per maggiore omogeneità.
This commit is contained in:
Thomas Zilio 2017-09-01 18:13:25 +02:00
parent 4d8a35d5da
commit 343943aede
28 changed files with 230 additions and 237 deletions

View File

@ -5,6 +5,7 @@ function serverError()
$error = error_get_last();
if ($error['type'] == E_ERROR) {
ob_end_clean();
print_r($error);
die(API::error('serverError'));
}
}
@ -39,11 +40,6 @@ try {
$result = $api->create($request);
break;
case 'GET':
if (empty($request)) {
$request = Filter::getGET();
unset($request['token']);
}
if (!empty($request)) {
$result = $api->retrieve($request);
} else {

View File

@ -526,8 +526,10 @@ span.form-control {
.main-header .logo {
display: none;
}
.fixed .content-wrapper,
.fixed .right-side {
.content-wrapper,
.right-side,
.left-side,
.main-sidebar {
padding-top: 50px;
}
}
@ -552,3 +554,9 @@ div.DTS tbody th {
word-wrap: break-word;
max-width: 500px;
}
.table-responsive th,
.table-responsive td,
input {
min-width: 200px;
}

View File

@ -10,9 +10,9 @@ if (isset($id_record)) {
$posizione .= ', '.$id_record;
}
$dbo->query('UPDATE zz_semaphores SET updated = NOW() WHERE id_utente = '.prepare($_SESSION['idutente']).' AND posizione = '.prepare($posizione));
$dbo->query('UPDATE zz_semaphores SET updated = NOW() WHERE id_utente = '.prepare($_SESSION['id_utente']).' AND posizione = '.prepare($posizione));
$dbo->query('DELETE FROM zz_semaphores WHERE DATE_ADD(updated, INTERVAL '.(get_var('Timeout notifica di presenza (minuti)') * 2).' SECOND) <= NOW()');
$datas = $dbo->fetchArray('SELECT DISTINCT * FROM zz_semaphores INNER JOIN zz_users ON zz_semaphores.id_utente=zz_users.idutente WHERE id_utente != '.prepare($_SESSION['idutente']).' AND posizione = '.prepare($posizione));
$datas = $dbo->fetchArray('SELECT DISTINCT * FROM zz_semaphores INNER JOIN zz_users ON zz_semaphores.id_utente=zz_users.id_utente WHERE zz_semaphores.id_utente != '.prepare($_SESSION['id_utente']).' AND posizione = '.prepare($posizione));
$result = [];
if ($datas != null) {

View File

@ -235,7 +235,7 @@ if (!API::isAPIRequest()) {
// Retrocompatibilità
$user_idanagrafica = $user['idanagrafica'];
$rs = $dbo->fetchArray('SELECT * FROM `zz_modules` LEFT JOIN (SELECT `idmodule`, `permessi` FROM `zz_permissions` WHERE `idgruppo`=(SELECT `idgruppo` FROM `zz_users` WHERE `idutente`='.prepare($_SESSION['idutente']).')) AS `zz_permissions` ON `zz_modules`.`id`=`zz_permissions`.`idmodule` LEFT JOIN (SELECT `idmodule`, `clause` FROM `zz_group_module` WHERE `idgruppo`=(SELECT `idgruppo` FROM `zz_users` WHERE `idutente`='.prepare($_SESSION['idutente']).')) AS `zz_group_module` ON `zz_modules`.`id`=`zz_group_module`.`idmodule`');
$rs = $dbo->fetchArray('SELECT * FROM `zz_modules` LEFT JOIN (SELECT `idmodule`, `permessi` FROM `zz_permissions` WHERE `idgruppo`=(SELECT `idgruppo` FROM `zz_users` WHERE `id_utente`='.prepare($_SESSION['id_utente']).')) AS `zz_permissions` ON `zz_modules`.`id`=`zz_permissions`.`idmodule` LEFT JOIN (SELECT `idmodule`, `clause` FROM `zz_group_module` WHERE `idgruppo`=(SELECT `idgruppo` FROM `zz_users` WHERE `id_utente`='.prepare($_SESSION['id_utente']).')) AS `zz_group_module` ON `zz_modules`.`id`=`zz_group_module`.`idmodule`');
$modules_info = [];
for ($i = 0; $i < count($rs); ++$i) {

View File

@ -28,8 +28,8 @@ include $docroot.'/actions.php';
$advanced_sessions = get_var('Attiva notifica di presenza utenti sul record');
if ($advanced_sessions) {
$dbo->query('DELETE FROM zz_semaphores WHERE id_utente='.prepare($_SESSION['idutente']).' AND posizione='.prepare($id_module.', '.$id_record));
$dbo->query('INSERT INTO zz_semaphores (id_utente, posizione, updated) VALUES ('.prepare($_SESSION['idutente']).', '.prepare($id_module.', '.$id_record).', NOW())');
$dbo->query('DELETE FROM zz_semaphores WHERE id_utente='.prepare($_SESSION['id_utente']).' AND posizione='.prepare($id_module.', '.$id_record));
$dbo->query('INSERT INTO zz_semaphores (id_utente, posizione, updated) VALUES ('.prepare($_SESSION['id_utente']).', '.prepare($id_module.', '.$id_record).', NOW())');
echo '
<div class="box box-warning box-solid text-center info-active hide">

View File

@ -45,7 +45,7 @@ class API extends \Util\Singleton
{
$user = Auth::user();
if (!self::isAPIRequest() || empty($user)) {
if (!self::isAPIRequest() || (empty($user) && self::getRequest()['resource'] != 'login')) {
throw new InvalidArgumentException();
}
}
@ -101,13 +101,18 @@ class API extends \Util\Singleton
$updated = $request['upd'];
$created = $request['crd'];
$dbo = Database::getConnection();
// Paginazione dell'API
$page = (int) $request['page'] ?: 0;
$length = Settings::get('Lunghezza pagine per API');
$database = Database::getConnection();
$dbo = $database;
$kind = 'retrieve';
$resources = self::getResources()[$kind];
$resource = $request['resource'];
if (!in_array($resource, $resources)) {
if (!in_array($resource, array_keys($resources))) {
$excluded = explode(',', Settings::get('Tabelle escluse per la sincronizzazione API automatica'));
if (!in_array($resource, $excluded)) {
$table = $resource;
@ -121,10 +126,6 @@ class API extends \Util\Singleton
include $filename;
}
// Paginazione dell'API
$page = (int) $request['page'] ?: 0;
$length = Settings::get('Lunghezza pagine per API');
// Generazione automatica delle query
if (empty($results) && !empty($table)) {
try {
@ -199,7 +200,8 @@ class API extends \Util\Singleton
}
// Database
$dbo = Database::getConnection();
$database = Database::getConnection();
$dbo = $database;
$dbo->query('START TRANSACTION');
@ -333,7 +335,13 @@ class API extends \Util\Singleton
*/
public static function getRequest()
{
return (array) json_decode(file_get_contents('php://input'), true);
$request = (array) json_decode(file_get_contents('php://input'), true);
if ($_SERVER['REQUEST_METHOD'] == 'GET' && empty($request)) {
$request = Filter::getGET();
}
return $request;
}
/**

View File

@ -45,22 +45,19 @@ class Auth extends \Util\Singleton
if ($database->isInstalled()) {
if (API::isAPIRequest()) {
$token = API::getRequest()['token'];
$token = !empty($token) ? $token : get('token');
$id = $database->fetchArray('SELECT `id_utente` FROM `zz_tokens` WHERE `token` = '.prepare($token))[0]['id_utente'];
}
// Controllo sulla sessione attiva
elseif (!empty($_SESSION['idutente'])) {
$id = $_SESSION['idutente'];
elseif (!empty($_SESSION['id_utente'])) {
$id = $_SESSION['id_utente'];
}
if (!empty($id)) {
$this->identifyUser($id);
}
if (!empty($_SESSION['idutente']) && $this->isAuthenticated()) {
$this->saveToSession();
}
$this->saveToSession();
}
}
@ -83,20 +80,20 @@ class Auth extends \Util\Singleton
$log['ip'] = get_client_ip();
$log['stato'] = self::$status['failed']['code'];
$users = $database->fetchArray('SELECT idutente, password, enabled FROM zz_users WHERE username = '.prepare($username).' LIMIT 1');
$users = $database->fetchArray('SELECT id_utente, password, enabled FROM zz_users WHERE username = '.prepare($username).' LIMIT 1');
if (!empty($users)) {
$user = $users[0];
if (!empty($user['enabled'])) {
$this->identifyUser($user['idutente']);
$this->identifyUser($user['id_utente']);
$module = $this->getFirstModule();
if (
$this->isAuthenticated() &&
$this->password_check($password, $user['password'], $user['idutente']) &&
$this->password_check($password, $user['password'], $user['id_utente']) &&
!empty($module)
) {
$log['idutente'] = $this->infos['idutente'];
$log['id_utente'] = $this->infos['id_utente'];
$log['stato'] = self::$status['success']['code'];
$this->saveToSession();
@ -105,7 +102,7 @@ class Auth extends \Util\Singleton
$log['stato'] = self::$status['unauthorized']['code'];
}
$this->logout();
$this->destory();
}
} else {
$log['stato'] = self::$status['disabled']['code'];
@ -154,7 +151,7 @@ class Auth extends \Util\Singleton
// Controllo in automatico per futuri cambiamenti dell'algoritmo di password
if ($rehash) {
$database = Database::getConnection();
$database->update('zz_users', ['password' => self::hashPassword($password)], ['idutente' => $user_id]);
$database->update('zz_users', ['password' => self::hashPassword($password)], ['id_utente' => $user_id]);
}
return $result;
@ -165,14 +162,16 @@ class Auth extends \Util\Singleton
*/
protected function saveToSession()
{
foreach ($this->infos as $key => $value) {
$_SESSION[$key] = $value;
}
if(session_status() == PHP_SESSION_ACTIVE && $this->isAuthenticated()){
foreach ($this->infos as $key => $value) {
$_SESSION[$key] = $value;
}
$identifier = md5($_SESSION['idutente'].$_SERVER['HTTP_USER_AGENT']);
if ((empty($_SESSION['last_active']) || time() < $_SESSION['last_active'] + (60 * 60)) && (empty($_SESSION['identifier']) || $_SESSION['identifier'] == $identifier)) {
$_SESSION['last_active'] = time();
$_SESSION['identifier'] = $identifier;
$identifier = md5($_SESSION['id_utente'].$_SERVER['HTTP_USER_AGENT']);
if ((empty($_SESSION['last_active']) || time() < $_SESSION['last_active'] + (60 * 60)) && (empty($_SESSION['identifier']) || $_SESSION['identifier'] == $identifier)) {
$_SESSION['last_active'] = time();
$_SESSION['identifier'] = $identifier;
}
}
}
@ -186,7 +185,7 @@ class Auth extends \Util\Singleton
$database = Database::getConnection();
try {
$results = $database->fetchArray('SELECT idutente, idanagrafica, username, (SELECT nome FROM zz_groups WHERE id=idgruppo) AS gruppo FROM zz_users WHERE idutente = '.prepare($user_id).' AND enabled = 1 LIMIT 1', false, ['session' => false]);
$results = $database->fetchArray('SELECT id_utente, idanagrafica, username, (SELECT nome FROM zz_groups WHERE id=idgruppo) AS gruppo FROM zz_users WHERE id_utente = '.prepare($user_id).' AND enabled = 1 LIMIT 1', false, ['session' => false]);
if (!empty($results)) {
$results[0]['is_admin'] = ($results[0]['gruppo'] == 'Amministratori');
@ -233,7 +232,7 @@ class Auth extends \Util\Singleton
*/
public function destory()
{
if ($this->isAuthenticated() || !empty($_SESSION['idutente'])) {
if ($this->isAuthenticated() || !empty($_SESSION['id_utente'])) {
$this->infos = null;
$this->first_module = null;

View File

@ -86,8 +86,8 @@ class Database extends Util\Singleton
$this->pdo = $pdo;
if (empty($this->charset)) {
$this->charset = version_compare($this->getMySQLVersion(), '5.5.3') >= 0 ? 'utf8mb4' : 'utf8';
if (empty($this->charset) && version_compare($this->getMySQLVersion(), '5.5.3') >= 0) {
$this->charset = 'utf8mb4';
}
// Fix per problemi di compatibilità delle password MySQL 4.1+ (da versione precedente)

View File

@ -54,6 +54,7 @@ class DateHandler implements HandlerInterface
{
$values['class'][] = 'text-center';
$values['class'][] = 'timestamp-picker';
$values['class'][] = 'timestamp-mask';
$values['value'] = (\Translator::getLocaleFormatter()->isTimestamp($values['value'])) ? $values['value'] : '';
}

View File

@ -38,7 +38,7 @@ class Modules
$user = Auth::user();
$results = $database->fetchArray('SELECT * FROM `zz_modules` LEFT JOIN (SELECT `idmodule`, `permessi` FROM `zz_permissions` WHERE `idgruppo` = (SELECT `idgruppo` FROM `zz_users` WHERE `idutente` = '.prepare($user['idutente']).')) AS `zz_permissions` ON `zz_modules`.`id`=`zz_permissions`.`idmodule` LEFT JOIN (SELECT `idmodule`, `clause`, `position` FROM `zz_group_module` WHERE `idgruppo` = (SELECT `idgruppo` FROM `zz_users` WHERE `idutente` = '.prepare($user['idutente']).') AND `enabled` = 1) AS `zz_group_module` ON `zz_modules`.`id`=`zz_group_module`.`idmodule`');
$results = $database->fetchArray('SELECT * FROM `zz_modules` LEFT JOIN (SELECT `idmodule`, `permessi` FROM `zz_permissions` WHERE `idgruppo` = (SELECT `idgruppo` FROM `zz_users` WHERE `id_utente` = '.prepare($user['id_utente']).')) AS `zz_permissions` ON `zz_modules`.`id`=`zz_permissions`.`idmodule` LEFT JOIN (SELECT `idmodule`, `clause`, `position` FROM `zz_group_module` WHERE `idgruppo` = (SELECT `idgruppo` FROM `zz_users` WHERE `id_utente` = '.prepare($user['id_utente']).') AND `enabled` = 1) AS `zz_group_module` ON `zz_modules`.`id`=`zz_group_module`.`idmodule`');
$modules = [];
$additionals = [];
@ -210,7 +210,7 @@ class Modules
$user = Auth::user();
$datas = $database->fetchArray('SELECT * FROM `zz_views` WHERE `id_module`='.prepare($id).' AND `id` IN (SELECT `id_vista` FROM `zz_group_view` WHERE `id_gruppo`=(SELECT `idgruppo` FROM `zz_users` WHERE `idutente`='.prepare($user['idutente']).')) ORDER BY `order` ASC');
$datas = $database->fetchArray('SELECT * FROM `zz_views` WHERE `id_module`='.prepare($id).' AND `id` IN (SELECT `id_vista` FROM `zz_group_view` WHERE `id_gruppo`=(SELECT `idgruppo` FROM `zz_users` WHERE `id_utente`='.prepare($user['id_utente']).')) ORDER BY `order` ASC');
if (!empty($datas)) {
$select = '';

View File

@ -133,7 +133,7 @@ function get_permessi($nome_modulo)
trigger_error(_('Funzione deprecata!'), E_USER_DEPRECATED);
$dbo = \Database::getConnection();
$query = 'SELECT *, (SELECT idanagrafica FROM zz_users WHERE idutente='.prepare($_SESSION['idutente']).') AS idanagrafica FROM zz_permissions WHERE idgruppo=(SELECT idgruppo FROM zz_users WHERE idutente='.prepare($_SESSION['idutente']).') AND idmodule=(SELECT id FROM zz_modules WHERE name='.prepare($nome_modulo).')';
$query = 'SELECT *, (SELECT idanagrafica FROM zz_users WHERE id_utente='.prepare($_SESSION['id_utente']).') AS idanagrafica FROM zz_permissions WHERE idgruppo=(SELECT idgruppo FROM zz_users WHERE id_utente='.prepare($_SESSION['id_utente']).') AND idmodule=(SELECT id FROM zz_modules WHERE name='.prepare($nome_modulo).')';
$rs = $dbo->fetchArray($query);
if (count($rs) <= 0) {
// Ultimo tentativo: se non ci sono i permessi ma sono l'amministratore posso comunque leggere il modulo

View File

@ -16,7 +16,12 @@ var isMobile = {
},
any: function () {
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
},
complete: function () {
return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) ||
/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4)));
}
};
// Aggiunta dell'ingranaggio all'unload della pagina
@ -159,6 +164,10 @@ $(document).ready(function () {
}
});
if (isMobile.complete()) {
$(".sidebar-menu").sortable("disable");
}
// Tabs
$('#tabs').tabs();
@ -168,18 +177,21 @@ $(document).ready(function () {
$('ul.nav a[href="' + hash + '"]').tab('show');
}
// Salvo lo scroll per riportare qui l'utente al reload
$(window).on('scroll', function () {
if (localStorage != undefined) {
localStorage.setItem('scrollTop_' + globals.id_module + '_' + globals.id_record, $(document).scrollTop());
}
});
// Nel caso la navigazione sia da mobile, disabilito il ritorno al punto precedente
if (!isMobile.complete()) {
// Salvo lo scroll per riportare qui l'utente al reload
$(window).on('scroll', function () {
if (localStorage != undefined) {
localStorage.setItem('scrollTop_' + globals.id_module + '_' + globals.id_record, $(document).scrollTop());
}
});
// Riporto l'utente allo scroll precedente
if (localStorage['scrollTop_' + globals.id_module + '_' + globals.id_record] != undefined) {
setTimeout(function () {
scrollToAndFocus(localStorage['scrollTop_' + globals.id_module + '_' + globals.id_record]);
}, 1);
// Riporto l'utente allo scroll precedente
if (localStorage['scrollTop_' + globals.id_module + '_' + globals.id_record] != undefined) {
setTimeout(function () {
scrollToAndFocus(localStorage['scrollTop_' + globals.id_module + '_' + globals.id_record]);
}, 1);
}
}
$('.nav-tabs a').click(function (e) {
@ -443,7 +455,6 @@ function start_datatables() {
order: [],
lengthChange: false,
scrollY: "50vh",
stateSave: true,
});
}
});
@ -502,6 +513,12 @@ function start_datatables() {
scrollX: '100%',
retrieve: true,
stateSave: true,
stateSaveCallback: function (settings, data) {
localStorage.setItem('DataTables_' + id_module + '-' + id_plugin + '-' + id_parent, JSON.stringify(data));
},
stateLoadCallback: function (settings) {
return JSON.parse(localStorage.getItem('DataTables_' + id_module + '-' + id_plugin + '-' + id_parent));
},
columnDefs: [{
searchable: false,
orderable: false,
@ -919,18 +936,30 @@ jQuery.fn.selectData = function () {
// Inputmask
function start_inputmask() {
$(".date-mask").inputmask(moment.localeData().longDateFormat('L').toLowerCase(), {
"placeholder": moment.localeData().longDateFormat('L').toLowerCase()
var date = moment.localeData().longDateFormat('L').toLowerCase();
$(".date-mask").inputmask(date, {
"placeholder": date
});
/*
$(".timestamp-mask").inputmask(date + ' ' + moment.localeData().longDateFormat('LT').toLowerCase().replace('mm', 'ss'), {
"placeholder": date + ' ' + moment.localeData().longDateFormat('LT').toLowerCase().replace('mm', 'ss')
});
*/
$(".timestamp-mask").inputmask("timestamp", {
mask: "2/1/y h:s",
placeholder: "dd/mm/yyyy hh:mm",
separator: "/",
alias: "datetime",
hourFormat: "24"
});
$('.email-mask').inputmask('Regex', {
regex: "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$",
});
if (isMobile.any()) {
$('.inputmask-decimal').each(function () {
val = $(this).val().toEnglish();
$(this).attr('type', 'tel').val(val);
if (isMobile.complete()) {
$('.inputmask-decimal, .date-mask, .timestamp-mask').each(function () {
$(this).attr('type', 'tel');
});
} else {
$('.inputmask-decimal').each(function () {

View File

@ -44,7 +44,10 @@ $(document).ready(function () {
$this.datetimepicker({
locale: globals.locale,
icons: icons,
collapse: false,
sideBySide: true,
useCurrent: false,
stepping: 5,
minDate: $this.attr('min-date') ? $this.attr('min-date') : false,
maxDate: $this.attr('max-date') ? $this.attr('max-date') : false,
});

View File

@ -1,61 +0,0 @@
<?php
trigger_error(_('Procedura deprecata!'), E_USER_DEPRECATED);
/*
Controllo permessi modulo su utente (se non è is_admin)
*/
if( $module_name == '' ){
$rs = $dbo->fetchArray("SELECT name FROM zz_modules WHERE id='".$html->form('id_module')."'");
$module_name = $rs[0]['name'];
}
//Il modulo "Info" è visibile da tutti
if( $module_name == 'Info' ){
$permessi[$module_name] = 'r';
}
else{
$rs = $dbo->fetchArray("SELECT idanagrafica FROM zz_users WHERE idutente='".$_SESSION['idutente']."'");
$user_idanagrafica = $rs[0]['idanagrafica'];
$query = "SELECT *, (SELECT idanagrafica FROM zz_users WHERE idutente='".$_SESSION['idutente']."') AS idanagrafica FROM zz_permissions WHERE idgruppo=(SELECT idgruppo FROM zz_users WHERE idutente='".$_SESSION['idutente']."') AND idmodule=(SELECT id FROM zz_modules WHERE name='".$module_name."')";
$rs = $dbo->fetchArray($query);
if( sizeof($rs)<=0 ){
//Ultimo tentativo: se non ci sono i permessi ma sono l'amministratore posso comunque leggere il modulo
if( $_SESSION['is_admin']==1 ){
$permessi[$module_name] = 'rw';
}
else{
echo "<div style='clear:both;'></div><br/><br/><br/><br/><br/><p>Non hai i permessi per accedere a questo modulo.</p>\n";
$permessi[$module_name] = '-';
exit;
}
}
else{
if( $rs[0]['permessi']=='-' ){
echo "<div style='clear:both;'></div><br/><br/><br/><br/><br/><p>Non hai i permessi per accedere a questo modulo.</p>\n";
$permessi[$module_name] = '-';
exit;
}
else if( $rs[0]['permessi']=='r' ){
$permessi[$module_name] = 'r';
}
else if( $rs[0]['permessi']=='rw' ){
$permessi[$module_name] = 'rw';
}
}
//Carico i filtri dei WHERE in base al modulo e all'utente loggato
$qp = "SELECT *, (SELECT idanagrafica FROM zz_users WHERE idutente='".$_SESSION['idutente']."') AS idanagrafica, (SELECT name FROM zz_modules WHERE id=idmodule) AS nome_modulo FROM zz_group_module WHERE idgruppo=(SELECT idgruppo FROM zz_users WHERE idutente='".$_SESSION['idutente']."')";
$rsp = $dbo->fetchArray($qp);
for( $i=0; $i<sizeof($rsp); $i++ ){
$additional_where[ $rsp[$i]['nome_modulo'] ] = $rsp[$i]['clause'];
}
}
?>

View File

@ -1,17 +0,0 @@
<?php
trigger_error(_('Procedura deprecata!'), E_USER_DEPRECATED);
if ( isset ($_GET['op']) )
$op = $_GET['op'];
else
$op = '';
if( $op == 'logout' )
$_SESSION['idutente']='';
if( $_SESSION['idutente'] == '' ){
redirect($rootdir."/index.php","php");
exit;
}
?>

View File

@ -35,14 +35,14 @@ echo '
if (Auth::admin()) {
$q = 'SELECT * FROM `zz_logs` ORDER BY `created_at` DESC LIMIT 0, 100';
} else {
$q = 'SELECT * FROM `zz_logs` WHERE `idutente`='.prepare($_SESSION['idutente']).' ORDER BY `created_at` DESC LIMIT 0, 100';
$q = 'SELECT * FROM `zz_logs` WHERE `id_utente`='.prepare($_SESSION['id_utente']).' ORDER BY `created_at` DESC LIMIT 0, 100';
}
$rs = $dbo->fetchArray($q);
$n = sizeof($rs);
for ($i = 0; $i < $n; ++$i) {
$id = $rs[$i]['id'];
$idutente = $rs[$i]['idutente'];
$id_utente = $rs[$i]['id_utente'];
$username = $rs[$i]['username'];
$ip = $rs[$i]['ip'];

View File

@ -69,7 +69,7 @@ if ($dir == 'uscita') {
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo _('Destinazione merce'); ?>", "name": "idsede", "values": "query=SELECT id, CONCAT_WS(', ', nomesede, citta) AS descrizione FROM an_sedi WHERE (idanagrafica='<php echo $idanagrafica; ?>' OR idanagrafica=(SELECT valore FROM zz_impostazioni WHERE nome='Azienda predefinita')) UNION SELECT '0' AS id, 'Sede legale' AS descrizione ORDER BY descrizione", "value": "$idsede$" ]}
{[ "type": "select", "label": "<?php echo _('Destinazione merce'); ?>", "name": "idsede", "values": "query=SELECT id, CONCAT_WS(', ', nomesede, citta) AS descrizione FROM an_sedi WHERE (idanagrafica='<php echo $idanagrafica; ?>' OR idanagrafica=(SELECT valore FROM zz_settings WHERE nome='Azienda predefinita')) UNION SELECT '0' AS id, 'Sede legale' AS descrizione ORDER BY descrizione", "value": "$idsede$" ]}
</div>
</div>

View File

@ -74,12 +74,9 @@ switch (post('op')) {
}
foreach ($lista as $idriga) {
// Lettura delle date di inizio e fine intervento (dd/mm/yyyy hh:mm - dd/mm/yyyy hh:mm)
$orario = post('orario')[$idriga];
$v = explode(' - ', $orario);
$orario_inizio = Translator::timestampToEnglish($v[0]);
$orario_fine = Translator::timestampToEnglish($v[1]);
// Lettura delle date di inizio e fine intervento
$orario_inizio = post('orario_inizio')[$idriga];
$orario_fine = post('orario_fine')[$idriga];
$km = post('km')[$idriga];
$ore = post('ore')[$idriga];

View File

@ -3,7 +3,7 @@
include_once __DIR__.'/../../core.php';
// Prezzo modificabile solo se l'utente loggato è un tecnico (+ può vedere i prezzi) o se è amministratore
$rs = $dbo->fetchArray('SELECT nome FROM zz_groups WHERE id IN(SELECT idgruppo FROM zz_users WHERE idutente='.prepare($_SESSION['idutente']).')');
$rs = $dbo->fetchArray('SELECT nome FROM zz_groups WHERE id IN(SELECT idgruppo FROM zz_users WHERE id_utente='.prepare($_SESSION['id_utente']).')');
for ($i = 0; $i < count($rs); ++$i) {
$gruppi[$i] = $rs[$i]['nome'];
}

View File

@ -36,7 +36,7 @@ if (get('anteprima') !== null) {
<div class="hide" id="pdf">
<object data="'.$rootdir.'/files/interventi/'.$rapportino_nome.'#view=fitH&scrollbar=0&toolbar=0&navpanes=0" id ="rapportino_pdf" type="application/pdf" width="100%">
alt : <a href="'.$rootdir.'/files/interventi/'.$rapportino_nome.'">'.$rapportino_nome.'</a>
alt : <a href="'.$rootdir.'/files/interventi/'.$rapportino_nome.'" target="_blank">'.$rapportino_nome.'</a>
<span>'._('Plugin PDF mancante').'</span>
</object>
</div>';

View File

@ -53,13 +53,14 @@ if (!empty($rs2)) {
<div class="table-responsive">
<table class="table table-striped table-hover table-condensed '.$class_tecnico.'">
<tr>
<th width="200"><i class="fa fa-user"></i> '.$r['ragione_sociale'].'</th>
<th width="300">'._('Orario').'</th>
<th width="190">'._('Ore').'</th>
<th width="190">'._('Km').'</th>
<th width="100">'._('Sconto ore').'</th>
<th width="100">'._('Sconto km').'</th>
<th width="40"></th>
<th><i class="fa fa-user"></i> '.$r['ragione_sociale'].'</th>
<th>'._('Orario inizio').'</th>
<th>'._('Orario fine').'</th>
<th>'._('Ore').'</th>
<th>'._('Km').'</th>
<th>'._('Sconto ore').'</th>
<th>'._('Sconto km').'</th>
<th></th>
</tr>';
}
@ -88,9 +89,8 @@ if (!empty($rs2)) {
$costo_km_consuntivo = $r['prezzo_km_consuntivo'];
$costo_ore_consuntivo = $r['prezzo_ore_consuntivo'];
$orario_inizio = !empty($r['orario_inizio']) ? Translator::timestampToLocale($r['orario_inizio']) : $r['orario_inizio'];
$orario_fine = !empty($r['orario_fine']) ? Translator::timestampToLocale($r['orario_fine']) : $r['orario_fine'];
$orario = $orario_inizio.' - '.$orario_fine;
$orario_inizio = $r['orario_inizio'];
$orario_fine = $r['orario_fine'];
$km = $r['km'];
$ore = $r['ore'];
@ -120,20 +120,34 @@ if (!empty($rs2)) {
echo '
</td>';
// Orario
// Orario di inizio
echo '
<td>';
if ($rs[0]['stato'] == 'Fatturato') {
echo '
<span>'.$ora_dal1.'</span>
<input type="hidden" id="orario_'.$id.'" name="orario['.$id.']" style="'.$display.'" value="'.$orario.'">';
<span>'.$orario_inizio.'</span>
<input type="hidden" name="orario_inizio['.$id.']" value="'.$orario_inizio.'">';
} else {
echo '
<input class="form-control text-center datetimepicker" type="text" id="orario_'.$id.'" name="orario['.$id.']" value="'.$orario.'">';
{[ "type": "timestamp", "name": "orario_inizio['.$id.']", "id": "inizio_'.$id.'", "value": "'.$orario_inizio.'", "class": "orari" ]}';
}
echo '
</td>';
// Orario di fine
echo '
<td>';
if ($rs[0]['stato'] == 'Fatturato') {
echo '
<span>'.$orario_fine.'</span>
<input type="hidden" name="orario_fine['.$id.']" value="'.$orario_fine.'">';
} else {
echo '
{[ "type": "timestamp", "name": "orario_fine['.$id.']", "id": "fine_'.$id.'", "value": "'.$orario_fine.'", "class": "orari", "min-date": "'.$orario_inizio.'" ]}';
}
echo '
</td>';
// ORE
echo '
<td style="border-right:1px solid #aaa;">
@ -251,36 +265,29 @@ echo '
?>
<script type="text/javascript" charset="utf-8">
$(document).ready( function(){
$('.datetimepicker').daterangepicker({
timePicker: true,
timePickerIncrement: 5,
locale: {
format: globals.timestampFormat,
customRangeLabel: globals.translations.custom,
applyLabel: globals.translations.apply,
cancelLabel: globals.translations.cancel,
fromLabel: globals.translations.from,
toLabel: globals.translations.to,
},
timePicker24Hour: true,
applyClass: 'btn btn-success btn-sm',
cancelClass: 'btn btn-danger btn-sm',
}
).on('change', function(){
id = $(this).attr('id').split('_');
idriga = id[1];
<script src="<?php echo $rootdir ?>/lib/init.js"></script>
orario = $('#orario_'+idriga).val();
o = orario.split(' - ');
<script type="text/javascript">
$(document).ready(function(){
$('.orari').on("dp.change", function(){
idriga = $(this).attr('id').split('_')[1];
start = o[0];
end = o[1];
start = $('#inizio_' + idriga).val();
end = $('#fine_' + idriga).val();
calcola_ore(idriga, start, end);
});
$(".orari[id^=inizio]").on("dp.change", function (e) {
var fine = $(this).closest("tr").find(".orari[id^=fine]").data("DateTimePicker");
fine.minDate(e.date);
if(fine.date() < e.date){
date = moment(e.date).add(1, 'h');
fine.date(date);
}
});
});
</script>
<script type="text/javascript" src="<?php echo $rootdir ?>/lib/init.js"></script>

View File

@ -2,26 +2,26 @@
include_once __DIR__.'/../../core.php';
$id_utente = filter('idutente');
$id_utente = filter('id_utente');
switch (filter('op')) {
// Abilita utente
case 'enable':
if ($dbo->query('UPDATE zz_users SET enabled=1 WHERE idutente='.prepare($id_utente))) {
if ($dbo->query('UPDATE zz_users SET enabled=1 WHERE id_utente='.prepare($id_utente))) {
$_SESSION['infos'][] = _('Utente abilitato!');
}
break;
// Disabilita utente
case 'disable':
if ($dbo->query('UPDATE zz_users SET enabled=0 WHERE idutente='.prepare($id_utente))) {
if ($dbo->query('UPDATE zz_users SET enabled=0 WHERE id_utente='.prepare($id_utente))) {
$_SESSION['infos'][] = _('Utente disabilitato!');
}
break;
// Cambio di password e usernome dell'utente
case 'change_pwd':
$id_utente = filter('idutente');
$id_utente = filter('id_utente');
$min_length = filter('min_length');
$min_length_username = filter('min_length_username');
@ -34,7 +34,7 @@ switch (filter('op')) {
} elseif ($password != $password_rep) {
$_SESSION['errors'][] = _('Le password non coincidono');
} else {
$dbo->query('UPDATE zz_users SET password='.prepare(Auth::hashPassword($password)).' WHERE idutente='.prepare($id_utente));
$dbo->query('UPDATE zz_users SET password='.prepare(Auth::hashPassword($password)).' WHERE id_utente='.prepare($id_utente));
$_SESSION['infos'][] = _('Password aggiornata!');
}
@ -42,13 +42,13 @@ switch (filter('op')) {
$username = filter('username');
// Se ho modificato l'username, verifico che questo non sia già stato usato
$rs = $dbo->fetchArray('SELECT username FROM zz_users WHERE idutente='.prepare($id_utente));
$rs = $dbo->fetchArray('SELECT username FROM zz_users WHERE id_utente='.prepare($id_utente));
if ($rs[0]['username'] != $username) {
$n = $dbo->fetchNum('SELECT idutente FROM zz_users WHERE username='.prepare($username));
$n = $dbo->fetchNum('SELECT id_utente FROM zz_users WHERE username='.prepare($username));
if ($n == 0) {
$dbo->query('UPDATE zz_users SET username='.prepare($username).' WHERE idutente='.prepare($id_utente));
$dbo->query('UPDATE zz_users SET username='.prepare($username).' WHERE id_utente='.prepare($id_utente));
$_SESSION['infos'][] = _('Username aggiornato!');
} else {
@ -111,7 +111,7 @@ switch (filter('op')) {
// Elimina utente
case 'delete':
if ($dbo->query('DELETE FROM zz_users WHERE idutente='.prepare($id_utente))) {
if ($dbo->query('DELETE FROM zz_users WHERE id_utente='.prepare($id_utente))) {
$_SESSION['infos'][] = _('Utente eliminato!');
}
break;

View File

@ -0,0 +1,34 @@
<?php
switch ($resource) {
case 'login':
if (Auth::getInstance()->attempt($request['username'], $request['password'])) {
$user = Auth::user();
// Generazione del token per l'utente
$tokens = $database->fetchArray('SELECT `token` FROM `zz_tokens` WHERE `enabled` = 1 AND `id_utente` = '.prepare($user['id_utente']));
if (empty($tokens)) {
$token = secure_random_string();
$database->insert('zz_tokens', [
'id_utente' => $user['id_utente'],
'token' => $token,
]);
} else {
$token = $tokens[0]['token'];
}
$results = $dbo->fetchArray('SELECT `ragione_sociale`, `codice`, `piva`, `codice_fiscale`, `indirizzo`, `citta`, `provincia`, (SELECT `nome` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione, `telefono`, `fax`, `indirizzo`, `citta`, `provincia`, `indirizzo`, `citta`, `an_anagrafiche`.`email` FROM `zz_users` LEFT JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica` WHERE `id_utente` = '.prepare($user['id_utente']))[0];
$results['token'] = $token;
} else {
$results = [
'status' => API::getStatus()['unauthorized']['code'],
];
}
break;
}
return [
'login',
];

View File

@ -47,14 +47,14 @@ if (count($utenti) != 0) {
*/
echo '
<td>';
// Disabilitazione utente, se diverso da idutente #1 (admin)
if ($utenti[$u]['idutente'] != '1') {
// Disabilitazione utente, se diverso da id_utente #1 (admin)
if ($utenti[$u]['id_utente'] != '1') {
if ($utenti[$u]['enabled'] == 1) {
echo '
<a href="javascript:;" onclick="if( confirm(\''._('Disabilitare questo utente?').'\') ){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=disable&idutente='.$utenti[$u]['idutente'].'&idgruppo='.$record['id'].'\'; }" title="Disabilita utente" class="text-danger tip"><i class="fa fa-2x fa-eye-slash"></i></a>';
<a href="javascript:;" onclick="if( confirm(\''._('Disabilitare questo utente?').'\') ){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=disable&id_utente='.$utenti[$u]['id_utente'].'&idgruppo='.$record['id'].'\'; }" title="Disabilita utente" class="text-danger tip"><i class="fa fa-2x fa-eye-slash"></i></a>';
} else {
echo '
<a href="javascript:;" onclick="if( confirm(\'Abilitare questo utente?\') ){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=enable&idutente='.$utenti[$u]['idutente'].'&idgruppo='.$record['id'].'\'; }" title="Abilita utente" class="text-success tip"><i class="fa fa-2x fa-eye"></i></a>';
<a href="javascript:;" onclick="if( confirm(\'Abilitare questo utente?\') ){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=enable&id_utente='.$utenti[$u]['id_utente'].'&idgruppo='.$record['id'].'\'; }" title="Abilita utente" class="text-success tip"><i class="fa fa-2x fa-eye"></i></a>';
}
} else {
echo '
@ -63,12 +63,12 @@ if (count($utenti) != 0) {
// Cambio password e nome utente
echo '
<a href="" data-href="'.$rootdir.'/modules/'.Modules::getModule($id_module)['directory'].'/user.php?idutente='.$utenti[$u]['idutente'].'&idgruppo='.$record['id'].'" class="text-warning tip" data-toggle="modal" data-target="#bs-popup" title="Aggiorna dati utente"" data-title="Aggiorna dati utente"><i class="fa fa-2x fa-unlock-alt"></i></a>';
<a href="" data-href="'.$rootdir.'/modules/'.Modules::getModule($id_module)['directory'].'/user.php?id_utente='.$utenti[$u]['id_utente'].'&idgruppo='.$record['id'].'" class="text-warning tip" data-toggle="modal" data-target="#bs-popup" title="Aggiorna dati utente"" data-title="Aggiorna dati utente"><i class="fa fa-2x fa-unlock-alt"></i></a>';
// Eliminazione utente, se diverso da idutente #1 (admin)
if ($utenti[$u]['idutente'] != '1') {
// Eliminazione utente, se diverso da id_utente #1 (admin)
if ($utenti[$u]['id_utente'] != '1') {
echo '
<a href="javascript:;" onclick="if( confirm(\'Sei sicuro di voler eliminare questo utente?\') ){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=delete&idutente='.$utenti[$u]['idutente'].'&idgruppo='.$record['id'].'\'; }" title="Elimina utente" class="text-danger tip"><i class="fa fa-2x fa-trash"></i></a>';
<a href="javascript:;" onclick="if( confirm(\'Sei sicuro di voler eliminare questo utente?\') ){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=delete&id_utente='.$utenti[$u]['id_utente'].'&idgruppo='.$record['id'].'\'; }" title="Elimina utente" class="text-danger tip"><i class="fa fa-2x fa-trash"></i></a>';
} else {
echo '
<span onclick="alert(\"'._("Non è possibile eliminare l'utente admin").'\")" class="text-muted tip"><i class="fa fa-2x fa-trash"></i></span>';

View File

@ -6,11 +6,11 @@ include_once __DIR__.'/../../core.php';
$min_length = 8;
$min_length_username = 4;
$idgruppo = intval(filter('idgruppo'));
$id_utente = filter('idutente');
$id_utente = filter('id_utente');
if (!empty($id_utente)) {
$value = 'change_pwd';
$rs = $dbo->fetchArray('SELECT username FROM zz_users WHERE idutente='.prepare($id_utente));
$rs = $dbo->fetchArray('SELECT username FROM zz_users WHERE id_utente='.prepare($id_utente));
$username = $rs[0]['username'];
$message = _('Modifica');
} else {
@ -27,7 +27,7 @@ echo '
<input type="hidden" name="min_length_username" value="'.$min_length_username.'">';
if (!empty($id_utente)) {
echo '
<input type="hidden" name="idutente" value="'.$id_utente.'">';
<input type="hidden" name="id_utente" value="'.$id_utente.'">';
}
echo '

View File

@ -8,7 +8,7 @@ $id_module = $html->form('id_module');
$fields = [];
$select = '*';
$datas = $dbo->fetchArray('SELECT * FROM zz_views WHERE id_module='.$id_module.' AND id IN (SELECT id_vista FROM zz_group_view WHERE id_gruppo=(SELECT idgruppo FROM zz_users WHERE idutente='.$_SESSION['idutente'].')) ORDER BY `order` ASC');
$datas = $dbo->fetchArray('SELECT * FROM zz_views WHERE id_module='.$id_module.' AND id IN (SELECT id_vista FROM zz_group_view WHERE id_gruppo=(SELECT idgruppo FROM zz_users WHERE id_utente='.$_SESSION['id_utente'].')) ORDER BY `order` ASC');
if ($datas != null) {
$select = '';
foreach ($datas as $data) {

View File

@ -21,20 +21,6 @@ if (!empty($array)) {
$database->insert('zz_group_view', $array);
}
// Generazione delle chiavi di default per gli utenti
$utenti = $database->fetchArray('SELECT `idutente` FROM `zz_users`');
$array = [];
foreach ($utenti as $utente) {
$array[] = [
'id_utente' => $utente['idutente'],
'token' => secure_random_string(),
];
}
if (!empty($array)) {
$database->insert('zz_tokens', $array);
}
/*
* Fix
*/

View File

@ -666,22 +666,25 @@ ALTER TABLE `zz_permissions` ADD FOREIGN KEY (`idmodule`) REFERENCES `zz_modules
ALTER TABLE `zz_plugins` ADD FOREIGN KEY (`idmodule_from`) REFERENCES `zz_modules`(`id`) ON DELETE CASCADE, ADD FOREIGN KEY (`idmodule_to`) REFERENCES `zz_modules`(`id`) ON DELETE CASCADE;
-- Aggiunta di chiavi esterne in zz_users
ALTER TABLE `zz_users` CHANGE `idutente` `idutente` int(11) NOT NULL AUTO_INCREMENT, ADD FOREIGN KEY (`idgruppo`) REFERENCES `zz_groups`(`id`) ON DELETE CASCADE;
ALTER TABLE `zz_users` CHANGE `idutente` `id_utente` int(11) NOT NULL AUTO_INCREMENT, ADD FOREIGN KEY (`idgruppo`) REFERENCES `zz_groups`(`id`) ON DELETE CASCADE;
-- Aggiunta di chiavi esterne in zz_logs
ALTER TABLE `zz_logs` DROP `password`, CHANGE `idutente` `idutente` int(11), CHANGE `timestamp` `timestamp` datetime;
UPDATE `zz_logs` SET `idutente` = NULL WHERE `idutente` = 0;
ALTER TABLE `zz_logs` ADD FOREIGN KEY (`idutente`) REFERENCES `zz_users`(`idutente`) ON DELETE CASCADE;
ALTER TABLE `zz_logs` DROP `password`, CHANGE `idutente` `id_utente` int(11), CHANGE `timestamp` `timestamp` datetime;
UPDATE `zz_logs` SET `id_utente` = NULL WHERE `id_utente` = 0;
ALTER TABLE `zz_logs` ADD FOREIGN KEY (`id_utente`) REFERENCES `zz_users`(`id_utente`) ON DELETE CASCADE;
-- Aggiunta di chiavi esterne in zz_semaphores
ALTER TABLE `zz_semaphores` ADD FOREIGN KEY (`id_utente`) REFERENCES `zz_users`(`idutente`) ON DELETE CASCADE;
ALTER TABLE `zz_semaphores` ADD FOREIGN KEY (`id_utente`) REFERENCES `zz_users`(`id_utente`) ON DELETE CASCADE;
-- Aggiunta della tabella per gestire le chiavi di accesso all'API
CREATE TABLE IF NOT EXISTS `zz_tokens` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_utente` int(11) NOT NULL,
`token` varchar(255) NOT NULL,
PRIMARY KEY (`id_utente`),
FOREIGN KEY (`id_utente`) REFERENCES `zz_users`(`idutente`) ON DELETE CASCADE
`token` varchar(255) NOT NULL UNIQUE,
`descrizione` varchar(255),
`enabled` boolean NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
FOREIGN KEY (`id_utente`) REFERENCES `zz_users`(`id_utente`) ON DELETE CASCADE
) ENGINE=InnoDB;
-- Modifica di an_sedi per sostituire le nazioni con i corrispettivi nella tabella apposita