Εισαγωγή
Στο Odoo, κάθε τύπος επιχειρησιακής πληροφορίας —τιμολόγια, παραγγελίες, κινήσεις αποθέματος— αποθηκεύεται σε ένα μοντέλο. Το μοντέλο καθορίζει τη δομή, τους τύπους πεδίων και τον τρόπο που τα δεδομένα εμφανίζονται και συνδέονται στη βάση.
Η γνώση των μοντέλων είναι απαραίτητη τόσο για προγραμματιστές όσο και για λειτουργικούς συμβούλους. Τα μοντέλα είναι ο σκελετός της βάσης δεδομένων: ορίζουν πεδία, σχέσεις και την επιχειρησιακή λογική που τρέχει όταν αλλάζουν τα δεδομένα.
Αυτό το κείμενο επικεντρώνεται σε ένα κρίσιμο μοντέλο του Odoo: το stock.move. Είτε φτιάχνετε προσαρμοσμένες λύσεις αποθήκης, είτε συνδέετε εξωτερικά συστήματα, είτε διαμορφώνετε τις ροές αποθεμάτων, το stock.move θα είναι στο επίκεντρο.
Τι είναι το μοντέλο stock.move
Το stock.move αντιπροσωπεύει μια μοναδική κίνηση αποθέματος: τη μεταφορά ενός προϊόντος από μια τοποθεσία σε άλλη. Κάθε φορά που ένα πακέτο σηκώνεται από ράφι, μετακινείται μεταξύ χώρων ή παραδίδεται σε πελάτη, δημιουργείται εγγραφή stock.move.
Το μοντέλο χρησιμοποιείται από το module Αποθέματα (Inventory). Παραγγελίες πώλησης, προμήθειες, παραγωγή και ηλεκτρονικό εμπόριο δημιουργούν κινήσεις όταν ενεργοποιούν συναλλαγές αποθέματος. Επιβεβαίωση αποστολής, είσοδος προϊόντων από προμηθευτή ή ολοκλήρωση παραγγελίας παραγωγής ενημερώνει εγγραφές stock.move.
Το μοντέλο ορίζεται στο module stock και τα υπόλοιπα modules το επεκτείνουν μέσω κληρονομικότητας μοντέλου. Το sale προσθέτει σύνδεση με sale_line, το purchase με purchase_line, και το mrp με production_id — κάθε module προσθέτει ό,τι του χρειάζεται χωρίς να αντιγράφει τον πυρήνα.
Κύρια πεδία του μοντέλου
Παρακάτω βρίσκονται τα πεδία που χρησιμοποιούνται συχνότερα στο stock.move. Κατανόησή τους θα σας βοηθήσει να χειρίζεστε σωστά τις κινήσεις αποθέματος.
1. name
Τύπος: Char. Το όνομα ή η σύντομη περιγραφή της κίνησης. Συχνά φτιάχνεται από το όνομα του προϊόντος και την ποσότητα. Εμφανίζεται σε λίστες και φόρμες και λειτουργεί ως βασικός αναγνωριστικός τίτλος της κίνησης.
2. product_id
Τύπος: Many2one (product.product). Το προϊόν που μετακινείται. Υποχρεωτικό πεδίο — κάθε κίνηση πρέπει να συνδέεται με προϊόν ώστε το σύστημα να παρακολουθεί αποθέματα και κανόνες αποθεματοποίησης.
3. product_uom
Τύπος: Many2one (uom.uom). Μονάδα μέτρησης για την ποσότητα. Υποχρεωτικό. Συνήθως αντιστοιχεί στην προεπιλεγμένη μονάδα του προϊόντος και το Odoo επαληθεύει ότι οι ποσότητες εκφράζονται σε αυτή τη μονάδα.
4. product_uom_qty
Τύπος: Float. Η ζητούμενη ποσότητα προς μετακίνηση στη μονάδα του προϊόντος. Είναι η ποσότητα ζήτησης. Όταν η κίνηση ολοκληρώνεται, το quantity_done δείχνει την πραγματική επεξεργασμένη ποσότητα.
5. quantity
Τύπος: Float. Πεδίο παρουσίασης ή υπολογιζόμενο που δείχνει την ποσότητα. Χρησιμοποιείται σε προβολές για πιο φιλική εμφάνιση — μερικές φορές είναι ίδια με το product_uom_qty ή μετατροπή του.
6. location_id
Τύπος: Many2one (stock.location). Η πηγή της κίνησης — από πού παίρνεται το προϊόν. Υποχρεωτικό. Σε εξερχόμενες κινήσεις είναι η αποθήκη, σε εισερχόμενες μπορεί να είναι η τοποθεσία προμηθευτή ή παραγωγής.
7. location_dest_id
Τύπος: Many2one (stock.location). Ο προορισμός της κίνησης — που πηγαίνει το προϊόν. Υποχρεωτικό. Σε εισερχόμενες κινήσεις είναι η αποθήκη, σε εξερχόμενες μπορεί να είναι η τοποθεσία πελάτη ή scrap.
8. picking_id
Τύπος: Many2one (stock.picking). Η ομάδα ή το έγγραφο μεταφοράς που ομαδοποιεί τις κινήσεις — ένα δελτίο αποστολής, παραλαβής ή εσωτερικής μεταφοράς. Οι κινήσεις συγκεντρώνονται σε picking για λειτουργικούς χειρισμούς.
9. picking_type_id
Τύπος: Many2one (stock.picking.type). Ο τύπος λειτουργίας — αν πρόκειται για έξοδο, είσοδο ή εσωτερική μεταφορά. Αυτό καθορίζει τη ροή εργασίας και τις προεπιλογές τοποθεσιών.
10. state
Τύπος: Selection. Η τρέχουσα κατάσταση της κίνησης. Τιμές: draft, waiting, confirmed, assigned, done, cancelled. Το draft σημαίνει μη επιβεβαιωμένο, assigned ότι έχουν κρατηθεί αποθέματα, done ότι η κίνηση ολοκληρώθηκε.
11. date
Τύπος: Datetime. Η προγραμματισμένη ημερομηνία της κίνησης. Χρησιμοποιείται για προγραμματισμό και προτεραιοποίηση μεταφορών.
12. date_deadline
Τύπος: Datetime. Η προθεσμία της κίνησης. Για παραδόσεις πελατών συχνά είναι η υποσχεθείσα ημερομηνία παράδοσης και χρησιμοποιείται σε υπολογισμούς επείγοντος.
13. origin
Τύπος: Char. Αναφορά στο αρχικό έγγραφο — π.χ. αριθμός SO, PO ή MO. Βοηθά στην ιχνηλασιμότητα της κίνησης πίσω στην προέλευσή της.
14. move_dest_id
Τύπος: Many2one (stock.move). Η προοδευτική/συνδεδεμένη κίνηση που ακολουθεί. Όταν μία κίνηση τροφοδοτεί άλλη (π.χ. παραγωγή → παράδοση), αυτό το πεδίο τα συνδέει για αλυσίδα κινήσεων.
15. move_orig_ids
Τύπος: One2many (stock.move). Οι προηγούμενες κινήσεις που τροφοδοτούν αυτήν — το αντίστροφο του move_dest_id. Χρήσιμο για ιχνηλασιμότητα και απεικόνιση εξαρτήσεων.
16. move_line_ids
Τύπος: One2many (stock.move.line). Οι γραμμές κίνησης — λεπτομερή στοιχεία με σειρά παραγωγής/παρτίδα, ειδική τοποθεσία ή κατανομή. Κατά την κράτηση ή επεξεργασία δημιουργούνται move lines.
17. partner_id
Τύπος: Many2one (res.partner). Ο συνεργάτης συνδεδεμένος με την κίνηση — πελάτης σε αποστολές, προμηθευτής σε παραλαβές. Χρησιμοποιείται για διευθύνσεις και αναφορές.
18. company_id
Τύπος: Many2one (res.company). Σε πολυεταιρικά περιβάλλοντα δείχνει σε ποια εταιρεία ανήκει η κίνηση. Επηρεάζει ορατότητα και κανόνες διαχείρισης μεταξύ εταιρειών.
19. quantity_done
Τύπος: Float. Η ποσότητα που έχει πράγματι επεξεργαστεί. Κατά τη συλλογή ή την παραλαβή ενημερώνεται αυτό το πεδίο. Η κίνηση θεωρείται ολοκληρωμένη όταν quantity_done = product_uom_qty.
20. reserved_availability
Τύπος: Float. Η ποσότητα που έχει κρατηθεί για την κίνηση. Όταν η κίνηση έχει assigned κατάσταση, αυτό δείχνει πόσο απόθεμα είναι δεσμευμένο.
21. create_date
Τύπος: Datetime. Η ημερομηνία και ώρα δημιουργίας της εγγραφής — διαχειρίζεται αυτόματα από το Odoo και είναι χρήσιμη για έλεγχο και αναφορές.
22. write_date
Τύπος: Datetime. Η ημερομηνία και ώρα της τελευταίας τροποποίησης — επίσης αυτόματα ενημερούμενη για να βλέπετε πότε άλλαξε τελευταία φορά το ρεκόρ.
23. sequence
Τύπος: Integer. Σειρά εμφάνισης μέσα σε ένα picking. Χρησιμοποιείται για ταξινόμηση στο UI — μικρότεροι αριθμοί εμφανίζονται πρώτοι.
24. priority
Τύπος: Selection. Επίπεδο επείγοντος — συνήθως 0 για κανονικό, 1 για επείγον. Χρησιμεύει στον προγραμματισμό ώστε επείγουσες κινήσεις να προτεραιοποιούνται.
25. description_picking
Τύπος: Char. Σημείωση ή περιγραφή που εμφανίζεται στο δελτίο μεταφοράς. Χρήσιμο για ειδικές οδηγίες χειρισμού ή σημειώσεις σε φορτίο.
26. reference
Τύπος: Char. Εσωτερικός κωδικός αναφοράς. Μπορεί να χρησιμοποιηθεί για αντιστοίχιση με εξωτερικά συστήματα ή για προσαρμοσμένη παρακολούθηση.
27. group_id
Τύπος: Many2one (procurement.group). Η ομάδα προμηθειών που ομαδοποιεί σχετικές κινήσεις (π.χ. από την ίδια παραγγελία). Βοηθά στον προγραμματισμό και την αλυσίδα προμηθειών.
28. procure_method
Τύπος: Selection. Make to stock ή make to order. Ορίζει αν θα χρησιμοποιηθεί υπάρχον απόθεμα ή θα πυροδοτηθεί παραγωγή/προμήθεια.
29. sale_line_id
Τύπος: Many2one (sale.order.line). Προστίθεται από το module Πωλήσεων. Συνδέει την κίνηση με τη γραμμή παραγγελίας που την προκάλεσε — χρήσιμο για αναφορές και ιχνηλασιμότητα.
30. purchase_line_id
Τύπος: Many2one (purchase.order.line). Προστίθεται από το module Αγορών. Συνδέει την κίνηση με τη γραμμή PO όταν παραλαμβάνονται αγαθά από προμηθευτή.
31. production_id
Τύπος: Many2one (mrp.production). Προστίθεται από το Manufacturing. Συνδέει κινήσεις με την εντολή παραγωγής — για κατανάλωση πρώτων υλών και έξοδο τελικών προϊόντων.
32. active
Τύπος: Boolean. Σημαία «μαλακής» διαγραφής. Όταν False, η εγγραφή αρχειοθετείται και αποκρύπτεται από τις προεπιλεγμένες προβολές χωρίς να διαγράφεται φυσικά.
Πώς χρησιμοποιείται αυτό το μοντέλο στις επιχειρησιακές ροές
1. Παράδοση σε πελάτη
Όταν μια πώληση επιβεβαιώνεται, το Odoo δημιουργεί stock.move για κάθε γραμμή προϊόντος. Η source τοποθεσία είναι η αποθήκη και ο προορισμός ο πελάτης. Οι κινήσεις ομαδοποιούνται σε picking και, όταν το αποθετήριο εκτελεί τη συλλογή και αποστολή, το quantity_done ενημερώνεται και το state γίνεται done.
2. Παραλαβή από προμηθευτή
Με την επιβεβαίωση PO δημιουργούνται εισερχόμενες κινήσεις: source είναι η θέση προμηθευτή, προορισμός η αποθήκη. Οι κινήσεις ομαδοποιούνται σε receipt και κατά την παραλαβή ο χρήστης επικυρώνει και θέτει quantity_done.
3. Εσωτερική μεταφορά
Μεταφορές ανάμεσα σε αποθήκες ή τμήματα δημιουργούν stock.move με source και destination τις αντίστοιχες τοποθεσίες. Χρησιμοποιούνται για αναπλήρωση, εξισορρόπηση αποθεμάτων ή multi-warehouse λειτουργίες.
4. Παραγωγή
Οι εντολές παραγωγής δημιουργούν κινήσεις εισροής πρώτων υλών (από αποθήκη προς παραγωγή) και εκροής τελικών προϊόντων (από παραγωγή προς αποθήκη). Το production_id συσχετίζει αυτές τις κινήσεις με την εντολή παραγωγής και οι συνδέσεις move_dest_id επιτρέπουν την αλυσίδα παραγωγής → παράδοσης.
5. Επιστροφές και απόρριψη
Επιστροφές πελατών δημιουργούν αντίστροφες κινήσεις, ενώ οι ενέργειες scrap στέλνουν υλικό σε τοποθεσία απορριμμάτων. Το ίδιο μοντέλο stock.move καλύπτει όλες τις περιπτώσεις· το picking_type_id ορίζει τον τύπο λειτουργίας.
Πώς το επεκτείνουν οι προγραμματιστές
Οι προγραμματιστές επεκτείνουν το stock.move με διάφορους τρόπους, κυρίως μέσω της κληρονομικότητας των μοντέλων στο Odoo.
Κληρονομικότητα μοντέλου
Χρησιμοποιήστε _inherit = 'stock.move' για να επεκτείνετε. Μπορείτε να προσθέσετε πεδία, να υπερφορτώσετε μεθόδους ή να ορίσετε περιορισμούς. Η επέκταση γίνεται σε ξεχωριστό module ώστε οι αλλαγές να είναι διατηρήσιμες σε αναβαθμίσεις.
Προσθήκη πεδίων
Δηλώστε νέα πεδία στο κληρονομημένο μοντέλο με τους κατάλληλους τύπους: Char, Many2one, Boolean, Integer, Text, Selection. Σε πολυεταιρικά περιβάλλοντα σκεφτείτε πεδία εξαρτώμενα από εταιρεία. Συνηθισμένες επεκτάσεις: αριθμοί ιχνηλασίας, αναφορές μεταφορέα, ή επιπλέον χαρακτηριστικά παρτίδας.
Επεκτάσεις σε Python
Υπερφορτώστε μεθόδους όπως _action_done, _action_assign ή _action_cancel για να προσθέσετε επιχειρησιακή λογική. Χρησιμοποιήστε super() για να καλέσετε τη βάση. Προσέξτε τις ενημερώσεις αποθέματος και τις αλυσίδες κινήσεων — η σωστή χρήση του API είναι κρίσιμη.
Odoo Studio
Το Odoo Studio επιτρέπει να προσθέσετε πεδία χωρίς κώδικα — βολικό για γρήγορες προσαρμογές στη φόρμα της κίνησης. Όμως για περίπλοκη λογική ή αλλαγές ροής εργασίας, οι προσαρμοσμένες modules είναι πιο συντηρήσιμα.
Καλές πρακτικές
- Πάντα ορίστε σωστά location_id και location_dest_id. Λανθασμένες τοποθεσίες οδηγούν σε εσφαλμένα επίπεδα αποθεμάτων.
- Χρησιμοποιήστε το picking_id για να ομαδοποιείτε σχετικές κινήσεις. Μην δημιουργείτε κινήσεις που ανήκουν σε μεταφορά χωρίς σχετικό picking.
- Για API ενσωματώσεις χρησιμοποιήστε XML-RPC ή JSON-RPC. Το stock.move είναι πλήρως προσβάσιμο — αντιστοιχίστε τα εξωτερικά IDs προσεκτικά.
- Για προσαρμοσμένα πεδία, χρησιμοποιήστε πρόθεμα
x_ή το πρόθεμα του module για να αποφύγετε συγκρούσεις με μελλοντικές εκδόσεις του Odoo. - Χρησιμοποιήστε move_dest_id και move_orig_ids για ιχνηλασιμότητα. Όταν δημιουργείτε αλυσιδωτές κινήσεις προγραμματισμένα, ορίστε σωστά αυτές τις συνδέσεις.
- Λάβετε υπόψη τη διαφορά quantity_done vs product_uom_qty κατά την επικύρωση — γίνονται μερικές παραδόσεις και αυτό πρέπει να υποστηρίζεται.
Συνηθισμένα λάθη
- Δημιουργία κινήσεων με λάθος τύπους τοποθεσιών. Η πηγή και ο προορισμός πρέπει να είναι συμβατοί (π.χ. να μην είναι και οι δύο τοποθεσίες πελατών).
- Τροποποίηση του product_uom_qty αφού υπάρχουν move lines. Αυτό μπορεί να δημιουργήσει ασυνέπειες στα αποθέματα — προτιμήστε ακύρωση και επαναδημιουργία.
- Ξεχασμένο origin. Χωρίς αναφορά προέλευσης είναι δύσκολη η ιχνηλασιμότητα της κίνησης πίσω στο αρχικό έγγραφο.
- Υπερφόρτωση του
_action_doneχωρίς κλήση στο super(). Αυτό μπορεί να σπάσει ενημερώσεις αποθέματος και να επηρεάσει άλλα modules. - Δημιουργία κινήσεων απευθείας χωρίς να ακολουθηθεί η σωστή ροή (π.χ. παράλειψη του stock.picking). Το «παρακάμπτοντας» μπορεί να σπάσει την κράτηση και την ανάθεση αποθέματος.
- Αγνόηση του move_dest_id όταν χωρίζετε ή συγχωνεύετε κινήσεις. Οι συνδεδεμένες κινήσεις μπορεί να μείνουν ορφανές.
Συμπέρασμα
Το stock.move είναι θεμελιώδες για τη διαχείριση αποθεμάτων στο Odoo. Καταγράφει κάθε μετακίνηση αγαθών μεταξύ τοποθεσιών. Η γνώση των πεδίων και του τρόπου που τα modules το επεκτείνουν διευκολύνει τη σωστή διαμόρφωση, προσαρμογή και ενσωμάτωση.
Είτε είστε λειτουργικός σύμβουλος που χαρτογραφεί διαδικασίες αποθήκης είτε προγραμματιστής που φτιάχνει προσαρμοσμένα modules, μια γερή κατανόηση του stock.move θα σας γλιτώσει χρόνο και λάθη.
Χρειάζεστε βοήθεια με την υλοποίηση του Odoo;
Η Dasolo υποστηρίζει εταιρείες στην υλοποίηση, προσαρμογή και βελτιστοποίηση του Odoo. Ειδικευόμαστε σε API ενσωματώσεις και ανάπτυξη — με βαθιά εμπειρία στην αρχιτεκτονική δεδομένων του Odoo και μοντέλα όπως το stock.move.
Αν χρειάζεστε βοήθεια με την εφαρμογή Odoo, την ανάπτυξη custom modules ή ενσωματώσεις, επικοινωνήστε μαζί μας — μπορούμε να αναλάβουμε το έργο σας. Κλείστε ένα demo για να συζητήσουμε το project σας.