Aggiornamento della struttura di importazione CSV
This commit is contained in:
parent
97a3e9f9de
commit
970178fb92
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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à',
|
||||
'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',
|
||||
],
|
||||
];
|
|
@ -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à',
|
||||
'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'],
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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à 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',
|
||||
],
|
||||
];
|
|
@ -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à 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'],
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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([
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
134
src/Import.php
134
src/Import.php
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue