diff --git a/fleet_vehicle_service_calendar/README.rst b/fleet_vehicle_service_calendar/README.rst new file mode 100644 index 00000000..72e788f0 --- /dev/null +++ b/fleet_vehicle_service_calendar/README.rst @@ -0,0 +1,97 @@ +======================================== +Scheduling Meetings for Vehicle Services +======================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:b94dbac1c175caf077c1dffd73fc333e23f148a4cbd8502b89535ebd560791b2 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |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_service_calendar + :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_service_calendar + :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 adds the following features: + +- A smart button in form view of services to schedule meetings. +- Search events for specific services in calendar view. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub 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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Druidoo + +Contributors +------------ + +- `Druidoo `__: + + - Iván Todorovich + - Manuel Marquez + +- `Escodoo `__: + + - Marcel Savegnago + +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. + +.. |maintainer-mamcode| image:: https://github.com/mamcode.png?size=40px + :target: https://github.com/mamcode + :alt: mamcode +.. |maintainer-ivantodorovich| image:: https://github.com/ivantodorovich.png?size=40px + :target: https://github.com/ivantodorovich + :alt: ivantodorovich + +Current `maintainers `__: + +|maintainer-mamcode| |maintainer-ivantodorovich| + +This module is part of the `OCA/fleet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fleet_vehicle_service_calendar/__init__.py b/fleet_vehicle_service_calendar/__init__.py new file mode 100644 index 00000000..f7fc1869 --- /dev/null +++ b/fleet_vehicle_service_calendar/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/fleet_vehicle_service_calendar/__manifest__.py b/fleet_vehicle_service_calendar/__manifest__.py new file mode 100644 index 00000000..72999bf8 --- /dev/null +++ b/fleet_vehicle_service_calendar/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Scheduling Meetings for Vehicle Services", + "summary": "Add a smart button in services to schedule meetings.", + "category": "Human Resources/Fleet", + "author": "Druidoo, Odoo Community Association (OCA)", + "maintainers": ["mamcode", "ivantodorovich"], + "development_status": "Production/Stable", + "website": "https://github.com/OCA/fleet", + "license": "AGPL-3", + "version": "18.0.1.0.0", + "depends": ["calendar", "fleet_vehicle_service_kanban"], + "data": [ + "views/fleet_vehicle_log_services_views.xml", + "views/calendar_event_views.xml", + ], + "installable": True, +} diff --git a/fleet_vehicle_service_calendar/i18n/es.po b/fleet_vehicle_service_calendar/i18n/es.po new file mode 100644 index 00000000..77297563 --- /dev/null +++ b/fleet_vehicle_service_calendar/i18n/es.po @@ -0,0 +1,66 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fleet_vehicle_service_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-03-25 20:37+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_fleet_vehicle_log_services__meeting_count +msgid "# Meetings" +msgstr "# Reuniones" + +#. module: fleet_vehicle_service_calendar +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_service_calendar.fleet_vehicle_log_services_view_form +msgid "" +" Meetings\n" +" Meeting" +msgstr "" +" Reuniones\n" +" Reunión" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_calendar_event +msgid "Calendar Event" +msgstr "Calendario de Evento" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "" +"Meeting scheduled at '%(html_time)s'
Subject: %(meeting_subject)s
" +"Duration: %(duration)s hours" +msgstr "" +"Reunión programada a las '%(html_time)s'
Asunto: %(meeting_subject)s " +"
Duración: %(duration)s horas" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_fleet_vehicle_log_services +msgid "Services for vehicles" +msgstr "Servicios para los vehículos" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_calendar_event__vehicle_service_id +msgid "Vehicle Service" +msgstr "Servicio de Vehículos" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "unknown" +msgstr "desconocido" diff --git a/fleet_vehicle_service_calendar/i18n/fleet_vehicle_service_calendar.pot b/fleet_vehicle_service_calendar/i18n/fleet_vehicle_service_calendar.pot new file mode 100644 index 00000000..5834e00c --- /dev/null +++ b/fleet_vehicle_service_calendar/i18n/fleet_vehicle_service_calendar.pot @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fleet_vehicle_service_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_fleet_vehicle_log_services__meeting_count +msgid "# Meetings" +msgstr "" + +#. module: fleet_vehicle_service_calendar +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_service_calendar.fleet_vehicle_log_services_view_form +msgid "" +" Meetings\n" +" Meeting" +msgstr "" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_calendar_event +msgid "Calendar Event" +msgstr "" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "" +"Meeting scheduled at '%(html_time)s'
Subject: %(meeting_subject)s
" +"Duration: %(duration)s hours" +msgstr "" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_fleet_vehicle_log_services +msgid "Services for vehicles" +msgstr "" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_calendar_event__vehicle_service_id +msgid "Vehicle Service" +msgstr "" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "unknown" +msgstr "" diff --git a/fleet_vehicle_service_calendar/i18n/gl.po b/fleet_vehicle_service_calendar/i18n/gl.po new file mode 100644 index 00000000..e6f73fe1 --- /dev/null +++ b/fleet_vehicle_service_calendar/i18n/gl.po @@ -0,0 +1,66 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fleet_vehicle_service_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-05-23 17:47+0000\n" +"Last-Translator: Pablo Castelo \n" +"Language-Team: none\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_fleet_vehicle_log_services__meeting_count +msgid "# Meetings" +msgstr "# Reunións" + +#. module: fleet_vehicle_service_calendar +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_service_calendar.fleet_vehicle_log_services_view_form +msgid "" +" Meetings\n" +" Meeting" +msgstr "" +" Reunións\n" +" Reunión" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_calendar_event +msgid "Calendar Event" +msgstr "Calendario de Evento" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "" +"Meeting scheduled at '%(html_time)s'
Subject: %(meeting_subject)s
" +"Duration: %(duration)s hours" +msgstr "" +"Reunión programada ás '%(html_time)s'
Asunto: %(meeting_subject)s
" +"Duración: %(duration)s horas" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_fleet_vehicle_log_services +msgid "Services for vehicles" +msgstr "Servizos para os vehículos" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_calendar_event__vehicle_service_id +msgid "Vehicle Service" +msgstr "Servizo de Vehículos" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "unknown" +msgstr "descoñecido" diff --git a/fleet_vehicle_service_calendar/i18n/it.po b/fleet_vehicle_service_calendar/i18n/it.po new file mode 100644 index 00000000..e98bb6fa --- /dev/null +++ b/fleet_vehicle_service_calendar/i18n/it.po @@ -0,0 +1,68 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fleet_vehicle_service_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-07-13 11:11+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_fleet_vehicle_log_services__meeting_count +msgid "# Meetings" +msgstr "N° riunioni" + +#. module: fleet_vehicle_service_calendar +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_service_calendar.fleet_vehicle_log_services_view_form +msgid "" +" Meetings\n" +" Meeting" +msgstr "" +" Riunioni\n" +" Riunione" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_calendar_event +msgid "Calendar Event" +msgstr "Evento calendario" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "" +"Meeting scheduled at '%(html_time)s'
Subject: %(meeting_subject)s
" +"Duration: %(duration)s hours" +msgstr "" +"Riunione schedulata alle '%(html_time)s'
Oggetto: %(meeting_subject)s " +"
Durata: %(duration)s ore" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_fleet_vehicle_log_services +msgid "Services for vehicles" +msgstr "Servizi per veicoli" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_calendar_event__vehicle_service_id +msgid "Vehicle Service" +msgstr "Servizio veicolo" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "unknown" +msgstr "sconosciuto" diff --git a/fleet_vehicle_service_calendar/i18n/nl.po b/fleet_vehicle_service_calendar/i18n/nl.po new file mode 100644 index 00000000..553e64a8 --- /dev/null +++ b/fleet_vehicle_service_calendar/i18n/nl.po @@ -0,0 +1,62 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fleet_vehicle_service_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-09-08 21:43+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_fleet_vehicle_log_services__meeting_count +msgid "# Meetings" +msgstr "# Vergaderingen" + +#. module: fleet_vehicle_service_calendar +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_service_calendar.fleet_vehicle_log_services_view_form +msgid "" +" Meetings\n" +" Meeting" +msgstr "" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_calendar_event +msgid "Calendar Event" +msgstr "Agenda-evenement" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "" +"Meeting scheduled at '%(html_time)s'
Subject: %(meeting_subject)s
" +"Duration: %(duration)s hours" +msgstr "" +"Vergadering gepland om '%(html_time)s'
Onderwerp: %(meeting_subject)s " +"
Duur: %(duration)s uur" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_fleet_vehicle_log_services +msgid "Services for vehicles" +msgstr "Diensten voor voertuigen" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_calendar_event__vehicle_service_id +msgid "Vehicle Service" +msgstr "Voertuigdienst" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "unknown" +msgstr "onbekend" diff --git a/fleet_vehicle_service_calendar/i18n/pt_BR.po b/fleet_vehicle_service_calendar/i18n/pt_BR.po new file mode 100644 index 00000000..f7de8b99 --- /dev/null +++ b/fleet_vehicle_service_calendar/i18n/pt_BR.po @@ -0,0 +1,67 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fleet_vehicle_service_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-06 20:58+0000\n" +"Last-Translator: Rodrigo Sottomaior Macedo " +"\n" +"Language-Team: none\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_fleet_vehicle_log_services__meeting_count +msgid "# Meetings" +msgstr "# Encontros" + +#. module: fleet_vehicle_service_calendar +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_service_calendar.fleet_vehicle_log_services_view_form +msgid "" +" Meetings\n" +" Meeting" +msgstr "" +" Encontros\n" +" Encontro" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_calendar_event +msgid "Calendar Event" +msgstr "Evento do calendário" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "" +"Meeting scheduled at '%(html_time)s'
Subject: %(meeting_subject)s
" +"Duration: %(duration)s hours" +msgstr "" +"Reunião agendada para '%(html_time)s'
Assunto: %(meeting_subject)s
" +"Duração: %(duration)s horas" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model,name:fleet_vehicle_service_calendar.model_fleet_vehicle_log_services +msgid "Services for vehicles" +msgstr "Serviços para veículos" + +#. module: fleet_vehicle_service_calendar +#: model:ir.model.fields,field_description:fleet_vehicle_service_calendar.field_calendar_event__vehicle_service_id +msgid "Vehicle Service" +msgstr "Serviço de veículos" + +#. module: fleet_vehicle_service_calendar +#. odoo-python +#: code:addons/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py:0 +#, python-format +msgid "unknown" +msgstr "desconhecido" diff --git a/fleet_vehicle_service_calendar/models/__init__.py b/fleet_vehicle_service_calendar/models/__init__.py new file mode 100644 index 00000000..7d8327dc --- /dev/null +++ b/fleet_vehicle_service_calendar/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import calendar_event +from . import fleet_vehicle_log_services diff --git a/fleet_vehicle_service_calendar/models/calendar_event.py b/fleet_vehicle_service_calendar/models/calendar_event.py new file mode 100644 index 00000000..35014590 --- /dev/null +++ b/fleet_vehicle_service_calendar/models/calendar_event.py @@ -0,0 +1,55 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class CalendarEvent(models.Model): + _inherit = "calendar.event" + + vehicle_service_id = fields.Many2one( + "fleet.vehicle.log.services", "Vehicle Service" + ) + + @api.model + def default_get(self, fields): + if self.env.context.get("default_vehicle_service_id"): + self = self.with_context( + default_res_model_id=self.env.ref( + "fleet.model_fleet_vehicle_log_services" + ).id, + default_res_id=self.env.context["default_vehicle_service_id"], + ) + defaults = super().default_get(fields) + + # sync res_model / res_id to service id + # (aka creating meeting from service chatter) + ctx = self.env.context + if ( + "vehicle_service_id" not in defaults + and defaults.get("res_model") == "fleet.vehicle.log.services" + ): + defaults["vehicle_service_id"] = defaults.get("res_id", False) or ctx.get( + "default_res_id", False + ) + + return defaults + + def _compute_is_highlighted(self): + super()._compute_is_highlighted() + if self.env.context.get("active_model") == "fleet.vehicle.log.services": + vehicle_service_id = self.env.context.get("active_id") + for event in self: + if event.vehicle_service_id.id == vehicle_service_id: + event.is_highlighted = True + return True + + @api.model_create_multi + def create(self, vals_list): + events = super().create(vals_list) + for event in events: + if event.vehicle_service_id and not event.activity_ids: + event.vehicle_service_id.log_meeting( + event.name, event.start, event.duration + ) + return events diff --git a/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py b/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py new file mode 100644 index 00000000..1d3ce0aa --- /dev/null +++ b/fleet_vehicle_service_calendar/models/fleet_vehicle_log_services.py @@ -0,0 +1,65 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models + + +class FleetVehicleLogServices(models.Model): + _inherit = "fleet.vehicle.log.services" + + meeting_count = fields.Integer("# Meetings", compute="_compute_meeting_count") + + def _compute_meeting_count(self): + meeting_data = ( + self.env["calendar.event"] + .sudo() + ._read_group( + [("vehicle_service_id", "in", self.ids)], + ["vehicle_service_id"], + ["__count"], + ) + ) + mapped_data = {service.id: count for service, count in meeting_data} + for record in self: + record.meeting_count = mapped_data.get(record.id, 0) + + def action_schedule_meeting(self): + """Open meeting's calendar view to schedule meeting on current service. + :return dict: dictionary value for created Meeting view + """ + self.ensure_one() + action = self.env["ir.actions.actions"]._for_xml_id( + "calendar.action_calendar_event" + ) + partner_ids = self.env.user.partner_id.ids + if self.user_id: + partner_ids += self.user_id.partner_id.ids + action["context"] = { + "default_vehicle_service_id": self.id, + "default_partner_id": self.user_id.partner_id.id if self.user_id else False, + "default_partner_ids": partner_ids, + "default_name": f"{self.vehicle_id.name} - {self.service_type_id.name}", + "search_default_vehicle_service_id": self.id, + } + return action + + def log_meeting(self, meeting_subject, meeting_date, duration): + if not duration: + duration = _("unknown") + else: + duration = str(duration) + meet_date = fields.Datetime.from_string(meeting_date) + meeting_usertime = fields.Datetime.to_string( + fields.Datetime.context_timestamp(self, meet_date) + ) + html_time = f"" + message = _( + "Meeting scheduled at '%(html_time)s'
" + + "Subject: %(meeting_subject)s
" + + "Duration: %(duration)s hours" + ) % { + "html_time": html_time, + "meeting_subject": meeting_subject, + "duration": duration, + } + return self.message_post(body=message) diff --git a/fleet_vehicle_service_calendar/pyproject.toml b/fleet_vehicle_service_calendar/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/fleet_vehicle_service_calendar/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/fleet_vehicle_service_calendar/readme/CONTRIBUTORS.md b/fleet_vehicle_service_calendar/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..d575ca82 --- /dev/null +++ b/fleet_vehicle_service_calendar/readme/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +- [Druidoo](https://www.druidoo.io): + - Iván Todorovich \ + - Manuel Marquez \ +- [Escodoo](https://www.escodoo.com.br): + - Marcel Savegnago \ diff --git a/fleet_vehicle_service_calendar/readme/DESCRIPTION.md b/fleet_vehicle_service_calendar/readme/DESCRIPTION.md new file mode 100644 index 00000000..6fdfa9a3 --- /dev/null +++ b/fleet_vehicle_service_calendar/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +This module adds the following features: + +- A smart button in form view of services to schedule meetings. +- Search events for specific services in calendar view. diff --git a/fleet_vehicle_service_calendar/static/description/icon.png b/fleet_vehicle_service_calendar/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/fleet_vehicle_service_calendar/static/description/icon.png differ diff --git a/fleet_vehicle_service_calendar/static/description/index.html b/fleet_vehicle_service_calendar/static/description/index.html new file mode 100644 index 00000000..14dd2346 --- /dev/null +++ b/fleet_vehicle_service_calendar/static/description/index.html @@ -0,0 +1,437 @@ + + + + + +Scheduling Meetings for Vehicle Services + + + +
+

Scheduling Meetings for Vehicle Services

+ + +

Production/Stable License: AGPL-3 OCA/fleet Translate me on Weblate Try me on Runboat

+

This module adds the following features:

+
    +
  • A smart button in form view of services to schedule meetings.
  • +
  • Search events for specific services in calendar view.
  • +
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub 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.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Druidoo
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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.

+

Current maintainers:

+

mamcode ivantodorovich

+

This module is part of the OCA/fleet project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/fleet_vehicle_service_calendar/tests/__init__.py b/fleet_vehicle_service_calendar/tests/__init__.py new file mode 100644 index 00000000..3ce7f29e --- /dev/null +++ b/fleet_vehicle_service_calendar/tests/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_vehicle_service_calendar +from . import test_calendar_event diff --git a/fleet_vehicle_service_calendar/tests/test_calendar_event.py b/fleet_vehicle_service_calendar/tests/test_calendar_event.py new file mode 100644 index 00000000..54045546 --- /dev/null +++ b/fleet_vehicle_service_calendar/tests/test_calendar_event.py @@ -0,0 +1,130 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from datetime import datetime, timedelta + +from odoo.addons.base.tests.common import BaseCommon + + +class TestCalendarEvent(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.calendar_event = cls.env["calendar.event"].create({"name": "Test Event"}) + cls.brand = cls.env["fleet.vehicle.model.brand"].create({"name": "Audi"}) + cls.vehicle_model = cls.env["fleet.vehicle.model"].create( + {"name": "Test Vehicle Model", "brand_id": cls.brand.id} + ) + cls.vehicle = cls.env["fleet.vehicle"].create( + { + "model_id": cls.vehicle_model.id, + "license_plate": "ABC-1234", + "odometer": 1000, + } + ) + cls.service_type = cls.env["fleet.service.type"].create( + {"name": "Fatura do Fornecedor", "category": "service"} + ) + cls.vehicle_service = cls.env["fleet.vehicle.log.services"].create( + { + "vehicle_id": cls.vehicle.id, + "notes": "Test notes", + "service_type_id": cls.service_type.id, + } + ) + + def test_default_get(self): + fields = ["vehicle_service_id"] + self.calendar_event.env.context = { + "default_vehicle_service_id": self.vehicle_service.id + } + defaults = self.calendar_event.default_get(fields) + self.assertEqual(defaults["vehicle_service_id"], self.vehicle_service.id) + + def test_compute_is_highlighted(self): + self.calendar_event.vehicle_service_id = self.vehicle_service + self.calendar_event.env.context = { + "active_model": "fleet.vehicle.log.services", + "active_id": self.vehicle_service.id, + } + self.calendar_event._compute_is_highlighted() + self.assertTrue(self.calendar_event.is_highlighted) + + def test_create_vehicle_service(self): + meeting_name = "Meeting" + meeting_start = datetime(2023, 4, 5, 10, 0, 0) + meeting_duration = 1.0 + meeting_end = meeting_start + timedelta(hours=meeting_duration) + + activity_type = self.env.ref("mail.mail_activity_data_meeting") + activity_vals = { + "activity_type_id": activity_type.id, + "user_id": self.env.uid, + "res_model_id": self.env.ref("fleet.model_fleet_vehicle_log_services").id, + "res_id": self.vehicle_service.id, + "note": meeting_name, + "date_deadline": meeting_start, + } + activity = self.env["mail.activity"].create(activity_vals) + event = self.env["calendar.event"].create( + { + "name": meeting_name, + "description": meeting_name, + "start": meeting_start, + "stop": meeting_end, + "vehicle_service_id": self.vehicle_service.id, + "activity_ids": [(4, activity.id)], + } + ) + self.assertTrue(event.activity_ids) + meeting_activity = event.activity_ids.filtered( + lambda activity: activity.activity_type_id.name == "Meeting" + ) + self.assertTrue(meeting_activity) + self.assertTrue(meeting_activity.note, meeting_name) + self.assertTrue(meeting_activity.date_deadline, meeting_start) + self.assertTrue(meeting_activity.user_id, self.env.uid) + self.assertTrue( + meeting_activity.res_model_id, + self.env.ref("fleet.model_fleet_vehicle_log_services").id, + ) + self.assertTrue(meeting_activity.res_id, self.vehicle_service.id) + + +class TestFleetVehicleLogServices2(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.brand = cls.env["fleet.vehicle.model.brand"].create({"name": "Audi"}) + cls.vehicle_model = cls.env["fleet.vehicle.model"].create( + {"name": "Test Vehicle Model", "brand_id": cls.brand.id} + ) + cls.vehicle = cls.env["fleet.vehicle"].create( + { + "model_id": cls.vehicle_model.id, + "license_plate": "ABC-1234", + "odometer": 1000, + } + ) + cls.service_type = cls.env["fleet.service.type"].create( + {"name": "Fatura do Fornecedor", "category": "service"} + ) + cls.vehicle_service = cls.env["fleet.vehicle.log.services"].create( + { + "vehicle_id": cls.vehicle.id, + "notes": "Test notes", + "service_type_id": cls.service_type.id, + } + ) + + def test_compute_meeting_count(self): + self.env["calendar.event"].create( + { + "name": "Meeting 1", + "start": "2023-04-06 10:00:00", + "stop": "2023-04-06 11:00:00", + "vehicle_service_id": self.vehicle_service.id, + } + ) + self.vehicle_service._compute_meeting_count() + self.assertEqual(self.vehicle_service.meeting_count, 1) diff --git a/fleet_vehicle_service_calendar/tests/test_vehicle_service_calendar.py b/fleet_vehicle_service_calendar/tests/test_vehicle_service_calendar.py new file mode 100644 index 00000000..1ae49a6c --- /dev/null +++ b/fleet_vehicle_service_calendar/tests/test_vehicle_service_calendar.py @@ -0,0 +1,32 @@ +# Copyright 2020-Present Druidoo - Manuel Marquez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from dateutil.relativedelta import relativedelta + +from odoo.addons.fleet_vehicle_service_kanban.tests.common import ( + TestVehicleLogServicesCommon, +) + + +class TestVehicleServiceCalendar(TestVehicleLogServicesCommon): + def test_service_calendar_meeting(self): + """Check correct creation of meeting for service.""" + smartbutton_action = self.service_repair.action_schedule_meeting() + service_meeting = ( + self.env["calendar.event"] + .with_context(**smartbutton_action["context"]) + .create( + { + "start": datetime.now(), + "stop": datetime.now() + relativedelta(hours=1), + } + ) + ) + self.assertEqual(service_meeting.vehicle_service_id, self.service_repair) + meeting_subject = ( + f"{self.service_repair.vehicle_id.name}" + f" - {self.service_repair.service_type_id.name}" + ) + self.assertEqual(service_meeting.name, meeting_subject) diff --git a/fleet_vehicle_service_calendar/views/calendar_event_views.xml b/fleet_vehicle_service_calendar/views/calendar_event_views.xml new file mode 100644 index 00000000..4f04de22 --- /dev/null +++ b/fleet_vehicle_service_calendar/views/calendar_event_views.xml @@ -0,0 +1,13 @@ + + + + calendar.event.search.vehicle.service + calendar.event + + + + + + + + diff --git a/fleet_vehicle_service_calendar/views/fleet_vehicle_log_services_views.xml b/fleet_vehicle_service_calendar/views/fleet_vehicle_log_services_views.xml new file mode 100644 index 00000000..ab8913fd --- /dev/null +++ b/fleet_vehicle_service_calendar/views/fleet_vehicle_log_services_views.xml @@ -0,0 +1,35 @@ + + + + fleet.vehicle.log.services.form.calendar + fleet.vehicle.log.services + + + +
+ +
+
+
+
+