Mir wurde in Jes ein Problem beim Import von Metadaten aus einer e-Rechnung gemeldet.
Die Situation ist folgende:
Die Rechnung weist eine Position mit 2 Artikeln zu 84,03€ netto aus. Das waren offenbar mal 100€ brutto. Als Gesamt-Nettopreis der beiden Artikel werden 168,07€ ausgewiesen, als Gesamt-Bruttobetrag 200,00€.
Mustang 2.26.0 stört sich nun beim Extrahieren der Metadaten daran, daß das Brutto der 2 Artikel nur 199,99€ ergibt, und es fliegt eine ArithmeticException mit der Message "Payable total in XML is 200.00, but calculated total is 199.99 with tax basis 168.06 and with positions 168.06 = 168.06".
Mal abgesehen davon, daß die Nettobeträge in der Rechnung inkonsistent sind (2*84,03€ = 168,06€ und nicht 168,07€)...
Beim bloßen Extrahieren von Metadaten dürfte Mustang diese Inkonsistenz der Angaben nicht interessieren. Wenn ich
ZUGFeRDInvoiceImporter.extractInvoice() aufrufe, frage ich Daten an und nicht das Ergebnis einer Validierung. Insofern das Format der Daten soweit korrekt ist, daß die Anfrage beantwortet werden kann, muß sie auch beantwortet werden - auch wenn die eigentlichen Daten unsinnig sind.
Bei
ZUGFeRDInvoiceImporter.extractInvoice() sind zwei checked Exceptions dokumentiert:
XPathExpressionException und
ParseException. Es fliegt aber eine
ArithmeticException. Das ist nicht nur die völlig falsche Exception ("Thrown when an exceptional arithmetic condition has occurred" - das ist hier nicht der Fall!), sie ist außerdem undokumentiert und auch noch unchecked, so daß man gar nicht weiß, daß Mustang (a) beim Aufruf von
ZUGFeRDInvoiceImporter.extractInvoice() nicht nur das Format validiert, sondern auch eine Plausibilitätsprüfung über den Inhalt durchführt, und (b) daß man diese Exception abfangen sollte, damit das Programm weiterlaufen kann.
To Do:
- ZUGFeRDInvoiceImporter.extractInvoice() sollte nicht die Plausibilität des Inhalts der Metadaten prüfen. Das könnte eine zusätzliche Methode machen oder extractInvoice() macht es optional, gesteuert durch einen Parameter.
- Inkosistenzen im Inhalt sollten nicht mit der ArithmeticException gemeldet werden, denn die ist für Situationen vorgesehen, in denen etwas nicht berechnet werden kann (z.B. Division durch 0). Bei der ParseException merkt man am Feld errorOffset, daß sie nicht die richtige sein kann. Vermutlich ist das eine Situation, in der eine eigene Exception sinnvoll wäre. Diese Exception sollte checked und ordentlich dokumentiert sein.
Ich werde derweil mal Ralf Heydenreich kontaktieren um nachzufragen, ob sich derlei Inkonsistenzen in Rechnungen überhaupt generell ausschließen lassen.