@ -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>`__ |
||||
|
|
@ -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 |
@ -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, |
||||
|
} |
@ -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 |
@ -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') |
@ -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}) |
@ -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> |
||||
|
|
@ -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> |
@ -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 |
||||
|
|
||||
|
|
||||
|
|
@ -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 |
@ -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") |
@ -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') |
@ -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') |
|
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 401 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 174 KiB |
After Width: | Height: | Size: 178 KiB |
After Width: | Height: | Size: 218 KiB |
After Width: | Height: | Size: 174 KiB |
After Width: | Height: | Size: 224 KiB |
After Width: | Height: | Size: 172 KiB |
After Width: | Height: | Size: 184 KiB |
After Width: | Height: | Size: 220 KiB |
After Width: | Height: | Size: 196 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 175 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 117 KiB |
After Width: | Height: | Size: 182 KiB |
After Width: | Height: | Size: 154 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 7.2 KiB |
@ -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 & 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 --> |
@ -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>", |
||||
|
}); |
||||
|
}); |
||||
|
}); |
@ -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> |
@ -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> |
@ -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'}"/> |
||||
|
&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> |
@ -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> |
@ -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> |
@ -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> |
@ -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> |