summaryrefslogtreecommitdiff
path: root/sh_helpdesk/views
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
commit1ca3b3df3421961caec3b747a364071c80f5c7da (patch)
tree6778a1f0f3f9b4c6e26d6d87ccde16e24da6c9d6 /sh_helpdesk/views
parentb57188be371d36d96caac4b8d65a40745c0e972c (diff)
initial commit
Diffstat (limited to 'sh_helpdesk/views')
-rw-r--r--sh_helpdesk/views/helpdesk_alarm.xml44
-rw-r--r--sh_helpdesk/views/helpdesk_assets.xml9
-rw-r--r--sh_helpdesk/views/helpdesk_category_view.xml46
-rw-r--r--sh_helpdesk/views/helpdesk_config_settings_view.xml300
-rw-r--r--sh_helpdesk/views/helpdesk_menu.xml15
-rw-r--r--sh_helpdesk/views/helpdesk_priority_view.xml32
-rw-r--r--sh_helpdesk/views/helpdesk_sla_policies.xml71
-rw-r--r--sh_helpdesk/views/helpdesk_stages_view.xml50
-rw-r--r--sh_helpdesk/views/helpdesk_subcategory_view.xml52
-rw-r--r--sh_helpdesk/views/helpdesk_subject_type_view.xml36
-rw-r--r--sh_helpdesk/views/helpdesk_tags_view.xml36
-rw-r--r--sh_helpdesk/views/helpdesk_team_view.xml71
-rw-r--r--sh_helpdesk/views/helpdesk_ticket_multi_action_view.xml13
-rw-r--r--sh_helpdesk/views/helpdesk_ticket_portal_template.xml663
-rw-r--r--sh_helpdesk/views/helpdesk_ticket_type_view.xml44
-rw-r--r--sh_helpdesk/views/helpdesk_ticket_update_wizard_view.xml47
-rw-r--r--sh_helpdesk/views/helpdesk_ticket_view.xml320
-rw-r--r--sh_helpdesk/views/report_views.xml22
-rw-r--r--sh_helpdesk/views/res_users.xml26
-rw-r--r--sh_helpdesk/views/send_mail_quick_reply.xml46
-rw-r--r--sh_helpdesk/views/sh_helpdeks_report_portal.xml255
-rw-r--r--sh_helpdesk/views/sh_report_helpdesk_ticket_template.xml277
-rw-r--r--sh_helpdesk/views/sh_ticket_feedback_template.xml49
-rw-r--r--sh_helpdesk/views/ticket_dashboard_templates.xml150
-rw-r--r--sh_helpdesk/views/ticket_dashboard_view.xml97
25 files changed, 2771 insertions, 0 deletions
diff --git a/sh_helpdesk/views/helpdesk_alarm.xml b/sh_helpdesk/views/helpdesk_alarm.xml
new file mode 100644
index 0000000..7676004
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_alarm.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="sh_helpdesk_alarm_view_form" model="ir.ui.view">
+ <field name="name">sh.ticket.alarm</field>
+ <field name="model">sh.ticket.alarm</field>
+ <field name="arch" type="xml">
+ <form>
+ <sheet>
+ <group>
+ <group>
+ <field name="name" force_save="1"/>
+ <field name="sh_remind_before" />
+ <field name="sh_reminder_unit" />
+ </group>
+ <group>
+ <field name="type" />
+ <field name="company_id" groups="base.group_multi_company" />
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="sh_helpdesk_alarm_tree_view" model="ir.ui.view">
+ <field name="name">sh.ticket.alarm</field>
+ <field name="model">sh.ticket.alarm</field>
+ <field name="arch" type="xml">
+ <tree>
+ <field name="name" />
+ <field name="type" />
+ <field name="sh_remind_before" />
+ <field name="sh_reminder_unit" />
+ <field name="company_id" groups="base.group_multi_company" />
+ </tree>
+ </field>
+ </record>
+ <record id="sh_helpdesk_alarm_action" model="ir.actions.act_window">
+ <field name="name">Ticket Alarm</field>
+ <field name="res_model">sh.ticket.alarm</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="view_mode">tree,form</field>
+ </record>
+ <menuitem id="sh_helpdesk_alarm_manu" name="Helpdesk Ticket Alarm" action="sh_helpdesk_alarm_action" parent="sh_helpdesk.helpdesk_config_menu" groups="sh_helpdesk.group_helpdesk_alarm" sequence="10" />
+</odoo> \ No newline at end of file
diff --git a/sh_helpdesk/views/helpdesk_assets.xml b/sh_helpdesk/views/helpdesk_assets.xml
new file mode 100644
index 0000000..791aacf
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_assets.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="assets_backend" name="helpdesk assets" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <script type="text/javascript" src="/sh_helpdesk/static/src/js/helpdesk_ticket_kanban_examples.js"></script>
+ <script type="text/javascript" src="/sh_helpdesk/static/src/js/helpdesk_ticket_dasboard.js"/>
+ </xpath>
+ </template>
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_category_view.xml b/sh_helpdesk/views/helpdesk_category_view.xml
new file mode 100644
index 0000000..e1405d5
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_category_view.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="helpdesk_category_view_form" model="ir.ui.view">
+ <field name="name">helpdesk.category.view.form</field>
+ <field name="model">helpdesk.category</field>
+ <field name="arch" type="xml">
+ <form>
+ <sheet>
+ <!-- <field name="image_medium" widget="image" class="oe_avatar"/> -->
+ <div class="oe_title">
+ <label class="oe_edit_only" for="name" string="Category Name" />
+ <h2><field name="name" /></h2>
+ </div>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="helpdesk_category_view_tree" model="ir.ui.view">
+ <field name="name">helpdesk.category.view.tree</field>
+ <field name="model">helpdesk.category</field>
+ <field name="arch" type="xml">
+ <tree>
+ <field name="sequence" widget="handle" />
+ <field name="name" />
+ </tree>
+ </field>
+ </record>
+
+ <record id="helpdesk_category_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Categories</field>
+ <field name="res_model">helpdesk.category</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create new category</p>
+ </field>
+ </record>
+
+ <record id="sequence_helpdesk_category_seq" model="ir.sequence">
+ <field name="name">Helpdesk Category Sequence</field>
+ <field name="code">helpdesk.category</field>
+ <field eval="1" name="number_next" />
+ <field eval="1" name="number_increment" />
+ </record>
+ <menuitem id="helpdesk_category_menu" name="Helpdesk Categories" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_category_action" sequence="6" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_config_settings_view.xml b/sh_helpdesk/views/helpdesk_config_settings_view.xml
new file mode 100644
index 0000000..b7383dd
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_config_settings_view.xml
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="helpdesk_config_setting_view" model="ir.ui.view">
+ <field name="name">helpdesk.config.setting.view</field>
+ <field name="model">res.config.settings</field>
+ <field name="inherit_id" ref="base.res_config_settings_view_form" />
+ <field name="arch" type="xml">
+ <xpath expr="//div[hasclass('settings')]" position="inside">
+ <div class="app_settings_block" data-string="Helpdesk Settings" string="Helpdesk" data-key="sh_helpdesk">
+ <div>
+ <h2>Ticket Settings</h2>
+ <field name="company_id" invisible="1" />
+
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="category" />
+ <br />
+ <field name="category" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="sub_category" />
+ <br />
+ <field name="sub_category" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="customer_rating" />
+ <br />
+ <field name="customer_rating" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="auto_close_ticket" />
+ <br />
+ <field name="auto_close_ticket" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ <div class="row o_settings_container" attrs="{'invisible':[('auto_close_ticket','=',False)]}">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="close_days" />
+ <br />
+ <field name="close_days" class="oe_inline" attrs="{'required':[('auto_close_ticket','=',True)]}" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ </div>
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="sh_default_team_id" />
+ <br />
+ <field name="sh_default_team_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box" attrs="{'invisible':[('sh_default_team_id','=',False)]}">
+ <div class="o_setting_right_pane">
+ <label for="sh_default_user_id" />
+ <br />
+ <field name="sh_default_user_id" class="oe_inline" attrs="{'required':[('sh_default_team_id','!=',False)]}"/>
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ <div>
+ <h2>Ticket Stage Settings</h2>
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="new_stage_id" />
+ <br />
+ <field name="new_stage_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="reopen_stage_id" />
+ <br />
+ <field name="reopen_stage_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="cancel_stage_id" />
+ <br />
+ <field name="cancel_stage_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="done_stage_id" />
+ <br />
+ <field name="done_stage_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="close_stage_id" />
+ <br />
+ <field name="close_stage_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ </div>
+ <div>
+ <h2>Ticket Mail Template Settings</h2>
+
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="allocation_mail_template_id" />
+ <br />
+ <field name="allocation_mail_template_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="reply_mail_template_id" />
+ <br />
+ <field name="reply_mail_template_id" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="sh_receive_email_seeing_ticket" />
+ <br />
+ <field name="sh_receive_email_seeing_ticket" class="oe_inline" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ </div>
+ <div>
+ <h2>Ticket Dashboard Settings</h2>
+
+ <div class="row o_settings_container">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="dashboard_filter" />
+ <br />
+ <field name="dashboard_filter" class="oe_inline" widget="many2many_tags" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_right_pane">
+ <label for="dashboard_tables" />
+ <br />
+ <field name="dashboard_tables" class="oe_inline" widget="many2many_tags" />
+ </div>
+ <div class="o_setting_left_pane"></div>
+ </div>
+ </div>
+ </div>
+ <h2 id="multi_users">Multi Users in Ticket Configuration</h2>
+ <div class="row mt16 o_settings_container" id="multi_users_div">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_display_multi_user" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_display_multi_user" />
+ <div class="text-muted"></div>
+ </div>
+ </div>
+ </div>
+ <h2 id="manage_products">Manage Products Inside Helpdesk Ticket</h2>
+ <div class="row mt16 o_settings_container" id="manage_products_div">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_configure_activate" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_configure_activate" />
+ <div class="text-muted"></div>
+ </div>
+ </div>
+ </div>
+ <h2 id="manage_reminder">Helpdesk Ticket Reminder Configuration</h2>
+ <div class="row mt16 o_settings_container" id="manage_reminder_div">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_display_ticket_reminder" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_display_ticket_reminder" />
+ <div class="text-muted"></div>
+ </div>
+ </div>
+ </div>
+ <h2 id="manage_whatsapp">Helpdesk Ticket Send Whatsapp Configuration</h2>
+ <div class="row mt16 o_settings_container">
+ <div class="col-12 col-lg-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_ticket_product_detail" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_ticket_product_detail" />
+ <div class="text-muted">
+ Show Ticket Product details in message
+ </div>
+ </div>
+ </div>
+ <div class="col-12 col-lg-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_signature" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_signature" />
+ <div class="text-muted">
+ Show Signature
+ </div>
+ </div>
+ </div>
+ <div class="col-12 col-lg-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_display_in_chatter" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_display_in_chatter" />
+ <div class="text-muted">
+ Show Message in Chatter
+ </div>
+ </div>
+ </div>
+
+ <div class="col-12 col-lg-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_pdf_in_message" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_pdf_in_message" />
+ <div class="text-muted">
+ Send Report Url in Message
+ </div>
+ </div>
+ </div>
+ <div class="col-12 col-lg-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_ticket_url_in_message" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_ticket_url_in_message" />
+ <div class="text-muted">
+ Send Ticket Url in Message
+ </div>
+ </div>
+ </div>
+ </div>
+ <h2 id="manage_follower">Helpdesk Auto Add Followers Configuration</h2>
+ <div class="row mt16 o_settings_container" id="manage_auto_add_followers_div">
+ <div class="col-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="sh_auto_add_customer_as_follower" />
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="sh_auto_add_customer_as_follower" />
+ <div class="text-muted"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </xpath>
+ </field>
+ </record>
+ <record id="action_helpdesk_configuration" model="ir.actions.act_window">
+ <field name="name">Helpdesk Settings</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">res.config.settings</field>
+ <field name="view_mode">form</field>
+ <field name="target">inline</field>
+ <field name="context">{'module' : 'sh_helpdesk'}</field>
+ </record>
+ <menuitem id="menu_config_helpdesk" name="Settings" parent="sh_helpdesk.helpdesk_config_menu" sequence="11" action="action_helpdesk_configuration" groups="base.group_system,sh_helpdesk.helpdesk_group_manager" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_menu.xml b/sh_helpdesk/views/helpdesk_menu.xml
new file mode 100644
index 0000000..1264ed3
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_menu.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <menuitem id="helpdesk_main_menu" name="Helpdesk" web_icon="sh_helpdesk,static/description/icon.png" />
+ <menuitem id="helpdesk_reporting_menu" name="Reporting" parent="helpdesk_main_menu" sequence="3" />
+ <menuitem id="helpdesk_config_menu" name="Configuration" parent="helpdesk_main_menu" sequence="5" groups="sh_helpdesk.helpdesk_group_manager" />
+ <!-- <record id="sh_helpdesk.new_stage" model="helpdesk.stages">
+ <field name="sh_next_stage" ref="sh_helpdesk.in_progress_stage" />
+ </record>
+ <record id="sh_helpdesk.in_progress_stage" model="helpdesk.stages">
+ <field name="sh_next_stage" ref="sh_helpdesk.done_stage" />
+ </record>
+ <record id="sh_helpdesk.done_stage" model="helpdesk.stages">
+ <field name="sh_next_stage" ref="sh_helpdesk.close_stage" />
+ </record> -->
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_priority_view.xml b/sh_helpdesk/views/helpdesk_priority_view.xml
new file mode 100644
index 0000000..119aafe
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_priority_view.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="helpdesk_priority_view_tree" model="ir.ui.view">
+ <field name="name">helpdesk.priority.view.tree</field>
+ <field name="model">helpdesk.priority</field>
+ <field name="arch" type="xml">
+ <tree editable="top">
+ <field name="sequence" widget="handle" />
+ <field name="name" />
+ </tree>
+ </field>
+ </record>
+
+ <record id="helpdesk_priority_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Priorities</field>
+ <field name="res_model">helpdesk.priority</field>
+ <field name="view_mode">tree</field>
+ <field name="help" type="html">
+ <p>
+ No Helpdesk Tickets priorities found
+ </p>
+ </field>
+ </record>
+
+ <record id="helpdesk_priority_seq" model="ir.sequence">
+ <field name="name">helpdesk priority sequence</field>
+ <field name="code">helpdesk.priority</field>
+ <field eval="1" name="number_next" />
+ <field eval="1" name="number_increment" />
+ </record>
+ <menuitem id="helpdesk_priority_menu" name="Helpdesk Priorities" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_priority_action" sequence="8" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_sla_policies.xml b/sh_helpdesk/views/helpdesk_sla_policies.xml
new file mode 100644
index 0000000..a284134
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_sla_policies.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="sh_helpdesk_sla_policies_form_view" model="ir.ui.view">
+ <field name="name">sh.helpdesk.sla</field>
+ <field name="model">sh.helpdesk.sla</field>
+ <field name="arch" type="xml">
+ <form string="Helpdesk SLA Policies">
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <button name="action_view_tickets" type="object" class="oe_stat_button" icon="fa-ticket" attrs="{'invisible':[('sla_ticket_count','=',0)]}">
+ <div class="o_stat_info">
+ <field name="sla_ticket_count" class="o_stat_value" />
+ <span class="o_stat_text">SLA Tickets</span>
+ </div>
+ </button>
+ </div>
+ <div class="oe_title">
+ <h1>
+ <field name="name"/>
+ </h1>
+ </div>
+ <group>
+ <group>
+ <field name="sh_team_id"/>
+ <field name="company_id"/>
+ </group>
+ <group>
+ <field name="sh_ticket_type_id"/>
+ </group>
+ </group>
+ <group string="SLA Target">
+ <group>
+ <field name="sh_sla_target_type" widget="radio"/>
+ <field name="sh_stage_id" attrs="{'required':[('sh_sla_target_type','=','reaching_stage')],'invisible':[('sh_sla_target_type','=','assign_to')]}"/>
+ </group>
+ <group>
+ <div class="o_td_label">
+ <label for="sh_days" string="Reach In"/>
+ </div>
+ <div class="o_row">
+ <field name="sh_days"/> days<br/>
+ <field name="sh_hours"/> hours<br/>
+ <field name="sh_minutes"/> minutes<br/>
+ </div>
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="sh_helpdesk_sla_policies_tree_view" model="ir.ui.view">
+ <field name="name">sh.helpdesk.sla</field>
+ <field name="model">sh.helpdesk.sla</field>
+ <field name="arch" type="xml">
+ <tree string="Helpdesk SLA Policies">
+ <field name="name"/>
+ <field name="sh_team_id"/>
+ <field name="sh_ticket_type_id"/>
+ <field name="sh_sla_target_type" widget="radio"/>
+ <field name="sh_stage_id"/>
+ </tree>
+ </field>
+ </record>
+ <record id="sh_sla_policies_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk SLA Policies</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">sh.helpdesk.sla</field>
+ <field name="view_mode">tree,form</field>
+ </record>
+ <menuitem id="sh_menu_helpdesk_sla" name="Helpdesk SLA Policies" parent="sh_helpdesk.helpdesk_config_menu" action="sh_sla_policies_action" sequence="9" groups="sh_helpdesk.group_helpdesk_sla_policy"/>
+</odoo> \ No newline at end of file
diff --git a/sh_helpdesk/views/helpdesk_stages_view.xml b/sh_helpdesk/views/helpdesk_stages_view.xml
new file mode 100644
index 0000000..208d250
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_stages_view.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="helpdesk_stages_form_view" model="ir.ui.view">
+ <field name="name">helpdesk.stages.form.view</field>
+ <field name="model">helpdesk.stages</field>
+ <field name="arch" type="xml">
+ <form string="Stage">
+ <sheet>
+ <group>
+ <group>
+ <field name="name" />
+ <field name="mail_template_ids" widget="many2many_tags" />
+ <field name="is_cancel_button_visible" />
+ <field name="is_done_button_visible" />
+ </group>
+ <group>
+ <field name="sh_next_stage" />
+ <field name="sh_group_ids" widget="many2many_tags" />
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="helpdesk_stages_tree_view" model="ir.ui.view">
+ <field name="name">helpdesk.stages.tree.view</field>
+ <field name="model">helpdesk.stages</field>
+ <field name="arch" type="xml">
+ <tree string="Stage">
+ <field name="sequence" widget="handle" />
+ <field name="name" />
+ </tree>
+ </field>
+ </record>
+ <record id="helpdesk_stages_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Stages</field>
+ <field name="res_model">helpdesk.stages</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create a New Stage</p>
+ </field>
+ </record>
+ <record id="sequence_helpdesk_stages_seq" model="ir.sequence">
+ <field name="name">Helpdesk Stages Sequence</field>
+ <field name="code">helpdesk.stages</field>
+ <field eval="1" name="number_next" />
+ <field eval="1" name="number_increment" />
+ </record>
+ <menuitem id="helpdesk_stages_menu" name="Helpdesk Stages" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_stages_action" sequence="5" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_subcategory_view.xml b/sh_helpdesk/views/helpdesk_subcategory_view.xml
new file mode 100644
index 0000000..efa92f9
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_subcategory_view.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="helpdesk_subcategory_view_form" model="ir.ui.view">
+ <field name="name">helpdesk.subcategory.view.form</field>
+ <field name="model">helpdesk.subcategory</field>
+ <field name="arch" type="xml">
+ <form string="Helpdesk SubCategory">
+ <sheet>
+ <!-- <field name="image_medium" widget="image" class="oe_avatar"/> -->
+ <div class="oe_title">
+ <label class="oe_edit_only" for="name" string="SubCategory Name" />
+ <h2><field name="name" /></h2>
+ </div>
+ <group>
+ <group>
+ <field name="parent_category_id" />
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="helpdesk_subcategory_view_tree" model="ir.ui.view">
+ <field name="name">helpdesk.subcategory.view.tree</field>
+ <field name="model">helpdesk.subcategory</field>
+ <field name="arch" type="xml">
+ <tree string="Helpdesk SubCategory">
+ <field name="sequence" widget="handle" />
+ <field name="parent_category_id" />
+ <field name="name" />
+ </tree>
+ </field>
+ </record>
+
+ <record id="helpdesk_subcategory_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Sub Categories</field>
+ <field name="res_model">helpdesk.subcategory</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create new sub category</p>
+ </field>
+ </record>
+
+ <record id="helpdesk_subcategory_seq" model="ir.sequence">
+ <field name="name">Helpdesk Sub Categories Sequence</field>
+ <field name="code">helpdesk.subcategory</field>
+ <field eval="1" name="number_next" />
+ <field eval="1" name="number_increment" />
+ </record>
+ <menuitem id="helpdesk_subcategory_menu" name="Helpdesk Sub Categories" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_subcategory_action" sequence="7" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_subject_type_view.xml b/sh_helpdesk/views/helpdesk_subject_type_view.xml
new file mode 100644
index 0000000..7ee645c
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_subject_type_view.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="helpdesk_subject_type_form_view" model="ir.ui.view">
+ <field name="name">helpdesk.subject.type.form.view</field>
+ <field name="model">helpdesk.sub.type</field>
+ <field name="arch" type="xml">
+ <form string="Subject Type">
+ <sheet>
+ <group>
+ <group>
+ <field name="name" />
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="helpdesk_subject_type_tree_view" model="ir.ui.view">
+ <field name="name">helpdesk.subject.type.tree.view</field>
+ <field name="model">helpdesk.sub.type</field>
+ <field name="arch" type="xml">
+ <tree string="Subject Type">
+ <field name="name" />
+ </tree>
+ </field>
+ </record>
+ <record id="helpdesk_subject_type_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Subject Type</field>
+ <field name="res_model">helpdesk.sub.type</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create a New Subject Type</p>
+ </field>
+ </record>
+ <menuitem id="helpdesk_subject_type_menu" name="Helpdesk Subject Types" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_subject_type_action" sequence="3" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_tags_view.xml b/sh_helpdesk/views/helpdesk_tags_view.xml
new file mode 100644
index 0000000..4ab418e
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_tags_view.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="helpdesk_tags_form_view" model="ir.ui.view">
+ <field name="name">helpdesk.tags.form.view</field>
+ <field name="model">helpdesk.tags</field>
+ <field name="arch" type="xml">
+ <form string="Tags">
+ <sheet>
+ <group>
+ <group>
+ <field name="name" />
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="helpdesk_tags_tree_view" model="ir.ui.view">
+ <field name="name">helpdesk.tags.tree.view</field>
+ <field name="model">helpdesk.tags</field>
+ <field name="arch" type="xml">
+ <tree string="Tags">
+ <field name="name" />
+ </tree>
+ </field>
+ </record>
+ <record id="helpdesk_tags_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Tags</field>
+ <field name="res_model">helpdesk.tags</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create a New Tag</p>
+ </field>
+ </record>
+ <menuitem id="helpdesk_tags_menu" name="Helpdesk Tags" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_tags_action" sequence="4" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_team_view.xml b/sh_helpdesk/views/helpdesk_team_view.xml
new file mode 100644
index 0000000..934b064
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_team_view.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="helpdesk_team_form_view" model="ir.ui.view">
+ <field name="name">helpdesk.team.form.view</field>
+ <field name="model">helpdesk.team</field>
+ <field name="arch" type="xml">
+ <form string="Helpdesk Team">
+ <sheet>
+ <div class="oe_button_box" name="button_box" groups="sh_helpdesk.group_helpdesk_sla_policy">
+ <button name="action_view_sla" type="object" class="oe_stat_button" icon="fa-ticket" attrs="{'invisible':[('sla_count','=',0)]}" groups="sh_helpdesk.group_helpdesk_sla_policy">
+ <div class="o_stat_info">
+ <field name="sla_count" class="o_stat_value" />
+ <span class="o_stat_text">Helpdesk SLA</span>
+ </div>
+ </button>
+ </div>
+ <group>
+ <group>
+ <field name="name" />
+ <field name="sh_resource_calendar_id"/>
+ </group>
+ <group>
+ <field name="team_head" />
+ </group>
+ </group>
+ <notebook>
+ <page name="members" string="Team Members">
+ <field name="team_members" widget="many2many">
+ <kanban quick_create="false" create="true" delete="true">
+ <field name="id" />
+ <field name="name" />
+ <templates>
+ <t t-name="kanban-box">
+ <div class="oe_kanban_global_click" style="max-width: 200px;">
+ <div class="o_kanban_record_top">
+ <img t-att-src="kanban_image('res.users', 'image_128', record.id.raw_value)" class="oe_avatar oe_kanban_avatar_smallbox o_image_40_cover mb0" alt="Avatar" />
+ <div class="o_kanban_record_headings ml8">
+ <strong class="o_kanban_record_title"><field name="name" /></strong>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </page>
+ </notebook>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="helpdesk_team_tree_view" model="ir.ui.view">
+ <field name="name">helpdesk.team.tree.view</field>
+ <field name="model">helpdesk.team</field>
+ <field name="arch" type="xml">
+ <tree string="Helpdesk Team">
+ <field name="name" />
+ <field name="team_head" />
+ </tree>
+ </field>
+ </record>
+ <record id="helpdesk_team_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Team</field>
+ <field name="res_model">helpdesk.team</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create a New Team</p>
+ </field>
+ </record>
+ <menuitem id="helpdesk_team_menu" name="Helpdesk Teams" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_team_action" sequence="1" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_ticket_multi_action_view.xml b/sh_helpdesk/views/helpdesk_ticket_multi_action_view.xml
new file mode 100644
index 0000000..0ace7e1
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_ticket_multi_action_view.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<odoo>
+ <record id="model_helpdesk_ticket_multi_action" model="ir.actions.server">
+ <field name="name">Mass Update Ticket</field>
+ <field name="model_id" ref="sh_helpdesk.model_helpdesk_ticket" />
+ <field name="binding_model_id" ref="sh_helpdesk.model_helpdesk_ticket" />
+ <field name="groups_id" eval="[(4, ref('sh_helpdesk.group_allow_multi_action'))]" />
+ <field name="state">code</field>
+ <field name="binding_view_types">list</field>
+ <field name="code"> action = model.action_mass_update_wizard()</field>
+ </record>
+</odoo> \ No newline at end of file
diff --git a/sh_helpdesk/views/helpdesk_ticket_portal_template.xml b/sh_helpdesk/views/helpdesk_ticket_portal_template.xml
new file mode 100644
index 0000000..e08ee6f
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_ticket_portal_template.xml
@@ -0,0 +1,663 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <template id="sh_portal_assets" inherit_id="portal.assets_frontend">
+ <xpath expr="." position="inside">
+ <script type="text/javascript" src="/sh_helpdesk/static/src/js/portal.js" />
+ <link rel="stylesheet" href="/sh_helpdesk/static/src/css/bootstrap-multiselect.min.css" type="text/css"/>
+ <script type="text/javascript" src="/sh_helpdesk/static/src/js/bootstrap-multiselect.min.js"></script>
+ </xpath>
+ </template>
+ <template id="portal_my_home_menu_ticket" name="Portal layout : ticket menu entries" inherit_id="portal.portal_breadcrumbs" priority="30">
+ <xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
+ <li t-if="page_name == 'ticket' or ticket" t-attf-class="breadcrumb-item #{'active ' if not ticket else ''}">
+ <a t-if="ticket" t-attf-href="/my/tickets?{{ keep_query() }}">Tickets</a>
+ <t t-else="">Tickets</t>
+ </li>
+ <li t-if="ticket" class="breadcrumb-item active">
+ <t t-esc="ticket.name" t-if="ticket.name" />
+ <t t-else=""><em>Ticket</em></t>
+ </li>
+ </xpath>
+ </template>
+
+ <template id="portal_my_home_ticket" name="Portal My Home : ticket entries" inherit_id="portal.portal_my_home" priority="30">
+ <xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
+ <t t-call="portal.portal_docs_entry">
+ <t t-set="title">Tickets</t>
+ <t t-set="url" t-value="'/my/tickets'" />
+ <t t-set="count" t-value="ticket_count" />
+ </t>
+ </xpath>
+ </template>
+
+ <template id="portal_my_tickets" name="My Tickets">
+ <t t-call="portal.portal_layout">
+ <t t-set="breadcrumbs_searchbar" t-value="True" />
+
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">Tickets</t>
+ <div class="form-inline ml-lg-4">
+ <a id="new_request" class="btn btn-success btn-sm" name="new_request" title="Create Support Request" aria-label="Create Support Request" role="button"><i class="fa fa-plus" /> Create New</a>
+ </div>
+ </t>
+ <div id="createticketModal" class="modal fade" role="dialog">
+ <div class="modal-dialog">
+ <!-- Modal content-->
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">Create Helpdesk Ticket</h4>
+ <button type="button" class="close" data-dismiss="modal">&amp;times;</button>
+ </div>
+ <div class="modal-body">
+ <form action="/portal-create-ticket" id="form_id" method="POST" class="form-horizontal mt32" enctype="multipart/form-data">
+ <t t-if="request.env.user.has_group('base.group_portal') and request.env.user.sh_portal_user_access or not request.env.user.has_group('base.group_portal')">
+ <div class="row">
+ <div class="col-6">
+ <label class="control-label" for="partner">Partner:</label>
+ <input class="form-control" list="partner_ids" name="partner" id="partner" />
+ <input type="hidden" name="partner_id" id="partner_id" />
+ <datalist id="partner_ids"> </datalist>
+ </div>
+ </div>
+ </t>
+ <div class="row">
+ <t t-if="request.env.user.has_group('base.group_portal') and not request.env.user.sh_portal_user_access">
+ <div class="col-6">
+ <div t-attf-class="form-group #{error and 'portal_contact_name' in error and 'has-error' or ''}">
+ <label class="control-label" for="portal_contact_name">Name</label>
+ <input type="text" class="form-control" id="portal_contact_name" name="portal_contact_name" t-att-value="request.env.user.partner_id.name" readonly="True" />
+ </div>
+ </div>
+ <div class="col-6">
+ <div name="portal_email_from_container" t-attf-class="form-group #{error and 'portal_email' in error and 'has-error' or ''}">
+ <label class="control-label" for="portal_email">Email</label>
+ <input type="email" class="form-control" id="portal_email" name="portal_email" t-att-value="request.env.user.partner_id.email" readonly="True" />
+ </div>
+ </div>
+ </t>
+ <t t-else="">
+ <div class="col-6">
+ <div t-attf-class="form-group #{error and 'portal_contact_name' in error and 'has-error' or ''}">
+ <label class="control-label" for="portal_contact_name">Name</label>
+ <input type="text" class="form-control" id="portal_contact_name" name="portal_contact_name" required="True" />
+ </div>
+ </div>
+ <div class="col-6">
+ <div name="portal_email_from_container" t-attf-class="form-group #{error and 'portal_email' in error and 'has-error' or ''}">
+ <label class="control-label" for="portal_email">Email</label>
+ <input type="email" class="form-control" id="portal_email" name="portal_email" required="True" />
+ </div>
+ </div>
+ </t>
+ </div>
+ <t t-if="request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access=='manager'">
+ <div class="row">
+ <t t-if="request.env.company.sh_display_multi_user">
+ <div class="col-4">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_team">Team</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_team" name="portal_team">
+ <option value="team">Select Team</option>
+ <t t-foreach="request.env['helpdesk.team'].sudo().search([])" t-as="team">
+ <option t-att-value="team.id"><t t-esc="team.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-4">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_assign_user">Assign To</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_assign_user" name="portal_assign_user">
+ <option value="user">Select Assign User</option>
+ <t t-foreach="request.env['res.users'].sudo().search(['|',('share','=',False),('sh_portal_user_access','!=',False)])" t-as="user">
+ <option t-att-value="user.id"><t t-esc="user.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-4">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_assign_multi_user">Assign Multi Users</label>
+ <select class="form-control form-field o_website_form_required_custom" multiple="multiple" id="portal_assign_multi_user" name="portal_assign_multi_user">
+ <option value="users">Select Multi Users</option>
+ <t t-foreach="request.env['res.users'].sudo().search(['|',('share','=',False),('sh_portal_user_access','!=',False)])" t-as="user">
+ <option t-att-value="user.id"><t t-esc="user.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ </t>
+ <t t-if="not request.env.company.sh_display_multi_user">
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_team">Team</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_team" name="portal_team">
+ <option value="team">Select Team</option>
+ <t t-foreach="request.env['helpdesk.team'].sudo().search([])" t-as="team">
+ <option t-att-value="team.id"><t t-esc="team.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_assign_user">Assign To</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_assign_user" name="portal_assign_user">
+ <option value="user">Select Assign User</option>
+ <t t-foreach="request.env['res.users'].sudo().search(['|',('share','=',False),('sh_portal_user_access','!=',False)])" t-as="user">
+ <option t-att-value="user.id"><t t-esc="user.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ </t>
+ </div>
+ </t>
+ <t t-if="request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access=='leader'">
+ <div class="row">
+ <t t-if="request.env.company.sh_display_multi_user">
+ <div class="col-4">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_team">Team</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_team" name="portal_team">
+ <option value="team">Select Team</option>
+ <t t-foreach="request.env['helpdesk.team'].sudo().search(['|',('team_head','=',request.env.user.id),('team_members','in',[request.env.user.id])])" t-as="team">
+ <option t-att-value="team.id"><t t-esc="team.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-4">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_assign_user">Assign To</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_assign_user" name="portal_assign_user">
+ <option value="user">Select Assign User</option>
+ <t t-foreach="request.env['res.users'].sudo().search(['|',('share','=',False),('sh_portal_user_access','!=',False)])" t-as="user">
+ <option t-att-value="user.id"><t t-esc="user.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-4">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_assign_multi_user">Assign Multi Users</label>
+ <select class="form-control form-field o_website_form_required_custom" multiple="multiple" id="portal_assign_multi_user" name="portal_assign_multi_user">
+ <option value="users">Select Assign User</option>
+ <t t-foreach="request.env['res.users'].sudo().search(['|',('share','=',False),('sh_portal_user_access','!=',False)])" t-as="user">
+ <option t-att-value="user.id"><t t-esc="user.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ </t>
+ <t t-if="not request.env.company.sh_display_multi_user">
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_team">Team</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_team" name="portal_team">
+ <option value="team">Select Team</option>
+ <t t-foreach="request.env['helpdesk.team'].sudo().search(['|',('team_head','=',request.env.user.id),('team_members','in',[request.env.user.id])])" t-as="team">
+ <option t-att-value="team.id"><t t-esc="team.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_assign_user">Assign To</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_assign_user" name="portal_assign_user">
+ <option value="user">Select Assign User</option>
+ <t t-foreach="request.env['res.users'].sudo().search(['|',('share','=',False),('sh_portal_user_access','!=',False)])" t-as="user">
+ <option t-att-value="user.id"><t t-esc="user.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ </t>
+ </div>
+ </t>
+ <div class="row">
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_category">Category</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_category" name="portal_category">
+ <option value="category">Select Category</option>
+ <t t-foreach="request.env['helpdesk.category'].sudo().search([])" t-as="category">
+ <option t-att-value="category.id"><t t-esc="category.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_subcategory">Sub Category</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_subcategory" name="portal_subcategory">
+ <option value="sub_category">Select Sub Category</option>
+ <t t-foreach="request.env['helpdesk.subcategory'].sudo().search([])" t-as="subcategory">
+ <option t-att-value="subcategory.id"><t t-esc="subcategory.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_subject">Subject</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_subject" name="portal_subject">
+ <option value="subject">Select Subject</option>
+ <t t-foreach="request.env['helpdesk.sub.type'].sudo().search([])" t-as="subject">
+ <option t-att-value="subject.id"><t t-esc="subject.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-6">
+ <div t-attf-class="form-group #{error and 'portal_description' in error and 'has-error' or ''}">
+ <label class="control-label" for="portal_description">Description</label>
+ <textarea id="description" name="portal_description" class="form-control form-field o_website_form_required_custom" placeholder="Description" />
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div t-attf-class="form-group">
+ <label class="control-label" for="portal_priority">Priority</label>
+ <select class="form-control form-field o_website_form_required_custom" id="portal_priority" name="portal_priority">
+ <option value="priority">Select Priority</option>
+ <t t-foreach="request.env['helpdesk.priority'].sudo().search([])" t-as="priority">
+ <option t-att-value="priority.id"><t t-esc="priority.name" /></option>
+ </t>
+ </select>
+ </div>
+ </div>
+ <div class="col-6">
+ <div name="portal_file_container" t-attf-class="form-group #{error and 'portal_file' in error and 'has-error' or ''}">
+ <label class="control-label" for="portal_file">Attachments</label>
+ <label class="custom-file">
+ <input name="portal_file" id="portal_file" type="file" multiple="multiple" />
+ <span class="custom-file-control" />
+ </label>
+ </div>
+ </div>
+ </div>
+ <div class="row" style="text-align: right;">
+ <div class="col-12">
+ <button type="submit" id="create_helpdesk_ticket" class="btn btn-primary">Create Ticket</button>
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+ <t t-if="not tickets">
+ <p>There are currently no tickets for your account.</p>
+ </t>
+ <t t-if="grouped_tickets" t-call="portal.portal_table">
+ <t t-foreach="grouped_tickets" t-as="ticket">
+ <thead>
+ <tr t-attf-class="{{'thead-light' if not groupby == 'none' else ''}}">
+ <th t-if="groupby == 'create_by'">
+ <em class="font-weight-normal text-muted">Created By:</em>
+ <span t-field="ticket[0].create_uid.name" />
+ </th>
+ <th t-if="groupby == 'ticket_type'">
+ <em class="font-weight-normal text-muted">Ticket Type:</em>
+ <span t-field="ticket[0].ticket_type.name" />
+ </th>
+ <th t-if="groupby == 'status'">
+ <em class="font-weight-normal text-muted">Status:</em>
+ <span t-esc="ticket[0].stage_id.name" />
+ </th>
+ <th t-if="groupby == 'customer'">
+ <em class="font-weight-normal text-muted">Customer:</em>
+ <span t-esc="ticket[0].partner_id.name" />
+ </th>
+ <th t-if="groupby == 'category'">
+ <em class="font-weight-normal text-muted">Category:</em>
+ <span t-esc="ticket[0].category_id.name" />
+ </th>
+ <th t-if="groupby == 'subcategory'">
+ <em class="font-weight-normal text-muted">Sub Category:</em>
+ <span t-esc="ticket[0].sub_category_id.name" />
+ </th>
+
+ <th t-if="groupby == 'subject'">
+ <em class="font-weight-normal text-muted">Subject:</em>
+ <span t-esc="ticket[0].subject_id.name" />
+ </th>
+ <th t-if="groupby == 'priority'">
+ <em class="font-weight-normal text-muted">Priority:</em>
+ <span t-esc="ticket[0].priority.name" />
+ </th>
+ <th t-if="groupby == 'state'">
+ <em class="font-weight-normal text-muted">Reply Status:</em>
+ <span t-esc="ticket[0].state" />
+ </th>
+ <th>Create Date</th>
+ <th>Last Update Date</th>
+ <th>Ticket Type</th>
+ <th>Status</th>
+ </tr>
+ </thead>
+ <tbody>
+ <t t-foreach="ticket" t-as="t">
+ <tr>
+ <td>
+ <a t-att-href="t.get_portal_url()" t-att-title="t.name">
+ <t t-esc="t.name" t-if="t.name" />
+ <em t-else="">Ticket</em>
+ </a>
+ </td>
+ <td><span t-field="t.create_date" t-options='{"widget": "date"}' /></td>
+ <td><span t-field="t.write_date" t-options='{"widget": "date"}' /></td>
+ <td><span t-field="t.ticket_type" /></td>
+ <td><span t-field="t.stage_id" /></td>
+ </tr>
+ </t>
+ </tbody>
+ </t>
+ </t>
+ </t>
+ </template>
+
+ <template id="portal_ticket_page" name="Ticket Portal Template" inherit_id="portal.portal_sidebar" primary="True">
+ <xpath expr="//div[hasclass('o_portal_sidebar')]" position="inside">
+ <div class="row mt16 o_portal_ticket_sidebar">
+ <!-- Sidebar -->
+ <t t-call="portal.portal_record_sidebar">
+ <t t-set="classes" t-value="'col-12 col-lg flex-lg-grow-0 d-print-none'" />
+ <t t-set="title">
+ <h2 class="mb-0">
+ <b t-if="ticket" t-field="ticket.name" />
+ <b t-else="Ticket" t-field="ticket.name" />
+ </h2>
+ </t>
+
+ <t t-set="entries">
+ <ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column">
+ <li class="list-group-item flex-grow-1">
+ <div class="o_download_pdf btn-toolbar flex-sm-nowrap">
+ <div class="btn-group flex-grow-1 mr-1 mb-1">
+ <a class="btn btn-secondary btn-block o_download_btn" t-att-href="ticket.get_portal_url(report_type='pdf', download=True)" title="Download"><i class="fa fa-download" /> Download</a>
+ </div>
+ </div>
+ </li>
+ <li t-if="ticket.user_id" class="list-group-item flex-grow-1">
+ <div class="small mb-1"><strong class="text-muted">Your Contact</strong></div>
+ <div class="row">
+ <div class="col flex-grow-0 pr-2">
+ <img t-if="ticket.user_id.image_128" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(ticket.user_id.image_128)" alt="Contact" />
+ <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact" />
+ </div>
+ <div class="col pl-0" style="min-width: 150px;">
+ <span t-field="ticket.user_id" t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}' />
+ <a href="#discussion" class="small"><i class="fa fa-comment"></i> Send message</a>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </t>
+ </t>
+
+ <!-- Page Content -->
+ <div id="ticket_content" class="col-12 col-lg justify-content-end">
+ <div t-attf-class="card #{'pb-5' if report_type == 'html' else ''}">
+ <div t-call="sh_helpdesk.helpdesk_ticket_portal_content" />
+ </div>
+
+ <!-- chatter -->
+ <div id="ticket_communication" class="mt-4">
+ <h2>History</h2>
+ <t t-call="portal.message_thread">
+ <t t-set="object" t-value="ticket" />
+ </t>
+ </div>
+ </div>
+ </div>
+ </xpath>
+ </template>
+ <template id="helpdesk_ticket_portal_content" name="Helpdesk Ticket Portal Content">
+ <!-- Intro -->
+
+ <div id="introduction" t-attf-class="pb-2 pt-3 #{'card-header bg-white' if report_type == 'html' else ''}">
+ <h2 class="my-0">
+ <strong><em t-esc="ticket.name" /></strong>
+ </h2>
+ </div>
+ <div t-attf-class="#{'card-body' if report_type == 'html' else ''}">
+ <div id="informations">
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Ticket Type</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.ticket_type" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Create Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.create_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Last Update Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.write_date" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Person Name</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.person_name" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Ticket Subject Type</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.subject_id" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Email</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.email" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Category</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.category_id" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Replied Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.replied_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Sub Category</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.sub_category_id" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Closed Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.close_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Priority</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.priority" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Closed By</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.close_by" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Cancelled Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.cancel_date" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Cancelled By</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.cancel_by" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Status</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.stage_id" />
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Cancelled Reason</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.cancel_reason" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <t t-if="ticket.comment">
+ <div class="row">
+ <div class="mb-3 col-12">
+ <strong>Customer Comment</strong>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-12">
+ <span t-field="ticket.comment" />
+ </div>
+ </div>
+ </t>
+ <t t-if="ticket.description">
+ <div class="row">
+ <div class="mb-3 col-12">
+ <strong>Description</strong>
+ </div>
+ </div>
+ <div class="row">
+ <div class="mb-3 col-12">
+ <span t-field="ticket.description" />
+ </div>
+ </div>
+ </t>
+ <t t-if="ticket.priority_new and ticket.customer_comment">
+ <div class="row">
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer Rating</strong>
+ </div>
+ <div class="col-6">
+ <span class="float-right" title="Rating" role="img" t-attf-aria-label="Rating: #{ticket.priority_new} on 3">
+ <t t-foreach="range(2, 7)" t-as="i">
+ <span t-attf-class="fa fa-lg fa-star#{'' if i &lt;= int(ticket.priority_new) else '-o'}" />
+ </t>
+ </span>
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer Comment</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="ticket.customer_comment" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+ </div>
+ </div>
+ </template>
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_ticket_type_view.xml b/sh_helpdesk/views/helpdesk_ticket_type_view.xml
new file mode 100644
index 0000000..ce622df
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_ticket_type_view.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="helpdesk_ticket_type_form_view" model="ir.ui.view">
+ <field name="name">helpdesk.ticket.type.form.view</field>
+ <field name="model">helpdesk.ticket.type</field>
+ <field name="arch" type="xml">
+ <form string="Ticket Type">
+ <sheet>
+ <div class="oe_button_box" name="button_box" groups="sh_helpdesk.group_helpdesk_sla_policy">
+ <button name="action_view_sla" type="object" class="oe_stat_button" icon="fa-ticket" attrs="{'invisible':[('sla_count','=',0)]}" groups="sh_helpdesk.group_helpdesk_sla_policy">
+ <div class="o_stat_info">
+ <field name="sla_count" class="o_stat_value" />
+ <span class="o_stat_text">Helpdesk SLA</span>
+ </div>
+ </button>
+ </div>
+ <group>
+ <group>
+ <field name="name" />
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="helpdesk_ticket_type_tree_view" model="ir.ui.view">
+ <field name="name">helpdesk.ticket.type.tree.view</field>
+ <field name="model">helpdesk.ticket.type</field>
+ <field name="arch" type="xml">
+ <tree string="Ticket Type">
+ <field name="name" />
+ </tree>
+ </field>
+ </record>
+ <record id="helpdesk_ticket_type_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Ticket Type</field>
+ <field name="res_model">helpdesk.ticket.type</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create a New Ticket Type</p>
+ </field>
+ </record>
+ <menuitem id="helpdesk_ticket_type_menu" name="Helpdesk Ticket Types" parent="sh_helpdesk.helpdesk_config_menu" action="helpdesk_ticket_type_action" sequence="2" />
+</odoo>
diff --git a/sh_helpdesk/views/helpdesk_ticket_update_wizard_view.xml b/sh_helpdesk/views/helpdesk_ticket_update_wizard_view.xml
new file mode 100644
index 0000000..02320eb
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_ticket_update_wizard_view.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+
+<odoo>
+ <record id="sh_helpdesk_ticket_mass_update_wizard_form_view" model="ir.ui.view">
+ <field name="name">sh.helpdesk.ticket.mass.update.wizard.form.view</field>
+ <field name="model">sh.helpdesk.ticket.mass.update.wizard</field>
+ <field name="arch" type="xml">
+ <form string="Ticket Mass Update">
+ <group>
+ <field name="check_sh_display_multi_user" invisible="1" />
+ <group string="Update Assign To">
+ <field name="helpdesks_ticket_ids" invisible="1" widget="many2many_tags" />
+ <field name="check_assign_to" />
+ <field name="assign_to" attrs="{'invisible': [('check_assign_to', '=', False)],'required':[('check_assign_to','=',True)]}" />
+ </group>
+ <group string="Update Assign To Multiuser" attrs="{'invisible': [('check_sh_display_multi_user', '=', False)]}">
+ <field name="check_assign_to_multiuser" />
+ <field name="ticket_update_type" attrs="{'invisible': [('check_assign_to_multiuser', '=', False)]}" widget="radio" />
+ <field name="assign_to_multiuser" attrs="{'invisible': [('check_assign_to_multiuser', '=', False)],'required':[('check_assign_to_multiuser','=',True)]}" widget="many2many_tags" />
+ </group>
+ <group string="Update Stage">
+ <field name="check_helpdesks_state" />
+ <field name="helpdesk_stages" attrs="{'invisible': [('check_helpdesks_state', '=', False)],'required':[('check_helpdesks_state','=',True)]}" />
+ </group>
+ <!-- ADD/REMOVE FOLLOWER -->
+ <group string="Add/Remove Follower">
+ <field name="check_add_remove" />
+ <field name="helpdesks_ticket_ids" invisible="1" widget="many2many_tags" />
+ <field name="followers" widget="many2many_tags" attrs="{'invisible': [('check_add_remove', '=', False)],'required':[('check_add_remove','=',True)]}" />
+ <field name="ticket_follower_update_type" widget="radio" attrs="{'invisible': [('check_add_remove', '=', False)]}" />
+ </group>
+ </group>
+ <footer>
+ <button name="update_record" class="btn btn-primary" type="object" string="Done" />
+ <button string="Cancel" special="cancel" />
+ </footer>
+ </form>
+ </field>
+ </record>
+ <record id="sh_helpdesk_ticket_mass_update_wizard_action_view" model="ir.actions.act_window">
+ <field name="name">Ticket Mass Update</field>
+ <field name="res_model">sh.helpdesk.ticket.mass.update.wizard</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="view_mode">form</field>
+ <field name="target">new</field>
+ </record>
+</odoo> \ No newline at end of file
diff --git a/sh_helpdesk/views/helpdesk_ticket_view.xml b/sh_helpdesk/views/helpdesk_ticket_view.xml
new file mode 100644
index 0000000..adc630c
--- /dev/null
+++ b/sh_helpdesk/views/helpdesk_ticket_view.xml
@@ -0,0 +1,320 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="helpdesk_ticket_form_view" model="ir.ui.view">
+ <field name="name">helpdesk.ticket.form.view</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <form string="Ticket">
+ <header>
+ <button name="action_approve" type="object" string="Approve" class="oe_highlight" attrs="{'invisible':['|','|',('cancel_stage_boolean','=',True),('done_stage_boolean','=',True),('closed_stage_boolean','=',True)]}" />
+ <button name="action_reply" type="object" string="Reply" class="oe_highlight" />
+ <button name="action_send_whatsapp" type="object" string="Send By Whatsapp" class="oe_highlight" groups="sh_helpdesk.helpdesk_group_whatsapp" />
+ <button name="action_done" type="object" string="Resolved Ticket" class="oe_highlight" attrs="{'invisible':[('done_button_boolean','=',False)]}" />
+ <button name="action_closed" type="object" string="Close Ticket" class="oe_highlight" attrs="{'invisible':[('done_stage_boolean','=',False)]}" />
+ <button name="action_cancel" type="object" string="Cancel Ticket" class="oe_highlight" attrs="{'invisible':[('cancel_button_boolean','=',False)]}" />
+ <button name="action_open" type="object" string="Re-Open Ticket" class="oe_highlight" attrs="{'invisible':[('open_boolean','=',False)]}" />
+ <button name="preview_ticket" type="object" string="Preview" />
+ <field name="stage_id" widget="statusbar" />
+ </header>
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}" />
+ </div>
+ <div class="oe_title">
+ <h1>
+ <field name="name" readonly="1" />
+ <field name="active" invisible="1" />
+ <field name="category_bool" invisible="1" />
+ <field name="sub_category_bool" invisible="1" />
+ <field name="rating_bool" invisible="1" />
+ <field name="sh_status_boolean" invisible="1"/>
+ <field name="done_stage_boolean" invisible="1" />
+ <field name="cancel_stage_boolean" invisible="1" />
+ <field name="closed_stage_boolean" invisible="1" />
+ <field name="ticket_from_website" invisible="1" />
+ <field name="ticket_from_portal" invisible="1" />
+ <field name="reopen_stage_boolean" invisible="1" />
+ <field name="cancel_button_boolean" invisible="1" />
+ <field name="done_button_boolean" invisible="1" />
+ <field name="open_boolean" invisible="1" />
+ <field name="sh_days_to_reach" invisible="1"/>
+ <field name="sh_days_to_late" invisible="1"/>
+ <field name="sh_ticket_report_url" invisible="1"/>
+ <field name="portal_ticket_url_wp" invisible="1"/>
+ </h1>
+ <h1>
+ <field name="email_subject" placeholder="Email Subject ...."/>
+ </h1>
+ <field name="sh_sla_status_ids" widget="many2many_tags" options="{'color_field': 'color'}" readonly="1" force_save="1" groups="sh_helpdesk.group_helpdesk_sla_policy"/>
+ </div>
+ <group>
+ <group>
+ <field name="sh_display_multi_user" invisible="1" />
+ <field name="sh_display_product" invisible="1" />
+ <field name="company_id" groups="base.group_multi_company" readonly="1" />
+ <field name="state" />
+ <field name="ticket_type" />
+ <field name="ticket_allocated" invisible="1" />
+ <field name="team_id" groups="sh_helpdesk.helpdesk_group_team_leader,sh_helpdesk.helpdesk_group_manager" />
+ <field name="team_head" readonly="1" force_save="1" groups="sh_helpdesk.helpdesk_group_team_leader,sh_helpdesk.helpdesk_group_manager" />
+ <field name="user_id" groups="sh_helpdesk.helpdesk_group_team_leader,sh_helpdesk.helpdesk_group_manager" />
+ <field name="sh_user_ids" widget="many2many_tags" attrs="{'invisible':[('sh_display_multi_user','=',False)]}" groups="sh_helpdesk.helpdesk_group_team_leader,sh_helpdesk.helpdesk_group_manager" />
+ <field name="subject_id" />
+ <field name="category_id" attrs="{'invisible':[('category_bool','=',False)]}" />
+ <field name="sub_category_id" attrs="{'invisible':[('sub_category_bool','=',False)]}" />
+ <field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}" />
+ <field name="priority" />
+ </group>
+ <group>
+ <field name="create_date" string="Create Date" />
+ <field name="write_date" string="Last Update Date" />
+ <field name="sh_due_date"/>
+ <field name="partner_id" />
+ <field name="person_name" />
+ <field name="email" />
+ <field name="mobile_no"/>
+ <field name="replied_date" />
+ <field name="product_ids" widget="many2many_tags" attrs="{'invisible':[('sh_display_product','=',False)]}" />
+ <field name="sh_status" invisible="1"/>
+ <field name="sh_sla_deadline" attrs="{'invisible':[('sh_sla_deadline','=',False)]}" groups="sh_helpdesk.group_helpdesk_sla_policy"/>
+ <field name="sh_sla_policy_ids" widget="many2many_tags" force_save="1" invisible="1"/>
+ <field name="sh_ticket_alarm_ids" widget="many2many_tags" groups="sh_helpdesk.group_helpdesk_alarm"/>
+ </group>
+ </group>
+ <notebook>
+ <page string="Description">
+ <group>
+ <field name="description" />
+ </group>
+ </page>
+ <page string="Attachments">
+ <group>
+ <field name="attachment_ids" nolabel="1"></field>
+ </group>
+ </page>
+ <page string="Customer Rating" attrs="{'invisible':[('rating_bool','=',False)]}">
+ <group>
+ <field name="priority_new" widget="priority" />
+ <field name="customer_comment" />
+ </group>
+ </page>
+ <page string="Other Information">
+ <group>
+ <group string="Ticket Closed Information">
+ <field name="close_date" />
+ <field name="close_by" />
+ <field name="comment" string="Closed Comment" />
+ </group>
+ <group string="Ticket Cancelled Information">
+ <field name="cancel_date" />
+ <field name="cancel_by" />
+ <field name="cancel_reason" />
+ <field name="form_url" invisible="1" />
+ </group>
+ </group>
+ </page>
+ </notebook>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_follower_ids" widget="mail_followers" />
+ <field name="message_ids" widget="mail_thread" />
+ </div>
+ </form>
+ </field>
+ </record>
+ <record id="helpdesk_ticket_tree_view" model="ir.ui.view">
+ <field name="name">helpdesk.ticket.tree.view</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <tree string="Ticket" multi_edit="1">
+ <field name="name" />
+ <field name="partner_id" />
+ <field name="create_date" string="Create Date" />
+ <field name="write_date" string="Last Update Date" />
+ <field name="ticket_type" />
+ <field name="team_id" />
+ <field name="team_head" />
+ <field name="user_id" />
+ <field name="subject_id" />
+ <field name="category_id" />
+ <field name="sub_category_id" />
+ <field name="stage_id" />
+ </tree>
+ </field>
+ </record>
+ <record id="helpdesk_ticket_search_view" model="ir.ui.view">
+ <field name="name">helpdesk.ticket.search.view</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <search string="Helpdesk Ticket Search">
+ <field name="name" string="Ticket" filter_domain="['|', '|', '|','|', '|', '|', ('name', 'ilike', self), ('sh_user_ids.name', 'ilike', self),('user_id.name', 'ilike', self),('email','ilike',self),('mobile_no','ilike',self),('partner_id.name','ilike',self),('email_subject','ilike',self)]"/>
+ <field name="create_date" />
+ <field name="write_date" />
+ <field name="partner_id" />
+ <field name="ticket_type" />
+ <field name="team_id" />
+ <field name="team_head" />
+ <field name="user_id" />
+ <field name="subject_id" />
+ <field name="category_id" />
+ <field name="sub_category_id" />
+ <field name="stage_id" />
+ <separator />
+ <filter string="My Ticket" name="assigned_to_me" domain="[('create_uid', '=', uid)]" />
+ <separator />
+ <filter string="Completed Tickets" name="complete_ticket" domain="[('done_stage_boolean', '=', True)]" />
+ <filter string="Cancelled Tickets" name="cancel_ticket" domain="[('cancel_stage_boolean', '=', True)]" />
+ <filter string="Archived" name="archived" domain="[('active', '=', False)]" />
+ <separator />
+ <filter string="Upcoming SLA Failed" name="upcoming" domain="[('sh_sla_deadline','!=',False),('sh_sla_deadline', '&lt;=', (datetime.date.today() + relativedelta(days=1)).strftime('%Y-%m-%d'))]" groups="sh_helpdesk.group_helpdesk_sla_policy" />
+ <filter string="SLA Failed" name="sla_failed" domain="[('sh_status','=','sla_failed')]" groups="sh_helpdesk.group_helpdesk_sla_policy" />
+ <filter string="SLA Passed" name="sla_passed" domain="[('sh_status','=','sla_passed')]" groups="sh_helpdesk.group_helpdesk_sla_policy" />
+ <filter string="SLA Partially Passed" name="sh_partially_passed" domain="[('sh_status','=','sh_partially_passed')]" groups="sh_helpdesk.group_helpdesk_sla_policy" />
+ <group expand="0" string="Group By">
+ <filter string="Created By" name="user" context="{'group_by':'create_uid'}" />
+ <filter string="Ticket Type" name="ticket_type" context="{'group_by':'ticket_type'}" />
+ <filter name="stage" string="Stage" context="{'group_by':'stage_id'}" />
+ <filter name="customer" string="Customer" context="{'group_by':'partner_id'}" />
+ <filter name="category" string="Category" context="{'group_by':'category_id'}" />
+ <filter name="subcategory" string="Sub Category" context="{'group_by':'sub_category_id'}" />
+ <filter name="team" string="Team" context="{'group_by':'team_id'}" />
+ <filter name="team_head" string="Team Head" context="{'group_by':'team_head'}" />
+ <filter name="user_id" string="Assigned User" context="{'group_by':'user_id'}" />
+ <filter name="subject" string="Subject" context="{'group_by':'subject_id'}" />
+ <filter name="priority" string="Priority" context="{'group_by':'priority'}" />
+ <filter name="state" string="Reply Status" context="{'group_by':'state'}" />
+ </group>
+ <searchpanel>
+ <field name="company_id" icon="fa-building" />
+ <field name="state" icon="fa-folder" />
+ <field name="stage_id" icon="fa-folder" />
+ <field name="ticket_type" icon="fa-folder" />
+ <field name="team_id" icon="fa-user-plus" />
+ <field name="user_id" icon="fa-users" />
+ <field name="partner_id" icon="fa-users" />
+ <field name="subject_id" icon="fa-book" />
+ <field name="category_id" icon="fa-list" />
+ <field name="sub_category_id" icon="fa-list-alt" />
+ <field name="priority" icon="fa-level-up" />
+ </searchpanel>
+ </search>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="helpdesk_ticket_kanban">
+ <field name="name">helpdesk.ticket.kanban</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <kanban default_group_by="stage_id" class="o_kanban_small_column o_opportunity_kanban" archivable="false" examples="sh_helpdesk" sample="1">
+ <field name="name" />
+ <field name="color" />
+ <field name="priority" />
+ <field name="stage_id" />
+ <field name="user_id" />
+ <field name="tag_ids" />
+ <field name="email_subject"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click">
+ <div class="oe_kanban_content">
+ <div>
+ <strong>
+ <field name="name" /><t t-if="record.priority.value">:<field name="priority" /></t>
+ </strong>
+ </div>
+ <div>
+ <t t-if="record.email_subject.value">
+ <span t-att-title="record.email_subject.value" style="overflow: hidden;text-overflow: ellipsis;display:block;-webkit-line-clamp: 1;-webkit-box-orient: vertical;"><field name="email_subject"/></span>
+ </t>
+ </div>
+ <div>
+ <strong>
+ <field name="partner_id" />
+ </strong>
+ </div>
+ <div>
+ <field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}" />
+ </div>
+ <div>
+ <strong>
+ <field name="stage_id" />
+ </strong>
+ </div>
+ <div>
+ <field name="create_date" />
+ </div>
+ <div class="o_kanban_record_bottom">
+ <div class="oe_kanban_bottom_right">
+ <img t-att-src="kanban_image('res.users', 'image_1920', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar" />
+ </div>
+ </div>
+ </div>
+ <div class="oe_clear" />
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+ <record id="helpdesk_ticket_calendar" model="ir.ui.view">
+ <field name="name">helpdesk.ticket.calendar</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <calendar string="Tickets" date_start="create_date" color="user_id">
+ <field name="name" />
+ <field name="partner_id" />
+ <field name="stage_id" />
+ </calendar>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="helpdesk_ticket_pivot">
+ <field name="name">helpdesk.ticket.pivot</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <pivot string="Tickets" disable_linking="True">
+ <field name="create_date" interval="month" type="row" />
+ <field name="stage_id" type="col" />
+ <field name="partner_id" type="row" />
+ </pivot>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="helpdesk_ticket_graph">
+ <field name="name">helpdesk.ticket.graph</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <graph string="Tickets">
+ <field name="stage_id" type="col" />
+ <field name="user_id" type="row" />
+ </graph>
+ </field>
+ </record>
+ <record id="helpdesk_ticket_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk Tickets</field>
+ <field name="res_model">helpdesk.ticket</field>
+ <field name="view_mode">kanban,tree,form,pivot,graph,calendar,activity</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">Create a New Ticket</p>
+ </field>
+ </record>
+ <menuitem id="helpdesk_tickets_menu" name="Tickets" parent="sh_helpdesk.helpdesk_main_menu" sequence="2" action="helpdesk_ticket_action" />
+ <record model="ir.ui.view" id="helpdesk_ticket_sla_pivot">
+ <field name="name">helpdesk.ticket</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="arch" type="xml">
+ <pivot string="Helpdesk SLA Analysis" disable_linking="True" sample="1">
+ <field name="team_id" type="row"/>
+ <field name="stage_id" type="row"/>
+ <field name="create_date" interval="month" type="col"/>
+ <field name="sh_status" type="col"/>
+ <field name="sh_days_to_reach" type="measure"/>
+ <field name="sh_days_to_late" type="measure"/>
+ </pivot>
+ </field>
+ </record>
+ <record id="helpdesk_ticket_sla_action" model="ir.actions.act_window">
+ <field name="name">Helpdesk SLA Analysis</field>
+ <field name="res_model">helpdesk.ticket</field>
+ <field name="view_mode">pivot</field>
+ </record>
+ <menuitem id="menu_helpdesk_sla_analysis" name="Helpdesk SLA Analysis" parent="sh_helpdesk.helpdesk_reporting_menu" action="helpdesk_ticket_sla_action" groups="sh_helpdesk.group_helpdesk_sla_policy" />
+</odoo>
diff --git a/sh_helpdesk/views/report_views.xml b/sh_helpdesk/views/report_views.xml
new file mode 100644
index 0000000..ec488dc
--- /dev/null
+++ b/sh_helpdesk/views/report_views.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="action_report_helpdesk_ticket" model="ir.actions.report">
+ <field name="name">Helpdesk Ticket</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="report_type">qweb-pdf</field>
+ <field name="report_name">sh_helpdesk.report_helpdeskticket</field>
+ <field name="report_file">sh_helpdesk.report_helpdeskticket</field>
+ <field name="binding_model_id" ref="model_helpdesk_ticket" />
+ <field name="binding_type">report</field>
+ </record>
+ <record id="action_portal_report_helpdesk_ticket" model="ir.actions.report">
+ <field name="name">Helpdesk Ticket</field>
+ <field name="model">helpdesk.ticket</field>
+ <field name="report_type">qweb-pdf</field>
+ <field name="report_name">sh_helpdesk.report_portal_helpdeskticket</field>
+ <field name="report_file">sh_helpdesk.report_portal_helpdeskticket</field>
+ <field name="binding_model_id" ref="model_helpdesk_ticket" />
+ <field name="groups_id" eval="[(4, ref('base.group_portal'))]"/>
+ <field name="binding_type">report</field>
+ </record>
+</odoo>
diff --git a/sh_helpdesk/views/res_users.xml b/sh_helpdesk/views/res_users.xml
new file mode 100644
index 0000000..9cce7f6
--- /dev/null
+++ b/sh_helpdesk/views/res_users.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="sh_res_users_form_view" model="ir.ui.view">
+ <field name="name">res.users</field>
+ <field name="model">res.users</field>
+ <field name="inherit_id" ref="base.view_users_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//div[hasclass('oe_title')]//field[@name='partner_id']" position="after">
+ <field name="sh_portal_user" invisible="1"/>
+ <field name="sh_portal_user_access" attrs="{'invisible':[('sh_portal_user','=',False)]}" />
+ </xpath>
+ </field>
+ </record>
+ <record id="sh_users_form_simple_inherit_modif" model="ir.ui.view">
+ <field name="name">res.users</field>
+ <field name="model">res.users</field>
+ <field name="inherit_id" ref="base.view_users_form_simple_modif" />
+ <field name="arch" type="xml">
+ <xpath expr="//footer" position="before">
+ <group name="Signature">
+ <field name="sign" />
+ </group>
+ </xpath>
+ </field>
+ </record>
+</odoo> \ No newline at end of file
diff --git a/sh_helpdesk/views/send_mail_quick_reply.xml b/sh_helpdesk/views/send_mail_quick_reply.xml
new file mode 100644
index 0000000..fdc51ba
--- /dev/null
+++ b/sh_helpdesk/views/send_mail_quick_reply.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="sh_helpdesk_form_view" model="ir.ui.view">
+ <field name="name">sh.quick.reply</field>
+ <field name="model">sh.quick.reply</field>
+ <field name="arch" type="xml">
+ <form string="Send Quick Reply Mail Template">
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}" />
+ </div>
+ <group>
+ <group>
+ <field name="name" />
+ <field name="sh_user_id" />
+ <field name="commom_for_all" />
+ </group>
+ <group>
+ <field name="active" invisible="1" />
+ </group>
+ </group>
+ <group>
+ <field name="sh_description" />
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="sh_helpdesk_tree_view" model="ir.ui.view">
+ <field name="name">sh.quick.reply</field>
+ <field name="model">sh.quick.reply</field>
+ <field name="arch" type="xml">
+ <tree string="Send Quick Reply Mail Template">
+ <field name="name" />
+ <field name="sh_user_id" />
+ </tree>
+ </field>
+ </record>
+ <record id="sh_helpdesk_action" model="ir.actions.act_window">
+ <field name="name">Send Quick Reply Mail Template</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">sh.quick.reply</field>
+ <field name="view_mode">tree,form</field>
+ </record>
+ <menuitem id="sh_send_quick_reply_menu" name="Send Quick Reply" parent="sh_helpdesk.helpdesk_main_menu" groups="sh_helpdesk.group_send_quick_reply" action="sh_helpdesk_action" sequence="4" />
+</odoo> \ No newline at end of file
diff --git a/sh_helpdesk/views/sh_helpdeks_report_portal.xml b/sh_helpdesk/views/sh_helpdeks_report_portal.xml
new file mode 100644
index 0000000..0c6e6fb
--- /dev/null
+++ b/sh_helpdesk/views/sh_helpdeks_report_portal.xml
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="helpdesk_portal_ticket_template">
+ <t t-call="web.external_layout">
+ <div class="page">
+ <div class="container">
+ <br />
+ <br />
+ <br />
+ <div class="row">
+ <div class="col-6">
+ <h2><span t-field="o.name" /></h2>
+ </div>
+ </div>
+ <br />
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Ticket Type</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.ticket_type" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Create Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.create_date" t-options='{"widget": "date"}' />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Reply Status</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.state" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Last Update Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.write_date" t-options='{"widget": "date"}' />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Ticket Status</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.stage_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.partner_id" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Person Name</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.person_name" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Ticket Subject Type</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.subject_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Email</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.email" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Category</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.category_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Replied Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.replied_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Sub Category</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.sub_category_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Closed Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.close_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Priority</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.priority" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Closed By</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.close_by" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Cancelled Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.cancel_date" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6"></div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Cancelled Reason</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.cancel_reason" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6"></div>
+ </div>
+ <div class="row">
+ <div class="col-12">
+ <h2>Description</h2>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-12">
+ <span t-field="o.description" />
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer Rating</strong>
+ </div>
+ <div class="col-6">
+ <span title="Rating" role="img" t-attf-aria-label="Rating: #{o.priority_new} on 3">
+ <t t-foreach="range(2, 7)" t-as="i">
+ <span t-attf-class="fa fa-lg fa-star#{'' if i &lt;= int(o.priority_new) else '-o'}" />
+ </t>
+ </span>
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer Comment</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.customer_comment" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+ </template>
+ <template id="report_portal_helpdeskticket">
+ <t t-call="web.html_container">
+ <t t-foreach="docs" t-as="o">
+ <t t-call="sh_helpdesk.helpdesk_portal_ticket_template" t-lang="o.partner_id.lang" />
+ </t>
+ </t>
+ </template>
+</odoo>
diff --git a/sh_helpdesk/views/sh_report_helpdesk_ticket_template.xml b/sh_helpdesk/views/sh_report_helpdesk_ticket_template.xml
new file mode 100644
index 0000000..edf35c9
--- /dev/null
+++ b/sh_helpdesk/views/sh_report_helpdesk_ticket_template.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="helpdesk_ticket_template">
+ <t t-call="web.external_layout">
+ <div class="page">
+ <div class="container">
+ <br />
+ <br />
+ <br />
+ <div class="row">
+ <div class="col-12">
+ <h2>
+ <span t-field="o.name" />
+ </h2>
+ </div>
+ </div>
+ <br />
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Ticket Type</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.ticket_type" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Create Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.create_date" t-options='{"widget": "date"}' />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Team</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.team_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Last Update Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.write_date" t-options='{"widget": "date"}' />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Team Head</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.team_head" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.partner_id" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Assigned User</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.user_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Person Name</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.person_name" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Ticket Subject Type</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.subject_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Email</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.email" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Category</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.category_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Replied Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.replied_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Sub Category</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.sub_category_id" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Closed Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.close_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Priority</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.priority" />
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Closed By</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.close_by" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6"></div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Cancelled Date</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.cancel_date" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6"></div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Cancelled Reason</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.cancel_reason" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-3">
+ <strong>Products</strong>
+ </div>
+ <div class="col-9">
+ <span t-if='o.sh_display_product'>
+ <span t-field="o.product_ids" />
+ </span>
+ </div>
+ </div>
+ <div class="row mt-2">
+ <div class="col-12">
+ <h2>Description</h2>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-12">
+ <span t-field="o.description" />
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer Rating</strong>
+ </div>
+ <div class="col-6">
+ <span title="Rating" role="img" t-attf-aria-label="Rating: #{o.priority_new} on 3">
+ <t t-foreach="range(2, 7)" t-as="i">
+ <span t-attf-class="fa fa-lg fa-star#{'' if i &lt;= int(o.priority_new) else '-o'}" />
+ </t>
+ </span>
+ </div>
+ </div>
+ </div>
+ <div class="col-6">
+ <div class="row">
+ <div class="col-6">
+ <strong>Customer Comment</strong>
+ </div>
+ <div class="col-6">
+ <span t-field="o.customer_comment" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+ </template>
+ <template id="report_helpdeskticket">
+ <t t-call="web.html_container">
+ <t t-foreach="docs" t-as="o">
+ <t t-call="sh_helpdesk.helpdesk_ticket_template" t-lang="o.partner_id.lang" />
+ </t>
+ </t>
+ </template>
+</odoo>
diff --git a/sh_helpdesk/views/sh_ticket_feedback_template.xml b/sh_helpdesk/views/sh_ticket_feedback_template.xml
new file mode 100644
index 0000000..7463d70
--- /dev/null
+++ b/sh_helpdesk/views/sh_ticket_feedback_template.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <template id="assets_frontend_ticket" name="crm assets" inherit_id="web.assets_frontend">
+ <xpath expr="." position="inside">
+ <link type="text/scss" rel="stylesheet" href="/sh_helpdesk/static/src/css/feedback.scss" />
+ </xpath>
+ </template>
+ <template id="helpdesk_ticket_feedback_page" name="Helpdesk Ticket Feedback Page">
+ <t t-call="web.frontend_layout">
+ <div class="container">
+ <div class="mt16 mb16">
+ <h1 class="text-center">Your Feedback</h1>
+ </div>
+ <form method="POST" t-attf-action="/helpdesk/ticket/feedback/#{ticket}" id="smileys">
+ <input type="radio" name="smiley" value="6" class="very-happy" checked="checked" />
+ <input type="radio" name="smiley" value="5" class="happy" />
+ <input type="radio" name="smiley" value="4" class="neutral" />
+ <input type="radio" name="smiley" value="3" class="sad" />
+ <input type="radio" name="smiley" value="2" class="very-sad" />
+ <div class="form-group">
+ <input type="hidden" name="ticket_id" id="ticket_id" t-att-value="ticket" style="display: none;" />
+ <label for="comment">Comment</label>
+ <textarea class="form-control" rows="5" name="comment"></textarea>
+ </div>
+
+ <div class="form-group">
+ <button id="feedback_btn" class="btn btn-primary btn-lg">Submit Feedback</button>
+ </div>
+ <div>It looks like you're feeling <span id="result" onclick="updateValue(this)">happy</span> today..</div>
+ </form>
+ </div>
+ </t>
+ </template>
+ <template id="ticket_feedback_thank_you" name="Helpdesk Ticket Thank You">
+ <t t-call="web.login_layout">
+ <div class="container">
+ <h1>Thanks!</h1>
+ <div class="row">
+ <div class="col-md-12">
+ <div class="alert alert-success" role="status">
+ Thank you for your valuable feedback to us.
+ <button type="button" class="close" data-dismiss="alert">&amp;times;</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </t>
+ </template>
+</odoo>
diff --git a/sh_helpdesk/views/ticket_dashboard_templates.xml b/sh_helpdesk/views/ticket_dashboard_templates.xml
new file mode 100644
index 0000000..9e1d7fc
--- /dev/null
+++ b/sh_helpdesk/views/ticket_dashboard_templates.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="sh_web_layout" inherit_id="web.layout" name="Web layout">
+ <xpath expr="//head/meta[last()]" position="after">
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
+ </xpath>
+ </template>
+ <template id="ticket_dashboard_count" name="My Dashboard Count">
+ <div id="js_ticket_count_div">
+ <div>
+ <div class="row">
+ <t t-foreach="data_dict.keys()" t-as="value">
+ <t t-if="data_dict">
+ <t t-foreach="data_dict[value]" t-as="v">
+ <div class="col-lg-3 col-md-4 col-sm-12">
+ <a class="sh_tile_click custom" href="#" t-att-data-res_ids="v or []">
+ <div class="card card_1 custom-card" href="#">
+ <div class="sh-card-body dash1 badge-info" style="background-color: #445ee9;">
+ <div class="media">
+ <i class="fa fa-clock-o fs-20 text-white align-self-center mr-3"></i>
+ <div style="display: inline-block;color: white;">
+ <h3 class="mt-0"><t t-esc="len(v)" /></h3>
+ <p><span t-esc="value" /></p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </a>
+ </div>
+ </t>
+ <br />
+ </t>
+ </t>
+ </div>
+ </div>
+ </div>
+ </template>
+ <template id="ticket_dashboard_tbl" name="My Ticket Table">
+ <div id="js_ticket_tbl_div">
+ <div>
+ <div class="row" style="margin: 0;">
+ <t t-if="ticket_data_dic">
+ <div class="modal fade whatsapp_modal" tabindex="-1" role="dialog" aria-labelledby="whatsappModalLabel" aria-hidden="true">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title" id="whatsappModalLabel">Send By Whatsapp</h5>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&amp;times;</span>
+ </button>
+ </div>
+ <div class="modal-body">
+ <form>
+ <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
+ <div class="form-group" style="display: flex;align-items: center;">
+ <label for="ticket_partner_id" style="margin-bottom: 0;font-weight: 600;width:100px">Partner</label>
+ <select class="form-select form-select-lg mb-3 custom-select" id="ticket_partner_id" required="True" style="margin-bottom: 0 !important;">
+ <option value="select_partner">Select Partner</option>
+ <t t-foreach="request.env['res.partner'].sudo().search([])" t-as="partner">
+ <option t-att-value="partner.id"><t t-esc="partner.name_get()[0][1]" /></option>
+ </t>
+ </select>
+ </div>
+ <div class="form-group" style="display: flex;align-items: center;margin-bottom: 1.3rem;">
+ <label for="partner_mobile_no" style="font-weight: 600;margin-bottom: 0;width: 100px;">Mobile No</label>
+ <input id="partner_mobile_no" name="partner_mobile_no" class="form-control" type="text" placeholder="Enter Mobile No with conutry code" required="True" />
+ </div>
+ <div class="form-group" style="display: flex;align-items: center;margin-bottom: 1.3rem;">
+ <label for="whatsapp_message" style="font-weight: 600;width: 100px;margin-bottom: 0;">Message</label>
+ <textarea class="form-control rounded-0" id="whatsapp_message" required="True"></textarea>
+ </div>
+ <div class="form-group">
+ <p>
+ <strong>Note:</strong><br />
+ 1) Use *text* to make text bold.<br />
+ 2) Use _text_ to make text italic.<br />
+ 3) Use %0A after/before Text if you want to add blank line.<br />
+ 4) use %20 after/before any Text if you want to give space.<br />
+ 5) go to users => preferences to add signature.
+ </p>
+ </div>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+ <button type="button" class="btn btn-primary" id="send">Send</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <t t-foreach="ticket_data_dic.keys()" t-as="ticket">
+ <div class="col-md-12" style="margin-bottom: 20px; box-shadow: 0 0 2px rgba(0, 0, 0, 0.5); padding-left: 0 !important; padding-right: 0 !important;">
+ <h3 style="padding: 10px; margin-top: 7px; margin-bottom: 7px;">
+ <b>
+ <span>Stage :</span>
+ <span t-esc="ticket" />
+ </b>
+ </h3>
+ <div class="table-responsive">
+ <table class="table" style="margin-bottom: 0.5rem;">
+ <tr>
+ <th>Ticket No</th>
+ <th>Customer Name</th>
+ <th>Mobile Number</th>
+ <th>Create Date</th>
+ <th>Last Update Date</th>
+ <th>Assign User</th>
+ <th style="padding-left: 25px;">Action</th>
+ <th style="display: none;"></th>
+ </tr>
+ <t t-if="len(ticket_data_dic[ticket])==0">
+ <tr>
+ <td colspan="7">
+ Data not available.
+ </td>
+ </tr>
+ </t>
+ <t t-if="len(ticket_data_dic[ticket])&gt;0">
+ <tr t-foreach="ticket_data_dic[ticket]" t-as="order">
+ <td>
+ <a t-att-href="'/web#id=%s&amp;view_type=form&amp;model=helpdesk.ticket' % (order.get('ticket_id'))" target="_blank"><span t-esc="order.get('ticket_no')" /></a>
+ </td>
+ <td><span t-esc="order.get('partner_name')" /></td>
+ <td><span t-esc="order.get('partner_mobile')" /></td>
+ <td><span t-esc="order.get('create_date')" /></td>
+ <td><span t-esc="order.get('write_date')" /></td>
+ <td><span t-esc="order.get('user_id')" /></td>
+ <td>
+ <a style="cursor: pointer;" class="btn-success" t-att-href="'/web#id=%s&amp;view_type=form&amp;model=helpdesk.ticket' % (order.get('ticket_id'))" target="_blank">
+ <i class="fa fa-eye" />
+ </a>
+ &amp;nbsp;
+ <button style="cursor: pointer;" class="btn-success mark-whatsapp"><i class="fa fa-whatsapp" /></button>
+ </td>
+ <td style="display: none;">
+ <input type="hidden" id="partner_id" name="partner_id" t-att-value="order.get('partner_id')" t-att-data-mobile="order.get('partner_mobile') or ''" />
+ </td>
+ </tr>
+ </t>
+ </table>
+ </div>
+ </div>
+ <br />
+ </t>
+ </t>
+ </div>
+ </div>
+ </div>
+ </template>
+</odoo>
diff --git a/sh_helpdesk/views/ticket_dashboard_view.xml b/sh_helpdesk/views/ticket_dashboard_view.xml
new file mode 100644
index 0000000..5789233
--- /dev/null
+++ b/sh_helpdesk/views/ticket_dashboard_view.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="sh_ticket_dashboard_kanban_view" model="ir.ui.view">
+ <field name="name">Ticket Dashboard</field>
+ <field name="model">ticket.dashboard</field>
+ <field name="type">kanban</field>
+ <field name="arch" type="xml">
+ <kanban create="false">
+ <field name="name" />
+ <templates>
+ <t t-name="kanban-box">
+ <section id="dashboard_counter" class="counter-area" style="min-width: 100% !important; width: 100% !important;">
+ <script type="text/javascript" src="/sh_helpdesk/static/src/js/filter.js" />
+ <link rel="stylesheet" type="text/css" href="/sh_helpdesk/static/src/css/ticket_dashboard.css" />
+ <div class="container">
+ <section class="drop_btn sh_drop_btn">
+ <div class="row">
+ <div class="col-md-4 col-sm-4" id="leader_div">
+ <div class="sh_btn">
+ <div class="dropdown">
+ <select id="team_leader" class="btn btn-primary dropdown-toggle">
+ <option value="0" selected="True">Team Leader</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="col-md-4 col-sm-4" id="team_div">
+ <div class="sh_btn">
+ <div class="dropdown">
+ <select id="team" class="btn btn-primary dropdown-toggle">
+ <option value="0" selected="True">Team</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="col-md-4 col-sm-4" id="assign_user_div">
+ <div class="sh_btn">
+ <div class="dropdown">
+ <select id="assign_user" class="btn btn-primary dropdown-toggle">
+ <option value="0" selected="True">Assign User</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <br />
+ <br />
+ <div class="col-md-4 col-sm-4">
+ <div class="sh_btn">
+ <div class="dropdown">
+ <select id="days_filter" class="btn btn-primary dropdown-toggle">
+ <option value="all" selected="True">Select Date</option>
+ <option value="today">Today</option>
+ <option value="yesterday">Yesterday</option>
+ <option value="weekly">Current Week</option>
+ <option value="prev_week">Previous Week</option>
+ <option value="monthly">Current Month</option>
+ <option value="prev_month">Previous Month</option>
+ <option value="cur_year">Current Year</option>
+ <option value="prev_year">Previous Year</option>
+ <option value="custom">Custom</option>
+ </select>
+ </div>
+ </div>
+ </div>
+
+ <div class="col-md-3 col-sm-4 col-12 col-lg-2">
+ <input type="date" id="start_date" name="start_date" class="form-control o_hidden" />
+ </div>
+ <div class="col-md-3 col-sm-4 col-12 col-lg-2">
+ <input type="date" id="end_date" name="end_date" class="form-control o_hidden" />
+ </div>
+ </div>
+ </section>
+ <br />
+ <br />
+ <section id="dashboard_counter" class="counter-area" style="min-width: 100% !important; width: 100% !important;">
+ <div id="js_ticket_count_div"></div>
+ <br />
+ <br />
+ <div id="js_ticket_tbl_div"></div>
+ </section>
+ </div>
+ </section>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <record id="sh_action_ticket_dashboard" model="ir.actions.act_window">
+ <field name="name">Ticket Dashboard</field>
+ <field name="res_model">ticket.dashboard</field>
+ <field name="view_mode">kanban,form</field>
+ <field name="view_id" ref="sh_ticket_dashboard_kanban_view" />
+ </record>
+ <menuitem id="helpdesk_dashboard_menu" name="Dashboard" parent="sh_helpdesk.helpdesk_main_menu" sequence="1" action="sh_action_ticket_dashboard" />
+</odoo>