Skip to content

Commit 4ff6406

Browse files
committed
feat: introduzione campi obbligatori in import csv
1 parent 2101ad1 commit 4ff6406

12 files changed

Lines changed: 2052 additions & 568 deletions

File tree

modules/anagrafiche/src/Import/CSV.php

Lines changed: 207 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
*/
3333
class CSV extends CSVImporter
3434
{
35+
/**
36+
* Definisce i campi disponibili per l'importazione.
37+
*
38+
* @return array
39+
*/
3540
public function getAvailableFields()
3641
{
3742
return [
@@ -52,6 +57,7 @@ public function getAvailableFields()
5257
'Denominazione',
5358
'Ragione sociale',
5459
],
60+
'required' => true,
5561
],
5662
[
5763
'field' => 'nome',
@@ -89,6 +95,7 @@ public function getAvailableFields()
8995
[
9096
'field' => 'telefono',
9197
'label' => 'Telefono',
98+
'required' => false, // Almeno uno tra telefono e partita IVA deve essere presente
9299
],
93100
[
94101
'field' => 'indirizzo',
@@ -160,6 +167,7 @@ public function getAvailableFields()
160167
'TAX ID',
161168
'Partita IVA',
162169
],
170+
'required' => false, // Almeno uno tra telefono e partita IVA deve essere presente
163171
],
164172
[
165173
'field' => 'codiceiban',
@@ -207,13 +215,15 @@ public function getAvailableFields()
207215
'tipo',
208216
'idtipo',
209217
],
218+
'required' => true,
210219
],
211220
[
212221
'field' => 'tipo',
213222
'label' => 'Tipologia (Privato, Ente pubblico, Azienda)',
214223
'names' => [
215224
'Tipologia',
216225
],
226+
'required' => true,
217227
],
218228
[
219229
'field' => 'split_payment',
@@ -235,90 +245,235 @@ public function getAvailableFields()
235245
];
236246
}
237247

248+
/**
249+
* Importa un record nel database.
250+
*
251+
* @param array $record Record da importare
252+
* @param bool $update_record Se true, aggiorna i record esistenti
253+
* @param bool $add_record Se true, aggiunge nuovi record
254+
* @return bool|null True se l'importazione è riuscita, false altrimenti, null se l'operazione è stata saltata
255+
*/
238256
public function import($record, $update_record = true, $add_record = true)
239257
{
258+
// Validazione dei campi obbligatori
259+
if (empty($record['ragione_sociale'])) {
260+
return false;
261+
}
262+
263+
// Verifica che almeno uno tra telefono e partita IVA sia presente
264+
if (empty($record['telefono']) && empty($record['piva'])) {
265+
return false;
266+
}
267+
240268
$database = database();
241269
$primary_key = $this->getPrimaryKey();
242270
$id_azienda = setting('Azienda predefinita');
243271

244272
// Compilo la ragione sociale se sono valorizzati cognome e nome
245-
if (!$record['ragione_sociale'] && ($record['cognome'] && $record['nome'])) {
246-
$record['ragione_sociale'] = $record['cognome'].' '.$record['nome'];
273+
if (empty($record['ragione_sociale']) && (!empty($record['cognome']) && !empty($record['nome']))) {
274+
$record['ragione_sociale'] = trim($record['cognome'].' '.$record['nome']);
247275
}
248-
unset($record['cognome']);
249-
unset($record['nome']);
276+
277+
// Rimuovo i campi già utilizzati per la ragione sociale
278+
$nome = $record['nome'] ?? '';
279+
$cognome = $record['cognome'] ?? '';
280+
unset($record['nome'], $record['cognome']);
250281

251-
// Ricerca di eventuale anagrafica corrispondente sulla base del campo definito come primary_key (es. codice)
252-
if (!empty($primary_key)) {
282+
// Ricerca di eventuale anagrafica corrispondente sulla base del campo definito come primary_key
283+
$anagrafica = null;
284+
if (!empty($primary_key) && !empty($record[$primary_key])) {
253285
$anagrafica = Anagrafica::where($primary_key, '=', trim((string) $record[$primary_key]))->first();
254286
}
255287

256288
// Controllo se creare o aggiornare il record
257289
if (($anagrafica && !$update_record) || (!$anagrafica && !$add_record)) {
258-
return;
290+
return null;
259291
}
260292

261293
// Se non trovo nessuna anagrafica corrispondente, allora la creo
262294
if (empty($anagrafica)) {
263295
$anagrafica = Anagrafica::build($record['ragione_sociale']);
264296
}
265297

266-
// Individuazione del tipo dell'anagrafica
267-
$tipologie = [];
268-
if (!empty($record['tipologia'])) {
269-
$tipi_selezionati = explode(',', (string) $record['tipologia']);
270-
271-
foreach ($tipi_selezionati as $tipo) {
272-
$id_tipo = Tipo::where('name', $tipo)->first()->id;
273-
274-
// Creo il tipo anagrafica se non esiste
275-
if (empty($id_tipo)) {
276-
$id_tipo = database()->query('INSERT INTO `an_tipianagrafiche` (`id`, `default`) VALUES (NULL, `1`)');
277-
$database->insert('an_tipianagrafiche_lang', [
278-
'id_lang' => \Models\Locale::getDefault()->id,
279-
'id_record' => $id_tipo,
280-
'name' => $tipo,
281-
])['id'];
282-
283-
$id_tipo = Tipo::where('name', $tipo)->first()->id;
284-
}
285-
286-
$tipologie[] = $id_tipo;
287-
}
298+
// Impedisco di aggiornare l'anagrafica Azienda
299+
if ($anagrafica->id == $id_azienda) {
300+
return false;
288301
}
302+
303+
// Gestione delle tipologie
304+
$tipologie = $this->processaTipologie($record);
289305
unset($record['tipologia']);
290306

307+
// Gestione del tipo
291308
$tipo = '';
292309
if (!empty($record['tipo'])) {
293310
$tipo = $record['tipo'];
294311
}
295312
unset($record['tipo']);
296313

297-
// Fix per campi con contenuti derivati da query implicite
314+
// Gestione della nazione
298315
if (!empty($record['id_nazione'])) {
299316
$record['id_nazione'] = (new Nazione())->getByField('title', $record['id_nazione'], \Models\Locale::getPredefined()->id);
300317
} else {
301318
unset($record['id_nazione']);
302319
}
303320

304-
// Creo il settore merceologico nel caso in cui non sia presente
305-
$id_settore = '';
306-
if (!empty($record['id_settore'])) {
307-
$settore = $record['id_settore'];
308-
$id_settore = $database->fetchArray('SELECT `an_settori`.`id` FROM `an_settori` LEFT JOIN `an_settori_lang` ON (`an_settori`.`id` = `an_settori_lang`.`id_record` AND `an_settori_lang`.`id_lang` = '.prepare(\Models\Locale::getDefault()->id).') WHERE LOWER(`title`) = LOWER('.prepare($settore).')');
321+
// Gestione del settore merceologico
322+
$id_settore = $this->processaSettore($record);
323+
unset($record['id_settore']);
324+
325+
// Gestione dell'IBAN
326+
$id_banca = $this->processaIBAN($record, $anagrafica);
327+
unset($record['codiceiban']);
328+
329+
// Separazione dei campi relativi alla sede legale
330+
$dati_sede = $this->estraiDatiSede($record, $primary_key);
331+
332+
// Rimuovo la ragione sociale dal record per evitare di sovrascriverla
333+
$ragione_sociale = $record['ragione_sociale'];
334+
unset($record['ragione_sociale']);
335+
336+
// Aggiorno l'anagrafica
337+
$anagrafica->fill($record);
338+
339+
// Aggiorno le tipologie solo se sono state passate nel file
340+
if (!empty($tipologie)) {
341+
$anagrafica->tipologie = $tipologie;
342+
}
343+
344+
$anagrafica->id_settore = $id_settore;
345+
$anagrafica->tipo = $tipo;
346+
$anagrafica->save();
347+
348+
// Aggiorno la sede legale
349+
$sede = $anagrafica->sedeLegale;
350+
$sede->fill($dati_sede);
351+
$sede->save();
309352

310-
if (empty($id_settore)) {
311-
$id_settore = database()->query('INSERT INTO `an_settori` (`id`, `created_at`, `updated_at`) VALUES (NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)');
312-
$database->insert('an_settori_lang', [
353+
return true;
354+
}
355+
356+
/**
357+
* Processa le tipologie dell'anagrafica.
358+
*
359+
* @param array $record Record da processare
360+
* @return array Array di ID delle tipologie
361+
*/
362+
private function processaTipologie($record)
363+
{
364+
if (empty($record['tipologia'])) {
365+
return [];
366+
}
367+
368+
$database = database();
369+
$tipologie = [];
370+
$tipi_selezionati = explode(',', (string) $record['tipologia']);
371+
372+
foreach ($tipi_selezionati as $tipo) {
373+
$tipo = trim($tipo);
374+
if (empty($tipo)) {
375+
continue;
376+
}
377+
378+
$tipo_obj = Tipo::where('name', $tipo)->first();
379+
$id_tipo = $tipo_obj ? $tipo_obj->id : null;
380+
381+
// Creo il tipo anagrafica se non esiste
382+
if (empty($id_tipo)) {
383+
$database->query('INSERT INTO `an_tipianagrafiche` (`id`, `default`) VALUES (NULL, 1)');
384+
$id_tipo = $database->lastInsertedID();
385+
386+
$database->insert('an_tipianagrafiche_lang', [
313387
'id_lang' => \Models\Locale::getDefault()->id,
314-
'id_record' => $id_settore,
315-
'title' => $settore,
316-
])['id'];
388+
'id_record' => $id_tipo,
389+
'name' => $tipo,
390+
]);
317391
}
318-
unset($record['id_settore']);
392+
393+
$tipologie[] = $id_tipo;
319394
}
320395

321-
// Separazione dei campi relativi alla sede legale
396+
return $tipologie;
397+
}
398+
399+
/**
400+
* Processa il settore merceologico.
401+
*
402+
* @param array $record Record da processare
403+
* @return string|null ID del settore merceologico
404+
*/
405+
private function processaSettore($record)
406+
{
407+
if (empty($record['id_settore'])) {
408+
return null;
409+
}
410+
411+
$database = database();
412+
$settore = trim($record['id_settore']);
413+
414+
$result = $database->fetchArray('SELECT `an_settori`.`id` FROM `an_settori`
415+
LEFT JOIN `an_settori_lang` ON (`an_settori`.`id` = `an_settori_lang`.`id_record`
416+
AND `an_settori_lang`.`id_lang` = '.prepare(\Models\Locale::getDefault()->id).')
417+
WHERE LOWER(`title`) = LOWER('.prepare($settore).')');
418+
419+
$id_settore = !empty($result) ? $result[0]['id'] : null;
420+
421+
if (empty($id_settore)) {
422+
$database->query('INSERT INTO `an_settori` (`id`, `created_at`, `updated_at`)
423+
VALUES (NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)');
424+
$id_settore = $database->lastInsertedID();
425+
426+
$database->insert('an_settori_lang', [
427+
'id_lang' => \Models\Locale::getDefault()->id,
428+
'id_record' => $id_settore,
429+
'title' => $settore,
430+
]);
431+
}
432+
433+
return $id_settore;
434+
}
435+
436+
/**
437+
* Processa l'IBAN.
438+
*
439+
* @param array $record Record da processare
440+
* @param Anagrafica $anagrafica Anagrafica associata
441+
* @return string|null ID della banca
442+
*/
443+
private function processaIBAN($record, $anagrafica)
444+
{
445+
if (empty($record['codiceiban'])) {
446+
return null;
447+
}
448+
449+
$database = database();
450+
$iban = trim($record['codiceiban']);
451+
452+
$result = $database->fetchOne('SELECT `co_banche`.`id` FROM `co_banche`
453+
WHERE LOWER(`iban`) = LOWER('.prepare($iban).')
454+
AND `id_anagrafica` = '.$anagrafica->id.'
455+
AND deleted_at IS NULL');
456+
457+
$id_banca = !empty($result) ? $result['id'] : null;
458+
459+
if (empty($id_banca)) {
460+
$database->query('INSERT INTO `co_banche` (`iban`, `nome`, `id_anagrafica`)
461+
VALUES ('.prepare($iban).', "Banca da importazione '.addslashes($anagrafica->ragione_sociale).'", '.$anagrafica->id.')');
462+
$id_banca = $database->lastInsertedID();
463+
}
464+
465+
return $id_banca;
466+
}
467+
468+
/**
469+
* Estrae i dati della sede legale dal record.
470+
*
471+
* @param array $record Record da processare
472+
* @param string $primary_key Chiave primaria
473+
* @return array Dati della sede legale
474+
*/
475+
private function estraiDatiSede(&$record, $primary_key)
476+
{
322477
$campi_sede = [
323478
'indirizzo',
324479
'citta',
@@ -338,45 +493,20 @@ public function import($record, $update_record = true, $add_record = true)
338493

339494
$dati_sede = [];
340495
foreach ($campi_sede as $field) {
341-
if ($primary_key != $field) {
342-
if (isset($record[$field])) {
343-
$dati_sede[$field] = trim((string) $record[$field]);
344-
unset($record[$field]);
345-
}
496+
if ($primary_key != $field && isset($record[$field])) {
497+
$dati_sede[$field] = trim((string) $record[$field]);
498+
unset($record[$field]);
346499
}
347500
}
348501

349-
// Impedisco di aggiornare l'anagrafica Azienda
350-
if ($anagrafica->id == $id_azienda) {
351-
return false;
352-
}
353-
unset($record['ragione_sociale']);
354-
355-
$id_banca = '';
356-
if (!empty($record['codiceiban'])) {
357-
$id_banca = $database->fetchOne('SELECT `co_banche`.`id` FROM `co_banche` WHERE LOWER(`iban`) = LOWER('.prepare($record['codiceiban']).') AND `id_anagrafica` = '.$anagrafica->id.' AND deleted_at IS NULL');
358-
359-
if (empty($id_banca)) {
360-
$id_banca = $database->query('INSERT INTO `co_banche` (`iban`, `nome`,`id_anagrafica`) VALUES ('.prepare($record['codiceiban']).', "Banca da importazione '.$anagrafica->ragione_sociale.'", '.$anagrafica->id.')');
361-
}
362-
unset($record['codiceiban']);
363-
}
364-
365-
$anagrafica->fill($record);
366-
367-
// Aggiorno le tipologie solo se sono state passate nel file
368-
if (!empty($tipologie)) {
369-
$anagrafica->tipologie = $tipologie;
370-
}
371-
$anagrafica->id_settore = $id_settore;
372-
$anagrafica->tipo = $tipo;
373-
$anagrafica->save();
374-
375-
$sede = $anagrafica->sedeLegale;
376-
$sede->fill($dati_sede);
377-
$sede->save();
502+
return $dati_sede;
378503
}
379504

505+
/**
506+
* Restituisce un esempio di file CSV per l'importazione.
507+
*
508+
* @return array
509+
*/
380510
public static function getExample()
381511
{
382512
return [

0 commit comments

Comments
 (0)