Aggiornamento della struttura di importazione CSV

This commit is contained in:
Thomas Zilio 2020-08-06 18:51:56 +02:00
parent 97a3e9f9de
commit 970178fb92
11 changed files with 759 additions and 769 deletions

View File

@ -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();
}
}

View File

@ -1,268 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
switch (post('op')) {
case 'example':
$module = filter('module');
$list = [
['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'],
];
directory('../../files/'.$module);
$fp = fopen('../../files/'.$module.'/'.$module.'.csv', 'w');
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($list as $fields) {
fputcsv($fp, $fields, ';');
}
fclose($fp);
exit;
break;
case 'import':
$sede_fields = [
//'piva',
//'codice_fiscale',
//'codice_destinatario',
'indirizzo',
'indirizzo2',
'citta',
'cap',
'provincia',
'km',
'id_nazione',
'telefono',
'fax',
'cellulare',
'email',
'idzona',
'gaddress',
'lat',
'lng',
];
$id_azienda = setting('Azienda predefinita');
foreach ($data as $key => $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&agrave;',
'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',
],
];

View File

@ -0,0 +1,273 @@
<?php
namespace Modules\Anagrafiche\Import;
use Imports\CSVImport;
use Modules\Anagrafiche\Anagrafica;
class CSV extends CSVImport
{
public function getAvailableFields()
{
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&agrave;',
'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'],
];
}
}

View File

@ -1,242 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'example':
$module = filter('module');
$list = [
['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'],
];
directory('../../files/'.$module);
$fp = fopen('../../files/'.$module.'/'.$module.'.csv', 'w');
foreach ($list as $fields) {
fputcsv($fp, $fields, ';');
}
fclose($fp);
exit;
break;
case 'import':
foreach ($data as $key => $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&agrave; 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',
],
];

View File

@ -0,0 +1,223 @@
<?php
namespace Modules\Articoli\Import;
use Imports\CSVImport;
use Modules\Anagrafiche\Anagrafica;
class CSV extends CSVImport
{
public function getAvailableFields()
{
return [
[
'field' => 'codice',
'label' => 'Codice',
'primary_key' => true,
],
[
'field' => 'descrizione',
'label' => 'Descrizione',
],
[
'field' => 'qta',
'label' => 'Quantità',
],
[
'field' => 'um',
'label' => 'Unit&agrave; 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'],
];
}
}

View File

@ -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([

View File

@ -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
?><form action="" method="post" id="add-form" enctype="multipart/form-data">
<input type="hidden" name="op" value="link_file">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-md-6">
{[ "type": "file", "label": "<?php echo tr('File'); ?>", "name": "blob", "required": 1, "accept": ".csv" ]}
{[ "type": "file", "label": "<?php echo tr('File'); ?>", "name": "file", "required": 1, "accept": ".csv" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Modulo'); ?>", "name": "id_record", "required": 1, "values": <?php echo json_encode($list); ?> ]}
{[ "type": "select", "label": "<?php echo tr('Modulo'); ?>", "name": "module", "required": 1, "values": <?php echo json_encode($list); ?> ]}
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button id="example" type="button" class="btn btn-info hide" ><i class="fa fa-file"></i> <?php echo tr('Scarica esempio CSV'); ?></button>
<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?></button>
<button id="example" type="button" class="btn btn-info hidden">
<i class="fa fa-file"></i> <?php echo tr('Scarica esempio CSV'); ?>
</button>
<button type="submit" class="btn btn-primary">
<i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?>
</button>
</div>
</div>
</form>
<script>
$('#id_record').change(function() {
if ($(this).val()>0){
$( "#example" ).removeClass('hide');
}else{
$( "#example" ).addClass('hide');
}
});
$( "#example" ).click(function(event) {
var module = $('#id_record').find(':selected').data('directory').toLowerCase();
var dir = "<?php echo ROOTDIR; ?>/modules/"+module+"/import.php";
var file = "<?php echo ROOTDIR; ?>/files/"+module+"/"+module+".csv";
$.ajax({
url: dir,
type: 'post',
data: {
op: 'example', module: module
},
success: function(data){
window.location = file;
$('#main_loading').fadeOut();
return false;
$("#module").change(function () {
if ($(this).val()) {
$("#example").removeClass("hidden");
} else {
$("#example").addClass("hidden");
}
});
});
});
$("#example").click(function() {
$.ajax({
url: globals.rootdir + "/actions.php",
type: "post",
data: {
op: "example",
id_module: globals.id_module,
module: $('#module').val(),
},
success: function(data) {
if (data) {
window.location = data;
}
$('#main_loading').fadeOut();
}
});
});
</script>

View File

@ -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" ]}
</div>
<div class="col-md-4">
{[ "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.'" ]}
</div>
</div>';
$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 '
<div class="row">';
for ($column = 0; $column < $count; ++$column) {
for ($column = 0; $column < $numero_colonne; ++$column) {
echo '
<div class="col-sm-6 col-lg-4">
<div class="panel panel-primary">
@ -63,17 +75,19 @@ if (empty($id_record)) {
<div class="panel-body">';
// 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.'" ]}
<table class="table table-striped">
<thead>
@ -84,7 +98,7 @@ if (empty($id_record)) {
</thead>
<tbody>';
foreach ($rows as $key => $row) {
foreach ($righe as $key => $row) {
echo '
<tr>
<td>'.($key + 1).'</td>
@ -108,9 +122,10 @@ if (empty($id_record)) {
echo '
<script>
var count = 0;
$(document).ready(function() {';
if ($exclude_first_row) {
if ($escludi_prima_riga) {
echo '
$("#include_first_row").prop("checked", false).trigger("change");';
}
@ -120,12 +135,12 @@ $(document).ready(function() {';
$("#save").unbind("click");
$("#save").on("click", function() {
count = 0;
importPage(0);
});
});
var count = 0;
function importPage(page){
function importPage(page) {
$("#main_loading").show();
data = {

View File

@ -2,8 +2,12 @@
include_once __DIR__.'/../../core.php';
$imports = Import::getImports();
$modulo_import = Modules::get('Import');
$moduli_disponibili = [
'Anagrafiche' => \Modules\Anagrafiche\Import\CSV::class,
'Articoli' => \Modules\Articoli\Import\CSV::class,
];
if (!empty($id_record)) {
$records = Import::get($id_record)['files'];
$records = $modulo_import->uploads($id_record)->reverse();
}

View File

@ -1,134 +0,0 @@
<?php
/**
* Classe per la gestione delle utenze.
*
* @since 2.4
*/
class Import
{
/** @var int Identificativo del modulo corrente */
protected static $imports;
/**
* Restituisce tutte le informazioni di tutti i moduli installati.
*
* @return array
*/
public static function getImports()
{
if (empty(self::$imports)) {
$modules = Modules::getModules();
$database = database();
$results = [];
foreach ($modules as $module) {
$file = DOCROOT.'/modules/'.$module['directory'].'|custom|/import.php';
$original_file = str_replace('|custom|', '', $file);
$custom_file = str_replace('|custom|', '/custom', $file);
if (file_exists($custom_file) || file_exists($original_file)) {
$files = Uploads::get([
'id_module' => Modules::get('Import')['id'],
'id_record' => $module['id'],
]);
$results[$module['id']] = array_merge($module->toArray(), [
'import' => file_exists($custom_file) ? $custom_file : $original_file,
'files' => array_reverse($files),
]);
}
}
self::$imports = $results;
}
return self::$imports;
}
/**
* Restituisce le informazioni relative a un singolo modulo specificato.
*
* @param string|int $module
*
* @return array
*/
public static function get($module)
{
$module = Modules::get($module)['id'];
return self::getImports()[$module];
}
/**
* Restituisce l'elenco dei campi previsti dal modulo.
*
* @param string|int $module
*
* @return array
*/
public static function getFields($module)
{
$import = self::get($module);
ob_start();
$fields = require $import['import'];
ob_end_clean();
// Impostazione automatica dei nomi "ufficiali" dei campi
foreach ($fields as $key => $value) {
if (!isset($value['names'])) {
$names = [
$value['field'],
$value['label'],
];
} else {
$names = $value['names'];
}
// Impostazione dei nomi in minuscolo
foreach ($names as $k => $v) {
$names[$k] = str_to_lower($v);
}
$fields[$key]['names'] = $names;
}
return $fields;
}
/**
* Restituisce i contenuti del file CSV indicato.
*
* @param string|int $module
* @param int $file_id
*
* @return array
*/
public static function getCSV($module, $file_id)
{
$import = self::get($module);
$ids = array_column($import['files'], 'id');
$find = array_search($file_id, $ids);
if ($find == -1) {
return [];
}
$file = Modules::get('Import')->upload_directory.'/'.$import['files'][$find]['filename'];
// Impostazione automatica per i caratteri di fine riga
if (!ini_get('auto_detect_line_endings')) {
ini_set('auto_detect_line_endings', '1');
}
// Gestione del file CSV
$csv = League\Csv\Reader::createFromPath($file, 'r');
$csv->setDelimiter(';');
return $csv;
}
}

130
src/Imports/CSVImport.php Normal file
View File

@ -0,0 +1,130 @@
<?php
namespace Imports;
use Filter;
use League\Csv\Reader;
abstract class CSVImport
{
protected $csv;
protected $column_associations;
protected $primary_key;
public function __construct($file)
{
// Impostazione automatica per i caratteri di fine riga
if (!ini_get('auto_detect_line_endings')) {
ini_set('auto_detect_line_endings', '1');
}
// Gestione del file CSV
$this->csv = Reader::createFromPath($file, 'r');
$this->csv->setDelimiter(';');
$this->column_associations = [];
}
public function getColumnAssociations()
{
return $this->column_associations;
}
public function setColumnAssociation($column_key, $field_key)
{
$this->column_associations[$column_key] = $this->getAvailableFields()[$field_key]['field'];
}
abstract public function getAvailableFields();
/**
* @param $offset
* @param $length
*
* @return array
*/
public function get($offset, $length)
{
$rows = [];
for ($i = 0; $i < $length; ++$i) {
// Lettura di una singola riga alla volta
$row = $this->csv->fetchOne($offset + $i);
if (empty($row)) {
break;
}
// Aggiunta all'insieme dei record
$rows[] = Filter::parse($row);
}
return $rows;
}
/**
* @param $offset
* @param $length
*
* @return int
*/
public function importSet($offset, $length)
{
$associations = $this->getColumnAssociations();
$rows = $this->get($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;
}
}
// Importazione del record
$this->import($record);
}
return count($rows);
}
/**
* @param $record
*
* @return bool
*/
abstract public function import($record);
/**
* @return mixed
*/
public function getPrimaryKey()
{
return $this->primary_key;
}
/**
* @param $field_key
*/
public function setPrimaryKey($field_key)
{
$this->primary_key = $this->getAvailableFields()[$field_key]['field'];
}
abstract public static function getExample();
public static function createExample($filepath)
{
$content = static::getExample();
$file = fopen($filepath, 'w');
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($content as $row) {
fputcsv($file, $row, ';');
}
fclose($file);
}
}