Τιμολόγιο σε ξένο νόμισμα και ισοτιμία στο myDATA, μέσω API
Ο πελάτης σου πληρώνει σε λίρες ή δολάρια. Τι στέλνεις στο myDATA: τα ποσά μένουν σε ευρώ, και τα πεδία currency και exchange_rate προσθέτουν μία γραμμή πληρωτέου στο νόμισμα του πελάτη. Με ποια φορά μπαίνει η ισοτιμία, γιατί δεν θα σε προειδοποιήσει κανείς αν τη βάλεις ανάποδα, και τα σφάλματα που θα δεις.
Ένας developer σε ελληνική εταιρεία λογισμικού κόβει τιμολόγιο σε πελάτη στο Λονδίνο που πληρώνει σε λίρες. Ένας ελεύθερος επαγγελματίας δουλεύει remote για εταιρεία στο Ηνωμένο Βασίλειο. Ένα σύστημα πληρωμών παραδίδει κάθε συναλλαγή με το νόμισμά της. Όλοι κάνουν την ίδια ερώτηση: τι στέλνω στο myDATA όταν ο πελάτης πληρώνει σε ξένο νόμισμα;
Τα ποσά που στέλνεις είναι σε ευρώ και μένουν σε ευρώ. Τα πεδία currency και exchange_rate δεν μετατρέπουν τίποτα: προσθέτουν μία γραμμή πληρωτέου στο νόμισμα του πελάτη.
Αυτή είναι όλη η ουσία, και εκεί γίνεται και το λάθος. Αν στείλεις 2000 στο net_total_amount εννοώντας λίρες, το παραστατικό λέει δύο χιλιάδες ευρώ. Εκδίδεται κανονικά, παίρνει ΜΑΡΚ, και κανένας έλεγχος δεν το πιάνει, γιατί τα ποσά είναι εσωτερικά συνεπή: τίποτα πουθενά δεν λέει ότι ο αριθμός εννοούσε λίρες.
Τι κάνουν τα δύο πεδία
currency
Ο κωδικός ISO 4217 του νομίσματος του πελάτη, με κεφαλαία: GBP, USD. Ορίζεται σε επίπεδο παραστατικού: ένα παραστατικό, ένα νόμισμα.
exchange_rate
Πόσες μονάδες του νομίσματος αγοράζει 1 ευρώ. Υποχρεωτικό όταν το νόμισμα δεν είναι ευρώ. Έως πέντε δεκαδικά.
Τα ποσά
Σε ευρώ, όπως σε κάθε άλλο παραστατικό. Αυτά διαβιβάζονται στο myDATA και αυτά τυπώνονται.
Το νόμισμα είναι ανεξάρτητο από το είδος του παραστατικού και από τον ΦΠΑ. Δεν είναι λειτουργία των συναλλαγών με το εξωτερικό: ένα τιμολόγιο παροχής υπηρεσιών σε ελληνικό πελάτη με ΦΠΑ 24% εκδίδεται κι αυτό σε λίρες. Η αντιμετώπιση ΦΠΑ εξαρτάται από τη συναλλαγή, όχι από το νόμισμα.
Το παράδειγμα που ακολουθεί σε όλο το άρθρο
| Πεδίο | Τιμή |
|---|---|
| Παραστατικό | 2.3, τιμολόγιο παροχής υπηρεσιών σε εταιρεία στο Ηνωμένο Βασίλειο |
| Καθαρή αξία | 2.000,00 € |
| ΦΠΑ | 0,00 €, 0% |
| Συνολική αξία και πληρωτέο | 2.000,00 € |
currency | GBP |
exchange_rate | 0.86, ενδεικτικά: 1 EUR = 0,86 GBP |
| Πληρωτέο (Λίρα Η.Β.) | £1.720,00 |
2.000,00 × 0,86 = 1.720,00. Αυτός ο ένας πολλαπλασιασμός είναι όλος ο μηχανισμός. Αν μπορείς να τον αναπαράγεις, ξέρεις και ποια φορά έχει η ισοτιμία χωρίς να σου το πει κανείς δεύτερη φορά.
{
"invoice_type_code": "2.3",
"billing_book_id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"payment_method_type": 1,
"currency": "GBP",
"exchange_rate": 0.86,
"net_total_amount": 2000.00,
"vat_total_amount": 0.00,
"total_amount": 2000.00,
"payable_total_amount": 2000.00,
"counterpart": {
"name": "EXAMPLE CLIENT LTD",
"country_code": "GB",
"vat": "123456789",
"city": "LONDON",
"street": "OLD STREET",
"number": "1",
"postal_code": "EC1V 9HL"
},
"invoice_lines": [
{
"line_number": 1,
"name": "Software engineering services",
"quantity": 1,
"quantity_type": 1,
"unit_price": 2000.00,
"net_total_price": 2000.00,
"vat_rate": 0,
"vat_total": 0.00,
"subtotal": 2000.00,
"vat_exemption_code": "xx",
"classification_category": "category1_3",
"classification_type": "E3_561_006"
}
]
}
Το billing_book_id είναι το id της σειράς σου για τιμολόγιο παροχής υπηρεσιών, από το GET /billing_books: το 2.3 εκδίδεται από την ίδια σειρά με το 2.1. Το invoice_type_code στέλνεται ως string, με εισαγωγικά.
Το vat_exemption_code το αφήνουμε ως xx επίτηδες. Ο μηδενικός ΦΠΑ θέλει αιτία εξαίρεσης, και η σωστή αιτία είναι φορολογική απόφαση που διαφέρει ανάλογα με τη συναλλαγή. Τις τιμές τις βρίσκεις στον πίνακα των αιτιών εξαίρεσης ΦΠΑ, και το ποια ισχύει για σένα το επιβεβαιώνεις με τον λογιστή σου, με τη βοήθεια της λίστας με τα άρθρα απαλλαγής.
Το 0.86 είναι ενδεικτικό. Η ισοτιμία είναι αριθμός της ημέρας, όχι σταθερά: μην τη γράψεις μία φορά στον κώδικα.
Τι βλέπει ο πελάτης σου
Όλο το παραστατικό σε ευρώ: γραμμές, καθαρή αξία, ΦΠΑ, συνολική αξία, πληρωτέο. Από κάτω, μία επιπλέον γραμμή:
| Γλώσσα παραστατικού | Η γραμμή |
|---|---|
| Ελληνικά | Πληρωτέο (Λίρα Η.Β.) £1.720,00 |
| Αγγλικά | Payable (British Pound) £1.720,00 |
Το όνομα του νομίσματος εμφανίζεται στη γλώσσα του παραστατικού, με το σύμβολό του. Η ίδια η ισοτιμία δεν τυπώνεται, ούτε ο κωδικός ISO. Αν ο πελάτης σου περιμένει τιμολόγιο ολόκληρο σε λίρες, πες του από πριν τι θα δει, γιατί αλλιώς θα το μάθει όταν το ανοίξει.
Η ισοτιμία ανάποδα δεν την πιάνει τίποτα
Αν στείλεις την αντίστροφη ισοτιμία, το παραστατικό εκδίδεται, το myDATA το δέχεται, παίρνεις ΜΑΡΚ, και η γραμμή σε λίρες είναι λάθος. Κανένας έλεγχος δεν μπορεί να το πιάσει. Τα ποσά είναι σε ευρώ και συνεπή όποιος αριθμός κι αν μπει στο exchange_rate, οπότε κάθε έλεγχος που υπάρχει περνάει. Οι μόνοι έλεγχοι νομίσματος του myDATA αφορούν το αν υπάρχει ισοτιμία και αν ο κωδικός είναι έγκυρος. Κανείς δεν κοιτάει το μέγεθος.
Δύο συνέπειες, που ένας developer δεν τις βγάζει μόνος του:
- Έλεγξε τη φορά με αριθμητική, όχι με επιτυχημένη απάντηση. Ένα καθαρό ΜΑΡΚ δεν λέει τίποτα για την ισοτιμία. Το τεστ είναι: το σύνολο σε ευρώ επί την ισοτιμία βγάζει αυτό που χρωστάει ο πελάτης στο δικό του νόμισμα;
- Διάβασε την ισοτιμία στη φορά που τη δίνει η πηγή σου. Μια τιμή που δίνεται ως «1 EUR = 0,86 GBP» μπαίνει ως
0.86. Μια τιμή που δίνεται ως «1 GBP = 1,16 EUR» πρέπει πρώτα να αντιστραφεί.
Τα δεκαδικά μετράνε κι αυτά. Η ισοτιμία κρατάει έως πέντε δεκαδικά και τα χρησιμοποιεί όλα: με 0.85934 η γραμμή γράφει £1.718,68. Ένα έκτο δεκαδικό στρογγυλοποιείται σιωπηλά στα πέντε.
Το νόμισμα της πληρωμής δεν είναι το νόμισμα του παραστατικού
Αν η έκδοση ξεκινάει από ειδοποίηση ενός συστήματος πληρωμών, και η ειδοποίηση φέρνει το ποσό στο νόμισμα που πλήρωσε ο πελάτης, ίσως και στη μικρότερη μονάδα του, σε πένες ή σεντς, αυτό το ζευγάρι δεν περνάει αυτούσιο στο POST /invoices. Μετατρέπεις πρώτα σε ευρώ, και τα ποσά σε ευρώ γεμίζουν τα πεδία ποσών. Το νόμισμα και η ισοτιμία πάνε στα currency και exchange_rate, μόνο αν θέλεις να εμφανίζεται και το πληρωτέο στο νόμισμα του πελάτη.
Τι βλέπεις όταν είναι λάθος
| Λάθος | Από πού | Απάντηση |
|---|---|---|
Νόμισμα χωρίς exchange_rate |
Πλατφόρμα | Invoice Errors: «Exchange rate can't be blank». Δεν δημιουργείται παραστατικό |
Κωδικός νομίσματος με μικρά (gbp) ή εκτός λίστας |
myDATA | 101, «The Enumeration constraint failed» στο CurrencyType |
invoice_type_code ως αριθμός (2.3 χωρίς εισαγωγικά) |
myDATA | Το πρόχειρο γίνεται δεκτό, και στην έκδοση 204 και 205 για πεδία που δεν ταιριάζουν στον τύπο |
| Ισοτιμία ανάποδα | Κανείς | Τίποτα. Καθαρό ΜΑΡΚ και λάθος γραμμή σε λίρες |
Η στήλη «Από πού» αξίζει τον χρόνο της. Μια απόρριψη από την πλατφόρμα δεν κοστίζει τίποτα. Μια απόρριψη από το myDATA έχει ήδη δεσμεύσει αριθμό στη σειρά σου. Οπότε τον χάρτη νομισμάτων σου τον ελέγχεις στους κωδικούς: φτιάξε σωστά τη λίστα μία φορά, με κεφαλαία, και το ακριβό λάθος εξαφανίζεται.
Τι λέει ο κανόνας
Η Οδηγία 2006/112/ΕΚ για τον ΦΠΑ, στο άρθρο 230, επιτρέπει τα ποσά του τιμολογίου να εκφράζονται σε οποιοδήποτε νόμισμα, με την προϋπόθεση ότι ο οφειλόμενος ΦΠΑ εκφράζεται στο εθνικό νόμισμα του κράτους μέλους. Επειδή τα πεδία ποσών μένουν σε ευρώ, το παραστατικό ικανοποιεί αυτή την προϋπόθεση από την κατασκευή του: ο ΦΠΑ είναι ήδη σε ευρώ, και η γραμμή στο ξένο νόμισμα είναι πληροφορία για τον πελάτη.
Ποια ισοτιμία χρησιμοποιείς, από ποια πηγή και ποιας ημερομηνίας, όπως και οι συναλλαγματικές διαφορές όταν εισπράξεις, είναι θέμα της λογιστικής σου πολιτικής και του λογιστή σου. Η πλατφόρμα δεν επιλέγει ισοτιμία: τυπώνει αυτήν που της στέλνεις.
Πώς ξεκινάς
Το staging το ανοίγεις μόνος σου: κάνε δωρεάν εγγραφή στο wrapp.ai με το ΑΦΜ σου και, μόλις ορίσεις κωδικό, πάτα «Δοκίμασε το API». Εκεί έχεις email σύνδεσης και API key για το staging.wrapp.ai, με τα μπλοκ ήδη στημένα. Το τιμολόγιο του παραδείγματος εκδίδεται από το μπλοκ «Τιμ. Παροχής», και το id του το δίνει το GET /billing_books.
Το πλήρες σχήμα των πεδίων είναι στην τεκμηρίωση του REST API. Για τον ΦΠΑ και τον χαρακτηρισμό της ίδιας της συναλλαγής δες τους οδηγούς για το τιμολόγιο προς τρίτη χώρα και το ενδοκοινοτικό τιμολόγιο, και για πωλήσεις σε ιδιώτες σε άλλες χώρες της ΕΕ τον οδηγό για τις πωλήσεις εξ αποστάσεως και το OSS. Οι αποδεκτές τιμές είναι στους πίνακες αναφοράς για τα είδη παραστατικών και τους τύπους χαρακτηρισμού.
Η δομή που δίνει αυτό το άρθρο είναι αυτή που βλέπουμε συνήθως στην πράξη. Οι χαρακτηρισμοί, οι συντελεστές ΦΠΑ και οι αιτίες εξαίρεσης είναι όμως λογιστική επιλογή: πριν την παραγωγή επιβεβαίωσέ τους με τον τελικό πελάτη ή τον λογιστή του. Το myDATA δεν τις επικυρώνει και θα δεχτεί και λάθος επιλογή, χωρίς σφάλμα.
Συχνές ερωτήσεις
Μπορώ να εκδώσω τιμολόγιο σε λίρες ή δολάρια με διαβίβαση στο myDATA;
Ναι. Στέλνεις τα ποσά σε ευρώ, όπως πάντα, και προσθέτεις δύο πεδία: currency, με τον κωδικό του νομίσματος (π.χ. GBP), και exchange_rate, με την ισοτιμία. Το παραστατικό διαβιβάζεται στο myDATA με τα ποσά σε ευρώ και το νόμισμα με την ισοτιμία δίπλα, και τυπώνει μία επιπλέον γραμμή με το πληρωτέο στο νόμισμα του πελάτη.
Σε ποιο νόμισμα φτάνουν τα ποσά στο myDATA;
Σε ευρώ. Τα πεδία ποσών που στέλνεις είναι ευρώ και μένουν ευρώ: αυτά διαβιβάζονται στο myDATA και αυτά τυπώνονται στο παραστατικό. Το currency και το exchange_rate δεν μετατρέπουν τίποτα. Αν στείλεις 2000 στο net_total_amount εννοώντας λίρες, το παραστατικό λέει δύο χιλιάδες ευρώ, και κανένας έλεγχος δεν το πιάνει.
Με ποια φορά μπαίνει η ισοτιμία;
Πόσες μονάδες του ξένου νομίσματος αγοράζει 1 ευρώ. Αν 1 EUR = 0,86 GBP, στέλνεις 0.86, όχι 1.16. Αν η πηγή σου δίνει την ισοτιμία ανάποδα («1 GBP = 1,16 EUR»), την αντιστρέφεις πριν τη στείλεις. Ο έλεγχος είναι αριθμητικός: το σύνολο σε ευρώ επί την ισοτιμία πρέπει να βγάζει αυτό που χρωστάει ο πελάτης στο δικό του νόμισμα.
Τι θα δει ο πελάτης μου πάνω στο παραστατικό;
Όλο το παραστατικό σε ευρώ: γραμμές, καθαρή αξία, ΦΠΑ, σύνολο και πληρωτέο. Από κάτω, μία επιπλέον γραμμή με το πληρωτέο στο νόμισμά του, για παράδειγμα «Πληρωτέο (Λίρα Η.Β.) £1.720,00» στα ελληνικά ή «Payable (British Pound) £1.720,00» στα αγγλικά. Η ίδια η ισοτιμία δεν τυπώνεται.
Ποια ισοτιμία πρέπει να χρησιμοποιήσω;
Ποια ισοτιμία, από ποια πηγή και ποιας ημερομηνίας είναι θέμα της λογιστικής σου πολιτικής, και το αποφασίζει ο λογιστής σου, όπως και τις συναλλαγματικές διαφορές κατά την είσπραξη. Η πλατφόρμα δεν επιλέγει ισοτιμία για σένα: τυπώνει αυτήν που της στέλνεις. Μην βάζεις σταθερή ισοτιμία στον κώδικα: μια ισοτιμία που γράφτηκε μία φορά γίνεται λάθος αριθμός με το πέρασμα των ημερών.
Λειτουργεί μόνο για πελάτες στο εξωτερικό;
Όχι. Το νόμισμα είναι ανεξάρτητο από το είδος του παραστατικού και από τον ΦΠΑ. Ένα τιμολόγιο παροχής υπηρεσιών σε ελληνικό πελάτη με ΦΠΑ 24% εκδίδεται κι αυτό σε λίρες, με τα ποσά σε ευρώ και τη γραμμή πληρωτέου σε λίρες από κάτω. Το νόμισμα δεν αλλάζει την αντιμετώπιση ΦΠΑ: αυτή εξαρτάται από τη συναλλαγή.
Μπορώ να έχω γραμμές σε διαφορετικά νομίσματα στο ίδιο παραστατικό;
Όχι. Το νόμισμα ορίζεται σε επίπεδο παραστατικού: ένα παραστατικό, ένα νόμισμα.
Γιατί το myDATA απαντά με σφάλμα 101 στο currency;
Επειδή ο κωδικός δεν είναι στη λίστα νομισμάτων του myDATA, ή είναι γραμμένος με μικρά. Το πεδίο θέλει τον κωδικό ISO 4217 με κεφαλαία: GBP, όχι gbp. Το σφάλμα έρχεται από το myDATA στην έκδοση, οπότε ο αριθμός της σειράς έχει ήδη δεσμευτεί.
Πόσα δεκαδικά δέχεται η ισοτιμία;
Έως πέντε, και χρησιμοποιούνται όλα στον υπολογισμό. Με 0.85934 και πληρωτέο 2.000,00 ευρώ, η γραμμή γράφει £1.718,68. Ένα έκτο δεκαδικό στρογγυλοποιείται σιωπηλά στα πέντε.
Πώς δοκιμάζω πριν βγω σε παραγωγή;
Χρειάζεσαι βοήθεια;
Αν έχεις απορία για αυτό το θέμα ή θέλεις να σιγουρευτείς ότι όλα ρυθμίστηκαν σωστά, επικοινώνησε μαζί μας και θα το δούμε μαζί.