Dlaczego zatrzymuje całe wysłanie
Dokument walidacji AEAT rozróżnia trzy rodzaje kontroli: strukturalne, składniowe i biznesowe. Kontrole strukturalne sprawdzają, czy XML jest zgodny ze schematem, z jego obowiązkowymi znacznikami, a gdy nie przechodzą, odrzucany jest cały komunikat. Takie odrzucenie wraca jako SoapFault i żadna faktura z tego żądania nie zostaje zarejestrowana, nawet poprawne.
Oficjalna lista mówi to wprost: „El XML no cumple el esquema. Falta informar campo obligatorio.” Znajduje się w pierwszej sekcji, czyli kodach odrzucających całe wysłanie.

Co robi moduł, żeby do tego nie doszło
Jeden źle sformowany rekord pociągnąłby za sobą wszystkie pozostałe rekordy tego samego wysłania. Aby temu zapobiec, moduł waliduje każdy rekord względem oficjalnego schematu AEAT, zanim go wyśle. Zawiera kopię tego schematu, plik SuministroLR.xsd wraz z zależnościami, a ścieżka wygląda tak:
- Po zaksięgowaniu faktury Powstaje jej rekord fakturowania, który już się nie zmienia.
- Przy kolejnym przebiegu kolejki Każdy oczekujący rekord jest zamieniany na XML i walidowany względem schematu.
- Jeśli rekord jest niezgodny Zostaje oznaczony w Odoo jako odrzucony z komunikatem schematu, bez kodu AEAT, i nie wychodzi.
- Reszta Trafia do AEAT w tym samym żądaniu, bez złego rekordu.
Dzięki temu wadliwy rekord nie pociąga za sobą poprawnych faktur, które jadą razem z nim.
Jak to zobaczysz w Odoo
W kolejce wysyłki zatrzymany rekord widnieje jako Failed, a w polu ostatniego błędu jest komunikat walidatora zamiast czterocyfrowego kodu. Ten komunikat wskazuje element, którego brakuje lub który jest nie na miejscu, czyli dokładnie to, czego potrzebujesz, żeby ustalić źródło problemu. Na liście rekordów fakturowania jego status to „Rechazado AEAT”, czyli odrzucony przez AEAT, mimo że AEAT go nigdy nie widziała.

Jeszcze przed schematem są dane, bez których moduł w ogóle nie zbuduje XML, i informuje o tym własnym komunikatem:
Company … has no NIF for Veri*Factu.gdy firma nie ma NIF.Record … has no tax breakdown (Desglose) to declare.gdy rekord nie ma rozbicia podatków.
Jeśli 4102 przyjdzie z AEAT
Jeśli odpowiedź z kodem 4102 pochodzi bezpośrednio od AEAT, rekord przeszedł lokalną walidację, a AEAT odrzuciła go własnym schematem. Rozsądne wyjaśnienie jest takie, że schemat AEAT i kopia zawarta w module przestały się zgadzać. W takim przypadku ponowne wysłanie nie ma sensu: napisz na comercial@flexigobe.com z pełną odpowiedzią, polem Raw Response z kolejki, abyśmy mogli sprawdzić kopię schematu.
Czy mogę poprawić dane i ponowić?
Zależy to od tego, gdzie leżą dane. Nagłówek budowany jest przy każdym wysłaniu z danych firmy obowiązujących w tym momencie: jeśli błąd dotyczył nazwy, popraw ją i użyj opcji Reintentar Selección w Errores AEAT. Jeśli dotyczył NIF, sama poprawka nie wystarczy, bo NIF wszedł też do skrótu każdej faktury przy jej zaksięgowaniu, a ponowne wysłanie wróci z kodem 2000. Jeśli dane znajdują się w rekordzie faktury, ponowienie wyśle to samo i znów się nie powiedzie. W tych dwóch przypadkach napisz do nas.
Czy faktura przepada?
Nie. Rekord pozostaje w Odoo, połączony w łańcuch, a kolejka przetwarza oczekujące rekordy co 1 minutę, gdy tylko problem zostanie rozwiązany.
Czytaj dalej
Sprawdzone w kodzie źródłowym modułu (wersja 20.0) i w podlinkowanych źródłach
Źródła
- www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validacione
- Kod modułu: flexigo_spain_verifactu 20.0 (aa2ea3d2): models/verifactu_aeat_client.py
- Kod modułu: flexigo_spain_verifactu 20.0 (aa2ea3d2): data/verifactu_crons.xml
- Kod modułu: flexigo_spain_verifactu 20.0 (aa2ea3d2): models/verifactu_cola_envio.py
- Kod modułu: flexigo_spain_verifactu 20.0 (aa2ea3d2): models/verifactu_registro.py
- prewww2.aeat.es/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/err
- Kod modułu: flexigo_spain_verifactu 20.0 (aa2ea3d2): models/verifactu_cadena.py
