result(VatIdCheckStatus::Unverified, __('Keine USt-ID angegeben.')); } $prefix = substr($vatId, 0, 2); $prefixCountry = $prefix === 'EL' ? 'GR' : $prefix; if (! $this->vatResolver->isPlausibleVatId($vatId, $prefixCountry)) { return $this->result( VatIdCheckStatus::FormatInvalid, __('Das Format der USt-ID ist ungültig (erwartet: Ländercode + Kennziffer, z. B. DE123456789).'), ); } $billingCountryCode = strtoupper((string) $billingCountryCode); if ($billingCountryCode !== '' && ! $this->vatResolver->isPlausibleVatId($vatId, $billingCountryCode)) { return $this->result( VatIdCheckStatus::FormatInvalid, __('Die USt-ID passt nicht zum Land der Rechnungsadresse (:country).', ['country' => $billingCountryCode]), ); } if ($prefix === 'DE') { return $this->result( VatIdCheckStatus::Unverified, __('Format plausibel. Deutsche USt-IDs können über eVatR nicht online bestätigt werden.'), ); } if (! in_array($prefixCountry, (array) config('billing.eu_country_codes', []), true)) { return $this->result( VatIdCheckStatus::Unverified, __('Format plausibel. Online-Bestätigung ist nur für EU-USt-IDs möglich.'), ); } $ownVatId = (string) config('billing.own_vat_id'); if ($ownVatId === '') { return $this->result( VatIdCheckStatus::Unverified, __('Format plausibel. Online-Prüfung ist nicht konfiguriert (BILLING_OWN_VAT_ID).'), ); } return $this->confirmViaEvatr($vatId, $ownVatId); } /** * @return array{status: VatIdCheckStatus, message: string} */ private function confirmViaEvatr(string $vatId, string $ownVatId): array { $cacheKey = 'evatr-check:'.$vatId; /** @var array{status: VatIdCheckStatus, message: string}|null $cached */ $cached = Cache::get($cacheKey); if ($cached !== null) { return $cached; } try { $response = Http::timeout(8) ->acceptJson() ->post(self::EVATR_ENDPOINT, [ 'anfragendeUstid' => $ownVatId, 'angefragteUstid' => $vatId, ]); } catch (\Throwable $exception) { Log::warning('eVatR-Abfrage fehlgeschlagen.', ['vat_id' => $vatId, 'error' => $exception->getMessage()]); return $this->result( VatIdCheckStatus::Unverified, __('Format plausibel. Die Online-Prüfung (eVatR) ist derzeit nicht erreichbar.'), ); } if (! $response->successful()) { return $this->result( VatIdCheckStatus::Unverified, __('Format plausibel. Die Online-Prüfung (eVatR) ist derzeit nicht verfügbar.'), ); } $status = (string) $response->json('status'); $result = $status === self::STATUS_VALID ? $this->result(VatIdCheckStatus::Valid, __('USt-ID per eVatR (BZSt) bestätigt — gültig.')) : $this->result( VatIdCheckStatus::Invalid, __('Die USt-ID wurde von eVatR (BZSt) nicht bestätigt (Status :status).', ['status' => $status ?: 'unbekannt']), ); // Nur definitive Ergebnisse cachen — Ausfälle der API sollen beim // nächsten Versuch erneut geprüft werden. Cache::put($cacheKey, $result, now()->addHours(6)); return $result; } /** * @return array{status: VatIdCheckStatus, message: string} */ private function result(VatIdCheckStatus $status, string $message): array { return ['status' => $status, 'message' => $message]; } }