@@ -116,15 +116,25 @@ public static function isValidVatNumber($vat_number)
116116 // Indirizzo
117117 $ address = $ data ->company_address ?: '' ;
118118 $ info = explode (PHP_EOL , (string ) $ address );
119- $ fields ['indirizzo ' ] = $ info [0 ];
120119
121- $ info = explode (' ' , $ info [1 ] ?: '' );
120+ // Se l'indirizzo è su più righe
121+ if (count ($ info ) > 1 && !empty ($ info [1 ])) {
122+ $ fields ['indirizzo ' ] = $ info [0 ];
123+ $ info = explode (' ' , $ info [1 ]);
122124
123- $ fields ['cap ' ] = $ info [0 ];
124- $ fields ['provincia ' ] = end ($ info );
125+ $ fields ['cap ' ] = $ info [0 ] ?? '' ;
126+ $ fields ['provincia ' ] = end ($ info );
125127
126- $ citta = array_slice ($ info , 1 , -1 );
127- $ fields ['citta ' ] = implode (' ' , $ citta );
128+ $ citta = array_slice ($ info , 1 , -1 );
129+ $ fields ['citta ' ] = implode (' ' , $ citta );
130+ } else {
131+ // Se l'indirizzo è su una sola riga, prova a parsarlo
132+ $ parsed = self ::parseIndirizzo ($ address );
133+ $ fields ['indirizzo ' ] = $ parsed ['indirizzo ' ];
134+ $ fields ['cap ' ] = $ parsed ['cap ' ];
135+ $ fields ['citta ' ] = $ parsed ['citta ' ];
136+ $ fields ['provincia ' ] = $ parsed ['provincia ' ];
137+ }
128138
129139 $ result ['fields ' ] = $ fields ;
130140 } elseif (Services::verificaRisorsaAttiva ('Verifica Partita IVA ' )) {
@@ -145,15 +155,24 @@ public static function isValidVatNumber($vat_number)
145155 $ address = $ data ['result ' ]['company_address ' ];
146156 $ info = explode (PHP_EOL , (string ) $ address );
147157
148- $ fields ['indirizzo ' ] = $ info [0 ];
149-
150- $ info = $ info [1 ] ? explode (' ' , $ info [1 ]) : $ info ;
151-
152- $ fields ['cap ' ] = $ info [0 ];
153- $ fields ['provincia ' ] = end ($ info );
154-
155- $ citta = array_slice ($ info , 1 , -1 );
156- $ fields ['citta ' ] = implode (' ' , $ citta );
158+ // Se l'indirizzo è su più righe
159+ if (count ($ info ) > 1 && !empty ($ info [1 ])) {
160+ $ fields ['indirizzo ' ] = $ info [0 ];
161+ $ info = explode (' ' , $ info [1 ]);
162+
163+ $ fields ['cap ' ] = $ info [0 ] ?? '' ;
164+ $ fields ['provincia ' ] = end ($ info );
165+
166+ $ citta = array_slice ($ info , 1 , -1 );
167+ $ fields ['citta ' ] = implode (' ' , $ citta );
168+ } else {
169+ // Se l'indirizzo è su una sola riga, prova a parsarlo
170+ $ parsed = self ::parseIndirizzo ($ address );
171+ $ fields ['indirizzo ' ] = $ parsed ['indirizzo ' ];
172+ $ fields ['cap ' ] = $ parsed ['cap ' ];
173+ $ fields ['citta ' ] = $ parsed ['citta ' ];
174+ $ fields ['provincia ' ] = $ parsed ['provincia ' ];
175+ }
157176
158177 $ result ['fields ' ] = $ fields ;
159178 }
@@ -258,4 +277,61 @@ public static function isValidTaxCode($codice_fiscale)
258277
259278 return $ validator ->isFormallyValid ();
260279 }
280+
281+ /**
282+ * Parsa un indirizzo su una sola riga cercando di estrarre CAP, città e provincia.
283+ * Formato tipico: "VIA ROMA 123 20100 MILANO MI"
284+ *
285+ * @param string $address
286+ * @return array
287+ */
288+ protected static function parseIndirizzo ($ address )
289+ {
290+ $ result = [
291+ 'indirizzo ' => '' ,
292+ 'cap ' => '' ,
293+ 'citta ' => '' ,
294+ 'provincia ' => '' ,
295+ ];
296+
297+ if (empty ($ address )) {
298+ return $ result ;
299+ }
300+
301+ // Cerca il CAP (5 cifre consecutive)
302+ if (preg_match ('/\b(\d{5})\b/ ' , $ address , $ matches )) {
303+ $ cap = $ matches [1 ];
304+ $ result ['cap ' ] = $ cap ;
305+
306+ // Dividi l'indirizzo in base alla posizione del CAP
307+ $ parts = explode ($ cap , $ address , 2 );
308+
309+ // La parte prima del CAP è l'indirizzo
310+ $ result ['indirizzo ' ] = trim ($ parts [0 ]);
311+
312+ // La parte dopo il CAP contiene città e provincia
313+ if (isset ($ parts [1 ])) {
314+ $ resto = trim ($ parts [1 ]);
315+
316+ // Cerca la provincia (2 lettere maiuscole alla fine, eventualmente tra parentesi)
317+ if (preg_match ('/\b([A-Z]{2})\s*$/i ' , $ resto , $ prov_matches )) {
318+ $ result ['provincia ' ] = strtoupper ($ prov_matches [1 ]);
319+ // Rimuovi la provincia dal resto
320+ $ resto = trim (preg_replace ('/\b[A-Z]{2}\s*$/i ' , '' , $ resto ));
321+ } elseif (preg_match ('/\(([A-Z]{2})\)\s*$/i ' , $ resto , $ prov_matches )) {
322+ $ result ['provincia ' ] = strtoupper ($ prov_matches [1 ]);
323+ // Rimuovi la provincia dal resto
324+ $ resto = trim (preg_replace ('/\([A-Z]{2}\)\s*$/i ' , '' , $ resto ));
325+ }
326+
327+ // Quello che rimane è la città
328+ $ result ['citta ' ] = trim ($ resto );
329+ }
330+ } else {
331+ // Se non trova il CAP, metti tutto nell'indirizzo
332+ $ result ['indirizzo ' ] = $ address ;
333+ }
334+
335+ return $ result ;
336+ }
261337}
0 commit comments