Μετάβαση στο περιεχόμενο
dg.dev
← όλα τα έργα

2026 · ενημέρωση 26 Σεπ 2026

myData-Client-Lib

Πιάστε τις απορρίψεις της ΑΑΔΕ στον δικό σας υπολογιστή, πριν φύγει καν το αίτημα.

Το πρόβλημα

Το endpoint SendInvoices του myDATA επιβάλλει μια μακριά λίστα επιχειρησιακών κανόνων (αριθμητική μικτού, καθαρού και φόρου, σύνολα γραμμών προς σύνοψη, απαγορευμένα πεδία, κωδικούς απαλλαγής ΦΠΑ), αλλά τους ελέγχει μόνο αφού το αίτημα φτάσει στην ΑΑΔΕ. Μια παρτίδα 100 παραστατικών μπορεί να γυρίσει 200 OK με 97 αποδοχές και 3 απορρίψεις, οπότε μια αφελής ενσωμάτωση είτε θεωρεί κάθε 200 επιτυχία είτε αναλύει με το χέρι τη λίστα σφαλμάτων.

Επιπλέον, η μορφή στο δίκτυο είναι XML παραγόμενο από XSD που αλλάζουν με κάθε αναθεώρηση των προδιαγραφών, και τίποτα από αυτά δεν εκτίθεται ως καθαρή, typed επιφάνεια.

Πώς δουλεύει

  1. Η εφαρμογή σας
  2. InvoiceValidator
  3. Επίπεδο αντιστοίχισης
  4. Παραγόμενα μοντέλα XSD
  5. MyDataClient
  6. AADE myDATA API

Τρία επίπεδα, μία κατεύθυνση. Το Generated/ προέρχεται από τα επίσημα XSD και δεν βγαίνει ποτέ από τη βιβλιοθήκη ως δημόσιος τύπος· το Mapping/ το μεταφράζει στα χειρόγραφα μοντέλα· το Http/ μιλά μόνο με αυτά τα μοντέλα. Μια αναπαραγωγή του σχήματος αλλάζει το Generated/, το Mapping/ την απορροφά, και το δημόσιο API δεν κουνιέται.

Τα δύσκολα σημεία

  1. 01

    Μερική επιτυχία μέσα σε ένα 200

    Τα επιχειρησιακά σφάλματα επιστρέφονται ως δεδομένα, ανά παραστατικό, αντιστοιχισμένα με την είσοδο του καλούντος. Εξαίρεση πετούν μόνο τα σφάλματα μεταφοράς (401, σφάλματα δικτύου, timeouts). Αν ένα μικτό 200 γινόταν εξαίρεση, κάθε καλών θα έπρεπε να ξεπακετάρει το ίδιο σώμα δύο φορές.

  2. 02

    Αναπαραγωγή των κανόνων της ΑΑΔΕ

    Ο validator αναπαράγει τους κωδικούς σφάλματος 203, 207–210, 217, 219, 220, 261, 265 και 306, οπότε μια λάθος παρτίδα αποτυγχάνει σε χιλιοστά του δευτερολέπτου στον υπολογιστή σας αντί να κάνει τον γύρο μέχρι το sandbox για να το μάθει.

  3. 03

    Ένα όριο που το XmlSerializer δεν επιβάλλει

    Το XmlSerializer αρνείται να σειριοποιήσει internal τύπους, ακόμα και με InternalsVisibleTo, οπότε οι παραγόμενοι τύποι πρέπει να είναι public. Το όριο επιβάλλεται αλλιώς: κάθε κλάση αντιστοίχισης είναι internal, και καμία μέθοδος HTTP δεν δέχεται ούτε επιστρέφει παραγόμενο τύπο.

  4. 04

    Ελληνικές κωδικοποιήσεις και δύο είδη σελιδοποίησης

    Ο υπολογισμός του UID χρειάζεται ISO-8859-7, που το .NET δεν καταχωρεί από προεπιλογή, και η ανάκτηση παραστατικών σελιδοποιείται με δύο ανεξάρτητους μηχανισμούς: ένα όριο mark και ένα ξεχωριστό continuation token.

Αποφάσεις και συμβιβασμοί

Ο υπολογισμός UID είναι προαιρετικός

Ο τεκμηριωμένος αλγόριθμος SHA-1 υλοποιείται αλλά δεν καλείται ποτέ αυτόματα, αφού η ακριβής μορφή των πεδίων του δεν έχει ελεγχθεί απέναντι σε πραγματική τιμή της ΑΑΔΕ. Όταν παραλείπεται, το UID το αποδίδει η ίδια η ΑΑΔΕ.

Τέσσερα επίπεδα tests

Unit tests χωρίς I/O, golden-file snapshots του XML που παράγεται, contract tests που αναπαράγουν καταγεγραμμένες απαντήσεις του sandbox μέσω WireMock.Net, και πραγματικές κλήσεις στο sandbox που παραλείπονται αντί να αποτυγχάνουν όταν λείπουν διαπιστευτήρια.

Τα διαπιστευτήρια δεν μπαίνουν ποτέ σε αρχεία

Τα κλειδιά του sandbox έρχονται από μεταβλητές περιβάλλοντος ή user-secrets, ποτέ από το appsettings.json ή από αρχείο .http που παρακολουθεί το git.

Τι δεν κάνει ακόμα

  • Η σύζευξη με το σχήμα είναι το γνωστό κόστος: κάθε αναθεώρηση σχήματος της ΑΑΔΕ σημαίνει αναπαραγωγή και εκ νέου επαλήθευση των μοντέλων.
  • Ο υπολογισμός UID μένει προαιρετικός μέχρι να ελεγχθεί απέναντι σε πραγματική τιμή της ΑΑΔΕ.