Validieren der eingebenen UST-ID

Hallo zusammen,

wir haben ab und an das Problem das Kunden die UST-ID ohne fehlendem Länderkenner eingibt. Wie kann man das am besten verhindert? Es sollte auch sehr sicher sein, also wenn der Kunde hin und herspringt in dem Registrierungsprozess sollte das immer geprüft werden. Wir brauchen die Nummer mit führendem Länderkenner.

Shopware 6.5.5.2

In den Ländereinstellungen für DE gibt’s einen Haken „USt-ID-Format überprüfen“, falls dir das ausreicht.

1 „Gefällt mir“

Ist gesetzt. Trotzdem schaffen es die Kunden trotzdem mit Nummern ohne führendem Länderkenner durchzukommen, bzw. die Registrierung ohne Länderkenner abzuschließen.

Gibt es hierzu schon eine Lösung? Hab gesehen, dass das Shopware Plugin nicht für SW6 ist.

Ich finde das Ticket nicht, aber mit irgendeinem Shopware 6.6.x soll es behoben worden sein. Testen kann ich es nicht, da wir noch auf 6.5.8.6 sind.

Im Shopware-Standard findet lediglich eine Plausibilitätsprüfung statt. Andere Plugins bieten eine echte Anbindung an die zentrale Dateninstanz in Europa.

Wobei die Plausibilitätsprüfung ja auch das Vorhandensein der zwei Buchstaben prüfen sollte, oder?

1 „Gefällt mir“

ja, aber wenn Du wirklich auf eine händische Prüfung verzichten willst, führt ohnehin kein Weg an einem Plugin mit Schnittstelle vorbei. Die Händler tragen ja auch Leerzeichen ein.

Naja, bei uns ist es so, dass die UST-ID auch akzeptiert wird, wenn die Länderkennung davor fehlt (in Shopware 6.5.8.6). Das verwirft zurecht unser ERP! Das hat nichts mit Plausibilitätsprüfung zu tun. Es sollte einfach mal die Definition von Umsatzsteuer-Identifikationsnummer – Wikipedia beachtet werden. Gerne kann per Plugin auch noch tiefer gegangen werden, ob die UST-ID auch zum eingegeben Unternehmensstandort passt. Uns würde schon reichen, wenn laut Definition auf Umsatzsteuer-Identifikationsnummer – Wikipedia korrekt funktionieren würde.

Habs mir mal genauer angesehen: Im 6.5 waren die Validierungsmuster noch so:

(DE)?[0-9]{9}

im 6.6 aber so

DE\d{9}

Für die, die keine „regex“ sprechen: Bei der alten Variante sind die beiden ersten Buchstaben optional, bei der neuen nicht mehr. Also am besten in der DB das Feld „vat_id_pattern“ in country anpassen, da es, soweit ich sehen kann, dafür kein Feld im Admin gibt.

3 „Gefällt mir“

Danke für die Klärung!

Wer sein 6.5 auf die Pattern von 6.6 ändern möchte, hier mal die Datenbankanweisungen dafür:

UPDATE country SET vat_id_pattern="DE\\d{9}" WHERE iso="DE"; 
UPDATE country SET vat_id_pattern="(EL|GR)?[0-9]{9}" WHERE iso="GR";
UPDATE country SET vat_id_pattern="(GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3})" WHERE iso="GB";
UPDATE country SET vat_id_pattern="IE\\d{7}[A-WY][A-I]?|IE[0-9+][A-Z+][0-9]{5}[A-WY]" WHERE iso="IE";
UPDATE country SET vat_id_pattern="IT\\d{11}" WHERE iso="IT";
UPDATE country SET vat_id_pattern="LU\\d{8}" WHERE iso="LU";
UPDATE country SET vat_id_pattern="NL\\d{9}B\\d{2}" WHERE iso="NL";
UPDATE country SET vat_id_pattern="ATU\\d{8}" WHERE iso="AT";
UPDATE country SET vat_id_pattern="PT\\d{9}" WHERE iso="PT";
UPDATE country SET vat_id_pattern="SE\\d{12}" WHERE iso="SE";
UPDATE country SET vat_id_pattern="ES[A-Z]\\d{7}[A-Z]$|^ES[A-Z][0-9]{7}[0-9A-Z]$|^ES[0-9]{8}[A-Z]" WHERE iso="ES";
UPDATE country SET vat_id_pattern="PL\\d{10}" WHERE iso="PL";
UPDATE country SET vat_id_pattern="HU\\d{8}" WHERE iso="HU";
UPDATE country SET vat_id_pattern="CZ\\d{8,10}" WHERE iso="CZ";
UPDATE country SET vat_id_pattern="SK\\d{10}" WHERE iso="SK";
UPDATE country SET vat_id_pattern="RO\\d{2,10}" WHERE iso="RO";
UPDATE country SET vat_id_pattern="BE0\\d{9}" WHERE iso="BE";
UPDATE country SET vat_id_pattern="DK\\d{8}" WHERE iso="DK";
UPDATE country SET vat_id_pattern="FI\\d{8}" WHERE iso="FI";
UPDATE country SET vat_id_pattern="FR[A-HJ-NP-Z0-9]{2}\\d{9}" WHERE iso="FR";
UPDATE country SET vat_id_pattern="BG\\d{9,10}" WHERE iso="BG";
UPDATE country SET vat_id_pattern="EE\\d{9}" WHERE iso="EE";
UPDATE country SET vat_id_pattern="LV\\d{11}" WHERE iso="LV";
UPDATE country SET vat_id_pattern="LT\\d{9,12}" WHERE iso="LT";
UPDATE country SET vat_id_pattern="MT\\d{8}" WHERE iso="MT";
UPDATE country SET vat_id_pattern="SI\\d{8}" WHERE iso="SI";
UPDATE country SET vat_id_pattern="CY\\d{8}L" WHERE iso="CY";

Die Tabelle country sicherheitshalber vorher sichern.

Sehe ich das richtig, dass wenn jemand ein Leezeichen nach seinem Ländercode eingibt, die Überprüfung fehlschlägt?

Hier wäre es doch äußerst sinnvoll, wenn vorher Leezeichen aus der UID entfernt werden würden.

1 „Gefällt mir“

Das interessiert mich auch. Unser ERP würde Leerzeichen akzeptieren. Einige Kunden von uns kopieren jedoch die UST-ID von ihrer Webseite und hier sind oftmals Leerzeichen enthalten (nicht nur nach dem Ländercode).

Müssten somit dann den Fehlermeldungenstext erweitern, damit Kunden verstehen, warum die eingegebene UST-ID als ungültig angesehen wird.

Cool wäre es daher, wenn die UST-ID mit Leerzeichen eingegeben werden kann aber in Shopware dann ohne Leerzeichen geschrieben wird (Leerzeichen werden automatisch entfernt).

Kann daher nur @mm-webconsulting zustimmen.

Also wir hatten tatsächlich auch das Problem mal, ich habe aber einfach im TWIG ein Script mit eingefügt dass die Leerzeichen dann einfach entfernt. Heißt als Endkunde, kannst du zwar ein Leerzeichen eingeben aber wird direkt weggeschnitten. Auch wenn ich z.B. DE 123 4 5 678 kopiert habe als Endkunde und möchte es im UST-ID eintragen kann er das tun, nur dass dann im Feld eben alles weggeschnitten wird und somit DE12345678 stehen bleibt.

Vom Code her, waren das 3-4 Zeilen.

Da kann man mit JS ein wenig nachhelfen:

onblur="this.value=this.value.replace(/\s+/g, '');"

Damit werden alle Leerzeichen (auch Tabs etc) nach verlassen des Feldes entfernt.

genau mit JS hab ich es auch gemacht :slight_smile:

Einfach im TWIG den button überschrieben mit der Verbindung mittels „oninput“ und dann das script hinterher

{% block component_address_form_company_vatId_input %}
    <input type="text"
           class="form-control{% if violationPath %} is-invalid{% endif %}"
           id="vatIds"
           placeholder="{{ "address.companyVatPlaceholder"|trans|striptags }}"
           name="vatIds[]"
           value="{{ vatIdValue }}"
           oninput="trimSpaces(this)"> 
    <script>
        function trimSpaces(inputField) {
            inputField.value = inputField.value.replace(/\s+/g, '').trim();
        }
    </script>
{% endblock %}