Inleiding
Data en tijdstempels zijn ingebouwd in bijna elk bedrijfsproces. Wanneer is deze bestelling geplaatst? Wanneer is de levering gepland? Wanneer heeft de werknemer ingecheckt? In Odoo is het Datetime-veld de standaard manier om dit soort informatie vast te leggen en op te slaan.
In tegenstelling tot het Datum-veld, dat alleen een kalenderdatum opslaat, legt het Datetime-veld zowel de datum als de exacte tijd vast. Dit onderscheid is belangrijker dan het lijkt, vooral in omgevingen met gebruikers in meerdere tijdzones of wanneer evenementen op het uur- en minutenniveau worden gevolgd.
Deze gids behandelt alles wat je moet weten over het Datetime-veld in Odoo: wat het opslaat, hoe het zich gedraagt in het datamodel, hoe je het kunt maken en configureren met Odoo Studio of Python, en praktische voorbeelden uit echte bedrijfsworkflows.
Wat is het Datetime-veld in Odoo
In de Odoo ORM slaat fields.Datetime een gecombineerde datum- en tijdwaarde op, tot op de seconde nauwkeurig. Op het niveau van de database komt het overeen met een TIMESTAMP-kolom in PostgreSQL. Odoo slaat Datetime-waarden altijd intern op in UTC en converteert ze naar de lokale tijdzone van de actieve gebruiker wanneer ze in de interface worden weergegeven.
Vanuit het perspectief van de gebruiker verschijnt een Datetime-veld als een gecombineerde datum- en tijdkiezer in formulieren. Het toont een kalenderwidget naast een tijdinvoer. In lijstweergaven en rapporten wordt de waarde opgemaakt volgens de taal- en tijdzone-instellingen van de actieve gebruiker.
Hier is hoe een Datetime-veld eruitziet in een Python-modeldefinitie:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_confirmed_on = fields.Datetime(
string='Bevestigd Op',
default=fields.Datetime.now,
readonly=True,
copy=False,
)
De string parameter stelt het label in dat in de interface wordt weergegeven. De default parameter vult het veld automatisch met de huidige tijdstempel wanneer een nieuw record wordt aangemaakt. De readonly parameter voorkomt handmatige bewerking, wat gebruikelijk is voor audit-timestamps.
In Odoo Studio wordt dit veldtype een Datum & Tijd veld genoemd. Wanneer het via Studio wordt aangemaakt, krijgt het automatisch een x_studio_ prefix. Wanneer het via code of de XML-RPC API wordt aangemaakt, definieer je de technische naam zelf.
Hoe het veld werkt
Wanneer je een Datetime-veld in Odoo definieert, creëert het framework automatisch de bijbehorende databasekolom tijdens de installatie of upgrade van de module. Het is niet nodig om SQL-migraties met de hand te schrijven.
Een ding dat veel ontwikkelaars en zakelijke gebruikers verrast, is hoe Odoo omgaat met tijdzones. De database slaat de waarde altijd op in UTC. Wanneer een gebruiker in Parijs een vergadertijd op 15:00 uur instelt, slaat Odoo 13:00 uur UTC op in de database. Een gebruiker in New York die hetzelfde record leest, zal 9:00 uur in hun interface zien. De Odoo ORM handelt deze conversie transparant af op basis van de tijdzone die in elk gebruikersprofiel is geconfigureerd.
Belangrijke Veldattributen
Hier zijn de belangrijkste eigenschappen van een Datetime-veld in het Odoo-framework:
- default: Vaak ingesteld op
fields.Datetime.nowom automatisch in te vullen met de huidige UTC-tijdstempel wanneer een record wordt aangemaakt. - required: Maakt het veld verplicht in formulieren en op modelniveau.
- readonly: Voorkomt handmatige bewerking in de interface. Gebruikelijk voor automatisch gegenereerde tijdstempels.
- compute: Koppelt een Python-methode die de veldwaarde dynamisch berekent op basis van andere velden of bedrijfslogica.
- store: Wanneer gecombineerd met
compute, slaat de berekende waarde op in de database voor gebruik in zoekopdrachten en rapporten. - copy: Beheert of de waarde wordt gedupliceerd bij het kopiëren van een record. Standaard is dit
True. Stel in opFalsevoor tijdstempels die niet moeten worden overgedragen naar duplicaten. - index: Creëert een database-index. Nuttig voor velden die vaak worden gebruikt in filters, zoals geplande datums op grote tabellen.
Hoe het verschijnt in weergaven
In formulierweergaven wordt een Datetime-veld weergegeven als een gecombineerde datum- en tijdkiezer. Gebruikers klikken om een kalender te openen en stellen de tijd direct in hetzelfde invoerveld in. In lijstweergaven verschijnt de waarde als een geformatteerde tekenreeks op basis van de taalinstellingen van de gebruiker. In zoekweergaven ondersteunen Datetime-velden datumbereikfilters zoals voor, na en tussen een specifieke periode.
Je kunt ook een Datetime-veld combineren met de date_range widget om een bereikselectie direct in het formulier weer te geven, wat nuttig is voor het plannen van tijdsvensters en tijdgebonden taken.
Datetime vs Datum: De juiste veldkeuze maken
Een veelgestelde vraag in Odoo-ontwikkeling is wanneer fields.Datetime te gebruiken versus fields.Date. De regel is eenvoudig: gebruik fields.Date wanneer het tijdstip van de dag irrelevant is, en fields.Datetime wanneer je precisie op het uur- of minuteniveau nodig hebt.
Gebruik Datum voor: factuurvervaldata, verjaardagen, productvervaldata, contractverlengingsdata.
Gebruik Datetime voor: tijdstempels van orderbevestigingen, starttijden van vergaderingen, aanwezigheidsregistraties van werknemers, geplande magazijnoperaties.
Onnodig gebruik van Datetime voegt complexiteit van tijdzones toe zonder enige echte voordelen. Als je twijfelt, vraag je dan af of het tijdstip van de dag werkelijk van belang is voor het bedrijfsproces dat je modelleert.
Zakelijke gebruikscases
Het Datetime-veld komt in bijna elk module van Odoo voor. Hier zijn vijf praktische voorbeelden uit echte bedrijfsworkflows.
CRM: Activiteitenregistratie van Leads
In de CRM-module volgen verschillende native Datetime-velden wanneer belangrijke gebeurtenissen hebben plaatsgevonden. Het date_open veld registreert wanneer een lead op In Behandeling is gezet. Het date_deadline veld plant een follow-up. Verkoopmanagers gebruiken deze velden om responstijden te meten, verouderde kansen te identificeren en rapportages over teamactiviteit te maken. Aangepaste Datetime-velden kunnen dit verder uitbreiden, bijvoorbeeld om te registreren wanneer een offerte is verzonden of wanneer een specifieke oproep heeft plaatsgevonden.
Verkoop: Tijdstempels voor Orderbevestiging
Het date_order veld op sale.order is een Datetime-veld. Het legt het exacte moment vast waarop een verkoop werd bevestigd. Dit is waardevol voor rapportage over dagelijkse of uurlijkse verkoopactiviteit, het berekenen van hoe lang het duurt voordat bestellingen worden verwerkt, en het auditen van wijzigingen die na bevestiging zijn aangebracht. Het filteren van verkooporders op dit veld is een van de meest voorkomende rapportageoperaties in elke Odoo-verkoopopstelling.
Voorraad: Geplande Transferdata
Het scheduled_date veld op stock.picking is een Datetime-veld dat magazijnteams gebruiken om te plannen wanneer een ontvangst of verzending moet plaatsvinden. Geautomatiseerde acties in Odoo kunnen workflows activeren op basis van hoe deze datum zich verhoudt tot de huidige tijd. Bijvoorbeeld, een geautomatiseerde e-mail kan worden verzonden wanneer een levering langer dan een bepaald aantal uren te laat is, waardoor proactieve communicatie met klanten mogelijk is voordat zij contact opnemen.
Productie: Start- en Eindtijden van Productie
Productieorders gebruiken Datetime-velden om vast te leggen wanneer de productie is gestart en wanneer deze is voltooid. Deze gegevens voeden direct de capaciteitsplanning, efficiëntierapportage en prestatieanalyse. Voor bedrijven die meerdere ploegen draaien, is het vastleggen van de exacte tijd essentieel om het werkelijke versus geplande productie-output te begrijpen en knelpunten te identificeren op basis van tijd van de dag of per operator.
HR: Aanwezigheids- en Verlofbeheer
De HR Aanwezigheidsmodule gebruikt Datetime-velden om de in- en uitchecktijden van werknemers vast te leggen. Verlofaanvragen zijn afhankelijk van Datetime om het exacte begin en einde van een afwezigheid te definiëren. Loonberekeningen en overurenregels zijn vaak afhankelijk van deze waarden die tot op de minuut nauwkeurig moeten zijn. Elke afwijking of ontbrekende tijdstempel in aanwezigheidsregistraties kan de berekeningen van vergoedingen rechtstreeks beïnvloeden, waardoor precisie hier een echte zakelijke vereiste is in plaats van een technische voorkeur.
Een Datetime-veld maken of aanpassen
Er zijn drie hoofdmanieren om een Datetime-veld aan een Odoo-model toe te voegen, afhankelijk van uw technische opzet en of u de voorkeur geeft aan een no-code of ontwikkelaarsbenadering.
Odoo Studio (Geen Code) gebruiken
Odoo Studio is de ingebouwde aanpassingstool waarmee je velden kunt toevoegen zonder enige code te schrijven. Om een Datetime-veld toe te voegen via Studio:
- Open Odoo Studio vanuit het hoofdmenu.
- Navigeer naar het formulier waar je het veld wilt toevoegen.
- Sleep een Datum & Tijd veld vanuit de zijbalk naar het formulier.
- Stel het label, de vereiste status en optioneel een standaardwaarde in het veld eigenschappenpaneel in.
- Sla op en sluit Studio.
Studio maakt automatisch het veld aan met een x_studio_ prefix en voegt het toe aan de formulierweergave. Er is geen database-migratie aan jouw kant nodig. Odoo regelt dat allemaal automatisch wanneer je opslaat. Dit is de aanbevolen aanpak voor zakelijke gebruikers die een tijdstempel aan een bestaand formulier willen toevoegen zonder betrokkenheid van een ontwikkelaar.
Python gebruiken in een Aangepaste Module
Voor ontwikkelaars die Odoo-modules bouwen, worden Datetime-velden gedefinieerd in Python-modelbestanden. Dit is de aanbevolen aanpak voor elke aanpassing die versiebeheer nodig heeft en over meerdere omgevingen moet worden uitgerold:
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_last_contact_date = fields.Datetime(
string='Laatste Contactdatum',
default=fields.Datetime.now,
copy=False,
)
Nadat je het veld in het model hebt gedefinieerd, voeg je het toe aan het relevante weergave-XML-bestand zodat het in de interface verschijnt. Odoo maakt automatisch de TIMESTAMP kolom aan wanneer je de module installeert of bijwerkt. Er is geen handmatige SQL nodig.
Gebruik van de XML-RPC API
Als je Odoo-aanpassingen programmatisch beheert, bijvoorbeeld als onderdeel van een implementatiepipeline of een extern configuratiescript, kun je Datetime-velden aanmaken via de XML-RPC API:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_last_contact_date',
'field_description': 'Laatste Contactdatum',
'model_id': model_id,
'ttype': 'datetime',
'state': 'manual',
}]
)
De ttype: datetime waarde vertelt Odoo om een Datetime-veld aan te maken. De state: manual waarde geeft aan dat dit veld is aangemaakt buiten een module-installatie, wat de juiste instelling is voor velden die zijn aangemaakt via Studio of de API. Dit is hoe Dasolo het aanmaken van velden op afstand beheert voor klanten als onderdeel van geautomatiseerde configuratiescripts.
Beste praktijken
1. Gebruik fields.Datetime.now als een functie referentie, niet als een aanroep
Bij het instellen van een standaard, schrijf default=fields.Datetime.now zonder haakjes. Als je haakjes toevoegt, evalueert Python de functie eenmaal wanneer de klasse wordt geladen, en elk record dat wordt aangemaakt voor de levensduur van het Odoo-proces zal dezelfde bevroren tijdstempel delen. Zonder haakjes roept Odoo de functie aan op het moment van recordcreatie, waardoor elk record zijn eigen nauwkeurige tijdstempel krijgt.
2. Stel copy=False in op evenementtijdstempels
Als een veld registreert wanneer iets is gebeurd, zoals een bevestigingsdatum of een voltooiingstijdstempel, stel dan copy=False in. Wanneer gebruikers een record dupliceren, moeten deze tijdstempels niet worden overgenomen van het origineel. Een gedupliceerde verkooporder mag de bevestigingsdatum van de order waaruit het is gekopieerd niet tonen. Zonder deze instelling wordt historische data stilletjes onbetrouwbaar.
3. Geef altijd UTC door bij het schrijven via de API
Bij het aanmaken of bijwerken van records via de XML-RPC API, geef altijd Datetime-waarden door in UTC met behulp van het YYYY-MM-DD HH:MM:SS tekenreeksformaat. De API voert geen tijdzoneconversie uit bij schrijven. Welke tekenreeks je ook doorgeeft, deze wordt rechtstreeks in de database opgeslagen alsof het UTC is, dus het doorgeven van een lokale tijd zal stilletjes een offsetfout creëren die later moeilijk te diagnosticeren is.
4. Gebruik readonly voor automatisch gegenereerde tijdstempels
Velden die registreren wanneer iets is gebeurd, moeten over het algemeen als readonly in de interface worden ingesteld. Dit voorkomt dat gebruikers tijdstempels handmatig aanpassen die de werkelijke systeemgebeurtenissen zouden moeten weerspiegelen. Als er een legitieme reden is om bewerken toe te staan, controleer dan de toegang via Odoo's beveiligingsinstellingen op veldniveau in plaats van het veld openlijk bewerkbaar te laten.
5. Kies Datum in plaats van Datumtijd wanneer tijd niet nodig is
Als een veld alleen een kalenderdatum hoeft bij te houden, zoals een leveringsdeadline, een vervaldatum of een factuurvervaldatum, gebruik dan fields.Date. Datumtijd voegt complexiteit voor tijdzonebeheer toe die geen doel dient wanneer het tijdcomponent altijd irrelevant is. Het eenvoudig houden van het veldtype zoals de gebruikszaak vereist, maakt het datamodel gemakkelijker te begrijpen en te onderhouden.
Veelvoorkomende valkuilen
Tijdzoneverwarring bij het lezen van ruwe waarden
Dit is de meest voorkomende bron van verwarring met Datumtijdvelden. Wanneer je een waarde rechtstreeks uit de database of via de API leest, zie je de UTC-waarde, niet de lokale tijd van de gebruiker. Veel ontwikkelaars bouwen rapporten of integraties op basis van ruwe API-uitvoer en eindigen met tijdstempels die één of meer uren afwijken. Pas altijd tijdzoneconversie toe aan de clientzijde bij het presenteren van API-resultaten aan eindgebruikers, en maak dit een expliciete stap in elke integratie die je bouwt.
Gelokaliseerde tijden schrijven via de API
Als je een Datumtijdwaarde die al in een lokale tijdzone is naar de Odoo API doorgeeft, zal de database deze opslaan alsof het UTC was. Een vergadering die om 15:00 uur Parijse tijd is ingesteld, geschreven als 2026-01-01 15:00:00 naar de API, zal worden weergegeven als 16:00 of 17:00 voor een gebruiker in Parijs, afhankelijk van de zomer- of wintertijd. Dit is een van die bugs die alleen in productie verschijnen wanneer echte gebruikers in echte tijdzones het systeem beginnen te gebruiken.
Gebruik default=fields.Datetime.now() met haakjes
Het toevoegen van haakjes aan de standaard is een subtiele maar ernstige fout. fields.Datetime.now() wordt eenmaal geëvalueerd wanneer de Python-klasse wordt geladen. Elk record dat gedurende de hele levensduur van het Odoo-werkproces wordt aangemaakt, zal diezelfde bevroren tijdstempel delen. De records zullen er aanvankelijk correct uitzien, maar breken elke analyse die op creatietijden is gebaseerd. Dit is een stille bug die lang kan duren om op te merken omdat tijdstempels lijken te bestaan, ze zijn gewoon allemaal identiek.
Vergeten copy=False op evenementtijdstempels
Zonder copy=False draagt een gedupliceerd record alle Datumtijdwaarden van het origineel over. Een orderbevestigingsdatum, een leadcreatietijd of een productiestarttijdstempel van het brondocument zal onveranderd op het nieuwe document verschijnen. Dit verontreinigt stilletjes historische rapporten en maakt auditsporen onbetrouwbaar. Het is een klein configuratiedetail dat een onevenredige impact heeft op de datakwaliteit.
Datumtijd gebruiken wanneer Datum voldoende is
Het kiezen van Datumtijd voor een veld zoals een factuurvervaldatum of een productvervaldatum voegt onnodige complexiteit toe. Gebruikers zien een tijdcomponent die ze niet nodig hebben, tijdzoneberekeningen worden bij elke weergave uitgevoerd zonder enig voordeel, en de interface wordt iets omslachtiger zonder reden. Het juiste veldtype is het eenvoudigste dat het zakelijke vereiste correct modelleert.
Conclusie
Het Datetime-veld is een van de meest nuttige veldtypes in Odoo wanneer precisie belangrijk is. Van het bijhouden wanneer een lead is geopend tot het registreren van productiestarttijden en werknemersaanwezigheid, het komt in bijna elk module van het systeem voor.
Het belangrijkste om te internaliseren is het UTC-opslagmodel. Alles wat in de database is opgeslagen, is in UTC. De interface behandelt automatisch de weergave van tijdzones voor gebruikers, maar externe lees- of schrijfoperaties via de API moeten hier expliciet rekening mee houden. De meeste bugs gerelateerd aan tijdzones in Odoo-integraties zijn terug te voeren op dit ene misverstand.
Daarbovenop zal het gebruik van de juiste standaard syntaxis, het instellen van copy=False waar nodig, en het kiezen van Datum boven Datetime wanneer tijd irrelevant is, uw datamodel schoon houden en uw rapporten betrouwbaar.
Bij Dasolo helpen we bedrijven met de implementatie, aanpassing en optimalisatie van Odoo in alle afdelingen. Of u nu hulp nodig heeft bij het ontwerpen van een solide datamodel, het toevoegen van aangepaste velden aan uw workflows, of het bouwen van een volledige Odoo-module vanaf nul, ons team staat klaar om te helpen. Neem contact met ons op en laten we praten over uw Odoo-project.