@ -1,5 +1,26 @@ |
|||||
from . import website_form |
# -*- coding: utf-8 -*- |
||||
from . import portal |
############################################################################# |
||||
|
# |
||||
|
# 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 helpdesk_website |
||||
|
from . import portal |
||||
from . import ticket_search |
from . import ticket_search |
||||
from . import ticket_group_by |
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"?> |
<?xml version="1.0" encoding="utf-8"?> |
||||
<odoo> |
<odoo> |
||||
<!-- Project Stages --> |
<!-- Project Stages --> |
||||
<record id="stage_inbox" model="ticket.stage"> |
<record id="ticket_stage_inbox" model="ticket.stage"> |
||||
<field name="sequence">10</field> |
<field name="sequence">10</field> |
||||
<field name="name">Inbox</field> |
<field name="name">Inbox</field> |
||||
</record> |
</record> |
||||
<record id="stage_draft" model="ticket.stage"> |
<!-- Draft--> |
||||
|
<record id="ticket_stage_draft" model="ticket.stage"> |
||||
<field name="sequence">15</field> |
<field name="sequence">15</field> |
||||
<field name="name">Draft</field> |
<field name="name">Draft</field> |
||||
</record> |
</record> |
||||
<record id="stage_done" model="ticket.stage"> |
<!--In progress--> |
||||
<field name="sequence">25</field> |
<record id="ticket_stage_in_progress" model="ticket.stage"> |
||||
<field name="name">Done</field> |
|
||||
</record> |
|
||||
<record id="stage_in_progress" model="ticket.stage"> |
|
||||
<field name="sequence">20</field> |
<field name="sequence">20</field> |
||||
<field name="starting_stage" eval="True"/> |
<field name="starting_stage" eval="True"/> |
||||
<field name="name">In Progress</field> |
<field name="name">In Progress</field> |
||||
</record> |
</record> |
||||
<record id="stage_closed" model="ticket.stage"> |
<!--Done--> |
||||
<field name="sequence">30</field> |
<record id="ticket_stage_done" model="ticket.stage"> |
||||
<field name="closing_stage">True</field> |
<field name="sequence">25</field> |
||||
<field name="name">Closed</field> |
<field name="name">Done</field> |
||||
|
<field name="folded" eval="True"/> |
||||
</record> |
</record> |
||||
<record id="stage_canceled" model="ticket.stage"> |
<!--Cancelled--> |
||||
<field name="sequence">35</field> |
<record id="ticket_stage_cancel" model="ticket.stage"> |
||||
<field name="cancel_stage">True</field> |
<field name="sequence">30</field> |
||||
<field name="name">Canceled</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> |
</record> |
||||
</odoo> |
</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> |
## Module <odoo_website_helpdesk> |
||||
|
|
||||
#### 01.09.2023 |
#### 04.12.2023 |
||||
#### Version 16.0.1.0.0 |
#### Version 16.0.1.0.0 |
||||
#### ADD |
#### ADD |
||||
|
- Initial commit for Website Helpdesk Support Ticket Management |
||||
- 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 |
|
||||
|
@ -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) { |
odoo.define('odoo_website_helpdesk.multiple_product_choose', function(require) { |
||||
"use strict"; |
"use strict"; |
||||
var ajax = require('web.ajax'); |
var rpc = require('web.rpc'); |
||||
$(document).ready(function() { |
var publicWidget = require('web.public.widget'); |
||||
ajax.rpc('/product').then(function (res) { |
publicWidget.registry.SelectProduct = publicWidget.Widget.extend({ |
||||
var ar = res |
selector: '.website_ticket', |
||||
$('#product').empty() |
start: function () { |
||||
$(ar).each(function(i){ |
var self = this; |
||||
$('#product').append("<option value=" + ar[i].id + ">" + ar[i].name + "</option>"); |
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> |