Compare commits

...

13 Commits

20 changed files with 306 additions and 46 deletions

View File

@ -89,17 +89,17 @@ if (!empty($options['create_document'])) {
$stato_predefinito = $database->fetchOne("SELECT id FROM co_statidocumento WHERE descrizione = 'Bozza'");
if(!empty($options['reversed'])){
if (!empty($options['reversed'])) {
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'dir' => $dir,
'descrizione' => 'Nota di credito',
])['id'];
} elseif(in_array($original_module['name'], ['Ddt di vendita', 'Ddt di acquisto'])){
} elseif (in_array($original_module['name'], ['Ddt di vendita', 'Ddt di acquisto'])) {
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'dir' => $dir,
'descrizione' => ($dir=='uscita' ? 'Fattura differita di acquisto' : 'Fattura differita di vendita'),
'descrizione' => ($dir == 'uscita' ? 'Fattura differita di acquisto' : 'Fattura differita di vendita'),
])['id'];
} else{
} else {
$idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'predefined' => 1,
'dir' => $dir,

View File

@ -20,6 +20,7 @@
include_once __DIR__.'/../../core.php';
use Models\Cache;
use Modules\Aggiornamenti\Controlli\ColonneDuplicateViste;
use Modules\Aggiornamenti\Controlli\Controllo;
use Modules\Aggiornamenti\Controlli\DatiFattureElettroniche;
use Modules\Aggiornamenti\Controlli\PianoConti;
@ -51,6 +52,7 @@ switch (filter('op')) {
$controlli = [
PianoConti::class,
DatiFattureElettroniche::class,
ColonneDuplicateViste::class,
];
$results = [];

View File

@ -0,0 +1,58 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace Modules\Aggiornamenti\Controlli;
use Models\Module;
class ColonneDuplicateViste extends Controllo
{
public function getName()
{
return tr('Colonne duplicate per le Viste');
}
public function getType($record)
{
return 'warning';
}
public function check()
{
$duplicati = database()->fetchArray('SELECT `id_module`, `name` FROM `zz_views` GROUP BY `id_module`, `name` HAVING COUNT(`name`) > 1');
foreach ($duplicati as $colonna) {
$modulo = Module::pool($colonna['id_module']);
$this->addResult([
'id' => $colonna['name'],
'nome' => $modulo->title.': '.$colonna['name'],
'descrizione' => tr('La colonna _NAME_ del modulo _MODULE_ esiste più volte', [
'_NAME_' => $modulo->title,
'_MODULE_' => $modulo->title,
]),
]);
}
}
public function execute($record, $params = [])
{
return false;
}
}

View File

@ -44,7 +44,7 @@ class UpdateHook extends CachedManager
public function response()
{
$update = $this->getCache()->content;
if ($update == Update::getVersion()) {
if ($update == Update::getVersion() || empty(setting('Attiva aggiornamenti'))) {
$update = null;
}

View File

@ -111,7 +111,7 @@ if (!empty($movimenti)) {
<td>
'.$movimento->descrizione.''.($movimento->hasDocument() ? ' - '.reference($movimento->getDocument()) : '').'
</td>
<td class="text-center">
'.($movimento->nomesede ?: tr('Sede legale')).'
</td>';
@ -128,7 +128,7 @@ if (!empty($movimenti)) {
if (Auth::admin() && $movimento->isManuale()) {
echo '
<a class="btn btn-danger btn-xs ask" data-backto="record-edit" data-op="delmovimento" data-idmovimento="'.$movimento['idmovimento'].'">
<a class="btn btn-danger btn-xs ask" data-backto="record-edit" data-op="delmovimento" data-idmovimento="'.$movimento['id'].'">
<i class="fa fa-trash"></i>
</a>';
}

View File

@ -257,11 +257,17 @@ class Articolo extends Model
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Query\Builder
*/
public function movimentiComposti()
public function movimentiComposti($mostra_vuoti = false)
{
return $this->movimenti()
->selectRaw('*, mg_movimenti.id AS idmovimento, mg_movimenti.created_at AS data_movimento, sum(mg_movimenti.qta) as qta_documento, IFNULL(mg_movimenti.reference_type, mg_movimenti.id) as tipo_gruppo')
->groupBy('tipo_gruppo', 'mg_movimenti.reference_id');
$movimenti = $this->movimenti()
->selectRaw('*, mg_movimenti.created_at AS data_movimento, SUM(mg_movimenti.qta) as qta_documento, IFNULL(mg_movimenti.reference_type, mg_movimenti.id) as tipo_gruppo')
->groupBy(['tipo_gruppo', 'mg_movimenti.reference_id']);
if (!empty($mostra_vuoti)) {
return $movimenti;
}
return $movimenti->havingRaw('mg_movimenti.reference_type IS NULL OR qta_documento != 0');
}
public function categoria()

View File

@ -55,10 +55,16 @@ switch (filter('op')) {
break;
case 'backup':
if (Backup::create()) {
flash()->info(tr('Nuovo backup creato correttamente!'));
} else {
flash()->error(tr('Errore durante la creazione del backup!').' '.str_replace('_DIR_', '"'.$backup_dir.'"', tr('Verifica che la cartella _DIR_ abbia i permessi di scrittura!')));
try {
$result = Backup::create();
if ($result) {
flash()->info(tr('Nuovo backup creato correttamente!'));
} else {
flash()->error(tr('Errore durante la creazione del backup!').' '.str_replace('_DIR_', '"'.$backup_dir.'"', tr('Verifica che la cartella _DIR_ abbia i permessi di scrittura!')));
}
} catch (\Exception $e) {
flash()->error(tr('Errore durante la creazione del backup!').' '.$e->getMessage());
}
break;

View File

@ -80,7 +80,7 @@ function restore() {
}
// Creazione backup
function backup(){
function creaBackup(button){
swal({
title: "'.tr('Nuovo backup').'",
text: "'.tr('Sei sicuro di voler creare un nuovo backup?').'",
@ -88,10 +88,32 @@ function backup(){
showCancelButton: true,
confirmButtonClass: "btn btn-lg btn-success",
confirmButtonText: "'.tr('Crea').'",
}).then(
function() {
location.href = globals.rootdir + "/editor.php?id_module='.$id_module.'&op=backup";
}, function() {});
}).then(function() {
let restore = buttonLoading(button);
$("#main_loading").show();
$.ajax({
url: globals.rootdir + "/actions.php",
type: "GET",
data: {
id_module: globals.id_module,
op: "backup",
},
success: function(data) {
$("#main_loading").fadeOut();
buttonRestore(button, restore);
// Ricaricamento della pagina corrente
window.location.reload();
},
error: function() {
swal("'.tr('Errore').'", "'.tr('Errore durante la creazione del backup').'", "error");
renderMessages();
buttonRestore(button, restore);
}
});
}).catch(swal.noop);
}
// Caricamento
@ -100,7 +122,7 @@ function loadSize(number, id){
$.ajax({
url: globals.rootdir + "/actions.php",
type: "get",
type: "GET",
data: {
id_module: globals.id_module,
op: "size",
@ -294,7 +316,9 @@ if (file_exists($backup_dir)) {
// Creazione backup
if (!empty($backup_dir)) {
echo '
<button type="button" class="btn btn-primary pull-right" onclick="backup()"><i class="fa fa-database"></i> '.tr('Crea backup').'...</button>
<button type="button" class="btn btn-primary pull-right" onclick="creaBackup(this)">
<i class="fa fa-database"></i> '.tr('Crea backup').'...
</button>
<div class="clearfix"></div>';
}

View File

@ -33,7 +33,7 @@ $tecnici_disponibili = $dbo->fetchArray("SELECT an_anagrafiche.idanagrafica AS i
INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica
LEFT OUTER JOIN in_interventi_tecnici ON in_interventi_tecnici.idtecnico = an_anagrafiche.idanagrafica
INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id
WHERE an_anagrafiche.deleted_at IS NULL AND an_tipianagrafiche.descrizione='Tecnico' ".Modules::getAdditionalsQuery('Interventi').'
WHERE an_anagrafiche.deleted_at IS NULL AND an_tipianagrafiche.descrizione='Tecnico' ".Modules::getAdditionalsQuery('Interventi', null, false).'
GROUP BY an_anagrafiche.idanagrafica
ORDER BY ragione_sociale ASC');

View File

@ -21,7 +21,6 @@ include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\DDT\DDT;
use Modules\Fatture\Components\Articolo;
use Modules\Fatture\Components\Descrizione;
use Modules\Fatture\Components\Riga;

View File

@ -94,12 +94,15 @@ if ($dir == 'entrata') {
}
// Verifica la data dell'intervento rispetto alla data della fattura
$righe_interventi = $fattura->getRighe()->where('idintervento', '!=', null);
if (!empty($righe_interventi)) {
foreach ($righe_interventi as $riga_intervento) {
$intervento = Intervento::find($riga_intervento->idintervento);
$fatturazione_futura = false;
$data_fattura = new Carbon($fattura->data);
$interventi_collegati = $fattura->getDocumentiCollegati()[Intervento::class];
if (!empty($interventi_collegati)) {
foreach ($interventi_collegati as $intervento) {
$fine_intervento = $intervento->fine ?: $intervento->data_richiesta;
$fine_intervento = new Carbon($fine_intervento);
if ((new Carbon($intervento->fine))->diffInDays(new Carbon($fattura->data), false) < 0) {
if ($fine_intervento->diffInDays($data_fattura, false) < 0) {
$fatturazione_futura = true;
break;
}
@ -860,11 +863,12 @@ if (!empty($note_accredito)) {
// Eliminazione ddt solo se ho accesso alla sede aziendale
$field_name = ($dir == 'entrata') ? 'idsede_partenza' : 'idsede_destinazione';
if (in_array($record[$field_name], $user->sedi)) {
?>
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
</a>
<?php
$disabilita_eliminazione = in_array($fattura->codice_stato_fe, ['RC', 'MC', 'EC01']);
echo '
<a class="btn btn-danger ask '.($disabilita_eliminazione ? 'disabled' : '').'" data-backto="record-list" '.($disabilita_eliminazione ? 'disabled' : '').'>
<i class="fa fa-trash"></i> '.tr('Elimina').'
</a>';
}
echo '

View File

@ -24,6 +24,7 @@ use Carbon\Carbon;
use Common\Components\Component;
use Common\Document;
use Illuminate\Database\Eloquent\Builder;
use InvalidArgumentException;
use Models\Upload;
use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
@ -462,6 +463,9 @@ class Fattura extends Document
}
$file = $this->uploads()->where('name', '=', 'Fattura Elettronica')->first();
if (empty($file)) {
throw new InvalidArgumentException('Fattura Elettronica non trovata');
}
return $file->getContent();
}

View File

@ -193,6 +193,10 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$qta_gruppo = $gruppo->sum('ore');
$riga->qta = round($qta_gruppo, $decimals);
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
@ -222,6 +226,10 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$riga->qta = $gruppo->count();
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
@ -255,6 +263,10 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$riga->prezzo_unitario = $viaggio->prezzo_km_unitario;
$riga->setSconto($viaggio->scontokm_unitario, $viaggio->tipo_scontokm);
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->qta = $qta_trasferta;
$riga->save();
@ -265,7 +277,6 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$righe = $intervento->getRighe();
foreach ($righe as $riga) {
$qta = $riga->qta;
$copia = $riga->copiaIn($fattura, $qta);
$copia->id_conto = $id_conto;

View File

@ -53,9 +53,15 @@ echo '
'name' => 'query',
'required' => 0,
'value' => $lista->query,
'help' => tr("La query SQL deve restituire gli identificativi delle anagrafiche da inserire nella lista, sotto un campo di nome ''id''").'. '.tr('Per esempio: _SQL_', [
'_SQL_' => 'SELECT idanagrafica AS id, \'Modules\\Anagrafiche\\Anagrafica\' AS tipo FROM an_anagrafiche',
]),
'help' => tr("La query SQL deve restituire gli identificativi delle anagrafiche da inserire nella lista, sotto un campo di nome ''id''").'. <br>'.tr('Per esempio: _SQL_', [
'_SQL_' => 'SELECT idanagrafica AS id, \'Modules\\\\Anagrafiche\\\\Anagrafica\' AS tipo FROM an_anagrafiche',
]).'. <br>'.tr('Sono supportati i seguenti oggetti: _LIST_', [
'_LIST_' => implode(', ', [
slashes(Modules\Anagrafiche\Anagrafica::class),
slashes(Modules\Anagrafiche\Sede::class),
slashes(Modules\Anagrafiche\Referente::class),
]),
]).'.',
]).'
</div>
</div>

View File

@ -46,7 +46,7 @@ switch (filter('op')) {
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $direzione);
}
if($dettaglio_predefinito->sconto_percentuale != $sconto || $dettaglio_predefinito->prezzo_unitario!= $prezzo_unitario){
if ($dettaglio_predefinito->sconto_percentuale != $sconto || $dettaglio_predefinito->prezzo_unitario != $prezzo_unitario) {
$dettaglio_predefinito->sconto_percentuale = $sconto;
$dettaglio_predefinito->setPrezzoUnitario($prezzo_unitario);
$dettaglio_predefinito->save();
@ -79,7 +79,7 @@ switch (filter('op')) {
$dettaglio = DettaglioPrezzo::build($articolo, $anagrafica, $direzione);
}
if($dettaglio->minimo != $minimi[$key] || $dettaglio->massimo != $massimi[$key] || $dettaglio->sconto_percentuale != $sconti[$key] || $dettaglio->prezzo_unitario != $prezzo_unitario){
if ($dettaglio->minimo != $minimi[$key] || $dettaglio->massimo != $massimi[$key] || $dettaglio->sconto_percentuale != $sconti[$key] || $dettaglio->prezzo_unitario != $prezzo_unitario) {
$dettaglio->minimo = $minimi[$key];
$dettaglio->massimo = $massimi[$key];
$dettaglio->sconto_percentuale = $sconti[$key];

View File

@ -95,7 +95,7 @@ class Intervento extends Resource implements UpdateInterface
$this->importaRecords($key, $records);
}
return $this->response;
return $this->forceToString($this->response);
}
/**
@ -136,8 +136,10 @@ class Intervento extends Resource implements UpdateInterface
foreach ($records as $id => $record) {
// Fix id_cliente per Intervento in caso di generazione da zero
if ($risorsa instanceof Interventi && !empty($this->response['cliente'][$id])) {
if ($risorsa instanceof Interventi && !empty($this->response['cliente'][$id]) && !empty($this->response['cliente'][$id]['id'])) {
$record['id_cliente'] = $this->response['cliente'][$id]['id'];
} elseif (!($risorsa instanceof Clienti) && !empty($this->response['intervento'][0]) && !empty($this->response['intervento'][0]['id'])){
$record['id_intervento'] = $this->response['intervento'][0]['id'];
}
$response = null;
@ -174,4 +176,28 @@ class Intervento extends Resource implements UpdateInterface
return true;
}
/**
* Converte i valori numerici in stringhe.
*
* @param $list
*
* @return array
*/
protected function forceToString($list)
{
$result = [];
// Fix per la gestione dei contenuti numerici
foreach ($list as $key => $value) {
if (is_numeric($value)) {
$result[$key] = (string) $value;
} elseif (is_array($value)) {
$result[$key] = $this->forceToString($value);
} else {
$result[$key] = $value;
}
}
return $result;
}
}

View File

@ -18,6 +18,7 @@
*/
use Ifsnop\Mysqldump\Mysqldump;
use Util\FileSystem;
use Util\Generator;
use Util\Zip;
@ -148,6 +149,8 @@ class Backup
*/
public static function create()
{
self::checkSpace();
$backup_dir = self::getDirectory();
$backup_name = self::getNextName();
@ -276,6 +279,40 @@ class Backup
delete(base_dir().'/database.sql');
}
/**
* Effettua i controlli relativi allo spazio disponibile per l'esecuzione del backup;.
*/
public static function checkSpace()
{
$scarto = 1.1;
// Informazioni di base sui limiti di spazio
$spazio_libero = disk_free_space('.');
if (!empty(setting('Soft quota'))) {
$soft_quota = (float) setting('Soft quota'); // Impostazione in GB
$soft_quota = $soft_quota * (1024 ** 3); // Trasformazione in GB
}
// Informazioni sullo spazio occupato
$spazio_occupato = $spazio_necessario = FileSystem::folderSize(base_dir(), ['htaccess']);
$cartelle_ignorate = [
self::getDirectory(),
'node_modules',
'tests',
'tmp',
];
foreach ($cartelle_ignorate as $path) {
$spazio_necessario -= FileSystem::folderSize($path);
}
// Errori visualizzati
if (isset($soft_quota) && $soft_quota < ($spazio_necessario + $spazio_occupato) * $scarto) {
throw new InvalidArgumentException('Spazio disponibile in esaurimento');
} elseif ($spazio_libero < ($spazio_necessario) * $scarto) {
throw new InvalidArgumentException('Spazio del server in esaurimento');
}
}
/**
* Restituisce il percorso su cui salvare temporaneamente il dump del database.
*

View File

@ -45,6 +45,42 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
return static::$movimenta_magazzino;
}
/**
* Restituisce tutti i documenti collegati al documento corrente attraverso la procedura di importazione delle righe.
*
* @return \Illuminate\Support\Collection
*/
public function getDocumentiCollegati()
{
$riferimenti = collect([
$this->descrizioni()
->select(['original_document_id', 'original_document_type'])
->get(),
$this->righe()
->select(['original_document_id', 'original_document_type'])
->get(),
$this->articoli()
->select(['original_document_id', 'original_document_type'])
->get(),
$this->sconti()
->select(['original_document_id', 'original_document_type'])
->get(),
])->flatten();
return $riferimenti->reject(function ($item) {
return empty($item->original_document_type);
})->unique(function ($item) {
return $item->original_document_type.'|'.$item->original_document_id;
})->mapToGroups(function ($item) {
return [$item->original_document_type => ($item->original_document_type)::find($item->original_document_id)];
});
}
/**
* Restituisce tutte le righe collegate al documento.
*
* @return \Illuminate\Support\Collection|iterable
*/
public function getRighe()
{
$results = $this->mergeCollections($this->descrizioni, $this->righe, $this->articoli, $this->sconti);
@ -54,6 +90,14 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
});
}
/**
* Restituisce la riga con tipo e identificativo corrispondente.
*
* @param $type
* @param $id
*
* @return mixed
*/
public function getRiga($type, $id)
{
$righe = $this->getRighe();
@ -63,6 +107,11 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
});
}
/**
* Restituisce le righe del documento raggruppate per documento di origine.
*
* @return \Illuminate\Support\Collection|iterable
*/
public function getRigheRaggruppate()
{
$righe = $this->getRighe();

View File

@ -17,6 +17,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Interventi\Intervento;
include_once __DIR__.'/../../core.php';
$v_iva = [];
@ -58,6 +60,23 @@ foreach ($righe as $riga) {
$v_iva[$r['desc_iva']] = sum($v_iva[$r['desc_iva']], $riga->iva);
$v_totale[$r['desc_iva']] = sum($v_totale[$r['desc_iva']], $riga->totale_imponibile);
// Descrizione della riga
$descrizione = $riga->descrizione;
// Aggiunta riferimento più profondo per DDT attraverso Interventi
if ($riga->hasOriginalComponent() && $riga->original_document_type == Intervento::class) {
$riga_origine = $riga->getOriginalComponent();
if ($riga_origine->hasOriginalComponent()) {
$riferimento = $riga_origine->getOriginalComponent()
->getDocument()->getReference();
$descrizione .= "\n".tr('Rif. _DOCUMENT_', [
'_DOCUMENT_' => strtolower($riferimento),
]);
}
}
echo '
<tr>';
@ -68,7 +87,7 @@ foreach ($righe as $riga) {
echo '
<td>
'.nl2br(strip_tags($riga->descrizione));
'.nl2br(strip_tags($descrizione));
if ($riga->isArticolo()) {
// Codice articolo

View File

@ -91,10 +91,19 @@ UPDATE `zz_cache` SET `expire_at` = NULL WHERE `zz_cache`.`name` = 'Informazioni
UPDATE `zz_plugins` SET `default` = 1, `version` = '' WHERE `zz_plugins`.`name` IN ('Impianti del cliente', 'Impianti', 'Referenti', 'Sedi', 'Statistiche', 'Interventi svolti', 'Componenti ini', 'Movimenti', 'Serial', 'Consuntivo', 'Consuntivo', 'Pianificazione interventi', 'Ddt del cliente', 'Fatturazione Elettronica', 'Fatturazione Elettronica', 'Revisioni', 'Ricevute FE', 'Giacenze', 'Rinnovi', 'Statistiche', 'Dichiarazioni d''Intento', 'Pianificazione fatturazione', 'Listino Clienti', 'Storico attività', 'Consuntivo', 'Allegati', 'Componenti', 'Listino Fornitori', 'Piani di sconto/maggiorazione', 'Varianti Articolo');
-- Escludo dalla lista movimenti quelli collegati ad articoli eliminati
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `mg_movimenti` JOIN `mg_articoli` ON `mg_articoli`.id = `mg_movimenti`.`idarticolo` LEFT JOIN `an_sedi` ON `mg_movimenti`.`idsede` = `an_sedi`.`id` WHERE 1=1 AND mg_articoli.deleted_at IS NULL HAVING 2=2 ORDER BY mg_movimenti.data DESC, mg_movimenti.created_at DESC' WHERE `zz_modules`.`name` = 'Movimenti';
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `mg_movimenti` JOIN `mg_articoli` ON `mg_articoli`.id = `mg_movimenti`.`idarticolo` LEFT JOIN `an_sedi` ON `mg_movimenti`.`idsede` = `an_sedi`.`id` WHERE 1=1 AND mg_articoli.deleted_at IS NULL HAVING 2=2 ORDER BY mg_movimenti.data DESC, mg_movimenti.created_at DESC' WHERE `zz_modules`.`name` = 'Movimenti';
-- Aggiunta eliminazione causale DDT
ALTER TABLE `dt_causalet` ADD `deleted_at` TIMESTAMP NULL AFTER `updated_at`;
ALTER TABLE `dt_causalet` ADD `deleted_at` TIMESTAMP NULL AFTER `updated_at`;
-- Modifico il filtro del modulo
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `dt_causalet` WHERE 1=1 AND `deleted_at` IS NULL HAVING 2=2' WHERE `zz_modules`.`name` = 'Causali';
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `dt_causalet` WHERE 1=1 AND `deleted_at` IS NULL HAVING 2=2' WHERE `zz_modules`.`name` = 'Causali';
-- Fix query per la lista newsletter predefinita
UPDATE `em_lists` SET `query` = 'SELECT idanagrafica AS id, ''Modules\\\\Anagrafiche\\\\Anagrafica'' AS tipo FROM an_anagrafiche WHERE deleted_at IS NULL', `name` = 'Tutte le Anagrafiche (Sedi legali)' WHERE `query` = 'SELECT idanagrafica AS id FROM an_anagrafiche WHERE email != ''''';
INSERT INTO `em_lists` (`id`, `name`, `description`, `query`, `deleted_at`) VALUES
(NULL, 'Tutti i Referenti', 'Indirizzi email validi per ogni referente caricata a sistema', 'SELECT id, ''Modules\\\\Anagrafiche\\\\Referente'' AS tipo FROM an_referenti', NULL);
-- Fix riferimento documento per righe create da Interventi
UPDATE `co_righe_documenti` SET `original_document_id` = `idintervento`, `original_document_type` = 'Modules\\Interventi\\Intervento' WHERE `idintervento` IS NOT NULL;