From 970178fb929927b82b12e68e502fa02797529b35 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 6 Aug 2020 18:51:56 +0200 Subject: [PATCH] Aggiornamento della struttura di importazione CSV --- lib/util.php | 8 +- modules/anagrafiche/import.php | 268 ------------------------ modules/anagrafiche/src/Import/CSV.php | 273 +++++++++++++++++++++++++ modules/articoli/import.php | 242 ---------------------- modules/articoli/src/Import/CSV.php | 223 ++++++++++++++++++++ modules/import/actions.php | 100 ++++----- modules/import/add.php | 75 +++---- modules/import/edit.php | 67 +++--- modules/import/init.php | 8 +- src/Import.php | 134 ------------ src/Imports/CSVImport.php | 130 ++++++++++++ 11 files changed, 759 insertions(+), 769 deletions(-) delete mode 100755 modules/anagrafiche/import.php create mode 100644 modules/anagrafiche/src/Import/CSV.php delete mode 100755 modules/articoli/import.php create mode 100644 modules/articoli/src/Import/CSV.php delete mode 100755 src/Import.php create mode 100644 src/Imports/CSVImport.php diff --git a/lib/util.php b/lib/util.php index 853e6632a..8447b9a6f 100755 --- a/lib/util.php +++ b/lib/util.php @@ -135,11 +135,11 @@ if (!function_exists('str_to_lower')) { * * @param string $string * - * @return bool + * @return string */ function str_to_lower($string) { - return S::create($string)->toLowerCase(); + return S::create($string)->toLowerCase()->__toString(); } } @@ -149,11 +149,11 @@ if (!function_exists('str_to_upper')) { * * @param string $string * - * @return bool + * @return string */ function str_to_upper($string) { - return S::create($string)->toUpperCase(); + return S::create($string)->toUpperCase()->__toString(); } } diff --git a/modules/anagrafiche/import.php b/modules/anagrafiche/import.php deleted file mode 100755 index aa54e6a5e..000000000 --- a/modules/anagrafiche/import.php +++ /dev/null @@ -1,268 +0,0 @@ - $dati_anagrafica) { - if (!empty($dati_anagrafica)) { - $id_tipo_anagrafica = (array) $dati_anagrafica['idtipoanagrafica']; - unset($dati_anagrafica['idtipoanagrafica']); - - // Separazione dei campi relativi alla sede legale - $dati_sede = []; - foreach ($sede_fields as $field) { - if (isset($dati_anagrafica[$field])) { - $dati_sede[$field] = $dati_anagrafica[$field]; - unset($dati_anagrafica[$field]); - } - } - - // Ricerca di eventuale anagrafica corrispondente sulla base del campo definito come primary_key (es. codice) - if (!empty($primary_key)) { - $anagrafica = Anagrafica::where($primary_key, '=', $dati_anagrafica[$primary_key])->first(); - } - - // Se non trovo nessuna anagrafica corrispondente, allora la creo - if (empty($anagrafica)) { - $anagrafica = Anagrafica::build($dati_anagrafica['ragione_sociale']); - } - - // Impedisco di aggiornare la mia anagrafica azienda - if ($dati_anagrafica[$primary_key] != $id_azienda) { - //se non imposto nessun codice evito di resettare quello calcolato automaticamente o già presente - if (empty($dati_anagrafica['codice'])) { - unset($dati_anagrafica['codice']); - } - - $anagrafica->fill($dati_anagrafica); - $anagrafica->tipologie = $id_tipo_anagrafica; - $anagrafica->save(); - - $sede = $anagrafica->sedeLegale; - $sede->fill($dati_sede); - $sede->save(); - } - } - } - - break; -} - -return [ - [ - 'field' => 'codice', - 'label' => 'Codice', - 'primary_key' => true, - 'names' => [ - 'Codice interno', - 'Numero', - 'Codice', - ], - ], - [ - 'field' => 'ragione_sociale', - 'label' => 'Ragione sociale', - 'names' => [ - 'Nome', - 'Denominazione', - 'Ragione sociale', - ], - ], - [ - 'field' => 'codice_destinatario', - 'label' => 'Codice destinatario', - 'names' => [ - 'Codice destinatario', - 'Codice SDI', - 'Codice univoco', - 'Codice univoco ufficio', - 'SDI', - ], - ], - [ - 'field' => 'provincia', - 'label' => 'Provincia', - ], - [ - 'field' => 'citta', - 'label' => 'Città', - 'names' => [ - 'Citt_', - 'Città', - 'Città', - 'Citta', - ], - ], - [ - 'field' => 'telefono', - 'label' => 'Telefono', - ], - [ - 'field' => 'indirizzo', - 'label' => 'Indirizzo', - ], - [ - 'field' => 'indirizzo2', - 'label' => 'Civico', - ], - [ - 'field' => 'cap', - 'label' => 'CAP', - ], - [ - 'field' => 'cellulare', - 'label' => 'Cellulare', - ], - [ - 'field' => 'fax', - 'label' => 'Fax', - ], - [ - 'field' => 'email', - 'label' => 'Email', - 'names' => [ - 'E-mail', - 'Indirizzo email', - 'Mail', - 'Email', - ], - ], - [ - 'field' => 'pec', - 'label' => 'PEC', - 'names' => [ - 'E-mail PEC', - 'Email certificata', - 'Indirizzo email certificata', - 'PEC', - ], - ], - [ - 'field' => 'codice_fiscale', - 'label' => 'Codice Fiscale', - ], - [ - 'field' => 'data_nascita', - 'label' => 'Data di nascita', - ], - [ - 'field' => 'luogo_nascita', - 'label' => 'Luogo di nascita', - ], - [ - 'field' => 'sesso', - 'label' => 'Sesso', - ], - [ - 'field' => 'piva', - 'label' => 'Partita IVA', - 'names' => [ - 'P.IVA', - 'P.IVA/TAX ID', - 'TAX ID', - 'Partita IVA', - ], - ], - [ - 'field' => 'codiceiban', - 'label' => 'IBAN', - ], - [ - 'field' => 'note', - 'label' => 'Note', - 'names' => [ - 'Note Extra', - 'Note', - ], - ], - [ - 'field' => 'id_nazione', - 'label' => 'Nazione', - 'names' => [ - 'Nazione', - 'Paese', - 'id_nazione', - 'idnazione', - 'nazione', - ], - 'query' => 'SELECT id as result FROM an_nazioni WHERE LOWER(nome) = LOWER(|value|) OR LOWER(iso2) = LOWER(|value|)', - ], - [ - 'field' => 'idagente', - 'label' => 'ID Agente', - ], - [ - 'field' => 'idpagamento_vendite', - 'label' => 'ID Pagamento', - 'names' => [ - 'Pagamento', - 'ID Pagamento', - 'id_pagamento', - 'idpagamento_vendite', - 'idpagamento', - ], - ], - [ - 'field' => 'idtipoanagrafica', - 'label' => 'Tipo', - 'names' => [ - 'Tipo', - 'tipo', - 'idtipo', - ], - 'query' => 'SELECT idtipoanagrafica as result FROM an_tipianagrafiche WHERE descrizione = |value|', - ], - [ - 'field' => 'tipo', - 'label' => 'Tipologia', - ], -]; diff --git a/modules/anagrafiche/src/Import/CSV.php b/modules/anagrafiche/src/Import/CSV.php new file mode 100644 index 000000000..63674b9b4 --- /dev/null +++ b/modules/anagrafiche/src/Import/CSV.php @@ -0,0 +1,273 @@ + 'codice', + 'label' => 'Codice', + 'primary_key' => true, + 'names' => [ + 'Codice interno', + 'Numero', + 'Codice', + ], + ], + [ + 'field' => 'ragione_sociale', + 'label' => 'Ragione sociale', + 'names' => [ + 'Nome', + 'Denominazione', + 'Ragione sociale', + ], + ], + [ + 'field' => 'codice_destinatario', + 'label' => 'Codice destinatario', + 'names' => [ + 'Codice destinatario', + 'Codice SDI', + 'Codice univoco', + 'Codice univoco ufficio', + 'SDI', + ], + ], + [ + 'field' => 'provincia', + 'label' => 'Provincia', + ], + [ + 'field' => 'citta', + 'label' => 'Città', + 'names' => [ + 'Citt_', + 'Città', + 'Città', + 'Citta', + ], + ], + [ + 'field' => 'telefono', + 'label' => 'Telefono', + ], + [ + 'field' => 'indirizzo', + 'label' => 'Indirizzo', + ], + [ + 'field' => 'indirizzo2', + 'label' => 'Civico', + ], + [ + 'field' => 'cap', + 'label' => 'CAP', + ], + [ + 'field' => 'cellulare', + 'label' => 'Cellulare', + ], + [ + 'field' => 'fax', + 'label' => 'Fax', + ], + [ + 'field' => 'email', + 'label' => 'Email', + 'names' => [ + 'E-mail', + 'Indirizzo email', + 'Mail', + 'Email', + ], + ], + [ + 'field' => 'pec', + 'label' => 'PEC', + 'names' => [ + 'E-mail PEC', + 'Email certificata', + 'Indirizzo email certificata', + 'PEC', + ], + ], + [ + 'field' => 'codice_fiscale', + 'label' => 'Codice Fiscale', + ], + [ + 'field' => 'data_nascita', + 'label' => 'Data di nascita', + ], + [ + 'field' => 'luogo_nascita', + 'label' => 'Luogo di nascita', + ], + [ + 'field' => 'sesso', + 'label' => 'Sesso', + ], + [ + 'field' => 'piva', + 'label' => 'Partita IVA', + 'names' => [ + 'P.IVA', + 'P.IVA/TAX ID', + 'TAX ID', + 'Partita IVA', + ], + ], + [ + 'field' => 'codiceiban', + 'label' => 'IBAN', + ], + [ + 'field' => 'note', + 'label' => 'Note', + 'names' => [ + 'Note Extra', + 'Note', + ], + ], + [ + 'field' => 'id_nazione', + 'label' => 'Nazione', + 'names' => [ + 'Nazione', + 'Paese', + 'id_nazione', + 'idnazione', + 'nazione', + ], + ], + [ + 'field' => 'idagente', + 'label' => 'ID Agente', + ], + [ + 'field' => 'idpagamento_vendite', + 'label' => 'ID Pagamento', + 'names' => [ + 'Pagamento', + 'ID Pagamento', + 'id_pagamento', + 'idpagamento_vendite', + 'idpagamento', + ], + ], + [ + 'field' => 'idtipoanagrafica', + 'label' => 'Tipo', + 'names' => [ + 'Tipo', + 'tipo', + 'idtipo', + ], + ], + [ + 'field' => 'tipo', + 'label' => 'Tipologia', + ], + ]; + } + + public function import($record) + { + $database = database(); + $primary_key = $this->getPrimaryKey(); + $id_azienda = setting('Azienda predefinita'); + + // Individuazione del tipo dell'anagrafica + $tipologie = []; + if (!empty($record['idtipoanagrafica'])) { + $tipi_selezionati = explode(',', $record['idtipoanagrafica']); + + foreach ($tipi_selezionati as $tipo) { + $tipo_anagrafica = $database->fetchOne('SELECT idtipoanagrafica AS id an_tipianagrafiche WHERE descrizione = '.prepare($tipo).' OR idtipoanagrafica = '.prepare($tipo)); + + if (!empty($tipo_anagrafica)) { + $tipologie[] = $tipo_anagrafica['id']; + } + } + } + unset($record['idtipoanagrafica']); + + // Fix per campi con contenuti derivati da query implicite + if (!empty($record['id_nazione'])) { + $record['id_nazione'] = $database->fetchOne('SELECT id FROM an_nazioni WHERE LOWER(nome) = LOWER('.prepare($record['id_nazione']).') OR LOWER(iso2) = LOWER('.prepare($record['id_nazione']).')')['id']; + } + + // Separazione dei campi relativi alla sede legale + $campi_sede = [ + //'piva', + //'codice_fiscale', + //'codice_destinatario', + 'indirizzo', + 'indirizzo2', + 'citta', + 'cap', + 'provincia', + 'km', + 'id_nazione', + 'telefono', + 'fax', + 'cellulare', + 'email', + 'idzona', + 'gaddress', + 'lat', + 'lng', + ]; + + $dati_sede = []; + foreach ($campi_sede as $field) { + if (isset($record[$field])) { + $dati_sede[$field] = $record[$field]; + unset($record[$field]); + } + } + + // Ricerca di eventuale anagrafica corrispondente sulla base del campo definito come primary_key (es. codice) + if (!empty($primary_key)) { + $anagrafica = Anagrafica::where($primary_key, '=', $record[$primary_key])->first(); + } + + // Se non trovo nessuna anagrafica corrispondente, allora la creo + if (empty($anagrafica)) { + $anagrafica = Anagrafica::build($record['ragione_sociale']); + } + + // Impedisco di aggiornare l'anagrafica Azienda + if ($anagrafica->id == $id_azienda) { + return; + } + + // se non imposto nessun codice evito di resettare quello calcolato automaticamente o già presente + if (empty($record['codice'])) { + unset($record['codice']); + } + + $anagrafica->fill($record); + $anagrafica->tipologie = $tipologie; + $anagrafica->save(); + + $sede = $anagrafica->sedeLegale; + $sede->fill($dati_sede); + $sede->save(); + } + + public static function getExample() + { + return [ + ['Codice', 'Ragione sociale', 'Tipologia', 'Partita IVA', 'Codice destinatario', 'Nazione', 'Indirizzo', 'CAP', 'Città', 'Provincia', 'Telefono', 'Fax', 'Cellulare', 'Email', 'PEC', 'IBAN', 'Note', 'Tipo'], + ['00001', 'Mia anagrafica', 'Azienda', '12345678910', '1234567', 'ITALIA', 'Via Giuseppe Mazzini, 123', '12345', 'Este', 'PD', '+39 0429 60 25 12', '+39 0429 456 781', '+39 321 12 34 567', 'email@anagrafica.it', 'pec@anagrafica.it', 'IT60 X054 2811 1010 0000 0123 456', 'Note dell\'anagrafica di esempio', 'Cliente,Fornitore'], + ]; + } +} diff --git a/modules/articoli/import.php b/modules/articoli/import.php deleted file mode 100755 index 7d7bde80c..000000000 --- a/modules/articoli/import.php +++ /dev/null @@ -1,242 +0,0 @@ - $value) { - if (!empty($value)) { - $qta = $data[$key]['qta']; - unset($data[$key]['qta']); - - $data[$key]['attivo'] = 1; - if (!empty($data[$key]['prezzo_acquisto'])) { - $data[$key]['prezzo_acquisto'] = $data[$key]['prezzo_acquisto']; - } - if (!empty($data[$key]['prezzo_vendita'])) { - $data[$key]['prezzo_vendita'] = $data[$key]['prezzo_vendita']; - } - if (!empty($data[$key]['peso_lordo'])) { - $data[$key]['peso_lordo'] = $data[$key]['peso_lordo']; - } - if (!empty($data[$key]['volume'])) { - $data[$key]['volume'] = $data[$key]['volume']; - } - - // Categorie - if (!empty($data[$key]['id_categoria'])) { - $rs_cat = $dbo->select('mg_categorie', 'id', [ - 'nome' => $data[$key]['id_categoria'], - ]); - - if (empty($rs_cat[0]['id'])) { - $dbo->insert('mg_categorie', [ - 'nome' => $data[$key]['id_categoria'], - ]); - $data[$key]['id_categoria'] = $dbo->lastInsertedID(); - } else { - $data[$key]['id_categoria'] = $rs_cat[0]['id']; - } - } - - // Sottocategorie - if (!empty($data[$key]['id_sottocategoria'])) { - $rs_cat2 = $dbo->select('mg_categorie', 'id', [ - 'nome' => $data[$key]['id_sottocategoria'], - 'parent' => $data[$key]['id_categoria'], - ]); - - if (empty($rs_cat2[0]['id'])) { - $dbo->insert('mg_categorie', [ - 'nome' => $data[$key]['id_sottocategoria'], - 'parent' => $data[$key]['id_categoria'], - ]); - $data[$key]['id_sottocategoria'] = $dbo->lastInsertedID(); - } else { - $data[$key]['id_sottocategoria'] = $rs_cat2[0]['id']; - } - } - - // Um - if (!empty($data[$key]['um'])) { - $rs_um = $dbo->select('mg_unitamisura', 'id', [ - 'valore' => $data[$key]['um'], - ]); - - if (empty($rs_um[0]['id'])) { - $dbo->insert('mg_unitamisura', [ - 'valore' => $data[$key]['um'], - ]); - } - } - - // Codice --> ID IVA vendita - if (!empty($data[$key]['idiva_vendita'])) { - $rs_iva = $dbo->select('co_iva', 'id', [ - 'codice' => $data[$key]['idiva_vendita'], - ]); - - if (!empty($rs_iva[0]['id'])) { - $data[$key]['idiva_vendita'] = $rs_iva[0]['id']; - } - } - - // Insert o update - $insert = true; - if (!empty($primary_key)) { - $rs = $dbo->select('mg_articoli', $primary_key, [ - $primary_key => $data[$key][$primary_key], - ]); - - $insert = !in_array($data[$key][$primary_key], $rs[0]); - } - - // Insert - if ($insert) { - $data[$key]['id_categoria'] = (empty($data[$key]['id_categoria'])) ? 0 : $data[$key]['id_categoria']; - $dbo->insert('mg_articoli', $data[$key]); - add_movimento_magazzino($dbo->lastInsertedID(), $qta, [], 'Movimento da import', date()); - } - // Update - else { - $dbo->update('mg_articoli', $data[$key], [$primary_key => $data[$key][$primary_key]]); - - $rs = $dbo->select('mg_articoli', 'id', [ - $primary_key => $data[$key][$primary_key], - ]); - - add_movimento_magazzino($rs[0]['id'], $qta, [], 'Movimento da import', date()); - } - - unset($data[$key]); - } - } - - break; -} - -return [ - [ - 'field' => 'codice', - 'label' => 'Codice', - 'primary_key' => true, - ], - [ - 'field' => 'descrizione', - 'label' => 'Descrizione', - ], - [ - 'field' => 'qta', - 'label' => 'Quantità', - ], - [ - 'field' => 'um', - 'label' => 'Unità di misura', - 'names' => [ - 'Unità di misura', - 'Unità misura', - 'Unit` di misura', - 'um', - ], - ], - [ - 'field' => 'prezzo_acquisto', - 'label' => 'Prezzo acquisto', - ], - [ - 'field' => 'prezzo_vendita', - 'label' => 'Prezzo vendita', - ], - [ - 'field' => 'peso_lordo', - 'label' => 'Peso lordo (KG)', - 'names' => [ - 'Peso lordo (KG)', - 'Peso', - ], - ], - [ - 'field' => 'volume', - 'label' => 'Volume (M3)', - 'names' => [ - 'Volume (M3)', - 'Volume', - ], - ], - [ - 'field' => 'id_categoria', - 'label' => 'Categoria', - 'names' => [ - 'Categoria', - 'id_categoria', - 'idcategoria', - ], - ], - [ - 'field' => 'id_sottocategoria', - 'label' => 'Sottocategoria', - 'names' => [ - 'Sottocategoria', - 'id_sottocategoria', - 'idsottocategoria', - ], - ], - [ - 'field' => 'barcode', - 'label' => 'Barcode', - 'names' => [ - 'barcode', - 'Barcode', - 'EAN', - ], - ], - [ - 'field' => 'id_fornitore', - 'label' => 'Fornitore', - 'names' => [ - 'id_fornitore', - 'Id Fornitore', - 'Fornitore', - ], - 'query' => 'SELECT idanagrafica as result FROM an_anagrafiche WHERE LOWER(ragione_sociale) = LOWER(|value|)', - ], - [ - 'field' => 'idiva_vendita', - 'label' => 'Codice IVA vendita', - 'names' => [ - 'Codice IVA vendita', - 'idiva_vendita', - ], - ], - [ - 'field' => 'ubicazione', - 'label' => 'Ubicazione', - ], - [ - 'field' => 'note', - 'label' => 'Note', - ], -]; diff --git a/modules/articoli/src/Import/CSV.php b/modules/articoli/src/Import/CSV.php new file mode 100644 index 000000000..044b8430d --- /dev/null +++ b/modules/articoli/src/Import/CSV.php @@ -0,0 +1,223 @@ + 'codice', + 'label' => 'Codice', + 'primary_key' => true, + ], + [ + 'field' => 'descrizione', + 'label' => 'Descrizione', + ], + [ + 'field' => 'qta', + 'label' => 'Quantità', + ], + [ + 'field' => 'um', + 'label' => 'Unità di misura', + 'names' => [ + 'Unità di misura', + 'Unità misura', + 'Unit` di misura', + 'um', + ], + ], + [ + 'field' => 'prezzo_acquisto', + 'label' => 'Prezzo acquisto', + ], + [ + 'field' => 'prezzo_vendita', + 'label' => 'Prezzo vendita', + ], + [ + 'field' => 'peso_lordo', + 'label' => 'Peso lordo (KG)', + 'names' => [ + 'Peso lordo (KG)', + 'Peso', + ], + ], + [ + 'field' => 'volume', + 'label' => 'Volume (M3)', + 'names' => [ + 'Volume (M3)', + 'Volume', + ], + ], + [ + 'field' => 'id_categoria', + 'label' => 'Categoria', + 'names' => [ + 'Categoria', + 'id_categoria', + 'idcategoria', + ], + ], + [ + 'field' => 'id_sottocategoria', + 'label' => 'Sottocategoria', + 'names' => [ + 'Sottocategoria', + 'id_sottocategoria', + 'idsottocategoria', + ], + ], + [ + 'field' => 'barcode', + 'label' => 'Barcode', + 'names' => [ + 'barcode', + 'Barcode', + 'EAN', + ], + ], + [ + 'field' => 'id_fornitore', + 'label' => 'Fornitore', + 'names' => [ + 'id_fornitore', + 'Id Fornitore', + 'Fornitore', + ], + ], + [ + 'field' => 'idiva_vendita', + 'label' => 'Codice IVA vendita', + 'names' => [ + 'Codice IVA vendita', + 'idiva_vendita', + ], + ], + [ + 'field' => 'ubicazione', + 'label' => 'Ubicazione', + ], + [ + 'field' => 'note', + 'label' => 'Note', + ], + ]; + } + + public function import($record) + { + $database = database(); + $primary_key = $this->getPrimaryKey(); + + $qta = $record['qta']; + unset($record['qta']); + + $record['attivo'] = 1; + + // Fix per campi con contenuti derivati da query implicite + if (!empty($record['id_fornitore'])) { + $record['id_fornitore'] = $database->fetchOne('SELECT idanagrafica AS id FROM an_anagrafiche WHERE LOWER(ragione_sociale) = LOWER('.prepare($record['v']).')')['id']; + } + + // Categorie + if (!empty($record['id_categoria'])) { + $rs_cat = $database->select('mg_categorie', 'id', [ + 'nome' => $record['id_categoria'], + ]); + + if (empty($rs_cat[0]['id'])) { + $database->insert('mg_categorie', [ + 'nome' => $record['id_categoria'], + ]); + $record['id_categoria'] = $database->lastInsertedID(); + } else { + $record['id_categoria'] = $rs_cat[0]['id']; + } + } + + // Sottocategorie + if (!empty($record['id_sottocategoria'])) { + $rs_cat2 = $database->select('mg_categorie', 'id', [ + 'nome' => $record['id_sottocategoria'], + 'parent' => $record['id_categoria'], + ]); + + if (empty($rs_cat2[0]['id'])) { + $database->insert('mg_categorie', [ + 'nome' => $record['id_sottocategoria'], + 'parent' => $record['id_categoria'], + ]); + $record['id_sottocategoria'] = $database->lastInsertedID(); + } else { + $record['id_sottocategoria'] = $rs_cat2[0]['id']; + } + } + + // Um + if (!empty($record['um'])) { + $rs_um = $database->select('mg_unitamisura', 'id', [ + 'valore' => $record['um'], + ]); + + if (empty($rs_um[0]['id'])) { + $database->insert('mg_unitamisura', [ + 'valore' => $record['um'], + ]); + } + } + + // Codice --> ID IVA vendita + if (!empty($record['idiva_vendita'])) { + $rs_iva = $database->select('co_iva', 'id', [ + 'codice' => $record['idiva_vendita'], + ]); + + if (!empty($rs_iva[0]['id'])) { + $record['idiva_vendita'] = $rs_iva[0]['id']; + } + } + + // Insert o update + $insert = true; + if (!empty($primary_key)) { + $rs = $database->select('mg_articoli', $primary_key, [ + $primary_key => $record[$primary_key], + ]); + + $insert = !in_array($record[$primary_key], $rs[0]); + } + + // Insert + if ($insert) { + $record['id_categoria'] = (empty($record['id_categoria'])) ? 0 : $record['id_categoria']; + $database->insert('mg_articoli', $record); + add_movimento_magazzino($database->lastInsertedID(), $qta, [], 'Movimento da import', date()); + } + // Update + else { + $database->update('mg_articoli', $record, [$primary_key => $record[$primary_key]]); + + $rs = $database->select('mg_articoli', 'id', [ + $primary_key => $record[$primary_key], + ]); + + add_movimento_magazzino($rs[0]['id'], $qta, [], 'Movimento da import', date()); + } + } + + public static function getExample() + { + return [ + ['Codice', 'Barcode', 'Descrizione', 'Fornitore', 'Quantità', 'Unità di misura', 'Prezzo acquisto', 'Prezzo vendita', 'Peso lordo (KG)', 'Volume (M3)', 'Categoria', 'Sottocategoria', 'Ubicazione', 'Note'], + ['00004', '719376861871', 'Articolo', 'Mario Rossi', '10', 'Kg', '5,25', '12,72', '10,2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova'], + ]; + } +} diff --git a/modules/import/actions.php b/modules/import/actions.php index d23c09488..c5c43dcf1 100755 --- a/modules/import/actions.php +++ b/modules/import/actions.php @@ -2,25 +2,54 @@ include_once __DIR__.'/../../core.php'; -switch (post('op')) { +switch (filter('op')) { + case 'add': + $modulo_selezionato = Modules::get(filter('module')); + $id_record = $modulo_selezionato->id; + + $upload = Uploads::upload($_FILES['file'], [ + 'id_module' => $modulo_import->id, + 'id_record' => $id_record, + ]); + break; + + case 'example': + $module = filter('module'); + $modulo_selezionato = Modules::get(filter('module')); + $import_selezionato = $moduli_disponibili[$module]; + + if (!empty($import_selezionato)) { + // Generazione percorso + $file = $modulo_selezionato->upload_directory.'/example-'.strtolower($modulo_selezionato->title).'.csv'; + $filepath = DOCROOT.'/'.$file; + + // Generazione del file + $import_selezionato::createExample($filepath); + + echo ROOTDIR.'/'.$file; + } + + break; + case 'import': + // Individuazione del modulo + $modulo_selezionato = Modules::get($id_record); + $import_selezionato = $moduli_disponibili[$modulo_selezionato->name]; + + // Dati indicati $include_first_row = post('include_first_row'); - $selected_fields = post('fields'); + $fields = (array) post('fields'); $page = post('page'); $limit = 500; - // Pulizia dei campi inutilizzati - foreach ($selected as $key => $value) { - if (!is_numeric($value)) { - unset($selected[$key]); - } + // Inizializzazione del lettore CSV + $csv = new $import_selezionato($record->filepath); + foreach ($fields as $key => $value) { + $csv->setColumnAssociation($key, $value); } - $fields = Import::getFields($id_record); - - $csv = Import::getCSV($id_record, $record['id']); - + // Generazione offset sulla base della pagina $offset = isset($page) ? $page * $limit : 0; // Ignora la prima riga se composta da header @@ -28,56 +57,11 @@ switch (post('op')) { ++$offset; } - $csv = $csv->setOffset($offset) - ->setLimit($limit); - - // Chiavi per la lettura CSV - $keys = []; - foreach ($selected_fields as $id => $field_id) { - if (is_numeric($field_id)) { - $value = $fields[$field_id]['field']; - } else { - $value = -($id + 1); - } - - $keys[] = $value; - } - - // Query dei campi selezionati - $queries = []; - foreach ($fields as $key => $field) { - if (!empty($field['query'])) { - $queries[$field['field']] = $field['query']; - } - } - - // Lettura dei record - $rows = $csv->fetchAssoc($keys, function ($row) use ($queries, $dbo) { - foreach ($row as $key => $value) { - if (is_int($key)) { - unset($row[$key]); - } elseif (isset($queries[$key])) { - $query = str_replace('|value|', prepare($value), $queries[$key]); - - $value = $dbo->fetchOne($query)['result']; - - $row[$key] = $value; - } - } - - return $row; - }); - // Gestione automatica dei valori convertiti - $rows = iterator_to_array($rows); - $data = Filter::parse($rows); - $primary_key = post('primary_key'); + $csv->setPrimaryKey($primary_key); - // Richiamo delle operazioni specifiche - include $imports[$id_record]['import']; - - $count = count($rows); + $count = $csv->importSet($offset, $limit); $more = $count == $limit; echo json_encode([ diff --git a/modules/import/add.php b/modules/import/add.php index da9381316..87e35f0f0 100755 --- a/modules/import/add.php +++ b/modules/import/add.php @@ -3,63 +3,68 @@ include_once __DIR__.'/../../core.php'; $list = []; -foreach ($imports as $key => $value) { +foreach ($moduli_disponibili as $id => $value) { + $modulo = Modules::get($id); + $list[] = [ - 'id' => $key, - 'text' => $value['title'], - 'directory' => $value['directory'], + 'id' => $id, + 'text' => $modulo['title'], ]; } -// Utilizzo le funzionalità di filelist_and_upload ?>
- +
- {[ "type": "file", "label": "", "name": "blob", "required": 1, "accept": ".csv" ]} + {[ "type": "file", "label": "", "name": "file", "required": 1, "accept": ".csv" ]}
- {[ "type": "select", "label": "", "name": "id_record", "required": 1, "values": ]} + {[ "type": "select", "label": "", "name": "module", "required": 1, "values": ]}
- - + + +
diff --git a/modules/import/edit.php b/modules/import/edit.php index e5dd02dfa..47164a70e 100755 --- a/modules/import/edit.php +++ b/modules/import/edit.php @@ -2,27 +2,29 @@ include_once __DIR__.'/../../core.php'; +// Gestione del redirect in caso di caricamento del file +if (filter('op')) { + return; +} + if (empty($id_record)) { - require $docroot.'/add.php'; + require DOCROOT.'/add.php'; } else { - // Inclusione del file del modulo per eventuale HTML personalizzato - include $imports[$id_record]['import']; + $modulo_selezionato = Modules::get($id_record); + $import_selezionato = $moduli_disponibili[$modulo_selezionato->name]; - $fields = Import::getFields($id_record); + // Inizializzazione del lettore CSV + $csv = new $import_selezionato($record->filepath); + $fields = $csv->getAvailableFields(); - $select = []; - $select2 = []; + // Generazione della base per i campi da selezionare + $campi_disponibili = []; foreach ($fields as $key => $value) { - $select[] = [ + $campi_disponibili[] = [ 'id' => $key, 'text' => $value['label'], ]; - $select2[] = [ - 'id' => $value['field'], - 'text' => $value['label'], - ]; - if ($value['primary_key']) { $primary_key = $value['field']; } @@ -38,19 +40,29 @@ 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($select2).', "value": "'.$primary_key.'" ]} + {[ "type": "select", "label": "'.tr('Chiave primaria').'", "name": "primary_key", "values": '.json_encode($campi_disponibili).', "value": "'.$primary_key.'" ]}
'; - $csv = Import::getCSV($id_record, $record['id']); - $rows = $csv->setLimit(10)->fetchAll(); + // Lettura delle prime righe disponibili + $righe = $csv->get(0, 10); + $prima_riga = $righe[0]; + $numero_colonne = count($prima_riga); - $count = count($rows[0]); + // Trasformazione dei nomi indicati per i campi in lowercase + $nomi_disponibili = []; + foreach ($fields as $key => $value) { + $nomi_disponibili[$key] = []; + $names = isset($value['names']) ? $value['names'] : [$value['label']]; + foreach ($names as $name) { + $nomi_disponibili[$key][] = trim(str_to_lower($name)); + } + } echo '
'; - for ($column = 0; $column < $count; ++$column) { + for ($column = 0; $column < $numero_colonne; ++$column) { echo '
@@ -63,17 +75,19 @@ if (empty($id_record)) {
'; // Individuazione delle corrispondenze - $selected = null; + $selezionato = null; foreach ($fields as $key => $value) { - if (in_array(str_to_lower($rows[0][$column]), $value['names'])) { - $exclude_first_row = 1; - $selected = $key; + // Confronto per l'individuazione della relativa colonna + $nome = trim(str_to_lower($prima_riga[$column])); + if (in_array($nome, $nomi_disponibili[$key])) { + $escludi_prima_riga = 1; + $selezionato = $key; break; } } echo ' - {[ "type": "select", "label": "'.tr('Campo').'", "name": "fields[]", "values": '.json_encode($select).', "value": "'.$selected.'" ]} + {[ "type": "select", "label": "'.tr('Campo').'", "name": "fields['.$column.']", "values": '.json_encode($campi_disponibili).', "value": "'.$selezionato.'" ]} @@ -84,7 +98,7 @@ if (empty($id_record)) { '; - foreach ($rows as $key => $row) { + foreach ($righe as $key => $row) { echo ' @@ -108,9 +122,10 @@ if (empty($id_record)) { echo '
'.($key + 1).'