Εισαγωγή
Μία από τις λιγότερο συζητημένες δυνατότητες στο μοντέλο δεδομένων του Odoo είναι το πεδίο εξαρτώμενο από εταιρεία. Είναι ένα μικρό χαρακτηριστικό που κάνει μεγάλη διαφορά μόλις αρχίσετε να εργάζεστε με διαμορφώσεις πολλών εταιρειών.
Στις περισσότερες ρυθμίσεις Odoo, ένα πεδίο σε μια εγγραφή κρατά μια μοναδική τιμή που μπορούν να δουν όλοι οι χρήστες σε όλη τη βάση δεδομένων. Αλλά τι συμβαίνει όταν δύο εταιρείες μοιράζονται τον ίδιο κατάλογο προϊόντων και κάθε εταιρεία χρειάζεται τον δικό της εσωτερικό κωδικό αναφοράς; Ή όταν διαφορετικές εταιρείες χρειάζονται διαφορετικούς προεπιλεγμένους λογαριασμούς για το ίδιο προϊόν;
Αυτό ακριβώς είναι το πρόβλημα που επιλύει το χαρακτηριστικό company_dependent. Είτε κάνετε ανάπτυξη στο Odoo, είτε προσαρμογή του Odoo, είτε απλώς εξερευνάτε το πλαίσιο του Odoo, η κατανόηση αυτού του τύπου πεδίου θα σας δώσει πραγματικό πλεονέκτημα σε έργα πολλών εταιρειών.
Τι Είναι Ένα Πεδίο Εξαρτώμενο από Εταιρεία στο Odoo
Ένα πεδίο εξαρτώμενο από την εταιρεία είναι ένα πεδίο που αποθηκεύει μια ξεχωριστή τιμή ανά εταιρεία, στην ίδια εγγραφή. Όταν ένας χρήστης που ανήκει στην Εταιρεία Α διαβάσει το πεδίο, βλέπει την τιμή της εταιρείας του. Όταν ένας χρήστης από την Εταιρεία Β διαβάσει την ίδια εγγραφή, βλέπει μια διαφορετική τιμή.
Από έξω, φαίνεται και συμπ behaves όπως ένα κανονικό πεδίο. Οι χρήστες αλληλεπιδρούν μαζί του με τον ίδιο τρόπο στην διεπαφή του Odoo. Η μαγεία συμβαίνει πίσω από τις σκηνές στο Odoo ORM.
Πώς Εμφανίζεται στη Διεπαφή
Στο UI του Odoo, ένα πεδίο εξαρτώμενο από την εταιρεία φαίνεται πανομοιότυπο με ένα κανονικό πεδίο. Δεν υπάρχει ορατός δείκτης που να λέει σε έναν χρήστη ότι η τιμή που βλέπει είναι συγκεκριμένη για την εταιρεία. Αυτό είναι σκόπιμο: η συμπεριφορά είναι διαφανής για τους τελικούς χρήστες.
Από την προοπτική ενός προγραμματιστή, αυτός είναι ένας από τους τύπους πεδίων του Odoo που μπορεί να εφαρμοστεί σε πολλούς βασικούς τύπους: Char, Boolean, Integer, Float, Many2one, και άλλους. Το χαρακτηριστικό company_dependent=True είναι αυτό που ενεργοποιεί αυτή τη συμπεριφορά στο Odoo ORM.
Στο Odoo Studio, ορισμένα πεδία εξαρτώμενα από την εταιρεία είναι ήδη εκτεθειμένα σε τυπικά μοντέλα (όπως πεδία που σχετίζονται με προϊόντα για λογαριασμούς). Μπορούν επίσης να δημιουργηθούν προσαρμοσμένα πεδία εξαρτώμενα από την εταιρεία, αν και η υποστήριξη του Studio για αυτό το συγκεκριμένο χαρακτηριστικό είναι περιορισμένη σε ορισμένες εκδόσεις του Odoo.
Πώς Λειτουργεί το Πεδίο
Κρυφά, τα πεδία εξαρτώμενα από την εταιρεία λειτουργούν πολύ διαφορετικά από τα κανονικά πεδία. Η κατανόηση του μηχανισμού βοηθά στην αποφυγή εκπλήξεων κατά την κατασκευή ή την αποσφαλμάτωση προσαρμογών του Odoo.
Αποθήκευση στο ir.property
Στο Odoo 16 και νωρίτερα, οι τιμές των πεδίων εξαρτώμενων από την εταιρεία δεν αποθηκεύονται στον δικό τους πίνακα βάσης δεδομένων του μοντέλου. Αντίθετα, αποθηκεύονται σε έναν ξεχωριστό πίνακα συστήματος που ονομάζεται ir.property.
Κάθε καταχώρηση στο ir.property συνδέει:
- Μια συγκεκριμένη εγγραφή (π.χ., προϊόν με ID 42)
- Ένα συγκεκριμένο πεδίο (π.χ.,
property_account_income_id) - Μια συγκεκριμένη εταιρεία
- Η πραγματική αξία για αυτόν τον συνδυασμό
Αυτός είναι ο λόγος που οι τιμές φαίνονται διαφανείς στους χρήστες: το ORM ανακτά και γράφει αυτόματα στο ir.property με βάση το τρέχον εταιρικό πλαίσιο.
Αλλαγές στο Odoo 17+
Αρχής γενομένης από το Odoo 17, ο μηχανισμός αποθήκευσης ανασχεδιάστηκε. Τα πεδία που εξαρτώνται από την εταιρεία αποθηκεύονται τώρα απευθείας στον πίνακα του μοντέλου χρησιμοποιώντας μια στήλη jsonb, με τις τιμές της εταιρείας να αποθηκεύονται ως λεξικό JSON. Αυτό βελτιώνει σημαντικά την απόδοση και απλοποιεί τα ερωτήματα.
Η διεπαφή και το API που απευθύνεται στους προγραμματιστές παραμένουν τα ίδια, αλλά τα ερωτήματα σε πεδία που εξαρτώνται από την εταιρεία είναι τώρα πολύ πιο γρήγορα σε κλίμακα.
Προεπιλεγμένες Τιμές
Τα πεδία που εξαρτώνται από την εταιρεία υποστηρίζουν προεπιλεγμένες τιμές συγκεκριμένες για την εταιρεία. Όταν δεν έχει οριστεί ρητά καμία τιμή για μια δεδομένη εταιρεία, το πεδίο επιστρέφει στην προεπιλεγμένη τιμή που έχει οριστεί στο ίδιο το πεδίο. Αυτή η προεπιλογή μπορεί επίσης να οριστεί ανά εταιρεία μέσω του μοντέλου ir.property (Odoo 16 και νωρίτερα) ή απευθείας στο μοντέλο (Odoo 17+).
Αλληλεπίδραση με το ORM
Στο πλαίσιο του odoo orm, η πρόσβαση σε ένα πεδίο που εξαρτάται από την εταιρεία σέβεται πάντα την τρέχουσα εταιρεία στο περιβάλλον (self.env.company). Αυτό σημαίνει:
- Η ανάγνωση του πεδίου επιστρέφει την τιμή για την ενεργή εταιρεία
- Η εγγραφή στο πεδίο ενημερώνει μόνο την τιμή για την ενεργή εταιρεία
- Η αλλαγή του πλαισίου της εταιρείας (
record.with_company(company)) σας επιτρέπει να διαβάζετε ή να γράφετε τιμές για μια συγκεκριμένη εταιρεία.
Περιπτώσεις Χρήσης στην Επιχείρηση
Το πεδίο που εξαρτάται από την εταιρεία δεν είναι απλώς μια τεχνική περιέργεια. Λύνει πραγματικά, καθημερινά προβλήματα σε ρυθμίσεις πολλαπλών εταιρειών στο Odoo. Ακολουθούν πέντε κοινά σενάρια όπου πραγματικά κερδίζει τη θέση του.
1. Λογιστική: Λογαριασμοί Εσόδων και Εξόδων ανά Εταιρεία
Αυτό είναι το πιο κοινό παράδειγμα στο Odoo από το κουτί. Τα πεδία property_account_income_id και property_account_expense_id στα προϊόντα είναι εξαρτώμενα από την εταιρεία.
Στην πράξη: Η Εταιρεία Α πουλά το ίδιο προϊόν με την Εταιρεία Β, αλλά κάθε εταιρεία έχει διαφορετικό σχέδιο λογαριασμών. Αντί να διπλασιάσουν την εγγραφή του προϊόντος, κάθε εταιρεία απλά ρυθμίζει τις δικές της λογιστικές γραμμές. Το προϊόν είναι κοινό, η λογιστική λογική δεν είναι.
2. Πωλήσεις και CRM: Τιμοκατάλογοι ανά Εταιρεία
Σε μια ομάδα που διαχειρίζεται πολλές οντότητες πωλήσεων, κάθε εταιρεία μπορεί να χρησιμοποιεί διαφορετικές στρατηγικές τιμολόγησης. Με ένα πεδίο τιμοκαταλόγου που εξαρτάται από την εταιρεία, μια κοινή εγγραφή πελάτη μπορεί να φέρει διαφορετικούς προεπιλεγμένους τιμοκαταλόγους ανάλογα με την εταιρεία που επεξεργάζεται την πώληση.
Αυτό διατηρεί τα δεδομένα CRM κεντρικά ενώ επιτρέπει σε κάθε εταιρεία να εφαρμόσει τους δικούς της εμπορικούς κανόνες.
3. Αποθήκη: Μέθοδος Αξιολόγησης Αποθέματος ανά Εταιρεία
Ορισμένες ομάδες λειτουργούν αποθήκες σε πολλές νομικές οντότητες με διαφορετικές τοπικές ρυθμίσεις. Ένα προϊόν μπορεί να απαιτεί κοστολόγηση FIFO σε μία χώρα και μέση τιμή σε άλλη. Η χρήση πεδίων που εξαρτώνται από την εταιρεία στο προϊόν ή την κατηγορία αποφεύγει την επανάληψη ολόκληρου του καταλόγου προϊόντων.
4. Παραγωγή: Προεπιλεγμένος Προμηθευτής ανά Εταιρεία
Όταν ένα κοινό προϊόν αγοράζεται από διαφορετικούς προμηθευτές ανάλογα με την εταιρεία, ένα πεδίο many2one που εξαρτάται από την εταιρεία και δείχνει στο res.partner μπορεί να κρατήσει τον προτιμώμενο προμηθευτή ανά οντότητα. Κάθε εταιρεία βλέπει τον δικό της προτιμώμενο προμηθευτή χωρίς καμία σύγκρουση.
5. Προσαρμοσμένα Πεδία για Κανονιστικά Δεδομένα
Οι ομάδες που λειτουργούν σε πολλές χώρες συχνά χρειάζεται να αποθηκεύουν αναφορές συμμόρφωσης που είναι συγκεκριμένες για κάθε χώρα σε κοινά αρχεία. Για παράδειγμα, ένα προϊόν μπορεί να χρειάζεται διαφορετικό κωδικό HS ή ταξινόμηση φόρου ανά δικαιοδοσία. Ένα πεδίο εξαρτώμενο από την Εταιρεία είναι ένας καθαρός, χαμηλής επιβάρυνσης τρόπος για να το διαχειριστείτε αυτό χωρίς να δημιουργήσετε παραλλαγές μοντέλου.
Δημιουργία ή Προσαρμογή του Πεδίου
Υπάρχουν δύο κύριοι τρόποι για να δημιουργήσετε πεδία εξαρτώμενα από την εταιρεία στο Odoo: χρησιμοποιώντας το Odoo Studio ή γράφοντας απευθείας κώδικα Python.
Χρήση του Odoo Studio
Το Odoo Studio σας επιτρέπει να δημιουργείτε πεδία χωρίς κανέναν κώδικα. Ωστόσο, το Studio δεν εκθέτει έναν ειδικό διακόπτη για το company_dependent σε όλες τις εκδόσεις. Στο Odoo 16 και 17, η επιλογή είναι διαθέσιμη σε ορισμένους τύπους πεδίων κατά τη δημιουργία νέων πεδίων σε πρότυπα μοντέλων.
Εάν χρειάζεστε πλήρη έλεγχο πάνω σε αυτήν την ιδιότητα, η τεχνική ανάπτυξη είναι η πιο αξιόπιστη προσέγγιση. Το Studio είναι ένα καλό σημείο εκκίνησης για απλούστερες περιπτώσεις, αλλά έχει περιορισμούς όταν πρόκειται για προηγμένα σενάρια προσαρμογής του Odoo.
Τεχνική Προσέγγιση: Πεδία Python
Σε ένα προσαρμοσμένο module Odoo, η δήλωση ενός πεδίου εξαρτώμενου από την εταιρεία είναι απλή. Αυτό είναι το πρότυπο μοτίβο που χρησιμοποιείται στην ανάπτυξη πεδίων Python του Odoo:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_internal_ref = fields.Char(
string='Εσωτερική Αναφορά (ανά εταιρεία)',
company_dependent=True,
)
x_preferred_carrier_id = fields.Many2one(
comodel_name='res.partner',
string='Προτιμώμενος Μεταφορέας',
company_dependent=True,
)
Η προσθήκη company_dependent=True σε οποιαδήποτε δήλωση πεδίου είναι το μόνο που χρειάζεται. Το ORM αναλαμβάνει τα υπόλοιπα αυτόματα.
Ρύθμιση Προεπιλεγμένων Τιμών ανά Εταιρεία
Στο Odoo 16 και νωρίτερα, μπορείτε να ρυθμίσετε μια προεπιλεγμένη τιμή σε επίπεδο εταιρείας μέσω του μοντέλου ir.property. Αυτό είναι χρήσιμο όταν θέλετε μια λογική προεπιλεγμένη τιμή για όλα τα αρχεία σε μια εταιρεία, χωρίς να την ρυθμίζετε αρχείο προς αρχείο:
self.env['ir.property']._set_default(
'x_internal_ref',
'product.template',
'DEFAULT-VALUE',
company_id=self.env.company.id,
)
Στο Odoo 17+, η προεπιλεγμένη τιμή αποθηκεύεται απευθείας στο μοντέλο εγγραφής και είναι επίσης προσβάσιμη μέσω του ορισμού πεδίου.
Πεδία και Περιορισμοί του Odoo Studio
Όταν εργάζεστε με πεδία του Odoo Studio, να έχετε υπόψη ότι το x_ πρόθεμα είναι απαραίτητο για τα προσαρμοσμένα πεδία. Η συμπεριφορά που εξαρτάται από την εταιρεία μπορεί να μην είναι ορατή στη διεπαφή του Studio, αλλά μπορεί να ρυθμιστεί από το τεχνικό μενού κάτω από τις Ρυθμίσεις εάν είναι ενεργοποιημένη η λειτουργία προγραμματιστή.
Καλές Πρακτικές
Η εργασία με πεδία που εξαρτώνται από την εταιρεία είναι απλή μόλις γνωρίζετε τα μοτίβα. Ακολουθούν οι πρακτικές που θα σας εξοικονομήσουν χρόνο και θα σας αποτρέψουν από πονοκεφάλους.
1. Χρησιμοποιήστε το μόνο όταν οι τιμές διαφέρουν πραγματικά ανά εταιρεία
Τα πεδία που εξαρτώνται από την εταιρεία προσθέτουν πολυπλοκότητα. Εάν η τιμή είναι η ίδια σε όλες τις εταιρείες, χρησιμοποιήστε ένα κανονικό πεδίο. Διατηρήστε το company_dependent=True για πεδία όπου οι διαφορετικές εταιρείες χρειάζονται πραγματικά διαφορετικές τιμές σε κοινές εγγραφές.
2. Δοκιμάστε πάντα σε πολυεταιρικό περιβάλλον
Όταν κατασκευάζετε ή δοκιμάζετε δυνατότητες που περιλαμβάνουν πεδία που εξαρτώνται από την εταιρεία, δοκιμάστε πάντα με τουλάχιστον δύο ενεργές εταιρείες. Είναι εύκολο να χάσετε προβλήματα σε μια ρύθμιση μίας εταιρείας που θα εμφανιστούν αμέσως στην παραγωγή.
3. Χρησιμοποιήστε το with_company() για διασυνοριακές λειτουργίες
Εάν ο κώδικάς σας χρειάζεται να διαβάσει ή να γράψει τιμές πεδίου που εξαρτάται από την εταιρεία για μια εταιρεία διαφορετική από την τρέχουσα, χρησιμοποιήστε το record.with_company(target_company). Αποφύγετε την χειροκίνητη αλλαγή της εταιρείας περιβάλλοντος χωρίς να την αποκαταστήσετε.
4. Να είστε προσεκτικοί με τις εξαγωγές και τις εισαγωγές
Όταν εξάγετε αρχεία που περιέχουν πεδία εξαρτώμενα από την εταιρεία, οι εξαγόμενες τιμές αντικατοπτρίζουν την εταιρεία του χρήστη που πραγματοποιεί την εξαγωγή. Η εισαγωγή του ίδιου αρχείου σε διαφορετικό εταιρικό πλαίσιο θα ορίσει τις τιμές για αυτή την εταιρεία. Αυτό είναι συχνά η σωστή συμπεριφορά, αλλά να είστε σαφείς σχετικά με αυτό στις ροές εργασίας μετανάστευσης και εισαγωγής δεδομένων.
5. Τεκμηριώστε Ποια Πεδία Είναι Εξαρτώμενα από την Εταιρεία
Οι τελικοί χρήστες σπάνια γνωρίζουν ποια πεδία είναι εξαρτώμενα από την εταιρεία. Μια σύντομη σημείωση στην εσωτερική τεκμηρίωση Odoo ή στα υλικά εκπαίδευσης μπορεί να έχει μεγάλη σημασία. Αποτρέπει τη σύγχυση όταν ένας χρήστης αλλάζει εταιρείες και βλέπει διαφορετικές τιμές στην ίδια εγγραφή.
6. Προτιμήστε το Many2one Από το Char για Δομημένα Δεδομένα
Όταν η τιμή ανά εταιρεία είναι αναφορά σε άλλη εγγραφή (λογαριασμός, τιμοκατάλογος, συνεργάτης), χρησιμοποιήστε ένα πεδίο Many2one εξαρτώμενο από την εταιρεία αντί να αποθηκεύσετε ένα όνομα ως κείμενο. Αυτό διατηρεί το μοντέλο δεδομένων καθαρό και καθιστά την αναφορά πιο αξιόπιστη.
Κοινές Παγίδες
Ακόμα και οι έμπειροι προγραμματιστές Odoo αντιμετωπίζουν προβλήματα με τα πεδία που εξαρτώνται από την εταιρεία. Γνωρίζοντας τι να προσέξετε θα αποτρέψει την σπατάλη χρόνου αποσφαλμάτωσης.
Παγίδα 1: Ξεχνώντας το Εταιρικό Πλαίσιο σε Αυτοματοποιημένες Ενέργειες
Οι προγραμματισμένες ενέργειες και οι ενέργειες διακομιστή συχνά εκτελούνται σε ένα πλαίσιο όπου η εταιρεία είναι η πρώτη εταιρεία στη βάση δεδομένων, όχι απαραίτητα αυτή που περιμένετε. Εάν η αυτοματοποιημένη ενέργεια σας διαβάζει ή γράφει ένα πεδίο εξαρτώμενο από την εταιρεία, επαληθεύστε ρητά το εταιρικό πλαίσιο. Χρησιμοποιήστε with_company() για να είστε ασφαλείς.
Παγίδα 2: Υποθέτοντας ότι το Πεδίο Συμπεριφέρεται Σαν Υπολογισμένο Πεδίο
Τα πεδία που εξαρτώνται από την εταιρεία δεν είναι υπολογισμένα πεδία. Δεν έχουν μέθοδο compute. Η παραλλαγή ανά εταιρεία προέρχεται από την αποθήκευση, όχι από τον υπολογισμό. Η προσπάθεια προσθήκης compute= παράλληλα με company_dependent=True δεν θα λειτουργήσει όπως αναμένεται και μπορεί να προκαλέσει σφάλματα στο πλαίσιο Odoo.
Παγίδα 3: Αναζητώντας Διαμέσου Εταιρειών
Οι τυπικές αναζητήσεις ORM σε πεδία εξαρτώμενα από την εταιρεία επιστρέφουν μόνο αποτελέσματα που ταιριάζουν με το τρέχον εταιρικό πλαίσιο. Εάν χρειάζεται να αναζητήσετε σε όλες τις εταιρείες, πρέπει να κάνετε ερώτημα απευθείας στο ir.property (Odoo 16 και νωρίτερα) ή να χειριστείτε προσεκτικά τη στήλη jsonb (Odoo 17+). Αυτό είναι μια κοινή πηγή σύγχυσης στην αναφορά και την εργασία εξαγωγής δεδομένων.
Παγίδα 4: Μη Ρύθμιση Προεπιλογών για Όλες τις Εταιρείες
Όταν εισάγετε ένα πεδίο εξαρτώμενο από την εταιρεία σε ένα ζωντανό σύστημα, οι υπάρχουσες εγγραφές θα επιστρέφουν False ή None για οποιαδήποτε εταιρεία δεν έχει ρητά ορίσει μια τιμή. Εάν η επιχειρηματική σας λογική αναμένει μια προεπιλογή, ρυθμίστε την προληπτικά για όλες τις σχετικές εταιρείες χρησιμοποιώντας ένα σενάριο μετανάστευσης δεδομένων.
Παγίδα 5: Σύγχυση με τα Δικαιώματα Πρόσβασης
Τα πεδία εξαρτώμενα από την εταιρεία ελέγχουν ποια τιμή εμφανίζεται, όχι εάν ο χρήστης μπορεί να δει το πεδίο καθόλου. Εάν χρειάζεται να κρύψετε εντελώς ένα πεδίο από ορισμένες εταιρείες ή χρήστες, αυτό είναι έργο για κανόνες εγγραφής ή δικαιώματα πρόσβασης σε επίπεδο πεδίου, όχι company_dependent.
Συμπέρασμα
Το πεδίο εξαρτώμενο από την εταιρεία είναι μία από αυτές τις δυνατότητες στο Odoo που φαίνεται αόρατη μέχρι να την χρειαστείτε, και τότε γίνεται αναπόσπαστο κομμάτι. Είναι το κατάλληλο εργαλείο για οποιαδήποτε κατάσταση όπου η ίδια εγγραφή πρέπει να φέρει διαφορετικές τιμές ανά εταιρεία: ρυθμίσεις λογιστικής, κανόνες τιμολόγησης, κανονιστικές αναφορές ή οποιοδήποτε επιχειρηματικό χαρακτηριστικό που ποικίλλει ανά νομική οντότητα.
Η κατανόηση του πώς λειτουργεί σε επίπεδο ORM, ποια έκδοση του Odoo άλλαξε το μοντέλο αποθήκευσης και ποιες παγίδες να αποφύγετε θα σας εξοικονομήσει σημαντικό χρόνο σε έργα πολλαπλών εταιρειών. Είτε το συναντήσετε σε έναν τυπικό οδηγό προγραμματιστών Odoo είτε το ανακαλύψετε ενώ αποσφαλματώνετε ένα ζωντανό σύστημα, η γνώση αυτού του τύπου πεδίου είναι ένδειξη πραγματικής εμπειρίας στο Odoo.
Εάν χτίζετε πάνω στο πλαίσιο του Odoo και χρειάζεστε να διαχειριστείτε δεδομένα ανά εταιρεία καθαρά, company_dependent=True είναι η απάντηση που ψάχνατε.
Χρειάζεστε Βοήθεια με την Υλοποίηση του Odoo;
Στην Dasolo, βοηθάμε τις εταιρείες να εφαρμόσουν, να προσαρμόσουν και να βελτιστοποιήσουν το Odoo σε όλες τις κλίμακες και ρυθμίσεις, συμπεριλαμβανομένων των σύνθετων ρυθμίσεων πολλαπλών εταιρειών. Είτε χρειάζεστε ένα προσαρμοσμένο μοντέλο δεδομένων, μια στρατηγική πεδίων ή μια πλήρη ανάπτυξη του Odoo, η ομάδα μας διαθέτει την τεχνική και λειτουργική βάθος για να το πετύχει σωστά.
Εάν έχετε ερωτήσεις σχετικά με τα πεδία εξαρτώμενα από την εταιρεία ή οποιαδήποτε άλλη πτυχή της εφαρμογής σας στο Odoo, είμαστε εδώ για να βοηθήσουμε. Επικοινωνήστε μαζί μας και ας μιλήσουμε για αυτό που χτίζετε.