Inleiding
In Odoo definiëren modellen hoe gegevens zijn gestructureerd en opgeslagen in de database. Elk stuk bedrijfsgegevens waarmee je werkt, van verkooporders tot facturen tot producten, bevindt zich in een model.
Het begrijpen van Odoo-modellen is essentieel voor zowel ontwikkelaars als functionele consultants. Modellen zijn de basis van de Odoo-gegevensarchitectuur. Ze definiëren Odoo-velden, relaties en bedrijfslogica. Elk model in Odoo volgt dezelfde patronen.
Dit artikel richt zich op een van de belangrijkste modellen in Odoo: product.template. Of je nu aangepaste modules bouwt, externe systemen integreert of productcatalogi configureert, je zult met dit model werken.
Wat is het product.template Model
Het product.template-model vertegenwoordigt een groep vergelijkbare producten die alleen in een paar eigenschappen verschillen, zoals grootte of kleur. In plaats van aparte productrecords voor elke variant te creëren, worden producten georganiseerd in sjablonen met varianten.
Dit model in Odoo wordt gebruikt in Verkoop, Aankoop, Voorraad, E-commerce en Productie. Wanneer je een product in de catalogus aanmaakt, maak je een product.template-record aan. Wanneer je een klantenorder aanmaakt, selecteer je uit productvarianten die van het sjabloon erven.
Het model is gedefinieerd in de productmodule. Andere modules breiden het uit via Odoo-modelovererving. Verkoop voegt prijsstelling en facturering toe. Aankoop voegt leveranciersbeheer toe. Voorraad voegt voorraadtracking toe. Elke module voegt toe wat het nodig heeft zonder de kernstructuur te dupliceren.
Het begrijpen van het verschil tussen product.template en product.product is essentieel. Het sjabloon bevat gedeelde gegevens. De variant (product.product) bevat variant-specifieke gegevens zoals barcode en SKU.
Belangrijke Velden in het Model
Hier zijn de belangrijkste Odoo-velden in het product.template-model. Het begrijpen hiervan zal je helpen om effectief met producten te werken.
1. naam
Type: Char. Dit veld slaat de naam van het product op. Het wordt in veel Odoo-weergaven weergegeven en is de primaire identifier voor het producttemplate.
2. create_date
Type: Datetime. Slaat de datum en tijd op wanneer het record is aangemaakt. Automatisch beheerd door Odoo. Nuttig voor rapportage en auditing.
3. write_date
Type: Datetime. Slaat de datum en tijd van de laatste wijziging op. Ook automatisch beheerd. Helpt bij het bijhouden wanneer gegevens voor het laatst zijn bijgewerkt.
4. actief
Type: Boolean. Soft delete-vlag. Wanneer False, wordt het record gearchiveerd en verborgen in de standaardweergaven. Records worden niet fysiek verwijderd.
5. volgorde
Type: Integer. Weergavevolgorde voor sortering. Gebruikt in productlijsten en dropdowns. Lagere waarden verschijnen eerst.
6. type
Type: Selectie. Producttype: Verbruiksartikel, Dienst of Opslagproduct. Verbruiksartikelen worden niet in voorraad bijgehouden. Diensten hebben geen fysieke inventaris. Opslagproducten worden in de inventaris bijgehouden.
7. categ_id
Type: Many2one (product.category). De productcategorie. Bepaalt rapportage, standaardroutes en catalogusorganisatie. Categorieën kunnen hiërarchisch zijn.
8. lijstprijs
Type: Float. De verkoopprijs. Wordt als standaard gebruikt bij het aanmaken van offertes. Kan worden overschreven door prijslijsten of variant-specifieke prijzen.
9. standaardprijs
Type: Float. De kostprijs. Gebruikt voor margeberekeningen en voorraadwaardering. Beïnvloedt winstgevendheidsrapporten.
10. valuta_id
Type: Many2one (res.currency). De valuta voor list_price en standard_price. Gewoonlijk geërfd van het bedrijf.
11. uom_id
Type: Many2one (uom.uom). De eenheid van maat voor verkoop. Bepaalt hoe hoeveelheden worden uitgedrukt (bijv. Eenheden, Kg, Liters).
12. uom_po_id
Type: Many2one (uom.uom). De eenheid van maat voor aankopen. Kan verschillen van uom_id voor conversiescenario's.
13. default_code
Type: Char. Interne referentie of code. Nuttig voor mapping met externe systemen en aangepaste nummering. Vaak gebruikt als SKU.
14. barcode
Type: Char. Barcode voor scannen. Gebruikt in POS, magazijn en inventaris. Voor varianten is de barcode doorgaans op product.product.
15. description
Type: Char. Interne beschrijving. Alleen zichtbaar voor interne gebruikers. Gebruikt voor interne notities over het product.
16. description_sale
Type: Text. Verkoopbeschrijving. Weergegeven op offertes en facturen. Kan HTML bevatten voor opmaak.
17. beschrijving_aankoop
Type: Text. Aankoopbeschrijving. Weergegeven op inkooporders en leveranciersfacturen. Helpt kopers te communiceren met leveranciers.
18. verkoop_ok
Type: Boolean. Geeft aan of het product verkocht kan worden. Wanneer False, is het product verborgen in verkoop- en offerteformulieren.
19. aankoop_ok
Type: Boolean. Geeft aan of het product aangekocht kan worden. Wanneer False, is het product verborgen in inkoopformulieren.
20. gewicht
Type: Float. Productgewicht. Gebruikt voor verzendberekeningen en logistiek. Eenheid hangt af van de UoM-instellingen van het bedrijf.
21. volume
Type: Float. Productvolume. Gebruikt voor logistiek en planning van magazijncapaciteit.
22. product_variant_ids
Type: One2many (product.product). De lijst van productvarianten. Elke variant erft van de sjabloon.
23. product_variant_count
Type: Integer. Aantal varianten. Berekend op basis van product_variant_ids. Gebruikt voor weergave en filtering.
24. image_1920
Type: Binary. Productafbeelding. Odoo slaat meerdere formaten op. Gebruikt in formulieren, rapporten en op de website.
25. responsible_id
Type: Many2one (res.users). De verantwoordelijke gebruiker. Gebruikt voor productbeheer en toewijzing van activiteiten.
26. company_id
Type: Many2one (res.company). In multi-company opstellingen geeft dit aan tot welke Odoo onderneming het product behoort.
27. tax_ids
Type: Many2many (account.tax). Klantbelastingen voor verkopen. Toegepast op facturen en offertes.
28. supplier_tax_id
Type: Many2many (account.tax). Leveranciersbelastingen voor aankopen. Toegepast op leveranciersfacturen.
29. attribute_line_ids
Type: One2many. Productattributenlijnen voor varianten. Bepaalt welke attributen (bijv. Maat, Kleur) varianten creëren.
30. route_ids
Type: Many2many (stock.route). Voorraadroutes. Bepaalt hoe het product door de toeleveringsketen beweegt (bijv. Kopen, Op bestelling maken).
31. property_stock_production
Type: Many2one (stock.location). Productielocatie voor vervaardigde producten. Gebruikt wanneer het type Opslagbaar is en de route productie omvat.
32. property_stock_inventory
Type: Many2one (stock.location). Locatie voor voorraadcorrecties. Gebruikt voor voorraadtelling en correcties.
33. property_valuation
Type: Selection. Methode voor voorraadwaardering: Geautomatiseerd of Handmatig. Beïnvloedt hoe de kosten worden berekend.
34. property_cost_method
Type: Selectie. Kostprijs methode: Standaard of FIFO. Bepaalt hoe de waarde van de voorraad wordt berekend.
35. property_account_income_id
Type: Many2one (account.account). Inkomstenrekening voor verkopen. Gebruikt bij facturering.
36. property_account_expense_id
Type: Many2one (account.account). Kostenrekening voor aankopen. Gebruikt bij het ontvangen van leveranciersfacturen.
37. invoice_policy
Type: Selectie. Wanneer te factureren: Bestelhoeveelheden of Geleverde hoeveelheden. Beïnvloedt wanneer de opbrengsten worden erkend.
38. expense_policy
Type: Selectie. Wanneer te kosten: Besteld of Geleverd. Beïnvloedt wanneer de kosten worden erkend.
39. service_type
Type: Selectie. Voor serviceproducten: Handmatig, Urenstaat of Mijlpalen. Bepaalt hoe diensten worden gevolgd en gefactureerd.
40. optional_product_ids
Type: Many2many (product.template). Optionele producten voor upsell. Wordt weergegeven wanneer dit product aan een offerte wordt toegevoegd.
Hoe Dit Model Wordt Gebruikt in Bedrijfsworkflows
1. Verkoop en Offertes
Wanneer een verkoper een offerte aanmaakt, selecteert hij producten uit de catalogus. Het product.template-model biedt het basisproduct. Varianten worden gekozen wanneer het product attributen heeft (maat, kleur).
2. E-commerce
Op de website zien klanten producttemplates in de catalogus. Wanneer ze op een product klikken, kunnen ze kiezen uit varianten. De template bevat de gedeelde beschrijving en afbeeldingen.
3. Aankoop en Leveranciers
Inkooporders en leveranciersfacturen zijn gekoppeld aan product.template. Het veld purchase_ok controleert de zichtbaarheid. De supplier_tax_id en uom_po_id sturen het aankoopgedrag.
4. Voorraad en Productie
Voorraadbewegingen en productieorders verwijzen naar productvarianten. De template definieert routes, waardering en kostprijs methode. Voorraad wordt per variant gevolgd.
5. Facturering
Facturen en rekeningen verwijzen naar productlijnen. De template biedt belastingregels en boekhoudrekeningen. Het facturatiebeleid bepaalt wanneer de omzet wordt erkend.
Hoe Ontwikkelaars Dit Model Uitbreiden
Ontwikkelaars breiden product.template uit met verschillende patronen. Odoo-modelovererving is het belangrijkste mechanisme.
Model Overerving
Gebruik _inherit = 'product.template' om het model uit te breiden. Dit is Odoo modelovererving in actie. Voeg nieuwe Odoo-velden toe, overschrijf methoden of voeg beperkingen toe. Het geërfde model in Odoo houdt je wijzigingen in een aparte module voor gemakkelijke upgrades. Wanneer je een model in Odoo erft, breid je het uit zonder het origineel te wijzigen.
Velden Toevoegen
Definieer nieuwe Odoo-velden in je geërfde model. Gebruik het juiste veldtype: Char, Many2one, Boolean, Integer, Text, Selection. Overweeg bedrijfsspecifieke velden voor meerdere bedrijven.
Python Uitbreidingen
Overschrijf create, write of unlink om logica toe te voegen. Gebruik super() om het origineel aan te roepen. Wees voorzichtig met berekende velden en hun afhankelijkheden.
Odoo Studio
Odoo Studio laat je velden toevoegen zonder code. Goed voor snelle aanpassingen. Voor complexe logica of upgrades zijn aangepaste modules beter onderhoudbaar.
Beste Praktijken
- Gebruik de template-variant relatie correct. Plaats gedeelde gegevens op de template, variant-specifieke gegevens op product.product.
- Stel categ_id in voor juiste routing en rapportage. Categorieën bepalen het standaardgedrag.
- Gebruik default_code voor mapping met externe systemen. Houd het uniek waar mogelijk.
- Bij het bouwen van API-integraties, gebruik de XML-RPC of JSON-RPC API. Het product.template model is volledig blootgesteld als een API-model in Odoo. Map externe ID's zorgvuldig.
- Voor aangepaste velden, gebruik de
x_prefix of een moduleprefix om conflicten met toekomstige Odoo-versies te vermijden.
Veelvoorkomende Fouten
- Maak geen dubbele sjablonen aan in plaats van varianten te gebruiken. Gebruik attribute_line_ids voor producten die alleen in maat, kleur, enz. verschillen.
- Verwarring tussen product.template en product.product. Wanneer je variant-specifieke gegevens nodig hebt (barcode, SKU), gebruik dan product.product.
- Vergeten om sale_ok of purchase_ok in te stellen. Producten worden verborgen in formulieren wanneer deze False zijn.
- Kernmethoden overschrijven zonder super() aan te roepen. Dit kan andere modules of toekomstige upgrades breken.
- Vereiste aangepaste velden toevoegen zonder standaardwaarden. Bestaande records zullen falen bij validatie tijdens de upgrade.
Conclusie
Het product.template model is centraal in Odoo. Het slaat productdefinities en gedeelde attributen op. Begrijpen van de velden en hoe modules het uitbreiden zal je helpen Odoo effectief te configureren, aanpassen en integreren.
Of je nu een functionele consultant bent die productcatalogi in kaart brengt of een ontwikkelaar die aangepaste modules bouwt, een goed begrip van product.template zal tijd besparen en fouten voorkomen.
Aan de Slag met Dasolo
Dasolo helpt bedrijven bij het implementeren, aanpassen en optimaliseren van Odoo. We zijn gespecialiseerd in API-integraties en Odoo-ontwikkeling. Ons team heeft diepgaande ervaring met de Odoo-gegevensarchitectuur en modellen zoals product.template.
Als je hulp nodig hebt bij je Odoo-implementatie, aangepaste modules of integraties, zijn we hier om te helpen. Boek een demo om je project te bespreken.