Skip to content

Commit eab2c5f

Browse files
committed
refactor: gestione indirizzo apilayer con solo indirizzo valorizzato
1 parent c93f71e commit eab2c5f

1 file changed

Lines changed: 91 additions & 15 deletions

File tree

src/Validate.php

Lines changed: 91 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)