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";
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);
|
---|