From 018b716d710a631d60d1c4f53f5a655e72df7033 Mon Sep 17 00:00:00 2001 From: Luca Date: Fri, 26 Feb 2021 15:47:20 +0100 Subject: [PATCH] Correzione procedura di importazione Aggiunto controllo sulla chiave primaria se impostata. Corretta l'importazione degli articoli con dettaglio prezzi, --- modules/articoli/src/Import/CSV.php | 165 +++++++++++++++++----------- modules/import/actions.php | 6 +- modules/import/edit.php | 21 +++- src/Importer/CSVImporter.php | 33 ++++-- 4 files changed, 150 insertions(+), 75 deletions(-) diff --git a/modules/articoli/src/Import/CSV.php b/modules/articoli/src/Import/CSV.php index 2adf6f4e8..bc47d4c0a 100644 --- a/modules/articoli/src/Import/CSV.php +++ b/modules/articoli/src/Import/CSV.php @@ -35,8 +35,6 @@ use Plugins\DettagliArticolo\DettaglioPrezzo; */ class CSV extends CSVImporter { - protected $id_articoli_processati; - public function getAvailableFields() { return [ @@ -167,11 +165,51 @@ class CSV extends CSVImporter ]; } + /** + * Procedura di inizializzazione per l'importazione. + * Effettua una rimozione di tutti i dettagli prezzi per le coppie Articolo - Anagrafica presenti nel CSV. + * + * @return mixed|void + */ + public function init() + { + $database = database(); + $primary_key = $this->getPrimaryKey(); + + // Count the numbers of rows in a CSV + $number = $this->csv->each(function ($row) { + return true; + }); + + $rows = $this->getRows(0, $number); + $first_record = $this->getRecord($rows[1]); + if (!isset($first_record['anagrafica_listino']) || empty($this->getPrimaryKey())) { + return; + } + + foreach ($rows as $row) { + // Interpretazione secondo la selezione + $record = $this->getRecord($row); + if (empty($record['anagrafica_listino'])) { + continue; + } + + $articolo = Articolo::where($primary_key, $record[$primary_key]) + ->first(); + $anagrafica = Anagrafica::where('ragione_sociale', $record['anagrafica_listino']) + ->first(); + if (empty($articolo) || empty($anagrafica)) { + continue; + } + + $database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id)); + } + } + public function import($record) { $database = database(); $primary_key = $this->getPrimaryKey(); - $anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); // Fix per campi con contenuti derivati da query implicite if (!empty($record['id_fornitore'])) { @@ -179,107 +217,82 @@ class CSV extends CSVImporter } // Gestione categoria e sottocategoria - $obj_categoria = null; + $categoria = null; + $sotto_categoria = null; if (!empty($record['id_categoria'])) { // Categoria - $obj_categoria = Categoria::where('nome', strtolower($record['id_categoria']))->first(); + $categoria = Categoria::where('nome', strtolower($record['id_categoria']))->first(); - if (empty($obj_categoria)) { - $obj_categoria = Categoria::build($record['id_categoria']); + if (empty($categoria)) { + $categoria = Categoria::build($record['id_categoria']); } // Sotto-categoria - $obj_sottocategoria = null; if (!empty($record['id_sottocategoria'])) { - $obj_sottocategoria = Categoria::where('nome', $record['id_sottocategoria']) - ->where('parent', $obj_categoria->id) + $sotto_categoria = Categoria::where('nome', $record['id_sottocategoria']) + ->where('parent', $categoria->id) ->first(); if (empty($sottocategoria)) { - $obj_sottocategoria = Categoria::build($record['id_categoria']); - $obj_sottocategoria->parent()->associate($obj_categoria); - $obj_sottocategoria->save(); + $sotto_categoria = Categoria::build($record['id_categoria']); + $sotto_categoria->parent()->associate($categoria); + $sotto_categoria->save(); } } } - unset($record['id_categoria']); - unset($record['id_sottocategoria']); // Individuazione dell'IVA di vendita tramite il relativo Codice $aliquota = null; if (!empty($record['codice_iva_vendita'])) { $aliquota = Aliquota::where('codice', $record['codice_iva_vendita'])->first(); } - unset($record['codice_iva_vendita']); // Individuazione articolo e generazione - $articolo = Articolo::where($primary_key, $record[$primary_key])->first(); + $articolo = null; + // Ricerca sulla base della chiave primaria se presente + if (!empty($primary_key)) { + $articolo = Articolo::where($primary_key, $record[$primary_key])->first(); + } if (empty($articolo)) { - $articolo = Articolo::build($record['codice'], $record['descrizione'], $obj_categoria, $obj_sottocategoria); + $articolo = Articolo::build($record['codice'], $record['descrizione'], $categoria, $sotto_categoria); } $articolo->idiva_vendita = $aliquota->id; $articolo->attivo = 1; // Prezzo di vendita - $articolo->setPrezzoVendita($record['prezzo_vendita'], ($aliquota->id ? $aliquota->id : setting('Iva predefinita'))); - unset($record['prezzo_vendita']); + $articolo->setPrezzoVendita($record['prezzo_vendita'], $aliquota->id ? $aliquota->id : setting('Iva predefinita')); // Esportazione della quantità indicata $qta_registrata = (float) ($record['qta']); $nome_sede = $record['nome_sede']; - unset($record['qta']); - unset($record['nome_sede']); + // Salvataggio delle informazioni generali + $articolo->fill([ + 'codice' => $record['codice'], + 'descrizione' => $record['descrizione'], + 'prezzo_acquisto' => $record['prezzo_acquisto'], + 'peso_lordo' => $record['peso_lordo'], + 'volume' => $record['volume'], + 'barcode' => $record['barcode'], + 'id_fornitore' => $record['id_fornitore'], + 'ubicazione' => $record['ubicazione'], + 'note' => $record['note'], + ]); + $articolo->save(); + + // Aggiornamento dettaglio prezzi $dettagli['anagrafica_listino'] = $record['anagrafica_listino']; $dettagli['qta_minima'] = $record['qta_minima']; $dettagli['qta_massima'] = $record['qta_massima']; $dettagli['prezzo_listino'] = $record['prezzo_listino']; $dettagli['sconto_listino'] = $record['sconto_listino']; $dettagli['dir'] = $record['dir']; - unset($record['anagrafica_listino']); - unset($record['qta_minima']); - unset($record['qta_massima']); - unset($record['prezzo_listino']); - unset($record['sconto_listino']); - unset($record['dir']); - - // Salvataggio delle informazioni generali - $articolo->fill($record); - $articolo->save(); - - // Listini - $anagrafica = Anagrafica::where('ragione_sociale', $dettagli['anagrafica_listino'])->first(); - - $dettagli['dir'] = strtolower($dettagli['dir']); - if ($dettagli['dir'] == 'fornitore') { - $dettagli['dir'] = 'uscita'; - } elseif ($dettagli['dir'] == 'cliente') { - $dettagli['dir'] = 'entrata'; - } else { - $dettagli['dir'] = null; - } - - if (!empty($anagrafica) && !empty($dettagli['dir'])) { - if (!in_array($articolo->id, $this->$id_articoli_processati)) { - $database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo='.prepare($articolo->id)); - } - $this->$id_articoli_processati[] = $articolo->id; - - $dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $dettagli['dir']); - $dettaglio_predefinito->sconto_percentuale = $dettagli['sconto_listino']; - $dettaglio_predefinito->setPrezzoUnitario($dettagli['prezzo_listino']); - - if ($dettagli['qta_minima'] !== null && !empty($dettagli['qta_massima'])) { - $dettaglio_predefinito->minimo = $dettagli['qta_minima']; - $dettaglio_predefinito->massimo = $dettagli['qta_massima']; - } - - $dettaglio_predefinito->save(); - } + $this->aggiornaDettaglioPrezzi($articolo, $dettagli); // Movimentazione della quantità registrata $giacenze = $articolo->getGiacenze(); + $anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); $id_sede = 0; if (!empty($nome_sede)) { $sede = Sede::where('nomesede', $nome_sede) @@ -305,4 +318,32 @@ class CSV extends CSVImporter ['00004', '719376861871', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Verdi', '1', '10', '20', '10', 'Cliente'], ]; } + + protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli) + { + // Listini + $anagrafica = Anagrafica::where('ragione_sociale', $dettagli['anagrafica_listino'])->first(); + + $dettagli['dir'] = strtolower($dettagli['dir']); + if ($dettagli['dir'] == 'fornitore') { + $dettagli['dir'] = 'uscita'; + } elseif ($dettagli['dir'] == 'cliente') { + $dettagli['dir'] = 'entrata'; + } else { + $dettagli['dir'] = null; + } + + if (!empty($anagrafica) && !empty($dettagli['dir'])) { + $dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $dettagli['dir']); + $dettaglio_predefinito->sconto_percentuale = $dettagli['sconto_listino']; + $dettaglio_predefinito->setPrezzoUnitario($dettagli['prezzo_listino']); + + if ($dettagli['qta_minima'] !== null && !empty($dettagli['qta_massima'])) { + $dettaglio_predefinito->minimo = $dettagli['qta_minima']; + $dettaglio_predefinito->massimo = $dettagli['qta_massima']; + } + + $dettaglio_predefinito->save(); + } + } } diff --git a/modules/import/actions.php b/modules/import/actions.php index 9ea20f718..bdb750684 100755 --- a/modules/import/actions.php +++ b/modules/import/actions.php @@ -69,7 +69,7 @@ switch (filter('op')) { // Inizializzazione del lettore CSV $csv = new $import_manager($record->filepath); foreach ($fields as $key => $value) { - $csv->setColumnAssociation($key, $value); + $csv->setColumnAssociation($key, $value - 1); } // Generazione offset sulla base della pagina @@ -82,10 +82,10 @@ switch (filter('op')) { // Gestione automatica dei valori convertiti $primary_key = post('primary_key'); - $csv->setPrimaryKey($primary_key); + $csv->setPrimaryKey($primary_key - 1); // Operazioni di inizializzazione per l'importazione - if (!isset($page) || $page == 0) { + if (!isset($page) || empty($page)) { $csv->init(); } diff --git a/modules/import/edit.php b/modules/import/edit.php index 317193cfe..432690b97 100755 --- a/modules/import/edit.php +++ b/modules/import/edit.php @@ -58,6 +58,7 @@ if (empty($id_record)) {
{[ "type": "checkbox", "label": "'.tr('Importa prima riga').'", "name": "include_first_row", "extra":"", "value": "1" ]}
+
{[ "type": "select", "label": "'.tr('Chiave primaria').'", "name": "primary_key", "values": '.json_encode($campi_disponibili).', "value": "'.$primary_key.'" ]}
@@ -160,9 +161,27 @@ $(document).ready(function() {'; }); function importPage(page) { + // Ricerca della chiave primaria tra i campi selezionati + let primary_key = input("primary_key").get(); + if (primary_key) { + let primary_key_found = false; + $("[name^=fields]").each(function() { + primary_key_found = primary_key_found || (input(this).get() == primary_key); + }); + + if (!primary_key_found) { + swal({ + title: "'.tr('Chiave primaria selezionata non presente tra i campi').'", + type: "error", + }); + + return; + } + } + $("#main_loading").show(); - data = { + let data = { id_module: "'.$id_module.'", id_plugin: "'.$id_plugin.'", id_record: "'.$id_record.'", diff --git a/src/Importer/CSVImporter.php b/src/Importer/CSVImporter.php index 82b984c26..4cac500fa 100644 --- a/src/Importer/CSVImporter.php +++ b/src/Importer/CSVImporter.php @@ -94,18 +94,10 @@ abstract class CSVImporter implements ImporterInterface public function importRows($offset, $length) { - $associations = $this->getColumnAssociations(); - $rows = $this->getRows($offset, $length); foreach ($rows as $row) { // Interpretazione della riga come record - $record = []; - foreach ($row as $key => $value) { - $field = isset($associations[$key]) ? $associations[$key] : null; - if (!empty($field)) { - $record[$field] = $value; - } - } + $record = $this->getRecord($row); // Importazione del record $this->import($record); @@ -139,4 +131,27 @@ abstract class CSVImporter implements ImporterInterface fclose($file); } + + /** + * Interpreta una riga del CSV secondo i campi impostati dinamicamente. + * + * @param $row + * + * @return array + */ + protected function getRecord($row) + { + $associations = $this->getColumnAssociations(); + + // Interpretazione della riga come record + $record = []; + foreach ($row as $key => $value) { + $field = isset($associations[$key]) ? $associations[$key] : null; + if (!empty($field)) { + $record[$field] = $value; + } + } + + return $record; + } }