Browse Source

[ADD] Initial Commit 'odoo_website_helpdesk'

pull/221/merge
AjmalCybro 2 years ago
parent
commit
50e9d402d7
  1. 42
      odoo_website_helpdesk/README.rst
  2. 24
      odoo_website_helpdesk/__init__.py
  3. 57
      odoo_website_helpdesk/__manifest__.py
  4. 24
      odoo_website_helpdesk/controller/__init__.py
  5. 62
      odoo_website_helpdesk/controller/portal.py
  6. 113
      odoo_website_helpdesk/controller/website_form.py
  7. 20
      odoo_website_helpdesk/data/ticket_sequence.xml
  8. 30
      odoo_website_helpdesk/data/ticket_stage_data.xml
  9. 9
      odoo_website_helpdesk/doc/RELEASE_NOTES.md
  10. 25
      odoo_website_helpdesk/models/__init__.py
  11. 226
      odoo_website_helpdesk/models/helpdesk.py
  12. 30
      odoo_website_helpdesk/models/res_config.py
  13. 34
      odoo_website_helpdesk/models/task.py
  14. 4
      odoo_website_helpdesk/security/ir.model.access.csv
  15. BIN
      odoo_website_helpdesk/static/description/assets/icons/check.png
  16. BIN
      odoo_website_helpdesk/static/description/assets/icons/chevron.png
  17. BIN
      odoo_website_helpdesk/static/description/assets/icons/cogs.png
  18. BIN
      odoo_website_helpdesk/static/description/assets/icons/consultation.png
  19. BIN
      odoo_website_helpdesk/static/description/assets/icons/ecom-black.png
  20. BIN
      odoo_website_helpdesk/static/description/assets/icons/education-black.png
  21. BIN
      odoo_website_helpdesk/static/description/assets/icons/hotel-black.png
  22. BIN
      odoo_website_helpdesk/static/description/assets/icons/license.png
  23. BIN
      odoo_website_helpdesk/static/description/assets/icons/lifebuoy.png
  24. BIN
      odoo_website_helpdesk/static/description/assets/icons/logo.png
  25. BIN
      odoo_website_helpdesk/static/description/assets/icons/manufacturing-black.png
  26. BIN
      odoo_website_helpdesk/static/description/assets/icons/pos-black.png
  27. BIN
      odoo_website_helpdesk/static/description/assets/icons/puzzle.png
  28. BIN
      odoo_website_helpdesk/static/description/assets/icons/restaurant-black.png
  29. BIN
      odoo_website_helpdesk/static/description/assets/icons/service-black.png
  30. BIN
      odoo_website_helpdesk/static/description/assets/icons/trading-black.png
  31. BIN
      odoo_website_helpdesk/static/description/assets/icons/training.png
  32. BIN
      odoo_website_helpdesk/static/description/assets/icons/update.png
  33. BIN
      odoo_website_helpdesk/static/description/assets/icons/user.png
  34. BIN
      odoo_website_helpdesk/static/description/assets/icons/wrench.png
  35. BIN
      odoo_website_helpdesk/static/description/assets/misc/categories.png
  36. BIN
      odoo_website_helpdesk/static/description/assets/misc/check-box.png
  37. BIN
      odoo_website_helpdesk/static/description/assets/misc/compass.png
  38. BIN
      odoo_website_helpdesk/static/description/assets/misc/corporate.png
  39. BIN
      odoo_website_helpdesk/static/description/assets/misc/customer-support.png
  40. BIN
      odoo_website_helpdesk/static/description/assets/misc/cybrosys-logo.png
  41. BIN
      odoo_website_helpdesk/static/description/assets/misc/features.png
  42. BIN
      odoo_website_helpdesk/static/description/assets/misc/logo.png
  43. BIN
      odoo_website_helpdesk/static/description/assets/misc/pictures.png
  44. BIN
      odoo_website_helpdesk/static/description/assets/misc/pie-chart.png
  45. BIN
      odoo_website_helpdesk/static/description/assets/misc/right-arrow.png
  46. BIN
      odoo_website_helpdesk/static/description/assets/misc/star.png
  47. BIN
      odoo_website_helpdesk/static/description/assets/misc/support.png
  48. BIN
      odoo_website_helpdesk/static/description/assets/misc/whatsapp.png
  49. BIN
      odoo_website_helpdesk/static/description/assets/modules/budget_image.png
  50. BIN
      odoo_website_helpdesk/static/description/assets/modules/credit_image.png
  51. BIN
      odoo_website_helpdesk/static/description/assets/modules/employee_image.png
  52. BIN
      odoo_website_helpdesk/static/description/assets/modules/export_image.png
  53. BIN
      odoo_website_helpdesk/static/description/assets/modules/gantt_image.png
  54. BIN
      odoo_website_helpdesk/static/description/assets/modules/quotation_image.png
  55. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot1.png
  56. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot10.png
  57. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot11.png
  58. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot12.png
  59. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot13.png
  60. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot14.png
  61. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot15.png
  62. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot16.png
  63. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot2.png
  64. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot3.png
  65. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot4.png
  66. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot5.png
  67. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot6.png
  68. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot7.png
  69. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot8.png
  70. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/Screenshot9.png
  71. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/hero.gif
  72. BIN
      odoo_website_helpdesk/static/description/banner.png
  73. BIN
      odoo_website_helpdesk/static/description/icon.png
  74. 751
      odoo_website_helpdesk/static/description/index.html
  75. 35
      odoo_website_helpdesk/static/src/js/ticket_details.js
  76. 201
      odoo_website_helpdesk/views/helpdesk.xml
  77. 58
      odoo_website_helpdesk/views/helpdesk_views.xml
  78. 98
      odoo_website_helpdesk/views/portal.xml
  79. 107
      odoo_website_helpdesk/views/report.xml
  80. 28
      odoo_website_helpdesk/views/res_config_settings.xml
  81. 50
      odoo_website_helpdesk/views/team.xml
  82. 360
      odoo_website_helpdesk/views/website_form.xml

42
odoo_website_helpdesk/README.rst

@ -0,0 +1,42 @@
Website Helpdesk Support Ticket Management
=========================================
* HelpDesk Support for Odoo 16 community editions
Installation
============
- www.odoo.com/documentation/16.0/setup/install.html
- Install our custom addon
License
-------
General Public License, Version 3 (LGPL v3).
(https://www.odoo.com/documentation/user/15.0/legal/licenses/licenses.html)
Company
-------
* 'Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer:
(v16) Robin @ Cybrosys
Contacts
--------
* Mail Contact : odoo@cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com
Further information
===================
HTML Description: `<static/description/index.html>`__

24
odoo_website_helpdesk/__init__.py

@ -0,0 +1,24 @@
# -*- 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 . import controller
from . import models

57
odoo_website_helpdesk/__manifest__.py

@ -0,0 +1,57 @@
# -*- 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/>.
#
#############################################################################
{
'name': "Website Helpdesk Support Ticket Management V16",
'version': '16.0.1.0.0',
'summary': """Website Helpdesk Support Ticket Management for V16 Community""",
'description': """Website Helpdesk Support Ticket Management for V16 Community, Helpdesk, helpdesk, support, ticket""",
'author': "Cybrosys Techno Solutions",
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'category': 'Website',
'depends': ['website', 'project', 'sale_project', 'hr_timesheet'],
'data': [
'security/ir.model.access.csv',
'views/helpdesk.xml',
'views/team.xml',
'views/res_config_settings.xml',
'views/website_form.xml',
'views/report.xml',
'views/helpdesk.xml',
'views/helpdesk_views.xml',
'views/portal.xml',
'data/ticket_sequence.xml',
'data/ticket_stage_data.xml',
],
'assets': {
'web.assets_frontend': [
'odoo_website_helpdesk/static/src/js/ticket_details.js',
],
},
'images': ['static/description/banner.png'],
'license': 'LGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

24
odoo_website_helpdesk/controller/__init__.py

@ -0,0 +1,24 @@
# -*- 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 . import website_form
from . import portal

62
odoo_website_helpdesk/controller/portal.py

@ -0,0 +1,62 @@
# -*- 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 http
from odoo.addons.portal.controllers import portal
from odoo.http import request
class TicketPortal(portal.CustomerPortal):
def _prepare_home_portal_values(self, counters):
values = super()._prepare_home_portal_values(counters)
if 'ticket_count' in counters:
ticket_count = request.env['help.ticket'].search_count(
self._get_tickets_domain()) if request.env[
'help.ticket'].check_access_rights(
'read', raise_exception=False) else 0
values['ticket_count'] = ticket_count
return values
# checking domain:
def _get_tickets_domain(self):
return [('customer_id', '=', request.env.user.partner_id.id)]
@http.route(['/my/tickets'], type='http', auth="user", website=True)
def portal_my_tickets(self):
domain = self._get_tickets_domain()
tickets = request.env['help.ticket'].search(domain)
values = {
'default_url': "/my/tickets",
'tickets': tickets,
'page_name': 'ticket',
}
return request.render("odoo_website_helpdesk.portal_my_tickets",
values)
class WebsiteDesk(http.Controller):
@http.route(['/helpdesk_ticket'], type='http', auth="public", website=True,
sitemap=True)
def helpdesk_ticket(self, **kwargs):
return request.render('odoo_website_helpdesk.ticket_form')

113
odoo_website_helpdesk/controller/website_form.py

@ -0,0 +1,113 @@
# -*- 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/>.
#
#############################################################################
import base64
import json
from psycopg2 import IntegrityError
from odoo import _
from odoo.addons.website.controllers.form import WebsiteForm
from odoo.exceptions import ValidationError
from odoo.http import request
class WebsiteFormInherit(WebsiteForm):
def _handle_website_form(self, model_name, **kwargs):
if model_name == 'help.ticket':
rec_val = {
'customer_name': kwargs.get('customer_name'),
'subject': kwargs.get('subject'),
'description': kwargs.get('description'),
'email': kwargs.get('email_from'),
'phone': kwargs.get('phone'),
'priority': kwargs.get('priority'),
'stage_id': request.env['ticket.stage'].search(
[('name', '=', 'Inbox')], limit=1).id,
}
partner = request.env['res.partner'].sudo().search(
[('name', '=', kwargs.get('customer_name')),
('email', '=', kwargs.get('email_from'))], limit=1)
if partner:
rec_val['customer_id'] = partner.id
else:
rec_val['public_ticket'] = True
ticket_id = request.env['help.ticket'].sudo().create(rec_val)
request.session['ticket_number'] = ticket_id.name
request.session['ticket_id'] = ticket_id.id
model_record = request.env['ir.model'].sudo().search(
[('model', '=', model_name)])
data = self.extract_data(model_record, request.params)
if 'ticket_attachment' in request.params or request.httprequest.files or data.get(
'attachments'):
attached_files = data.get('attachments')
for attachment in attached_files:
attached_file = attachment.read()
request.env['ir.attachment'].sudo().create({
'name': attachment.filename,
'res_model': 'help.ticket',
'res_id': ticket_id.id,
'type': 'binary',
'datas': base64.encodebytes(attached_file),
})
request.session['form_builder_model_model'] = model_record.model
request.session['form_builder_model'] = model_record.name
request.session['form_builder_id'] = ticket_id.id
return json.dumps({'id': ticket_id.id})
else:
model_record = request.env['ir.model'].sudo().search(
[('model', '=', model_name)])
if not model_record:
return json.dumps({
'error': _("The form's specified model does not exist")
})
try:
data = self.extract_data(model_record, request.params)
# If we encounter an issue while extracting data
except ValidationError as e:
return json.dumps({'error_fields': e.args[0]})
try:
id_record = self.insert_record(request, model_record,
data['record'], data['custom'],
data.get('meta'))
if id_record:
self.insert_attachment(model_record, id_record,
data['attachments'])
# in case of an email, we want to send it immediately instead of waiting
# for the email queue to process
if model_name == 'mail.mail':
request.env[model_name].sudo().browse(id_record).send()
# Some fields have additional SQL constraints that we can't check generically
# Ex: crm.lead.probability which is a float between 0 and 1
# TODO: How to get the name of the erroneous field ?
except IntegrityError:
return json.dumps(False)
request.session['form_builder_model_model'] = model_record.model
request.session['form_builder_model'] = model_record.name
request.session['form_builder_id'] = id_record
return json.dumps({'id': id_record})

20
odoo_website_helpdesk/data/ticket_sequence.xml

@ -0,0 +1,20 @@
<odoo>
<record id="sequence_help_ticket_seq" model="ir.sequence">
<field name="name">Helpdesk</field>
<field name="code">help.ticket</field>
<field name="prefix">TKT</field>
<field name="padding">5</field>
<field eval="1" name="number_increment"/>
<field eval="False" name="company_id"/>
</record>
<record id="sequence_help_ticket_inv_seq" model="ir.sequence">
<field name="name">Helpdesk Invoice</field>
<field name="code">ticket.invoice</field>
<field name="prefix">INV/TKT/%(year)s/</field>
<field name="padding">3</field>
<field eval="1" name="number_increment"/>
<field eval="False" name="company_id"/>
</record>
</odoo>

30
odoo_website_helpdesk/data/ticket_stage_data.xml

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Project Stages -->
<record id="stage_inbox" model="ticket.stage">
<field name="sequence">10</field>
<field name="name">Inbox</field>
</record>
<record id="stage_draft" model="ticket.stage">
<field name="sequence">15</field>
<field name="name">Draft</field>
</record>
<record id="ticket_stage_03" model="ticket.stage">
<field name="sequence">20</field>
<field name="name">In Progress</field>
</record>
<record id="ticket_stage_04" model="ticket.stage">
<field name="sequence">25</field>
<field name="name">Done</field>
<field name="folded" eval="True"/>
</record>
<record id="ticket_stage_05" model="ticket.stage">
<field name="sequence">30</field>
<field name="name">Canceled</field>
<field name="folded" eval="True"/>
</record>
</odoo>

9
odoo_website_helpdesk/doc/RELEASE_NOTES.md

@ -0,0 +1,9 @@
## Module <odoo_website_helpdesk>
#### 09.11.2022
#### Version 16.0.1.0.0
#### ADD
- Initial commit for Website Helpdesk Support Ticket

25
odoo_website_helpdesk/models/__init__.py

@ -0,0 +1,25 @@
# -*- 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 . import helpdesk
from . import task
from . import res_config

226
odoo_website_helpdesk/models/helpdesk.py

@ -0,0 +1,226 @@
# -*- 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/>.
#
#############################################################################
import logging
from odoo import models, fields, api, _
from odoo.exceptions import UserError
_logger = logging.getLogger(__name__)
PRIORITIES = [
('0', 'Very Low'),
('1', 'Low'),
('2', 'Normal'),
('3', 'High'),
('4', 'Very High')]
class HelpDeskTicket(models.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')
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.Many2one('product.product', string='Product')
project_id = fields.Many2one('project.project', string='Project',
readonly=False,
related='team_id.project_id', store=True)
priority = fields.Selection(PRIORITIES, default='1')
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')
cost = fields.Float('Cost per hour')
service_product_id = fields.Many2one('product.product',
string='Service Product',
domain=[
('detailed_type', '=', 'service')])
start_date = fields.Date('Start Date')
end_date = fields.Date('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", default=6)
def _default_show_create_task(self):
return self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.show_create_task')
show_create_task = fields.Boolean(string="Create Task",
default=_default_show_create_task,
compute='_compute_show_create_task')
create_task = fields.Boolean(string="Create Task", readonly=False,
related='team_id.create_task', store=True)
billable = fields.Boolean(string="Billable", default=False)
def _compute_show_create_task(self):
show_create_task = self._default_show_create_task()
for record in self:
record.show_create_task = show_create_task
def default_stage_id(self):
# Search your stage
return self.env['ticket.stage'].search(
[('name', '=', 'Draft')], limit=1).id
@api.model
def _read_group_stage_ids(self, stages, domain, order):
"""
return the stages to stage_ids
"""
stage_ids = self.env['ticket.stage'].search([])
return stage_ids
@api.model_create_multi
def create(self, vals_list):
return super(HelpDeskTicket, self).create(vals_list)
def write(self, vals):
result = super(HelpDeskTicket, self).write(vals)
return result
def create_invoice(self):
tasks = self.env['project.task'].search(
[('project_id', '=', self.project_id.id),
('ticket_id', '=', self.id)]).filtered(
lambda line: line.ticket_billed == False)
if not tasks:
raise UserError('No Tasks to Bill')
total = sum(x.effective_hours for x in tasks if x.effective_hours > 0)
invoice_no = self.env['ir.sequence'].next_by_code(
'ticket.invoice')
move = self.env['account.move'].create([
{
'name': invoice_no,
'move_type': 'out_invoice',
'partner_id': self.customer_id.id,
'ticket_id': self.id,
'date': fields.Date.today(),
'invoice_date': fields.Date.today(),
'invoice_line_ids': [(0, 0,
{'product_id': self.service_product_id.id,
'name': self.service_product_id.name,
'quantity': total,
'product_uom_id': self.service_product_id.uom_id.id,
'price_unit': self.cost,
'account_id': self.service_product_id.categ_id.property_account_income_categ_id.id,
})],
}, ])
for task in tasks:
task.ticket_billed = True
return {
'effect': {
'fadeout': 'medium',
'message': 'Billed Successfully!',
'type': 'rainbow_man',
}
# 'view_type': 'form',
# 'res_model': 'account.move',
# 'res_id': move.id,
# 'view_id': False,
# 'view_mode': 'form',
# 'type': 'ir.actions.act_window',
}
def create_tasks(self):
task_id = self.env['project.task'].create({
'name': self.name + '-' + self.subject,
'project_id': self.project_id.id,
'company_id': self.env.company.id,
'ticket_id': self.id,
})
self.write({
'task_ids': [(4, task_id.id)]
})
return {
'name': 'Tasks',
'res_model': 'project.task',
'view_id': False,
'res_id': task_id.id,
'view_mode': 'form',
'type': 'ir.actions.act_window',
'target': 'new',
}
def open_tasks(self):
return {
'name': 'Tasks',
'domain': [('ticket_id', '=', self.id)],
'res_model': 'project.task',
'view_id': False,
'view_mode': 'tree,form',
'type': 'ir.actions.act_window',
}
def open_invoices(self):
return {
'name': 'Invoice',
'domain': [('ticket_id', '=', self.id)],
'res_model': 'account.move',
'view_id': False,
'view_mode': 'tree,form',
'type': 'ir.actions.act_window',
}
class StageTicket(models.Model):
_name = 'ticket.stage'
_description = 'Ticket Stage'
_order = 'sequence, id'
name = fields.Char('Name')
active = fields.Boolean(default=True)
sequence = fields.Integer(default=50)
closing_stage = fields.Boolean('Closing Stage', default=False)
folded = fields.Boolean('Folded in Kanban', default=False)
class Tasks(models.Model):
_inherit = 'project.task'
ticket_billed = fields.Boolean('Billed', default=False)
class HelpDeskTeam(models.Model):
_name = 'help.team'
_description = 'Helpdesk Team'
name = fields.Char('Name')
member_ids = fields.Many2many('res.users', string='Members')
email = fields.Char('Email')
project_id = fields.Many2one('project.project', string='Project')
create_task = fields.Boolean(string="Create Task")

30
odoo_website_helpdesk/models/res_config.py

@ -0,0 +1,30 @@
# -*- 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 models, fields
class Helpdesk(models.TransientModel):
_inherit = 'res.config.settings'
show_create_task = fields.Boolean(
string="Create Tasks",
config_parameter='odoo_website_helpdesk.show_create_task')

34
odoo_website_helpdesk/models/task.py

@ -0,0 +1,34 @@
# -*- 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 models, fields
class Task(models.Model):
_inherit = 'project.task'
ticket_id = fields.Many2one('help.ticket', string='Ticket')
class AccountMove(models.Model):
_inherit = 'account.move'
ticket_id = fields.Many2one('help.ticket', string='Ticket')

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

@ -0,0 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_help_ticket,access.help.ticket,model_help_ticket,,1,1,1,1
access_help_ticket_teams,access.help.team,model_help_team,,1,1,1,1
access_help_ticket_stage,access.ticket.stage,model_ticket_stage,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_help_ticket access.help.ticket model_help_ticket 1 1 1 1
3 access_help_ticket_teams access.help.team model_help_team 1 1 1 1
4 access_help_ticket_stage access.ticket.stage model_ticket_stage 1 1 1 1

BIN
odoo_website_helpdesk/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
odoo_website_helpdesk/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
odoo_website_helpdesk/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
odoo_website_helpdesk/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
odoo_website_helpdesk/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
odoo_website_helpdesk/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
odoo_website_helpdesk/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
odoo_website_helpdesk/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
odoo_website_helpdesk/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
odoo_website_helpdesk/static/description/assets/icons/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
odoo_website_helpdesk/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
odoo_website_helpdesk/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
odoo_website_helpdesk/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
odoo_website_helpdesk/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
odoo_website_helpdesk/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
odoo_website_helpdesk/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
odoo_website_helpdesk/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
odoo_website_helpdesk/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
odoo_website_helpdesk/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
odoo_website_helpdesk/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
odoo_website_helpdesk/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
odoo_website_helpdesk/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
odoo_website_helpdesk/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
odoo_website_helpdesk/static/description/assets/modules/budget_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
odoo_website_helpdesk/static/description/assets/modules/credit_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
odoo_website_helpdesk/static/description/assets/modules/employee_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
odoo_website_helpdesk/static/description/assets/modules/export_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
odoo_website_helpdesk/static/description/assets/modules/gantt_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
odoo_website_helpdesk/static/description/assets/modules/quotation_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/Screenshot9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
odoo_website_helpdesk/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
odoo_website_helpdesk/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

751
odoo_website_helpdesk/static/description/index.html

@ -0,0 +1,751 @@
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="./assets/misc/cybrosys-logo.png" width="42" height="42"
style="width: 42px; height: 42px;"/>
<div>
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Odoo.sh
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
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;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/compass.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="./assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this
module</span>
</div>
<img src="./assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this
module</span>
</div>
<img src="./assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/pie-chart.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Overview
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
In the Helpdesk Support App, one can Create Ticket trough website portal and can view their tickets.</p>
The Internal user can assign th ticket to any team and link to any project if needed and can invoice based on the
timesheet
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/features.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Features
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Website Ticket Creation
</span>
</div>
</div>
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
View created tickets from portal
</span>
</div>
</div>
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Create Tasks for the project linked to the Ticket </span>
</div>
</div>
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Link a project to the Ticket and invoice based on the tasks timesheet
</span>
</div>
</div>
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Tickets can be viewed and managed from backend
</span>
</div>
</div>
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Customise stages or use predefined stages for seeing the status of ticket
</span>
</div>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/pictures.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Screenshots
</h2>
</div>
<div class="row">
<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 Tickets From website,
</h3>
<img src="./assets/screenshots/Screenshot1.png"
class="img-thumbnail"><br/> <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Get Confirmation/Success message for ticket creation
</h3><br/>
<img src="./assets/screenshots/Screenshot2.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
View created tickets from portal
</h3>
<img src="./assets/screenshots/Screenshot4.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
View the details of each ticket by hovering over them.
</h3>
<img src="./assets/screenshots/Screenshot3.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Configure stages for tickets
</h3>
<img src="./assets/screenshots/Screenshot5.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
View tickets according to stages in kanban view.
</h3>
<img src="./assets/screenshots/Screenshot6.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 / configure helpdesk teams
</h3>
<img src="./assets/screenshots/Screenshot7.png"
class="img-thumbnail"><br/>
<img src="./assets/screenshots/Screenshot8.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Create Tickets from backend normally
</h3>
<img src="./assets/screenshots/Screenshot9.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Enable 'Create Tasks' from configuration settings to create tasks for the project linked to the Ticket
</h3>
<img src="./assets/screenshots/Screenshot10.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Turn on 'create task' toggle inside the ticket form to link a project to the Ticket
</h3>
<img src="./assets/screenshots/Screenshot11.png"
class="img-thumbnail"><br/><h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Create Tasks:
</h3><br/>
<img src="./assets/screenshots/Screenshot13.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Turn on 'Billable' toggle inside the ticket form to create invoice based on the tasks timesheet
</h3>
<img src="./assets/screenshots/Screenshot12.png"
class="img-thumbnail"><br/><h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Create invoice:
</h3><br/>
<img src="./assets/screenshots/Screenshot14.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Print PDF Report of the Ticket from backend
</h3>
<img src="./assets/screenshots/Screenshot15.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;">
Ticket (pdf):
</h3>
<img src="./assets/screenshots/Screenshot16.png"
class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/categories.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/export_stockinfo_xls/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="./assets/modules/export_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="./assets/modules/gantt_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/sales_credit_limit/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="./assets/modules/credit_image.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active"
style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/base_account_budget/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="./assets/modules/budget_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/product_to_quotation/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="./assets/modules/quotation_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/employee_documents_expiry/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="./assets/modules/employee_image.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/star.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/corporate.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/trading-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/pos-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/education-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/manufacturing-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/ecom-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/service-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/restaurant-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="../assets/icons/hotel-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="./assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="./assets/misc/support.png" height="48" width="48"
style="width: 42px; height: 42px;"/>
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help?
Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="./assets/misc/whatsapp.png" height="52" width="52"
style="width: 52px; height: 52px;"/>
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="./assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>
<!-- END OF SUPPORT -->

35
odoo_website_helpdesk/static/src/js/ticket_details.js

@ -0,0 +1,35 @@
odoo.define("odoo_website_helpdesk.ticket_details", function (require) {
"use strict";
$(document).on("mouseover", "#popover", function (event) {
console.log("start");
var self = this;
var item_text = "";
if (self.parentElement.parentElement.children[3]) {
item_text =
"Ticket : " +
self.parentElement.parentElement.children[1].outerText +
"<br/>" +
"Subject : " +
self.parentElement.parentElement.children[2].outerText +
"<br/>" +
"Cost : " +
self.parentElement.parentElement.children[4].outerText +
"<br/>" +
"Priority : " +
self.parentElement.parentElement.children[6].outerText+
"<br/>" +"<br/>" +
"Description : " +
self.parentElement.parentElement.children[3].outerText +
"<br/>";
}
$(this).popover({
html: true,
placement: "right",
trigger: "hover",
title: "Ticket Details",
content: "<span>" + item_text + "</span>",
});
});
});

201
odoo_website_helpdesk/views/helpdesk.xml

@ -0,0 +1,201 @@
<odoo>
<record id="view_helpdesk_form" model="ir.ui.view">
<field name="name">help.ticket.form</field>
<field name="model">help.ticket</field>
<field name="arch" type="xml">
<form>
<header>
<button name="create_tasks" string="Create Task" type="object" class="btn-primary" attrs="{'invisible':[('create_task','=',False)]}"/>
<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'}"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" name="open_tasks" string="Tasks" type="object" icon="fa-tasks" attrs="{'invisible':[('create_task','=',False)]}">
</button>
<button class="oe_stat_button" name="open_invoices" string="Invoices" type="object" icon="fa-tasks" attrs="{'invisible':[('billable','=',False)]}">
</button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1>
<field name="name"/>
</h1>
<label for="subject" class="oe_edit_only"/>
<h1 class="mt0">
<field name="subject"/>
</h1>
</div>
<group>
<group>
<field name="customer_id"/>
<field name="customer_name"/>
<field name="email"/>
<field name="phone"/>
<field name="cost"/>
<field name="start_date"/>
</group>
<group>
<field name="team_id"/>
<field name="project_id"/>
<field name="service_product_id" attrs="{'invisible':[('create_task','=',False)],
'required': [('create_task','=', True)]}"/>
<field name="priority" widget="priority"/>
<field name="show_create_task" invisible="1"/>
<field name="create_task" attrs="{'invisible':[('show_create_task','=',False)]}"/>
<field name="billable" attrs="{'invisible':[('create_task','=',False)]}"/>
<field name="end_date"/>
</group>
</group>
<notebook>
<page string="Issue Description">
<field name="description" placeholder="Provide the reason in detail"/>
</page>
</notebook>
</sheet>
<div class="o_attachment_preview"/>
<div class="oe_chatter">
<field name="message_follower_ids" groups="base.group_user"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="view_helpdesk_tree" model="ir.ui.view">
<field name="name">help.ticket.tree</field>
<field name="model">help.ticket</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="customer_id"/>
<field name="customer_name"/>
<field name="subject"/>
<field name="stage_id"/>
</tree>
</field>
</record>
<record id="view_helpdesk_kanban" model="ir.ui.view">
<field name="name">help.ticket.kanban</field>
<field name="model">help.ticket</field>
<field name="arch" type="xml">
<kanban default_group_by="stage_id" class="o_kanban_small_column" quick_create="false" on_create="quick_create">
<field name="color"/>
<field name="name"/>
<field name="stage_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown">
<a role="button" class="dropdown-toggle o-no-caret btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<t t-if="widget.editable">
<a role="menuitem" type="edit" class="dropdown-item">Edit...</a>
</t>
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content">
<div>
<strong>
<field name="name"/>
</strong>
</div>
<div class="text-muted">
<a>Customer : </a>
<field name="customer_id"/>
<div style="float: right;">
<a>Priority : </a>
<field name="priority"/>
</div>
</div>
<div class="text-muted">
<a>Subject : </a>
<field name="subject"/>
</div>
<div class="text-muted">
<a>Team :</a>
<field name="team_id"/>
</div>
</div>
<div class="oe_clear"/>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="helpdesk_view_activity" model="ir.ui.view">
<field name="name">help.ticket.activity</field>
<field name="model">help.ticket</field>
<field name="arch" type="xml">
<activity string="Tickets">
<templates>
<div t-name="activity-box">
<div>
<field name="name" display="full"/>
<field name="customer_id" muted="1" display="full"/>
</div>
</div>
</templates>
</activity>
</field>
</record>
<record id="help_ticket_view_calendar" model="ir.ui.view">
<field name="name">help.ticket.calendar</field>
<field name="model">help.ticket</field>
<field name="arch" type="xml">
<calendar string="Helpdesk Ticket" date_start="start_date" date_stop="end_date" event_open_popup="true" mode="month" color="customer_id" quick_add="False">
<field name="customer_id"/>
<field name="subject"/>
<field name="team_id"/>
</calendar>
</field>
</record>
<record id="view_helpdesk_stage_form" model="ir.ui.view">
<field name="name">ticket.stage.form</field>
<field name="model">ticket.stage</field>
<field name="arch" type="xml">
<form>
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1>
<field name="name"/>
</h1>
</div>
<group>
<field name="sequence"/>
<field name="closing_stage"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_helpdesk_stage_tree" model="ir.ui.view">
<field name="name">ticket.stage.tree</field>
<field name="model">ticket.stage</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="sequence"/>
<field name="closing_stage"/>
</tree>
</field>
</record>
</odoo>

58
odoo_website_helpdesk/views/helpdesk_views.xml

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<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</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_general_settings"
model="ir.actions.act_window">
<field name="name">Helpdesk Ticket</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module': 'helpdesk_ticket'}</field>
</record>
<menuitem id="menu_helpdesk" name="Helpdesk" action="action_helpdesk"
sequence="1"/>
<menuitem id="helpdesk_management" parent="menu_helpdesk" name="Support"
action="action_helpdesk" sequence="1"/>
<menuitem id="helpdesk_tickets" parent="helpdesk_management" name="Helpdesk Tickets"
action="action_helpdesk" sequence="1"/>
<menuitem id="menu_helpdesk_team" name="Helpdesk Team"
action="action_helpdesk_team"
parent="helpdesk_management" sequence="10"/>
<menuitem id="menu_helpdesk_configuration" name="Configuration"
sequence="50" parent="menu_helpdesk"/>
<menuitem id="menu_helpdesk_settings" name="Settings"
action="action_helpdesk_general_settings"
parent="menu_helpdesk_configuration" sequence="1"/>
<menuitem id="menu_helpdesk_stage" name="Stages"
action="action_helpdesk_stage"
parent="menu_helpdesk_configuration" sequence="5"/>
</data>
</odoo>

98
odoo_website_helpdesk/views/portal.xml

@ -0,0 +1,98 @@
<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'"
t-attf-class="breadcrumb-item #{'active ' if not ticket else ''}">
<a t-if="ticket" t-attf-href="/my/tickets?{{ keep_query() }}">
Tickets
</a>
<t t-else="">HelpDesk Tickets</t>
</li>
<li t-if="ticket" class="breadcrumb-item active">
<t t-esc="ticket.name" t-if="ticket.name != '/'"/>
</li>
</xpath>
</template>
<template id="portal_my_home_helpdesk" name="Tickets"
inherit_id="portal.portal_my_home" priority="1"
customize_show="True">
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
<t t-call="portal.portal_docs_entry">
<t t-set="title">Tickets</t>
<t t-set="url" t-value="'/my/tickets'"/>
<t t-set="placeholder_count" t-value="'ticket_count'"/>
</t>
</xpath>
</template>
<template id="portal_my_tickets" name="My Tickets">
<t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True"/>
<t t-call="portal.portal_searchbar">
<t t-set="title">My Tickets</t>
</t>
<t t-if="tickets" t-call="portal.portal_table">
<thead>
<tr class="active">
<th>
<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 class="text-right">Date</th>
<th class="text-right">Stage</th>
</tr>
</thead>
<tbody>
<t t-foreach="tickets" t-as="ticket">
<tr>
<td id="my_selector">
<a id="popover" href="#">
<t t-esc="ticket.name" t-value="ticket.id"/>
</a>
</td>
<td style="display:none;">
<span t-field="ticket.name"/>
</td>
<td style="display:none;">
<span t-field="ticket.subject"/>
</td>
<td style="display:none;">
<span t-field="ticket.description"/>
</td>
<td style="display:none;">
<span t-field="ticket.cost"/>
</td>
<td class="text-right">
<span t-field="ticket.subject"/>
</td>
<td class="text-right" style="display:none;">
<span t-field="ticket.priority"/>
</td>
<td class="text-right">
<span t-field="ticket.create_date"
t-options="{'widget': 'date'}"/>
&amp;nbsp;
<span class='d-none d-md-inline'
t-field="ticket.create_date"
t-options="{'time_only': True}"/>
</td>
<td class="text-right">
<span t-field="ticket.stage_id.name"/>
</td>
</tr>
</t>
</tbody>
</t>
<p t-else="">
There are currently no tickets issued for your account.
</p>
</t>
</template>
</odoo>

107
odoo_website_helpdesk/views/report.xml

@ -0,0 +1,107 @@
<odoo>
<template id="report_help_ticket">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="web.external_layout">
<div class="page">
<div style="margin-bottom: 10px;">
<div class="text-center"
style="font-weight: 400 !important; font-size: 2rem !important;">
<t t-esc="o.name"/>
- <t t-esc="o.subject"/>
</div><br/>
<table class="table table-bordered mt32">
<thead>
<tr>
<th class="text-center">
<span>Customer :</span>
</th>
<th class="text-center">
<span>Description :</span>
</th>
<th class="text-center">
<span>Priority :</span>
</th>
</tr>
</thead>
<tbody>
<tr class="text-center">
<td>
<span t-field="o.customer_id"
t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}'/>
</td>
<td>
<h3 t-field="o.description"/>
</td>
<td>
<h3 t-field="o.priority"/>
</td>
</tr>
</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>
<th class="text-center">
<span>Task Name</span>
</th>
<th class="text-center">
<span>Analytic Account</span>
</th>
<th class="text-center">
<span>Assigned to</span>
</th>
<th class="text-center">
<span>Total Hours Spend</span>
</th>
</tr>
</thead>
<t t-foreach="tasks" t-as="task">
<tbody>
<tr class="text-center">
<td>
<span t-field="task.name"/>
</td>
<td>
<span t-field="task.analytic_account_id"/>
</td>
<td>
<span t-esc="', '.join(map(lambda x: (x.name), task.user_ids))"/>
</td>
<td>
<span t-field="task.effective_hours"/>
</td>
</tr>
</tbody>
</t>
</table>
</t>
</div>
</t>
</t>
</t>
</template>
<record id="report_ticket" model="ir.actions.report">
<field name="name">Support Ticket</field>
<field name="model">help.ticket</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">odoo_website_helpdesk.report_help_ticket</field>
<field name="report_file">odoo_website_helpdesk.report_help_ticket</field>
<field name="binding_model_id" ref="model_help_ticket"/>
<field name="binding_type">report</field>
</record>
</odoo>

28
odoo_website_helpdesk/views/res_config_settings.xml

@ -0,0 +1,28 @@
<odoo>
<record id="ticket_res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.helpdesk</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="15"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block" data-string="Helpdesk" string="Helpdesk" data-key="helpdesk_ticket">
<h2>Helpdesk</h2>
<div class="row mt16 o_settings_container">
<div class="col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="show_create_task"/>
</div>
<div class="o_setting_right_pane">
<label for="show_create_task"/>
<div class="text-muted">
Enable to create tasks from tickets
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

50
odoo_website_helpdesk/views/team.xml

@ -0,0 +1,50 @@
<odoo>
<record id="view_helpdesk_team_form" model="ir.ui.view">
<field name="name">help.team.form</field>
<field name="model">help.team</field>
<field name="arch" type="xml">
<form>
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1>
<field name="name"/>
</h1>
</div>
<group>
<field name="member_ids" widget="many2many_tags"/>
<field name="email"/>
<field name="project_id"/>
</group><br/>
<h3>Tasks</h3>
<div class="row mt16 o_settings_container" id="create_task">
<div class="col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="create_task"/>
</div>
<div class="o_setting_right_pane">
<label for="create_task"/>
<div class="text-muted">
Enable for allowing team to create tasks from tickets
</div>
</div>
</div>
</div>
</sheet>
</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>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="email"/>
<field name="project_id"/>
</tree>
</field>
</record>
</odoo>

360
odoo_website_helpdesk/views/website_form.xml

@ -0,0 +1,360 @@
<odoo>
<record id="website_helpdesk" model="website.menu">
<field name="name">Helpdesk</field>
<field name="url" eval="'/helpdesk_ticket'"/>
<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>
<field name="url">/helpdesk-thank-you</field>
<field name="website_indexed" eval="False"/>
<field name="is_published">True</field>
<field name="key">odoo_website_helpdesk.helpdesk_thanks</field>
<field name="arch" type="xml">
<t name="Thanks (Helpdesk)"
t-name="odoo_website_helpdesk.helpdesk_thanks">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_text_block pt40 pb40 o_colored_level "
data-snippet="s_text_block">
<div class="container s_allow_columns">
<div class="row">
<div class="col-lg-7 col-xl-6 mr-lg-auto">
<span class="d-block fa fa-4x fa-handshake-o mx-auto rounded-circle bg-primary"/>
<br/>
<h1 class="text-center">Thank You!</h1>
<div class="pb16 pt16 s_hr"
data-snippet="s_hr"
data-name="Separator">
<hr class="mx-auto border-top w-50 border-dark text-center"/>
</div>
<h5 class="text-center">
<span class="fa fa-check-circle"/>
<span>Your Ticket
<a t-attf-href="/my_ticket/#{request.session.ticket_id}">
<strong>
<t t-esc="request.session.ticket_number"/>
</strong>
</a>
has been registered
<b>successfully</b>
</span>
</h5>
<p class="text-center">We will get back
to you shortly.
</p>
</div>
<div class="col-lg-4">
<ul class="list-unstyled mb-0 pl-2">
<li>My Company</li>
<li>
<i class="fa fa-map-marker fa-fw mr-2"/>
<span class="o_force_ltr">3575
Demo Buena Vista Avenue
</span>
</li>
<li>
<i class="fa fa-phone fa-fw mr-2"/>
<span class="o_force_ltr">+1
(650) 555-0111
</span>
</li>
<li>
<i class="fa fa-1x fa-fw fa-envelope mr-2"/>
<span>
info@yourcompany.example.com
</span>
</li>
</ul>
</div>
</div>
</div>
</section>
</div>
</t>
</t>
</field>
</record>
<template id="ticket_form" name="Helpdesk Ticket">
<t t-call="website.layout">
<t t-set="logged_partner"
t-value="request.env['website.visitor']._get_visitor_from_request().partner_id"/>
<t t-set="contactus_form_values" t-value="{
'email_to': res_company.email,
'name': request.params.get('name', ''),
'phone': request.params.get('phone', ''),
'email_from': request.params.get('email_from', ''),
'company': request.params.get('company', ''),
'subject': request.params.get('subject', ''),
}"/>
<span class="hidden" data-for="contactus_form"
t-att-data-values="contactus_form_values"/>
<div id="wrap" class="oe_structure oe_empty">
<section
class="s_title parallax s_parallax_is_fixed bg-black-50 pt24 pb24"
data-vcss="001" data-snippet="s_title"
data-scroll-background-ratio="1">
<span class="s_parallax_bg oe_img_bg"
style="background-image: url('/web/image/website.s_banner_default_image'); background-position: 50% 0;"/>
<div class="o_we_bg_filter bg-black-50"/>
<div class="container">
<h1>Support Tickets</h1>
</div>
</section>
<section class="s_text_block pt40 pb40 o_colored_level "
data-snippet="s_text_block">
<div class="container s_allow_columns">
<div class="row">
<div class="col-lg-8 mt-4 mt-lg-0">
<h5 style="line-height: 1.6;">
Contact us about anything related to our
company or services.<br/>
We'll do our best to get back to you as soon
as possible.
</h5><br/>
<section class="s_website_form" data-vcss="001"
data-snippet="s_website_form">
<div class="container">
<form id="Ticket_form"
action="/website/form/"
method="post"
enctype="multipart/form-data"
class="o_mark_required"
data-mark="*"
data-model_name="help.ticket"
data-success-mode="redirect"
data-success-page="/helpdesk-thank-you"
data-pre-fill="true">
<div class="s_website_form_rows row s_col_no_bgcolor">
<div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required"
data-type="char"
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"
for="contact1">
<span class="s_website_form_label_content">
Name</span>
<span class="s_website_form_mark">
*</span>
</label>
<div class="col-sm">
<input id="contact1"
type="text"
class="form-control s_website_form_input"
name="customer_name"
required=""
data-fill-with="name"/>
</div>
</div><br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_custom"
data-type="char"
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"
for="contact2">
<span class="s_website_form_label_content">
Phone </span>
</label>
<div class="col-sm">
<input id="contact2"
type="tel"
class="form-control s_website_form_input"
name="phone"
data-fill-with="phone"/>
</div>
</div><br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_required"
data-type="email"
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"
for="contact3">
<span class="s_website_form_label_content">
Email</span>
<span class="s_website_form_mark">
*</span>
</label>
<div class="col-sm">
<input id="contact3"
type="email"
class="form-control s_website_form_input"
name="email_from"
required=""
data-fill-with="email"/>
</div>
</div><br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_custom"
data-type="char"
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"
for="contact4">
<span class="s_website_form_label_content">
Company</span>
</label>
<div class="col-sm">
<input id="contact4"
type="text"
class="form-control s_website_form_input"
name="company"
data-fill-with="commercial_company_name"/>
</div>
</div><br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_required"
data-type="char"
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"
for="contact5">
<span class="s_website_form_label_content">
Subject</span>
<span class="s_website_form_mark">
*</span>
</label>
<div class="col-sm">
<input id="contact5"
type="text" placeholder="Mention your Issue here"
class="form-control s_website_form_input"
name="subject"
required=""/>
</div>
</div><br/>
</div>
<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"
for="contact6">
<span class="s_website_form_label_content">
Description</span>
</label>
<div class="col-sm">
<textarea
id="contact6"
class="form-control s_website_form_input"
name="description" placeholder="Issue description in detail"
required=""></textarea>
</div>
</div><br/>
</div>
<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"
data-type="binary"
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"
for="contact6">
<span class="s_website_form_label_content">
Attachment</span>
</label>
<div class="col-sm">
<input type="file"
name="ticket_attachment"
multiple="true"/>
</div>
</div><br/>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_dnone">
<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"
for="contact7">
<span class="s_website_form_label_content">
Email To</span>
</label>
<div class="col-sm">
<input id="contact7"
type="hidden"
class="form-control s_website_form_input"
name="email_to"/>
</div>
</div>
</div>
<div class="form-group col-12 s_website_form_submit"
data-name="Submit Button">
<div style="width: 200px;"
class="s_website_form_label"/>
<a href="#" role="button"
class="btn btn-primary btn-lg s_website_form_send">
Submit</a>
<span id="s_website_form_result"></span>
</div>
</div>
</form>
</div>
</section>
</div>
<div class="col-lg-4 m-1 mt-5 mt-lg-0">
<ul class="list-unstyled mb-0 pl-2">
<li class="mt-5">My Company</li>
<li>
<i class="fa fa-map-marker fa-fw mr-2"/>
<span class="o_force_ltr">3575 Demo
Buena
Vista Avenue</span>
</li>
<li>
<i class="fa fa-phone fa-fw mr-2"/>
<span class="o_force_ltr">+1 (650)
555-0111</span>
</li>
<li>
<i class="fa fa-1x fa-fw fa-envelope mr-2"/>
<span>
info@yourcompany.example.com</span>
</li>
</ul>
</div>
</div>
</div>
</section>
</div>
</t>
</template>
</odoo>
Loading…
Cancel
Save