diff --git a/.gitignore b/.gitignore index 7ec4e814c..6f8350168 100644 --- a/.gitignore +++ b/.gitignore @@ -73,7 +73,7 @@ vendor/ *.old *.mo .couscous/ -assets/dist +assets/dist/ backup/* !backup/.htaccess files/* diff --git a/.php_cs b/.php_cs new file mode 100644 index 000000000..9b1009b39 --- /dev/null +++ b/.php_cs @@ -0,0 +1,20 @@ +setRules(array( + '@Symfony' => true, + 'array_syntax' => array('syntax' => 'short'), + )) + ->setFinder( + PhpCsFixer\Finder::create() + ->files() + ->in(__DIR__) + ->exclude('vendor') + ->exclude('resources/views') + ->exclude('storage') + ->exclude('public') + ->notName("*.txt") + ->ignoreDotFiles(true) + ->ignoreVCS(true) + ) +; diff --git a/README.md b/README.md index 08f527489..5841d6ba8 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,10 @@ Un software gestionale, identificato nell'insieme degli applicativi che automati Secondo questa definizione, OpenSTAManager riesce a generalizzare al proprio interno le funzionalità caratteristiche della contabilità e della gestione del magazzino, presentando inoltre moduli piuttosto avanzati e destinati a complementare l'attività aziendale in relazione agli interventi di assistenza della realtà lavorativa in oggetto. -## Tabella dei contenuti +La documentazione ufficiale risulta disponibile all'indirizzo . -- [Tabella dei contenuti](#tabella-dei-contenuti) - [Requisiti](#requisiti) - [Installazione](#installazione) - [Versioni](#versioni) @@ -37,10 +36,10 @@ Prima di iniziare l'installazione, è necessario procedere al download di una ve L'installazione del gestionale richiede la presenza di un server web con abilitato il [DBMS (Database Management System)](https://it.wikipedia.org/wiki/Database_management_system) MySQL e il linguaggio di programmazione [PHP](http://php.net/). -- PHP >= 5.4 (si consiglia come minimo la versione 5.6 per poter usufruire di tutte le funzionalità del progetto) +- PHP >= 5.4 (si consiglia la versione 5.6 per poter usufruire di tutte le funzionalità del progetto) - MySQL >= 5.0 -Per ulteriori informazioni sui pacchetti che forniscono questi elementi di default, visitare la sezione [Informazioni](https://devcode-it.github.io/openstamanager/installazione.html) della documentazione. +Per ulteriori informazioni sui pacchetti che forniscono questi elementi di default, visitare la sezione [Installazione](https://devcode-it.github.io/openstamanager/installazione.html) della documentazione. ## Installazione @@ -69,7 +68,6 @@ Nel caso si stia utilizzando la versione direttamente ottenuta dalla repository ```bash php composer.phar install -php composer.phar update yarn global add gulp yarn install gulp diff --git a/ajax_autocomplete.php b/ajax_autocomplete.php index fdf85608c..f5094968c 100644 --- a/ajax_autocomplete.php +++ b/ajax_autocomplete.php @@ -345,7 +345,7 @@ switch ($module_name) { for ($i = 0; $i < sizeof($fatture); ++$i) { ($fatture[$i]['n2_fattura'] != '') ? $n_fattura = $fatture[$i]['n2_fattura'] : $n_fattura = $fatture[$i]['n_fattura']; - $id_module = $modules_info['Fatture di vendita']['id']; + $id_module = Modules::getModule('Fatture di vendita')['id']; echo "Fattura no ".$n_fattura."\n"; echo "".Translator::dateToLocale($fatture[$i]['data_fattura'])."\n"; @@ -377,7 +377,7 @@ switch ($module_name) { for ($i = 0; $i < sizeof($fatture); ++$i) { ($fatture[$i]['n2_fattura'] != '') ? $n_fattura = $fatture[$i]['n2_fattura'] : $n_fattura = $fatture[$i]['n_fattura']; - $id_module = $modules_info['Fatture di vendita']['id']; + $id_module = Modules::getModule('Fatture di vendita')['id']; echo "Fattura no ".$n_fattura."\n"; echo "".Translator::dateToLocale($fatture[$i]['data_fattura'])."\n"; @@ -408,7 +408,7 @@ switch ($module_name) { for ($i = 0; $i < sizeof($fatture); ++$i) { ($fatture[$i]['n2_fattura'] != '') ? $n_fattura = $fatture[$i]['n2_fattura'] : $n_fattura = $fatture[$i]['n_fattura']; - $id_module = $modules_info['Fatture di vendita']['id']; + $id_module = Modules::getModule('Fatture di vendita')['id']; echo "Fattura no ".$n_fattura."\n"; echo "".Translator::dateToLocale($fatture[$i]['data_fattura'])."\n"; diff --git a/core.php b/core.php index 0b68f2849..007aefc6f 100644 --- a/core.php +++ b/core.php @@ -37,15 +37,16 @@ define('ROOTDIR', $rootdir); // Caricamento delle dipendenze e delle librerie del progetto require_once __DIR__.'/vendor/autoload.php'; +// Redirect al percorso HTTPS se impostato nella configurazione +if (!empty($redirectHTTPS) && !isHTTPS(true)) { + header('HTTP/1.1 301 Moved Permanently'); + header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); + exit(); +} + // Forzamento del debug // $debug = true; -/* -// Controllo CSRF -if(!CSRF::getInstance()->validate()){ - die(_('Constrollo CSRF fallito!')); -}*/ - // Logger per la segnalazione degli errori $logger = new Monolog\Logger(_('OpenSTAManager')); $logger->pushProcessor(new Monolog\Processor\UidProcessor()); @@ -61,8 +62,8 @@ $handlers[] = new StreamHandler(__DIR__.'/logs/setup.log', Monolog\Logger::EMERG // Impostazioni di debug if (!empty($debug)) { + // Ignoramento degli avvertimenti e delle informazioni relative alla deprecazione di componenti if (empty($strict)) { - // Ignoramento degli avvertimenti e delle informazioni relative alla deprecazione di componenti error_reporting(E_ALL & ~E_NOTICE & ~E_USER_DEPRECATED); } @@ -106,158 +107,160 @@ Monolog\ErrorHandler::register($logger); $formatter = !empty($formatter) ? $formatter : []; Translator::setLocaleFormatter($formatter); -// Aggiunta del wrapper personalizzato per la generazione degli input -if (!empty($HTMLWrapper)) { - HTMLBuilder\HTMLBuilder::setWrapper($HTMLWrapper); -} - -// Aggiunta dei gestori personalizzati per la generazione degli input -foreach ((array) $HTMLHandlers as $key => $value) { - HTMLBuilder\HTMLBuilder::setHandler($key, $value); -} - -// Aggiunta dei gestori per componenti personalizzate -foreach ((array) $HTMLManagers as $key => $value) { - HTMLBuilder\HTMLBuilder::setManager($key, $value); -} - -// Registrazione globale del template per gli input HTML -register_shutdown_function('translateTemplate'); - -// Redirect al percorso HTTPS se impostato nella configurazione -if (!empty($redirectHTTPS) && !isHTTPS(true)) { - header('HTTP/1.1 301 Moved Permanently'); - header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); - exit(); -} - -session_set_cookie_params(0, $rootdir); -session_start(); - -// Impostazione della sessione di base -$_SESSION['infos'] = isset($_SESSION['infos']) ? $_SESSION['infos'] : []; -$_SESSION['warnings'] = isset($_SESSION['warnings']) ? $_SESSION['warnings'] : []; -$_SESSION['errors'] = (array) $_SESSION['errors']; - -// Imposto il periodo di visualizzazione dei record dal 01-01-yyy al 31-12-yyyy -if (!empty($_GET['period_start'])) { - $_SESSION['period_start'] = $_GET['period_start']; - $_SESSION['period_end'] = $_GET['period_end']; -} elseif (!isset($_SESSION['period_start'])) { - $_SESSION['period_start'] = date('Y').'-01-01'; - $_SESSION['period_end'] = date('Y').'-12-31'; -} - -// Impostazione del tema grafico di default -$theme = !empty($theme) ? $theme : 'default'; - // Istanziamento del gestore delle traduzioni del progetto $lang = !empty($lang) ? $lang : 'it'; $translator = new Translator($lang); $translator->addLocalePath($docroot.'/locale'); $translator->addLocalePath($docroot.'/modules/*/locale'); -// Istanziamento del gestore degli utenti -if (!Update::isUpdateAvailable()) { - $auth = new Auth(); -} - +// Individuazione di versione e revisione del progetto $version = Update::getVersion(); $revision = Update::getRevision(); -$assets = $rootdir.'/assets/dist'; -$css = $assets.'/css'; -$js = $assets.'/js'; -$img = $assets.'/img'; - -// CSS di base del progetto -$css_modules = []; - -$css_modules[] = $css.'/app.min.css'; -$css_modules[] = $css.'/style.min.css'; -$css_modules[] = $css.'/themes.min.css'; -$css_modules[] = [ - 'href' => $css.'/print.min.css', - 'media' => 'print', -]; - -// JS di base del progetto -$jscript_modules = []; - -$jscript_modules[] = $js.'/app.min.js'; -$jscript_modules[] = $js.'/custom.min.js'; -$jscript_modules[] = $js.'/i18n/parsleyjs/'.$lang.'.min.js'; -$jscript_modules[] = $js.'/i18n/select2/'.$lang.'.min.js'; -$jscript_modules[] = $js.'/i18n/moment/'.$lang.'.min.js'; -$jscript_modules[] = $js.'/i18n/fullcalendar/'.$lang.'.min.js'; - -if (Auth::check()) { - $jscript_modules[] = $rootdir.'/lib/functions.js'; - $jscript_modules[] = $rootdir.'/lib/init.js'; +if (!API::isAPIRequest()) { + session_set_cookie_params(0, $rootdir); + session_start(); } $dbo = Database::getConnection(); -// Controllo sull'esistenza delle informazioni necessarie prima di effettuare la connessione al database -if ($dbo->isConnected() && $dbo->isInstalled() && (Auth::check() || API::isAPIRequest()) && !Update::isUpdateAvailable()) { - if (!empty($debugbar)) { - $debugbar->addCollector(new DebugBar\DataCollector\PDO\PDOCollector($dbo->getPDO())); - } +$continue = $dbo->isInstalled() && Auth::check() && !Update::isUpdateAvailable(); - $id_module = filter('id_module'); - $id_record = filter('id_record'); - $id_plugin = filter('id_plugin'); - $id_parent = filter('id_parent'); - - /* - * Creazione array con l'elenco dei moduli - * es. $modules['Anagrafiche']['nome_campo']; - */ - $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`'); - - $modules_info = []; - for ($i = 0; $i < count($rs); ++$i) { - foreach ($rs[$i] as $name => $value) { - if ($name == 'permessi' && (Auth::isAdmin() || $value == null)) { - if (Auth::isAdmin()) { - $value = 'rw'; - } else { - $value = '-'; - } - } - if ($name != 'idmodule' && $name != 'updated_at' && $name != 'created_at' && $name != 'clause') { - $modules_info[$rs[$i]['name']][$name] = $value; - } elseif ($name == 'clause') { - $additional_where[$rs[$i]['name']] = !empty($value) ? ' AND '.$value : $value; - } - } - - $modules_info[$rs[$i]['id']]['name'] = $rs[$i]['name']; - } - - $user = Auth::getUser(); - $user_idanagrafica = $user['idanagrafica']; - - if (!empty($id_module)) { - $module = Modules::getModule($id_module); - - $pageTitle = $module['title']; - - Permissions::addModule($id_module); - } - - if (!empty($skip_permissions)) { - Permissions::skip(); - } - - Permissions::check(); -} elseif (slashes($_SERVER['SCRIPT_FILENAME']) != slashes(DOCROOT.'/index.php')) { +// Controllo sulla presenza dei permessi di accesso basilari +if (!$continue && slashes($_SERVER['SCRIPT_FILENAME']) != slashes(DOCROOT.'/index.php')) { redirect(ROOTDIR.'/index.php?op=logout'); exit(); } -// Istanziamento di HTMLHelper -$html = new HTMLHelper(); +// Operazione aggiuntive (richieste non API) +if (!API::isAPIRequest()) { + /* + // Controllo CSRF + if(!CSRF::getInstance()->validate()){ + die(_('Constrollo CSRF fallito!')); + }*/ + + // Aggiunta del wrapper personalizzato per la generazione degli input + if (!empty($HTMLWrapper)) { + HTMLBuilder\HTMLBuilder::setWrapper($HTMLWrapper); + } + + // Aggiunta dei gestori personalizzati per la generazione degli input + foreach ((array) $HTMLHandlers as $key => $value) { + HTMLBuilder\HTMLBuilder::setHandler($key, $value); + } + + // Aggiunta dei gestori per componenti personalizzate + foreach ((array) $HTMLManagers as $key => $value) { + HTMLBuilder\HTMLBuilder::setManager($key, $value); + } + + // Registrazione globale del template per gli input HTML + register_shutdown_function('translateTemplate'); + + // Impostazione della sessione di base + $_SESSION['infos'] = (array) $_SESSION['errors']; + $_SESSION['warnings'] = (array) $_SESSION['errors']; + $_SESSION['errors'] = (array) $_SESSION['errors']; + + // Imposto il periodo di visualizzazione dei record dal 01-01-yyy al 31-12-yyyy + if (!empty($_GET['period_start'])) { + $_SESSION['period_start'] = $_GET['period_start']; + $_SESSION['period_end'] = $_GET['period_end']; + } elseif (!isset($_SESSION['period_start'])) { + $_SESSION['period_start'] = date('Y').'-01-01'; + $_SESSION['period_end'] = date('Y').'-12-31'; + } + + // Impostazione del tema grafico di default + $theme = !empty($theme) ? $theme : 'default'; + + $assets = $rootdir.'/assets/dist'; + $css = $assets.'/css'; + $js = $assets.'/js'; + $img = $assets.'/img'; + + // CSS di base del progetto + $css_modules = []; + + $css_modules[] = $css.'/app.min.css'; + $css_modules[] = $css.'/style.min.css'; + $css_modules[] = $css.'/themes.min.css'; + $css_modules[] = [ + 'href' => $css.'/print.min.css', + 'media' => 'print', + ]; + + // JS di base del progetto + $jscript_modules = []; + + $jscript_modules[] = $js.'/app.min.js'; + $jscript_modules[] = $js.'/custom.min.js'; + $jscript_modules[] = $js.'/i18n/parsleyjs/'.$lang.'.min.js'; + $jscript_modules[] = $js.'/i18n/select2/'.$lang.'.min.js'; + $jscript_modules[] = $js.'/i18n/moment/'.$lang.'.min.js'; + $jscript_modules[] = $js.'/i18n/fullcalendar/'.$lang.'.min.js'; + + if (Auth::check()) { + $jscript_modules[] = $rootdir.'/lib/functions.js'; + $jscript_modules[] = $rootdir.'/lib/init.js'; + } + + if ($continue) { + if (!empty($debugbar)) { + $debugbar->addCollector(new DebugBar\DataCollector\PDO\PDOCollector($dbo->getPDO())); + } + + $id_module = filter('id_module'); + $id_record = filter('id_record'); + $id_plugin = filter('id_plugin'); + $id_parent = filter('id_parent'); + + $user = Auth::user(); + + if (!empty($id_module)) { + $module = Modules::getModule($id_module); + + $pageTitle = $module['title']; + + Permissions::addModule($id_module); + } + + if (!empty($skip_permissions)) { + Permissions::skip(); + } + + Permissions::check(); + + // 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`'); + + $modules_info = []; + for ($i = 0; $i < count($rs); ++$i) { + foreach ($rs[$i] as $name => $value) { + if ($name == 'permessi' && (Auth::admin() || $value == null)) { + if (Auth::admin()) { + $value = 'rw'; + } else { + $value = '-'; + } + } + if ($name != 'idmodule' && $name != 'updated_at' && $name != 'created_at' && $name != 'clause') { + $modules_info[$rs[$i]['name']][$name] = $value; + } elseif ($name == 'clause') { + $additional_where[$rs[$i]['name']] = !empty($value) ? ' AND '.$value : $value; + } + } + + $modules_info[$rs[$i]['id']]['name'] = $rs[$i]['name']; + } + } + + // Istanziamento di HTMLHelper (retrocompatibilità) + $html = new HTMLHelper(); +} // Variabili GET e POST $post = Filter::getPOST(); diff --git a/couscous.yml b/couscous.yml index 958f89e18..c3072e286 100644 --- a/couscous.yml +++ b/couscous.yml @@ -6,7 +6,7 @@ include: branch: gh-pages -baseUrl: /openstamanager +baseUrl: . github: user: devcode-it @@ -16,6 +16,10 @@ title: OpenSTAManager subTitle: Il gestionale open source per l'assistenza tecnica e la fatturazione fontAwesomeIcon: fa fa-cog +scripts: + after: + - php sami.phar update sami.config.php + # The left menu bar menu: sections: @@ -43,9 +47,9 @@ menu: api: text: API relativeUrl: api.html - #docs: - # text: Documentazione completa - # relativeUrl: docs/ + docs: + text: Documentazione completa + relativeUrl: docs/ osm: text: Sito ufficiale absoluteUrl: http://www.openstamanager.com/ diff --git a/docs/Nucleo.md b/docs/Struttura generale.md similarity index 85% rename from docs/Nucleo.md rename to docs/Struttura generale.md index 7ea5a4917..e99a2434e 100644 --- a/docs/Nucleo.md +++ b/docs/Struttura generale.md @@ -1,11 +1,16 @@ --- -currentMenu: nucleo +currentMenu: struttura --- -# Nucleo +# Struttura generale +- [Caratteristiche](#caratteristiche) + - [Open source](#open-source) + - [Modulare e personalizzabile](#modulare-e-personalizzabile) + - [Multipiattaforma e user friendly](#multipiattaforma-e-user-friendly) +- [Struttura](#struttura) - [Root](#root) - [add.php](#addphp) - [ajax_autocomplete.php](#ajax_autocompletephp) @@ -49,6 +54,25 @@ currentMenu: nucleo +## Caratteristiche + +### Open source +La natura open source (termine inglese che significa _sorgente aperta_) del progetto evidenzia lo spirito di collaborazione e condivisione che pervade l'attività di sviluppo del gestionale, di cui gli autori rendono pubblico il codice sorgente e ne favoriscono il libero studio, permettendo a programmatori indipendenti di apportarvi modifiche ed estensioni. + +Particolarmente espressiva in questo senso risulta essere la documentazione ufficiale del progetto: +> Il progetto è un software open source perché permette agli utilizzatori di studiarne il funzionamento ed adattarlo alle proprie esigenze; inoltre, in ambito commerciale, non obbliga l'utilizzatore ad essere legato allo stesso fornitore di assistenza. + +La licenza in utilizzo è la GNU General Public License 3.0 (GPL 3.0). + +### Modulare e personalizzabile +OpenSTAManager possiede una struttura fortemente modulare, che ne permette la rapida espandibilità e, nello specifico, la realizzazione di funzionalità _ad hoc_, personalizzate nel modo più completo secondo le richieste del cliente. + +### Multipiattaforma e user friendly +Il progetto risulta compatibile con numerose piattaforme, necessitando esclusivamente un browser moderno da parte dei suoi utilizzatori per sfruttare appieno le sue potenzialità. +L'interfaccia di interazione con l'utente finale risulta inoltre estremamente semplificata e _user friendly_, oltre che _responsive_, presentando caratteristiche completamente compatibili con tutti i dispositivi mobili (in particolare, tablet e smartphone). + +## Struttura + Scaricando la versione GIT del progetto dovreste trovare una struttura di base molto simile a quella seguente. . diff --git a/gulpfile.js b/gulpfile.js index 6b2e9e662..e1f937dca 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -231,7 +231,7 @@ gulp.task('release', function () { var archiver = require('archiver'); var fs = require('fs'); - // shell.exec('svn info --show-item=revision . > REVISION'); + shell.exec('git rev-parse --short HEAD > REVISION'); del([ './vendor/tecnickcom/tcpdf/fonts/*', @@ -242,7 +242,7 @@ gulp.task('release', function () { var archive = archiver('zip'); output.on('close', function() { - console.log('done!'); + console.log('ZIP completato!'); }); archive.on('error', function(err) { @@ -258,6 +258,7 @@ gulp.task('release', function () { 'node_modules/**', 'backup/**', 'files/**', + 'logs/**', 'config.inc.php', '*.lock', '*.phar', @@ -271,6 +272,7 @@ gulp.task('release', function () { archive.file('backup/.htaccess'); archive.file('files/.htaccess'); archive.file('files/my_impianti/componente.ini'); + archive.file('logs/.htaccess'); archive.finalize(); }); diff --git a/index.php b/index.php index a85b7b775..671857aa9 100644 --- a/index.php +++ b/index.php @@ -10,7 +10,7 @@ switch ($op) { case 'login': $username = filter('username'); $password = filter('password'); - if ($dbo->isConnected() && $dbo->isInstalled() && $auth->attempt($username, $password)) { + if ($dbo->isConnected() && $dbo->isInstalled() && Auth::getInstance()->attempt($username, $password)) { $_SESSION['keep_alive'] = (filter('keep_alive') != null); // Auto backup del database giornaliero @@ -59,7 +59,7 @@ switch ($op) { } if (Auth::check() && isset($dbo) && $dbo->isConnected() && $dbo->isInstalled()) { - $module = $auth->getFirstModule(); + $module = Auth::firstModule(); if (!empty($module)) { redirect(ROOTDIR.'/controller.php?id_module='.$module, 'js'); diff --git a/lib/classes/API.php b/lib/classes/API.php index 2121284dc..8a539da33 100644 --- a/lib/classes/API.php +++ b/lib/classes/API.php @@ -34,7 +34,7 @@ class API extends \Util\Singleton public function __construct($token) { - $user = Auth::getUser(); + $user = Auth::user(); if (!self::isAPIRequest() || empty($user)) { throw new InvalidArgumentException(); diff --git a/lib/classes/Auth.php b/lib/classes/Auth.php index 2bb4d1a34..7ec5c03e3 100644 --- a/lib/classes/Auth.php +++ b/lib/classes/Auth.php @@ -5,21 +5,57 @@ * * @since 2.3 */ -class Auth +class Auth extends \Util\Singleton { - protected static $infos; - protected static $first_module = null; + protected static $status = [ + 'success' => [ + 'code' => 1, + 'message' => 'Login riuscito!', + ], + 'failed' => [ + 'code' => 0, + 'message' => 'Autenticazione fallita!', + ], + 'disabled' => [ + 'code' => 2, + 'message' => 'Utente non abilitato!', + ], + 'unauthorized' => [ + 'code' => 3, + 'message' => "L'utente non ha nessun permesso impostato!", + ], + ]; - public function __construct() + protected $infos; + protected $first_module; + + protected $passwordOptions = [ + 'algorithm' => PASSWORD_BCRYPT, + 'options' => [], + ]; + + protected function __construct() { $database = Database::getConnection(); - if (API::isAPIRequest()) { - $this->api(filter('token')); - } - // Controllo sulla sessione attiva - elseif (!empty($_SESSION['idutente']) && $database->isConnected() && $database->isInstalled()) { - $this->find(); + if ($database->isInstalled()) { + if (API::isAPIRequest()) { + $token = filter('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']; + } + + if (!empty($id)) { + $this->identifyUser($id); + } + + if (!empty($_SESSION['idutente']) && $this->isAuthenticated()) { + $this->saveToSession(); + } } } @@ -29,187 +65,126 @@ class Auth $database = Database::getConnection(); - $users = $database->fetchArray('SELECT idutente, username, password, enabled FROM zz_users WHERE username = '.prepare($username).' LIMIT 1'); - $log = []; $log['username'] = $username; $log['ip'] = get_client_ip(); - $log['stato'] = 0; + $log['stato'] = self::$status['failed']['code']; + $users = $database->fetchArray('SELECT idutente, password, enabled FROM zz_users WHERE username = '.prepare($username).' LIMIT 1'); if (!empty($users)) { $user = $users[0]; - if (empty($user['enabled'])) { - $log['stato'] = 2; + if (!empty($user['enabled'])) { + $this->identifyUser($user['idutente']); + $module = $this->getFirstModule(); + + if ( + $this->isAuthenticated() && + $this->password_check($password, $user['password'], $user['idutente']) && + !empty($module) + ) { + $log['idutente'] = $this->infos['idutente']; + $log['stato'] = self::$status['success']['code']; + + $this->saveToSession(); + } else { + if (empty($module)) { + $log['stato'] = self::$status['unauthorized']['code']; + } + + $this->logout(); + } } else { - $_SESSION['idutente'] = $user['idutente']; + $log['stato'] = self::$status['disabled']['code']; + } + } - $continue = $this->password_check($password, $user['password']) && $this->find(); - if (!$continue || empty(self::$first_module)) { - if ($continue && empty(self::$first_module)) { - $log['stato'] = 3; - } - - self::logout(); - } else { - $log['idutente'] = self::$infos['idutente']; - $log['stato'] = 1; + if ($log['stato'] != self::$status['success']['code']) { + foreach (self::$status as $key => $value) { + if ($log['stato'] == $value['code']) { + $_SESSION['errors'][] = $value['message']; + break; } } } - $messages = [ - 0 => _('Autenticazione fallita!'), - 2 => _('Utente non abilitato!'), - 3 => _("L'utente non ha nessun permesso impostato!"), - ]; - if (!empty($messages[$log['stato']])) { - $_SESSION['errors'][] = $messages[$log['stato']]; - } + $database->insert('zz_logs', $log); - foreach ($log as $key => $value) { - $log[$key] = prepare($value); - } - $database->query('INSERT INTO zz_logs('.implode(', ', array_keys($log)).') VALUES('.implode(', ', $log).')'); - - return self::check(); + return $this->isAuthenticated(); } - protected function password_check($password, $hash) + protected function password_check($password, $hash, $user_id = null) { + $result = false; + + // Retrocompatibilità if ($hash == md5($password)) { - $database = Database::getConnection(); + $rehash = true; - $database->query('UPDATE zz_users SET password='.prepare(self::hashPassword($password)).' WHERE idutente = '.prepare($_SESSION['idutente'])); - - return true; + $result = true; } + // Nuova versione if (password_verify($password, $hash)) { - return true; + $rehash = password_needs_rehash($hash, $this->passwordOptions['algorithm'], $this->passwordOptions['options']); + + $result = true; } - return false; + // Controllo in automatico per futuri cambiamenti dell'algoritmo di password + if ($rehash) { + $database = Database::getConnection(); + $database->update('zz_users', ['password' => password_hash($password, $this->passwordOptions['algorithm'], $this->passwordOptions['options'])], ['idutente' => $user_id]); + } + + return $result; } - /** - * Crea la l'hash della password per il successivo salvataggio all'interno del database. - * - * @since 2.3 - * - * @return string - */ - public static function hashPassword($password) + protected function saveToSession() { - return password_hash($password, PASSWORD_BCRYPT); + 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; + } } - protected function find() + protected function identifyUser($user_id) { $database = Database::getConnection(); - $user = self::userInfo($_SESSION['idutente']); - - if (!empty($user)) { - foreach ($user as $key => $value) { - $_SESSION[$key] = $value; - } - - self::$infos = $user; - - $query = 'SELECT id FROM zz_modules WHERE enabled = 1'; - if (!self::isAdmin()) { - $query .= ' AND id IN (SELECT idmodule FROM zz_permissions WHERE idgruppo = (SELECT id FROM zz_groups WHERE nome = '.prepare($_SESSION['gruppo']).") AND permessi IN ('r', 'rw'))"; - } - - $results = $database->fetchArray($query.' ORDER BY `order` ASC'); - - if (!empty($results)) { - $module = null; - - $first = get_var('Prima pagina'); - if (array_search($first, array_column($results, 'id')) === false) { - foreach ($results as $result) { - if (!empty($result['options']) && $result['options'] != 'menu') { - $module = $result['id']; - break; - } - } - } else { - $module = $first; - } - - self::$first_module = $module; - } - - $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; - - return true; - } - } - - self::logout(); - - return false; - } - - protected static function userInfo($user_id) - { - $database = Database::getConnection(); - - $results = $database->fetchArray('SELECT *, (SELECT nome FROM zz_groups WHERE id=idgruppo) AS gruppo FROM zz_users WHERE idutente = '.prepare($user_id).' AND enabled = 1 LIMIT 1'); - - $infos = []; - + $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'); if (!empty($results)) { - $infos['idutente'] = $results[0]['idutente']; - $infos['is_admin'] = ($results[0]['gruppo'] == 'Amministratori'); - $infos['idanagrafica'] = $results[0]['idanagrafica']; - $infos['username'] = $results[0]['username']; - $infos['gruppo'] = $results[0]['gruppo']; + $results[0]['is_admin'] = ($results[0]['gruppo'] == 'Amministratori'); + + $this->infos = $results[0]; } - - return $infos; } - /** - * Controlla se la chiave di accesso per l'API abilita l'accesso di un utente. - * - * @param string $token Chiave - * - * @return array - */ - public function api($token) + public function isAuthenticated() { - $database = Database::getConnection(); - - $results = $database->fetchArray('SELECT `id_utente` FROM `zz_tokens` WHERE `token` = '.prepare($token)); - - if (!empty($results)) { - self::$infos = self::userInfo($results[0]['id_utente']); - } - - return self::$infos; + return !empty($this->infos); } - public static function check() + public function isAdmin() { - return !empty(self::$infos); + return $this->isAuthenticated() && !empty($this->infos['is_admin']); } - public static function isAdmin() + public function getUser() { - return self::check() && !empty(self::$infos['is_admin']); + return $this->infos; } - public static function logout() + public function destory() { - if (self::check() || !empty($_SESSION['idutente'])) { - self::$infos = null; - self::$first_module = null; + if ($this->isAuthenticated() || !empty($_SESSION['idutente'])) { + $this->infos = null; + $this->first_module = null; session_unset(); session_destroy(); @@ -222,13 +197,61 @@ class Auth } } - public static function getFirstModule() + public function getFirstModule() { - return self::$first_module; + if (empty($this->first_module)) { + $query = 'SELECT id FROM zz_modules WHERE enabled = 1'; + if (!$this->isAdmin()) { + $query .= ' AND id IN (SELECT idmodule FROM zz_permissions WHERE idgruppo = (SELECT id FROM zz_groups WHERE nome = '.prepare($_SESSION['gruppo']).") AND permessi IN ('r', 'rw'))"; + } + + $database = Database::getConnection(); + $results = $database->fetchArray($query." AND options != '' AND options != 'menu' AND options IS NOT NULL ORDER BY `order` ASC"); + + if (!empty($results)) { + $module = null; + + $first = Settings::get('Prima pagina'); + if (!in_array($first, array_column($results, 'id'))) { + $module = $results[0]['id']; + } else { + $module = $first; + } + + $this->first_module = $module; + } + } + + return $this->first_module; } - public static function getUser() + public static function check() { - return self::$infos; + return self::getInstance()->isAuthenticated(); + } + + public static function admin() + { + return self::getInstance()->isAdmin(); + } + + public static function user() + { + return self::getInstance()->getUser(); + } + + public static function logout() + { + return self::getInstance()->destory(); + } + + public static function firstModule() + { + return self::getInstance()->getFirstModule(); + } + + public static function getStatus() + { + return self::$status; } } diff --git a/lib/classes/CSRF.php b/lib/classes/CSRF.php index 64ee7a58c..3696456c1 100644 --- a/lib/classes/CSRF.php +++ b/lib/classes/CSRF.php @@ -135,10 +135,6 @@ class CSRF extends Util\Singleton return $this->storage; } - if (session_status() == PHP_SESSION_NONE) { - session_start(); - } - if (!array_key_exists($this->prefix, $_SESSION)) { $_SESSION[$this->prefix] = []; } diff --git a/lib/classes/Database.php b/lib/classes/Database.php index 0aeefb4ed..16ea649de 100644 --- a/lib/classes/Database.php +++ b/lib/classes/Database.php @@ -90,16 +90,18 @@ class Database extends Util\Singleton */ public static function getConnection($new = false) { - if (empty(parent::$instance) || !parent::$instance->isConnected() || $new) { + $class = get_called_class(); // late-static-bound class name + + if (empty(parent::$instance[$class]) || !parent::$instance[$class]->isConnected() || $new) { global $db_host; global $db_username; global $db_password; global $db_name; - parent::$instance = new self($db_host, $db_username, $db_password, $db_name); + parent::$instance[$class] = new self($db_host, $db_username, $db_password, $db_name); } - return parent::$instance; + return parent::$instance[$class]; } public static function getInstance() diff --git a/lib/classes/Modules.php b/lib/classes/Modules.php index 2b52acd53..033a40097 100644 --- a/lib/classes/Modules.php +++ b/lib/classes/Modules.php @@ -28,7 +28,7 @@ class Modules if (empty(self::$modules)) { $database = Database::getConnection(); - $user = Auth::getUser(); + $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`'); @@ -48,7 +48,7 @@ class Modules if (empty($modules[$result['id']])) { if (empty($result['permessi'])) { - if (Auth::isAdmin()) { + if (Auth::admin()) { $result['permessi'] = 'rw'; } else { $result['permessi'] = '-'; @@ -200,7 +200,7 @@ class Modules if (strpos($options, '|select|') !== false) { $query = $options; - $user = Auth::getUser(); + $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'); @@ -270,7 +270,7 @@ class Modules public static function replacePlaceholder($query, $custom = null) { - $user = Auth::getUser(); + $user = Auth::user(); $custom = empty($custom) ? $user['idanagrafica'] : $custom; $result = str_replace(['|idagente|', '|idtecnico|', '|idanagrafica|'], prepare($custom), $query); diff --git a/lib/classes/Util/Singleton.php b/lib/classes/Util/Singleton.php index 3ae7bd4e4..184c0577a 100644 --- a/lib/classes/Util/Singleton.php +++ b/lib/classes/Util/Singleton.php @@ -5,10 +5,10 @@ namespace Util; /** * @since 2.3 */ -class Singleton +abstract class Singleton { /** @var \Util\Singleton Oggetto istanziato */ - protected static $instance = null; + protected static $instance = []; protected function __construct() { @@ -21,11 +21,13 @@ class Singleton */ public static function getInstance() { - if (self::$instance === null) { - self::$instance = new static(); + $class = get_called_class(); // late-static-bound class name + + if (self::$instance[$class] === null) { + self::$instance[$class] = new static(); } - return self::$instance; + return self::$instance[$class]; } private function __clone() diff --git a/log.php b/log.php index e4832b30d..6ea2757d8 100644 --- a/log.php +++ b/log.php @@ -32,7 +32,7 @@ echo ' /* LEGGO DALLA TABELLA ZZ_LOG */ -if (Auth::isAdmin()) { +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'; @@ -48,18 +48,19 @@ for ($i = 0; $i < $n; ++$i) { $timestamp = Translator::timestampToLocale($rs[$i]['created_at']); - if ($rs[$i]['stato'] == 1) { + $status = Auth::getStatus(); + if ($rs[$i]['stato'] == $status['success']['code']) { $type = 'success'; - $stato = _('Login riuscito!'); - } elseif ($rs[$i]['stato'] == 2) { + $stato = $status['success']['message']; + } elseif ($rs[$i]['stato'] == $status['disabled']['code']) { $type = 'warning'; - $stato = _('Utente non abilitato!'); - } elseif ($rs[$i]['stato'] == 3) { + $stato = $status['disabled']['message']; + } elseif ($rs[$i]['stato'] == $status['unauthorized']['code']) { $type = 'warning'; - $stato = _("L'utente non ha nessun permesso impostato!"); + $stato = $status['unauthorized']['message']; } else { $type = 'danger'; - $stato = _('Autenticazione fallita!'); + $stato = $status['failed']['message']; } echo ' diff --git a/modules/anagrafiche/actions.php b/modules/anagrafiche/actions.php index b1b7c064b..27fb2a6da 100644 --- a/modules/anagrafiche/actions.php +++ b/modules/anagrafiche/actions.php @@ -161,7 +161,7 @@ switch (post('op')) { // Lettura tipologia dell'utente loggato $agente_is_logged = false; - $rs = $dbo->fetchArray('SELECT descrizione FROM an_tipianagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche.idtipoanagrafica = an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE idanagrafica = '.prepare($user_idanagrafica)); + $rs = $dbo->fetchArray('SELECT descrizione FROM an_tipianagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche.idtipoanagrafica = an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE idanagrafica = '.prepare($user['idanagrafica'])); for ($i = 0; $i < count($rs); ++$i) { if ($rs[$i]['descrizione'] == 'Agente') { @@ -170,7 +170,7 @@ switch (post('op')) { } } - $idagente = ($agente_is_logged && strpos($tipoanagrafica_dst, 'Cliente') !== false) ? $user_idanagrafica : 0; + $idagente = ($agente_is_logged && strpos($tipoanagrafica_dst, 'Cliente') !== false) ? $user['idanagrafica'] : 0; // Inserisco l'anagrafica $query = 'INSERT INTO an_anagrafiche(ragione_sociale, codice, idagente) VALUES ('.prepare($ragione_sociale).', '.prepare($codice).', '.prepare($idagente).')'; diff --git a/modules/dashboard/ajaxreq.php b/modules/dashboard/ajaxreq.php index 5539c4f6b..a7baa2842 100644 --- a/modules/dashboard/ajaxreq.php +++ b/modules/dashboard/ajaxreq.php @@ -2,8 +2,8 @@ include_once __DIR__.'/../../core.php'; -if (!isset($user_idanagrafica)) { - $user_idanagrafica = ''; +if (!isset($user['idanagrafica'])) { + $user['idanagrafica'] = ''; } switch (get('op')) { diff --git a/modules/interventi/ajax_articoli.php b/modules/interventi/ajax_articoli.php index a29209962..27ec8e185 100644 --- a/modules/interventi/ajax_articoli.php +++ b/modules/interventi/ajax_articoli.php @@ -14,12 +14,12 @@ if (!empty($rs)) { '._('Articolo').' '._('Q.tà').''; - if (Auth::isAdmin() || $_SESSION['gruppo'] != 'Tecnici') { + if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') { echo ' '._('Prezzo di acquisto').''; } - if (Auth::isAdmin() || $_SESSION['gruppo'] != 'Tecnici') { + if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') { echo ' '._('Prezzo di vendita').' '._('Subtotale').''; @@ -94,14 +94,14 @@ if (!empty($rs)) { '.Translator::numberToLocale($r['qta']).' '.$r['um'].' '; - if (Auth::isAdmin() || $_SESSION['gruppo'] != 'Tecnici') { + if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') { echo ' '.Translator::numberToLocale($r['prezzo_acquisto']).' € '; } - if (Auth::isAdmin() || $_SESSION['gruppo'] != 'Tecnici') { + if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') { // Prezzo unitario echo ' diff --git a/modules/interventi/ajax_costi.php b/modules/interventi/ajax_costi.php index ac1ed560e..d909afd2c 100644 --- a/modules/interventi/ajax_costi.php +++ b/modules/interventi/ajax_costi.php @@ -7,7 +7,7 @@ $rss = $dbo->fetchArray('SELECT idtipointervento, sconto_globale, tipo_sconto_gl $sconto = $rss[0]['sconto_globale']; $tipo_sconto = $rss[0]['tipo_sconto_globale']; -if (Auth::isAdmin() || $_SESSION['gruppo'] != 'Tecnici') { +if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') { $rsr = $dbo->fetchArray('SELECT * FROM vw_activity_subtotal WHERE id='.prepare($id_record)); $manodopera_costo = $rsr[0]['manodopera_costo']; diff --git a/modules/interventi/ajax_righe.php b/modules/interventi/ajax_righe.php index ffa892206..8701418ec 100644 --- a/modules/interventi/ajax_righe.php +++ b/modules/interventi/ajax_righe.php @@ -13,7 +13,7 @@ if (count($rs2) > 0) { '._('Q.tà').' '._('Prezzo di acquisto').''; - if (Auth::isAdmin() || $_SESSION['gruppo'] != 'Tecnici') { + if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') { echo ' '._('Prezzo di vendita').' '._('Subtotale').''; @@ -46,7 +46,7 @@ if (count($rs2) > 0) { '.Translator::numberToLocale($r['prezzo_acquisto']).' € '; - if (Auth::isAdmin() || $_SESSION['gruppo'] != 'Tecnici') { + if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') { // Prezzo unitario $netto = $r['prezzo_vendita'] - $r['sconto_unitario']; diff --git a/modules/interventi/ajax_tecnici.php b/modules/interventi/ajax_tecnici.php index 3447b208b..ebb504b7d 100644 --- a/modules/interventi/ajax_tecnici.php +++ b/modules/interventi/ajax_tecnici.php @@ -32,7 +32,7 @@ $show_costi = true; // Limitazione delle azioni dei tecnici if ($user['gruppo'] == 'Tecnici') { - $show_costi = !empty($user_idanagrafica) && get_var('Mostra i prezzi al tecnico'); + $show_costi = !empty($user['idanagrafica']) && get_var('Mostra i prezzi al tecnico'); } // RECUPERO IL TIPO DI INTERVENTO @@ -205,7 +205,7 @@ if (!empty($rs2)) { // Sconto ore echo ' '; - if ($user_idanagrafica == 0 || $show_costi) { + if ($user['idanagrafica'] == 0 || $show_costi) { echo ' {[ "type": "number", "name": "sconto['.$id.']", "value": "'.$sconto_unitario.'", "icon-after": "choice|untprc|'.$tipo_sconto.'" ]}'; } else { @@ -220,7 +220,7 @@ if (!empty($rs2)) { // Sconto km echo ' '; - if ($user_idanagrafica == 0 || $show_costi) { + if ($user['idanagrafica'] == 0 || $show_costi) { echo ' {[ "type": "number", "name": "scontokm['.$id.']", "value": "'.$scontokm_unitario.'", "icon-after": "choice|untprc|'.$tipo_scontokm.'" ]}'; } else { diff --git a/sami.config.php b/sami.config.php new file mode 100644 index 000000000..4690bc67c --- /dev/null +++ b/sami.config.php @@ -0,0 +1,30 @@ +files() + ->name('*.php') + ->exclude('.couscous') + ->exclude('node_modules') + ->exclude('vendor') + ->exclude('tests') + ->in(__DIR__) +; + +$sami = new Sami($iterator, array( + 'theme' => 'default', + 'title' => 'OpenSTAManager', + 'build_dir' => __DIR__.'/.couscous/generated/docs', + 'cache_dir' => __DIR__.'/.couscous/cache', + 'default_opened_level' => 2, +)); + +$sami['filter'] = function () { + return new TrueFilter(); +}; + +return $sami; diff --git a/templates/fatture/pdfgen.fatture.php b/templates/fatture/pdfgen.fatture.php index 94598ab75..1babcaa3b 100644 --- a/templates/fatture/pdfgen.fatture.php +++ b/templates/fatture/pdfgen.fatture.php @@ -14,7 +14,7 @@ if ($rs[0]['dir'] == 'entrata') { $module_name = 'Fatture di acquisto'; } -$additional_where[$module_name] = str_replace('|idanagrafica|', "'".$user_idanagrafica."'", $additional_where[$module_name]); +$additional_where[$module_name] = str_replace('|idanagrafica|', "'".$user['idanagrafica']."'", $additional_where[$module_name]); // Lettura info fattura $q = 'SELECT *, (SELECT descrizione FROM co_tipidocumento WHERE id=idtipodocumento) AS tipo_doc, (SELECT descrizione FROM co_pagamenti WHERE id=idpagamento) AS tipo_pagamento, (SELECT dir FROM co_tipidocumento WHERE id=idtipodocumento) AS dir FROM co_documenti WHERE id="'.$iddocumento.'" '.$additional_where[$module_name]; diff --git a/templates/fatture_accompagnatorie/pdfgen.fatture_accompagnatorie.php b/templates/fatture_accompagnatorie/pdfgen.fatture_accompagnatorie.php index 4a1556400..b1990d8b7 100644 --- a/templates/fatture_accompagnatorie/pdfgen.fatture_accompagnatorie.php +++ b/templates/fatture_accompagnatorie/pdfgen.fatture_accompagnatorie.php @@ -14,7 +14,7 @@ if ($rs[0]['dir'] == 'entrata') { $module_name = 'Fatture di acquisto'; } -$additional_where[$module_name] = str_replace('|idanagrafica|', "'".$user_idanagrafica."'", $additional_where[$module_name]); +$additional_where[$module_name] = str_replace('|idanagrafica|', "'".$user['idanagrafica']."'", $additional_where[$module_name]); // Lettura info fattura $q = 'SELECT *, (SELECT descrizione FROM co_tipidocumento WHERE id=idtipodocumento) AS tipo_doc, (SELECT descrizione FROM co_pagamenti WHERE id=idpagamento) AS tipo_pagamento, (SELECT dir FROM co_tipidocumento WHERE id=idtipodocumento) AS dir FROM co_documenti WHERE id="'.$iddocumento.'" '.$additional_where[$module_name]; @@ -27,7 +27,7 @@ $idcliente = $rs[0]['idanagrafica']; $report = file_get_contents($docroot.'/templates/fatture_accompagnatorie/fattura.html'); $body = file_get_contents($docroot.'/templates/fatture_accompagnatorie/fattura_body.html'); -if (!($idcliente == $user_idanagrafica || Auth::isAdmin())) { +if (!($idcliente == $user['idanagrafica'] || Auth::admin())) { die('Non hai i permessi per questa stampa!'); } diff --git a/templates/interventi_ordiniservizio/pdfgen.interventi_ordiniservizio.php b/templates/interventi_ordiniservizio/pdfgen.interventi_ordiniservizio.php index aaf743088..2a20ac529 100644 --- a/templates/interventi_ordiniservizio/pdfgen.interventi_ordiniservizio.php +++ b/templates/interventi_ordiniservizio/pdfgen.interventi_ordiniservizio.php @@ -4,8 +4,8 @@ include_once __DIR__.'/../../core.php'; $module_name = 'Interventi'; -$additional_where['Interventi'] = str_replace('|idtecnico|', "'".$user_idanagrafica."'", $additional_where['Interventi']); -$additional_where['Interventi'] = str_replace('|idanagrafica|', "'".$user_idanagrafica."'", $additional_where['Interventi']); +$additional_where['Interventi'] = str_replace('|idtecnico|', "'".$user['idanagrafica']."'", $additional_where['Interventi']); +$additional_where['Interventi'] = str_replace('|idanagrafica|', "'".$user['idanagrafica']."'", $additional_where['Interventi']); // ############mostro o nascondo i costi dell'intervento..################# // true o false diff --git a/templates/riepilogo_contratti/pdfgen.riepilogo_contratti.php b/templates/riepilogo_contratti/pdfgen.riepilogo_contratti.php index 412587630..782fa13cf 100644 --- a/templates/riepilogo_contratti/pdfgen.riepilogo_contratti.php +++ b/templates/riepilogo_contratti/pdfgen.riepilogo_contratti.php @@ -4,7 +4,7 @@ include_once __DIR__.'/../../core.php'; $module_name = 'Contratti'; -$additional_where['Contratti'] = str_replace('|idtecnico|', "'".$user_idanagrafica."'", $additional_where['Contratti']); +$additional_where['Contratti'] = str_replace('|idtecnico|', "'".$user['idanagrafica']."'", $additional_where['Contratti']); // carica parametri di ricerca $search_numero = save($_GET['search_numerocontratto']); diff --git a/update/2_3.sql b/update/2_3.sql index f0683b3f4..290d4a017 100644 --- a/update/2_3.sql +++ b/update/2_3.sql @@ -628,7 +628,7 @@ INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`) VALU -- Aggiunta del campo per permettere la modifica delle prima pagina di OSM INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`) VALUES -('Prima pagina', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Dashboard'), 'query=SELECT id, title AS \'descrizione\' FROM zz_modules WHERE enabled=1', 1, 'Generali'); +('Prima pagina', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Dashboard'), 'query=SELECT id, title AS \'descrizione\' FROM zz_modules WHERE enabled = 1 AND options != \'\' AND options != \'menu\' AND options IS NOT NULL ORDER BY `order` ASC', 1, 'Generali'); -- Aggiunta del campo idagente in Anagrafiche per la visione da parte degli agenti INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `enabled`, `default`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Anagrafiche'), 'idagente', 'idagente', 9, 0, 0, 0, 1);