Compare commits
13 Commits
5b16274a9e
...
5137f43631
Author | SHA1 | Date |
---|---|---|
Dasc3er | 5137f43631 | |
Dasc3er | 5e6938da50 | |
Dasc3er | 1136adbb2b | |
Dasc3er | a408a86593 | |
MatteoPistorello | 87f98cfd94 | |
Dasc3er | bd1da38d3f | |
Dasc3er | 5a9ab741b1 | |
Dasc3er | 88acffc827 | |
Dasc3er | 6b6d19836b | |
Dasc3er | 75c745eb41 | |
Dasc3er | a4fda979aa | |
Dasc3er | fce5c09eaf | |
Dasc3er | 36d70a7d23 |
|
@ -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,
|
||||
|
|
|
@ -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 = [];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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>';
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>';
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 '
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue