diff --git a/core.php b/core.php index b9c447cbb..499fe083a 100644 --- a/core.php +++ b/core.php @@ -28,9 +28,6 @@ $namespaces = require_once __DIR__.'/config/namespaces.php'; foreach ($namespaces as $path => $namespace) { $loader->addPsr4($namespace.'\\', __DIR__.'/'.$path.'/custom/src'); $loader->addPsr4($namespace.'\\', __DIR__.'/'.$path.'/src'); - - // Namespace aggiuntivo per le personalizzazioni - $loader->addPsr4($namespace.'\\Original\\', __DIR__.'/'.$path.'/src'); } // Individuazione dei percorsi di base diff --git a/include/src/Components/MorphTrait.php b/include/src/Components/MorphTrait.php index 7d7df8a70..88df1408e 100644 --- a/include/src/Components/MorphTrait.php +++ b/include/src/Components/MorphTrait.php @@ -6,7 +6,7 @@ trait MorphTrait { public function hasOriginal() { - return !empty($this->original_type) && !empty($this->original); + return !empty($this->original_type) && !empty($this->getOriginal()); } public function original() diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php index 0d53dadec..67a8be262 100644 --- a/modules/articoli/actions.php +++ b/modules/articoli/actions.php @@ -39,7 +39,6 @@ switch (post('op')) { // Modifica articolo case 'update': - $componente = post('componente_filename'); $qta = post('qta'); // Inserisco l'articolo e avviso se esiste un altro articolo con stesso codice. @@ -50,27 +49,29 @@ switch (post('op')) { ])); } - $dbo->update('mg_articoli', [ - 'codice' => post('codice'), - 'descrizione' => post('descrizione'), - 'um' => post('um'), - 'id_categoria' => post('categoria'), - 'id_sottocategoria' => post('subcategoria'), - 'abilita_serial' => post('abilita_serial'), - 'threshold_qta' => post('threshold_qta'), - 'prezzo_vendita' => post('prezzo_vendita'), - 'prezzo_acquisto' => post('prezzo_acquisto'), - 'idconto_vendita' => post('idconto_vendita'), - 'idconto_acquisto' => post('idconto_acquisto'), - 'idiva_vendita' => post('idiva_vendita'), - 'gg_garanzia' => post('gg_garanzia'), - 'servizio' => post('servizio'), - 'volume' => post('volume'), - 'peso_lordo' => post('peso_lordo'), - 'componente_filename' => $componente, - 'attivo' => post('attivo'), - 'note' => post('note'), - ], ['id' => $id_record]); + $articolo->codice = post('codice'); + $articolo->descrizione = post('descrizione'); + $articolo->um = post('um'); + $articolo->id_categoria = post('categoria'); + $articolo->id_sottocategoria = post('subcategoria'); + $articolo->abilita_serial = post('abilita_serial'); + $articolo->threshold_qta = post('threshold_qta'); + $articolo->prezzo_vendita = post('prezzo_vendita'); + $articolo->prezzo_acquisto = post('prezzo_acquisto'); + $articolo->idconto_vendita = post('idconto_vendita'); + $articolo->idconto_acquisto = post('idconto_acquisto'); + $articolo->idiva_vendita = post('idiva_vendita'); + $articolo->gg_garanzia = post('gg_garanzia'); + $articolo->servizio = post('servizio'); + $articolo->volume = post('volume'); + $articolo->peso_lordo = post('peso_lordo'); + + $componente = post('componente_filename'); + $articolo->componente_filename = $componente; + $articolo->attivo = post('attivo'); + $articolo->note = post('note'); + + $articolo->save(); // Leggo la quantità attuale per capire se l'ho modificata $old_qta = $record['qta']; @@ -80,12 +81,12 @@ switch (post('op')) { $descrizione_movimento = post('descrizione_movimento'); $data_movimento = post('data_movimento'); - add_movimento_magazzino($id_record, $movimento, [], $descrizione_movimento, $data_movimento); + $articolo->movimenta($movimento, $descrizione_movimento, $data_movimento); } // Salvataggio info componente (campo `contenuto`) if (!empty($componente)) { - $contenuto = \Util\Ini::write(file_get_contents($docroot.'/files/my_impianti/'.$componente), $post); + $contenuto = \Util\Ini::write(file_get_contents(DOCROOT.'/files/my_impianti/'.$componente), $post); $dbo->query('UPDATE mg_articoli SET contenuto='.prepare($contenuto).' WHERE id='.prepare($id_record)); } @@ -107,9 +108,7 @@ switch (post('op')) { 'id' => $id_record, ]); } else { - flash()->warning(tr('Errore durante il caricamento del file in _DIR_!', [ - '_DIR_' => $upload_dir, - ])); + flash()->warning(tr("Errore durante il caricamento dell'immagine!")); } } @@ -174,10 +173,10 @@ switch (post('op')) { // Movimento il magazzino se l'ho specificato nelle impostazioni if (setting("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) { - add_movimento_magazzino($id_record, $count, [], tr('Carico magazzino con serial da _INIZIO_ a _FINE_', [ + $articolo->movimenta($count, tr('Carico magazzino con serial da _INIZIO_ a _FINE_', [ '_INIZIO_' => $serial_start, '_FINE_' => $serial_end, - ])); + ]), date()); } flash()->info(tr('Aggiunti _NUM_ seriali!', [ @@ -200,9 +199,9 @@ switch (post('op')) { if ($dbo->query($query)) { // Movimento il magazzino se l'ho specificato nelle impostazioni if (setting("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) { - add_movimento_magazzino($id_record, -1, [], tr('Eliminazione dal magazzino del prodotto con serial _SERIAL_', [ + $articolo->movimenta(-1, tr('Eliminazione dal magazzino del prodotto con serial _SERIAL_', [ '_SERIAL_' => $rs[0]['serial'], - ])); + ]), date()); } flash()->info(tr('Prodotto rimosso!')); diff --git a/modules/articoli/edit.php b/modules/articoli/edit.php index 90cd8448f..29ba00fd3 100644 --- a/modules/articoli/edit.php +++ b/modules/articoli/edit.php @@ -142,7 +142,7 @@ $_SESSION['superselect']['id_categoria'] = $record['id_categoria'];
- +
@@ -311,7 +311,7 @@ function scorpora_iva() { $("#scorpora_iva").click( function(){ scorpora_iva(); -}); +}); diff --git a/modules/articoli/init.php b/modules/articoli/init.php index 57b0e4cb9..0df6de591 100644 --- a/modules/articoli/init.php +++ b/modules/articoli/init.php @@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php'; use Modules\Articoli\Articolo; if (isset($id_record)) { - $record = $dbo->fetchOne('SELECT *, (SELECT COUNT(id) FROM mg_prodotti WHERE id_articolo = mg_articoli.id) AS serial FROM mg_articoli WHERE id='.prepare($id_record)); - $articolo = Articolo::find($id_record); + + $record = $dbo->fetchOne('SELECT *, (SELECT COUNT(id) FROM mg_prodotti WHERE id_articolo = mg_articoli.id) AS serial FROM mg_articoli WHERE id='.prepare($id_record)); } diff --git a/modules/articoli/modutil.php b/modules/articoli/modutil.php index 385d94651..360ff8875 100644 --- a/modules/articoli/modutil.php +++ b/modules/articoli/modutil.php @@ -2,8 +2,12 @@ include_once __DIR__.'/../../core.php'; +use Modules\Articoli\Articolo; + /** * Funzione per inserire i movimenti di magazzino. + * + * @deprecated */ function add_movimento_magazzino($id_articolo, $qta, $array = [], $descrizone = '', $data = '') { @@ -18,7 +22,6 @@ function add_movimento_magazzino($id_articolo, $qta, $array = [], $descrizone = $numero = null; // Informazioni articolo - $articolo = $dbo->fetchOne('SELECT * FROM mg_articoli WHERE id='.prepare($id_articolo)); $manuale = 0; // Ddt @@ -78,23 +81,14 @@ function add_movimento_magazzino($id_articolo, $qta, $array = [], $descrizone = $movimento .= $descrizone; $movimento = str_replace(['_NAME_', '_TYPE_', '_NUM_'], [$nome, $tipo, $numero], $movimento); - $new = ($qta > 0 ? '+' : '').$qta; - // Movimento il magazzino solo se l'articolo non è un servizio - if ($articolo['servizio'] == 0) { - // Movimentazione effettiva - if (empty($array['idintervento'])) { - $dbo->query('UPDATE mg_articoli SET qta = qta + '.$new.' WHERE id = '.prepare($id_articolo)); - } + $articolo = Articolo::find($id_articolo); - // Registrazione della movimentazione - $dbo->insert('mg_movimenti', array_merge($array, [ - 'idarticolo' => $id_articolo, - 'qta' => $qta, - 'movimento' => $movimento, - 'data' => $data, - 'manuale' => $manuale, - ])); + // Movimentazione effettiva + if (empty($array['idintervento'])) { + return $articolo->movimenta($qta, $movimento, $data, $manuale, $array); + } else { + return $articolo->registra($qta, $movimento, $data, $manuale, $array); } return true; diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php index 8848e430b..168539ca5 100644 --- a/modules/articoli/src/Articolo.php +++ b/modules/articoli/src/Articolo.php @@ -33,6 +33,8 @@ class Articolo extends Model $this->qta += $qta; $this->save(); + + $this->movimentaRicorsivo($qta, $descrizone, $data, $manuale, $array); } return true; @@ -116,4 +118,45 @@ class Articolo extends Model { return $this->belongsTo(Categoria::class, 'id_sottocategoria'); } + + /** + * @version distinta_base + * + * @return mixed + */ + public function componenti() + { + return $this->belongsToMany(Articolo::class, 'mg_articoli_distinte', 'id_articolo', 'id_figlio')->withPivot('qta'); + } + + public function parti() + { + return $this->belongsToMany(Articolo::class, 'mg_articoli_distinte', 'id_figlio', 'id_articolo')->withPivot('qta'); + } + + /** + * Funzione per inserire i movimenti di magazzino. + * + * @version distinta_base + * + * @param $qta + * @param null $descrizone + * @param null $data + * @param bool $manuale + * @param array $array + * + * @return bool + */ + protected function movimentaRicorsivo($qta, $descrizone = null, $data = null, $manuale = false, $array = []) + { + $componenti = $this->componenti; + + $suffix = ' (di.ba.)'; + $descrizone = strpos($descrizone, $suffix) !== false ? $descrizone : $descrizone.$suffix; + + foreach ($componenti as $componente) { + $qta_componente = $qta * $componente->pivot->qta; + $componente->movimenta($qta_componente, $descrizone, $data, $manuale, $array); + } + } } diff --git a/modules/ddt/modutil.php b/modules/ddt/modutil.php index 69ac2dba2..a9b488c36 100755 --- a/modules/ddt/modutil.php +++ b/modules/ddt/modutil.php @@ -92,6 +92,8 @@ function get_ivaindetraibile_ddt($id_ddt) * Questa funzione rimuove un articolo dal ddt data e lo riporta in magazzino * $idarticolo integer codice dell'articolo da scollegare dal ddt * $idddt integer codice del ddt da cui scollegare l'articolo. + * + * @deprecated */ function rimuovi_articolo_daddt($idarticolo, $idddt, $idrigaddt) { @@ -243,6 +245,8 @@ function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto * $idiva integer id del codice iva associato all'articolo * $qta float quantità dell'articolo nell'ordine * $prezzo float prezzo totale degli articoli (prezzounitario*qtà). + * + * @deprecated */ function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $idum, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT') { diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index 025ec53e8..1ac0e8281 100644 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -622,7 +622,9 @@ if ($dir == 'entrata') {
filepath('row-list.php'); + ?>
diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php index 0c3866410..42b2dbe7b 100644 --- a/modules/fatture/modutil.php +++ b/modules/fatture/modutil.php @@ -357,6 +357,8 @@ function ricalcola_costiagg_fattura($iddocumento) * $qta float quantità dell'articolo in fattura * $prezzo float prezzo totale dell'articolo (prezzounitario*qtà) * $idintervento integer id dell'intervento da cui arriva l'articolo (per non creare casini quando si rimuoverà un articolo dalla fattura). + * + * @deprecated */ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $idconto = 0, $idum = 0, $idrivalsainps = '', $idritenutaacconto = '', $calcolo_ritenuta_acconto = '') { diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index d7ed6ef67..ca15be181 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -183,6 +183,7 @@ switch (post('op')) { flash()->clearMessage('info'); flash()->clearMessage('warning'); } + aggiorna_sedi_movimenti('interventi', $id_record); break; @@ -194,32 +195,8 @@ switch (post('op')) { 'id_record' => $id_record, ]); - $codice = $dbo->fetchArray('SELECT codice FROM in_interventi WHERE id='.prepare($id_record))[0]['codice']; - - /* - Riporto in magazzino gli articoli presenti nell'intervento in cancellazine - */ - // Leggo la quantità attuale nell'intervento - $q = 'SELECT qta, idarticolo FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record); - $rs = $dbo->fetchArray($q); - - for ($i = 0; $i < count($rs); ++$i) { - $qta = $rs[$i]['qta']; - $idarticolo = $rs[$i]['idarticolo']; - - add_movimento_magazzino($idarticolo, $qta, ['idintervento' => $id_record]); - } - // Eliminazione associazioni tra interventi e contratti - $query = 'UPDATE co_promemoria SET idintervento = NULL WHERE idintervento='.prepare($id_record); - $dbo->query($query); - - // Eliminazione dell'intervento - $query = 'DELETE FROM in_interventi WHERE id='.prepare($id_record); - $dbo->query($query); - - // Elimino i collegamenti degli articoli a questo intervento - $dbo->query('DELETE FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record)); + $dbo->query('UPDATE co_promemoria SET idintervento = NULL WHERE idintervento='.prepare($id_record)); // Elimino il collegamento al componente $dbo->query('DELETE FROM my_impianto_componenti WHERE idintervento='.prepare($id_record)); @@ -228,23 +205,15 @@ switch (post('op')) { $query = 'DELETE FROM in_interventi_tecnici WHERE idintervento='.prepare($id_record); $dbo->query($query); - // Eliminazione righe aggiuntive dell'intervento - $query = 'DELETE FROM in_righe_interventi WHERE idintervento='.prepare($id_record); - $dbo->query($query); - - // Eliminazione associazione interventi e articoli - $query = 'DELETE FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record); - $dbo->query($query); - // Eliminazione associazione interventi e my_impianti $query = 'DELETE FROM my_impianti_interventi WHERE idintervento='.prepare($id_record); $dbo->query($query); - // Eliminazione movimenti riguardanti l'intervento cancellato - $dbo->query('DELETE FROM mg_movimenti WHERE idintervento='.prepare($id_record)); + // Eliminazione dell'intervento + $intervento->delete(); flash()->info(tr('Intervento _NUM_ eliminato!', [ - '_NUM_' => "'".$codice."'", + '_NUM_' => "'".$intervento->codice."'", ])); break; @@ -321,9 +290,22 @@ switch (post('op')) { aggiorna_sedi_movimenti('interventi', $id_record); break; - case 'delriga': - $idriga = post('idriga'); - $dbo->query('DELETE FROM in_righe_interventi WHERE id='.prepare($idriga)); + case 'unlink_riga': + $id_riga = post('idriga'); + + if (!empty($id_riga)) { + $riga = $intervento->getRighe()->find($id_riga); + + try { + $riga->delete(); + + flash()->info(tr('Riga rimossa!')); + } catch (InvalidArgumentException $e) { + flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); + } + } + + aggiorna_sedi_movimenti('interventi', $id_record); break; @@ -412,33 +394,6 @@ switch (post('op')) { break; - case 'unlink_articolo': - $idriga = post('idriga'); - $idarticolo = post('idarticolo'); - - // Riporto la merce nel magazzino - if (!empty($idriga) && !empty($id_record)) { - // Leggo la quantità attuale nell'intervento - $q = 'SELECT qta, idarticolo, idimpianto FROM mg_articoli_interventi WHERE id='.prepare($idriga); - $rs = $dbo->fetchArray($q); - $qta = $rs[0]['qta']; - $idarticolo = $rs[0]['idarticolo']; - $idimpianto = $rs[0]['idimpianto']; - - add_movimento_magazzino($idarticolo, $qta, ['idintervento' => $id_record]); - - // Elimino questo articolo dall'intervento - $dbo->query('DELETE FROM mg_articoli_interventi WHERE id='.prepare($idriga).' AND idintervento='.prepare($id_record)); - - // Elimino il collegamento al componente - $dbo->query('DELETE FROM my_impianto_componenti WHERE idimpianto='.prepare($idimpianto).' AND idintervento='.prepare($id_record)); - - // Elimino i seriali utilizzati dalla riga - $dbo->query('DELETE FROM `mg_prodotti` WHERE id_articolo = '.prepare($idarticolo).' AND id_riga_intervento = '.prepare($id_record)); - } - aggiorna_sedi_movimenti('interventi', $id_record); - break; - case 'add_serial': $idriga = post('idriga'); $idarticolo = post('idarticolo'); diff --git a/modules/interventi/ajax_righe.php b/modules/interventi/ajax_righe.php index 4bf5fc191..b133f46f5 100644 --- a/modules/interventi/ajax_righe.php +++ b/modules/interventi/ajax_righe.php @@ -10,7 +10,7 @@ if (file_exists(__DIR__.'/../../../core.php')) { $show_prezzi = Auth::user()['gruppo'] != 'Tecnici' || (Auth::user()['gruppo'] == 'Tecnici' && setting('Mostra i prezzi al tecnico')); -$intervento = Intervento::find($id_record); +$intervento = $intervento ?: Intervento::find($id_record); $righe = $intervento->getRighe(); if (!$righe->isEmpty()) { @@ -136,7 +136,7 @@ if (!$righe->isEmpty()) { - '; @@ -157,7 +157,12 @@ if (!$righe->isEmpty()) { diff --git a/modules/interventi/src/Components/Articolo.php b/modules/interventi/src/Components/Articolo.php index 73663189f..778e537a3 100644 --- a/modules/interventi/src/Components/Articolo.php +++ b/modules/interventi/src/Components/Articolo.php @@ -38,8 +38,6 @@ class Articolo extends Article { $articolo = $this->articolo; - $dbo = database(); - $intervento = $this->intervento; $numero = $intervento->codice; @@ -49,7 +47,7 @@ class Articolo extends Article $data = $data ?: $intervento->data_richiesta; - $descrizione = ($qta < 0) ? tr('Ripristino articolo da intervento _NUM_', [ + $descrizione = ($qta < 0) ? tr('Ripristino articolo da Attività numero _NUM_', [ '_NUM_' => $numero, ]) : tr('Scarico magazzino per intervento _NUM_', [ '_NUM_' => $numero,