Εισαγωγή
Στο Odoo, τα μοντέλα καθορίζουν τη δομή και τον τρόπο αποθήκευσης των επιχειρηματικών δεδομένων στη βάση. Κάθε οντότητα που χρησιμοποιείτε —από παραγγελίες πωλήσεων μέχρι τιμολόγια και λογιστικές εγγραφές— αποθηκεύεται σε ένα σχετικό μοντέλο.
Η κατανόηση των μοντέλων είναι απαραίτητη τόσο για προγραμματιστές όσο και για συμβούλους λειτουργίας. Τα μοντέλα αποτελούν τη ραχοκοκαλιά της αρχιτεκτονικής δεδομένων του Odoo, ορίζοντας πεδία, συσχετίσεις και τη βασική επιχειρησιακή λογική.
Αυτό το άρθρο εστιάζει σε ένα κεντρικό μοντέλο του λογιστικού μέρους του Odoo: το account.move.line. Είτε φτιάχνετε προσαρμοσμένες αναφορές, είτε ενσωματώνετε εξωτερικά συστήματα, είτε ρυθμίζετε διαδικασίες συμφωνίας, θα συναντήσετε αυτό το μοντέλο συχνά.
Τι είναι το μοντέλο account.move.line
Το account.move.line αποτυπώνει τις επιμέρους γραμμές μιας λογιστικής εγγραφής —δηλαδή κάθε χρέωση ή πίστωση. Οι γραμμές μιας εγγραφής πρέπει να ισορροπούν: τα σύνολα των χρεώσεων πρέπει να ισούνται με τα σύνολα των πιστώσεων.
Στο πλαίσιο του Odoo, το μοντέλο αυτό ανήκει στο λογιστικό módulo και είναι «παιδί» του account.move, που αντιπροσωπεύει την ίδια την εγγραφή (τιμολόγια, λογαριασμοί, τραπεζικές καταχωρίσεις). Κάθε move περιέχει μία ή περισσότερες γραμμές.
Ο πυρήνας του ορίζεται στο module account, ενώ άλλα modules το επεκτείνουν μέσω της κληρονομικότητας μοντέλων. Το module πωλήσεων προσθέτει λεπτομέρειες τιμολογίου, το αγορών χειρίζεται γραμμές τιμολογίων προμηθευτών, και προστίθενται αναλυτικοί λογαριασμοί όπου χρειάζεται —χωρίς να αναπαράγεται ο βασικός σκελετός.
Σημαντικά πεδία του μοντέλου
Παρακάτω βρίσκονται τα πιο σημαντικά πεδία του account.move.line που πρέπει να γνωρίζετε. Η γνώση τους διευκολύνει την εργασία με εγγραφές και την ανάλυση λογιστικών δεδομένων.
1. name
Τύπος: Char. Περιέχει την περιγραφή της γραμμής. Είναι εμφανές στις προβολές εγγραφών και στις εκτυπώσεις. Στα τιμολόγια συνήθως προέρχεται από την περιγραφή προϊόντος ή από προσαρμοσμένο κείμενο.
2. move_id
Τύπος: Many2one (account.move). Συνδέει τη γραμμή με την γονική εγγραφή. Κάθε γραμμή ανήκει σε μία συγκεκριμένη εγγραφή —αυτή είναι η βασική σχέση στο μοντέλο.
3. account_id
Τύπος: Many2one (account.account). Ο λογαριασμός στον οποίο καταχωρείται η γραμμή. Είναι υποχρεωτικό πεδίο και πρέπει να αναφέρεται σε λειτουργικό (όχι view ή κλειστό) λογαριασμό. Χρησιμοποιείται για ομαδοποιήσεις και αναφορές κατά χάρτη λογαριασμών.
4. debit
Τύπος: Float. Ποσό χρέωσης. Προεπιλογή 0.0. Κάθε γραμμή έχει είτε χρέωση είτε πίστωση, όχι και τα δύο. Οι χρεώσεις αυξάνουν στοιχεία ενεργητικού και έξοδα.
5. credit
Τύπος: Float. Ποσό πίστωσης. Προεπιλογή 0.0. Οι πιστώσεις αυξάνουν υποχρεώσεις, ίδια κεφάλαια και έσοδα. Το σύνολο των χρεώσεων πρέπει να ισούται με το σύνολο των πιστώσεων σε κάθε move.
6. balance
Τύπος: Float. Υπολογιζόμενο πεδίο: debit μείον credit. Αντικατοπτρίζει το καθαρό αποτέλεσμα της γραμμής —θετικό για χρεώσεις, αρνητικό για πιστώσεις— και χρησιμοποιείται σε αναφορές και συμφωνίες.
7. partner_id
Τύπος: Many2one (res.partner). Ο πελάτης ή προμηθευτής που σχετίζεται με τη γραμμή. Σημαντικό για παρακολούθηση απαιτήσεων/υποχρεώσεων, aging reports και συμφιλίωση.
8. date
Τύπος: Date. Η ημερομηνία της γραμμής. Συνήθως κληρονομείται από το γονικό move και χρησιμοποιείται για κλεισίματα περιόδων, αναφορές και aging.
9. date_maturity
Τύπος: Date. Η ημερομηνία λήξης/πληρωμής. Σημαντική για απαιτήσεις και υποχρεώσεις, βοηθά στον προγραμματισμό πληρωμών και στις αναφορές παλαιότητας.
10. currency_id
Τύπος: Many2one (res.currency). Το νόμισμα της γραμμής. Μπορεί να διαφέρει από το νόμισμα της εταιρείας σε περιπτώσεις συναλλαγών πολλαπλών νομισμάτων.
11. amount_currency
Τύπος: Float. Το ποσό στο νόμισμα της γραμμής. Σε συνδυασμό με currency_id υποστηρίζει πολυνομισματικές εγγραφές και μετατροπές.
12. quantity
Τύπος: Float. Προαιρετική ποσότητα. Χρήσιμη σε γραμμές που σχετίζονται με προϊόντα (τιμολόγια, λογαριασμοί) για αναφορές κατά μονάδα και υπολογισμό τιμών μονάδας.
13. product_id
Τύπος: Many2one (product.product). Το προϊόν που συνδέεται με τη γραμμή —συμπληρώνεται όταν η γραμμή προέρχεται από παραγγελία πώλησης, αγοράς ή γραμμή τιμολογίου.
14. product_uom_id
Τύπος: Many2one (uom.uom). Μονάδα μέτρησης για την ποσότητα. Χρήσιμο για σωστή εμφάνιση και μετατροπές ποσοτήτων.
15. price_unit
Τύπος: Float. Τιμή μονάδας. Σε συνδυασμό με την ποσότητα υπολογίζει τα ποσά σε τιμολόγια και λογαριασμούς.
16. tax_ids
Τύπος: Many2many (account.tax). Οι φόροι που εφαρμόζονται στη γραμμή. Το Odoo δημιουργεί επιπλέον γραμμές για τα ποσά φόρου όταν γίνεται το posting. Χρησιμοποιείται για ΦΠΑ και άλλους φόρους.
17. tax_line_id
Τύπος: Many2one (account.tax). Για γραμμές φόρου, δείχνει ποιος φόρος δημιουργεί τη γραμμή —διαχωρίζει τις γραμμές φόρου από τις κανονικές λογιστικές γραμμές.
18. analytic_account_id
Τύπος: Many2one (account.analytic.account). Ο αναλυτικός λογαριασμός για παρακολούθηση κόστους και εσόδων. Χρήσιμο όταν είναι ενεργοποιημένη η αναλυτική λογιστική.
19. analytic_distribution
Τύπος: Json ή Text. Αποθηκεύει κατανομή σε πολλαπλούς αναλυτικούς λογαριασμούς. Σε νεότερες εκδόσεις μπορεί να αντικαθιστά το απλό analytic_account_id όταν χρησιμοποιούνται σύνθετα σχέδια κατανομής.
20. ref
Τύπος: Char. Εξωτερική αναφορά ή σημείωση, συνήθως συνδεδεμένη από το γονικό move. Εμφανίζεται σε αναφορές και βοηθά στην αντιστοίχιση για συμφωνίες.
21. narration
Τύπος: Text. Εσωτερικό σχόλιο ή περιγραφή —συνήθως δεν τυπώνεται στα έγγραφα προς πελάτη από προεπιλογή.
22. journal_id
Τύπος: Many2one (account.journal). Το ημερολόγιο του γονικού move. Χρήσιμο για φιλτράρισμα και αναφορές ανά ημερολόγιο.
23. company_id
Τύπος: Many2one (res.company). Η εταιρεία στην οποία ανήκει η γραμμή. Σε multi-company περιβάλλοντα καθορίζει ορατότητα και κονσολίδα.
24. reconciled
Τύπος: Boolean. Δείχνει αν η γραμμή έχει συμφωνηθεί πλήρως. Χρήσιμο για φιλτράρισμα μη συμφωνημένων εγγραφών στις προβολές συμφιλίωσης.
25. full_reconcile_id
Τύπος: Many2one (account.full.reconcile). Συνδέει όλες τις γραμμές που συμφωνήθηκαν μαζί —επιτρέπει την παρακολούθηση του συνόλου της συμφωνίας.
26. payment_id
Τύπος: Many2one (account.payment). Για γραμμές που αφορούν πληρωμές, συνδέει την εγγραφή πληρωμής. Χρήσιμο στη συμφωνία τιμολογίων με πληρωμές.
27. statement_id
Τύπος: Many2one (account.bank.statement). Για γραμμές τραπεζικού λογαριασμού, συνδέει με την αντίστοιχη κατάσταση. Χρησιμοποιείται στη συμφωνία τραπεζικών κινήσεων.
28. statement_line_id
Τύπος: Many2one (account.bank.statement.line). Συνδέει με τη συγκεκριμένη γραμμή τραπεζικής κατάστασης —σημαντικό κατά την αντιστοίχιση κινήσεων.
29. display_type
Τύπος: Selection. Μπορεί να είναι 'line_section' ή 'line_note' για κεφάλαια/σημειώσεις στην εγγραφή. Αυτές οι γραμμές δεν έχουν χρέωση ή πίστωση και χρησιμοποιούνται μόνο για παρουσίαση.
30. create_date
Τύπος: Datetime. Καταγράφει πότε δημιουργήθηκε η εγγραφή. Διαχειρίζεται αυτόματα από το Odoo και είναι χρήσιμο για έλεγχο ιστορικού.
31. write_date
Τύπος: Datetime. Καταγράφει πότε τροποποιήθηκε τελευταία φορά η εγγραφή. Διαχειρίζεται αυτόματα και βοηθά στην παρακολούθηση αλλαγών.
Πώς χρησιμοποιείται το μοντέλο στις επιχειρησιακές ροές εργασίας
1. Τιμολόγηση Πελατών
Κατά την επιβεβαίωση τιμολογίου, το Odoo δημιουργεί τις αντίστοιχες account.move.line γραμμές: οι γραμμές εσόδων πηγαίνουν σε λογαριασμούς εισοδήματος, οι απαιτήσεις στον λογαριασμό πελάτη και οι γραμμές φόρου δημιουργούνται ξεχωριστά. Το partner_id συνδέει τη γραμμή με τον πελάτη για παλαιότητα και συμφωνία.
2. Λογαριασμοί Προμηθευτών
Τα τιμολόγια προμηθευτή παράγουν γραμμές για έξοδα, εισροές ΦΠΑ και υποχρεώσεις. Η δομή μοιάζει με τα τιμολόγια πελατών αλλά με διαφορετικούς τύπους λογαριασμών.
3. Συμφωνία Τραπεζικών Εγγραφών
Οι γραμμές τραπεζικής κατάστασης αντιστοιχίζονται σε move lines μέσω του statement_line_id. Κατά τη συμφωνία, το Odoo ομαδοποιεί τις γραμμές (full_reconcile_id) και σημαίνει τις γραμμές ως reconciled.
4. Χειροκίνητες Λογιστικές Εγγραφές
Οι χρήστες μπορούν να καταχωρήσουν χειροκίνητες εγγραφές με πολλαπλές γραμμές —κάθε γραμμή χρειάζεται account και ποσό. Το Odoo επιβάλλει ισορροπία μεταξύ χρεώσεων και πιστώσεων πριν επιτρέψει το post.
5. Αναλυτική Λογιστική και Αναφορές Κόστους
Όταν η αναλυτική λογιστική είναι ενεργή, οι γραμμές περιλαμβάνουν analytic_account_id ή analytic_distribution. Οι αναφορές ομαδοποιούν κατά αναλυτικό λογαριασμό για να δείξουν κόστη και έσοδα ανά έργο, τμήμα ή άλλη διάσταση.
Πώς το επεκτείνουν οι προγραμματιστές
Οι προγραμματιστές επεκτείνουν το account.move.line με διάφορους τρόπους, όπου η κληρονομικότητα μοντέλων του Odoo είναι η κύρια τεχνική.
Κληρονομικότητα Μοντέλου
Χρησιμοποιήστε _inherit = 'account.move.line' για να επεκτείνετε το μοντέλο. Προσθέτετε νέα πεδία, παραμετροποιείτε μεθόδους ή δεσμεύσεις. Η κληρονομικότητα διατηρεί τις αλλαγές σε ξεχωριστό module, διευκολύνοντας τις αναβαθμίσεις.
Προσθήκη Πεδών
Ορίζετε νέα πεδία στο κληρονομημένο μοντέλο με τον κατάλληλο τύπο (Char, Many2one, Boolean, Integer, Text, Selection). Σκεφτείτε την εταιρική εξάρτηση σε multi-company περιβάλλον. Προσοχή σε πεδία υπολογιζόμενα και στις εξαρτήσεις τους.
Επεκτάσεις σε Python
Επικαλύψτε create, write ή unlink για να προσθέσετε λογική και καλέστε super() ώστε να μην σπάσετε βασικούς ελέγχους (π.χ. ισορροπία χρέωσης/πίστωσης). Η API του Odoo εκθέτει αυτές τις μεθόδους για ενσωματώσεις και custom behavior.
Odoo Studio
Το Odoo Studio επιτρέπει την προσθήκη πεδίων χωρίς κώδικα —βολικό για γρήγορες προσαρμογές όπως επιπλέον ετικέτες ή tags. Για σύνθετες ροές ή κανόνες συμφιλίωσης είναι προτιμότερο ένα custom module για καλύτερη συντηρησιμότητα.
Καλές πρακτικές
- Μην δημιουργείτε ή τροποποιείτε γραμμές απευθείας χωρίς να περάσετε από το move. Χρησιμοποιήστε το API του move (π.χ. line_ids) ώστε το Odoo να εφαρμόσει τους απαραίτητους ελέγχους και να διατηρήσει τη συνοχή.
- Στις αναφορές φιλτράρετε με move_id.state = 'posted' για να αποκλείσετε προσχέδια και ακυρωμένες εγγραφές.
- Χρησιμοποιήστε το σωστό account_id με βάση τον τύπο λογαριασμού (receivable, payable κ.λπ.) για να εξασφαλίσετε σωστό τρόπο παλαιότητας και συμφιλίωσης.
- Πριν δημιουργήσετε γραμμές μέσω API, δημιουργήστε πρώτα το move και βεβαιωθείτε ότι το σύνολο χρεώσεων ισούται με το σύνολο πιστώσεων πριν το post.
- Για προσαρμοσμένα πεδία χρησιμοποιήστε πρόθεμα x_ ή πρόθεμα του module σας για να αποφύγετε συγκρούσεις με μελλοντικές εκδόσεις του Odoo.
Συνηθισμένα λάθη
- Το να ορίζετε και debit και credit στην ίδια γραμμή. Κάθε γραμμή πρέπει να έχει είτε debit είτε credit —όχι και τα δύο.
- Δημιουργία μη ισοσκελισμένων moves. Το Odoo ελέγχει την ισορροπία των χρεώσεων και πιστώσεων κατά το posting.
- Τροποποίηση δημοσιευμένων γραμμών χωρίς τη σωστή διαδικασία διόρθωσης. Οι δημοσιευμένες εγγραφές πρέπει να προσαρμόζονται με αναιρέσεις/νέες εγγραφές και όχι με άμεσες αλλαγές.
- Παραλήψεις στο partner_id για γραμμές απαιτήσεων/υποχρεώσεων. Αυτό οδηγεί σε προβλήματα στις αναφορές παλαιότητας και στη συμφιλίωση.
- Επικαλύψεις βασικών μεθόδων χωρίς κλήση στο super(). Αυτό μπορεί να διαταράξει μηχανισμούς συμφιλίωσης, κλειδώματος εγγραφών ή λειτουργίες άλλων modules.
Συμπέρασμα
Το account.move.line είναι κεντρικό στο λογιστικό υποσύστημα του Odoo. Καταγράφει κάθε χρέωση και πίστωση σε εγγραφές, τιμολόγια και λογαριασμούς. Η γνώση των πεδίων και του τρόπου επέκτασης διευκολύνει τη διαμόρφωση, την προσαρμογή και τις ενσωματώσεις.
Είτε είστε σύμβουλος που αποτυπώνει ροές λογιστικών διαδικασιών είτε προγραμματιστής που φτιάχνει αναφορές και ενσωματώσεις, η καλή γνώση του account.move.line εξοικονομεί χρόνο και αποτρέπει λάθη.
Χρειάζεστε βοήθεια για την υλοποίηση του Odoo;
Η Dasolo υποστηρίζει εταιρείες στην υλοποίηση, προσαρμογή και βελτιστοποίηση του Odoo, με ειδίκευση σε API ενσωματώσεις και ανάπτυξη. Η ομάδα μας έχει βαθιά εμπειρία στην αρχιτεκτονική δεδομένων του Odoo και σε μοντέλα όπως το account.move.line.
Αν χρειάζεστε βοήθεια με την υλοποίηση Odoo, custom modules ή ενσωματώσεις, μπορούμε να σας υποστηρίξουμε. Κλείστε μια επίδειξη για να συζητήσουμε το έργο σας.