Introduktion
Datoer og tidsstempler er indbygget i næsten hver forretningsproces. Hvornår blev denne ordre afgivet? Hvornår er leveringen planlagt? Hvornår tjekkede medarbejderen ind? I Odoo er Datetime-feltet den standard måde at indfange og gemme denne slags information på.
I modsætning til Date-feltet, som kun gemmer en kalenderdato, fanger Datetime-feltet både datoen og det præcise tidspunkt. Denne forskel betyder mere, end det måske ser ud til, især i miljøer med brugere på tværs af flere tidszoner eller når man sporer begivenheder på time- og minutniveau.
Denne guide dækker alt, hvad du behøver at vide om Datetime-feltet i Odoo: hvad det gemmer, hvordan det opfører sig i datamodellen, hvordan man opretter og konfigurerer det ved hjælp af Odoo Studio eller Python, og praktiske eksempler fra virkelige forretningsarbejdsgange.
Hvad er Datetime-feltet i Odoo
I Odoo ORM gemmer fields.Datetime en kombineret dato- og tidsværdi, ned til sekundet. På databaseniveau kortlægges det til en TIMESTAMP kolonne i PostgreSQL. Odoo gemmer altid Datetime-værdier internt i UTC og konverterer dem til den aktive brugers lokale tidszone, når de vises i grænsefladen.
Fra brugerens perspektiv vises et Datetime-felt som en kombineret dato- og tidsvælger i formularer. Det viser et kalenderwidget ved siden af et tidsinput. I listevisninger og rapporter formateres værdien i henhold til den aktive brugers sprog- og tidszoneindstillinger.
Her er hvordan et Datetime-felt ser ud i en Python-modeldefinition:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_confirmed_on = fields.Datetime(
string='Bekræftet den',
default=fields.Datetime.now,
readonly=True,
copy=False,
)
Parameteren string sætter etiketten, der vises i grænsefladen. Parameteren default udfylder automatisk feltet med det aktuelle tidsstempel, når en ny post oprettes. Parameteren readonly forhindrer manuel redigering, hvilket er almindeligt for revisions-tidsstempler.
I Odoo Studio kaldes denne felttype et Dato & Tid felt. Når det oprettes gennem Studio, får det automatisk et x_studio_ præfiks. Når det oprettes via kode eller XML-RPC API, definerer du selv det tekniske navn.
Hvordan feltet fungerer
Når du definerer et Datetime-felt i Odoo, opretter rammeværket automatisk den tilsvarende databasekolonne under modulinstallation eller opgradering. Der er ikke behov for at skrive SQL-migrationer i hånden.
En ting, der overrasker mange udviklere og forretningsbrugere, er, hvordan Odoo håndterer tidszoner. Databasen gemmer altid værdien i UTC. Når en bruger i Paris sætter et mødetidspunkt til kl. 15:00, gemmer Odoo kl. 13:00 UTC i databasen. En bruger i New York, der læser den samme post, vil se kl. 09:00 i deres grænseflade. Odoo ORM håndterer denne konvertering gennemsigtigt baseret på den tidszone, der er konfigureret i hver brugers profil.
Nøglefeltattributter
Her er de vigtigste egenskaber ved et Datetime-felt i Odoo-rammeværket:
- default: Ofte sat til
fields.Datetime.nowfor automatisk at udfylde med det aktuelle UTC-tidsstempel, når en post oprettes. - required: Gør feltet obligatorisk i formularer og på modelniveau.
- readonly: Forhindrer manuel redigering i grænsefladen. Almindeligt for automatisk genererede tidsstempler.
- compute: Linker en Python-metode, der dynamisk beregner feltværdien fra andre felter eller forretningslogik.
- store: Når den kombineres med
compute, gemmer den den beregnede værdi i databasen til brug i søgninger og rapporter. - copy: Kontrollerer, om værdien duplikeres, når en post kopieres. Standard er
True. Sæt tilFalsefor tidsstempler, der ikke skal overføres til duplikater. - index: Opretter et databaseindeks. Nyttigt på felter, der ofte bruges i filtre, såsom planlagte datoer på store tabeller.
Hvordan det vises i visninger
I formularvisninger viser et Datetime-felt sig som en kombineret dato- og tidsvælger. Brugere klikker for at åbne en kalender og indstille tiden direkte i det samme input. I listevisninger vises værdien som en formateret streng baseret på brugerens sprogindstillinger. I søgevisninger understøtter Datetime-felter datointervalfiltre såsom før, efter og mellem en specifik periode.
Du kan også parre et Datetime-felt med date_range-widgeten for at vise et intervalvalg direkte i formularen, hvilket er nyttigt til planlægningsvinduer og tidsbundne opgaver.
Datetime vs Dato: Vælg det rigtige felt
Et almindeligt spørgsmål i Odoo-udvikling er, hvornår man skal bruge fields.Datetime versus fields.Date. Reglen er ligetil: brug fields.Date, når tid på dagen er irrelevant, og fields.Datetime, når du har brug for præcision på time- eller minutniveau.
Brug Date til: faktura forfaldsdatoer, fødselsdage, produktudløbsdatoer, kontraktfornyelsesdatoer.
Brug Datetime til: ordrebekræftelsestidsstempler, mødestarttidspunkter, medarbejdertilstedeværelsesregistre, planlagte lageroperationer.
At bruge Datetime unødvendigt tilføjer tidszonekompleksitet uden nogen reel fordel. Når du er i tvivl, spørg om tid på dagen virkelig betyder noget for den forretningsproces, du modellerer.
Forretningsanvendelser
Datetime-feltet vises i næsten hver modul i Odoo. Her er fem praktiske eksempler fra virkelige forretningsarbejdsgange.
CRM: Lead Aktivitetssporing
I CRM-modulet sporer flere indbyggede Datetime-felter, hvornår nøglebegivenheder fandt sted. Feltet date_open registrerer, hvornår et lead blev sat til I gang. Feltet date_deadline planlægger en opfølgning. Salgsledere bruger disse felter til at måle svartider, identificere stillestående muligheder og rapportere om teamaktivitet. Tilpassede Datetime-felter kan udvide dette yderligere, for eksempel til at logge, hvornår et tilbud blev sendt, eller hvornår et specifikt opkald fandt sted.
Salg: Ordrebekræftelsestidsstempler
Feltet date_order på sale.order er et Datetime-felt. Det fanger det præcise øjeblik, hvor et salg blev bekræftet. Dette er værdifuldt for rapportering om daglig eller timebaseret salgsaktivitet, beregning af hvor lang tid ordrer tager at blive behandlet, og revision af ændringer foretaget efter bekræftelse. At filtrere salgsordrer efter dette felt er en af de mest almindelige rapporteringsoperationer i enhver Odoo-salgsopsætning.
Lager: Planlagte Overførselsdatoer
Feltet scheduled_date på stock.picking er et Datetime-felt, som lagerteam bruger til at planlægge, hvornår en modtagelse eller forsendelse skal finde sted. Automatiserede handlinger i Odoo kan udløse arbejdsgange baseret på, hvordan denne dato sammenlignes med den aktuelle tid. For eksempel kan en automatiseret e-mail sendes, når en levering har været forsinket i et bestemt antal timer, hvilket muliggør proaktiv kommunikation med kunderne, før de kontakter os.
Produktion: Produktionsstart- og sluttider
Produktionordrer bruger Datetime-felter til at registrere, hvornår produktionen startede, og hvornår den blev afsluttet. Disse data føder direkte ind i kapacitetsplanlægning, effektivitetsrapportering og performanceanalyse. For virksomheder, der kører flere skift, er det afgørende at fange det præcise tidspunkt for at forstå faktisk versus planlagt produktionsoutput og identificere flaskehalse efter tid på dagen eller efter operatør.
HR: Deltagelse og Fraværshåndtering
HR Deltagelsesmodulet bruger Datetime-felter til at registrere medarbejderes ind- og udtjekningstider. Fraværsanmodninger er afhængige af Datetime for at definere den præcise start og slut på et fravær. Lønberegninger og overarbejdsregler afhænger ofte af, at disse værdier er nøjagtige ned til minut. Enhver afvigelse eller manglende tidsstempel i deltagerregistrene kan direkte påvirke kompensationsberegninger, hvilket gør præcision her til et reelt forretningskrav snarere end en teknisk præference.
Oprettelse eller tilpasning af Datetime-feltet
Der er tre hovedmåder at tilføje et Datetime-felt til en Odoo-model, afhængigt af din tekniske opsætning og om du foretrækker en no-code eller udvikler tilgang.
Brug af Odoo Studio (Ingen kode)
Odoo Studio er det indbyggede tilpasningsværktøj, der lader dig tilføje felter uden at skrive nogen kode. For at tilføje et Datetime-felt gennem Studio:
- Åbn Odoo Studio fra hovedmenuen.
- Naviger til den formular, hvor du vil tilføje feltet.
- Træk et Dato & Tid felt fra sidepanelet og ind på formularen.
- Indstil etiketten, kravstatus og eventuelt en standardværdi i feltets egenskabspanel.
- Gem og luk Studio.
Studio opretter automatisk feltet med et x_studio_ præfiks og tilføjer det til formularvisningen. Ingen database-migrering er nødvendig fra din side. Odoo håndterer alt dette automatisk, når du gemmer. Dette er den anbefalede tilgang for forretningsbrugere, der har brug for at tilføje et tidsstempel til en eksisterende formular uden udviklerinvolvering.
Brug af Python i et tilpasset modul
For udviklere, der bygger Odoo-moduler, defineres Datetime-felter i Python-modelfiler. Dette er den anbefalede tilgang til enhver tilpasning, der skal versionsstyres og implementeres på tværs af flere miljøer:
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_last_contact_date = fields.Datetime(
string='Sidste kontakt dato',
default=fields.Datetime.now,
copy=False,
)
Efter at have defineret feltet i modellen, skal du tilføje det til den relevante visnings-XML-fil, så det vises i grænsefladen. Odoo opretter automatisk TIMESTAMP kolonnen, når du installerer eller opgraderer modulet. Ingen manuel SQL er nødvendig.
Brug af XML-RPC API'en
Hvis du administrerer Odoo-tilpasninger programmatisk, for eksempel som en del af en implementeringspipeline eller et fjernkonfigurationsscript, kan du oprette Datetime-felter via XML-RPC API'en:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_last_contact_date',
'field_description': 'Sidste kontakt dato',
'model_id': model_id,
'ttype': 'datetime',
'state': 'manual',
}]
)
Værdien ttype: datetime fortæller Odoo at oprette et Datetime-felt. Værdien state: manual angiver, at dette felt blev oprettet uden for en modulinstallation, hvilket er den korrekte indstilling for felter oprettet gennem Studio eller API'en. Dette er, hvordan Dasolo håndterer fjernoprettelse af felter for kunder som en del af automatiserede konfigurationsscripts.
Bedste praksis
1. Brug fields.Datetime.now som en funktionsreference, ikke et kald
Når du indstiller en standard, skal du skrive default=fields.Datetime.now uden parenteser. Hvis du tilføjer parenteser, evaluerer Python funktionen én gang, når klassen indlæses, og hver post, der oprettes i Odoo-processens levetid, vil dele det samme fryse-tidsstempel. Uden parenteser kalder Odoo funktionen på tidspunktet for oprettelse af posten, hvilket giver hver post sit eget nøjagtige tidsstempel.
2. Sæt copy=False på begivenhedstidsstempler
Hvis et felt registrerer, hvornår noget skete, såsom en bekræftelsesdato eller et færdiggørelsestidsstempel, skal du sætte copy=False. Når brugere duplikerer en post, bør disse tidsstempler ikke overføres fra den originale. En duplikeret salgsordre bør ikke vise bekræftelsesdatoen for den ordre, den blev kopieret fra. Uden denne indstilling bliver historiske data stille og roligt upålidelige.
3. Giv altid UTC, når du skriver via API'en
Når du opretter eller opdaterer poster gennem XML-RPC API'en, skal du altid give Datetime-værdier i UTC ved hjælp af YYYY-MM-DD HH:MM:SS strengformatet. API'en udfører ikke tidszonekonvertering ved skrivning. Uanset hvilken streng du sender, gemmes den direkte i databasen, som om den var UTC, så at sende en lokal tid vil stille og roligt skabe en offset-fejl, der er svær at diagnosticere senere.
4. Brug readonly for automatisk genererede tidsstempler
Felter, der registrerer, hvornår noget skete, bør generelt indstilles som readonly i grænsefladen. Dette forhindrer brugere i manuelt at justere tidsstempler, der bør afspejle faktiske systembegivenheder. Hvis der er en legitim grund til at tillade redigering, skal adgangen kontrolleres gennem Odoos felt-niveau sikkerhedsindstillinger i stedet for at lade feltet være åbent redigerbart.
5. Vælg Date i stedet for Datetime, når tid ikke er nødvendig
Hvis et felt kun skal spore en kalenderdato, såsom en leveringsfrist, en fornyelsesdato eller en faktura forfaldsdato, skal du bruge fields.Date. Datetime tilføjer kompleksitet med håndtering af tidszoner, som ikke tjener noget formål, når tidskomponenten altid er irrelevant. At holde felttypen så simpel som brugsscenariet kræver, gør datamodellen lettere at forstå og vedligeholde.
Almindelige faldgruber
Tidszoneforvirring ved læsning af rå værdier
Dette er den mest hyppige kilde til forvirring med Datetime-felter. Når du læser en værdi direkte fra databasen eller gennem API'en, ser du UTC-værdien, ikke brugerens lokale tid. Mange udviklere bygger rapporter eller integrationer baseret på rå API-output og ender med tidsstempler, der er forkert med en eller flere timer. Anvend altid tidszonekonvertering på klientsiden, når du præsenterer API-resultater for slutbrugere, og gør dette til et eksplicit skridt i enhver integration, du bygger.
Skrive lokaliserede tider via API'en
Hvis du sender en Datetime-værdi, der allerede er i en lokal tidszone til Odoo API'en, vil databasen gemme den, som om den var UTC. Et møde sat til kl. 15:00 Paris-tid, skrevet som 2026-01-01 15:00:00 til API'en, vil blive vist som 16:00 eller 17:00 for en bruger i Paris, afhængigt af sommer- eller vintertid. Dette er en af de fejl, der kun optræder i produktion, når rigtige brugere i rigtige tidszoner begynder at bruge systemet.
Brug af default=fields.Datetime.now() med parenteser
At tilføje parenteser til standarden er en subtil, men alvorlig fejl. fields.Datetime.now() evalueres én gang, når Python-klassen indlæses. Hver post, der oprettes i hele Odoo-arbejderprocessens levetid, vil dele det samme frosne tidsstempel. Posterne vil se korrekte ud i starten, men bryde enhver analyse baseret på oprettelsestider. Dette er en stille fejl, der kan tage lang tid at opdage, fordi tidsstempler ser ud til at eksistere, de er bare alle identiske.
Glemme copy=False på begivenhedstidsstempler
Uden copy=False bærer en duplikeret post alle Datetime-værdier fra den oprindelige. En ordrebekræftelsesdato, et lead-oprettelsestidspunkt eller et produktionsstarttidsstempel fra kilderecordet vil fremstå uændret på den nye. Dette forurener stille historiske rapporter og gør revisionsspor usikre. Det er en lille konfigurationsdetalje, der har en uforholdsmæssig indvirkning på datakvaliteten.
Brug af Datetime, når Date er tilstrækkelig
At vælge Datetime til et felt som en faktura forfaldsdato eller en produktudløbsdato tilføjer unødvendig kompleksitet. Brugerne ser en tidskomponent, de ikke har brug for, tidszoneberegninger kører ved hver visning uden nogen fordel, og grænsefladen bliver lidt mere besværlig uden grund. Den rigtige felttype er den simpleste, der korrekt modellerer forretningskravet.
Konklusion
Datetime-feltet er en af de mest nyttige felttyper i Odoo, når præcision betyder noget. Fra at spore hvornår en lead blev åbnet til at registrere produktionsstarttider og medarbejderes tilstedeværelse, findes det i næsten hver modul i systemet.
Den vigtigste ting at internalisere er UTC-lagringsmodellen. Alt, der er gemt i databasen, er i UTC. Grænsefladen håndterer automatisk tidszonevisning for brugerne, men enhver ekstern læsning eller skrivning gennem API'en skal tage højde for dette eksplicit. De fleste tidszone-relaterede fejl i Odoo-integrationer kan spores tilbage til denne ene misforståelse.
Udover det vil brugen af den rigtige standard-syntaks, indstilling af copy=False hvor det er passende, og valg af Dato frem for Datetime, når tid er irrelevant, holde din datamodel ren og dine rapporter pålidelige.
Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo på tværs af alle afdelinger. Uanset om du har brug for hjælp til at designe en solid datamodel, tilføje brugerdefinerede felter til dine arbejdsprocesser, eller bygge et fuldt Odoo-modul fra bunden, er vores team klar til at hjælpe. Kontakt os og lad os tale om dit Odoo-projekt.