@@ -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()) {
-