Generalizzazione gestione errori

Aggiunta di un sistema standard per la gestione degli errori in caso di debug disattivato.
Sostituzione di alcuni metodi della classe Database con il corrispettivo Eloquent.
This commit is contained in:
Thomas Zilio 2019-01-06 14:18:48 +01:00
parent 1f289dd8c9
commit 0a911a877a
20 changed files with 181 additions and 279 deletions

View File

@ -61,7 +61,8 @@
},
"require-dev": {
"codeception/codeception": "2.4.*",
"friendsofphp/php-cs-fixer": "^2.10"
"friendsofphp/php-cs-fixer": "^2.10",
"phpmd/phpmd": "2.6.0"
},
"autoload": {
"psr-4": {

View File

@ -82,6 +82,7 @@ if (!API::isAPIRequest()) {
// File di log di base (logs/error.log)
$handlers[] = new StreamHandler($docroot.'/logs/error.log', Monolog\Logger::ERROR);
$handlers[] = new StreamHandler($docroot.'/logs/setup.log', Monolog\Logger::EMERGENCY);
$handlers[] = new Extensions\MessageHandler(Monolog\Logger::ERROR);
// Impostazioni di debug
if (App::debug()) {
@ -128,13 +129,14 @@ if (App::debug()) {
$monologFormatter->includeStacktraces(true);
}
// Filtra gli errori per livello preciso del gestore dedicato
foreach ($handlers as $handler) {
$handler->setFormatter($monologFormatter);
$logger->pushHandler(new FilterHandler($handler, [$handler->getLevel()]));
}
// Imposta Monolog come gestore degli errori
Monolog\ErrorHandler::register($logger);
Monolog\ErrorHandler::register($logger, [], Monolog\Logger::ERROR, Monolog\Logger::ERROR);
// Database
$dbo = $database = database();

View File

@ -73,7 +73,10 @@ if (filter('action') == 'do_update') {
Update::updateCleanup();
echo '
<p><strong>'.tr('Aggiornamento completato').'</strong> <i class="fa fa-smile-o"></i></p>';
<p><strong>'.tr('Aggiornamento completato').'</strong> <i class="fa fa-smile-o"></i></p>
<script>
setPercent(100);
</script>';
// Istruzioni per la prima installazione
if ($_GET['firstuse'] == 'true') {
@ -214,6 +217,10 @@ if (filter('action') == 'do_update') {
percent = Math.round(percent);
percent = percent > 100 ? 100 : percent;
setPercent(percent);
}
function setPercent(percent){
$("#progress .progress-bar").width(percent + "%");
$("#progress .progress-bar span").text(percent + "%");
}

View File

@ -212,6 +212,21 @@ abstract class Row extends Description
return parent::save($options);
}
public function aliquota()
{
return $this->belongsTo(Aliquota::class, 'idiva');
}
public function rivalsa()
{
return $this->belongsTo(RivalsaINPS::class, 'idrivalsainps');
}
public function ritenuta()
{
return $this->belongsTo(RitenutaAcconto::class, 'idritenutaacconto');
}
protected static function boot($bypass = false)
{
parent::boot(true);
@ -277,19 +292,4 @@ abstract class Row extends Description
{
$this->attributes['sconto'] = $this->sconto;
}
public function aliquota()
{
return $this->belongsTo(Aliquota::class, 'idiva');
}
public function rivalsa()
{
return $this->belongsTo(RivalsaINPS::class, 'idrivalsainps');
}
public function ritenuta()
{
return $this->belongsTo(RitenutaAcconto::class, 'idritenutaacconto');
}
}

View File

@ -26,24 +26,6 @@ abstract class Document extends Model
abstract public function scontoGlobale();
/**
* Calcola la somma degli attributi indicati come parametri.
* Il metodo **non** deve essere adattato per ulteriori funzionalità: deve esclusivamente calcolare la somma richiesta in modo esplicito dagli argomenti.
*
* @param mixed ...$args
*
* @return float
*/
protected function calcola(...$args)
{
$result = 0;
foreach ($args as $arg) {
$result += $this->getRigheContabili()->sum($arg);
}
return $this->round($result);
}
/**
* Calcola l'imponibile della fattura.
*
@ -154,6 +136,24 @@ abstract class Document extends Model
return $this->calcola('guadagno');
}
/**
* Calcola la somma degli attributi indicati come parametri.
* Il metodo **non** deve essere adattato per ulteriori funzionalità: deve esclusivamente calcolare la somma richiesta in modo esplicito dagli argomenti.
*
* @param mixed ...$args
*
* @return float
*/
protected function calcola(...$args)
{
$result = 0;
foreach ($args as $arg) {
$result += $this->getRigheContabili()->sum($arg);
}
return $this->round($result);
}
/**
* Restituisce la collezione di righe e articoli con valori rilevanti per i conti.
*

View File

@ -25,12 +25,12 @@ switch (post('op')) {
$sede->email = post('email');
$sede->save();
if (!empty(post('nome')) and !empty(post('cognome')) ){
$ragione_sociale = post('nome').' '.post('cognome');
}else{
$ragione_sociale = post('ragione_sociale');
}
if (!empty(post('nome')) and !empty(post('cognome'))) {
$ragione_sociale = post('nome').' '.post('cognome');
} else {
$ragione_sociale = post('ragione_sociale');
}
// Informazioni sull'anagrafica
$anagrafica->codice = post('codice');
$anagrafica->tipo = post('tipo');
@ -68,7 +68,7 @@ switch (post('op')) {
$anagrafica->idagente = post('idagente');
$anagrafica->idrelazione = post('idrelazione');
$anagrafica->sitoweb = post('sitoweb');
$anagrafica->nome = post('nome');
$anagrafica->nome = post('nome');
$anagrafica->cognome = post('cognome');
$anagrafica->iscrizione_tribunale = post('iscrizione_tribunale');
$anagrafica->cciaa = post('cciaa');
@ -127,7 +127,7 @@ switch (post('op')) {
case 'add':
$idtipoanagrafica = post('idtipoanagrafica');
$ragione_sociale = post('ragione_sociale');
$anagrafica = Anagrafica::build($ragione_sociale, $idtipoanagrafica);
$id_record = $anagrafica->id;
@ -145,9 +145,9 @@ switch (post('op')) {
}
$idagente = ($agente_is_logged && in_array($id_cliente, $idtipoanagrafica)) ? $user['idanagrafica'] : 0;
$anagrafica->nome = post('nome');
$anagrafica->cognome = post('cognome');
$anagrafica->nome = post('nome');
$anagrafica->cognome = post('cognome');
$anagrafica->partita_iva = post('piva');
$anagrafica->codice_fiscale = post('codice_fiscale');
$anagrafica->indirizzo = post('indirizzo');

View File

@ -32,7 +32,6 @@ echo '
</div>
</div>';
echo '
<div class="box box-info collapsed-box">
<div class="box-header with-border">

View File

@ -95,9 +95,17 @@ if (!$cliente) {
<div class="col-md-2">
<?php
$help_text = '<b>Attenzione</b>: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:<br><ul><li>Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri</li><li>Azienda (B2B) - Codice Destinatario, 7 caratteri</li><li>Privato (B2C) - viene utilizzato il Codice Fiscale</li></ul>'.((in_array($id_azienda, $tipi_anagrafica)) ? '<p>N.B. <b>non è necessario</b> comunicare il proprio codice destinatario ai fornitori in quanto è sufficiente che questo sia registrato nel portale del Sistema Di Interscambio dell\'Agenzia Entrate (SDI)</p>' : '').'';
?>
{[ "type": "text", "label": "<?php echo ($record['tipo'] == 'Ente pubblico') ? tr('Codice unico ufficio') : tr('Codice destinatario'); ?>", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": <?php echo ($record['tipo'] == 'Ente pubblico') ? '6' : '7'; ?>, "extra": "<?php echo (empty($record['tipo']) or ($record['tipo'] == 'Privato')) ? 'disabled' : ''; ?>", "help": "<?php echo tr($help_text); ?>", "readonly": "<?php echo intval($anagrafica->sedeLegale->nazione->iso2 != 'IT'); ?>" ]}
$help_codice_destinatario = tr("Per impostare il codice specificare prima 'Tipologia' e 'Nazione' dell'anagrafica").':<br><ul>
<li>'.tr('Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri').'</li>
<li>'.tr('Azienda (B2B) - Codice Destinatario, 7 caratteri').'</li>
<li>'.tr('Privato (B2C) - viene utilizzato il Codice Fiscale').'</li>
</ul>';
if (in_array($id_azienda, $tipi_anagrafica)) {
$help_codice_destinatario .= '<b>'.tr("Non è necessario comunicare il proprio codice destinatario ai fornitori in quanto è sufficiente che questo sia registrato nel portale del Sistema Di Interscambio dell'Agenzia Entrate (SDI)").'.</b>';
}
?>
{[ "type": "text", "label": "<?php echo ($record['tipo'] == 'Ente pubblico') ? tr('Codice unico ufficio') : tr('Codice destinatario'); ?>", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": <?php echo ($record['tipo'] == 'Ente pubblico') ? '6' : '7'; ?>, "extra": "<?php echo (empty($record['tipo']) or ($record['tipo'] == 'Privato')) ? 'disabled' : ''; ?>", "help": "<?php echo tr($help_codice_destinatario); ?>", "readonly": "<?php echo intval($anagrafica->sedeLegale->nazione->iso2 != 'IT'); ?>" ]}
</div>
<div class="col-md-4">
@ -449,7 +457,7 @@ if (!empty($google)) {
<div class="row">
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Abilitare lo split payment'); ?>", "name": "split_payment", "value": "$split_payment$", "help": "<?php echo tr('Lo split payment è disponibile per le anagrafiche di tipologia \"Ente pubblico\" o \"Azienda\" ed <strong>&egrave; obbligatorio</strong> per:<ul><li>Stato;</li><li>organi statali ancorch&eacute; dotati di personalit&agrave; giuridica;</li><li>enti pubblici territoriali e dei consorzi tra essi costituiti;</li><li>Camere di Commercio;</li><li>Istituti universitari;</li><li>ASL e degli enti ospedalieri;</li><li>enti pubblici di ricovero e cura aventi prevalente carattere scientifico;</li><li>enti pubblici di assistenza e beneficienza;</li><li>enti di previdenza;</li><li>consorzi tra questi costituiti.</li></ul>'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>", "extra" : "<?php echo ($record['tipo'] == 'Ente pubblico' or $record['tipo'] == 'Azienda') ? '' : 'disabled'; ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Abilitare lo split payment'); ?>", "name": "split_payment", "value": "$split_payment$", "help": "<?php echo tr('Lo split payment è disponibile per le anagrafiche di tipologia \"Ente pubblico\" o \"Azienda\" ed <strong>&egrave; obbligatorio</strong> per:<ul><li>Stato;</li><li>organi statali ancorch&eacute; dotati di personalit&agrave; giuridica;</li><li>enti pubblici territoriali e dei consorzi tra essi costituiti;</li><li>Camere di Commercio;</li><li>Istituti universitari;</li><li>ASL e degli enti ospedalieri;</li><li>enti pubblici di ricovero e cura aventi prevalente carattere scientifico;</li><li>enti pubblici di assistenza e beneficienza;</li><li>enti di previdenza;</li><li>consorzi tra questi costituiti.</li></ul>'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>", "extra" : "<?php echo ($record['tipo'] == 'Ente pubblico' or $record['tipo'] == 'Azienda') ? '' : 'disabled'; ?>" ]}
</div>
<div class="col-md-9">

View File

@ -134,10 +134,10 @@ echo '
<div class="box-body">';
// Fatture di vendita
$totale_fatture_vendita = 0;
$fatture = database()->fetchArray("SELECT id FROM co_documenti WHERE idanagrafica=".prepare($id_record));
$fatture = database()->fetchArray('SELECT id FROM co_documenti WHERE idanagrafica='.prepare($id_record));
foreach ($fatture as $fattura) {
$totale_fatture_vendita = sum( $totale_fatture_vendita, Modules\Fatture\Fattura::find( $fattura['id'] )->netto );
$totale_fatture_vendita = sum($totale_fatture_vendita, Modules\Fatture\Fattura::find($fattura['id'])->netto);
}
$data_start = strtotime('now');

View File

@ -15,7 +15,7 @@ class Articolo extends Article
/**
* Crea un nuovo articolo collegato ad una ddt.
*
* @param DDT $ddt
* @param DDT $ddt
* @param Original $articolo
*
* @return self

View File

@ -92,20 +92,18 @@ switch (post('op')) {
//Creo il modello di prima nota
if (!empty(post('crea_modello'))) {
if (empty(post('idmastrino'))){
$idmastrino = get_new_idmastrino('co_movimenti_modelli');
}else{
$dbo->query('DELETE FROM co_movimenti_modelli WHERE idmastrino='.prepare(post('idmastrino')));
$idmastrino = post('idmastrino');
}
for ($i = 0; $i < sizeof(post('idconto')); ++$i) {
$idconto = post('idconto')[$i];
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')';
$dbo->query($query);
}
if (empty(post('idmastrino'))) {
$idmastrino = get_new_idmastrino('co_movimenti_modelli');
} else {
$dbo->query('DELETE FROM co_movimenti_modelli WHERE idmastrino='.prepare(post('idmastrino')));
$idmastrino = post('idmastrino');
}
for ($i = 0; $i < sizeof(post('idconto')); ++$i) {
$idconto = post('idconto')[$i];
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')';
$dbo->query($query);
}
}
break;

View File

@ -351,9 +351,11 @@ include_once __DIR__.'/../../core.php';
var causale = $(this).find('option:selected').text();
//aggiornava erroneamente anche la causale ed eventuale numero di fattura e data
<?php if (empty($iddocumento)) {?>
<?php if (empty($iddocumento)) {
?>
$('#bs-popup #desc').val(causale);
<?php } ?>
<?php
} ?>
$.get('<?php echo $rootdir; ?>/ajax_complete.php?op=get_conti&idmastrino='+idmastrino, function(data){
var conti = data.split(',');

View File

@ -637,8 +637,6 @@ class FatturaElettronica
return $this->intermediario;
}
/**
* Restituisce le informazioni riguardanti un anagrafica sulla base dell'identificativo fornito.
*
@ -1077,12 +1075,11 @@ class FatturaElettronica
return $result;
}
/**
* Restituisce l'array responsabile per la generazione del tag TerzoIntermediarioOSoggettoEmittente (1.5).
*
* @return array
*/
* Restituisce l'array responsabile per la generazione del tag TerzoIntermediarioOSoggettoEmittente (1.5).
*
* @return array
*/
protected static function getTerzoIntermediarioOSoggettoEmittente($fattura)
{
$intermediario = $fattura->getIntermediario();
@ -1094,7 +1091,6 @@ class FatturaElettronica
return $result;
}
/**
* Restituisce l'array responsabile per la generazione del tag DatiGeneraliDocumento.
*
@ -1105,6 +1101,8 @@ class FatturaElettronica
$documento = $fattura->getDocumento();
$azienda = static::getAzienda();
$fattura = Modules\Fatture\Fattura::find($documento['id']);
$result = [
'TipoDocumento' => $documento['tipo_documento'],
'Divisa' => 'EUR',
@ -1157,8 +1155,6 @@ class FatturaElettronica
$iva = database()->fetchOne('SELECT `percentuale`, `codice_natura_fe` FROM `co_iva` WHERE `id` = '.prepare($aliquota_iva_rivalsainps));
$percentuale = database()->fetchOne('SELECT percentuale FROM co_rivalsainps WHERE id = '.prepare($id_rivalsainps))['percentuale'];
$fattura = Modules\Fatture\Fattura::find($documento['id']);
$dati_cassa = [
'TipoCassa' => setting('Tipo Cassa'),
'AlCassa' => $percentuale,
@ -1196,7 +1192,6 @@ class FatturaElettronica
// Importo Totale Documento (2.1.1.9)
// Importo totale del documento al netto dell'eventuale sconto e comprensivo di imposta a debito del cessionario / committente
$fattura = Modules\Fatture\Fattura::find($documento['id']);
$result['ImportoTotaleDocumento'] = $fattura->netto;
return $result;

View File

@ -30,8 +30,8 @@ echo '
<h4>'.
$ragione_sociale.'<br>
<small>
'.( !empty($codice_fiscale) ? (tr('Codice Fiscale').': '.$codice_fiscale.'<br>') : '' ).'
'.( !empty($partita_iva) ? (tr('Partita IVA').': '.$partita_iva.'<br>') : '' ).'
'.(!empty($codice_fiscale) ? (tr('Codice Fiscale').': '.$codice_fiscale.'<br>') : '').'
'.(!empty($partita_iva) ? (tr('Partita IVA').': '.$partita_iva.'<br>') : '').'
'.$cap.' '.$citta.' ('.$provincia.')<br>
</small>
</h4><br>';

View File

@ -460,7 +460,7 @@ class Auth extends \Util\Singleton
try {
$results = $database->fetchArray('SELECT id, idanagrafica, username, (SELECT nome FROM zz_groups WHERE zz_groups.id = zz_users.idgruppo) AS gruppo FROM zz_users WHERE id = :user_id AND enabled = 1 LIMIT 1', [
':user_id' => $user_id,
], false, ['session' => false]);
]);
if (!empty($results)) {
$this->user = User::with('group')->find($user_id);

View File

@ -89,7 +89,7 @@ class Database extends Util\Singleton
$e = new PDOException(($e->getCode() == 1049) ? tr('Database non esistente!') : tr('Credenziali di accesso invalide!'));
}
$this->signal($e, tr('Errore durante la connessione al database'), ['throw' => false, 'session' => false]);
throw $e;
}
}
}
@ -203,51 +203,45 @@ class Database extends Util\Singleton
*
* @since 2.0
*
* @param string $query Query da eseguire
* @param string $query Query da eseguire
* @param array $parameters
*
* @return int
*/
public function query($query, $parameters = [], $signal = null, $options = [])
public function query($query, $parameters = [])
{
try {
$statement = $this->getPDO()->prepare($query);
$statement->execute($parameters);
$statement = $this->getPDO()->prepare($query);
$statement->execute($parameters);
$id = $this->lastInsertedID();
if ($id == 0) {
return 1;
} else {
return $id;
}
} catch (PDOException $e) {
$signal = empty($signal) ? $query : $signal;
$this->signal($e, $signal, $options);
$id = $this->lastInsertedID();
if ($id == 0) {
return 1;
} else {
return $id;
}
}
/**
* Restituisce un'array strutturato in base ai nomi degli attributi della selezione.
*
* @since 2.0
* @param string $query Query da eseguire
* @param array $parameters
* @param bool $numeric
*
* @param string $query Query da eseguire
* @throws Exception
*
* @return array
*/
public function fetchArray($query, $parameters = [], $numeric = false, $options = [])
public function fetchArray($query, $parameters = [], $numeric = false)
{
try {
$mode = empty($numeric) ? PDO::FETCH_ASSOC : PDO::FETCH_NUM;
$mode = empty($numeric) ? PDO::FETCH_ASSOC : PDO::FETCH_NUM;
$statement = $this->getPDO()->prepare($query);
$statement->execute($parameters);
$statement = $this->getPDO()->prepare($query);
$statement->execute($parameters);
$result = $statement->fetchAll($mode);
$result = $statement->fetchAll($mode);
return $result;
} catch (PDOException $e) {
$this->signal($e, $query, $options);
}
return $result;
}
/**
@ -359,7 +353,7 @@ class Database extends Util\Singleton
try {
return $this->getPDO()->lastInsertId();
} catch (PDOException $e) {
$this->signal($e, tr("Impossibile ottenere l'ultimo identificativo creato"));
throw new PDOException(tr("Impossibile ottenere l'ultimo identificativo creato"));
}
}
@ -452,41 +446,40 @@ class Database extends Util\Singleton
}
$select = !empty($select) ? $select : ['*'];
// Costruzione della query
$query = 'SELECT '.implode(', ', $select).' FROM '.$this->quote($table);
// Condizioni di selezione
$where = $this->whereStatement($conditions);
if (!empty($where)) {
$query .= ' WHERE '.$where;
}
$statement = Capsule::table($table)->where($conditions)->select($select);
// Impostazioni di ordinamento
if (!empty($order)) {
$list = [];
$allow = ['ASC', 'DESC'];
foreach ((array) $order as $key => $value) {
if (is_numeric($key)) {
$key = $value;
$value = $allow[0];
$order = is_numeric($key) ? 'ASC' : strtoupper($value);
$field = is_numeric($key) ? $value : key;
if ($order == 'ASC') {
$statement = $statement->orderBy($field);
} else {
$statement = $statement->orderByDesc($field);
}
$value = in_array($value, $allow) ? $value : $allow[0];
$list[] = $this->quote($key).' '.$value;
}
$query .= ' ORDER BY '.implode(', ', $list);
}
// Eventuali limiti
if (!empty($limit)) {
$query .= ' LIMIT '.(is_array($limit) ? $limit[0].', '.$limit[1] : $limit);
$offset = is_array($limit) ? $limit[0] : null;
$count = is_array($limit) ? $limit[1] : $limit;
if ($offset) {
$statement = $statement->offset($offset);
}
$statement = $statement->limit($count);
}
if (!empty($return)) {
return $query;
return $statement->toSql();
} else {
return $this->fetchArray($query);
$result = $statement->get()->toArray();
return json_decode(json_encode($result), true);
}
}
@ -523,24 +516,17 @@ class Database extends Util\Singleton
*
* @param string $table
* @param array $conditions
* @param bool $return
*
* @return string|array
*/
public function delete($table, $conditions, $return = false)
public function delete($table, $conditions)
{
if (!is_string($table) || !is_array($conditions)) {
throw new UnexpectedValueException();
}
// Costruzione della query
$query = 'DELETE FROM '.$this->quote($table).' WHERE '.$this->whereStatement($conditions);
if (!empty($return)) {
return $query;
} else {
return $this->query($query);
}
return Capsule::table($table)->where($conditions)->delete();
}
/**
@ -647,7 +633,7 @@ class Database extends Util\Singleton
}
/**
* Esegue le query interne ad un file .sql.
* Esegue le query interne ad un file ".sql".
*
* @since 2.0
*
@ -660,15 +646,7 @@ class Database extends Util\Singleton
$end = count($queries);
for ($i = $start; $i < $end; ++$i) {
try {
$this->getPDO()->exec($queries[$i]);
} catch (PDOException $e) {
$this->signal($e, $queries[$i], [
'throw' => false,
]);
return $i;
}
$this->query($queries[$i]);
}
return true;
@ -689,124 +667,4 @@ class Database extends Util\Singleton
return $char.str_replace([$char, '#'], '', $string).$char;
}
/**
* Predispone una variabile per il relativo inserimento all'interno di uno statement SQL.
*
* @since 2.3
*
* @param string $value
*
* @return string
*/
protected function prepareValue($field, $value)
{
$value = (is_null($value)) ? 'NULL' : $value;
$value = is_bool($value) ? intval($value) : $value;
if (!starts_with($field, '#')) {
if ($value != 'NULL') {
$value = $this->prepare($value);
}
}
return $value;
}
/**
* Predispone il contenuto di un array come clausola WHERE.
*
* @since 2.3
*
* @param string|array $where
* @param bool $and
*
* @return string
*/
protected function whereStatement($where, $and = true)
{
$result = [];
foreach ($where as $key => $value) {
// Query personalizzata
if (starts_with($key, '#')) {
$result[] = $this->prepareValue($key, $value);
} else {
// Ulteriori livelli di complessità
if (is_array($value) && in_array(strtoupper($key), ['AND', 'OR'])) {
$result[] = '('.$this->whereStatement($value, $key == 'AND').')';
}
// Condizione IN
elseif (is_array($value)) {
if (!empty($value)) {
$in = [];
foreach ($value as $v) {
$in[] = $this->prepareValue($key, $v);
}
$result[] = $this->quote($key).' IN ('.implode(',', $in).')';
}
}
// Condizione LIKE
elseif (str_contains($value, '%') || str_contains($value, '_')) {
$result[] = $this->quote($key).' LIKE '.$this->prepareValue($key, $value);
}
// Condizione BETWEEN
elseif (str_contains($value, '|')) {
$pieces = explode('|', $value);
$result[] = $this->quote($key).' BETWEEN '.$this->prepareValue($key, $pieces[0]).' AND '.$this->prepareValue($key, $pieces[1]);
}
// Condizione di uguaglianza
else {
$prepared = $this->prepareValue($key, $value);
if ($prepared == 'NULL') {
$result[] = $this->quote($key).' IS '.$prepared;
} else {
$result[] = $this->quote($key).' = '.$prepared;
}
}
}
}
$cond = !empty($and) ? 'AND' : 'OR';
return implode(' '.$cond.' ', $result);
}
/**
* Aggiunge informazioni alla struttura di base dell'erroe o dell'eccezione intercettata.
*
* @since 2.3
*/
protected function signal($e, $message, $options = [])
{
$options = array_merge([
'session' => true,
'level' => \Monolog\Logger::ERROR,
'throw' => true,
], $options);
if (!empty($options['session']) && !API::isAPIRequest()) {
$msg = tr("Si è verificato un'errore").'.';
if (Auth::check()) {
$msg .= ' '.tr('Se il problema persiste siete pregati di chiedere assistenza tramite la sezione Bug').'. <a href="'.ROOTDIR.'/bug.php"><i class="fa fa-external-link"></i></a>';
}
$msg .= '<br><small>'.$e->getMessage().'</small>';
flash()->error($msg);
}
$error = $e->getMessage().' - '.$message;
if (!empty($options['throw'])) {
throw new PDOException($error);
} else {
$logger = logger();
$logger->addRecord($options['level'], $error);
}
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Extensions;
use Monolog\Handler\AbstractProcessingHandler;
/**
* Gestore dei messaggi di avvertenza in caso di malfunzionamento del gestionale.
*
* @since 2.4.6
*/
class MessageHandler extends AbstractProcessingHandler
{
protected function write(array $record)
{
$message = tr("Si è verificato un'errore").'.';
if (auth()->check()) {
$message .= '
'.tr('Se il problema persiste siete pregati di chiedere assistenza tramite la sezione Bug').'. <a href="'.ROOTDIR.'/bug.php"><i class="fa fa-external-link"></i></a>
<br><small>'.$record['message'].'</small>';
}
//flash()->error($message);
echo '
<div class="alert alert-danger push">
<i class="fa fa-times"></i> '.$message.'
</div>';
}
}

View File

@ -77,7 +77,7 @@ class FileManager implements ManagerInterface
</tr>';
foreach ($rs as $r) {
$extension = pathinfo($r['original'])['extension'];
$extension = pathinfo($r['original'])['extension'];
$result .= '
<tr>
<td align="left">
@ -112,7 +112,7 @@ class FileManager implements ManagerInterface
<button class="btn btn-xs btn-info" data-target="#bs-popup2" type="button" data-title="'.prepareToField($r['name']).' <small><em>('.$r['filename'].')</em></small>" data-href="#view-'.$r['id'].'">
<i class="fa fa-eye"></i>
</button>';
} elseif (strtolower($extension) == 'xml' ) {
} elseif (strtolower($extension) == 'xml') {
$result .= '
<a class="btn btn-xs btn-info" href="'.ROOTDIR.'/plugins/exportFE/view.php?id_record='.$r['id'].'" target="_blank">
<i class="fa fa-eye"></i>

View File

@ -219,7 +219,11 @@ class Update
if ($start < $end) {
for ($i = $start; $i < $end; ++$i) {
$database->query($queries[$i], [], tr('Aggiornamento fallito').': '.$queries[$i]);
try {
$database->query($queries[$i]);
} catch (\Exception $e) {
throw new PDOException(tr('Aggiornamento fallito').': '.$queries[$i]);
}
$database->query('UPDATE `updates` SET `done` = :done WHERE id = :id', [
':done' => $i + 3,

View File

@ -36,11 +36,9 @@ UPDATE `zz_settings` SET `tipo` = 'query=SELECT ''IMP'' AS id, ''Imponibile'' AS
UPDATE `an_anagrafiche` SET `provincia` = UPPER(provincia);
UPDATE `an_sedi` SET `provincia` = UPPER(provincia);
-- Colonna Codice Modalità (Pagamenti)
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default` ) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Pagamenti'), 'Codice Modalità', 'codice_modalita_pagamento_fe', 2, 1, 0, 0, NULL, NULL, 1, 0, 0);
-- Impostazione "Anagrafica del terzo intermediario"
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`) VALUES (NULL, 'Terzo intermediario', '', 'query=SELECT `an_anagrafiche`.`idanagrafica` AS ''id'', `ragione_sociale` AS ''descrizione'' FROM `an_anagrafiche` INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `an_tipianagrafiche_anagrafiche`.`idanagrafica` WHERE `idtipoanagrafica` = (SELECT `idtipoanagrafica` FROM `an_tipianagrafiche` WHERE `descrizione` = ''Fornitore'') AND `deleted_at` IS NULL', '1', 'Fatturazione Elettronica');
@ -48,7 +46,6 @@ INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`
ALTER TABLE `an_anagrafiche` CHANGE `nome_cognome` `nome` VARCHAR(255) NOT NULL;
ALTER TABLE `an_anagrafiche` ADD `cognome` VARCHAR(255) NOT NULL AFTER `nome`;
-- Colonna Rif. fattura (Prima nota)
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default` ) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Prima nota'), 'Rif. fattura', 'IF((iddocumento != ''),(SELECT numero_esterno FROM co_documenti WHERE id = iddocumento), ''-'')', 2, 1, 0, 0, NULL, NULL, 1, 0, 0);