Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions fleet_vehicle_assignation_log_datetime/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
======================================
Fleet Vehicle Assignation Log Datetime
======================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:db5d90474e51304940aeb5b0e2bb4d457e3fe871d38183de4db8de22dd0a46f8
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffleet-lightgray.png?logo=github
:target: https://github.com/OCA/fleet/tree/18.0/fleet_vehicle_assignation_log_datetime
:alt: OCA/fleet
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/fleet-18-0/fleet-18-0-fleet_vehicle_assignation_log_datetime
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/fleet&target_branch=18.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module extends the functionality of the fleet management by adding
a datetime field for driver history logs.

**Table of contents**

.. contents::
:local:

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/fleet/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/fleet/issues/new?body=module:%20fleet_vehicle_assignation_log_datetime%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Raimundo Pereira da Silva Junior

Contributors
------------

- Raimundo Pereira da Silva Junior raimundojunior.silva@gmail.com

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/fleet <https://github.com/OCA/fleet/tree/18.0/fleet_vehicle_assignation_log_datetime>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
4 changes: 4 additions & 0 deletions fleet_vehicle_assignation_log_datetime/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2025 Raimundo Pereira da Silva Junior, Odoo Community Association (OCA)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from . import models
19 changes: 19 additions & 0 deletions fleet_vehicle_assignation_log_datetime/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright 2025 Raimundo Pereira da Silva Junior, Odoo Community Association (OCA)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Fleet Vehicle Assignation Log Datetime",
"version": "18.0.1.0.0",
"category": "Fleet",
"summary": "Adds datetime precision to driver assignation logs.",
"author": "Raimundo Pereira da Silva Junior, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/fleet",
"license": "AGPL-3",
"depends": [
"fleet",
"fleet_vehicle_history_date_end",
],
"data": [
"views/fleet_vehicle_assignation_log_views.xml",
],
"installable": True,
}
5 changes: 5 additions & 0 deletions fleet_vehicle_assignation_log_datetime/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Copyright 2025 Raimundo Pereira da Silva Junior, Odoo Community Association (OCA)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from . import fleet_vehicle_assignation_log
from . import fleet_vehicle
57 changes: 57 additions & 0 deletions fleet_vehicle_assignation_log_datetime/models/fleet_vehicle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Copyright 2025 Raimundo Pereira da Silva Junior, Odoo Community Association (OCA)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class FleetVehicle(models.Model):
_inherit = "fleet.vehicle"

def write(self, vals):
"""
Overrides write to capture the precise time of a driver change.

1. Sets the new assignment's start time to the exact moment of the change.
2. Finds the previous assignment and sets its end time to match the new
start time.
"""
assignment_time = fields.Datetime.now()

previous_logs = {}
if "driver_id" in vals and vals.get("driver_id"):
for vehicle in self:
previous_log = self.env["fleet.vehicle.assignation.log"].search(
[
("vehicle_id", "=", vehicle.id),
("driver_id", "=", vehicle.driver_id.id),
("date_end", "=", False),
],
order="date_start desc, id desc",
limit=1,
)
previous_logs[vehicle.id] = previous_log

res = super().write(vals)

if "driver_id" in vals and vals.get("driver_id"):
for vehicle in self:
new_log = self.env["fleet.vehicle.assignation.log"].search(
[
("vehicle_id", "=", vehicle.id),
("driver_id", "=", vals["driver_id"]),
("date_end", "=", False),
],
order="date_start desc, id desc",
limit=1,
)

if new_log:
# Update the new log with the precise start time.
new_log.datetime_start = assignment_time

# Update the previous log with the precise end time.
previous_log = previous_logs.get(vehicle.id)
if previous_log:
previous_log.datetime_end = assignment_time

return res
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Copyright 2025 Raimundo Pereira da Silva Junior, Odoo Community Association (OCA)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import api, fields, models


class FleetVehicleAssignationLog(models.Model):
# Inherit from mail.thread and mail.activity.mixin to enable tracking
_inherit = ["fleet.vehicle.assignation.log", "mail.thread", "mail.activity.mixin"]
_name = "fleet.vehicle.assignation.log" # Explicitly redeclare _name

datetime_start = fields.Datetime(
string="Start Datetime",
help="Precise start date and time of the driver assignment.",
required=True,
default=fields.Datetime.now,
tracking=True, # Tracking is now valid
)
datetime_end = fields.Datetime(
string="End Datetime",
help="Precise end date and time of the driver assignment.",
tracking=True, # Tracking is now valid
)

@api.model
def _synchronize_datetimes(self, vals):
"""
Helper method to synchronize date and datetime fields.
Ensures that if a date is provided without a datetime, the datetime
is populated accordingly. This is used in create() and write().
"""
# Synchronize start date
if vals.get("date_start") and not vals.get("datetime_start"):
vals["datetime_start"] = fields.Datetime.to_datetime(vals["date_start"])

# Synchronize end date
if vals.get("date_end") and not vals.get("datetime_end"):
date_end = fields.Date.to_date(vals["date_end"])
vals["datetime_end"] = fields.Datetime.to_datetime(date_end).replace(
hour=23, minute=59, second=59
)
return vals

@api.model_create_multi
def create(self, vals_list):
"""
On create, ensure datetimes are synchronized if only dates are provided.
"""
for vals in vals_list:
vals = self._synchronize_datetimes(vals)
return super().create(vals_list)

def write(self, vals):
"""
On write, ensure datetimes are synchronized. This is crucial for
compatibility with modules that set `date_end` programmatically.
"""
vals = self._synchronize_datetimes(vals)
return super().write(vals)

# --- Onchange methods are still useful for UI responsiveness ---

@api.onchange("datetime_start")
def _onchange_datetime_start(self):
"""Synchronizes the date field from the datetime field."""
if self.datetime_start:
self.date_start = self.datetime_start.date()
else:
self.date_start = False

@api.onchange("datetime_end")
def _onchange_datetime_end(self):
"""Synchronizes the date field from the datetime field."""
if self.datetime_end:
self.date_end = self.datetime_end.date()
else:
self.date_end = False

@api.onchange("date_start")
def _onchange_date_start(self):
"""Synchronizes the datetime field from the date field in the UI."""
if self.date_start and not self.datetime_start:
self.datetime_start = fields.Datetime.to_datetime(self.date_start)

@api.onchange("date_end")
def _onchange_date_end(self):
"""Synchronizes the datetime field from the date field in the UI."""
if self.date_end:
if not self.datetime_end or self.datetime_end.date() != self.date_end:
self.datetime_end = fields.Datetime.to_datetime(self.date_end).replace(
hour=23, minute=59, second=59
)
else:
self.datetime_end = False
3 changes: 3 additions & 0 deletions fleet_vehicle_assignation_log_datetime/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Raimundo Pereira da Silva Junior <raimundojunior.silva@gmail.com>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module extends the functionality of the fleet management by adding a datetime field for driver history logs.
Loading