From 6e28fcb6a35c6e7e14500750f7aad28ad78fd5e2 Mon Sep 17 00:00:00 2001
From: Thomas Zilio <Dasc3er@users.noreply.github.com>
Date: Fri, 19 Apr 2019 11:52:02 -0700
Subject: [PATCH] Miglioramento duplicazioni

---
 include/src/Components/Row.php  |   2 +-
 modules/articoli/actions.php    |   9 +--
 modules/articoli/init.php       |   4 ++
 modules/contratti/actions.php   |  28 ++++-----
 modules/fatture/modutil.php     |   2 +-
 modules/fatture/src/Fattura.php | 100 ++++++++++++++++----------------
 modules/preventivi/actions.php  |  29 ++++-----
 plugins/importFE/actions.php    |   1 -
 plugins/importFE/list.php       |  12 ++--
 9 files changed, 88 insertions(+), 99 deletions(-)

diff --git a/include/src/Components/Row.php b/include/src/Components/Row.php
index 34f9d38eb..32a8af6b2 100644
--- a/include/src/Components/Row.php
+++ b/include/src/Components/Row.php
@@ -143,7 +143,7 @@ abstract class Row extends Description
             $this->prezzo_unitario_vendita_riga = $this->attributes['subtotale'] / $this->qta;
         }
 
-        return !is_nan($this->prezzo_unitario_vendita_riga) ?  $this->prezzo_unitario_vendita_riga : 0;
+        return !is_nan($this->prezzo_unitario_vendita_riga) ? $this->prezzo_unitario_vendita_riga : 0;
     }
 
     /**
diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php
index 4905cca60..70573b88b 100644
--- a/modules/articoli/actions.php
+++ b/modules/articoli/actions.php
@@ -117,12 +117,9 @@ switch (post('op')) {
 
     // Duplica articolo
     case 'copy':
-        $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM mg_articoli WHERE id = '.prepare($id_record));
-        $dbo->query('ALTER TABLE tmp DROP id');
-        $dbo->query('INSERT INTO mg_articoli SELECT NULL,tmp.* FROM tmp');
-        $id_record = $dbo->lastInsertedID();
-        $dbo->query('DROP TEMPORARY TABLE tmp');
-        $dbo->query('UPDATE mg_articoli SET qta=0 WHERE id='.prepare($id_record));
+        $new = $articolo->replicate();
+        $new->qta = 0;
+        $new->save();
 
         flash()->info(tr('Articolo duplicato correttamente!'));
 
diff --git a/modules/articoli/init.php b/modules/articoli/init.php
index 6b47270b1..57b0e4cb9 100644
--- a/modules/articoli/init.php
+++ b/modules/articoli/init.php
@@ -2,6 +2,10 @@
 
 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);
 }
diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php
index 2f5fc174d..43fd2b225 100644
--- a/modules/contratti/actions.php
+++ b/modules/contratti/actions.php
@@ -129,26 +129,20 @@ switch (post('op')) {
 
      // Duplica contratto
     case 'copy':
-        $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_contratti WHERE id = '.prepare($id_record));
-        $dbo->query('ALTER TABLE tmp DROP id');
-        $dbo->query('INSERT INTO co_contratti SELECT NULL,tmp.* FROM tmp');
-        $id_record = $dbo->lastInsertedID();
-        $dbo->query('DROP TEMPORARY TABLE tmp');
+        $new = $contratto->replicate();
+        $new->idstato = 1;
+        $new->save();
 
-        // Codice contratto: calcolo il successivo in base al formato specificato
-        $numero = Contratto::getNextNumero();
+        $id_record = $new->id;
 
-        $dbo->query('UPDATE co_contratti SET idstato=1, numero = '.prepare($numero).' WHERE id='.prepare($id_record));
+        $righe = $preventivo->getRighe();
+        foreach ($righe as $riga) {
+            $new_riga = $riga->replicate();
+            $new_riga->setParent($new);
 
-        //copio anche le righe del preventivo
-        $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_righe_contratti WHERE idcontratto = '.filter('id_record'));
-        $dbo->query('ALTER TABLE tmp DROP id');
-        $dbo->query('UPDATE tmp SET idcontratto = '.prepare($id_record));
-        $dbo->query('INSERT INTO co_righe_contratti SELECT NULL,tmp.* FROM tmp');
-        $dbo->query('DROP TEMPORARY TABLE tmp');
-
-        //Azzero eventuale quantità evasa
-        $dbo->query('UPDATE co_righe_contratti SET qta_evasa=0 WHERE id='.prepare($id_record));
+            $new_riga->qta_evasa = 0;
+            $new_riga->save();
+        }
 
         flash()->info(tr('Contratto duplicato correttamente!'));
 
diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php
index d5b66d0d6..da45ec57a 100755
--- a/modules/fatture/modutil.php
+++ b/modules/fatture/modutil.php
@@ -450,7 +450,7 @@ function get_new_idmastrino($table = 'co_movimenti')
 /**
  * Ricalcola i costi aggiuntivi in fattura (rivalsa inps, ritenuta d'acconto, marca da bollo)
  * Deve essere eseguito ogni volta che si aggiunge o toglie una riga
- * $iddocumento		int		ID della fattura
+ * $iddocumento		int		ID della fattura.
  */
 function ricalcola_costiagg_fattura($iddocumento)
 {
diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php
index d4b67fe78..460d7087e 100644
--- a/modules/fatture/src/Fattura.php
+++ b/modules/fatture/src/Fattura.php
@@ -381,55 +381,6 @@ class Fattura extends Document
     {
         database()->delete('co_scadenziario', ['iddocumento' => $this->id]);
     }
-    
-    protected function calcolaMarcaDaBollo(){
-        $righe_bollo = $this->getRighe()->filter(function ($item, $key) {
-            return $item->aliquota != null && in_array($item->aliquota->codice_natura_fe, ['N1', 'N2', 'N3', 'N4']);
-        });
-        $importo_righe_bollo = $righe_bollo->sum('netto');
-
-        // Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
-        $bollo = ($this->direzione == 'uscita') ? $this->bollo : setting('Importo marca da bollo');
-
-        $marca_da_bollo = 0;
-        if (abs($bollo) > 0 && abs($importo_righe_bollo) > setting("Soglia minima per l'applicazione della marca da bollo")) {
-            $marca_da_bollo = $bollo;
-        }
-
-        // Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo
-        $marca_da_bollo = abs($marca_da_bollo);
-
-        $this->bollo = $marca_da_bollo;
-
-        $riga = $this->rigaBollo;
-
-        // Rimozione riga bollo se nullo
-        if (empty($this->addebita_bollo) || empty($marca_da_bollo) ){
-            if (!empty($riga)){
-                $this->id_riga_bollo = null;
-
-                $riga->delete();
-            }
-
-            return;
-        }
-
-        // Creazione riga bollo se non presente
-        if(empty($riga)){
-            $riga = Components\Riga::build($this);
-            $riga->save();
-
-            $this->id_riga_bollo = $riga->id;
-        }
-
-        $riga->prezzo_unitario_vendita = $marca_da_bollo;
-        $riga->qta = 1;
-        $riga->descrizione = setting('Descrizione addebito bollo');
-        $riga->id_iva = setting('Iva da applicare su marca da bollo');
-        $riga->idconto = setting('Conto predefinito per la marca da bollo');
-
-        $riga->save();
-    }
 
     /**
      * Salva la fattura, impostando i campi dipendenti dai singoli parametri.
@@ -451,7 +402,6 @@ class Fattura extends Document
         return parent::save($options);
     }
 
-
     /**
      * Restituisce l'elenco delle note di credito collegate.
      *
@@ -537,4 +487,54 @@ class Fattura extends Document
 
         return $numero;
     }
+
+    protected function calcolaMarcaDaBollo()
+    {
+        $righe_bollo = $this->getRighe()->filter(function ($item, $key) {
+            return $item->aliquota != null && in_array($item->aliquota->codice_natura_fe, ['N1', 'N2', 'N3', 'N4']);
+        });
+        $importo_righe_bollo = $righe_bollo->sum('netto');
+
+        // Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
+        $bollo = ($this->direzione == 'uscita') ? $this->bollo : setting('Importo marca da bollo');
+
+        $marca_da_bollo = 0;
+        if (abs($bollo) > 0 && abs($importo_righe_bollo) > setting("Soglia minima per l'applicazione della marca da bollo")) {
+            $marca_da_bollo = $bollo;
+        }
+
+        // Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo
+        $marca_da_bollo = abs($marca_da_bollo);
+
+        $this->bollo = $marca_da_bollo;
+
+        $riga = $this->rigaBollo;
+
+        // Rimozione riga bollo se nullo
+        if (empty($this->addebita_bollo) || empty($marca_da_bollo)) {
+            if (!empty($riga)) {
+                $this->id_riga_bollo = null;
+
+                $riga->delete();
+            }
+
+            return;
+        }
+
+        // Creazione riga bollo se non presente
+        if (empty($riga)) {
+            $riga = Components\Riga::build($this);
+            $riga->save();
+
+            $this->id_riga_bollo = $riga->id;
+        }
+
+        $riga->prezzo_unitario_vendita = $marca_da_bollo;
+        $riga->qta = 1;
+        $riga->descrizione = setting('Descrizione addebito bollo');
+        $riga->id_iva = setting('Iva da applicare su marca da bollo');
+        $riga->idconto = setting('Conto predefinito per la marca da bollo');
+
+        $riga->save();
+    }
 }
diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php
index 7467a43b5..482b5138b 100644
--- a/modules/preventivi/actions.php
+++ b/modules/preventivi/actions.php
@@ -99,26 +99,21 @@ switch (post('op')) {
 
     // Duplica preventivo
     case 'copy':
-        $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_preventivi WHERE id = '.prepare($id_record));
-        $dbo->query('ALTER TABLE tmp DROP id');
-        $dbo->query('INSERT INTO co_preventivi SELECT NULL,tmp.* FROM tmp');
-        $id_record = $dbo->lastInsertedID();
-        $dbo->query('DROP TEMPORARY TABLE tmp');
+        $new = $preventivo->replicate();
+        $new->idstato = 1;
+        $new->master_revision = $preventivo->id;
+        $new->save();
 
-        // Codice preventivo: calcolo il successivo in base al formato specificato
-        $numero = Preventivo::getNextNumero();
+        $id_record = $new->id;
 
-        $dbo->query('UPDATE co_preventivi SET idstato=1, numero = '.prepare($numero).', master_revision = id WHERE id='.prepare($id_record));
+        $righe = $preventivo->getRighe();
+        foreach ($righe as $riga) {
+            $new_riga = $riga->replicate();
+            $new_riga->setParent($new);
 
-        //copio anche le righe del preventivo
-        $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_righe_preventivi WHERE idpreventivo = '.filter('id_record'));
-        $dbo->query('ALTER TABLE tmp DROP id');
-        $dbo->query('UPDATE tmp SET idpreventivo = '.prepare($id_record));
-        $dbo->query('INSERT INTO co_righe_preventivi SELECT NULL,tmp.* FROM tmp');
-        $dbo->query('DROP TEMPORARY TABLE tmp');
-
-        //Azzero eventuale quantità evasa
-        $dbo->query('UPDATE co_righe_preventivi SET qta_evasa=0 WHERE id='.prepare($id_record));
+            $new_riga->qta_evasa = 0;
+            $new_riga->save();
+        }
 
         flash()->info(tr('Preventivo duplicato correttamente!'));
 
diff --git a/plugins/importFE/actions.php b/plugins/importFE/actions.php
index 8ba913ecc..55519f194 100644
--- a/plugins/importFE/actions.php
+++ b/plugins/importFE/actions.php
@@ -99,5 +99,4 @@ switch (filter('op')) {
         }
 
         break;
-
 }
diff --git a/plugins/importFE/list.php b/plugins/importFE/list.php
index 5e3cfaa03..9b2faee52 100644
--- a/plugins/importFE/list.php
+++ b/plugins/importFE/list.php
@@ -29,7 +29,7 @@ if (!empty($list)) {
                 <button type="button" class="btn btn-danger" onclick="delete_fe(this, \''.$element.'\')">
                     <i class="fa fa-trash"></i>
                 </button>';
-        }else{
+        } else {
             echo '
                 <button type="button" class="btn btn-info" onclick="process_fe(this, \''.$element.'\')">
                     <i class="fa fa-upload"></i>
@@ -87,8 +87,8 @@ function download(button, file) {
 
 function delete_fe(button, file) {
     swal({
-        title: "'.tr("Rimuovere la fattura salvata localmente?").'",
-        html: "'.tr("Sarà possibile inserirla nuovamente nel gestionale attraverso il caricamento").'",
+        title: "'.tr('Rimuovere la fattura salvata localmente?').'",
+        html: "'.tr('Sarà possibile inserirla nuovamente nel gestionale attraverso il caricamento').'",
         type: "error",
         showCancelButton: true,
         confirmButtonText: "'.tr('Sì').'"
@@ -100,12 +100,12 @@ function delete_fe(button, file) {
             type: "get",
             data: {
                 id_module: globals.id_module,
-                id_plugin: ' . $id_plugin . ',
+                id_plugin: '.$id_plugin.',
                 op: "delete",
                 name: file,
             },
             success: function(data) {
-                $("#list").load("' . $structure->fileurl('list.php') . '?id_module=' . $id_module . '&id_plugin=' . $id_plugin . '", function() {
+                $("#list").load("'.$structure->fileurl('list.php').'?id_module='.$id_module.'&id_plugin='.$id_plugin.'", function() {
                     buttonRestore(button, restore);
                 });
             }
@@ -115,7 +115,7 @@ function delete_fe(button, file) {
 
 function process_fe(button, file) {
     swal({
-        title: "'.tr("Segnare la fattura come processata?").'",
+        title: "'.tr('Segnare la fattura come processata?').'",
         html: "'.tr("Non sarà possibile individuarla nuovamente in modo automatico: l'unico modo per recuperarla sarà contattare l'assistenza").'",
         type: "info",
         showCancelButton: true,