From d7ce0868ca76c308d4d341ac8a582b92b578209c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Garrido?= Date: Sat, 29 Aug 2020 11:53:32 +0200 Subject: [PATCH 01/33] [13.0][ADD] helpdesk_mgmt_sla 13.0.1.1.0 --- helpdesk_mgmt_sla/README.rst | 98 ++++ helpdesk_mgmt_sla/__init__.py | 1 + helpdesk_mgmt_sla/__manifest__.py | 19 + helpdesk_mgmt_sla/data/helpdesk_sla_cron.xml | 14 + helpdesk_mgmt_sla/i18n/es.po | 175 +++++++ helpdesk_mgmt_sla/models/__init__.py | 6 + helpdesk_mgmt_sla/models/helpdesk_sla.py | 61 +++ helpdesk_mgmt_sla/models/helpdesk_ticket.py | 11 + .../models/helpdesk_ticket_team.py | 17 + helpdesk_mgmt_sla/readme/CONFIGURE.rst | 12 + helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst | 3 + helpdesk_mgmt_sla/readme/DESCRIPTION.rst | 1 + helpdesk_mgmt_sla/readme/USAGE.rst | 2 + .../security/ir.model.access.csv | 2 + helpdesk_mgmt_sla/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 451 ++++++++++++++++++ helpdesk_mgmt_sla/views/helpdesk_sla.xml | 57 +++ helpdesk_mgmt_sla/views/helpdesk_ticket.xml | 26 + .../views/helpdesk_ticket_team.xml | 14 + 19 files changed, 970 insertions(+) create mode 100644 helpdesk_mgmt_sla/README.rst create mode 100644 helpdesk_mgmt_sla/__init__.py create mode 100644 helpdesk_mgmt_sla/__manifest__.py create mode 100644 helpdesk_mgmt_sla/data/helpdesk_sla_cron.xml create mode 100644 helpdesk_mgmt_sla/i18n/es.po create mode 100644 helpdesk_mgmt_sla/models/__init__.py create mode 100644 helpdesk_mgmt_sla/models/helpdesk_sla.py create mode 100644 helpdesk_mgmt_sla/models/helpdesk_ticket.py create mode 100644 helpdesk_mgmt_sla/models/helpdesk_ticket_team.py create mode 100644 helpdesk_mgmt_sla/readme/CONFIGURE.rst create mode 100644 helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst create mode 100644 helpdesk_mgmt_sla/readme/DESCRIPTION.rst create mode 100644 helpdesk_mgmt_sla/readme/USAGE.rst create mode 100644 helpdesk_mgmt_sla/security/ir.model.access.csv create mode 100644 helpdesk_mgmt_sla/static/description/icon.png create mode 100644 helpdesk_mgmt_sla/static/description/index.html create mode 100644 helpdesk_mgmt_sla/views/helpdesk_sla.xml create mode 100644 helpdesk_mgmt_sla/views/helpdesk_ticket.xml create mode 100644 helpdesk_mgmt_sla/views/helpdesk_ticket_team.xml diff --git a/helpdesk_mgmt_sla/README.rst b/helpdesk_mgmt_sla/README.rst new file mode 100644 index 0000000000..cb4af9efc6 --- /dev/null +++ b/helpdesk_mgmt_sla/README.rst @@ -0,0 +1,98 @@ +========================= +Helpdesk Ticket SLA +========================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fhelpdesk-lightgray.png?logo=github + :target: https://github.com/OCA/helpdesk/tree/13.0/helpdesk_mgmt_sla + :alt: OCA/helpdesk +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/helpdesk-13-0/helpdesk-13-0-helpdesk_mgmt_sla + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/282/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds SLA funcionality in Helpdesk module. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +#. Allow SLA for a Helpdesk's Team +#. Set a resource calendar + +Allow SLA +~~~~~~~~~~~~~~~ + +#. Go to Helpdesk > Configuration > SLA. +#. Edit or create a new SLA. +#. Check Allow SLA option to allow SLA for that team. +#. Select a days or hours for that SLA. + +Usage +===== + +#. Go to *Helpdesk* or *Helpdesk > Dashboard* to see the tickets dashboard. +#. In the Kanban view, you can see datetime in two colors: Green and Red. If is green, SLA is ok, if is red, SLA is wrong. + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* GARCO Consulting + +Contributors +~~~~~~~~~~~~ + +* `GARCO Consulting `_: + + * Héctor Garrido + + +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/helpdesk `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/helpdesk_mgmt_sla/__init__.py b/helpdesk_mgmt_sla/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/helpdesk_mgmt_sla/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/helpdesk_mgmt_sla/__manifest__.py b/helpdesk_mgmt_sla/__manifest__.py new file mode 100644 index 0000000000..0038da6603 --- /dev/null +++ b/helpdesk_mgmt_sla/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright (C) 2020 GARCO Consulting +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Helpdesk Ticket SLA", + "summary": "Add SLA to the tickets for Helpdesk Management.", + "author": "GARCO Consulting, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/helpdesk", + "license": "AGPL-3", + "category": "After-Sales", + "version": "13.0.1.1.0", + "depends": ["base", "helpdesk_mgmt", "resource"], + "data": [ + "data/helpdesk_sla_cron.xml", + "security/ir.model.access.csv", + "views/helpdesk_sla.xml", + "views/helpdesk_ticket.xml", + "views/helpdesk_ticket_team.xml", + ], +} diff --git a/helpdesk_mgmt_sla/data/helpdesk_sla_cron.xml b/helpdesk_mgmt_sla/data/helpdesk_sla_cron.xml new file mode 100644 index 0000000000..6ed91121c9 --- /dev/null +++ b/helpdesk_mgmt_sla/data/helpdesk_sla_cron.xml @@ -0,0 +1,14 @@ + + + + Generate Helpdesk SLA alerts from cron + + code + model.check_sla() + + 5 + minutes + -1 + + + diff --git a/helpdesk_mgmt_sla/i18n/es.po b/helpdesk_mgmt_sla/i18n/es.po new file mode 100644 index 0000000000..db568a43f6 --- /dev/null +++ b/helpdesk_mgmt_sla/i18n/es.po @@ -0,0 +1,175 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * helpdesk_sla +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 16:24+0000\n" +"PO-Revision-Date: 2020-08-26 16:24+0000\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: helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "Apply on" +msgstr "Aplicar sobre" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__days +msgid "Days" +msgstr "Días" + +#. module: helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "Description of the policy..." +msgstr "Descripción de la política" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__display_name +msgid "Display Name" +msgstr "Nombre" + +#. module: helpdesk_sla +#: model:ir.actions.server,name:helpdesk_sla.contract_cron_alert_ir_actions_server +#: model:ir.cron,cron_name:helpdesk_sla.contract_cron_alert +#: model:ir.cron,name:helpdesk_sla.contract_cron_alert +msgid "Generate Helpdesk SLA alerts from cron" +msgstr "Generación de SLA desde cron" + +#. module: helpdesk_sla +#: model:ir.actions.act_window,name:helpdesk_sla.action_helpdesk_sla_tree +msgid "Helpdesk SLA" +msgstr "" + +#. module: helpdesk_sla +#: model:ir.model,name:helpdesk_sla.model_helpdesk_ticket +msgid "Helpdesk Ticket" +msgstr "Ticket Helpdesk" + +#. module: helpdesk_sla +#: model:ir.model,name:helpdesk_sla.model_helpdesk_ticket_team +msgid "Helpdesk Ticket Team" +msgstr "Equipo de ticket Helpdesk" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__hours +msgid "Hours" +msgstr "Horas" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__id +msgid "ID" +msgstr "" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla____last_update +msgid "Last Modified on" +msgstr "" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__write_date +msgid "Last Updated on" +msgstr "" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__name +msgid "Name" +msgstr "Nombre" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__note +msgid "Note" +msgstr "Nota" + +#. module: helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "Reach In" +msgstr "Alcanzar en" + +#. module: helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "Reach Stage" +msgstr "Etapa a alcanzar" + +#. module: helpdesk_sla +#: model:ir.ui.menu,name:helpdesk_sla.helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_sla_tree +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "SLA" +msgstr "" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_ticket__sla_deadline +msgid "SLA deadline" +msgstr "SLA Fecha límite" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_ticket__sla_expired +msgid "SLA expired" +msgstr "SLA Expirado" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_ticket_team__sla_ids +msgid "SLAs" +msgstr "" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__stage_id +msgid "Stage" +msgstr "Etapa" + +#. module: helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "Target" +msgstr "Objetivo" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_sla__team_id +msgid "Team" +msgstr "Equipo" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_ticket_team__use_sla +msgid "Use SLA" +msgstr "Usar SLA" + +#. module: helpdesk_sla +#: model:ir.model.fields,field_description:helpdesk_sla.field_helpdesk_ticket_team__resource_calendar_id +msgid "Working Hours" +msgstr "Horario de trabajo" + +#. module: helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "days
" +msgstr "días
" + +#. module: helpdesk_sla +#: model:ir.model,name:helpdesk_sla.model_helpdesk_sla +msgid "helpdesk.sla" +msgstr "" + +#. module: helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_sla.helpdesk_ticket_sla_form +msgid "hours
" +msgstr "horas
" diff --git a/helpdesk_mgmt_sla/models/__init__.py b/helpdesk_mgmt_sla/models/__init__.py new file mode 100644 index 0000000000..84fc5ead57 --- /dev/null +++ b/helpdesk_mgmt_sla/models/__init__.py @@ -0,0 +1,6 @@ +# Copyright (C) 2020 GARCO Consulting +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import helpdesk_sla +from . import helpdesk_ticket +from . import helpdesk_ticket_team diff --git a/helpdesk_mgmt_sla/models/helpdesk_sla.py b/helpdesk_mgmt_sla/models/helpdesk_sla.py new file mode 100644 index 0000000000..11151b217e --- /dev/null +++ b/helpdesk_mgmt_sla/models/helpdesk_sla.py @@ -0,0 +1,61 @@ +# Copyright (C) 2020 GARCO Consulting +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from odoo import fields, models + + +class HelpdeskSla(models.Model): + _name = "helpdesk.sla" + _description = "Helpdesk SLA" + + name = fields.Char(string="Name", required=True) + team_id = fields.Many2one("helpdesk.ticket.team", "Team", required=True) + stage_id = fields.Many2one(comodel_name="helpdesk.ticket.stage", string="Stage") + days = fields.Integer(string="Days", default=0, required=True) + hours = fields.Integer(string="Hours", default=0, required=True) + note = fields.Char(string="Note") + + def check_sla(self): + slas = self.search([("team_id", "!=", False)]) + for sla in slas: + if sla.team_id.ticket_ids: + sla.check_ticket_sla() + + def check_ticket_sla(self): + for ticket in self.team_id.ticket_ids: + deadline = ticket.create_date + working_calendar = ticket.team_id.resource_calendar_id + + if self.days > 0: + deadline = working_calendar.plan_days( + self.days + 1, deadline, compute_leaves=True + ) + create_date = ticket.create_date + + deadline = deadline.replace( + hour=create_date.hour, + minute=create_date.minute, + second=create_date.second, + microsecond=create_date.microsecond, + ) + + deadline_for_working_cal = working_calendar.plan_hours(0, deadline) + + if ( + deadline_for_working_cal + and deadline.day < deadline_for_working_cal.day + ): + deadline = deadline.replace( + hour=0, minute=0, second=0, microsecond=0 + ) + + deadline = working_calendar.plan_hours( + self.hours, deadline, compute_leaves=True + ) + ticket.sla_deadline = deadline + if ticket.sla_deadline < datetime.today().now(): + ticket.sla_expired = True + else: + ticket.sla_expired = False diff --git a/helpdesk_mgmt_sla/models/helpdesk_ticket.py b/helpdesk_mgmt_sla/models/helpdesk_ticket.py new file mode 100644 index 0000000000..bb556e45a0 --- /dev/null +++ b/helpdesk_mgmt_sla/models/helpdesk_ticket.py @@ -0,0 +1,11 @@ +# Copyright (C) 2020 GARCO Consulting +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HelpdeskTicket(models.Model): + _inherit = "helpdesk.ticket" + + sla_expired = fields.Boolean(string="SLA expired") + sla_deadline = fields.Datetime(string="SLA deadline") diff --git a/helpdesk_mgmt_sla/models/helpdesk_ticket_team.py b/helpdesk_mgmt_sla/models/helpdesk_ticket_team.py new file mode 100644 index 0000000000..db17853559 --- /dev/null +++ b/helpdesk_mgmt_sla/models/helpdesk_ticket_team.py @@ -0,0 +1,17 @@ +# Copyright (C) 2020 GARCO Consulting +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HelpdeskTicketTeam(models.Model): + _inherit = "helpdesk.ticket.team" + + use_sla = fields.Boolean(string="Use SLA") + sla_ids = fields.Many2many(comodel_name="helpdesk.sla", string="SLAs") + resource_calendar_id = fields.Many2one( + "resource.calendar", + "Working Hours", + default=lambda self: self.env.company.resource_calendar_id, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", + ) diff --git a/helpdesk_mgmt_sla/readme/CONFIGURE.rst b/helpdesk_mgmt_sla/readme/CONFIGURE.rst new file mode 100644 index 0000000000..1ea0cfe110 --- /dev/null +++ b/helpdesk_mgmt_sla/readme/CONFIGURE.rst @@ -0,0 +1,12 @@ +To configure this module, you need to: + +#. Allow SLA for a Helpdesk's Team +#. Set a resource calendar + +Allow SLA +~~~~~~~~~~~~~~~ + +#. Go to Helpdesk > Configuration > SLA. +#. Edit or create a new SLA. +#. Check Allow SLA option to allow SLA for that team. +#. Select a days or hours for that SLA. diff --git a/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst b/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..7272511c11 --- /dev/null +++ b/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `GARCO Consulting `_: + + * Héctor Garrido diff --git a/helpdesk_mgmt_sla/readme/DESCRIPTION.rst b/helpdesk_mgmt_sla/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..a25fbe75c5 --- /dev/null +++ b/helpdesk_mgmt_sla/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds SLA funcionality in Helpdesk module. diff --git a/helpdesk_mgmt_sla/readme/USAGE.rst b/helpdesk_mgmt_sla/readme/USAGE.rst new file mode 100644 index 0000000000..b48ebbaef0 --- /dev/null +++ b/helpdesk_mgmt_sla/readme/USAGE.rst @@ -0,0 +1,2 @@ +#. Go to *Helpdesk* or *Helpdesk > Dashboard* to see the tickets dashboard. +#. In the Kanban view, you can see datetime in two colors: Green and Red. If is green, SLA is ok, if is red, SLA is wrong. diff --git a/helpdesk_mgmt_sla/security/ir.model.access.csv b/helpdesk_mgmt_sla/security/ir.model.access.csv new file mode 100644 index 0000000000..99dbc7e4da --- /dev/null +++ b/helpdesk_mgmt_sla/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_helpdesk_sla_manager,access_helpdesk_sla_manager,model_helpdesk_sla,helpdesk_mgmt.group_helpdesk_manager,1,1,1,1 diff --git a/helpdesk_mgmt_sla/static/description/icon.png b/helpdesk_mgmt_sla/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt_sla/static/description/index.html b/helpdesk_mgmt_sla/static/description/index.html new file mode 100644 index 0000000000..8c1be2a37d --- /dev/null +++ b/helpdesk_mgmt_sla/static/description/index.html @@ -0,0 +1,451 @@ + + + + + + +Helpdesk Ticket SLA + + + +
+

Helpdesk Ticket SLA

+ + +

Beta License: AGPL-3 OCA/helpdesk Translate me on Weblate Try me on Runbot

+

This module adds SLA funcionality in Helpdesk module.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to:

+
    +
  1. Allow SLA for a Helpdesk's Team
  2. +
  3. Set a resource calendar
  4. +
+
+

Allow SLA

+
    +
  1. Go to Helpdesk > Configuration > SLA.
  2. +
  3. Edit or create a new SLA.
  4. +
  5. Check Allow SLA option to allow SLA for that team.
  6. +
  7. Select a days or hours for that SLA.
  8. +
+
+
+
+

Usage

+
    +
  1. Go to Helpdesk or Helpdesk > Dashboard to see the tickets dashboard.
  2. +
  3. In the Kanban view, you can see datetime in two colors: Green and Red. If is green, SLA is ok, if is red, SLA is wrong.
  4. +
+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • GARCO Consulting
  • +
+
+
+

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/helpdesk project on GitHub.

+

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

+
+
+
+ + diff --git a/helpdesk_mgmt_sla/views/helpdesk_sla.xml b/helpdesk_mgmt_sla/views/helpdesk_sla.xml new file mode 100644 index 0000000000..cc36b5986e --- /dev/null +++ b/helpdesk_mgmt_sla/views/helpdesk_sla.xml @@ -0,0 +1,57 @@ + + + helpdesk.sla.form + helpdesk.sla + +
+ +
+
+ + + + + + + + + +
+
+
+
+ + helpdesk.sla.tree + helpdesk.sla + + + + + + + + + + + + Helpdesk SLA + helpdesk.sla + tree,form + + +
diff --git a/helpdesk_mgmt_sla/views/helpdesk_ticket.xml b/helpdesk_mgmt_sla/views/helpdesk_ticket.xml new file mode 100644 index 0000000000..b39921e220 --- /dev/null +++ b/helpdesk_mgmt_sla/views/helpdesk_ticket.xml @@ -0,0 +1,26 @@ + + + + inherit_view_helpdesk_ticket_kanban + helpdesk.ticket + + + + + + + +
+ + + +
+
+ + + +
+
+
+
+
diff --git a/helpdesk_mgmt_sla/views/helpdesk_ticket_team.xml b/helpdesk_mgmt_sla/views/helpdesk_ticket_team.xml new file mode 100644 index 0000000000..f2ba5ec21d --- /dev/null +++ b/helpdesk_mgmt_sla/views/helpdesk_ticket_team.xml @@ -0,0 +1,14 @@ + + + + inherit.view_helpdesk_sla_team_form + helpdesk.ticket.team + + + + + + + + + From 5f887d0e8c29b4cd1219404fc0d9f2cab58b30e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Garrido=20Colmenarejo?= Date: Tue, 24 Aug 2021 08:43:41 +0200 Subject: [PATCH 02/33] [SQUASH] 13.0-helpdesk_mgmt_sla --- helpdesk_mgmt_sla/README.rst | 2 +- helpdesk_mgmt_sla/__manifest__.py | 9 ++-- .../demo/helpdesk_mgmt_sla_demo.xml | 20 +++++++++ helpdesk_mgmt_sla/models/__init__.py | 2 +- helpdesk_mgmt_sla/models/helpdesk_sla.py | 15 +++---- helpdesk_mgmt_sla/models/helpdesk_ticket.py | 7 +++- .../models/helpdesk_ticket_team.py | 3 +- helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst | 2 +- .../static/description/index.html | 8 ++-- helpdesk_mgmt_sla/tests/__init__.py | 4 ++ .../tests/test_helpdesk_mgmt_sla.py | 41 +++++++++++++++++++ ...elpdesk_sla.xml => helpdesk_sla_views.xml} | 6 ++- ...eam.xml => helpdesk_ticket_team_views.xml} | 0 ...k_ticket.xml => helpdesk_ticket_views.xml} | 15 +++++++ 14 files changed, 112 insertions(+), 22 deletions(-) create mode 100644 helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml create mode 100644 helpdesk_mgmt_sla/tests/__init__.py create mode 100644 helpdesk_mgmt_sla/tests/test_helpdesk_mgmt_sla.py rename helpdesk_mgmt_sla/views/{helpdesk_sla.xml => helpdesk_sla_views.xml} (90%) rename helpdesk_mgmt_sla/views/{helpdesk_ticket_team.xml => helpdesk_ticket_team_views.xml} (100%) rename helpdesk_mgmt_sla/views/{helpdesk_ticket.xml => helpdesk_ticket_views.xml} (62%) diff --git a/helpdesk_mgmt_sla/README.rst b/helpdesk_mgmt_sla/README.rst index cb4af9efc6..d522713ba3 100644 --- a/helpdesk_mgmt_sla/README.rst +++ b/helpdesk_mgmt_sla/README.rst @@ -75,7 +75,7 @@ Authors Contributors ~~~~~~~~~~~~ -* `GARCO Consulting `_: +* `GARCO Consulting `_: * Héctor Garrido diff --git a/helpdesk_mgmt_sla/__manifest__.py b/helpdesk_mgmt_sla/__manifest__.py index 0038da6603..d62da1a9d6 100644 --- a/helpdesk_mgmt_sla/__manifest__.py +++ b/helpdesk_mgmt_sla/__manifest__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2020 GARCO Consulting +# Copyright (C) 2020 GARCO Consulting # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Helpdesk Ticket SLA", @@ -12,8 +12,9 @@ "data": [ "data/helpdesk_sla_cron.xml", "security/ir.model.access.csv", - "views/helpdesk_sla.xml", - "views/helpdesk_ticket.xml", - "views/helpdesk_ticket_team.xml", + "views/helpdesk_sla_views.xml", + "views/helpdesk_ticket_views.xml", + "views/helpdesk_ticket_team_views.xml", ], + "demo": ["demo/helpdesk_mgmt_sla_demo.xml"], } diff --git a/helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml b/helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml new file mode 100644 index 0000000000..7846880944 --- /dev/null +++ b/helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml @@ -0,0 +1,20 @@ + + + + + + + + General SLA + + + 2 + + + diff --git a/helpdesk_mgmt_sla/models/__init__.py b/helpdesk_mgmt_sla/models/__init__.py index 84fc5ead57..84d670ae28 100644 --- a/helpdesk_mgmt_sla/models/__init__.py +++ b/helpdesk_mgmt_sla/models/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2020 GARCO Consulting +# Copyright (C) 2020 GARCO Consulting # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import helpdesk_sla diff --git a/helpdesk_mgmt_sla/models/helpdesk_sla.py b/helpdesk_mgmt_sla/models/helpdesk_sla.py index 11151b217e..87b396e7df 100644 --- a/helpdesk_mgmt_sla/models/helpdesk_sla.py +++ b/helpdesk_mgmt_sla/models/helpdesk_sla.py @@ -1,4 +1,4 @@ -# Copyright (C) 2020 GARCO Consulting +# Copyright (C) 2020 GARCO Consulting # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from datetime import datetime @@ -11,20 +11,21 @@ class HelpdeskSla(models.Model): _description = "Helpdesk SLA" name = fields.Char(string="Name", required=True) - team_id = fields.Many2one("helpdesk.ticket.team", "Team", required=True) + team_ids = fields.Many2many(comodel_name="helpdesk.ticket.team", string="Teams") stage_id = fields.Many2one(comodel_name="helpdesk.ticket.stage", string="Stage") days = fields.Integer(string="Days", default=0, required=True) hours = fields.Integer(string="Hours", default=0, required=True) note = fields.Char(string="Note") def check_sla(self): - slas = self.search([("team_id", "!=", False)]) + slas = self.search([("team_ids", "!=", False)]) for sla in slas: - if sla.team_id.ticket_ids: - sla.check_ticket_sla() + for team in sla.team_ids: + if team.ticket_ids: + sla.check_ticket_sla(team.ticket_ids) - def check_ticket_sla(self): - for ticket in self.team_id.ticket_ids: + def check_ticket_sla(self, ticket_ids): + for ticket in ticket_ids.filtered(lambda t: not t.stage_id.closed): deadline = ticket.create_date working_calendar = ticket.team_id.resource_calendar_id diff --git a/helpdesk_mgmt_sla/models/helpdesk_ticket.py b/helpdesk_mgmt_sla/models/helpdesk_ticket.py index bb556e45a0..9fc48b65c6 100644 --- a/helpdesk_mgmt_sla/models/helpdesk_ticket.py +++ b/helpdesk_mgmt_sla/models/helpdesk_ticket.py @@ -1,4 +1,4 @@ -# Copyright (C) 2020 GARCO Consulting +# Copyright (C) 2020 GARCO Consulting # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models @@ -7,5 +7,10 @@ class HelpdeskTicket(models.Model): _inherit = "helpdesk.ticket" + team_sla = fields.Boolean(string="Team SLA", compute="_compute_team_sla") sla_expired = fields.Boolean(string="SLA expired") sla_deadline = fields.Datetime(string="SLA deadline") + + def _compute_team_sla(self): + for rec in self: + rec.team_sla = rec.team_id.use_sla diff --git a/helpdesk_mgmt_sla/models/helpdesk_ticket_team.py b/helpdesk_mgmt_sla/models/helpdesk_ticket_team.py index db17853559..a190cbe118 100644 --- a/helpdesk_mgmt_sla/models/helpdesk_ticket_team.py +++ b/helpdesk_mgmt_sla/models/helpdesk_ticket_team.py @@ -1,4 +1,4 @@ -# Copyright (C) 2020 GARCO Consulting +# Copyright (C) 2020 GARCO Consulting # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models @@ -8,7 +8,6 @@ class HelpdeskTicketTeam(models.Model): _inherit = "helpdesk.ticket.team" use_sla = fields.Boolean(string="Use SLA") - sla_ids = fields.Many2many(comodel_name="helpdesk.sla", string="SLAs") resource_calendar_id = fields.Many2one( "resource.calendar", "Working Hours", diff --git a/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst b/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst index 7272511c11..ba1a4a4eab 100644 --- a/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst @@ -1,3 +1,3 @@ -* `GARCO Consulting `_: +* `GARCO Consulting `_: * Héctor Garrido diff --git a/helpdesk_mgmt_sla/static/description/index.html b/helpdesk_mgmt_sla/static/description/index.html index 8c1be2a37d..a2f25bf714 100644 --- a/helpdesk_mgmt_sla/static/description/index.html +++ b/helpdesk_mgmt_sla/static/description/index.html @@ -360,7 +360,7 @@ -
+

Helpdesk Ticket SLA

-

Beta License: AGPL-3 OCA/helpdesk Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/helpdesk Translate me on Weblate Try me on Runbot

This module adds SLA funcionality in Helpdesk module.

Table of contents

@@ -415,7 +415,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -442,7 +442,7 @@

Maintainers

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/helpdesk project on GitHub.

+

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

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

From 8c1328e80ae3f83c880ce48f8bb9e5aebd5ded88 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Mon, 5 Sep 2022 04:02:23 +0000 Subject: [PATCH 10/33] Added translation using Weblate (Spanish (Argentina)) --- helpdesk_mgmt_sla/i18n/es_AR.po | 176 ++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 helpdesk_mgmt_sla/i18n/es_AR.po diff --git a/helpdesk_mgmt_sla/i18n/es_AR.po b/helpdesk_mgmt_sla/i18n/es_AR.po new file mode 100644 index 0000000000..1eba6b7456 --- /dev/null +++ b/helpdesk_mgmt_sla/i18n/es_AR.po @@ -0,0 +1,176 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * helpdesk_mgmt_sla +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: es_AR\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" + +#. module: helpdesk_mgmt_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "Apply on" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__create_uid +msgid "Created by" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__create_date +msgid "Created on" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__days +msgid "Days" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "Description of the policy..." +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__display_name +msgid "Display Name" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.actions.server,name:helpdesk_mgmt_sla.contract_cron_alert_ir_actions_server +#: model:ir.cron,cron_name:helpdesk_mgmt_sla.contract_cron_alert +#: model:ir.cron,name:helpdesk_mgmt_sla.contract_cron_alert +msgid "Generate Helpdesk SLA alerts from cron" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.actions.act_window,name:helpdesk_mgmt_sla.action_helpdesk_sla_tree +#: model:ir.model,name:helpdesk_mgmt_sla.model_helpdesk_sla +msgid "Helpdesk SLA" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model,name:helpdesk_mgmt_sla.model_helpdesk_ticket +msgid "Helpdesk Ticket" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model,name:helpdesk_mgmt_sla.model_helpdesk_ticket_team +msgid "Helpdesk Ticket Team" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__hours +msgid "Hours" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__id +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__id +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__id +msgid "ID" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla____last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket____last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team____last_update +msgid "Last Modified on" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__write_date +msgid "Last Updated on" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__name +msgid "Name" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__note +msgid "Note" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "Reach In" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "Reach Stage" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.ui.menu,name:helpdesk_mgmt_sla.helpdesk_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_sla_tree +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "SLA" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__sla_deadline +msgid "SLA deadline" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__sla_expired +msgid "SLA expired" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__stage_id +msgid "Stage" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "Target" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__team_sla +msgid "Team SLA" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__team_ids +msgid "Teams" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__use_sla +msgid "Use SLA" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__resource_calendar_id +msgid "Working Hours" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "days
" +msgstr "" + +#. module: helpdesk_mgmt_sla +#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form +msgid "hours
" +msgstr "" From 4a70f4aff02a751e5672487699c638424293b142 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Mon, 5 Sep 2022 04:18:59 +0000 Subject: [PATCH 11/33] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (30 of 30 strings) Translation: helpdesk-14.0/helpdesk-14.0-helpdesk_mgmt_sla Translate-URL: https://translation.odoo-community.org/projects/helpdesk-14-0/helpdesk-14-0-helpdesk_mgmt_sla/es_AR/ --- helpdesk_mgmt_sla/i18n/es_AR.po | 64 +++++++++++++++++---------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/helpdesk_mgmt_sla/i18n/es_AR.po b/helpdesk_mgmt_sla/i18n/es_AR.po index 1eba6b7456..c2180e1271 100644 --- a/helpdesk_mgmt_sla/i18n/es_AR.po +++ b/helpdesk_mgmt_sla/i18n/es_AR.po @@ -6,171 +6,173 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2022-09-05 07:07+0000\n" +"Last-Translator: Ignacio Buioli \n" "Language-Team: none\n" "Language: es_AR\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.3.2\n" #. module: helpdesk_mgmt_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "Apply on" -msgstr "" +msgstr "Aplica en" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__create_uid msgid "Created by" -msgstr "" +msgstr "Creado por" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__create_date msgid "Created on" -msgstr "" +msgstr "Creado el" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__days msgid "Days" -msgstr "" +msgstr "Días" #. module: helpdesk_mgmt_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "Description of the policy..." -msgstr "" +msgstr "Descripción de la política..." #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__display_name #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__display_name #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__display_name msgid "Display Name" -msgstr "" +msgstr "Mostrar Nombre" #. module: helpdesk_mgmt_sla #: model:ir.actions.server,name:helpdesk_mgmt_sla.contract_cron_alert_ir_actions_server #: model:ir.cron,cron_name:helpdesk_mgmt_sla.contract_cron_alert #: model:ir.cron,name:helpdesk_mgmt_sla.contract_cron_alert msgid "Generate Helpdesk SLA alerts from cron" -msgstr "" +msgstr "Generar alertas SLA del Mesa de Ayuda desde un cron" #. module: helpdesk_mgmt_sla #: model:ir.actions.act_window,name:helpdesk_mgmt_sla.action_helpdesk_sla_tree #: model:ir.model,name:helpdesk_mgmt_sla.model_helpdesk_sla msgid "Helpdesk SLA" -msgstr "" +msgstr "Mesa de Ayuda SLA" #. module: helpdesk_mgmt_sla #: model:ir.model,name:helpdesk_mgmt_sla.model_helpdesk_ticket msgid "Helpdesk Ticket" -msgstr "" +msgstr "Ticket de la Mesa de Ayuda" #. module: helpdesk_mgmt_sla #: model:ir.model,name:helpdesk_mgmt_sla.model_helpdesk_ticket_team msgid "Helpdesk Ticket Team" -msgstr "" +msgstr "Equipo del Ticket de la Mesa de Ayuda" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__hours msgid "Hours" -msgstr "" +msgstr "Horas" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__id #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__id #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__id msgid "ID" -msgstr "" +msgstr "ID" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla____last_update #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket____last_update #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team____last_update msgid "Last Modified on" -msgstr "" +msgstr "Última Modificación el" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Última Actualización por" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__write_date msgid "Last Updated on" -msgstr "" +msgstr "Última Actualización el" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__name msgid "Name" -msgstr "" +msgstr "Nombre" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__note msgid "Note" -msgstr "" +msgstr "Nota" #. module: helpdesk_mgmt_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "Reach In" -msgstr "" +msgstr "Alcanzar" #. module: helpdesk_mgmt_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "Reach Stage" -msgstr "" +msgstr "Alcanzar Etapa" #. module: helpdesk_mgmt_sla #: model:ir.ui.menu,name:helpdesk_mgmt_sla.helpdesk_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_sla_tree #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "SLA" -msgstr "" +msgstr "SLA" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__sla_deadline msgid "SLA deadline" -msgstr "" +msgstr "Fecha Límite SLA" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__sla_expired msgid "SLA expired" -msgstr "" +msgstr "SLA expirado" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__stage_id msgid "Stage" -msgstr "" +msgstr "Etapa" #. module: helpdesk_mgmt_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "Target" -msgstr "" +msgstr "Objetivo" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket__team_sla msgid "Team SLA" -msgstr "" +msgstr "Equipo SLA" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_sla__team_ids msgid "Teams" -msgstr "" +msgstr "Equipos" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__use_sla msgid "Use SLA" -msgstr "" +msgstr "Usar SLA" #. module: helpdesk_mgmt_sla #: model:ir.model.fields,field_description:helpdesk_mgmt_sla.field_helpdesk_ticket_team__resource_calendar_id msgid "Working Hours" -msgstr "" +msgstr "Horas Trabajadas" #. module: helpdesk_mgmt_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "days
" -msgstr "" +msgstr "días
" #. module: helpdesk_mgmt_sla #: model_terms:ir.ui.view,arch_db:helpdesk_mgmt_sla.helpdesk_ticket_sla_form msgid "hours
" -msgstr "" +msgstr "horas
" From a2e99df6cd38e685576946dfd986a9700b2fd9b1 Mon Sep 17 00:00:00 2001 From: bojan Date: Wed, 7 Sep 2022 15:48:19 +0200 Subject: [PATCH 12/33] [IMP] helpdesk_mgmt_sla: implement more advanced rules Implement more advanced rules to filter the tickets it applies to. Additionally, the stage_id field is removed as it wasn't used. --- .../demo/helpdesk_mgmt_sla_demo.xml | 4 - helpdesk_mgmt_sla/models/helpdesk_sla.py | 54 ++++++++--- helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst | 1 + helpdesk_mgmt_sla/tests/common.py | 58 ++++++++++++ .../tests/test_helpdesk_mgmt_sla.py | 92 +++++++++++-------- .../views/helpdesk_sla_views.xml | 71 ++++++++++++-- 6 files changed, 219 insertions(+), 61 deletions(-) create mode 100644 helpdesk_mgmt_sla/tests/common.py diff --git a/helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml b/helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml index 7846880944..732dc1b153 100644 --- a/helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml +++ b/helpdesk_mgmt_sla/demo/helpdesk_mgmt_sla_demo.xml @@ -10,10 +10,6 @@ name="team_ids" eval="[(6,0,[ref('helpdesk_mgmt.helpdesk_team_2')])]" /> - 2 diff --git a/helpdesk_mgmt_sla/models/helpdesk_sla.py b/helpdesk_mgmt_sla/models/helpdesk_sla.py index 87b396e7df..645f5513ea 100644 --- a/helpdesk_mgmt_sla/models/helpdesk_sla.py +++ b/helpdesk_mgmt_sla/models/helpdesk_sla.py @@ -3,29 +3,61 @@ from datetime import datetime -from odoo import fields, models +from odoo import api, fields, models +from odoo.tools.safe_eval import safe_eval class HelpdeskSla(models.Model): _name = "helpdesk.sla" + _inherit = ["mail.thread", "mail.activity.mixin"] _description = "Helpdesk SLA" name = fields.Char(string="Name", required=True) team_ids = fields.Many2many(comodel_name="helpdesk.ticket.team", string="Teams") - stage_id = fields.Many2one(comodel_name="helpdesk.ticket.stage", string="Stage") + category_ids = fields.Many2many( + comodel_name="helpdesk.ticket.category", string="Categories" + ) + tag_ids = fields.Many2many(comodel_name="helpdesk.ticket.tag", string="Tags") + stage_ids = fields.Many2many(comodel_name="helpdesk.ticket.stage", string="Stages") days = fields.Integer(string="Days", default=0, required=True) hours = fields.Integer(string="Hours", default=0, required=True) - note = fields.Char(string="Note") + note = fields.Html(string="Note") + domain = fields.Char(string="Filter", default="[]") + active = fields.Boolean(default=True) + def _applies_for(self, ticket): + self.ensure_one() + if self.team_ids and ticket.team_id not in self.team_ids: + return False + if self.stage_ids and ticket.stage_id not in self.stage_ids: + return False + if self.category_ids and ticket.category_id not in self.category_ids: + return False + if self.tag_ids and not any(tag in ticket.tag_ids for tag in self.tag_ids): + return False + if self.domain and self.domain != "[]": + domain = safe_eval(self.domain) + if not ticket.filtered_domain(domain): + return False + return True + + @api.model + def _get_sla_ticket_domain(self): + return [("stage_id.closed", "=", False)] + + @api.model def check_sla(self): - slas = self.search([("team_ids", "!=", False)]) - for sla in slas: - for team in sla.team_ids: - if team.ticket_ids: - sla.check_ticket_sla(team.ticket_ids) - - def check_ticket_sla(self, ticket_ids): - for ticket in ticket_ids.filtered(lambda t: not t.stage_id.closed): + """Scheduler that checks sla on tickets""" + tickets = self.env["helpdesk.ticket"].search(self._get_sla_ticket_domain()) + slas = self.search([]) + for ticket in tickets: + for sla in slas: + if sla._applies_for(ticket): + sla.check_ticket_sla(ticket) + break + + def check_ticket_sla(self, tickets): + for ticket in tickets: deadline = ticket.create_date working_calendar = ticket.team_id.resource_calendar_id diff --git a/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst b/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst index ba1a4a4eab..71de931d83 100644 --- a/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt_sla/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * `GARCO Consulting `_: * Héctor Garrido + * Bojan Anchev diff --git a/helpdesk_mgmt_sla/tests/common.py b/helpdesk_mgmt_sla/tests/common.py new file mode 100644 index 0000000000..8aa6d4c117 --- /dev/null +++ b/helpdesk_mgmt_sla/tests/common.py @@ -0,0 +1,58 @@ +# Copyright (C) 2020 GARCO Consulting +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.addons.helpdesk_mgmt.tests import test_helpdesk_ticket + + +class CommonHelpdeskMgmtSla(test_helpdesk_ticket.TestHelpdeskTicket): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.calendar = cls.env.ref("resource.resource_calendar_std") + cls.stage1 = cls.env["helpdesk.ticket.stage"].create({"name": "Stage One"}) + cls.stage2 = cls.env["helpdesk.ticket.stage"].create({"name": "Stage Two"}) + cls.team1 = cls.env["helpdesk.ticket.team"].create( + { + "name": "Team SLA One", + "resource_calendar_id": cls.calendar.id, + "use_sla": True, + } + ) + cls.team2 = cls.env["helpdesk.ticket.team"].create( + { + "name": "Team SLA Two", + "resource_calendar_id": cls.calendar.id, + "use_sla": True, + } + ) + cls.category1 = cls.env["helpdesk.ticket.category"].create( + {"name": "Category One"} + ) + cls.category2 = cls.env["helpdesk.ticket.category"].create( + {"name": "Category Two"} + ) + cls.tag1 = cls.env["helpdesk.ticket.tag"].create({"name": "Tag One"}) + cls.tag2 = cls.env["helpdesk.ticket.tag"].create({"name": "Tag Two"}) + cls.sla = cls.env["helpdesk.sla"].create( + { + "name": "Generic SLA", + "hours": 2, + } + ) + cls.ticket1 = cls.env["helpdesk.ticket"].create( + { + "name": "Test Ticket 1", + "description": "Ticket test", + "team_id": cls.team1.id, + } + ) + cls.ticket2 = cls.env["helpdesk.ticket"].create( + { + "name": "Test Ticket 2", + "description": "Ticket test", + "team_id": cls.team2.id, + } + ) + cls.env["helpdesk.ticket"].search( + [("id", "not in", (cls.ticket1 + cls.ticket2).ids)] + ).active = False diff --git a/helpdesk_mgmt_sla/tests/test_helpdesk_mgmt_sla.py b/helpdesk_mgmt_sla/tests/test_helpdesk_mgmt_sla.py index 70c9dd5bc1..d79289c1c4 100644 --- a/helpdesk_mgmt_sla/tests/test_helpdesk_mgmt_sla.py +++ b/helpdesk_mgmt_sla/tests/test_helpdesk_mgmt_sla.py @@ -1,41 +1,59 @@ # Copyright (C) 2020 GARCO Consulting # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -import logging - -from odoo.addons.helpdesk_mgmt.tests import test_helpdesk_ticket - -_log = logging.getLogger(__name__) - - -class TestHelpdeskMgmtSla(test_helpdesk_ticket.TestHelpdeskTicket): - @classmethod - def setUpClass(cls): - super(TestHelpdeskMgmtSla, cls).setUpClass() - cls.team_id = cls.env["helpdesk.ticket.team"].create( - {"name": "Team SLA", "use_sla": True} - ) - cls.stage_id = cls.env["helpdesk.ticket.stage"].create({"name": "Reach stage"}) - cls.sla_id = cls.env["helpdesk.sla"].create( - { - "name": "Generic SLA", - "team_ids": [(6, 0, [cls.team_id.id])], - "stage_id": cls.stage_id.id, - "hours": 2, - } - ) - cls.ticket = cls.env["helpdesk.ticket"].create( - { - "name": "Test Ticket 1", - "description": "Ticket test", - "team_id": cls.team_id.id, - } - ) - - def test_helpdesk_mgmt_sla(self): - self.ticket._compute_team_sla() - self.assertEqual(self.ticket.sla_expired, False) - - def test_helpdesk_sla(self): +from datetime import timedelta + +from freezegun import freeze_time + +from odoo import fields + +from odoo.addons.helpdesk_mgmt_sla.tests.common import CommonHelpdeskMgmtSla + + +class TestHelpdeskMgmtSla(CommonHelpdeskMgmtSla): + @freeze_time(fields.Datetime.now() + timedelta(days=7)) + def test_sla_rule_global(self): + self.env["helpdesk.sla"].check_sla() + self.assertTrue(self.ticket1.sla_expired) + self.assertTrue(self.ticket2.sla_expired) + + @freeze_time(fields.Datetime.now() + timedelta(days=7)) + def test_sla_rule_team(self): + self.sla.team_ids = [(6, 0, [self.team1.id])] + self.env["helpdesk.sla"].check_sla() + self.assertTrue(self.ticket1.sla_expired) + self.assertFalse(self.ticket2.sla_expired) + + @freeze_time(fields.Datetime.now() + timedelta(days=7)) + def test_sla_rule_stage(self): + self.sla.stage_ids = [(6, 0, [self.stage1.id])] + self.ticket1.stage_id = self.stage1 + self.ticket2.stage_id = self.stage2 + self.env["helpdesk.sla"].check_sla() + self.assertTrue(self.ticket1.sla_expired) + self.assertFalse(self.ticket2.sla_expired) + + @freeze_time(fields.Datetime.now() + timedelta(days=7)) + def test_sla_rule_category(self): + self.sla.category_ids = [(6, 0, [self.category1.id])] + self.ticket1.category_id = self.category1 + self.ticket2.category_id = self.category2 + self.env["helpdesk.sla"].check_sla() + self.assertTrue(self.ticket1.sla_expired) + self.assertFalse(self.ticket2.sla_expired) + + @freeze_time(fields.Datetime.now() + timedelta(days=7)) + def test_sla_rule_tag(self): + self.sla.tag_ids = [(6, 0, [self.tag1.id])] + self.ticket1.tag_ids = self.tag1 + self.ticket2.tag_ids = self.tag2 + self.env["helpdesk.sla"].check_sla() + self.assertTrue(self.ticket1.sla_expired) + self.assertFalse(self.ticket2.sla_expired) + + @freeze_time(fields.Datetime.now() + timedelta(days=7)) + def test_sla_rule_domain(self): + self.sla.domain = f"[('id', '=', {self.ticket1.id})]" self.env["helpdesk.sla"].check_sla() - self.assertEqual(self.ticket.sla_expired, False) + self.assertTrue(self.ticket1.sla_expired) + self.assertFalse(self.ticket2.sla_expired) diff --git a/helpdesk_mgmt_sla/views/helpdesk_sla_views.xml b/helpdesk_mgmt_sla/views/helpdesk_sla_views.xml index 8363202d13..4eb8d593e4 100644 --- a/helpdesk_mgmt_sla/views/helpdesk_sla_views.xml +++ b/helpdesk_mgmt_sla/views/helpdesk_sla_views.xml @@ -1,10 +1,45 @@ + + helpdesk.sla.form.search + helpdesk.sla + + + + + + + + + helpdesk.sla.form helpdesk.sla
+
+