timeout(8) ->post($this->endpoint(), [ 'countryCode' => $parts[1], 'vatNumber' => $parts[2], ]); } catch (Throwable $e) { return VatIdCheck::unavailable($e->getMessage()); } if (! $response->successful()) { return VatIdCheck::unavailable('http_'.$response->status()); } $error = (string) ($response->json('userError') ?? ''); if (in_array($error, self::GATEWAY_ERRORS, true)) { Log::info('VIES could not answer for a VAT number', ['reason' => $error]); return VatIdCheck::unavailable($error); } if ($response->json('valid') !== true) { return VatIdCheck::invalid(); } // The register returns "---" for a company that has asked not to have its // details published. That is a registered number with no name attached, // not an empty answer, so it is stored as nothing rather than as dashes. return VatIdCheck::valid( $this->orNull($response->json('name')), $this->orNull($response->json('address')), ); } private function orNull(mixed $value): ?string { $value = trim((string) $value); return $value === '' || trim($value, '- ') === '' ? null : $value; } private function endpoint(): string { return rtrim((string) config( 'services.vies.endpoint', 'https://ec.europa.eu/taxation_customs/vies/rest-api/check-vat-number', ), '/'); } }