Merge branch 'master' into 2.4

This commit is contained in:
Thomas Zilio 2017-12-30 13:21:45 +01:00
commit 655532c241
21 changed files with 202 additions and 70 deletions

View File

@ -1,10 +1,17 @@
# Remove autoindex
IndexIgnore *
## Options -Indexes
<IfModule mod_autoindex.c>
IndexIgnore */*
</IfModule>
# Try to set PHP settings
php_value upload_max_filesize 20M
php_value post_max_size 20M
<IfModule mod_php5.c>
php_value upload_max_filesize 20M
php_value post_max_size 20M
</IfModule>
<IfModule mod_php7.c>
php_value upload_max_filesize 20M
php_value post_max_size 20M
</IfModule>
# Deny access to files starting with dot
<FilesMatch "^\.">
@ -24,7 +31,7 @@ php_value post_max_size 20M
Deny from all
</Files>
# Disable OSM indexing of php, html, htm, pdf files
# Disable indexing of php, html, htm, pdf files
<IfModule mod_headers.c>
<FilesMatch "\.(php|html|htm|pdf|log)$">
Header set X-Robots-Tag: "noindex"

View File

@ -4,13 +4,20 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi
Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release.
<!-- TOC depthFrom:2 depthTo:2 orderedList:false updateOnSave:true withLinks:true -->
- [2.3 (In sviluppo)](#23-in-sviluppo)
- [Aggiunto (Added)](#aggiunto-added)
- [Modificato (Changed)](#modificato-changed)
- [Deprecato (Deprecated)](#deprecato-deprecated)
- [Rimosso (Removed)](#rimosso-removed)
- [Fixed](#fixed)
- [Sicurezza (Security)](#sicurezza-security)
- [2.2 (2016-11-10)](#22-2016-11-10)
- [Aggiunto (Added)](#aggiunto-added)
- [Fixed](#fixed)
- [2.1 (2015-04-02)](#21-2015-04-02)
<!-- /TOC -->
- [Aggiunto (Added)](#aggiunto-added)
- [Modificato (Changed)](#modificato-changed)
- [Fixed](#fixed)
## 2.3 (In sviluppo)
@ -91,27 +98,28 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
### Rimosso (Removed)
- Funzioni PHP non utilizzate (`lib/functions.php`)
- coolDate
- cut_text
- data_italiana
- dateadd
- full_html_entity_decode
- gestione_sessioni
- get_module_name
- get_module_name_by_id
- get_text_around
- get_user_browser
- getAvailableModules
- getLastPathSegment
- getSistemaOperativo
- getVersion
- is_id_ok
- mytruncate
- read_file
- RemoveNonASCIICharacters
- show_error_messages
- show_info_messages
- write_error
- write_ok
- getAvailableModules
- read_file
- dateadd
- show_info_messages
- show_error_messages
- get_module_name
- mytruncate
- get_user_browser
- RemoveNonASCIICharacters
- full_html_entity_decode
- data_italiana
- gestione_sessioni
- get_text_around
- coolDate
- get_module_name_by_id
- cut_text
- getLastPathSegment
- cut_text
- Funzioni JS non utilizzate (`lib/functionsjs.php`)
- Cartelle e file non più utilizzati (`lib/jscripts`, `widgets`, `share`, `lib/dbo.class.php`, `lib/widgets.class.php`, ...)

View File

@ -88,7 +88,7 @@ Se siete inoltre interessati a supporto e assistenza professionali, li potete ri
### Github
Nel caso si stia utilizzando la versione direttamente ottenuta dalla repository di Github, è necessario eseguire i seguenti comandi da linea di comando per completare le dipendenze PHP (tramite [Composer](https://getcomposer.org)) e gli asssets (tramite [Yarn](https://yarnpkg.com)) del progetto.
Nel caso si stia utilizzando la versione direttamente ottenuta dalla repository di Github, è necessario eseguire i seguenti comandi da linea di comando per completare le dipendenze PHP (tramite [Composer](https://getcomposer.org)) e gli assets (tramite [Yarn](https://yarnpkg.com)) del progetto.
```bash
php composer.phar install

View File

@ -1 +0,0 @@
2.3

View File

@ -237,8 +237,8 @@ switch ($op) {
}
if (!empty($search)) {
$search_fields[] = 'descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'codice LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_articoli.descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_articoli.codice LIKE '.prepare('%'.$search.'%');
}
$wh = '';
@ -259,8 +259,12 @@ switch ($op) {
$rs = $dbo->fetchArray($query);
foreach ($rs as $r) {
if ($prev != $r['id_sottocategoria']) {
$categoria = $dbo->fetchArray('SELECT `nome` FROM `mg_categorie` WHERE `id`='.prepare($r['id_categoria']))[0]['nome'];
$sottocategoria = $dbo->fetchArray('SELECT `nome` FROM `mg_categorie` WHERE `id`='.prepare($r['id_sottocategoria']))[0]['nome'];
$prev = $r['id_sottocategoria'];
$results[] = ['text' => $dbo->fetchArray('SELECT `nome` FROM `mg_categorie` WHERE `id`='.prepare($r['id_categoria']))[0]['nome'], 'children' => []];
$results[] = ['text' => $categoria.' ('.(!empty($r['id_sottocategoria']) ? $sottocategoria : '-').')', 'children' => []];
}
if (empty($r['idiva_vendita'])) {

View File

@ -127,7 +127,7 @@ $dbo = Database::getConnection();
// Controllo sulla presenza dei permessi di accesso basilari
$continue = $dbo->isInstalled() && !Update::isUpdateAvailable() && (Auth::check() || API::isAPIRequest());
if (!$continue && slashes($_SERVER['SCRIPT_FILENAME']) != slashes(DOCROOT.'/index.php')) {
if (!$continue && getURLPath() != slashes(ROOTDIR.'/index.php')) {
if (Auth::check()) {
Auth::logout();
}

View File

@ -58,7 +58,7 @@ Se siete inoltre interessati a supporto e assistenza professionali, li potete ri
### Github
Nel caso si stia utilizzando la versione direttamente ottenuta dalla repository di Github, è necessario eseguire i seguenti comandi da linea di comando per completare le dipendenze PHP (tramite [Composer](https://getcomposer.org)) e gli asssets (tramite [Yarn](https://yarnpkg.com)) del progetto.
Nel caso si stia utilizzando la versione direttamente ottenuta dalla repository di Github, è necessario eseguire i seguenti comandi da linea di comando per completare le dipendenze PHP (tramite [Composer](https://getcomposer.org)) e gli assets (tramite [Yarn](https://yarnpkg.com)) del progetto.
```bash
php composer.phar install

View File

@ -4,14 +4,23 @@ currentMenu: stampe
# Stampe
<!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true -->
- [MPDF](#mpdf)
- [HTML2PDF](#html2pdf)
- [Struttura](#struttura)
- [pdfgen.php](#pdfgenphp)
- [pdfgen_variables.php (INCLUDE)](#pdfgenvariablesphp-include)
- [Struttura interna](#struttura-interna)
- [Struttura](#struttura)
- [pdfgen.php](#pdfgenphp)
- [pdfgen_variables.php (INCLUDE)](#pdfgen_variablesphp-include)
- [Struttura interna](#struttura-interna)
<!-- /TOC -->
## MPDF
**Attenzione**: come indicato nel secondo punto in http://mpdf.github.io/tables/auto-layout-algorithm.html, MPDF effettua un resizing del font nel caso il contenuto di una cella superi l'altezza totale di una pagina.
Fino a quel punto, il rendering funziona perfettamente.
Nel caso fosse per esempio aumentare le dimensioni del font, si consiglia di effettuare alcuni test per controllare se le tabelle vengono renderizzate nel modo corretto e previsto.
## HTML2PDF
### Struttura
@ -31,7 +40,7 @@ La cartella _templates_ contiene tutti i template per la creazione dei PDF relat
.
└── contratti
   ├── contratto_body.html (OPEN) - Struttura di base del PDF
   ├── contratto.html (OPEN) - Contenitore personalizzato della struttura del PDF
   ├── logo_azienda.jpg (HTML) - Logo dell'azienda specifico per il PDF
   └── pdfgen.contratti.php (INCLUDE) - Individuazione delle informazioni da visualizzare e generazione della loro struttura
   ├── contratto_body.html - Struttura di base del PDF
   ├── contratto.html - Contenitore personalizzato della struttura del PDF
   ├── logo_azienda.jpg - Logo dell'azienda specifico per il PDF
   └── pdfgen.contratti.php - Individuazione delle informazioni da visualizzare e generazione della loro struttura

View File

@ -25,6 +25,7 @@ var concat = require('gulp-concat');
// Altro
var flatten = require('gulp-flatten');
var rename = require('gulp-rename');
var inquirer = require('inquirer');
// Configurazione
var config = {
@ -208,8 +209,8 @@ gulp.task('chartjs', function () {
gulp.task('viewerjs', function () {
gulp.src([
config.main.bowerDirectory + '/viewerjs/ViewerJS/**/*',
'!' + config.main.bowerDirectory + '/viewerjs/ViewerJS/example.local.css',
config.main.bowerDirectory + '/ViewerJS_release/ViewerJS/**/*',
'!' + config.main.bowerDirectory + '/ViewerJS_release/ViewerJS/example.local.css',
])
.pipe(gulp.dest(config.production + '/viewerjs'));
});
@ -248,8 +249,7 @@ gulp.task('release', function () {
var archiver = require('archiver');
var fs = require('fs');
shell.exec('git rev-parse --short HEAD > REVISION');
// Rimozione file indesiderati
del([
'./vendor/tecnickcom/tcpdf/fonts/*',
'!./vendor/tecnickcom/tcpdf/fonts/*helvetica*',
@ -259,6 +259,7 @@ gulp.task('release', function () {
'./vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/*',
]);
// Impostazione dello zip
var output = fs.createWriteStream('./release.zip');
var archive = archiver('zip');
@ -272,6 +273,7 @@ gulp.task('release', function () {
archive.pipe(output);
// Aggiunta dei file
archive.glob('**/*', {
dot: true,
ignore: [
@ -290,12 +292,43 @@ gulp.task('release', function () {
]
});
// Eccezioni
archive.file('backup/.htaccess');
archive.file('files/.htaccess');
archive.file('files/my_impianti/componente.ini');
archive.file('logs/.htaccess');
archive.finalize();
// Aggiunta del commit corrente nel file REVISION
archive.append(shell.exec('git rev-parse --short HEAD', {
silent: true
}).stdout, {
name: 'REVISION'
});
// Opzioni sulla release
inquirer.prompt([{
type: 'input',
name: 'version',
message: 'Numero di versione:',
}, {
type: 'confirm',
name: 'beta',
message: 'Versione beta?',
default: false,
}]).then(function (result) {
version = result.version;
if (result.beta) {
version += 'beta';
}
archive.append(version, {
name: 'VERSION'
});
// Completamento dello zip
archive.finalize();
});;
});
// Pulizia

View File

@ -106,7 +106,7 @@ if (filter('action') == 'do_update') {
if (isset($_SESSION['osm_email'])) {
if (!empty($_SESSION['osm_email'])) {
$dbo->query('UPDATE `zz_users` SET `email`='.preare($_SESSION['osm_email'])." WHERE `username`='admin' ");
$dbo->query('UPDATE `zz_users` SET `email`='.prepare($_SESSION['osm_email'])." WHERE `username`='admin' ");
}
unset($_SESSION['osm_email']);
}

View File

@ -1,6 +1,6 @@
<?php
// trigger_error('Funzione deprecata!', E_USER_DEPRECATED);
// trigger_error(tr('Funzione deprecata!'), E_USER_DEPRECATED);
/**
* Sostituisce ", < e > per evitare hacking del database e risolvere vari problemi.
@ -1033,7 +1033,7 @@ function filelist_and_upload($id_module, $id_record, $label = 'Nuovo allegato:',
*/
function deltree($path)
{
trigger_error('Funzione deprecata!', E_USER_DEPRECATED);
trigger_error(tr('Funzione deprecata!'), E_USER_DEPRECATED);
$path = realpath($path);
@ -1054,3 +1054,46 @@ function deltree($path)
return unlink($path);
}
}
/**
* Carica gli script JavaScript inclusi nell'array indicato.
*
* @param array $jscript_modules_array
*/
function loadJscriptModules($array)
{
trigger_error(tr('Funzione deprecata!'), E_USER_DEPRECATED);
$result = '';
foreach ($array as $js) {
$result .= '
<script type="text/javascript" charset="utf-8" src="'.$js.'"></script>';
}
echo $result;
}
/**
* Carica i file di stile CSS inclusi nell'array indicato.
*
* @param array $css_modules_array
*/
function loadCSSModules($array)
{
trigger_error(tr('Funzione deprecata!'), E_USER_DEPRECATED);
$result = '';
foreach ($array as $css) {
if (is_array($css)) {
$result .= '
<link rel="stylesheet" type="text/css" media="'.$css['media'].'" href="'.$css['dir'].'"/>';
} else {
$result .= '
<link rel="stylesheet" type="text/css" media="screen" href="'.$css.'"/>';
}
}
echo $result;
}

View File

@ -871,10 +871,28 @@ function getConfig()
}
/**
* Restituisce se l'user-agent (browser web) è una versione mobile
* Restituisce se l'user-agent (browser web) è una versione mobile.
*
* @return bool
*/
function isMobile() {
return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
function isMobile()
{
return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER['HTTP_USER_AGENT']);
}
/**
* Restituisce il percorso derivante dal file in esecuzione.
*
* @return string
*/
function getURLPath()
{
$path = $_SERVER['SCRIPT_FILENAME'];
$prefix = $_SERVER['DOCUMENT_ROOT'];
if (substr($path, 0, strlen($prefix)) == $prefix) {
$path = substr($path, strlen($prefix));
}
return slashes($path);
}

View File

@ -207,7 +207,7 @@ if ($fornitore) {
<div class="row">
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Indirizzo di fatturazione'); ?>", "name": "idsede_fatturazione", "values": "query=SELECT id, CONCAT_WS(', ', nomesede, citta) AS descrizione FROM an_sedi WHERE idanagrafica='$id_record' UNION SELECT '0' AS id, 'Sede legale' AS descrizione ORDER BY descrizione", "value": "$idsede_fatturazione$" ]}
{[ "type": "select", "label": "<?php echo tr('Indirizzo di fatturazione'); ?>", "name": "idsede_fatturazione", "values": "query=SELECT id, IF(citta = '', nomesede, CONCAT_WS(', ', nomesede, citta)) AS descrizione FROM an_sedi WHERE idanagrafica='<?php echo $id_record; ?>' UNION SELECT '0' AS id, 'Sede legale' AS descrizione ORDER BY descrizione", "value": "$idsede_fatturazione$" ]}
</div>
<div class="col-md-3">

View File

@ -22,7 +22,7 @@ unset($_SESSION['superselect']['id_categoria']);
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Inserisci la subcategoria:'); ?>", "name": "subcategoria", "value": "", "ajax-source": "sottocategorie", "icon-after": "add|<?php echo Modules::get('Categorie')['id']; ?>||hide" ]}
{[ "type": "select", "label": "<?php echo tr('Inserisci la subcategoria:'); ?>", "name": "subcategoria", "id": "subcategoria_add", "value": "", "ajax-source": "sottocategorie", "icon-after": "add|<?php echo Modules::get('Categorie')['id']; ?>||hide" ]}
</div>
</div>
@ -36,7 +36,7 @@ unset($_SESSION['superselect']['id_categoria']);
<script>
$(document).ready(function () {
var sub = $('#add_form').find('#subcategoria');
var sub = $('#add_form').find('#subcategoria_add');
var original = sub.parent().find(".input-group-addon button").data("href");
$('#add_form').find('#categoria').change( function(){

View File

@ -324,7 +324,7 @@ switch (post('op')) {
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idintervento).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot - $diritto_chiamata).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
//Aggiunta diritto di chiamata se >0
// Aggiunta diritto di chiamata se >0
if ($diritto_chiamata > 0) {
// Calcolo iva
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
@ -389,16 +389,16 @@ switch (post('op')) {
}
// Collego in fattura eventuali articoli collegati all'intervento
$rs2 = $dbo->fetchArray('SELECT mg_articoli_interventi.*, idarticolo FROM mg_articoli_interventi INNER JOIN mg_articoli ON mg_articoli_interventi.idarticolo=mg_articoli.id WHERE idintervento='.prepare($idintervento).' AND ( idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) AND idintervento NOT IN(SELECT idintervento FROM co_righe_contratti WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )');
$rs2 = $dbo->fetchArray('SELECT mg_articoli_interventi.*, idarticolo FROM mg_articoli_interventi INNER JOIN mg_articoli ON mg_articoli_interventi.idarticolo=mg_articoli.id WHERE idintervento='.prepare($idintervento).' AND (idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) AND idintervento NOT IN(SELECT idintervento FROM co_righe_contratti WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )');
for ($i = 0; $i < sizeof($rs2); ++$i) {
$riga = add_articolo_infattura($id_record, $rs2[$i]['idarticolo'], $rs2[$i]['descrizione'], $idiva, $rs2[$i]['qta'], $rs2[$i]['prezzo_vendita'] * $rs2[$i]['qta'], $rs2[$i]['sconto'], $rs2[$i]['sconto_unitario'], $rs2[$i]['tipo_sconto'], $idintervento);
$riga = add_articolo_infattura($id_record, $rs2[$i]['idarticolo'], $rs2[$i]['descrizione'], $idiva, $rs2[$i]['qta'], $rs2[$i]['prezzo_vendita'] * $rs2[$i]['qta'], $rs2[$i]['sconto'], $rs2[$i]['sconto_unitario'], $rs2[$i]['tipo_sconto'], $idintervento, 0, $rs2[$i]['um']);
// Lettura lotto, serial, altro dalla riga dell'ordine
$dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($rs2[$i]['idarticolo']).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_intervento='.prepare($rs2[$i]['id']));
}
// Aggiunta spese aggiuntive come righe generiche
$query = 'SELECT * FROM in_righe_interventi WHERE idintervento='.prepare($idintervento).' AND ( idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) AND idintervento NOT IN(SELECT idintervento FROM co_righe_contratti WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )';
$query = 'SELECT * FROM in_righe_interventi WHERE idintervento='.prepare($idintervento).' AND (idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) AND idintervento NOT IN(SELECT idintervento FROM co_righe_contratti WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )';
$rsr = $dbo->fetchArray($query);
if (sizeof($rsr) > 0) {
for ($i = 0; $i < sizeof($rsr); ++$i) {

View File

@ -44,13 +44,14 @@ echo '
<div class="row">
<div class="col-xs-12 col-md-6">
{[ "type": "textarea", "label": "'.tr('Query di default').'", "name": "options", "value": "'.str_replace(']}', '] }', $record['options']).'", "readonly": "1", "class": "autosize" ]}
{[ "type": "textarea", "label": "'.tr('Query di default').'", "name": "options", "value": '.json_encode(str_replace(']}', '] }', $record['options'])).', "readonly": "1", "class": "autosize" ]}
</div>
<div class="col-xs-12 col-md-6">
{[ "type": "textarea", "label": "'.tr('Query personalizzata').'", "name": "options2", "value": "'.str_replace(']}', '] }', $record['options2']).'", "class": "autosize", "help": "'.tr('La query in sostituzione a quella di default: custom, menu oppure SQL').'" ]}
{[ "type": "textarea", "label": "'.tr('Query personalizzata').'", "name": "options2", "value": '.json_encode(str_replace(']}', '] }', $record['options2'])).', "class": "autosize", "help": "'.tr('La query in sostituzione a quella di default: custom, menu oppure SQL').'" ]}
</div>
</div>';
</div>';
if ($options != '' && $options != 'menu' && $options != 'custom') {
$total = Modules::getQuery($id_record);
$module_query = $total['query'];

View File

@ -30,6 +30,7 @@
},
"main": "gulpfile.js",
"dependencies": {
"ViewerJS_release": "git://github.com/kogmbh/ViewerJS_release.git",
"admin-lte": "~2.3.11",
"autosize": "^3.0.21",
"bootstrap": "^3.3.7",
@ -79,6 +80,7 @@
"gulp-stylus": "^2.6.0",
"gulp-uglify": "^1.5.3",
"gulp-util": "^3.0.8",
"inquirer": "^4.0.1",
"main-bower-files": "^2.13.1",
"shelljs": "^0.7.7"
},

View File

@ -339,7 +339,7 @@ class API extends \Util\Singleton
*/
public static function isAPIRequest()
{
return slashes($_SERVER['SCRIPT_FILENAME']) == slashes(DOCROOT.'/api/index.php');
return getURLPath() == slashes(ROOTDIR.'/api/index.php');
}
/**

View File

@ -67,7 +67,7 @@ class Permissions
$result = true;
if (!self::getSkip()) {
if (!Auth::check() && slashes($_SERVER['SCRIPT_FILENAME']) == slashes(DOCROOT.'/index.php')) {
if (!Auth::check() && getURLPath() == slashes(ROOTDIR.'/index.php')) {
redirect(ROOTDIR.'/index.php');
exit();
$result = false;

View File

@ -202,7 +202,13 @@ class Update
*/
public static function getVersion()
{
return self::getFile('VERSION');
$result = self::getFile('VERSION');
if (empty($result)) {
$result = self::getDatabaseVersion();
}
return $result;
}
/**

View File

@ -162,8 +162,10 @@ foreach ($righe as $r) {
$iva[] = $r['iva'];
$sconto[] = $r['sconto'];
$v_iva[$r['desc_iva']] += $r['iva'];
$v_totale[$r['desc_iva']] += $r['subtotale'] - $r['sconto'];
$v_iva[$r['desc_iva']] = sum($v_iva[$r['desc_iva']], $r['iva']);
$v_totale[$r['desc_iva']] = sum($v_totale[$r['desc_iva']], [
$r['subtotale'], -$r['sconto'],
]);
}
echo '