Introductie
In Odoo bepaalt een model hoe zakelijke informatie wordt georganiseerd en bewaard. Alles waarmee je in de praktijk werkt — van offertes en inkoopfacturen tot voorraad en producten — leeft binnen een modelstructuur in de database.
Voor zowel ontwikkelaars als functionele consultants is inzicht in Odoo-modellen onmisbaar. Modellen vormen de ruggengraat van de gegevensarchitectuur: ze definiëren velden, relaties en de basislogica. De meeste modellen volgen terugkerende patronen die je snel leert toepassen.
Dit artikel zoomt in op één van de kernmodellen: product.template. Of je nu maatwerk bouwt, koppelingen legt met externe systemen of je producten online publiceert, je komt vroeg of laat bij dit model terecht.
Wat is het product.template-model
Een product.template is een sjabloon voor een groep gelijkwaardige artikelen die enkel op een paar punten verschillen (bijv. maat of kleur). In plaats van voor elke variant een volledig productrecord aan te maken, bundelt het template de gemeenschappelijke eigenschappen en laat het varianten (product.product) dieper specificeren.
Het template-model wordt door verschillende bedrijfsapplicaties gebruikt: verkoop, inkoop, magazijn, e‑commerce en productie. Wanneer je een artikel aanmaakt in de catalogus, maak je in feite een product.template. Bestellingen kiezen vaak een specifieke variant die van dat template erft.
Het model zelf zit in de product-module; andere modules breiden het uit via Odoo-inheritance. Verkoop voegt prijs- en facturatievelden toe, inkoop behandelt leveranciersinformatie en magazijn voegt voorraadlogica toe. Elke module vult enkel aan wat nodig is zonder de kern opnieuw uit te vinden.
Het verschil tussen product.template en product.product is cruciaal: het template bevat gedeelde gegevens, terwijl product.product variantgebonden details bewaart — zoals barcode of SKU — die per combinatie kunnen verschillen.
Belangrijke velden in het model
Hieronder vind je de velden die het vaakst voorkomen en waarmee je het meeste gaat werken. Kennis van deze velden maakt productbeheer en integraties veel eenvoudiger.
1. name
Type: Char. De zichtbare productnaam die in lijsten, offertes en op de webshop verschijnt. Dit is het primaire herkenningspunt van het template.
2. create_date
Type: Datetime. Tijdstempel van creatie. Wordt automatisch gezet door Odoo en is handig voor rapportage en audits.
3. write_date
Type: Datetime. Laatste wijzigingsmoment. Ook automatisch beheerd; helpt te bepalen wanneer velden voor het laatst aangepast werden.
4. active
Type: Boolean. Zachte verwijdering: op False wordt het product gearchiveerd en standaard verborgen, zonder het record fysiek te verwijderen.
5. sequence
Type: Integer. Bepaalt de sorteerorde bij lijsten of dropdowns; lagere getallen verschijnen eerst.
6. type
Type: Selection. Geeft aan of het artikel een verbruikbaar goed, een dienst of een voorraadartikel is. Dit stuurt voorraad- en facturatiegedrag.
7. categ_id
Type: Many2one (product.category). Categorie waartoe het product behoort; dit beïnvloedt rapporten, standaardroutes en de manier waarop het in catalogi wordt georganiseerd.
8. list_price
Type: Float. Standaard verkoopprijs. Wordt gebruikt als beginwaarde in offertes en kan door prijslijsten of variantprijzen worden overschreven.
9. standard_price
Type: Float. Kostprijs voor voorraadwaardering en margeberekeningen. Heeft invloed op winstgevendheidsrapporten.
10. currency_id
Type: Many2one (res.currency). Munt waarin list_price en standard_price zijn uitgedrukt; meestal afgeleid van de bedrijfsinstelling.
11. uom_id
Type: Many2one (uom.uom). Eenheid voor verkoop (bijv. stuk, kg, liter). Dit bepaalt hoe hoeveelheden worden gepresenteerd.
12. uom_po_id
Type: Many2one (uom.uom). Eenheid voor aankopen; kan verschillen van verkoop‑UoM als er conversies nodig zijn.
13. default_code
Type: Char. Interne referentie of artikelnummer, handig voor koppelingen met externe systemen en voor voorraadbeheer — vaak gebruikt als SKU.
14. barcode
Type: Char. Barcode voor scannen in POS en magazijnprocessen. Meestal wordt de barcode op variantniveau (product.product) gezet.
15. description
Type: Char. Interne omschrijving, bedoeld voor medewerkers en interne notities over het product.
16. description_sale
Type: Text. Verkoopomschrijving die op offertes en facturen kan verschijnen; ondersteunt eenvoudige opmaak of HTML.
17. description_purchase
Type: Text. Omschrijving voor inkoopdocumenten en leverancierscommunicatie.
18. sale_ok
Type: Boolean. Geeft aan of het product verkocht mag worden. Staat dit uit, dan verschijnt het niet in verkoopforms.
19. purchase_ok
Type: Boolean. Geeft aan of het product aangeschaft kan worden. Staat dit uit, dan verdwijnt het uit inkoopschermen.
20. weight
Type: Float. Gewicht van het artikel — nuttig voor verzendkosten en logistiek; eenheid volgens bedrijfs-UoM.
21. volume
Type: Float. Volume voor opslagplanning en magazijncapaciteit.
22. product_variant_ids
Type: One2many (product.product). Lijst met varianten die van het template erven; elke variant bevat de specifieke combinaties.
23. product_variant_count
Type: Integer. Aantal varianten, berekend uit product_variant_ids; handig voor filters en overzichten.
24. image_1920
Type: Binary. Hoofdbeeld van het product. Odoo bewaart meerdere formaten voor gebruik in formulieren, rapporten en de webshop.
25. responsible_id
Type: Many2one (res.users). Verantwoordelijke gebruiker voor productbeheer en opvolgtaken.
26. company_id
Type: Many2one (res.company). Bij multi-company setups toont dit welke vennootschap het product beheert.
27. tax_ids
Type: Many2many (account.tax). Belastingregels voor verkoop; worden toegepast op offertes en facturen.
28. supplier_tax_id
Type: Many2many (account.tax). Belastingregels voor inkooptransacties en leveranciersfacturen.
29. attribute_line_ids
Type: One2many. Attribuutregels die bepalen welke eigenschappen (bijv. maat, kleur) varianten veroorzaken.
30. route_ids
Type: Many2many (stock.route). Logistieke routes die bepalen hoe een product door de keten beweegt (bijv. Koop, Maak op bestelling).
31. property_stock_production
Type: Many2one (stock.location). Productielocatie voor vervaardigde producten; inzetbaar bij voorraadartikelen met productieflow.
32. property_stock_inventory
Type: Many2one (stock.location). Locatie voor voorraadcorrecties en tellingen.
33. property_valuation
Type: Selection. Methode voor voorraadwaardering: automatisch of handmatig; dit bepaalt hoe kosten worden verwerkt.
34. property_cost_method
Type: Selection. Kostprijsmethode, bv. Standaard of FIFO; beïnvloedt berekening van voorraadwaarde.
35. property_account_income_id
Type: Many2one (account.account). Opbrengstenrekening voor verkooptransacties.
36. property_account_expense_id
Type: Many2one (account.account). Kostenrekening gebruikt bij ontvangst van leveranciersfacturen.
37. invoice_policy
Type: Selection. Facturatiebeleid: factureren op bestelling of bij levering — dit bepaalt het moment van inkomstenherkenning.
38. expense_policy
Type: Selection. Kostenbeleid: kosten boeken op bestelling of bij levering.
39. service_type
Type: Selection. Voor diensten: handmatig, timesheet of mijlpalen; bepaalt hoe ondersteuning en facturatie verlopen.
40. optional_product_ids
Type: Many2many (product.template). Optionele artikelen voor cross-sell/upsell die bij offertes kunnen worden voorgesteld.
Hoe dit model in bedrijfsprocessen wordt gebruikt
1. Verkoop en offertes
Bij het maken van offertes haalt de verkoper artikelen uit de productcatalogus. Het template levert de gemeenschappelijke informatie; als er attributen zijn, kiest men de specifieke variant voor de offertepositie.
2. Webshop
Op de website presenteer je het template als product in de catalogus. Klanten kiezen daar vaak een kleur/maatvariant; afbeeldingen en beschrijving komen uit het template.
3. Inkoop en leveranciers
Inkooporders en leveranciersfacturen refereren aan producten; het veld purchase_ok bepaalt of een artikel zichtbaar is in inkoopschermen. Supplier_tax_id en uom_po_id sturen verder het inkoopgedrag.
4. Magazijn en productie
Voorraadverplaatsingen en werkorders werken met varianten. Het template bepaalt routes, waarderingsmethode en kostberekening, maar voorraad wordt per variant bijgehouden.
5. Facturatie
Op facturen verschijnen productregels die teruggrijpen op templateinstellingen voor belastingen en grootboekrekeningen. De invoice_policy bepaalt het factuurmoment.
Hoe ontwikkelaars dit model uitbreiden
Ontwikkelaars breiden product.template uit met een paar vaste patronen. De ingebouwde modelinheritance van Odoo is daarbij het krachtigste middel.
Model‑inheritance
Door in je module _inherit = 'product.template' te gebruiken, voeg je velden en methodes toe of pas je bestaand gedrag aan zonder de originele code te wijzigen. Dat houdt je aanpassingen upgrade‑bestendig en beperkt risico op conflicten.
Velden toevoegen
Voeg nieuwe velden toe in je geërfd model met de juiste types (Char, Many2one, Boolean, Integer, Text, Selection). Denk bij multi‑company om company‑dependent instellingen waar relevant.
Python‑extensies
Overschrijf methodes zoals create, write of unlink om aangepaste logica te implementeren, en gebruik altijd super() om bestaande functionaliteit te behouden. Let extra op computed fields en hun afhankelijkheden.
Odoo Studio
Odoo Studio is ideaal voor snelle, niet‑technische aanpassingen en prototyping. Voor structurele maatwerkconfiguraties en onderhoud in live‑omgevingen blijft maatwerk via modules aan te raden.
Aanbevolen werkwijzen
- Plaats gedeelde informatie op het template en variant‑specifieke gegevens op product.product. Dat voorkomt duplicatie en maakt beheer overzichtelijk.
- Stel categ_id correct in om routing en rapportering soepel te laten verlopen; categorieën sturen veel standaardgedrag in Odoo.
- Gebruik default_code voor koppelingen met externe systemen en probeer unieke codes aan te houden om mappingproblemen te vermijden.
- Voor API‑koppelingen werk je via XML‑RPC of JSON‑RPC. product.template is volledig beschikbaar via de Odoo API — zorg dat je externe identifiers consequent en voorspelbaar mapt.
- Voor custom velden gebruik best een module‑prefix of het x_‑prefix om toekomstige botsingen met Odoo‑updates te voorkomen.
Veelvoorkomende fouten
- Het aanmaken van aparte templates voor kleine variaties is inefficient. Gebruik attribute_line_ids om varianten aan te maken wanneer alleen eigenschappen als maat of kleur verschillen.
- Verwar product.template niet met product.product: variant‑specifieke velden zoals barcode of SKU horen op product.product thuis.
- Vergeet niet sale_ok of purchase_ok in te stellen: staan ze uit, dan verschijnen producten niet in de betreffende schermen.
- Overschrijf core‑methodes nooit zonder super() aan te roepen; dat kan andere modules breken of updates bemoeilijken.
- Maak geen nieuwe verplichte velden zonder redelijke defaults: bestaande records zullen anders tijdens upgrades of moduleinstallatie falen.
Slotwoord
Het product.template‑model is het hart van productbeheer in Odoo. Het centraliseert artikeldefinities en gedeelde eigenschappen; met kennis van de belangrijkste velden en uitbreidingspatronen werk je veel efficiënter en betrouwbaarder.
Of je nu producten gaat modelleren als functioneel consultant of maatwerk bouwt als ontwikkelaar: een goede kennis van product.template voorkomt fouten en bespaart implementatietijd.
Aan de slag met Dasolo
Dasolo ondersteunt bedrijven bij het implementeren, aanpassen en optimaliseren van Odoo. We hebben ruime ervaring met API‑koppelingen en diepgaande kennis van de Odoo‑datamodellen, inclusief product.template.
Heb je hulp nodig bij implementatie, maatwerk of integraties binnen Odoo? Wij staan klaar om mee te denken en te realiseren. Plan een demo en bespreek je project met ons.