Introductie
In Odoo bepaalt een model hoe bedrijfsgegevens georganiseerd en bewaard worden. Alles wat met je dagelijkse handelsstroom te maken heeft — orders, voorraadbewegingen, artikelgegevens — leeft binnen een model dat de structuur en relaties voorschrijft.
Voor zowel consultants als ontwikkelaars is inzicht in modellen cruciaal. Modellen vormen de ruggengraat van de Odoo-gegevensarchitectuur: ze definiëren velden, onderlinge koppelingen en de bedrijfsregels die op die data werken.
In dit artikel zoomen we in op een van de kernmodellen: product.product. Of je nu een module schrijft, koppelt met externe systemen of je productcatalogus opbouwt, met dit model werk je vaak rechtstreeks.
Wat is het model product.product
Het product.product-model staat voor de concrete productvarianten in Odoo: de specifieke verkoop- en aankoopitems die op offertes, bestellingen en voorraadbewegingen verschijnen.
Dit model verschilt wezenlijk van product.template: de template bevat gemeenschappelijke eigenschappen van een productfamilie, terwijl product.product de afzonderlijke varianten voorstelt. Bij producten zonder varianten is er één variant per template; bij configureerbare items (bv. T-shirt met maat en kleur) genereert elk combinatie zijn eigen product.product-record.
Het model behoort tot de product-module en wordt door verkoop, aankoop, magazijn en webshop aangeroepen. Telkens je een regel toevoegt aan een offerte of goederen ontvangt, werk je met product.product-records.
product.product gebruikt delegatie-erfenis van product.template: veel velden staan op de template en worden door de variant gebruikt. Zo blijft gedeelde informatie centraal, terwijl varianten toch specifieke waarden kunnen overschrijven.
Belangrijkste velden in het model
Hieronder vind je de kerndimensies van het product.product-model. Wie deze velden kent, werkt efficiënter met varianten in Odoo.
1. name
Type: Char. De zichtbare naam van de variant, gebruikt in lijsten, formulieren en documenten. Bij eenvoudige producten stemt dit vaak overeen met de template-naam; bij varianten wordt het vaak aangevuld met attributen (bv. "T-shirt — Blauw / M").
2. product_tmpl_id
Type: Many2one (product.template). Verwijst naar de ouder-template. Dit is de basisrelatie: elke variant hoort bij precies één template en via deze koppeling worden gedeelde eigenschappen beheerd.
3. default_code
Type: Char. Interne referentie of SKU. Handig voor identificatie, barcodezoekopdrachten en externe koppelingen. Varianten kunnen elk hun eigen code hebben.
4. barcode
Type: Char. Barcode (EAN/UPC). Wordt gebruikt bij scannen in kassa en magazijn. Als ingesteld moet deze uniek zijn per product.
5. create_date
Type: Datetime. Aangemaaktatum van het record. Wordt automatisch beheerd en is nuttig voor rapportage en auditdoeleinden.
6. write_date
Type: Datetime. Tijdstip van de laatste wijziging. Ook automatisch bijgehouden; helpt je zien wanneer gegevens voor het laatst werden aangepast.
7. active
Type: Boolean. Soft-delete vlag. Staat op False betekent gearchiveerd en wordt standaard verborgen in overzichten, zodat historische data behouden blijft.
8. type
Type: Selection. Producttype: Consumable, Service of Storable Product. Bepaalt of voorraad wordt bijgehouden en welke workflows van toepassing zijn (bv. voorraadbeheer vs. dienstregistratie).
9. categ_id
Type: Many2one (product.category). Productcategorie; belangrijk voor rapportering, prijsregels en organisatie van het catalogusbestand. Categorieën kunnen hiërarchisch opgebouwd zijn.
10. list_price
Type: Float. Verkoopprijs die op offertes verschijnt en als standaard wordt voorgesteld bij orderregels. Pricelists en klantregels kunnen deze prijs overschrijven.
11. standard_price
Type: Float. Kostprijs van het product, gebruikt voor voorraadwaardering en margecalculaties. Wordt doorgaans bijgewerkt via aankopen of handmatige aanpassingen.
12. uom_id
Type: Many2one (uom.uom). Stuk- of verbruikseenheid voor verkoop en voorraad (stuks, kg, liter…). Dit bepaalt hoe hoeveelheden worden uitgedrukt.
13. uom_po_id
Type: Many2one (uom.uom). Aankoop-eenheid; kan verschillen van uom_id (bv. kopen per doos, verkopen per stuk). Odoo verzorgt automatische conversies tussen eenheden.
14. description_sale
Type: Html. Verkoopbeschrijving die op offertes, orders en facturen kan verschijnen. Ondersteunt opmaak en uitgebreide productinformatie.
15. description_purchase
Type: Html. Beschrijving voor aankopen en leverancierscommunicatie; verschijnt op bestellingen en leveranciersfacturen.
16. sale_ok
Type: Boolean. Aangeeft of een product verkocht mag worden. Staat dit uit, dan is het niet zichtbaar voor verkoopkanalen en webshop.
17. purchase_ok
Type: Boolean. Aangeeft of het product aangekocht kan worden. Staat dit uit, dan is het niet beschikbaar in aankoopflows.
18. image_1920
Type: Binary. Hoogwaardige productfoto. Odoo bewaard ook kleinere versies (image_512, image_256…) voor weergave in formulieren en op de webshop.
19. weight
Type: Float. Gewicht van het artikel; gebruikt bij verzendkostenberekening en logistiek. De eenheid volgt de bedrijfsconfiguratie.
20. volume
Type: Float. Volume van het artikel; relevant voor verzendtarieven en magazijncapaciteit, zeker bij volumetrische beperkingen.
21. company_id
Type: Many2one (res.company). Bij multi-company setups geeft dit aan welke vennootschap eigenaar is van het product; beïnvloedt zichtbaarheid en voorraadbeheer.
22. currency_id
Type: Many2one (res.currency). Valuta voor list_price en standard_price; meestal de valuta van het bedrijf, met pricelists die kunnen converteren naar klantvaluta’s.
23. qty_available
Type: Float. Huidige voorraad (on-hand). Berekenend veld op basis van quants; alleen-lezen en essentieel voor beschikbaarheidschecks van stoorbare producten.
24. virtual_available
Type: Float. Verwachte voorraad (on-hand + inkomend − uitgaand). Gebruikt bij replenishment en planning; ook dit is een berekend en alleen-lezen veld.
25. product_template_attribute_value_ids
Type: Many2many. Verwijst naar de attribuutwaarden die deze variant definiëren (bv. Kleur=Blauw, Maat=M). Belangrijk voor configuratie en filtermogelijkheden.
26. sequence
Type: Integer. Sorteervolgorde. Bepaalt hoe producten getoond worden in lijsten en configuratoren; lagere waarden komen eerst.
27. display_name
Type: Char. Berekende weergavenaam die naam en variantkenmerken combineert. Veel gebruikt in many2one-selecties en zoekresultaten; is alleen-lezen.
28. responsible_id
Type: Many2one (res.users). Verantwoordelijke medewerker voor een product; wordt gebruikt bij herbestellingen en interne toewijzingen. Optioneel.
Hoe bedrijven dit model gebruiken in hun processen
1. Verkoop en offertes
Bij het opstellen van een offerte kiest de verkoper een product.variant uit de catalogus. De verkoopprijs, verkoopomschrijving en verkoop-eenheid worden naar de offertelijn gekopieerd; pricelists kunnen de prijs aanpassen. Enkel producten met sale_ok=True zijn zichtbaar.
2. Aankoop en leveranciers
Bestellingen en leveranciersfacturen refereren varianten. De kostprijs kan via aankopen worden bijgewerkt. Alleen producten met purchase_ok=True verschijnen in aankoopflows; de uom_po_id bepaalt hoe je bestelt (bv. per doos).
3. Voorraad en magazijn
Magazijnbewegingen, pickings en quants werken met product.product. De velden qty_available en virtual_available sturen beschikbaarheidschecks. Enkel stoorbare producten worden gevolgd; bij scannen helpt het barcodeveld om snel een product te vinden.
4. E‑commerce en website
De webshop toont productvarianten als keuzemogelijkheden (maat, kleur). Afbeeldingen, beschrijvingen en prijzen komen uit het model; de sale_ok-vlag regelt zichtbaarheid in de shop.
5. MRP en productie
Stukslisten verwijzen naar product.product voor grondstoffen en eindproducten. Het type-veld bepaalt of iets gemaakt wordt (stoorbaar) of verbruikt. Voorraadniveaus sturen productieplanning en materiaalbehoefte.
Hoe ontwikkelaars het model uitbreiden
Ontwikkelaars breiden product.product uit met verschillende technieken; model-erfenis is daar de kern van.
Modelerfenis gebruiken
Door _inherit = 'product.product' te gebruiken breid je het model uit: voeg velden toe, overschrijf methoden of definieer constraints. Zo houd je uitbreidingen in aparte modules en eenvoudiger upgradability. Kies product.product voor variantgebonden velden; kies product.template wanneer het om gedeelde eigenschappen gaat.
Velden toevoegen
Definieer nieuwe velden in je geïnhereerde model met het juiste type (Char, Many2one, Boolean, Integer, Text, Selection…). Denk goed na of het veld bij de template hoort (gezamenlijk) of bij de variant (specifiek). Voor variant‑specifieke data zoals individuele SKU’s of barcode-overschrijvingen horen die op product.product thuis.
Python-uitbreidingen
Overschrijf create, write of unlink om businesslogica toe te voegen, en roep steeds super() aan. Let op afhankelijkheden van computed fields: product.product bevat veel berekende velden vanuit voorraad- en verkoopmodules, en foute implementatie kan onvoorziene bijwerkingen veroorzaken.
Odoo Studio
Odoo Studio laat je snel velden toevoegen zonder code — ideaal voor snelle aanpassingen. Voor complexere logica of duurzame uitbreidingen blijven maatwerkmodules aan te raden. Het product.product-model is bovendien volledig bereikbaar via XML‑RPC en JSON‑RPC voor externe integraties.
Aanbevelingen en goede gewoonten
- Gebruik default_code of barcode als sleutel voor externe koppelingen en zorg dat ze consistent en liefst uniek blijven.
- Stel het type correct in per artikel: consumable, storable of service beïnvloedt welke workflows en modules relevant zijn.
- Voor API-koppelingen gebruik je product.product voor orderregels en transactie‑data; product.template is geschikt voor catalogus‑ of familiesgewijze bewerkingen.
- Voor custom velden werk met een x_ of module‑prefix om conflicten met toekomstige Odoo-versies te vermijden.
- Plaats velden die voor alle varianten gelden (bv. merk, brede categorie) op product.template; variant‑specifieke eigenschappen horen op product.product.
Veelvoorkomende fouten
- Kies product.product wanneer je gedrag per variant nodig hebt; product.template is geschikt voor gedeelde logica en eigenschappen.
- Maak varianten niet handmatig aan zonder configurator: voor configureerbare producten is het aan te raden varianten via de productconfigurator/template aan te maken, zodat attributen en combinaties correct worden opgebouwd.
- Vergeet niet sale_ok of purchase_ok in te stellen — in sommige setups zijn producten standaard verborgen voor verkoop of aankoop.
- Overschrijf nooit kernmethodes zonder super() te gebruiken; dit veroorzaakt compatibiliteitsproblemen met andere modules en toekomstige upgrades.
- Gebruik niet altijd product.product in zoekfilters wanneer product.template logischer is (bv. filteren op categorie op template-niveau), want dit kan tot onverwachte resultaten leiden.
Slotwoord
Het product.product-model is een hoeksteen van Odoo’s productarchitectuur: het vertegenwoordigt de daadwerkelijk verkoopbare en aankoombare items. Begrijpen hoe dit model samenwerkt met product.template helpt je Odoo correct in te richten en te koppelen.
Of je nu catalogi in kaart brengt als consultant of maatwerk bouwt als ontwikkelaar: een grondige kennis van product.product spaart tijd en voorkomt veel voorkomende fouten.
Hulp nodig bij je Odoo-implementatie?
Dasolo ondersteunt bedrijven bij implementatie, maatwerk en optimalisatie van Odoo. We specialiseren ons in API-koppelingen en development en hebben uitgebreide ervaring met Odoo’s datamodel en modellen zoals product.product.
Heb je hulp nodig bij je Odoo-implementatie, maatwerkmodules of integraties? We helpen je graag verder. Plan een demo om je project te bespreken.