From 4e7f9df9fc90f8dae2274bd5abf771f5f97a0241 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Mon, 9 Jul 2018 10:44:54 +0200 Subject: [PATCH] Aggiornamento impostazioni --- include/init/init.php | 50 +++++- include/manager.php | 2 +- include/top.php | 16 +- index.php | 2 +- lib/deprecated.php | 2 +- lib/helpers.php | 4 +- modules/aggiornamenti/api/retrieve.php | 4 +- modules/anagrafiche/actions.php | 6 +- modules/anagrafiche/edit.php | 6 +- modules/contratti/row-list.php | 2 +- modules/ddt/row-list.php | 2 +- modules/fatture/row-list.php | 2 +- modules/impostazioni/actions.php | 44 ++--- modules/impostazioni/edit.php | 44 +---- modules/impostazioni/init.php | 2 +- modules/interventi/modutil.php | 2 +- modules/ordini/row-list.php | 2 +- modules/preventivi/row-list.php | 2 +- plugins/fatturazione/FatturaElettronica.php | 4 +- plugins/sedi/edit.php | 4 +- src/API.php | 4 +- src/Auth.php | 2 +- src/Backup.php | 2 +- src/HTMLBuilder/Handler/DefaultHandler.php | 2 +- src/Settings.php | 174 +++++++++++++++----- src/Translator.php | 4 +- src/Validate.php | 4 +- templates/info.php | 2 +- update/2_1.php | 8 +- update/2_2.php | 2 +- update/2_4_2.sql | 8 +- 31 files changed, 252 insertions(+), 162 deletions(-) diff --git a/include/init/init.php b/include/init/init.php index 3821e5692..436e64a9c 100644 --- a/include/init/init.php +++ b/include/init/init.php @@ -10,9 +10,25 @@ $has_azienda = $dbo->fetchNum("SELECT `an_anagrafiche`.`idanagrafica` FROM `an_a LEFT JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` LEFT JOIN `an_tipianagrafiche` ON `an_tipianagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche_anagrafiche`.`idtipoanagrafica` WHERE `an_tipianagrafiche`.`descrizione` = 'Azienda' AND `an_anagrafiche`.`deleted` = 0") != 0; + $has_user = $dbo->fetchNum('SELECT `id` FROM `zz_users`') != 0; -if ($has_azienda && $has_user) { +$settings = [ + 'Regime Fiscale', + 'Tipo Cassa', + 'Conto predefinito fatture di vendita', + 'Conto predefinito fatture di acquisto', +]; + +$has_settings = true; +foreach ($settings as $setting) { + if (empty(setting($setting))) { + $has_settings = false; + break; + } +} + +if ($has_azienda && $has_user && $has_settings) { return; } @@ -36,7 +52,7 @@ if (post('action') == 'init') { 'id_record' => $id_record, ]); - Settings::set('Logo stampe', $file); + Settings::setValue('Logo stampe', $file); } } @@ -56,6 +72,14 @@ if (post('action') == 'init') { ]); } + if (!$has_settings) { + foreach ($settings as $setting) { + $setting = Settings::get($setting); + + Settings::setValue($setting['nome'], post($setting['id'])); + } + } + redirect(ROOTDIR, 'js'); exit(); } @@ -143,6 +167,28 @@ if (!$has_azienda) { '; } +if (!$has_settings) { + echo ' + +
+
+

'.tr('Impostazioni di base').'

+
+ +
'; + + foreach ($settings as $setting) { + echo ' +
+ '.Settings::input($setting).' +
'; + } + + echo ' +
+
'; +} + echo '
diff --git a/include/manager.php b/include/manager.php index d908578c8..9aa747b73 100644 --- a/include/manager.php +++ b/include/manager.php @@ -172,7 +172,7 @@ if (!empty($module_options) && $module_options != 'menu' && $module_options != '
'; - if (Settings::get('Abilita esportazione Excel e PDF')) { + if (setting('Abilita esportazione Excel e PDF')) { echo '
diff --git a/include/top.php b/include/top.php index c1b2c34a5..67887e332 100644 --- a/include/top.php +++ b/include/top.php @@ -121,12 +121,12 @@ if (Auth::check()) { '; } else { echo ' -'; + '; } // JS @@ -167,7 +167,7 @@ if (Auth::check()) { echo $debugbarRenderer->renderHead(); } - if (Settings::get('Abilita esportazione Excel e PDF')) { + if (setting('Abilita esportazione Excel e PDF')) { echo ' @@ -175,7 +175,7 @@ if (Auth::check()) { } } -$hide_sidebar = setting('Nascondere la barra sinistra di default'); +$hide_sidebar = Auth::check() && setting('Nascondere la barra sinistra di default'); echo ' diff --git a/index.php b/index.php index fd9a09d01..2a12447be 100644 --- a/index.php +++ b/index.php @@ -163,7 +163,7 @@ echo '/> '.tr('Mantieni attiva la sessione').' $(document).ready( function(){ $("#login").click(function(){ $("#login").text("'; - if ($dbo->isInstalled() && setting('Backup automatico')) { + if ($dbo->isInstalled() && !Update::isUpdateAvailable() && setting('Backup automatico')) { echo tr('Backup automatico in corso'); } else { echo tr('Autenticazione'); diff --git a/lib/deprecated.php b/lib/deprecated.php index 1f09ec48b..c5c38a598 100644 --- a/lib/deprecated.php +++ b/lib/deprecated.php @@ -33,5 +33,5 @@ function get_next_code($str, $qty = 1, $mask = '') */ function get_var($nome, $sezione = null, $descrizione = false, $again = false) { - return \Settings::get($nome, $descrizione, $again); + return setting($nome, $again); } diff --git a/lib/helpers.php b/lib/helpers.php index b7a678a63..ad13c5583 100644 --- a/lib/helpers.php +++ b/lib/helpers.php @@ -96,9 +96,9 @@ function get($param, $raw = false) * * @return string */ -function setting($nome, $descrizione = false, $again = false) +function setting($nome, $again = false) { - return \Settings::get($nome, $descrizione, $again); + return \Settings::getValue($nome, $again); } /** diff --git a/modules/aggiornamenti/api/retrieve.php b/modules/aggiornamenti/api/retrieve.php index 8feaa713f..57c23f9c8 100644 --- a/modules/aggiornamenti/api/retrieve.php +++ b/modules/aggiornamenti/api/retrieve.php @@ -4,7 +4,7 @@ switch ($resource) { case 'updates': $custom_where = !empty($updated) ? ' WHERE updated_at >= '.prepare($updated) : ''; - $excluded = explode(',', Settings::get('Tabelle escluse per la sincronizzazione API automatica')); + $excluded = explode(',', setting('Tabelle escluse per la sincronizzazione API automatica')); // Attenzione: query specifica per MySQL $datas = $dbo->fetchArray("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA=".prepare($db_name)); @@ -19,7 +19,7 @@ switch ($resource) { // Attualmente vengono considerate solo le tabelle che eseguono l'eliminazione fisica della riga case 'deleted': - $excluded = explode(',', Settings::get('Tabelle escluse per la sincronizzazione API automatica')); + $excluded = explode(',', setting('Tabelle escluse per la sincronizzazione API automatica')); // Attenzione: query specifica per MySQL $datas = $dbo->fetchArray("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA=".prepare($db_name)); diff --git a/modules/anagrafiche/actions.php b/modules/anagrafiche/actions.php index 6811a5a97..00506be09 100644 --- a/modules/anagrafiche/actions.php +++ b/modules/anagrafiche/actions.php @@ -189,7 +189,7 @@ switch (post('op')) { $dbo->sync('an_tipianagrafiche_anagrafiche', ['idanagrafica' => $new_id], ['idtipoanagrafica' => (array) $idtipoanagrafica]); if (in_array($id_azienda, $idtipoanagrafica)) { - Settings::set('Azienda predefinita', $new_id); + Settings::setValue('Azienda predefinita', $new_id); App::flash()->info(tr('Anagrafica Azienda impostata come predefinita. Per ulteriori informazionioni, visitare "Strumenti -> Impostazioni -> Generali".')); } @@ -274,7 +274,7 @@ switch (post('op')) { if (filter('op') == 'link_file') { $nome = 'Logo stampe'; - if (Settings::get('Azienda predefinita') == $id_record && filter('nome_allegato') == $nome) { - Settings::set($nome, $upload); + if (setting('Azienda predefinita') == $id_record && filter('nome_allegato') == $nome) { + Settings::setValue($nome, $upload); } } diff --git a/modules/anagrafiche/edit.php b/modules/anagrafiche/edit.php index 21ddb19f9..8afb1f76f 100644 --- a/modules/anagrafiche/edit.php +++ b/modules/anagrafiche/edit.php @@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php'; $fornitore = in_array($id_fornitore, $tipi_anagrafica); $cliente = in_array($id_cliente, $tipi_anagrafica); -$google = Settings::get('Google Maps API key'); +$google = setting('Google Maps API key'); if (!empty($google)) { echo ' @@ -414,7 +414,7 @@ if (!empty($google)) { } else { echo '
- '.Modules::link('Impostazioni', $dbo->fetchArray("SELECT `idimpostazione` FROM `zz_settings` WHERE sezione='Generali'")[0]['idimpostazione'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'. + '.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE sezione='Generali'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
'; } @@ -428,7 +428,7 @@ if (!empty($google)) { '.tr('Per impostare il logo delle stampe, caricare un file con nome "Logo stampe"').'.
'; } diff --git a/modules/contratti/row-list.php b/modules/contratti/row-list.php index 88c4da459..3861430dc 100644 --- a/modules/contratti/row-list.php +++ b/modules/contratti/row-list.php @@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php'; /* ARTICOLI + RIGHE GENERICHE */ -$rs = $dbo->fetchArray('SELECT *, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY `order`'); +$rs = $dbo->fetchArray('SELECT *, round(sconto_unitario,'.setting('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.setting('Cifre decimali per importi').') AS sconto, round(subtotale,'.setting('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY `order`'); echo ' diff --git a/modules/ddt/row-list.php b/modules/ddt/row-list.php index 7230aa3b7..7a8d40f95 100644 --- a/modules/ddt/row-list.php +++ b/modules/ddt/row-list.php @@ -21,7 +21,7 @@ echo ' /* Articoli e righe generiche */ -$q_art = 'SELECT *, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice FROM `dt_righe_ddt` WHERE idddt='.prepare($id_record).' ORDER BY `order`'; +$q_art = 'SELECT *, round(sconto_unitario,'.setting('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.setting('Cifre decimali per importi').') AS sconto, round(subtotale,'.setting('Cifre decimali per importi').') AS subtotale, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice FROM `dt_righe_ddt` WHERE idddt='.prepare($id_record).' ORDER BY `order`'; $rs = $dbo->fetchArray($q_art); if (!empty($rs)) { diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index af8048b63..f10dcad94 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -7,7 +7,7 @@ include_once Modules::filepath('Fatture di vendita', 'modutil.php'); /* Righe fattura */ -$rs = $dbo->fetchArray('SELECT *, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),"") AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento='.prepare($id_record).' LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' ORDER BY `order`'); +$rs = $dbo->fetchArray('SELECT *, round(sconto_unitario,'.setting('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.setting('Cifre decimali per importi').') AS sconto, round(subtotale,'.setting('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),"") AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento='.prepare($id_record).' LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' ORDER BY `order`'); echo '
diff --git a/modules/impostazioni/actions.php b/modules/impostazioni/actions.php index 733d897b2..2fe7d67c3 100644 --- a/modules/impostazioni/actions.php +++ b/modules/impostazioni/actions.php @@ -4,54 +4,34 @@ include_once __DIR__.'/../../core.php'; switch (filter('op')) { case 'update': + $is_all_valid = true; + foreach ($post as $id => $value) { - $results = $dbo->fetchArray('SELECT * FROM `zz_settings` WHERE `idimpostazione`='.prepare($id).' AND editable = 1'); - $result = $results[0]; + $is_valid = Settings::setValue($id, $value); - $continue = true; + if (!$is_valid) { + $result = Settings::get($id); - // integer - if ($result['tipo'] == 'integer') { - if (!preg_match('/^\d*$/', $value)) { + // integer + if ($result['tipo'] == 'integer') { App::flash()->error(tr('Il valore inserito del parametro _NAME_ deve essere un numero intero!', [ '_NAME_' => '"'.$result['nome'].'"', ])); - - $continue = false; - } - } - - // list - // verifico che il valore scelto sia nella lista enumerata nel db - elseif (preg_match("/list\[(.+?)\]/", $result['tipo'], $m)) { - $is_valid = false; - $m = explode(',', $m[1]); - for ($i = 0; $i < count($m); ++$i) { - if ($m[$i] == $value) { - $is_valid = true; - } } - if (!$is_valid) { + // list + // verifico che il valore scelto sia nella lista enumerata nel db + elseif (preg_match("/list\[(.+?)\]/", $result['tipo'], $m)) { App::flash()->error(tr('Il valore inserito del parametro _NAME_ deve essere un compreso tra i valori previsti!', [ '_NAME_' => '"'.$result['nome'].'"', ])); - - $continue = false; } } - // Boolean (checkbox) - elseif ($result['tipo'] == 'boolean') { - $value = (empty($value) || $value == 'off') ? false : true; - } - - if (!$continue) { - $dbo->query('UPDATE `zz_settings` SET `valore`='.prepare($value).' WHERE `idimpostazione`='.prepare($id)); - } + $is_all_valid &= $is_valid; } - if ($continue) { + if ($is_all_valid) { App::flash()->info(tr('Impostazioni aggiornate correttamente!')); } diff --git a/modules/impostazioni/edit.php b/modules/impostazioni/edit.php index 484e4e632..71aab5f1d 100644 --- a/modules/impostazioni/edit.php +++ b/modules/impostazioni/edit.php @@ -18,48 +18,10 @@ echo '
'; foreach ($records as $record) { - // Scelta fra più valori echo ' -
'; - if (preg_match("/list\[(.+?)\]/", $record['tipo'], $m)) { - $m = explode(',', $m[1]); - $list = ''; - for ($j = 0; $j < count($m); ++$j) { - if ($j != 0) { - $list .= ','; - } - $list .= '\\"'.$m[$j].'\\": \\"'.$m[$j].'\\"'; - } - echo ' - {[ "type": "select", "label": "'.$record['nome'].'", "name": "'.$record['idimpostazione'].'", "values": "list='.$list.'", "value": "'.$record['valore'].'" ]}'; - } - - // query - elseif (preg_match('/^query=(.+?)$/', $record['tipo'], $m)) { - echo ' - {[ "type": "select", "label": "'.$record['nome'].'", "name": "'.$record['idimpostazione'].'", "values": "'.$record['tipo'].'", "value": "'.$record['valore'].'" ]}'; - } - - // Boolean (checkbox) - elseif ($record['tipo'] == 'boolean') { - echo ' - {[ "type": "checkbox", "label": "'.$record['nome'].'", "name": "'.$record['idimpostazione'].'", "placeholder": "'.tr('Attivo').'", "value": "'.$record['valore'].'" ]}'; - } elseif ($record['tipo'] == 'textarea') { - echo ' - {[ "type": "textarea", "label": "'.$record['nome'].'", "name": "'.$record['idimpostazione'].'", "value": '.json_encode($record['valore']).' ]}'; - } - // Campo di testo normale - else { - $numerico = in_array($record['tipo'], ['integer', 'decimal']); - - $tipo = preg_match('/password/i', $record['nome'], $m) ? 'password' : $record['tipo']; - $tipo = $numerico ? 'number' : 'text'; - - echo ' - {[ "type": "'.$tipo.'", "label": "'.$record['nome'].'", "name": "'.$record['idimpostazione'].'", "value": "'.$record['valore'].'"'.($numerico && $record['tipo'] == 'integer' ? ', "decimals": 0' : '').' ]}'; - } - echo ' -
'; +
+ '.Settings::input($record['id']).' +
'; } echo ' diff --git a/modules/impostazioni/init.php b/modules/impostazioni/init.php index f62c97bb6..9e21be1ae 100644 --- a/modules/impostazioni/init.php +++ b/modules/impostazioni/init.php @@ -3,5 +3,5 @@ include_once __DIR__.'/../../core.php'; if (isset($id_record)) { - $records = $dbo->fetchArray('SELECT * FROM `zz_settings` WHERE `sezione` = (SELECT sezione FROM `zz_settings` WHERE `idimpostazione` = '.prepare($id_record).') AND `editable` = 1 ORDER BY `order`'); + $records = $dbo->fetchArray('SELECT * FROM `zz_settings` WHERE `sezione` = (SELECT sezione FROM `zz_settings` WHERE `id` = '.prepare($id_record).') AND `editable` = 1 ORDER BY `order`'); } diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php index 9957b51ef..1defc2573 100644 --- a/modules/interventi/modutil.php +++ b/modules/interventi/modutil.php @@ -160,7 +160,7 @@ function get_costi_intervento($id_intervento) { $dbo = Database::getConnection(); - $decimals = Settings::get('Cifre decimali per importi'); + $decimals = setting('Cifre decimali per importi'); $idiva = setting('Iva predefinita'); $rs_iva = $dbo->fetchArray('SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva)); diff --git a/modules/ordini/row-list.php b/modules/ordini/row-list.php index 2e5262108..10fed771d 100644 --- a/modules/ordini/row-list.php +++ b/modules/ordini/row-list.php @@ -21,7 +21,7 @@ echo '
'; -$q = 'SELECT *, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, (SELECT codice FROM mg_articoli WHERE mg_articoli.id=`or_righe_ordini`.`idarticolo`) AS codice FROM `or_righe_ordini` WHERE idordine='.prepare($id_record).' ORDER BY `order`'; +$q = 'SELECT *, round(sconto_unitario,'.setting('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.setting('Cifre decimali per importi').') AS sconto, round(subtotale,'.setting('Cifre decimali per importi').') AS subtotale, (SELECT codice FROM mg_articoli WHERE mg_articoli.id=`or_righe_ordini`.`idarticolo`) AS codice FROM `or_righe_ordini` WHERE idordine='.prepare($id_record).' ORDER BY `order`'; $rs = $dbo->fetchArray($q); if (!empty($rs)) { diff --git a/modules/preventivi/row-list.php b/modules/preventivi/row-list.php index ec8c8fb27..f0dc8f130 100644 --- a/modules/preventivi/row-list.php +++ b/modules/preventivi/row-list.php @@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php'; /* ARTICOLI + RIGHE GENERICHE */ -$q_art = 'SELECT *, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe_preventivi WHERE idpreventivo='.prepare($id_record).' ORDER BY `order`'; +$q_art = 'SELECT *, round(sconto_unitario,'.setting('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.setting('Cifre decimali per importi').') AS sconto, round(subtotale,'.setting('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe_preventivi WHERE idpreventivo='.prepare($id_record).' ORDER BY `order`'; $rs = $dbo->fetchArray($q_art); echo ' diff --git a/plugins/fatturazione/FatturaElettronica.php b/plugins/fatturazione/FatturaElettronica.php index a4f89b26d..7dc0a68ea 100644 --- a/plugins/fatturazione/FatturaElettronica.php +++ b/plugins/fatturazione/FatturaElettronica.php @@ -52,7 +52,7 @@ class FatturaElettronica if (empty(self::$azienda)) { $database = \Database::getConnection(); - self::$azienda = $database->fetchOne('SELECT *, (SELECT `iso2` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione FROM `an_anagrafiche` WHERE `idanagrafica` = '.prepare(\Settings::get('Azienda predefinita'))); + self::$azienda = $database->fetchOne('SELECT *, (SELECT `iso2` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione FROM `an_anagrafiche` WHERE `idanagrafica` = '.prepare(setting('Azienda predefinita'))); } return self::$azienda; @@ -184,7 +184,7 @@ class FatturaElettronica if ($azienda) { // AlboProfessionale, ProvinciaAlbo, NumeroIscrizioneAlbo, DataIscrizioneAlbo - $result['RegimeFiscale'] = \Settings::get('Regime Fiscale'); + $result['RegimeFiscale'] = setting('Regime Fiscale'); } return $result; diff --git a/plugins/sedi/edit.php b/plugins/sedi/edit.php index cc21108e5..e9313d4b5 100644 --- a/plugins/sedi/edit.php +++ b/plugins/sedi/edit.php @@ -2,7 +2,7 @@ include_once __DIR__.'/../../core.php'; -$google = Settings::get('Google Maps API key'); +$google = setting('Google Maps API key'); /* if (!empty($google)) { @@ -128,7 +128,7 @@ if (!empty($google)) { } else { echo '
- '.Modules::link('Impostazioni', $dbo->fetchArray("SELECT `idimpostazione` FROM `zz_settings` WHERE sezione='Generali'")[0]['idimpostazione'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'. + '.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE sezione='Generali'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
'; } diff --git a/src/API.php b/src/API.php index ae824826d..f4beaecd6 100644 --- a/src/API.php +++ b/src/API.php @@ -95,7 +95,7 @@ class API extends \Util\Singleton // Paginazione automatica dell'API $page = isset($request['page']) ? (int) $request['page'] : 0; - $length = Settings::get('Lunghezza pagine per API'); + $length = setting('Lunghezza pagine per API'); $database = Database::getConnection(); @@ -110,7 +110,7 @@ class API extends \Util\Singleton $filename = DOCROOT.'/modules/'.$resources[$resource].'/api/'.$kind.'.php'; include $filename; } elseif ( - !in_array($resource, explode(',', Settings::get('Tabelle escluse per la sincronizzazione API automatica'))) + !in_array($resource, explode(',', setting('Tabelle escluse per la sincronizzazione API automatica'))) && $database->tableExists($resource) ) { $table = $resource; diff --git a/src/Auth.php b/src/Auth.php index 68770e171..f1ee07875 100644 --- a/src/Auth.php +++ b/src/Auth.php @@ -323,7 +323,7 @@ class Auth extends \Util\Singleton if (!empty($results)) { $module = null; - $first = Settings::get('Prima pagina'); + $first = setting('Prima pagina'); if (!in_array($first, array_column($results, 'id'))) { $module = $results[0]['id']; } else { diff --git a/src/Backup.php b/src/Backup.php index 3ea1fffd4..58937db1c 100644 --- a/src/Backup.php +++ b/src/Backup.php @@ -280,7 +280,7 @@ class Backup */ public static function cleanup() { - $max_backups = intval(Settings::get('Numero di backup da mantenere')); + $max_backups = intval(setting('Numero di backup da mantenere')); $backups = self::getList(); $count = count($backups); diff --git a/src/HTMLBuilder/Handler/DefaultHandler.php b/src/HTMLBuilder/Handler/DefaultHandler.php index a8d8bc728..bd3e47efb 100644 --- a/src/HTMLBuilder/Handler/DefaultHandler.php +++ b/src/HTMLBuilder/Handler/DefaultHandler.php @@ -153,7 +153,7 @@ class DefaultHandler implements HandlerInterface // Se non è previsto un valore minimo, lo imposta a 1 $values['min-value'] = isset($values['min-value']) ? $values['min-value'] : 0; - $decimals = \Settings::get('Cifre decimali per quantità'); + $decimals = setting('Cifre decimali per quantità'); $values['decimals'] = $decimals; } } diff --git a/src/Settings.php b/src/Settings.php index 3972591af..a2dc27d67 100644 --- a/src/Settings.php +++ b/src/Settings.php @@ -1,5 +1,7 @@ select('zz_settings', '*'); + foreach ($results as $result) { + $settings[$result['id']] = $result; + $references[$result['nome']] = $result['id']; + + if (!isset($sections[$result['sezione']])) { + $sections[$result['sezione']] = []; + } + $sections[$result['sezione']][] = $result['id']; + } + + self::$settings = $settings; + self::$references = $references; + self::$sections = $sections; + } + + return self::$settings; + } + + /** + * Restituisce le informazioni relative a una singolo impostazione specificata. + * + * @param string|int $setting + * + * @return array + */ + public static function get($setting) + { + $settings = self::getSettings(); + + if (!is_numeric($setting) && !empty(self::$references[$setting])) { + $setting = self::$references[$setting]; + } + + return $settings[$setting]; + } /** * Restituisce il valore corrente dell'impostazione ricercata. - * Se l'impostazione viene cercata più volte, il primo valore individuato viene salvato; per costringere a aggiornare i contenuto, usare l'opzione $again. * - * @param string $nome - * @param string $descrizione - * @param bool $again + * @param string|int $setting * * @return string */ - public static function get($nome, $descrizione = false, $again = false) + public static function getValue($setting) { - if (Update::isUpdateAvailable()) { - return null; + return self::get($setting)['valore']; + } + + public static function setValue($setting, $value) + { + $setting = self::get($setting); + + // Trasformazioni + // Boolean (checkbox) + if ($setting['tipo'] == 'boolean') { + $value = (empty($value) || $value == 'off') ? false : true; } - if (!isset(self::$values[$nome]) || !empty($again)) { + // Validazioni + // integer + if ($setting['tipo'] == 'integer') { + $validator = v::intVal()->validate($value); + } + + // list + // verifico che il valore scelto sia nella lista enumerata nel db + elseif (preg_match("/list\[(.+?)\]/", $setting['tipo'], $m)) { + $validator = v::in(explode(',', $m[1])); + } + + // Boolean (checkbox) + elseif ($setting['tipo'] == 'boolean') { + $validator = v::boolType(); + } + + if (empty($validator) || $validator->validate($value)) { $database = Database::getConnection(); - if (!$database->isInstalled()) { - return null; - } + $database->update('zz_settings', [ + 'valore' => $value, + ], [ + 'id' => $setting['id'], + ]); + self::$settings[$setting['id']]['valore'] = $value; - $results = $database->fetchArray('SELECT valore, tipo FROM zz_settings WHERE nome='.prepare($nome)); - - $value = null; - if (!empty($results)) { - $result = $results[0]; - $value = $result['valore']; - - if (!empty($descrizione) && str_contains($result['tipo'], 'query=')) { - $data = $database->fetchArray(str_replace('query=', '', $result['tipo'])); - if (!empty($data)) { - $value = $data[0]['descrizione']; - } - } - } - - self::$values[$nome] = $value; + return true; } - return self::$values[$nome]; + return false; } - public static function set($name, $value) + public static function input($setting) { - $database = Database::getConnection(); + $setting = self::get($setting); - $database->update('zz_settings', [ - 'valore' => $value, - ], [ - 'nome' => $name, - ]); + if (preg_match("/list\[(.+?)\]/", $setting['tipo'], $m)) { + $m = explode(',', $m[1]); + $list = ''; + for ($j = 0; $j < count($m); ++$j) { + if ($j != 0) { + $list .= ','; + } + $list .= '\\"'.$m[$j].'\\": \\"'.$m[$j].'\\"'; + } + $result = ' + {[ "type": "select", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "values": "list='.$list.'", "value": "'.$setting['valore'].'" ]}'; + } - self::get($nome, null, null, true); + // query + elseif (preg_match('/^query=(.+?)$/', $setting['tipo'], $m)) { + $result = ' + {[ "type": "select", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "values": "'.$setting['tipo'].'", "value": "'.$setting['valore'].'" ]}'; + } + + // Boolean (checkbox) + elseif ($setting['tipo'] == 'boolean') { + $result = ' + {[ "type": "checkbox", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "placeholder": "'.tr('Attivo').'", "value": "'.$setting['valore'].'" ]}'; + } elseif ($setting['tipo'] == 'textarea') { + $result = ' + {[ "type": "textarea", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "value": '.json_encode($setting['valore']).' ]}'; + } + // Campo di testo normale + else { + $numerico = in_array($setting['tipo'], ['integer', 'decimal']); + + $tipo = preg_match('/password/i', $setting['nome'], $m) ? 'password' : $setting['tipo']; + $tipo = $numerico ? 'number' : 'text'; + + $result = ' + {[ "type": "'.$tipo.'", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "value": "'.$setting['valore'].'"'.($numerico && $setting['tipo'] == 'integer' ? ', "decimals": 0' : '').' ]}'; + } + + return $result; } } diff --git a/src/Translator.php b/src/Translator.php index 0b788ed94..adfe7dd4a 100644 --- a/src/Translator.php +++ b/src/Translator.php @@ -127,7 +127,7 @@ class Translator extends Util\Singleton ] : $formatter['number'] ); - self::$formatter->setPrecision(Settings::get('Cifre decimali per importi')); + self::$formatter->setPrecision(auth()->check() ? setting('Cifre decimali per importi') : 2); } } @@ -214,7 +214,7 @@ class Translator extends Util\Singleton $string = !isset($string) ? 0 : $string; if (!empty($decimals) && is_string($decimals)) { - $decimals = ($decimals == 'qta') ? \Settings::get('Cifre decimali per quantità') : null; + $decimals = ($decimals == 'qta') ? setting('Cifre decimali per quantità') : null; } return self::getFormatter()->formatNumber($string, $decimals); diff --git a/src/Validate.php b/src/Validate.php index 4fcdc090a..4388052a5 100644 --- a/src/Validate.php +++ b/src/Validate.php @@ -38,7 +38,7 @@ class Validate } // Controllo attraverso apilayer - $access_key = Settings::get('apilayer API key for VAT number'); + $access_key = setting('apilayer API key for VAT number'); if (!empty($access_key)) { if (!extension_loaded('curl')) { App::flash()->warning(tr('Estensione cURL non installata')); @@ -84,7 +84,7 @@ class Validate } // Controllo attraverso apilayer - $access_key = Settings::get('apilayer API key for Email'); + $access_key = setting('apilayer API key for Email'); if (!empty($access_key)) { if (!extension_loaded('curl')) { App::flash()->warning(tr('Estensione cURL non installata')); diff --git a/templates/info.php b/templates/info.php index 181604606..5eb433ad5 100644 --- a/templates/info.php +++ b/templates/info.php @@ -96,7 +96,7 @@ $default_footer = include $footer_file; $default_logo = App::filepath('templates/base|custom|/logo_azienda.jpg'); // Logo generico -$custom_logo = App::filepath('files/anagrafiche/'.Settings::get('Logo stampe')); +$custom_logo = App::filepath('files/anagrafiche/'.setting('Logo stampe')); // Logo specifico della stampa $logo = Prints::filepath($id_print, 'logo_azienda.jpg'); diff --git a/update/2_1.php b/update/2_1.php index a5fed5f3a..ff89c4c99 100644 --- a/update/2_1.php +++ b/update/2_1.php @@ -5,20 +5,20 @@ if (file_exists(DOCROOT.'/lib/jscripts/fullcalendar.min.js')) { } // Riporto su ogni riga della fattura la relativa rivalsa inps e ritenuta d'acconto se impostate -$rivalsainps = setting('Percentuale rivalsa inps'); -$ritenuta = setting("Percentuale ritenuta d'acconto"); +$rivalsainps = $dbo->fetchArray("SELECT valore FROM zz_impostazioni WHERE nome='Percentuale rivalsa INPS'")[0]['valore']; +$ritenuta = $dbo->fetchArray("SELECT valore FROM zz_impostazioni WHERE nome='Percentuale ritenuta d''acconto'")[0]['valore']; $rs = $dbo->fetchArray('SELECT id FROM co_documenti'); for ($i = 0; $i < sizeof($rs); ++$i) { if ($rivalsainps != '') { - $dbo->query('UPDATE co_righe_documenti SET idrivalsainps="'.setting('Percentuale rivalsa INPS').'", rivalsainps=( (subtotale-sconto) /100 * 4 ) WHERE iddocumento="'.$rs[$i]['id'].'"'); + $dbo->query('UPDATE co_righe_documenti SET idrivalsainps="'.$rivalsainps.'", rivalsainps=( (subtotale-sconto) /100 * 4 ) WHERE iddocumento="'.$rs[$i]['id'].'"'); } else { $dbo->query('UPDATE co_righe_documenti SET idrivalsainps="0", rivalsainps=0 WHERE iddocumento="'.$rs[$i]['id'].'"'); } if ($ritenuta != '') { - $dbo->query('UPDATE co_righe_documenti SET idritenutaacconto="'.setting("Percentuale ritenuta d'acconto").'", ritenutaacconto=( (subtotale+rivalsainps-sconto) /100 * 20 ) WHERE iddocumento="'.$rs[$i]['id'].'"'); + $dbo->query('UPDATE co_righe_documenti SET idritenutaacconto="'.$ritenuta.'", ritenutaacconto=( (subtotale+rivalsainps-sconto) /100 * 20 ) WHERE iddocumento="'.$rs[$i]['id'].'"'); } else { $dbo->query('UPDATE co_righe_documenti SET idritenutaacconto="0", ritenutaacconto=0 WHERE iddocumento="'.$rs[$i]['id'].'"'); } diff --git a/update/2_2.php b/update/2_2.php index 2d855ea18..03320f7e2 100644 --- a/update/2_2.php +++ b/update/2_2.php @@ -56,7 +56,7 @@ if (sizeof($rs) == 0) { } // Spostamento ore di lavoro e diritto di chiamata dei preventivi nella tabella -$idiva = setting('Iva predefinita'); +$idiva = $dbo->fetchArray("SELECT valore FROM zz_impostazioni WHERE nome='Iva predefinita'")[0]['valore']; $rs = $dbo->fetchArray('SELECT percentuale, indetraibile FROM co_iva WHERE id="'.$idiva.'"'); $percentuale = $rs[0]['percentuale']; diff --git a/update/2_4_2.sql b/update/2_4_2.sql index 8777cb9f0..6843902dd 100644 --- a/update/2_4_2.sql +++ b/update/2_4_2.sql @@ -164,8 +164,8 @@ INSERT INTO `fe_natura` (`codice`, `descrizione`) VALUES ('N7','IVA assolta in altro stato UE (vendite a distanza ex art. 40 c. 3 e 4 e art. 41 c. 1 lett. b, DL 331/93; prestazione di servizi di telecomunicazioni, tele-radiodiffusione ed elettronici ex art. 7-sexies lett. f, g, art. 74-sexies DPR 633/72)'); ALTER TABLE `co_iva` DROP `esente`, ADD `codice_natura_fe` varchar(4) NOT NULL; -UPDATE `co_iva` SET `codice_natura_fe` = 'TD01' WHERE `descrizione` IN ('Fattura immediata di acquisto', 'Fattura immediata di vendita', 'Fattura differita di acquisto', 'Fattura differita di vendita', 'Fattura accompagnatoria di acquisto', 'Fattura accompagnatoria di vendita'); -ALTER TABLE `co_iva` ADD FOREIGN KEY (`codice_natura_fe`) REFERENCES `fe_natura`(`codice`) ON DELETE CASCADE; +-- UPDATE `co_iva` SET `codice_natura_fe` = 'TD01' WHERE `descrizione` IN ('Fattura immediata di acquisto', 'Fattura immediata di vendita', 'Fattura differita di acquisto', 'Fattura differita di vendita', 'Fattura accompagnatoria di acquisto', 'Fattura accompagnatoria di vendita'); +-- ALTER TABLE `co_iva` ADD FOREIGN KEY (`codice_natura_fe`) REFERENCES `fe_natura`(`codice`) ON DELETE CASCADE; CREATE TABLE IF NOT EXISTS `fe_causali_pagamento_ritenuta` ( `codice` varchar(4) NOT NULL, @@ -203,3 +203,7 @@ età svizzere che possiedono i requisiti di cui all''art. 15, c. 2 dell’Accord ('Z', 'Titolo diverso dai precedenti'); INSERT INTO `zz_settings` (`idimpostazione`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES (NULL, 'Causale ritenuta d''acconto', '', 'query=SELECT codice AS id, descrizione FROM fe_causali_pagamento_ritenuta', 1, 'Fatturazione', 0); + +-- Aggiornamento zz_settings +ALTER TABLE `zz_settings` CHANGE `idimpostazione` `id` int(11) NOT NULL AUTO_INCREMENT; +UPDATE `zz_views` SET `query` = REPLACE(`query`, 'idimpostazione', 'id');