3232 */
3333class 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