Εισαγωγή
Στο Odoo, κάθε είδος επιχειρηματικής πληροφορίας —τιμολόγιο, παραγγελία ή λογιστική εγγραφή— αποθηκεύεται μέσα σε ένα «μοντέλο». Το μοντέλο ορίζει τη δομή, τους τύπους δεδομένων και πώς αυτά φυλάσσονται στη βάση, ώστε να υπάρχει ενιαία και προβλέψιμη διαχείριση των εγγραφών.
Η γνώση των μοντέλων του Odoo είναι απαραίτητη τόσο για τους προγραμματιστές όσο και για τους λειτουργικούς συμβούλους. Τα μοντέλα αποτελούν τη ραχοκοκαλιά της δομής δεδομένων: προσδιορίζουν πεδία, σχέσεις μεταξύ αντικειμένων και την επιχειρησιακή λογική που διέπει τις εγγραφές.
Αυτό το κείμενο εστιάζει σε ένα από τα πιο κρίσιμα μοντέλα στο λογιστικό μέρος του Odoo: το account.move. Είτε φτιάχνετε αναφορές, είτε ενσωματώνετε εξωτερικά συστήματα, είτε διαμορφώνετε ροές τιμολόγησης, το account.move θα είναι στο κέντρο της λύσης σας.
Τι είναι το μοντέλο account.move
Το account.move αντιστοιχεί στις λογιστικές εγγραφές. Από την Odoo 13 και μετά, ενοποίησε σε έναν τύπο τις πελάτες, προμηθευτές, πιστωτικά, και χειροκίνητες εγγραφές που παλαιότερα ήταν σε διαφορετικά μοντέλα — όλα πλέον είναι εγγραφές account.move.
Το μοντέλο χρησιμοποιείται από το λογιστικό module και αποτελεί γονέα του account.move.line, όπου φυλάσσονται οι μεμονωμένες χρεώσεις και πιστώσεις. Κάθε τιμολόγιο, λογαριασμός ή εγγραφή ισοδυναμεί με μία εγγραφή account.move που περιέχει μία ή περισσότερες γραμμές.
Ο ορισμός του μοντέλου βρίσκεται στο module account, ενώ άλλα modules το επεκτείνουν μέσω της κληρονομικότητας μοντέλων του Odoo. Το module Πωλήσεων προσθέτει λειτουργίες δημιουργίας τιμολογίων από παραγγελίες, το Προμηθειών δημιουργία λογαριασμών — όλα προσθέτουν μόνο ό,τι χρειάζεται χωρίς να διπλοκαταχωρούν τη βασική δομή.
Βασικά πεδία του μοντέλου
Παρακάτω παρουσιάζονται τα πιο σημαντικά πεδία του account.move που πρέπει να γνωρίζετε. Αυτά καθορίζουν συμπεριφορές, αναφορές και ροές εργασίας για τιμολόγια, λογαριασμούς και εγγραφές.
1. name
Τύπος: Char. Αποθηκεύει τον αριθμό ή την ονομασία της εγγραφής (π.χ. αρίθμηση τιμολογίου). Συνήθως προέρχεται από τη σειρά του journal και εμφανίζεται σε λίστες και εκτυπώσεις.
2. move_type
Τύπος: Selection. Καθορίζει το είδος της εγγραφής: χειροκίνητη εγγραφή, τιμολόγιο πελάτη, πιστωτικό πελάτη, τιμολόγιο προμηθευτή ή πιστωτικό προμηθευτή. Από αυτό εξαρτώνται οι views και οι ροές εργασίας που εφαρμόζονται.
3. state
Τύπος: Selection. Κατάσταση ροής εργασίας: draft, posted ή cancel. Στη φάση draft οι εγγραφές μπορούν να τροποποιηθούν. Στο posted κλειδώνουν και επηρεάζουν το γενικό καθολικό. Το cancel αναιρεί την επίδραση.
4. date
Τύπος: Date. Η ημερομηνία του εγγράφου — κρίσιμη για αναφορές, ageing και κλείσιμο περιόδων. Στα τιμολόγια αντιστοιχεί συνήθως στην ημερομηνία τιμολόγησης.
5. journal_id
Τύπος: Many2one (account.journal). Το ημερολόγιο στο οποίο ανήκει η εγγραφή (π.χ. Πωλήσεις, Αγορές, Τράπεζα). Το journal καθορίζει τη σειρά αρίθμησης και προεπιλεγμένους λογαριασμούς.
6. company_id
Τύπος: Many2one (res.company). Σε πολυεταιρικά περιβάλλοντα δείχνει σε ποια εταιρεία ανήκει η εγγραφή. Επηρεάζει ορατότητα, συγκεντρωτικές καταστάσεις και ενοποίηση.
7. partner_id
Τύπος: Many2one (res.partner). Ο πελάτης ή ο προμηθευτής. Απαραίτητο για τιμολόγια και λογαριασμούς, χρησιμοποιείται στις αναφορές ageing, στη συμφωνία πληρωμών και ως επικεφαλίδα εγγράφων.
8. currency_id
Τύπος: Many2one (res.currency). Το νόμισμα της εγγραφής. Τα ποσά καταγράφονται σε αυτό. Για πολυνομισματικές εγγραφές οι μετατροπές γίνονται σε εταιρικό νόμισμα για αναφορές.
9. amount_total
Τύπος: Monetary. Το συνολικό ποσό της εγγραφής. Στα τιμολόγια αντιστοιχεί στο ποσό που οφείλεται και υπολογίζεται από τις γραμμές.
10. amount_residual
Τύπος: Monetary. Το ανεξόφλητο υπόλοιπο. Σε εξοφλημένα τιμολόγια είναι μηδέν. Χρησιμοποιείται για ageing και διαδικασίες είσπραξης.
11. payment_state
Τύπος: Selection. Κατάσταση πληρωμής: not_paid, in_payment, paid, partial, reversed ή παλαιά κατάσταση invoicing_legacy. Επηρεάζει ειδοποιήσεις πληρωμής και αναφορές.
12. line_ids
Τύπος: One2many (account.move.line). Οι γραμμές της εγγραφής. Κάθε γραμμή περιλαμβάνει λογαριασμό, χρέωση και πίστωση. Το άθροισμα χρεώσεων πρέπει να ισούται με το άθροισμα πιστώσεων.
13. invoice_line_ids
Τύπος: One2many (account.move.line). Στα τιμολόγια και τους λογαριασμούς, αυτές είναι οι γραμμές προϊόντων/υπηρεσιών. Κατά το posting κάθε γραμμή παράγει μία ή περισσότερες γραμμές λογιστικού βιβλιαρίου.
14. invoice_date
Τύπος: Date. Η ημερομηνία τιμολόγησης — σημαντική για φορολογικές περιόδους. Μπορεί να διαφέρει από την ημερομηνία της εγγραφής σε ορισμένες ρυθμίσεις.
15. invoice_date_due
Τύπος: Date. Η ημερομηνία λήξης/πληρωμής. Υπολογίζεται από τους όρους πληρωμής ή τίθεται χειροκίνητα. Χρησιμοποιείται για ageing και ειδοποιήσεις καθυστερήσεων.
16. ref
Τύπος: Char. Εξωτερική αναφορά ή αριθμός προμηθευτή. Βοηθά στην αντιστοίχιση πληρωμών και στην συμφωνία με εξωτερικά έγγραφα.
17. invoice_origin
Τύπος: Char. Το έγγραφο προέλευσης. Για τιμολόγια που προέρχονται από παραγγελίες, εδώ αποθηκεύεται ο αριθμός της παραγγελίας για ιχνηλασιμότητα.
18. create_date
Τύπος: Datetime. Η ημερομηνία και ώρα δημιουργίας της εγγραφής. Διαχειρίζεται αυτόματα από το Odoo.
19. write_date
Τύπος: Datetime. Η τελευταία ημερομηνία/ώρα τροποποίησης της εγγραφής. Επίσης διαχειρίζεται αυτόματα.
20. narration
Τύπος: Text. Εσωτερικές σημειώσεις ή υπόμνημα για την εγγραφή. Εμφανίζεται στις εκτυπώσεις των λογιστικών εγγραφών αλλά όχι απαραίτητα στους πελάτες στα τιμολόγια.
21. fiscal_position_id
Τύπος: Many2one (account.fiscal.position). Η φορολογική θέση που καθορίζει κανόνες φόρου βάσει πελάτη/χώρας — επηρεάζει ποίοι φόροι εφαρμόζονται.
22. invoice_payment_term_id
Τύπος: Many2one (account.payment.term). Όροι πληρωμής (π.χ. Net 30). Χρησιμοποιείται για υπολογισμό invoice_date_due και διαίρεση πληρωμών.
23. invoice_user_id
Τύπος: Many2one (res.users). Ο υπεύθυνος χρήστης ή πωλητής για το τιμολόγιο. Χρησιμοποιείται σε αναφορές και υπολογισμούς προμηθειών.
24. reversed_entry_id
Τύπος: Many2one (account.move). Σε εγγραφές αντιλογισμού συνδέει την αντίστροφη εγγραφή με την αρχική — διευκολύνει τον έλεγχο και την ιχνηλασιμότητα.
25. to_check
Τύπος: Boolean. Σημαία για εγγραφές που χρειάζονται έλεγχο, π.χ. κατά την συμφωνία τραπεζικών κινήσεων ή σε εξαιρέσεις.
26. active
Τύπος: Boolean. Σημαία «μη οριστικής διαγραφής». Όταν είναι False η εγγραφή αρχειοθετείται. Συχνά οι ακυρωμένες εγγραφές θέτονται σε active=False.
27. sequence_number
Τύπος: Integer. Ο αριθμός σειράς από το journal για ταξινόμηση και εμφάνιση. Διαχειρίζεται μέσω του mixin της αρίθμησης.
28. amount_untaxed
Τύπος: Monetary. Το υποσύνολο πριν τους φόρους. Στα τιμολόγια είναι το άθροισμα των γραμμών χωρίς φόρους.
29. amount_tax
Τύπος: Monetary. Το συνολικό ποσό φόρων. Υπολογίζεται από τις γραμμές τιμολογίου και τις φορολογικές ρυθμίσεις.
30. invoice_source_email
Τύπος: Char. Σε λογαριασμούς προμηθευτών που εισάγονται από email, αποθηκεύει τη διεύθυνση προέλευσης — χρήσιμο για αυτοματοποιημένη εισαγωγή τιμολογίων.
Πώς χρησιμοποιείται στο επιχειρηματικό ροή εργασιών
1. Τιμολόγηση Πελατών
Όταν μια παραγγελία πωλήσεων παραδίδεται, το Odoo δημιουργεί ένα account.move με move_type out_invoice. Οι γραμμές τιμολογίου προέρχονται από τις γραμμές της παραγγελίας. Με το posting παράγονται οι λογιστικές γραμμές και ενημερώνονται οι απαιτήσεις.
2. Λογαριασμοί Προμηθευτών
Οι παραγγελίες αγοράς μπορούν να δημιουργήσουν αυτόματα bills ή τα bills καταχωρούνται χειροκίνητα. Κάθε bill είναι account.move με move_type in_invoice και ο partner_id είναι ο προμηθευτής — το posting ενημερώνει τις πληρωτέες υποχρεώσεις.
3. Συμφωνία Πληρωμών
Οι πληρωμές αντιστοιχίζονται με τα τιμολόγια μέσω των πεδίων amount_residual και payment_state. Η διαδικασία συμφωνίας συνδέει τις κινήσεις πληρωμών με τα τιμολόγια και μηδενίζει τα ανεξόφλητα υπόλοιπα.
4. Χειροκίνητες Λογιστικές Εγγραφές
Οι λογιστές δημιουργούν εγγραφές με move_type entry για προσαρμογές, δεδουλευμένες ή διορθώσεις. Προσθέτουν χειροκίνητα τις line_ids με λογαριασμούς, χρεώσεις και πιστώσεις — και η εγγραφή πρέπει να ισοσκελίζει πριν το posting.
5. Πιστωτικά Σημειώματα και Επιστροφές
Τα πιστωτικά είναι εγγραφές με move_type out_refund ή in_refund και αντιστρέφουν το αποτέλεσμα του αρχικού τιμολογίου/λογαριασμού. Το reversed_entry_id κρατάει τη σύνδεση με το πρωτότυπο για φορολογικό και ελεγκτικό αποτύπωμα.
Πώς το επεκτείνουν οι προγραμματιστές
Οι προγραμματιστές επεκτείνουν το account.move με γνωστά μοτίβα του Odoo. Η βασική τεχνική είναι η κληρονομικότητα μοντέλων.
Κληρονομικότητα Μοντέλων
Χρησιμοποιείτε _inherit = 'account.move' για να προσθέσετε πεδία, να παρακάμψετε μεθόδους ή να επιβάλετε περιορισμούς. Η κληρονομικότητα κρατά τις αλλαγές σε ξεχωριστό module, διευκολύνοντας αναβαθμίσεις και συντήρηση.
Προσθήκη Πεδίων
Ορίζετε νέα πεδία στο κληρονομημένο μοντέλο με τον κατάλληλο τύπο: Char, Many2one, Boolean, Integer, Text, Selection. Σκεφτείτε αν πρέπει να είναι company-dependent σε πολυεταιρικά περιβάλλοντα και χρησιμοποιήστε domain στο move_type για πεδία που αφορούν μόνο τιμολόγια.
Επεκτάσεις σε Python
Μπορείτε να υπερκαλύψετε create, write, _post ή button_draft για να προσθέσετε επιχειρησιακή λογική — πάντα καλώντας super() ώστε να διατηρούνται οι βασικές λειτουργίες. Προσέξτε τα υπολογιζόμενα πεδία και τις εξαρτήσεις τους, χρησιμοποιώντας σωστά τα @api decorators.
Odoo Studio
Το Odoo Studio επιτρέπει την προσθήκη πεδίων χωρίς κώδικα — ιδανικό για γρήγορες προσαρμογές, όπως ένα επιπλέον πεδίο αναφοράς. Για σύνθετη λογική, επαληθεύσεις ή αυτοματισμούς, προτιμήστε ένα προσαρμοσμένο module για καλύτερη επεκτασιμότητα.
Σημείωση: Το account.move είναι κανονικό μοντέλο που αποθηκεύει μόνιμα λογιστικά δεδομένα — δεν είναι abstract (πρότυπο χωρίς πίνακα) ούτε transient (προσωρινό, για wizard). Αυτό σημαίνει ότι κάθε αλλαγή έχει μόνιμο αντίκτυπο στη βάση.
Καλές πρακτικές
- Φιλτράρετε πάντα κατά move_type όταν φτιάχνετε αναφορές ή ενσωματώσεις — οι διάφοροι τύποι έχουν διαφορετικές ανάγκες και απαιτήσεις πεδίων.
- Χρησιμοποιήστε το σωστό journal για κάθε είδος κίνησης. Η ανάμιξη journals μπορεί να σπάσει αρίθμηση και να δυσκολέψει τις αναφορές.
- Κατά τη δημιουργία κινήσεων μέσω API, φροντίστε οι line_ids να ισοσκελίζουν (χρέωση = πίστωση) πριν το posting. Οι μη ισοσκελισμένες εγγραφές απορρίπτονται.
- Στις εισαγωγές τιμολογίων από εξωτερικά συστήματα αντιστοιχίστε σωστά τα είδη εγγράφων στο move_type: out_invoice για πωλήσεις, in_invoice για αγορές.
- Χρησιμοποιήστε το πρόθεμα x_ στα προσαρμοσμένα πεδία για να αποφύγετε συγκρούσεις με μελλοντικές εκδόσεις του Odoo.
Συνήθη λάθη
- Δημιουργία ή posting εγγραφών χωρίς ισοζύγιο γραμμών. Το Odoo θα απορρίψει το posting — επιβεβαιώστε ότι τα σύνολα χρεώσεων και πιστώσεων ταιριάζουν.
- Τροποποίηση ήδη δημοσιευμένων εγγραφών. Οι posted εγγραφές είναι κλειδωμένες — για διόρθωση δημιουργείστε αντιλογισμό ή νέα διόρθωση, αντί να αλλάζετε απευθείας.
- Παραβλέποντας το partner_id σε κινήσεις πελατών/προμηθευτών. Πολλές λειτουργίες, αναφορές και συμφωνίες πληρωμών εξαρτώνται από αυτό το πεδίο.
- Χρήση λάθους move_type. Ένα out_refund δεν είναι το ίδιο με ένα αρνητικό out_invoice — χρησιμοποιήστε τον σωστό τύπο για επιστροφές και πιστωτικά.
- Υπερκαλύπτοντας βασικές μεθόδους χωρίς να καλείτε super(). Αυτό μπορεί να σπάσει λειτουργίες άλλων modules ή να δυσκολέψει μελλοντικές αναβαθμίσεις.
Συμπεράσματα
Το account.move είναι το κεντρικό μοντέλο για το λογιστικό κομμάτι του Odoo — συγκεντρώνει τιμολόγια, λογαριασμούς και λογιστικές εγγραφές σε μία ενιαία δομή. Καλή γνώση των πεδίων και του τρόπου επέκτασης θα σας βοηθήσει να διαμορφώσετε, να προσαρμόσετε και να ενσωματώσετε το Odoo αποδοτικά.
Είτε εργάζεστε ως λειτουργικός σύμβουλος που απεικονίζει επιχειρησιακές ροές, είτε ως προγραμματιστής που κατασκευάζει προσαρμοσμένα modules, μια γερή κατανόηση του account.move θα μειώσει τα σφάλματα και θα εξοικονομήσει χρόνο.
Χρειάζεστε βοήθεια με την υλοποίηση Odoo;
Η Dasolo υποστηρίζει επιχειρήσεις στην υλοποίηση, προσαρμογή και βελτιστοποίηση του Odoo. Ειδικευόμαστε σε API ενσωματώσεις και ανάπτυξη Odoo, με βαθιά γνώση της δομής δεδομένων και μοντέλων όπως το account.move.
Αν χρειάζεστε υποστήριξη για υλοποίηση Odoo, προσαρμοσμένα modules ή ενσωματώσεις, μπορούμε να βοηθήσουμε. Κλείστε μια επίδειξη για να συζητήσουμε το έργο σας.