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
|
* @param string $string
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return string
|
||||||
*/
|
*/
|
||||||
function str_to_lower($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
|
* @param string $string
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return string
|
||||||
*/
|
*/
|
||||||
function str_to_upper($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';
|
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':
|
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');
|
$include_first_row = post('include_first_row');
|
||||||
$selected_fields = post('fields');
|
$fields = (array) post('fields');
|
||||||
$page = post('page');
|
$page = post('page');
|
||||||
|
|
||||||
$limit = 500;
|
$limit = 500;
|
||||||
|
|
||||||
// Pulizia dei campi inutilizzati
|
// Inizializzazione del lettore CSV
|
||||||
foreach ($selected as $key => $value) {
|
$csv = new $import_selezionato($record->filepath);
|
||||||
if (!is_numeric($value)) {
|
foreach ($fields as $key => $value) {
|
||||||
unset($selected[$key]);
|
$csv->setColumnAssociation($key, $value);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$fields = Import::getFields($id_record);
|
// Generazione offset sulla base della pagina
|
||||||
|
|
||||||
$csv = Import::getCSV($id_record, $record['id']);
|
|
||||||
|
|
||||||
$offset = isset($page) ? $page * $limit : 0;
|
$offset = isset($page) ? $page * $limit : 0;
|
||||||
|
|
||||||
// Ignora la prima riga se composta da header
|
// Ignora la prima riga se composta da header
|
||||||
|
@ -28,56 +57,11 @@ switch (post('op')) {
|
||||||
++$offset;
|
++$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
|
// Gestione automatica dei valori convertiti
|
||||||
$rows = iterator_to_array($rows);
|
|
||||||
$data = Filter::parse($rows);
|
|
||||||
|
|
||||||
$primary_key = post('primary_key');
|
$primary_key = post('primary_key');
|
||||||
|
$csv->setPrimaryKey($primary_key);
|
||||||
|
|
||||||
// Richiamo delle operazioni specifiche
|
$count = $csv->importSet($offset, $limit);
|
||||||
include $imports[$id_record]['import'];
|
|
||||||
|
|
||||||
$count = count($rows);
|
|
||||||
$more = $count == $limit;
|
$more = $count == $limit;
|
||||||
|
|
||||||
echo json_encode([
|
echo json_encode([
|
||||||
|
|
|
@ -3,63 +3,68 @@
|
||||||
include_once __DIR__.'/../../core.php';
|
include_once __DIR__.'/../../core.php';
|
||||||
|
|
||||||
$list = [];
|
$list = [];
|
||||||
foreach ($imports as $key => $value) {
|
foreach ($moduli_disponibili as $id => $value) {
|
||||||
|
$modulo = Modules::get($id);
|
||||||
|
|
||||||
$list[] = [
|
$list[] = [
|
||||||
'id' => $key,
|
'id' => $id,
|
||||||
'text' => $value['title'],
|
'text' => $modulo['title'],
|
||||||
'directory' => $value['directory'],
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Utilizzo le funzionalità di filelist_and_upload
|
|
||||||
?><form action="" method="post" id="add-form" enctype="multipart/form-data">
|
?><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">
|
<input type="hidden" name="backto" value="record-edit">
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<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>
|
||||||
|
|
||||||
<div class="col-md-6">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- PULSANTI -->
|
<!-- PULSANTI -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12 text-right">
|
<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 id="example" type="button" class="btn btn-info hidden">
|
||||||
<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?></button>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$('#id_record').change(function() {
|
$("#module").change(function () {
|
||||||
if ($(this).val()>0){
|
if ($(this).val()) {
|
||||||
$( "#example" ).removeClass('hide');
|
$("#example").removeClass("hidden");
|
||||||
}else{
|
} else {
|
||||||
$( "#example" ).addClass('hide');
|
$("#example").addClass("hidden");
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$( "#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;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
$("#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>
|
</script>
|
||||||
|
|
|
@ -2,27 +2,29 @@
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
include_once __DIR__.'/../../core.php';
|
||||||
|
|
||||||
|
// Gestione del redirect in caso di caricamento del file
|
||||||
|
if (filter('op')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($id_record)) {
|
if (empty($id_record)) {
|
||||||
require $docroot.'/add.php';
|
require DOCROOT.'/add.php';
|
||||||
} else {
|
} else {
|
||||||
// Inclusione del file del modulo per eventuale HTML personalizzato
|
$modulo_selezionato = Modules::get($id_record);
|
||||||
include $imports[$id_record]['import'];
|
$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 = [];
|
// Generazione della base per i campi da selezionare
|
||||||
$select2 = [];
|
$campi_disponibili = [];
|
||||||
foreach ($fields as $key => $value) {
|
foreach ($fields as $key => $value) {
|
||||||
$select[] = [
|
$campi_disponibili[] = [
|
||||||
'id' => $key,
|
'id' => $key,
|
||||||
'text' => $value['label'],
|
'text' => $value['label'],
|
||||||
];
|
];
|
||||||
|
|
||||||
$select2[] = [
|
|
||||||
'id' => $value['field'],
|
|
||||||
'text' => $value['label'],
|
|
||||||
];
|
|
||||||
|
|
||||||
if ($value['primary_key']) {
|
if ($value['primary_key']) {
|
||||||
$primary_key = $value['field'];
|
$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": "checkbox", "label": "'.tr('Importa prima riga').'", "name": "include_first_row", "extra":"", "value": "1" ]}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<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>
|
||||||
</div>';
|
</div>';
|
||||||
|
|
||||||
$csv = Import::getCSV($id_record, $record['id']);
|
// Lettura delle prime righe disponibili
|
||||||
$rows = $csv->setLimit(10)->fetchAll();
|
$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 '
|
echo '
|
||||||
<div class="row">';
|
<div class="row">';
|
||||||
|
|
||||||
for ($column = 0; $column < $count; ++$column) {
|
for ($column = 0; $column < $numero_colonne; ++$column) {
|
||||||
echo '
|
echo '
|
||||||
<div class="col-sm-6 col-lg-4">
|
<div class="col-sm-6 col-lg-4">
|
||||||
<div class="panel panel-primary">
|
<div class="panel panel-primary">
|
||||||
|
@ -63,17 +75,19 @@ if (empty($id_record)) {
|
||||||
<div class="panel-body">';
|
<div class="panel-body">';
|
||||||
|
|
||||||
// Individuazione delle corrispondenze
|
// Individuazione delle corrispondenze
|
||||||
$selected = null;
|
$selezionato = null;
|
||||||
foreach ($fields as $key => $value) {
|
foreach ($fields as $key => $value) {
|
||||||
if (in_array(str_to_lower($rows[0][$column]), $value['names'])) {
|
// Confronto per l'individuazione della relativa colonna
|
||||||
$exclude_first_row = 1;
|
$nome = trim(str_to_lower($prima_riga[$column]));
|
||||||
$selected = $key;
|
if (in_array($nome, $nomi_disponibili[$key])) {
|
||||||
|
$escludi_prima_riga = 1;
|
||||||
|
$selezionato = $key;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
echo '
|
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">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
|
@ -84,7 +98,7 @@ if (empty($id_record)) {
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>';
|
<tbody>';
|
||||||
|
|
||||||
foreach ($rows as $key => $row) {
|
foreach ($righe as $key => $row) {
|
||||||
echo '
|
echo '
|
||||||
<tr>
|
<tr>
|
||||||
<td>'.($key + 1).'</td>
|
<td>'.($key + 1).'</td>
|
||||||
|
@ -108,9 +122,10 @@ if (empty($id_record)) {
|
||||||
|
|
||||||
echo '
|
echo '
|
||||||
<script>
|
<script>
|
||||||
|
var count = 0;
|
||||||
$(document).ready(function() {';
|
$(document).ready(function() {';
|
||||||
|
|
||||||
if ($exclude_first_row) {
|
if ($escludi_prima_riga) {
|
||||||
echo '
|
echo '
|
||||||
$("#include_first_row").prop("checked", false).trigger("change");';
|
$("#include_first_row").prop("checked", false).trigger("change");';
|
||||||
}
|
}
|
||||||
|
@ -120,12 +135,12 @@ $(document).ready(function() {';
|
||||||
|
|
||||||
$("#save").unbind("click");
|
$("#save").unbind("click");
|
||||||
$("#save").on("click", function() {
|
$("#save").on("click", function() {
|
||||||
|
count = 0;
|
||||||
importPage(0);
|
importPage(0);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
var count = 0;
|
function importPage(page) {
|
||||||
function importPage(page){
|
|
||||||
$("#main_loading").show();
|
$("#main_loading").show();
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
|
|
|
@ -2,8 +2,12 @@
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
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)) {
|
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