Εισαγωγή
Στο Odoo, κάθε τύπος επιχειρηματικής πληροφορίας οργανώνεται μέσα σε ένα μοντέλο — δηλαδή σε μια δομή που καθορίζει τι πεδία υπάρχουν, πώς αποθηκεύονται και πώς σχετίζονται μεταξύ τους. Από παραγγελίες πώλησης μέχρι κινήσεις αποθέματος και διεργασίες αποθήκης, όλα αποθηκεύονται σε αντίστοιχα μοντέλα στη βάση δεδομένων.
Η γνώση των μοντέλων είναι απαραίτητη τόσο για τους developers όσο και για τους functional consultants. Τα μοντέλα αποτελούν τη ραχοκοκαλιά της αρχιτεκτονικής δεδομένων του Odoo — καθορίζουν πεδία, σχέσεις και επιχειρησιακό λογισμικό που εκτελεί κανόνες σε εγγραφές.
Αυτό το άρθρο εστιάζει σε ένα από τα πιο κρίσιμα μοντέλα του Inventory app: το stock.picking. Είτε υλοποιείτε προσαρμογμένες λειτουργίες αποθήκης, είτε συνδέετε εξωτερικά συστήματα, είτε ρυθμίζετε ροές εργασίας, το stock.picking είναι ένα αντικείμενο με το οποίο θα εργάζεστε συχνά.
Τι είναι το μοντέλο stock.picking
Το stock.picking αντιπροσωπεύει τις μεταφορές στο Odoo: το σημείο όπου καταγράφονται οι κινήσεις αγαθών από μια τοποθεσία σε άλλη. Κάθε εγγραφή picking αντιστοιχεί σε μία συγκεκριμένη μεταφορά αγαθών — την «παραγγελία» που πρέπει να εκτελέσει η αποθήκη.
Στο Inventory module, όλες οι βασικές ροές δημιουργούν εγγραφές stock.picking: εισερχόμενα (receipts), εξερχόμενα (deliveries) και εσωτερικές μεταφορές. Επιβεβαίωση παραγγελίας πώλησης, παραλαβή από προμηθευτή ή μετακίνηση ανάμεσα σε αποθήκες δημιουργούν ή ενημερώνουν pickings.
Το μοντέλο ορίζεται στο module stock, ενώ άλλα modules το επεκτείνουν μέσω της κληρονομικότητας μοντέλων του Odoo. Το sale προσθέτει πεδία και ροές για παραδόσεις, το purchase για παραλαβές, και το mrp για κινήσεις παραγωγής — όλα προσθέτουν τις ανάγκες τους πάνω στον βασικό σκελετό χωρίς να αντιγράφουν δομές.
Το stock.picking κληρονομεί λειτουργικότητα από mail.thread και mail.activity.mixin, κάτι που σημαίνει ότι μπορείτε να βλέπετε ιστορικό αλλαγών, να προσθέτετε μηνύματα (chatter) και να προγραμματίζετε δραστηριότητες πάνω στις μεταφορές.
Βασικά πεδία του μοντέλου
Ακολουθούν τα πιο σημαντικά πεδία του stock.picking που θα συναντήσετε στην καθημερινή εργασία. Κατανόηση τους επιτρέπει να διαχειρίζεστε σωστά τις μεταφορές και τους ελέγχους αποθέματος.
1. name
Τύπος: Char. Το αναγνωριστικό της μεταφοράς, συνήθως παραγόμενο από ακολουθία (π.χ. WH/OUT/00001). Εμφανίζεται στην κεφαλίδα της φόρμας και χρησιμοποιείται για την άμεση αναζήτηση και αναφορά του picking.
2. origin
Τύπος: Char. Αναφορά στην αρχική πηγή της μεταφοράς — για παράδειγμα το όνομα της πώλησης ή της αγοράς. Χρησιμοποιείται για ιχνηλασιμότητα και σύνδεση εγγράφων.
3. state
Τύπος: Selection. Καταγράφει την κατάσταση της μεταφοράς: Draft, Waiting Another Operation, Waiting, Ready, Done, Cancelled. Η τιμή καθορίζει ποιες ενέργειες είναι διαθέσιμες και προκύπτει από την κατάσταση των σχετικών stock.move.
4. picking_type_id
Τύπος: Many2one (stock.picking.type). Ο τύπος λειτουργίας: παραλαβή, παράδοση ή εσωτερική μεταφορά. Είναι υποχρεωτικό πεδίο και ορίζει τις προεπιλεγμένες πηγές/προορισμούς τοποθεσιών.
5. move_ids
Τύπος: One2many (stock.move). Οι κινήσεις αποθέματος που αποτελούν τις γραμμές της μεταφοράς. Κάθε γραμμή δηλώνει προϊόν και ποσότητα — πάνω σε αυτές εφαρμόζεται όλο το σύστημα δεσμεύσεων και διαθεσιμότητας.
6. move_line_ids
Τύπος: One2many (stock.move.line). Πιο λεπτομερείς εγγραφές λειτουργίας: σειρές με lot/serial, ακριβείς θέσεις και συσκευασίες. Χρησιμοποιούνται στη συλλογή, το πακετάρισμα και την τελική επικύρωση.
7. location_id
Τύπος: Many2one (stock.location). Η πηγή από όπου παίρνονται τα προϊόντα. Για παραδόσεις, συνήθως είναι η κύρια αποθηκευτική τοποθεσία· για παραλαβές, η θέση του προμηθευτή.
8. location_dest_id
Τύπος: Many2one (stock.location). Ο προορισμός των προϊόντων μετά τη μεταφορά. Για παραδόσεις είναι η τοποθεσία πελάτη, για παραλαβές συνήθως η αποθήκη.
9. partner_id
Τύπος: Many2one (res.partner). Ο συνεργάτης που σχετίζεται με τη μεταφορά — πελάτης για παραδόσεις, προμηθευτής για εισερχόμενα. Χρησιμοποιείται σε έγγραφα και ενσωματώσεις μεταφορέων.
10. scheduled_date
Τύπος: Datetime. Η προγραμματισμένη ημερομηνία επεξεργασίας της μεταφοράς. Χρησιμοποιείται για προτεραιοποίηση και σχεδιασμό, και επηρεάζει τις δεσμεύσεις προϊόντων.
11. date_deadline
Τύπος: Datetime. Η προθεσμία της μεταφοράς — συνήθως προέρχεται από την παραγγελία πώλησης ή αγοράς και βοηθά στο να εντοπίζονται καθυστερήσεις.
12. date_done
Τύπος: Datetime. Η ημερομηνία επικύρωσης ή ακύρωσης. Είναι μόνο για ανάγνωση και συμπληρώνεται αυτόματα όταν ολοκληρωθεί το picking.
13. priority
Τύπος: Selection. Επίπεδο προτεραιότητας—οι μεταφορές με υψηλότερη προτεραιότητα εξυπηρετούνται πρώτες κατά τη δέσμευση.
14. move_type
Τύπος: Selection. Πολιτική αποστολής: Άμεσα (επιτρέπονται μερικές παραδόσεις) ή Όταν όλα είναι έτοιμα (ολόκληρη παράδοση). Επηρεάζει πότε μπορεί να εκτελεστεί το picking.
15. user_id
Τύπος: Many2one (res.users). Ο υπεύθυνος χρήστης της μεταφοράς — χρήσιμο για κατανομή εργασιών και παρακολούθηση φόρτου.
16. company_id
Τύπος: Many2one (res.company). Η εταιρεία που ανήκει η μεταφορά — σημαντικό σε πολυεταιρικά περιβάλλοντα και συνήθως συνδέεται με τον τύπο picking.
17. group_id
Τύπος: Many2one (procurement.group). Η ομάδα προμηθειών που συνδέει σχετικές κινήσεις, χρήσιμη όταν πολλές μεταφορές προέρχονται από την ίδια παραγγελία.
18. backorder_id
Τύπος: Many2one (stock.picking). Όταν μια μεταφορά επιβεβαιώνεται μερικώς δημιουργείται backorder για το υπόλοιπο — αυτό το πεδίο δείχνει στην αρχική μεταφορά.
19. backorder_ids
Τύπος: One2many (stock.picking). Τα backorders που προέκυψαν από αυτή τη μεταφορά — χρησιμοποιούνται για προγραμματισμό της υπόλοιπης εργασίας.
20. return_id
Τύπος: Many2one (stock.picking). Αν η εγγραφή είναι επιστροφή, συνδέει την επιστροφή με την αρχική παράδοση για ιχνηλασιμότητα.
21. note
Τύπος: Html. Εσωτερικές σημειώσεις και οδηγίες για την ομάδα αποθήκης — π.χ. ειδικοί χειρισμοί ή προσοχές.
22. signature
Τύπος: Image. Η υπογραφή που καταγράφεται κατά την παράδοση — χρησιμοποιείται ως απόδειξη παράδοσης και αποθηκεύεται ως συνημμένο.
23. is_signed
Τύπος: Boolean. Υπολογιζόμενο από την παρουσία της υπογραφής — δείχνει αν η παράδοση έχει υπογραφεί.
24. owner_id
Τύπος: Many2one (res.partner). Ο ιδιοκτήτης των προϊόντων στην επικύρωση — χρήσιμο σε consignments ή όταν τα προϊόντα ανήκουν σε τρίτο μέρος.
25. package_level_ids
Τύπος: One2many (stock.package_level). Ομαδοποιήσεις γραμμών σε επίπεδα συσκευασίας όταν χρησιμοποιείται put in pack, για διαχείριση αποστολών ανά συσκευασία.
26. create_date
Τύπος: Datetime. Η ημερομηνία δημιουργίας της εγγραφής — διαχειρίζεται αυτόματα από το Odoo.
27. write_date
Τύπος: Datetime. Η τελευταία ημερομηνία τροποποίησης — επίσης αυτόματα καταχωρούμενη.
28. active
Τύπος: Boolean. Σημαία για soft-delete — όταν είναι False, η εγγραφή θεωρείται αρχειοθετημένη.
Πώς χρησιμοποιείται το μοντέλο στις επιχειρησιακές ροές
1. Πωλήσεις και Παραδόσεις
Η επιβεβαίωση μιας παραγγελίας πώλησης παράγει ένα delivery (stock.picking). Η αποθήκη συλλέγει και πακετάρει τα προϊόντα, ο υπάλληλος επικυρώνει το picking και η κατάσταση αλλάζει από draft σε ready και τελικά σε done.
2. Αγορές και Παραλαβές
Όταν επιβεβαιώνεται μια παραγγελία αγοράς, δημιουργείται ένα incoming receipt. Τα προϊόντα μετακινούνται από τη θέση του προμηθευτή στο απόθεμα και η επικύρωση ενημερώνει τις ποσότητες στο σύστημα.
3. Εσωτερικές Μεταφορές
Μετακινήσεις ανάμεσα σε εσωτερικές θέσεις ή αποθήκες δημιουργούν εσωτερικά pickings (picking_type με κωδικό 'internal'), όπου τόσο η προέλευση όσο και ο προορισμός είναι εσωτερικές τοποθεσίες.
4. Επιστροφές και Backorders
Σε περίπτωση επιστροφής από πελάτη δημιουργείται return picking που συνδέεται με την αρχική εγγραφή μέσω του return_id. Αν μια παράδοση επικυρωθεί μερικώς, τα υπόλοιπα αποθηκεύονται ως backorder και συνδέονται με την αρχική μεταφορά.
5. Παραγωγή και Μηχανουργείο
Οι εντολές παραγωγής δημιουργούν pickings για κατανάλωση πρώτων υλών και για παραλαβή τελικών προϊόντων. Το mrp module επεκτείνει το stock.picking για να χειριστεί αυτές τις ροές.
Πώς το επεκτείνουν οι προγραμματιστές
Οι προγραμματιστές επεκτείνουν το stock.picking με διάφορα μοτίβα, όπου η κληρονομικότητα μοντέλων του Odoo είναι το βασικό εργαλείο.
Κληρονομικότητα Μοντέλου
Χρησιμοποιήστε _inherit = 'stock.picking' για να προσθέσετε πεδία, να παρακάμψετε μεθόδους ή να ορίσετε περιορισμούς. Η επέκταση γίνεται σε ξεχωριστό module ώστε οι αλλαγές να παραμένουν οργανωμένες και ευκολότερες σε αναβαθμίσεις.
Προσθήκη Πεδίων
Ορίστε νέα πεδία στο κληρονομημένο μοντέλο χρησιμοποιώντας τον κατάλληλο τύπο (Char, Many2one, Boolean, Integer, Text, Selection). Σε περιβάλλον πολλαπλών εταιρειών σκεφτείτε company-dependent πεδία όπου χρειάζεται.
Επεκτάσεις σε Python
Παρακάμψτε μεθόδους όπως button_validate, action_assign ή _create_backorder για να ενσωματώσετε custom λογική — αλλά φροντίστε να καλείτε super() ώστε να μην σπάσετε κρίσιμες ροές και μεταβάσεις καταστάσεων.
Odoo Studio
Το Odoo Studio επιτρέπει προσθήκη πεδίων χωρίς κώδικα, κατάλληλο για γρήγορες προσαρμογές όπως επιπλέον ετικέτες ή σημειώσεις. Για περίπλοκη λογική ή ενσωματώσεις μεταφορέων, οι custom modules είναι πιο συντηρήσιμες.
Καλές πρακτικές
- Πάντοτε ορίζετε picking_type_id όταν δημιουργείτε pickings χειροκίνητα — αυτό καθορίζει προεπιλεγμένες τοποθεσίες και συμπεριφορές.
- Χρησιμοποιήστε το πεδίο origin για να διατηρείτε ιχνηλασιμότητα στην προέλευση της μεταφοράς — βοηθά στην αναφορά και στο debugging.
- Σε API ενσωματώσεις, το stock.picking είναι πλήρως προσβάσιμο μέσω του Odoo API. Δημιουργήστε κινήσεις μέσω της σχέσης move_ids — αποφύγετε τη δημιουργία pickings χωρίς αντίστοιχες κινήσεις.
- Χρησιμοποιήστε το scheduled_date για σχεδιασμό εργασιών — επηρεάζει δεσμεύσεις και προτεραιοποίηση.
- Για custom πεδία, χρησιμοποιήστε πρόθεμα x_ ή πρόθεμα του module σας για να αποφύγετε συγκρούσεις με μελλοντικές εκδόσεις του Odoo.
Συχνά λάθη
- Δημιουργία pickings χωρίς setting του picking_type_id — μπορεί να προκαλέσει λανθασμένες προεπιλεγμένες τοποθεσίες.
- Τροποποίηση move_ids μετά την επιβεβαίωση χωρίς πλήρη κατανόηση της state machine — οι μεταβάσεις κατάστασης είναι περίπλοκες και μπορεί να προκαλέσουν ασυνέπειες.
- Ξεχνάτε να ορίσετε partner_id για παραδόσεις — οι μεταφορείς και τα έγγραφα χρειάζονται τα στοιχεία του πελάτη.
- Παρακάμπτετε button_validate χωρίς να καλείτε super() — αυτό μπορεί να σπάσει δημιουργία backorders και λειτουργίες άλλων modules.
- Υποθέτετε ότι move_ids και move_line_ids είναι πάντα συγχρονισμένα — οι move lines δημιουργούνται όταν γίνει reservation ή όταν χρησιμοποιούνται λεπτομερείς λειτουργίες.
Συμπέρασμα
Το stock.picking είναι κρίσιμο για το inventory του Odoo — αποθηκεύει τις μεταφορές, παραλαβές και παραδόσεις. Κατανόηση των πεδίων του και του τρόπου επέκτασης από modules διευκολύνει τη ρύθμιση, την προσαρμογή και τις ενσωματώσεις.
Είτε είστε functional consultant που σχεδιάζει διαδικασίες αποθήκης είτε developer που υλοποιεί custom modules, η καλή γνώση του stock.picking θα σας γλιτώσει χρόνο και θα μειώσει τα λάθη.
Έτοιμοι να βελτιστοποιήσετε την αποθήκη σας στο Odoo;
Η Dasolo υποστηρίζει επιχειρήσεις στην υλοποίηση, προσαρμογή και βελτιστοποίηση του Odoo. Ειδικευόμαστε σε API ενσωματώσεις και ανάπτυξη Odoo, με εμπειρία στην αρχιτεκτονική δεδομένων και σε μοντέλα όπως το stock.picking.
Αν χρειάζεστε βοήθεια με την υλοποίηση Odoo, custom λειτουργίες αποθήκης ή ενσωματώσεις, μπορούμε να αναλάβουμε και να καθοδηγήσουμε το έργο σας. Κλείστε μια επίδειξη για να συζητήσουμε το project σας.