Bugfix generale

Risoluzione delle problematiche incontate con l'installazione del software su Aruba con versione di MySQL non aggiornata.
Aggiunto sistema automatico di completamento dei campi per l'API, con disattivazione del severzio automatica per MySQL < 5.6.5.
This commit is contained in:
Thomas Zilio 2017-08-31 10:09:06 +02:00
parent 212db2f487
commit 78484220fe
10 changed files with 250 additions and 157 deletions

View File

@ -10,8 +10,8 @@ if (isset($id_record)) {
$posizione .= ', '.$id_record;
}
$dbo->query('UPDATE zz_semaphores SET updated_at = NOW() WHERE id_utente = '.prepare($_SESSION['idutente']).' AND posizione = '.prepare($posizione));
$dbo->query('DELETE FROM zz_semaphores WHERE DATE_ADD(updated_at, INTERVAL '.(get_var('Timeout notifica di presenza (minuti)') * 2).' SECOND) <= NOW()');
$dbo->query('UPDATE zz_semaphores SET updated = NOW() WHERE id_utente = '.prepare($_SESSION['idutente']).' 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));
$result = [];

View File

@ -29,7 +29,7 @@ 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) VALUES ('.prepare($_SESSION['idutente']).', '.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())');
echo '
<div class="box box-warning box-solid text-center info-active hide">

View File

@ -3,7 +3,7 @@
include_once __DIR__.'/../core.php';
$updateRate = 20;
$scriptValue = $updateRate * 3;
$scriptValue = $updateRate * 5;
/*
* Aggiornamento tramite AJAX
@ -205,19 +205,20 @@ if (filter('action') == 'do_update') {
$total = 0;
$updates = Update::getTodos();
foreach ($updates as $update) {
if ($update['sql'] && $update['done'] !== 0) {
if ($update['sql'] && (!empty($update['done']) || is_null($update['done']))) {
$queries = readSQLFile(DOCROOT.$update['directory'].$update['filename'].'.sql', ';');
$total += count($queries);
if (intval($update['done']) > 1) {
$total -= intval($update['done']) - 2;
}
}
if ($update['script']) {
$total += $scriptValue;
}
if ($update['done'] > 1) {
$total -= $update['done'] - 2;
}
}
echo '

View File

@ -32,6 +32,10 @@ class API extends \Util\Singleton
'code' => 500,
'message' => 'Errore del server',
],
'incompatible' => [
'code' => 503,
'message' => 'Servizio non disponibile',
],
];
/**
@ -217,13 +221,14 @@ class API extends \Util\Singleton
public static function error($error)
{
$keys = array_keys(self::$status);
$error = (in_array($error, $keys)) ? $error : end($keys);
$error = (in_array($error, $keys)) ? $error : 'serverError';
http_response_code(self::$status[$error]['code']);
$code = self::$status[$error]['code'];
http_response_code($code);
return self::response([
'status' => self::$status[$error]['code'],
'message' => self::$status[$error]['message'],
'status' => $code,
]);
}
@ -278,9 +283,21 @@ class API extends \Util\Singleton
*/
public static function response($array)
{
if (!self::isCompatible()) {
$array = [
'status' => self::$status['incompatible']['code'],
];
}
if (empty($array['status'])) {
$array['status'] = self::$status['ok']['code'];
$array['message'] = self::$status['ok']['message'];
}
if (empty($array['message'])) {
$codes = array_column(self::$status, 'code');
$messages = array_column(self::$status, 'message');
$array['message'] = $messages[array_search($array['status'], $codes)];
}
$flags = JSON_FORCE_OBJECT;
@ -318,4 +335,16 @@ class API extends \Util\Singleton
{
return (array) json_decode(file_get_contents('php://input'), true);
}
/**
* Controlla se il database è compatibile con l'API.
*
* @return bool
*/
public static function isCompatible()
{
$database = Database::getConnection();
return version_compare($database->getMySQLVersion(), '5.6.5') >= 0;
}
}

View File

@ -62,14 +62,20 @@ class Database extends Util\Singleton
if (!empty($this->host) && !empty($this->database_name)) {
try {
$this->pdo = new \DebugBar\DataCollector\PDO\TraceablePDO(new PDO(
$this->pdo = new PDO(
'mysql:host='.$this->host.(!empty($this->port) ? ';port='.$this->port : '').';dbname='.$this->database_name,
$this->username,
$this->password,
$this->option
));
);
$this->query("SET NAMES '".$this->charset."'");
// Fix per problemi di compatibilità delle password MySQL 4.1+ (da versione precedente)
$this->query('SET SESSION old_passwords = 0');
//$this->query('SET PASSWORD = PASSWORD('.$this->prepare($this->password).')');
$this->pdo = new \DebugBar\DataCollector\PDO\TraceablePDO($this->pdo);
//$this->query("SET NAMES '".$this->charset."'");
$this->query("SET sql_mode = ''");
} catch (PDOException $e) {
if ($e->getCode() == 1049 || $e->getCode() == 1044) {

View File

@ -234,6 +234,9 @@ class Update
$database->query('UPDATE `updates` SET `done` = 0 WHERE id = '.prepare($update['id']));
// Normalizzazione dei campi per l'API
self::executeScript(DOCROOT.'/update/api.php');
// Esecuzione script release
if (!empty($update['script']) && file_exists($file.'.php')) {
self::executeScript($file.'.php');

View File

@ -282,7 +282,7 @@ $qp = "SELECT id, idcontratto, richiesta, data_richiesta, 'intervento' AS ref, (
UNION SELECT id, idcontratto, '', data_scadenza, 'ordine', (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento='ODS') AS tipointervento FROM co_ordiniservizio WHERE idcontratto IN( SELECT id FROM co_contratti WHERE idstato IN(SELECT id FROM co_staticontratti WHERE pianificabile = 1) ) AND idintervento IS NULL ORDER BY data_richiesta ASC";
$rsp = $dbo->fetchArray($qp);
if(!empty($rsp)){
if (!empty($rsp)) {
echo '
<div class="row">
<div class="col-xs-12 col-md-10">';
@ -291,24 +291,23 @@ if(!empty($rsp)){
echo '
<div id="calendar"></div>';
if(!empty($rsp)){
if (!empty($rsp)) {
echo '
</div>
<div id="external-events" class="hidden-xs hidden-sm col-md-2">
<h4>'._('Interventi da pianificare').'</h4>';
foreach ($rsp as $r) {
foreach ($rsp as $r) {
echo '
<div class="fc-event " data-id="'.$r['id'].'" data-idcontratto="'.$r['idcontratto'].'">'.Translator::dateToLocale($r['data_richiesta']).' ('.$r['tipointervento'].')'.(!empty($r['richiesta']) ? ' - '.$r['richiesta'] : '' ).'</div>';
}
<div class="fc-event " data-id="'.$r['id'].'" data-idcontratto="'.$r['idcontratto'].'">'.Translator::dateToLocale($r['data_richiesta']).' ('.$r['tipointervento'].')'.(!empty($r['richiesta']) ? ' - '.$r['richiesta'] : '').'</div>';
}
echo '
</div>
</div>';
}
$vista = get_var('Vista dashboard');
if ($vista == 'mese') {
$def = 'month';
@ -459,6 +458,9 @@ if (get_var('Abilitare orario lavorativo') == '1') {
setTimeout("$('#mini-loader').hide()", 1000);
}
},
<?php
if (Modules::getPermission($id_module) == 'rw') {
?>
drop: function(date, jsEvent, ui, resourceId) {
data = moment(date).format("YYYY-MM-DD");
ora_dal = moment(date).format("HH:mm");
@ -466,17 +468,18 @@ if (get_var('Abilitare orario lavorativo') == '1') {
var name = ($(this).data('ref') == 'ordine') ? 'idordineservizio' : 'idcontratto_riga';
<?php
if (Modules::getPermission($id_module) == 'rw') {
?>
launch_modal('<?php echo _('Pianifica intervento'); ?>', globals.rootdir + '/add.php?id_module=<?php echo Modules::getModule('Interventi')['id'] ?>&data='+data+'&orario_inizio='+ora_dal+'&orario_fine='+ora_al+'&ref=dashboard&idcontratto=' + $(this).data('idcontratto') + '&' + name + '=' + $(this).data('id'), 1);
<?php
}
?>
$(this).remove();
},
$('#bs-popup').on('hidden.bs.modal', function () {
$('#calendar').fullCalendar('refetchEvents');
});
},
<?php
}
?>
select: function(start, end, allDay) {
data = moment(start).format("YYYY-MM-DD");
ora_dal = moment(start).format("HH:mm");

View File

@ -1,109 +1,5 @@
<?php
/*
* Creazione dei campi per l'API (created_at e updated_at)
*/
// I record precedenti vengono impostati a NULL
$tables = [
'an_anagrafiche',
'an_anagrafiche_agenti',
'an_nazioni',
'an_referenti',
'an_relazioni',
'an_sedi',
'an_tipianagrafiche',
'an_tipianagrafiche_anagrafiche',
'an_zone',
'co_contratti',
'co_contratti_tipiintervento',
'co_documenti',
'co_iva',
'co_movimenti',
'co_ordiniservizio',
'co_ordiniservizio_pianificazionefatture',
'co_ordiniservizio_vociservizio',
'co_pagamenti',
'co_pianodeiconti1',
'co_pianodeiconti2',
'co_pianodeiconti3',
'co_preventivi',
'co_preventivi_interventi',
'co_righe2_contratti',
'co_righe_contratti',
'co_righe_documenti',
'co_righe_preventivi',
'co_ritenutaacconto',
'co_rivalsainps',
'co_scadenziario',
'co_staticontratti',
'co_statidocumento',
'co_statipreventivi',
'co_tipidocumento',
'dt_aspettobeni',
'dt_automezzi',
'dt_automezzi_tecnici',
'dt_causalet',
'dt_ddt',
'dt_porto',
'dt_righe_ddt',
'dt_spedizione',
'dt_statiddt',
'dt_tipiddt',
'in_interventi',
'in_interventi_tecnici',
'in_righe_interventi',
'in_statiintervento',
'in_tariffe',
'in_tipiintervento',
'in_vociservizio',
'mg_articoli',
'mg_articoli_automezzi',
'mg_articoli_interventi',
'mg_categorie',
'mg_listini',
'mg_movimenti',
'mg_prodotti',
'mg_unitamisura',
'my_componenti_interventi',
'my_impianti',
'my_impianti_contratti',
'my_impianti_interventi',
'my_impianto_componenti',
'or_ordini',
'or_righe_ordini',
'or_statiordine',
'or_tipiordine',
'zz_tokens',
'zz_files',
'zz_groups',
'zz_group_module',
'zz_settings',
'zz_logs',
'zz_modules',
'zz_plugins',
'zz_permissions',
'zz_users',
'zz_widgets',
'zz_views',
'zz_group_view',
'zz_semaphores',
];
// created_at e updated_at
$latest_ver = version_compare($mysql_ver, '5.6.5') >= 0;
foreach ($tables as $table) {
if ($latest_ver) {
$database->query('ALTER TABLE `'.$table.'` ADD (`created_at` timestamp DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)');
} else {
$database->query('ALTER TABLE `'.$table.'` ADD (`created_at` timestamp DEFAULT NULL, `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)');
$database->query('UPDATE '.$table.' SET created_at = updated_at');
// Trigger per l'inizializzazione automatica di created_at
$database->query('CREATE TRIGGER '.$table.'_creation BEFORE INSERT ON '.$table.' FOR EACH ROW SET NEW.created_at = CURRENT_TIMESTAMP');
}
}
/*
* Inserimento valori di default
*/
@ -149,28 +45,28 @@ $database->query("UPDATE my_impianto_componenti SET contenuto = REPLACE(REPLACE(
// Fix per la presenza della Foreign Key in in_interventi_tecnici
$fk = $database->fetchArray('SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '.prepare($database->getDatabaseName())." AND REFERENCED_TABLE_NAME = 'in_interventi' AND CONSTRAINT_NAME = 'in_interventi_tecnici_ibfk_1'");
if(!empty($fk)){
$database->query("ALTER TABLE `in_interventi_tecnici` DROP FOREIGN KEY `in_interventi_tecnici_ibfk_1`");
if (!empty($fk)) {
$database->query('ALTER TABLE `in_interventi_tecnici` DROP FOREIGN KEY `in_interventi_tecnici_ibfk_1`');
}
$database->query("ALTER TABLE `in_interventi` DROP PRIMARY KEY, CHANGE `idintervento` `codice` varchar(25) NOT NULL UNIQUE, ADD PRIMARY KEY (`id`)");
$database->query("DROP INDEX primary_key ON `in_interventi`");
$database->query("UPDATE `in_interventi_tecnici` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`codice` = `in_interventi_tecnici`.`idintervento`)");
$database->query("ALTER TABLE `in_interventi_tecnici` CHANGE `idintervento` `idintervento` varchar(25)");
$database->query('ALTER TABLE `in_interventi` DROP PRIMARY KEY, CHANGE `idintervento` `codice` varchar(25) NOT NULL UNIQUE, ADD PRIMARY KEY (`id`)');
$database->query('DROP INDEX primary_key ON `in_interventi`');
$database->query('UPDATE `in_interventi_tecnici` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`codice` = `in_interventi_tecnici`.`idintervento`)');
$database->query('ALTER TABLE `in_interventi_tecnici` CHANGE `idintervento` `idintervento` varchar(25)');
$database->query("UPDATE `in_interventi_tecnici` SET `idintervento` = NULL WHERE `idintervento` = 0 OR `idintervento` = ''");
$database->query("ALTER TABLE `in_interventi_tecnici` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE");
$database->query('ALTER TABLE `in_interventi_tecnici` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE');
// Fix dei timestamp delle tabelle mg_prodotti, mg_movimenti, zz_logs e zz_files
$database->query('UPDATE `mg_prodotti` SET `created_at` = `data`, `updated_at` = `data`');
$database->query('UPDATE `mg_prodotti` SET `created_at` = `data`');
$database->query('ALTER TABLE `mg_prodotti` DROP `data`');
$database->query('UPDATE `mg_movimenti` SET `created_at` = `data`, `updated_at` = `data`');
$database->query('UPDATE `mg_movimenti` SET `created_at` = `data`');
$database->query('ALTER TABLE `mg_movimenti` DROP `data`');
$database->query('UPDATE `zz_logs` SET `created_at` = `timestamp`, `updated_at` = `timestamp`');
$database->query('UPDATE `zz_logs` SET `created_at` = `timestamp`');
$database->query('ALTER TABLE `zz_logs` DROP `timestamp`');
$database->query('UPDATE `zz_files` SET `created_at` = `data`, `updated_at` = `data`');
$database->query('UPDATE `zz_files` SET `created_at` = `data`');
$database->query('ALTER TABLE `zz_files` DROP `data`');
/*
@ -227,17 +123,46 @@ foreach ($files as $file) {
// File .html dei moduli di default
// Per un problema sulla lunghezza massima del path su glob è necessario dividere le cartelle dei moduli di default da pulire
$dirs = [
'aggiornamenti,anagrafiche,articoli,automezzi,backup',
'beni,categorie,causali,contratti,dashboard',
'ddt,fatture,gestione_componenti,interventi,iva',
'listini,misure,my_impianti,opzioni,ordini,pagamenti',
'partitario,porti,preventivi,primanota,scadenzario',
'stati_intervento,tecnici_tariffe,tipi_anagrafiche,tipi_intervento',
'utenti,viste,voci_servizio,zone',
'aggiornamenti',
'anagrafiche',
'articoli',
'automezzi',
'backup',
'beni',
'categorie',
'causali',
'contratti',
'dashboard',
'ddt',
'fatture',
'gestione_componenti',
'interventi',
'iva',
'listini',
'misure',
'my_impianti',
'opzioni',
'ordini',
'pagamenti',
'partitario',
'porti',
'preventivi',
'primanota',
'scadenzario',
'stati_intervento',
'tecnici_tariffe',
'tipi_anagrafiche',
'tipi_intervento',
'utenti',
'viste',
'voci_servizio',
'zone',
];
foreach ($dirs as $dir) {
$files = glob($docroot.'/modules/{'.$dir.'}/*.html', GLOB_BRACE);
$pieces = array_chunk($tables, 5);
foreach ($pieces as $piece) {
$files = glob($docroot.'/modules/{'.implode(',', $piece).'}/*.html', GLOB_BRACE);
foreach ($files as $file) {
unlink($file);
}

View File

@ -375,7 +375,8 @@ INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`) VALU
-- Aggiunta tabella per le sessioni avanazate
CREATE TABLE IF NOT EXISTS `zz_semaphores` (
`id_utente` int(11) NOT NULL,
`posizione` varchar(255) NOT NULL
`posizione` varchar(255) NOT NULL,
`updated` datetime
) ENGINE=InnoDB;
-- Aggiornamento zz_modules
@ -668,7 +669,7 @@ ALTER TABLE `zz_plugins` ADD FOREIGN KEY (`idmodule_from`) REFERENCES `zz_module
ALTER TABLE `zz_users` CHANGE `idutente` `idutente` 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);
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;
@ -950,3 +951,6 @@ ALTER TABLE `or_righe_ordini` CHANGE `data_evasione` `data_evasione` date;
-- ALTER TABLE `my_componenti_interventi` ADD PRIMARY KEY (`id_intervento`, `id_componente`);
-- ALTER TABLE `my_impianti_interventi` ADD PRIMARY KEY (`idintervento`, `idimpianto`);
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT(SUM(qta),2), ",", "#"), ".", ","), "#", "."), "unit&agrave;") AS dato FROM mg_articoli WHERE qta>0' WHERE `name` = 'Articoli in magazzino';
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT(SUM(prezzo_acquisto*qta),2), ",", "#"), ".", ","), "#", "."), "&euro;") AS dato FROM mg_articoli WHERE qta>0' WHERE `name` = 'Valore magazzino';

122
update/api.php Normal file
View File

@ -0,0 +1,122 @@
<?php
/*
* Creazione dei campi per l'API (created_at e updated_at)
*/
// I record precedenti vengono impostati a NULL
$tables = [
'an_anagrafiche',
'an_anagrafiche_agenti',
'an_nazioni',
'an_referenti',
'an_relazioni',
'an_sedi',
'an_tipianagrafiche',
'an_tipianagrafiche_anagrafiche',
'an_zone',
'co_contratti',
'co_contratti_tipiintervento',
'co_documenti',
'co_iva',
'co_movimenti',
'co_ordiniservizio',
'co_ordiniservizio_pianificazionefatture',
'co_ordiniservizio_vociservizio',
'co_pagamenti',
'co_pianodeiconti1',
'co_pianodeiconti2',
'co_pianodeiconti3',
'co_preventivi',
'co_preventivi_interventi',
'co_righe2_contratti',
'co_righe_contratti',
'co_righe_documenti',
'co_righe_preventivi',
'co_ritenutaacconto',
'co_rivalsainps',
'co_scadenziario',
'co_staticontratti',
'co_statidocumento',
'co_statipreventivi',
'co_tipidocumento',
'dt_aspettobeni',
'dt_automezzi',
'dt_automezzi_tecnici',
'dt_causalet',
'dt_ddt',
'dt_porto',
'dt_righe_ddt',
'dt_spedizione',
'dt_statiddt',
'dt_tipiddt',
'in_interventi',
'in_interventi_tecnici',
'in_righe_interventi',
'in_statiintervento',
'in_tariffe',
'in_tipiintervento',
'in_vociservizio',
'mg_articoli',
'mg_articoli_automezzi',
'mg_articoli_interventi',
'mg_categorie',
'mg_listini',
'mg_movimenti',
'mg_prodotti',
'mg_unitamisura',
'my_componenti_interventi',
'my_impianti',
'my_impianti_contratti',
'my_impianti_interventi',
'my_impianto_componenti',
'or_ordini',
'or_righe_ordini',
'or_statiordine',
'or_tipiordine',
'zz_tokens',
'zz_files',
'zz_groups',
'zz_group_module',
'zz_settings',
'zz_logs',
'zz_modules',
'zz_plugins',
'zz_permissions',
'zz_users',
'zz_widgets',
'zz_views',
'zz_group_view',
'zz_semaphores',
];
$pieces = array_chunk($tables, 10);
foreach ($pieces as $piece) {
$implode = [];
foreach ($piece as $table) {
$implode[] = prepare($table);
}
$query = 'SELECT table_name FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_SCHEMA = '.prepare($database->getDatabaseName()).' AND
T.TABLE_NAME IN('.implode(',', $implode).") AND
NOT EXISTS (
SELECT table_name
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE
C.TABLE_SCHEMA = T.TABLE_SCHEMA AND
C.TABLE_NAME = T.TABLE_NAME AND
C.COLUMN_NAME = '|field|')";
$created_at = $database->fetchArray(str_replace('|field|', 'created_at', $query));
foreach ($created_at as $table) {
$database->query('ALTER TABLE `'.$table['table_name'].'` ADD `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP');
}
if (API::isCompatible()) {
$updated_at = $database->fetchArray(str_replace('|field|', 'updated_at', $query));
foreach ($updated_at as $table) {
$database->query('ALTER TABLE `'.$table['table_name'].'` `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
}
}
}