@ -1,5 +1,26 @@ |
|||
from . import website_form |
|||
from . import portal |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-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_website |
|||
from . import portal |
|||
from . import ticket_search |
|||
from . import ticket_group_by |
|||
from . import website |
|||
|
@ -0,0 +1,22 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Ticket types--> |
|||
<record id="helpdesk_types_question" model="helpdesk.types"> |
|||
<field name="name">Question</field> |
|||
</record> |
|||
<record id="helpdesk_types_issue" model="helpdesk.types"> |
|||
<field name="name">Issue</field> |
|||
</record> |
|||
<record id="helpdesk_types_repair" model="helpdesk.types"> |
|||
<field name="name">Repair</field> |
|||
</record> |
|||
<record id="helpdesk_types_maintenance" model="helpdesk.types"> |
|||
<field name="name">Maintenance</field> |
|||
</record> |
|||
<record id="helpdesk_categories_internal" model="helpdesk.categories"> |
|||
<field name="name">Internal</field> |
|||
</record> |
|||
<record id="helpdesk_categories_technical" model="helpdesk.categories"> |
|||
<field name="name">Technical</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,17 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<!-- Auto close ticket--> |
|||
<record id="ir_cron_auto_close_ticket" model="ir.cron"> |
|||
<field name="name">Auto Close Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="state">code</field> |
|||
<field name="code">model.auto_close_ticket()</field> |
|||
<field name="user_id" ref="base.user_root"/> |
|||
<field name="interval_number">1</field> |
|||
<field name="interval_type">days</field> |
|||
<field name="numbercall">-1</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,211 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!--Ticket mail template--> |
|||
<record id="mail_template_create_ticket" model="mail.template"> |
|||
<field name="name">Create Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Created</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
is Created and Assigned.Kindly Wait while we're resolving |
|||
your Query |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
<!-- Helpdesk ticket Rating template--> |
|||
<record id="mail_template_ticket_rating" model="mail.template"> |
|||
<field name="name">Close Ticket And Feedback</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Closed</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
Is Closed |
|||
<br/> |
|||
<button class="btn btn-info" role="button" |
|||
style="border:1px solid black;background-color:purple;padding-x:20px;padding-y:15px;border-radius:10px; width:120px;"> |
|||
<a t-attf-href="/rating/{{object.id}}" |
|||
style="text-decoration:none;color:white;font-weight:bold;font-size:18px;"> |
|||
Rate Now |
|||
</a> |
|||
</button> |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
<!-- Ticket response sending formate--> |
|||
<record id="mail_template_ticket_reopened" model="mail.template"> |
|||
<field name="name">Reopened Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Reopened</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
is Reopened |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
<!-- Ticket approved sending formate--> |
|||
<record id="mail_template_ticket_approved" model="mail.template"> |
|||
<field name="name">Approve Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Solved</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
i think your Problem is Solved. |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
is Done |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
<!-- Cancelled tickets formate--> |
|||
<record id="mail_template_ticket_canceled" model="mail.template"> |
|||
<field name="name">Cancel Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Canceled</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
is Canceled Due to Some Reasons |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
<!-- Mail formate to inform the Team to assign a task--> |
|||
<record id="mail_template_odoo_website_helpdesk_assign" |
|||
model="mail.template"> |
|||
<field name="name">Ticket Assign</field> |
|||
<field name="email_from"/> |
|||
<field name="email_to"/> |
|||
<field name="subject"/> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="body_html" type="html"> |
|||
<div style="margin: 0px; padding: 0px;"> |
|||
<p>Dear, |
|||
<t t-esc="object.team_head.name"/> |
|||
</p> |
|||
<p>Your team has been given the ticket [<t |
|||
t-esc="object.name"/>] kindly complete your work |
|||
carefully. |
|||
</p> |
|||
<br/> |
|||
<h2>Details</h2> |
|||
<p>Subject : |
|||
<t t-esc="object.subject"/> |
|||
</p> |
|||
<p>Customer : |
|||
<t t-esc="object.customer_id.name"/> |
|||
</p> |
|||
<p>Description : |
|||
<t t-esc="object.description"/> |
|||
</p> |
|||
<br/> |
|||
<p>Best regards</p> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
<!-- Mail sending formate to inform the user to assign the task--> |
|||
<record id="mail_template_odoo_website_helpdesk_assign_user" |
|||
model="mail.template"> |
|||
<field name="name">Ticket Assign to User</field> |
|||
<field name="email_from"/> |
|||
<field name="email_to"/> |
|||
<field name="subject"/> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="body_html" type="html"> |
|||
<div style="margin: 0px; padding: 0px;"> |
|||
<p>Dear, |
|||
<t t-esc="object.assigned_user.name"/> |
|||
</p> |
|||
<p>Ticket [<t t-esc="object.name"/>] Assign to you , kindly |
|||
complete your work carefully. |
|||
</p> |
|||
<br/> |
|||
<h2>Details</h2> |
|||
<p>Subject : |
|||
<t t-esc="object.subject"/> |
|||
</p> |
|||
<p>Customer : |
|||
<t t-esc="object.customer_id.name"/> |
|||
</p> |
|||
<p>Description : |
|||
<t t-esc="object.description"/> |
|||
</p> |
|||
<br/> |
|||
<p>Best regards</p> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
<!-- Mail sending to the customer for informing the assigned user--> |
|||
<record id="mail_template_odoo_website_helpdesk_to_customer" |
|||
model="mail.template"> |
|||
<field name="name">Mail To Customer Assign to User</field> |
|||
<field name="email_from"/> |
|||
<field name="email_to"/> |
|||
<field name="subject"/> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="body_html" type="html"> |
|||
<div style="margin: 0px; padding: 0px;"> |
|||
<p>Dear, |
|||
<t t-esc="object.customer_id.name"/> |
|||
</p> |
|||
<p>Ticket [<t t-esc="object.name"/>] successfully assigned |
|||
to "<t t-esc="object.assigned_user.name"/>". |
|||
</p> |
|||
<br/> |
|||
<p>Best regards</p> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -1,121 +0,0 @@ |
|||
<odoo> |
|||
<data> |
|||
<record id="ticket_created" model="mail.template"> |
|||
<field name="name">Create Ticket</field> |
|||
<field name="model_id" ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Created</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear <t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
Your Ticket <t t-out="object.name"/> is Created and Assigned.Kindly Wait while we're resolving your Query |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
|
|||
</field> |
|||
</record> |
|||
|
|||
<record id="helpdesk_rating" model="mail.template"> |
|||
<field name="name">Close Ticket And Feedback</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<!-- <field name="email_from">{{object.customer_id.email}}</field>--> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Closed</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
Is Closed |
|||
<br/> |
|||
|
|||
<button class="btn btn-info" role="button" |
|||
style="border:1px solid black;background-color:purple;padding-x:20px;padding-y:15px;border-radius:10px; width:120px;"> |
|||
<a t-attf-href="/rating/{{object.id}}" |
|||
style="text-decoration:none;color:white;font-weight:bold;font-size:18px;"> |
|||
Rate Now |
|||
</a> |
|||
</button> |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
|
|||
</field> |
|||
</record> |
|||
<record id="ticket_reopened" model="mail.template"> |
|||
<field name="name">Reopened Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Reopened</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
is Reopened |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
|
|||
</field> |
|||
</record> |
|||
<record id="ticket_approved" model="mail.template"> |
|||
<field name="name">Approve Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Solved</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
i think your Problem is Solved. |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
is Done |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
|
|||
</field> |
|||
</record> |
|||
<record id="ticket_canceled" model="mail.template"> |
|||
<field name="name">Cancel Ticket</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="email_to">{{object.customer_id.email}}</field> |
|||
<field name="subject">Ticket Canceled</field> |
|||
<field name="body_html" type="html"> |
|||
<p> |
|||
Dear |
|||
<t t-out="object.customer_id.name"/> |
|||
<br/> |
|||
Your Ticket |
|||
<t t-out="object.name"/> |
|||
is Canceled Due to Some Reasons |
|||
<br/> |
|||
<br/> |
|||
Thanks. |
|||
</p> |
|||
|
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -1,79 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="auto_close_ticket" model="ir.cron"> |
|||
<field name="name">Auto Close Ticket</field> |
|||
<field name="model_id" ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="state">code</field> |
|||
<field name="code">model.auto_close_ticket()</field> |
|||
<field name="user_id" ref="base.user_root"/> |
|||
<field name="interval_number">1</field> |
|||
<field name="interval_type">days</field> |
|||
<field name="numbercall">-1</field> |
|||
</record> |
|||
<record id="odoo_website_helpdesk_assign" |
|||
model="mail.template"> |
|||
<field name="name">Ticket Assign</field> |
|||
<field name="email_from"></field> |
|||
<field name="email_to"></field> |
|||
<field name="subject"></field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="body_html" type="html"> |
|||
<div style="margin: 0px; padding: 0px;"> |
|||
<p>Dear,<t t-esc="object.team_head.name"/></p> |
|||
<p> Your team has been given the ticket [<t t-esc="object.name"/>] kindly complete your work carefully. |
|||
</p> |
|||
<br></br> |
|||
<h2>Details </h2> |
|||
<p>Subject : <t t-esc="object.subject"/></p> |
|||
<p>Customer : <t t-esc="object.customer_id.name"/></p> |
|||
<p>Description : <t t-esc="object.description"/></p> |
|||
<br></br> |
|||
<p>Best regards</p> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
<record id="odoo_website_helpdesk_assign_user" |
|||
model="mail.template"> |
|||
<field name="name">Ticket Assign to User</field> |
|||
<field name="email_from"></field> |
|||
<field name="email_to"></field> |
|||
<field name="subject"></field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="body_html" type="html"> |
|||
<div style="margin: 0px; padding: 0px;"> |
|||
<p>Dear,<t t-esc="object.assigned_user.name"/></p> |
|||
<p> Ticket [<t t-esc="object.name"/>] Assign to you , kindly complete your work carefully. |
|||
</p> |
|||
<br></br> |
|||
<h2>Details </h2> |
|||
<p>Subject : <t t-esc="object.subject"/></p> |
|||
<p>Customer : <t t-esc="object.customer_id.name"/></p> |
|||
<p>Description : <t t-esc="object.description"/></p> |
|||
<br></br> |
|||
<p>Best regards</p> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
<record id="odoo_website_helpdesk_to_customer" |
|||
model="mail.template"> |
|||
<field name="name">Mail To Customer Assign to User</field> |
|||
<field name="email_from"></field> |
|||
<field name="email_to"></field> |
|||
<field name="subject"></field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="body_html" type="html"> |
|||
<div style="margin: 0px; padding: 0px;"> |
|||
<p>Dear,<t t-esc="object.customer_id.name"/></p> |
|||
<p> Ticket [<t t-esc="object.name"/>] successfully assigned to "<t t-esc="object.assigned_user.name"/>". |
|||
</p> |
|||
<br></br> |
|||
<p>Best regards</p> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -1,31 +1,39 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Project Stages --> |
|||
<record id="stage_inbox" model="ticket.stage"> |
|||
<record id="ticket_stage_inbox" model="ticket.stage"> |
|||
<field name="sequence">10</field> |
|||
<field name="name">Inbox</field> |
|||
</record> |
|||
<record id="stage_draft" model="ticket.stage"> |
|||
<!-- Draft--> |
|||
<record id="ticket_stage_draft" model="ticket.stage"> |
|||
<field name="sequence">15</field> |
|||
<field name="name">Draft</field> |
|||
</record> |
|||
<record id="stage_done" model="ticket.stage"> |
|||
<field name="sequence">25</field> |
|||
<field name="name">Done</field> |
|||
</record> |
|||
<record id="stage_in_progress" model="ticket.stage"> |
|||
<!--In progress--> |
|||
<record id="ticket_stage_in_progress" model="ticket.stage"> |
|||
<field name="sequence">20</field> |
|||
<field name="starting_stage" eval="True"/> |
|||
<field name="name">In Progress</field> |
|||
</record> |
|||
<record id="stage_closed" model="ticket.stage"> |
|||
<field name="sequence">30</field> |
|||
<field name="closing_stage">True</field> |
|||
<field name="name">Closed</field> |
|||
<!--Done--> |
|||
<record id="ticket_stage_done" model="ticket.stage"> |
|||
<field name="sequence">25</field> |
|||
<field name="name">Done</field> |
|||
<field name="folded" eval="True"/> |
|||
</record> |
|||
<record id="stage_canceled" model="ticket.stage"> |
|||
<field name="sequence">35</field> |
|||
<field name="cancel_stage">True</field> |
|||
<!--Cancelled--> |
|||
<record id="ticket_stage_cancel" model="ticket.stage"> |
|||
<field name="sequence">30</field> |
|||
<field name="name">Canceled</field> |
|||
<field name="cancel_stage" eval="True"/> |
|||
<field name="folded" eval="True"/> |
|||
</record> |
|||
<!-- Closed--> |
|||
<record id="ticket_stage_closed" model="ticket.stage"> |
|||
<field name="sequence">29</field> |
|||
<field name="name">Closed</field> |
|||
<field name="closing_stage" eval="True"/> |
|||
<field name="folded" eval="True"/> |
|||
</record> |
|||
</odoo> |
|||
|
@ -1,21 +0,0 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<record id="ticket_type_1" model="helpdesk.types"> |
|||
<field name="name">Question</field> |
|||
</record> |
|||
<record id="ticket_type_2" model="helpdesk.types"> |
|||
<field name="name">Issue</field> |
|||
</record> |
|||
<record id="ticket_type_3" model="helpdesk.types"> |
|||
<field name="name">Repair</field> |
|||
</record> |
|||
<record id="ticket_type_4" model="helpdesk.types"> |
|||
<field name="name">Maintenance</field> |
|||
</record> |
|||
<record id="ticket_categories_1" model="helpdesk.categories"> |
|||
<field name="name">Internal</field> |
|||
</record> |
|||
<record id="ticket_categories_2" model="helpdesk.categories"> |
|||
<field name="name">Technical</field> |
|||
</record> |
|||
</odoo> |
@ -1,13 +1,6 @@ |
|||
## Module <odoo_website_helpdesk> |
|||
|
|||
#### 01.09.2023 |
|||
#### 04.12.2023 |
|||
#### Version 16.0.1.0.0 |
|||
#### ADD |
|||
|
|||
- Initial commit for Website Helpdesk Support Ticket |
|||
|
|||
#### 28.11.2023 |
|||
#### Version 16.0.1.0.1 |
|||
#### FIX |
|||
|
|||
- Updated the End date when changed the stage to Closed |
|||
- Initial commit for Website Helpdesk Support Ticket Management |
|||
|
@ -1,59 +0,0 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import api, fields, models |
|||
|
|||
|
|||
class HelpDeskTeam(models.Model): |
|||
"""Helpdesk team""" |
|||
_name = 'help.team' |
|||
_description = 'Helpdesk Team' |
|||
|
|||
name = fields.Char('Name', help='Helpdesk Team Name') |
|||
team_lead_id = fields.Many2one('res.users', string='Team Leader', |
|||
help='Team Leader Name', |
|||
domain=lambda self: [ |
|||
('groups_id', 'in', self.env.ref( |
|||
'odoo_website_helpdesk.helpdesk_team_leader').id)]) |
|||
member_ids = fields.Many2many('res.users', string='Members', |
|||
help='Team Members', |
|||
domain=lambda self: [ |
|||
('groups_id', 'in', self.env.ref( |
|||
'odoo_website_helpdesk.helpdesk_user').id)]) |
|||
email = fields.Char('Email', help='Email') |
|||
project_id = fields.Many2one('project.project', |
|||
string='Project', |
|||
help='Projects') |
|||
create_task = fields.Boolean(string="Create Task", |
|||
help="Task created or not") |
|||
|
|||
@api.onchange('team_lead_id') |
|||
def members_choose(self): |
|||
"""Members selection function""" |
|||
fetch_memebers = self.env['res.users'].search([]) |
|||
filterd_members = fetch_memebers.filtered( |
|||
lambda x: x.id != self.team_lead_id.id) |
|||
return {'domain': {'member_ids': |
|||
[('id', '=', filterd_members.ids), ( |
|||
'groups_id', 'in', |
|||
self.env.ref('base.group_user').id), |
|||
('groups_id', 'not in', self.env.ref( |
|||
'odoo_website_helpdesk.helpdesk_team_leader').id)]}} |
@ -0,0 +1,65 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import api, fields, models |
|||
|
|||
|
|||
class HelpTeam(models.Model): |
|||
""" This class represents a Helpdesk Team in the system, providing |
|||
information about the team members, leader, and related project.""" |
|||
_name = 'help.team' |
|||
_description = 'Helpdesk Team' |
|||
|
|||
name = fields.Char(string='Name', help='Name of the Helpdesk Team. It ' |
|||
'identify the helpdesk team') |
|||
team_lead_id = fields.Many2one( |
|||
'res.users', |
|||
string='Team Leader', |
|||
help='Name of the Helpdesk Team Leader.', |
|||
domain=lambda self: [('groups_id', 'in', self.env.ref( |
|||
'odoo_website_helpdesk.helpdesk_team_leader').id)]) |
|||
member_ids = fields.Many2many( |
|||
'res.users', |
|||
string='Members', |
|||
help='Users who belong to that Helpdesk Team', |
|||
domain=lambda self: [('groups_id', 'in', self.env.ref( |
|||
'odoo_website_helpdesk.helpdesk_user').id)]) |
|||
email = fields.Char(string='Email', help='Email') |
|||
project_id = fields.Many2one('project.project', |
|||
string='Project', |
|||
help='The Project they are currently in') |
|||
create_task = fields.Boolean(string="Create Task", |
|||
help="Enable for allowing team to " |
|||
"create tasks from tickets") |
|||
|
|||
@api.onchange('team_lead_id') |
|||
def members_choose(self): |
|||
""" This method is triggered when the Team Leader is changed. It |
|||
updates the available team members based on the selected leader and |
|||
filters out the leader from the list of potential members.""" |
|||
fetch_members = self.env['res.users'].search([]) |
|||
filtered_members = fetch_members.filtered( |
|||
lambda x: x.id != self.team_lead_id.id) |
|||
return {'domain': {'member_ids': [ |
|||
('id', '=', filtered_members.ids), |
|||
('groups_id', 'in', self.env.ref('base.group_user').id), |
|||
('groups_id', 'not in', self.env.ref( |
|||
'odoo_website_helpdesk.helpdesk_team_leader').id)]}} |
@ -0,0 +1,34 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import fields, models |
|||
|
|||
|
|||
class HelpdeskCategories(models.Model): |
|||
"""This class represents the Helpdesk Categories, providing information |
|||
about different categories that can be assigned to helpdesk items. |
|||
""" |
|||
_name = 'helpdesk.categories' |
|||
_description = 'Helpdesk Categories' |
|||
|
|||
name = fields.Char(string='Name', help='Category Name') |
|||
sequence = fields.Integer(string='Sequence', default=0, |
|||
help='Sequence of a Category') |
@ -0,0 +1,30 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import fields, models |
|||
|
|||
|
|||
class HelpdeskTypes(models.Model): |
|||
"""Its handle to control helpdesk ticket types """ |
|||
_name = 'helpdesk.types' |
|||
_description = 'Helpdesk Types' |
|||
|
|||
name = fields.Char(string='Type', help='Types helpdesk tickets') |
@ -0,0 +1,42 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import fields, models |
|||
|
|||
|
|||
class ProjectTask(models.Model): |
|||
""" |
|||
This class extends the 'project.task' model in Odoo to add a custom field |
|||
called 'ticket_billed' and 'ticket_id'. |
|||
ticket_billed: A boolean field indicating whether the ticket has |
|||
been billed or not. |
|||
ticket_id : A many2One field to link the task |
|||
with a help ticket |
|||
""" |
|||
_inherit = 'project.task' |
|||
|
|||
ticket_billed = fields.Boolean(string='Billed', |
|||
help='Whether the Ticket has been Invoiced' |
|||
'or Not') |
|||
ticket_id = fields.Many2one('help.ticket', string='Ticket', |
|||
help='The help ticket associated with this ' |
|||
'recordThis field allows you to link ' |
|||
'this record to an existing help ticket.') |
@ -1,100 +0,0 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import api, fields, models |
|||
|
|||
|
|||
class Menu(models.Model): |
|||
"""Inheriting the website menu""" |
|||
_inherit = "website.menu" |
|||
|
|||
def _compute_visible(self): |
|||
"""Compute visible""" |
|||
super()._compute_visible() |
|||
show_menu_header = self.env['ir.config_parameter'].sudo().get_param( |
|||
'odoo_website_helpdesk.helpdesk_menu_show') |
|||
for menu in self: |
|||
if menu.name == 'Helpdesk' and show_menu_header == False: |
|||
menu.is_visible = False |
|||
if menu.name == 'Helpdesk' and show_menu_header == True: |
|||
menu.is_visible = True |
|||
|
|||
|
|||
class Helpdesk(models.TransientModel): |
|||
"""Inheriting the res config""" |
|||
_inherit = 'res.config.settings' |
|||
|
|||
show_create_task = fields.Boolean(string="Create Tasks", |
|||
config_parameter='odoo_website_helpdesk.show_create_task', |
|||
help='Create Task') |
|||
show_category = fields.Boolean(string="Category", |
|||
config_parameter='odoo_website_helpdesk.show_category', |
|||
help='Category', |
|||
implied_group='odoo_website_helpdesk.group_show_category') |
|||
product_website = fields.Boolean(string="Product On Website", |
|||
config_parameter='odoo_website_helpdesk.product_website', |
|||
help='Product on website') |
|||
auto_close_ticket = fields.Boolean(string="Auto Close Ticket", |
|||
config_parameter='odoo_website_helpdesk.auto_close_ticket', |
|||
help='Auto Close ticket') |
|||
no_of_days = fields.Integer(string="No Of Days", |
|||
config_parameter='odoo_website_helpdesk.no_of_days', |
|||
help='No of Days') |
|||
closed_stage = fields.Many2one( |
|||
'ticket.stage', string='Closing stage', |
|||
help='Closing Stage', |
|||
config_parameter='odoo_website_helpdesk.closed_stage') |
|||
|
|||
reply_template_id = fields.Many2one('mail.template', |
|||
domain="[('model', '=', 'help.ticket')]", |
|||
config_parameter='odoo_website_helpdesk.reply_template_id', |
|||
help='Reply Template') |
|||
helpdesk_menu_show = fields.Boolean('Helpdesk Menu', |
|||
config_parameter= |
|||
'odoo_website_helpdesk.helpdesk_menu_show', |
|||
help='Helpdesk menu') |
|||
|
|||
@api.onchange('closed_stage') |
|||
def closed_stage_a(self): |
|||
"""Closing stage function""" |
|||
if self.closed_stage: |
|||
stage = self.closed_stage.id |
|||
in_stage = self.env['ticket.stage'].search([('id', '=', stage)]) |
|||
not_in_stage = self.env['ticket.stage'].search([('id', '!=', stage)]) |
|||
in_stage.closing_stage = True |
|||
for each in not_in_stage: |
|||
each.closing_stage = False |
|||
|
|||
@api.constrains('show_category') |
|||
def show_category_subcategory(self): |
|||
"""Show category and the sub category""" |
|||
if self.show_category: |
|||
group_cat = self.env.ref( |
|||
'odoo_website_helpdesk.group_show_category') |
|||
group_cat.write({ |
|||
'users': [(4, self.env.user.id)] |
|||
}) |
|||
else: |
|||
group_cat = self.env.ref( |
|||
'odoo_website_helpdesk.group_show_category') |
|||
group_cat.write({ |
|||
'users': [(5, False)] |
|||
}) |
@ -0,0 +1,100 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import api, fields, models |
|||
|
|||
|
|||
class ResConfigSettings(models.TransientModel): |
|||
"""This class extends the functionality of the 'res.config.settings' model |
|||
to provide configuration options for various settings related to the |
|||
helpdesk module. |
|||
""" |
|||
_inherit = 'res.config.settings' |
|||
|
|||
show_create_task = fields.Boolean( |
|||
string="Create Tasks", |
|||
config_parameter='odoo_website_helpdesk.show_create_task', |
|||
help='When enabling this field yu can create a task under the ticket') |
|||
show_category = fields.Boolean( |
|||
string="Category", |
|||
config_parameter='odoo_website_helpdesk.show_category', |
|||
help='When enabling this its show the category of ticket', |
|||
implied_group='odoo_website_helpdesk.group_show_category') |
|||
product_website = fields.Boolean( |
|||
string="Product On Website", |
|||
config_parameter='odoo_website_helpdesk.product_website', |
|||
help='When enabling this feature you can mention the product on website' |
|||
' at time of creating the ticketProduct on website') |
|||
auto_close_ticket = fields.Boolean( |
|||
string="Auto Close Ticket", |
|||
config_parameter='odoo_website_helpdesk.auto_close_ticket', |
|||
help='Automatically Close ticket if the condition is satisfied') |
|||
no_of_days = fields.Integer( |
|||
string="No Of Days", |
|||
config_parameter='odoo_website_helpdesk.no_of_days', |
|||
help='After this date the ticket will closing automatically ') |
|||
closed_stage = fields.Many2one( |
|||
'ticket.stage', string='Closing stage', |
|||
help='Closing Stage', |
|||
config_parameter='odoo_website_helpdesk.closed_stage') |
|||
|
|||
reply_template_id = fields.Many2one( |
|||
'mail.template', |
|||
string='Relaid ID', |
|||
domain="[('model', '=', 'help.ticket')]", |
|||
config_parameter='odoo_website_helpdesk.reply_template_id', |
|||
help='Reply Template') |
|||
helpdesk_menu_show = fields.Boolean( |
|||
string='Helpdesk Menu', |
|||
config_parameter='odoo_website_helpdesk.helpdesk_menu_show', |
|||
help='When enabling this option to visible Helpdesk menu in website') |
|||
|
|||
@api.onchange('closed_stage') |
|||
def closed_stage_a(self): |
|||
"""This method is triggered when the 'closed_stage' field is changed. |
|||
It updates the 'closing_stage' attribute of the selected stage and |
|||
clears it for other stages. |
|||
""" |
|||
stage = self.closed_stage.id |
|||
in_stage = self.env['ticket.stage'].search([('id', '=', stage)]) |
|||
not_in_stage = self.env['ticket.stage'].search([('id', '!=', stage)]) |
|||
in_stage.closing_stage = True |
|||
for each in not_in_stage: |
|||
each.closing_stage = False |
|||
|
|||
@api.constrains('show_category') |
|||
def show_category_subcategory(self): |
|||
""" This constraint method is triggered when the 'show_category' field |
|||
is changed. It updates the users in the 'group_show_category' based on |
|||
the 'show_category' value. |
|||
""" |
|||
if self.show_category: |
|||
group_cat = self.env.ref( |
|||
'odoo_website_helpdesk.group_show_category') |
|||
group_cat.write({ |
|||
'users': [(4, self.env.user.id)] |
|||
}) |
|||
else: |
|||
group_cat = self.env.ref( |
|||
'odoo_website_helpdesk.group_show_category') |
|||
group_cat.write({ |
|||
'users': [(5, False)] |
|||
}) |
@ -0,0 +1,98 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import fields, models, _ |
|||
from odoo.exceptions import UserError |
|||
|
|||
|
|||
class TicketStage(models.Model): |
|||
"""This model represents the stages of a helpdesk ticket. A stage is used to |
|||
indicate the current state of a ticket, such as 'New', 'In Progress', |
|||
'Resolved', or 'Closed'. Stages are used to organize and track the |
|||
progress of tickets throughout their lifecycle.""" |
|||
|
|||
_name = 'ticket.stage' |
|||
_description = 'Ticket Stage' |
|||
_order = 'sequence, id' |
|||
_fold_name = 'fold' |
|||
|
|||
name = fields.Char(string='Name', help='The name of the stage. This field' |
|||
' is used to identify the stage and' |
|||
' is displayed in various views ' |
|||
'and reports.') |
|||
active = fields.Boolean(default=True, |
|||
string='Active', |
|||
help='Whether the stage is active or not. If this ' |
|||
'field is set to False,the stage will not be ' |
|||
'displayed in various views and reports.') |
|||
sequence = fields.Integer(string='Sequence', |
|||
default=50, |
|||
help='The sequence number of the stage. This ' |
|||
'field is used to specify the order in which' |
|||
' the stages are displayed in various views ' |
|||
'and reports.', ) |
|||
closing_stage = fields.Boolean(string='Closing Stage', |
|||
help='Whether the stage is a closing stage ' |
|||
'or not. A closing stage is a stage ' |
|||
'that indicates that the helpdesk ' |
|||
'ticket has been resolved or closed.' |
|||
' This field is used to identify the ' |
|||
'closing stage and is used in various ' |
|||
'calculations and reports.') |
|||
cancel_stage = fields.Boolean(string='Cancel Stage', |
|||
help='Whether the stage is a cancel stage ' |
|||
'or not. A cancel stage is a stage that' |
|||
'indicate the helpdesk tickets has been ' |
|||
'cancelled or removed') |
|||
starting_stage = fields.Boolean(string='Start Stage', |
|||
help='Starting ticket Stage') |
|||
folded = fields.Boolean(string='Folded in Kanban', |
|||
help='Whether the stage is folded in the Kanban ' |
|||
'view or not. If this field is set to True,' |
|||
' the stage will be displayed in a collapsed ' |
|||
'state in the Kanban view, which can be ' |
|||
'expanded by clicking on it.This field is ' |
|||
'used to control the behavior of the ' |
|||
'Kanban view.') |
|||
template_id = fields.Many2one('mail.template', |
|||
string='Template', |
|||
help='Choose the template', |
|||
domain="[('model', '=', 'help.ticket')]") |
|||
group_ids = fields.Many2many('res.groups', |
|||
string='Group', |
|||
help='Choose the group ID') |
|||
fold = fields.Boolean(string='Fold', help='When enabling this the ticket ' |
|||
'stage will folded on the view') |
|||
|
|||
def unlink(self): |
|||
"""Deleting the helpdesk tickets from various stage.""" |
|||
for rec in self: |
|||
tickets = rec.search([]) |
|||
sequence = tickets.mapped('sequence') |
|||
lowest_sequence = tickets.filtered( |
|||
lambda x: x.sequence == min(sequence)) |
|||
if self.name == "Draft": |
|||
raise UserError(_("Cannot Delete This Stage")) |
|||
if rec == lowest_sequence: |
|||
raise UserError(_("Cannot Delete '%s'" % (rec.name))) |
|||
else: |
|||
res = super().unlink() |
|||
return res |
@ -0,0 +1,61 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-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 |
|||
|
|||
|
|||
class WebsiteMenu(models.Model): |
|||
""" |
|||
Inheriting the website menu. |
|||
|
|||
This class inherits from the 'website.menu' model and extends its |
|||
functionality to compute the visibility of the menu |
|||
item based on the value of the 'odoo_website_helpdesk.helpdesk_menu_show' |
|||
configuration parameter. |
|||
|
|||
Attributes: |
|||
_inherit (str): The name of the model being inherited. |
|||
""" |
|||
_inherit = "website.menu" |
|||
|
|||
def _compute_visible(self): |
|||
""" |
|||
Compute the visibility of the menu item. |
|||
|
|||
This method is used to determine whether the menu item should be |
|||
visible or hidden based on the value of the |
|||
'odoo_website_helpdesk.helpdesk_menu_show' configuration parameter. |
|||
|
|||
Returns: |
|||
None |
|||
|
|||
Side Effects: |
|||
Sets the 'is_visible' field of the menu item record to True or |
|||
False accordingly. |
|||
""" |
|||
super()._compute_visible() |
|||
show_menu_header = self.env['ir.config_parameter'].sudo().get_param( |
|||
'odoo_website_helpdesk.helpdesk_menu_show') |
|||
for menu in self: |
|||
if menu.name == 'Helpdesk' and show_menu_header is False: |
|||
menu.is_visible = False |
|||
if menu.name == 'Helpdesk' and show_menu_header is True: |
|||
menu.is_visible = True |
|
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 128 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 218 KiB |
Before Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 224 KiB |
Before Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 182 KiB |
After Width: | Height: | Size: 187 KiB |
After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 143 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 154 KiB |
After Width: | Height: | Size: 142 KiB |
After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 113 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 139 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 446 KiB |
@ -1,14 +1,23 @@ |
|||
odoo.define('odoo_website_helpdesk.multiple_product_choose', function(require) { |
|||
"use strict"; |
|||
var ajax = require('web.ajax'); |
|||
$(document).ready(function() { |
|||
ajax.rpc('/product').then(function (res) { |
|||
var ar = res |
|||
$('#product').empty() |
|||
$(ar).each(function(i){ |
|||
$('#product').append("<option value=" + ar[i].id + ">" + ar[i].name + "</option>"); |
|||
var rpc = require('web.rpc'); |
|||
var publicWidget = require('web.public.widget'); |
|||
publicWidget.registry.SelectProduct = publicWidget.Widget.extend({ |
|||
selector: '.website_ticket', |
|||
start: function () { |
|||
var self = this; |
|||
rpc.query({ |
|||
route: '/product' |
|||
}).then(function (res) { |
|||
var ar = res; |
|||
self.$el.find('#product').empty(); |
|||
ar.forEach(function (item) { |
|||
self.$el.find('#product').append("<option value='" + item.id + "'>" + item.name + "</option>"); |
|||
}); |
|||
self.$el.find('#product').SumoSelect({ clearAll: true }); |
|||
}); |
|||
$('#product').SumoSelect({ clearAll: true }); |
|||
return this._super.apply(this, arguments); |
|||
}, |
|||
}); |
|||
}); |
|||
}); |
|||
return publicWidget.registry.SelectProduct; |
|||
}); |
|||
|
@ -1,16 +0,0 @@ |
|||
odoo.define("odoo_website_helpdesk.portal_group_by", function (require) { |
|||
"use strict"; |
|||
var ajax = require('web.ajax'); |
|||
var core = require('web.core'); |
|||
var QWeb = core.qweb; |
|||
|
|||
$("#group_select").on('change', function () { |
|||
var search_value = $("#group_select").val(); |
|||
ajax.jsonRpc('/ticketgroupby', 'call', { |
|||
'search_value': search_value, |
|||
}).then(function(result) { |
|||
$('.search_ticket').html(result); |
|||
}); |
|||
}) |
|||
|
|||
}) |
@ -0,0 +1,33 @@ |
|||
odoo.define("odoo_website_helpdesk.portal_group_by_and_search", function (require) { |
|||
"use strict"; |
|||
var ajax = require('web.ajax'); |
|||
var publicWidget = require('web.public.widget'); |
|||
publicWidget.registry.portalSearchGroup = publicWidget.Widget.extend({ |
|||
selector: '.portal_group_by', |
|||
events: { |
|||
'change #group_select': '_onGroupSelectChange', |
|||
'click #search_ticket': '_searchTickets', |
|||
}, |
|||
// GroupBy filtering the portal tickets
|
|||
_onGroupSelectChange: function (ev) { |
|||
var self = this; |
|||
var searchValue = this.$el.find('#group_select').val(); |
|||
ajax.jsonRpc('/ticketgroupby', 'call', { |
|||
'search_value': searchValue, |
|||
}).then(function (result) { |
|||
$('.search_ticket').html(result); |
|||
}); |
|||
}, |
|||
// Searching the portal tickets
|
|||
_searchTickets: function (ev) { |
|||
var self = this; |
|||
var search_value = this.$el.find("#search_box").val(); |
|||
ajax.jsonRpc('/ticketsearch', 'call', { |
|||
'search_value': search_value, |
|||
}).then(function(result) { |
|||
var self = this; |
|||
$('.search_ticket').html(result); |
|||
}); |
|||
} |
|||
}); |
|||
}) |
@ -1,16 +0,0 @@ |
|||
odoo.define("odoo_website_helpdesk.portal_search", function (require) { |
|||
"use strict"; |
|||
var ajax = require('web.ajax'); |
|||
var core = require('web.core'); |
|||
var QWeb = core.qweb; |
|||
|
|||
$("#search_ticket").on('click', function () { |
|||
var search_value = $("#search_box").val(); |
|||
ajax.jsonRpc('/ticketsearch', 'call', { |
|||
'search_value': search_value, |
|||
}).then(function(result) { |
|||
$('.search_ticket').html(result); |
|||
}); |
|||
}) |
|||
|
|||
}) |
@ -0,0 +1,272 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<templates> |
|||
<t t-name="HelpdeskDashBoard"> |
|||
<section class="dashboard_main_section" id="main_section_manager"> |
|||
<div class="row"> |
|||
<style> |
|||
.c-dashboardInfo { |
|||
margin-bottom: 15px; |
|||
width: 20%; |
|||
} |
|||
.c-dashboardInfo .wrap { |
|||
background: #ffffff; |
|||
box-shadow: 2px 10px 20px rgba(0, 0, 0, 0.1); |
|||
border-radius: 7px; |
|||
text-align: center; |
|||
position: relative; |
|||
overflow: hidden; |
|||
padding: 40px 25px 20px; |
|||
height: 100%; |
|||
} |
|||
.c-dashboardInfo__title, |
|||
.c-dashboardInfo__subInfo { |
|||
color: #6c6c6c; |
|||
font-size: 1.18em; |
|||
} |
|||
.c-dashboardInfo span { |
|||
display: block; |
|||
} |
|||
.c-dashboardInfo__count { |
|||
font-weight: 600; |
|||
font-size: 2.5em; |
|||
line-height: 64px; |
|||
color: #323c43; |
|||
} |
|||
.c-dashboardInfo .wrap:after { |
|||
display: block; |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
width: 100%; |
|||
height: 10px; |
|||
content: ""; |
|||
} |
|||
.c-dashboardInfo:nth-child(1) .wrap:after { |
|||
background: linear-gradient(82.59deg, #00c48c 0%, #00a173 |
|||
100%); |
|||
} |
|||
.wrap:hover{ |
|||
-webkit-transform: scale(1.2); |
|||
-ms-transform: scale(1.2); |
|||
transform: scale(1.2); |
|||
transition: 1s ease; |
|||
} |
|||
.c-dashboardInfo:nth-child(2) .wrap:after { |
|||
background: linear-gradient(81.67deg, #0084f4 0%, #1a4da2 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(3) .wrap:after { |
|||
background: linear-gradient(69.83deg, #0084f4 0%, #00c48c |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(4) .wrap:after { |
|||
background: linear-gradient(81.67deg, #ff647c 0%, #1f5dc5 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(5) .wrap:after { |
|||
background: linear-gradient(82.59deg, #00c48c 0%, #00a173 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(6) .wrap:after { |
|||
background: linear-gradient(81.67deg, #ff647c 0%, #1f5dc5 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo__title svg { |
|||
color: #d7d7d7; |
|||
margin-left: 5px; |
|||
} |
|||
.MuiSvgIcon-root-19 { |
|||
fill: currentColor; |
|||
width: 1em; |
|||
height: 1em; |
|||
display: inline-block; |
|||
font-size: 24px; |
|||
transition: fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; |
|||
user-select: none; |
|||
flex-shrink: 0; |
|||
} |
|||
.dropbtn { |
|||
background-color: #04AA6D; |
|||
color: white; |
|||
padding: 16px; |
|||
font-size: 16px; |
|||
border: none; |
|||
width: 16px; |
|||
} |
|||
.dropdown { |
|||
position: relative; |
|||
display: inline-block; |
|||
} |
|||
.dropdown-content { |
|||
display: none; |
|||
position: absolute; |
|||
background-color: #f1f1f1; |
|||
min-width: 160px; |
|||
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); |
|||
z-index: 1; |
|||
} |
|||
.dropdown-content a { |
|||
color: black; |
|||
padding: 12px 16px; |
|||
text-decoration: none; |
|||
display: block; |
|||
} |
|||
.dropdown-content a:hover {background-color: #ddd;} |
|||
.dropdown:hover .dropdown-content {display: block;} |
|||
.dropdown:hover .dropbtn {background-color: #3e8e41;} |
|||
</style> |
|||
<div class="col-sm-12 mb-4"> |
|||
<div class="row"> |
|||
<div class="col" |
|||
style="margin-top: 28px;margin-left: 88px;height: 48px;"> |
|||
<h2 class="section-header" style="color:#4a5c9a;"> |
|||
Helpdesk Dashboard |
|||
</h2> |
|||
</div> |
|||
<div class="col-md-4 d-flex justify-content-end bg-light" |
|||
style="margin-top: 20px;margin-right: 20px; padding-bottom: 40px"> |
|||
<b style="white-space: nowrap;padding-right: 8px;padding-top: 8px;"> |
|||
Filter by: |
|||
</b> |
|||
<select id="filter_selection" |
|||
style="width: 50%;padding:10px;border-radius:10px; background:white;"> |
|||
<option id="this_year" value="this_year" |
|||
selected="">This Year |
|||
</option> |
|||
<option id="this_month" |
|||
value="this_month">This Month |
|||
</option> |
|||
<option id="this_week" value="this_week">This |
|||
Week |
|||
</option> |
|||
</select> |
|||
</div> |
|||
<hr/> |
|||
</div> |
|||
</div> |
|||
<div id="root"> |
|||
<div class="container pt-5"> |
|||
<div class="row align-items-stretch"> |
|||
<div class="c-dashboardInfo" |
|||
id="new_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
New |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"/> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="new_state_value"> |
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="in_progress_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
In Progress |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"/> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="inprogress_value"> |
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="cancelled_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
Cancelled |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"/> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="canceled_value"> |
|||
|
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="done_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
Done |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"/> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="done_value"> |
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="closed_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
Closed |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"/> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="closed_value"> |
|||
</span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
</t> |
|||
</templates> |
@ -1,287 +0,0 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<template> |
|||
<t t-name="HelpdeskDashBoard"> |
|||
|
|||
<section class="dashboard_main_section" id="main_section_manager"> |
|||
<div class="row"> |
|||
<style> |
|||
.c-dashboardInfo { |
|||
margin-bottom: 15px; |
|||
width: 20%; |
|||
} |
|||
.c-dashboardInfo .wrap { |
|||
background: #ffffff; |
|||
box-shadow: 2px 10px 20px rgba(0, 0, 0, 0.1); |
|||
border-radius: 7px; |
|||
text-align: center; |
|||
position: relative; |
|||
overflow: hidden; |
|||
padding: 40px 25px 20px; |
|||
height: 100%; |
|||
} |
|||
.c-dashboardInfo__title, |
|||
.c-dashboardInfo__subInfo { |
|||
color: #6c6c6c; |
|||
font-size: 1.18em; |
|||
} |
|||
.c-dashboardInfo span { |
|||
display: block; |
|||
} |
|||
.c-dashboardInfo__count { |
|||
font-weight: 600; |
|||
font-size: 2.5em; |
|||
line-height: 64px; |
|||
color: #323c43; |
|||
} |
|||
.c-dashboardInfo .wrap:after { |
|||
display: block; |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
width: 100%; |
|||
height: 10px; |
|||
content: ""; |
|||
} |
|||
|
|||
.c-dashboardInfo:nth-child(1) .wrap:after { |
|||
background: linear-gradient(82.59deg, #00c48c 0%, #00a173 |
|||
100%); |
|||
} |
|||
.wrap:hover{ |
|||
-webkit-transform: scale(1.2); |
|||
-ms-transform: scale(1.2); |
|||
transform: scale(1.2); |
|||
transition: 1s ease; |
|||
} |
|||
.c-dashboardInfo:nth-child(2) .wrap:after { |
|||
background: linear-gradient(81.67deg, #0084f4 0%, #1a4da2 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(3) .wrap:after { |
|||
background: linear-gradient(69.83deg, #0084f4 0%, #00c48c |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(4) .wrap:after { |
|||
background: linear-gradient(81.67deg, #ff647c 0%, #1f5dc5 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(5) .wrap:after { |
|||
background: linear-gradient(82.59deg, #00c48c 0%, #00a173 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo:nth-child(6) .wrap:after { |
|||
background: linear-gradient(81.67deg, #ff647c 0%, #1f5dc5 |
|||
100%); |
|||
} |
|||
.c-dashboardInfo__title svg { |
|||
color: #d7d7d7; |
|||
margin-left: 5px; |
|||
} |
|||
.MuiSvgIcon-root-19 { |
|||
fill: currentColor; |
|||
width: 1em; |
|||
height: 1em; |
|||
display: inline-block; |
|||
font-size: 24px; |
|||
transition: fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; |
|||
user-select: none; |
|||
flex-shrink: 0; |
|||
} |
|||
.dropbtn { |
|||
background-color: #04AA6D; |
|||
color: white; |
|||
padding: 16px; |
|||
font-size: 16px; |
|||
border: none; |
|||
width: 16px; |
|||
} |
|||
|
|||
.dropdown { |
|||
position: relative; |
|||
display: inline-block; |
|||
} |
|||
|
|||
.dropdown-content { |
|||
display: none; |
|||
position: absolute; |
|||
background-color: #f1f1f1; |
|||
min-width: 160px; |
|||
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); |
|||
z-index: 1; |
|||
} |
|||
|
|||
.dropdown-content a { |
|||
color: black; |
|||
padding: 12px 16px; |
|||
text-decoration: none; |
|||
display: block; |
|||
} |
|||
|
|||
.dropdown-content a:hover {background-color: #ddd;} |
|||
|
|||
.dropdown:hover .dropdown-content {display: block;} |
|||
|
|||
.dropdown:hover .dropbtn {background-color: #3e8e41;} |
|||
|
|||
</style> |
|||
<div class="col-sm-12 mb-4"> |
|||
<div class="row"> |
|||
<div class="col" |
|||
style="margin-top: 28px;margin-left: 88px;height: 48px;"> |
|||
<h2 class="section-header" style="color:#4a5c9a;"> |
|||
Helpdesk Dashboard |
|||
</h2> |
|||
</div> |
|||
<div class="col-md-4 d-flex justify-content-end bg-light" |
|||
style="margin-top: 20px;margin-right: 20px; padding-bottom: 40px"> |
|||
<b style="white-space: nowrap;padding-right: 8px;padding-top: 8px;">Filter by:</b> |
|||
<select id="filter_selection" style="width: 50%;padding:10px;border-radius:10px; background:white;"> |
|||
<option id="this_year" value="this_year" |
|||
selected="">This Year |
|||
</option> |
|||
<option id="this_month" |
|||
value="this_month">This Month |
|||
</option> |
|||
<option id="this_week" value="this_week">This Week |
|||
</option> |
|||
</select> |
|||
|
|||
</div> |
|||
<hr/> |
|||
</div> |
|||
</div> |
|||
<div id="root"> |
|||
<div class="container pt-5"> |
|||
<div class="row align-items-stretch"> |
|||
<div class="c-dashboardInfo" |
|||
id="new_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
New |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"></path> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="new_state_value"> |
|||
|
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="in_progress_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
In Progress |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"></path> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="inprogress_value"> |
|||
|
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="cancelled_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
Cancelled |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"></path> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="canceled_value"> |
|||
|
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="done_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
Done |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"></path> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="done_value"> |
|||
|
|||
</span> |
|||
<!-- <span--> |
|||
<!-- class="hind-font caption-12 c-dashboardInfo__subInfo">--> |
|||
<!-- Last month: €30--> |
|||
<!-- </span>--> |
|||
</div> |
|||
</div> |
|||
<div class="c-dashboardInfo" |
|||
id="closed_state"> |
|||
<div class="wrap"> |
|||
<h4 class="heading heading5 hind-font medium-font-weight c-dashboardInfo__title"> |
|||
Closed |
|||
<svg |
|||
class="MuiSvgIcon-root-19" |
|||
focusable="false" |
|||
viewBox="0 0 24 24" |
|||
aria-hidden="true" |
|||
role="presentation"> |
|||
<path fill="none" |
|||
d="M0 0h24v24H0z"></path> |
|||
<path |
|||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"> |
|||
</path> |
|||
</svg> |
|||
</h4> |
|||
<span class="hind-font caption-12 c-dashboardInfo__count" |
|||
id="closed_value"> |
|||
|
|||
</span> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
</t> |
|||
</template> |
@ -1,58 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data> |
|||
<!-- Helpdesk Replay mail template--> |
|||
<record id="helpdesk_replay_email_template" model="mail.template"> |
|||
<field name="name">Helpdesk Reply Email Template</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="subject">{{ object.name }} Replay</field> |
|||
<field name="body_html" type="html"> |
|||
<div class="container"> |
|||
<h4 style="text-align:center">Helpdesk Replay</h4> |
|||
<div style="min-height:30vh;"> |
|||
message........ |
|||
</div> |
|||
<h6><a t-attf-href="http://cybrosys:8050/@/my/tickets/{{object.id}}" |
|||
class="btn btn-primary">View Ticket |
|||
</a></h6> |
|||
<table class="table table-light" width="100%"> |
|||
<tbody> |
|||
<tr> |
|||
<th>Name</th> |
|||
<td> |
|||
<t t-if="object.assigned_user"> |
|||
<t t-esc="object.assigned_user.name"/> |
|||
</t> |
|||
<t t-else=""> |
|||
username |
|||
</t> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th>Team name</th> |
|||
<td> |
|||
<t t-if="object.team_id"> |
|||
<t t-esc="object.team_id.name"/> |
|||
</t> |
|||
<t t-else=""> |
|||
Team name |
|||
</t> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th>Replied On</th> |
|||
<td> |
|||
<t t-set="date" |
|||
t-value="(datetime.date.today())"/> |
|||
<t t-esc="date"/> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -1,13 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<record id="view_helpdesk_categories_tree" model="ir.ui.view"> |
|||
<field name="name">categories.tree</field> |
|||
<field name="model">helpdesk.categories</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="Categories" editable="bottom"> |
|||
<field name="sequence" widget="handle"/> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,20 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- Helpdesk categories view action--> |
|||
<record id="helpdesk_categories_action" model="ir.actions.act_window"> |
|||
<field name="name">Categories</field> |
|||
<field name="res_model">helpdesk.categories</field> |
|||
<field name="view_mode">tree</field> |
|||
</record> |
|||
<!-- Helpdesk category tree view--> |
|||
<record id="helpdesk_categories_view_tree" model="ir.ui.view"> |
|||
<field name="name">helpdesk.categories.view.tree</field> |
|||
<field name="model">helpdesk.categories</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="Categories" editable="bottom"> |
|||
<field name="sequence" widget="handle"/> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,61 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- Helpdesk Replay mail template--> |
|||
<record id="helpdesk_replay_email_template" model="mail.template"> |
|||
<field name="name">Helpdesk Reply Email Template</field> |
|||
<field name="model_id" |
|||
ref="odoo_website_helpdesk.model_help_ticket"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="subject">{{ object.name }} Replay</field> |
|||
<field name="body_html" type="html"> |
|||
<div class="container"> |
|||
<h4 style="text-align:center">Helpdesk Replay</h4> |
|||
<div style="min-height:30vh;"> |
|||
message........ |
|||
</div> |
|||
<t t-set="base_url" |
|||
t-value="request.env['ir.config_parameter'].sudo().get_param('web.base.url')"/> |
|||
<h6> |
|||
<a t-attf-href="{{base_url}}/my/tickets/{{object.id}}" |
|||
class="btn btn-primary">View Ticket |
|||
</a> |
|||
</h6> |
|||
<table class="table table-light" width="100%"> |
|||
<tbody> |
|||
<tr> |
|||
<th>Name</th> |
|||
<td> |
|||
<t t-if="object.assigned_user"> |
|||
<t t-esc="object.assigned_user.name"/> |
|||
</t> |
|||
<t t-else=""> |
|||
username |
|||
</t> |
|||
<t t-esc="base_url"/> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th>Team name</th> |
|||
<td> |
|||
<t t-if="object.team_id"> |
|||
<t t-esc="object.team_id.name"/> |
|||
</t> |
|||
<t t-else=""> |
|||
Team name |
|||
</t> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th>Replied On</th> |
|||
<td> |
|||
<t t-set="date" |
|||
t-value="(datetime.date.today())"/> |
|||
<t t-esc="date"/> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- Helpdesk tag view action--> |
|||
<record id="helpdesk_tag_action" model="ir.actions.act_window"> |
|||
<field name="name">Tags</field> |
|||
<field name="res_model">helpdesk.tag</field> |
|||
<field name="view_mode">tree</field> |
|||
<field name="help" type="html"> |
|||
<p class="o_view_nocontent_smiling_face"> |
|||
Create a new record! |
|||
</p> |
|||
</field> |
|||
</record> |
|||
<!--Helpdesk tag tree view--> |
|||
<record id="helpdesk_tag_view_tree" model="ir.ui.view"> |
|||
<field name="name">helpdesk.tag.view.tree</field> |
|||
<field name="model">helpdesk.tag</field> |
|||
<field name="arch" type="xml"> |
|||
<tree editable="bottom"> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- Helpdesk types view action--> |
|||
<record id="helpdesk_types_action" model="ir.actions.act_window"> |
|||
<field name="name">Types</field> |
|||
<field name="res_model">helpdesk.types</field> |
|||
<field name="view_mode">tree</field> |
|||
<field name="help" type="html"> |
|||
<p class="o_view_nocontent_smiling_face"> |
|||
Create a new record! |
|||
</p> |
|||
</field> |
|||
</record> |
|||
<!-- Helpdesk type tree view--> |
|||
<record id="helpdesk_types_view_tree" model="ir.ui.view"> |
|||
<field name="name">helpdesk.types.view.tree</field> |
|||
<field name="model">helpdesk.types</field> |
|||
<field name="arch" type="xml"> |
|||
<tree editable="bottom"> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
</odoo> |