Merge branch 'master-helpdesk-bhumika' into 'master'

[ADD]: Added modules Helpdesk, Helpdesk Project Ext., Helpdesk Forum and Website Helpdesk

See merge request flectra-hq/flectra!126
This commit is contained in:
Parthiv Patel 2018-08-06 14:00:37 +00:00
commit 9a217698d5
118 changed files with 4755 additions and 0 deletions

View File

@ -0,0 +1,4 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import models
from . import report

View File

@ -0,0 +1,34 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
{
'name': 'Helpdesk',
'version': '1.0',
'description': '''A help desk is a department inside an organization that
is responsible for answering the technical questions of its users.
''',
'summary': '''A help desk is a department inside an organization that is
responsible for answering the technical questions of its users.
''',
'category': 'Human Resources',
'author': 'FlectraHQ',
'website': 'https://flectrahq.com',
'depends': ['mail'],
'data': [
'security/helpdesk_security_view.xml',
'security/ir.model.access.csv',
'data/helpdesk_data.xml',
'views/view.xml',
'views/helpdesk_ticket_view.xml',
'views/helpdesk_team_view.xml',
'views/issue_type_view.xml',
'views/helpdesk_tag_view.xml',
'views/helpdesk_stage_view.xml',
'report/helpdesk_report_view.xml',
],
'demo': [
'demo/helpdesk_demo.xml',
],
'installable': True,
'auto_install': False,
'application': True,
}

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<data noupdate="1">
<record id="seq_helpdesk_issue" model="ir.sequence">
<field name="name">Issues</field>
<field name="code">helpdesk.ticket</field>
<field name="prefix">ISSUE</field>
<field name="padding">4</field>
<field name="company_id" eval="False"/>
</record>
</data>
<record id="mt_issue_new" model="mail.message.subtype">
<field name="name">Issue Opened</field>
<field name="res_model">helpdesk.ticket</field>
<field name="default" eval="False"/>
<field name="hidden" eval="False"/>
<field name="description">Issue opened</field>
</record>
<record id="mt_issue_stage" model="mail.message.subtype">
<field name="name">Stage Changed</field>
<field name="res_model">helpdesk.ticket</field>
<field name="default" eval="False"/>
<field name="description">Stage changed</field>
</record>
</flectra>

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra noupdate="1">
<record id="helpdesk_stage_draft" model="helpdesk.stage">
<field name="name">Draft</field>
<field name="stage_type">draft</field>
</record>
<record id="helpdesk_stage_new" model="helpdesk.stage">
<field name="name">New</field>
<field name="stage_type">new</field>
</record>
<record id="helpdesk_stage_in_progress" model="helpdesk.stage">
<field name="name">In Progress</field>
<field name="stage_type">in_progress</field>
</record>
<record id="helpdesk_stage_done" model="helpdesk.stage">
<field name="name">Done</field>
<field name="stage_type">done</field>
</record>
<record id="helpdesk_tag_new" model="helpdesk.tag">
<field name="name">New</field>
<field name="code">new</field>
</record>
<record id="helpdesk_tag_reopen" model="helpdesk.tag">
<field name="name">Re-Open</field>
<field name="code">reopen</field>
</record>
<record id="helpdesk_tag_cancel" model="helpdesk.tag">
<field name="name">Cancelled</field>
<field name="code">cancel</field>
</record>
<record id="helpdesk_tag_done" model="helpdesk.tag">
<field name="name">Done</field>
<field name="code">done</field>
</record>
<record id="issue_type_hardware" model="issue.type">
<field name="name">Hardware</field>
<field name="code">H/W</field>
<field name="reporting_template">
Q. When did you purchased this product?
A.
Q. Was it a damaged product at time of purchase?
A.
Q. How long was the warrenty of this product?
A.
</field>
</record>
<record id="issue_type_software" model="issue.type">
<field name="name">Software</field>
<field name="code">S/W</field>
<field name="reporting_template">
Q. What is the version?
A.
Q. What is the OS of your system?
A.
Q. When did you last updated your system?
A.
Q. When did you last updated this software?
A.
</field>
</record>
<record id="helpdesk_software" model="helpdesk.team">
<field name="name">Team Software</field>
<field name="alias_name">team_software</field>
<field name="issue_type_ids"
eval="[(6,0,[ref('helpdesk_basic.issue_type_software')])]"/>
<field name="stage_ids"
eval="[(6,0,[ref('helpdesk_basic.helpdesk_stage_new'), ref('helpdesk_basic.helpdesk_stage_in_progress'),
ref('helpdesk_basic.helpdesk_stage_done')])]"/>
<field name="member_ids"
eval="[(6,0,[ref('base.user_root'), ref('base.user_demo')])]"/>
</record>
<record id="helpdesk_hardware" model="helpdesk.team">
<field name="name">Team Hardware</field>
<field name="alias_name">team_hardware</field>
<field name="issue_type_ids"
eval="[(6,0,[ref('helpdesk_basic.issue_type_hardware')])]"/>
<field name="stage_ids"
eval="[(6,0,[ref('helpdesk_basic.helpdesk_stage_draft'), ref('helpdesk_basic.helpdesk_stage_in_progress'),
ref('helpdesk_basic.helpdesk_stage_done')])]"/>
<field name="member_ids"
eval="[(6,0,[ref('base.user_root'), ref('base.user_demo')])]"/>
</record>
<record id="helpdesk_ticket" model="helpdesk.ticket">
<field name="name">Software Issue</field>
<field name="priority">2</field>
<field name="issue_type_id"
eval="ref('helpdesk_basic.issue_type_software')"/>
<field name="team_id"
eval="ref('helpdesk_basic.helpdesk_software')"/>
<field name="assigned_to_id" eval="ref('base.user_demo')"/>
<field name="tag_ids"
eval="[(6,0,[ref('helpdesk_basic.helpdesk_tag_new')])]"/>
</record>
</flectra>

View File

@ -0,0 +1,301 @@
:banner: image/helpdesk.jpg
.. _setup/install:
========
Helpdesk
========
This document provides a brief information of what is helpdesk and its
workflow.
.. _helpdesk_dashboard:
Dashboard
---------
A helpdesk is a department inside an organization that is responsible for
answering the technical questions of its users.
A dashboard of helpdesk displays teamwise total counts of helpdesk, its issue
type and graphical view.
.. image:: image/dashboard.png
:class: img­responsive
* Total Issues: Total number of issues.
* Issue Types: Type of an issue.
* Graphical view for the total number of issues.
.. _teamwise_ticket_view:
Tickets displayed in below image will be filtered by its team clicked from
dashboard.
.. image:: image/teamwise_ticket.png
:class: img­responsive
Helpdesk
--------
There are different types of views for helpdesk ticket.
.. _helpdesk_kanban_view:
Kanban View
===========
The kanban view for helpdesk, shows the details like issue name, issue
type, team, tags and also its priority and user related details which will
be grouped by its state.
* Name: Title of the issue.
* Team: Team which will be responsible to solve the issue.
* Issue Type: Type of the issue.
* Tags: Tags for the issue.
* Priority: Priority of the issue.
* Assigned To: the user which is assigned a current issue to fix.
.. image:: image/helpdesk_ticket_kanban.png
:class: img­responsive
.. _helpdesk_form_view:
Form View
=========
The form view for helpdesk shows the details like issue sequence, issue
title, issue creator and its related partner details, issue type, team,
assigned to users, tags, its priority and its start and end date related
details.
.. image:: image/ticket_form.png
:class: img­responsive
Form view will take the following information to create an issue ticket:
* Sequence: Sequence of the issue which will be automatically generated.
* Issue Title: Title of the issue.
* Created By: The one who creates the current issue.
* Related Partner: Related partner details of created by the user which will be
automatically fetched by the system.
* Start Date: Starting date of the issue.
* End Date: Ending date of the issue.
* Issue Type: Type of the current issue.
* Team: Team responsible to solve the current issue.
* Assigned To: User which is assigned to solve the current issue.
* Tags: Tags if any for the current issue.
* Priority: Priority for the issue to be fixed in specific time.
* Description: Detailed description of the issue.
On the top there are two buttons:
* Active: Make an issue Active/Archive.
* Attachments: It will redirect you to the attachments which are attached by
users for issues. It will be helpful for the user to understand and fix
exact issue.
Helpdesk Team
-------------
.. _helpdesk_team_kanban_view:
Kanban View
===========
A kanban view for helpdesk team which shows the total issues assigned to a
particular team and its issue type.
.. image:: image/helpdesk_team.png
:class: img­responsive
* Total Issues: Total number of issues.
* Issue Types: Type of an issue.
.. _helpdesk_team_form_view:
Form View
=========
The helpdesk team's form view takes the following information to create a team:
* Helpdesk Team: Name of the team.
* Stages: Stages of the issue tickets.
* Issue Type: Multiple types of issues that will be solved by the current team.
* Email Alias: Mail Alias for the team.
* Team Members: Select members for the team.
.. image:: image/helpdesk_team_form.png
:class: img­responsive
Issue Type
----------
.. _issue_type_kanban_view:
Kanban View
===========
From the helpdesk issue types kanban view one can create an issue by directly
clicking on ``Create`` button displayed on kanban view. There are the list
of stages and its related count for the issues present in that state. Also,
there is a graphical representation of the issue count based on its type of
issue.
.. image:: image/issue_type_kanban.png
:class: img­responsive
.. _issue_type_form_view:
Form View
=========
The view of issue type form takes the following information to create an issue
type:
* Name: Name of the issue type.
* Code: Unique code for the issue type.
* Reporting Template Content: Content details / Basic Information to get from
the user at the time of registering an issue.
.. image:: image/issue_type_form.png
:class: img­responsive
Helpdesk Stages
---------------
.. _helpdesk_stage_tree_view:
Tree View
=========
Tree view for helpdesk stages.
.. image:: image/stages.png
:class: img­responsive
.. _helpdesk_stage_form_view:
Form View
=========
The form view of helpdesk stages takes the following information to create a
new stage:
* Name: Name of the stage.
* Description: Description of the stage if any.
.. image:: image/stages_form.png
:class: img­responsive
Helpdesk Tags
-------------
.. _helpdesk_tag_tree_view:
Tree View
=========
Tree view for helpdesk tags.
.. image:: image/tags.png
:class: img­responsive
.. _helpdesk_tag_form_view:
Form View
=========
The form view of helpdesk tags takes the following information to create a
new tag:
* Name: Name of the tag.
* Code: Unique code for the tag.
.. image:: image/tags_form.png
:class: img­responsive
Helpdesk Report
---------------
.. _helpdesk_bar_graph_report:
Bar Graph Representation
========================
Bar graph representation of helpdesk issues based on a team in which issue
tickets are assigned.
.. image:: image/helpdesk_report_bar_graph.png
:class: img­responsive
.. _helpdesk_line_graph_report:
Line Graph Representation
=========================
Line graph representation of helpdesk issues based on a team in which issue
tickets are assigned.
.. image:: image/helpdesk_report_line_graph.png
:class: img­responsive
.. _helpdesk_pie_chart_report:
Pie Chart Representation
========================
Pie chart representation of helpdesk issues based on a team in which issue
tickets are assigned.
.. image:: image/helpdesk_report_pie_chart.png
:class: img­responsive
.. _helpdesk_analysis_report:
Analysis Report
===============
Analysis report for helpdesk issues to get different details in a single
report. There are multiple measures to get the different output of the same
report.
.. image:: image/helpdesk_analysis_report.png
:class: img­responsive

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -0,0 +1,706 @@
# Translation of Flectra Server.
# This file contains the translation of the following modules:
# * helpdesk_basic
#
msgid ""
msgstr ""
"Project-Id-Version: Flectra Server 1.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-05 09:52+0000\n"
"PO-Revision-Date: 2018-07-05 09:52+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.issue_type_dashboard_kanban_view
msgid "<span>Ticket</span>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.issue_type_dashboard_kanban_view
msgid "<strong><span>Issue Type: </span></strong>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_kanban_view
msgid "<strong>Issue Type:</strong>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_team_kanban_view
#: model:ir.ui.view,arch_db:helpdesk_basic.team_dashboard_view
msgid "<strong>Issue Types</strong>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_kanban_view
msgid "<strong>Tags: </strong>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_kanban_view
msgid "<strong>Team:</strong>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_team_kanban_view
#: model:ir.ui.view,arch_db:helpdesk_basic.team_dashboard_view
msgid "<strong>Total Issues</strong>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_defaults
msgid "A Python dictionary that will be evaluated to provide default values when creating new records for this alias."
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_active
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_active
msgid "Active"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_attachments_count
msgid "Add Attachments"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_id
msgid "Alias"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_contact
msgid "Alias Contact Security"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_name
msgid "Alias Name"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_domain
msgid "Alias domain"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_model_id
msgid "Aliased Model"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
msgid "Archived"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_assigned_to_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_assigned_to_id
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
msgid "Assigned To"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Assignee"
msgstr ""
#. module: helpdesk_basic
#: code:addons/helpdesk_basic/models/helpdesk_ticket.py:146
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_form
#, python-format
msgid "Attachments"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Cancel"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_code
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_code
#: model:ir.ui.view,arch_db:helpdesk_basic.view_issue_type_search
msgid "Code"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_color
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_color
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_color
msgid "Color Index"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
msgid "Company"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.menu,name:helpdesk_basic.menu_helpdesk_config
msgid "Configuration"
msgstr ""
#. module: helpdesk_basic
#: code:addons/helpdesk_basic/models/helpdesk_ticket.py:191
#: code:addons/helpdesk_basic/models/issue_type.py:45
#, python-format
msgid "Create Ticket"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_user_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_user_id
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
msgid "Created By"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_create_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_create_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_create_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_create_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_create_uid
msgid "Created by"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_create_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_create_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_create_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_create_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_create_date
msgid "Created on"
msgstr ""
#. module: helpdesk_basic
#: model:ir.actions.act_window,name:helpdesk_basic.act_team_dashboard_view
#: model:ir.ui.menu,name:helpdesk_basic.menu_helpdesk_dashboard
msgid "Dashboard"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_defaults
msgid "Default Values"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_kanban_view
msgid "Delete"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_description
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_description
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_description
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_form
msgid "Description"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_display_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_display_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_display_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_display_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_display_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_display_name
msgid "Display Name"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Done"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Draft"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Draft Issues"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_kanban_view
msgid "Edit Ticket"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_email
msgid "Email"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_team_form_view
msgid "Email Alias"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_end_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_end_date
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "End Date"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_fold
msgid "Fold in Kanban"
msgstr ""
#. module: helpdesk_basic
#: code:addons/helpdesk_basic/models/helpdesk_team.py:111
#: code:addons/helpdesk_basic/models/issue_type.py:70
#, python-format
msgid "Future"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Group By"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_team_search
msgid "Group By..."
msgstr ""
#. module: helpdesk_basic
#: model:ir.actions.act_window,name:helpdesk_basic.act_helpdesk_view
#: model:ir.module.category,name:helpdesk_basic.module_helpdesk_category
#: model:ir.ui.menu,name:helpdesk_basic.menu_helpdesk
#: model:ir.ui.menu,name:helpdesk_basic.menu_main_helpdesk
#: model:ir.ui.menu,name:helpdesk_basic.sub_menu_helpdesk
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_form
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_pivot
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_tag_form
msgid "Helpdesk"
msgstr ""
#. module: helpdesk_basic
#: model:ir.actions.act_window,name:helpdesk_basic.action_helpdesk_report
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_report_graph
msgid "Helpdesk Analysis"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model,name:helpdesk_basic.model_helpdesk_report
#: model:ir.ui.menu,name:helpdesk_basic.helpdesk_report
msgid "Helpdesk Report"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_report_helpdesk_pivot
msgid "Helpdesk Statistics"
msgstr ""
#. module: helpdesk_basic
#: model:ir.actions.act_window,name:helpdesk_basic.action_helpdesk_team
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_name
#: model:ir.ui.menu,name:helpdesk_basic.helpdesk_team_menu
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Helpdesk Team"
msgstr ""
#. module: helpdesk_basic
#: selection:helpdesk.report,priority:0
#: selection:helpdesk.ticket,priority:0
msgid "High"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_id
msgid "ID"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_parent_thread_id
msgid "ID of the parent record holding the alias (example: project holding the task creation alias)"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "In Progress"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_is_accessible
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_is_assigned
msgid "Is Accessible"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_form
msgid "Issue Details"
msgstr ""
#. module: helpdesk_basic
#: model:ir.actions.act_window,name:helpdesk_basic.action_issue_type
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_issue_type_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_issue_type_ids
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_issue_type_id
#: model:ir.ui.menu,name:helpdesk_basic.issue_type_menu
#: model:ir.ui.view,arch_db:helpdesk_basic.view_issue_type_form
msgid "Issue Type"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_team_kanban_view
#: model:ir.ui.view,arch_db:helpdesk_basic.team_dashboard_view
msgid "Issues"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Journal invoices with period in current year"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_kanban_dashboard_graph
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_kanban_dashboard_graph
msgid "Kanban Dashboard Graph"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report___last_update
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage___last_update
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag___last_update
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team___last_update
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket___last_update
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type___last_update
msgid "Last Modified on"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Last Month"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_write_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_write_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_write_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_write_uid
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_write_uid
msgid "Last Updated by"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_write_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_write_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_write_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_write_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_write_date
msgid "Last Updated on"
msgstr ""
#. module: helpdesk_basic
#: selection:helpdesk.report,priority:0
#: selection:helpdesk.ticket,priority:0
msgid "Low"
msgstr ""
#. module: helpdesk_basic
#: model:res.groups,name:helpdesk_basic.helpdesk_group_manager
msgid "Manager"
msgstr ""
#. module: helpdesk_basic
#: selection:helpdesk.report,priority:0
#: selection:helpdesk.ticket,priority:0
msgid "Medium"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_member_ids
msgid "Members"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "My Issues"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_stage_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_tag_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_name
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_name
#: model:ir.ui.view,arch_db:helpdesk_basic.view_issue_type_search
msgid "Name"
msgstr ""
#. module: helpdesk_basic
#: code:addons/helpdesk_basic/models/helpdesk_ticket.py:53
#: code:addons/helpdesk_basic/models/helpdesk_ticket.py:55
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
#, python-format
msgid "New"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_force_thread_id
msgid "Optional ID of a thread (record) to which all incoming messages will be attached, even if they did not reply to it. If set, this will disable the creation of new records completely."
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_user_id
msgid "Owner"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_parent_model_id
msgid "Parent Model"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_parent_thread_id
msgid "Parent Record Thread ID"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_parent_model_id
msgid "Parent model holding the alias. The model holding the alias reference is not necessarily the model given by alias_model_id (example: project (parent_model) and task (model))"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Partner"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_ticket_partner_id
msgid "Partner-related data of the user"
msgstr ""
#. module: helpdesk_basic
#: code:addons/helpdesk_basic/models/helpdesk_team.py:103
#: code:addons/helpdesk_basic/models/issue_type.py:62
#, python-format
msgid "Past"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_contact
msgid "Policy to post a message on the document using the mailgateway.\n"
"- everyone: everyone can post\n"
"- partners: only authenticated partners\n"
"- followers: only followers of the related document or members of following channels\n"
""
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_priority
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_priority
msgid "Priority"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_alias_force_thread_id
msgid "Record Thread ID"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_kanban_view
msgid "Record's Color"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_partner_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_partner_id
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
msgid "Related Partner"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.menu,name:helpdesk_basic.helpdesk_report_main_menu
msgid "Reporting"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_reporting_template
msgid "Reporting Template"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_issue_type_form
msgid "Reporting Template Content"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_team_search
msgid "Search for Helpdesk"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_issue_type_search
msgid "Search for Issue Type"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_sequence
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_sequence
msgid "Sequence"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_team_kanban_view
#: model:ir.ui.view,arch_db:helpdesk_basic.issue_type_dashboard_kanban_view
#: model:ir.ui.view,arch_db:helpdesk_basic.team_dashboard_view
msgid "Settings"
msgstr ""
#. module: helpdesk_basic
#: model:helpdesk.ticket,name:helpdesk_basic.helpdesk_ticket
msgid "Software Issue"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_stage_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_stage_id
msgid "Stage"
msgstr ""
#. module: helpdesk_basic
#: model:ir.actions.act_window,name:helpdesk_basic.act_helpdesk_stage_view
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_stage_ids
#: model:ir.model.fields,field_description:helpdesk_basic.field_issue_type_stages
#: model:ir.ui.menu,name:helpdesk_basic.stage_menu
msgid "Stages"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_start_date
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_start_date
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "Start Date"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
msgid "Status"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_tag_ids
msgid "Tag(s)"
msgstr ""
#. module: helpdesk_basic
#: model:ir.actions.act_window,name:helpdesk_basic.act_helpdesk_tag_view
#: model:ir.ui.menu,name:helpdesk_basic.tag_menu
msgid "Tags"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_report_team_id
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_ticket_team_id
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_search
msgid "Team"
msgstr ""
#. module: helpdesk_basic
#: model:helpdesk.team,name:helpdesk_basic.helpdesk_hardware
msgid "Team Hardware"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.helpdesk_team_form_view
msgid "Team Members"
msgstr ""
#. module: helpdesk_basic
#: model:helpdesk.team,name:helpdesk_basic.helpdesk_software
msgid "Team Software"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.view_helpdesk_team_search
msgid "Team id"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_model_id
msgid "The model (Flectra Document Kind) to which this alias corresponds. Any incoming email that does not reply to an existing record will cause the creation of a new record of this model (e.g. a Project Task)"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_name
msgid "The name of the email alias, e.g. 'jobs' if you want to catch emails for <jobs@example.flectra.com>"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,help:helpdesk_basic.field_helpdesk_team_alias_user_id
msgid "The owner of records created upon receiving emails on this alias. If this field is not set the system will attempt to find the right owner based on the sender (From) address, or will use the Administrator account if no system user is found for that address."
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "This Month"
msgstr ""
#. module: helpdesk_basic
#: code:addons/helpdesk_basic/models/helpdesk_team.py:109
#: code:addons/helpdesk_basic/models/issue_type.py:68
#, python-format
msgid "This Week"
msgstr ""
#. module: helpdesk_basic
#: model:ir.ui.view,arch_db:helpdesk_basic.report_helpdesk_view_search
msgid "This Year"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model.fields,field_description:helpdesk_basic.field_helpdesk_team_helpdesk_count
msgid "Total Helpdesk"
msgstr ""
#. module: helpdesk_basic
#: model:res.groups,name:helpdesk_basic.helpdesk_group_user
msgid "User"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model,name:helpdesk_basic.model_helpdesk_stage
msgid "helpdesk.stage"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model,name:helpdesk_basic.model_helpdesk_tag
msgid "helpdesk.tag"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model,name:helpdesk_basic.model_helpdesk_team
msgid "helpdesk.team"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model,name:helpdesk_basic.model_helpdesk_ticket
msgid "helpdesk.ticket"
msgstr ""
#. module: helpdesk_basic
#: model:ir.model,name:helpdesk_basic.model_issue_type
msgid "issue.type"
msgstr ""

View File

@ -0,0 +1,7 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import helpdesk_ticket
from . import helpdesk_team
from . import issue_type
from . import helpdesk_tag
from . import helpdesk_stage

View File

@ -0,0 +1,18 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra import fields, models
class HelpdeskStage(models.Model):
_name = 'helpdesk.stage'
_order = 'sequence, id'
_description = 'Helpdesk Stage'
name = fields.Char('Name', required=True)
description = fields.Text(translate=True)
fold = fields.Boolean(string='Fold in Kanban')
stage_type = fields.Selection([('draft', 'Draft'), ('new', 'New'),
('in_progress', 'In Progress'),
('done', 'Done')], string='Stage Type',
required=True)
sequence = fields.Integer(default=1)

View File

@ -0,0 +1,11 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra import fields, models
class HelpdeskTag(models.Model):
_name = 'helpdesk.tag'
_description = 'Helpdesk Tags'
name = fields.Char('Name', required=True)
code = fields.Char('Code', required=True)

View File

@ -0,0 +1,128 @@
# Part of Flectra. See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models, _
from flectra.tools.safe_eval import safe_eval
from flectra.tools import DEFAULT_SERVER_DATE_FORMAT as DF
from datetime import datetime, timedelta
from babel.dates import format_datetime, format_date
import json
class HelpdeskTeam(models.Model):
_name = 'helpdesk.team'
_inherit = ['mail.thread', 'mail.activity.mixin', 'mail.alias.mixin']
_description = 'Helpdesk Team'
name = fields.Char(string='Helpdesk Team', translate=True,
track_visibility='always', required=True)
active = fields.Boolean(string='Active', default=True)
color = fields.Integer(string='Color Index')
member_ids = fields.Many2many('res.users', string='Members')
alias_id = fields.Many2one('mail.alias', 'Alias', ondelete='restrict')
issue_type_ids = fields.Many2many('issue.type', string='Issue Type')
helpdesk_count = fields.Integer(compute='_compute_helpdesk_count',
string='Total Helpdesk')
stage_ids = fields.Many2many('helpdesk.stage', string='Stages')
kanban_dashboard_graph = fields.Text(
compute='_compute_kanban_dashboard_graph')
@api.multi
def _compute_helpdesk_count(self):
for team in self:
team.helpdesk_count = self.env['helpdesk.ticket'].search_count([
('team_id', '=', team.id)])
@api.multi
def get_alias_model_name(self, vals):
return vals.get('alias_model', 'helpdesk.ticket')
@api.multi
def get_alias_values(self):
self.ensure_one()
values = super(HelpdeskTeam, self).get_alias_values()
values['alias_defaults'] = defaults = safe_eval(
self.alias_defaults or "{}")
defaults['team_id'] = self.id
return values
@api.model
def create(self, values):
res = super(HelpdeskTeam, self).create(values)
res.message_subscribe_users(user_ids=res.member_ids.ids)
return res
@api.multi
def write(self, vals):
if vals.get('member_ids', False):
self.message_subscribe_users(user_ids=self.member_ids.ids)
result = super(HelpdeskTeam, self).write(vals)
if 'alias_defaults' in vals:
for team in self:
team.alias_id.write(team.get_alias_values())
return result
@api.multi
def _compute_kanban_dashboard_graph(self):
for record in self:
record.kanban_dashboard_graph = json.dumps(
record.get_bar_graph_datas())
@api.multi
def get_bar_graph_datas(self):
data = []
today = datetime.strptime(fields.Date.context_today(self), DF)
data.append({'label': _('Past'), 'value': 0.0, 'type': 'past'})
day_of_week = int(format_datetime(today, 'e', locale=self._context.get(
'lang') or 'en_US'))
first_day_of_week = today + timedelta(days=-day_of_week + 1)
for i in range(-1, 4):
if i == 0:
label = _('This Week')
elif i == 3:
label = _('Future')
else:
start_week = first_day_of_week + timedelta(days=i * 7)
end_week = start_week + timedelta(days=6)
if start_week.month == end_week.month:
label = \
str(start_week.day) + '-' + str(end_week.day) + ' ' + \
format_date(end_week, 'MMM', locale=self._context.get(
'lang') or 'en_US')
else:
label = \
format_date(start_week, 'd MMM',
locale=self._context.get('lang') or 'en_US'
) + '-' + format_date(
end_week, 'd MMM',
locale=self._context.get('lang') or'en_US')
data.append(
{'label': label,
'value': 0.0,
'type': 'past' if i < 0 else 'future'})
select_sql_clause = 'SELECT count(*) FROM helpdesk_ticket AS h ' \
'WHERE team_id = %(team_id)s'
query_args = {'team_id': self.id}
query = ''
start_date = (first_day_of_week + timedelta(days=-7))
for i in range(0, 6):
if i == 0:
query += "(" + select_sql_clause + " and start_date < '" + \
start_date.strftime(DF) + "')"
elif i == 5:
query += " UNION ALL (" + select_sql_clause + \
" and start_date >= '" + \
start_date.strftime(DF) + "')"
else:
next_date = start_date + timedelta(days=7)
query += " UNION ALL (" + select_sql_clause + \
" and start_date >= '" + start_date.strftime(DF) + \
"' and start_date < '" + next_date.strftime(DF) + \
"')"
start_date = next_date
self.env.cr.execute(query, query_args)
query_results = self.env.cr.dictfetchall()
for index in range(0, len(query_results)):
if query_results[index]:
data[index]['value'] = query_results[index].get('count')
return [{'values': data}]

View File

@ -0,0 +1,185 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models, _
class HelpdeskTicket(models.Model):
_name = 'helpdesk.ticket'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'id desc'
_description = 'Helpdesk Ticket'
@api.model
def _get_default_state(self):
if self.team_id and self.team_id.stage_ids:
return self.team_id.stage_ids[0]
active = fields.Boolean('Active', default=True)
color = fields.Integer(string='Color Index')
name = fields.Char('Name', translate=True)
sequence = fields.Char('Sequence', default='New', copy=False)
priority = fields.Selection([('1', 'Low'), ('2', 'Medium'),
('3', 'High')], default='1')
user_id = fields.Many2one('res.users', string='Created By',
track_visibility='onchange')
partner_id = fields.Many2one(
'res.partner', store=True, related='user_id.partner_id',
string='Related Partner', track_visibility='onchange')
email = fields.Char(
string='Email',
default=lambda s: s.env.user.partner_id.email or False)
issue_type_id = fields.Many2one('issue.type', string='Issue Type',
track_visibility='onchange')
team_id = fields.Many2one('helpdesk.team', 'Team',
track_visibility='onchange')
assigned_to_id = fields.Many2one('res.users', string='Assigned To',
track_visibility='onchange')
tag_ids = fields.Many2many('helpdesk.tag', string='Tag(s)')
start_date = fields.Datetime(
string='Start Date', default=fields.Datetime.now,
track_visibility='onchange')
end_date = fields.Datetime(
string='End Date', default=fields.Datetime.now,
track_visibility='onchange')
description = fields.Text(string='Description', size=128, translate=True,
track_visibility='onchange')
attachment_ids = fields.One2many(
'ir.attachment', compute='_compute_attachments',
string="Main Attachments",
help="Attachment that don't come from message.")
attachments_count = fields.Integer(compute='_compute_attachments',
string='Add Attachments')
is_accessible = fields.Boolean('Is Accessible',
compute='_compute_is_accessible')
is_assigned = fields.Boolean('Is Accessible',
compute='_compute_is_accessible')
stage_id = fields.Many2one('helpdesk.stage', string='Stage',
default=_get_default_state,
track_visibility='onchange')
@api.multi
def _track_subtype(self, init_values):
self.ensure_one()
if 'assigned_to_id' in init_values and self.assigned_to_id:
# assigned -> new
return 'helpdesk_basic.mt_issue_new'
elif 'stage_id' in init_values and self.stage_id and \
self.stage_id.sequence <= 1: # start stage -> new
return 'helpdesk_basic.mt_issue_new'
elif 'stage_id' in init_values:
return 'helpdesk_basic.mt_issue_stage'
return super(HelpdeskTicket, self)._track_subtype(init_values)
def add_followers(self):
followers = []
followers.append(self.assigned_to_id.id)
followers.append(self.user_id.id)
self.message_subscribe_users(user_ids=followers)
@api.model
def create(self, values):
if not values.get('user_id'):
values.update({'user_id': self.env.user.id})
if 'sequence' not in values or values['sequence'] == _('New'):
values['sequence'] = self.env['ir.sequence'].next_by_code(
'helpdesk.ticket') or _('New')
if values.get('team_id'):
team = self.team_id.browse(values.get('team_id'))
values.update(
{'stage_id': team.stage_ids and team.stage_ids[0].id or False})
res = super(HelpdeskTicket, self).create(values)
if not res.stage_id and res.team_id and res.team_id.stage_ids:
res.stage_id = res.team_id.stage_ids[0]
res.add_followers()
return res
@api.multi
def write(self, vals):
if vals.get('partner_id', False) or vals.get('assigned_to_id', False):
self.add_followers()
return super(HelpdeskTicket, self).write(vals)
@api.onchange('team_id')
def onchange_team_id(self):
self.assigned_to_id = False
if self.team_id:
self.stage_id = \
self.team_id.stage_ids and self.team_id.stage_ids.ids[0]
return {'domain': {
'assigned_to_id':
[('id', 'in', self.team_id.member_ids and
self.team_id.member_ids.ids or [])],
'stage_id':
[('id', 'in', self.team_id.stage_ids and
self.team_id.stage_ids.ids or [])]
}}
@api.onchange('issue_type_id')
def onchange_issue_type_id(self):
self.team_id = False
if self.issue_type_id:
self.description = self.issue_type_id.reporting_template or ''
return {'domain': {'team_id': [('issue_type_ids', 'in',
self.issue_type_id.id)]}}
@api.multi
def _compute_is_accessible(self):
has_group = self.env.user.has_group('base.group_no_one')
for ticket in self:
if self.env.user.partner_id.id == ticket.partner_id.id or \
has_group:
ticket.is_accessible = True
if self.env.user.id == ticket.assigned_to_id.id or has_group:
ticket.is_assigned = True
@api.multi
def _compute_attachments(self):
for ticket in self:
attachment_ids = self.env['ir.attachment'].search(
[('res_model', '=', ticket._name),
('res_id', '=', ticket.id)])
ticket.attachments_count = len(attachment_ids.ids)
ticket.attachment_ids = attachment_ids
@api.multi
def action_get_attachments(self):
self.ensure_one()
return {
'name': _('Attachments'),
'res_model': 'ir.attachment',
'type': 'ir.actions.act_window',
'view_mode': 'kanban,form',
'view_type': 'form',
'domain': [('res_model', '=', self._name),
('res_id', '=', self.id)],
'context': "{'default_res_model': '%s','default_res_id': %d}" % (
self._name, self.id),
}
@api.multi
def action_get_issue_type(self):
form_id = self.env.ref('helpdesk_basic.view_issue_type_form')
tree_id = self.env.ref('helpdesk_basic.view_issue_type_tree')
return {
'name': 'Issue Types',
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'issue.type',
'views': [(tree_id.id, 'tree'), (form_id.id, 'form'), ],
'domain': [('id', '=', self.issue_type_id.id)],
}
@api.multi
def action_get_team(self):
form_id = self.env.ref('helpdesk_basic.helpdesk_team_form_view')
tree_id = self.env.ref('helpdesk_basic.helpdesk_team_tree_view')
return {
'name': 'Helpdesk Teams',
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'helpdesk.team',
'views': [(tree_id.id, 'tree'), (form_id.id, 'form'), ],
'domain': [('id', '=', self.team_id.id)],
}

View File

@ -0,0 +1,129 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
import json
from datetime import datetime, timedelta
from babel.dates import format_datetime, format_date
from flectra import api, fields, models, _
from flectra.tools import DEFAULT_SERVER_DATE_FORMAT as DF
class IssueType(models.Model):
_name = 'issue.type'
_description = 'Issue Type'
name = fields.Char(string='Name', required=True)
code = fields.Char(string='Code', required=True)
reporting_template = fields.Text(string='Reporting Template')
color = fields.Integer(string='Color Index')
stages = fields.Char(compute='_compute_stages')
kanban_dashboard_graph = fields.Text(
compute='_compute_kanban_dashboard_graph')
@api.multi
def name_get(self):
result = []
for record in self:
result.append((record.id, '%s-%s' % (record.code, record.name)))
return result
@api.multi
def _compute_stages(self):
ticket = self.env['helpdesk.ticket']
stage_ids = self.env['helpdesk.stage'].search([])
for type in self:
stages = []
for stage in stage_ids:
context = \
"{'search_default_stage_id': %d, " \
"'search_default_issue_type_id': %d}" % (stage.id, type.id)
tickets = ticket.search(
[('issue_type_id', '=', type.id),
('stage_id', '=', stage.id)])
stages.append({'key': stage.name, 'value': len(tickets.ids),
'context': context,
'ticket_ids': tickets.ids})
type.stages = json.dumps(stages)
@api.multi
def action_create_new(self):
ctx = self._context.copy()
model = 'helpdesk.ticket'
view_id = self.env.ref('helpdesk_basic.view_helpdesk_form').id
return {
'name': _('Create Ticket'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': model,
'view_id': view_id,
'context': ctx,
}
@api.multi
def _compute_kanban_dashboard_graph(self):
for record in self:
record.kanban_dashboard_graph = json.dumps(
record.get_bar_graph_datas())
@api.multi
def get_bar_graph_datas(self):
data = []
today = datetime.strptime(fields.Date.context_today(self), DF)
data.append({'label': _('Past'), 'value': 0.0, 'type': 'past'})
day_of_week = int(format_datetime(today, 'e', locale=self._context.get(
'lang') or 'en_US'))
first_day_of_week = today + timedelta(days=-day_of_week + 1)
for i in range(-1, 4):
if i == 0:
label = _('This Week')
elif i == 3:
label = _('Future')
else:
start_week = first_day_of_week + timedelta(days=i * 7)
end_week = start_week + timedelta(days=6)
if start_week.month == end_week.month:
label = \
str(start_week.day) + '-' + str(end_week.day) + ' ' + \
format_date(end_week, 'MMM',
locale=self._context.get(
'lang') or 'en_US')
else:
label = \
format_date(start_week, 'd MMM',
locale=self._context.get('lang') or 'en_US'
) + '-' + format_date(
end_week, 'd MMM',
locale=self._context.get('lang') or 'en_US')
data.append({
'label': label,
'value': 0.0,
'type': 'past' if i < 0 else 'future'})
select_sql_clause = 'SELECT count(*) FROM helpdesk_ticket AS h ' \
'WHERE issue_type_id = %(issue_type_id)s'
query_args = {'issue_type_id': self.id}
query = ''
start_date = (first_day_of_week + timedelta(days=-7))
for i in range(0, 6):
if i == 0:
query += "(" + select_sql_clause + " and start_date < '" + \
start_date.strftime(DF) + "')"
elif i == 5:
query += " UNION ALL (" + select_sql_clause + \
" and start_date >= '" + \
start_date.strftime(DF) + "')"
else:
next_date = start_date + timedelta(days=7)
query += " UNION ALL (" + select_sql_clause + \
" and start_date >= '" + start_date.strftime(DF) + \
"' and end_date < '" + next_date.strftime(DF) + \
"')"
start_date = next_date
self.env.cr.execute(query, query_args)
query_results = self.env.cr.dictfetchall()
for index in range(0, len(query_results)):
if query_results[index]:
data[index]['value'] = query_results[index].get('count')
return [{'values': data}]

View File

@ -0,0 +1,3 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import helpdesk_report

View File

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
# Part of Flectra. See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models, tools
class HelpdeskReport(models.Model):
_name = "helpdesk.report"
_description = "Helpdesk Report"
_auto = False
sequence = fields.Char('Sequence', default='New')
name = fields.Char('Name', readonly=True)
partner_id = fields.Many2one('res.partner', string='Related Partner',
readonly=True)
user_id = fields.Many2one('res.users', string='Created By',
readonly=True)
issue_type_id = fields.Many2one('issue.type', string='Issue Type',
readonly=True)
team_id = fields.Many2one('helpdesk.team', 'Team', readonly=True)
assigned_to_id = fields.Many2one('res.users', string='Assigned To',
readonly=True)
start_date = fields.Datetime(string='Start Date', readonly=True)
end_date = fields.Datetime(string='End Date', readonly=True)
stage_id = fields.Many2one('helpdesk.stage', string='Stage')
description = fields.Text(string='Description', readonly=True)
priority = fields.Selection([('low', 'Low'), ('medium', 'Medium'),
('high', 'High')])
@api.model_cr
def init(self):
tools.drop_view_if_exists(self._cr, 'helpdesk_report')
self._cr.execute("""
CREATE VIEW helpdesk_report as (
SELECT
t.id as id,
h.sequence as sequence,
t.name as name,
h.partner_id as partner_id,
h.user_id as user_id,
h.issue_type_id as issue_type_id,
h.team_id as team_id,
h.assigned_to_id as assigned_to_id,
h.start_date as start_date,
h.end_date as end_date,
h.stage_id as stage_id,
h.description as description,
h.priority as priority
FROM helpdesk_team t
INNER JOIN helpdesk_ticket h
ON (h.team_id = t.id and h.active = True))
""")

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_helpdesk_report_graph" model="ir.ui.view">
<field name="name">helpdesk.report.graph</field>
<field name="model">helpdesk.report</field>
<field name="arch" type="xml">
<graph string="Helpdesk Analysis">
<field name="name" type="row"/>
<field name="partner_id" type="col"/>
</graph>
</field>
</record>
<record model="ir.ui.view" id="view_report_helpdesk_pivot">
<field name="name">helpdesk.pivot</field>
<field name="model">helpdesk.report</field>
<field name="arch" type="xml">
<pivot string="Helpdesk Statistics" disable_linking="True">
<field name="name" type="row"/>
<field name="partner_id" type="col"/>
</pivot>
</field>
</record>
<record id="report_helpdesk_view_search" model="ir.ui.view">
<field name="name">report.helpdesk.search</field>
<field name="model">helpdesk.report</field>
<field name="arch" type="xml">
<search string="Helpdesk Analysis">
<filter string="My Issues" name="my_issues"
domain="[('assigned_to_id', '=', uid)]"/>
<separator/>
<field name="start_date"/>
<field name="end_date"/>
<filter string="This Year" name="thisyear"
domain="['|', ('start_date', '=', False), '&amp;',
('start_date','&lt;=', time.strftime('%%Y-12-31')),
('start_date','&gt;=',time.strftime('%%Y-01-01'))]"
help="Journal invoices with period in current year"/>
<separator/>
<filter string="Draft" domain="[('stage_id','=','draft')]"
help="Draft Issues" name="draft"/>
<filter string="New" domain="[('stage_id','=','new')]"
help="New" name="new"/>
<filter string="In Progress" name="in_progress"
domain="[('stage_id','=', 'in_progress')]"/>
<filter string="Done" name="done"
domain="[('stage_id','=', 'done')]"/>
<filter string="Cancel" name="cancel"
domain="[('stage_id','=', 'cancel')]"/>
<separator/>
<filter string="This Month" name="this_month"
domain="[('start_date', '&gt;=', context_today().strftime('%%Y-%%m-01'))]"/>
<filter string="Last Month" name="last_month"
domain="['&amp;',
('start_date', '&gt;=', (context_today() - relativedelta(months=1)).strftime('%%Y-%%m-01')),
('start_date', '&lt;', context_today().strftime('%%Y-%%m-01'))]"/>
<separator/>
<field name="partner_id" operator="child_of"/>
<field name="assigned_to_id"/>
<group expand="1" string="Group By">
<filter string="Helpdesk Team" name="team_id"
context="{'group_by':'team_id'}"/>
<filter string="Partner" name="partner_id"
context="{'group_by':'partner_id','residual_visible':True}"/>
<filter string="Assiged To" name='assigned_to_id'
context="{'group_by':'assigned_to_id'}"/>
<filter string="Status" context="{'group_by':'stage_id'}"/>
<separator orientation="vertical"/>
<filter string="Start Date"
context="{'group_by':'start_date'}"/>
<filter string="End Date"
context="{'group_by':'end_date'}"/>
</group>
</search>
</field>
</record>
<record id="action_helpdesk_report" model="ir.actions.act_window">
<field name="name">Helpdesk Analysis</field>
<field name="res_model">helpdesk.report</field>
<field name="view_mode">graph,pivot</field>
<field name="view_id" ref="view_helpdesk_report_graph"/>
<field name="search_view_id" ref="report_helpdesk_view_search"/>
<field name="context">{'search_default_team_id': 1,
'search_default_current_year': 1}
</field>
</record>
<menuitem id="helpdesk_report_main_menu" name="Reporting"
parent="menu_main_helpdesk" sequence="50"/>
<menuitem id="helpdesk_report" name="Helpdesk Report"
parent="helpdesk_report_main_menu" sequence="1"
action="action_helpdesk_report"/>
</flectra>

View File

@ -0,0 +1,57 @@
<?xml version="1.0" ?>
<flectra>
<record id="module_helpdesk_category" model="ir.module.category">
<field name="name">Helpdesk</field>
<field name="sequence">20</field>
</record>
<record model="res.groups" id="helpdesk_group_user">
<field name="name">User</field>
<field name="category_id" ref="module_helpdesk_category"/>
</record>
<record model="res.groups" id="helpdesk_group_manager">
<field name="name">Manager</field>
<field name="category_id" ref="module_helpdesk_category"/>
<field name="implied_ids" eval="[(4, ref('helpdesk_group_user'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
<record id="helpdesk_user_rule" model="ir.rule">
<field name="name">See Own Issues</field>
<field ref="model_helpdesk_ticket" name="model_id"/>
<field name="domain_force">
['|', '|', ('assigned_to_id','=',user.id), ('partner_id', '=',
user.partner_id.id), ('team_id.member_ids','in',user.id)]
</field>
<field name="groups" eval="[(4, ref('helpdesk_group_user'))]"/>
</record>
<record id="helpdesk_user_create_own_rule" model="ir.rule">
<field name="name">Create Own Issues</field>
<field ref="model_helpdesk_ticket" name="model_id"/>
<field name="domain_force">
[('user_id','=',user.id)]
</field>
<field name="groups" eval="[(4, ref('helpdesk_group_user'))]"/>
<field name="perm_create" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
</record>
<record id="rule_helpdesk_manager" model="ir.rule">
<field name="name">See All Issues</field>
<field ref="model_helpdesk_ticket" name="model_id"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('helpdesk_group_manager'))]"/>
</record>
<record id="helpdesk_team_manager_rule" model="ir.rule">
<field name="name">See All Team</field>
<field ref="model_helpdesk_team" name="model_id"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('helpdesk_group_manager'))]"/>
</record>
</flectra>

View File

@ -0,0 +1,14 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_helpdesk_user,access_helpdesk_user,model_helpdesk_ticket,helpdesk_group_user,1,1,1,0
access_helpdesk_manager,access_helpdesk_manager,model_helpdesk_ticket,helpdesk_group_manager,1,1,1,1
access_helpdesk_team_user,access_helpdesk_team_user,model_helpdesk_team,helpdesk_group_user,1,0,0,0
access_helpdesk_team_manager,access_helpdesk_team_manager,model_helpdesk_team,helpdesk_group_manager,1,1,1,1
access_issue_type_user,access_issue_type_user,model_issue_type,helpdesk_group_user,1,0,0,0
access_issue_type_any,access_issue_type_any,model_issue_type,,1,0,0,0
access_issue_type_manager,access_issue_type_manager,model_issue_type,helpdesk_group_manager,1,1,1,1
access_tag_user,access_tag_user,model_helpdesk_tag,helpdesk_group_user,1,0,0,0
access_tag_manager,access_tag_manager,model_helpdesk_tag,helpdesk_group_manager,1,1,1,1
access_helpdesk_report,access_helpdesk_report,model_helpdesk_report,helpdesk_group_manager,1,0,0,0
access_ir_rule,access_ir_rule,base.model_ir_rule,helpdesk_group_manager,1,0,0,0
access_ir_config_parameter,access_ir_config_parameter,base.model_ir_config_parameter,helpdesk_group_manager,1,0,0,0
access_helpdesk_stage,access_helpdesk_stage,model_helpdesk_stage,,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_helpdesk_user access_helpdesk_user model_helpdesk_ticket helpdesk_group_user 1 1 1 0
3 access_helpdesk_manager access_helpdesk_manager model_helpdesk_ticket helpdesk_group_manager 1 1 1 1
4 access_helpdesk_team_user access_helpdesk_team_user model_helpdesk_team helpdesk_group_user 1 0 0 0
5 access_helpdesk_team_manager access_helpdesk_team_manager model_helpdesk_team helpdesk_group_manager 1 1 1 1
6 access_issue_type_user access_issue_type_user model_issue_type helpdesk_group_user 1 0 0 0
7 access_issue_type_any access_issue_type_any model_issue_type 1 0 0 0
8 access_issue_type_manager access_issue_type_manager model_issue_type helpdesk_group_manager 1 1 1 1
9 access_tag_user access_tag_user model_helpdesk_tag helpdesk_group_user 1 0 0 0
10 access_tag_manager access_tag_manager model_helpdesk_tag helpdesk_group_manager 1 1 1 1
11 access_helpdesk_report access_helpdesk_report model_helpdesk_report helpdesk_group_manager 1 0 0 0
12 access_ir_rule access_ir_rule base.model_ir_rule helpdesk_group_manager 1 0 0 0
13 access_ir_config_parameter access_ir_config_parameter base.model_ir_config_parameter helpdesk_group_manager 1 0 0 0
14 access_helpdesk_stage access_helpdesk_stage model_helpdesk_stage 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -0,0 +1,306 @@
<section class="container">
<div class="row oe_spaced">
<div class="col-md-12">
<h2 class="oe_slogan">Helpdesk</h2>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Dashboard</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="dashboard.png" alt="Dashboard"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Teamwise dashboard view for total issues per team with
graphical representation and also describes its issue type.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Tickets</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
On click of Issues on dashboard, tickets appears from a
particular team and this will be easier for the user to work
with.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="teamwise_ticket.png" width="100%"
alt="Helpdesk Teamwise Tickets"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_ticket_kanban.png" alt="Helpdesk Kanban"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Helpdesk kanban view to get all issues grouped by states.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Form</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Helpdesk form view to add and update details of issue tickets.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="ticket_form.png" alt="Helpdesk Form"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Team</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_team.png" alt="Helpdesk Team"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Helpdesk team details in kanban view.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Team Form</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Helpdesk team form view to add and update details of team.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_team_form.png" alt="Helpdesk Team Form"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Issue Type</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="issue_type_kanban.png"
alt="Issue Type"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Issue type are the different types of helpdesk tickets issue.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Issue Type Form</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Create issue types from this form.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="issue_type_form.png" alt="Issue Type Form"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Stages</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="stages.png" alt="Stages"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Stages for the helpdesk issue tickets.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Stages Form</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Create stages for helpdesk issue tickets from this form.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="stages_form.png" alt="Stages Form"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Tags</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="tags.png"
alt="Tags"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Tags for the helpdesk issue tickets.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Tags Form</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Create tags for helpdesk issue tickets from this form.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="tags_form.png" alt="Tags Form"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Bar Graph Report</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_report_bar_graph.png"
alt="Bar Graph Report"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Graphical representation with Bar Graph for helpdesk tickets.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Line Graph Report</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Graphical representation with Line Graph for helpdesk tickets.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_report_line_graph.png"
alt="Line Graph Report"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Pie Chart Report</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_report_pie_chart.png"
alt="Pie Chart Report"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Graphical representation with Pie Chart for helpdesk tickets.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Analysis Report</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Helpdesk analysis report with tabular representation for its
details.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_analysis_report.png"
alt="Helpdesk Analysis Report"/>
</div>
</div>
</div>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -0,0 +1,16 @@
.o_kanban_view.o_helpdesk_kanban {
.o_kanban_record {
width: 450px;
}
.o_kanban_group {
width: 450px !important;
}
&.o_kanban_ungrouped {
.o_kanban_record {
width: 450px;
}
}
}

View File

@ -0,0 +1,3 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import test_helpdesk

View File

@ -0,0 +1,82 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra.tests.common import TransactionCase
class TestHelpdesk(TransactionCase):
def setUp(self):
""" setUp ***"""
super(TestHelpdesk, self).setUp()
self.helpdesk_id = self.env.ref('helpdesk_basic.helpdesk_ticket')
def test_00_helpdesk_workflow(self):
team = self.env.ref('helpdesk_basic.helpdesk_software')
issue_type = self.env.ref('helpdesk_basic.issue_type_software')
tag = self.env.ref('helpdesk_basic.helpdesk_tag_new')
stage = self.env.ref('helpdesk_basic.helpdesk_stage_draft')
new_helpdesk = self.env['helpdesk.ticket'].create({
'name': 'Testing helpdesk ticket',
'issue_type_id': issue_type.id,
'priority': '2',
'tag_ids': [(6, 0, [tag.id])],
'team_id': team.id,
'stage_id': stage.id,
'assigned_to_id': self.env.ref('base.user_demo').id
})
self.assertTrue(new_helpdesk,
'Helpdesk Issue ticket creation failed')
new_helpdesk.assigned_to_id = self.env.ref('base.user_root').id
team._compute_helpdesk_count()
count_before = team.helpdesk_count
new_helpdesk.onchange_team_id()
new_helpdesk.team_id = self.env.ref(
'helpdesk_basic.helpdesk_hardware').id
self.assertFalse(
new_helpdesk.assigned_to_id.id,
'Assigned to must be reset on change of helpdesk team')
team._compute_helpdesk_count()
count_after = team.helpdesk_count
self.assertEqual(count_before, count_after + 1,
'Helpdesk count is not working properly')
new_helpdesk.issue_type_id = self.env.ref(
'helpdesk_basic.issue_type_hardware').id
new_helpdesk.onchange_issue_type_id()
self.assertFalse(
new_helpdesk.team_id.id,
'Team must be reset on change of helpdesk issue type')
action = new_helpdesk.issue_type_id.action_create_new()
self.assertTrue(action,
'Helpdesk Issue ticket creation form from '
'kanban view not working correctly')
action = new_helpdesk.action_get_team()
self.assertTrue(action, 'Helpdesk team redirectiom form from '
'dashboard view not working correctly')
action = new_helpdesk.action_get_issue_type()
self.assertTrue(action, 'Helpdesk team redirectiom form from '
'dashboard view not working correctly')
new_helpdesk.team_id = team.id
member_before = len(new_helpdesk.team_id.member_ids.ids)
new_helpdesk.team_id.member_ids = \
[(4, self.env.ref('base.demo_user0').id)]
member_after = len(new_helpdesk.team_id.member_ids.ids)
self.assertEqual(member_after, member_before + 1,
'Helpdesk Team members not updated properly')
self.helpdesk_id.issue_type_id._compute_stages()
self.assertTrue(
self.helpdesk_id.issue_type_id.stages,
'Helpdesk Issue stages details in kanban view working correctly')
action = self.helpdesk_id.issue_type_id.action_create_new()
self.assertTrue(
action,
'Helpdesk Issue create button in kanban view working correctly')

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_helpdesk_tag_form" model="ir.ui.view">
<field name="name">Helpdesk Stages Form</field>
<field name="model">helpdesk.stage</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Helpdesk">
<sheet>
<group>
<field name="name"/>
<field name="sequence" required="1"/>
<field name="stage_type"/>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_helpdesk_tag_tree" model="ir.ui.view">
<field name="name">Helpdesk Stages Tree View</field>
<field name="model">helpdesk.stage</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="stage_type"/>
<field name="description"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="act_helpdesk_stage_view">
<field name="name">Stages</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">helpdesk.stage</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="stage_menu" parent="menu_helpdesk_config"
action="act_helpdesk_stage_view" sequence="4"
groups="helpdesk_basic.helpdesk_group_manager"/>
</flectra>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_helpdesk_tag_form" model="ir.ui.view">
<field name="name">Helpdesk Tags Form</field>
<field name="model">helpdesk.tag</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Helpdesk">
<sheet>
<group>
<field name="name"/>
<field name="code"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_helpdesk_tag_tree" model="ir.ui.view">
<field name="name">Helpdesk Tags Tree View</field>
<field name="model">helpdesk.tag</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="code"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="act_helpdesk_tag_view">
<field name="name">Tags</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">helpdesk.tag</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="tag_menu" parent="menu_helpdesk_config"
action="act_helpdesk_tag_view" sequence="3"
groups="helpdesk_basic.helpdesk_group_manager"/>
</flectra>

View File

@ -0,0 +1,290 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="helpdesk_team_tree_view" model="ir.ui.view">
<field name="name">helpdesk.team.tree</field>
<field name="model">helpdesk.team</field>
<field name="priority">2</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="member_ids" widget="many2many_tags"/>
</tree>
</field>
</record>
<record id="helpdesk_team_form_view" model="ir.ui.view">
<field name="name">Helpdesk Team Form</field>
<field name="model">helpdesk.team</field>
<field name="priority">1</field>
<field name="arch" type="xml">
<form string="Team Members">
<sheet>
<group>
<group>
<field name="name"/>
<field name="issue_type_ids" required="1"
widget="many2many_tags"/>
</group>
<group name="group_alias">
<field name="stage_ids" widget="many2many_tags"
required="1"/>
<label for="alias_name" string="Email Alias"/>
<div name="alias_def">
<field name="alias_id" required="0"
class="oe_read_only oe_inline"
string="Email Alias"/>
<div class="oe_edit_only oe_inline"
name="edit_alias"
style="display: inline;">
<field name="alias_name"
class="oe_inline"/>
@
<field name="alias_domain"
class="oe_inline" readonly="1"/>
</div>
</div>
</group>
</group>
<notebook>
<page name="members" string="Team Members">
<field name="member_ids" 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_small', record.id.raw_value)"
height="40" width="40"
class="oe_avatar oe_kanban_avatar_smallboxn mb0"/>
<div class="o_kanban_record_headings ml8">
<strong class="o_kanban_record_title">
<field name="name"/>
</strong>
</div>
<a t-if="! read_only_mode"
type="delete"
class="text-danger">
<i class="fa fa-times">
</i>
</a>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"
widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"
options="{'post_refresh': 'recipients'}"/>
</div>
</form>
</field>
</record>
<record id="view_helpdesk_team_search" model="ir.ui.view">
<field name="name">Helpdesk Team Search</field>
<field name="model">helpdesk.team</field>
<field name="arch" type="xml">
<search string="Search for Helpdesk">
<field name="name" string="Team id"
filter_domain="['|',('name','ilike',self)]"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="helpdesk_team_kanban_view">
<field name="name">helpdesk.team.kanban.view</field>
<field name="model">helpdesk.team</field>
<field name="arch" type="xml">
<kanban
class="oe_background_grey o_kanban_dashboard o_workcenter_kanban o_helpdesk_kanban">
<field name="id"/>
<field name="name"/>
<field name="color"/>
<templates>
<t t-name="kanban-box">
<div style="width: 400px;"
t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click">
<div t-attf-class="o_kanban_card_header o_kanban_record_top">
<div style="text-align: center;"
class="o_kanban_record_headings o_kanban_card_header_title">
<span class="o_primary ml8"
style="display: inline-block; font-weight:bold;">
<field name="name"/>
</span>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button"
href="#">
<i class="fa fa-ellipsis-v"/>
</a>
</div>
</div>
<div class="container o_kanban_card_content"
id="container">
<div class="row">
<div class="col-xs-4" id="total_issues">
<strong>Total Issues</strong>
</div>
<div class="col-xs-4" id="project">
</div>
<div class="col-xs-4" id="issue_type">
<strong>Issue Types</strong>
</div>
<br/>
<br/>
<div class="col-xs-4" id="issue">
<a name="%(act_helpdesk_view)d"
type="action"
context="{'search_default_team_id': [active_id], 'default_team_id': active_id}">
<field name="helpdesk_count"/>
Issues
</a>
</div>
<div class="col-xs-4" id="project_value">
</div>
<div class="col-xs-4"
id="issue_type_value">
<field name="issue_type_ids"/>
</div>
</div>
</div>
<div class="container o_kanban_card_manage_pane">
<div t-if="widget.editable"
class="o_kanban_card_manage_settings row">
<div class="col-xs-8">
<ul class="oe_kanban_colorpicker"
data-field="color"/>
</div>
<div class="col-xs-4 text-right">
<a type="edit">Settings</a>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record model="ir.ui.view" id="team_dashboard_view">
<field name="name">helpdesk.dashboard.kanban.view</field>
<field name="model">helpdesk.team</field>
<field name="arch" type="xml">
<kanban create="false"
class="oe_background_grey o_kanban_dashboard o_workcenter_kanban o_helpdesk_kanban">
<field name="id"/>
<field name="name"/>
<field name="color"/>
<templates>
<t t-name="kanban-box">
<div style="width: 400px;"
t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click">
<div t-attf-class="o_kanban_card_header o_kanban_record_top">
<div style="text-align: center;"
class="o_kanban_record_headings o_kanban_card_header_title">
<span class="o_primary ml8"
style="display: inline-block; font-weight:bold;">
<field name="name"/>
</span>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button"
href="#">
<i class="fa fa-ellipsis-v"/>
</a>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row">
<div class="col-xs-4">
<strong>Total Issues</strong>
</div>
<div class="col-xs-4">
</div>
<div class="col-xs-4">
<strong>Issue Types</strong>
</div>
<br/>
<br/>
<div class="col-xs-4">
<a name="%(act_helpdesk_view)d"
type="action"
context="{'search_default_team_id': [active_id], 'default_team_id': active_id}">
<field name="helpdesk_count"/>
Issues
</a>
</div>
<div class="col-xs-4">
</div>
<div class="col-xs-4">
<field name="issue_type_ids"/>
</div>
</div>
</div>
<div class="container o_kanban_card_content">
<field name="kanban_dashboard_graph"
t-att-graph_type="'bar'"
widget="dashboard_graph"/>
</div>
<div class="container o_kanban_card_manage_pane">
<div t-if="widget.editable"
class="o_kanban_card_manage_settings row">
<div class="col-xs-8">
<ul class="oe_kanban_colorpicker"
data-field="color"/>
</div>
<div class="col-xs-4 text-right">
<a type="edit">Settings</a>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="action_helpdesk_team" model="ir.actions.act_window">
<field name="name">Helpdesk Team</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">helpdesk.team</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_id" ref="helpdesk_team_kanban_view"/>
<field name="search_view_id" ref="view_helpdesk_team_search"/>
</record>
<record model="ir.actions.act_window" id="act_team_dashboard_view">
<field name="name">Dashboard</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">helpdesk.team</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,form</field>
<field name="view_id" ref="team_dashboard_view"/>
</record>
<menuitem id="helpdesk_team_menu" parent="menu_helpdesk_config"
action="action_helpdesk_team" sequence="2"/>
<menuitem name="Dashboard" id="menu_helpdesk_dashboard"
parent="menu_main_helpdesk" sequence="1"
action="act_team_dashboard_view"
groups="helpdesk_basic.helpdesk_group_manager"/>
</flectra>

View File

@ -0,0 +1,259 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_helpdesk_form" model="ir.ui.view">
<field name="name">Helpdesk Form</field>
<field name="model">helpdesk.ticket</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Helpdesk">
<header>
<field name="stage_id" widget="statusbar" clickable="True"
options="{'fold_field': 'fold'}"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" name="toggle_active"
type="object" icon="fa-archive">
<field name="active" widget="boolean_button"
options='{"terminology": "archive"}'/>
</button>
<button class="oe_stat_button" type="object"
name="action_get_attachments" icon="fa-file">
<field string="Attachments"
name="attachments_count" widget="statinfo"/>
</button>
</div>
<div class="oe_title">
<h1>
<field name="sequence" readonly="1"/>
</h1>
<label for="name" class="oe_edit_only"/>
<h1>
<field name="name" placeholder="Issue Details"
required="True"/>
</h1>
</div>
<group>
<group>
<field name="user_id" required="1"/>
<field name="partner_id"/>
<field name="is_accessible" invisible="1"/>
<field name="is_assigned" invisible="1"/>
<field name="issue_type_id"
options='{"no_open": True}'/>
<field name="assigned_to_id"
options='{"no_open": True}'/>
<field name="priority" widget="priority"/>
</group>
<group>
<field name="start_date"/>
<field name="end_date"/>
<field name="team_id"/>
<field name="tag_ids" widget="many2many_tags"/>
</group>
</group>
<notebook>
<page name="description" string="Description">
<field name="description"/>
<field name="attachment_ids" invisible="1"/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"
widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_helpdesk_tree" model="ir.ui.view">
<field name="name">Helpdesk Tree View</field>
<field name="model">helpdesk.ticket</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="user_id"/>
<field name="partner_id"/>
<field name="team_id"/>
<field name="assigned_to_id"/>
<field name="stage_id"/>
</tree>
</field>
</record>
<record id="view_helpdesk_search" model="ir.ui.view">
<field name="name">Helpdesk Search</field>
<field name="model">helpdesk.ticket</field>
<field name="arch" type="xml">
<search string="Search for Helpdesk">
<field name="name" string="Helpdesk"
filter_domain="[('name','ilike',self)]"/>
<field name="team_id" string="Team"/>
<field name="user_id" string="Created By"/>
<field name="issue_type_id" string="Issue Type"/>
<field name="partner_id" string="Related Partner"/>
<field name="assigned_to_id" string="Assigned To"/>
<field name="stage_id" string="Status"/>
<filter string="Archived" domain="[('active','=',False)]"/>
<group expand="0" string="Group By...">
<filter string="Status" domain="[]"
context="{'group_by':'stage_id'}"/>
<filter string="Company" domain="[]"
context="{'group_by':'company_id'}"
groups="base.group_multi_company"/>
<filter string="Team" domain="[]"
context="{'group_by':'team_id'}"/>
<filter string="Created By" domain="[]"
context="{'group_by':'user_id'}"/>
<filter string="Related Partner" domain="[]"
context="{'group_by':'partner_id'}"/>
<filter string="Assigned To" domain="[]"
context="{'group_by':'assigned_to_id'}"/>
<filter string="Issue Type" domain="[]"
context="{'group_by':'issue_type_id'}"/>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="view_helpdesk_pivot">
<field name="name">helpdesk.pivot</field>
<field name="model">helpdesk.ticket</field>
<field name="arch" type="xml">
<pivot string="Helpdesk">
<field name="name" type="row"/>
<field name="user_id" type="col"/>
</pivot>
</field>
</record>
<record model="ir.ui.view" id="helpdesk_kanban_view">
<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_kanban_project_tasks"
on_create="quick_create">
<field name="id"/>
<field name="name"/>
<field name="team_id"/>
<field name="assigned_to_id"/>
<field name="user_id"/>
<field name="partner_id"/>
<field name="color"/>
<field name="priority"/>
<field name="stage_id"
options='{"group_by_tooltip": {"description": "Stage Description"}}'/>
<field name="description"/>
<field name="sequence"/>
<field name="active"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
<div class="oe_kanban_content">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title">
<field name="name"/>
</strong>
<br/>
</div>
<div class="o_dropdown_kanban dropdown"
groups="base.group_user">
<a class="dropdown-toggle btn"
data-toggle="dropdown" href="#">
<span class="fa fa-ellipsis-v"
aria-hidden="true"/>
</a>
<ul class="dropdown-menu" role="menu"
aria-labelledby="dLabel">
<li t-if="widget.editable">
<a type="edit">Edit Ticket</a>
</li>
<li t-if="widget.deletable">
<a type="delete">Delete</a>
</li>
<li class="divider"></li>
<li class="dropdown-header">
Record's Color
</li>
<li>
<ul class="oe_kanban_colorpicker"
data-field="color"/>
</li>
</ul>
</div>
</div>
<div class="o_kanban_record_body">
<div class="row">
<div class="col-xs-12">
<strong>Team:</strong>
<a name="action_get_team"
type="object">
<field name="team_id"/>
</a>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<strong>Issue Type:</strong>
<a name="action_get_issue_type"
type="object">
<field name="issue_type_id"/>
</a>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<strong>Tags:</strong>
<field name="tag_ids"/>
</div>
</div>
</div>
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left">
<field name="priority"
widget="priority"/>
</div>
<div class="oe_kanban_bottom_right">
<img t-att-src="kanban_image('res.users', 'image_small', record.assigned_to_id.raw_value)"
t-att-title="record.assigned_to_id.value"
width="24" height="24"
class="oe_kanban_avatar"/>
</div>
</div>
</div>
<div class="oe_clear"></div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record model="ir.actions.act_window" id="act_helpdesk_view">
<field name="name">Helpdesk</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">helpdesk.ticket</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form,pivot</field>
<field name="search_view_id" ref="view_helpdesk_search"/>
</record>
<menuitem name="Helpdesk" id="menu_main_helpdesk" web_icon="helpdesk_basic,static/description/icon.png"/>
<menuitem name="Helpdesk" id="menu_helpdesk" parent="menu_main_helpdesk"
sequence="2"/>
<menuitem name="Helpdesk" id="sub_menu_helpdesk"
parent="menu_helpdesk" action="act_helpdesk_view"
sequence="1"/>
<menuitem id="menu_helpdesk_config" name="Configuration"
parent="helpdesk_basic.menu_main_helpdesk" sequence="100"
groups="helpdesk_basic.helpdesk_group_manager,base.group_system"/>
</flectra>

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_issue_type_form" model="ir.ui.view">
<field name="name">Issue Type Form</field>
<field name="model">issue.type</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Issue Type">
<sheet>
<group>
<group>
<field name="name"/>
</group>
<group>
<field name="code"/>
</group>
</group>
<notebook>
<page name="reporting_template"
string="Reporting Template Content">
<field name="reporting_template"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_issue_type_tree" model="ir.ui.view">
<field name="name">Issue Type Tree</field>
<field name="model">issue.type</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="code"/>
</tree>
</field>
</record>
<record id="view_issue_type_search" model="ir.ui.view">
<field name="name">Issue Type Search</field>
<field name="model">issue.type</field>
<field name="arch" type="xml">
<search string="Search for Issue Type">
<field name="name" string="Name"
filter_domain="['|',('name','ilike',self)]"/>
<field name="code" string="Code"
filter_domain="['|',('code','ilike',self)]"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="issue_type_dashboard_kanban_view">
<field name="name">issue.type.dashboard.kanban.view</field>
<field name="model">issue.type</field>
<field name="arch" type="xml">
<kanban class="oe_background_grey o_kanban_dashboard o_account_kanban o_helpdesk_kanban">
<field name="id"/>
<field name="name"/>
<field name="stages"/>
<field name="color"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="#{kanban_color(record.color.raw_value)}">
<div t-attf-class="o_kanban_card_header o_kanban_record_top">
<div t-attf-class="o_kanban_card_header">
<div class="o_kanban_card_header_title">
<div class="o_primary">
<strong>
<span>Issue Type:</span>
</strong>
<field name="name"/>
</div>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button"
href="#">
<i class="fa fa-ellipsis-v"/>
</a>
</div>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row">
<div class="col-xs-6 o_kanban_primary_left">
<button type="object"
name="action_create_new"
class="btn btn-primary btn-sm o_invoice_new"
context="{'default_issue_type_id': active_id}">
<span>Ticket</span>
</button>
</div>
<div class="col-xs-6 o_kanban_primary_right">
<div class="row"
t-foreach="JSON.parse(record.stages.raw_value)"
t-as="stage">
<t t-set="context"
t-value="stage['context']"/>
<div class="col-xs-6">
<a name="%(act_helpdesk_view)d"
type="action"
t-att-data-context="context">
<strong>
<span t-esc="stage['key']"/>
</strong>
<span>:</span>
<span t-esc="stage['value']"/>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="container o_kanban_card_content">
<field name="kanban_dashboard_graph"
t-att-graph_type="'bar'"
widget="dashboard_graph"/>
</div>
<div class="container o_kanban_card_manage_pane">
<div t-if="widget.editable"
class="o_kanban_card_manage_settings row">
<div class="col-xs-8">
<ul class="oe_kanban_colorpicker"
data-field="color"/>
</div>
<div class="col-xs-4 text-right">
<a type="edit">Settings</a>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record model="ir.actions.act_window" id="action_issue_type">
<field name="name">Issue Type</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">issue.type</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="search_view_id" ref="view_issue_type_search"/>
</record>
<menuitem id="issue_type_menu" parent="menu_helpdesk_config"
action="action_issue_type" sequence="2"
groups="helpdesk_basic.helpdesk_group_manager"/>
</flectra>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<template id="assets_backend" name="account assets"
inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet"
href="/helpdesk_basic/static/src/less/kanban.less"/>
</xpath>
</template>
</flectra>

View File

@ -0,0 +1,3 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import models

View File

@ -0,0 +1,23 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
{
'name': 'Helpdesk Forum',
'version': '1.0',
'description': '''Helpdesk Forum will provide you forum per
helpdesk team''',
'summary': '''Helpdesk Forum will provide you forum per
helpdesk team''',
'category': 'Human Resources',
'author': 'FlectraHQ',
'website': 'https://flectrahq.com',
'depends': ['helpdesk_basic', 'website_forum'],
'data': [
'views/helpdesk_team_view.xml',
'views/helpdesk_ticket_view.xml',
],
'demo': [
'demo/helpdesk_demo.xml',
],
'installable': True,
'auto_install': False,
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra noupdate="1">
<record id="helpdesk_team_forum" model="helpdesk.team">
<field name="name">Team Quick Support</field>
<field name="alias_name">team_quick_support</field>
<field name="issue_type_ids"
eval="[(6,0,[ref('helpdesk_basic.issue_type_hardware')]), (6,0,[ref('helpdesk_basic.issue_type_software')])]"/>
<field name="stage_ids"
eval="[(6,0,[ref('helpdesk_basic.helpdesk_stage_draft'), ref('helpdesk_basic.helpdesk_stage_in_progress'),
ref('helpdesk_basic.helpdesk_stage_done')])]"/>
<field name="member_ids"
eval="[(6,0,[ref('base.user_root'), ref('base.user_demo')])]"/>
</record>
</flectra>

View File

@ -0,0 +1,27 @@
# Translation of Flectra Server.
# This file contains the translation of the following modules:
# * helpdesk_forum
#
msgid ""
msgstr ""
"Project-Id-Version: Flectra Server 1.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-05 09:58+0000\n"
"PO-Revision-Date: 2018-07-05 09:58+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: helpdesk_forum
#: model:ir.model.fields,field_description:helpdesk_forum.field_helpdesk_team_forum_id
msgid "Forum"
msgstr ""
#. module: helpdesk_forum
#: model:ir.model,name:helpdesk_forum.model_helpdesk_team
msgid "helpdesk.team"
msgstr ""

View File

@ -0,0 +1,4 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import helpdesk_team
from . import helpdesk_ticket

View File

@ -0,0 +1,16 @@
# Part of Flectra. See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models
class HelpdeskTeam(models.Model):
_inherit = 'helpdesk.team'
forum_id = fields.Many2one('forum.forum', string="Forum")
@api.model
def create(self, values):
res = super(HelpdeskTeam, self).create(values)
res.forum_id = self.env['forum.forum'].sudo().create(
{'name': 'Forum %s' % (res.name or '')})
return res

View File

@ -0,0 +1,37 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models, _
class HelpdeskTicket(models.Model):
_inherit = 'helpdesk.ticket'
posted_to_forum = fields.Boolean(string='Posted to Forum', copy=False)
display_post = fields.Boolean(string='Display',
compute='_compute_display_post')
@api.multi
def _compute_display_post(self):
for record in self:
if record.team_id and record.team_id.forum_id:
record.display_post = True
@api.multi
def post_to_forum(self):
for record in self:
if record.team_id and record.team_id.forum_id:
self.env['forum.post'].create(
{'forum_id': record.team_id.forum_id.id,
'name': record.name,
'content': record.description})
self.posted_to_forum = True
body = "#%s Issue Posted on Forum: %s" % (
record.sequence, record.team_id.forum_id.name)
self.env['mail.message'].create({
'subject': _('Issue Posted on Forum'),
'body': body,
'record_name': record.name,
'model': record._name,
'res_id': record.id,
'no_auto_thread': True,
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -0,0 +1,26 @@
<section class="container">
<div class="row oe_spaced">
<div class="col-md-12">
<h2 class="oe_slogan">Helpdesk Forum</h2>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Forum</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="team_forum.png" alt="Helpdesk Forum"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Per team different forums will be available. One creating a
team forum will be created automatically.
</p>
</div>
</div>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1,3 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import test_helpdesk

View File

@ -0,0 +1,26 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra.tests.common import TransactionCase
class TestHelpdeskForum(TransactionCase):
def setUp(self):
""" setUp ***"""
super(TestHelpdeskForum, self).setUp()
def test_00_helpdesk_forum_workflow(self):
team = self.env['helpdesk.team'].create({
'name': 'Test team software',
'alias_name': 'test_team_software',
'issue_type_ids':
[(4, self.env.ref('helpdesk_basic.issue_type_software').id)],
'stage_ids':
[(6, 0, [self.env.ref('helpdesk_basic.helpdesk_stage_new').id,
self.env.ref(
'helpdesk_basic.helpdesk_stage_in_progress').id,
self.env.ref(
'helpdesk_basic.helpdesk_stage_done').id])],
'member_ids': [(6, 0, [self.env.ref('base.user_demo').id])]
})
self.assertTrue(team.forum_id, 'Helpdesk Team forum creation fails')

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="helpdesk_team_form_view" model="ir.ui.view">
<field name="name">Helpdesk Team Form</field>
<field name="model">helpdesk.team</field>
<field name="inherit_id"
ref="helpdesk_basic.helpdesk_team_form_view"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='group_alias']"
position="inside">
<field name="forum_id" readonly="1"/>
</xpath>
</field>
</record>
</flectra>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_helpdesk_form_inherited" model="ir.ui.view">
<field name="name">Helpdesk Form</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id"
ref="helpdesk_basic.view_helpdesk_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='tag_ids']" position="after">
<field name="posted_to_forum" invisible="1"/>
<field name="display_post" invisible="1"/>
</xpath>
<xpath expr="//header" position="inside">
<button name="post_to_forum"
string="Post Issue to Forum" type="object"
attrs="{'invisible': ['|', ('posted_to_forum', '=', True), ('display_post', '=', False)]}"
groups="helpdesk_basic.helpdesk_group_manager"/>
</xpath>
</field>
</record>
</flectra>

View File

@ -0,0 +1,3 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import models

View File

@ -0,0 +1,22 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
{
'name': 'Helpdesk Project Extension',
'version': '1.0',
'description': '''Helpdesk with project and task feature for generating
issues.''',
'summary': '''Helpdesk with project and task feature for generating
issues.''',
'category': 'Human Resources',
'author': 'FlectraHQ',
'website': 'https://flectrahq.com',
'depends': ['helpdesk_basic', 'project'],
'data': [
'views/helpdesk_ticket_view.xml',
'views/helpdesk_team_view.xml',
'views/project_view.xml',
'views/res_config_settings_views.xml',
],
'installable': True,
'auto_install': False,
}

View File

@ -0,0 +1,96 @@
# Translation of Flectra Server.
# This file contains the translation of the following modules:
# * helpdesk_project_ext
#
msgid ""
msgstr ""
"Project-Id-Version: Flectra Server 1.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-05 10:00+0000\n"
"PO-Revision-Date: 2018-07-05 10:00+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: helpdesk_project_ext
#: model:ir.ui.view,arch_db:helpdesk_project_ext.view_helpdesk_form_inherited
msgid "Create Task"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.ui.view,arch_db:helpdesk_project_ext.res_config_settings_view_form_inherit
msgid "Helpdesk"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model.fields,field_description:helpdesk_project_ext.field_project_task_helpdesk_id
msgid "Helpdesk Ticket"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model.fields,field_description:helpdesk_project_ext.field_helpdesk_team_need_project
#: model:ir.model.fields,field_description:helpdesk_project_ext.field_helpdesk_ticket_need_project
msgid "Need Project"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model,name:helpdesk_project_ext.model_project_project
#: model:ir.model.fields,field_description:helpdesk_project_ext.field_helpdesk_team_project_id
#: model:ir.ui.view,arch_db:helpdesk_project_ext.helpdesk_team_kanban_view_inherited
msgid "Project"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.actions.act_window,name:helpdesk_project_ext.helpdesk_config_settings_action
#: model:ir.ui.menu,name:helpdesk_project_ext.helpdesk_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model,name:helpdesk_project_ext.model_project_task
msgid "Task"
msgstr ""
#. module: helpdesk_project_ext
#: code:addons/helpdesk_project_ext/models/helpdesk_ticket.py:42
#: model:ir.model.fields,field_description:helpdesk_project_ext.field_helpdesk_ticket_task_count
#: model:ir.ui.view,arch_db:helpdesk_project_ext.view_helpdesk_form_inherited
#, python-format
msgid "Tasks"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model.fields,field_description:helpdesk_project_ext.field_res_config_settings_use_project
msgid "Use Projects"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model.fields,field_description:helpdesk_project_ext.field_project_project_is_helpdesk
#: model:ir.ui.view,arch_db:helpdesk_project_ext.helpdesk_inherit_edit_project
msgid "Use in Helpdesk"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.ui.view,arch_db:helpdesk_project_ext.res_config_settings_view_form_inherit
msgid "Use projects for creating helpdesk\n"
" issues."
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model,name:helpdesk_project_ext.model_helpdesk_team
msgid "helpdesk.team"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model,name:helpdesk_project_ext.model_helpdesk_ticket
msgid "helpdesk.ticket"
msgstr ""
#. module: helpdesk_project_ext
#: model:ir.model,name:helpdesk_project_ext.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View File

@ -0,0 +1,6 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import helpdesk_team
from . import helpdesk_ticket
from . import project
from . import res_config_settings

View File

@ -0,0 +1,21 @@
# Part of Flectra. See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models
class HelpdeskTeam(models.Model):
_inherit = 'helpdesk.team'
project_id = fields.Many2one('project.project', string='Project')
need_project = fields.Boolean(string='Need Project',
compute="_compute_need_project")
@api.multi
def _compute_need_project(self):
config = self.env['res.config.settings'].search(
[], limit=1, order='id desc')
for team in self:
team.need_project = False
if config.use_project:
team.need_project = True

View File

@ -0,0 +1,64 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models, _
class HelpdeskTicket(models.Model):
_inherit = 'helpdesk.ticket'
need_project = fields.Boolean(string='Need Project',
compute="_compute_need_project")
task_count = fields.Integer(compute='_compute_task_count', string='Tasks')
@api.multi
def action_create_task(self):
self.ensure_one()
user = self.env['res.users'].search(
[('partner_id', '=', self.partner_id.id)], limit=1)
vals = {'name': self.name,
'helpdesk_id': self.id,
'partner_id': self.assigned_to_id.id,
'description':
self.name or '' + '<br/>' + self.description or '',
'user_id': user and user.id or False,
'priority': 'l',
}
if self.env['res.config.settings'].search(
[], limit=1, order='id desc').mapped('use_project'):
vals.update({
'project_id':
self.team_id and self.team_id.project_id and
self.team_id.project_id.id or False})
self.env['project.task'].create(vals)
@api.multi
def action_get_tasks(self):
self.ensure_one()
context = {'default_helpdesk_id': self.id}
if self.env['res.config.settings'].search(
[], limit=1, order='id desc').mapped('use_project') and \
self.team_id and self.team_id.project_id and \
self.team_id.project_id:
context.update({'default_project_id': self.team_id.project_id.id})
return {
'name': _('Tasks'),
'res_model': 'project.task',
'type': 'ir.actions.act_window',
'view_mode': 'tree,form',
'view_type': 'form',
'domain': [('helpdesk_id', '=', self.id)],
'context': context,
}
@api.multi
def _compute_task_count(self):
for ticket in self:
ticket.task_count = self.env['project.task'].search_count([(
'helpdesk_id', '=', self.id)])
@api.multi
def _compute_need_project(self):
if self.env['res.config.settings'].search(
[], limit=1, order='id desc').mapped('use_project'):
for team in self:
team.need_project = True

View File

@ -0,0 +1,15 @@
# Part of Flectra. See LICENSE file for full copyright and licensing details.
from flectra import fields, models
class Project(models.Model):
_inherit = 'project.project'
is_helpdesk = fields.Boolean(string='Use in Helpdesk')
class ProjectTask(models.Model):
_inherit = 'project.task'
helpdesk_id = fields.Many2one('helpdesk.ticket', string='Helpdesk Ticket')

View File

@ -0,0 +1,23 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra import api, fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
use_project = fields.Boolean("Use Projects")
@api.model
def get_values(self):
res = super(ResConfigSettings, self).get_values()
get_param = self.env['ir.config_parameter'].sudo().get_param
res.update(
use_project=get_param('helpdesk_project_ext.use_project'),
)
return res
def set_values(self):
super(ResConfigSettings, self).set_values()
set_param = self.env['ir.config_parameter'].sudo().set_param
set_param('helpdesk_project_ext.use_project', self.use_project)

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -0,0 +1,84 @@
<section class="container">
<div class="row oe_spaced">
<div class="col-md-12">
<h2 class="oe_slogan">Helpdesk Project Extension</h2>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk team with project details</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_project_team.png" alt="Helpdesk Team"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Helpdesk team kanban view displays the project for the team
to create tasks in that project for particular issue.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Team Form</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Select project from the list of projects or create new one
for the team.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="create_project_in_team.png" width="100%"
alt="Helpdesk Team Form"/>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Project Form</h3>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="helpdesk_team_project_create.png"
alt="Helpdesk Project Form"/>
</div>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Create project by adding its name and mark boolean to enable
in helpdesk to true if not enabled.
</p>
</div>
</div>
</section>
<section class="container bg-gray-lighter">
<div class="row oe_spaced mt0">
<div class="col-md-12">
<h3 class="oe_slogan">Helpdesk Team with project.</h3>
</div>
<div class="col-md-6">
<p class="text-justify" style="font-size: 15px;">
Helpdesk team view after project created for the team.
</p>
</div>
<div class="col-md-6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="team_with_project.png" alt="Helpdesk Team Form"/>
</div>
</div>
</div>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -0,0 +1,3 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import test_helpdesk

View File

@ -0,0 +1,19 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from flectra.tests.common import TransactionCase
class TestHelpdesk(TransactionCase):
def setUp(self):
""" setUp ***"""
super(TestHelpdesk, self).setUp()
self.helpdesk_id = self.env.ref('helpdesk_basic.helpdesk_ticket')
def test_00_helpdesk_project_workflow(self):
self.assertFalse(self.helpdesk_id._compute_task_count(),
'Helpdesk task should not be created.')
self.helpdesk_id.action_create_task()
self.helpdesk_id._compute_task_count()
self.assertEqual(self.helpdesk_id.task_count, 1,
'Helpdesk task creation process fails')

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="helpdesk_team_form_view_inherited" model="ir.ui.view">
<field name="name">Helpdesk Team Form</field>
<field name="model">helpdesk.team</field>
<field name="inherit_id"
ref="helpdesk_basic.helpdesk_team_form_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="after">
<field name="need_project" invisible="1"/>
<field name="project_id"
context="{'default_is_helpdesk': True}"
attrs="{'invisible':[('need_project', '=', False)]}"
domain="[('is_helpdesk', '=', True)]"/>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="helpdesk_team_kanban_view_inherited">
<field name="name">helpdesk.team.kanban.view</field>
<field name="model">helpdesk.team</field>
<field name="inherit_id"
ref="helpdesk_basic.helpdesk_team_kanban_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="after">
<field name="need_project" invisible="1"/>
<field name="project_id"
attrs="{'invisible':[('need_project', '=', False)]}"/>
</xpath>
<xpath expr="//div[@id='project']" position="inside">
<strong>
<span t-if="record.need_project.raw_value">Project</span>
</strong>
</xpath>
<xpath expr="//div[@id='project_value']" position="inside">
<field t-if="record.need_project and record.project_id.raw_value"
name="project_id"/>
</xpath>
</field>
</record>
</flectra>

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="view_helpdesk_form_inherited" model="ir.ui.view">
<field name="name">Helpdesk Form</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id"
ref="helpdesk_basic.view_helpdesk_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button class="oe_stat_button" type="object"
name="action_get_tasks" icon="fa-tasks">
<field string="Tasks"
name="task_count" widget="statinfo"/>
</button>
</xpath>
<!--<xpath expr="//header" position="inside">
<button name="action_create_task"
string="Create Task" type="object"
groups="helpdesk_basic.helpdesk_group_manager"/>
</xpath>-->
<xpath expr="//field[@name='tag_ids']" position="after">
<field name="need_project" invisible="1"/>
</xpath>
</field>
</record>
</flectra>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="helpdesk_project_view_inherit" model="ir.ui.view">
<field name="name">helpdesk.project.view.inherit</field>
<field name="model">project.project</field>
<field name="inherit_id"
ref="project.project_project_view_form_simplified"/>
<field name="priority">24</field>
<field name="arch" type="xml">
<field name="user_id" position="after">
<field name="is_helpdesk"/>
</field>
</field>
</record>
<record id="helpdesk_inherit_edit_project" model="ir.ui.view">
<field name="name">helpdesk.inherit.edit.project</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.edit_project"/>
<field name="priority">24</field>
<field name="arch" type="xml">
<xpath expr="//div[@name='options_active']" position="inside">
<div>
<label for="is_helpdesk"/>
<field name="is_helpdesk" class="oe_inline"
string="Use in Helpdesk"/>
</div>
</xpath>
</field>
</record>
</flectra>

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<flectra>
<record id="res_config_settings_view_form_inherit" model="ir.ui.view">
<field name="name">res.config.settings.view.inherit.helpdesk</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="50"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block" data-string="Helpdesk"
string="Helpdesk" data-key="helpdesk"
groups="helpdesk_basic.helpdesk_group_manager">
<h2>Helpdesk</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="use_project"/>
</div>
<div class="o_setting_right_pane">
<label for="use_project"/>
<div class="text-muted">
Use projects for creating helpdesk
issues.
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
<record id="helpdesk_config_settings_action" model="ir.actions.act_window">
<field name="name">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' : 'helpdesk'}</field>
</record>
<menuitem id="helpdesk_config_settings_menu_action"
parent="helpdesk_basic.menu_helpdesk_config" sequence="0"
action="helpdesk_config_settings_action"
groups="base.group_system,helpdesk_basic.helpdesk_group_manager"/>
</flectra>

View File

@ -0,0 +1,4 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
from . import controllers
from . import models

View File

@ -0,0 +1,18 @@
# Part of Flectra See LICENSE file for full copyright and licensing details.
{
'name': 'Website Helpdesk',
'version': '1.0',
'description': '''Website Helpdesk''',
'summary': '''Website Helpdesk''',
'category': 'Human Resources',
'author': 'FlectraHQ',
'website': 'https://flectrahq.com',
'depends': ['helpdesk_basic', 'website', 'portal', 'website_rating'],
'data': [
'views/pages/helpdesk_register_website_view.xml',
'views/views.xml',
],
'installable': True,
'auto_install': False,
}

Some files were not shown because too many files have changed in this diff Show More