diff --git a/fieldservice_availability/README.rst b/fieldservice_availability/README.rst new file mode 100644 index 0000000000..192e45f13a --- /dev/null +++ b/fieldservice_availability/README.rst @@ -0,0 +1,135 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +========================= +Fieldservice Availability +========================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:45ba27349be2b7224c790187375371e4612a3a88e0cc36674212f8cd0ce50272 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-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%2Ffield--service-lightgray.png?logo=github + :target: https://github.com/OCA/field-service/tree/19.0/fieldservice_availability + :alt: OCA/field-service +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/field-service-19-0/field-service-19-0-fieldservice_availability + :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/field-service&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module defines blackout days (non-operational days), stress days +(high-demand periods), and delivery time ranges for field service +operations. It provides the necessary models to store this information, +which can be used by other modules to manage scheduling, availability, +and workload adjustments. + +- **Blackout Days (\`fsm.blackout.day\`)**: Represent dates when field + service operations are unavailable (e.g., holidays, company-wide + closures). +- **Blackout Groups (\`fsm.blackout.group\`)**: Represent groups of days + when field service operations are unavailable (e.g., holidays, + company-wide closures). +- **Stress Days (\`fsm.stress.day\`)**: Indicate dates with increased + service demand (e.g., peak business periods requiring additional + workforce). +- **Delivery Time Ranges (\`fsm.delivery.time.range\`)**: Define + available time slots for scheduling field service operations. + +**Restricts blackout days for Scheduled Start (ETA) orders with the same +date** + +This is a technical module and does not provide functionality on its +own. Extend this module to integrate availability management into field +service workflows. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Navigate to Field Service > Configuration > Availability. Once there, +you can select Delivery Time Ranges, Blackout Days, Blackout Groups or +Stress Days to create new records. + +Steps to restrict blackout days for Scheduled Start (ETA) orders with +the same date + +1. Set up Blackout Days on Configuration > Blackout Groups and create or + edit one with blackout days +2. Go to Field Service > Master Data > Routes > Create or edit route and + assign Blackout Group Days and a Person +3. Create a Field Service order and set up Scheduled Start (ETA) with + date that you put on blackout days and the Odoo will throw an error + +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 +------- + +* APSL-Nagarro + +Contributors +------------ + +- `APSL-Nagarro `__: + + - Patryk Pyczko + - Antoni Marroig + +- `CIT Services `__: + + - Linto Antony + +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-ppyczko| image:: https://github.com/ppyczko.png?size=40px + :target: https://github.com/ppyczko + :alt: ppyczko + +Current `maintainer `__: + +|maintainer-ppyczko| + +This module is part of the `OCA/field-service `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fieldservice_availability/__init__.py b/fieldservice_availability/__init__.py new file mode 100644 index 0000000000..31660d6a96 --- /dev/null +++ b/fieldservice_availability/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/fieldservice_availability/__manifest__.py b/fieldservice_availability/__manifest__.py new file mode 100644 index 0000000000..cf551a24b5 --- /dev/null +++ b/fieldservice_availability/__manifest__.py @@ -0,0 +1,31 @@ +# Copyright 2025 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Fieldservice Availability", + "version": "19.0.1.0.0", + "summary": "Provides models for defining blackout days, stress days, " + "and delivery time ranges for FSM availability management.", + "category": "Field Service", + "website": "https://github.com/OCA/field-service", + "author": "APSL-Nagarro, Odoo Community Association (OCA)", + "maintainers": ["ppyczko"], + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["fieldservice_route"], + "data": [ + "security/ir.model.access.csv", + "views/fsm_blackout_day_templates.xml", + "views/fsm_delivery_time_range_templates.xml", + "views/fsm_stress_day_templates.xml", + "views/fsm_route.xml", + "views/menu.xml", + ], + "demo": [ + "demo/fsm_blackout_day_demo.xml", + "demo/fsm_blackout_group_demo.xml", + "demo/fsm_delivery_time_range_demo.xml", + "demo/fsm_stress_day_demo.xml", + ], +} diff --git a/fieldservice_availability/demo/fsm_blackout_day_demo.xml b/fieldservice_availability/demo/fsm_blackout_day_demo.xml new file mode 100644 index 0000000000..b0b32fa9fc --- /dev/null +++ b/fieldservice_availability/demo/fsm_blackout_day_demo.xml @@ -0,0 +1,16 @@ + + + BlackOut Day 01 + + + + + BlackOut Day 02 + + + + + BlackOut Day 03 + + + diff --git a/fieldservice_availability/demo/fsm_blackout_group_demo.xml b/fieldservice_availability/demo/fsm_blackout_group_demo.xml new file mode 100644 index 0000000000..91fb701b66 --- /dev/null +++ b/fieldservice_availability/demo/fsm_blackout_group_demo.xml @@ -0,0 +1,9 @@ + + + BlackOut Group 01 + + + diff --git a/fieldservice_availability/demo/fsm_delivery_time_range_demo.xml b/fieldservice_availability/demo/fsm_delivery_time_range_demo.xml new file mode 100644 index 0000000000..9629ead0ef --- /dev/null +++ b/fieldservice_availability/demo/fsm_delivery_time_range_demo.xml @@ -0,0 +1,8 @@ + + + Delivery Time Range 01 + 09.00 + 18.00 + + + diff --git a/fieldservice_availability/demo/fsm_stress_day_demo.xml b/fieldservice_availability/demo/fsm_stress_day_demo.xml new file mode 100644 index 0000000000..53de55f863 --- /dev/null +++ b/fieldservice_availability/demo/fsm_stress_day_demo.xml @@ -0,0 +1,16 @@ + + + Stress Day 01 + + + + + Stress Day 02 + + + + + Stress Day 03 + + + diff --git a/fieldservice_availability/i18n/ca.po b/fieldservice_availability/i18n/ca.po new file mode 100644 index 0000000000..ec5fe2bed7 --- /dev/null +++ b/fieldservice_availability/i18n/ca.po @@ -0,0 +1,216 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_availability +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-04-16 12:04+0000\n" +"PO-Revision-Date: 2026-04-21 15:24+0000\n" +"Last-Translator: mtbochaca \n" +"Language-Team: \n" +"Language: ca\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: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_blackout_day_unique_blackout_day +msgid "A blackout day with this date already exists!" +msgstr "Ja existeix un dia de bloqueig amb aquesta data!" + +#. module: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_stress_day_unique_stress_day +msgid "A stress day with this date already exists!" +msgstr "Ja existeix un dia d'alta demanda amb aquesta data!" + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_days +msgid "Add a Field Service Blackout Day here." +msgstr "Afegeix un dia de bloqueig del servei de camp aquí." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_groups +msgid "Add a Field Service Blackout Group here." +msgstr "Afegeix un grup de bloqueig del servei de camp aquí." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_delivery_time_range +msgid "Add a Field Service Delivery Time Range here." +msgstr "Afegeix un interval de temps de lliurament de serveis aquí." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_stress_days +msgid "Add a Field Service Stress Day here." +msgstr "Afegeix un dia d'alta demanda del servei de camp aquí." + +#. module: fieldservice_availability +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_config_availability +msgid "Availability" +msgstr "Disponibilitat" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__date +msgid "Blackout Day" +msgstr "Dia de bloqueig" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_days_root +msgid "Blackout Days" +msgstr "Dies de bloqueig" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_day +msgid "Blackout Days (No Service)" +msgstr "Dies de bloqueig (Sense servei)" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_group +msgid "Blackout Group" +msgstr "Grup de bloqueig" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_groups +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_group_root +msgid "Blackout Groups" +msgstr "Grups de bloqueig" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_uid +msgid "Created by" +msgstr "Creat per" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_date +msgid "Created on" +msgstr "Creat el" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Customize the order of time ranges. Lower numbers are shown first." +msgstr "" +"Personalitza l'ordre dels intervals de temps. Els números més baixos es " +"mostren primer." + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__fsm_blackout_day_ids +msgid "Days" +msgstr "Dies" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_delivery_time_range +#: model_terms:ir.ui.view,arch_db:fieldservice_availability.view_fsm_delivery_time_range_form +msgid "Delivery Time Range" +msgstr "Interval de Temps de Lliurament" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_delivery_time_range +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_delivery_time_range +msgid "Delivery Time Ranges" +msgstr "Intervals de Temps de Lliurament" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__name +msgid "Description" +msgstr "Descripció" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__display_name +msgid "Display Name" +msgstr "Nom de Mostra" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__end_time +msgid "End Time" +msgstr "Hora de Finalització" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_stress_day +msgid "High-Demand Days" +msgstr "Dies d'alta demanda" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__id +msgid "ID" +msgstr "ID" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_uid +msgid "Last Updated by" +msgstr "Última Actualització per" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_date +msgid "Last Updated on" +msgstr "Última Actualització el" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__name +msgid "Name" +msgstr "Nom" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "Route" +msgstr "Ruta" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Sequence" +msgstr "Seqüència" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "" +"Specific route this time range applies to. Leave empty for global time " +"ranges." +msgstr "" +"Ruta específica a la qual s'aplica aquest interval de temps. Deixa buit per " +"a intervals de temps globals." + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__start_time +msgid "Start Time" +msgstr "Hora d'Inici" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__date +msgid "Stress Day" +msgstr "Dia d'alta demanda" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_stress_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_stress_days_root +msgid "Stress Days" +msgstr "Dies d'alta demanda" + +#. module: fieldservice_availability +#. odoo-python +#: code:addons/fieldservice_availability/models/fsm_delivery_time_range.py:0 +#, python-format +msgid "The start time must be earlier than the end time." +msgstr "L'hora d'inici ha de ser anterior a l'hora de finalització." diff --git a/fieldservice_availability/i18n/es.po b/fieldservice_availability/i18n/es.po new file mode 100644 index 0000000000..e19787d4c7 --- /dev/null +++ b/fieldservice_availability/i18n/es.po @@ -0,0 +1,216 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_availability +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-04-16 12:05+0000\n" +"PO-Revision-Date: 2026-04-12 12:43+0000\n" +"Last-Translator: Ed-Spain \n" +"Language-Team: \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 5.15.2\n" + +#. module: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_blackout_day_unique_blackout_day +msgid "A blackout day with this date already exists!" +msgstr "¡Ya existe un día de bloqueo con esta fecha!" + +#. module: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_stress_day_unique_stress_day +msgid "A stress day with this date already exists!" +msgstr "¡Ya existe un día de alta demanda con esta fecha!" + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_days +msgid "Add a Field Service Blackout Day here." +msgstr "Añade un día de bloqueo del servicio de campo aquí." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_groups +msgid "Add a Field Service Blackout Group here." +msgstr "Añade un grupo de bloqueo del servicio de campo aquí." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_delivery_time_range +msgid "Add a Field Service Delivery Time Range here." +msgstr "Añade un rango de tiempo de entrega de servicio de campo aquí." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_stress_days +msgid "Add a Field Service Stress Day here." +msgstr "Añade un día de alta demanda del servicio de campo aquí." + +#. module: fieldservice_availability +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_config_availability +msgid "Availability" +msgstr "Disponibilidad" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__date +msgid "Blackout Day" +msgstr "Día de bloqueo" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_days_root +msgid "Blackout Days" +msgstr "Días de bloqueo" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_day +msgid "Blackout Days (No Service)" +msgstr "Días de bloqueo (Sin Servicio)" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_group +msgid "Blackout Group" +msgstr "Grupo de bloqueo" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_groups +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_group_root +msgid "Blackout Groups" +msgstr "Grupos de bloqueo" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Customize the order of time ranges. Lower numbers are shown first." +msgstr "" +"Personaliza el orden de los rangos de tiempo. Los números más bajos se " +"muestran primero." + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__fsm_blackout_day_ids +msgid "Days" +msgstr "Días" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_delivery_time_range +#: model_terms:ir.ui.view,arch_db:fieldservice_availability.view_fsm_delivery_time_range_form +msgid "Delivery Time Range" +msgstr "Rango de Tiempo de Entrega" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_delivery_time_range +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_delivery_time_range +msgid "Delivery Time Ranges" +msgstr "Rangos de Tiempo de Entrega" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__name +msgid "Description" +msgstr "Descripción" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__display_name +msgid "Display Name" +msgstr "Nombre para Mostrar" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__end_time +msgid "End Time" +msgstr "Hora de Fin" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_stress_day +msgid "High-Demand Days" +msgstr "Días de Alta Demanda" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__id +msgid "ID" +msgstr "ID" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_uid +msgid "Last Updated by" +msgstr "Última Actualización por" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__name +msgid "Name" +msgstr "Nombre" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "Route" +msgstr "Ruta" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "" +"Specific route this time range applies to. Leave empty for global time " +"ranges." +msgstr "" +"Ruta específica a la que se aplica este rango de tiempo. Dejar vacío para " +"rangos de tiempo globales." + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__start_time +msgid "Start Time" +msgstr "Hora de Inicio" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__date +msgid "Stress Day" +msgstr "Día de alta demanda" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_stress_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_stress_days_root +msgid "Stress Days" +msgstr "Días de alta demanda" + +#. module: fieldservice_availability +#. odoo-python +#: code:addons/fieldservice_availability/models/fsm_delivery_time_range.py:0 +#, python-format +msgid "The start time must be earlier than the end time." +msgstr "La hora de inicio debe ser anterior a la hora de fin." diff --git a/fieldservice_availability/i18n/fieldservice_availability.pot b/fieldservice_availability/i18n/fieldservice_availability.pot new file mode 100644 index 0000000000..c177bc356f --- /dev/null +++ b/fieldservice_availability/i18n/fieldservice_availability.pot @@ -0,0 +1,207 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_availability +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.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: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_blackout_day_unique_blackout_day +msgid "A blackout day with this date already exists!" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_stress_day_unique_stress_day +msgid "A stress day with this date already exists!" +msgstr "" + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_days +msgid "Add a Field Service Blackout Day here." +msgstr "" + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_groups +msgid "Add a Field Service Blackout Group here." +msgstr "" + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_delivery_time_range +msgid "Add a Field Service Delivery Time Range here." +msgstr "" + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_stress_days +msgid "Add a Field Service Stress Day here." +msgstr "" + +#. module: fieldservice_availability +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_config_availability +msgid "Availability" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__date +msgid "Blackout Day" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_days_root +msgid "Blackout Days" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_day +msgid "Blackout Days (No Service)" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_group +msgid "Blackout Group" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_groups +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_group_root +msgid "Blackout Groups" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_uid +msgid "Created by" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_date +msgid "Created on" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Customize the order of time ranges. Lower numbers are shown first." +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__fsm_blackout_day_ids +msgid "Days" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_delivery_time_range +#: model_terms:ir.ui.view,arch_db:fieldservice_availability.view_fsm_delivery_time_range_form +msgid "Delivery Time Range" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_delivery_time_range +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_delivery_time_range +msgid "Delivery Time Ranges" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__name +msgid "Description" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__display_name +msgid "Display Name" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__end_time +msgid "End Time" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_stress_day +msgid "High-Demand Days" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__id +msgid "ID" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_date +msgid "Last Updated on" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__name +msgid "Name" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "Route" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Sequence" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "" +"Specific route this time range applies to. Leave empty for global time " +"ranges." +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__start_time +msgid "Start Time" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__date +msgid "Stress Day" +msgstr "" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_stress_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_stress_days_root +msgid "Stress Days" +msgstr "" + +#. module: fieldservice_availability +#. odoo-python +#: code:addons/fieldservice_availability/models/fsm_delivery_time_range.py:0 +msgid "The start time must be earlier than the end time." +msgstr "" diff --git a/fieldservice_availability/i18n/it.po b/fieldservice_availability/i18n/it.po new file mode 100644 index 0000000000..2a1e16e0e3 --- /dev/null +++ b/fieldservice_availability/i18n/it.po @@ -0,0 +1,215 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_availability +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-23 15:23+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 5.10.4\n" + +#. module: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_blackout_day_unique_blackout_day +msgid "A blackout day with this date already exists!" +msgstr "Esiste già un giorno di sospensione con questa data!" + +#. module: fieldservice_availability +#: model:ir.model.constraint,message:fieldservice_availability.constraint_fsm_stress_day_unique_stress_day +msgid "A stress day with this date already exists!" +msgstr "Esiste già un giorno impegnativo con questa data!" + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_days +msgid "Add a Field Service Blackout Day here." +msgstr "Aggiungi qui un giorno di sospensione servizio sul campo." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_blackout_groups +msgid "Add a Field Service Blackout Group here." +msgstr "Aggiungi qui un gruppo sospensione servizio sul campo." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_delivery_time_range +msgid "Add a Field Service Delivery Time Range here." +msgstr "Aggiungi qui un intervallo orario consegna servizio sul campo." + +#. module: fieldservice_availability +#: model_terms:ir.actions.act_window,help:fieldservice_availability.action_fsm_stress_days +msgid "Add a Field Service Stress Day here." +msgstr "Aggiungi qui un giorno impegnativo servizio sul campo." + +#. module: fieldservice_availability +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_config_availability +msgid "Availability" +msgstr "Disponibilità" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__date +msgid "Blackout Day" +msgstr "Giorno di sospensione" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_days_root +msgid "Blackout Days" +msgstr "Giorni di sospensione" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_day +msgid "Blackout Days (No Service)" +msgstr "Giorno di sospensione (nessun servizio)" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_blackout_group +msgid "Blackout Group" +msgstr "Gruppo sospensione" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_blackout_groups +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_blackout_group_root +msgid "Blackout Groups" +msgstr "Gruppi sospensione" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__create_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Customize the order of time ranges. Lower numbers are shown first." +msgstr "" +"Personalizza l'ordine degli intervalli orario. I numeri inferiori sono " +"mostrati per primi." + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__fsm_blackout_day_ids +msgid "Days" +msgstr "Giorni" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_delivery_time_range +#: model_terms:ir.ui.view,arch_db:fieldservice_availability.view_fsm_delivery_time_range_form +msgid "Delivery Time Range" +msgstr "Intervallo orario consegna" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_delivery_time_range +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_delivery_time_range +msgid "Delivery Time Ranges" +msgstr "Intervalli orario consegna" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__name +msgid "Description" +msgstr "Descrizione" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__display_name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__end_time +msgid "End Time" +msgstr "Ora termine" + +#. module: fieldservice_availability +#: model:ir.model,name:fieldservice_availability.model_fsm_stress_day +msgid "High-Demand Days" +msgstr "Giorni ad alta richiesta" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__id +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__id +msgid "ID" +msgstr "ID" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_uid +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_day__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__write_date +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_blackout_group__name +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__name +msgid "Name" +msgstr "Nome" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "Route" +msgstr "Percorso" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: fieldservice_availability +#: model:ir.model.fields,help:fieldservice_availability.field_fsm_delivery_time_range__route_id +msgid "" +"Specific route this time range applies to. Leave empty for global time " +"ranges." +msgstr "" +"Percorso specifico a cui si applica questo intervallo orario. Lasciare vuoto " +"per intervalli orario globali." + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_delivery_time_range__start_time +msgid "Start Time" +msgstr "Ora inizio" + +#. module: fieldservice_availability +#: model:ir.model.fields,field_description:fieldservice_availability.field_fsm_stress_day__date +msgid "Stress Day" +msgstr "Giorno impegnativo" + +#. module: fieldservice_availability +#: model:ir.actions.act_window,name:fieldservice_availability.action_fsm_stress_days +#: model:ir.ui.menu,name:fieldservice_availability.menu_fsm_stress_days_root +msgid "Stress Days" +msgstr "Giorni impegnativi" + +#. module: fieldservice_availability +#. odoo-python +#: code:addons/fieldservice_availability/models/fsm_delivery_time_range.py:0 +#, python-format +msgid "The start time must be earlier than the end time." +msgstr "L'orario di inizio deve essere prima dell'orario di fine." diff --git a/fieldservice_availability/models/__init__.py b/fieldservice_availability/models/__init__.py new file mode 100644 index 0000000000..494f74c80d --- /dev/null +++ b/fieldservice_availability/models/__init__.py @@ -0,0 +1,8 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import fsm_order +from . import fsm_route +from . import fsm_blackout_day +from . import fsm_blackout_group +from . import fsm_delivery_time_range +from . import fsm_stress_day diff --git a/fieldservice_availability/models/fsm_blackout_day.py b/fieldservice_availability/models/fsm_blackout_day.py new file mode 100644 index 0000000000..110cc2395a --- /dev/null +++ b/fieldservice_availability/models/fsm_blackout_day.py @@ -0,0 +1,20 @@ +# Copyright 2025 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FieldServiceBlackoutDay(models.Model): + _name = "fsm.blackout.day" + _description = "Blackout Days (No Service)" + + name = fields.Char(string="Description", required=True) + date = fields.Date(string="Blackout Day", required=True) + zip = fields.Char( + help="Postal code of the blackout day.", + ) + + _unique_blackout_day = models.Constraint( + "unique(date)", + "A blackout day with this date already exists!", + ) diff --git a/fieldservice_availability/models/fsm_blackout_group.py b/fieldservice_availability/models/fsm_blackout_group.py new file mode 100644 index 0000000000..58506be76b --- /dev/null +++ b/fieldservice_availability/models/fsm_blackout_group.py @@ -0,0 +1,18 @@ +# Copyright 2025 APSL-Nagarro Antoni Marroig +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FieldServiceBlackoutGroup(models.Model): + _name = "fsm.blackout.group" + _description = "Blackout Group" + + name = fields.Char(required=True) + fsm_blackout_day_ids = fields.Many2many( + "fsm.blackout.day", + "fsm_blackout_group_ids", + "fsm_blackout_group_id", + "fsm_blackout_day_id", + string="Days", + ) diff --git a/fieldservice_availability/models/fsm_delivery_time_range.py b/fieldservice_availability/models/fsm_delivery_time_range.py new file mode 100644 index 0000000000..ddfec6efb1 --- /dev/null +++ b/fieldservice_availability/models/fsm_delivery_time_range.py @@ -0,0 +1,40 @@ +# Copyright 2025 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.exceptions import ValidationError + + +class FSMDeliveryTimeRange(models.Model): + _name = "fsm.delivery.time.range" + _description = "Delivery Time Range" + _order = "sequence, start_time asc" + + name = fields.Char(compute="_compute_name", store=True) + start_time = fields.Float(required=True) + end_time = fields.Float(required=True) + route_id = fields.Many2one( + "fsm.route", + string="Route", + help="Specific route this time range applies to. " + "Leave empty for global time ranges.", + ) + sequence = fields.Integer( + default=10, + help="Customize the order of time ranges. Lower numbers are shown first.", + ) + + @api.depends("start_time", "end_time") + def _compute_name(self): + for record in self: + start = "{:02d}:{:02d}".format(*divmod(int(record.start_time * 60), 60)) + end = "{:02d}:{:02d}".format(*divmod(int(record.end_time * 60), 60)) + record.name = f"{start} - {end}" + + @api.constrains("start_time", "end_time") + def _check_time_range(self): + for record in self: + if record.start_time >= record.end_time: + raise ValidationError( + self.env._("The start time must be earlier than the end time.") + ) diff --git a/fieldservice_availability/models/fsm_order.py b/fieldservice_availability/models/fsm_order.py new file mode 100644 index 0000000000..8ea0b2e0fe --- /dev/null +++ b/fieldservice_availability/models/fsm_order.py @@ -0,0 +1,31 @@ +# Copyright 2025 APSL-Nagarro Antoni Marroig +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, models +from odoo.exceptions import ValidationError +from odoo.tools.misc import format_date + + +class FSMRoute(models.Model): + _inherit = "fsm.order" + + @api.constrains("scheduled_date_start", "location_id") + def check_black_out_days(self): + for order in self: + if not (order.fsm_route_id and order.scheduled_date_start): + continue + order_date, order_zip = order.scheduled_date_start.date(), order.zip + blackout_days = ( + order.fsm_route_id.fsm_blackout_group_ids.fsm_blackout_day_ids + ) + match = blackout_days.filtered( + lambda x, d=order_date, z=order_zip: x.date == d + and (not x.zip or x.zip == z) + ) + if match: + raise ValidationError( + self.env._( + "The date %(date)s is a blackout day for field" + " service operations on this route.", + date=format_date(order.env, order.scheduled_date_start), + ) + ) diff --git a/fieldservice_availability/models/fsm_route.py b/fieldservice_availability/models/fsm_route.py new file mode 100644 index 0000000000..d2a870d1f6 --- /dev/null +++ b/fieldservice_availability/models/fsm_route.py @@ -0,0 +1,16 @@ +# Copyright 2025 APSL-Nagarro Antoni Marroig +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FSMRoute(models.Model): + _inherit = "fsm.route" + + fsm_blackout_group_ids = fields.Many2many( + "fsm.blackout.group", + "fsm_route_ids", + "fsm_route_id", + "fsm_blackout_group_id", + string="Blackout Group Days", + ) diff --git a/fieldservice_availability/models/fsm_stress_day.py b/fieldservice_availability/models/fsm_stress_day.py new file mode 100644 index 0000000000..20a54a071d --- /dev/null +++ b/fieldservice_availability/models/fsm_stress_day.py @@ -0,0 +1,17 @@ +# Copyright 2025 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FieldServiceStressDay(models.Model): + _name = "fsm.stress.day" + _description = "High-Demand Days" + + name = fields.Char(string="Description", required=True) + date = fields.Date(string="Stress Day", required=True) + + _unique_stress_day = models.Constraint( + "unique(date)", + "A stress day with this date already exists!", + ) diff --git a/fieldservice_availability/pyproject.toml b/fieldservice_availability/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/fieldservice_availability/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/fieldservice_availability/readme/CONTRIBUTORS.md b/fieldservice_availability/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..661317f2dc --- /dev/null +++ b/fieldservice_availability/readme/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +- [APSL-Nagarro](https://www.apsl.tech): + - Patryk Pyczko \<\> + - Antoni Marroig \<\> +- [CIT Services](https://cit-services.in/): + - Linto Antony \<\> diff --git a/fieldservice_availability/readme/DESCRIPTION.md b/fieldservice_availability/readme/DESCRIPTION.md new file mode 100644 index 0000000000..75a7ab731e --- /dev/null +++ b/fieldservice_availability/readme/DESCRIPTION.md @@ -0,0 +1,23 @@ +This module defines blackout days (non-operational days), stress days +(high-demand periods), and delivery time ranges for field service +operations. It provides the necessary models to store this information, +which can be used by other modules to manage scheduling, availability, +and workload adjustments. + +- **Blackout Days (\`fsm.blackout.day\`)**: Represent dates when field + service operations are unavailable (e.g., holidays, company-wide + closures). +- **Blackout Groups (\`fsm.blackout.group\`)**: Represent groups of days when field + service operations are unavailable (e.g., holidays, company-wide + closures). +- **Stress Days (\`fsm.stress.day\`)**: Indicate dates with increased + service demand (e.g., peak business periods requiring additional + workforce). +- **Delivery Time Ranges (\`fsm.delivery.time.range\`)**: Define + available time slots for scheduling field service operations. + +**Restricts blackout days for Scheduled Start (ETA) orders with the same date** + +This is a technical module and does not provide functionality on its +own. Extend this module to integrate availability management into field +service workflows. diff --git a/fieldservice_availability/readme/USAGE.md b/fieldservice_availability/readme/USAGE.md new file mode 100644 index 0000000000..bbe650fce3 --- /dev/null +++ b/fieldservice_availability/readme/USAGE.md @@ -0,0 +1,9 @@ +Navigate to Field Service \> Configuration \> Availability. Once there, +you can select Delivery Time Ranges, Blackout Days, Blackout Groups or Stress Days to +create new records. + +Steps to restrict blackout days for Scheduled Start (ETA) orders with the same date + +1. Set up Blackout Days on Configuration > Blackout Groups and create or edit one with blackout days +2. Go to Field Service > Master Data > Routes > Create or edit route and assign Blackout Group Days and a Person +3. Create a Field Service order and set up Scheduled Start (ETA) with date that you put on blackout days and the Odoo will throw an error diff --git a/fieldservice_availability/security/ir.model.access.csv b/fieldservice_availability/security/ir.model.access.csv new file mode 100644 index 0000000000..93c074d2c9 --- /dev/null +++ b/fieldservice_availability/security/ir.model.access.csv @@ -0,0 +1,17 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_fsm_blackout_days_manager,fsm.blackout.day.manager,model_fsm_blackout_day,fieldservice.group_fsm_manager,1,1,1,1 +access_fsm_blackout_days_dispatcher,fsm.blackout.day.dispatcher,model_fsm_blackout_day,fieldservice.group_fsm_dispatcher,1,1,0,0 +access_fsm_blackout_days_user,fsm.blackout.day.user,model_fsm_blackout_day,fieldservice.group_fsm_user,1,0,0,0 +access_fsm_blackout_days_user_own,fsm.blackout.day.user.own,model_fsm_blackout_day,fieldservice.group_fsm_user_own,1,0,0,0 +access_fsm_blackout_groups_manager,fsm.blackout.group.manager,model_fsm_blackout_group,fieldservice.group_fsm_manager,1,1,1,1 +access_fsm_blackout_groups_dispatcher,fsm.blackout.group.dispatcher,model_fsm_blackout_group,fieldservice.group_fsm_dispatcher,1,1,0,0 +access_fsm_blackout_groups_user,fsm.blackout.group.user,model_fsm_blackout_group,fieldservice.group_fsm_user,1,0,0,0 +access_fsm_blackout_groups_user_own,fsm.blackout.group.user.own,model_fsm_blackout_group,fieldservice.group_fsm_user_own,1,0,0,0 +access_fsm_stress_days_manager,fsm.stress.day.manager,model_fsm_stress_day,fieldservice.group_fsm_manager,1,1,1,1 +access_fsm_stress_days_dispatcher,fsm.stress.day.dispatcher,model_fsm_stress_day,fieldservice.group_fsm_dispatcher,1,1,0,0 +access_fsm_stress_days_user,fsm.stress.day.user,model_fsm_stress_day,fieldservice.group_fsm_user,1,0,0,0 +access_fsm_stress_days_user_own,fsm.stress.day.user.own,model_fsm_stress_day,fieldservice.group_fsm_user_own,1,0,0,0 +access_fsm_delivery_time_range_manager,fsm.delivery.time.range.manager,model_fsm_delivery_time_range,fieldservice.group_fsm_manager,1,1,1,1 +access_fsm_delivery_time_range_dispatcher,fsm.delivery.time.range.dispatcher,model_fsm_delivery_time_range,fieldservice.group_fsm_dispatcher,1,1,0,0 +access_fsm_delivery_time_range_user,fsm.delivery.time.range.user,model_fsm_delivery_time_range,fieldservice.group_fsm_user,1,0,0,0 +access_fsm_delivery_time_range_user_own,fsm.delivery.time.range.user.own,model_fsm_delivery_time_range,fieldservice.group_fsm_user_own,1,0,0,0 diff --git a/fieldservice_availability/static/description/icon.png b/fieldservice_availability/static/description/icon.png new file mode 100644 index 0000000000..955674d8f0 Binary files /dev/null and b/fieldservice_availability/static/description/icon.png differ diff --git a/fieldservice_availability/static/description/index.html b/fieldservice_availability/static/description/index.html new file mode 100644 index 0000000000..815a11eeb1 --- /dev/null +++ b/fieldservice_availability/static/description/index.html @@ -0,0 +1,478 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Fieldservice Availability

+ +

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runboat

+

This module defines blackout days (non-operational days), stress days +(high-demand periods), and delivery time ranges for field service +operations. It provides the necessary models to store this information, +which can be used by other modules to manage scheduling, availability, +and workload adjustments.

+
    +
  • Blackout Days (`fsm.blackout.day`): Represent dates when field +service operations are unavailable (e.g., holidays, company-wide +closures).
  • +
  • Blackout Groups (`fsm.blackout.group`): Represent groups of days +when field service operations are unavailable (e.g., holidays, +company-wide closures).
  • +
  • Stress Days (`fsm.stress.day`): Indicate dates with increased +service demand (e.g., peak business periods requiring additional +workforce).
  • +
  • Delivery Time Ranges (`fsm.delivery.time.range`): Define +available time slots for scheduling field service operations.
  • +
+

Restricts blackout days for Scheduled Start (ETA) orders with the same +date

+

This is a technical module and does not provide functionality on its +own. Extend this module to integrate availability management into field +service workflows.

+

Table of contents

+ +
+

Usage

+

Navigate to Field Service > Configuration > Availability. Once there, +you can select Delivery Time Ranges, Blackout Days, Blackout Groups or +Stress Days to create new records.

+

Steps to restrict blackout days for Scheduled Start (ETA) orders with +the same date

+
    +
  1. Set up Blackout Days on Configuration > Blackout Groups and create or +edit one with blackout days
  2. +
  3. Go to Field Service > Master Data > Routes > Create or edit route and +assign Blackout Group Days and a Person
  4. +
  5. Create a Field Service order and set up Scheduled Start (ETA) with +date that you put on blackout days and the Odoo will throw an error
  6. +
+
+
+

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

+
    +
  • APSL-Nagarro
  • +
+
+
+

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 maintainer:

+

ppyczko

+

This module is part of the OCA/field-service project on GitHub.

+

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

+
+
+
+
+ + diff --git a/fieldservice_availability/tests/__init__.py b/fieldservice_availability/tests/__init__.py new file mode 100644 index 0000000000..4ab5bcf03b --- /dev/null +++ b/fieldservice_availability/tests/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_fsm_delivery_time_range +from . import test_route_availability diff --git a/fieldservice_availability/tests/test_fsm_delivery_time_range.py b/fieldservice_availability/tests/test_fsm_delivery_time_range.py new file mode 100644 index 0000000000..2c3f9cd238 --- /dev/null +++ b/fieldservice_availability/tests/test_fsm_delivery_time_range.py @@ -0,0 +1,42 @@ +# Copyright 2025 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestFSMDeliveryTimeRange(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.time_range_model = cls.env["fsm.delivery.time.range"] + + def test_create_valid_time_range(self): + time_range = self.time_range_model.create( + { + "start_time": 8.0, + "end_time": 12.0, + } + ) + self.assertEqual(time_range.name, "08:00 - 12:00") + + def test_create_invalid_time_range(self): + with self.assertRaises(ValidationError): + self.time_range_model.create( + { + "start_time": 12.0, + "end_time": 8.0, + } + ) + + def test_sequence_ordering(self): + range1 = self.time_range_model.create( + {"start_time": 8.0, "end_time": 12.0, "sequence": 10} + ) + range2 = self.time_range_model.create( + {"start_time": 13.0, "end_time": 16.0, "sequence": 5} + ) + time_ranges = self.time_range_model.search([], order="sequence, start_time asc") + self.assertEqual(time_ranges[0], range2) + self.assertEqual(time_ranges[1], range1) diff --git a/fieldservice_availability/tests/test_route_availability.py b/fieldservice_availability/tests/test_route_availability.py new file mode 100644 index 0000000000..e35e005bfd --- /dev/null +++ b/fieldservice_availability/tests/test_route_availability.py @@ -0,0 +1,85 @@ +# Copyright 2025 APSL-Nagarro Antoni Marroig +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from datetime import timedelta + +from odoo import fields +from odoo.exceptions import ValidationError + +from odoo.addons.fieldservice.tests.test_fsm_common import FSMCommon + + +class TestRouteAvailability(FSMCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.Order = cls.env["fsm.order"] + cls.blackout_group = cls.env["fsm.blackout.group"].create( + { + "name": "Test Blackout Group", + "fsm_blackout_day_ids": [ + (0, 0, {"name": "Test Blackout Day", "date": fields.Date.today()}) + ], + } + ) + + cls.days = [ + cls.env.ref("fieldservice_route.fsm_route_day_0").id, + cls.env.ref("fieldservice_route.fsm_route_day_1").id, + cls.env.ref("fieldservice_route.fsm_route_day_2").id, + cls.env.ref("fieldservice_route.fsm_route_day_3").id, + cls.env.ref("fieldservice_route.fsm_route_day_4").id, + cls.env.ref("fieldservice_route.fsm_route_day_5").id, + cls.env.ref("fieldservice_route.fsm_route_day_6").id, + ] + cls.fsm_route_id = cls.env["fsm.route"].create( + { + "name": "Demo Route", + "max_order": 10, + "fsm_person_id": cls.test_person.id, + "day_ids": [(6, 0, cls.days)], + } + ) + cls.test_location.fsm_route_id = cls.fsm_route_id.id + cls.fsm_route_id.fsm_blackout_group_ids = [cls.blackout_group.id] + + def test_blackout_day_validation(self): + with self.assertRaisesRegex(ValidationError, r"The date .+ is a blackout day"): + self.Order.create( + { + "location_id": self.test_location.id, + "scheduled_date_start": fields.Datetime.now(), + } + ) + + self.assertTrue( + self.Order.create( + { + "location_id": self.test_location.id, + "scheduled_date_start": fields.Datetime.now() + timedelta(days=1), + } + ) + ) + + def test_blackout_day_with_zip(self): + self.blackout_group.fsm_blackout_day_ids[0].zip = "12345" + self.test_location.zip = "12345" + + with self.assertRaisesRegex(ValidationError, r"The date .+ is a blackout day"): + self.Order.create( + { + "location_id": self.test_location.id, + "scheduled_date_start": fields.Datetime.now(), + } + ) + + self.test_location.zip = "99999" + self.assertTrue( + self.Order.create( + { + "location_id": self.test_location.id, + "scheduled_date_start": fields.Datetime.now(), + } + ) + ) diff --git a/fieldservice_availability/views/fsm_blackout_day_templates.xml b/fieldservice_availability/views/fsm_blackout_day_templates.xml new file mode 100644 index 0000000000..9c8a3f58b1 --- /dev/null +++ b/fieldservice_availability/views/fsm_blackout_day_templates.xml @@ -0,0 +1,86 @@ + + + + + + fsm.blackout.day.tree + fsm.blackout.day + + + + + + + + + + + fsm.blackout.group.tree + fsm.blackout.group + + + + + + + + + fsm.blackout.day.form + fsm.blackout.day + +
+ + + + + + + +
+
+
+ + + fsm.blackout.group.form + fsm.blackout.group + +
+ + + + + + + + + + + + +
+
+
+ + + Blackout Days + fsm.blackout.day + list,form + +

+ Add a Field Service Blackout Day here. +

+
+
+ + + Blackout Groups + fsm.blackout.group + list,form + +

+ Add a Field Service Blackout Group here. +

+
+
+
diff --git a/fieldservice_availability/views/fsm_delivery_time_range_templates.xml b/fieldservice_availability/views/fsm_delivery_time_range_templates.xml new file mode 100644 index 0000000000..99e8873e10 --- /dev/null +++ b/fieldservice_availability/views/fsm_delivery_time_range_templates.xml @@ -0,0 +1,48 @@ + + + + + + fsm.delivery.time.range.tree + fsm.delivery.time.range + + + + + + + + + + + + + fsm.delivery.time.range.form + fsm.delivery.time.range + +
+ + + + + + + + + +
+
+
+ + + Delivery Time Ranges + fsm.delivery.time.range + list,form + +

+ Add a Field Service Delivery Time Range here. +

+
+
+
diff --git a/fieldservice_availability/views/fsm_route.xml b/fieldservice_availability/views/fsm_route.xml new file mode 100644 index 0000000000..fb3c935469 --- /dev/null +++ b/fieldservice_availability/views/fsm_route.xml @@ -0,0 +1,14 @@ + + + + fsm.route.form.inherit + fsm.route + + + + + + + + diff --git a/fieldservice_availability/views/fsm_stress_day_templates.xml b/fieldservice_availability/views/fsm_stress_day_templates.xml new file mode 100644 index 0000000000..f61f8f2218 --- /dev/null +++ b/fieldservice_availability/views/fsm_stress_day_templates.xml @@ -0,0 +1,42 @@ + + + + + + fsm.stress.day.tree + fsm.stress.day + + + + + + + + + + fsm.stress.day.form + fsm.stress.day + +
+ + + + + + +
+
+
+ + + Stress Days + fsm.stress.day + list,form + +

+ Add a Field Service Stress Day here. +

+
+
+
diff --git a/fieldservice_availability/views/menu.xml b/fieldservice_availability/views/menu.xml new file mode 100644 index 0000000000..b10a0c0f88 --- /dev/null +++ b/fieldservice_availability/views/menu.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + +