Browse Source

Aug 30 [FIX] : Bug Fixed 'odoo_website_helpdesk'

pull/277/head
AjmalCybro 2 years ago
parent
commit
b943c289c5
  1. 10
      odoo_website_helpdesk/__manifest__.py
  2. 3
      odoo_website_helpdesk/controller/ticket_group_by.py
  3. 10
      odoo_website_helpdesk/controller/ticket_search.py
  4. 2
      odoo_website_helpdesk/models/__init__.py
  5. 5
      odoo_website_helpdesk/models/categories.py
  6. 15
      odoo_website_helpdesk/models/heldesk_team.py
  7. 162
      odoo_website_helpdesk/models/helpdesk.py
  8. 2
      odoo_website_helpdesk/models/mail_compose.py
  9. 111
      odoo_website_helpdesk/models/merge_tickets.py
  10. 27
      odoo_website_helpdesk/models/res_config.py
  11. 40
      odoo_website_helpdesk/models/support_tickets.py
  12. 7
      odoo_website_helpdesk/models/task.py
  13. 5
      odoo_website_helpdesk/report/helpdesk_ticket_report_template.xml
  14. 3
      odoo_website_helpdesk/security/ir.model.access.csv
  15. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/create-new-ticket.png
  16. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/merge-action.png
  17. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/open-model.png
  18. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/open-new-ticket.png
  19. 40
      odoo_website_helpdesk/static/description/index.html
  20. 1
      odoo_website_helpdesk/static/src/xml/helpdesk_dashboard.xml
  21. 2
      odoo_website_helpdesk/templates/helpdesk_replay_template.xml
  22. 2
      odoo_website_helpdesk/views/categories.xml
  23. 65
      odoo_website_helpdesk/views/helpdesk.xml
  24. 31
      odoo_website_helpdesk/views/helpdesk_views.xml
  25. 58
      odoo_website_helpdesk/views/merge_tickets_views.xml
  26. 106
      odoo_website_helpdesk/views/portal.xml
  27. 1
      odoo_website_helpdesk/views/portal_search.xml
  28. 4
      odoo_website_helpdesk/views/rating_form.xml
  29. 6
      odoo_website_helpdesk/views/report.xml
  30. 2
      odoo_website_helpdesk/views/res_config_settings.xml
  31. 2
      odoo_website_helpdesk/views/team.xml
  32. 37
      odoo_website_helpdesk/views/website_form.xml

10
odoo_website_helpdesk/__manifest__.py

@ -22,7 +22,7 @@
{
'name': "Website Helpdesk Support Ticket Management",
'version': '16.0.3.0.0',
'version': '16.0.4.0.0',
'summary': """Helpdesk Module for community""",
'description': """Can create ticket from website also and can manage it from backend.
Bill can be created for ticket with service cost""",
@ -34,7 +34,6 @@
'data': [
'security/security_groups.xml',
'security/ir.model.access.csv',
'views/helpdesk.xml',
'views/team.xml',
'views/portal_search.xml',
'views/res_config_settings.xml',
@ -45,6 +44,7 @@
'views/portal.xml',
'views/categories.xml',
'views/rating_form.xml',
'views/merge_tickets_views.xml',
'templates/helpdesk_replay_template.xml',
'data/ticket_sequence.xml',
'data/ticket_stage_data.xml',
@ -54,14 +54,14 @@
'report/helpdesk_ticket_report_template.xml',
],
'assets': {
'web.assets_frontend': [
'odoo_website_helpdesk/static/src/js/ticket_details.js',
],
# 'web.assets_frontend': [
# ],
'web.assets_backend': [
'odoo_website_helpdesk/static/src/xml/helpdesk_dashboard.xml',
'odoo_website_helpdesk/static/src/js/helpdesk_dashboard_action.js',
],
'web.assets_frontend': [
'odoo_website_helpdesk/static/src/js/ticket_details.js',
'/odoo_website_helpdesk/static/src/js/portal_search.js',
'/odoo_website_helpdesk/static/src/js/portal_groupby.js',
'/odoo_website_helpdesk/static/src/js/multiple_product_choose.js',

3
odoo_website_helpdesk/controller/ticket_group_by.py

@ -4,12 +4,13 @@ from odoo.http import request
class TicketGroupBy(http.Controller):
@http.route(['/ticketgroupby'], type='json', auth="public", website=True)
def ticket_group_by(self,**kwargs):
def ticket_group_by(self, **kwargs):
context = []
group_value = kwargs.get("search_value")
if group_value == '0':
context = []
tickets = request.env["help.ticket"].search([])
context.append(tickets)
if group_value == '1':
context = []
stage_ids = request.env['ticket.stage'].search([])

10
odoo_website_helpdesk/controller/ticket_search.py

@ -4,11 +4,15 @@ from odoo.http import request
class TicketSearch(http.Controller):
@http.route(['/ticketsearch'], type='json', auth="public", website=True)
def ticket_search(self,**kwargs):
def ticket_search(self, **kwargs):
search_value = kwargs.get("search_value")
tickets = request.env["help.ticket"].search([('name', '=', search_value)])
tickets = request.env["help.ticket"].search(
['|', ('name', 'ilike', search_value),
('subject', 'ilike', search_value)])
values = {
'tickets': tickets,
}
response = http.Response(template='odoo_website_helpdesk.ticket_table',qcontext=values)
response = http.Response(template='odoo_website_helpdesk.ticket_table',
qcontext=values)
return response.render()

2
odoo_website_helpdesk/models/__init__.py

@ -25,3 +25,5 @@ from . import res_config
from . import categories
from . import heldesk_team
from . import mail_compose
from . import merge_tickets
from . import support_tickets

5
odoo_website_helpdesk/models/categories.py

@ -23,8 +23,9 @@ from odoo import fields, models
class HelpdeskCategories(models.Model):
"""Category Model"""
_name = 'helpdesk.categories'
_description = 'Categories'
name = fields.Char('Name')
sequence = fields.Integer('Sequence', default=0)
name = fields.Char('Name', help='Category Name')
sequence = fields.Integer('Sequence', default=0, help='Sequence')

15
odoo_website_helpdesk/models/heldesk_team.py

@ -23,24 +23,31 @@ from odoo import api, fields, models
class HelpDeskTeam(models.Model):
"""Helpdesk team"""
_name = 'help.team'
_description = 'Helpdesk Team'
name = fields.Char('Name')
name = fields.Char('Name', help='Helpdesk Team Name')
team_lead_id = fields.Many2one('res.users', string='Team Leader',
help='Team Leader Name',
domain=lambda self: [
('groups_id', 'in', self.env.ref(
'odoo_website_helpdesk.helpdesk_team_leader').id)])
member_ids = fields.Many2many('res.users', string='Members',
help='Team Members',
domain=lambda self: [
('groups_id', 'in', self.env.ref(
'odoo_website_helpdesk.helpdesk_user').id)])
email = fields.Char('Email')
project_id = fields.Many2one('project.project', string='Project')
create_task = fields.Boolean(string="Create Task")
email = fields.Char('Email', help='Email')
project_id = fields.Many2one('project.project',
string='Project',
help='Projects')
create_task = fields.Boolean(string="Create Task",
help="Task created or not")
@api.onchange('team_lead_id')
def members_choose(self):
"""Members selection function"""
fetch_memebers = self.env['res.users'].search([])
filterd_members = fetch_memebers.filtered(
lambda x: x.id != self.team_lead_id.id)

162
odoo_website_helpdesk/models/helpdesk.py

@ -44,63 +44,95 @@ RATING = [
class HelpDeskTicket(models.Model):
"""Help_ticket model"""
_name = 'help.ticket'
_description = 'Helpdesk Ticket'
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char('Name', default=lambda self: self.env['ir.sequence'].
next_by_code('help.ticket') or _('New'))
customer_id = fields.Many2one('res.partner', string='Customer Name')
customer_name = fields.Char('Customer Name')
subject = fields.Text('Subject', required=True)
description = fields.Text('Description', required=True)
email = fields.Char('Email')
phone = fields.Char('Phone')
team_id = fields.Many2one('help.team', string='Helpdesk Team')
product_id = fields.Many2many('product.template', string='Product')
project_id = fields.Many2one('project.project', string='Project',
customer_id = fields.Many2one('res.partner',
string='Customer Name',
help='Customer Name')
customer_name = fields.Char('Customer Name', help='Customer Name')
subject = fields.Text('Subject', required=True,
help='Subject of the Ticket')
description = fields.Text('Description', required=True,
help='Description')
email = fields.Char('Email', help='Email')
phone = fields.Char('Phone', help='Contact Number')
team_id = fields.Many2one('help.team', string='Helpdesk Team',
help='Helpdesk Team Name')
product_id = fields.Many2many('product.template',
string='Product',
help='Product Name')
project_id = fields.Many2one('project.project',
string='Project',
readonly=False,
related='team_id.project_id', store=True)
related='team_id.project_id',
store=True,
help='Project Name')
priority = fields.Selection(PRIORITIES, default='1')
priority = fields.Selection(PRIORITIES, default='1', help='Priority of the'
' Ticket')
stage_id = fields.Many2one('ticket.stage', string='Stage',
default=lambda self: self.env[
'ticket.stage'].search(
[('name', '=', 'Draft')], limit=1).id,
tracking=True,
group_expand='_read_group_stage_ids')
group_expand='_read_group_stage_ids',
help='Stages')
user_id = fields.Many2one('res.users',
default=lambda self: self.env.user,
check_company=True,
index=True, tracking=True)
cost = fields.Float('Cost per hour')
index=True, tracking=True,
help='Login User')
cost = fields.Float('Cost per hour', help='Cost Per Unit')
service_product_id = fields.Many2one('product.product',
string='Service Product',
help='Service Product',
domain=[
('detailed_type', '=', 'service')])
create_date = fields.Datetime('Creation Date')
start_date = fields.Datetime('Start Date')
end_date = fields.Datetime('End Date')
public_ticket = fields.Boolean(string="Public Ticket")
invoice_ids = fields.Many2many('account.move', string='Invoices')
task_ids = fields.Many2many('project.task', string='Tasks')
color = fields.Integer(string="Color")
replied_date = fields.Datetime('Replied date')
last_update_date = fields.Datetime('Last Update Date')
ticket_type = fields.Many2one('helpdesk.types', string='Ticket Type')
create_date = fields.Datetime('Creation Date', help='Created date')
start_date = fields.Datetime('Start Date', help='Start Date')
end_date = fields.Datetime('End Date', help='End Date')
public_ticket = fields.Boolean(string="Public Ticket", help='Public Ticket')
invoice_ids = fields.Many2many('account.move',
string='Invoices',
help='Invoicing id'
)
task_ids = fields.Many2many('project.task',
string='Tasks',
help='Task id')
color = fields.Integer(string="Color", help='Color')
replied_date = fields.Datetime('Replied date', help='Replied Date')
last_update_date = fields.Datetime('Last Update Date',
help='Last Update Date')
ticket_type = fields.Many2one('helpdesk.types',
string='Ticket Type', help='Ticket Type')
team_head = fields.Many2one('res.users', string='Team Leader',
compute='_compute_team_head')
compute='_compute_team_head',
help='Team Leader Name')
assigned_user = fields.Many2one('res.users',
domain=lambda self: [
('groups_id', 'in', self.env.ref(
'odoo_website_helpdesk.helpdesk_user').id)])
category_id = fields.Many2one('helpdesk.categories')
tags = fields.Many2many('helpdesk.tag')
assign_user = fields.Boolean(default=False)
attachment_ids = fields.One2many('ir.attachment', 'res_id')
'odoo_website_helpdesk.helpdesk_user').id)],
help='Assigned User Name')
category_id = fields.Many2one('helpdesk.categories',
help='Category')
tags = fields.Many2many('helpdesk.tag', help='Tags')
assign_user = fields.Boolean(default=False, help='Assign User')
attachment_ids = fields.One2many('ir.attachment', 'res_id',
help='Attachment Line')
merge_ticket_invisible = fields.Boolean(string='Merge Ticket',
help='Merge Ticket Invisible or '
'Not', default=False)
merge_count = fields.Integer(string='Merge Count', help='Merged Tickets '
'Count')
@api.onchange('team_id', 'team_head')
def team_leader_domain(self):
"""Changing the team leader when selecting the team"""
li = []
for rec in self.team_id.member_ids:
li.append(rec.id)
@ -108,10 +140,12 @@ class HelpDeskTicket(models.Model):
@api.depends('team_id')
def _compute_team_head(self):
"""Compute the team head function"""
self.team_head = self.team_id.team_lead_id.id
@api.onchange('stage_id')
def mail_snd(self):
"""Sending mail to the user function"""
rec_id = self._origin.id
data = self.env['help.ticket'].search([('id', '=', rec_id)])
data.last_update_date = fields.Datetime.now()
@ -124,6 +158,7 @@ class HelpDeskTicket(models.Model):
mail_template.send_mail(self._origin.id, force_send=True)
def assign_to_teamleader(self):
"""Assigning team leader function"""
if self.team_id:
self.team_head = self.team_id.team_lead_id.id
mail_template = self.env.ref(
@ -137,6 +172,7 @@ class HelpDeskTicket(models.Model):
raise ValidationError("Please choose a Helpdesk Team")
def _default_show_create_task(self):
"""Task creation"""
return self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.show_create_task')
@ -148,6 +184,7 @@ class HelpDeskTicket(models.Model):
billable = fields.Boolean(string="Billable", default=False)
def _default_show_category(self):
"""Show category default"""
return self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.show_category')
@ -162,16 +199,19 @@ class HelpDeskTicket(models.Model):
('blocked', 'Blocked'), ], default='normal')
def _compute_show_category(self):
"""Compute show category"""
show_category = self._default_show_category()
for rec in self:
rec.show_category = show_category
def _compute_show_create_task(self):
"""Compute the created task"""
show_create_task = self._default_show_create_task()
for record in self:
record.show_create_task = show_create_task
def auto_close_ticket(self):
"""Automatically closing the ticket"""
auto_close = self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.auto_close_ticket')
if auto_close:
@ -201,13 +241,16 @@ class HelpDeskTicket(models.Model):
@api.model_create_multi
def create(self, vals_list):
"""Create function"""
return super(HelpDeskTicket, self).create(vals_list)
def write(self, vals):
"""Write function"""
result = super(HelpDeskTicket, self).write(vals)
return result
def create_invoice(self):
"""Create Invoice based on the ticket"""
tasks = self.env['project.task'].search(
[('project_id', '=', self.project_id.id),
('ticket_id', '=', self.id)]).filtered(
@ -219,7 +262,7 @@ class HelpDeskTicket(models.Model):
invoice_no = self.env['ir.sequence'].next_by_code(
'ticket.invoice')
move = self.env['account.move'].create([
self.env['account.move'].create([
{
'name': invoice_no,
'move_type': 'out_invoice',
@ -247,6 +290,7 @@ class HelpDeskTicket(models.Model):
}
def create_tasks(self):
"""Task creation"""
task_id = self.env['project.task'].create({
'name': self.name + '-' + self.subject,
'project_id': self.project_id.id,
@ -268,6 +312,7 @@ class HelpDeskTicket(models.Model):
}
def open_tasks(self):
"""View the Created task """
return {
'name': 'Tasks',
'domain': [('ticket_id', '=', self.id)],
@ -278,6 +323,7 @@ class HelpDeskTicket(models.Model):
}
def open_invoices(self):
"""View the Created invoice"""
return {
'name': 'Invoice',
'domain': [('ticket_id', '=', self.id)],
@ -287,7 +333,26 @@ class HelpDeskTicket(models.Model):
'type': 'ir.actions.act_window',
}
def open_merged_tickets(self):
"""Open the merged tickets tree view"""
ticket_ids = self.env['support.tickets'].search(
[('merged_ticket', '=', self.id)])
# Get the display_name matching records from the support.tickets
helpdesk_ticket_ids = ticket_ids.mapped('display_name')
# Get the IDs of the help.ticket records matching the display names
help_ticket_records = self.env['help.ticket'].search(
[('name', 'in', helpdesk_ticket_ids)])
return {
'type': 'ir.actions.act_window',
'name': 'Helpdesk Ticket',
'view_mode': 'tree,form',
'res_model': 'help.ticket',
'domain': [('id', 'in', help_ticket_records.ids)],
'context': self.env.context,
}
def action_send_reply(self):
"""Action to sent reply button"""
template_id = self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.reply_template_id'
)
@ -321,24 +386,31 @@ class HelpDeskTicket(models.Model):
class StageTicket(models.Model):
"""Stage Ticket class"""
_name = 'ticket.stage'
_description = 'Ticket Stage'
_order = 'sequence, id'
_fold_name = 'fold'
name = fields.Char('Name')
active = fields.Boolean(default=True)
sequence = fields.Integer(default=50)
closing_stage = fields.Boolean('Closing Stage', default=False)
cancel_stage = fields.Boolean('Cancel Stage', default=False)
starting_stage = fields.Boolean('Start Stage', default=False)
folded = fields.Boolean('Folded in Kanban', default=False)
name = fields.Char('Name', help='Name')
active = fields.Boolean(default=True, help='Active', string='Active')
sequence = fields.Integer(default=50, help='Sequence', string='Sequence')
closing_stage = fields.Boolean('Closing Stage', default=False,
help='Closing stage')
cancel_stage = fields.Boolean('Cancel Stage', default=False,
help='Cancel stage')
starting_stage = fields.Boolean('Start Stage', default=False,
help='Starting Stage')
folded = fields.Boolean('Folded in Kanban', default=False,
help='Folded Stage')
template_id = fields.Many2one('mail.template',
help='Templates',
domain="[('model', '=', 'help.ticket')]")
group_ids = fields.Many2many('res.groups')
fold = fields.Boolean(string='Fold')
group_ids = fields.Many2many('res.groups', help='Group ID')
fold = fields.Boolean(string='Fold', help='Folded')
def unlink(self):
"""Unlinking Function"""
for rec in self:
tickets = rec.search([])
sequence = tickets.mapped('sequence')
@ -354,20 +426,24 @@ class StageTicket(models.Model):
class HelpdeskTypes(models.Model):
"""Helpdesk types """
_name = 'helpdesk.types'
_description = 'Helpdesk Types'
name = fields.Char(string='Type')
name = fields.Char(string='Type', help='Types')
class Tasks(models.Model):
"""Inheriting the task"""
_inherit = 'project.task'
ticket_billed = fields.Boolean('Billed', default=False)
ticket_billed = fields.Boolean('Billed', default=False,
help='Billed Tickets')
class HelpdeskTags(models.Model):
"""Helpdesk tags"""
_name = 'helpdesk.tag'
_description = 'Helpdesk Tags'
name = fields.Char(string='Tag')
name = fields.Char(string='Tag', help='Tag Name')

2
odoo_website_helpdesk/models/mail_compose.py

@ -23,9 +23,11 @@ from odoo import fields, models
class MailComposeMessage(models.TransientModel):
"""Inheriting the Mail compose message"""
_inherit = 'mail.compose.message'
def _action_send_mail(self, auto_commit=False):
"""Send mail function"""
if self.model == 'help.ticket':
ticket_id = self.env['help.ticket'].browse(self.res_id)
ticket_id.replied_date = fields.Date.today()

111
odoo_website_helpdesk/models/merge_tickets.py

@ -0,0 +1,111 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import api, fields, models
class MergeTicket(models.Model):
"""Tickets merging class"""
_name = 'merge.tickets'
_description = 'Merging the selected tickets'
_rec_name = 'support_ticket_id'
user_id = fields.Many2one('res.partner',
string='Responsible User',
help='Responsible user name',
default=lambda self: self.env.user.partner_id.id)
support_team_id = fields.Many2one('help.team', string='Support Team',
help='Support Team Name')
customer_id = fields.Many2one('res.partner', string='Customer',
help='Customer Name'
)
support_ticket_id = fields.Many2one('help.ticket',
string='Support Ticket')
new_ticket = fields.Boolean(string='Create New Ticket ?',
help='Creating new tickets or not.',
default=False)
subject = fields.Char(string='Subject', help='Enter the New Ticket Subject')
merge_reason = fields.Char(string='Merge Reason', help='Merging Reason')
support_ticket_ids = fields.One2many('support.tickets',
'support_ticket_id',
string='Support Tickets',
helps='Merged tickets')
active = fields.Boolean(string='Disable Record', help='Disable Record',
default=True)
def default_get(self, fields_list):
defaults = super(MergeTicket, self).default_get(fields_list)
active_ids = self._context.get('active_ids', [])
selected_tickets = self.env['help.ticket'].browse(active_ids)
customer_ids = selected_tickets.mapped('customer_id')
subjects = selected_tickets.mapped('subject')
display_names = selected_tickets.mapped('display_name')
helpdesk_team = selected_tickets.mapped('team_id')
descriptions = selected_tickets.mapped('description')
if len(customer_ids): # Ensure both selected records have the same customer
defaults.update({
'customer_id': customer_ids[0].id,
'support_team_id': helpdesk_team,
'support_ticket_ids': [(0, 0, {
'subject': subject,
'display_name': display_name,
'description': description,
}) for subject, display_name, description in
zip(subjects, display_names,
descriptions)]
})
return defaults
def action_merge_ticket(self):
"""Merging the tickets or creating new tickets"""
if self.new_ticket:
description = "\n\n".join(
f"{ticket.subject}\n{'-' * len(ticket.subject)}\n{ticket.description}"
for ticket in self.support_ticket_ids
)
self.env['help.ticket'].create({
'subject': self.subject,
'description': description,
'customer_id': self.customer_id.id,
'team_id': self.support_team_id.id,
})
else:
if len(self.support_ticket_ids):
description = "\n\n".join(
f"{ticket.subject}\n{'-' * len(ticket.subject)}\n{ticket.description}"
for ticket in self.support_ticket_ids
)
# Update the existing support_ticket with the combined information
self.support_ticket_id.write({
'description': description,
'merge_ticket_invisible': True,
'merge_count': len(self.support_ticket_ids),
})
@api.onchange('support_ticket_id')
def _onchange_support_ticket_id(self):
"""Onchange function to add the support ticket id."""
self.support_ticket_ids.write({
'merged_ticket': self.support_ticket_id
})

27
odoo_website_helpdesk/models/res_config.py

@ -19,13 +19,15 @@
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models, fields, api
from odoo import api, fields, models
class Menu(models.Model):
"""Inheriting the website menu"""
_inherit = "website.menu"
def _compute_visible(self):
"""Compute visible"""
super()._compute_visible()
show_menu_header = self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.helpdesk_menu_show')
@ -37,32 +39,42 @@ class Menu(models.Model):
class Helpdesk(models.TransientModel):
"""Inheriting the res config"""
_inherit = 'res.config.settings'
show_create_task = fields.Boolean(string="Create Tasks",
config_parameter='odoo_website_helpdesk.show_create_task')
config_parameter='odoo_website_helpdesk.show_create_task',
help='Create Task')
show_category = fields.Boolean(string="Category",
config_parameter='odoo_website_helpdesk.show_category',
help='Category',
implied_group='odoo_website_helpdesk.group_show_category')
product_website = fields.Boolean(string="Product On Website",
config_parameter='odoo_website_helpdesk.product_website')
config_parameter='odoo_website_helpdesk.product_website',
help='Product on website')
auto_close_ticket = fields.Boolean(string="Auto Close Ticket",
config_parameter='odoo_website_helpdesk.auto_close_ticket')
config_parameter='odoo_website_helpdesk.auto_close_ticket',
help='Auto Close ticket')
no_of_days = fields.Integer(string="No Of Days",
config_parameter='odoo_website_helpdesk.no_of_days')
config_parameter='odoo_website_helpdesk.no_of_days',
help='No of Days')
closed_stage = fields.Many2one(
'ticket.stage', string='Closing stage',
help='Closing Stage',
config_parameter='odoo_website_helpdesk.closed_stage')
reply_template_id = fields.Many2one('mail.template',
domain="[('model', '=', 'help.ticket')]",
config_parameter='odoo_website_helpdesk.reply_template_id')
config_parameter='odoo_website_helpdesk.reply_template_id',
help='Reply Template')
helpdesk_menu_show = fields.Boolean('Helpdesk Menu',
config_parameter=
'odoo_website_helpdesk.helpdesk_menu_show')
'odoo_website_helpdesk.helpdesk_menu_show',
help='Helpdesk menu')
@api.onchange('closed_stage')
def closed_stage_a(self):
"""Closing stage function"""
stage = self.closed_stage.id
in_stage = self.env['ticket.stage'].search([('id', '=', stage)])
not_in_stage = self.env['ticket.stage'].search([('id', '!=', stage)])
@ -72,6 +84,7 @@ class Helpdesk(models.TransientModel):
@api.constrains('show_category')
def show_category_subcategory(self):
"""Show category and the sub category"""
if self.show_category:
group_cat = self.env.ref(
'odoo_website_helpdesk.group_show_category')

40
odoo_website_helpdesk/models/support_tickets.py

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class SupportTickets(models.Model):
"""Creating onetoMany model"""
_name = 'support.tickets'
_description = 'Support Tickets'
subject = fields.Char(string='Subject', help='Subject of the merged '
'tickets')
display_name = fields.Char(string='Display Name',
help='Display name of the merged tickets')
description = fields.Char(string='Description',
help='Description of the tickets')
support_ticket_id = fields.Many2one('merge.tickets',
string='Support Tickets',
help='Support tickets')
merged_ticket = fields.Integer(string='Merged Ticket ID',
help='Storing merged ticket id')

7
odoo_website_helpdesk/models/task.py

@ -19,16 +19,19 @@
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models, fields
from odoo import fields, models
class Task(models.Model):
"""Inheriting the project task"""
_inherit = 'project.task'
ticket_id = fields.Many2one('help.ticket', string='Ticket')
ticket_id = fields.Many2one('help.ticket', string='Ticket',
help='Ticket')
class AccountMove(models.Model):
"""Inheriting the account.move model"""
_inherit = 'account.move'
ticket_id = fields.Many2one('help.ticket', string='Ticket')

5
odoo_website_helpdesk/report/helpdesk_ticket_report_template.xml

@ -46,7 +46,6 @@
</tbody>
</table>
</div>
<t t-set="tasks"
t-value="request.env['project.task'].sudo().search([('ticket_id', '=', o.id)])"/>
@ -56,7 +55,6 @@
<strong>Tasks</strong>
</h3>
</div>
<table class="table table-bordered mt32">
<thead>
<tr>
@ -74,7 +72,6 @@
</th>
</tr>
</thead>
<t t-foreach="tasks" t-as="task">
<tbody>
<tr class="text-center">
@ -100,7 +97,6 @@
</t>
</t>
</template>
<record id="action_report_helpdesk_ticket" model="ir.actions.report">
<field name="name">Helpdesk Ticket Report</field>
<field name="model">help.ticket</field>
@ -109,5 +105,4 @@
<field name="report_file">odoo_website_helpdesk.report_helpdesk_ticket</field>
<field name="binding_type">report</field>
</record>
</odoo>

3
odoo_website_helpdesk/security/ir.model.access.csv

@ -19,3 +19,6 @@ access_helpdesk_types_manager,access.helpdesk.types,model_helpdesk_types,odoo_we
access_helpdesk_categories_user,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_user,1,0,0,0
access_helpdesk_categories_leader,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_team_leader,1,1,1,1
access_helpdesk_categories_manager,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_manager,1,1,1,1
merge_tickets,merge.tickets,model_merge_tickets,odoo_website_helpdesk.helpdesk_manager,1,1,1,1
support_tickets,support.tickets,model_support_tickets,odoo_website_helpdesk.helpdesk_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
19
20
21
22
23
24

BIN
odoo_website_helpdesk/static/description/assets/screenshots/create-new-ticket.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/merge-action.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/open-model.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/open-new-ticket.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

40
odoo_website_helpdesk/static/description/index.html

@ -26,15 +26,12 @@
Website Helpdesk Support Ticket Management
</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
A Module For Managing Support Tickets
</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/>
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
@ -313,7 +310,42 @@ Create Tasks for the project linked to the Ticket </span>
<img src="./assets/screenshots/Screenshot16.png"
class="img-thumbnail">
</div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Merge Tickets.
</h3>
<img src="./assets/screenshots/merge-action.png"
class="img-thumbnail">
</div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Merge Action Model.
</h3>
<img src="./assets/screenshots/open-model.png"
class="img-thumbnail">
</div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Create New Ticket.
</h3>
<img src="./assets/screenshots/create-new-ticket.png"
class="img-thumbnail">
</div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
New Ticket.
</h3>
<img src="./assets/screenshots/open-new-ticket.png"
class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->

1
odoo_website_helpdesk/static/src/xml/helpdesk_dashboard.xml

@ -281,6 +281,7 @@
</div>
</div>
</div>
</div>
</section>
</t>
</template>

2
odoo_website_helpdesk/templates/helpdesk_replay_template.xml

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<!-- Helpdesk Replay mail template-->
<record id="helpdesk_replay_email_template" model="mail.template">
<field name="name">Helpdesk Reply Email Template</field>
<field name="model_id"

2
odoo_website_helpdesk/views/categories.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_helpdesk_categories_tree" model="ir.ui.view">
<field name="name">categories.tree</field>
@ -10,4 +11,3 @@
</field>
</record>
</odoo>

65
odoo_website_helpdesk/views/helpdesk.xml

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Form view-->
<record id="view_helpdesk_form" model="ir.ui.view">
<field name="name">help.ticket.form</field>
<field name="model">help.ticket</field>
@ -13,7 +15,8 @@
<button name="create_invoice" string="Create Invoice"
type="object" class="btn-primary"
attrs="{'invisible':[('billable','=',False)]}"/>
<field name="stage_id" widget="statusbar" options="{'clickable': '1'}"/>
<field name="stage_id" widget="statusbar"
options="{'clickable': '1'}"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
@ -21,6 +24,16 @@
string="Tasks" type="object" icon="fa-tasks"
attrs="{'invisible':[('create_task','=',False)]}">
</button>
<button class="oe_stat_button"
name="open_merged_tickets"
string="Merged Tickets" type="object"
icon="fa-list"
attrs="{'invisible':[('merge_ticket_invisible','=',False)]}">
<div class="o_stat_info">
<field name="merge_count" readonly="True"/>
<span class="o_stat_text">Merged Tickets</span>
</div>
</button>
<button class="oe_stat_button" name="open_invoices"
string="Invoices" type="object" icon="fa-tasks"
@ -54,15 +67,15 @@
<field name="end_date"/>
<field name="product_id" widget="many2many_tags"/>
<field name="show_category" invisible="1"/>
<field name="merge_count" invisible="1"/>
<field name="merge_ticket_invisible" invisible="1"/>
</group>
</group>
<notebook>
<page string="Issue Description">
<field name="description"
placeholder="Provide the reason in detail"/>
</page>
<page string="Attachments">
<field name="attachment_ids">
<tree string="Attachments" no_open="1">
@ -80,7 +93,6 @@
</tree>
</field>
</page>
<page string="Customer Rating">
<group>
<field name="customer_rating"
@ -88,7 +100,6 @@
<field name="review"/>
</group>
</page>
<page string="Other Information">
<group>
<group>
@ -125,7 +136,7 @@
</form>
</field>
</record>
<!--Tree view-->
<record id="view_helpdesk_tree" model="ir.ui.view">
<field name="name">help.ticket.tree</field>
<field name="model">help.ticket</field>
@ -152,6 +163,7 @@
</form>
</field>
</record>
<!-- Kanban view-->
<record id="view_helpdesk_kanban" model="ir.ui.view">
<field name="name">help.ticket.kanban</field>
<field name="model">help.ticket</field>
@ -199,7 +211,6 @@
<field name="name"/>
</strong>
</div>
</div>
<div class="text-muted">
<field name="customer_id"/>
@ -215,11 +226,14 @@
<div class="oe_kanban_bottom_left">
<field name="priority"
widget="priority"/>
<field name="activity_ids" widget="kanban_activity"/>
<field name="activity_ids"
widget="kanban_activity"/>
</div>
<div class="oe_kanban_bottom_right">
<field name="kanban_state" widget="state_selection"/>
<field name="user_id" widget="many2one_avatar_user"/>
<field name="kanban_state"
widget="state_selection"/>
<field name="user_id"
widget="many2one_avatar_user"/>
</div>
</div>
</div>
@ -230,8 +244,7 @@
</kanban>
</field>
</record>
<!-- Activity view-->
<record id="helpdesk_view_activity" model="ir.ui.view">
<field name="name">help.ticket.activity</field>
<field name="model">help.ticket</field>
@ -249,7 +262,7 @@
</activity>
</field>
</record>
<!--Calendar view-->
<record id="help_ticket_view_calendar" model="ir.ui.view">
<field name="name">help.ticket.calendar</field>
<field name="model">help.ticket</field>
@ -263,8 +276,7 @@
</calendar>
</field>
</record>
<!-- Stage form view-->
<record id="view_helpdesk_stage_form" model="ir.ui.view">
<field name="name">ticket.stage.form</field>
<field name="model">ticket.stage</field>
@ -289,7 +301,7 @@
</form>
</field>
</record>
<!--Stage tree view-->
<record id="view_helpdesk_stage_tree" model="ir.ui.view">
<field name="name">ticket.stage.tree</field>
<field name="model">ticket.stage</field>
@ -302,7 +314,7 @@
</tree>
</field>
</record>
<!--Type tree view-->
<record id="view_helpdesk_types_tree" model="ir.ui.view">
<field name="name">helpdesk.types.tree</field>
<field name="model">helpdesk.types</field>
@ -312,7 +324,7 @@
</tree>
</field>
</record>
<!--tag tree-->
<record id="view_helpdesk_tag_tree" model="ir.ui.view">
<field name="name">helpdesk.tag.tree</field>
<field name="model">helpdesk.tag</field>
@ -322,7 +334,7 @@
</tree>
</field>
</record>
<!--Pivot view-->
<record id="help_ticket_view_pivot" model="ir.ui.view">
<field name="name">help.ticket.pivot</field>
<field name="model">help.ticket</field>
@ -340,7 +352,7 @@
</pivot>
</field>
</record>
<!--Graph view-->
<record id="help_ticket_view_graph" model="ir.ui.view">
<field name="name">help.ticket.graph</field>
<field name="model">help.ticket</field>
@ -358,7 +370,7 @@
</graph>
</field>
</record>
<!--Search view-->
<record id="help_ticket_search" model="ir.ui.view">
<field name="name">help.ticket.search</field>
<field name="model">help.ticket</field>
@ -368,16 +380,21 @@
<field name="subject"/>
<filter string="my_ticket" name="My Ticket"
domain="[('assigned_user', '=', uid)]"/>
<filter string="Archived" name="filter_archived"
domain="[('active','=', False)]"/>
<filter string="UnArchived" name="filter_unarchived"
domain="[('active','=', True)]"/>
<group expand="0" string="Group By">
<filter name="Customer" string="Customer"
context="{'group_by':'customer_id'}"/>
<filter name="Team" string="Team"
context="{'group_by':'team_id'}"/>
<filter name="Team_Head" string="Team Head" context="{'group_by':'team_head'}"/>
<filter name="assign" string="Assigned To" context="{'group_by':'assigned_user'}"/>
<filter name="Team_Head" string="Team Head"
context="{'group_by':'team_head'}"/>
<filter name="assign" string="Assigned To"
context="{'group_by':'assigned_user'}"/>
</group>
</search>
</field>
</record>
</odoo>

31
odoo_website_helpdesk/views/helpdesk_views.xml

@ -5,32 +5,28 @@
<field name="name">Helpdesk Dashboard</field>
<field name="tag">helpdesk_dashboard_tag</field>
</record>
<record id="action_helpdesk" model="ir.actions.act_window">
<field name="name">Helpdesk</field>
<field name="res_model">help.ticket</field>
<field name="view_mode">kanban,tree,form,calendar,activity,pivot,graph</field>
</record>
<record id="action_helpdesk_my" model="ir.actions.act_window">
<field name="name">My Helpdesk</field>
<field name="res_model">help.ticket</field>
<field name="domain">[('assigned_user','=',uid), ('team_head','=', uid)]</field>
<field name="domain">[('assigned_user','=',uid), ('team_head','=', uid)]
</field>
<field name="view_mode">kanban,tree,form,calendar,activity,pivot,graph</field>
</record>
<record id="action_helpdesk_team" model="ir.actions.act_window">
<field name="name">Helpdesk</field>
<field name="res_model">help.team</field>
<field name="view_mode">tree,form</field>
</record>
<record id="action_helpdesk_stage" model="ir.actions.act_window">
<field name="name">Stages</field>
<field name="res_model">ticket.stage</field>
<field name="view_mode">tree,form</field>
</record>
<record id="action_helpdesk_types" model="ir.actions.act_window">
<field name="name">Types</field>
<field name="res_model">helpdesk.types</field>
@ -41,7 +37,6 @@
</p>
</field>
</record>
<record id="action_helpdesk_tag" model="ir.actions.act_window">
<field name="name">Tags</field>
<field name="res_model">helpdesk.tag</field>
@ -52,7 +47,6 @@
</p>
</field>
</record>
<record id="action_helpdesk_categories" model="ir.actions.act_window">
<field name="name">Categories</field>
<field name="res_model">helpdesk.categories</field>
@ -72,21 +66,20 @@
<field name="res_model">help.ticket</field>
<field name="view_mode">graph,search</field>
</record>
<menuitem id="menu_helpdesk" name="Helpdesk" action="helpdesk_dashboard_action"
<menuitem id="menu_helpdesk" name="Helpdesk"
action="helpdesk_dashboard_action"
sequence="1"/>
<!-- <menuitem id="helpdesk_dashboard" parent="menu_helpdesk" name="Ticket Dashboard"-->
<!-- action="helpdesk_dashboard_action" sequence="1"/>-->
<menuitem id="helpdesk_management" parent="menu_helpdesk" name="Tickets"
action="action_helpdesk" sequence="2"/>
<menuitem id="helpdesk_tickets_my" parent="helpdesk_management" name="My Tickets"
<menuitem id="helpdesk_tickets_my" parent="helpdesk_management"
name="My Tickets"
action="action_helpdesk_my" sequence="1"/>
<menuitem id="helpdesk_tickets" parent="helpdesk_management" name="All Tickets"
action="action_helpdesk" sequence="2" groups="odoo_website_helpdesk.helpdesk_manager"/>
<menuitem id="helpdesk_tickets" parent="helpdesk_management"
name="All Tickets"
action="action_helpdesk" sequence="2"
groups="odoo_website_helpdesk.helpdesk_manager"/>
<menuitem id="menu_helpdesk_team" name="Helpdesk Team"
action="action_helpdesk_team"
@ -123,8 +116,8 @@
<menuitem id="menu_helpdesk_types" name="Types"
action="action_helpdesk_types"
parent="menu_helpdesk_configuration" sequence="6"/>
<menuitem id="report_helpdesk" name="Report" parent="menu_helpdesk" sequence="3"
<menuitem id="report_helpdesk" name="Report" parent="menu_helpdesk"
sequence="3"
action="action_report_helpdesk"/>
</data>
</odoo>

58
odoo_website_helpdesk/views/merge_tickets_views.xml

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Merge_tickets form view-->
<record id="merge_tickets_view_form" model="ir.ui.view">
<field name="name">merge.tickets.view.form</field>
<field name="model">merge.tickets</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="user_id"/>
<field name="support_team_id"/>
<field name="customer_id"/>
<field name="support_ticket_id"
attrs="{'invisible':[('new_ticket','=',True)]}"/>
</group>
<group>
<field name="new_ticket"/>
<field name="subject"
attrs="{'invisible':[('new_ticket','=',False)]}"/>
<field name="merge_reason"/>
</group>
</group>
<notebook>
<page string="Support Tickets">
<field name="support_ticket_ids"
options="{'no_create': True, 'no_create_edit':True}">
<tree editable="bottom" create="False" edit="False">
<field name="subject"/>
<field name="display_name"/>
<field name="description" invisible="1"/>
<field name="merged_ticket" invisible="1"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<footer>
<button name="action_merge_ticket" type="object" string="Save" class="btn btn-primary"/>
<button special="cancel" class="btn btn-primary"> Discard </button>
</footer>
</form>
</field>
</record>
<!-- Contextual action creation-->
<record id="action_merge_tickets" model="ir.actions.act_window">
<field name="name">Merge Tickets</field>
<field name="res_model">merge.tickets</field>
<field name="type">ir.actions.act_window</field>
<field name="context">{'active_ids': active_ids}</field>
<field name="view_mode">form</field>
<field name="binding_model_id" ref="model_help_ticket"/>
<field name="target">new</field>
<field name="view_id"
ref="odoo_website_helpdesk.merge_tickets_view_form"/>
</record>
</odoo>

106
odoo_website_helpdesk/views/portal.xml

@ -1,18 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="portal_my_home_menu_tickets"
name="Portal layout : upcoming tickets"
inherit_id="portal.portal_breadcrumbs" priority="30">
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
<li t-if="page_name == 'ticket'">
<a t-if="ticket" t-attf-href="/my/tickets">/ Helpdesk Tickets</a>
<a t-if="ticket" t-attf-href="/my/tickets">/ Helpdesk Tickets
</a>
<t t-else="">/ Helpdesk Tickets</t>
</li>
<li t-if="ticket" class="breadcrumb-item active">
/ <t t-esc="details['display_name']"/>
/
<t t-esc="details['display_name']"/>
<!-- <span t-field="ticket.name"/>-->
</li>
</xpath>
</template>
<template id="portal_my_home_helpdesk" name="Tickets"
inherit_id="portal.portal_my_home" priority="1"
customize_show="True">
@ -24,9 +27,7 @@
</t>
</xpath>
</template>
<template id="portal_my_tickets" name="My Tickets">
<div>
<t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True"/>
@ -35,7 +36,6 @@
</t>
<t t-call="odoo_website_helpdesk.ticket_table"/>
</t>
</div>
</template>
<template id="ticket_table">
<div class="search_ticket">
@ -46,7 +46,8 @@
<span class='d-none d-md-inline'>Ticket #</span>
</th>
<th class="text-right">Subject</th>
<th style="display:none;" class="text-right">Priority</th>
<th style="display:none;" class="text-right">Priority
</th>
<th class="text-right">Date</th>
<th class="text-right">Stage</th>
</tr>
@ -55,7 +56,8 @@
<t t-foreach="tickets" t-as="ticket">
<tr>
<td id="my_selector">
<a id="popover" t-attf-href="/my/tickets/{{ticket.id}}">
<a id="popover"
t-attf-href="/my/tickets/{{ticket.id}}">
<t t-esc="ticket.name" t-value="ticket.id"/>
</a>
</td>
@ -97,27 +99,30 @@
</p>
</div>
</template>
<template id="portal_ticket_details" name="My Tickets">
<t t-call="portal.portal_layout">
<div class="row mt16 o_portal_sale_sidebar">
<!-- Sidebar -->
<t t-call="portal.portal_record_sidebar">
<t t-set="classes" t-value="'col-lg-auto d-print-none'"/>
<t t-set="title">
<h4 class="mb-0"><t t-esc="details['display_name']"/></h4>
<h4 class="mb-0">
<t t-esc="details['display_name']"/>
</h4>
</t>
<t t-set="entries">
<ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column">
<li class="list-group-item d-grid align-content-start">
<a class="btn btn-primary fa fa-download" t-attf-href="/my/tickets/download/{{details.id}}" target="_blank">
<a class="btn btn-primary fa fa-download"
t-attf-href="/my/tickets/download/{{details.id}}"
target="_blank">
Download
</a>
</li>
<li class="list-group-item d-grid align-content-start">
<div class="small mb-1">
<strong class="text-muted">Your Contact</strong>
<strong class="text-muted">Your Contact
</strong>
</div>
<div class="row flex-nowrap">
<div class="col flex-grow-0 pe-2">
@ -125,7 +130,8 @@
t-att-src="image_data_uri(details['customer_id'].avatar_1024)"
alt="Contact"/>
</div>
<div class="col ps-0" style="min-width: 150px">
<div class="col ps-0"
style="min-width: 150px">
<span t-esc="details['customer_id']"
t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/>
</div>
@ -134,13 +140,13 @@
</ul>
</t>
</t>
<!-- Page content -->
<div id="helpdesk_content" class="col-12 col-lg justify-content-end">
<div t-attf-class="card #{'pb-5' if report_type == 'html' else ''}" id="portal_doc_content">
<div id="helpdesk_content"
class="col-12 col-lg justify-content-end">
<div t-attf-class="card #{'pb-5' if report_type == 'html' else ''}"
id="portal_doc_content">
<div t-call="odoo_website_helpdesk.helpdesk_content_preview"/>
</div>
<!-- chatter -->
<div id="helpdesk_ticket_communication" class="mt-4">
<h2>History</h2>
@ -149,64 +155,89 @@
</t>
</div>
</div>
</div>
</t>
</template>
<template id="helpdesk_content_preview" name="Sales Order Portal Content">
<div id="introduction" t-attf-class="pb-2 pt-3 #{'card-header bg-white' if report_type == 'html' else ''}" style="height:700px;">
<div id="introduction"
t-attf-class="pb-2 pt-3 #{'card-header bg-white' if report_type == 'html' else ''}"
style="height:700px;">
<div class="container">
<h4 class="mb-0" style="margin-left:15px;"><b><t t-esc="details['display_name']"/></b></h4>
<h4 class="mb-0" style="margin-left:15px;">
<b>
<t t-esc="details['display_name']"/>
</b>
</h4>
<hr style="width:100%"/>
</div>
<table class="table table-borderless">
<tr>
<th>Ticket Type</th>
<td><t t-esc="details['ticket_type'].name"/></td>
<td>
<t t-esc="details['ticket_type'].name"/>
</td>
<th>Create Date</th>
<td><t t-esc="details['create_date']"/></td>
<td>
<t t-esc="details['create_date']"/>
</td>
</tr>
<tr>
<th>Last Update Date</th>
<td><t t-esc="details['__last_update']"/></td>
<td>
<t t-esc="details['__last_update']"/>
</td>
<th>Person Name</th>
<td><t t-esc="details['customer_id'].name"/></td>
<td>
<t t-esc="details['customer_id'].name"/>
</td>
</tr>
<tr>
<th>Ticket Subject</th>
<td><t t-esc="details['subject']"/></td>
<td>
<t t-esc="details['subject']"/>
</td>
<th>Email</th>
<td><t t-esc="details['customer_id'].email"/></td>
<td>
<t t-esc="details['customer_id'].email"/>
</td>
</tr>
<tr>
<th>Category</th>
<td><t t-esc="details['category_id'].name"/></td>
<td>
<t t-esc="details['category_id'].name"/>
</td>
<th>Replied Date</th>
<td><t t-esc="details['replied_date']"/></td>
<td>
<t t-esc="details['replied_date']"/>
</td>
</tr>
<tr>
<th>Priority</th>
<td><t t-esc="details['priority']"/></td>
<td>
<t t-esc="details['priority']"/>
</td>
<th>Consultant</th>
<td><t t-esc="details['assigned_user'].name"/></td>
<td>
<t t-esc="details['assigned_user'].name"/>
</td>
</tr>
<tr>
<th>Status</th>
<td><t t-esc="details['stage_id'].name"/></td>
<td>
<t t-esc="details['stage_id'].name"/>
</td>
</tr>
<tr>
<th>Description</th>
</tr>
<tr>
<td colspan="4"><t t-esc="details['description']"/></td>
<td colspan="4">
<t t-esc="details['description']"/>
</td>
</tr>
</table>
</div>
</template>
<template id="ticket_group_by_table">
<t t-if="tickets" t-call="portal.portal_table">
<thead>
@ -277,5 +308,4 @@
account.
</p>
</template>
</odoo>

1
odoo_website_helpdesk/views/portal_search.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="helpdesk_website_inherit"
inherit_id="portal.portal_searchbar">

4
odoo_website_helpdesk/views/rating_form.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="rating_form" name="Ticket Rating">
<t t-call="website.layout">
@ -75,7 +76,6 @@
</input>
</div>
</div>
<div class="o_portal_chatter_composer_body mb32">
<label>Your
Review
@ -95,7 +95,6 @@
Your
Review
</button>
</div>
</div>
</div>
@ -106,7 +105,6 @@
</t>
</template>
<template id="rating_thanks" name="Thanks Rating">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_text_block pt40 pb40 o_colored_level "

6
odoo_website_helpdesk/views/report.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="report_help_ticket">
<t t-call="web.html_container">
@ -46,17 +47,14 @@
</tbody>
</table>
</div>
<t t-set="tasks"
t-value="request.env['project.task'].search([('ticket_id', '=', o.id)])"/>
<t t-if="tasks">
<div>
<h3 class="text-center">
<strong>Tasks</strong>
</h3>
</div>
<table class="table table-bordered mt32">
<thead>
<tr>
@ -74,7 +72,6 @@
</th>
</tr>
</thead>
<t t-foreach="tasks" t-as="task">
<tbody>
<tr class="text-center">
@ -100,7 +97,6 @@
</t>
</t>
</template>
<record id="report_ticket" model="ir.actions.report">
<field name="name">Support Ticket</field>
<field name="model">help.ticket</field>

2
odoo_website_helpdesk/views/res_config_settings.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="ticket_res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.helpdesk
@ -34,7 +35,6 @@
</div>
</div>
</div>
<div class="row mt16 o_settings_container">
<div class="col-lg-6 o_setting_box">
<div class="o_setting_left_pane">

2
odoo_website_helpdesk/views/team.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_helpdesk_team_form" model="ir.ui.view">
<field name="name">help.team.form</field>
@ -44,7 +45,6 @@
</form>
</field>
</record>
<record id="view_helpdesk_team_tree" model="ir.ui.view">
<field name="name">help.team.tree</field>
<field name="model">help.team</field>

37
odoo_website_helpdesk/views/website_form.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="website_helpdesk" model="website.menu">
<field name="name">Helpdesk</field>
@ -5,7 +6,6 @@
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">55</field>
</record>
<record id="odoo_website_helpdesk.helpdesk_thanks" model="website.page">
<field name="name">Thanks (Helpdesk)</field>
<field name="type">qweb</field>
@ -78,7 +78,6 @@
</t>
</field>
</record>
<template id="ticket_form" name="Helpdesk Ticket">
<t t-call="website.layout">
<t t-set="logged_partner"
@ -225,7 +224,6 @@
</div>
<br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_custom"
data-type="char"
data-name="Field">
@ -254,7 +252,6 @@
</div>
</div><br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_required"
data-type="char"
data-name="Field">
@ -311,7 +308,6 @@
<br/>
</div>
</t>
<div class="form-group col-12 s_website_form_field s_website_form_required"
data-type="char"
data-name="Field">
@ -364,37 +360,6 @@
<div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required"
data-type="text"
data-name="Field">
<!-- <div class="row s_col_no_resize s_col_no_bgcolor">-->
<!-- <label class="col-form-label col-sm-auto s_website_form_label"-->
<!-- style="width: 200px">-->
<!-- <span class="s_website_form_label_content">-->
<!-- Priority-->
<!-- </span>-->
<!-- </label>-->
<!-- <div class="col-sm">-->
<!-- <select id="priority"-->
<!-- name="priority"-->
<!-- required=""-->
<!-- class="form-control s_website_form_input">-->
<!-- <option value="0"-->
<!-- selected="selected">-->
<!-- Very-->
<!-- Low-->
<!-- </option>-->
<!-- <option value="1">-->
<!-- Low-->
<!-- </option>-->
<!-- <option value="2">-->
<!-- Normal-->
<!-- </option>-->
<!-- <option value="3">-->
<!-- High-->
<!-- </option>-->
<!-- </select>-->
<!-- </div>-->
<!-- </div>-->
<br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required"

Loading…
Cancel
Save