diff --git a/maintenance_plan/README.rst b/maintenance_plan/README.rst new file mode 100644 index 000000000..e4b1676a9 --- /dev/null +++ b/maintenance_plan/README.rst @@ -0,0 +1,146 @@ +================ +Maintenance Plan +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:cd21f05e56ccccd12e88d22a3009fd970401a379a695813d5815b03ed56303a2 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmaintenance-lightgray.png?logo=github + :target: https://github.com/OCA/maintenance/tree/17.0/maintenance_plan + :alt: OCA/maintenance +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/maintenance-17-0/maintenance-17-0-maintenance_plan + :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/maintenance&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of Odoo Maintenance module by +allowing an equipment to have different preventive maintenance kinds. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Install the module. + +Should you already use the maintenance module and have equipments with +field 'Preventive Maintenance Frequency' defined, a new maintenance plan +will be automatically created on these equipments with maintenance kind +'Install'. + +Moreover if a Request of type 'preventive' exists, whose stage isn't +marked as 'Request done', and has a Request Date matching the +equipment's 'Next Preventive Maintenance', the request will be updated +with the 'Install' maintenance kind. + +Make sure you don't have multiple 'preventive' requests at a stage which +isn't marked as 'Request done' and on the same 'Request date' as the +equipment or the module installation will fail with a User Error. + +Usage +===== + +Instead of defining a period and duration for only one preventive +maintenance per equipment, you can define multiple preventive +maintenance kind for each equipment. + +Maintenance Kinds have to be defined through the configuration menu. +Their name have to be unique and can be set as active or inactive, +should these not be used anymore. + +On any equipment over the maintenance tab, the maintenance plan be +accessible, allowing to add different maintenance kind with their own +frequency and duration. The next maintenance date will then be computed +automatically according to the start's date and the frequency defined, +but the maintenance request won't be created automatically as is the +case in Odoo's Maintenance module. In the plan there's also a field +allowing the user to set the maintenance horizon, insert the +instructions to follow on the maintenance that will be forwarded to the +maintenance request generated from the plan. + +This module uses the original Cron job of Odoo's Maintenance module to +generate maintenance requests. To do so, it takes into account the +planning horizon and generates all maintenance requests whose schedule +date would fall inside that planning horizon. Therefore, the maintenance +manager can have a proper planning of how many maintenance requests are +programming for the future. Leaving planning horizon to 0 will only +create those maintenance request that are scheduled for today. + +We can also create maintenance requests from a plan using a domain for +selecting the equipments. This way, we might have a single plan that +will generate all the requests. In order to use it, we need to mark the +Generate with Domain field. + +Known issues / Roadmap +====================== + +This module is considered deprecated already in 17.0 because the +recurrence functionality is already included in core in the requests +themselves. +https://github.com/OCA/maintenance/pull/414#issuecomment-2668929617 + +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 +------- + +* Camptocamp SA +* ForgeFlow + +Contributors +------------ + +- Akim Juillerat +- Matteo Mazzoni +- David Alonso +- Adrià Gil Sorribes +- Jordi Ballester Alomar +- Lois Rilo +- Enric Tobella +- Alexei Rivera + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/maintenance `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/maintenance_plan/__init__.py b/maintenance_plan/__init__.py new file mode 100644 index 000000000..cc6b6354a --- /dev/null +++ b/maintenance_plan/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import post_init_hook diff --git a/maintenance_plan/__manifest__.py b/maintenance_plan/__manifest__.py new file mode 100644 index 000000000..56c23467c --- /dev/null +++ b/maintenance_plan/__manifest__.py @@ -0,0 +1,26 @@ +# Copyright 2017 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Maintenance Plan", + "summary": "Extends preventive maintenance planning", + "version": "18.0.1.0.0", + "author": "Camptocamp SA, ForgeFlow, Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Maintenance", + "website": "https://github.com/OCA/maintenance", + "images": [], + "depends": ["base_maintenance"], + "data": [ + "security/ir.model.access.csv", + "security/maintenance_security.xml", + "data/ir_cron.xml", + "views/maintenance_kind_views.xml", + "views/maintenance_plan_views.xml", + "views/maintenance_equipment_views.xml", + "views/report_maintenance_request.xml", + ], + "external_dependencies": {"python": ["python-dateutil"]}, + "demo": ["demo/demo_maintenance_plan.xml"], + "post_init_hook": "post_init_hook", + "installable": True, +} diff --git a/maintenance_plan/data/ir_cron.xml b/maintenance_plan/data/ir_cron.xml new file mode 100644 index 000000000..1e5ac0c4b --- /dev/null +++ b/maintenance_plan/data/ir_cron.xml @@ -0,0 +1,11 @@ + + + + Maintenance: generate preventive maintenance requests + + code + model._cron_generate_requests() + 1 + days + + diff --git a/maintenance_plan/demo/demo_maintenance_plan.xml b/maintenance_plan/demo/demo_maintenance_plan.xml new file mode 100644 index 000000000..e7e07e970 --- /dev/null +++ b/maintenance_plan/demo/demo_maintenance_plan.xml @@ -0,0 +1,57 @@ + + + + + Monthly + + + + Weekly + + + + + + + 1 + month + 2 + 2 + month + + + + + 1 + month + 2 + 2 + month + + + + + 1 + month + 2 + 1 + month + + + + + 1 + month + 4 + 3 + month + + + + + 7 + 2 + 1 + month + + diff --git a/maintenance_plan/hooks.py b/maintenance_plan/hooks.py new file mode 100644 index 000000000..4aa4b556a --- /dev/null +++ b/maintenance_plan/hooks.py @@ -0,0 +1,48 @@ +# Copyright 2017 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging + +from odoo import _ +from odoo.exceptions import UserError + + +def post_init_hook(env): + logging.getLogger("odoo.addons.maintenance_plan").info( + "Migrating existing preventive maintenance" + ) + + equipments = env["maintenance.equipment"].search([("expected_mtbf", "!=", False)]) + + if equipments: + maintenance_kind = env["maintenance.kind"].create( + {"name": "Install", "active": True} + ) + + for equipment in equipments: + request = equipment.maintenance_ids.filtered( + lambda r, equipment=equipment: r.maintenance_type == "preventive" + and not r.stage_id.done + and r.request_date == equipment.next_action_date + ) + if len(request) > 1: + raise UserError( + _( + "You have multiple preventive maintenance requests on " + "equipment %(name)s next action date (%(date)s). " + "Please leave only one preventive request on the " + "date of equipment's next action to install the module.", + name=equipment.name, + date=equipment.next_action_date, + ) + ) + elif len(request) == 1: + request.write({"maintenance_kind_id": maintenance_kind.id}) + env["maintenance.plan"].create( + { + "equipment_id": equipment.id, + "maintenance_kind_id": maintenance_kind.id, + "duration": equipment.mtbf, + "interval": equipment.expected_mtbf, + } + ) diff --git a/maintenance_plan/i18n/es.po b/maintenance_plan/i18n/es.po new file mode 100644 index 000000000..197f33260 --- /dev/null +++ b/maintenance_plan/i18n/es.po @@ -0,0 +1,691 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-03-01 13:30+0000\n" +"PO-Revision-Date: 2024-02-03 10:34+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.report_maintenance_request_document +msgid "Instructions:" +msgstr "Instrucciones:" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction +msgid "Action Needed" +msgstr "Acción necesaria" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__active +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Active" +msgstr "Activo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__active +msgid "Active Kind" +msgstr "Tipo activo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_ids +msgid "Activities" +msgstr "Actividades" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decoración de Actividad de Excepción" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_state +msgid "Activity State" +msgstr "Estado de actividad" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Activity Type Icon" +msgstr "Actividad de Tipo de Iconos" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_domain +msgid "Apply on" +msgstr "Solicitar el" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Archived" +msgstr "Archivado" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_attachment_count +msgid "Attachment Count" +msgstr "Total de adjuntos" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__company_id +msgid "Company" +msgstr "Compañía" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_open_count +msgid "Current Maintenance" +msgstr "Mantenimiento actual" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Date from which the maintenance will we active" +msgstr "Fecha desde la cual el mantenimiento estará activo" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__day +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__day +msgid "Day(s)" +msgstr "Día(s)" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Describe the maintenance to do..." +msgstr "Describa el mantenimiento a hacer..." + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__name +msgid "Description" +msgstr "Descripción" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__display_name +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__skip_notify_follower_on_requests +msgid "Do not notify to follower when creating requests?" +msgstr "¿No notificar al seguidor cuando se crean las peticiones?" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__duration +msgid "Duration (hours)" +msgstr "Duración (horas)" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__equipment_id +msgid "Equipment" +msgstr "Equipo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Socios)" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icono de Font Awesome ej. fa-tasks" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval +msgid "Frequency" +msgstr "Frecuencia" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_with_domain +msgid "Generate With Domain" +msgstr "Generar Con Dominio" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Generate requests for current threshold" +msgstr "Generar peticiones para el umbral actual" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__has_message +msgid "Has Message" +msgstr "Tiene mensaje" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__id +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__id +msgid "ID" +msgstr "ID" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon" +msgstr "Icono" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icono para indicar una actividad de excepción." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Si está marcado hay nuevos mensajes que requieren su atención." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Si se encuentra marcado, algunos mensajes tienen error de envío." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "If not clicked, the scheduled action will do it for you." +msgstr "Si no se pulsa, la acción programada lo hará por usted." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Inactive" +msgstr "Inactivo" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Instructions" +msgstr "Instrucciones" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval +msgid "Interval between each maintenance" +msgstr "Intervalo entre cada mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_is_follower +msgid "Is Follower" +msgstr "Es seguidor" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Kind" +msgstr "Amablemente" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_uid +msgid "Last Updated by" +msgstr "actualizado por última vez por" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__planning_step +msgid "Let the event automatically repeat at that interval" +msgstr "Permitir que el evento se repita automáticamente a cada intervalo" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval_step +msgid "Let the event automatically repeat at that interval step" +msgstr "" +"Permitir que el evento se repita automáticamente a cada paso del intervalo" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Maintenace Equipment must belong to the equipment's company" +msgstr "El equipo de mantenimiento debe pertenecer a la empresa del equipo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_count +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance" +msgstr "Mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__search_maintenance_plan_count +msgid "Maintenance All Plan Count" +msgstr "Mantenimiento Recuento de todos los planes" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "Equipo" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_kind +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_kind_id +msgid "Maintenance Kind" +msgstr "Tipo de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance Plan" +msgstr "Plan de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_count +msgid "Maintenance Plan Count" +msgstr "Número de planes de mantenimiento" + +#. module: maintenance_plan +#: model:ir.ui.menu,name:maintenance_plan.menu_m_plan_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Maintenance Plans" +msgstr "Planes de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_request +msgid "Maintenance Request" +msgstr "Peticiones de mantenimiento" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.hr_equipment_request_action_from_plan +msgid "Maintenance Requests" +msgstr "Peticiones de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_team_id +msgid "Maintenance Team" +msgstr "Equipo de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_team_required +msgid "Maintenance Team Required" +msgstr "Equipo de mantenimiento exigido" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__duration +msgid "Maintenance duration in hours" +msgstr "Duración del mantenimiento en horas" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_kind_id +msgid "Maintenance kind" +msgstr "Tipo de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_kind_name_uniq +msgid "Maintenance kind name already exists." +msgstr "Ya existe ese nombre de tipo de mantenimiento." + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_kind_action +#: model:ir.ui.menu,name:maintenance_plan.menu_maintenance_kind_configuration +msgid "Maintenance kinds" +msgstr "Tipos de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_ids +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_plan_id +msgid "Maintenance plan" +msgstr "Plan de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "" +"Maintenance planning horizon. Only the maintenance requests inside the " +"horizon will be created." +msgstr "" +"Horizonte del planning de mantenimiento. Solo se crearán las peticiones de " +"mantenimiento dentro del horizonte." + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_action +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_equipment_action +msgid "Maintenance plans" +msgstr "Planes de mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_ids +msgid "Maintenance requests" +msgstr "Peticiones de mantenimiento" + +#. module: maintenance_plan +#: model:ir.actions.server,name:maintenance_plan.maintenance_requests_cron_ir_actions_server +msgid "Maintenance: generate preventive maintenance requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error +msgid "Message Delivery error" +msgstr "Error de Envío de Mensaje" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_ids +msgid "Messages" +msgstr "Mensajes" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__month +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__month +msgid "Month(s)" +msgstr "Mensual(es)" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_monthly +msgid "Monthly" +msgstr "Mensual" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Mi plazo de actividades" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__name +msgid "Name" +msgstr "Nombre" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Siguiente plazo de actividad" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_summary +msgid "Next Activity Summary" +msgstr "Resumen de la siguiente actividad" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_id +msgid "Next Activity Type" +msgstr "Siguiente tipo de actividad" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__next_maintenance_date +msgid "Next Maintenance Date" +msgstr "Próximo mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__note +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__note +msgid "Note" +msgstr "Nota" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__notes +msgid "Notes" +msgstr "Notas" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de acciones" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of errors" +msgstr "Numero de errores" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensajes con error de envío" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon period" +msgstr "P. Periodo horizonte" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon step" +msgstr "P. Paso al horizonte" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Planning Horizon" +msgstr "Horizonte de planning" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "Planning Horizon period" +msgstr "Perido del horizonte de planning" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__planning_step +msgid "Planning Horizon step" +msgstr "Paso del horizonte de planning" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Plans" +msgstr "Planes" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(description)s" +msgstr "Mantenimiento preventivo (%(kind)s)-%(description)s" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(plan)s" +msgstr "Mantenimiento preventivo (%(kind)s)-%(plan)s" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__rating_ids +msgid "Ratings" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval_step +msgid "Recurrence" +msgstr "Recurrencia" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_user_id +msgid "Responsible User" +msgstr "Usuario responsable" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__search_equipment_id +msgid "Search Equipment" +msgstr "Equipo de Búsqueda" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "" +"Some maintenance plan's company is incompatible with the company of this " +"equipment." +msgstr "" +"algún plan de mantenimiento de la compañía es incompatible con la compañía " +"de este equipo." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Start Date" +msgstr "Fecha de inicio" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Start Maintenance Date" +msgstr "Fecha de inicio del mantenimiento" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__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 "" +"Estado basado en actividades\n" +"Vencida: la fecha tope ya ha pasado\n" +"Hoy: La fecha tope es hoy\n" +"Planificada: futuras actividades." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Team" +msgstr "Equipo" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "" +"The maintenance plan %(kind)s of equipment %(eqpmnt)s has generated a " +"request which is not done yet. You should either set the request as done, " +"remove its maintenance kind or delete it first." +msgstr "" +"El plan de mantenimiento %(kind)s del equipo %(eqpmnt)s ha generado una " +"solicitud que aún no se ha realizado. Debe establecer la solicitud como " +"realizada, eliminar su tipo de mantenimiento o eliminarla primero." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo de actividad de excepción registrada." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Under Maintenance" +msgstr "En mantenimiento" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmnt)s)" +msgstr "Plan %(kind)s sin nombre (%(eqpmnt)s)" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmt)s)" +msgstr "Plan %(kind)s sin nombre (%(eqpmt)s)" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(void)s plan (%(eqpmnt)s)" +msgstr "Plan %(void)s sin nombre (%(eqpmnt)s)" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Unspecified kind" +msgstr "Tipo no especificado" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unsupported search operator" +msgstr "Operador de búsqueda no soportado" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website Messages" +msgstr "Mensajes de la página web" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website communication history" +msgstr "historial de la comunicación en la web" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__week +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__week +msgid "Week(s)" +msgstr "Semana(s)" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_weekly +msgid "Weekly" +msgstr "Semanal" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__year +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__year +msgid "Year(s)" +msgstr "Año(s)" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_plan_equipment_kind_uniq +msgid "" +"You cannot define multiple times the same maintenance kind on an equipment " +"maintenance plan." +msgstr "" +"No se pueden definir varias veces el mismo tipo de mantenimiento en el plan " +"de mantenimiento de un equipo." + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/hooks.py:0 +#, python-format +msgid "" +"You have multiple preventive maintenance requests on equipment %(name)s next " +"action date (%(date)s). Please leave only one preventive request on the date " +"of equipment's next action to install the module." +msgstr "" +"Tiene varias solicitudes de mantenimiento preventivo en la fecha de la " +"próxima acción del equipo %(name)s (%(date)s). Por favor, deje sólo una " +"solicitud preventiva en la fecha de la próxima acción del equipo para " +"instalar el módulo." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "e.g. Calibration" +msgstr "p.ej. Calibración" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" + +#~ msgid "Main Attachment" +#~ msgstr "Adjunto principal" + +#~ msgid "Number of messages which requires an action" +#~ msgstr "Número de mensajes que requieren una acción" + +#~ msgid "Number of unread messages" +#~ msgstr "Número de mensajes no leidos" + +#~ msgid "Unread Messages" +#~ msgstr "Mensajes sin leer" + +#~ msgid "Unread Messages Counter" +#~ msgstr "Contador de mensajes sin leer" + +#~ msgid "SMS Delivery error" +#~ msgstr "Error de envío SMS" diff --git a/maintenance_plan/i18n/it.po b/maintenance_plan/i18n/it.po new file mode 100644 index 000000000..515bcd362 --- /dev/null +++ b/maintenance_plan/i18n/it.po @@ -0,0 +1,750 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-31 16:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.report_maintenance_request_document +msgid "Instructions:" +msgstr "Istruzioni:" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__active +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Active" +msgstr "Attivo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__active +msgid "Active Kind" +msgstr "Genere attivo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_domain +msgid "Apply on" +msgstr "Applica a" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Archived" +msgstr "In archivio" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_attachment_count +msgid "Attachment Count" +msgstr "Conteggio allegati" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__company_id +msgid "Company" +msgstr "Azienda" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_open_count +msgid "Current Maintenance" +msgstr "Manutenzione corrente" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Date from which the maintenance will we active" +msgstr "Data dalla quale la manutenzione sarà attiva" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__day +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__day +msgid "Day(s)" +msgstr "Giorno(i)" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Describe the maintenance to do..." +msgstr "Descrivere la manutenzione da fare..." + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__name +msgid "Description" +msgstr "Descrizione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__display_name +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__skip_notify_follower_on_requests +msgid "Do not notify to follower when creating requests?" +msgstr "Non segnalare a chi segue quando si creano richieste?" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__duration +msgid "Duration (hours)" +msgstr "Durata (ore)" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__equipment_id +msgid "Equipment" +msgstr "Attrezzatura" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval +msgid "Frequency" +msgstr "Frequenza" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_with_domain +msgid "Generate With Domain" +msgstr "Genera con dominio" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Generate requests for current threshold" +msgstr "Genera richieste per la soglia attuale" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__id +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__id +msgid "ID" +msgstr "ID" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon" +msgstr "Icona" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "If not clicked, the scheduled action will do it for you." +msgstr "Se non viene cliccato, l'azione schedulata lo farà automaticamente." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Inactive" +msgstr "Inattivo" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Instructions" +msgstr "Istruzioni" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval +msgid "Interval between each maintenance" +msgstr "Intervallo tra le manutenzioni" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Kind" +msgstr "Genere" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__planning_step +msgid "Let the event automatically repeat at that interval" +msgstr "Consente la ripetizione automatica dell'evento con quell'intervallo" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval_step +msgid "Let the event automatically repeat at that interval step" +msgstr "" +"Consente la ripetizione automatica dell'evento con quell'incremento di " +"intervallo" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Maintenace Equipment must belong to the equipment's company" +msgstr "" +"L'attrezzatura di manutenzione deve appartenere all'azienda dell'attrezzatura" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_count +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance" +msgstr "Manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__search_maintenance_plan_count +msgid "Maintenance All Plan Count" +msgstr "Conteggio di tutti i piani manutenzione" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "Attrezzatura manutenzione" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_kind +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_kind_id +msgid "Maintenance Kind" +msgstr "Genere manutenzione" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance Plan" +msgstr "Piano manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_count +msgid "Maintenance Plan Count" +msgstr "Conteggio piano di manutenzione" + +#. module: maintenance_plan +#: model:ir.ui.menu,name:maintenance_plan.menu_m_plan_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Maintenance Plans" +msgstr "Piani di manutenzione" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_request +msgid "Maintenance Request" +msgstr "Richiesta manutenzione" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.hr_equipment_request_action_from_plan +msgid "Maintenance Requests" +msgstr "Richieste di manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_team_id +msgid "Maintenance Team" +msgstr "Squadra manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_team_required +msgid "Maintenance Team Required" +msgstr "Squadra di manutenzione richiesta" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__duration +msgid "Maintenance duration in hours" +msgstr "Durata manutenzione in ore" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_kind_id +msgid "Maintenance kind" +msgstr "Genere manutenzione" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_kind_name_uniq +msgid "Maintenance kind name already exists." +msgstr "Nome genere manutenzione già esistente." + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_kind_action +#: model:ir.ui.menu,name:maintenance_plan.menu_maintenance_kind_configuration +msgid "Maintenance kinds" +msgstr "Generi manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_ids +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_plan_id +msgid "Maintenance plan" +msgstr "Piano di manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "" +"Maintenance planning horizon. Only the maintenance requests inside the " +"horizon will be created." +msgstr "" +"Orizzonte pianificazione manutenzione. Solo le manutenzioni richieste entro " +"l'orizzonte verranno create." + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_action +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_equipment_action +msgid "Maintenance plans" +msgstr "Piani di manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_ids +msgid "Maintenance requests" +msgstr "Richieste manutenzione" + +#. module: maintenance_plan +#: model:ir.actions.server,name:maintenance_plan.maintenance_requests_cron_ir_actions_server +msgid "Maintenance: generate preventive maintenance requests" +msgstr "Manutenzione: genera richieste manutenzione preventiva" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__month +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__month +msgid "Month(s)" +msgstr "Mese(i)" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_monthly +msgid "Monthly" +msgstr "Mensile" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__name +msgid "Name" +msgstr "Nome" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__next_maintenance_date +msgid "Next Maintenance Date" +msgstr "Data manutenzione successiva" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__note +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__note +msgid "Note" +msgstr "Nota" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__notes +msgid "Notes" +msgstr "Note" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon period" +msgstr "Periodo orizzonte piano" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon step" +msgstr "Passo orizzonte piano" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Planning Horizon" +msgstr "Orizzonte pianificazione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "Planning Horizon period" +msgstr "Periodo orizzonte pianificazione" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__planning_step +msgid "Planning Horizon step" +msgstr "Incremento orizzonte pianificazione" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Plans" +msgstr "Piani" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(description)s" +msgstr "Manutenzione preventiva (%(kind)s) - %(description)s" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(plan)s" +msgstr "Manutenzione preventiva (%(kind)s) - %(plan)s" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__rating_ids +msgid "Ratings" +msgstr "Valutazioni" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval_step +msgid "Recurrence" +msgstr "Ricorrenza" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__search_equipment_id +msgid "Search Equipment" +msgstr "Cerca attrezzatura" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "" +"Some maintenance plan's company is incompatible with the company of this " +"equipment." +msgstr "" +"Alcune aziende del piano manutenzione sono incompatibili con l'azienda di " +"questa attrezzatura." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Start Date" +msgstr "Data inizio" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Start Maintenance Date" +msgstr "Data inizio manutenzione" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__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 "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Team" +msgstr "Squadra" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "" +"The maintenance plan %(kind)s of equipment %(eqpmnt)s has generated a " +"request which is not done yet. You should either set the request as done, " +"remove its maintenance kind or delete it first." +msgstr "" +"Il piano di manutenzione %(kind)s dell'attrezzatura %(eqpmnt)s ha generato " +"una richiesta che non è ancora stata evasa. Bisogna prima impostarla ad " +"eseguita o eliminare il genere di manutenzione o eliminarla." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Under Maintenance" +msgstr "In manutenzione" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmnt)s)" +msgstr "Piano %(kind)s anonimo (%(eqpmnt)s)" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmt)s)" +msgstr "Piano %(kind)s anonimo (%(eqpmt)s)" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(void)s plan (%(eqpmnt)s)" +msgstr "Piano %(void)s anonimo (%(eqpmnt)s)" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Unspecified kind" +msgstr "Genere non specificato" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unsupported search operator" +msgstr "Operatore di ricerca non supportato" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website communication history" +msgstr "Storico comunicazioni sito web" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__week +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__week +msgid "Week(s)" +msgstr "Settimana(e)" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_weekly +msgid "Weekly" +msgstr "Settimanale" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__year +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__year +msgid "Year(s)" +msgstr "Anno(i)" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_plan_equipment_kind_uniq +msgid "" +"You cannot define multiple times the same maintenance kind on an equipment " +"maintenance plan." +msgstr "" +"Non si può definire più volte lo stesso genere di manutenzione in un piano " +"di manutenzione attrezzatura." + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/hooks.py:0 +#, python-format +msgid "" +"You have multiple preventive maintenance requests on equipment %(name)s next " +"action date (%(date)s). Please leave only one preventive request on the date " +"of equipment's next action to install the module." +msgstr "" +"Ci sono richieste di manutenzione preventiva multiple per l'attrezzatura " +"%(name)s alla data azione successiva (%(date)s). Lasciare solo una richiesta " +"preventiva alla successiva data azione dell'attrezzatura per installare il " +"modulo." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "e.g. Calibration" +msgstr "es. calibrazione" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#~ msgid "Main Attachment" +#~ msgstr "Allegato principale" + +#~ msgid "Number of messages which requires an action" +#~ msgstr "Numero di messaggi che richiedono un'azione" + +#~ msgid "Number of unread messages" +#~ msgstr "Numero di messaggi non letti" + +#~ msgid "Unread Messages" +#~ msgstr "Messaggi non letti" + +#~ msgid "Unread Messages Counter" +#~ msgstr "Numero messaggi non letti" + +#~ msgid "SMS Delivery error" +#~ msgstr "Errore consegna SMS" + +#~ msgid "Internal notes..." +#~ msgstr "Note interne..." + +#, python-format +#~ msgid "" +#~ "The maintenance plan %(kind)s of equipment %(plan)s has generated a " +#~ "request which is not done yet. You should either set the request as done, " +#~ "remove its maintenance kind or delete it first." +#~ msgstr "" +#~ "Il piano manutenzione %(kind)s dell'attrezzatura %(plan)s ha generato una " +#~ "richiesta che non è ancora eseguita. Bisogna prima impostare la richiesta " +#~ "a eseguita, o eliminare il suo tipo di manutenzione, o eliminarla." + +#, python-format +#~ msgid "Unnamed %(kind)s plan (%(equipment)s)" +#~ msgstr "Piano %(kind)s (%(equipment)s) senza nome" + +#, python-format +#~ msgid "Unnamed %(kind)s plan (%(plan)s)" +#~ msgstr "Piano (%(plan)s) %(kind)s senza nome" + +#, python-format +#~ msgid "Unnamed %(nothing)s plan (%(equipment)s)" +#~ msgstr "Piano (%(equipment)s) %(nothing)s senza nome" + +#~ msgid "Maintenance Kinds" +#~ msgstr "Pianificazioni manutenzione" + +#~ msgid "Next maintenance date" +#~ msgstr "Data manutenzione successiva" + +#~ msgid "Preventive Maintenance (%s) - %s" +#~ msgstr "Manutenzione preventiva (%s) - %s" + +#~ msgid "Start maintenance date" +#~ msgstr "Data inizio manutenzione" + +#~ msgid "" +#~ "The maintenance plan %s of equipment %s has generated a request which is " +#~ "not done yet. You should either set the request as done, remove its " +#~ "maintenance kind or delete it first." +#~ msgstr "" +#~ "Il piano di manutenzione %s dell'attrezzatura %s ha generato una " +#~ "richiesta che non è ancora stata eseguita. Si deve prima impostare la " +#~ "richiesta come eseguita, eliminare la sua pianificazione o cancellarla." + +#~ msgid "Unnamed %s plan (%s)" +#~ msgstr "Piano %s senza nome (%s)" + +#~ msgid "" +#~ "You have multiple preventive maintenance requests on equipment %s next " +#~ "action date (%s). Please leave only one preventive request on the date of " +#~ "equipment's next action to install the module." +#~ msgstr "" +#~ "Ci sono richieste di manutenzione multiple per l'attrezzatura %s alla " +#~ "data della prossima azione (%s). Per installare il modulo, lasciare solo " +#~ "una richiesta preventiva nella data della prossima azione." diff --git a/maintenance_plan/i18n/maintenance_plan.pot b/maintenance_plan/i18n/maintenance_plan.pot new file mode 100644 index 000000000..88d65a094 --- /dev/null +++ b/maintenance_plan/i18n/maintenance_plan.pot @@ -0,0 +1,648 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_plan +# +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: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.report_maintenance_request_document +msgid "Instructions:" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__active +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Active" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__active +msgid "Active Kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_ids +msgid "Activities" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_state +msgid "Activity State" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_domain +msgid "Apply on" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Archived" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__company_id +msgid "Company" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_uid +msgid "Created by" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_date +msgid "Created on" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_open_count +msgid "Current Maintenance" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Date from which the maintenance will we active" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__day +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__day +msgid "Day(s)" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Describe the maintenance to do..." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__name +msgid "Description" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__display_name +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__display_name +msgid "Display Name" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__skip_notify_follower_on_requests +msgid "Do not notify to follower when creating requests?" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__duration +msgid "Duration (hours)" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__equipment_id +msgid "Equipment" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval +msgid "Frequency" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_with_domain +msgid "Generate With Domain" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Generate requests for current threshold" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__has_message +msgid "Has Message" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__id +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__id +msgid "ID" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "If not clicked, the scheduled action will do it for you." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Inactive" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Instructions" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval +msgid "Interval between each maintenance" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_date +msgid "Last Updated on" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__planning_step +msgid "Let the event automatically repeat at that interval" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval_step +msgid "Let the event automatically repeat at that interval step" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Maintenace Equipment must belong to the equipment's company" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_count +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__search_maintenance_plan_count +msgid "Maintenance All Plan Count" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_kind +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_kind_id +msgid "Maintenance Kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance Plan" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_count +msgid "Maintenance Plan Count" +msgstr "" + +#. module: maintenance_plan +#: model:ir.ui.menu,name:maintenance_plan.menu_m_plan_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Maintenance Plans" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_request +msgid "Maintenance Request" +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.hr_equipment_request_action_from_plan +msgid "Maintenance Requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_team_id +msgid "Maintenance Team" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_team_required +msgid "Maintenance Team Required" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__duration +msgid "Maintenance duration in hours" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_kind_id +msgid "Maintenance kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_kind_name_uniq +msgid "Maintenance kind name already exists." +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_kind_action +#: model:ir.ui.menu,name:maintenance_plan.menu_maintenance_kind_configuration +msgid "Maintenance kinds" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_ids +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_plan_id +msgid "Maintenance plan" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "" +"Maintenance planning horizon. Only the maintenance requests inside the " +"horizon will be created." +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_action +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_equipment_action +msgid "Maintenance plans" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_ids +msgid "Maintenance requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.server,name:maintenance_plan.maintenance_requests_cron_ir_actions_server +msgid "Maintenance: generate preventive maintenance requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_ids +msgid "Messages" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__month +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__month +msgid "Month(s)" +msgstr "" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_monthly +msgid "Monthly" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__name +msgid "Name" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__next_maintenance_date +msgid "Next Maintenance Date" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__note +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__note +msgid "Note" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__notes +msgid "Notes" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon period" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon step" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Planning Horizon" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "Planning Horizon period" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__planning_step +msgid "Planning Horizon step" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Plans" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(description)s" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(plan)s" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__rating_ids +msgid "Ratings" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval_step +msgid "Recurrence" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__search_equipment_id +msgid "Search Equipment" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "" +"Some maintenance plan's company is incompatible with the company of this " +"equipment." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Start Date" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Start Maintenance Date" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__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: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Team" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "" +"The maintenance plan %(kind)s of equipment %(eqpmnt)s has generated a " +"request which is not done yet. You should either set the request as done, " +"remove its maintenance kind or delete it first." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Under Maintenance" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmnt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(void)s plan (%(eqpmnt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Unspecified kind" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unsupported search operator" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__week +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__week +msgid "Week(s)" +msgstr "" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_weekly +msgid "Weekly" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__year +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__year +msgid "Year(s)" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_plan_equipment_kind_uniq +msgid "" +"You cannot define multiple times the same maintenance kind on an equipment " +"maintenance plan." +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/hooks.py:0 +#, python-format +msgid "" +"You have multiple preventive maintenance requests on equipment %(name)s next" +" action date (%(date)s). Please leave only one preventive request on the " +"date of equipment's next action to install the module." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "e.g. Calibration" +msgstr "" diff --git a/maintenance_plan/i18n/pt.po b/maintenance_plan/i18n/pt.po new file mode 100644 index 000000000..b93775221 --- /dev/null +++ b/maintenance_plan/i18n/pt.po @@ -0,0 +1,710 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-12-03 13:44+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.report_maintenance_request_document +msgid "Instructions:" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction +msgid "Action Needed" +msgstr "Ação Necessária" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__active +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Active" +msgstr "Ativo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__active +msgid "Active Kind" +msgstr "Tipo Ativo" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_ids +msgid "Activities" +msgstr "Atividades" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decoração da Atividade Excepcção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_state +msgid "Activity State" +msgstr "Estado da Atividade" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Activity Type Icon" +msgstr "Ícone de Tipo de Atividade" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_domain +msgid "Apply on" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Archived" +msgstr "Arquivado" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_attachment_count +msgid "Attachment Count" +msgstr "Número de Anexos" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__company_id +msgid "Company" +msgstr "Empresa" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_open_count +msgid "Current Maintenance" +msgstr "Manutenção Atual" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Date from which the maintenance will we active" +msgstr "Data a partir da qual a manutenção estará ativa" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__day +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__day +msgid "Day(s)" +msgstr "Dia(s)" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Describe the maintenance to do..." +msgstr "Descrever a manutenção a fazer..." + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__name +msgid "Description" +msgstr "Descrição" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__display_name +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__display_name +msgid "Display Name" +msgstr "Nome a Apresentar" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__skip_notify_follower_on_requests +msgid "Do not notify to follower when creating requests?" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__duration +msgid "Duration (hours)" +msgstr "Duração (horas)" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__equipment_id +msgid "Equipment" +msgstr "Equipamento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Parceiros)" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Ícone font awesome, por exemplo fa-tasks" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval +msgid "Frequency" +msgstr "Frequência" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_with_domain +msgid "Generate With Domain" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Generate requests for current threshold" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__has_message +msgid "Has Message" +msgstr "Tem mensagem" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__id +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__id +msgid "ID" +msgstr "ID" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon" +msgstr "Ícone" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Ícone para indicar uma exceção na atividade." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se marcado, há novas mensagens que pedem a sua atenção." + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se estiver marcado, algumas mensagens têm um erro de entrega." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "If not clicked, the scheduled action will do it for you." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Inactive" +msgstr "Inativo" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Instructions" +msgstr "Instruções" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval +msgid "Interval between each maintenance" +msgstr "Intervalo entre cada manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_is_follower +msgid "Is Follower" +msgstr "É Seguidor" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_uid +msgid "Last Updated by" +msgstr "Última atualização por" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_date +msgid "Last Updated on" +msgstr "Última Atualização em" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__planning_step +msgid "Let the event automatically repeat at that interval" +msgstr "Deixar o evento repetir-se automaticamente naquele intervalo" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval_step +msgid "Let the event automatically repeat at that interval step" +msgstr "Deixe o evento se repetir automaticamente nessa etapa de intervalo" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Maintenace Equipment must belong to the equipment's company" +msgstr "O equipamento de manutenção deve pertencer à empresa do equipamento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_count +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance" +msgstr "Manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__search_maintenance_plan_count +msgid "Maintenance All Plan Count" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "Equipamento de Manutenção" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_kind +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_kind_id +msgid "Maintenance Kind" +msgstr "Tipo de Manutenção" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance Plan" +msgstr "Plano de Manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_count +msgid "Maintenance Plan Count" +msgstr "Núm. de Planos de Manutenção" + +#. module: maintenance_plan +#: model:ir.ui.menu,name:maintenance_plan.menu_m_plan_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Maintenance Plans" +msgstr "Planos de Manutenção" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_request +msgid "Maintenance Request" +msgstr "Pedido de Manutenção" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.hr_equipment_request_action_from_plan +msgid "Maintenance Requests" +msgstr "Pedidos de Manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_team_id +msgid "Maintenance Team" +msgstr "Equipa de Manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_team_required +msgid "Maintenance Team Required" +msgstr "Equipa de Manutenção necessária" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__duration +msgid "Maintenance duration in hours" +msgstr "Duração da manutenção em horas" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_kind_id +msgid "Maintenance kind" +msgstr "Tipo de manutenção" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_kind_name_uniq +msgid "Maintenance kind name already exists." +msgstr "O nome do tipo manutenção já existe." + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_kind_action +#: model:ir.ui.menu,name:maintenance_plan.menu_maintenance_kind_configuration +msgid "Maintenance kinds" +msgstr "Tipos de manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_ids +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_plan_id +msgid "Maintenance plan" +msgstr "Plano de manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "" +"Maintenance planning horizon. Only the maintenance requests inside the " +"horizon will be created." +msgstr "" +"Horizonte de planeamento da manutenção. Somente as solicitações de " +"manutenção dentro do horizonte serão criadas." + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_action +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_equipment_action +msgid "Maintenance plans" +msgstr "Planos de manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_ids +msgid "Maintenance requests" +msgstr "Pedidos de manutenção" + +#. module: maintenance_plan +#: model:ir.actions.server,name:maintenance_plan.maintenance_requests_cron_ir_actions_server +msgid "Maintenance: generate preventive maintenance requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error +msgid "Message Delivery error" +msgstr "Erro de Envio de Mensagem" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_ids +msgid "Messages" +msgstr "Mensagens" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__month +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__month +msgid "Month(s)" +msgstr "Mes(es)" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_monthly +msgid "Monthly" +msgstr "Mensalmente" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Prazo Limite da Minha Atividade" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__name +msgid "Name" +msgstr "Nome" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Prazo da Próxima Atividade" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_summary +msgid "Next Activity Summary" +msgstr "Resumo da Próxima Atividade" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo da Próxima Atividade" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__next_maintenance_date +msgid "Next Maintenance Date" +msgstr "Data da Próxima Manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__note +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__note +msgid "Note" +msgstr "Nota" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__notes +msgid "Notes" +msgstr "Notas" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de Ações" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of errors" +msgstr "Número de erros" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensagens com um erro de entrega" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon period" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon step" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Planning Horizon" +msgstr "Horizonte de Planeamento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "Planning Horizon period" +msgstr "Período do horizonte de planeamento" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__planning_step +msgid "Planning Horizon step" +msgstr "Etapa do Horizonte de Planeamento" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Plans" +msgstr "Planos" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(description)s" +msgstr "Manutenção Preventiva (%(kind)s) - %(description)s" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(plan)s" +msgstr "Manutenção Preventiva (%(kind)s) - %(plan)s" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__rating_ids +msgid "Ratings" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval_step +msgid "Recurrence" +msgstr "Recorrência" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_user_id +msgid "Responsible User" +msgstr "Utilizador Responsável" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__search_equipment_id +msgid "Search Equipment" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "" +"Some maintenance plan's company is incompatible with the company of this " +"equipment." +msgstr "" +"A empresa de alguns planos de manutenção é incompatível com a empresa deste " +"equipamento." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Start Date" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Start Maintenance Date" +msgstr "Data de Início da manutenção" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__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 "" +"Estado com base nas atividades\n" +"Em atraso: A data limite foi ultrapassada\n" +"Hoje: A data da atividade é a atual\n" +"Planeado: Atividades futuras." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Team" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "" +"The maintenance plan %(kind)s of equipment %(eqpmnt)s has generated a " +"request which is not done yet. You should either set the request as done, " +"remove its maintenance kind or delete it first." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo de atividade de exceção no registo." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Under Maintenance" +msgstr "Em Manutenção" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmnt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(void)s plan (%(eqpmnt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Unspecified kind" +msgstr "Tipo indeterminado" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unsupported search operator" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website Messages" +msgstr "Mensagens do Website" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website communication history" +msgstr "Histórico de Comunicação do Website" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__week +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__week +msgid "Week(s)" +msgstr "Semana(s)" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_weekly +msgid "Weekly" +msgstr "Semanalmente" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__year +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__year +msgid "Year(s)" +msgstr "Ano(s)" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_plan_equipment_kind_uniq +msgid "" +"You cannot define multiple times the same maintenance kind on an equipment " +"maintenance plan." +msgstr "" +"Você não pode definir várias vezes o mesmo tipo de manutenção num plano de " +"manutenção de equipamentos." + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/hooks.py:0 +#, python-format +msgid "" +"You have multiple preventive maintenance requests on equipment %(name)s next " +"action date (%(date)s). Please leave only one preventive request on the date " +"of equipment's next action to install the module." +msgstr "" +"Tem múltiplos pedidos de manutenção preventiva para o equipamento %(name)s e " +"próxima data de ação (%(date)s). Por favor, deixe apenas uma solicitação " +"preventiva na data da próxima ação do equipamento para instalar o módulo." + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "e.g. Calibration" +msgstr "p. ex., Calibração" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação em" + +#~ msgid "Main Attachment" +#~ msgstr "Anexo Principal" + +#~ msgid "Number of messages which requires an action" +#~ msgstr "Número de mensagens que requerem uma ação" + +#~ msgid "Number of unread messages" +#~ msgstr "Número de mensagens não lidas" + +#~ msgid "Unread Messages" +#~ msgstr "Mensagens Não Lidas" + +#~ msgid "Unread Messages Counter" +#~ msgstr "Contador de Mensagens Não Lidas" + +#~ msgid "SMS Delivery error" +#~ msgstr "Erro de entrega de SMS" + +#~ msgid "Internal notes..." +#~ msgstr "Notas Internas..." + +#, python-format +#~ msgid "" +#~ "The maintenance plan %(kind)s of equipment %(plan)s has generated a " +#~ "request which is not done yet. You should either set the request as done, " +#~ "remove its maintenance kind or delete it first." +#~ msgstr "" +#~ "O plano de manutenção %(kind)s do equipamento %(plan)s gerou um pedido " +#~ "que ainda não foi efetuado. Deve definir o pedido como feito, remover o " +#~ "seu tipo de manutenção ou eliminá-lo primeiro." + +#, python-format +#~ msgid "Unnamed %(kind)s plan (%(equipment)s)" +#~ msgstr "Plano %(kind)s sem nome (%(equipment)s)" + +#, python-format +#~ msgid "Unnamed %(kind)s plan (%(plan)s)" +#~ msgstr "Plano %(kind)s sem nome (%(plan)s)" + +#, python-format +#~ msgid "Unnamed %(nothing)s plan (%(equipment)s)" +#~ msgstr "Plano %(nothing)s sem nome (%(equipment)s)" diff --git a/maintenance_plan/i18n/zh_CN.po b/maintenance_plan/i18n/zh_CN.po new file mode 100644 index 000000000..972df39cd --- /dev/null +++ b/maintenance_plan/i18n/zh_CN.po @@ -0,0 +1,649 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.report_maintenance_request_document +msgid "Instructions:" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__active +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Active" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__active +msgid "Active Kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_ids +msgid "Activities" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_state +msgid "Activity State" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_domain +msgid "Apply on" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Archived" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__company_id +msgid "Company" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_uid +msgid "Created by" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__create_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__create_date +msgid "Created on" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_open_count +msgid "Current Maintenance" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Date from which the maintenance will we active" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__day +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__day +msgid "Day(s)" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Describe the maintenance to do..." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__name +msgid "Description" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__display_name +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__display_name +msgid "Display Name" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__skip_notify_follower_on_requests +msgid "Do not notify to follower when creating requests?" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__duration +msgid "Duration (hours)" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__equipment_id +msgid "Equipment" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval +msgid "Frequency" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__generate_with_domain +msgid "Generate With Domain" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Generate requests for current threshold" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__has_message +msgid "Has Message" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__id +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__id +msgid "ID" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "If not clicked, the scheduled action will do it for you." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Inactive" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_request_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Instructions" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval +msgid "Interval between each maintenance" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_uid +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__write_date +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__write_date +msgid "Last Updated on" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__planning_step +msgid "Let the event automatically repeat at that interval" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__interval_step +msgid "Let the event automatically repeat at that interval step" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Maintenace Equipment must belong to the equipment's company" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_count +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__search_maintenance_plan_count +msgid "Maintenance All Plan Count" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_kind +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_kind_id +msgid "Maintenance Kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Maintenance Plan" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_count +msgid "Maintenance Plan Count" +msgstr "" + +#. module: maintenance_plan +#: model:ir.ui.menu,name:maintenance_plan.menu_m_plan_form +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Maintenance Plans" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model,name:maintenance_plan.model_maintenance_request +msgid "Maintenance Request" +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.hr_equipment_request_action_from_plan +msgid "Maintenance Requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_team_id +msgid "Maintenance Team" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_team_required +msgid "Maintenance Team Required" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__duration +msgid "Maintenance duration in hours" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_kind_id +msgid "Maintenance kind" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_kind_name_uniq +msgid "Maintenance kind name already exists." +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_kind_action +#: model:ir.ui.menu,name:maintenance_plan.menu_maintenance_kind_configuration +msgid "Maintenance kinds" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__maintenance_plan_ids +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__maintenance_plan_id +msgid "Maintenance plan" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "" +"Maintenance planning horizon. Only the maintenance requests inside the " +"horizon will be created." +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_action +#: model:ir.actions.act_window,name:maintenance_plan.maintenance_plan_equipment_action +msgid "Maintenance plans" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_ids +msgid "Maintenance requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.actions.server,name:maintenance_plan.maintenance_requests_cron_ir_actions_server +msgid "Maintenance: generate preventive maintenance requests" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_ids +msgid "Messages" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__month +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__month +msgid "Month(s)" +msgstr "" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_monthly +msgid "Monthly" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_kind__name +msgid "Name" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__next_maintenance_date +msgid "Next Maintenance Date" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__note +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_request__note +msgid "Note" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_equipment__notes +msgid "Notes" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon period" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "P. Horizon step" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "Planning Horizon" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__maintenance_plan_horizon +msgid "Planning Horizon period" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__planning_step +msgid "Planning Horizon step" +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Plans" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(description)s" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Preventive Maintenance (%(kind)s) - %(plan)s" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__rating_ids +msgid "Ratings" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__interval_step +msgid "Recurrence" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__search_equipment_id +msgid "Search Equipment" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "" +"Some maintenance plan's company is incompatible with the company of this " +"equipment." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Start Date" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__start_maintenance_date +msgid "Start Maintenance Date" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__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: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.hr_equipment_view_form +msgid "Team" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "" +"The maintenance plan %(kind)s of equipment %(eqpmnt)s has generated a " +"request which is not done yet. You should either set the request as done, " +"remove its maintenance kind or delete it first." +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_search +msgid "Under Maintenance" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmnt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(kind)s plan (%(eqpmt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/tests/test_maintenance_plan.py:0 +#, python-format +msgid "Unnamed %(void)s plan (%(eqpmnt)s)" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_equipment.py:0 +#, python-format +msgid "Unspecified kind" +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/models/maintenance_plan.py:0 +#, python-format +msgid "Unsupported search operator" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,field_description:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields,help:maintenance_plan.field_maintenance_plan__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__week +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__week +msgid "Week(s)" +msgstr "" + +#. module: maintenance_plan +#: model:maintenance.kind,name:maintenance_plan.maintenance_kind_weekly +msgid "Weekly" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__interval_step__year +#: model:ir.model.fields.selection,name:maintenance_plan.selection__maintenance_plan__planning_step__year +msgid "Year(s)" +msgstr "" + +#. module: maintenance_plan +#: model:ir.model.constraint,message:maintenance_plan.constraint_maintenance_plan_equipment_kind_uniq +msgid "" +"You cannot define multiple times the same maintenance kind on an equipment " +"maintenance plan." +msgstr "" + +#. module: maintenance_plan +#. odoo-python +#: code:addons/maintenance_plan/hooks.py:0 +#, python-format +msgid "" +"You have multiple preventive maintenance requests on equipment %(name)s next " +"action date (%(date)s). Please leave only one preventive request on the date " +"of equipment's next action to install the module." +msgstr "" + +#. module: maintenance_plan +#: model_terms:ir.ui.view,arch_db:maintenance_plan.maintenance_plan_view_form +msgid "e.g. Calibration" +msgstr "" diff --git a/maintenance_plan/models/__init__.py b/maintenance_plan/models/__init__.py new file mode 100644 index 000000000..b4d173159 --- /dev/null +++ b/maintenance_plan/models/__init__.py @@ -0,0 +1,4 @@ +from . import maintenance_kind +from . import maintenance_plan +from . import maintenance_equipment +from . import maintenance_request diff --git a/maintenance_plan/models/maintenance_equipment.py b/maintenance_plan/models/maintenance_equipment.py new file mode 100644 index 000000000..e8ef2da49 --- /dev/null +++ b/maintenance_plan/models/maintenance_equipment.py @@ -0,0 +1,199 @@ +# Copyright 2017 Camptocamp SA +# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class MaintenanceEquipment(models.Model): + _inherit = "maintenance.equipment" + + maintenance_plan_ids = fields.One2many( + string="Maintenance plan", + comodel_name="maintenance.plan", + inverse_name="equipment_id", + ) + maintenance_plan_count = fields.Integer( + compute="_compute_maintenance_plan_count", + store=True, + ) + search_maintenance_plan_count = fields.Integer( + compute="_compute_search_maintenance_plan_count", + string="Maintenance All Plan Count", + ) + maintenance_team_required = fields.Boolean(compute="_compute_team_required") + notes = fields.Text() + + @api.depends("maintenance_plan_ids", "maintenance_plan_ids.active") + def _compute_maintenance_plan_count(self): + for equipment in self: + equipment.maintenance_plan_count = len( + equipment.with_context(active_test=False).maintenance_plan_ids + ) + + @api.depends("maintenance_plan_ids") + def _compute_search_maintenance_plan_count(self): + for equipment in self: + equipment.search_maintenance_plan_count = ( + self.env["maintenance.plan"] + .with_context(active_test=False) + .search_count([("search_equipment_id", "=", equipment.id)]) + ) + + @api.depends("maintenance_plan_ids") + def _compute_team_required(self): + for equipment in self: + equipment.maintenance_team_required = ( + len( + equipment.maintenance_plan_ids.filtered( + lambda r: not r.maintenance_team_id + ) + ) + >= 1 + ) + + @api.constrains("company_id", "maintenance_plan_ids") + def _check_company_id(self): + for rec in self: + if rec.company_id and not all( + rec.company_id == p.company_id for p in rec.maintenance_plan_ids + ): + raise ValidationError( + _( + "Some maintenance plan's company is incompatible with " + "the company of this equipment." + ) + ) + + def _prepare_requests_from_plan(self, maintenance_plan, next_maintenance_date): + if self: + return self._prepare_request_from_plan( + maintenance_plan, next_maintenance_date + ) + equipments = maintenance_plan._get_maintenance_equipments() + return [ + equipment._prepare_request_from_plan( + maintenance_plan, next_maintenance_date + ) + for equipment in equipments + ] + + def _prepare_request_from_plan(self, maintenance_plan, next_maintenance_date): + team_id = maintenance_plan.maintenance_team_id.id or self.maintenance_team_id.id + request_model = self.env["maintenance.request"] + if not team_id: + team_id = request_model._get_default_team_id() + + description = self.name if self else maintenance_plan.name + kind = maintenance_plan.maintenance_kind_id.name or _("Unspecified kind") + name = _( + "Preventive Maintenance (%(kind)s) - %(description)s", + kind=kind, + description=description, + ) + + data = { + "name": name, + "request_date": next_maintenance_date, + "schedule_date": next_maintenance_date, + "category_id": self.category_id.id, + "equipment_id": self.id, + "maintenance_type": "preventive", + "owner_user_id": self.owner_user_id.id or self.env.user.id, + "user_id": self.technician_user_id.id, + "maintenance_team_id": team_id, + "maintenance_kind_id": maintenance_plan.maintenance_kind_id.id, + "maintenance_plan_id": maintenance_plan.id, + "duration": maintenance_plan.duration, + "note": maintenance_plan.note, + "company_id": maintenance_plan.company_id.id or self.company_id.id, + } + # This field comes from maintenance_timesheet for avoiding a glue module + if "planned_hours" in request_model._fields: + data["planned_hours"] = maintenance_plan.duration + return data + + def _create_new_request(self, mtn_plan): + # Compute horizon date adding to today the planning horizon + horizon_date = fields.Date.today() + mtn_plan.get_relativedelta( + mtn_plan.maintenance_plan_horizon, mtn_plan.planning_step or "year" + ) + # We check maintenance request already created and create until + # planning horizon is met + start_maintenance_date_plan = mtn_plan.start_maintenance_date + furthest_maintenance_request = self.env["maintenance.request"].search( + [ + ("maintenance_plan_id", "=", mtn_plan.id), + ("request_date", ">=", start_maintenance_date_plan), + ], + order="request_date desc", + limit=1, + ) + if furthest_maintenance_request: + next_maintenance_date = ( + furthest_maintenance_request.request_date + + mtn_plan.get_relativedelta( + mtn_plan.interval, mtn_plan.interval_step or "year" + ) + ) + else: + next_maintenance_date = mtn_plan.next_maintenance_date + skip_notify_follower = mtn_plan.skip_notify_follower_on_requests + # Skip assigned mail + Activity mail + request_model = self.env["maintenance.request"].with_context( + mail_activity_quick_update=skip_notify_follower, + mail_auto_subscribe_no_notify=skip_notify_follower, + ) + requests = request_model + # Create maintenance request until we reach planning horizon + while next_maintenance_date <= horizon_date: + if next_maintenance_date >= fields.Date.today(): + vals = self._prepare_requests_from_plan(mtn_plan, next_maintenance_date) + requests |= request_model.create(vals) + next_maintenance_date = next_maintenance_date + mtn_plan.get_relativedelta( + mtn_plan.interval, mtn_plan.interval_step or "year" + ) + return requests + + @api.model + def _cron_generate_requests(self): + """ + Generates maintenance request on the next_maintenance_date or + today if none exists + """ + for plan in ( + self.env["maintenance.plan"] + .sudo() + .search([("interval", ">", 0)]) + .filtered(lambda x: True if not x.equipment_id else x.equipment_id.active) + ): + equipment = plan.equipment_id + equipment._create_new_request(plan) + + @api.depends( + "maintenance_plan_ids.next_maintenance_date", "maintenance_ids.request_date" + ) + def _compute_next_maintenance(self): + """Redefine the function to display next_action_date in kanban view""" + for equipment in self: + next_plan_dates = equipment.maintenance_plan_ids.mapped( + "next_maintenance_date" + ) + next_unplanned_dates = ( + self.env["maintenance.request"] + .search( + [ + ("equipment_id", "=", equipment.id), + ("maintenance_kind_id", "=", None), + ("request_date", ">", fields.Date.context_today(self)), + ("stage_id.done", "!=", True), + ("close_date", "=", False), + ] + ) + .mapped("request_date") + ) + if len(next_plan_dates + next_unplanned_dates) <= 0: + equipment.next_action_date = None + else: + equipment.next_action_date = min(next_plan_dates + next_unplanned_dates) diff --git a/maintenance_plan/models/maintenance_kind.py b/maintenance_plan/models/maintenance_kind.py new file mode 100644 index 000000000..e5280e0e2 --- /dev/null +++ b/maintenance_plan/models/maintenance_kind.py @@ -0,0 +1,17 @@ +# Copyright 2017 Camptocamp SA +# Copyright 2019 ForgeFlow S.L. (https://www.forgeflow.com). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class MaintenanceKind(models.Model): + _name = "maintenance.kind" + _description = "Maintenance Kind" + + name = fields.Char(required=True, translate=True) + active = fields.Boolean("Active Kind", required=True, default=True) + + _sql_constraints = [ + ("name_uniq", "unique (name)", "Maintenance kind name already exists.") + ] diff --git a/maintenance_plan/models/maintenance_plan.py b/maintenance_plan/models/maintenance_plan.py new file mode 100644 index 000000000..2695003ef --- /dev/null +++ b/maintenance_plan/models/maintenance_plan.py @@ -0,0 +1,260 @@ +# Copyright 2017 Camptocamp SA +# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from dateutil.relativedelta import relativedelta + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError +from odoo.tools import safe_eval + + +class MaintenancePlan(models.Model): + _name = "maintenance.plan" + _description = "Maintenance Plan" + _inherit = ["mail.thread", "mail.activity.mixin"] + + name = fields.Char("Description") + active = fields.Boolean(default=True) + equipment_id = fields.Many2one( + string="Equipment", comodel_name="maintenance.equipment", ondelete="cascade" + ) + company_id = fields.Many2one( + comodel_name="res.company", + default=lambda self: self.env.company, + ) + maintenance_kind_id = fields.Many2one( + string="Maintenance Kind", comodel_name="maintenance.kind", ondelete="restrict" + ) + interval = fields.Integer( + string="Frequency", default=1, help="Interval between each maintenance" + ) + interval_step = fields.Selection( + [ + ("day", "Day(s)"), + ("week", "Week(s)"), + ("month", "Month(s)"), + ("year", "Year(s)"), + ], + string="Recurrence", + default="year", + help="Let the event automatically repeat at that interval step", + ) + duration = fields.Float( + string="Duration (hours)", help="Maintenance duration in hours" + ) + start_maintenance_date = fields.Date( + default=fields.Date.context_today, + help="Date from which the maintenance will we active", + ) + next_maintenance_date = fields.Date(compute="_compute_next_maintenance", store=True) + maintenance_plan_horizon = fields.Integer( + string="Planning Horizon period", + default=1, + help="Maintenance planning horizon. Only the maintenance requests " + "inside the horizon will be created.", + ) + planning_step = fields.Selection( + [ + ("day", "Day(s)"), + ("week", "Week(s)"), + ("month", "Month(s)"), + ("year", "Year(s)"), + ], + string="Planning Horizon step", + default="year", + help="Let the event automatically repeat at that interval", + ) + note = fields.Html() + maintenance_ids = fields.One2many( + "maintenance.request", "maintenance_plan_id", string="Maintenance requests" + ) + maintenance_count = fields.Integer( + compute="_compute_maintenance_count", string="Maintenance", store=True + ) + maintenance_open_count = fields.Integer( + compute="_compute_maintenance_count", string="Current Maintenance", store=True + ) + maintenance_team_id = fields.Many2one("maintenance.team") + skip_notify_follower_on_requests = fields.Boolean( + string="Do not notify to follower when creating requests?", default=True + ) + generate_with_domain = fields.Boolean() + generate_domain = fields.Char(string="Apply on") + search_equipment_id = fields.Many2one( + comodel_name="maintenance.equipment", + compute="_compute_search_equipment", + search="_search_search_equipment", + ) + + @api.model + def _search_search_equipment(self, operator, value): + if operator != "=" or (not value and not isinstance(value, models.NewId)): + raise ValueError(_("Unsupported search operator")) + plans = self.search([("generate_with_domain", "=", True)]) + plan_ids = [] + equipment = self.env["maintenance.equipment"].browse(value) + for plan in plans: + if equipment.filtered_domain( + safe_eval.safe_eval( + plan.generate_domain or "[]", plan._get_eval_context() + ) + ): + plan_ids.append(plan.id) + return ["|", ("equipment_id", "=", value), ("id", "in", plan_ids)] + + @api.depends("equipment_id") + def _compute_search_equipment(self): + for record in self: + record.search_equipment_id = record.equipment_id + + def _get_eval_context(self): + """Prepare the context used when evaluating python code + :returns: dict -- evaluation context given to safe_eval + """ + return { + "datetime": safe_eval.datetime, + "dateutil": safe_eval.dateutil, + "time": safe_eval.time, + } + + def name_get(self): + result = [] + for plan in self: + result.append( + ( + plan.id, + plan.name + or _( + "Unnamed %(kind)s plan (%(eqpmt)s)", + kind=plan.maintenance_kind_id.name or "", + eqpmt=plan.equipment_id.name, + ), + ) + ) + return result + + @api.depends("maintenance_ids.stage_id.done") + def _compute_maintenance_count(self): + for equipment in self: + equipment.maintenance_count = len(equipment.maintenance_ids) + equipment.maintenance_open_count = len( + equipment.maintenance_ids.filtered(lambda x: not x.stage_id.done) + ) + + def get_relativedelta(self, interval, step): + if step == "day": + return relativedelta(days=interval) + elif step == "week": + return relativedelta(weeks=interval) + elif step == "month": + return relativedelta(months=interval) + elif step == "year": + return relativedelta(years=interval) + + @api.depends( + "interval", + "interval_step", + "start_maintenance_date", + "maintenance_ids.request_date", + "maintenance_ids.close_date", + ) + def _compute_next_maintenance(self): + for plan in self.filtered(lambda x: x.interval > 0): + interval_timedelta = plan.get_relativedelta( + plan.interval, plan.interval_step + ) + + next_maintenance_todo = self.env["maintenance.request"].search( + [ + ("maintenance_plan_id", "=", plan.id), + ("stage_id.done", "!=", True), + ("close_date", "=", False), + ("request_date", ">=", plan.start_maintenance_date), + ], + order="request_date asc", + limit=1, + ) + + if next_maintenance_todo: + plan.next_maintenance_date = next_maintenance_todo.request_date + else: + last_maintenance_done = self.env["maintenance.request"].search( + [ + ("maintenance_plan_id", "=", plan.id), + ("request_date", ">=", plan.start_maintenance_date), + ], + order="request_date desc", + limit=1, + ) + if last_maintenance_done: + plan.next_maintenance_date = ( + last_maintenance_done.request_date + interval_timedelta + ) + else: + next_date = plan.start_maintenance_date + while next_date < fields.Date.today(): + next_date = next_date + interval_timedelta + plan.next_maintenance_date = next_date + + @api.constrains("company_id", "equipment_id") + def _check_company_id(self): + for rec in self: + if ( + rec.equipment_id.company_id + and rec.company_id != rec.equipment_id.company_id + ): + raise ValidationError( + _("Maintenace Equipment must belong to the equipment's company") + ) + + def unlink(self): + """Restrict deletion of maintenance plan should there be maintenance + requests of this kind which are not done for its equipment""" + for plan in self: + request = plan.equipment_id.mapped("maintenance_ids").filtered( + lambda r, plan=plan: ( + r.maintenance_kind_id == plan.maintenance_kind_id + and not r.stage_id.done + and r.maintenance_type == "preventive" + ) + ) + if request: + raise UserError( + _( + "The maintenance plan %(kind)s of equipment %(eqpmnt)s " + "has generated a request which is not done " + "yet. You should either set the request as " + "done, remove its maintenance kind or " + "delete it first.", + kind=plan.maintenance_kind_id.name, + eqpmnt=plan.equipment_id.name, + ) + ) + return super().unlink() + + _sql_constraints = [ + ( + "equipment_kind_uniq", + "unique (equipment_id, maintenance_kind_id)", + "You cannot define multiple times the same maintenance kind on an " + "equipment maintenance plan.", + ) + ] + + def button_manual_request_generation(self): + """Call the same method that the cron for generating manually the maintenance + requests.""" + for plan in self: + equipment = plan.equipment_id + equipment._create_new_request(plan) + + def _get_maintenance_equipments(self): + self.ensure_one() + if self.generate_with_domain and not self.equipment_id: + return self.env["maintenance.equipment"].search( + safe_eval.safe_eval( + self.generate_domain or "[]", self._get_eval_context() + ) + ) + return [self.equipment_id] diff --git a/maintenance_plan/models/maintenance_request.py b/maintenance_plan/models/maintenance_request.py new file mode 100644 index 000000000..a528a9ed3 --- /dev/null +++ b/maintenance_plan/models/maintenance_request.py @@ -0,0 +1,18 @@ +# Copyright 2017 Camptocamp SA +# Copyright 2019 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class MaintenanceRequest(models.Model): + _inherit = "maintenance.request" + + maintenance_kind_id = fields.Many2one( + string="Maintenance kind", comodel_name="maintenance.kind", ondelete="restrict" + ) + + maintenance_plan_id = fields.Many2one( + string="Maintenance plan", comodel_name="maintenance.plan", ondelete="restrict" + ) + note = fields.Html() diff --git a/maintenance_plan/pyproject.toml b/maintenance_plan/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/maintenance_plan/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/maintenance_plan/readme/CONTRIBUTORS.md b/maintenance_plan/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..5a565a748 --- /dev/null +++ b/maintenance_plan/readme/CONTRIBUTORS.md @@ -0,0 +1,8 @@ +- Akim Juillerat \<\> +- Matteo Mazzoni \<\> +- David Alonso \<\> +- Adrià Gil Sorribes \<\> +- Jordi Ballester Alomar \<\> +- Lois Rilo \<\> +- Enric Tobella \<\> +- Alexei Rivera \<\> diff --git a/maintenance_plan/readme/DESCRIPTION.md b/maintenance_plan/readme/DESCRIPTION.md new file mode 100644 index 000000000..a72a8be20 --- /dev/null +++ b/maintenance_plan/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module extends the functionality of Odoo Maintenance module by +allowing an equipment to have different preventive maintenance kinds. diff --git a/maintenance_plan/readme/INSTALL.md b/maintenance_plan/readme/INSTALL.md new file mode 100644 index 000000000..ae584e78b --- /dev/null +++ b/maintenance_plan/readme/INSTALL.md @@ -0,0 +1,15 @@ +Install the module. + +Should you already use the maintenance module and have equipments with +field 'Preventive Maintenance Frequency' defined, a new maintenance plan +will be automatically created on these equipments with maintenance kind +'Install'. + +Moreover if a Request of type 'preventive' exists, whose stage isn't +marked as 'Request done', and has a Request Date matching the +equipment's 'Next Preventive Maintenance', the request will be updated +with the 'Install' maintenance kind. + +Make sure you don't have multiple 'preventive' requests at a stage which +isn't marked as 'Request done' and on the same 'Request date' as the +equipment or the module installation will fail with a User Error. diff --git a/maintenance_plan/readme/ROADMAP.md b/maintenance_plan/readme/ROADMAP.md new file mode 100644 index 000000000..70fd12242 --- /dev/null +++ b/maintenance_plan/readme/ROADMAP.md @@ -0,0 +1,2 @@ +This module is considered deprecated already in 17.0 because the recurrence functionality is already included in core in the requests themselves. +https://github.com/OCA/maintenance/pull/414#issuecomment-2668929617 diff --git a/maintenance_plan/readme/USAGE.md b/maintenance_plan/readme/USAGE.md new file mode 100644 index 000000000..12c5207a6 --- /dev/null +++ b/maintenance_plan/readme/USAGE.md @@ -0,0 +1,30 @@ +Instead of defining a period and duration for only one preventive +maintenance per equipment, you can define multiple preventive +maintenance kind for each equipment. + +Maintenance Kinds have to be defined through the configuration menu. +Their name have to be unique and can be set as active or inactive, +should these not be used anymore. + +On any equipment over the maintenance tab, the maintenance plan be +accessible, allowing to add different maintenance kind with their own +frequency and duration. The next maintenance date will then be computed +automatically according to the start's date and the frequency defined, +but the maintenance request won't be created automatically as is the +case in Odoo's Maintenance module. In the plan there's also a field +allowing the user to set the maintenance horizon, insert the +instructions to follow on the maintenance that will be forwarded to the +maintenance request generated from the plan. + +This module uses the original Cron job of Odoo's Maintenance module to +generate maintenance requests. To do so, it takes into account the +planning horizon and generates all maintenance requests whose schedule +date would fall inside that planning horizon. Therefore, the maintenance +manager can have a proper planning of how many maintenance requests are +programming for the future. Leaving planning horizon to 0 will only +create those maintenance request that are scheduled for today. + +We can also create maintenance requests from a plan using a domain for +selecting the equipments. This way, we might have a single plan that +will generate all the requests. In order to use it, we need to mark the +Generate with Domain field. diff --git a/maintenance_plan/security/ir.model.access.csv b/maintenance_plan/security/ir.model.access.csv new file mode 100644 index 000000000..832936195 --- /dev/null +++ b/maintenance_plan/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_maintenance_kind_user,access_maintenance_kind_user,model_maintenance_kind,base.group_user,1,0,0,0 +access_maintenance_plan_user,access_maintenance_plan_user,model_maintenance_plan,base.group_user,1,0,0,0 +access_maintenance_kind_manager,access_maintenance_kind_manager,model_maintenance_kind,maintenance.group_equipment_manager,1,1,1,1 +access_maintenance_plan_manager,access_maintenance_plan_manager,model_maintenance_plan,maintenance.group_equipment_manager,1,1,1,1 diff --git a/maintenance_plan/security/maintenance_security.xml b/maintenance_plan/security/maintenance_security.xml new file mode 100644 index 000000000..23a6c2eeb --- /dev/null +++ b/maintenance_plan/security/maintenance_security.xml @@ -0,0 +1,25 @@ + + + + Maintenance plan multi-company + + + [('company_id', 'in', company_ids + [False])] + + + Users are allowed to access plan from equipments they follow + + [('equipment_id.message_partner_ids', 'in', [user.partner_id.id])] + + + + Administrator of maintenance plans + + [(1, '=', 1)] + + + diff --git a/maintenance_plan/static/description/icon.png b/maintenance_plan/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/maintenance_plan/static/description/icon.png differ diff --git a/maintenance_plan/static/description/index.html b/maintenance_plan/static/description/index.html new file mode 100644 index 000000000..cba25e560 --- /dev/null +++ b/maintenance_plan/static/description/index.html @@ -0,0 +1,486 @@ + + + + + +Maintenance Plan + + + +
+

Maintenance Plan

+ + +

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

+

This module extends the functionality of Odoo Maintenance module by +allowing an equipment to have different preventive maintenance kinds.

+

Table of contents

+ +
+

Installation

+

Install the module.

+

Should you already use the maintenance module and have equipments with +field ‘Preventive Maintenance Frequency’ defined, a new maintenance plan +will be automatically created on these equipments with maintenance kind +‘Install’.

+

Moreover if a Request of type ‘preventive’ exists, whose stage isn’t +marked as ‘Request done’, and has a Request Date matching the +equipment’s ‘Next Preventive Maintenance’, the request will be updated +with the ‘Install’ maintenance kind.

+

Make sure you don’t have multiple ‘preventive’ requests at a stage which +isn’t marked as ‘Request done’ and on the same ‘Request date’ as the +equipment or the module installation will fail with a User Error.

+
+
+

Usage

+

Instead of defining a period and duration for only one preventive +maintenance per equipment, you can define multiple preventive +maintenance kind for each equipment.

+

Maintenance Kinds have to be defined through the configuration menu. +Their name have to be unique and can be set as active or inactive, +should these not be used anymore.

+

On any equipment over the maintenance tab, the maintenance plan be +accessible, allowing to add different maintenance kind with their own +frequency and duration. The next maintenance date will then be computed +automatically according to the start’s date and the frequency defined, +but the maintenance request won’t be created automatically as is the +case in Odoo’s Maintenance module. In the plan there’s also a field +allowing the user to set the maintenance horizon, insert the +instructions to follow on the maintenance that will be forwarded to the +maintenance request generated from the plan.

+

This module uses the original Cron job of Odoo’s Maintenance module to +generate maintenance requests. To do so, it takes into account the +planning horizon and generates all maintenance requests whose schedule +date would fall inside that planning horizon. Therefore, the maintenance +manager can have a proper planning of how many maintenance requests are +programming for the future. Leaving planning horizon to 0 will only +create those maintenance request that are scheduled for today.

+

We can also create maintenance requests from a plan using a domain for +selecting the equipments. This way, we might have a single plan that +will generate all the requests. In order to use it, we need to mark the +Generate with Domain field.

+
+
+

Known issues / Roadmap

+

This module is considered deprecated already in 17.0 because the +recurrence functionality is already included in core in the requests +themselves. +https://github.com/OCA/maintenance/pull/414#issuecomment-2668929617

+
+
+

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

+
    +
  • Camptocamp SA
  • +
  • ForgeFlow
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

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

+

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

+
+
+
+ + diff --git a/maintenance_plan/tests/__init__.py b/maintenance_plan/tests/__init__.py new file mode 100644 index 000000000..def774ebc --- /dev/null +++ b/maintenance_plan/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_maintenance_plan +from . import test_maintenance_plan_domain diff --git a/maintenance_plan/tests/common.py b/maintenance_plan/tests/common.py new file mode 100644 index 000000000..b80098cf9 --- /dev/null +++ b/maintenance_plan/tests/common.py @@ -0,0 +1,76 @@ +# Copyright 2017 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from freezegun import freeze_time + +import odoo.tests.common as test_common + +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT + + +class TestMaintenancePlanBase(test_common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + # HACK https://github.com/spulec/freezegun/issues/485 + freezer = freeze_time("2023-01-25 15:30:00") + freezer.__enter__() + cls.addClassCleanup(freezer.__exit__) + cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) + cls.maintenance_request_obj = cls.env["maintenance.request"] + cls.maintenance_plan_obj = cls.env["maintenance.plan"] + cls.maintenance_equipment_obj = cls.env["maintenance.equipment"] + cls.cron = cls.env.ref("maintenance_plan.maintenance_requests_cron") + cls.weekly_kind = cls.env.ref("maintenance_plan.maintenance_kind_weekly") + cls.done_stage = cls.env.ref("maintenance.stage_3") + + cls.equipment_1 = cls.maintenance_equipment_obj.create({"name": "Laptop 1"}) + cls.maintenance_plan_1 = cls.maintenance_plan_obj.create( + { + "equipment_id": cls.equipment_1.id, + "start_maintenance_date": "2023-01-25", + "interval": 1, + "interval_step": "month", + "maintenance_plan_horizon": 2, + "planning_step": "month", + } + ) + cls.maintenance_plan_2 = cls.maintenance_plan_obj.create( + { + "equipment_id": cls.equipment_1.id, + "maintenance_kind_id": cls.weekly_kind.id, + "interval": 1, + "interval_step": "week", + "maintenance_plan_horizon": 2, + "planning_step": "month", + } + ) + cls.maintenance_plan_3 = cls.maintenance_plan_obj.create( + { + "name": "My custom plan", + "equipment_id": cls.equipment_1.id, + "interval": 2, + "interval_step": "week", + "maintenance_plan_horizon": 2, + "planning_step": "month", + } + ) + cls.maintenance_plan_4 = cls.maintenance_plan_obj.create( + { + "name": "Plan without equipment", + "maintenance_kind_id": cls.weekly_kind.id, + "interval": 1, + "interval_step": "week", + "maintenance_plan_horizon": 2, + "planning_step": "month", + } + ) + cls.maintenance_plan_5 = cls.maintenance_plan_obj.create( + { + "start_maintenance_date": "2023-01-25", + "interval": 1, + "interval_step": "month", + "maintenance_plan_horizon": 2, + "planning_step": "month", + } + ) + cls.report_obj = cls.env["ir.actions.report"] diff --git a/maintenance_plan/tests/test_maintenance_plan.py b/maintenance_plan/tests/test_maintenance_plan.py new file mode 100644 index 000000000..585e1b1cf --- /dev/null +++ b/maintenance_plan/tests/test_maintenance_plan.py @@ -0,0 +1,231 @@ +# Copyright 2017 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from dateutil.relativedelta import relativedelta + +from odoo import _, fields + +from .common import TestMaintenancePlanBase + + +class TestMaintenancePlan(TestMaintenancePlanBase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.today_date = fields.Date.from_string("2023-01-25") + + def test_name_get(self): + self.assertEqual( + self.maintenance_plan_1.name_get()[0][1], + _( + "Unnamed %(void)s plan (%(eqpmnt)s)", + void="", + eqpmnt=self.maintenance_plan_1.equipment_id.name, + ), + ) + self.assertEqual( + self.maintenance_plan_2.name_get()[0][1], + _( + "Unnamed %(kind)s plan (%(eqpmnt)s)", + kind=self.maintenance_plan_2.maintenance_kind_id.name, + eqpmnt=self.maintenance_plan_2.equipment_id.name, + ), + ) + self.assertEqual( + self.maintenance_plan_3.name_get()[0][1], self.maintenance_plan_3.name + ) + + def test_next_maintenance_date_01(self): + # We set start maintenance date tomorrow and check next maintenance + # date has been correctly computed + self.maintenance_plan_1.start_maintenance_date = "2023-01-24" + # Check next maintenance date is 1 month from start date + self.assertEqual( + self.maintenance_plan_1.next_maintenance_date, + fields.Date.from_string("2023-02-24"), + ) + + def test_next_maintenance_date_02(self): + self.cron.method_direct_trigger() + # Check maintenance plan dates + self.assertEqual( + self.maintenance_plan_1.start_maintenance_date, self.today_date + ) + self.assertEqual(self.maintenance_plan_1.next_maintenance_date, self.today_date) + # Check information from generated_requests + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_1.id)], + order="schedule_date asc", + ) + self.assertEqual(len(generated_requests), 3) + maintenance_1 = generated_requests[0] + # First maintenance was planned 2023-01-25 + self.assertEqual(maintenance_1.request_date, self.today_date) + # Complete request: + maintenance_1.stage_id = self.done_stage + # Check next one: + maintenance_2 = generated_requests[1] + # This should be expected 2023-02-25 + self.assertEqual( + maintenance_2.request_date, fields.Date.from_string("2023-02-25") + ) + # Complete request and Check next one: + maintenance_2.stage_id = self.done_stage + maintenance_3 = generated_requests[2] + # This one should be expected 2023-03-25 + self.assertEqual( + maintenance_3.request_date, fields.Date.from_string("2023-03-25") + ) + # Move it to a date before `start_maintenance_date` (the request should + # be ignored) + past_date = fields.Date.from_string("2022-12-25") + maintenance_3.request_date = past_date + self.assertNotEqual(self.maintenance_plan_1.next_maintenance_date, past_date) + self.assertEqual( + self.maintenance_plan_1.next_maintenance_date, + fields.Date.from_string("2023-03-25"), + ) + # Move the request_date far into the future: + future_date = fields.Date.from_string("2023-05-25") + maintenance_3.request_date = future_date + self.assertEqual(self.maintenance_plan_1.next_maintenance_date, future_date) + # Complete request in that date, next expected date should be 1 month + # after latest request done.: + maintenance_3.stage_id = self.done_stage + self.assertEqual( + self.maintenance_plan_1.next_maintenance_date, + fields.Date.from_string("2023-06-25"), + ) + + def test_generate_requests(self): + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_1.id)], + order="schedule_date asc", + ) + self.assertEqual(len(generated_requests), 3) + self.assertEqual( + fields.Date.to_date(generated_requests[0].schedule_date), self.today_date + ) + self.assertEqual( + fields.Date.to_date(generated_requests[1].schedule_date), + fields.Date.from_string("2023-02-25"), + ) + self.assertEqual( + fields.Date.to_date(generated_requests[2].schedule_date), + fields.Date.from_string("2023-03-25"), + ) + generated_request = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_4.id)], limit=1 + ) + self.assertEqual( + generated_request.name, + _( + "Preventive Maintenance (%(kind)s) - %(plan)s", + kind=self.weekly_kind.name, + plan=self.maintenance_plan_4.name, + ), + ) + + def test_generate_requests2(self): + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_1.id)], + order="schedule_date asc", + ) + + self.assertEqual(len(generated_requests), 3) + # We set plan start_maintenanca_date to a future one. New requests should take + # into account this new date. + new_date = fields.Date.from_string("2023-04-25") + self.maintenance_plan_1.next_maintenance_date = new_date + self.maintenance_plan_1.maintenance_plan_horizon = 3 + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_1.id)], + order="schedule_date asc", + ) + self.assertEqual(len(generated_requests), 4) + self.assertEqual(generated_requests[-1].request_date, new_date) + + def test_generate_requests_no_equipment(self): + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_5.id)], + order="schedule_date asc", + ) + + self.assertEqual(len(generated_requests), 3) + + # We set plan start_maintenanca_date to a future one. New requests should take + # into account this new date. + + self.maintenance_plan_5.write( + { + "start_maintenance_date": fields.Date.to_string( + self.today_date + relativedelta(weeks=9) + ), + "maintenance_plan_horizon": 3, + } + ) + + self.cron.method_direct_trigger() + + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_5.id)], + order="schedule_date asc", + ) + + self.assertEqual(len(generated_requests), 4) + self.assertEqual( + generated_requests[-1].request_date, + self.today_date + relativedelta(weeks=9), + ) + self.assertFalse(generated_requests.mapped("equipment_id")) + + def test_get_relativedelta(self): + plan = self.maintenance_plan_1 + result = plan.get_relativedelta(1, "day") + self.assertEqual(relativedelta(days=1), result) + result = plan.get_relativedelta(1, "week") + self.assertEqual(relativedelta(weeks=1), result) + result = plan.get_relativedelta(1, "month") + self.assertEqual(relativedelta(months=1), result) + result = plan.get_relativedelta(1, "year") + self.assertEqual(relativedelta(years=1), result) + + def test_generate_requests_inactive_equipment(self): + self.equipment_1.active = False + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_1.id)], + order="schedule_date asc", + ) + self.assertEqual(len(generated_requests), 0) + self.equipment_1.active = True + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_1.id)], + order="schedule_date asc", + ) + self.assertEqual(len(generated_requests), 3) + + def test_maintenance_request_report(self): + self.cron.method_direct_trigger() + generated_request = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_1.id)], + order="schedule_date asc", + limit=1, + ) + generated_request.note = "TEST-INSTRUCTIONS" + res = self.report_obj._render_qweb_text( + "base_maintenance.report_maintenance_request", + generated_request.ids, + False, + ) + self.assertRegex(str(res[0]), "TEST-INSTRUCTIONS") + + def test_maintenance_plan_button_manual_request_generation(self): + self.assertEqual(len(self.maintenance_plan_1.maintenance_ids), 0) + self.maintenance_plan_1.button_manual_request_generation() + self.assertEqual(len(self.maintenance_plan_1.maintenance_ids), 3) diff --git a/maintenance_plan/tests/test_maintenance_plan_domain.py b/maintenance_plan/tests/test_maintenance_plan_domain.py new file mode 100644 index 000000000..6e0578306 --- /dev/null +++ b/maintenance_plan/tests/test_maintenance_plan_domain.py @@ -0,0 +1,38 @@ +# Copyright 2023 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import json + +from odoo.addons.maintenance_plan.tests.common import TestMaintenancePlanBase + + +class TestMaintenancePlanDomain(TestMaintenancePlanBase): + def test_generate_requests_no_domain(self): + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_5.id)], + order="schedule_date asc", + ) + + self.assertEqual(len(generated_requests), 3) + self.assertFalse(generated_requests.mapped("equipment_id")) + + def test_generate_requests_domain(self): + equipment_2 = self.maintenance_equipment_obj.create({"name": "Laptop 2"}) + self.maintenance_plan_5.write( + { + "generate_with_domain": True, + "generate_domain": json.dumps( + [("id", "in", [equipment_2.id, self.equipment_1.id])] + ), + } + ) + self.cron.method_direct_trigger() + generated_requests = self.maintenance_request_obj.search( + [("maintenance_plan_id", "=", self.maintenance_plan_5.id)], + order="schedule_date asc", + ) + + self.assertEqual(len(generated_requests), 6) + self.assertIn(equipment_2, generated_requests.mapped("equipment_id")) + self.assertIn(self.equipment_1, generated_requests.mapped("equipment_id")) diff --git a/maintenance_plan/views/maintenance_equipment_views.xml b/maintenance_plan/views/maintenance_equipment_views.xml new file mode 100644 index 000000000..bdc898ef1 --- /dev/null +++ b/maintenance_plan/views/maintenance_equipment_views.xml @@ -0,0 +1,102 @@ + + + + + equipment.form.inherit + + maintenance.equipment + +
+ +
+ + True + + + + + + + + + + + + + + + + + + + + + + maintenance_team_required + + +
+ + equipment.search-oxigen + maintenance.equipment + + + + + + + + + + equipment.request.form.inherit + maintenance.request + + + + + + + + + + + + + + + + {'hide_equipment_id': 1} + + + + equipment.request.tree + maintenance.request + + + + + + + +
diff --git a/maintenance_plan/views/maintenance_kind_views.xml b/maintenance_plan/views/maintenance_kind_views.xml new file mode 100644 index 000000000..0dfd9f447 --- /dev/null +++ b/maintenance_plan/views/maintenance_kind_views.xml @@ -0,0 +1,26 @@ + + + + maintenance.kind.tree + maintenance.kind + + + + + + + + + Maintenance kinds + maintenance.kind + list + + + + diff --git a/maintenance_plan/views/maintenance_plan_views.xml b/maintenance_plan/views/maintenance_plan_views.xml new file mode 100644 index 000000000..74bca7a65 --- /dev/null +++ b/maintenance_plan/views/maintenance_plan_views.xml @@ -0,0 +1,204 @@ + + + + Maintenance Requests + maintenance.request + + kanban,list,form,pivot,graph,calendar + { + 'default_maintenance_plan_id': active_id, + } + [('maintenance_plan_id', '=', active_id)] + + + maintenance.plan.form + maintenance.plan + +
+
+
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + maintenance.plan.tree + maintenance.plan + + + + + + + + + + + + + + + + + + + + maintenance.plan.search + maintenance.plan + + + + + + + + + + + + + + + + Maintenance plans + maintenance.plan + list,form + + ['|', ('active', '=', True), ('active', '=', + False)] + + + + Maintenance plans + maintenance.plan + list,form + + { + 'default_equipment_id': active_id, 'hide_equipment_id': 0 + } + ['|', ('active', '=', True), ('active', '=', + False), ('search_equipment_id', '=', active_id)] + + + + diff --git a/maintenance_plan/views/report_maintenance_request.xml b/maintenance_plan/views/report_maintenance_request.xml new file mode 100644 index 000000000..008874e7f --- /dev/null +++ b/maintenance_plan/views/report_maintenance_request.xml @@ -0,0 +1,16 @@ + + + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..7d41f1be0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +# generated from manifests external_dependencies +python-dateutil