2424use Modules \Anagrafiche \Anagrafica ;
2525use Modules \Anagrafiche \Tipo as TipoAnagrafica ;
2626use Modules \Impianti \Impianto ;
27+ use Modules \Interventi \Components \Riga ;
2728use Modules \Interventi \Components \Sessione ;
2829use Modules \Interventi \Intervento ;
2930use Modules \Interventi \Stato ;
31+ use Modules \Iva \Aliquota ;
3032use Modules \TipiIntervento \Tipo as TipoIntervento ;
3133
3234/**
@@ -54,12 +56,17 @@ public function getAvailableFields()
5456 [
5557 'field ' => 'partita_iva ' ,
5658 'label ' => 'Partita IVA cliente ' ,
57- 'required ' => false , // Almeno uno tra partita IVA e codice fiscale deve essere presente
59+ 'required ' => false , // Se non trova corrispondenza, verrà creata una nuova anagrafica
5860 ],
5961 [
6062 'field ' => 'codice_fiscale ' ,
6163 'label ' => 'Codice Fiscale cliente ' ,
62- 'required ' => false , // Almeno uno tra partita IVA e codice fiscale deve essere presente
64+ 'required ' => false , // Se non trova corrispondenza, verrà creata una nuova anagrafica
65+ ],
66+ [
67+ 'field ' => 'ragione_sociale ' ,
68+ 'label ' => 'Ragione Sociale cliente ' ,
69+ 'required ' => false , // Se non trova corrispondenza, verrà creata una nuova anagrafica
6370 ],
6471 [
6572 'field ' => 'data ' ,
@@ -69,12 +76,10 @@ public function getAvailableFields()
6976 [
7077 'field ' => 'data_richiesta ' ,
7178 'label ' => 'Data richiesta ' ,
72- 'required ' => true ,
7379 ],
7480 [
7581 'field ' => 'ora_inizio ' ,
7682 'label ' => 'Ora inizio ' ,
77- 'required ' => true ,
7883 ],
7984 [
8085 'field ' => 'ora_fine ' ,
@@ -83,7 +88,6 @@ public function getAvailableFields()
8388 [
8489 'field ' => 'tecnico ' ,
8590 'label ' => 'Tecnico ' ,
86- 'required ' => true ,
8791 ],
8892 [
8993 'field ' => 'tipo ' ,
@@ -110,6 +114,21 @@ public function getAvailableFields()
110114 'field ' => 'stato ' ,
111115 'label ' => 'Stato ' ,
112116 ],
117+ [
118+ 'field ' => 'descrizione_riga ' ,
119+ 'label ' => 'Descrizione riga ' ,
120+ 'required ' => false ,
121+ ],
122+ [
123+ 'field ' => 'imponibile ' ,
124+ 'label ' => 'Imponibile riga ' ,
125+ 'required ' => false ,
126+ ],
127+ [
128+ 'field ' => 'aliquota_iva ' ,
129+ 'label ' => 'Aliquota IVA (%) ' ,
130+ 'required ' => false ,
131+ ],
113132 ];
114133 }
115134
@@ -136,19 +155,15 @@ public function init()
136155 public function import ($ record , $ update_record = true , $ add_record = true )
137156 {
138157 try {
139- $ database = database ();
140158 $ primary_key = $ this ->getPrimaryKey ();
141159
142160 // Validazione dei campi obbligatori
143- if (empty ($ record ['codice ' ]) || empty ($ record ['data ' ]) || empty ($ record ['data_richiesta ' ])
144- || empty ($ record ['ora_inizio ' ]) || empty ($ record ['tecnico ' ]) || empty ($ record ['richiesta ' ])) {
161+ if (empty ($ record ['codice ' ]) || empty ($ record ['data ' ]) || empty ($ record ['richiesta ' ])) {
145162 return false ;
146163 }
147164
148- // Verifica che almeno uno tra partita IVA e codice fiscale sia presente
149- if (empty ($ record ['partita_iva ' ]) && empty ($ record ['codice_fiscale ' ])) {
150- return false ;
151- }
165+ // Nota: Non è più necessario verificare la presenza di partita IVA, codice fiscale o ragione sociale
166+ // perché se non vengono trovate corrispondenze, verrà creata automaticamente una nuova anagrafica
152167
153168 // Ricerca dell'anagrafica cliente
154169 $ anagrafica = $ this ->trovaAnagrafica ($ record );
@@ -203,6 +218,9 @@ public function import($record, $update_record = true, $add_record = true)
203218 // Crea la sessione di lavoro
204219 $ this ->creaSessione ($ intervento , $ record );
205220
221+ // Crea la riga dell'intervento se specificata
222+ $ this ->creaRigaIntervento ($ intervento , $ record );
223+
206224 return true ;
207225 } catch (\Exception $ e ) {
208226 // Registra l'errore in un log
@@ -220,31 +238,45 @@ public function import($record, $update_record = true, $add_record = true)
220238 public static function getExample ()
221239 {
222240 return [
223- ['Codice ' , 'Partita IVA Cliente ' , 'Codice Fiscale Cliente ' , 'Data ' , 'Data richiesta ' , 'Ora inizio ' , 'Ora fine ' , 'Tecnico ' , 'Tipo ' , 'Note ' , 'Impianto ' , 'Richiesta ' , 'Descrizione ' , 'Stato ' ],
224- ['00001/2024 ' , '123456789 ' , '123456789 ' , '07/11/2024 ' , '03/11/2025 ' , '8:30 ' , '9:30 ' , 'Stefano Bianchi ' , '' , '' , '12345-85A22 ' , 'Manutenzione ordinaria ' , 'eseguito intervento di manutenzione ' , 'Da programmare ' ],
225- ['0002/2024 ' , '123456789 ' , '123456789 ' , '08/11/2024 ' , '04/11/2025 ' , '11:20 ' , '' , 'Stefano Bianchi ' , '' , '' , '12345-85B23 ' , 'Manutenzione ordinaria ' , 'eseguito intervento di manutenzione ' , '' ],
241+ ['Codice ' , 'Partita IVA Cliente ' , 'Codice Fiscale Cliente ' , 'Ragione Sociale Cliente ' , 'Data ' , 'Data richiesta ' , 'Ora inizio ' , 'Ora fine ' , 'Tecnico ' , 'Tipo ' , 'Note ' , 'Impianto ' , 'Richiesta ' , 'Descrizione ' , 'Stato ' , 'Descrizione riga ' , 'Imponibile riga ' , 'Aliquota IVA (%) ' ],
242+ ['00001/2024 ' , '123456789 ' , '123456789 ' , 'Acme S.r.l. ' , '07/11/2024 ' , '03/11/2025 ' , '8:30 ' , '9:30 ' , 'Stefano Bianchi ' , '' , '' , '12345-85A22 ' , 'Manutenzione ordinaria ' , 'eseguito intervento di manutenzione ' , 'Da programmare ' , 'Servizio di manutenzione ' , '100.00 ' , '22 ' ],
243+ ['0002/2024 ' , '' , '' , 'Beta Company S.p.A. ' , '08/11/2024 ' , '04/11/2025 ' , '11:20 ' , '' , 'Stefano Bianchi ' , '' , '' , '12345-85B23 ' , 'Manutenzione ordinaria ' , 'eseguito intervento di manutenzione ' , '' , 'Controllo impianto ' , '150.00 ' , '22 ' ],
244+ ['0003/2024 ' , '' , '' , '' , '09/11/2024 ' , '05/11/2025 ' , '14:00 ' , '15:00 ' , 'Stefano Bianchi ' , '' , '' , '' , 'Intervento urgente ' , 'riparazione guasto ' , 'Completato ' , 'Riparazione urgente ' , '200.00 ' , '22 ' ],
226245 ];
227246 }
228247
229248 /**
230- * Trova l'anagrafica cliente in base alla partita IVA o al codice fiscale.
249+ * Trova l'anagrafica cliente in base alla partita IVA, al codice fiscale o alla ragione sociale.
250+ * Se non trova nessuna corrispondenza, crea una nuova anagrafica.
231251 *
232252 * @param array $record Record da processare
233253 *
234- * @return Anagrafica|null Anagrafica trovata o null se non trovata
254+ * @return Anagrafica|null Anagrafica trovata o creata, null in caso di errore
235255 */
236256 protected function trovaAnagrafica ($ record )
237257 {
238258 $ anagrafica = null ;
239259
260+ // Ricerca per partita IVA
240261 if (!empty ($ record ['partita_iva ' ])) {
241262 $ anagrafica = Anagrafica::where ('piva ' , '= ' , $ record ['partita_iva ' ])->first ();
242263 }
243264
265+ // Ricerca per codice fiscale se non trovata con partita IVA
244266 if (empty ($ anagrafica ) && !empty ($ record ['codice_fiscale ' ])) {
245267 $ anagrafica = Anagrafica::where ('codice_fiscale ' , '= ' , $ record ['codice_fiscale ' ])->first ();
246268 }
247269
270+ // Ricerca per ragione sociale se non trovata con partita IVA o codice fiscale
271+ if (empty ($ anagrafica ) && !empty ($ record ['ragione_sociale ' ])) {
272+ $ anagrafica = Anagrafica::where ('ragione_sociale ' , '= ' , $ record ['ragione_sociale ' ])->first ();
273+ }
274+
275+ // Se non trova nessuna anagrafica, ne crea una nuova
276+ if (empty ($ anagrafica )) {
277+ $ anagrafica = $ this ->creaAnagrafica ($ record );
278+ }
279+
248280 return $ anagrafica ;
249281 }
250282
@@ -392,4 +424,125 @@ protected function creaSessione($intervento, $record)
392424 return null ;
393425 }
394426 }
427+
428+ /**
429+ * Crea una nuova anagrafica in base ai dati del record.
430+ *
431+ * @param array $record Record da processare
432+ *
433+ * @return Anagrafica|null Anagrafica creata o null in caso di errore
434+ */
435+ protected function creaAnagrafica ($ record )
436+ {
437+ try {
438+ // Determina la ragione sociale da utilizzare
439+ $ ragione_sociale = '' ;
440+ if (!empty ($ record ['ragione_sociale ' ])) {
441+ $ ragione_sociale = $ record ['ragione_sociale ' ];
442+ } elseif (!empty ($ record ['partita_iva ' ])) {
443+ $ ragione_sociale = 'Cliente P.IVA ' .$ record ['partita_iva ' ];
444+ } elseif (!empty ($ record ['codice_fiscale ' ])) {
445+ $ ragione_sociale = 'Cliente C.F. ' .$ record ['codice_fiscale ' ];
446+ } else {
447+ $ ragione_sociale = 'Cliente importato ' .date ('Y-m-d H:i:s ' );
448+ }
449+
450+ // Crea la nuova anagrafica
451+ $ anagrafica = Anagrafica::build ($ ragione_sociale );
452+
453+ // Imposta partita IVA se presente
454+ if (!empty ($ record ['partita_iva ' ])) {
455+ $ anagrafica ->piva = $ record ['partita_iva ' ];
456+ }
457+
458+ // Imposta codice fiscale se presente
459+ if (!empty ($ record ['codice_fiscale ' ])) {
460+ $ anagrafica ->codice_fiscale = $ record ['codice_fiscale ' ];
461+ }
462+
463+ // Assegna il tipo "Cliente" all'anagrafica
464+ $ tipo_cliente = TipoAnagrafica::where ('name ' , 'Cliente ' )->first ();
465+ if (!empty ($ tipo_cliente )) {
466+ $ anagrafica ->tipologie = [$ tipo_cliente ->id ];
467+ }
468+
469+ // Salva l'anagrafica
470+ $ anagrafica ->save ();
471+
472+ return $ anagrafica ;
473+ } catch (\Exception $ e ) {
474+ // Registra l'errore
475+ error_log ('Errore durante la creazione dell \'anagrafica: ' .$ e ->getMessage ());
476+
477+ return null ;
478+ }
479+ }
480+
481+ /**
482+ * Trova l'aliquota IVA in base alla percentuale.
483+ *
484+ * @param float $percentuale Percentuale dell'aliquota IVA
485+ *
486+ * @return Aliquota|null Aliquota trovata o null se non trovata
487+ */
488+ protected function trovaAliquotaIva ($ percentuale )
489+ {
490+ if (empty ($ percentuale )) {
491+ return Aliquota::find (setting ('Iva predefinita ' ));
492+ }
493+
494+ // Cerca l'aliquota IVA per percentuale
495+ $ aliquota = Aliquota::where ('percentuale ' , $ percentuale )->first ();
496+
497+ // Se non trova l'aliquota, usa quella predefinita
498+ if (empty ($ aliquota )) {
499+ $ aliquota = Aliquota::find (setting ('Iva predefinita ' ));
500+ }
501+
502+ return $ aliquota ;
503+ }
504+
505+ /**
506+ * Crea una riga per l'intervento se specificata.
507+ *
508+ * @param Intervento $intervento Intervento associato
509+ * @param array $record Record da processare
510+ *
511+ * @return Riga|null Riga creata o null se non creata
512+ */
513+ protected function creaRigaIntervento ($ intervento , $ record )
514+ {
515+ // Verifica se sono presenti i dati per creare una riga
516+ if (empty ($ record ['descrizione_riga ' ]) && empty ($ record ['imponibile ' ])) {
517+ return null ;
518+ }
519+
520+ try {
521+ // Crea una nuova riga per l'intervento
522+ $ riga = Riga::build ($ intervento );
523+
524+ // Imposta la descrizione della riga
525+ $ riga ->descrizione = $ record ['descrizione_riga ' ] ?: 'Riga importata ' ;
526+
527+ // Imposta la quantità a 1
528+ $ riga ->qta = 1 ;
529+
530+ // Trova l'aliquota IVA
531+ $ aliquota = $ this ->trovaAliquotaIva ($ record ['aliquota_iva ' ]);
532+
533+ // Imposta il prezzo unitario e l'IVA
534+ $ prezzo_unitario = !empty ($ record ['imponibile ' ]) ? floatval ($ record ['imponibile ' ]) : 0 ;
535+ $ riga ->setPrezzoUnitario ($ prezzo_unitario , $ aliquota ->id );
536+
537+ // Salva la riga
538+ $ riga ->save ();
539+
540+ return $ riga ;
541+ } catch (\Exception $ e ) {
542+ // Registra l'errore ma continua con l'importazione
543+ error_log ('Errore durante la creazione della riga dell \'intervento: ' .$ e ->getMessage ());
544+
545+ return null ;
546+ }
547+ }
395548}
0 commit comments