From 3dad933e6b02243fa3e162d58a5376dbd93be335 Mon Sep 17 00:00:00 2001 From: EdgarRetes Date: Wed, 18 Sep 2024 11:46:01 -0600 Subject: [PATCH 1/4] [ADD] tms --- tms/README.rst | 227 ++++ tms/__init__.py | 1 + tms/__manifest__.py | 45 + tms/data/ir_sequence_data.xml | 9 + tms/data/module_category.xml | 6 + tms/data/tms_stage.xml | 57 + tms/data/tms_team.xml | 7 + tms/data/uom_category.xml | 23 + tms/demo/res_partner.xml | 106 ++ tms/demo/tms_crew.xml | 16 + tms/demo/tms_driver.xml | 53 + tms/demo/tms_order.xml | 31 + tms/demo/tms_route.xml | 20 + tms/demo/tms_team.xml | 24 + tms/i18n/tms.pot | 1691 +++++++++++++++++++++++++++++ tms/models/__init__.py | 10 + tms/models/fleet_vehicle.py | 35 + tms/models/res_config_settings.py | 116 ++ tms/models/res_partner.py | 15 + tms/models/tms_crew.py | 41 + tms/models/tms_driver.py | 114 ++ tms/models/tms_insurance.py | 58 + tms/models/tms_order.py | 347 ++++++ tms/models/tms_route.py | 80 ++ tms/models/tms_stage.py | 109 ++ tms/models/tms_team.py | 128 +++ tms/pyproject.toml | 3 + tms/readme/CONFIGURE.md | 47 + tms/readme/CONTRIBUTORS.md | 13 + tms/readme/CREDITS.md | 1 + tms/readme/DESCRIPTION.md | 4 + tms/readme/MAINTAINERS.md | 13 + tms/readme/USAGE.md | 28 + tms/security/ir.model.access.csv | 15 + tms/security/ir_rule.xml | 31 + tms/security/res_groups.xml | 56 + tms/static/description/icon.png | Bin 0 -> 4277 bytes tms/static/description/icon.svg | 80 ++ tms/static/description/index.html | 581 ++++++++++ tms/tests/__init__.py | 8 + tms/tests/test_fleet_vehicle.py | 55 + tms/tests/test_res_partner.py | 28 + tms/tests/test_tms_crew.py | 112 ++ tms/tests/test_tms_driver.py | 61 ++ tms/tests/test_tms_order.py | 213 ++++ tms/tests/test_tms_route.py | 78 ++ tms/tests/test_tms_stage.py | 78 ++ tms/tests/test_tms_team.py | 109 ++ tms/views/fleet_menu.xml | 9 + tms/views/fleet_vehicle.xml | 50 + tms/views/menu.xml | 239 ++++ tms/views/res_config_settings.xml | 178 +++ tms/views/res_partner.xml | 80 ++ tms/views/tms_crew.xml | 103 ++ tms/views/tms_driver.xml | 217 ++++ tms/views/tms_insurance.xml | 61 ++ tms/views/tms_order.xml | 439 ++++++++ tms/views/tms_route.xml | 135 +++ tms/views/tms_stage.xml | 91 ++ tms/views/tms_team.xml | 162 +++ 60 files changed, 6747 insertions(+) create mode 100644 tms/README.rst create mode 100644 tms/__init__.py create mode 100644 tms/__manifest__.py create mode 100644 tms/data/ir_sequence_data.xml create mode 100644 tms/data/module_category.xml create mode 100644 tms/data/tms_stage.xml create mode 100644 tms/data/tms_team.xml create mode 100644 tms/data/uom_category.xml create mode 100644 tms/demo/res_partner.xml create mode 100644 tms/demo/tms_crew.xml create mode 100644 tms/demo/tms_driver.xml create mode 100644 tms/demo/tms_order.xml create mode 100644 tms/demo/tms_route.xml create mode 100644 tms/demo/tms_team.xml create mode 100644 tms/i18n/tms.pot create mode 100644 tms/models/__init__.py create mode 100644 tms/models/fleet_vehicle.py create mode 100644 tms/models/res_config_settings.py create mode 100644 tms/models/res_partner.py create mode 100644 tms/models/tms_crew.py create mode 100644 tms/models/tms_driver.py create mode 100644 tms/models/tms_insurance.py create mode 100644 tms/models/tms_order.py create mode 100644 tms/models/tms_route.py create mode 100644 tms/models/tms_stage.py create mode 100644 tms/models/tms_team.py create mode 100644 tms/pyproject.toml create mode 100644 tms/readme/CONFIGURE.md create mode 100644 tms/readme/CONTRIBUTORS.md create mode 100644 tms/readme/CREDITS.md create mode 100644 tms/readme/DESCRIPTION.md create mode 100644 tms/readme/MAINTAINERS.md create mode 100644 tms/readme/USAGE.md create mode 100644 tms/security/ir.model.access.csv create mode 100644 tms/security/ir_rule.xml create mode 100644 tms/security/res_groups.xml create mode 100644 tms/static/description/icon.png create mode 100644 tms/static/description/icon.svg create mode 100644 tms/static/description/index.html create mode 100644 tms/tests/__init__.py create mode 100644 tms/tests/test_fleet_vehicle.py create mode 100644 tms/tests/test_res_partner.py create mode 100644 tms/tests/test_tms_crew.py create mode 100644 tms/tests/test_tms_driver.py create mode 100644 tms/tests/test_tms_order.py create mode 100644 tms/tests/test_tms_route.py create mode 100644 tms/tests/test_tms_stage.py create mode 100644 tms/tests/test_tms_team.py create mode 100644 tms/views/fleet_menu.xml create mode 100644 tms/views/fleet_vehicle.xml create mode 100644 tms/views/menu.xml create mode 100644 tms/views/res_config_settings.xml create mode 100644 tms/views/res_partner.xml create mode 100644 tms/views/tms_crew.xml create mode 100644 tms/views/tms_driver.xml create mode 100644 tms/views/tms_insurance.xml create mode 100644 tms/views/tms_order.xml create mode 100644 tms/views/tms_route.xml create mode 100644 tms/views/tms_stage.xml create mode 100644 tms/views/tms_team.xml diff --git a/tms/README.rst b/tms/README.rst new file mode 100644 index 000000000..a5a226f4b --- /dev/null +++ b/tms/README.rst @@ -0,0 +1,227 @@ +========= +Transport +========= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:94e85355354ee78eba36d80fb1eba526641fb73957eb37481c256f6572312983 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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%2Fstock--logistics--transport-lightgray.png?logo=github + :target: https://github.com/OCA/stock-logistics-transport/tree/17.0/tms + :alt: OCA/stock-logistics-transport +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/stock-logistics-transport-17-0/stock-logistics-transport-17-0-tms + :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/stock-logistics-transport&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The Transport Management Systems (TMS) module manages the workflow of +creating transport operations within Odoo. This module provides features +such as creating teams, stages, crews, routes, and vehicles, allowing +businesses to efficiently handle various aspects of their transport +operations. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +TMS module can be used with advanced configuration that enable extra +features complementing the base module. + +Units of Measure +---------------- + +In the base module units of measure (UoM) aren't considered. They have +to be manually enabled in the settings. + +1. Go to TMS > Configuration > Settings > Units +2. Activate the "Units of measure" checkbox and save the changes +3. Now UoM appear in the module in the distance, length, weight and time + fields with a default unit that is computed. +4. To change the default UoM of an specific magnitude, select the + default UoM in its corresponding measurement in the settings. + +Manage teams and crews +---------------------- + +Team management is an advanced feature that can be configured in the TMS +module. They are a predefined group of employees that have predefined +drivers and vehicles. "Mexican Transportation Company", i.e., has the +"Mexico City Team" and "Querétaro Team" with their own vehicles and +drivers. + +1. Go to TMS > Configuration > Settings > Drivers +2. Activate the "Manage Teams" checkbox and save the changes +3. Go to TMS > Configuration > Drivers > Teams +4. A default team is created. Edit this team or create a new one +5. Write the team's name, select the drivers and the vehicles +6. If it's configured, you can also select crews for this team +7. When a trip is created, you can assign the trip to an specific team. + +Crew management is an advanced feature that can be configured in the TMS +module. They are a predefined group of drivers and employees in a +vehicle. An airplane, i.e., has its pilots and crew members that attend +the passengers. + +1. Go to TMS > Configuration > Settings > Drivers +2. Activate the "Manage Crews" checkbox and save the changes +3. Go to TMS > Configuration > Drivers > Crews +4. Create a new crew and assign it a name +5. Select the drivers, the personnel, and a default vehicle that the + crew uses +6. When a trip is created, you can assign the trip to an specific crew + +Routes and stop locations +------------------------- + +Routes can be used to establish predetermined trips from one location to +another. + +1. Go to TMS > Configuration > Settings > Trips +2. Activate the "Routes" checkbox and save the changes +3. Go to Master Data > Routes and create a new route +4. Write the route's name, select the origin location and select the + origin destination +5. Create a new trip and enable the "Use a predefined route" checkbox +6. Select the route you have created for the trip + +When activating routes in the settings, the option for creating stop +locations in routes is enabled. + +1. Go to TMS > Configuration > Settings > Trips +2. Activate the "Stops" checkbox and save the changes +3. Go to Master Data > Routes and create a new route or select and + existing one +4. Enable the "Stop locations" checkbox +5. Write the locations in the "Stop locations" page + +Usage +===== + +Vehicles +-------- + +1. Go to TMS application. +2. Go to Master Data > Vehicles in the menu. +3. Create a new vehicle with the desired model (required). +4. In the TMS page select the operation type (Cargo/Passenger). +5. Type the capacity of the vehicle. + +Drivers +------- + +1. Go to TMS application. +2. Go to Master Data > Drivers in the menu. +3. Create a new driver. + +Locations +--------- + +1. Go to TMS application. +2. Go to Master Data > Locations in the menu. +3. Create a new location. + +Orders +------ + +1. Go to TMS application. +2. Create a new trip from the dashboard. +3. Select a driver, a vehicle, an origin location and a destination + location. +4. In the planning page select the start date, the duration and the + scheduled end. +5. Once confirmed, click 'START' button to start the trip. +6. Once the trip is completed, click 'END' button to end the trip. + +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 +------- + +* Open Source Integrators + +Contributors +------------ + +- Santiago Rodriguez srodriguez@opensourceintegrators.com +- Edgar Martinez emartinez@opensourceintegrators.com +- Maxime Chambreuil mchambreuil@opensourceintegrators.com +- Israel Cruz israel.cruz@argil.mx +- Alan Ramos alan.ramos@jarsa.com.mx +- Luis Triana luis.triana@jarsa.com.mx +- Sarai Osorio sarai.osorio@jarsa.com.mx +- Oscar Garza oscar.garza@jarsa.com.mx +- Hector Camacho hector.camacho@jarsa.com.mx +- Luis Miguel Guzmán miguel.ruiz@jarsa.com.mx +- Isabel Ávila isabel.esparza@jarsa.com.mx +- Erick Reza alexis.reza.s@gmail.com +- Tecnativa: \* Sergio Teruel \* Carlos Dauden + +Other credits +------------- + +- Open Source Integrators https://opensourceintegrators.com + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-max3903| image:: https://github.com/max3903.png?size=40px + :target: https://github.com/max3903 + :alt: max3903 +.. |maintainer-santiagordz| image:: https://github.com/santiagordz.png?size=40px + :target: https://github.com/santiagordz + :alt: santiagordz +.. |maintainer-EdgarRetes| image:: https://github.com/EdgarRetes.png?size=40px + :target: https://github.com/EdgarRetes + :alt: EdgarRetes + +Current `maintainers `__: + +|maintainer-max3903| |maintainer-santiagordz| |maintainer-EdgarRetes| + +This module is part of the `OCA/stock-logistics-transport `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/tms/__init__.py b/tms/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/tms/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/tms/__manifest__.py b/tms/__manifest__.py new file mode 100644 index 000000000..e347fe452 --- /dev/null +++ b/tms/__manifest__.py @@ -0,0 +1,45 @@ +# Copyright (C) 2018 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Transport", + "summary": "Manage Vehicles, Drivers, Routes and Trips", + "version": "17.0.1.0.0", + "license": "AGPL-3", + "category": "TMS", + "author": "Open Source Integrators, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/stock-logistics-transport", + "depends": ["base", "uom", "fleet", "base_geolocalize"], + "data": [ + "data/ir_sequence_data.xml", + "data/module_category.xml", + "data/tms_stage.xml", + "data/tms_team.xml", + "data/uom_category.xml", + "security/res_groups.xml", + "security/ir.model.access.csv", + "security/ir_rule.xml", + "views/res_config_settings.xml", + "views/tms_driver.xml", + "views/res_partner.xml", + "views/fleet_vehicle.xml", + "views/tms_stage.xml", + "views/tms_order.xml", + "views/tms_team.xml", + "views/tms_crew.xml", + "views/tms_insurance.xml", + "views/tms_route.xml", + "views/menu.xml", + "views/fleet_menu.xml", + ], + "demo": [ + "demo/res_partner.xml", + "demo/tms_driver.xml", + "demo/tms_route.xml", + "demo/tms_order.xml", + "demo/tms_crew.xml", + "demo/tms_team.xml", + ], + "application": True, + "development_status": "Alpha", + "maintainers": ["max3903", "santiagordz", "EdgarRetes"], +} diff --git a/tms/data/ir_sequence_data.xml b/tms/data/ir_sequence_data.xml new file mode 100644 index 000000000..be707b3d3 --- /dev/null +++ b/tms/data/ir_sequence_data.xml @@ -0,0 +1,9 @@ + + + TMS Order + tms.order + TMS/ + 5 + + + diff --git a/tms/data/module_category.xml b/tms/data/module_category.xml new file mode 100644 index 000000000..3b9834c18 --- /dev/null +++ b/tms/data/module_category.xml @@ -0,0 +1,6 @@ + + + Transport Management System + 20 + + diff --git a/tms/data/tms_stage.xml b/tms/data/tms_stage.xml new file mode 100644 index 000000000..06d57378e --- /dev/null +++ b/tms/data/tms_stage.xml @@ -0,0 +1,57 @@ + + + + + Draft + 10 + True + order + #ECF0F1 + + + Confirmed + 20 + True + order + #ECF0F1 + + + Completed + 30 + True + order + True + #1C2833 + + + Cancelled + 40 + True + order + True + #1C2833 + + + + + + In Base + 10 + driver + True + #1C2833 + + + In Trip + 20 + driver + #1C2833 + + + Not Available + 30 + driver + #1C2833 + + + diff --git a/tms/data/tms_team.xml b/tms/data/tms_team.xml new file mode 100644 index 000000000..86cf13a98 --- /dev/null +++ b/tms/data/tms_team.xml @@ -0,0 +1,7 @@ + + + + Default Team + + + diff --git a/tms/data/uom_category.xml b/tms/data/uom_category.xml new file mode 100644 index 000000000..618efd3cd --- /dev/null +++ b/tms/data/uom_category.xml @@ -0,0 +1,23 @@ + + + Speed + + + + + km/h + + reference + 1 + 0.01000 + + + + + mph + bigger + + 1.60934 + 0.01000 + + diff --git a/tms/demo/res_partner.xml b/tms/demo/res_partner.xml new file mode 100644 index 000000000..e7632432d --- /dev/null +++ b/tms/demo/res_partner.xml @@ -0,0 +1,106 @@ + + + + + + Auditorio Nacional + True + Av. P.º de la Reforma 50 + Mexico City + + 76100 + + + + + Tec de Monterrey, Campus Monterrey + True + Av. Eugenio Garza Sada 2501 Sur, Tecnológico + Monterrey + + 64849 + + + + + Querétaro Centro de Congresos y Teatro Metropolitano + True + Paseo de las Artes 1531-B + Querétaro + + 76090 + + + + + Los Arcos de Querétaro + True + Av. Constituyentes + Querétaro + + 76000 + + + + + Teatro de la República + True + Calle Venustiano Carranza + Querétaro + + 76000 + + + + + Cerro de las Campanas + True + Av. Constituyentes + Querétaro + + 76000 + + + + + Museo de Arte de Querétaro + True + Allende Sur + Querétaro + + 76000 + + + + + Plaza de Armas + True + Centro Histórico + Querétaro + + 76000 + + + + + The Alamo + True + 300 Alamo Plaza + San Antonio + + 78205 + + + + + Space Center Houston + True + 1601 NASA Parkway + Houston + + 77058 + + + + + diff --git a/tms/demo/tms_crew.xml b/tms/demo/tms_crew.xml new file mode 100644 index 000000000..540452429 --- /dev/null +++ b/tms/demo/tms_crew.xml @@ -0,0 +1,16 @@ + + + + Crew Mexico 1 + + + + + diff --git a/tms/demo/tms_driver.xml b/tms/demo/tms_driver.xml new file mode 100644 index 000000000..bf1f586b2 --- /dev/null +++ b/tms/demo/tms_driver.xml @@ -0,0 +1,53 @@ + + + + + Sergio Perez + terrestrial + + + + Esteban Gutierréz + terrestrial + + + + Luisa Fernandez + terrestrial + + + + James Johnson + terrestrial + + + + Sophie Martinez + terrestrial + + + + Daniel Lee + terrestrial + + + + Emily Garcia + terrestrial + + + + Michael Brown + terrestrial + + + + Isabella Rossi + terrestrial + + + + David Smith + terrestrial + + diff --git a/tms/demo/tms_order.xml b/tms/demo/tms_order.xml new file mode 100644 index 000000000..00da1665d --- /dev/null +++ b/tms/demo/tms_order.xml @@ -0,0 +1,31 @@ + + + + TMS/DEMO1 + False + + + + + + + + TMS/DEMO2 + False + + + + + + + + TMS/DEMO3 + False + + + + + + + + diff --git a/tms/demo/tms_route.xml b/tms/demo/tms_route.xml new file mode 100644 index 000000000..33e507682 --- /dev/null +++ b/tms/demo/tms_route.xml @@ -0,0 +1,20 @@ + + + + US Route + + + + + + QRO Route + True + + + + + + diff --git a/tms/demo/tms_team.xml b/tms/demo/tms_team.xml new file mode 100644 index 000000000..a02bbba52 --- /dev/null +++ b/tms/demo/tms_team.xml @@ -0,0 +1,24 @@ + + + + Team Mexico + + + + + + Team USA + + + + + diff --git a/tms/i18n/tms.pot b/tms/i18n/tms.pot new file mode 100644 index 000000000..fac08930a --- /dev/null +++ b/tms/i18n/tms.pot @@ -0,0 +1,1691 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * tms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.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: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "" +"" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "" +"" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_crew_view_kanban +msgid "Crew" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_kanban +msgid "" +"\n" +" Vehicles: " +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +msgid "" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_kanban +msgid "" +"\n" +" Drivers: " +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +msgid "" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Hours" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "km" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Hours" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form +msgid "Passengers" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "Reporting" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "View" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__a +msgid "A - Motorcycles" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__active +#: model:ir.model.fields,field_description:tms.field_tms_insurance__active +#: model:ir.model.fields,field_description:tms.field_tms_order__active +#: model:ir.model.fields,field_description:tms.field_tms_route__active +#: model:ir.model.fields,field_description:tms.field_tms_stage__active +#: model:ir.model.fields,field_description:tms.field_tms_team__active +#: model:ir.model.fields.selection,name:tms.selection__tms_insurance__state__active +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +msgid "Active" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_ids +msgid "Activities" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_state +msgid "Activity State" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_fleet_activity_types +msgid "Activity Types" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Add a description for the order..." +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_stage_form_view +msgid "Add a description..." +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_admin +msgid "Administrator" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_tms_operation_trip +msgid "All Trips" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Allow the use of predefined routes in trips" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_crew_search +#: model_terms:ir.ui.view,arch_db:tms.view_tms_order_search +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_search +#: model_terms:ir.ui.view,arch_db:tms.view_tms_stage_search +#: model_terms:ir.ui.view,arch_db:tms.view_tms_team_search +msgid "Archived" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__b +msgid "B - Automobiles" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__c +msgid "C - Truck" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__tms_insurance__state__cancelled +msgid "Cancelled" +msgstr "" + +#. module: tms +#. odoo-python +#: code:addons/tms/models/tms_stage.py:0 +#, python-format +msgid "" +"Cannot create TMS Stage because it has the same Type and Sequence of an " +"existing TMS Stage." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_fleet_vehicle__capacity +#: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form +msgid "Capacity" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__fleet_vehicle__operation__cargo +msgid "Cargo" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_fleet_vehicle__cargo_uom_id +msgid "Cargo Uom" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_models_categories +msgid "Categories" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_stage__custom_color +msgid "Color Code" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_team__color +msgid "Color Index" +msgstr "" + +#. module: tms +#. odoo-python +#: code:addons/tms/models/tms_stage.py:0 +#, python-format +msgid "Color code should be Hex Code. Ex:-#FFFFFF" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__company_id +#: model:ir.model.fields,field_description:tms.field_tms_insurance__company_id +#: model:ir.model.fields,field_description:tms.field_tms_order__company_id +#: model:ir.model.fields,field_description:tms.field_tms_stage__company_id +#: model:ir.model.fields,field_description:tms.field_tms_team__company_id +msgid "Company" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_insurance__company_id +msgid "Company related to this insurance" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_crew__company_id +#: model:ir.model.fields,help:tms.field_tms_order__company_id +#: model:ir.model.fields,help:tms.field_tms_team__company_id +msgid "Company related to this order" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.config +msgid "Configuration" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_res_partner +msgid "Contact" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_fleet_contracts +msgid "Contracts" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_fleet_reporting_cost +msgid "Costs" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_insurance_view_form +msgid "Coverage" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_insurance__coverage_details +msgid "Coverage Details" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Create Trip Orders with Sale Orders" +msgstr "" + +#. module: tms +#: model_terms:ir.actions.act_window,help:tms.action_tms_stage +msgid "Create a Stage." +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Create vendor bills and customer invoices when completing trip orders." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__create_uid +#: model:ir.model.fields,field_description:tms.field_tms_insurance__create_uid +#: model:ir.model.fields,field_description:tms.field_tms_order__create_uid +#: model:ir.model.fields,field_description:tms.field_tms_route__create_uid +#: model:ir.model.fields,field_description:tms.field_tms_stage__create_uid +#: model:ir.model.fields,field_description:tms.field_tms_team__create_uid +msgid "Created by" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__create_date +#: model:ir.model.fields,field_description:tms.field_tms_insurance__create_date +#: model:ir.model.fields,field_description:tms.field_tms_order__create_date +#: model:ir.model.fields,field_description:tms.field_tms_route__create_date +#: model:ir.model.fields,field_description:tms.field_tms_stage__create_date +#: model:ir.model.fields,field_description:tms.field_tms_team__create_date +msgid "Created on" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__crew_id +#: model:ir.model.fields,field_description:tms.field_tms_team__crew_ids +msgid "Crew" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__crew_active +msgid "Crew Active" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__crew_ids_domain +msgid "Crew Ids Domain" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_crew_view_form +msgid "Crew Name" +msgstr "" + +#. module: tms +#: model:ir.model.constraint,message:tms.constraint_tms_crew_name_uniq +msgid "Crew name already exists!" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_config_crew +#: model:ir.actions.act_window,name:tms.action_tms_dash_crew +#: model:ir.model.fields,field_description:tms.field_res_partner__crew_ids +#: model:ir.model.fields,field_description:tms.field_res_users__crew_ids +#: model:ir.ui.menu,name:tms.menu_tms_config_crew +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_form +msgid "Crews" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +msgid "Crews:" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__d +msgid "D - Bus" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.dashboard +msgid "Dashboard" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__date_end +msgid "Date End" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__date_start +msgid "Date Start" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Days before expiration" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Default Distance UoM" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Default Length UoM" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Default Speed UoM" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Default Time UoM" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__default_vehicle_id +msgid "Default Vehicle" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Default Weight UoM" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_stage__is_completed +msgid "Defines how this stage is evaluated as completed stage" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__description +#: model:ir.model.fields,field_description:tms.field_tms_order__description +#: model:ir.model.fields,field_description:tms.field_tms_stage__description +#: model:ir.model.fields,field_description:tms.field_tms_team__description +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Description" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__destination_id +#: model:ir.model.fields,field_description:tms.field_tms_order__destination_location +msgid "Destination" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__destination_location_id +msgid "Destination Location" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__display_name +#: model:ir.model.fields,field_description:tms.field_tms_insurance__display_name +#: model:ir.model.fields,field_description:tms.field_tms_order__display_name +#: model:ir.model.fields,field_description:tms.field_tms_order__route_destination +#: model:ir.model.fields,field_description:tms.field_tms_order__route_origin +#: model:ir.model.fields,field_description:tms.field_tms_route__display_name +#: model:ir.model.fields,field_description:tms.field_tms_stage__display_name +#: model:ir.model.fields,field_description:tms.field_tms_team__display_name +msgid "Display Name" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__distance +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Distance" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__distance_traveled +#: model:ir.model.fields,field_description:tms.field_res_users__distance_traveled +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "Distance Traveled" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__distance_traveled_uom +#: model:ir.model.fields,field_description:tms.field_res_users__distance_traveled_uom +msgid "Distance Traveled Uom" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__distance_uom +msgid "Distance Uom" +msgstr "" + +#. module: tms +#. odoo-python +#: code:addons/tms/models/tms_insurance.py:0 +#: model:ir.model.fields.selection,name:tms.selection__tms_insurance__state__draft +#, python-format +msgid "Draft" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__driver_id +#: model:ir.model.fields,field_description:tms.field_tms_team__driver_ids +#: model:ir.model.fields.selection,name:tms.selection__res_partner__tms_type__driver +#: model:ir.model.fields.selection,name:tms.selection__tms_stage__stage_type__driver +#: model:res.groups,name:tms.group_tms_driver +msgid "Driver" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "Driver Experience" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__driver_ids_domain +msgid "Driver Ids Domain" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_expiration_date +#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_expiration_date +msgid "Driver License Expiration Date" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_file +#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_file +msgid "Driver License File" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_number +#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_number +msgid "Driver License Number" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "Driver Status" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "Driver Type" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__driver_license_security_days +msgid "Driver license security days" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_config_stage_driver +#: model:ir.actions.act_window,name:tms.action_tms_driver +#: model:ir.model.fields,field_description:tms.field_tms_crew__driver_ids +#: model:ir.ui.menu,name:tms.menu_tms_config_driver +#: model:ir.ui.menu,name:tms.menu_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_form +msgid "Drivers" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_team__driver_count +msgid "Drivers Count" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__driving_experience_years +#: model:ir.model.fields,field_description:tms.field_res_users__driving_experience_years +msgid "Driving Experience Years" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Duration" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Enable the creation of stops in a route" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_tree +msgid "End" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_insurance__end_date +msgid "End Date" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__end_trip +msgid "End Trip" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__estimated_time +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Estimated Time" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__estimated_time_uom +msgid "Estimated Time Uom" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__tms_insurance__state__expired +msgid "Expired" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_stage__legend_priority +msgid "" +"Explanation text to help users using the star and priority mechanism on " +"stages or orders that are in this stage." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__is_external +#: model:ir.model.fields,field_description:tms.field_res_users__is_external +msgid "External Driver" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_models +msgid "Fleet Models" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_services +msgid "Fleet Services" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_vehicles +msgid "Fleet Vehicles" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_stage__fold +msgid "Folded in Kanban" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__has_message +msgid "Has Message" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__id +#: model:ir.model.fields,field_description:tms.field_tms_insurance__id +#: model:ir.model.fields,field_description:tms.field_tms_order__id +#: model:ir.model.fields,field_description:tms.field_tms_route__id +#: model:ir.model.fields,field_description:tms.field_tms_stage__id +#: model:ir.model.fields,field_description:tms.field_tms_team__id +msgid "ID" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__is_training +#: model:ir.model.fields,field_description:tms.field_res_users__is_training +msgid "In Training" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +msgid "Inactive" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_insurance_view_form +msgid "Information" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_fleet_vehicle__insurance_id +#: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form +msgid "Insurance" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_insurance +#: model:ir.ui.menu,name:tms.menu_tms_insurance +msgid "Insurance Policies" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form +msgid "Insurance Policy" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_insurance__insurer_id +msgid "Insurer" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__is_active +#: model:ir.model.fields,field_description:tms.field_res_users__is_active +msgid "Is Active" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_stage__is_completed +msgid "Is Completed" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_stage__is_default +msgid "Is Default" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__write_uid +#: model:ir.model.fields,field_description:tms.field_tms_insurance__write_uid +#: model:ir.model.fields,field_description:tms.field_tms_order__write_uid +#: model:ir.model.fields,field_description:tms.field_tms_route__write_uid +#: model:ir.model.fields,field_description:tms.field_tms_stage__write_uid +#: model:ir.model.fields,field_description:tms.field_tms_team__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__write_date +#: model:ir.model.fields,field_description:tms.field_tms_insurance__write_date +#: model:ir.model.fields,field_description:tms.field_tms_order__write_date +#: model:ir.model.fields,field_description:tms.field_tms_route__write_date +#: model:ir.model.fields,field_description:tms.field_tms_stage__write_date +#: model:ir.model.fields,field_description:tms.field_tms_team__write_date +msgid "Last Updated on" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "Licence Expiration Date" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "Licence No." +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "Licence Type" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +msgid "License File" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_type +#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_type +msgid "License type" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__tms_type__location +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_tree_tms_location +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Location" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__location_type +#: model:ir.model.fields,field_description:tms.field_res_users__location_type +msgid "Location Type" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_location +#: model:ir.ui.menu,name:tms.menu_tms_location +msgid "Locations" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__group_tms_crew +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage Crews" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__group_tms_driver_license +msgid "Manage Driver License" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage Driver License Expiration" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage Driver License Expiration Date Before A Trip" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__group_tms_route_stop +msgid "Manage Route Stops" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__group_tms_route +msgid "Manage Routes" +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_crew +msgid "Manage TMS Crew" +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_driver_license +msgid "Manage TMS Driver License" +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_route_stop +msgid "Manage TMS Route Stops" +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_route +msgid "Manage TMS Routes" +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_team +msgid "Manage TMS Teams" +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_vehicle_insurance +msgid "Manage TMS Vehicle Insurance" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__group_tms_team +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage Teams" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage Trips Accounting" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__group_tms_vehicle_insurance +msgid "Manage Vehicle Insurance" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage Vehicle Insurance Expiration" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage Vehicle Insurance Expiration Date Before A Trip" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage crews that share the same vehicle" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage depreciations" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage expenses of a trip: hotel, tolls, fuel" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage pre-defined routes" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage purchase requests for drivers and other suppliers" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage teams that share the same process/stages" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__module_tms_expense +msgid "Manage trip expenses" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__module_tms_account +msgid "Manage trip invoicing" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__module_tms_purchase +msgid "Manage trip purchases" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__module_tms_sale +msgid "Manage trip sales" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__module_tms_account_asset +msgid "Manage vehicle as accounting assets" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Manage vehicles as accounting assets" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_models_Manufacturers +msgid "Manufacturers" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.data +msgid "Master Data" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_ids +msgid "Messages" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_models_models +msgid "Models" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__name +#: model:ir.model.fields,field_description:tms.field_tms_insurance__name +#: model:ir.model.fields,field_description:tms.field_tms_order__name +#: model:ir.model.fields,field_description:tms.field_tms_stage__name +#: model:ir.model.fields,field_description:tms.field_tms_team__name +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_tree_tms_driver +msgid "Name" +msgstr "" + +#. module: tms +#. odoo-python +#: code:addons/tms/models/tms_order.py:0 +#: code:addons/tms/tests/test_tms_order.py:0 +#: code:addons/tms/tests/test_tms_order.py:0 +#: code:addons/tms/tests/test_tms_order.py:0 +#: code:addons/tms/tests/test_tms_order.py:0 +#, python-format +msgid "New" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Notes" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__notes +msgid "Notes/Comments" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_team__trips_todo_count +msgid "Number of Trips" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_fleet_odometers +msgid "Odometers" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_fleet_vehicle__operation +#: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form +msgid "Operation" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.operations +msgid "Operations" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_team__order_ids +msgid "Orders" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_team__order_count +msgid "Orders Count" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__origin_id +#: model:ir.model.fields,field_description:tms.field_tms_order__origin_location +msgid "Origin" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__origin_location_id +msgid "Origin Location" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_crew__personnel_ids +msgid "Other Personnel" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__fleet_vehicle__operation__passenger +msgid "Passenger" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_crew_view_form +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_form +msgid "Personnel" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Planning" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_insurance__policy_number +msgid "Policy Number" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_insurance__premium_amount +msgid "Premium Amount" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_stage__legend_priority +msgid "Priority Management Explanation" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Refresh" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.reporting +msgid "Reporting" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__route_id +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Route" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Route Details" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__name +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Route Name" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_route +#: model:ir.ui.menu,name:tms.menu_tms_route +msgid "Routes" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__scheduled_duration +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Scheduled Duration" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__diff_duration +msgid "Scheduled Duration - Actual Duration" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__scheduled_date_end +msgid "Scheduled End" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__scheduled_date_start +msgid "Scheduled Start" +msgstr "" + +#. module: tms +#: model:ir.model.constraint,message:tms.constraint_tms_order_duration_ge_zero +msgid "Scheduled duration must be greater than or equal to zero!" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__scheduled_duration +msgid "Scheduled duration of the work in hours" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Sell trips or tickets" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__sequence +#: model:ir.model.fields,field_description:tms.field_tms_stage__sequence +#: model:ir.model.fields,field_description:tms.field_tms_team__sequence +msgid "Sequence" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_fleet_services +msgid "Services" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "" +"Set the number of days before the expiration date of the driver license to show a\n" +" warning." +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "" +"Set the number of days before the expiration date of the vehicle insurance to show a\n" +" warning." +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_config +#: model:ir.ui.menu,name:tms.settings +msgid "Settings" +msgstr "" + +#. module: tms +#: model:uom.category,name:tms.uom_category_speed +msgid "Speed" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__stage_id +#: model:ir.model.fields,field_description:tms.field_res_users__stage_id +#: model:ir.model.fields,field_description:tms.field_tms_order__stage_id +#: model_terms:ir.ui.view,arch_db:tms.tms_stage_form_view +#: model_terms:ir.ui.view,arch_db:tms.view_tms_order_search +msgid "Stage" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_stage_form_view +msgid "Stage Description" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_config_stage_travel +#: model:ir.actions.act_window,name:tms.action_tms_stage +#: model:ir.model.fields,field_description:tms.field_tms_team__stage_ids +#: model:ir.ui.menu,name:tms.menu_tms_config_stage +msgid "Stages" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_tree +msgid "Start" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_insurance__start_date +msgid "Start Date" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__start_trip +msgid "Start Trip" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_insurance__state +msgid "State" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_vehicles_status +msgid "Status" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__stop_location_ids +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "Stop Locations" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Stops" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_route__stop_locations +msgid "Stops locations in route" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_kanban +msgid "TRIPS" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_vehicles_tags +msgid "Tags" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban +msgid "Tasks Analysis" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__tms_team_id +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_order_search +msgid "Team" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_form +msgid "Team Name" +msgstr "" + +#. module: tms +#: model:ir.model.constraint,message:tms.constraint_tms_team_name_uniq +msgid "Team name already exists!" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_config_team +#: model:ir.actions.act_window,name:tms.action_tms_dash_team +#: model:ir.model.fields,field_description:tms.field_tms_stage__tms_team_ids +#: model:ir.ui.menu,name:tms.menu_tms_config_team +#: model:ir.ui.menu,name:tms.menu_tms_dash_team +msgid "Teams" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_type__terrestrial +#: model:ir.model.fields.selection,name:tms.selection__res_partner__location_type__terrestrial +msgid "Terrestrial" +msgstr "" + +#. module: tms +#: model:ir.model.constraint,message:tms.constraint_tms_insurance_unique_policy_number_per_insurer +msgid "The policy number must be unique for each insurer!" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_stage__fold +msgid "" +"This stage is folded in the kanban view when there are no record in that " +"stage to display." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__time_uom +msgid "Time Uom" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__tms_distance_uom +msgid "Tms Distance Uom" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__tms_length_uom +msgid "Tms Length Uom" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__tms_speed_uom +msgid "Tms Speed Uom" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_fleet_vehicle__tms_team_id +#: model:ir.model.fields,field_description:tms.field_res_partner__tms_team_id +#: model:ir.model.fields,field_description:tms.field_res_users__tms_team_id +#: model:ir.model.fields,field_description:tms.field_tms_crew__tms_team_id +msgid "Tms Team" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__tms_time_uom +msgid "Tms Time Uom" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__tms_weight_uom +msgid "Tms Weight Uom" +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.root +#: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms +msgid "Transport" +msgstr "" + +#. module: tms +#: model:ir.module.category,name:tms.tms +msgid "Transport Management System" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_tms_crew +msgid "Transport Management System Crew" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_tms_order +msgid "Transport Management System Order" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_tms_route +msgid "Transport Management System Route" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_tms_stage +msgid "Transport Management System Stage" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_tms_team +msgid "Transport Management System Team" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__tms_stage__stage_type__order +msgid "Trip" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__duration +msgid "Trip Duration" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Trip Name" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_report_view_graph +msgid "Trip Reports" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form +msgid "Trip Tracking" +msgstr "" + +#. module: tms +#: model:ir.model.constraint,message:tms.constraint_tms_order_name_uniq +msgid "Trip name already exists!" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_dash_order +#: model:ir.actions.act_window,name:tms.action_tms_operation_trip +#: model:ir.actions.act_window,name:tms.action_tms_report_order +#: model:ir.model.fields,field_description:tms.field_res_partner__trips_ids +#: model:ir.model.fields,field_description:tms.field_res_users__trips_ids +#: model:ir.ui.menu,name:tms.menu_tms_dash_order +#: model:ir.ui.menu,name:tms.menu_tms_report_trip +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:tms.tms_crew_view_kanban +#: model_terms:ir.ui.view,arch_db:tms.tms_order_view_pivot +msgid "Trips" +msgstr "" + +#. module: tms +#: model:ir.actions.act_window,name:tms.action_tms_order_kanban +msgid "Trips Kanban" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__driver_type +#: model:ir.model.fields,field_description:tms.field_res_partner__tms_type +#: model:ir.model.fields,field_description:tms.field_res_users__driver_type +#: model:ir.model.fields,field_description:tms.field_res_users__tms_type +#: model:ir.model.fields,field_description:tms.field_tms_stage__stage_type +#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_stage_search +msgid "Type" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_order__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: tms +#: model:ir.ui.menu,name:tms.menu_config_fleet_services_types +msgid "Types" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Units" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Units Of Measure" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__group_tms_uom +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "Units of Measure" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form +msgid "UoM" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_stage__custom_color +msgid "Use Hex Code only Ex:-#FFFFFF" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__route +msgid "Use predefined route" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_stage__sequence +msgid "Used to order stages. Lower is first." +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_team__sequence +msgid "Used to sort teams. Lower is better." +msgstr "" + +#. module: tms +#: model:res.groups,name:tms.group_tms_user +msgid "User" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_fleet_vehicle +#: model:ir.model.fields,field_description:tms.field_tms_insurance__vehicle_ids +#: model:ir.model.fields,field_description:tms.field_tms_order__vehicle_id +#: model:ir.model.fields,field_description:tms.field_tms_team__vehicle_ids +#: model_terms:ir.ui.view,arch_db:tms.tms_crew_view_form +msgid "Vehicle" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_order__vehicle_ids_domain +msgid "Vehicle Ids Domain" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_config_settings__vehicle_insurance_security_days +msgid "Vehicle Insurance security days" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__vehicles_ids +#: model:ir.model.fields,field_description:tms.field_res_users__vehicles_ids +#: model:ir.ui.menu,name:tms.menu_fleet_vehicle +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:tms.tms_insurance_view_form +#: model_terms:ir.ui.view,arch_db:tms.tms_team_view_form +msgid "Vehicles" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_team__vehicle_count +msgid "Vehicles Count" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.tms_stage_form_view +msgid "" +"You can add a description to help your coworkers\n" +" understand the meaning and purpose of the stage." +msgstr "" + +#. module: tms +#. odoo-python +#: code:addons/tms/models/tms_stage.py:0 +#, python-format +msgid "You cannot delete default stages." +msgstr "" + +#. module: tms +#. odoo-python +#: code:addons/tms/models/tms_order.py:0 +#, python-format +msgid "You must create an TMS order stage first." +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "e.g. Hours" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "e.g. kg" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "e.g. km" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "e.g. km/h" +msgstr "" + +#. module: tms +#: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form +msgid "e.g. m" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__distance_traveled_uom__km +msgid "km" +msgstr "" + +#. module: tms +#: model:uom.uom,name:tms.uom_kmh +msgid "km/h" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__res_partner__distance_traveled_uom__mi +msgid "mi" +msgstr "" + +#. module: tms +#: model:uom.uom,name:tms.uom_mph +msgid "mph" +msgstr "" + +#. module: tms +#: model:ir.model,name:tms.model_tms_insurance +msgid "tms.insurance" +msgstr "" diff --git a/tms/models/__init__.py b/tms/models/__init__.py new file mode 100644 index 000000000..f2884f383 --- /dev/null +++ b/tms/models/__init__.py @@ -0,0 +1,10 @@ +from . import res_config_settings +from . import tms_stage +from . import tms_insurance +from . import tms_driver +from . import res_partner +from . import tms_crew +from . import tms_order +from . import tms_route +from . import tms_team +from . import fleet_vehicle diff --git a/tms/models/fleet_vehicle.py b/tms/models/fleet_vehicle.py new file mode 100644 index 000000000..4f89ab4ad --- /dev/null +++ b/tms/models/fleet_vehicle.py @@ -0,0 +1,35 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FleetVehicle(models.Model): + _inherit = "fleet.vehicle" + + tms_team_id = fields.Many2one("tms.team") + + tms_driver_id = fields.Many2one("tms.driver", string="Driver") + + # Operation + operation = fields.Selection([("cargo", "Cargo"), ("passenger", "Passenger")]) + + capacity = fields.Float() + cargo_uom_id = fields.Many2one( + "uom.uom", + domain="[('category_id', '=', 'Volume')]", + default=lambda self: self._default_volume_uom_id(), + ) + + # Insurance + insurance_id = fields.Many2many("tms.insurance") + + def _default_volume_uom_id(self): + default_volume_uom_id = ( + self.env["ir.config_parameter"].sudo().get_param("tms.default_weight_uom") + ) + + if default_volume_uom_id: + return self.env["uom.uom"].browse(int(default_volume_uom_id)) + else: + return self.env.ref("uom.product_uom_cubic_meter", raise_if_not_found=False) diff --git a/tms/models/res_config_settings.py b/tms/models/res_config_settings.py new file mode 100644 index 000000000..1dbfb36f2 --- /dev/null +++ b/tms/models/res_config_settings.py @@ -0,0 +1,116 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + # Groups + + group_tms_team = fields.Boolean( + string="Manage Teams", implied_group="tms.group_tms_team" + ) + group_tms_crew = fields.Boolean( + string="Manage Crews", implied_group="tms.group_tms_crew" + ) + group_tms_driver_license = fields.Boolean( + string="Manage Driver License", implied_group="tms.group_tms_driver_license" + ) + + group_tms_vehicle_insurance = fields.Boolean( + string="Manage Vehicle Insurance", + implied_group="tms.group_tms_vehicle_insurance", + ) + + group_tms_route = fields.Boolean( + string="Manage Routes", implied_group="tms.group_tms_route" + ) + + group_tms_route_stop = fields.Boolean( + string="Manage Route Stops", implied_group="tms.group_tms_route_stop" + ) + + group_tms_uom = fields.Boolean( + string="Units of Measure", implied_group="uom.group_uom" + ) + + # Custom Fields + + driver_license_security_days = fields.Integer( + required=True, + string="Driver license security days", + config_parameter="tms.default_driver_license_security_days", + ) + + vehicle_insurance_security_days = fields.Integer( + required=True, + string="Vehicle Insurance security days", + config_parameter="tms.default_vehicle_insurance_security_days", + ) + + @api.model + def _length_domain(self): + return [("category_id.id", "=", self.env.ref("uom.uom_categ_length").id)] + + tms_length_uom = fields.Many2one( + "uom.uom", + domain=_length_domain, + default_model="res.config.settings", + config_parameter="tms.default_length_uom", + default=lambda self: self.env.ref("uom.product_uom_meter").id, + ) + + tms_distance_uom = fields.Many2one( + "uom.uom", + domain=_length_domain, + default_model="res.config.settings", + config_parameter="tms.default_distance_uom", + default=lambda self: self.env.ref("uom.product_uom_km").id, + ) + + @api.model + def _weight_domain(self): + return [("category_id.id", "=", self.env.ref("uom.product_uom_categ_kgm").id)] + + tms_weight_uom = fields.Many2one( + "uom.uom", + domain=_weight_domain, + default_model="res.config.settings", + config_parameter="tms.default_weight_uom", + default=lambda self: self.env.ref("uom.product_uom_kgm").id, + ) + + @api.model + def _speed_domain(self): + return [("category_id.id", "=", self.env.ref("tms.uom_category_speed").id)] + + tms_speed_uom = fields.Many2one( + "uom.uom", + domain=_speed_domain, + default_model="res.config.settings", + config_parameter="tms.default_speed_uom", + default=lambda self: self.env.ref("tms.uom_kmh").id, + ) + + @api.model + def _time_domain(self): + return [("category_id.id", "=", self.env.ref("uom.uom_categ_wtime").id)] + + tms_time_uom = fields.Many2one( + "uom.uom", + domain=_time_domain, + default_model="res.config.settings", + config_parameter="tms.default_time_uom", + default=lambda self: self.env.ref("uom.product_uom_hour").id, + ) + + # Modules + module_tms_purchase = fields.Boolean(string="Manage trip purchases") + module_tms_sale = fields.Boolean(string="Manage trip sales") + module_tms_account = fields.Boolean(string="Manage trip invoicing") + module_tms_account_asset = fields.Boolean( + string="Manage vehicle as accounting assets" + ) + module_tms_expense = fields.Boolean(string="Manage trip expenses") diff --git a/tms/models/res_partner.py b/tms/models/res_partner.py new file mode 100644 index 000000000..2d74f4dfd --- /dev/null +++ b/tms/models/res_partner.py @@ -0,0 +1,15 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + +LOCATION_TYPES = [("terrestrial", "Terrestrial")] + + +class ResPartner(models.Model): + _inherit = "res.partner" + # # TMS Type + tms_location = fields.Boolean(string="Transport location") + + # Location - Types + location_type = fields.Selection(selection=LOCATION_TYPES) diff --git a/tms/models/tms_crew.py b/tms/models/tms_crew.py new file mode 100644 index 000000000..0dfb02a85 --- /dev/null +++ b/tms/models/tms_crew.py @@ -0,0 +1,41 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class TMSCrew(models.Model): + _name = "tms.crew" + _description = "Transport Management System Crew" + + # _inherit = ["mail.thread", "mail.activity.mixin"] + + active = fields.Boolean(default=True) + name = fields.Char(required=True) + description = fields.Text() + + driver_ids = fields.Many2many( + "tms.driver", + "tms_crew_drivers_rel", + string="Drivers", + required=True, + ) + personnel_ids = fields.Many2many( + "res.partner", + "tms_crew_personnel_rel", + string="Other Personnel", + ) + default_vehicle_id = fields.Many2one("fleet.vehicle", string="Default Vehicle") + + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + index=True, + default=lambda self: self.env.company, + help="Company related to this order", + ) + + tms_team_id = fields.Many2one("tms.team") + + _sql_constraints = [("name_uniq", "unique (name)", "Crew name already exists!")] diff --git a/tms/models/tms_driver.py b/tms/models/tms_driver.py new file mode 100644 index 000000000..fe9f0c3bb --- /dev/null +++ b/tms/models/tms_driver.py @@ -0,0 +1,114 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + +DRIVER_LICENSE_TYPES = [ + ("A", "A - Motorcycles"), + ("B", "B - Automobiles"), + ("C", "C - Truck"), + ("D", "D - Bus"), +] +LOCATION_TYPES = [("terrestrial", "Terrestrial")] + + +class TmsDriver(models.Model): + _name = "tms.driver" + _inherit = ["mail.thread"] + _inherits = {"res.partner": "partner_id"} + + partner_id = fields.Many2one("res.partner", required=True, ondelete="cascade") + + # ------------------------------ + # Driver + # ------------------------------ + + # Driver - Flags + is_external = fields.Boolean(string="External Driver") + is_training = fields.Boolean(string="In Training") + is_active = fields.Boolean(default=True) + + # Driver - Relations + vehicles_ids = fields.One2many("fleet.vehicle", "driver_id") + trips_ids = fields.One2many("tms.order", "driver_id") + + tms_team_id = fields.Many2one("tms.team") + crew_ids = fields.Many2many( + "tms.crew", + "tms_crew_drivers_rel", + string="Crews", + ) + stage_id = fields.Many2one( + "tms.stage", + string="Stage", + index=True, + copy=False, + default=lambda self: self._default_stage_id(), + group_expand="_read_group_stage_ids", + ) + + # Driver - Type + driver_type = fields.Selection( + string="Type", selection=[("terrestrial", "Terrestrial")] + ) + + # ------------------------------ + # Driver - Terrestrial + # ------------------------------ + + # TODO: ADD A LICENCE MODEL + # Terrestrial - Licenses + driver_license_number = fields.Char() + driver_license_type = fields.Selection( + string="License type", selection=DRIVER_LICENSE_TYPES + ) + driver_license_expiration_date = fields.Date() + driver_license_file = fields.Binary() + + # Terrestrial - Experience + distance_traveled = fields.Integer() + distance_traveled_uom = fields.Selection( + selection=[("km", "km"), ("mi", "mi")], default="km" + ) + driving_experience_years = fields.Integer() + + @api.model + def _read_group_stage_ids(self, stages, domain, order): + return self.env["tms.stage"].search( + [("stage_type", "=", "driver")], order=order + ) + + def _default_stage_id(self): + stage = self.env["tms.stage"].search( + [("stage_type", "=", "driver")], + order="sequence asc", + limit=1, + ) + if stage: + return stage.id + + # Inherited actions from res_partner + + def create_company(self): + res = super().create_company() + return res + + def action_open_employees(self): + res = super().action_open_employees() + return res + + def open_commercial_entity(self): + res = super().open_commercial_entity() + return res + + def phone_action_blacklist_remove(self): + res = super().phone_action_blacklist_remove() + return res + + def mail_action_blacklist_remove(self): + res = super().mail_action_blacklist_remove() + return res + + def geo_localize(self): + res = super().geo_localize() + return res diff --git a/tms/models/tms_insurance.py b/tms/models/tms_insurance.py new file mode 100644 index 000000000..fc52c28cc --- /dev/null +++ b/tms/models/tms_insurance.py @@ -0,0 +1,58 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import _, api, fields, models + + +class TMSInsurance(models.Model): + _name = "tms.insurance" + + active = fields.Boolean(default=True) + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + default=lambda self: self.env.company, + help="Company related to this insurance", + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("active", "Active"), + ("expired", "Expired"), + ("cancelled", "Cancelled"), + ] + ) + + name = fields.Char( + required=True, + copy=False, + readonly=True, + default=lambda self: _("Draft"), + compute="_compute_name", + store=True, + ) + policy_number = fields.Char(required=True) + insurer_id = fields.Many2one("res.partner", required=True) + start_date = fields.Date() + end_date = fields.Date(required=True) + premium_amount = fields.Float() + coverage_details = fields.Text() + + vehicle_ids = fields.Many2many("fleet.vehicle") + + _sql_constraints = [ + ( + "unique_policy_number_per_insurer", + "UNIQUE(policy_number, insurer_id)", + "The policy number must be unique for each insurer!", + ) + ] + + @api.depends("insurer_id", "policy_number") + def _compute_name(self): + for record in self: + if record.insurer_id and record.policy_number: + insurer_name = record.insurer_id.name if record.insurer_id else "" + record.name = f"{insurer_name}/{record.policy_number}" diff --git a/tms/models/tms_order.py b/tms/models/tms_order.py new file mode 100644 index 000000000..ec79abbc2 --- /dev/null +++ b/tms/models/tms_order.py @@ -0,0 +1,347 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime, timedelta + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError + + +class TMSOrder(models.Model): + _name = "tms.order" + _description = "Transport Management System Order" + _inherit = ["mail.thread", "mail.activity.mixin"] + + active = fields.Boolean(default=True) + + name = fields.Char( + required=True, + copy=False, + readonly=False, + index="trigram", + default=lambda self: _("New"), + ) + + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + index=True, + default=lambda self: self.env.company, + help="Company related to this order", + ) + + description = fields.Text() + sequence = fields.Integer(default=10) + + route = fields.Boolean(string="Use predefined route") + route_id = fields.Many2one( + "tms.route", compute="_compute_route_id", store=True, readonly=False + ) + route_origin = fields.Char(related="route_id.origin_location_id.display_name") + route_destination = fields.Char( + related="route_id.destination_location_id.display_name" + ) + + origin_id = fields.Many2one( + "res.partner", + domain="[('tms_location', '=', 'True')]", + context={"default_tms_location": True}, + compute="_compute_route_id", + store=True, + readonly=False, + ) + destination_id = fields.Many2one( + "res.partner", + domain="[('tms_location', '=', 'True')]", + context={"default_tms_location": True}, + compute="_compute_route_id", + store=True, + readonly=False, + ) + + origin_location = fields.Char(string="Origin") + destination_location = fields.Char(string="Destination") + + driver_id = fields.Many2one( + "tms.driver", + string="Driver", + compute="_compute_vehicle_id_set_driver", + store=True, + readonly=False, + ) + vehicle_id = fields.Many2one("fleet.vehicle", string="Vehicle") + tms_team_id = fields.Many2one("tms.team", string="Team") + crew_id = fields.Many2one("tms.crew", string="Crew") + + stage_id = fields.Many2one( + "tms.stage", + string="Stage", + index=True, + copy=False, + domain="[('stage_type', '=', 'order')]", + default=lambda self: self._default_stage_id(), + group_expand="_read_group_stage_ids", + ondelete="set null", + ) + + scheduled_date_start = fields.Datetime( + string="Scheduled Start", default=datetime.now() + ) + scheduled_duration = fields.Float( + help="Scheduled duration of the work in" " hours", + compute="_compute_scheduled_duration", + store=True, + readonly=False, + ) + scheduled_date_end = fields.Datetime( + string="Scheduled End", + compute="_compute_scheduled_date_end", + store=True, + readonly=False, + ) + + start_trip = fields.Boolean(readonly=True) + end_trip = fields.Boolean(readonly=True) + date_start = fields.Datetime() + date_end = fields.Datetime(compute="_compute_date_end", store=True, readonly=False) + duration = fields.Float( + string="Trip Duration", compute="_compute_duration", store=True, readonly=False + ) + + diff_duration = fields.Float( + readonly=True, string="Scheduled Duration - Actual Duration" + ) + + time_uom = fields.Many2one( + "uom.uom", + domain="[('category_id', '=', 'Working Time')]", + default=lambda self: self._default_time_uom_id(), + ) + + def _default_time_uom_id(self): + # Fetch the value of default_time_uom from settings + default_time_uom_id = ( + self.env["ir.config_parameter"].sudo().get_param("tms.default_time_uom") + ) + + # Return the actual record based on the ID retrieved from settings + if default_time_uom_id: + return self.env["uom.uom"].browse(int(default_time_uom_id)) + else: + # If no default_time_uom is set, return None or a default value + return self.env.ref("uom.product_uom_hour", raise_if_not_found=False) + + def _default_stage_id(self): + stage = self.env["tms.stage"].search( + [ + ("stage_type", "=", "order"), + ], + order="sequence asc", + limit=1, + ) + if stage: + return stage + raise ValidationError(_("You must create an TMS order stage first.")) + + @api.depends("route") + def _compute_route_id(self): + for order in self: + if order.route: + order.update({"origin_id": False, "destination_id": False}) + else: + order.update( + { + "route_id": False, + } + ) + + @api.depends("scheduled_duration", "scheduled_date_start") + def _compute_scheduled_date_end(self): + for record in self: + if record.scheduled_date_start: + record.scheduled_date_end = record.scheduled_date_start + timedelta( + hours=record.scheduled_duration + ) + + @api.depends("scheduled_date_end", "route_id") + def _compute_scheduled_duration(self): + for record in self: + if ( + record.scheduled_date_end and record.scheduled_date_start + ) and not record.route_id: + difference = record.scheduled_date_end - record.scheduled_date_start + record.scheduled_duration = difference.total_seconds() / 3600 + elif record.route_id: + if ( + record.route_id.estimated_time_uom.id + == self.env.ref("uom.product_uom_day").id + ): + record.scheduled_duration = record.route_id.estimated_time * 24 + else: + record.scheduled_duration = record.route_id.estimated_time + else: + record.scheduled_duration = 0.0 + + @api.depends("duration", "date_start") + def _compute_date_end(self): + for record in self: + if record.date_start: + record.date_end = record.date_start + timedelta(hours=record.duration) + + @api.depends("date_end") + def _compute_duration(self): + for record in self: + if record.date_end and record.date_start: + difference = record.date_end - record.date_start + record.duration = difference.total_seconds() / 3600 + + @api.depends("tms_team_id.driver_ids", "crew_id.driver_ids") + def _compute_driver_ids_domain(self): + all_drivers = self.env["tms.driver"].search([]) + all_driver_ids = all_drivers.ids + for order in self: + order.driver_ids_domain = [(6, 0, all_driver_ids)] + if order.tms_team_id: + order.driver_ids_domain = [(6, 0, order.tms_team_id.driver_ids.ids)] + if order.crew_id: + order.driver_ids_domain = [(6, 0, order.crew_id.driver_ids.ids)] + + driver_ids_domain = fields.Many2many( + "tms.driver", + "team_drivers_rel", + compute="_compute_driver_ids_domain", + ) + + @api.depends("tms_team_id") + def _compute_vehicle_ids_domain(self): + all_vehicles = self.env["fleet.vehicle"].search([]) + all_vehicles_ids = all_vehicles.ids + for order in self: + order.vehicle_ids_domain = [(6, 0, all_vehicles_ids)] + if order.tms_team_id: + order.vehicle_ids_domain = [(6, 0, order.tms_team_id.vehicle_ids.ids)] + + vehicle_ids_domain = fields.Many2many( + "fleet.vehicle", + "team_vehicles_rel", + compute="_compute_vehicle_ids_domain", + default=lambda self: self.env["fleet.vehicle"].search([]).ids, + ) + + @api.depends("tms_team_id") + def _compute_crew_ids_domain(self): + all_crews = self.env["tms.crew"].search([]) + all_crews_ids = all_crews.ids + + if self.tms_team_id: + self.crew_ids_domain = [(6, 0, self.tms_team_id.crew_ids.ids)] + else: + self.crew_ids_domain = [(6, 0, all_crews_ids)] + + crew_ids_domain = fields.Many2many( + "tms.crew", + "team_crews_rel", + compute="_compute_crew_ids_domain", + default=lambda self: self.env["tms.crew"].search([]).ids, + ) + + @api.depends("crew_id") + def _compute_active_crew(self): + for order in self: + order.crew_active = bool(order.crew_id) + if order.crew_id: + order.vehicle_id = order.crew_id.default_vehicle_id.id + else: + order.vehicle_id = order.vehicle_id + + crew_active = fields.Boolean( + compute="_compute_active_crew", groups="tms.group_tms_crew" + ) + + # Constraints + _sql_constraints = [ + ("name_uniq", "unique (name)", "Trip name already exists!"), + ( + "duration_ge_zero", + "CHECK (scheduled_duration >= 0)", + "Scheduled duration must be greater than or equal to zero!", + ), + ] + + @api.model + def _read_group_stage_ids(self, stages, domain, order): + return self.env["tms.stage"].search([("stage_type", "=", "order")], order=order) + + def button_start_order(self): + # Check the vehicle insurance + vehicle_security_days = int( + self.env["ir.config_parameter"] + .sudo() + .get_param("tms.default_vehicle_insurance_security_days") + ) + if vehicle_security_days and self.vehicle_id.insurance_id: + insurance_id = self.vehicle_id.insurance_id + days_to_expire = (insurance_id.end_date - datetime.today().date()).days + + if days_to_expire <= vehicle_security_days: + raise UserError( + _( + f"""Vehicle {self.vehicle_id.name} insurance """ + f"""will expire in {days_to_expire} days, """ + f"""which is less than or equal to the security """ + f"""threshold of {vehicle_security_days} days.""" + ) + ) + + # Check the drivers license + driver_security_days = int( + self.env["ir.config_parameter"] + .sudo() + .get_param("tms.default_driver_license_security_days") + ) + if driver_security_days and self.driver_id.driver_license_expiration_date: + expiration_date = self.driver_id.driver_license_expiration_date + days_to_expire = (expiration_date - datetime.today().date()).days + + if days_to_expire <= vehicle_security_days: + raise UserError( + _( + f"""Driver {self.driver_id.name} license will expire """ + f"""in {days_to_expire} days, which is less than or equal """ + f"""to the security threshold of {driver_security_days} days.""" + ) + ) + + self.date_start = datetime.now() + self.start_trip = True + + def button_end_order(self): + self.date_end = fields.Datetime.now() + duration = self.date_end - self.date_start + self.duration = duration.total_seconds() / 3600 + self.diff_duration = round(self.scheduled_duration - self.duration, 2) + self.start_trip = False + self.end_trip = True + + def button_refresh_duration(self): + self.date_end = fields.Datetime.now() + duration = self.date_end - self.date_start + self.duration = duration.total_seconds() / 3600 + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get("name", _("New")) == _("New"): + vals["name"] = self.env["ir.sequence"].next_by_code("tms.order") + + return super().create(vals_list) + + @api.depends("vehicle_id") + def _compute_vehicle_id_set_driver(self): + for record in self: + vehicle = record.vehicle_id + if vehicle and vehicle.tms_driver_id: + record.driver_id = vehicle.tms_driver_id + else: + record.driver_id = False diff --git a/tms/models/tms_route.py b/tms/models/tms_route.py new file mode 100644 index 000000000..5db81bc6a --- /dev/null +++ b/tms/models/tms_route.py @@ -0,0 +1,80 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class TMSRoute(models.Model): + _name = "tms.route" + _description = "Transport Management System Route" + + # ------------------------------------- + # Fields + # ------------------------------------- + + active = fields.Boolean(default=True) + name = fields.Char(string="Route Name", required=True) + origin_location_id = fields.Many2one( + "res.partner", + string="Origin Location", + required=True, + context={"default_tms_location": True}, + ) + destination_location_id = fields.Many2one( + "res.partner", + string="Destination Location", + required=True, + context={"default_tms_location": True}, + ) + + stop_locations = fields.Boolean(string="Stops locations in route") + stop_location_ids = fields.Many2many( + "res.partner", + string="Stop Locations", + context={"default_tms_location": True}, + ) + + # Route Details + distance = fields.Float() + estimated_time = fields.Float() + + distance_uom = fields.Many2one( + "uom.uom", + domain="[('category_id', '=', 'Length / Distance')]", + default=lambda self: self._default_distance_uom_id(), + ) + estimated_time_uom = fields.Many2one( + "uom.uom", + domain="[('category_id', '=', 'Working Time')]", + default=lambda self: self._default_time_uom_id(), + ) + + # Notes and Comments + notes = fields.Text(string="Notes/Comments") + + @api.model + def _default_distance_uom_id(self): + # Fetch the value of default_distance_uom from settings + default_distance_uom_id = ( + self.env["ir.config_parameter"].sudo().get_param("tms.default_distance_uom") + ) + + # Return the actual record based on the ID retrieved from settings + if default_distance_uom_id: + return self.env["uom.uom"].browse(int(default_distance_uom_id)) + else: + # If no default_length_uom is set, return None or a default value + return self.env.ref("uom.product_uom_km", raise_if_not_found=False) + + def _default_time_uom_id(self): + # Fetch the value of default_time_uom from settings + default_time_uom_id = ( + self.env["ir.config_parameter"].sudo().get_param("tms.default_time_uom") + ) + + # Return the actual record based on the ID retrieved from settings + if default_time_uom_id: + return self.env["uom.uom"].browse(int(default_time_uom_id)) + else: + # If no default_time_uom is set, return None or a default value + return self.env.ref("uom.product_uom_hour", raise_if_not_found=False) diff --git a/tms/models/tms_stage.py b/tms/models/tms_stage.py new file mode 100644 index 000000000..120238439 --- /dev/null +++ b/tms/models/tms_stage.py @@ -0,0 +1,109 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError + + +class TMSStage(models.Model): + _name = "tms.stage" + _description = "Transport Management System Stage" + _order = "sequence, name, id" + + def _default_tms_team_ids(self): + default_tms_team_id = self.env.context.get("default_tms_team_id") + return [default_tms_team_id] if default_tms_team_id else None + + active = fields.Boolean(default=True) + name = fields.Char(required=True) + sequence = fields.Integer(default=1, help="Used to order stages. Lower is first.") + legend_priority = fields.Text( + "Priority Management Explanation", + translate=True, + help="Explanation text to help users using" + " the star and priority mechanism on" + " stages or orders that are in this" + " stage.", + ) + fold = fields.Boolean( + "Folded in Kanban", + help="This stage is folded in the kanban view when " + "there are no record in that stage to display.", + ) + is_completed = fields.Boolean( + help="Defines how this stage is evaluated as completed stage", + ) + is_default = fields.Boolean(readonly=True, default=False) + custom_color = fields.Char( + "Color Code", default="#FFFFFF", help="Use Hex Code only Ex:-#FFFFFF" + ) + description = fields.Text(translate=True) + stage_type = fields.Selection( + [ + ("driver", "Driver"), + ("order", "Trip"), + ], + string="Type", + required=True, + ) + company_id = fields.Many2one( + "res.company", + string="Company", + default=lambda self: self.env.user.company_id.id, + ) + + tms_team_ids = fields.Many2many( + "tms.team", + "tms_order_team_stage_rel", + "stage_id", + "tms_team_id", + string="Teams", + default=lambda self: self._default_tms_team_ids(), + ) + + def get_color_information(self): + # get stage ids + stage_ids = self.search([]) + color_information_dict = [] + for stage in stage_ids: + color_information_dict.append( + { + "color": stage.custom_color, + "field": "stage_id", + "opt": "==", + "value": stage.name, + } + ) + return color_information_dict + + @api.model_create_multi + def create(self, vals_list): + stages = self.search([]) + for vals in vals_list: + for stage in stages: + if stage.stage_type == vals.get( + "stage_type" + ) and stage.sequence == vals.get("sequence"): + raise ValidationError( + _( + "Cannot create TMS Stage because " + "it has the same Type and Sequence " + "of an existing TMS Stage." + ) + ) + return super().create(vals_list) + + @api.constrains("custom_color") + def _check_custom_color_hex_code(self): + if ( + self.custom_color + and not self.custom_color.startswith("#") + or len(self.custom_color) != 7 + ): + raise ValidationError(_("Color code should be Hex Code. Ex:-#FFFFFF")) + + def unlink(self): + for stage in self: + if stage.is_default: + raise UserError(_("You cannot delete default stages.")) + return super().unlink() diff --git a/tms/models/tms_team.py b/tms/models/tms_team.py new file mode 100644 index 000000000..0d098b9a6 --- /dev/null +++ b/tms/models/tms_team.py @@ -0,0 +1,128 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class TMSTeam(models.Model): + _name = "tms.team" + _description = "Transport Management System Team" + + def _default_stages(self): + return self.env["tms.stage"].search([("is_default", "=", True)]) + + def _compute_order_count(self): + order_data = self.env["tms.order"].read_group( + [ + ("tms_team_id", "in", self.ids), + ("stage_id.is_completed", "!=", True), + ], + ["tms_team_id"], + ["tms_team_id"], + ) + result = { + data["tms_team_id"][0]: int(data["tms_team_id_count"]) + for data in order_data + } + for team in self: + team.order_count = result.get(team.id, 0) + + def _compute_driver_count(self): + order_data = self.env["tms.driver"].read_group( + [("tms_team_id", "in", self.ids)], + ["tms_team_id"], + ["tms_team_id"], + ) + result = { + data["tms_team_id"][0]: int(data["tms_team_id_count"]) + for data in order_data + } + for team in self: + team.driver_count = result.get(team.id, 0) + + def _compute_vehicle_count(self): + for team in self: + team.vehicle_count = len(team.vehicle_ids) + + active = fields.Boolean(default=True) + name = fields.Char(required=True) + description = fields.Text() + color = fields.Integer("Color Index") + stage_ids = fields.Many2many( + "tms.stage", + "tms_order_team_stage_rel", + "tms_team_id", + "stage_id", + string="Stages", + default=_default_stages, + ) + order_ids = fields.One2many( + "tms.order", + "tms_team_id", + string="Orders", + domain=[("stage_id.is_completed", "!=", True)], + ) + order_count = fields.Integer(compute="_compute_order_count", string="Orders Count") + sequence = fields.Integer(default=1, help="Used to sort teams. Lower is better.") + + vehicle_ids = fields.One2many("fleet.vehicle", "tms_team_id") + vehicle_count = fields.Integer( + compute="_compute_vehicle_count", string="Vehicles Count" + ) + + driver_ids = fields.One2many( + "tms.driver", + "tms_team_id", + ) + driver_count = fields.Integer( + compute="_compute_driver_count", string="Drivers Count" + ) + + crew_ids = fields.One2many("tms.crew", "tms_team_id") + + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + index=True, + default=lambda self: self.env.company, + help="Company related to this order", + ) + + trips_todo_count = fields.Integer( + string="Number of Trips", compute="_compute_trips_todo_count" + ) + + @api.depends("order_ids.stage_id") + def _compute_trips_todo_count(self): + for team in self: + team.order_ids = self.env["tms.order"].search( + [ + ("tms_team_id", "=", team.id), + ( + "stage_id.is_completed", + "!=", + True, + ), + ] + ) + data = self.env["tms.order"].read_group( + [ + ("tms_team_id", "=", team.id), + ( + "stage_id.is_completed", + "!=", + True, + ), + ], + ["stage_id"], + ["stage_id", "count(*) as count"], + ) + + team.trips_todo_count = 0 + + for record in data: + if "stage_id_count" in record: + team.trips_todo_count += record["stage_id_count"] + + _sql_constraints = [("name_uniq", "unique (name)", "Team name already exists!")] diff --git a/tms/pyproject.toml b/tms/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/tms/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/tms/readme/CONFIGURE.md b/tms/readme/CONFIGURE.md new file mode 100644 index 000000000..d4253f5a6 --- /dev/null +++ b/tms/readme/CONFIGURE.md @@ -0,0 +1,47 @@ +TMS module can be used with advanced configuration that enable extra features complementing the base module. + +## Units of Measure + +In the base module units of measure (UoM) aren't considered. They have to be manually enabled in the settings. +1. Go to TMS > Configuration > Settings > Units +2. Activate the "Units of measure" checkbox and save the changes +3. Now UoM appear in the module in the distance, length, weight and time fields with a default unit that is computed. +4. To change the default UoM of an specific magnitude, select the default UoM in its corresponding measurement in the settings. + +## Manage teams and crews + +Team management is an advanced feature that can be configured in the TMS module. They are a predefined group of employees that have predefined drivers and vehicles. "Mexican Transportation Company", +i.e., has the "Mexico City Team" and "Querétaro Team" with their own vehicles and drivers. +1. Go to TMS > Configuration > Settings > Drivers +2. Activate the "Manage Teams" checkbox and save the changes +3. Go to TMS > Configuration > Drivers > Teams +4. A default team is created. Edit this team or create a new one +5. Write the team's name, select the drivers and the vehicles +6. If it's configured, you can also select crews for this team +7. When a trip is created, you can assign the trip to an specific team. + +Crew management is an advanced feature that can be configured in the TMS module. They are a predefined group of drivers and employees in a vehicle. An airplane, i.e., has +its pilots and crew members that attend the passengers. +1. Go to TMS > Configuration > Settings > Drivers +2. Activate the "Manage Crews" checkbox and save the changes +3. Go to TMS > Configuration > Drivers > Crews +4. Create a new crew and assign it a name +5. Select the drivers, the personnel, and a default vehicle that the crew uses +6. When a trip is created, you can assign the trip to an specific crew + +## Routes and stop locations + +Routes can be used to establish predetermined trips from one location to another. +1. Go to TMS > Configuration > Settings > Trips +2. Activate the "Routes" checkbox and save the changes +3. Go to Master Data > Routes and create a new route +4. Write the route's name, select the origin location and select the origin destination +5. Create a new trip and enable the "Use a predefined route" checkbox +6. Select the route you have created for the trip + +When activating routes in the settings, the option for creating stop locations in routes is enabled. +1. Go to TMS > Configuration > Settings > Trips +2. Activate the "Stops" checkbox and save the changes +3. Go to Master Data > Routes and create a new route or select and existing one +4. Enable the "Stop locations" checkbox +5. Write the locations in the "Stop locations" page diff --git a/tms/readme/CONTRIBUTORS.md b/tms/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..de92e8961 --- /dev/null +++ b/tms/readme/CONTRIBUTORS.md @@ -0,0 +1,13 @@ +- Santiago Rodriguez +- Edgar Martinez +- Maxime Chambreuil +- Israel Cruz +- Alan Ramos +- Luis Triana +- Sarai Osorio +- Oscar Garza +- Hector Camacho +- Luis Miguel Guzmán +- Isabel Ávila +- Erick Reza +- Tecnativa: * Sergio Teruel * Carlos Dauden diff --git a/tms/readme/CREDITS.md b/tms/readme/CREDITS.md new file mode 100644 index 000000000..54ad3100b --- /dev/null +++ b/tms/readme/CREDITS.md @@ -0,0 +1 @@ +- Open Source Integrators diff --git a/tms/readme/DESCRIPTION.md b/tms/readme/DESCRIPTION.md new file mode 100644 index 000000000..9dc6be6c4 --- /dev/null +++ b/tms/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +The Transport Management Systems (TMS) module manages the workflow of creating transport +operations within Odoo. This module provides features such as creating teams, stages, +crews, routes, and vehicles, allowing businesses to efficiently handle various aspects +of their transport operations. diff --git a/tms/readme/MAINTAINERS.md b/tms/readme/MAINTAINERS.md new file mode 100644 index 000000000..99638f746 --- /dev/null +++ b/tms/readme/MAINTAINERS.md @@ -0,0 +1,13 @@ +This module is maintained by the OCA. + +[![Odoo Community Association](https://odoo-community.org/logo.png)](https://odoo-community.org) + +OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to +support the collaborative development of Odoo features and promote its widespread use. + +This module is part of the +`OCA/stock-logistics-transport `\_ +project on GitHub. + +You are welcome to contribute. To learn how please visit +https://odoo-community.org/page/Contribute. diff --git a/tms/readme/USAGE.md b/tms/readme/USAGE.md new file mode 100644 index 000000000..591003306 --- /dev/null +++ b/tms/readme/USAGE.md @@ -0,0 +1,28 @@ +## Vehicles + +1. Go to TMS application. +2. Go to Master Data > Vehicles in the menu. +3. Create a new vehicle with the desired model (required). +4. In the TMS page select the operation type (Cargo/Passenger). +5. Type the capacity of the vehicle. + +## Drivers + +1. Go to TMS application. +2. Go to Master Data > Drivers in the menu. +3. Create a new driver. + +## Locations + +1. Go to TMS application. +2. Go to Master Data > Locations in the menu. +3. Create a new location. + +## Orders + +1. Go to TMS application. +2. Create a new trip from the dashboard. +3. Select a driver, a vehicle, an origin location and a destination location. +4. In the planning page select the start date, the duration and the scheduled end. +5. Once confirmed, click 'START' button to start the trip. +6. Once the trip is completed, click 'END' button to end the trip. diff --git a/tms/security/ir.model.access.csv b/tms/security/ir.model.access.csv new file mode 100644 index 000000000..04d6dcbce --- /dev/null +++ b/tms/security/ir.model.access.csv @@ -0,0 +1,15 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_tms_order_tms_user,tms.order.user,model_tms_order,tms.group_tms_user,1,0,0,0 +access_tms_order_tms_admin,tms.order.admin,model_tms_order,tms.group_tms_admin,1,1,1,1 +access_tms_driver_tms_user,tms.driver.user,model_tms_driver,tms.group_tms_user,1,0,0,0 +access_tms_driver_tms_admin,tms.driver.admin,model_tms_driver,tms.group_tms_admin,1,1,1,1 +access_tms_route_tms_user,tms.route.user,model_tms_route,tms.group_tms_user,1,0,0,0 +access_tms_route_tms_admin,tms.route.admin,model_tms_route,tms.group_tms_admin,1,1,1,1 +access_tms_stage_tms_user,tms.stage.user,model_tms_stage,tms.group_tms_user,1,0,0,0 +access_tms_stage_tms_admin,tms.stage.admin,model_tms_stage,tms.group_tms_admin,1,1,1,1 +access_tms_team_tms_user,tms.team.user,model_tms_team,tms.group_tms_user,1,0,0,0 +access_tms_team_tms_admin,tms.team.admin,model_tms_team,tms.group_tms_admin,1,1,1,1 +access_tms_crew_tms_user,tms.crew.user,model_tms_crew,tms.group_tms_user,1,0,0,0 +access_tms_crew_tms_admin,tms.crew.admin,model_tms_crew,tms.group_tms_admin,1,1,1,1 +access_tms_insurance_tms_user,tms.insurance.user,model_tms_insurance,tms.group_tms_user,1,0,0,0 +access_tms_insurance_tms_admin,tms.insurance.admin,model_tms_insurance,tms.group_tms_admin,1,1,1,1 diff --git a/tms/security/ir_rule.xml b/tms/security/ir_rule.xml new file mode 100644 index 000000000..819a02eca --- /dev/null +++ b/tms/security/ir_rule.xml @@ -0,0 +1,31 @@ + + + + + TMS Orders Entry + + + + + + TMS Routes Entry + + + + + + TMS Stages Entry + + + + + + TMS Teams Entry + + + + + diff --git a/tms/security/res_groups.xml b/tms/security/res_groups.xml new file mode 100644 index 000000000..e86e76ae2 --- /dev/null +++ b/tms/security/res_groups.xml @@ -0,0 +1,56 @@ + + + + User + + + + + + Driver + + + + + + Administrator + + + + + + + + Manage TMS Teams + + + + + Manage TMS Crew + + + + + Manage TMS Driver License + + + + + Manage TMS Vehicle Insurance + + + + + Manage TMS Routes + + + + + Manage TMS Route Stops + + + + diff --git a/tms/static/description/icon.png b/tms/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d61de6bb90cbd61a11873a9a4108efabd0cd2485 GIT binary patch literal 4277 zcmV;m5K8ZfP)&cHy*iJL8)0ga-%ycZ;rW&_O+K$ag%}f$os_Z&u zq9`>bW<*P}EJ7s17YGmlg$03q^v6DkH+Hd$l^pZ@!D9E`{qCN0yvVlI|kr9faB$eR~p_2;3$Aj!@{jW2*42JwvLx7q;!Tp00)a4ev2O) z*lR>+wPaVSbP_-xKQ^$KSMLyjK>%LELTiH<?aKV8pGY<92kd_9@M>vPfBkwmg;@=aglh4}5Z)ANf> z&)=F=3C8ZGHQ9t7g>nI;W9tOv@fDnd-nOsVY&$A}zIR`tU?&UGu{Eyz^CD}g+tujl zP`8iYnwfcFVixD3@z%WYI!6JhglfrtB7eu!a#|y}z0R3^NK>0g*RBo}0SR=wNuax+ z=UD|3=#G%Co}%Lxz2nhr^6pbNvU~LnZh2jiswWNW>qZKz;Kv3AnPBe-WR2r^b|XuI z&>ZR9UUHyj_8;?!<0DC7^xOhcx8*U35C*O_xtdBUF$GcNbv4vgPv|W@e$v%b*sB## z&24~_jVjuS29^}o)G$5Pq>o=!r zDZ-X9TZK42k`#Xa{itpWu+|`iq3{1(Q!zv8dNP$`vReTw$PTC*mzR=Y3Bj#YIt3u7 zrQ-B;@Mm9k1E^#n+6w;c%V72&OXd?kxts=oqSsO_Op(n5djrUdXq=duS2qh9Cyt(- zz>2wk2?jl8H9!E0RwRs`TgWH-wK>hk$-b67OtAN8u`rq*nC;p9dJ9Uic~RZw#|BK9 zy;eYp9*qF#)Er;>pha~I%QRX+t0*`22mrJ?9aEpGcWL7=Cy302_-$L_iq%31fsLbt z&i_faZl>MkTvq?Tv$(WY3HNy+`$*0km1(ADYrXSR^)5a;76||s;&;7;4ye~aNC6Lh z8`kCfutRS}6Q+!@kGoMLyG!$Z<~72{oorjNO16zyCEG@+WMksF!k>Z+#d0vUm-)YF{XPHzCfTz~NY$Ka&`Hg0A;)?p$3t*33vMZrz0#6NK zUvxdt?Pm5LOH%bs;mW1$0p<42(hnR;l}g~T8fJR77HL-U-?SLxWGY<;pdgD#XI_Y% zC>ba?eru+{T+ccjs79EXX&(LR{}?Z{R+~n9x8er3yzU0KTrz*p8{qTsD_ph2w}*k2i$b*^7DxXqt*BI52w^! zhU|rE$PTC*Ee^);^O#RGz5TN>`o4#~aI!UvY6Ae$9E3}6#Drh`j{~CMmX;#E%=cdi zJ05#hZ=N3jz~{)FY+)xnq@a~`o!ZR z;2|L8ho5R7#otHz`X2-7Im!9u*C?vF4UPlPu$iIf006?pGZMXRpXG9k!8W5t3|$76 zlky~{j;#}9{bm5b@(Twg5MND*)bxbn7UajLo6;`F#g)wfds;GidkO(%ay1E9-@q4JKGE34t=v%e># zZnw&1xeNi6oNNW+wV$lz37wE;KG1I7OTV0t>~37+1At}+lmB9@3Z~8w$?$k15{teW ziIb!tsxP`+4JFMr@ox?k?gv0Q8|5Cj9Kog&XEfp#e)PjAAB)BF%NqhsyZpcXXe-UK z*!bLQ^w^V+0qi=Ugwi9v|Kl}KItT!aB$B?7L{dB6#4zDU{NDOvDxqFfL-x43@#@S1 zurl-2I2?*sQ%q~SCI?=OBu3uznL4k6#CtyvclJH)cQl)y`4{DR|EZY;oRY7(Dwxu< zvq3txPLR&~{AlnO-uW~K{@g1`h=RRND2gJ)T}GrjON`J-X5SO;Vg`ld@)+|9H! zH*VU>HBC0lj>e@SeG+X+qr(B-6 zl;)Z!k8hrIZZF=p^_yF10Mb$f!rT8A7N@TpGJ>*Uh-}5%r>(T0_!z1dUJ9=EcB@Zm z8kENe=Fva(3!~>!!i6E#2{$k(MGTHm|-Im|yKpo&!{PHqGLeWSF+tC^ZJevUy|St%3hvBz`zscs zd~IRJ=f2{HlLfQ$pp$>+lzQk8vMaSFwzY+|6I8*#sHd2$5n0n=< zDTspUc{j}u|JK^ZUB6jz7}3-IKl#>%sqehy%guH*80;`iHs$ifVS#m53giFy&1ET* zu_T3e`rluLYeT0cs$_%P{LQ!3pIrbkjeOT?;OW1tv$ALFdO_L*OUP!3RPj8?Wl|Uo zS&k^qp>y{>`FI{>UsPnDJ%mbGx(zZN|j=Ss3w!<9RgytX$ z><3}C?K9u%4iOpzG*w`bB$tV6Ch90~w@Ffhr?8FzfVm&Mjo9#6v>fgO&03dsH~*b~ zLh@F0h3rgJLY}jHHsNdyesgEEr6E(U{ia{=rpP9n9=I)D8)gAuJmNBJh&UgAk;$C; zs!RlNVmaZ&~D%hC4j^--ISQ8E53`A2v1d(v$=VY4<7aluKJib zeyMz-N?s~~3aY6Cj^BA2>DT`XlxKsPrc?$u1Nzq<1+`&E$s$xkOIbGo3EbCc#zkRz z%%*o9@K#EA0f5Y@ugw-Ee8UdZJvD^P&{rYeyvTz%iuSy!A!a0M{bt7bj|UhQk1{rj;^93g(p&~e_dLNw1}b0Fq8wB<{&LaT9ki#m|$-o?`_PunGWw#*YmY^^=q&TXCu0tYM>mm9eo{4=*>21hg$ebM)5Tafm`q7eDzZL%JPx ziJ?(d0SF)~Fs?$^3yInH1Y2%t&sE6lsfeM`vSswW{ViN}NLrYJlr9YBlIC_x<>aH- zOPzAMbCPvx4Si&%tx1K;Ta7&jl*d;#U)l^Z-|de`OU0u8QMrXWcT$V&1l zDof9q#H;U4m~0FHKzRShB^ObVmLfiJVbTgQIS{9>qZH8qpagF9A_QOpz--?BHfiep ziVMV)?AiR-z*m~Spe2*Jfh%&LfF>U+sk`4#lUve!Qa5gv&f!B8B(Q%DM(8TkbZeB zB!+L1yvbJibAtLyO=>Djwz4SsBIICZt~s0Lnxr(>BrN7VQBF2WHMTAh{|1q|XGex*YekLgnG;#<7nt(DPNcpZ2ml^;I^1R*3IYvTF#NfzYDvi-ld`p%>~o4G%6wE{ zsk^t~0|%&_0q;Z4&2@(F)a)JqTH! z1oS;>s!C8XMe7b=u!=e{*hRLYNAAT6;d<~rer%w>8hN#Z(x#IJs;Hke95*VfDs4oC z62&0X-olrisc?jjFNDrYxG^QL(k-Z9I_$aDlA6cxDZ6j96wh{ji X0Avpl@=u�NkvXXu0mjf(Vs+v literal 0 HcmV?d00001 diff --git a/tms/static/description/icon.svg b/tms/static/description/icon.svg new file mode 100644 index 000000000..4850af26e --- /dev/null +++ b/tms/static/description/icon.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tms/static/description/index.html b/tms/static/description/index.html new file mode 100644 index 000000000..43c051ca7 --- /dev/null +++ b/tms/static/description/index.html @@ -0,0 +1,581 @@ + + + + + +Transport + + + +
+

Transport

+ + +

Alpha License: AGPL-3 OCA/stock-logistics-transport Translate me on Weblate Try me on Runboat

+

The Transport Management Systems (TMS) module manages the workflow of +creating transport operations within Odoo. This module provides features +such as creating teams, stages, crews, routes, and vehicles, allowing +businesses to efficiently handle various aspects of their transport +operations.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Configuration

+

TMS module can be used with advanced configuration that enable extra +features complementing the base module.

+
+

Units of Measure

+

In the base module units of measure (UoM) aren’t considered. They have +to be manually enabled in the settings.

+
    +
  1. Go to TMS > Configuration > Settings > Units
  2. +
  3. Activate the “Units of measure” checkbox and save the changes
  4. +
  5. Now UoM appear in the module in the distance, length, weight and time +fields with a default unit that is computed.
  6. +
  7. To change the default UoM of an specific magnitude, select the +default UoM in its corresponding measurement in the settings.
  8. +
+
+
+

Manage teams and crews

+

Team management is an advanced feature that can be configured in the TMS +module. They are a predefined group of employees that have predefined +drivers and vehicles. “Mexican Transportation Company”, i.e., has the +“Mexico City Team” and “Querétaro Team” with their own vehicles and +drivers.

+
    +
  1. Go to TMS > Configuration > Settings > Drivers
  2. +
  3. Activate the “Manage Teams” checkbox and save the changes
  4. +
  5. Go to TMS > Configuration > Drivers > Teams
  6. +
  7. A default team is created. Edit this team or create a new one
  8. +
  9. Write the team’s name, select the drivers and the vehicles
  10. +
  11. If it’s configured, you can also select crews for this team
  12. +
  13. When a trip is created, you can assign the trip to an specific team.
  14. +
+

Crew management is an advanced feature that can be configured in the TMS +module. They are a predefined group of drivers and employees in a +vehicle. An airplane, i.e., has its pilots and crew members that attend +the passengers.

+
    +
  1. Go to TMS > Configuration > Settings > Drivers
  2. +
  3. Activate the “Manage Crews” checkbox and save the changes
  4. +
  5. Go to TMS > Configuration > Drivers > Crews
  6. +
  7. Create a new crew and assign it a name
  8. +
  9. Select the drivers, the personnel, and a default vehicle that the +crew uses
  10. +
  11. When a trip is created, you can assign the trip to an specific crew
  12. +
+
+
+

Routes and stop locations

+

Routes can be used to establish predetermined trips from one location to +another.

+
    +
  1. Go to TMS > Configuration > Settings > Trips
  2. +
  3. Activate the “Routes” checkbox and save the changes
  4. +
  5. Go to Master Data > Routes and create a new route
  6. +
  7. Write the route’s name, select the origin location and select the +origin destination
  8. +
  9. Create a new trip and enable the “Use a predefined route” checkbox
  10. +
  11. Select the route you have created for the trip
  12. +
+

When activating routes in the settings, the option for creating stop +locations in routes is enabled.

+
    +
  1. Go to TMS > Configuration > Settings > Trips
  2. +
  3. Activate the “Stops” checkbox and save the changes
  4. +
  5. Go to Master Data > Routes and create a new route or select and +existing one
  6. +
  7. Enable the “Stop locations” checkbox
  8. +
  9. Write the locations in the “Stop locations” page
  10. +
+
+
+
+

Usage

+
+

Vehicles

+
    +
  1. Go to TMS application.
  2. +
  3. Go to Master Data > Vehicles in the menu.
  4. +
  5. Create a new vehicle with the desired model (required).
  6. +
  7. In the TMS page select the operation type (Cargo/Passenger).
  8. +
  9. Type the capacity of the vehicle.
  10. +
+
+
+

Drivers

+
    +
  1. Go to TMS application.
  2. +
  3. Go to Master Data > Drivers in the menu.
  4. +
  5. Create a new driver.
  6. +
+
+
+

Locations

+
    +
  1. Go to TMS application.
  2. +
  3. Go to Master Data > Locations in the menu.
  4. +
  5. Create a new location.
  6. +
+
+
+

Orders

+
    +
  1. Go to TMS application.
  2. +
  3. Create a new trip from the dashboard.
  4. +
  5. Select a driver, a vehicle, an origin location and a destination +location.
  6. +
  7. In the planning page select the start date, the duration and the +scheduled end.
  8. +
  9. Once confirmed, click ‘START’ button to start the trip.
  10. +
  11. Once the trip is completed, click ‘END’ button to end the trip.
  12. +
+
+
+
+

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

+
    +
  • Open Source Integrators
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+ +
+
+

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:

+

max3903 santiagordz EdgarRetes

+

This module is part of the OCA/stock-logistics-transport project on GitHub.

+

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

+
+
+
+ + diff --git a/tms/tests/__init__.py b/tms/tests/__init__.py new file mode 100644 index 000000000..b8459eff6 --- /dev/null +++ b/tms/tests/__init__.py @@ -0,0 +1,8 @@ +from . import test_tms_order +from . import test_tms_route +from . import test_res_partner +from . import test_tms_driver +from . import test_tms_team +from . import test_tms_crew +from . import test_fleet_vehicle +from . import test_tms_stage diff --git a/tms/tests/test_fleet_vehicle.py b/tms/tests/test_fleet_vehicle.py new file mode 100644 index 000000000..9239e6d1a --- /dev/null +++ b/tms/tests/test_fleet_vehicle.py @@ -0,0 +1,55 @@ +from odoo.tests.common import TransactionCase + + +class TestFleetVehicle(TransactionCase): + @classmethod + def setUpClass(self): + super().setUpClass() + + self.uom_volume = self.env.ref("uom.product_uom_cubic_meter") + + self.team = self.env["tms.team"].create( + { + "name": "Test Team", + } + ) + + self.vehicle = self.env["fleet.vehicle"].create( + { + "name": "Test Vehicle", + "capacity": 50, + "license_plate": "Test Plate", + "cargo_uom_id": self.uom_volume.id, + "model_id": self.env["fleet.vehicle.model"] + .create( + { + "name": "Test Model", + "brand_id": self.env["fleet.vehicle.model.brand"] + .create({"name": "Test Brand"}) + .id, + } + ) + .id, + } + ) + + def test_vehicle_creation(self): + self.assertTrue(self.vehicle, "Vehicle wasn't created successfully") + self.assertEqual( + self.vehicle.name, + "Test Brand/Test Model/Test Plate", + "Vehicle name should be 'Test Vehicle'", + ) + self.assertEqual(self.vehicle.capacity, 50, "Vehicle capacity should be 5000") + self.assertEqual( + self.vehicle.cargo_uom_id, + self.uom_volume, + "Vehicle UOM should be correctly assigned", + ) + + def test_default_volume_uom(self): + self.assertEqual( + self.vehicle.cargo_uom_id, + self.uom_volume, + "Default UOM should be cubic meters", + ) diff --git a/tms/tests/test_res_partner.py b/tms/tests/test_res_partner.py new file mode 100644 index 000000000..b3adcec31 --- /dev/null +++ b/tms/tests/test_res_partner.py @@ -0,0 +1,28 @@ +from odoo.tests.common import TransactionCase + + +class TestResPartner(TransactionCase): + @classmethod + def setUpClass(self): + super().setUpClass() + + self.location = self.env["res.partner"].create( + { + "name": "Test Location", + "tms_location": True, + "location_type": "terrestrial", + } + ) + + def test_location_creation(self): + self.assertTrue(self.location, "Location wasn't created successfully") + self.assertEqual( + self.location.name, + "Test Location", + "Location name should be 'Test Location'", + ) + self.assertEqual( + self.location.location_type, + "terrestrial", + "Location type should be 'terrestrial'", + ) diff --git a/tms/tests/test_tms_crew.py b/tms/tests/test_tms_crew.py new file mode 100644 index 000000000..307850453 --- /dev/null +++ b/tms/tests/test_tms_crew.py @@ -0,0 +1,112 @@ +from odoo.tests.common import TransactionCase + + +class TestTMSCrew(TransactionCase): + @classmethod + def setUpClass(self): + super().setUpClass() + + self.company = self.env["res.company"].create( + { + "name": "Test Company", + } + ) + + self.driver1 = self.env["tms.driver"].create( + { + "name": "Driver 1", + "company_id": self.company.id, + } + ) + self.driver2 = self.env["tms.driver"].create( + { + "name": "Driver 2", + "company_id": self.company.id, + } + ) + + self.personnel1 = self.env["res.partner"].create( + { + "name": "Personnel 1", + "company_id": self.company.id, + } + ) + self.personnel2 = self.env["res.partner"].create( + { + "name": "Personnel 2", + "company_id": self.company.id, + } + ) + + self.vehicle = self.env["fleet.vehicle"].create( + { + "name": "Test Vehicle", + "company_id": self.company.id, + "model_id": self.env["fleet.vehicle.model"] + .create( + { + "name": "Test Model", + "brand_id": self.env["fleet.vehicle.model.brand"] + .create({"name": "Test Brand"}) + .id, + } + ) + .id, + } + ) + + self.team = self.env["tms.team"].create( + { + "name": "Test Team", + "company_id": self.company.id, + } + ) + self.crew = self.env["tms.crew"].create( + { + "name": "Test Crew", + "driver_ids": [(6, 0, [self.driver1.id, self.driver2.id])], + "personnel_ids": [(6, 0, [self.personnel1.id, self.personnel2.id])], + "default_vehicle_id": self.vehicle.id, + "company_id": self.company.id, + "tms_team_id": self.team.id, + } + ) + + def test_crew_creation(self): + self.assertTrue(self.crew, "Crew wasn't created successfully") + self.assertEqual(self.crew.name, "Test Crew", "Crew name should be 'Test Crew'") + self.assertIn( + self.driver1, + self.crew.driver_ids, + "Driver 1 should be assigned to the crew", + ) + self.assertIn( + self.driver2, + self.crew.driver_ids, + "Driver 2 should be assigned to the crew", + ) + self.assertIn( + self.personnel1, + self.crew.personnel_ids, + "Personnel 1 should be assigned to the crew", + ) + self.assertIn( + self.personnel2, + self.crew.personnel_ids, + "Personnel 2 should be assigned to the crew", + ) + self.assertEqual( + self.crew.default_vehicle_id, + self.vehicle, + "Default vehicle should be assigned correctly", + ) + self.assertEqual( + self.crew.company_id, + self.company, + "Crew should belong to the correct company", + ) + self.assertEqual( + self.crew.tms_team_id, + self.team, + "Crew should be assigned to the correct team", + ) diff --git a/tms/tests/test_tms_driver.py b/tms/tests/test_tms_driver.py new file mode 100644 index 000000000..ca5dcd211 --- /dev/null +++ b/tms/tests/test_tms_driver.py @@ -0,0 +1,61 @@ +from odoo.tests.common import TransactionCase + + +class TestTmsDriver(TransactionCase): + @classmethod + def setUpClass(self): + super().setUpClass() + + self.stage = self.env["tms.stage"].create( + { + "name": "Test Stage", + "stage_type": "driver", + "sequence": 1, + } + ) + + self.driver = self.env["tms.driver"].create( + { + "name": "Test Driver", + "is_external": True, + "driver_type": "terrestrial", + "driver_license_number": "ABC123456", + "driver_license_type": "B", + "distance_traveled": 1000, + "distance_traveled_uom": "km", + "driving_experience_years": 5, + } + ) + + def test_driver_creation(self): + self.driver._default_stage_id() + + self.assertTrue(self.driver, "Driver wasn't created successfully") + self.assertEqual( + self.driver.name, "Test Driver", "Driver name should be 'Test Driver'" + ) + self.assertTrue(self.driver.is_external, "Driver should be marked as external") + self.assertEqual( + self.driver.driver_type, + "terrestrial", + "Driver type should be 'terrestrial'", + ) + self.assertEqual( + self.driver.driver_license_number, + "ABC123456", + "Driver license number should be 'ABC123456'", + ) + self.assertEqual( + self.driver.driver_license_type, "B", "Driver license type should be 'B'" + ) + self.assertEqual( + self.driver.distance_traveled, 1000, "Distance traveled should be 1000" + ) + self.assertEqual( + self.driver.driving_experience_years, + 5, + "Driving experience years should be 5", + ) + self.assertTrue( + self.driver.stage_id, "Driver stage should be correctly assigned" + ) diff --git a/tms/tests/test_tms_order.py b/tms/tests/test_tms_order.py new file mode 100644 index 000000000..e54b19a8f --- /dev/null +++ b/tms/tests/test_tms_order.py @@ -0,0 +1,213 @@ +from datetime import datetime, timedelta + +from odoo import _ +from odoo.tests.common import TransactionCase + + +class TestTMSOrder(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.origin_location = ( + cls.env["res.partner"] + .create( + { + "name": "Test Origin Location", + "tms_location": True, + } + ) + .id + ) + + cls.destination_location = ( + cls.env["res.partner"] + .create( + { + "name": "Test Destination Location", + "tms_location": True, + } + ) + .id + ) + + cls.driver = cls.env["tms.driver"].create( + { + "name": "Test Driver", + "mobile": "1234567890", + } + ) + + cls.vehicle = cls.env["fleet.vehicle"].create( + { + "name": "Test Vehicle", + "license_plate": "ABC123", + "model_id": cls.env["fleet.vehicle.model"] + .create( + { + "name": "Test Model", + "brand_id": cls.env["fleet.vehicle.model.brand"] + .create({"name": "Test Brand"}) + .id, + } + ) + .id, + } + ) + + cls.location = cls.env["res.partner"].create( + { + "name": "Test Location", + "tms_location": True, + } + ) + + cls.route = cls.env["tms.route"].create( + { + "name": "Test Route", + "estimated_time": 2.0, + "estimated_time_uom": cls.env.ref("uom.product_uom_hour").id, + "origin_location_id": cls.origin_location, + "destination_location_id": cls.destination_location, + } + ) + + cls.crew = cls.env["tms.crew"].create( + { + "name": "Test Crew", + "driver_ids": [(6, 0, [cls.driver.id])], + "default_vehicle_id": cls.vehicle.id, + } + ) + + cls.team = cls.env["tms.team"].create( + { + "name": "Test Team Trip", + "driver_ids": [(6, 0, [cls.driver.id])], + "vehicle_ids": [(6, 0, [cls.vehicle.id])], + } + ) + + def create_order(self, **kwargs): + return self.env["tms.order"].create( + { + "name": "Test Order", + "company_id": self.env.company.id, + "origin_id": self.origin_location, + "destination_id": self.destination_location, + **kwargs, + } + ) + + def test_calculate_scheduled_duration(self): + start_time = datetime.now() + order = self.create_order( + scheduled_date_start=start_time, scheduled_duration=2.0 + ) + order._compute_scheduled_date_end() + expected_end_time = start_time + timedelta(hours=2.0) + self.assertEqual( + order.scheduled_date_end, + expected_end_time, + "Scheduled end date calculation is incorrect", + ) + + order.scheduled_date_end = datetime.now() + timedelta(hours=3.0) + order._compute_scheduled_duration() + expected_duration = ( + order.scheduled_date_end - order.scheduled_date_start + ).total_seconds() / 3600 + self.assertEqual( + order.scheduled_duration, + expected_duration, + "Scheduled duration calculation is incorrect", + ) + + def test_button_start_order(self): + order = self.create_order(scheduled_date_start=datetime.now()) + order.button_start_order() + self.assertTrue( + order.start_trip, "Start trip flag should be True after starting the order" + ) + + order.button_refresh_duration() + refresh_duration = (order.date_end - order.date_start).total_seconds() / 3600 + self.assertEqual( + order.duration, refresh_duration, "Refresh duration is incorrect" + ) + + def test_button_end_order(self): + order = self.create_order( + scheduled_date_start=datetime.now(), scheduled_duration=1.0 + ) + order.button_start_order() + order.date_start = datetime.now() + order.date_end = order.date_start + timedelta(hours=1) + order.button_end_order() + self.assertTrue( + order.end_trip, "End trip flag should be True after ending the order" + ) + self.assertFalse( + order.start_trip, "Start trip flag should be False after ending the order" + ) + + diff_duration = round(order.scheduled_duration - order.duration, 2) + self.assertEqual( + order.diff_duration, + diff_duration, + "Difference between scheduled duration and actual duration is incorrect", + ) + + def test_default_time_uom(self): + uom = self.env.ref("uom.product_uom_hour") + order = self.create_order() + self.assertEqual(order.time_uom, uom, "Default UOM should be hours") + + def test_default_stage_id(self): + stage = self.env["tms.stage"].create( + { + "name": "Default Stage", + "stage_type": "order", + "sequence": 1, + } + ) + order = self.create_order() + self.assertEqual( + order.stage_id, stage, "Default stage should be assigned correctly" + ) + + def test_create_with_sequence(self): + self.env["ir.sequence"].create( + { + "name": "TMS Order Sequence", + "code": "tms.order", + "prefix": "TMS/", + "padding": 5, + } + ) + order = self.create_order(name=_("New")) + self.assertNotEqual( + order.name, _("New"), "Name should be replaced by sequence code" + ) + self.assertTrue( + order.name.startswith("TMS/"), "Name should start with sequence prefix" + ) + + def test_order_with_crew(self): + order = self.create_order(crew_id=self.crew.id) + order._compute_active_crew() + self.assertEqual( + order.crew_id, self.crew, "Crew wasn't assigned successfully to order" + ) + self.assertEqual( + order.vehicle_id, + self.crew.default_vehicle_id, + "Default vehicle from crew should appear in order", + ) + + def test_order_with_team(self): + order = self.create_order(tms_team_id=self.team.id) + order._compute_active_crew() + self.assertEqual( + order.tms_team_id, self.team, "Team wasn't assigned successfully to order" + ) diff --git a/tms/tests/test_tms_route.py b/tms/tests/test_tms_route.py new file mode 100644 index 000000000..74bea664c --- /dev/null +++ b/tms/tests/test_tms_route.py @@ -0,0 +1,78 @@ +from odoo.tests.common import TransactionCase + + +class TestTMSRoute(TransactionCase): + @classmethod + def setUpClass(self): + super().setUpClass() + + self.uom_distance = self.env.ref("uom.product_uom_km") + self.uom_time = self.env.ref("uom.product_uom_hour") + + # Create test locations + self.origin_location = self.env["res.partner"].create( + { + "name": "Test Origin Location", + "tms_location": True, + } + ) + + self.destination_location = self.env["res.partner"].create( + { + "name": "Test Destination Location", + "tms_location": True, + } + ) + + def test_route_creation(self): + route = self.env["tms.route"].create( + { + "name": "Test Route", + "origin_location_id": self.origin_location.id, + "destination_location_id": self.destination_location.id, + "distance": 100.0, + "estimated_time": 2.0, + "distance_uom": self.uom_distance.id, + "estimated_time_uom": self.uom_time.id, + } + ) + + self.assertTrue(route, "Route wasn't created successfully") + self.assertEqual( + route.origin_location_id, + self.origin_location, + "Origin location should be correctly assigned", + ) + self.assertEqual( + route.destination_location_id, + self.destination_location, + "Destination location should be correctly assigned", + ) + self.assertEqual(route.distance, 100.0, "Distance should be 100.0") + self.assertEqual(route.estimated_time, 2.0, "Estimated time should be 2.0") + self.assertEqual( + route.distance_uom, + self.uom_distance, + "Distance UOM should be correctly assigned", + ) + self.assertEqual( + route.estimated_time_uom, + self.uom_time, + "Estimated time UOM should be correctly assigned", + ) + + def test_default_uom(self): + route = self.env["tms.route"].create( + { + "name": "Test Route", + "origin_location_id": self.origin_location.id, + "destination_location_id": self.destination_location.id, + } + ) + + self.assertEqual( + route.estimated_time_uom, self.uom_time, "Default UOM should be hours" + ) + self.assertEqual( + route.distance_uom, self.uom_distance, "Default UOM should be kilometers" + ) diff --git a/tms/tests/test_tms_stage.py b/tms/tests/test_tms_stage.py new file mode 100644 index 000000000..9076e38ea --- /dev/null +++ b/tms/tests/test_tms_stage.py @@ -0,0 +1,78 @@ +from odoo.exceptions import UserError +from odoo.tests.common import TransactionCase + + +class TestTMSStage(TransactionCase): + @classmethod + def setUpClass(self): + super().setUpClass() + + # Create a test team + self.team = self.env["tms.team"].create( + { + "name": "Test Team", + } + ) + + # Create a test company + self.company = self.env["res.company"].create( + { + "name": "Test Company", + } + ) + + def test_stage_creation(self): + stage = self.env["tms.stage"].create( + { + "name": "Test Stage", + "stage_type": "order", + "sequence": 1, + "company_id": self.company.id, + } + ) + + self.assertTrue(stage, "Stage wasn't created successfully") + self.assertEqual(stage.name, "Test Stage", "Stage name should be 'Test Stage'") + self.assertEqual(stage.stage_type, "order", "Stage type should be 'order'") + self.assertEqual(stage.sequence, 1, "Stage sequence should be 1") + self.assertEqual( + stage.company_id, self.company, "Stage company should be correctly assigned" + ) + + def test_stage_default_team(self): + stage = self.env["tms.stage"].create( + { + "name": "Default Team Stage", + "stage_type": "order", + "sequence": 4, + "tms_team_ids": [(6, 0, [self.team.id])], + } + ) + + self.assertIn( + self.team, + stage.tms_team_ids, + "Stage should be associated with the test team", + ) + + def test_stage_deletion(self): + stage = self.env["tms.stage"].create( + { + "name": "Deletable Stage", + "stage_type": "order", + "sequence": 5, + } + ) + + self.assertTrue(stage, "Stage wasn't created successfully") + stage.unlink() + + with self.assertRaises(UserError, msg="You cannot delete default stages."): + self.env["tms.stage"].create( + { + "name": "Default Stage", + "stage_type": "order", + "sequence": 6, + "is_default": True, + } + ).unlink() diff --git a/tms/tests/test_tms_team.py b/tms/tests/test_tms_team.py new file mode 100644 index 000000000..50650cbab --- /dev/null +++ b/tms/tests/test_tms_team.py @@ -0,0 +1,109 @@ +from odoo.tests.common import TransactionCase + + +class TestTMSTeam(TransactionCase): + @classmethod + def setUpClass(self): + super().setUpClass() + + self.stage1 = self.env["tms.stage"].create( + { + "name": "Stage 1", + "stage_type": "driver", + "sequence": 1, + "is_default": True, + } + ) + self.stage2 = self.env["tms.stage"].create( + { + "name": "Stage 2", + "stage_type": "driver", + "sequence": 2, + } + ) + + self.crew = self.env["tms.crew"].create( + { + "name": "Test Crew", + } + ) + + self.vehicle = self.env["fleet.vehicle"].create( + { + "model_id": self.env["fleet.vehicle.model"] + .create( + { + "name": "Test Model", + "brand_id": self.env["fleet.vehicle.model.brand"] + .create({"name": "Test Brand"}) + .id, + } + ) + .id, + } + ) + + self.driver = self.env["tms.driver"].create( + {"name": "Test Driver", "tms_team_id": False} + ) + + self.order = self.env["tms.order"].create( + { + "name": "Test Order", + "tms_team_id": False, + "stage_id": self.stage1.id, + } + ) + + self.team = self.env["tms.team"].create( + { + "name": "Test Team", + "description": "A team for testing purposes", + "stage_ids": [(6, 0, [self.stage1.id, self.stage2.id])], + "vehicle_ids": [(6, 0, [self.vehicle.id])], + "driver_ids": [(6, 0, [self.driver.id])], + "order_ids": [(6, 0, [self.order.id])], + "crew_ids": [(6, 0, [self.crew.id])], + } + ) + + def test_team_creation(self): + self.assertTrue(self.team, "Team wasn't created successfully") + self.assertEqual(self.team.name, "Test Team", "Team name should be 'Test Team'") + self.assertEqual( + self.team.description, + "A team for testing purposes", + "Team description should be 'A team for testing purposes'", + ) + self.assertIn(self.stage1, self.team.stage_ids, "Team should have stage1") + self.assertIn(self.stage2, self.team.stage_ids, "Team should have stage2") + self.assertIn( + self.vehicle, self.team.vehicle_ids, "Team should have the test vehicle" + ) + self.assertIn( + self.driver, self.team.driver_ids, "Team should have the test driver" + ) + self.assertIn( + self.order, self.team.order_ids, "Team should have the test order" + ) + self.assertIn(self.crew, self.team.crew_ids, "Team should have the test crew") + + def test_order_count(self): + self.team.write({"order_ids": [(6, 0, [self.order.id])]}) + self.assertEqual(self.team.order_count, 1, "Order count should be 1") + + def test_driver_count(self): + self.team.write({"driver_ids": [(6, 0, [self.driver.id])]}) + self.assertEqual(self.team.driver_count, 1, "Driver count should be 1") + + def test_vehicle_count(self): + self.team.write({"vehicle_ids": [(6, 0, [self.vehicle.id])]}) + self.assertEqual(self.team.vehicle_count, 1, "Vehicle count should be 1") + + def test_default_stages(self): + self.assertIn( + self.stage1, self.team.stage_ids, "Default stage1 should be in team stages" + ) + self.assertIn( + self.stage2, self.team.stage_ids, "Default stage2 should be in team stages" + ) diff --git a/tms/views/fleet_menu.xml b/tms/views/fleet_menu.xml new file mode 100644 index 000000000..cfc694904 --- /dev/null +++ b/tms/views/fleet_menu.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/tms/views/fleet_vehicle.xml b/tms/views/fleet_vehicle.xml new file mode 100644 index 000000000..57475d9e2 --- /dev/null +++ b/tms/views/fleet_vehicle.xml @@ -0,0 +1,50 @@ + + + + fleet.vehicle.inherit.view.form + fleet.vehicle + + + + + + + + +
+ + + Passengers +
+
+ + + +
+
+
+ + 1 + + + + +
+
+ +
diff --git a/tms/views/menu.xml b/tms/views/menu.xml new file mode 100644 index 000000000..d189f5c1c --- /dev/null +++ b/tms/views/menu.xml @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tms/views/res_config_settings.xml b/tms/views/res_config_settings.xml new file mode 100644 index 000000000..1181e995c --- /dev/null +++ b/tms/views/res_config_settings.xml @@ -0,0 +1,178 @@ + + + res.config.settings.view.form.inherit.tms + res.config.settings + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + +
+ + + + + +
+ Set the number of days before the expiration date of the vehicle insurance to show a + warning. +
+
+ + + +
+ + + + + + + + + + + +
+ Set the number of days before the expiration date of the driver license to show a + warning. +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + Settings + ir.actions.act_window + res.config.settings + form + inline + {'module': 'tms'} + + + +
diff --git a/tms/views/res_partner.xml b/tms/views/res_partner.xml new file mode 100644 index 000000000..cdf1c6cd3 --- /dev/null +++ b/tms/views/res_partner.xml @@ -0,0 +1,80 @@ + + + + + res.partner.tree.tms.location + res.partner + + + + + + + + + + + + + + res.partner.form.inherit.tms.location + res.partner + primary + + + + + + + True + + + + False + + + + True + + + + True + + + + True + + + + + + + res.partner.search.inherit + res.partner + + + + + + + + + + Locations + res.partner + {"search_default_tms_location": True, "default_tms_location": True} + + tree,form + + + + diff --git a/tms/views/tms_crew.xml b/tms/views/tms_crew.xml new file mode 100644 index 000000000..a08834732 --- /dev/null +++ b/tms/views/tms_crew.xml @@ -0,0 +1,103 @@ + + + + + tms.crew.view.kanban + tms.crew + + + + +
+
+
+
+ + + +
+ Crew +
+

+ +

+ +
+
+
+
+
+
+
+ + + + tms.crew.view.form + tms.crew + +
+ +
+
+ + + + + + + + + + + + + + + + + +
+
+
+
+ + + + tms.crew.search + tms.crew + + + + + + + + + Crews + tms.crew + kanban,form + + + + Crews + tms.crew + tree,form + +
diff --git a/tms/views/tms_driver.xml b/tms/views/tms_driver.xml new file mode 100644 index 000000000..0e8fb5175 --- /dev/null +++ b/tms/views/tms_driver.xml @@ -0,0 +1,217 @@ + + + + tms.driver.tree + tms.driver + + + + + + + + + + + tms.driver.form.inherit + tms.driver + primary + + + +
+ +
+
+ + True + + + + True + + + + False + + + + True + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + + tms.driver.view.kanban + tms.driver + + + + + + + + + +
+
+
+
+ +
+
+
+ + + +

+ + + + +

+

+ + + + +

+

+ + Crews: + + + + +

+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + + + Drivers + tms.driver + [('is_company', '=', False)] + kanban,tree,form + + + + + Drivers + tms.driver + tree,form + +
diff --git a/tms/views/tms_insurance.xml b/tms/views/tms_insurance.xml new file mode 100644 index 000000000..a9c174032 --- /dev/null +++ b/tms/views/tms_insurance.xml @@ -0,0 +1,61 @@ + + + + tms.insurance.view.tree + tms.insurance + + + + + + + + + + + + tms.insurance.view.form + tms.insurance + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + Insurance Policies + tms.insurance + tree,form + + + diff --git a/tms/views/tms_order.xml b/tms/views/tms_order.xml new file mode 100644 index 000000000..39b80a6d0 --- /dev/null +++ b/tms/views/tms_order.xml @@ -0,0 +1,439 @@ + + + + + + tms.order.view.tree + tms.order + + + + + + + + + +
+ + + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Hours +
+ +
+
+ + + + + +
+ + Hours +
+
+
+
+ +
+ + +
+ + + +
+ +
+
+ + + + tms.order.view.kanban + tms.order + + + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+ + + +
+
+
+ + + + +
+
+
+ +
+
+
+
+
+ + + + + + + + + +
+ + + + +
+ +
+ + + + +
+
+
+
+
+
+
+
+ + + / + + + +
+
+
+ +
+
+
+
+
+ +
+
+
+ + + + tms.order.search + tms.order + + + + + + + + + + + + tms.order.report.view.graph + tms.order + + + + + + + + + + + tms.order.view.pivot + tms.order + + + + + + + + + + + Trips + tms.order + tree,form + + + + Trips + tms.order + graph,pivot + + + + Stages + tms.order + tree,form + + + + Trips + tms.order + kanban,tree,form + + + + Trips Kanban + tms.order + kanban,tree,form + [('tms_team_id', '=', active_id)] + + +
diff --git a/tms/views/tms_route.xml b/tms/views/tms_route.xml new file mode 100644 index 000000000..b87132a32 --- /dev/null +++ b/tms/views/tms_route.xml @@ -0,0 +1,135 @@ + + + + + tms.route.view.tree + tms.route + + + + + + + + + + + + tms.route.form + tms.route + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+ + km + +
+ +
+ + Hours + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + tms.route.search + tms.route + + + + + + + + + Routes + tms.route + tree,form + + +
diff --git a/tms/views/tms_stage.xml b/tms/views/tms_stage.xml new file mode 100644 index 000000000..03fc8514d --- /dev/null +++ b/tms/views/tms_stage.xml @@ -0,0 +1,91 @@ + + + + tms.stage.tree + tms.stage + + + + + + + + + + + + tms.stage.form + tms.stage + +
+ + + + + + + + + + + + + + + + + +

+ You can add a description to help your coworkers + understand the meaning and purpose of the stage. +

+ +
+
+
+
+
+ + + + tms.stage.search + tms.stage + + + + + + + + + + + Stages + tms.stage + tree,form + {'search_default_group_stage_type': 1} + +

+ Create a Stage. +

+
+
+ +
diff --git a/tms/views/tms_team.xml b/tms/views/tms_team.xml new file mode 100644 index 000000000..25d0298a9 --- /dev/null +++ b/tms/views/tms_team.xml @@ -0,0 +1,162 @@ + + + + + tms.team.kanban + tms.team + + + + + + + + + + + +
+
+
+
+
+ + + + + +
+ + Drivers: + +
+ +
+ + Vehicles: + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + tms.team.view.form + tms.team + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + tms.team.search + tms.team + + + + + + + + + Teams + tms.team + kanban,tree,form + + + + Teams + tms.team + tree,form + + +
From b61b85655a947ec9cb22cac2310929c2caf63639 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 30 Sep 2024 14:16:41 +0000 Subject: [PATCH 2/4] [UPD] Update tms.pot --- tms/i18n/tms.pot | 607 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 544 insertions(+), 63 deletions(-) diff --git a/tms/i18n/tms.pot b/tms/i18n/tms.pot index fac08930a..f1d01ec77 100644 --- a/tms/i18n/tms.pot +++ b/tms/i18n/tms.pot @@ -13,6 +13,15 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__type +msgid "" +"- Contact: Use this to organize the contact details of employees of a given company (e.g. CEO, CFO, ...).\n" +"- Invoice Address: Preferred address for all invoices. Selected by default when you invoice an order that belongs to this company.\n" +"- Delivery Address: Preferred address for all deliveries. Selected by default when you deliver an order that belongs to this company.\n" +"- Other: Other address for the company (e.g. subsidiary, ...)" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_order_view_kanban msgid "" @@ -50,7 +59,7 @@ msgid "" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_kanban msgid "" msgstr "" @@ -62,13 +71,15 @@ msgid "" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_kanban msgid "" msgstr "" #. module: tms #: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form -msgid "Hours" +msgid "" +"Hours\n" +" " msgstr "" #. module: tms @@ -102,43 +113,54 @@ msgid "View" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__a +#: model:ir.model.fields.selection,name:tms.selection__tms_driver__driver_license_type__a msgid "A - Motorcycles" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_needaction #: model:ir.model.fields,field_description:tms.field_tms_order__message_needaction msgid "Action Needed" msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__active +#: model:ir.model.fields,field_description:tms.field_tms_driver__active #: model:ir.model.fields,field_description:tms.field_tms_insurance__active #: model:ir.model.fields,field_description:tms.field_tms_order__active #: model:ir.model.fields,field_description:tms.field_tms_route__active #: model:ir.model.fields,field_description:tms.field_tms_stage__active #: model:ir.model.fields,field_description:tms.field_tms_team__active #: model:ir.model.fields.selection,name:tms.selection__tms_insurance__state__active -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_kanban msgid "Active" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__active_lang_count +msgid "Active Lang Count" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_ids #: model:ir.model.fields,field_description:tms.field_tms_order__activity_ids msgid "Activities" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_exception_decoration #: model:ir.model.fields,field_description:tms.field_tms_order__activity_exception_decoration msgid "Activity Exception Decoration" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_state #: model:ir.model.fields,field_description:tms.field_tms_order__activity_state msgid "Activity State" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_type_icon #: model:ir.model.fields,field_description:tms.field_tms_order__activity_type_icon msgid "Activity Type Icon" msgstr "" @@ -158,6 +180,11 @@ msgstr "" msgid "Add a description..." msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__type +msgid "Address Type" +msgstr "" + #. module: tms #: model:res.groups,name:tms.group_tms_admin msgid "Administrator" @@ -168,6 +195,13 @@ msgstr "" msgid "All Trips" msgstr "" +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__lang +msgid "" +"All the emails and documents sent to this contact will be translated in this" +" language." +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form msgid "Allow the use of predefined routes in trips" @@ -183,17 +217,63 @@ msgid "Archived" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_attachment_count #: model:ir.model.fields,field_description:tms.field_tms_order__message_attachment_count msgid "Attachment Count" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__b +#: model:ir.model.fields,field_description:tms.field_tms_driver__avatar_1920 +msgid "Avatar" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__avatar_1024 +msgid "Avatar 1024" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__avatar_128 +msgid "Avatar 128" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__avatar_256 +msgid "Avatar 256" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__avatar_512 +msgid "Avatar 512" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__tms_driver__driver_license_type__b msgid "B - Automobiles" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__c +#: model:ir.model.fields,field_description:tms.field_tms_driver__bank_ids +msgid "Banks" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__barcode +msgid "Barcode" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__is_blacklisted +msgid "Blacklist" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_bounce +msgid "Bounce" +msgstr "" + +#. module: tms +#: model:ir.model.fields.selection,name:tms.selection__tms_driver__driver_license_type__c msgid "C - Truck" msgstr "" @@ -232,12 +312,33 @@ msgstr "" msgid "Categories" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__channel_ids +msgid "Channels" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__is_company +msgid "Check if the contact is a company, otherwise it is a person" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__employee +msgid "Check this box if this contact is an Employee." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__city +msgid "City" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_stage__custom_color msgid "Color Code" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__color #: model:ir.model.fields,field_description:tms.field_tms_team__color msgid "Color Index" msgstr "" @@ -249,8 +350,14 @@ msgstr "" msgid "Color code should be Hex Code. Ex:-#FFFFFF" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__commercial_partner_id +msgid "Commercial Entity" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__company_id +#: model:ir.model.fields,field_description:tms.field_tms_driver__company_id #: model:ir.model.fields,field_description:tms.field_tms_insurance__company_id #: model:ir.model.fields,field_description:tms.field_tms_order__company_id #: model:ir.model.fields,field_description:tms.field_tms_stage__company_id @@ -258,6 +365,26 @@ msgstr "" msgid "Company" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__company_registry +msgid "Company ID" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__company_name +msgid "Company Name" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__commercial_company_name +msgid "Company Name Entity" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__company_type +msgid "Company Type" +msgstr "" + #. module: tms #: model:ir.model.fields,help:tms.field_tms_insurance__company_id msgid "Company related to this insurance" @@ -270,6 +397,16 @@ msgstr "" msgid "Company related to this order" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__contact_address +msgid "Complete Address" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__complete_name +msgid "Complete Name" +msgstr "" + #. module: tms #: model:ir.model,name:tms.model_res_config_settings msgid "Config Settings" @@ -282,6 +419,7 @@ msgstr "" #. module: tms #: model:ir.model,name:tms.model_res_partner +#: model:ir.model.fields,field_description:tms.field_tms_driver__child_ids msgid "Contact" msgstr "" @@ -295,6 +433,21 @@ msgstr "" msgid "Costs" msgstr "" +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__message_bounce +msgid "Counter of the number of bounced emails for this contact" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__country_id +msgid "Country" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__country_code +msgid "Country Code" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_insurance_view_form msgid "Coverage" @@ -322,6 +475,7 @@ msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__create_uid +#: model:ir.model.fields,field_description:tms.field_tms_driver__create_uid #: model:ir.model.fields,field_description:tms.field_tms_insurance__create_uid #: model:ir.model.fields,field_description:tms.field_tms_order__create_uid #: model:ir.model.fields,field_description:tms.field_tms_route__create_uid @@ -332,6 +486,7 @@ msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__create_date +#: model:ir.model.fields,field_description:tms.field_tms_driver__create_date #: model:ir.model.fields,field_description:tms.field_tms_insurance__create_date #: model:ir.model.fields,field_description:tms.field_tms_order__create_date #: model:ir.model.fields,field_description:tms.field_tms_route__create_date @@ -369,20 +524,19 @@ msgstr "" #. module: tms #: model:ir.actions.act_window,name:tms.action_tms_config_crew #: model:ir.actions.act_window,name:tms.action_tms_dash_crew -#: model:ir.model.fields,field_description:tms.field_res_partner__crew_ids -#: model:ir.model.fields,field_description:tms.field_res_users__crew_ids +#: model:ir.model.fields,field_description:tms.field_tms_driver__crew_ids #: model:ir.ui.menu,name:tms.menu_tms_config_crew #: model_terms:ir.ui.view,arch_db:tms.tms_team_view_form msgid "Crews" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_kanban msgid "Crews:" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_license_type__d +#: model:ir.model.fields.selection,name:tms.selection__tms_driver__driver_license_type__d msgid "D - Bus" msgstr "" @@ -391,6 +545,11 @@ msgstr "" msgid "Dashboard" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__date +msgid "Date" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_order__date_end msgid "Date End" @@ -463,6 +622,7 @@ msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__display_name +#: model:ir.model.fields,field_description:tms.field_tms_driver__display_name #: model:ir.model.fields,field_description:tms.field_tms_insurance__display_name #: model:ir.model.fields,field_description:tms.field_tms_order__display_name #: model:ir.model.fields,field_description:tms.field_tms_order__route_destination @@ -480,15 +640,13 @@ msgid "Distance" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__distance_traveled -#: model:ir.model.fields,field_description:tms.field_res_users__distance_traveled -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model:ir.model.fields,field_description:tms.field_tms_driver__distance_traveled +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "Distance Traveled" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__distance_traveled_uom -#: model:ir.model.fields,field_description:tms.field_res_users__distance_traveled_uom +#: model:ir.model.fields,field_description:tms.field_tms_driver__distance_traveled_uom msgid "Distance Traveled Uom" msgstr "" @@ -506,16 +664,16 @@ msgid "Draft" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_fleet_vehicle__tms_driver_id #: model:ir.model.fields,field_description:tms.field_tms_order__driver_id #: model:ir.model.fields,field_description:tms.field_tms_team__driver_ids -#: model:ir.model.fields.selection,name:tms.selection__res_partner__tms_type__driver #: model:ir.model.fields.selection,name:tms.selection__tms_stage__stage_type__driver #: model:res.groups,name:tms.group_tms_driver msgid "Driver" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "Driver Experience" msgstr "" @@ -525,30 +683,27 @@ msgid "Driver Ids Domain" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_expiration_date -#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_expiration_date +#: model:ir.model.fields,field_description:tms.field_tms_driver__driver_license_expiration_date msgid "Driver License Expiration Date" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_file -#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_file +#: model:ir.model.fields,field_description:tms.field_tms_driver__driver_license_file msgid "Driver License File" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_number -#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_number +#: model:ir.model.fields,field_description:tms.field_tms_driver__driver_license_number msgid "Driver License Number" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "Driver Status" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "Driver Type" msgstr "" @@ -574,8 +729,7 @@ msgid "Drivers Count" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__driving_experience_years -#: model:ir.model.fields,field_description:tms.field_res_users__driving_experience_years +#: model:ir.model.fields,field_description:tms.field_tms_driver__driving_experience_years msgid "Driving Experience Years" msgstr "" @@ -584,6 +738,24 @@ msgstr "" msgid "Duration" msgstr "" +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__partner_share +msgid "" +"Either customer (not a user), either shared user. Indicated the current " +"partner is a customer without access or with a limited access created for " +"sharing data." +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__email +msgid "Email" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__employee +msgid "Employee" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form msgid "Enable the creation of stops in a route" @@ -629,8 +801,7 @@ msgid "" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__is_external -#: model:ir.model.fields,field_description:tms.field_res_users__is_external +#: model:ir.model.fields,field_description:tms.field_tms_driver__is_external msgid "External Driver" msgstr "" @@ -655,27 +826,57 @@ msgid "Folded in Kanban" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_follower_ids #: model:ir.model.fields,field_description:tms.field_tms_order__message_follower_ids msgid "Followers" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_partner_ids #: model:ir.model.fields,field_description:tms.field_tms_order__message_partner_ids msgid "Followers (Partners)" msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__activity_type_icon #: model:ir.model.fields,help:tms.field_tms_order__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__email_formatted +msgid "Format email address \"Name \"" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__email_formatted +msgid "Formatted Email" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__partner_latitude +msgid "Geo Latitude" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__partner_longitude +msgid "Geo Longitude" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__date_localization +msgid "Geolocation Date" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__has_message #: model:ir.model.fields,field_description:tms.field_tms_order__has_message msgid "Has Message" msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__id +#: model:ir.model.fields,field_description:tms.field_tms_driver__id #: model:ir.model.fields,field_description:tms.field_tms_insurance__id #: model:ir.model.fields,field_description:tms.field_tms_order__id #: model:ir.model.fields,field_description:tms.field_tms_route__id @@ -685,41 +886,91 @@ msgid "ID" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__im_status +msgid "IM Status" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_exception_icon #: model:ir.model.fields,field_description:tms.field_tms_order__activity_exception_icon msgid "Icon" msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__activity_exception_icon #: model:ir.model.fields,help:tms.field_tms_order__activity_exception_icon msgid "Icon to indicate an exception activity." msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__message_needaction #: model:ir.model.fields,help:tms.field_tms_order__message_needaction msgid "If checked, new messages require your attention." msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__message_has_error #: model:ir.model.fields,help:tms.field_tms_order__message_has_error msgid "If checked, some messages have a delivery error." msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__is_training -#: model:ir.model.fields,field_description:tms.field_res_users__is_training +#: model:ir.model.fields,help:tms.field_tms_driver__is_blacklisted +msgid "" +"If the email address is on the blacklist, the contact won't receive mass " +"mailing anymore, from any list" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__image_1920 +msgid "Image" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__image_128 +msgid "Image 128" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__image_256 +msgid "Image 256" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__image_512 +msgid "Image 512" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__is_training msgid "In Training" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_kanban_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_kanban msgid "Inactive" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__industry_id +msgid "Industry" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_insurance_view_form msgid "Information" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__contact_address_inline +msgid "Inlined Complete Address" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_fleet_vehicle__insurance_id #: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form @@ -743,8 +994,7 @@ msgid "Insurer" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__is_active -#: model:ir.model.fields,field_description:tms.field_res_users__is_active +#: model:ir.model.fields,field_description:tms.field_tms_driver__is_active msgid "Is Active" msgstr "" @@ -759,12 +1009,34 @@ msgid "Is Default" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_is_follower #: model:ir.model.fields,field_description:tms.field_tms_order__message_is_follower msgid "Is Follower" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__is_public +msgid "Is Public" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__is_company +msgid "Is a Company" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__function +msgid "Job Position" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__lang +msgid "Language" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__write_uid +#: model:ir.model.fields,field_description:tms.field_tms_driver__write_uid #: model:ir.model.fields,field_description:tms.field_tms_insurance__write_uid #: model:ir.model.fields,field_description:tms.field_tms_order__write_uid #: model:ir.model.fields,field_description:tms.field_tms_route__write_uid @@ -775,6 +1047,7 @@ msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__write_date +#: model:ir.model.fields,field_description:tms.field_tms_driver__write_date #: model:ir.model.fields,field_description:tms.field_tms_insurance__write_date #: model:ir.model.fields,field_description:tms.field_tms_order__write_date #: model:ir.model.fields,field_description:tms.field_tms_route__write_date @@ -784,33 +1057,31 @@ msgid "Last Updated on" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "Licence Expiration Date" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "Licence No." msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "Licence Type" msgstr "" #. module: tms -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_form_inherit msgid "License File" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__driver_license_type -#: model:ir.model.fields,field_description:tms.field_res_users__driver_license_type +#: model:ir.model.fields,field_description:tms.field_tms_driver__driver_license_type msgid "License type" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__tms_type__location #: model_terms:ir.ui.view,arch_db:tms.view_res_partner_tree_tms_location #: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form msgid "Location" @@ -819,6 +1090,7 @@ msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_res_partner__location_type #: model:ir.model.fields,field_description:tms.field_res_users__location_type +#: model:ir.model.fields,field_description:tms.field_tms_driver__location_type msgid "Location Type" msgstr "" @@ -986,32 +1258,41 @@ msgid "Master Data" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_has_error #: model:ir.model.fields,field_description:tms.field_tms_order__message_has_error msgid "Message Delivery error" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_ids #: model:ir.model.fields,field_description:tms.field_tms_order__message_ids msgid "Messages" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__mobile +msgid "Mobile" +msgstr "" + #. module: tms #: model:ir.ui.menu,name:tms.menu_config_fleet_models_models msgid "Models" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__my_activity_date_deadline #: model:ir.model.fields,field_description:tms.field_tms_order__my_activity_date_deadline msgid "My Activity Deadline" msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_crew__name +#: model:ir.model.fields,field_description:tms.field_tms_driver__name #: model:ir.model.fields,field_description:tms.field_tms_insurance__name #: model:ir.model.fields,field_description:tms.field_tms_order__name #: model:ir.model.fields,field_description:tms.field_tms_stage__name #: model:ir.model.fields,field_description:tms.field_tms_team__name -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_tree_tms_driver +#: model_terms:ir.ui.view,arch_db:tms.view_tms_driver_tree msgid "Name" msgstr "" @@ -1020,28 +1301,35 @@ msgstr "" #: code:addons/tms/models/tms_order.py:0 #: code:addons/tms/tests/test_tms_order.py:0 #: code:addons/tms/tests/test_tms_order.py:0 -#: code:addons/tms/tests/test_tms_order.py:0 -#: code:addons/tms/tests/test_tms_order.py:0 #, python-format msgid "New" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_date_deadline #: model:ir.model.fields,field_description:tms.field_tms_order__activity_date_deadline msgid "Next Activity Deadline" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_summary #: model:ir.model.fields,field_description:tms.field_tms_order__activity_summary msgid "Next Activity Summary" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_type_id #: model:ir.model.fields,field_description:tms.field_tms_order__activity_type_id msgid "Next Activity Type" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__email_normalized +msgid "Normalized Email" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__comment #: model_terms:ir.ui.view,arch_db:tms.view_tms_route_form msgid "Notes" msgstr "" @@ -1052,6 +1340,7 @@ msgid "Notes/Comments" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_needaction_counter #: model:ir.model.fields,field_description:tms.field_tms_order__message_needaction_counter msgid "Number of Actions" msgstr "" @@ -1062,16 +1351,19 @@ msgid "Number of Trips" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__message_has_error_counter #: model:ir.model.fields,field_description:tms.field_tms_order__message_has_error_counter msgid "Number of errors" msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__message_needaction_counter #: model:ir.model.fields,help:tms.field_tms_order__message_needaction_counter msgid "Number of messages requiring action" msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__message_has_error_counter #: model:ir.model.fields,help:tms.field_tms_order__message_has_error_counter msgid "Number of messages with delivery error" msgstr "" @@ -1118,6 +1410,26 @@ msgstr "" msgid "Other Personnel" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__parent_name +msgid "Parent name" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__partner_id +msgid "Partner" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__same_company_registry_partner_id +msgid "Partner with same Company Registry" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__same_vat_partner_id +msgid "Partner with same Tax ID" +msgstr "" + #. module: tms #: model:ir.model.fields.selection,name:tms.selection__fleet_vehicle__operation__passenger msgid "Passenger" @@ -1129,6 +1441,21 @@ msgstr "" msgid "Personnel" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__phone +msgid "Phone" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__plan_to_change_bike +msgid "Plan To Change Bike" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__plan_to_change_car +msgid "Plan To Change Car" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form msgid "Planning" @@ -1149,17 +1476,28 @@ msgstr "" msgid "Priority Management Explanation" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__ref +msgid "Reference" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form msgid "Refresh" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__parent_id +msgid "Related Company" +msgstr "" + #. module: tms #: model:ir.ui.menu,name:tms.reporting msgid "Reporting" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__activity_user_id #: model:ir.model.fields,field_description:tms.field_tms_order__activity_user_id msgid "Responsible User" msgstr "" @@ -1188,6 +1526,11 @@ msgstr "" msgid "Routes" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__user_id +msgid "Salesperson" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_order__scheduled_duration #: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form @@ -1219,6 +1562,11 @@ msgstr "" msgid "Scheduled duration of the work in hours" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__self +msgid "Self" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form msgid "Sell trips or tickets" @@ -1256,14 +1604,43 @@ msgstr "" msgid "Settings" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__partner_share +msgid "Share Partner" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__signup_expiration +msgid "Signup Expiration" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__signup_token +msgid "Signup Token" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__signup_type +msgid "Signup Token Type" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__signup_valid +msgid "Signup Token is Valid" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__signup_url +msgid "Signup URL" +msgstr "" + #. module: tms #: model:uom.category,name:tms.uom_category_speed msgid "Speed" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__stage_id -#: model:ir.model.fields,field_description:tms.field_res_users__stage_id +#: model:ir.model.fields,field_description:tms.field_tms_driver__stage_id #: model:ir.model.fields,field_description:tms.field_tms_order__stage_id #: model_terms:ir.ui.view,arch_db:tms.tms_stage_form_view #: model_terms:ir.ui.view,arch_db:tms.view_tms_order_search @@ -1283,6 +1660,11 @@ msgstr "" msgid "Stages" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__starred_message_ids +msgid "Starred Message" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_order_view_form #: model_terms:ir.ui.view,arch_db:tms.tms_order_view_tree @@ -1300,6 +1682,7 @@ msgid "Start Trip" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__state_id #: model:ir.model.fields,field_description:tms.field_tms_insurance__state msgid "State" msgstr "" @@ -1310,6 +1693,7 @@ msgid "Status" msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__activity_state #: model:ir.model.fields,help:tms.field_tms_order__activity_state msgid "" "Status based on activities\n" @@ -1334,12 +1718,23 @@ msgstr "" msgid "Stops locations in route" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__street +msgid "Street" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__street2 +msgid "Street2" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_team_view_kanban msgid "TRIPS" msgstr "" #. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__category_id #: model:ir.ui.menu,name:tms.menu_config_fleet_vehicles_tags msgid "Tags" msgstr "" @@ -1349,9 +1744,13 @@ msgstr "" msgid "Tasks Analysis" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__vat +msgid "Tax ID" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_order__tms_team_id -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms #: model_terms:ir.ui.view,arch_db:tms.view_tms_order_search msgid "Team" msgstr "" @@ -1376,16 +1775,50 @@ msgid "Teams" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__driver_type__terrestrial #: model:ir.model.fields.selection,name:tms.selection__res_partner__location_type__terrestrial +#: model:ir.model.fields.selection,name:tms.selection__tms_driver__driver_type__terrestrial msgid "Terrestrial" msgstr "" +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__country_code +msgid "" +"The ISO country code in two chars. \n" +"You can use this field for quick search." +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__vat +msgid "" +"The Tax Identification Number. Values here will be validated based on the " +"country format. You can use '/' to indicate that the partner is not subject " +"to tax." +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__user_id +msgid "The internal user in charge of this contact." +msgstr "" + #. module: tms #: model:ir.model.constraint,message:tms.constraint_tms_insurance_unique_policy_number_per_insurer msgid "The policy number must be unique for each insurer!" msgstr "" +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__company_registry +msgid "" +"The registry number of the company. Use it if it is different from the Tax " +"ID. It must be unique across all partners of a same country" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__email_normalized +msgid "" +"This field is used to search on email address as the primary email field can" +" contain more than strictly an email address." +msgstr "" + #. module: tms #: model:ir.model.fields,help:tms.field_tms_stage__fold msgid "" @@ -1398,6 +1831,21 @@ msgstr "" msgid "Time Uom" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__tz +msgid "Timezone" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__tz_offset +msgid "Timezone offset" +msgstr "" + +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__title +msgid "Title" +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_res_config_settings__tms_distance_uom msgid "Tms Distance Uom" @@ -1415,9 +1863,8 @@ msgstr "" #. module: tms #: model:ir.model.fields,field_description:tms.field_fleet_vehicle__tms_team_id -#: model:ir.model.fields,field_description:tms.field_res_partner__tms_team_id -#: model:ir.model.fields,field_description:tms.field_res_users__tms_team_id #: model:ir.model.fields,field_description:tms.field_tms_crew__tms_team_id +#: model:ir.model.fields,field_description:tms.field_tms_driver__tms_team_id msgid "Tms Team" msgstr "" @@ -1435,7 +1882,6 @@ msgstr "" #: model:ir.ui.menu,name:tms.root #: model_terms:ir.ui.view,arch_db:tms.fleet_vehicle_inherit_view_form #: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms msgid "Transport" msgstr "" @@ -1469,6 +1915,13 @@ msgstr "" msgid "Transport Management System Team" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_res_partner__tms_location +#: model:ir.model.fields,field_description:tms.field_res_users__tms_location +#: model:ir.model.fields,field_description:tms.field_tms_driver__tms_location +msgid "Transport location" +msgstr "" + #. module: tms #: model:ir.model.fields.selection,name:tms.selection__tms_stage__stage_type__order msgid "Trip" @@ -1503,8 +1956,7 @@ msgstr "" #: model:ir.actions.act_window,name:tms.action_tms_dash_order #: model:ir.actions.act_window,name:tms.action_tms_operation_trip #: model:ir.actions.act_window,name:tms.action_tms_report_order -#: model:ir.model.fields,field_description:tms.field_res_partner__trips_ids -#: model:ir.model.fields,field_description:tms.field_res_users__trips_ids +#: model:ir.model.fields,field_description:tms.field_tms_driver__trips_ids #: model:ir.ui.menu,name:tms.menu_tms_dash_order #: model:ir.ui.menu,name:tms.menu_tms_report_trip #: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form @@ -1519,17 +1971,14 @@ msgid "Trips Kanban" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__driver_type -#: model:ir.model.fields,field_description:tms.field_res_partner__tms_type -#: model:ir.model.fields,field_description:tms.field_res_users__driver_type -#: model:ir.model.fields,field_description:tms.field_res_users__tms_type +#: model:ir.model.fields,field_description:tms.field_tms_driver__driver_type #: model:ir.model.fields,field_description:tms.field_tms_stage__stage_type -#: model_terms:ir.ui.view,arch_db:tms.view_res_partner_form_inherit_tms #: model_terms:ir.ui.view,arch_db:tms.view_tms_stage_search msgid "Type" msgstr "" #. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__activity_exception_decoration #: model:ir.model.fields,help:tms.field_tms_order__activity_exception_decoration msgid "Type of the exception activity on record." msgstr "" @@ -1565,6 +2014,11 @@ msgstr "" msgid "Use Hex Code only Ex:-#FFFFFF" msgstr "" +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__barcode +msgid "Use a barcode to identify this contact." +msgstr "" + #. module: tms #: model:ir.model.fields,field_description:tms.field_tms_order__route msgid "Use predefined route" @@ -1585,6 +2039,11 @@ msgstr "" msgid "User" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__user_ids +msgid "Users" +msgstr "" + #. module: tms #: model:ir.model,name:tms.model_fleet_vehicle #: model:ir.model.fields,field_description:tms.field_tms_insurance__vehicle_ids @@ -1605,8 +2064,7 @@ msgid "Vehicle Insurance security days" msgstr "" #. module: tms -#: model:ir.model.fields,field_description:tms.field_res_partner__vehicles_ids -#: model:ir.model.fields,field_description:tms.field_res_users__vehicles_ids +#: model:ir.model.fields,field_description:tms.field_tms_driver__vehicles_ids #: model:ir.ui.menu,name:tms.menu_fleet_vehicle #: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form #: model_terms:ir.ui.view,arch_db:tms.tms_insurance_view_form @@ -1619,6 +2077,19 @@ msgstr "" msgid "Vehicles Count" msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__website +msgid "Website Link" +msgstr "" + +#. module: tms +#: model:ir.model.fields,help:tms.field_tms_driver__tz +msgid "" +"When printing documents and exporting/importing data, time values are computed according to this timezone.\n" +"If the timezone is not set, UTC (Coordinated Universal Time) is used.\n" +"Anywhere else, time values are computed according to the time offset of your web client." +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.tms_stage_form_view msgid "" @@ -1640,6 +2111,11 @@ msgstr "" msgid "You must create an TMS order stage first." msgstr "" +#. module: tms +#: model:ir.model.fields,field_description:tms.field_tms_driver__zip +msgid "Zip" +msgstr "" + #. module: tms #: model_terms:ir.ui.view,arch_db:tms.res_config_settings_view_form msgid "e.g. Hours" @@ -1666,7 +2142,7 @@ msgid "e.g. m" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__distance_traveled_uom__km +#: model:ir.model.fields.selection,name:tms.selection__tms_driver__distance_traveled_uom__km msgid "km" msgstr "" @@ -1676,7 +2152,7 @@ msgid "km/h" msgstr "" #. module: tms -#: model:ir.model.fields.selection,name:tms.selection__res_partner__distance_traveled_uom__mi +#: model:ir.model.fields.selection,name:tms.selection__tms_driver__distance_traveled_uom__mi msgid "mi" msgstr "" @@ -1685,6 +2161,11 @@ msgstr "" msgid "mph" msgstr "" +#. module: tms +#: model:ir.model,name:tms.model_tms_driver +msgid "tms.driver" +msgstr "" + #. module: tms #: model:ir.model,name:tms.model_tms_insurance msgid "tms.insurance" From df323db6a876783734626ae10aef2b3d4cec2907 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 30 Sep 2024 14:19:29 +0000 Subject: [PATCH 3/4] [BOT] post-merge updates --- tms/README.rst | 2 +- tms/static/description/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tms/README.rst b/tms/README.rst index a5a226f4b..a09288f83 100644 --- a/tms/README.rst +++ b/tms/README.rst @@ -7,7 +7,7 @@ Transport !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:94e85355354ee78eba36d80fb1eba526641fb73957eb37481c256f6572312983 + !! source digest: sha256:b2144995fbc4816a0cf4cd0a224ae48f0ea6da9c795b3f9592dd407235dcf7f8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/tms/static/description/index.html b/tms/static/description/index.html index 43c051ca7..874522675 100644 --- a/tms/static/description/index.html +++ b/tms/static/description/index.html @@ -367,7 +367,7 @@

Transport

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:94e85355354ee78eba36d80fb1eba526641fb73957eb37481c256f6572312983 +!! source digest: sha256:b2144995fbc4816a0cf4cd0a224ae48f0ea6da9c795b3f9592dd407235dcf7f8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/stock-logistics-transport Translate me on Weblate Try me on Runboat

The Transport Management Systems (TMS) module manages the workflow of From ed456891aafb5d239e5dd6b7cf1e259c4261ee16 Mon Sep 17 00:00:00 2001 From: EdgarRetes Date: Wed, 9 Oct 2024 11:33:08 -0600 Subject: [PATCH 4/4] [MIG] tms: Migration to 18.0 --- tms/README.rst | 10 ++++---- tms/__manifest__.py | 2 +- tms/data/tms_stage.xml | 8 +++--- tms/data/tms_team.xml | 2 -- tms/data/uom_category.xml | 2 +- tms/demo/res_partner.xml | 3 --- tms/demo/tms_crew.xml | 2 -- tms/demo/tms_driver.xml | 1 - tms/demo/tms_order.xml | 2 -- tms/demo/tms_route.xml | 2 -- tms/demo/tms_team.xml | 2 -- tms/models/fleet_vehicle.py | 2 +- tms/models/tms_driver.py | 1 + tms/models/tms_insurance.py | 1 + tms/models/tms_order.py | 14 +++++++---- tms/security/ir_rule.xml | 2 -- tms/security/res_groups.xml | 4 +++ tms/static/description/index.html | 6 ++--- tms/views/fleet_menu.xml | 8 +++--- tms/views/fleet_vehicle.xml | 24 ++++++++++-------- tms/views/menu.xml | 3 --- tms/views/res_config_settings.xml | 2 -- tms/views/res_partner.xml | 17 ++++++------- tms/views/tms_crew.xml | 3 +-- tms/views/tms_driver.xml | 19 +++++++------- tms/views/tms_insurance.xml | 12 ++++----- tms/views/tms_order.xml | 42 +++++++++++-------------------- tms/views/tms_route.xml | 25 +++++++----------- tms/views/tms_stage.xml | 15 ++++++----- tms/views/tms_team.xml | 6 ++--- 30 files changed, 102 insertions(+), 140 deletions(-) diff --git a/tms/README.rst b/tms/README.rst index a09288f83..8d6d583a4 100644 --- a/tms/README.rst +++ b/tms/README.rst @@ -17,13 +17,13 @@ Transport :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--transport-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-transport/tree/17.0/tms + :target: https://github.com/OCA/stock-logistics-transport/tree/18.0/tms :alt: OCA/stock-logistics-transport .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-transport-17-0/stock-logistics-transport-17-0-tms + :target: https://translation.odoo-community.org/projects/stock-logistics-transport-18-0/stock-logistics-transport-18-0-tms :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/stock-logistics-transport&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-transport&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -161,7 +161,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -222,6 +222,6 @@ Current `maintainers `__: |maintainer-max3903| |maintainer-santiagordz| |maintainer-EdgarRetes| -This module is part of the `OCA/stock-logistics-transport `_ project on GitHub. +This module is part of the `OCA/stock-logistics-transport `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/tms/__manifest__.py b/tms/__manifest__.py index e347fe452..62d7b7488 100644 --- a/tms/__manifest__.py +++ b/tms/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Transport", "summary": "Manage Vehicles, Drivers, Routes and Trips", - "version": "17.0.1.0.0", + "version": "18.0.1.0.0", "license": "AGPL-3", "category": "TMS", "author": "Open Source Integrators, Odoo Community Association (OCA)", diff --git a/tms/data/tms_stage.xml b/tms/data/tms_stage.xml index 06d57378e..ee3ef4c96 100644 --- a/tms/data/tms_stage.xml +++ b/tms/data/tms_stage.xml @@ -1,5 +1,4 @@ - Draft @@ -8,6 +7,7 @@ order #ECF0F1 + Confirmed 20 @@ -15,6 +15,7 @@ order #ECF0F1 + Completed 30 @@ -23,6 +24,7 @@ True #1C2833 + Cancelled 40 @@ -32,7 +34,6 @@ #1C2833 - In Base @@ -41,17 +42,18 @@ True #1C2833 + In Trip 20 driver #1C2833 + Not Available 30 driver #1C2833 - diff --git a/tms/data/tms_team.xml b/tms/data/tms_team.xml index 86cf13a98..fc22ba2a5 100644 --- a/tms/data/tms_team.xml +++ b/tms/data/tms_team.xml @@ -1,7 +1,5 @@ - Default Team - diff --git a/tms/data/uom_category.xml b/tms/data/uom_category.xml index 618efd3cd..68fd06224 100644 --- a/tms/data/uom_category.xml +++ b/tms/data/uom_category.xml @@ -3,7 +3,7 @@ Speed - + km/h diff --git a/tms/demo/res_partner.xml b/tms/demo/res_partner.xml index e7632432d..2c554e22a 100644 --- a/tms/demo/res_partner.xml +++ b/tms/demo/res_partner.xml @@ -1,5 +1,4 @@ - @@ -101,6 +100,4 @@ 77058 - - diff --git a/tms/demo/tms_crew.xml b/tms/demo/tms_crew.xml index 540452429..1b0589ee5 100644 --- a/tms/demo/tms_crew.xml +++ b/tms/demo/tms_crew.xml @@ -1,5 +1,4 @@ - Crew Mexico 1 @@ -12,5 +11,4 @@ ])]" /> - diff --git a/tms/demo/tms_driver.xml b/tms/demo/tms_driver.xml index bf1f586b2..288a87cb4 100644 --- a/tms/demo/tms_driver.xml +++ b/tms/demo/tms_driver.xml @@ -1,5 +1,4 @@ - Sergio Perez diff --git a/tms/demo/tms_order.xml b/tms/demo/tms_order.xml index 00da1665d..612495f7b 100644 --- a/tms/demo/tms_order.xml +++ b/tms/demo/tms_order.xml @@ -1,5 +1,4 @@ - TMS/DEMO1 False @@ -27,5 +26,4 @@ - diff --git a/tms/demo/tms_route.xml b/tms/demo/tms_route.xml index 33e507682..81092b8ee 100644 --- a/tms/demo/tms_route.xml +++ b/tms/demo/tms_route.xml @@ -1,5 +1,4 @@ - US Route @@ -16,5 +15,4 @@ - diff --git a/tms/demo/tms_team.xml b/tms/demo/tms_team.xml index a02bbba52..1150e0936 100644 --- a/tms/demo/tms_team.xml +++ b/tms/demo/tms_team.xml @@ -1,5 +1,4 @@ - Team Mexico - diff --git a/tms/models/fleet_vehicle.py b/tms/models/fleet_vehicle.py index 4f89ab4ad..a0c9f0aff 100644 --- a/tms/models/fleet_vehicle.py +++ b/tms/models/fleet_vehicle.py @@ -9,7 +9,7 @@ class FleetVehicle(models.Model): tms_team_id = fields.Many2one("tms.team") - tms_driver_id = fields.Many2one("tms.driver", string="Driver") + tms_driver_id = fields.Many2one("tms.driver", string="Driver Id") # Operation operation = fields.Selection([("cargo", "Cargo"), ("passenger", "Passenger")]) diff --git a/tms/models/tms_driver.py b/tms/models/tms_driver.py index fe9f0c3bb..6ba9f3665 100644 --- a/tms/models/tms_driver.py +++ b/tms/models/tms_driver.py @@ -16,6 +16,7 @@ class TmsDriver(models.Model): _name = "tms.driver" _inherit = ["mail.thread"] _inherits = {"res.partner": "partner_id"} + _description = "Model for TMS drivers" partner_id = fields.Many2one("res.partner", required=True, ondelete="cascade") diff --git a/tms/models/tms_insurance.py b/tms/models/tms_insurance.py index fc52c28cc..ce75c8c93 100644 --- a/tms/models/tms_insurance.py +++ b/tms/models/tms_insurance.py @@ -7,6 +7,7 @@ class TMSInsurance(models.Model): _name = "tms.insurance" + _description = "Model for TMS insurances" active = fields.Boolean(default=True) company_id = fields.Many2one( diff --git a/tms/models/tms_order.py b/tms/models/tms_order.py index ec79abbc2..fa05d6e46 100644 --- a/tms/models/tms_order.py +++ b/tms/models/tms_order.py @@ -38,9 +38,12 @@ class TMSOrder(models.Model): route_id = fields.Many2one( "tms.route", compute="_compute_route_id", store=True, readonly=False ) - route_origin = fields.Char(related="route_id.origin_location_id.display_name") + route_origin = fields.Char( + related="route_id.origin_location_id.display_name", string="Route origin" + ) route_destination = fields.Char( - related="route_id.destination_location_id.display_name" + related="route_id.destination_location_id.display_name", + string="Route destination", ) origin_id = fields.Many2one( @@ -60,8 +63,8 @@ class TMSOrder(models.Model): readonly=False, ) - origin_location = fields.Char(string="Origin") - destination_location = fields.Char(string="Destination") + origin_location = fields.Char() + destination_location = fields.Char() driver_id = fields.Many2one( "tms.driver", @@ -270,7 +273,8 @@ def _compute_active_crew(self): ] @api.model - def _read_group_stage_ids(self, stages, domain, order): + def _read_group_stage_ids(self, stages, domain, order=None): + order = order or "sequence, id" return self.env["tms.stage"].search([("stage_type", "=", "order")], order=order) def button_start_order(self): diff --git a/tms/security/ir_rule.xml b/tms/security/ir_rule.xml index 819a02eca..4e47c186f 100644 --- a/tms/security/ir_rule.xml +++ b/tms/security/ir_rule.xml @@ -3,7 +3,6 @@ Copyright (C) 2019 Open Source Integrators License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - TMS Orders Entry @@ -27,5 +26,4 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - diff --git a/tms/security/res_groups.xml b/tms/security/res_groups.xml index e86e76ae2..85ad7eb6c 100644 --- a/tms/security/res_groups.xml +++ b/tms/security/res_groups.xml @@ -53,4 +53,8 @@ + + Manage TMS Oum + + diff --git a/tms/static/description/index.html b/tms/static/description/index.html index 874522675..22d8dc7de 100644 --- a/tms/static/description/index.html +++ b/tms/static/description/index.html @@ -369,7 +369,7 @@

Transport

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:b2144995fbc4816a0cf4cd0a224ae48f0ea6da9c795b3f9592dd407235dcf7f8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Alpha License: AGPL-3 OCA/stock-logistics-transport Translate me on Weblate Try me on Runboat

+

Alpha License: AGPL-3 OCA/stock-logistics-transport Translate me on Weblate Try me on Runboat

The Transport Management Systems (TMS) module manages the workflow of creating transport operations within Odoo. This module provides features such as creating teams, stages, crews, routes, and vehicles, allowing @@ -526,7 +526,7 @@

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.

+feedback.

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

@@ -572,7 +572,7 @@

Maintainers

promote its widespread use.

Current maintainers:

max3903 santiagordz EdgarRetes

-

This module is part of the OCA/stock-logistics-transport project on GitHub.

+

This module is part of the OCA/stock-logistics-transport project on GitHub.

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

diff --git a/tms/views/fleet_menu.xml b/tms/views/fleet_menu.xml index cfc694904..dabf419ed 100644 --- a/tms/views/fleet_menu.xml +++ b/tms/views/fleet_menu.xml @@ -1,9 +1,9 @@ - - - + + - + diff --git a/tms/views/fleet_vehicle.xml b/tms/views/fleet_vehicle.xml index 57475d9e2..c9e6fe54d 100644 --- a/tms/views/fleet_vehicle.xml +++ b/tms/views/fleet_vehicle.xml @@ -1,5 +1,4 @@ - fleet.vehicle.inherit.view.form fleet.vehicle @@ -9,25 +8,29 @@ - - -
- - Capacity +
+ + - Passengers -
- + >Passengers + +
+
-
diff --git a/tms/views/menu.xml b/tms/views/menu.xml index d189f5c1c..1d5cae8b7 100644 --- a/tms/views/menu.xml +++ b/tms/views/menu.xml @@ -1,5 +1,4 @@ - - - diff --git a/tms/views/res_config_settings.xml b/tms/views/res_config_settings.xml index 1181e995c..f9523c1df 100644 --- a/tms/views/res_config_settings.xml +++ b/tms/views/res_config_settings.xml @@ -173,6 +173,4 @@ inline {'module': 'tms'} - - diff --git a/tms/views/res_partner.xml b/tms/views/res_partner.xml index cdf1c6cd3..d84aafee8 100644 --- a/tms/views/res_partner.xml +++ b/tms/views/res_partner.xml @@ -1,18 +1,17 @@ - - - res.partner.tree.tms.location + + res.partner.list.tms.location res.partner - + - + @@ -29,7 +28,7 @@ True - + False @@ -58,7 +57,6 @@ - Locations res.partner @@ -66,15 +64,14 @@ name="context" >{"search_default_tms_location": True, "default_tms_location": True} - tree,form + list,form - diff --git a/tms/views/tms_crew.xml b/tms/views/tms_crew.xml index a08834732..6a2baad9e 100644 --- a/tms/views/tms_crew.xml +++ b/tms/views/tms_crew.xml @@ -1,5 +1,4 @@ - tms.crew.view.kanban @@ -98,6 +97,6 @@ Crews tms.crew - tree,form + list,form diff --git a/tms/views/tms_driver.xml b/tms/views/tms_driver.xml index 0e8fb5175..3a273f9d0 100644 --- a/tms/views/tms_driver.xml +++ b/tms/views/tms_driver.xml @@ -1,14 +1,14 @@ - - tms.driver.tree + + tms.driver.list tms.driver - + - + @@ -24,7 +24,7 @@ name="stage_id" widget="statusbar" domain="[('stage_type', '=', 'driver')]" - options="{'clickable':True}, {'fold_field':'fold'}" + options="{'clickable':True, 'fold_field':'fold'}" /> @@ -36,7 +36,7 @@ True - + False @@ -86,7 +86,6 @@ - @@ -197,13 +196,13 @@ Drivers tms.driver [('is_company', '=', False)] - kanban,tree,form + kanban,list,form @@ -212,6 +211,6 @@ Drivers tms.driver - tree,form + list,form diff --git a/tms/views/tms_insurance.xml b/tms/views/tms_insurance.xml index a9c174032..a62ec1f31 100644 --- a/tms/views/tms_insurance.xml +++ b/tms/views/tms_insurance.xml @@ -1,15 +1,14 @@ - - - tms.insurance.view.tree + + tms.insurance.view.list tms.insurance - + - + @@ -55,7 +54,6 @@ Insurance Policies tms.insurance - tree,form + list,form - diff --git a/tms/views/tms_order.xml b/tms/views/tms_order.xml index 39b80a6d0..295a476e7 100644 --- a/tms/views/tms_order.xml +++ b/tms/views/tms_order.xml @@ -1,12 +1,10 @@ - - - - - tms.order.view.tree + + + tms.order.view.list tms.order - + @@ -28,7 +26,7 @@ class="btn btn-primary text-uppercase" invisible="not start_trip or end_trip" /> - + @@ -38,7 +36,6 @@ tms.order
- @@ -75,17 +72,14 @@ name="stage_id" widget="statusbar" domain="[('stage_type', '=', 'order')]" - options="{'clickable':True}, {'fold_field':'fold'}" + options="{'clickable':True, 'fold_field':'fold'}" /> - -
- -
+
@@ -358,7 +346,6 @@
-
@@ -408,7 +395,7 @@ Trips tms.order - tree,form + list,form @@ -420,20 +407,19 @@ Stages tms.order - tree,form + list,form Trips tms.order - kanban,tree,form + kanban,list,form Trips Kanban tms.order - kanban,tree,form + kanban,list,form [('tms_team_id', '=', active_id)] -
diff --git a/tms/views/tms_route.xml b/tms/views/tms_route.xml index b87132a32..e5fb615ba 100644 --- a/tms/views/tms_route.xml +++ b/tms/views/tms_route.xml @@ -1,15 +1,14 @@ - - - - tms.route.view.tree + + + tms.route.view.list tms.route - + - + @@ -19,17 +18,12 @@ tms.route
- - -
- -
- +
@@ -95,9 +89,9 @@ widget="many2many" domain="[('tms_location', '=', 'True')]" > - + - + @@ -129,7 +123,6 @@ Routes tms.route - tree,form + list,form - diff --git a/tms/views/tms_stage.xml b/tms/views/tms_stage.xml index 03fc8514d..9be140906 100644 --- a/tms/views/tms_stage.xml +++ b/tms/views/tms_stage.xml @@ -1,14 +1,14 @@ - - - tms.stage.tree + + + tms.stage.list tms.stage - + - + @@ -65,7 +65,7 @@ string="Archived" domain="[('active', '=', False)]" /> - Stages tms.stage - tree,form + list,form {'search_default_group_stage_type': 1}

@@ -87,5 +87,4 @@

-
diff --git a/tms/views/tms_team.xml b/tms/views/tms_team.xml index 25d0298a9..a0123703e 100644 --- a/tms/views/tms_team.xml +++ b/tms/views/tms_team.xml @@ -1,5 +1,4 @@ - tms.team.kanban @@ -150,13 +149,12 @@ Teams tms.team - kanban,tree,form + kanban,list,form Teams tms.team - tree,form + list,form -