From 1fe929a500cd929039cdfcdf825b1518af85ea5d Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Mon, 27 May 2019 12:52:07 +0200 Subject: [PATCH 001/337] [ADD] Initial commit * Add ticket model and its fields * Adding readme with different tasks --- helpdesk_mgmt/README.md | 36 ++++++++++++++++++++++ helpdesk_mgmt/__init__.py | 1 + helpdesk_mgmt/__manifest__.py | 14 +++++++++ helpdesk_mgmt/models/helpdesk_ticket.py | 40 +++++++++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 helpdesk_mgmt/README.md create mode 100644 helpdesk_mgmt/__init__.py create mode 100644 helpdesk_mgmt/__manifest__.py create mode 100644 helpdesk_mgmt/models/helpdesk_ticket.py diff --git a/helpdesk_mgmt/README.md b/helpdesk_mgmt/README.md new file mode 100644 index 0000000000..fb01a2e0c3 --- /dev/null +++ b/helpdesk_mgmt/README.md @@ -0,0 +1,36 @@ +# Odoo Helpdesk + + - Base module + - Tickets + - [ ] Model + - [ ] Views + - [ ] Portal + - [ ] Permissions + - [ ] Menus + - Teams + - [ ] Model + - [ ] Views + - [ ] Permissions + - [ ] Menus + - States + - [ ] Model + - [ ] Views + - [ ] Permissions + - [ ] Menus + - [ ] Data + - Categories + - [ ] Model + - [ ] Views + - [ ] Permissions + - [ ] Menus + - Channels + - [ ] Model + - [ ] Views + - [ ] Permissions + - [ ] Menus + - [ ] Data + - Tags + - [ ] Model + - [ ] Views + - [ ] Permissions + - [ ] Menus diff --git a/helpdesk_mgmt/__init__.py b/helpdesk_mgmt/__init__.py new file mode 100644 index 0000000000..9a7e03eded --- /dev/null +++ b/helpdesk_mgmt/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py new file mode 100644 index 0000000000..d7fc6bac4b --- /dev/null +++ b/helpdesk_mgmt/__manifest__.py @@ -0,0 +1,14 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Helpdesk', + 'summary': """ + Helpdesk""", + 'version': '11.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'Odoo Community Association (OCA), ACSONE SA/NV', + 'website': 'https://github.com/OCA/helpdesk', + 'depends': [], + 'data': [], + 'demo': [], +} diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py new file mode 100644 index 0000000000..386687ce6f --- /dev/null +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -0,0 +1,40 @@ +from odoo import models, fields, _ + + +class HelpdeskTicket(models.Model): + + _name = 'helpdesk.ticket' + _order = 'number desc' + _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin'] + + number = fields.Char(string='Ticket number', readonly=True) + name = fields.Char(string='Title', required=True) + description = fields.Text(required=True) + user_id = fields.Many2one('res.users', string='Assigned user', default=lambda self: self.env.user) + state = fields.Many2one('helpdesk.ticket.state', string='State') #TODO: default + partner_id = fields.Many2one('res.partner') + partner_name = fields.Char() + partner_email = fields.Char() + + last_state_update = fields.Datetime() + assigned_date = fields.Datetime() + closed_date = fields.Datetime() + + tag_ids = fields.Many2many('helpesk.ticket.tag') + company_id = fields.Many2one( + 'res.company', + string="Company", + default=lambda self: self.env['res.company']._company_default_get( + 'helpdesk.ticket') + ) + channel_id = fields.Many2one('helpdesk.ticket.channel', string='Channel') + category_id = fields.Many2one('helpdesk.ticket.category', string='Category') + team_id = fields.Many2one('helpdesk.ticket.team') + priority_id = fields.Selection(selection=[ + ('0', _('Low')), + ('1', _('Medium')), + ('2', _('High')), + ('3', _('Very High')), + ], string='Priority', default='medium') + attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=[('res_model', '=', 'website.support.ticket')], + string="Media Attachments") From d4fc46ae50c2d20a5c330380000a8eaa89a62ce5 Mon Sep 17 00:00:00 2001 From: oscars8a Date: Mon, 27 May 2019 16:07:58 +0200 Subject: [PATCH 002/337] [ADD]base model ticket_tag [FIX] description field --- helpdesk_mgmt/models/__init__.py | 2 ++ helpdesk_mgmt/models/helpdesk_ticket.py | 2 +- helpdesk_mgmt/models/helpdesk_ticket_tag.py | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 helpdesk_mgmt/models/__init__.py create mode 100644 helpdesk_mgmt/models/helpdesk_ticket_tag.py diff --git a/helpdesk_mgmt/models/__init__.py b/helpdesk_mgmt/models/__init__.py new file mode 100644 index 0000000000..25a50e9bbf --- /dev/null +++ b/helpdesk_mgmt/models/__init__.py @@ -0,0 +1,2 @@ +from . import helpdesk_ticket +from . import helpdesk_ticket_tag diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 386687ce6f..c2529ea0d3 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -20,7 +20,7 @@ class HelpdeskTicket(models.Model): assigned_date = fields.Datetime() closed_date = fields.Datetime() - tag_ids = fields.Many2many('helpesk.ticket.tag') + tag_ids = fields.Many2many('helpdesk.ticket.tag') company_id = fields.Many2one( 'res.company', string="Company", diff --git a/helpdesk_mgmt/models/helpdesk_ticket_tag.py b/helpdesk_mgmt/models/helpdesk_ticket_tag.py new file mode 100644 index 0000000000..b9ee09c4a5 --- /dev/null +++ b/helpdesk_mgmt/models/helpdesk_ticket_tag.py @@ -0,0 +1,9 @@ +from odoo import api, fields, models + + +class HelpdeskTicketTag(models.Model): + _name = 'helpdesk.ticket.tag' + _description = 'Helpdesk Ticket Tag' + + name = fields.Char(string='Name') + color = fields.Integer(string='Color Index') From 5e79ed921511e2b7a2f0693f96e69e341469b837 Mon Sep 17 00:00:00 2001 From: Catalin Date: Mon, 27 May 2019 17:01:56 +0200 Subject: [PATCH 003/337] chg: removed readme !minor --- helpdesk_mgmt/README.md | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 helpdesk_mgmt/README.md diff --git a/helpdesk_mgmt/README.md b/helpdesk_mgmt/README.md deleted file mode 100644 index fb01a2e0c3..0000000000 --- a/helpdesk_mgmt/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Odoo Helpdesk - - - Base module - - Tickets - - [ ] Model - - [ ] Views - - [ ] Portal - - [ ] Permissions - - [ ] Menus - - Teams - - [ ] Model - - [ ] Views - - [ ] Permissions - - [ ] Menus - - States - - [ ] Model - - [ ] Views - - [ ] Permissions - - [ ] Menus - - [ ] Data - - Categories - - [ ] Model - - [ ] Views - - [ ] Permissions - - [ ] Menus - - Channels - - [ ] Model - - [ ] Views - - [ ] Permissions - - [ ] Menus - - [ ] Data - - Tags - - [ ] Model - - [ ] Views - - [ ] Permissions - - [ ] Menus From 55aebc2793556217f67e9f7c63dc8f18d31abddd Mon Sep 17 00:00:00 2001 From: JorgeQuinteros Date: Mon, 27 May 2019 16:48:03 +0200 Subject: [PATCH 004/337] [IMP] helpdesk: Several things: * models category and team related with users * many2many field team to categories * description in team and category --- helpdesk_mgmt/__manifest__.py | 4 +- helpdesk_mgmt/models/__init__.py | 2 + helpdesk_mgmt/models/helpdesk_category.py | 11 +++++ helpdesk_mgmt/models/helpdesk_team.py | 13 ++++++ helpdesk_mgmt/views/helpdesk_team_views.xml | 45 +++++++++++++++++++++ 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 helpdesk_mgmt/models/helpdesk_category.py create mode 100644 helpdesk_mgmt/models/helpdesk_team.py create mode 100644 helpdesk_mgmt/views/helpdesk_team_views.xml diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index d7fc6bac4b..ee7ad6630a 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -9,6 +9,8 @@ 'author': 'Odoo Community Association (OCA), ACSONE SA/NV', 'website': 'https://github.com/OCA/helpdesk', 'depends': [], - 'data': [], + 'data': [ + 'views/heldesk_team_views.xml' + ], 'demo': [], } diff --git a/helpdesk_mgmt/models/__init__.py b/helpdesk_mgmt/models/__init__.py index 25a50e9bbf..566d77cb06 100644 --- a/helpdesk_mgmt/models/__init__.py +++ b/helpdesk_mgmt/models/__init__.py @@ -1,2 +1,4 @@ from . import helpdesk_ticket from . import helpdesk_ticket_tag +from . import helpdesk_category +from . import helpdesk_team diff --git a/helpdesk_mgmt/models/helpdesk_category.py b/helpdesk_mgmt/models/helpdesk_category.py new file mode 100644 index 0000000000..8e856a68c7 --- /dev/null +++ b/helpdesk_mgmt/models/helpdesk_category.py @@ -0,0 +1,11 @@ +from odoo import api, fields, models + +class HelpdeskCategory(models.Model): + + _name = 'helpdesk.ticket.category' + _description = 'Helpdesk Ticket Category' + + active = fields.Boolean(string='Active') + name = fields.Char(string='Name', required=True) + + diff --git a/helpdesk_mgmt/models/helpdesk_team.py b/helpdesk_mgmt/models/helpdesk_team.py new file mode 100644 index 0000000000..76394c798a --- /dev/null +++ b/helpdesk_mgmt/models/helpdesk_team.py @@ -0,0 +1,13 @@ +from odoo import api, fields, models + + +class HelpdeskTeam(models.Model): + + _name = 'helpdesk.ticket.team' + _description = 'Helpdesk Ticket Team' + + name = fields.Char(string='Name', required=True) + user_ids = fields.Many2many(comodel_name='res.users', string='Members') + category_ids = fields.Many2many(comodel_name='helpdesk.ticket.category', string='Category') + + diff --git a/helpdesk_mgmt/views/helpdesk_team_views.xml b/helpdesk_mgmt/views/helpdesk_team_views.xml new file mode 100644 index 0000000000..ff32d054d2 --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_team_views.xml @@ -0,0 +1,45 @@ + + + + view.helpdesk_team.form + helpdesk.ticket.team + +
+ + + + + +
+
+
+ + + view.helpdesk_team.tree + helpdesk.team + + + + + + + + helpdesk.team.kanban + helpdesk.team + + + + + + +
+

+ +

+
+
+
+
+
+
+
From a611d56a07b1dc6a200fce3fe0a2a619e77263e4 Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Mon, 27 May 2019 18:01:17 +0200 Subject: [PATCH 005/337] [ADD] helpdesk.ticket.channel model (#13) --- helpdesk_mgmt/README.rst | 0 helpdesk_mgmt/models/__init__.py | 1 + helpdesk_mgmt/models/helpdesk_ticket.py | 1 + helpdesk_mgmt/models/helpdesk_ticket_channel.py | 10 ++++++++++ 4 files changed, 12 insertions(+) create mode 100644 helpdesk_mgmt/README.rst create mode 100644 helpdesk_mgmt/models/helpdesk_ticket_channel.py diff --git a/helpdesk_mgmt/README.rst b/helpdesk_mgmt/README.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helpdesk_mgmt/models/__init__.py b/helpdesk_mgmt/models/__init__.py index 566d77cb06..cc5973fc31 100644 --- a/helpdesk_mgmt/models/__init__.py +++ b/helpdesk_mgmt/models/__init__.py @@ -1,4 +1,5 @@ from . import helpdesk_ticket from . import helpdesk_ticket_tag +from . import helpdesk_ticket_channel from . import helpdesk_category from . import helpdesk_team diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index c2529ea0d3..5089928c73 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -38,3 +38,4 @@ class HelpdeskTicket(models.Model): ], string='Priority', default='medium') attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=[('res_model', '=', 'website.support.ticket')], string="Media Attachments") + diff --git a/helpdesk_mgmt/models/helpdesk_ticket_channel.py b/helpdesk_mgmt/models/helpdesk_ticket_channel.py new file mode 100644 index 0000000000..6ae794b744 --- /dev/null +++ b/helpdesk_mgmt/models/helpdesk_ticket_channel.py @@ -0,0 +1,10 @@ +from odoo import models, fields, _ + + +class HelpdeskTicketChannel(models.Model): + + _name = 'helpdesk.ticket.channel' + _description = 'Helpdesk Ticket Channel' + + name = fields.Char(required=True) + active = fields.Boolean() From 1af3f2458e5066e29d0c460368c3134a5c78138a Mon Sep 17 00:00:00 2001 From: carlosDomatix Date: Mon, 27 May 2019 18:15:37 +0200 Subject: [PATCH 006/337] [ADD] Stage model and data (#16) --- helpdesk_mgmt/__manifest__.py | 3 +- helpdesk_mgmt/data/helpdesk_data.xml | 39 +++++++++++++++++++ helpdesk_mgmt/models/__init__.py | 1 + helpdesk_mgmt/models/helpdesk_category.py | 5 +-- helpdesk_mgmt/models/helpdesk_team.py | 8 ++-- helpdesk_mgmt/models/helpdesk_ticket.py | 26 +++++++++---- helpdesk_mgmt/models/helpdesk_ticket_stage.py | 27 +++++++++++++ helpdesk_mgmt/models/helpdesk_ticket_tag.py | 2 +- 8 files changed, 95 insertions(+), 16 deletions(-) create mode 100644 helpdesk_mgmt/data/helpdesk_data.xml create mode 100644 helpdesk_mgmt/models/helpdesk_ticket_stage.py diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index ee7ad6630a..231a9d48a1 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -6,10 +6,11 @@ Helpdesk""", 'version': '11.0.1.0.0', 'license': 'AGPL-3', - 'author': 'Odoo Community Association (OCA), ACSONE SA/NV', + 'author': 'Odoo Community Association (OCA), ACSONE SA/NV, Domatix', 'website': 'https://github.com/OCA/helpdesk', 'depends': [], 'data': [ + 'data/helpdesk_data.xml', 'views/heldesk_team_views.xml' ], 'demo': [], diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml new file mode 100644 index 0000000000..e2c29b8aec --- /dev/null +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -0,0 +1,39 @@ + + + + + 1 + New + True + False + + + + 2 + In Progress + False + False + + + + 3 + Awaiting + False + False + + + + 3 + Done + False + True + + + + 4 + Cancel + False + True + + + diff --git a/helpdesk_mgmt/models/__init__.py b/helpdesk_mgmt/models/__init__.py index cc5973fc31..0e0e3142ef 100644 --- a/helpdesk_mgmt/models/__init__.py +++ b/helpdesk_mgmt/models/__init__.py @@ -1,4 +1,5 @@ from . import helpdesk_ticket +from . import helpdesk_ticket_stage from . import helpdesk_ticket_tag from . import helpdesk_ticket_channel from . import helpdesk_category diff --git a/helpdesk_mgmt/models/helpdesk_category.py b/helpdesk_mgmt/models/helpdesk_category.py index 8e856a68c7..754174ae27 100644 --- a/helpdesk_mgmt/models/helpdesk_category.py +++ b/helpdesk_mgmt/models/helpdesk_category.py @@ -1,4 +1,5 @@ -from odoo import api, fields, models +from odoo import fields, models + class HelpdeskCategory(models.Model): @@ -7,5 +8,3 @@ class HelpdeskCategory(models.Model): active = fields.Boolean(string='Active') name = fields.Char(string='Name', required=True) - - diff --git a/helpdesk_mgmt/models/helpdesk_team.py b/helpdesk_mgmt/models/helpdesk_team.py index 76394c798a..fad2541abf 100644 --- a/helpdesk_mgmt/models/helpdesk_team.py +++ b/helpdesk_mgmt/models/helpdesk_team.py @@ -1,4 +1,4 @@ -from odoo import api, fields, models +from odoo import fields, models class HelpdeskTeam(models.Model): @@ -8,6 +8,6 @@ class HelpdeskTeam(models.Model): name = fields.Char(string='Name', required=True) user_ids = fields.Many2many(comodel_name='res.users', string='Members') - category_ids = fields.Many2many(comodel_name='helpdesk.ticket.category', string='Category') - - + category_ids = fields.Many2many( + comodel_name='helpdesk.ticket.category', + string='Category') diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 5089928c73..da52dff53e 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -7,11 +7,20 @@ class HelpdeskTicket(models.Model): _order = 'number desc' _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin'] + def _get_default_stage_id(self): + return self.env['helpdesk.ticket.stage'].search([], limit=1).id + number = fields.Char(string='Ticket number', readonly=True) name = fields.Char(string='Title', required=True) description = fields.Text(required=True) - user_id = fields.Many2one('res.users', string='Assigned user', default=lambda self: self.env.user) - state = fields.Many2one('helpdesk.ticket.state', string='State') #TODO: default + user_id = fields.Many2one( + 'res.users', + string='Assigned user', + default=lambda self: self.env.user) + stage_id = fields.Many2one( + 'helpdesk.ticket.stage', + string='State', + default=_get_default_stage_id) partner_id = fields.Many2one('res.partner') partner_name = fields.Char() partner_email = fields.Char() @@ -27,8 +36,10 @@ class HelpdeskTicket(models.Model): default=lambda self: self.env['res.company']._company_default_get( 'helpdesk.ticket') ) - channel_id = fields.Many2one('helpdesk.ticket.channel', string='Channel') - category_id = fields.Many2one('helpdesk.ticket.category', string='Category') + channel_id = fields.Many2one('helpdesk.ticket.channel', + string='Channel') + category_id = fields.Many2one('helpdesk.ticket.category', + string='Category') team_id = fields.Many2one('helpdesk.ticket.team') priority_id = fields.Selection(selection=[ ('0', _('Low')), @@ -36,6 +47,7 @@ class HelpdeskTicket(models.Model): ('2', _('High')), ('3', _('Very High')), ], string='Priority', default='medium') - attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=[('res_model', '=', 'website.support.ticket')], - string="Media Attachments") - + attachment_ids = fields.One2many( + 'ir.attachment', 'res_id', + domain=[('res_model', '=', 'website.support.ticket')], + string="Media Attachments") diff --git a/helpdesk_mgmt/models/helpdesk_ticket_stage.py b/helpdesk_mgmt/models/helpdesk_ticket_stage.py new file mode 100644 index 0000000000..c5a6db5127 --- /dev/null +++ b/helpdesk_mgmt/models/helpdesk_ticket_stage.py @@ -0,0 +1,27 @@ +from odoo import fields, models + + +class HelpdeskTicketStage(models.Model): + _name = 'helpdesk.ticket.stage' + _description = 'Helpdesk Ticket Stage' + _order = 'sequence, id' + + name = fields.Char(string='Stage Name', required=True, translate=True) + description = fields.Text(translate=True) + sequence = fields.Integer(default=1) + unattended = fields.Boolean( + string='Unattended') + closed = fields.Boolean( + string='Closed') + mail_template_id = fields.Many2one( + 'mail.template', + string='Email Template', + domain=[('model', '=', 'helpdesk.ticket')], + help="If set an email will be sent to the " + "customer when the ticket" + "reaches this step.") + fold = fields.Boolean( + string='Folded in Kanban', + help="This stage is folded in the kanban view " + "when there are no records in that stage " + "to display.") diff --git a/helpdesk_mgmt/models/helpdesk_ticket_tag.py b/helpdesk_mgmt/models/helpdesk_ticket_tag.py index b9ee09c4a5..813182e57b 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_tag.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_tag.py @@ -1,4 +1,4 @@ -from odoo import api, fields, models +from odoo import fields, models class HelpdeskTicketTag(models.Model): From 2f7373b61b6a751534f794ab935153f1da0ed13d Mon Sep 17 00:00:00 2001 From: Eduardo Magdalena Date: Mon, 27 May 2019 20:08:39 +0200 Subject: [PATCH 007/337] [ADD] Readme (#18) * [ADD] Readme * Generate readme with OCA Maintainer Tools [FIX] 'heldesk' in __manifest__.py * [ADD] Stage model and data (#16) * [FIX] Flake8 and naming conventions [FIX] Remove ACSONE [FIX] Build error with portal.mixing. This will be added in a second module * [FIX] Fix travis errors * Category in manifest --- helpdesk_mgmt/README.rst | 77 +++ helpdesk_mgmt/__manifest__.py | 14 +- helpdesk_mgmt/models/__init__.py | 4 +- helpdesk_mgmt/models/helpdesk_ticket.py | 5 +- ...ategory.py => helpdesk_ticket_category.py} | 0 .../models/helpdesk_ticket_channel.py | 2 +- ...lpdesk_team.py => helpdesk_ticket_team.py} | 0 helpdesk_mgmt/readme/CONTRIBUTORS.rst | 16 + helpdesk_mgmt/readme/DESCRIPTION.rst | 1 + helpdesk_mgmt/readme/USAGE.rst | 1 + helpdesk_mgmt/static/description/index.html | 437 ++++++++++++++++++ helpdesk_mgmt/views/helpdesk_team_views.xml | 4 +- 12 files changed, 552 insertions(+), 9 deletions(-) rename helpdesk_mgmt/models/{helpdesk_category.py => helpdesk_ticket_category.py} (100%) rename helpdesk_mgmt/models/{helpdesk_team.py => helpdesk_ticket_team.py} (100%) create mode 100644 helpdesk_mgmt/readme/CONTRIBUTORS.rst create mode 100644 helpdesk_mgmt/readme/DESCRIPTION.rst create mode 100644 helpdesk_mgmt/readme/USAGE.rst create mode 100644 helpdesk_mgmt/static/description/index.html diff --git a/helpdesk_mgmt/README.rst b/helpdesk_mgmt/README.rst index e69de29bb2..eb2b341509 100644 --- a/helpdesk_mgmt/README.rst +++ b/helpdesk_mgmt/README.rst @@ -0,0 +1,77 @@ +======== +Helpdesk +======== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-aitorbouzas%2Fhelpdesk-lightgray.png?logo=github + :target: https://github.com/aitorbouzas/helpdesk/tree/11.0/helpdesk + :alt: aitorbouzas/helpdesk + +|badge1| |badge2| |badge3| + +This module adds Helpdesk functionality in Odoo. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +* Go to... + +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 +~~~~~~~ + +* ACSONE SA/NV + +Contributors +~~~~~~~~~~~~ + +* `Domatix `_: + + * Carlos Mart??nez + +* `Adaptive City `_: + + * Aitor Bouzas + +* `SDi Soluciones, S.L. `_: + + * Oscar Soto + * Jorge Luis Quinteros + +* `C2i Change 2 improve `_: + + * Eduardo Magdalena + +Maintainers +~~~~~~~~~~~ + +This module is part of the `aitorbouzas/helpdesk `_ project on GitHub. + +You are welcome to contribute. diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index 231a9d48a1..a8eeb9d447 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -6,12 +6,20 @@ Helpdesk""", 'version': '11.0.1.0.0', 'license': 'AGPL-3', - 'author': 'Odoo Community Association (OCA), ACSONE SA/NV, Domatix', + 'category': 'After-Sales', + 'author': 'AdaptiveCity, ' + 'C2i Change 2 Improve, ' + 'Domatix, ' + 'Factor Libre, ' + 'SDi Soluciones, ' + 'Odoo Community Association (OCA)', 'website': 'https://github.com/OCA/helpdesk', - 'depends': [], + 'depends': [ + 'mail', + ], 'data': [ 'data/helpdesk_data.xml', - 'views/heldesk_team_views.xml' + 'views/helpdesk_team_views.xml' ], 'demo': [], } diff --git a/helpdesk_mgmt/models/__init__.py b/helpdesk_mgmt/models/__init__.py index 0e0e3142ef..3764bd4d69 100644 --- a/helpdesk_mgmt/models/__init__.py +++ b/helpdesk_mgmt/models/__init__.py @@ -2,5 +2,5 @@ from . import helpdesk_ticket_stage from . import helpdesk_ticket_tag from . import helpdesk_ticket_channel -from . import helpdesk_category -from . import helpdesk_team +from . import helpdesk_ticket_category +from . import helpdesk_ticket_team diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index da52dff53e..ac19a6b4c4 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -5,7 +5,10 @@ class HelpdeskTicket(models.Model): _name = 'helpdesk.ticket' _order = 'number desc' - _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin'] + _inherit = ['mail.thread', 'mail.activity.mixin'] + + def _get_default_stage_id(self): + return self.env['helpdesk.ticket.stage'].search([], limit=1).id def _get_default_stage_id(self): return self.env['helpdesk.ticket.stage'].search([], limit=1).id diff --git a/helpdesk_mgmt/models/helpdesk_category.py b/helpdesk_mgmt/models/helpdesk_ticket_category.py similarity index 100% rename from helpdesk_mgmt/models/helpdesk_category.py rename to helpdesk_mgmt/models/helpdesk_ticket_category.py diff --git a/helpdesk_mgmt/models/helpdesk_ticket_channel.py b/helpdesk_mgmt/models/helpdesk_ticket_channel.py index 6ae794b744..ed997bcc9a 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_channel.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_channel.py @@ -1,4 +1,4 @@ -from odoo import models, fields, _ +from odoo import models, fields class HelpdeskTicketChannel(models.Model): diff --git a/helpdesk_mgmt/models/helpdesk_team.py b/helpdesk_mgmt/models/helpdesk_ticket_team.py similarity index 100% rename from helpdesk_mgmt/models/helpdesk_team.py rename to helpdesk_mgmt/models/helpdesk_ticket_team.py diff --git a/helpdesk_mgmt/readme/CONTRIBUTORS.rst b/helpdesk_mgmt/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..e17e7e0456 --- /dev/null +++ b/helpdesk_mgmt/readme/CONTRIBUTORS.rst @@ -0,0 +1,16 @@ +* `Domatix `_: + + * Carlos Mart??nez + +* `Adaptive City `_: + + * Aitor Bouzas + +* `SDi Soluciones, S.L. `_: + + * Oscar Soto + * Jorge Luis Quinteros + +* `C2i Change 2 improve `_: + + * Eduardo Magdalena diff --git a/helpdesk_mgmt/readme/DESCRIPTION.rst b/helpdesk_mgmt/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..f613d002ce --- /dev/null +++ b/helpdesk_mgmt/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds Helpdesk functionality in Odoo. diff --git a/helpdesk_mgmt/readme/USAGE.rst b/helpdesk_mgmt/readme/USAGE.rst new file mode 100644 index 0000000000..66559af396 --- /dev/null +++ b/helpdesk_mgmt/readme/USAGE.rst @@ -0,0 +1 @@ +* Go to... diff --git a/helpdesk_mgmt/static/description/index.html b/helpdesk_mgmt/static/description/index.html new file mode 100644 index 0000000000..36885076be --- /dev/null +++ b/helpdesk_mgmt/static/description/index.html @@ -0,0 +1,437 @@ + + + + + + +Helpdesk + + + +
+

Helpdesk

+ + +

Beta License: AGPL-3 aitorbouzas/helpdesk

+

This module adds Helpdesk functionality in Odoo.

+

Table of contents

+ +
+

Usage

+
    +
  • Go to???
  • +
+
+
+

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

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

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

+

You are welcome to contribute.

+
+
+
+ + diff --git a/helpdesk_mgmt/views/helpdesk_team_views.xml b/helpdesk_mgmt/views/helpdesk_team_views.xml index ff32d054d2..894ded0cc2 100644 --- a/helpdesk_mgmt/views/helpdesk_team_views.xml +++ b/helpdesk_mgmt/views/helpdesk_team_views.xml @@ -16,7 +16,7 @@ view.helpdesk_team.tree - helpdesk.team + helpdesk.ticket.team @@ -25,7 +25,7 @@ helpdesk.team.kanban - helpdesk.team + helpdesk.ticket.team From b01faf06b0ab89b0545d09c360563876ca58ed04 Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Tue, 28 May 2019 08:51:30 +0200 Subject: [PATCH 008/337] [ADD] Security and multicompany * Added group category in data * Added groups * Added rules * Added model access --- helpdesk_mgmt/__init__.py | 2 +- helpdesk_mgmt/__manifest__.py | 5 +- helpdesk_mgmt/data/helpdesk_data.xml | 73 +++++++++------- helpdesk_mgmt/models/helpdesk_ticket.py | 3 - .../models/helpdesk_ticket_category.py | 6 ++ .../models/helpdesk_ticket_channel.py | 6 ++ helpdesk_mgmt/models/helpdesk_ticket_stage.py | 6 ++ helpdesk_mgmt/models/helpdesk_ticket_tag.py | 6 ++ helpdesk_mgmt/models/helpdesk_ticket_team.py | 6 ++ helpdesk_mgmt/security/helpdesk_security.xml | 86 +++++++++++++++++++ helpdesk_mgmt/security/ir.model.access.csv | 15 ++++ 11 files changed, 177 insertions(+), 37 deletions(-) create mode 100644 helpdesk_mgmt/security/helpdesk_security.xml create mode 100644 helpdesk_mgmt/security/ir.model.access.csv diff --git a/helpdesk_mgmt/__init__.py b/helpdesk_mgmt/__init__.py index 9a7e03eded..0650744f6b 100644 --- a/helpdesk_mgmt/__init__.py +++ b/helpdesk_mgmt/__init__.py @@ -1 +1 @@ -from . import models \ No newline at end of file +from . import models diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index a8eeb9d447..b7cddae33b 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -16,10 +16,13 @@ 'website': 'https://github.com/OCA/helpdesk', 'depends': [ 'mail', + 'portal', ], 'data': [ 'data/helpdesk_data.xml', - 'views/helpdesk_team_views.xml' + 'views/helpdesk_team_views.xml', + 'security/helpdesk_security.xml', + 'security/ir.model.access.csv', ], 'demo': [], } diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml index e2c29b8aec..88845b1d6c 100644 --- a/helpdesk_mgmt/data/helpdesk_data.xml +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -1,39 +1,48 @@ - - - 1 - New - True - False - - - 2 - In Progress - False - False - + + + Helpdesk + Helps you handle your helpdesk security. + 9 + + - - 3 - Awaiting - False - False - + + + 1 + New + True + False + - - 3 - Done - False - True - + + 2 + In Progress + False + False + - - 4 - Cancel - False - True - - + + 3 + Awaiting + False + False + + + + 3 + Done + False + True + + + + 4 + Cancel + False + True + + diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index ac19a6b4c4..4d3ef0d310 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -7,9 +7,6 @@ class HelpdeskTicket(models.Model): _order = 'number desc' _inherit = ['mail.thread', 'mail.activity.mixin'] - def _get_default_stage_id(self): - return self.env['helpdesk.ticket.stage'].search([], limit=1).id - def _get_default_stage_id(self): return self.env['helpdesk.ticket.stage'].search([], limit=1).id diff --git a/helpdesk_mgmt/models/helpdesk_ticket_category.py b/helpdesk_mgmt/models/helpdesk_ticket_category.py index 754174ae27..21a67cf476 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_category.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_category.py @@ -8,3 +8,9 @@ class HelpdeskCategory(models.Model): active = fields.Boolean(string='Active') name = fields.Char(string='Name', required=True) + company_id = fields.Many2one( + 'res.company', + string="Company", + default=lambda self: self.env['res.company']._company_default_get( + 'helpdesk.ticket') + ) diff --git a/helpdesk_mgmt/models/helpdesk_ticket_channel.py b/helpdesk_mgmt/models/helpdesk_ticket_channel.py index ed997bcc9a..c44b98ca8d 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_channel.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_channel.py @@ -8,3 +8,9 @@ class HelpdeskTicketChannel(models.Model): name = fields.Char(required=True) active = fields.Boolean() + company_id = fields.Many2one( + 'res.company', + string="Company", + default=lambda self: self.env['res.company']._company_default_get( + 'helpdesk.ticket') + ) diff --git a/helpdesk_mgmt/models/helpdesk_ticket_stage.py b/helpdesk_mgmt/models/helpdesk_ticket_stage.py index c5a6db5127..a390ff9e58 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_stage.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_stage.py @@ -25,3 +25,9 @@ class HelpdeskTicketStage(models.Model): help="This stage is folded in the kanban view " "when there are no records in that stage " "to display.") + company_id = fields.Many2one( + 'res.company', + string="Company", + default=lambda self: self.env['res.company']._company_default_get( + 'helpdesk.ticket') + ) diff --git a/helpdesk_mgmt/models/helpdesk_ticket_tag.py b/helpdesk_mgmt/models/helpdesk_ticket_tag.py index 813182e57b..cfa2aa42f5 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_tag.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_tag.py @@ -7,3 +7,9 @@ class HelpdeskTicketTag(models.Model): name = fields.Char(string='Name') color = fields.Integer(string='Color Index') + company_id = fields.Many2one( + 'res.company', + string="Company", + default=lambda self: self.env['res.company']._company_default_get( + 'helpdesk.ticket') + ) diff --git a/helpdesk_mgmt/models/helpdesk_ticket_team.py b/helpdesk_mgmt/models/helpdesk_ticket_team.py index fad2541abf..18f533fd64 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_team.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_team.py @@ -11,3 +11,9 @@ class HelpdeskTeam(models.Model): category_ids = fields.Many2many( comodel_name='helpdesk.ticket.category', string='Category') + company_id = fields.Many2one( + 'res.company', + string="Company", + default=lambda self: self.env['res.company']._company_default_get( + 'helpdesk.ticket') + ) diff --git a/helpdesk_mgmt/security/helpdesk_security.xml b/helpdesk_mgmt/security/helpdesk_security.xml new file mode 100644 index 0000000000..03560b7baa --- /dev/null +++ b/helpdesk_mgmt/security/helpdesk_security.xml @@ -0,0 +1,86 @@ + + + + + + User: Personal tickets + + + + + + User + + + + + + Helpdesk Manager + + + + + + + + + + + Personal Tickets + + ['|',('user_id','=',user.id),('user_id','=',False)] + + + + + + Helpdesk Ticket Company Rule + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + Helpdesk Category Company Rule + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + Helpdesk Channel Company Rule + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + Helpdesk Stage Company Rule + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + Helpdesk Tag Company Rule + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + Helpdesk Team Company Rule + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + + Portal Personal Tickets + + [('message_partner_ids','child_of',[user.commercial_partner_id.id])] + + + + diff --git a/helpdesk_mgmt/security/ir.model.access.csv b/helpdesk_mgmt/security/ir.model.access.csv new file mode 100644 index 0000000000..435eb8c840 --- /dev/null +++ b/helpdesk_mgmt/security/ir.model.access.csv @@ -0,0 +1,15 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_helpdesk_ticket_manager,helpdesk.ticket.manager,helpdesk.model_helpdesk_ticket,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_user,helpdesk.ticket.user,helpdesk.model_helpdesk_ticket,group_helpdesk_user,1,1,1,0 +access_helpdesk_ticket_user_personal,helpdesk.ticket.user.personal,helpdesk.model_helpdesk_ticket,group_helpdesk_user_own,1,1,1,0 +access_helpdesk_ticket_portal,helpdesk.ticket.portal,helpdesk.model_helpdesk_ticket,base.group_portal,1,0,0,0 +access_helpdesk_ticket_stage_manager,helpdesk.ticket.stage.manager,helpdesk.model_helpdesk_ticket_stage,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_stage_user,helpdesk.ticket.stage.user,helpdesk.model_helpdesk_ticket_stage,base.group_user,1,0,0,0 +access_helpdesk_ticket_tag_manager,helpdesk.ticket.tag.manager,helpdesk.model_helpdesk_ticket_tag,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_tag_user,helpdesk.ticket.tag.user,helpdesk.model_helpdesk_ticket_tag,base.group_user,1,0,0,0 +access_helpdesk_ticket_team_manager,helpdesk.ticket.team.manager,helpdesk.model_helpdesk_ticket_team,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_team_user,helpdesk.ticket.team.user,helpdesk.model_helpdesk_ticket_team,base.group_user,1,0,0,0 +access_helpdesk_ticket_channel_manager,helpdesk.ticket.channel.manager,helpdesk.model_helpdesk_ticket_channel,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_channel_user,helpdesk.ticket.channel.user,helpdesk.model_helpdesk_ticket_channel,base.group_user,1,0,0,0 +access_helpdesk_ticket_category_manager,helpdesk.ticket.category.manager,helpdesk.model_helpdesk_ticket_category,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_category_user,helpdesk.ticket.category.user,helpdesk.model_helpdesk_ticket_category,base.group_user,1,0,0,0 From c3df68167c7ef6e94a9cf3d12ce097f40e206286 Mon Sep 17 00:00:00 2001 From: Eduardo Magdalena Date: Tue, 28 May 2019 09:21:02 +0200 Subject: [PATCH 009/337] [IMP] helpdesk: Icon + application --- helpdesk_mgmt/__manifest__.py | 2 ++ helpdesk_mgmt/static/description/icon.png | Bin 0 -> 21275 bytes 2 files changed, 2 insertions(+) create mode 100644 helpdesk_mgmt/static/description/icon.png diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index b7cddae33b..86b2345cba 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -25,4 +25,6 @@ 'security/ir.model.access.csv', ], 'demo': [], + 'application': True, + 'installable': True, } diff --git a/helpdesk_mgmt/static/description/icon.png b/helpdesk_mgmt/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..98ded4afcf0451e9227977fee6411ee6da2d9cb2 GIT binary patch literal 21275 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 WC<2;cqCl$v0000 Date: Tue, 28 May 2019 09:51:00 +0200 Subject: [PATCH 010/337] [FIX] Edit manifest authors [ADD] Create structure menu --- helpdesk_mgmt/__manifest__.py | 1 + helpdesk_mgmt/views/helpdesk_ticket_menu.xml | 117 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_menu.xml diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index 86b2345cba..cc3c206640 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -21,6 +21,7 @@ 'data': [ 'data/helpdesk_data.xml', 'views/helpdesk_team_views.xml', + 'views/helpdesk_ticket_menu.xml', 'security/helpdesk_security.xml', 'security/ir.model.access.csv', ], diff --git a/helpdesk_mgmt/views/helpdesk_ticket_menu.xml b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml new file mode 100644 index 0000000000..2c824d9dc2 --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml @@ -0,0 +1,117 @@ + + + + + + Dashboard + ir.actions.act_window + helpdesk.ticket.team + kanban,tree,form + form + + + + Tickets + ir.actions.act_window + helpdesk.ticket + tree,form,kanban + form + + + + Reporting + ir.actions.act_window + helpdesk.ticket + pivot,graph + form + + + + + + + + + + + + + + + + + + + Channels + ir.actions.act_window + helpdesk.ticket.channel + tree,form + form + + + + Categories + ir.actions.act_window + helpdesk.ticket.category + tree,form + form + + + + Teams + ir.actions.act_window + helpdesk.ticket.team + tree,form + form + + + + Stages + ir.actions.act_window + helpdesk.ticket.stage + tree,form + form + + + + Ticket Tags + ir.actions.act_window + helpdesk.ticket.tag + tree,form + form + + + + + + + + + + + + + + + + + From 348b80e7e02a0cdb559bd64e731dabd10eb54c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Cruz?= Date: Tue, 28 May 2019 13:51:37 +0200 Subject: [PATCH 011/337] Ticket#19 - Active field - Automatic number with sequence --- helpdesk_mgmt/__manifest__.py | 3 ++- .../data/reservation_initial_sequence.xml | 15 +++++++++++++++ helpdesk_mgmt/models/helpdesk_ticket.py | 14 ++++++++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 helpdesk_mgmt/data/reservation_initial_sequence.xml diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index cc3c206640..e1308d099e 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -22,8 +22,9 @@ 'data/helpdesk_data.xml', 'views/helpdesk_team_views.xml', 'views/helpdesk_ticket_menu.xml', + 'data/helpdesk_ticket_sequence.xml', 'security/helpdesk_security.xml', - 'security/ir.model.access.csv', + 'security/ir.model.access.csv' ], 'demo': [], 'application': True, diff --git a/helpdesk_mgmt/data/reservation_initial_sequence.xml b/helpdesk_mgmt/data/reservation_initial_sequence.xml new file mode 100644 index 0000000000..f0e93e438b --- /dev/null +++ b/helpdesk_mgmt/data/reservation_initial_sequence.xml @@ -0,0 +1,15 @@ + + + + + + + Helpdesk Ticket Sequence + helpdesk.ticket.sequence + TK + 5 + + + + diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 4d3ef0d310..ee5ef5881d 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -1,9 +1,10 @@ -from odoo import models, fields, _ +from odoo import models, fields, api, _ class HelpdeskTicket(models.Model): _name = 'helpdesk.ticket' + _rec_name = 'helpdesk_sequence' _order = 'number desc' _inherit = ['mail.thread', 'mail.activity.mixin'] @@ -46,8 +47,17 @@ def _get_default_stage_id(self): ('1', _('Medium')), ('2', _('High')), ('3', _('Very High')), - ], string='Priority', default='medium') + ], string='Priority', default='1') attachment_ids = fields.One2many( 'ir.attachment', 'res_id', domain=[('res_model', '=', 'website.support.ticket')], string="Media Attachments") + helpdesk_sequence = fields.Char("Reservation reference", default="/") + active = fields.Boolean(default='True') + + @api.model + def create(self, vals): + if vals.get('helpdesk_sequence', '/') == '/': + vals['helpdesk_sequence'] = self.env[ + 'ir.sequence'].next_by_code('helpdesk.ticket.sequence') or '/' + return super(HelpdeskTicket, self).create(vals) From 6b3e71a07c0640e22d83b295dfd77ec157f845df Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Tue, 28 May 2019 10:51:03 +0200 Subject: [PATCH 012/337] [FIX+IMP] helpdesk: 6 things * Fix menu security * Channel data * Add 4 channels (web, email. phone and other) * Add some help for channel in ticket field * Active fields in required models * Fold value in stage data * Demo data * Add views --- helpdesk_mgmt/__manifest__.py | 11 +- helpdesk_mgmt/data/helpdesk_data.xml | 22 +++ helpdesk_mgmt/demo/helpdesk_demo.xml | 158 +++++++++++++++++ helpdesk_mgmt/models/helpdesk_ticket.py | 10 +- .../models/helpdesk_ticket_category.py | 2 +- .../models/helpdesk_ticket_channel.py | 2 +- helpdesk_mgmt/models/helpdesk_ticket_stage.py | 1 + helpdesk_mgmt/models/helpdesk_ticket_tag.py | 1 + helpdesk_mgmt/models/helpdesk_ticket_team.py | 1 + helpdesk_mgmt/views/helpdesk_ticket_menu.xml | 60 ++++--- helpdesk_mgmt/views/helpdesk_ticket_view.xml | 166 ++++++++++++++++++ 11 files changed, 397 insertions(+), 37 deletions(-) create mode 100644 helpdesk_mgmt/demo/helpdesk_demo.xml create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_view.xml diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index e1308d099e..c4b4c5fcb9 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -20,13 +20,16 @@ ], 'data': [ 'data/helpdesk_data.xml', + 'security/helpdesk_security.xml', + 'security/ir.model.access.csv', + 'data/helpdesk_ticket_sequence.xml', 'views/helpdesk_team_views.xml', 'views/helpdesk_ticket_menu.xml', - 'data/helpdesk_ticket_sequence.xml', - 'security/helpdesk_security.xml', - 'security/ir.model.access.csv' + 'views/helpdesk_ticket_view.xml', + ], + 'demo': [ + 'demo/helpdesk_demo.xml', ], - 'demo': [], 'application': True, 'installable': True, } diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml index 88845b1d6c..d367543897 100644 --- a/helpdesk_mgmt/data/helpdesk_data.xml +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -10,6 +10,8 @@ + + 1 New @@ -36,6 +38,7 @@ Done False True + True @@ -43,6 +46,25 @@ Cancel False True + True + + + + + Web + + + + Email + + + Phone + + + + Other + + diff --git a/helpdesk_mgmt/demo/helpdesk_demo.xml b/helpdesk_mgmt/demo/helpdesk_demo.xml new file mode 100644 index 0000000000..a36b90ea14 --- /dev/null +++ b/helpdesk_mgmt/demo/helpdesk_demo.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index ee5ef5881d..b6c71b5234 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -37,12 +37,16 @@ def _get_default_stage_id(self): default=lambda self: self.env['res.company']._company_default_get( 'helpdesk.ticket') ) - channel_id = fields.Many2one('helpdesk.ticket.channel', - string='Channel') + channel_id = fields.Many2one( + 'helpdesk.ticket.channel', + string='Channel', + help='Channel indicates where the source of a ticket' + 'comes from (it could be a phone call, an email...)', + ) category_id = fields.Many2one('helpdesk.ticket.category', string='Category') team_id = fields.Many2one('helpdesk.ticket.team') - priority_id = fields.Selection(selection=[ + priority = fields.Selection(selection=[ ('0', _('Low')), ('1', _('Medium')), ('2', _('High')), diff --git a/helpdesk_mgmt/models/helpdesk_ticket_category.py b/helpdesk_mgmt/models/helpdesk_ticket_category.py index 21a67cf476..3f0fe5d6c6 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_category.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_category.py @@ -6,7 +6,7 @@ class HelpdeskCategory(models.Model): _name = 'helpdesk.ticket.category' _description = 'Helpdesk Ticket Category' - active = fields.Boolean(string='Active') + active = fields.Boolean(string='Active', default=True) name = fields.Char(string='Name', required=True) company_id = fields.Many2one( 'res.company', diff --git a/helpdesk_mgmt/models/helpdesk_ticket_channel.py b/helpdesk_mgmt/models/helpdesk_ticket_channel.py index c44b98ca8d..cbfc16650c 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_channel.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_channel.py @@ -7,7 +7,7 @@ class HelpdeskTicketChannel(models.Model): _description = 'Helpdesk Ticket Channel' name = fields.Char(required=True) - active = fields.Boolean() + active = fields.Boolean(default=True) company_id = fields.Many2one( 'res.company', string="Company", diff --git a/helpdesk_mgmt/models/helpdesk_ticket_stage.py b/helpdesk_mgmt/models/helpdesk_ticket_stage.py index a390ff9e58..1d50ae6f49 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_stage.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_stage.py @@ -9,6 +9,7 @@ class HelpdeskTicketStage(models.Model): name = fields.Char(string='Stage Name', required=True, translate=True) description = fields.Text(translate=True) sequence = fields.Integer(default=1) + active = fields.Boolean(default=True) unattended = fields.Boolean( string='Unattended') closed = fields.Boolean( diff --git a/helpdesk_mgmt/models/helpdesk_ticket_tag.py b/helpdesk_mgmt/models/helpdesk_ticket_tag.py index cfa2aa42f5..25357124f5 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_tag.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_tag.py @@ -7,6 +7,7 @@ class HelpdeskTicketTag(models.Model): name = fields.Char(string='Name') color = fields.Integer(string='Color Index') + active = fields.Boolean(default=True) company_id = fields.Many2one( 'res.company', string="Company", diff --git a/helpdesk_mgmt/models/helpdesk_ticket_team.py b/helpdesk_mgmt/models/helpdesk_ticket_team.py index 18f533fd64..35364fe3f8 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_team.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_team.py @@ -8,6 +8,7 @@ class HelpdeskTeam(models.Model): name = fields.Char(string='Name', required=True) user_ids = fields.Many2many(comodel_name='res.users', string='Members') + active = fields.Boolean(default=True) category_ids = fields.Many2many( comodel_name='helpdesk.ticket.category', string='Category') diff --git a/helpdesk_mgmt/views/helpdesk_ticket_menu.xml b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml index 2c824d9dc2..7bc3aff5d2 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_menu.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml @@ -2,6 +2,7 @@ + Dashboard ir.actions.act_window @@ -26,34 +27,6 @@ form - - - - - - - - - - - - - - - Channels ir.actions.act_window @@ -94,6 +67,37 @@ form + + + + + + + + + + + + + + + + diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml new file mode 100644 index 0000000000..167a53c73f --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -0,0 +1,166 @@ + + + + helpdesk.ticket.view.form + helpdesk.ticket + +
+
+ + +
+ +
+

+ +

+

+ +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + +
+ + + +
+ + + + + helpdesk.ticket.view.tree + helpdesk.ticket + + + + + + + + + + + + + + helpdesk.ticket.kanban + helpdesk.ticket + + + + + + + + + + + + +
+
+

-

+
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+ + helpdesk.ticket.view.pivot + helpdesk.ticket + + + + + + + + + Tickets + ir.actions.act_window + helpdesk.ticket + tree,kanban,form,pivot + form + + From 712f1ac1096773be8e5a3cff2efe6fdf5b7a43bd Mon Sep 17 00:00:00 2001 From: carlosDomatix Date: Tue, 28 May 2019 19:44:32 +0200 Subject: [PATCH 013/337] [ADD] Portal (#42) --- helpdesk_mgmt/__init__.py | 1 + helpdesk_mgmt/__manifest__.py | 1 + helpdesk_mgmt/controllers/__init__.py | 4 + helpdesk_mgmt/controllers/main.py | 19 +++ helpdesk_mgmt/controllers/myaccount.py | 129 +++++++++++++++++ helpdesk_mgmt/models/helpdesk_ticket.py | 2 +- helpdesk_mgmt/security/ir.model.access.csv | 4 + helpdesk_mgmt/static/description/icon.png | Bin 21275 -> 3377 bytes .../views/helpdesk_ticket_templates.xml | 131 ++++++++++++++++++ helpdesk_mgmt/views/helpdesk_ticket_view.xml | 2 +- 10 files changed, 291 insertions(+), 2 deletions(-) create mode 100644 helpdesk_mgmt/controllers/__init__.py create mode 100644 helpdesk_mgmt/controllers/main.py create mode 100644 helpdesk_mgmt/controllers/myaccount.py create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_templates.xml diff --git a/helpdesk_mgmt/__init__.py b/helpdesk_mgmt/__init__.py index 0650744f6b..91c5580fed 100644 --- a/helpdesk_mgmt/__init__.py +++ b/helpdesk_mgmt/__init__.py @@ -1 +1,2 @@ +from . import controllers from . import models diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index c4b4c5fcb9..4ad88c66f8 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -25,6 +25,7 @@ 'data/helpdesk_ticket_sequence.xml', 'views/helpdesk_team_views.xml', 'views/helpdesk_ticket_menu.xml', + 'views/helpdesk_ticket_templates.xml', 'views/helpdesk_ticket_view.xml', ], 'demo': [ diff --git a/helpdesk_mgmt/controllers/__init__.py b/helpdesk_mgmt/controllers/__init__.py new file mode 100644 index 0000000000..1a5178b282 --- /dev/null +++ b/helpdesk_mgmt/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import main +from . import myaccount diff --git a/helpdesk_mgmt/controllers/main.py b/helpdesk_mgmt/controllers/main.py new file mode 100644 index 0000000000..44ec325e57 --- /dev/null +++ b/helpdesk_mgmt/controllers/main.py @@ -0,0 +1,19 @@ +import werkzeug +import logging +import odoo.http as http +_logger = logging.getLogger(__name__) + + +class HelpdeskTicketController(http.Controller): + + @http.route('/ticket/close', type="http", auth="user") + def support_ticket_close(self, **kw): + """Close the support ticket""" + values = {} + for field_name, field_value in kw.items(): + values[field_name] = field_value + ticket = http.request.env['helpdesk.ticket'].sudo().\ + search([('id', '=', values['ticket_id'])]) + ticket.stage_id = values.get('stage_id') + + return werkzeug.utils.redirect("/my/ticket/" + str(ticket.id)) diff --git a/helpdesk_mgmt/controllers/myaccount.py b/helpdesk_mgmt/controllers/myaccount.py new file mode 100644 index 0000000000..394cc49503 --- /dev/null +++ b/helpdesk_mgmt/controllers/myaccount.py @@ -0,0 +1,129 @@ +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import http, _ +from odoo.http import request +from odoo.addons.portal.controllers.portal import CustomerPortal +from odoo.addons.portal.controllers.portal import pager as portal_pager +from odoo.exceptions import AccessError + + +class CustomerPortal(CustomerPortal): + + def _prepare_portal_layout_values(self): + values = super(CustomerPortal, self)._prepare_portal_layout_values() + partner = request.env.user.partner_id + ticket_count = request.env['helpdesk.ticket'].search_count( + [('partner_id', 'child_of', partner.id)]) + values['ticket_count'] = ticket_count + return values + + def _helpdesk_ticket_check_access(self, ticket_id): + ticket = request.env['helpdesk.ticket'].browse([ticket_id]) + ticket_sudo = ticket.sudo() + try: + ticket.check_access_rights('read') + ticket.check_access_rule('read') + except AccessError: + raise + return ticket_sudo + + @http.route( + ['/my/tickets', '/my/tickets/page/'], + type='http', + auth="user", + website=True, + ) + def portal_my_tickets( + self, + page=1, + date_begin=None, + date_end=None, + sortby=None, + filterby=None, + **kw): + values = self._prepare_portal_layout_values() + HelpdesTicket = request.env['helpdesk.ticket'] + partner = request.env.user.partner_id + domain = [('partner_id', 'child_of', partner.id)] + + searchbar_sortings = { + 'date': {'label': _('Newest'), 'order': 'create_date desc'}, + 'name': {'label': _('Name'), 'order': 'name'}, + 'stage': {'label': _('Stage'), 'order': 'stage_id'}, + 'update': {'label': _('Last Stage Update'), + 'order': 'last_stage_update desc'}, + } + searchbar_filters = {'all': {'label': _('All'), 'domain': []}} + for stage in request.env['helpdesk.ticket.stage'].search([]): + searchbar_filters.update({ + str(stage.id): {'label': stage.name, + 'domain': [('stage_id', '=', stage.id)]} + }) + + # default sort by order + if not sortby: + sortby = 'date' + order = searchbar_sortings[sortby]['order'] + + # default filter by value + if not filterby: + filterby = 'all' + domain += searchbar_filters[filterby]['domain'] + + # count for pager + ticket_count = HelpdesTicket.search_count(domain) + # pager + pager = portal_pager( + url="/my/tickets", + url_args={}, + total=ticket_count, + page=page, + step=self._items_per_page + ) + # content according to pager and archive selected + tickets = HelpdesTicket.search( + domain, + order=order, + limit=self._items_per_page, + offset=pager['offset'] + ) + values.update({ + 'date': date_begin, + 'tickets': tickets, + 'page_name': 'ticket', + 'pager': pager, + 'default_url': '/my/tickets', + 'searchbar_sortings': searchbar_sortings, + 'sortby': sortby, + 'no_breadcrumbs': False, + 'searchbar_filters': searchbar_filters, + 'filterby': filterby, + }) + return request.render("helpdesk.portal_my_tickets", values) + + @http.route(['/my/ticket/'], type='http', website=True) + def portal_my_ticket(self, ticket_id=None, **kw): + try: + ticket_sudo = self._helpdesk_ticket_check_access(ticket_id) + except AccessError: + return request.redirect('/my') + values = self._ticket_get_page_view_values(ticket_sudo, **kw) + return request.render("helpdesk.portal_helpdesk_ticket_page", values) + + def _ticket_get_page_view_values(self, ticket, **kwargs): + closed_stages = request.env['helpdesk.ticket.stage'].search( + [('closed', '=', True)]) + values = { + 'page_name': 'ticket', + 'ticket': ticket, + 'closed_stages': closed_stages, + } + + if kwargs.get('error'): + values['error'] = kwargs['error'] + if kwargs.get('warning'): + values['warning'] = kwargs['warning'] + if kwargs.get('success'): + values['success'] = kwargs['success'] + + return values diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index b6c71b5234..0f35c5073a 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -26,7 +26,7 @@ def _get_default_stage_id(self): partner_name = fields.Char() partner_email = fields.Char() - last_state_update = fields.Datetime() + last_stage_update = fields.Datetime() assigned_date = fields.Datetime() closed_date = fields.Datetime() diff --git a/helpdesk_mgmt/security/ir.model.access.csv b/helpdesk_mgmt/security/ir.model.access.csv index 435eb8c840..3027a76ebc 100644 --- a/helpdesk_mgmt/security/ir.model.access.csv +++ b/helpdesk_mgmt/security/ir.model.access.csv @@ -5,6 +5,8 @@ access_helpdesk_ticket_user_personal,helpdesk.ticket.user.personal,helpdesk.mode access_helpdesk_ticket_portal,helpdesk.ticket.portal,helpdesk.model_helpdesk_ticket,base.group_portal,1,0,0,0 access_helpdesk_ticket_stage_manager,helpdesk.ticket.stage.manager,helpdesk.model_helpdesk_ticket_stage,group_helpdesk_manager,1,1,1,1 access_helpdesk_ticket_stage_user,helpdesk.ticket.stage.user,helpdesk.model_helpdesk_ticket_stage,base.group_user,1,0,0,0 +access_helpdesk_ticket_stage_portal,helpdesk.ticket.stage.portal,helpdesk.model_helpdesk_ticket_stage,base.group_portal,1,1,0,0 +access_helpdesk_ticket_stage_public,helpdesk.ticket.stage.public,helpdesk.model_helpdesk_ticket_stage,base.group_public,1,1,0,0 access_helpdesk_ticket_tag_manager,helpdesk.ticket.tag.manager,helpdesk.model_helpdesk_ticket_tag,group_helpdesk_manager,1,1,1,1 access_helpdesk_ticket_tag_user,helpdesk.ticket.tag.user,helpdesk.model_helpdesk_ticket_tag,base.group_user,1,0,0,0 access_helpdesk_ticket_team_manager,helpdesk.ticket.team.manager,helpdesk.model_helpdesk_ticket_team,group_helpdesk_manager,1,1,1,1 @@ -13,3 +15,5 @@ access_helpdesk_ticket_channel_manager,helpdesk.ticket.channel.manager,helpdesk. access_helpdesk_ticket_channel_user,helpdesk.ticket.channel.user,helpdesk.model_helpdesk_ticket_channel,base.group_user,1,0,0,0 access_helpdesk_ticket_category_manager,helpdesk.ticket.category.manager,helpdesk.model_helpdesk_ticket_category,group_helpdesk_manager,1,1,1,1 access_helpdesk_ticket_category_user,helpdesk.ticket.category.user,helpdesk.model_helpdesk_ticket_category,base.group_user,1,0,0,0 +access_helpdesk_ticket_category_portal,helpdesk.ticket.category.portal,helpdesk.model_helpdesk_ticket_category,base.group_portal,1,0,0,0 +access_helpdesk_ticket_category_public,helpdesk.ticket.category.public,helpdesk.model_helpdesk_ticket_category,base.group_public,1,0,0,0 diff --git a/helpdesk_mgmt/static/description/icon.png b/helpdesk_mgmt/static/description/icon.png index 98ded4afcf0451e9227977fee6411ee6da2d9cb2..8e1df4cdd48fc88302520e686952f07223532134 100644 GIT binary patch literal 3377 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 Hu0mjfjWmh6 literal 21275 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 WC<2;cqCl$v0000 + + + + + + + + + diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml index 167a53c73f..c6a18ea04d 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -76,7 +76,7 @@ - + From dd6fb00665ceb57a822b0d0e97aadc6a0699d4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Soto=20Ochoa?= <33620978+oscars8a@users.noreply.github.com> Date: Tue, 28 May 2019 23:30:43 +0200 Subject: [PATCH 014/337] [ADD] functionality of datetime fields (#40) * [ADD] functionality of datetime fields * [ADD] test for datetime fields [FIX] error in demo data * [FIX] flake8 --- helpdesk_mgmt/__init__.py | 1 + helpdesk_mgmt/demo/helpdesk_demo.xml | 2 +- helpdesk_mgmt/models/helpdesk_ticket.py | 33 ++++++++++++++++----- helpdesk_mgmt/tests/__init__.py | 1 + helpdesk_mgmt/tests/test_helpdesk_ticket.py | 32 ++++++++++++++++++++ 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 helpdesk_mgmt/tests/__init__.py create mode 100644 helpdesk_mgmt/tests/test_helpdesk_ticket.py diff --git a/helpdesk_mgmt/__init__.py b/helpdesk_mgmt/__init__.py index 91c5580fed..4e39a542f6 100644 --- a/helpdesk_mgmt/__init__.py +++ b/helpdesk_mgmt/__init__.py @@ -1,2 +1,3 @@ from . import controllers from . import models +from . import tests diff --git a/helpdesk_mgmt/demo/helpdesk_demo.xml b/helpdesk_mgmt/demo/helpdesk_demo.xml index a36b90ea14..c58c714c05 100644 --- a/helpdesk_mgmt/demo/helpdesk_demo.xml +++ b/helpdesk_mgmt/demo/helpdesk_demo.xml @@ -89,7 +89,7 @@ - + diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 0f35c5073a..a76107402b 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -1,4 +1,4 @@ -from odoo import models, fields, api, _ +from odoo import _, api, fields, models class HelpdeskTicket(models.Model): @@ -16,19 +16,21 @@ def _get_default_stage_id(self): description = fields.Text(required=True) user_id = fields.Many2one( 'res.users', - string='Assigned user', - default=lambda self: self.env.user) + string='Assigned user',) stage_id = fields.Many2one( 'helpdesk.ticket.stage', - string='State', + string='Stage', default=_get_default_stage_id) partner_id = fields.Many2one('res.partner') partner_name = fields.Char() partner_email = fields.Char() - last_stage_update = fields.Datetime() - assigned_date = fields.Datetime() - closed_date = fields.Datetime() + last_stage_update = fields.Datetime( + string='Last Stage Update', + default=fields.Datetime.now(), + ) + assigned_date = fields.Datetime(string='Assinged Date') + closed_date = fields.Datetime(string='Closed Date') tag_ids = fields.Many2many('helpdesk.ticket.tag') company_id = fields.Many2one( @@ -65,3 +67,20 @@ def create(self, vals): vals['helpdesk_sequence'] = self.env[ 'ir.sequence'].next_by_code('helpdesk.ticket.sequence') or '/' return super(HelpdeskTicket, self).create(vals) + + @api.multi + def write(self, vals): + for ticket in self: + now = fields.Datetime.now() + if 'stage_id' in vals.keys(): + stage_obj = self.env['helpdesk.ticket.stage'].browse( + [int(vals['stage_id'])]) + vals['last_stage_update'] = now + if stage_obj.closed: + vals['closed_date'] = now + if 'user_id' in vals.keys(): + vals['assigned_date'] = now + return super(HelpdeskTicket, self).write(vals) + + def assign_to_me(self): + self.write({'user_id': self.env.user.id}) diff --git a/helpdesk_mgmt/tests/__init__.py b/helpdesk_mgmt/tests/__init__.py new file mode 100644 index 0000000000..5b420011e0 --- /dev/null +++ b/helpdesk_mgmt/tests/__init__.py @@ -0,0 +1 @@ +from . import test_helpdesk_ticket diff --git a/helpdesk_mgmt/tests/test_helpdesk_ticket.py b/helpdesk_mgmt/tests/test_helpdesk_ticket.py new file mode 100644 index 0000000000..6ddd08300c --- /dev/null +++ b/helpdesk_mgmt/tests/test_helpdesk_ticket.py @@ -0,0 +1,32 @@ +from odoo.tests import common + + +class TestHelpdeskTicket(common.SavepointCase): + + def setUp(self): + super().setUp() + self.user_admin = self.env.ref('base.user_root') + self.user_demo = self.env.ref('base.user_demo') + self.stage_closed = self.env.ref('helpdesk.helpdesk_ticket_stage_done') + + @classmethod + def setUpClass(cls): + super(TestHelpdeskTicket, cls).setUpClass() + Ticket = cls.env['helpdesk.ticket'] + cls.ticket = Ticket.create({ + 'name': 'Test 1', + 'description': "This is the first test.", + }) + + def test_helpdesk_ticket(self): + self.assertTrue(self.ticket.last_stage_update) + + self.ticket.write({ + 'stage_id': self.stage_closed.id, + }) + self.assertTrue(self.ticket.closed_date) + + self.ticket.write({ + 'user_id': self.user_admin.id, + }) + self.assertTrue(self.ticket.assigned_date) From f7b6353655caa230460d7357f781fccc225136d2 Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Wed, 29 May 2019 09:01:51 +0200 Subject: [PATCH 015/337] [FIX+IMP] helpdesk: 4 things: * Fix tickets and naming conventions (#46) * Save sequence number in in 'number' field instead of in helpdesk_sequence. * Also fixed tests and added a small test to check if a number is added in a ticket when we create one. * Add many views and fix others (#49) --- helpdesk_mgmt/__manifest__.py | 8 ++- helpdesk_mgmt/data/helpdesk_data.xml | 8 +++ .../data/reservation_initial_sequence.xml | 15 ----- helpdesk_mgmt/models/helpdesk_ticket.py | 18 +++--- helpdesk_mgmt/tests/test_helpdesk_ticket.py | 47 +++++++++++---- helpdesk_mgmt/views/helpdesk_team_views.xml | 45 -------------- .../views/helpdesk_ticket_category_view.xml | 51 ++++++++++++++++ .../views/helpdesk_ticket_channel_view.xml | 51 ++++++++++++++++ .../views/helpdesk_ticket_stage_view.xml | 60 +++++++++++++++++++ .../views/helpdesk_ticket_team_view.xml | 53 ++++++++++++++++ 10 files changed, 271 insertions(+), 85 deletions(-) delete mode 100644 helpdesk_mgmt/data/reservation_initial_sequence.xml delete mode 100644 helpdesk_mgmt/views/helpdesk_team_views.xml create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_category_view.xml create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_channel_view.xml create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_team_view.xml diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index 4ad88c66f8..d9409fab31 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -22,10 +22,12 @@ 'data/helpdesk_data.xml', 'security/helpdesk_security.xml', 'security/ir.model.access.csv', - 'data/helpdesk_ticket_sequence.xml', - 'views/helpdesk_team_views.xml', - 'views/helpdesk_ticket_menu.xml', 'views/helpdesk_ticket_templates.xml', + 'views/helpdesk_ticket_menu.xml', + 'views/helpdesk_ticket_team_view.xml', + 'views/helpdesk_ticket_stage_view.xml', + 'views/helpdesk_ticket_category_view.xml', + 'views/helpdesk_ticket_channel_view.xml', 'views/helpdesk_ticket_view.xml', ], 'demo': [ diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml index d367543897..c5a8f70791 100644 --- a/helpdesk_mgmt/data/helpdesk_data.xml +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -11,6 +11,14 @@ + + + Helpdesk Ticket Sequence + helpdesk.ticket.sequence + HT + 5 + + 1 diff --git a/helpdesk_mgmt/data/reservation_initial_sequence.xml b/helpdesk_mgmt/data/reservation_initial_sequence.xml deleted file mode 100644 index f0e93e438b..0000000000 --- a/helpdesk_mgmt/data/reservation_initial_sequence.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - Helpdesk Ticket Sequence - helpdesk.ticket.sequence - TK - 5 - - - - diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index a76107402b..0a56dcff6b 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -4,14 +4,15 @@ class HelpdeskTicket(models.Model): _name = 'helpdesk.ticket' - _rec_name = 'helpdesk_sequence' + _rec_name = 'number' _order = 'number desc' _inherit = ['mail.thread', 'mail.activity.mixin'] def _get_default_stage_id(self): return self.env['helpdesk.ticket.stage'].search([], limit=1).id - number = fields.Char(string='Ticket number', readonly=True) + number = fields.Char(string='Ticket number', default="/", + readonly=True) name = fields.Char(string='Title', required=True) description = fields.Text(required=True) user_id = fields.Many2one( @@ -29,7 +30,7 @@ def _get_default_stage_id(self): string='Last Stage Update', default=fields.Datetime.now(), ) - assigned_date = fields.Datetime(string='Assinged Date') + assigned_date = fields.Datetime(string='Assigned Date') closed_date = fields.Datetime(string='Closed Date') tag_ids = fields.Many2many('helpdesk.ticket.tag') @@ -58,15 +59,14 @@ def _get_default_stage_id(self): 'ir.attachment', 'res_id', domain=[('res_model', '=', 'website.support.ticket')], string="Media Attachments") - helpdesk_sequence = fields.Char("Reservation reference", default="/") - active = fields.Boolean(default='True') @api.model def create(self, vals): - if vals.get('helpdesk_sequence', '/') == '/': - vals['helpdesk_sequence'] = self.env[ - 'ir.sequence'].next_by_code('helpdesk.ticket.sequence') or '/' - return super(HelpdeskTicket, self).create(vals) + if vals.get('number', '/') == '/': + vals['number'] = self.env['ir.sequence'].next_by_code( + 'helpdesk.ticket.sequence' + ) or '/' + return super().create(vals) @api.multi def write(self, vals): diff --git a/helpdesk_mgmt/tests/test_helpdesk_ticket.py b/helpdesk_mgmt/tests/test_helpdesk_ticket.py index 6ddd08300c..2d5e3ce92d 100644 --- a/helpdesk_mgmt/tests/test_helpdesk_ticket.py +++ b/helpdesk_mgmt/tests/test_helpdesk_ticket.py @@ -3,30 +3,51 @@ class TestHelpdeskTicket(common.SavepointCase): - def setUp(self): - super().setUp() - self.user_admin = self.env.ref('base.user_root') - self.user_demo = self.env.ref('base.user_demo') - self.stage_closed = self.env.ref('helpdesk.helpdesk_ticket_stage_done') - @classmethod def setUpClass(cls): super(TestHelpdeskTicket, cls).setUpClass() - Ticket = cls.env['helpdesk.ticket'] - cls.ticket = Ticket.create({ + helpdesk_ticket = cls.env['helpdesk.ticket'] + cls.user_admin = cls.env.ref('base.user_root') + cls.user_demo = cls.env.ref('base.user_demo') + cls.stage_closed = cls.env.ref('helpdesk.helpdesk_ticket_stage_done') + + cls.ticket = helpdesk_ticket.create({ 'name': 'Test 1', - 'description': "This is the first test.", + 'description': 'Ticket test', }) - def test_helpdesk_ticket(self): - self.assertTrue(self.ticket.last_stage_update) + def test_helpdesk_ticket_datetimes(self): + old_stage_update = self.ticket.last_stage_update + + self.assertTrue(self.ticket.last_stage_update, + 'Helpdesk Ticket: Helpdesk ticket should ' + 'have a last_stage_update at all times.') + + self.assertFalse(self.ticket.closed_date, + 'Helpdesk Ticket: No closed date ' + 'should be set for a non closed ' + 'ticket.') self.ticket.write({ 'stage_id': self.stage_closed.id, }) - self.assertTrue(self.ticket.closed_date) + + self.assertTrue(self.ticket.closed_date, + 'Helpdesk Ticket: A closed ticket ' + 'should have a closed_date value.') + self.assertTrue(old_stage_update < self.ticket.last_stage_update, + 'Helpdesk Ticket: The last_stage_update ' + 'should be updated at every stage_id ' + 'change.') self.ticket.write({ 'user_id': self.user_admin.id, }) - self.assertTrue(self.ticket.assigned_date) + self.assertTrue(self.ticket.assigned_date, + 'Helpdesk Ticket: An assigned ticket ' + 'should contain a assigned_date.') + + def test_helpdesk_ticket_number(self): + self.assertNotEquals(self.ticket.number, '/', + 'Helpdesk Ticket: A ticket should have ' + 'a number.') diff --git a/helpdesk_mgmt/views/helpdesk_team_views.xml b/helpdesk_mgmt/views/helpdesk_team_views.xml deleted file mode 100644 index 894ded0cc2..0000000000 --- a/helpdesk_mgmt/views/helpdesk_team_views.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - view.helpdesk_team.form - helpdesk.ticket.team - -
- - - - - -
-
-
- - - view.helpdesk_team.tree - helpdesk.ticket.team - - - - - - - - helpdesk.team.kanban - helpdesk.ticket.team - - - - - - -
-

- -

-
-
-
-
-
-
-
diff --git a/helpdesk_mgmt/views/helpdesk_ticket_category_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_category_view.xml new file mode 100644 index 0000000000..992000ae38 --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_ticket_category_view.xml @@ -0,0 +1,51 @@ + + + + + helpdesk.ticket.category.search + helpdesk.ticket.category + + + + + + + + + + + view.helpdesk_category.form + helpdesk.ticket.category + +
+
+
+ +
+ +
+
+
+ + + +
+
+
+
+ + + view.helpdesk_category.tree + helpdesk.ticket.category + + + + + + + +
diff --git a/helpdesk_mgmt/views/helpdesk_ticket_channel_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_channel_view.xml new file mode 100644 index 0000000000..1279a00f13 --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_ticket_channel_view.xml @@ -0,0 +1,51 @@ + + + + + helpdesk.ticket.channel.search + helpdesk.ticket.channel + + + + + + + + + + + view.helpdesk_channel.form + helpdesk.ticket.channel + +
+
+
+ +
+ +
+
+
+ + + +
+
+
+
+ + + view.helpdesk_channel.tree + helpdesk.ticket.channel + + + + + + + +
diff --git a/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml new file mode 100644 index 0000000000..b10909d8c6 --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml @@ -0,0 +1,60 @@ + + + + + helpdesk.ticket.stage.search + helpdesk.ticket.stage + + + + + + + + + + + helpdesk.ticket.stage.form + helpdesk.ticket.stage + +
+
+
+ +
+ +
+
+
+ + + + + + + + + + + + +
+
+
+
+ + + helpdesk.ticket.stage.tree + helpdesk.ticket.stage + + + + + + + +
\ No newline at end of file diff --git a/helpdesk_mgmt/views/helpdesk_ticket_team_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_team_view.xml new file mode 100644 index 0000000000..355226ccd7 --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_ticket_team_view.xml @@ -0,0 +1,53 @@ + + + + + helpdesk.ticket.team.search + helpdesk.ticket.team + + + + + + + + + + + + view.helpdesk_team.form + helpdesk.ticket.team + +
+
+
+ +
+ +
+
+
+ + + + +
+
+
+
+ + + view.helpdesk_team.tree + helpdesk.ticket.team + + + + + + + +
From 541bc9053eb6bb49222ff9e8ad34b9239f76ca44 Mon Sep 17 00:00:00 2001 From: Daniel <35925814+DaniKL@users.noreply.github.com> Date: Wed, 29 May 2019 10:50:49 +0200 Subject: [PATCH 016/337] =?UTF-8?q?[ADD]=20Helpdesk:=20A=C3=B1adida=20plan?= =?UTF-8?q?tilla=20y=20funci=C3=B3n=20de=20env=C3=ADo=20de=20mail.=20(#48)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ADD] Helpdesk: A??adida plantilla y funci??n de env??o de mail. * [FIX] Fix the sending user email --- helpdesk_mgmt/data/helpdesk_data.xml | 15 ++++++++++++++ helpdesk_mgmt/models/helpdesk_ticket.py | 26 ++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml index c5a8f70791..5d39bab63a 100644 --- a/helpdesk_mgmt/data/helpdesk_data.xml +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -11,6 +11,21 @@ + + + + Ticket Assignment + + ${object.company_id.partner_id.email} + ${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' }) + ${object.partner_id.id} + + ${object.partner_id.lang} + +

Hello ${object.user_id.name},

+

The ticket ${object.number} has been assigned to you.

+
+
Helpdesk Ticket Sequence diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 0a56dcff6b..13a39d6798 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -60,27 +60,43 @@ def _get_default_stage_id(self): domain=[('res_model', '=', 'website.support.ticket')], string="Media Attachments") + def send_user_mail(self): + self.env.ref('helpdesk.assignment_email_template').\ + send_mail(self.id) + @api.model def create(self, vals): if vals.get('number', '/') == '/': vals['number'] = self.env['ir.sequence'].next_by_code( 'helpdesk.ticket.sequence' ) or '/' - return super().create(vals) + res = super().create(vals) + + # Check if mail to the user has to be sent + if vals.get('user_id') and res: + res.send_user_mail() + return res @api.multi def write(self, vals): for ticket in self: now = fields.Datetime.now() - if 'stage_id' in vals.keys(): + if vals.get('stage_id'): stage_obj = self.env['helpdesk.ticket.stage'].browse( - [int(vals['stage_id'])]) + [vals['stage_id']]) vals['last_stage_update'] = now if stage_obj.closed: vals['closed_date'] = now - if 'user_id' in vals.keys(): + if vals.get('user_id'): vals['assigned_date'] = now - return super(HelpdeskTicket, self).write(vals) + + res = super(HelpdeskTicket, self).write(vals) + + # Check if mail to the user has to be sent + for ticket in self: + if vals.get('user_id'): + ticket.send_user_mail() + return res def assign_to_me(self): self.write({'user_id': self.env.user.id}) From b28f2c3ea296b04eb2e134e8d7e87c5174f62503 Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Wed, 29 May 2019 11:00:34 +0200 Subject: [PATCH 017/337] [IMP+FIX] helpdesk: 3 imps + 2 fixes * Add date to list view of tickets (#50) * Tag views (#51) * Add mail template automatic sending when changing stages (#52) * [FIX] Fix visibility on stage field * [FIX] Add admin to helpdesk manager group by default --- helpdesk_mgmt/__manifest__.py | 1 + helpdesk_mgmt/models/helpdesk_ticket.py | 21 +++++++- helpdesk_mgmt/security/helpdesk_security.xml | 1 + .../views/helpdesk_ticket_stage_view.xml | 1 + .../views/helpdesk_ticket_tag_view.xml | 50 +++++++++++++++++++ helpdesk_mgmt/views/helpdesk_ticket_view.xml | 7 ++- 6 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index d9409fab31..21c9bd7190 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -28,6 +28,7 @@ 'views/helpdesk_ticket_stage_view.xml', 'views/helpdesk_ticket_category_view.xml', 'views/helpdesk_ticket_channel_view.xml', + 'views/helpdesk_ticket_tag_view.xml', 'views/helpdesk_ticket_view.xml', ], 'demo': [ diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 13a39d6798..f7029b660a 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -21,7 +21,9 @@ def _get_default_stage_id(self): stage_id = fields.Many2one( 'helpdesk.ticket.stage', string='Stage', - default=_get_default_stage_id) + default=_get_default_stage_id, + track_visibility='onchange', + ) partner_id = fields.Many2one('res.partner') partner_name = fields.Char() partner_email = fields.Char() @@ -61,7 +63,7 @@ def _get_default_stage_id(self): string="Media Attachments") def send_user_mail(self): - self.env.ref('helpdesk.assignment_email_template').\ + self.env.ref('helpdesk.assignment_email_template'). \ send_mail(self.id) @api.model @@ -100,3 +102,18 @@ def write(self, vals): def assign_to_me(self): self.write({'user_id': self.env.user.id}) + + # --------------------------------------------------- + # Mail gateway + # --------------------------------------------------- + + @api.multi + def _track_template(self, tracking): + res = super(HelpdeskTicket, self)._track_template(tracking) + test_task = self[0] + changes, tracking_value = tracking[test_task.id] + if "stage_id" in changes and test_task.stage_id.mail_template_id: + res['stage_id'] = (test_task.stage_id.mail_template_id, + {"composition_mode": "mass_mail"}) + + return res diff --git a/helpdesk_mgmt/security/helpdesk_security.xml b/helpdesk_mgmt/security/helpdesk_security.xml index 03560b7baa..024e033309 100644 --- a/helpdesk_mgmt/security/helpdesk_security.xml +++ b/helpdesk_mgmt/security/helpdesk_security.xml @@ -18,6 +18,7 @@ Helpdesk Manager +
diff --git a/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml index b10909d8c6..78af0a8944 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml @@ -54,6 +54,7 @@ +
diff --git a/helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml new file mode 100644 index 0000000000..0f55a8bd5d --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml @@ -0,0 +1,50 @@ + + + + + helpdesk.ticket.tag.search + helpdesk.ticket.tag + + + + + + + + + + + helpdesk.ticket.tag.form + helpdesk.ticket.tag + +
+
+
+ +
+ +
+
+
+ + + +
+
+
+
+ + + helpdesk.ticket.tag.tree + helpdesk.ticket.tag + + + + + + +
\ No newline at end of file diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml index c6a18ea04d..5ed7590a6a 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -21,19 +21,20 @@
- + + - + @@ -103,6 +104,8 @@ + +
From d7a925936366075d1e6a32c7777a382505386d01 Mon Sep 17 00:00:00 2001 From: carlosDomatix Date: Wed, 29 May 2019 12:29:36 +0200 Subject: [PATCH 018/337] [ADD] Ticket Search View (#55) --- helpdesk_mgmt/models/helpdesk_ticket.py | 3 +- helpdesk_mgmt/views/helpdesk_ticket_view.xml | 40 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index f7029b660a..3396a5db81 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -34,7 +34,8 @@ def _get_default_stage_id(self): ) assigned_date = fields.Datetime(string='Assigned Date') closed_date = fields.Datetime(string='Closed Date') - + closed = fields.Boolean(related='stage_id.closed') + unattended = fields.Boolean(related='stage_id.unattended') tag_ids = fields.Many2many('helpdesk.ticket.tag') company_id = fields.Many2one( 'res.company', diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml index 5ed7590a6a..841d92afff 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -1,5 +1,45 @@ + + helpdesk.ticket.view.search + helpdesk.ticket + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + helpdesk.ticket.view.form helpdesk.ticket From 23e6e60e44080b359abcc2e4ded55a07cb882e7d Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Wed, 29 May 2019 12:36:09 +0200 Subject: [PATCH 019/337] [IMP] helpdesk: Automatic partner_name and partner_email (#54) + Add contributors (#56) --- helpdesk_mgmt/README.rst | 12 ++++++++++-- helpdesk_mgmt/models/helpdesk_ticket.py | 16 +++++++++++++--- helpdesk_mgmt/readme/CONTRIBUTORS.rst | 6 +++++- helpdesk_mgmt/static/description/index.html | 12 ++++++++++-- helpdesk_mgmt/views/helpdesk_ticket_view.xml | 7 ++++--- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/helpdesk_mgmt/README.rst b/helpdesk_mgmt/README.rst index eb2b341509..11e2946e2b 100644 --- a/helpdesk_mgmt/README.rst +++ b/helpdesk_mgmt/README.rst @@ -47,12 +47,16 @@ Credits Authors ~~~~~~~ -* ACSONE SA/NV +* AdaptiveCity +* C2i Change 2 Improve +* Domatix +* Factor Libre +* SDi Soluciones Contributors ~~~~~~~~~~~~ -* `Domatix `_: +* `Domatix `_: * Carlos Mart??nez @@ -69,6 +73,10 @@ Contributors * Eduardo Magdalena +* `Factor Libre `_: + + * Mar??a Alhambra + Maintainers ~~~~~~~~~~~ diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 3396a5db81..f84d877bc4 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -67,6 +67,19 @@ def send_user_mail(self): self.env.ref('helpdesk.assignment_email_template'). \ send_mail(self.id) + def assign_to_me(self): + self.write({'user_id': self.env.user.id}) + + @api.onchange('partner_id') + def _onchange_partner_id(self): + if self.partner_id: + self.partner_name = self.partner_id.name + self.partner_email = self.partner_id.email + + # --------------------------------------------------- + # CRUD + # --------------------------------------------------- + @api.model def create(self, vals): if vals.get('number', '/') == '/': @@ -101,9 +114,6 @@ def write(self, vals): ticket.send_user_mail() return res - def assign_to_me(self): - self.write({'user_id': self.env.user.id}) - # --------------------------------------------------- # Mail gateway # --------------------------------------------------- diff --git a/helpdesk_mgmt/readme/CONTRIBUTORS.rst b/helpdesk_mgmt/readme/CONTRIBUTORS.rst index e17e7e0456..0715fa4a28 100644 --- a/helpdesk_mgmt/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt/readme/CONTRIBUTORS.rst @@ -1,4 +1,4 @@ -* `Domatix `_: +* `Domatix `_: * Carlos Mart??nez @@ -14,3 +14,7 @@ * `C2i Change 2 improve `_: * Eduardo Magdalena + +* `Factor Libre `_: + + * Mar??a Alhambra diff --git a/helpdesk_mgmt/static/description/index.html b/helpdesk_mgmt/static/description/index.html index 36885076be..fa71e412c0 100644 --- a/helpdesk_mgmt/static/description/index.html +++ b/helpdesk_mgmt/static/description/index.html @@ -401,13 +401,17 @@

Credits

Authors

    -
  • ACSONE SA/NV
  • +
  • AdaptiveCity
  • +
  • C2i Change 2 Improve
  • +
  • Domatix
  • +
  • Factor Libre
  • +
  • SDi Soluciones

Contributors

diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml index 841d92afff..44c3e7eff6 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -46,9 +46,10 @@
- +
From 401b28ed5434eb3272705d8380d583c4c26a1d2f Mon Sep 17 00:00:00 2001 From: Eduardo Magdalena Date: Thu, 6 Jun 2019 09:15:12 +0200 Subject: [PATCH 020/337] Add images (#3) --- helpdesk_mgmt/readme/CONFIGURE.rst | 80 ++++++++++++++++++ helpdesk_mgmt/readme/USAGE.rst | 23 ++++- .../static/description/Categories.PNG | Bin 0 -> 5375 bytes helpdesk_mgmt/static/description/Channels.PNG | Bin 0 -> 4436 bytes helpdesk_mgmt/static/description/Stage.PNG | Bin 0 -> 13077 bytes helpdesk_mgmt/static/description/Tags.PNG | Bin 0 -> 5357 bytes helpdesk_mgmt/static/description/Teams.PNG | Bin 0 -> 7615 bytes .../static/description/Tickets01.PNG | Bin 0 -> 24697 bytes .../static/description/Tickets02.PNG | Bin 0 -> 17647 bytes .../static/description/Tickets03.PNG | Bin 0 -> 20145 bytes .../static/description/Tickets_Kanban.PNG | Bin 0 -> 19905 bytes 11 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 helpdesk_mgmt/readme/CONFIGURE.rst create mode 100644 helpdesk_mgmt/static/description/Categories.PNG create mode 100644 helpdesk_mgmt/static/description/Channels.PNG create mode 100644 helpdesk_mgmt/static/description/Stage.PNG create mode 100644 helpdesk_mgmt/static/description/Tags.PNG create mode 100644 helpdesk_mgmt/static/description/Teams.PNG create mode 100644 helpdesk_mgmt/static/description/Tickets01.PNG create mode 100644 helpdesk_mgmt/static/description/Tickets02.PNG create mode 100644 helpdesk_mgmt/static/description/Tickets03.PNG create mode 100644 helpdesk_mgmt/static/description/Tickets_Kanban.PNG diff --git a/helpdesk_mgmt/readme/CONFIGURE.rst b/helpdesk_mgmt/readme/CONFIGURE.rst new file mode 100644 index 0000000000..2ec1064659 --- /dev/null +++ b/helpdesk_mgmt/readme/CONFIGURE.rst @@ -0,0 +1,80 @@ +To configure this module, you need to: +#. Edit or create new channels. +#. Edit or create new categories. +#. Edit or create new stages. +#. Edit or create new teams. +#. Edit or create new tags. + +------------------- +Channels +------------------- + +#. Go to *Helpdesk > Configuration > Channels* to edit or create new channels. +#. Edit or create a channel. +#. Set the name for the channel. +#. You can also Activate or Deactivate channels. + +.. figure:: ../static/description/Channels.PNG + :alt: Channels + :width: 600 px + +------------------- +Categories +------------------- + +#. Go to *Helpdesk > Configuration > Categories* to edit or create new categories. +#. Edit or create a new category. +#. Set the name for the category. +#. You can also Activate or Deactivate categories. + +.. figure:: ../static/description/Categories.PNG + :alt: Categories + :width: 600 px + +------------------- +Stages +------------------- + +#. Go to *Helpdesk > Configuration > Stages* to edit or create new stages. +#. Edit or create a new stage. +#. Set the name for the stage. +#. Set the sequence order for the stage. +#. You can select an Email template. +#. Mark the Unattended checkbox if the stage contains unattended tickets. +#. Mark the Closed checkbox if the stage contains closed tickets. +#. You can add a description for the stage. +#. You can also Activate or Deactivate stages. + +.. figure:: ../static/description/Stages.PNG + :alt: Stages + :width: 600 px + +You can also sort the stage sequence if you move up or down the stages in the list view. + +------------------- +Teams +------------------- + +#. Go to *Helpdesk > Configuration > Teams* to edit or create new teams. +#. Edit or create a new team. +#. Set the name for the team. +#. Add the teams members. +#. You can also Activate or Deactivate teams. + +.. figure:: ../static/description/Teams.PNG + :alt: Teams + :width: 600 px + +------------------- +Tags +------------------- + +#. Go to *Helpdesk > Configuration > Ticket Tags* to edit or create new tags. +#. Edit or create a new tag. +#. Set the name for the tag. +#. Set the color index for the tag. +#. You can also Activate or Deactivate tags. + +.. figure:: ../static/description/Tags.PNG + :alt: Ticket Tags + :width: 600 px diff --git a/helpdesk_mgmt/readme/USAGE.rst b/helpdesk_mgmt/readme/USAGE.rst index 66559af396..270ab7660e 100644 --- a/helpdesk_mgmt/readme/USAGE.rst +++ b/helpdesk_mgmt/readme/USAGE.rst @@ -1 +1,22 @@ -* Go to... +#. Go to *Helpdesk* or *Helpdesk > Dashboard* to see the tickets dashboard +#. In the Kanban view, click in the kanban card of a team to see their tickets and create new ones. + +.. figure:: ../static/description/Tickets_Kanban.PNG + :alt: Kanban view + :width: 600 px + +To create a new ticket from the kanban view... +#. Press the *Create* button or click on the plus icon at the top of the column of a stage. +#. Set the name or subject for the ticket. +#. Select the team that will manage the ticket. +#. You can select a user to assign the ticket. +#. Set the priority of the ticket. +#. Select the partner, and you can also set the partner name and email. +#. You can select a category and set tags for the ticket. +#. Add a description. +#. You can also attach files to the ticket. + +.. figure:: ../static/description/Tickets01.PNG + :alt: Create a new ticket + :width: 600 px + diff --git a/helpdesk_mgmt/static/description/Categories.PNG b/helpdesk_mgmt/static/description/Categories.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2ec697db5c0b6a5783ba7ea5aa17794c8b10958b GIT binary patch literal 5375 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 Q&N$FDsHtJuCFj5X7YFnbdH?_b literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt/static/description/Tags.PNG b/helpdesk_mgmt/static/description/Tags.PNG new file mode 100644 index 0000000000000000000000000000000000000000..8de98101a52e6cf8af296c76682807b7b88011e6 GIT binary patch literal 5357 zcmeHLXH-+^);`#9&~ePbh>C&}MnRAwW#|Sq7*JZMLye87ARtl{2!uNfNN2bLAt1$2 z5xO{HS_M(t}76QSMNgZ=UsoPUvkjntU?A}U!(Tfw;7+G=`LlcU0rB9l4z2PIh{Yd ze^y8GR7uu+fAF1Yw7}c-o~wgvc%LohMwF@R`&k*CJ5j=(veQFiTOM~ZXSG!m|Hn2S zrevi6qBD~R*#I(7kl!&&xC{tCNgV*<00;qO+6GT$75Cbk<-hmQu?N4K zA&<^TWz_M?hmdfy8gm~L+6Em< zXEFvahTx}t+p>b%-HP}(O$D*BHRW%@T{GfjfZu|W)h}|ANvDe3QWoBIRvto@9y7%i zMsEyk=rwDeH85q(ca`4JfEA_HPKU=d{MA0Ae-8k(sS(usvYGXs)y+>UoVa(od%c=q)yamCstGTXm9DSvF9 zE(2UPf-97_To~S%y;_uSwBDWra zbUB%%kOi066II{3MFNFNiAd#h14-S1zEX4=$m`SJLka+2W}iwSjag*MS}=1NCegNN zd!A30JT}I^hk!$-n;=dnU9`-RcPcy%2KBPsrXo^H#&vbHxSW+5YBx(wB@T8F9m-)( zzEgw8kh6VaPsaFStj)HPz3NTO5&Equ{>pak3wJG?~=PyGNiYmCMoanz}lo4*5k+ zt#8MV?Wgti8|K+vNuqivwij5a5^avSNEi*=)zs4cLdMJDRCzV=7nJ^9lCARjQdLKz zp+RPGMLF84rl!n!oXOv36!ng_K*zqm6=|Km{S>Uq)fe>`a-(yj%6Am)6?pM_b}(WGvvYlwnl;5T__G@3`xJS4a#YpJ+$ z1R21j;XDcIUWR386-T^zY}J5)`Jzjt4Qf{1X~Yd;*qWi&djS^QD4?aQ`UvRHNT%xR zh6FYi8MdRlx3_}!=1cwdlGKO{lFFbW#V07U^me3m3`Ir872dZ|9-fnfc#x0CscK3i zi8_};DhxN1IJpWFL`^!Z5?&?y(^CH>KNS@PD2Uk95VAAObzyVp`S*=oaovq%d79&z9!2lh z#OZ9=ftx%d{6Q;6Dz$VJT7C7ta6>qec~|^Xvbw(h(lA`%gX=WQ!7O2T@3s`P^Kd-g zgLr}vS35DnC)S+1Xvxb@($jCSw}Z?0G%m3m`hNY^u|tgjGIN$kTDq?=H=UK8D1u`h z+zCG!p6VS0ba8Mn`T5hQPgAuj_@1@FD5Ib3yEIXqYvm?V_UD&J$>RB4M>nH-mk~xF z<{XwoHhkD#DTy?(3na3Buc!?0p>N6`hcpiDf>t&CB}uPAT&Q-^(p?~d+rU?z|K%nr z@Uukse{V7~;4YiB6*t;8<}k+&`zyVG_1?xZY~((;l3~cj8*m@gC6<;}g<6Kiulv4Z zP#9m5xpS%U+%^9mLA94yuR}744-jyV7rN_#M!E zP>rix{&F>{?vPVsPqB4BrM++T=`7uA6<4^LdHaE~m%WNn{KCuwW-@f9X)=hctlwbq z{-HuiH3mxSDA77x7M!CKI;jtPz_`hj&(A}X|B-Qj+u#t>u;;6h%x&% zX+iZvGFOjuetm z$!W4sIda1MNNBUu{?JM+Ze$Ve>q@cBS?=Gf` z)>C`pDC}gd{+{l&KxKcjN7pDb=Ya-p55@wGZpiyb9#tYBBfB5_FDO(aUXO>7cc;wD zOOs2jJbK$>*wbO6V47_zgJO%T(z&8!09^>yF3SwS`CO`lxd}w#;0pR8L)Oekvh;j| z)6Hlgjjyr`_?KoSc`rUKOZvC72K1SN@*ZaVr4^l!N8YnhR@wNz$bV#Yxdc9()5EM> zWE8;KvRS2jm}48}-&8Pg2qG$yzr1mG&z`O!O%+4!=BZu0o5t(xxfL?Mcb=j4DKSQu z+LOt`y%7&YbU3qwsKLe81x%5W;-GV;`=>|HVz5q3`nN`v&2m7~n}#cs4i6W%J2W^e zUcl9;Jl6R1eO=TPHSlSu!Lr8B8q^VbvuVuYcdP||!=f3d(H4#$f7HCPT^~*C==FZoE)l zdQB(BB%~-4Ws#L(9{ZzM11q2C&=i}>!CN`{wY6bXBb0@9!jh;KjEawS7f01rN1Moz z3VqgseldePaniNH(&>wY%EkFExxo!HONMEKn+*;@74FK>mk*w+YY%BuKG%2Wr~Af* zQAA8CC)*9DQ-&Ijm087e*Zo7r&$_Et3G`kkgw0(Sd}NL%@)6?W(GKJsl@R|)MHs4< zQcWv~jRt>B^A?bumUZD;gfpAhB8pC8Tb5r#DEpdq__cvUiH%$mwF`3oRFybsa77{@V8g`ucR}Gs+lUk#A zp6hWhPOkyC(CClk^yzD|0QaM>>SC%+P`LxlCm`}y1JJLxBrgjV0aymF7!p2?jy{kQ zjO9)u%0NKXfqPXn*)NYwkTcp+fX5r+U>D{xzuP7k_o={Y zOKTrF_#f5XphzdAl7)-aGnA%gGPx*dsx_z9r!BYEyX7jVQqUG25|I{G83!v~ItsB; zw39~)P%lI}w22ANiLo(t`<+0^H*7|*fb&8m@MfL62p_N-g1bm`6a^@A01#?o&){Hn zOF4L}VIxiE+(0SwrXQnLvAEz>`Y5~Sk*y|8L2Y^9Q!OjPGt!hIY6&YfP7vgu0JTly zogH#O360GN6>wU8@iuTDm{D5ALl#Zj{;l4e_@O*85CKOT+QI2{SUt*#jyis+z-g_8*k2ynIfhRw zpXa5+VzFG_KKHLFGySJcWBl|8hjrX1MH4-B4KHfgn8rFBsRKSd!Ez`|NJv;a5FHVA z5cphTatGp?IA9Nx8ibH9U`9%bX=Qrwd_>~m=|O@8p`yJb#PPdk_e3PbrxbRH-qgd% zoDEp2OJy#b5^A;3)6es252$3EIg^zub;0ZfEE!28H>({Z8SjT3s;%rG#~YWP6n;#5 zVzUBi6ojlS1?`yH2+)N3&-DKUcjYa39lFI^y3&m1-z8Vy8W;fC+MC^h7#=znI6)vP zYmB_T^>xFfKKWDbrm1AH)%)g|a@AxgWys5=zw&U)jwm^GAE7B$>!PRJj1#{|w&1H^bzAM6sZ z-?X(*7;|>g7V5vjam+X;1B6YzOe0Nh&~Fz6D7T!vR=UFJdwb}CU5lq~pD96aqz;>M zkD-KciWF`HoTRKS7AKG_5ZQ6tfQ9sUC8X~8=oEFsDZ2+o}w}^^jn+vA(04&=hSjAO9#?|19b2P&k;C zsDEa>q`lT1uHa(;rXibhM?mqO!wT4=gZW^;>;cP#VS9?Zc-kd*x19XA)$FW-#y@QJ zsHebU+Uj*pFM$;UR&?C^Z;@eHAnuZef4g`7w;Js~jsM?k6n}>9&(Qrx7Q6m?5=l1$ jlto)x!PR@^QrSkc#IIC8>n(vxe1MIWJ-qhZ<)8lsg@MSx literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt/static/description/Teams.PNG b/helpdesk_mgmt/static/description/Teams.PNG new file mode 100644 index 0000000000000000000000000000000000000000..0a0ae524c8794eb7bf82d20f15171512acd2da5e GIT binary patch literal 7615 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 Z71#8O3+tXX0vDAaBZFJ|rLeod{}=sx=|TVi literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt/static/description/Tickets01.PNG b/helpdesk_mgmt/static/description/Tickets01.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ad5a88b80590038e969711dd31019008949f4864 GIT binary patch literal 24697 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 O*6)YCf2F#gz5E}9!|fvg literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt/static/description/Tickets02.PNG b/helpdesk_mgmt/static/description/Tickets02.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ceff0f5dbfc3c69f0d1777478b81e276926089f8 GIT binary patch literal 17647 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 F{~LVmlVAV< literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt/static/description/Tickets03.PNG b/helpdesk_mgmt/static/description/Tickets03.PNG new file mode 100644 index 0000000000000000000000000000000000000000..adb728d4986e535c0b19f214f866c4652f9cbbeb GIT binary patch literal 20145 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 N22WQ%mvv4FO#pRKc|8CC literal 0 HcmV?d00001 diff --git a/helpdesk_mgmt/static/description/Tickets_Kanban.PNG b/helpdesk_mgmt/static/description/Tickets_Kanban.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a194660eb36c0a8fc18c235fce78c2284392b4aa GIT binary patch literal 19905 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 literal 0 HcmV?d00001 From 459c178ce15c230e67da7f9c8e1311c45bc16009 Mon Sep 17 00:00:00 2001 From: carlosDomatix Date: Thu, 30 May 2019 11:55:37 +0200 Subject: [PATCH 021/337] [ADD] Dashboard view and partner smartbutton (#2) * new: added a smartbutton to the res_partner form view in order for a given partner to access its tickets * fix: migration to py3.5 - removal of f-strings * chg: partner smartbutton - linked with active records by default !minor * [ADD] Dashboard view * travis fix * fix: beautified the example data xml !minor * fix: flake8'd the helpdesk_ticket_team file to be standaridized as per oca guidelines !minor * fix: removed duplicated helpdesk_ticket_action record id !minor * fix: beautified the helpdesk.ticket.tag views !minor --- helpdesk_mgmt/__manifest__.py | 2 + helpdesk_mgmt/controllers/__init__.py | 2 - helpdesk_mgmt/data/helpdesk_data.xml | 166 ++++++++---------- helpdesk_mgmt/models/__init__.py | 1 + helpdesk_mgmt/models/helpdesk_ticket.py | 7 + helpdesk_mgmt/models/helpdesk_ticket_team.py | 46 ++++- helpdesk_mgmt/models/res_partner.py | 49 ++++++ helpdesk_mgmt/readme/CONTRIBUTORS.rst | 1 + helpdesk_mgmt/tests/__init__.py | 2 + .../tests/test_helpdesk_ticket_team.py | 60 +++++++ helpdesk_mgmt/tests/test_res_partner.py | 44 +++++ .../views/helpdesk_dashboard_view.xml | 96 ++++++++++ helpdesk_mgmt/views/helpdesk_ticket_menu.xml | 4 +- .../views/helpdesk_ticket_stage_view.xml | 3 +- .../views/helpdesk_ticket_tag_view.xml | 93 +++++----- helpdesk_mgmt/views/helpdesk_ticket_view.xml | 17 +- helpdesk_mgmt/views/res_partner_view.xml | 19 ++ 17 files changed, 462 insertions(+), 150 deletions(-) create mode 100644 helpdesk_mgmt/models/res_partner.py create mode 100644 helpdesk_mgmt/tests/test_helpdesk_ticket_team.py create mode 100644 helpdesk_mgmt/tests/test_res_partner.py create mode 100644 helpdesk_mgmt/views/helpdesk_dashboard_view.xml create mode 100644 helpdesk_mgmt/views/res_partner_view.xml diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index 21c9bd7190..86fa3c8ff5 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -22,6 +22,7 @@ 'data/helpdesk_data.xml', 'security/helpdesk_security.xml', 'security/ir.model.access.csv', + 'views/res_partner_view.xml', 'views/helpdesk_ticket_templates.xml', 'views/helpdesk_ticket_menu.xml', 'views/helpdesk_ticket_team_view.xml', @@ -30,6 +31,7 @@ 'views/helpdesk_ticket_channel_view.xml', 'views/helpdesk_ticket_tag_view.xml', 'views/helpdesk_ticket_view.xml', + 'views/helpdesk_dashboard_view.xml', ], 'demo': [ 'demo/helpdesk_demo.xml', diff --git a/helpdesk_mgmt/controllers/__init__.py b/helpdesk_mgmt/controllers/__init__.py index 1a5178b282..69884d3bb0 100644 --- a/helpdesk_mgmt/controllers/__init__.py +++ b/helpdesk_mgmt/controllers/__init__.py @@ -1,4 +1,2 @@ -# -*- coding: utf-8 -*- - from . import main from . import myaccount diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml index 5d39bab63a..e0274070d9 100644 --- a/helpdesk_mgmt/data/helpdesk_data.xml +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -1,93 +1,79 @@ - - - - Helpdesk - Helps you handle your helpdesk security. - 9 - - - - - - - - - Ticket Assignment - - ${object.company_id.partner_id.email} - ${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' }) - ${object.partner_id.id} - - ${object.partner_id.lang} - -

Hello ${object.user_id.name},

-

The ticket ${object.number} has been assigned to you.

-
-
- - - Helpdesk Ticket Sequence - helpdesk.ticket.sequence - HT - 5 - - - - - 1 - New - True - False - - - - 2 - In Progress - False - False - - - - 3 - Awaiting - False - False - - - - 3 - Done - False - True - True - - - - 4 - Cancel - False - True - True - - - - - Web - - - - Email - - - - Phone - - - - Other - - -
+ + + Helpdesk + Helps you handle your helpdesk security. + 9 + + + + + + Ticket Assignment + + ${object.company_id.partner_id.email} + ${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' }) + ${object.partner_id.id} + + ${object.partner_id.lang} + +

Hello ${object.user_id.name},

+

The ticket ${object.number} has been assigned to you.

+
+
+ + + Helpdesk Ticket Sequence + helpdesk.ticket.sequence + HT + 5 + + + + 1 + New + True + False + + + 2 + In Progress + False + False + + + 3 + Awaiting + False + False + + + 3 + Done + False + True + True + + + 4 + Cancel + False + True + True + + + + Web + + + Email + + + Phone + + + Other + +
diff --git a/helpdesk_mgmt/models/__init__.py b/helpdesk_mgmt/models/__init__.py index 3764bd4d69..b5a807b63e 100644 --- a/helpdesk_mgmt/models/__init__.py +++ b/helpdesk_mgmt/models/__init__.py @@ -4,3 +4,4 @@ from . import helpdesk_ticket_channel from . import helpdesk_ticket_category from . import helpdesk_ticket_team +from . import res_partner diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index f84d877bc4..23dd32bf1b 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -18,9 +18,16 @@ def _get_default_stage_id(self): user_id = fields.Many2one( 'res.users', string='Assigned user',) + + @api.model + def _read_group_stage_ids(self, stages, domain, order): + stage_ids = self.env['helpdesk.ticket.stage'].search([]) + return stage_ids + stage_id = fields.Many2one( 'helpdesk.ticket.stage', string='Stage', + group_expand='_read_group_stage_ids', default=_get_default_stage_id, track_visibility='onchange', ) diff --git a/helpdesk_mgmt/models/helpdesk_ticket_team.py b/helpdesk_mgmt/models/helpdesk_ticket_team.py index 35364fe3f8..1c6abb6b4b 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_team.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_team.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import api, fields, models class HelpdeskTeam(models.Model): @@ -18,3 +18,47 @@ class HelpdeskTeam(models.Model): default=lambda self: self.env['res.company']._company_default_get( 'helpdesk.ticket') ) + + color = fields.Integer("Color Index", default=0) + + ticket_ids = fields.One2many( + 'helpdesk.ticket', + 'team_id', + string="Tickets") + + todo_ticket_ids = fields.One2many( + 'helpdesk.ticket', + 'team_id', + string="Todo tickets") + + todo_ticket_count = fields.Integer( + string="Number of tickets", + compute='_compute_todo_tickets') + + todo_ticket_count_unassigned = fields.Integer( + string="Number of tickets unassigned", + compute='_compute_todo_tickets') + + todo_ticket_count_unattended = fields.Integer( + string="Number of tickets unattended", + compute='_compute_todo_tickets') + + todo_ticket_count_high_priority = fields.Integer( + string="Number of tickets in high priority", + compute='_compute_todo_tickets') + + @api.depends('ticket_ids') + def _compute_todo_tickets(self): + for record in self: + record.todo_ticket_ids = record.ticket_ids.filtered( + lambda ticket: not ticket.closed) + record.todo_ticket_count = len(record.todo_ticket_ids) + record.todo_ticket_count_unassigned = len( + record.todo_ticket_ids.filtered( + lambda ticket: not ticket.user_id)) + record.todo_ticket_count_unattended = len( + record.todo_ticket_ids.filtered( + lambda ticket: ticket.unattended)) + record.todo_ticket_count_high_priority = len( + record.todo_ticket_ids.filtered( + lambda ticket: ticket.priority == '3')) diff --git a/helpdesk_mgmt/models/res_partner.py b/helpdesk_mgmt/models/res_partner.py new file mode 100644 index 0000000000..777ba8ded7 --- /dev/null +++ b/helpdesk_mgmt/models/res_partner.py @@ -0,0 +1,49 @@ +from odoo import fields, models + + +class Partner(models.Model): + _inherit = "res.partner" + + helpdesk_ticket_ids = fields.One2many( + comodel_name="helpdesk.ticket", + inverse_name="partner_id", + string="Related tickets", + ) + + helpdesk_ticket_count = fields.Integer( + compute="_compute_helpdesk_ticket_count", string="Ticket count" + ) + + helpdesk_ticket_active_count = fields.Integer( + compute="_compute_helpdesk_ticket_count", string="Ticket active count" + ) + + helpdesk_ticket_count_string = fields.Char( + compute="_compute_helpdesk_ticket_count", string="Tickets" + ) + + def _compute_helpdesk_ticket_count(self): + for record in self: + ticket_ids = self.env["helpdesk.ticket"].search( + [("partner_id", "child_of", record.id)] + ) + record.helpdesk_ticket_count = len(ticket_ids) + record.helpdesk_ticket_active_count = len( + ticket_ids.filtered(lambda ticket: not ticket.stage_id.closed) + ) + count_active = record.helpdesk_ticket_active_count + count = record.helpdesk_ticket_count + record.helpdesk_ticket_count_string = ( + "{} / {}".format(count_active, count) + ) + + def action_view_helpdesk_tickets(self): + return { + "name": self.name, + "view_type": "form", + "view_mode": "tree,form", + "res_model": "helpdesk.ticket", + "type": "ir.actions.act_window", + "domain": [("partner_id", "child_of", self.id)], + "context": self.env.context, + } diff --git a/helpdesk_mgmt/readme/CONTRIBUTORS.rst b/helpdesk_mgmt/readme/CONTRIBUTORS.rst index 0715fa4a28..571c544a23 100644 --- a/helpdesk_mgmt/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt/readme/CONTRIBUTORS.rst @@ -1,6 +1,7 @@ * `Domatix `_: * Carlos Mart??nez + * Catalin Airimitoaie * `Adaptive City `_: diff --git a/helpdesk_mgmt/tests/__init__.py b/helpdesk_mgmt/tests/__init__.py index 5b420011e0..a9c3be8140 100644 --- a/helpdesk_mgmt/tests/__init__.py +++ b/helpdesk_mgmt/tests/__init__.py @@ -1 +1,3 @@ from . import test_helpdesk_ticket +from . import test_helpdesk_ticket_team +from . import test_res_partner diff --git a/helpdesk_mgmt/tests/test_helpdesk_ticket_team.py b/helpdesk_mgmt/tests/test_helpdesk_ticket_team.py new file mode 100644 index 0000000000..6c9d239152 --- /dev/null +++ b/helpdesk_mgmt/tests/test_helpdesk_ticket_team.py @@ -0,0 +1,60 @@ +from odoo.tests import common + + +class TestHelpdeskTicketTeam(common.SavepointCase): + + @classmethod + def setUpClass(cls): + super(TestHelpdeskTicketTeam, cls).setUpClass() + helpdesk_ticket = cls.env['helpdesk.ticket'] + helpdesk_ticket_team = cls.env['helpdesk.ticket.team'] + cls.user_demo = cls.env.ref('base.user_demo') + cls.stage_closed = cls.env.ref('helpdesk.helpdesk_ticket_stage_done') + cls.team_id = helpdesk_ticket_team.create({ + 'name': "Team 1" + }) + cls.helpdesk_ticket_1 = helpdesk_ticket.create({ + 'name': "Ticket 1", + 'description': "Description", + 'team_id': cls.team_id.id, + 'priority': '3', + }) + cls.helpdesk_ticket_2 = helpdesk_ticket.create({ + 'name': "Ticket 2", + 'description': "Description", + 'team_id': cls.team_id.id, + 'user_id': cls.user_demo.id, + 'priority': '1', + }) + + def test_helpdesk_ticket_todo(self): + self.assertEqual(self.team_id.todo_ticket_count, + 2, + 'Helpdesk Ticket: Helpdesk ticket team should ' + 'have two tickets to do.') + self.assertEqual(self.team_id.todo_ticket_count_unassigned, + 1, + 'Helpdesk Ticket: Helpdesk ticket team should ' + 'have one tickets unassigned.') + self.assertEqual(self.team_id.todo_ticket_count_high_priority, + 1, + 'Helpdesk Ticket: Helpdesk ticket team should ' + 'have two tickets with high priority.') + self.assertEqual(self.team_id.todo_ticket_count_unattended, + 2, + 'Helpdesk Ticket: Helpdesk ticket team should ' + 'have two tickets unattended.') + + self.helpdesk_ticket_1.write({ + 'stage_id': self.stage_closed.id, + }) + + self.assertEqual(self.team_id.todo_ticket_count_unattended, + 1, + 'Helpdesk Ticket: Helpdesk ticket team should ' + 'have one ticket unattended.') + + self.assertEqual(self.team_id.todo_ticket_count, + 1, + 'Helpdesk Ticket: Helpdesk ticket team should ' + 'have one ticket to do.') diff --git a/helpdesk_mgmt/tests/test_res_partner.py b/helpdesk_mgmt/tests/test_res_partner.py new file mode 100644 index 0000000000..d1a728d440 --- /dev/null +++ b/helpdesk_mgmt/tests/test_res_partner.py @@ -0,0 +1,44 @@ +from odoo.tests.common import SavepointCase + + +class TestPartner(SavepointCase): + def setUp(self): + super(TestPartner, self).setUp() + self.partner_obj = self.env["res.partner"] + self.ticket_obj = self.env["helpdesk.ticket"] + self.stage_id_closed = self.env.ref( + "helpdesk.helpdesk_ticket_stage_done") + self.parent_id = self.partner_obj.create({"name": "Parent 1"}) + self.child_id_1 = self.partner_obj.create({"name": "Child 1"}) + self.child_id_2 = self.partner_obj.create({"name": "Child 2"}) + self.child_id_3 = self.partner_obj.create({"name": "Child 3"}) + self.tickets = [] + self.parent_id.child_ids = [ + (4, self.child_id_1.id), + (4, self.child_id_2.id), + (4, self.child_id_3.id), + ] + for i in [69, 155, 314, 420]: + self.tickets.append( + self.ticket_obj.create( + { + "name": "Nice ticket {}".format(i), + "description": "Nice ticket {} description".format(i), + } + ) + ) + self.parent_id.helpdesk_ticket_ids = [(4, self.tickets[0].id)] + self.child_id_1.helpdesk_ticket_ids = [(4, self.tickets[1].id)] + self.child_id_2.helpdesk_ticket_ids = [(4, self.tickets[2].id)] + self.child_id_3.helpdesk_ticket_ids = [(4, self.tickets[3].id)] + self.child_id_3.helpdesk_ticket_ids[-1].stage_id = self.stage_id_closed + + def test_ticket_count(self): + self.assertEqual(self.parent_id.helpdesk_ticket_count, 4) + + def test_ticket_active_count(self): + self.assertEqual(self.parent_id.helpdesk_ticket_active_count, 3) + + def test_ticket_string(self): + + self.assertEqual(self.parent_id.helpdesk_ticket_count_string, "3 / 4") diff --git a/helpdesk_mgmt/views/helpdesk_dashboard_view.xml b/helpdesk_mgmt/views/helpdesk_dashboard_view.xml new file mode 100644 index 0000000000..b9ac7daa61 --- /dev/null +++ b/helpdesk_mgmt/views/helpdesk_dashboard_view.xml @@ -0,0 +1,96 @@ + + + + + helpdesk.ticket.team.kanban + helpdesk.ticket.team + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ View +
+ + +
+ +
+
+
+
    +
+
+ + +
+
+
+
+
+
+
+
+
diff --git a/helpdesk_mgmt/views/helpdesk_ticket_menu.xml b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml index 7bc3aff5d2..afcd4a21db 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_menu.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml @@ -7,7 +7,7 @@ Dashboard ir.actions.act_window helpdesk.ticket.team - kanban,tree,form + kanban,tree,form,pivot form @@ -15,7 +15,7 @@ Tickets ir.actions.act_window helpdesk.ticket - tree,form,kanban + tree,kanban,form,pivot form diff --git a/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml index 78af0a8944..8e2ee07377 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_stage_view.xml @@ -58,4 +58,5 @@ - \ No newline at end of file + + diff --git a/helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml index 0f55a8bd5d..16e6b43541 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_tag_view.xml @@ -1,50 +1,49 @@ - - - helpdesk.ticket.tag.search - helpdesk.ticket.tag - - - - - - - - - - - helpdesk.ticket.tag.form - helpdesk.ticket.tag - - -
+ + helpdesk.ticket.tag.search + helpdesk.ticket.tag + + + + + + + + + + helpdesk.ticket.tag.form + helpdesk.ticket.tag + + +
- -
- -
-
-
- - - -
- -
-
- - - helpdesk.ticket.tag.tree - helpdesk.ticket.tag - - - - - - - \ No newline at end of file + +
+ +
+
+
+ + + +
+ + + + + helpdesk.ticket.tag.tree + helpdesk.ticket.tag + + + + + + + diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml index 44c3e7eff6..738e2d7f5a 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -1,5 +1,15 @@ + + Helpdesk Ticket + helpdesk.ticket + kanban,tree,form + + {'default_helpdesk_ticket_team_id': active_id} + + [('team_id', '=', active_id)] + + helpdesk.ticket.view.search helpdesk.ticket @@ -200,11 +210,4 @@ - - Tickets - ir.actions.act_window - helpdesk.ticket - tree,kanban,form,pivot - form - diff --git a/helpdesk_mgmt/views/res_partner_view.xml b/helpdesk_mgmt/views/res_partner_view.xml new file mode 100644 index 0000000000..db8b752844 --- /dev/null +++ b/helpdesk_mgmt/views/res_partner_view.xml @@ -0,0 +1,19 @@ + + + + + view_partner_form + res.partner + + +
+ +
+
+
+ +
From 1d609a81aa90910581282b23f1756a02787b9174 Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Mon, 17 Jun 2019 09:19:38 +0200 Subject: [PATCH 022/337] [ADD] Mail integration methods (#5) --- helpdesk_mgmt/models/helpdesk_ticket.py | 67 ++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 23dd32bf1b..a6ee535883 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -1,9 +1,10 @@ -from odoo import _, api, fields, models +from odoo import _, api, fields, models, tools class HelpdeskTicket(models.Model): _name = 'helpdesk.ticket' + _description = 'Helpdesk Ticket' _rec_name = 'number' _order = 'number desc' _inherit = ['mail.thread', 'mail.activity.mixin'] @@ -135,3 +136,67 @@ def _track_template(self, tracking): {"composition_mode": "mass_mail"}) return res + + @api.model + def message_new(self, msg, custom_values=None): + """ Override message_new from mail gateway so we can set correct + default values. + """ + if custom_values is None: + custom_values = {} + defaults = { + 'name': msg.get('subject') or _("No Subject"), + 'description': msg.get('body'), + 'partner_email': msg.get('from'), + 'partner_id': msg.get('author_id') + } + defaults.update(custom_values) + + # Write default values coming from msg + ticket = super().message_new(msg, custom_values=defaults) + + # Use mail gateway tools to search for partners to subscribe + email_list = tools.email_split( + (msg.get('to') or '') + ',' + (msg.get('cc') or '') + ) + partner_ids = [p for p in ticket._find_partner_from_emails( + email_list, force_create=False + ) if p] + ticket.message_subscribe(partner_ids) + + return ticket + + @api.multi + def message_update(self, msg, update_vals=None): + """ Override message_update to subscribe partners """ + email_list = tools.email_split( + (msg.get('to') or '') + ',' + (msg.get('cc') or '') + ) + partner_ids = [p for p in self._find_partner_from_emails( + email_list, force_create=False + ) if p] + self.message_subscribe(partner_ids) + return super().message_update(msg, update_vals=update_vals) + + @api.multi + def message_get_suggested_recipients(self): + recipients = super().message_get_suggested_recipients() + + for ticket in self: + reason = _('Partner Email') \ + if ticket.partner_id and ticket.partner_id.email \ + else _('Partner Id') + + if ticket.partner_id and ticket.partner_id.email: + ticket._message_add_suggested_recipient( + recipients, + partner=ticket.partner_id, + reason=reason + ) + elif ticket.partner_email: + ticket._message_add_suggested_recipient( + recipients, + email=ticket.partner_email, + reason=reason + ) + return recipients From c7944bb7b280ba61edb1b8eb94c3e29a1d61128b Mon Sep 17 00:00:00 2001 From: Daniel <35925814+DaniKL@users.noreply.github.com> Date: Mon, 17 Jun 2019 15:34:09 +0200 Subject: [PATCH 023/337] Added early translation (#8) --- helpdesk_mgmt/i18n/es.po | 748 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 748 insertions(+) create mode 100644 helpdesk_mgmt/i18n/es.po diff --git a/helpdesk_mgmt/i18n/es.po b/helpdesk_mgmt/i18n/es.po new file mode 100644 index 0000000000..1155bb8c96 --- /dev/null +++ b/helpdesk_mgmt/i18n/es.po @@ -0,0 +1,748 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * helpdesk_mgmt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-06-17 08:43+0000\n" +"PO-Revision-Date: 2019-06-17 11:25+0200\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"Language: es\n" +"X-Generator: Poedit 2.0.6\n" + +#. module: helpdesk_mgmt +#: model:mail.template,subject:helpdesk_mgmt.assignment_email_template +msgid "${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' })" +msgstr "${object.company_id.name} Recibo de Pago (Ref ${object.name or 'n/a' })" + +#. module: helpdesk_mgmt +#: model:mail.template,body_html:helpdesk_mgmt.assignment_email_template +msgid "" +"\n" +"

Hello ${object.user_id.name},

\n" +"

The ticket ${object.number} has been assigned to you.

\n" +"
" +msgstr "" +"\n" +"

Hello ${object.user_id.name},

\n" +"

The ticket ${object.number} has been assigned to you.

\n" +"
" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "" +"
\n" +" Category:" +msgstr "" +"
\n" +" Categor??a:" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "" +"
\n" +" Stage:" +msgstr "" +"
\n" +" Estado:" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +msgid "View" +msgstr "Ver" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "Date:" +msgstr "Fecha:" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "Last Stage Update:" +msgstr "??ltima actualizaci??n de estado:" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_active +msgid "Active" +msgstr "Activo" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:56 +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#, python-format +msgid "All" +msgstr "Todos" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_category_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_channel_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +msgid "Archived" +msgstr "Archivado" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Assign to me" +msgstr "Asignar a mi" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_assigned_date +msgid "Assigned Date" +msgstr "Fecha de asignaci??n" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_user_id +msgid "Assigned user" +msgstr "Usuario asignado" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Attachments" +msgstr "Adjuntos" + +#. module: helpdesk_mgmt +#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_awaiting +msgid "Awaiting" +msgstr "En espera" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "By" +msgstr "Por" + +#. module: helpdesk_mgmt +#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_cancel +msgid "Cancel" +msgstr "Cancelar" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_category_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_category_menu +msgid "Categories" +msgstr "Categor??as" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_category_ids +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Category" +msgstr "Categor??a" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id +msgid "Channel" +msgstr "Canal" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_channel_id +msgid "Channel indicates where the source of a ticketcomes from (it could be a phone call, an email...)" +msgstr "El Canal indica el origen del que procede un ticket (podr??a ser una llamada telef??nica, un email...)" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_channel_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_channel_menu +msgid "Channels" +msgstr "Canales" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Close Date" +msgstr "Fecha de cierre" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_closed +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_closed +msgid "Closed" +msgstr "Cerrado" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_closed_date +msgid "Closed Date" +msgstr "Fecha de cierre" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_color +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_color +msgid "Color Index" +msgstr "??ndice de color" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_company_id +msgid "Company" +msgstr "Compa????a" + +#. module: helpdesk_mgmt +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_config_main_menu +msgid "Configuration" +msgstr "Configuraci??n" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Create Date" +msgstr "Fecha de creaci??n" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_create_date +msgid "Created on" +msgstr "Creado en" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_dashboard_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_dashboard_menu +msgid "Dashboard" +msgstr "Tablero" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_description +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_description +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Description" +msgstr "Descripci??n" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: helpdesk_mgmt +#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_done +msgid "Done" +msgstr "Hecho" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_mail_template_id +msgid "Email Template" +msgstr "Plantilla de correo electr??nico" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_fold +msgid "Folded in Kanban" +msgstr "Plegado en vista kanban" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Future Activities" +msgstr "Actividades futuras" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: helpdesk_mgmt +#: model:ir.module.category,name:helpdesk_mgmt.module_helpdesk_category +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_main_menu +msgid "Helpdesk" +msgstr "Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_category_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_channel_search +msgid "Helpdesk Category Search" +msgstr "Buscar categor??a Helpdesk" + +#. module: helpdesk_mgmt +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_manager +msgid "Helpdesk Manager" +msgstr "Manager Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +msgid "Helpdesk Team Search" +msgstr "Buscar equipo Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Helpdesk Ticket" +msgstr "Ticket Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_category +msgid "Helpdesk Ticket Category" +msgstr "Categor??a de ticket Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_channel +msgid "Helpdesk Ticket Channel" +msgstr "Canal de ticket Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_stage +msgid "Helpdesk Ticket Stage" +msgstr "Estado de ticket Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_tag +msgid "Helpdesk Ticket Tag" +msgstr "Etiqueta de ticket Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_team +msgid "Helpdesk Ticket Team" +msgstr "Equipo de ticket Helpdesk" + +#. module: helpdesk_mgmt +#: model:ir.module.category,description:helpdesk_mgmt.module_helpdesk_category +msgid "Helps you handle your helpdesk_mgmt security." +msgstr "Ayuda a manejar tu seguridad de Helpdesk." + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:66 +#: selection:helpdesk_mgmt.ticket,priority:0 +#, python-format +msgid "High" +msgstr "Alta" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "High Priority" +msgstr "Prioridad alta" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "History" +msgstr "Historial" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id_13495 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id_13485 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id_13464 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id_13514 +msgid "ID" +msgstr "ID (identificaci??n)" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_mail_template_id +msgid "If set an email will be sent to the customer when the ticketreaches this step." +msgstr "Si est?? establecido, se enviar?? un email al cliente cuando el ticket alcance este estado." + +#. module: helpdesk_mgmt +#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_in_progress +msgid "In Progress" +msgstr "En progreso" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team___last_update +msgid "Last Modified on" +msgstr "??ltima modificaci??n en" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:53 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_last_stage_update +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Last Stage Update" +msgstr "??ltima actualizaci??n de la etapa" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_write_uid +msgid "Last Updated by" +msgstr "??ltima actualizaci??n de" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_write_date +msgid "Last Updated on" +msgstr "??ltima actualizaci??n en" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Last Week" +msgstr "??ltima Semana" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Late Activities" +msgstr "Actividades tard??as" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:64 +#: selection:helpdesk_mgmt.ticket,priority:0 +#, python-format +msgid "Low" +msgstr "Baja" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_attachment_ids +msgid "Media Attachments" +msgstr "Archivos adjuntos" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:65 +#: selection:helpdesk_mgmt.ticket,priority:0 +#, python-format +msgid "Medium" +msgstr "Media" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_user_ids +msgid "Members" +msgstr "Miembros" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Activities" +msgstr "Mis actividades" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Followed Tickets" +msgstr "Tickets que sigo" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Tickets" +msgstr "Mis tickets" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:51 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_name +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Name" +msgstr "Nombre" + +#. module: helpdesk_mgmt +#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_new +msgid "New" +msgstr "Nuevo" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:50 +#, python-format +msgid "Newest" +msgstr "M??s nuevo" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:148 +#, python-format +msgid "No Subject" +msgstr "Sin asunto" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count +msgid "Number of tickets" +msgstr "N??mero de tickets" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_high_priority +msgid "Number of tickets in high priority" +msgstr "N??mero de tickets en prioridad alta" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_unassigned +msgid "Number of tickets unassigned" +msgstr "N??mero de tickets sin asignar" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_unattended +msgid "Number of tickets unattended" +msgstr "N??mero de tickets sin atender" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Open" +msgstr "Abierto" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Other Information" +msgstr "Otra informaci??n" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Partner" +msgstr "Empresa" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:186 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_email +#, python-format +msgid "Partner Email" +msgstr "Email del cliente" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:188 +#, python-format +msgid "Partner Id" +msgstr "ID de cliente" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_name +msgid "Partner Name" +msgstr "Nombre de la empresa" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_views_pivot +msgid "Pivot Analysis" +msgstr "An??lisis pivot" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_priority +msgid "Priority" +msgstr "Prioridad" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_ids +msgid "Related tickets" +msgstr "Tickets relacionados" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_reporting_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_reporting_menu +msgid "Reporting" +msgstr "Informes" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Show all records which has next action date is before today" +msgstr "Mostrar todos los registros que tienen la pr??xima fecha de acci??n antes de hoy" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:52 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Stage" +msgstr "Etapa" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_name +msgid "Stage Name" +msgstr "Nombre de la etapa" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_stage_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_stage_menu +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_category_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_channel_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_team_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_form +msgid "Stages" +msgstr "Etapas" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_ids +msgid "Tag" +msgstr "Tag" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_form +msgid "Tags" +msgstr "Etiquetas" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_category_tree +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_channel_tree +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_team_tree +msgid "Team" +msgstr "Equipo" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_team_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_team_menu +msgid "Teams" +msgstr "Equipos" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "There are no tickets in your account." +msgstr "No hay tickets en tu cuenta." + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_fold +msgid "This stage is folded in the kanban view when there are no records in that stage to display." +msgstr "Esta etapa se repliega en la vista kanban cuando no hay registros para mostrar en la misma." + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_search +msgid "Ticket Stage Search" +msgstr "Buscar estado de ticket" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_tree +msgid "Ticket Stages" +msgstr "Estados de ticket" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_search +msgid "Ticket Tag Search" +msgstr "Buscar etiqueta de ticket" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_tag_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_tag_menu +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_tree +msgid "Ticket Tags" +msgstr "Etiquetas de ticket" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_active_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_active_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_active_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_active_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_active_count +msgid "Ticket active count" +msgstr "Cantidad de tickets activos" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count +msgid "Ticket count" +msgstr "Cantidad de tickets" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_number +msgid "Ticket number" +msgstr "N??mero de ticket" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_action +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_count_string +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_count_string +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_count_string +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count_string +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count_string +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_menu +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_reporting_analysis +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_layout +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_home +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Tickets" +msgstr "Tickets" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_name +msgid "Title" +msgstr "T??tulo" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +msgid "To Do" +msgstr "Por hacer" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Today Activities" +msgstr "Actividades de Hoy" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_ids +msgid "Todo tickets" +msgstr "Todo tickets" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Unassigned" +msgstr "No asignado" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_unattended +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_unattended +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Unattended" +msgstr "Sin atender" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_user +msgid "User" +msgstr "Usuario" + +#. module: helpdesk_mgmt +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_user_own +msgid "User: Personal tickets" +msgstr "Usuario: Tickets personales" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:67 +#: selection:helpdesk_mgmt.ticket,priority:0 +#, python-format +msgid "Very High" +msgstr "Muy alta" From 48906753d6055979b3e3ca77d13b38c3095b9001 Mon Sep 17 00:00:00 2001 From: alvaroDomatix <47738372+alvaroDomatix@users.noreply.github.com> Date: Fri, 21 Jun 2019 09:20:49 +0200 Subject: [PATCH 024/337] [FIX] Minor changes. (#6) * [FIX] Minor changes. * fix minor changes * fix 'cancelled' string * fix team_id and user_id behavior * fix travis --- helpdesk_mgmt/data/helpdesk_data.xml | 4 ++-- helpdesk_mgmt/demo/helpdesk_demo.xml | 2 +- helpdesk_mgmt/models/helpdesk_ticket.py | 20 ++++++++++++++++++++ helpdesk_mgmt/readme/CONTRIBUTORS.rst | 3 ++- helpdesk_mgmt/views/helpdesk_ticket_view.xml | 9 ++++++--- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml index e0274070d9..dd0819b69d 100644 --- a/helpdesk_mgmt/data/helpdesk_data.xml +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -55,9 +55,9 @@ True True - + 4 - Cancel + Cancelled False True True diff --git a/helpdesk_mgmt/demo/helpdesk_demo.xml b/helpdesk_mgmt/demo/helpdesk_demo.xml index c58c714c05..1884545e48 100644 --- a/helpdesk_mgmt/demo/helpdesk_demo.xml +++ b/helpdesk_mgmt/demo/helpdesk_demo.xml @@ -103,7 +103,7 @@ - + diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index a6ee535883..0eeafb72c2 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -20,6 +20,11 @@ def _get_default_stage_id(self): 'res.users', string='Assigned user',) + user_ids = fields.Many2many( + comodel_name='res.users', + related='team_id.user_ids', + string='Users') + @api.model def _read_group_stage_ids(self, stages, domain, order): stage_ids = self.env['helpdesk.ticket.stage'].search([]) @@ -84,6 +89,21 @@ def _onchange_partner_id(self): self.partner_name = self.partner_id.name self.partner_email = self.partner_id.email + @api.multi + @api.onchange('team_id', 'user_id') + def _onchange_dominion_user_id(self): + if self.user_id: + if self.user_id and self.user_ids and \ + self.user_id not in self.user_ids: + self.update({ + 'user_id': False + }) + return {'domain': {'user_id': []}} + if self.team_id: + return {'domain': {'user_id': [('id', 'in', self.user_ids.ids)]}} + else: + return {'domain': {'user_id': []}} + # --------------------------------------------------- # CRUD # --------------------------------------------------- diff --git a/helpdesk_mgmt/readme/CONTRIBUTORS.rst b/helpdesk_mgmt/readme/CONTRIBUTORS.rst index 571c544a23..40253d2ce8 100644 --- a/helpdesk_mgmt/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt/readme/CONTRIBUTORS.rst @@ -1,7 +1,8 @@ * `Domatix `_: * Carlos Mart??nez - * Catalin Airimitoaie + * Catalin Airimitoaie + * ??lvaro L??pez * `Adaptive City `_: diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml index 738e2d7f5a..ff46e39b5d 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -74,11 +74,14 @@
- - + + + + - + + From f6b812a305b31fddfd0de487b37272c351cf299d Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 27 Jun 2019 17:44:12 +0200 Subject: [PATCH 025/337] [IMP] helpdesk_mgmt: Fine-tuning for merging * Development status * Put some XML-ID references in XML files not fully qualified for avoiding problems. * Change XML-ID reference new module in code. * Invalid fields in demo data * README * Contributor --- helpdesk_mgmt/README.rst | 152 +++++++++++++++-- helpdesk_mgmt/__manifest__.py | 3 +- helpdesk_mgmt/data/helpdesk_data.xml | 2 +- helpdesk_mgmt/demo/helpdesk_demo.xml | 2 - helpdesk_mgmt/models/helpdesk_ticket.py | 2 +- helpdesk_mgmt/readme/CONFIGURE.rst | 15 +- helpdesk_mgmt/readme/CONTRIBUTORS.rst | 4 + helpdesk_mgmt/readme/USAGE.rst | 6 +- helpdesk_mgmt/security/helpdesk_security.xml | 14 +- helpdesk_mgmt/security/ir.model.access.csv | 36 ++-- helpdesk_mgmt/static/description/index.html | 161 +++++++++++++++--- helpdesk_mgmt/tests/test_helpdesk_ticket.py | 4 +- .../tests/test_helpdesk_ticket_team.py | 4 +- helpdesk_mgmt/tests/test_res_partner.py | 2 +- helpdesk_mgmt/views/helpdesk_ticket_menu.xml | 6 +- 15 files changed, 326 insertions(+), 87 deletions(-) diff --git a/helpdesk_mgmt/README.rst b/helpdesk_mgmt/README.rst index 11e2946e2b..87611f9de3 100644 --- a/helpdesk_mgmt/README.rst +++ b/helpdesk_mgmt/README.rst @@ -1,23 +1,29 @@ -======== -Helpdesk -======== +=================== +Helpdesk Management +=================== .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png :target: https://odoo-community.org/page/development-status - :alt: Beta + :alt: Alpha .. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-aitorbouzas%2Fhelpdesk-lightgray.png?logo=github - :target: https://github.com/aitorbouzas/helpdesk/tree/11.0/helpdesk - :alt: aitorbouzas/helpdesk - -|badge1| |badge2| |badge3| +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhelpdesk-lightgray.png?logo=github + :target: https://github.com/OCA/helpdesk/tree/11.0/helpdesk_mgmt + :alt: OCA/helpdesk +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/helpdesk-11-0/helpdesk-11-0-helpdesk_mgmt + :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/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds Helpdesk functionality in Odoo. @@ -26,18 +32,118 @@ This module adds Helpdesk functionality in Odoo. .. contents:: :local: +Configuration +============= + +To configure this module, you need to: +#. Edit or create new channels. +#. Edit or create new categories. +#. Edit or create new stages. +#. Edit or create new teams. +#. Edit or create new tags. + +Channels +~~~~~~~~ + +#. Go to *Helpdesk > Configuration > Channels* to edit or create new channels. +#. Edit or create a channel. +#. Set the name for the channel. +#. You can also Activate or Deactivate channels. + +.. figure:: https://raw.githubusercontent.com/OCA/helpdesk/11.0/helpdesk_mgmt/static/description/Channels.PNG + :alt: Channels + :width: 600 px + +Categories +~~~~~~~~~~ + +#. Go to *Helpdesk > Configuration > Categories* to edit or create new categories. +#. Edit or create a new category. +#. Set the name for the category. +#. You can also Activate or Deactivate categories. + +.. figure:: https://raw.githubusercontent.com/OCA/helpdesk/11.0/helpdesk_mgmt/static/description/Categories.PNG + :alt: Categories + :width: 600 px + +Stages +~~~~~~ + +#. Go to *Helpdesk > Configuration > Stages* to edit or create new stages. +#. Edit or create a new stage. +#. Set the name for the stage. +#. Set the sequence order for the stage. +#. You can select an Email template. +#. Mark the Unattended checkbox if the stage contains unattended tickets. +#. Mark the Closed checkbox if the stage contains closed tickets. +#. You can add a description for the stage. +#. You can also Activate or Deactivate stages. + +.. figure:: https://raw.githubusercontent.com/OCA/helpdesk/11.0/helpdesk_mgmt/static/description/Stages.PNG + :alt: Stages + :width: 600 px + +You can also sort the stage sequence if you move up or down the stages in the list view. + +Teams +~~~~~ + +#. Go to *Helpdesk > Configuration > Teams* to edit or create new teams. +#. Edit or create a new team. +#. Set the name for the team. +#. Add the teams members. +#. You can also Activate or Deactivate teams. + +.. figure:: https://raw.githubusercontent.com/OCA/helpdesk/11.0/helpdesk_mgmt/static/description/Teams.PNG + :alt: Teams + :width: 600 px + +Tags +~~~~ + +#. Go to *Helpdesk > Configuration > Ticket Tags* to edit or create new tags. +#. Edit or create a new tag. +#. Set the name for the tag. +#. Set the color index for the tag. +#. You can also Activate or Deactivate tags. + +.. figure:: https://raw.githubusercontent.com/OCA/helpdesk/11.0/helpdesk_mgmt/static/description/Tags.PNG + :alt: Ticket Tags + :width: 600 px + Usage ===== -* Go to... +#. Go to *Helpdesk* or *Helpdesk > Dashboard* to see the tickets dashboard +#. In the Kanban view, click in the kanban card of a team to see their tickets and create new ones. + +.. figure:: https://raw.githubusercontent.com/OCA/helpdesk/11.0/helpdesk_mgmt/static/description/Tickets_Kanban.PNG + :alt: Kanban view + :width: 600 px + +To create a new ticket from the kanban view: + +#. Press *Create* button or click on the plus icon at the top of the column of a stage. +#. Set the name or subject for the ticket. +#. Select the team that will manage the ticket. +#. You can select a user to assign the ticket. +#. Set the priority of the ticket. +#. Select the partner, and you can also set the partner name and email. +#. You can select a category and set tags for the ticket. +#. Add a description. +#. You can also attach files to the ticket. + +.. figure:: https://raw.githubusercontent.com/OCA/helpdesk/11.0/helpdesk_mgmt/static/description/Tickets01.PNG + :alt: Create a new ticket + :width: 600 px Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +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. @@ -59,6 +165,8 @@ Contributors * `Domatix `_: * Carlos Mart??nez + * Catalin Airimitoaie + * ??lvaro L??pez * `Adaptive City `_: @@ -77,9 +185,23 @@ Contributors * Mar??a Alhambra +* `Tecnativa `_: + + * Pedro M. Baeza + Maintainers ~~~~~~~~~~~ -This module is part of the `aitorbouzas/helpdesk `_ project on GitHub. +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. +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index 86fa3c8ff5..931e570ff1 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -1,7 +1,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Helpdesk', + 'name': 'Helpdesk Management', 'summary': """ Helpdesk""", 'version': '11.0.1.0.0', @@ -36,6 +36,7 @@ 'demo': [ 'demo/helpdesk_demo.xml', ], + 'development_status': 'Alpha', 'application': True, 'installable': True, } diff --git a/helpdesk_mgmt/data/helpdesk_data.xml b/helpdesk_mgmt/data/helpdesk_data.xml index dd0819b69d..aadbe287b7 100644 --- a/helpdesk_mgmt/data/helpdesk_data.xml +++ b/helpdesk_mgmt/data/helpdesk_data.xml @@ -11,7 +11,7 @@ Ticket Assignment - + ${object.company_id.partner_id.email} ${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' }) ${object.partner_id.id} diff --git a/helpdesk_mgmt/demo/helpdesk_demo.xml b/helpdesk_mgmt/demo/helpdesk_demo.xml index 1884545e48..d1143a3e08 100644 --- a/helpdesk_mgmt/demo/helpdesk_demo.xml +++ b/helpdesk_mgmt/demo/helpdesk_demo.xml @@ -135,8 +135,6 @@ - - diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 0eeafb72c2..30075b35c0 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -77,7 +77,7 @@ def _read_group_stage_ids(self, stages, domain, order): string="Media Attachments") def send_user_mail(self): - self.env.ref('helpdesk.assignment_email_template'). \ + self.env.ref('helpdesk_mgmt.assignment_email_template'). \ send_mail(self.id) def assign_to_me(self): diff --git a/helpdesk_mgmt/readme/CONFIGURE.rst b/helpdesk_mgmt/readme/CONFIGURE.rst index 2ec1064659..9d5a73211f 100644 --- a/helpdesk_mgmt/readme/CONFIGURE.rst +++ b/helpdesk_mgmt/readme/CONFIGURE.rst @@ -5,9 +5,8 @@ To configure this module, you need to: #. Edit or create new teams. #. Edit or create new tags. -------------------- Channels -------------------- +~~~~~~~~ #. Go to *Helpdesk > Configuration > Channels* to edit or create new channels. #. Edit or create a channel. @@ -18,9 +17,8 @@ Channels :alt: Channels :width: 600 px -------------------- Categories -------------------- +~~~~~~~~~~ #. Go to *Helpdesk > Configuration > Categories* to edit or create new categories. #. Edit or create a new category. @@ -31,9 +29,8 @@ Categories :alt: Categories :width: 600 px -------------------- Stages -------------------- +~~~~~~ #. Go to *Helpdesk > Configuration > Stages* to edit or create new stages. #. Edit or create a new stage. @@ -51,9 +48,8 @@ Stages You can also sort the stage sequence if you move up or down the stages in the list view. -------------------- Teams -------------------- +~~~~~ #. Go to *Helpdesk > Configuration > Teams* to edit or create new teams. #. Edit or create a new team. @@ -65,9 +61,8 @@ Teams :alt: Teams :width: 600 px -------------------- Tags -------------------- +~~~~ #. Go to *Helpdesk > Configuration > Ticket Tags* to edit or create new tags. #. Edit or create a new tag. diff --git a/helpdesk_mgmt/readme/CONTRIBUTORS.rst b/helpdesk_mgmt/readme/CONTRIBUTORS.rst index 40253d2ce8..7df07607da 100644 --- a/helpdesk_mgmt/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt/readme/CONTRIBUTORS.rst @@ -20,3 +20,7 @@ * `Factor Libre `_: * Mar??a Alhambra + +* `Tecnativa `_: + + * Pedro M. Baeza diff --git a/helpdesk_mgmt/readme/USAGE.rst b/helpdesk_mgmt/readme/USAGE.rst index 270ab7660e..9f22d3ff0e 100644 --- a/helpdesk_mgmt/readme/USAGE.rst +++ b/helpdesk_mgmt/readme/USAGE.rst @@ -5,8 +5,9 @@ :alt: Kanban view :width: 600 px -To create a new ticket from the kanban view... -#. Press the *Create* button or click on the plus icon at the top of the column of a stage. +To create a new ticket from the kanban view: + +#. Press *Create* button or click on the plus icon at the top of the column of a stage. #. Set the name or subject for the ticket. #. Select the team that will manage the ticket. #. You can select a user to assign the ticket. @@ -19,4 +20,3 @@ To create a new ticket from the kanban view... .. figure:: ../static/description/Tickets01.PNG :alt: Create a new ticket :width: 600 px - diff --git a/helpdesk_mgmt/security/helpdesk_security.xml b/helpdesk_mgmt/security/helpdesk_security.xml index 024e033309..8862ae26b9 100644 --- a/helpdesk_mgmt/security/helpdesk_security.xml +++ b/helpdesk_mgmt/security/helpdesk_security.xml @@ -4,20 +4,20 @@ User: Personal tickets - + User - - + + Helpdesk Manager - - + + @@ -30,7 +30,7 @@ Personal Tickets ['|',('user_id','=',user.id),('user_id','=',False)] - + @@ -79,7 +79,7 @@ Portal Personal Tickets - + [('message_partner_ids','child_of',[user.commercial_partner_id.id])] diff --git a/helpdesk_mgmt/security/ir.model.access.csv b/helpdesk_mgmt/security/ir.model.access.csv index 3027a76ebc..a018051f5e 100644 --- a/helpdesk_mgmt/security/ir.model.access.csv +++ b/helpdesk_mgmt/security/ir.model.access.csv @@ -1,19 +1,19 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_helpdesk_ticket_manager,helpdesk.ticket.manager,helpdesk.model_helpdesk_ticket,group_helpdesk_manager,1,1,1,1 -access_helpdesk_ticket_user,helpdesk.ticket.user,helpdesk.model_helpdesk_ticket,group_helpdesk_user,1,1,1,0 -access_helpdesk_ticket_user_personal,helpdesk.ticket.user.personal,helpdesk.model_helpdesk_ticket,group_helpdesk_user_own,1,1,1,0 -access_helpdesk_ticket_portal,helpdesk.ticket.portal,helpdesk.model_helpdesk_ticket,base.group_portal,1,0,0,0 -access_helpdesk_ticket_stage_manager,helpdesk.ticket.stage.manager,helpdesk.model_helpdesk_ticket_stage,group_helpdesk_manager,1,1,1,1 -access_helpdesk_ticket_stage_user,helpdesk.ticket.stage.user,helpdesk.model_helpdesk_ticket_stage,base.group_user,1,0,0,0 -access_helpdesk_ticket_stage_portal,helpdesk.ticket.stage.portal,helpdesk.model_helpdesk_ticket_stage,base.group_portal,1,1,0,0 -access_helpdesk_ticket_stage_public,helpdesk.ticket.stage.public,helpdesk.model_helpdesk_ticket_stage,base.group_public,1,1,0,0 -access_helpdesk_ticket_tag_manager,helpdesk.ticket.tag.manager,helpdesk.model_helpdesk_ticket_tag,group_helpdesk_manager,1,1,1,1 -access_helpdesk_ticket_tag_user,helpdesk.ticket.tag.user,helpdesk.model_helpdesk_ticket_tag,base.group_user,1,0,0,0 -access_helpdesk_ticket_team_manager,helpdesk.ticket.team.manager,helpdesk.model_helpdesk_ticket_team,group_helpdesk_manager,1,1,1,1 -access_helpdesk_ticket_team_user,helpdesk.ticket.team.user,helpdesk.model_helpdesk_ticket_team,base.group_user,1,0,0,0 -access_helpdesk_ticket_channel_manager,helpdesk.ticket.channel.manager,helpdesk.model_helpdesk_ticket_channel,group_helpdesk_manager,1,1,1,1 -access_helpdesk_ticket_channel_user,helpdesk.ticket.channel.user,helpdesk.model_helpdesk_ticket_channel,base.group_user,1,0,0,0 -access_helpdesk_ticket_category_manager,helpdesk.ticket.category.manager,helpdesk.model_helpdesk_ticket_category,group_helpdesk_manager,1,1,1,1 -access_helpdesk_ticket_category_user,helpdesk.ticket.category.user,helpdesk.model_helpdesk_ticket_category,base.group_user,1,0,0,0 -access_helpdesk_ticket_category_portal,helpdesk.ticket.category.portal,helpdesk.model_helpdesk_ticket_category,base.group_portal,1,0,0,0 -access_helpdesk_ticket_category_public,helpdesk.ticket.category.public,helpdesk.model_helpdesk_ticket_category,base.group_public,1,0,0,0 +access_helpdesk_ticket_manager,helpdesk.ticket.manager,model_helpdesk_ticket,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_user,helpdesk.ticket.user,model_helpdesk_ticket,group_helpdesk_user,1,1,1,0 +access_helpdesk_ticket_user_personal,helpdesk.ticket.user.personal,model_helpdesk_ticket,group_helpdesk_user_own,1,1,1,0 +access_helpdesk_ticket_portal,helpdesk.ticket.portal,model_helpdesk_ticket,base.group_portal,1,0,0,0 +access_helpdesk_ticket_stage_manager,helpdesk.ticket.stage.manager,model_helpdesk_ticket_stage,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_stage_user,helpdesk.ticket.stage.user,model_helpdesk_ticket_stage,base.group_user,1,0,0,0 +access_helpdesk_ticket_stage_portal,helpdesk.ticket.stage.portal,model_helpdesk_ticket_stage,base.group_portal,1,1,0,0 +access_helpdesk_ticket_stage_public,helpdesk.ticket.stage.public,model_helpdesk_ticket_stage,base.group_public,1,1,0,0 +access_helpdesk_ticket_tag_manager,helpdesk.ticket.tag.manager,model_helpdesk_ticket_tag,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_tag_user,helpdesk.ticket.tag.user,model_helpdesk_ticket_tag,base.group_user,1,0,0,0 +access_helpdesk_ticket_team_manager,helpdesk.ticket.team.manager,model_helpdesk_ticket_team,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_team_user,helpdesk.ticket.team.user,model_helpdesk_ticket_team,base.group_user,1,0,0,0 +access_helpdesk_ticket_channel_manager,helpdesk.ticket.channel.manager,model_helpdesk_ticket_channel,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_channel_user,helpdesk.ticket.channel.user,model_helpdesk_ticket_channel,base.group_user,1,0,0,0 +access_helpdesk_ticket_category_manager,helpdesk.ticket.category.manager,model_helpdesk_ticket_category,group_helpdesk_manager,1,1,1,1 +access_helpdesk_ticket_category_user,helpdesk.ticket.category.user,model_helpdesk_ticket_category,base.group_user,1,0,0,0 +access_helpdesk_ticket_category_portal,helpdesk.ticket.category.portal,model_helpdesk_ticket_category,base.group_portal,1,0,0,0 +access_helpdesk_ticket_category_public,helpdesk.ticket.category.public,model_helpdesk_ticket_category,base.group_public,1,0,0,0 diff --git a/helpdesk_mgmt/static/description/index.html b/helpdesk_mgmt/static/description/index.html index fa71e412c0..9bec5ebae8 100644 --- a/helpdesk_mgmt/static/description/index.html +++ b/helpdesk_mgmt/static/description/index.html @@ -4,7 +4,7 @@ -Helpdesk +Helpdesk Management -
-

Helpdesk

+
+

Helpdesk Management

-

Beta License: AGPL-3 aitorbouzas/helpdesk

+

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

This module adds Helpdesk functionality in Odoo.

Table of contents

+
+

Configuration

+

To configure this module, you need to: +#. Edit or create new channels. +#. Edit or create new categories. +#. Edit or create new stages. +#. Edit or create new teams. +#. Edit or create new tags.

+
+

Channels

+
    +
  1. Go to Helpdesk > Configuration > Channels to edit or create new channels.
  2. +
  3. Edit or create a channel.
  4. +
  5. Set the name for the channel.
  6. +
  7. You can also Activate or Deactivate channels.
  8. +
+
+Channels +
+
+
+

Categories

+
    +
  1. Go to Helpdesk > Configuration > Categories to edit or create new categories.
  2. +
  3. Edit or create a new category.
  4. +
  5. Set the name for the category.
  6. +
  7. You can also Activate or Deactivate categories.
  8. +
+
+Categories +
+
+
+

Stages

+
    +
  1. Go to Helpdesk > Configuration > Stages to edit or create new stages.
  2. +
  3. Edit or create a new stage.
  4. +
  5. Set the name for the stage.
  6. +
  7. Set the sequence order for the stage.
  8. +
  9. You can select an Email template.
  10. +
  11. Mark the Unattended checkbox if the stage contains unattended tickets.
  12. +
  13. Mark the Closed checkbox if the stage contains closed tickets.
  14. +
  15. You can add a description for the stage.
  16. +
  17. You can also Activate or Deactivate stages.
  18. +
+
+Stages +
+

You can also sort the stage sequence if you move up or down the stages in the list view.

+
+
+

Teams

+
    +
  1. Go to Helpdesk > Configuration > Teams to edit or create new teams.
  2. +
  3. Edit or create a new team.
  4. +
  5. Set the name for the team.
  6. +
  7. Add the teams members.
  8. +
  9. You can also Activate or Deactivate teams.
  10. +
+
+Teams +
+
+
+

Tags

+
    +
  1. Go to Helpdesk > Configuration > Ticket Tags to edit or create new tags.
  2. +
  3. Edit or create a new tag.
  4. +
  5. Set the name for the tag.
  6. +
  7. Set the color index for the tag.
  8. +
  9. You can also Activate or Deactivate tags.
  10. +
+
+Ticket Tags +
+
-

Usage

-
    -
  • Go to???
  • -
+

Usage

+
    +
  1. Go to Helpdesk or Helpdesk > Dashboard to see the tickets dashboard
  2. +
  3. In the Kanban view, click in the kanban card of a team to see their tickets and create new ones.
  4. +
+
+Kanban view +
+

To create a new ticket from the kanban view:

+
    +
  1. Press Create button or click on the plus icon at the top of the column of a stage.
  2. +
  3. Set the name or subject for the ticket.
  4. +
  5. Select the team that will manage the ticket.
  6. +
  7. You can select a user to assign the ticket.
  8. +
  9. Set the priority of the ticket.
  10. +
  11. Select the partner, and you can also set the partner name and email.
  12. +
  13. You can select a category and set tags for the ticket.
  14. +
  15. Add a description.
  16. +
  17. You can also attach files to the ticket.
  18. +
+
+Create a new ticket +
-

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

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.

-

Credits

+

Credits

-

Authors

+

Authors

  • AdaptiveCity
  • C2i Change 2 Improve
  • @@ -409,10 +513,12 @@

    Authors

-

Contributors

+

Contributors

-

Maintainers

-

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

-

You are welcome to contribute.

+

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/tests/test_helpdesk_ticket.py b/helpdesk_mgmt/tests/test_helpdesk_ticket.py index 2d5e3ce92d..34786d3d02 100644 --- a/helpdesk_mgmt/tests/test_helpdesk_ticket.py +++ b/helpdesk_mgmt/tests/test_helpdesk_ticket.py @@ -9,7 +9,9 @@ def setUpClass(cls): helpdesk_ticket = cls.env['helpdesk.ticket'] cls.user_admin = cls.env.ref('base.user_root') cls.user_demo = cls.env.ref('base.user_demo') - cls.stage_closed = cls.env.ref('helpdesk.helpdesk_ticket_stage_done') + cls.stage_closed = cls.env.ref( + 'helpdesk_mgmt.helpdesk_ticket_stage_done' + ) cls.ticket = helpdesk_ticket.create({ 'name': 'Test 1', diff --git a/helpdesk_mgmt/tests/test_helpdesk_ticket_team.py b/helpdesk_mgmt/tests/test_helpdesk_ticket_team.py index 6c9d239152..759f58ca6e 100644 --- a/helpdesk_mgmt/tests/test_helpdesk_ticket_team.py +++ b/helpdesk_mgmt/tests/test_helpdesk_ticket_team.py @@ -9,7 +9,9 @@ def setUpClass(cls): helpdesk_ticket = cls.env['helpdesk.ticket'] helpdesk_ticket_team = cls.env['helpdesk.ticket.team'] cls.user_demo = cls.env.ref('base.user_demo') - cls.stage_closed = cls.env.ref('helpdesk.helpdesk_ticket_stage_done') + cls.stage_closed = cls.env.ref( + 'helpdesk_mgmt.helpdesk_ticket_stage_done' + ) cls.team_id = helpdesk_ticket_team.create({ 'name': "Team 1" }) diff --git a/helpdesk_mgmt/tests/test_res_partner.py b/helpdesk_mgmt/tests/test_res_partner.py index d1a728d440..65d66c69eb 100644 --- a/helpdesk_mgmt/tests/test_res_partner.py +++ b/helpdesk_mgmt/tests/test_res_partner.py @@ -7,7 +7,7 @@ def setUp(self): self.partner_obj = self.env["res.partner"] self.ticket_obj = self.env["helpdesk.ticket"] self.stage_id_closed = self.env.ref( - "helpdesk.helpdesk_ticket_stage_done") + "helpdesk_mgmt.helpdesk_ticket_stage_done") self.parent_id = self.partner_obj.create({"name": "Parent 1"}) self.child_id_1 = self.partner_obj.create({"name": "Child 1"}) self.child_id_2 = self.partner_obj.create({"name": "Child 2"}) diff --git a/helpdesk_mgmt/views/helpdesk_ticket_menu.xml b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml index afcd4a21db..27a30788f3 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_menu.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_menu.xml @@ -79,7 +79,7 @@ + web_icon="helpdesk_mgmt,static/description/icon.png"/> @@ -89,14 +89,14 @@ + groups="group_helpdesk_manager"/> + groups="group_helpdesk_manager"/> @@ -35,18 +36,21 @@ New True False + 2 In Progress False False + 3 Awaiting False False + 3 @@ -54,6 +58,7 @@ False True True + 4 @@ -61,6 +66,7 @@ False True True + diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 472f64aeab..73c4b8cb0b 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -111,9 +111,11 @@ def _onchange_dominion_user_id(self): @api.model def create(self, vals): if vals.get('number', '/') == '/': - vals['number'] = self.env['ir.sequence'].next_by_code( - 'helpdesk.ticket.sequence' - ) or '/' + seq = self.env['ir.sequence'] + if 'company_id' in vals: + seq = seq.with_context(force_company=vals['company_id']) + vals['number'] = seq.next_by_code( + 'helpdesk.ticket.sequence') or '/' res = super().create(vals) # Check if mail to the user has to be sent diff --git a/helpdesk_mgmt/views/helpdesk_ticket_view.xml b/helpdesk_mgmt/views/helpdesk_ticket_view.xml index ff46e39b5d..f79500ad4f 100644 --- a/helpdesk_mgmt/views/helpdesk_ticket_view.xml +++ b/helpdesk_mgmt/views/helpdesk_ticket_view.xml @@ -79,7 +79,7 @@ - + From 7f8d0b45c2772dca32c2d4e7a00a84c0268e5962 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 5 Jul 2019 07:52:10 +0000 Subject: [PATCH 032/337] helpdesk_mgmt 11.0.1.1.0 --- helpdesk_mgmt/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index 8db67582ef..e0651e0581 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -4,7 +4,7 @@ 'name': 'Helpdesk Management', 'summary': """ Helpdesk""", - 'version': '11.0.1.0.2', + 'version': '11.0.1.1.0', 'license': 'AGPL-3', 'category': 'After-Sales', 'author': 'AdaptiveCity, ' From 3558e59512ee0589c4fade293aa6842008b28290 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Sun, 14 Jul 2019 09:59:59 +0000 Subject: [PATCH 033/337] [UPD] Update helpdesk_mgmt.pot --- helpdesk_mgmt/i18n/es.po | 100 ++-- helpdesk_mgmt/i18n/helpdesk_mgmt.pot | 727 +++++++++++++++++++++++++++ 2 files changed, 783 insertions(+), 44 deletions(-) create mode 100644 helpdesk_mgmt/i18n/helpdesk_mgmt.pot diff --git a/helpdesk_mgmt/i18n/es.po b/helpdesk_mgmt/i18n/es.po index 1155bb8c96..5281a8443d 100644 --- a/helpdesk_mgmt/i18n/es.po +++ b/helpdesk_mgmt/i18n/es.po @@ -10,17 +10,19 @@ msgstr "" "PO-Revision-Date: 2019-06-17 11:25+0200\n" "Last-Translator: <>\n" "Language-Team: \n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: \n" -"Language: es\n" "X-Generator: Poedit 2.0.6\n" #. module: helpdesk_mgmt #: model:mail.template,subject:helpdesk_mgmt.assignment_email_template -msgid "${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' })" -msgstr "${object.company_id.name} Recibo de Pago (Ref ${object.name or 'n/a' })" +msgid "" +"${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' })" +msgstr "" +"${object.company_id.name} Recibo de Pago (Ref ${object.name or 'n/a' })" #. module: helpdesk_mgmt #: model:mail.template,body_html:helpdesk_mgmt.assignment_email_template @@ -114,7 +116,7 @@ msgid "Attachments" msgstr "Adjuntos" #. module: helpdesk_mgmt -#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_awaiting +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_awaiting msgid "Awaiting" msgstr "En espera" @@ -124,8 +126,9 @@ msgid "By" msgstr "Por" #. module: helpdesk_mgmt -#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_cancel -msgid "Cancel" +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_cancelled +#, fuzzy +msgid "Cancelled" msgstr "Cancelar" #. module: helpdesk_mgmt @@ -148,8 +151,12 @@ msgstr "Canal" #. module: helpdesk_mgmt #: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_channel_id -msgid "Channel indicates where the source of a ticketcomes from (it could be a phone call, an email...)" -msgstr "El Canal indica el origen del que procede un ticket (podr??a ser una llamada telef??nica, un email...)" +msgid "" +"Channel indicates where the source of a ticketcomes from (it could be a " +"phone call, an email...)" +msgstr "" +"El Canal indica el origen del que procede un ticket (podr??a ser una llamada " +"telef??nica, un email...)" #. module: helpdesk_mgmt #: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_channel_action @@ -249,7 +256,7 @@ msgid "Display Name" msgstr "Nombre mostrado" #. module: helpdesk_mgmt -#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_done +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_done msgid "Done" msgstr "Hecho" @@ -329,12 +336,13 @@ msgstr "Equipo de ticket Helpdesk" #. module: helpdesk_mgmt #: model:ir.module.category,description:helpdesk_mgmt.module_helpdesk_category -msgid "Helps you handle your helpdesk_mgmt security." +#, fuzzy +msgid "Helps you handle your helpdesk security." msgstr "Ayuda a manejar tu seguridad de Helpdesk." #. module: helpdesk_mgmt -#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:66 -#: selection:helpdesk_mgmt.ticket,priority:0 +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:71 +#: selection:helpdesk.ticket,priority:0 #, python-format msgid "High" msgstr "Alta" @@ -351,22 +359,26 @@ msgid "History" msgstr "Historial" #. module: helpdesk_mgmt -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id_13495 -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id_13485 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id_2109 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id_2099 #: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_id -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id_13464 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id_2078 #: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_id -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id_13514 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id_2128 msgid "ID" msgstr "ID (identificaci??n)" #. module: helpdesk_mgmt #: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_mail_template_id -msgid "If set an email will be sent to the customer when the ticketreaches this step." -msgstr "Si est?? establecido, se enviar?? un email al cliente cuando el ticket alcance este estado." +msgid "" +"If set an email will be sent to the customer when the ticketreaches this " +"step." +msgstr "" +"Si est?? establecido, se enviar?? un email al cliente cuando el ticket alcance " +"este estado." #. module: helpdesk_mgmt -#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_in_progress +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_in_progress msgid "In Progress" msgstr "En progreso" @@ -419,8 +431,8 @@ msgid "Late Activities" msgstr "Actividades tard??as" #. module: helpdesk_mgmt -#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:64 -#: selection:helpdesk_mgmt.ticket,priority:0 +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:69 +#: selection:helpdesk.ticket,priority:0 #, python-format msgid "Low" msgstr "Baja" @@ -431,8 +443,8 @@ msgid "Media Attachments" msgstr "Archivos adjuntos" #. module: helpdesk_mgmt -#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:65 -#: selection:helpdesk_mgmt.ticket,priority:0 +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:70 +#: selection:helpdesk.ticket,priority:0 #, python-format msgid "Medium" msgstr "Media" @@ -469,7 +481,7 @@ msgid "Name" msgstr "Nombre" #. module: helpdesk_mgmt -#: model:helpdesk_mgmt.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_new +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_new msgid "New" msgstr "Nuevo" @@ -480,7 +492,7 @@ msgid "Newest" msgstr "M??s nuevo" #. module: helpdesk_mgmt -#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:148 +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:182 #, python-format msgid "No Subject" msgstr "Sin asunto" @@ -522,14 +534,14 @@ msgid "Partner" msgstr "Empresa" #. module: helpdesk_mgmt -#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:186 +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:220 #: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_email #, python-format msgid "Partner Email" msgstr "Email del cliente" #. module: helpdesk_mgmt -#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:188 +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:222 #, python-format msgid "Partner Id" msgstr "ID de cliente" @@ -550,9 +562,6 @@ msgid "Priority" msgstr "Prioridad" #. module: helpdesk_mgmt -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_ids -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_ids -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_ids #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_ids #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_ids msgid "Related tickets" @@ -572,7 +581,9 @@ msgstr "Secuencia" #. module: helpdesk_mgmt #: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search msgid "Show all records which has next action date is before today" -msgstr "Mostrar todos los registros que tienen la pr??xima fecha de acci??n antes de hoy" +msgstr "" +"Mostrar todos los registros que tienen la pr??xima fecha de acci??n antes de " +"hoy" #. module: helpdesk_mgmt #: code:addons/helpdesk_mgmt/controllers/myaccount.py:52 @@ -630,8 +641,12 @@ msgstr "No hay tickets en tu cuenta." #. module: helpdesk_mgmt #: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_fold -msgid "This stage is folded in the kanban view when there are no records in that stage to display." -msgstr "Esta etapa se repliega en la vista kanban cuando no hay registros para mostrar en la misma." +msgid "" +"This stage is folded in the kanban view when there are no records in that " +"stage to display." +msgstr "" +"Esta etapa se repliega en la vista kanban cuando no hay registros para " +"mostrar en la misma." #. module: helpdesk_mgmt #: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_search @@ -656,18 +671,12 @@ msgid "Ticket Tags" msgstr "Etiquetas de ticket" #. module: helpdesk_mgmt -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_active_count -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_active_count -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_active_count #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_active_count #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_active_count msgid "Ticket active count" msgstr "Cantidad de tickets activos" #. module: helpdesk_mgmt -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_count -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_count -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_count #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count msgid "Ticket count" @@ -681,9 +690,6 @@ msgstr "N??mero de ticket" #. module: helpdesk_mgmt #: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_action #: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_ticket_ids -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_address_helpdesk_ticket_count_string -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_magento_res_partner_helpdesk_ticket_count_string -#: model:ir.model.fields,field_description:helpdesk_mgmt.field_naturitas_ipa_res_partner_helpdesk_ticket_count_string #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count_string #: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count_string #: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_menu @@ -741,8 +747,14 @@ msgid "User: Personal tickets" msgstr "Usuario: Tickets personales" #. module: helpdesk_mgmt -#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:67 -#: selection:helpdesk_mgmt.ticket,priority:0 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_user_ids +#, fuzzy +msgid "Users" +msgstr "Usuario" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:72 +#: selection:helpdesk.ticket,priority:0 #, python-format msgid "Very High" msgstr "Muy alta" diff --git a/helpdesk_mgmt/i18n/helpdesk_mgmt.pot b/helpdesk_mgmt/i18n/helpdesk_mgmt.pot new file mode 100644 index 0000000000..6dc5e326e8 --- /dev/null +++ b/helpdesk_mgmt/i18n/helpdesk_mgmt.pot @@ -0,0 +1,727 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * helpdesk_mgmt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.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: helpdesk_mgmt +#: model:mail.template,subject:helpdesk_mgmt.assignment_email_template +msgid "${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' })" +msgstr "" + +#. module: helpdesk_mgmt +#: model:mail.template,body_html:helpdesk_mgmt.assignment_email_template +msgid "\n" +"

Hello ${object.user_id.name},

\n" +"

The ticket ${object.number} has been assigned to you.

\n" +"
" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "
\n" +" Category:" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "
\n" +" Stage:" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +msgid "View" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "Date:" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "Last Stage Update:" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_active +msgid "Active" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:56 +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#, python-format +msgid "All" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_category_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_channel_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +msgid "Archived" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Assign to me" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_assigned_date +msgid "Assigned Date" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_user_id +msgid "Assigned user" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Attachments" +msgstr "" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_awaiting +msgid "Awaiting" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "By" +msgstr "" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_cancelled +msgid "Cancelled" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_category_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_category_menu +msgid "Categories" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_category_ids +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Category" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id +msgid "Channel" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_channel_id +msgid "Channel indicates where the source of a ticketcomes from (it could be a phone call, an email...)" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_channel_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_channel_menu +msgid "Channels" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Close Date" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_closed +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_closed +msgid "Closed" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_closed_date +msgid "Closed Date" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_color +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_color +msgid "Color Index" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_company_id +msgid "Company" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_config_main_menu +msgid "Configuration" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_res_partner +msgid "Contact" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Create Date" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_create_uid +msgid "Created by" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_create_date +msgid "Created on" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_dashboard_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_dashboard_menu +msgid "Dashboard" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_description +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_description +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Description" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_display_name +msgid "Display Name" +msgstr "" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_done +msgid "Done" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_mail_template_id +msgid "Email Template" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_fold +msgid "Folded in Kanban" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Future Activities" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Group By" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.module.category,name:helpdesk_mgmt.module_helpdesk_category +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_main_menu +msgid "Helpdesk" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_category_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_channel_search +msgid "Helpdesk Category Search" +msgstr "" + +#. module: helpdesk_mgmt +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_manager +msgid "Helpdesk Manager" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +msgid "Helpdesk Team Search" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Helpdesk Ticket" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_category +msgid "Helpdesk Ticket Category" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_channel +msgid "Helpdesk Ticket Channel" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_stage +msgid "Helpdesk Ticket Stage" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_tag +msgid "Helpdesk Ticket Tag" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_team +msgid "Helpdesk Ticket Team" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.module.category,description:helpdesk_mgmt.module_helpdesk_category +msgid "Helps you handle your helpdesk security." +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:71 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "High" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "High Priority" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "History" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id_2109 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id_2099 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id_2078 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id_2128 +msgid "ID" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_mail_template_id +msgid "If set an email will be sent to the customer when the ticketreaches this step." +msgstr "" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_in_progress +msgid "In Progress" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team___last_update +msgid "Last Modified on" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:53 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_last_stage_update +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Last Stage Update" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_write_uid +msgid "Last Updated by" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_write_date +msgid "Last Updated on" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Last Week" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Late Activities" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:69 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "Low" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_attachment_ids +msgid "Media Attachments" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:70 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "Medium" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_user_ids +msgid "Members" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Activities" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Followed Tickets" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Tickets" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:51 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_name +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Name" +msgstr "" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_new +msgid "New" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:50 +#, python-format +msgid "Newest" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:182 +#, python-format +msgid "No Subject" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count +msgid "Number of tickets" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_high_priority +msgid "Number of tickets in high priority" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_unassigned +msgid "Number of tickets unassigned" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_unattended +msgid "Number of tickets unattended" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Open" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Other Information" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Partner" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:220 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_email +#, python-format +msgid "Partner Email" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:222 +#, python-format +msgid "Partner Id" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_name +msgid "Partner Name" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_views_pivot +msgid "Pivot Analysis" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_priority +msgid "Priority" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_ids +msgid "Related tickets" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_reporting_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_reporting_menu +msgid "Reporting" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_sequence +msgid "Sequence" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Show all records which has next action date is before today" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:52 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Stage" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_name +msgid "Stage Name" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_stage_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_stage_menu +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_category_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_channel_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_team_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_form +msgid "Stages" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_ids +msgid "Tag" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_form +msgid "Tags" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_category_tree +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_channel_tree +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_team_tree +msgid "Team" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_team_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_team_menu +msgid "Teams" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "There are no tickets in your account." +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_fold +msgid "This stage is folded in the kanban view when there are no records in that stage to display." +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_search +msgid "Ticket Stage Search" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_tree +msgid "Ticket Stages" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_search +msgid "Ticket Tag Search" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_tag_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_tag_menu +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_tree +msgid "Ticket Tags" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_active_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_active_count +msgid "Ticket active count" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count +msgid "Ticket count" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_number +msgid "Ticket number" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_action +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count_string +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count_string +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_menu +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_reporting_analysis +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_layout +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_home +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Tickets" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_name +msgid "Title" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +msgid "To Do" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Today Activities" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_ids +msgid "Todo tickets" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Unassigned" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_unattended +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_unattended +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Unattended" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_user +msgid "User" +msgstr "" + +#. module: helpdesk_mgmt +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_user_own +msgid "User: Personal tickets" +msgstr "" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_user_ids +msgid "Users" +msgstr "" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:72 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "Very High" +msgstr "" + From fdf34fc343369e541ba9afc6a16a4b33dad08eb3 Mon Sep 17 00:00:00 2001 From: Eduardo Aparicio Date: Sun, 14 Jul 2019 12:59:41 +0000 Subject: [PATCH 034/337] Added translation using Weblate (Portuguese (Brazil)) --- helpdesk_mgmt/i18n/pt_BR.po | 742 ++++++++++++++++++++++++++++++++++++ 1 file changed, 742 insertions(+) create mode 100644 helpdesk_mgmt/i18n/pt_BR.po diff --git a/helpdesk_mgmt/i18n/pt_BR.po b/helpdesk_mgmt/i18n/pt_BR.po new file mode 100644 index 0000000000..eb831c400e --- /dev/null +++ b/helpdesk_mgmt/i18n/pt_BR.po @@ -0,0 +1,742 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * helpdesk_mgmt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-07-14 15:43+0000\n" +"Last-Translator: Eduardo Aparicio \n" +"Language-Team: none\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.7.1\n" + +#. module: helpdesk_mgmt +#: model:mail.template,subject:helpdesk_mgmt.assignment_email_template +msgid "${object.company_id.name} Payment Receipt (Ref ${object.name or 'n/a' })" +msgstr "" +"${object.company_id.name} Recibo de Pagamento (Ref ${object.name or 'n/d' })" + +#. module: helpdesk_mgmt +#: model:mail.template,body_html:helpdesk_mgmt.assignment_email_template +msgid "\n" +"

Hello ${object.user_id.name},

\n" +"

The ticket ${object.number} has been assigned to you.

\n" +"
" +msgstr "" +"\n" +"

Ol?? ${object.user_id.name},

\n" +"

O chamado ${object.number} foi atribu??do a voc??.

\n" +"
" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "
\n" +" Category:" +msgstr "" +"
\n" +" Categoria:" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "
\n" +" Stage:" +msgstr "" +"
\n" +" Est??gio:" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +msgid "View" +msgstr "Ver" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "Date:" +msgstr "Data:" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "Last Stage Update:" +msgstr "??ltima Atualiza????o de Est??gio:" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_active +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_active +msgid "Active" +msgstr "Ativo" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:56 +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#, python-format +msgid "All" +msgstr "Tudo" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_category_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_channel_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +msgid "Archived" +msgstr "Arquivado" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Assign to me" +msgstr "Atribu??do a mim" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_assigned_date +msgid "Assigned Date" +msgstr "Data de Atribui????o" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_user_id +msgid "Assigned user" +msgstr "Usu??rio atribu??do" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Attachments" +msgstr "Anexos" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_awaiting +msgid "Awaiting" +msgstr "Aguardando" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "By" +msgstr "Por" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_cancelled +msgid "Cancelled" +msgstr "Cancelado" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_category_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_category_menu +msgid "Categories" +msgstr "Categorias" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_category_ids +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Category" +msgstr "Categoria" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id +msgid "Channel" +msgstr "Canal" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_channel_id +msgid "Channel indicates where the source of a ticketcomes from (it could be a phone call, an email...)" +msgstr "Canal indica a origem do chamado (liga????o telef??nica, e-mail, etc.)" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_channel_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_channel_menu +msgid "Channels" +msgstr "Canais" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Close Date" +msgstr "Data Final" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_closed +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_closed +msgid "Closed" +msgstr "Encerrado" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_closed_date +msgid "Closed Date" +msgstr "Data de Encerramento" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_color +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_color +msgid "Color Index" +msgstr "??ndice de Cor" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_company_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_company_id +msgid "Company" +msgstr "Empresa" + +#. module: helpdesk_mgmt +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_config_main_menu +msgid "Configuration" +msgstr "Configura????o" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_res_partner +msgid "Contact" +msgstr "Contato" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Create Date" +msgstr "Data de Cria????o" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_create_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_create_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_create_date +msgid "Created on" +msgstr "Criado em" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_dashboard_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_dashboard_menu +msgid "Dashboard" +msgstr "Painel" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_description +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_description +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Description" +msgstr "Descri????o" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_display_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_display_name +msgid "Display Name" +msgstr "Nome de Exibi????o" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_done +msgid "Done" +msgstr "Conclu??do" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_mail_template_id +msgid "Email Template" +msgstr "Modelo de E-mail" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_fold +msgid "Folded in Kanban" +msgstr "Dobrado no Kanban" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Future Activities" +msgstr "Atividades Futuras" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Group By" +msgstr "Agrupar Por" + +#. module: helpdesk_mgmt +#: model:ir.module.category,name:helpdesk_mgmt.module_helpdesk_category +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_main_menu +msgid "Helpdesk" +msgstr "Central de Atendimento" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_category_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_channel_search +msgid "Helpdesk Category Search" +msgstr "Buscar em Categorias da Central de Atendimento" + +#. module: helpdesk_mgmt +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_manager +msgid "Helpdesk Manager" +msgstr "Gerente de Atendimento" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +msgid "Helpdesk Team Search" +msgstr "Buscar em Equipe de Atendimento" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Helpdesk Ticket" +msgstr "Chamado" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_category +msgid "Helpdesk Ticket Category" +msgstr "Categoria do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_channel +msgid "Helpdesk Ticket Channel" +msgstr "Canal do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_stage +msgid "Helpdesk Ticket Stage" +msgstr "Est??gio do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_tag +msgid "Helpdesk Ticket Tag" +msgstr "Marcador do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket_team +msgid "Helpdesk Ticket Team" +msgstr "Equipe do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.module.category,description:helpdesk_mgmt.module_helpdesk_category +msgid "Helps you handle your helpdesk security." +msgstr "Auxilia a gerir a seguran??a do seu atendimento." + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:71 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "High" +msgstr "Alta" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "High Priority" +msgstr "Alta Prioridade" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page +msgid "History" +msgstr "Hist??rico" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_id_2109 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_id_2099 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id_2078 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_id +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id_2128 +msgid "ID" +msgstr "ID" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_mail_template_id +msgid "If set an email will be sent to the customer when the ticketreaches this step." +msgstr "" +"Se configurado, um e-mail ser?? enviado ao cliente quando o chamado atingir " +"esta etapa." + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_in_progress +msgid "In Progress" +msgstr "Em Andamento" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag___last_update +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team___last_update +msgid "Last Modified on" +msgstr "??ltima Modifica????o em" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:53 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_last_stage_update +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Last Stage Update" +msgstr "??ltima Atualiza????o de Est??gio" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_write_uid +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_write_uid +msgid "Last Updated by" +msgstr "Ultima atualiza????o por" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_write_date +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_write_date +msgid "Last Updated on" +msgstr "Ultima Atualiza????o em" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Last Week" +msgstr "??ltima Semana" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Late Activities" +msgstr "Atividades Atrasadas" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:69 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "Low" +msgstr "Baixa" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_attachment_ids +msgid "Media Attachments" +msgstr "M??dias Anexadas" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:70 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "Medium" +msgstr "M??dia" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_user_ids +msgid "Members" +msgstr "Membros" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Activities" +msgstr "Minhas Atividades" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Followed Tickets" +msgstr "Chamados Seguidos por Mim" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "My Tickets" +msgstr "Meus Chamados" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:51 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_category_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_channel_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_name +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_name +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Name" +msgstr "Nome" + +#. module: helpdesk_mgmt +#: model:helpdesk.ticket.stage,name:helpdesk_mgmt.helpdesk_ticket_stage_new +msgid "New" +msgstr "Novo" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:50 +#, python-format +msgid "Newest" +msgstr "Mais Recente" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:182 +#, python-format +msgid "No Subject" +msgstr "Sem Assunto" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count +msgid "Number of tickets" +msgstr "N??mero de chamados" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_high_priority +msgid "Number of tickets in high priority" +msgstr "N??mero de chamados de Alta Prioridade" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_unassigned +msgid "Number of tickets unassigned" +msgstr "N??mero de chamados n??o atribu??dos" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_count_unattended +msgid "Number of tickets unattended" +msgstr "N??mero de chamados n??o atendidos" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Open" +msgstr "Abrir" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.ticket_view_form +msgid "Other Information" +msgstr "Outras informa????es" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Partner" +msgstr "Parceiro" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:220 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_email +#, python-format +msgid "Partner Email" +msgstr "E-mail do Parceiro" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:222 +#, python-format +msgid "Partner Id" +msgstr "Id do Parceiro" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_partner_name +msgid "Partner Name" +msgstr "Nome do Parceiro" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_views_pivot +msgid "Pivot Analysis" +msgstr "An??lise Piv??" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_priority +msgid "Priority" +msgstr "Prioridade" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_ids +msgid "Related tickets" +msgstr "Chamados Relacionados" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_reporting_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_reporting_menu +msgid "Reporting" +msgstr "Comunica????o" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_sequence +msgid "Sequence" +msgstr "Sequ??ncia" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Show all records which has next action date is before today" +msgstr "Exibir todos os registros com data da pr??xima a????o anterior a hoje" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/controllers/myaccount.py:52 +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +#, python-format +msgid "Stage" +msgstr "Est??gio" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_name +msgid "Stage Name" +msgstr "Nome do Est??gio" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_stage_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_stage_menu +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_category_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_channel_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_team_form +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_form +msgid "Stages" +msgstr "Est??gios" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_tag_ids +msgid "Tag" +msgstr "Marcador" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_form +msgid "Tags" +msgstr "Marcadores" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_id +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_category_tree +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_channel_tree +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_team_tree +msgid "Team" +msgstr "Equipe" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_team_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_team_menu +msgid "Teams" +msgstr "Equipes" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "There are no tickets in your account." +msgstr "N??o h?? chamados na sua conta." + +#. module: helpdesk_mgmt +#: model:ir.model.fields,help:helpdesk_mgmt.field_helpdesk_ticket_stage_fold +msgid "This stage is folded in the kanban view when there are no records in that stage to display." +msgstr "" +"Este est??gio fica dobrado na vis??o Kanban quando n??o houver registros para " +"exibir." + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_search +msgid "Ticket Stage Search" +msgstr "Buscar Est??gio do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_stage_tree +msgid "Ticket Stages" +msgstr "Est??gios do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_search +msgid "Ticket Tag Search" +msgstr "Buscar Marcadores do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_tag_action +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_tag_menu +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_tag_tree +msgid "Ticket Tags" +msgstr "Marcadores do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_active_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_active_count +msgid "Ticket active count" +msgstr "N??mero de Chamados Ativos" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count +msgid "Ticket count" +msgstr "N??mero de Chamados" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_number +msgid "Ticket number" +msgstr "N??mero do Chamado" + +#. module: helpdesk_mgmt +#: model:ir.actions.act_window,name:helpdesk_mgmt.helpdesk_ticket_action +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_ticket_ids +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_partner_helpdesk_ticket_count_string +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_res_users_helpdesk_ticket_count_string +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_menu +#: model:ir.ui.menu,name:helpdesk_mgmt.helpdesk_ticket_reporting_analysis +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_layout +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_home +#: model:ir.ui.view,arch_db:helpdesk_mgmt.portal_my_tickets +msgid "Tickets" +msgstr "Chamados" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_name +msgid "Title" +msgstr "T??tulo" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +msgid "To Do" +msgstr "A Fazer" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Today Activities" +msgstr "Atividades de Hoje" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_team_todo_ticket_ids +msgid "Todo tickets" +msgstr "Chamados para Atender" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Unassigned" +msgstr "N??o Atribu??do" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage_unattended +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_unattended +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_kanban_view +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +msgid "Unattended" +msgstr "N??o Atendido" + +#. module: helpdesk_mgmt +#: model:ir.ui.view,arch_db:helpdesk_mgmt.helpdesk_ticket_view_search +#: model:ir.ui.view,arch_db:helpdesk_mgmt.view_helpdesk_ticket_team_search +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_user +msgid "User" +msgstr "Usu??rio" + +#. module: helpdesk_mgmt +#: model:res.groups,name:helpdesk_mgmt.group_helpdesk_user_own +msgid "User: Personal tickets" +msgstr "Usu??rio: Chamados Pessoais" + +#. module: helpdesk_mgmt +#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_user_ids +msgid "Users" +msgstr "Usu??rios" + +#. module: helpdesk_mgmt +#: code:addons/helpdesk_mgmt/models/helpdesk_ticket.py:72 +#: selection:helpdesk.ticket,priority:0 +#, python-format +msgid "Very High" +msgstr "Muito Alta" From c56744ba2c5ca49ba328a2d7f83dde3685068079 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Tue, 16 Jul 2019 04:36:29 -0300 Subject: [PATCH 035/337] [MIG] helpdesk_mgmt: Migration to 12.0 --- helpdesk_mgmt/README.rst | 5 ++++ helpdesk_mgmt/__manifest__.py | 2 +- helpdesk_mgmt/demo/helpdesk_demo.xml | 6 +++++ helpdesk_mgmt/models/helpdesk_ticket_team.py | 2 +- helpdesk_mgmt/readme/CONTRIBUTORS.rst | 6 +++++ helpdesk_mgmt/security/helpdesk_security.xml | 9 ++++++- .../views/helpdesk_dashboard_view.xml | 24 +++++++++---------- .../views/helpdesk_ticket_templates.xml | 4 ++-- helpdesk_mgmt/views/helpdesk_ticket_view.xml | 10 ++++---- 9 files changed, 46 insertions(+), 22 deletions(-) diff --git a/helpdesk_mgmt/README.rst b/helpdesk_mgmt/README.rst index d446d758d4..d781577dbc 100644 --- a/helpdesk_mgmt/README.rst +++ b/helpdesk_mgmt/README.rst @@ -190,6 +190,11 @@ Contributors * Pedro M. Baeza +* `ID42 Sistemas `_: + + * Marcel Savegnago + * Eduardo Apar??cio + Maintainers ~~~~~~~~~~~ diff --git a/helpdesk_mgmt/__manifest__.py b/helpdesk_mgmt/__manifest__.py index e0651e0581..1d86afe15d 100644 --- a/helpdesk_mgmt/__manifest__.py +++ b/helpdesk_mgmt/__manifest__.py @@ -4,7 +4,7 @@ 'name': 'Helpdesk Management', 'summary': """ Helpdesk""", - 'version': '11.0.1.1.0', + 'version': '12.0.1.0.0', 'license': 'AGPL-3', 'category': 'After-Sales', 'author': 'AdaptiveCity, ' diff --git a/helpdesk_mgmt/demo/helpdesk_demo.xml b/helpdesk_mgmt/demo/helpdesk_demo.xml index d1143a3e08..47319832e8 100644 --- a/helpdesk_mgmt/demo/helpdesk_demo.xml +++ b/helpdesk_mgmt/demo/helpdesk_demo.xml @@ -1,6 +1,12 @@ + + + + + + diff --git a/helpdesk_mgmt/models/helpdesk_ticket_team.py b/helpdesk_mgmt/models/helpdesk_ticket_team.py index 1c6abb6b4b..cccac93019 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_team.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_team.py @@ -47,7 +47,7 @@ class HelpdeskTeam(models.Model): string="Number of tickets in high priority", compute='_compute_todo_tickets') - @api.depends('ticket_ids') + @api.depends('ticket_ids', 'ticket_ids.stage_id') def _compute_todo_tickets(self): for record in self: record.todo_ticket_ids = record.ticket_ids.filtered( diff --git a/helpdesk_mgmt/readme/CONTRIBUTORS.rst b/helpdesk_mgmt/readme/CONTRIBUTORS.rst index e44cdfcda5..8b1ef14b18 100644 --- a/helpdesk_mgmt/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt/readme/CONTRIBUTORS.rst @@ -25,3 +25,9 @@ * `Tecnativa `_: * Pedro M. Baeza + +* `ID42 Sistemas `_: + + * Marcel Savegnago + * Eduardo Apar??cio + diff --git a/helpdesk_mgmt/security/helpdesk_security.xml b/helpdesk_mgmt/security/helpdesk_security.xml index 8862ae26b9..4267e7772b 100644 --- a/helpdesk_mgmt/security/helpdesk_security.xml +++ b/helpdesk_mgmt/security/helpdesk_security.xml @@ -18,7 +18,7 @@ Helpdesk Manager - + @@ -33,6 +33,13 @@
+ + All Tickets + + [(1,'=',1)] + + + Helpdesk Ticket Company Rule diff --git a/helpdesk_mgmt/views/helpdesk_dashboard_view.xml b/helpdesk_mgmt/views/helpdesk_dashboard_view.xml index b9ac7daa61..5015ce52ac 100644 --- a/helpdesk_mgmt/views/helpdesk_dashboard_view.xml +++ b/helpdesk_mgmt/views/helpdesk_dashboard_view.xml @@ -28,44 +28,44 @@
-
+
-
+
-
+ -
+
- -
+