9 Commits

28 changed files with 507 additions and 235 deletions

View File

@@ -1,27 +1,16 @@
================================
helpdesk_create_task_from_ticket
================================
===============================
helpdesk_convert_ticket_to_task
===============================
This module changes the behavior of the buttons "create" and "create and edit" of the field `task` in a ticket form.
This module aims to convert a ticket into a task.
For this, it adds a button in the ticket view "Convert to task".
It automatically fills up these tasks fields
```
Ticket (helpdesk.ticke) / Tâche (project.task)
Intitulé (name) --> Titre (name)
Utilisateur assigné (user_id) --> Assignés (user_ids)
Projet (project_id) --> Projet (project_id)
Contact (partner_id) --> Client (partner_id)
Catégorie (category_id) --> service (service_id)
Request Type (request_type_id) --> Type de demande (request_type_id)
Priorité (priority) --> Priorité (priority)
```
It automatically fills up many fields (check the function button_convert_to_task for details)
# Installation
Use Odoo normal module installation procedure to install
`helpdesk_create_task_from_ticket`.
`helpdesk_convert_ticket_to_task`.
# Known issues / Roadmap

View File

@@ -1,24 +1,25 @@
# Copyright 2024 Quentin Mondot
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "helpdesk_create_task_from_ticket",
"name": "helpdesk_convert_ticket_to_task",
"version": "16.0.1.0.0",
"author": "Elabore",
"website": "https://elabore.coop",
"maintainer": "Quentin Mondot",
"license": "AGPL-3",
"category": "Tools",
"summary": "This module enriches task information when creating it from a ticket form.",
"summary": "This module adds a button to convert a ticket into a task.",
"depends": [
"base",
"helpdesk_mgmt",
"helpdesk_mgmt_project",
"helpdesk_request_type", # to create the helpdesk.request.type model and have the field request_type_id in the helpdesk.ticket model
"project_request_data", # to have the fields service_id and request_type_id in the project.task model
"project_task_add_very_high" # to have priority values 2 and 3 on tasks
"project_task_add_very_high", # to have priority values 2 and 3 on tasks
"helpdesk_transfer_timesheet_to_task" # to copy timesheets from ticket to task
],
"data": [
"views/helpdesk_create_task_from_ticket.xml",
"views/helpdesk_convert_ticket_to_task.xml",
],
"installable": True,
"auto_install": False,

View File

@@ -0,0 +1,63 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * helpdesk_convert_ticket_to_task
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-04 15:26+0000\n"
"PO-Revision-Date: 2025-08-04 15:26+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_convert_ticket_to_task
#: model_terms:ir.ui.view,arch_db:helpdesk_convert_ticket_to_task.convert_to_task_helpdesk_ticket_view_form
msgid ""
"Are you sure you want to convert this ticket into a task ? You'll be "
"redirected to the newly created task and this ticket will be archived."
msgstr ""
"Êtes-vous sûr de vouloir convertir ce ticket en tâche ? Vous allez être "
"redirigé vers la tâche créée et ce ticket sera archivé."
#. module: helpdesk_convert_ticket_to_task
#: model_terms:ir.ui.view,arch_db:helpdesk_convert_ticket_to_task.convert_to_task_helpdesk_ticket_view_form
msgid "Convert to task"
msgstr "Convertir en tâche"
#. module: helpdesk_convert_ticket_to_task
#: model:ir.model,name:helpdesk_convert_ticket_to_task.model_helpdesk_ticket
msgid "Helpdesk Ticket"
msgstr "Ticket d'Assistance"
#. module: helpdesk_convert_ticket_to_task
#: model:ir.model.fields,field_description:helpdesk_convert_ticket_to_task.field_helpdesk_ticket__smart_search
msgid "Smart Search"
msgstr ""
#. module: helpdesk_convert_ticket_to_task
#. odoo-python
#: code:addons/helpdesk_convert_ticket_to_task/models/helpdesk_ticket.py:0
#, python-format
msgid ""
"This task has been converted from a ticket. You can find the original ticket"
" <a href='%(ticket_url)s' target='_blank'>on this link</a>."
msgstr ""
"Cette tâche a été convertie depuis un ticket. Vous trouverez le ticket "
"original en cliquant <a href='%(ticket_url)s' target='_blank'>sur ce "
"lien</a>."
#. module: helpdesk_convert_ticket_to_task
#. odoo-python
#: code:addons/helpdesk_convert_ticket_to_task/models/helpdesk_ticket.py:0
#, python-format
msgid ""
"This ticket has been converted into a task. You can find it <a "
"href='%(task_url)s' target='_blank'>on this link</a>."
msgstr ""
"Ce ticket a été convertie en tâche. Vous trouverez la tâche en cliquant <a "
"href='%(task_url)s' target='_blank'>sur ce lien</a>."

View File

@@ -0,0 +1 @@
from . import helpdesk_ticket

View File

@@ -0,0 +1,103 @@
from odoo import _, models, api
class HelpdeskTicket(models.Model):
_inherit = "helpdesk.ticket"
def button_convert_to_task(self):
user_ids = [self.user_id.id]
task_service_id, request_type_id = self._match_task_service_and_request_type(
ticket_category_id=self.category_id.id,
ticket_request_type_id=self.request_type_id.id
)
task = self.env["project.task"].create({
"name": self.name,
"description": self.description,
"project_id": self.project_id.id,
"user_ids": user_ids,
"partner_id": self.partner_id.id,
"service_id": task_service_id,
"request_type_id": request_type_id,
"priority": self.priority
})
# copy chatter
for msg in reversed(self.message_ids):
msg.copy({
'model': 'project.task',
'res_id': task.id
})
# copy attachments inserted in the messages
for attach in msg.attachment_ids:
attach.copy({
'res_model': 'project.task',
'res_id': task.id,
'res_name': task.name
})
# copy attachments not added in a message
for attachment in self.attachment_ids:
attachment.copy({
'res_model': 'project.task',
'res_id': task.id,
'res_name': task.name
})
# copy subscribers
task.message_subscribe(partner_ids=self.message_partner_ids.ids)
# warn (in the chatter) that the task is a copy
base_url = self.env["ir.config_parameter"].sudo().get_param("web.base.url")
ticket_url = f"{base_url}/web#id={self.id}&model=helpdesk.ticket&view_type=form"
task_message = _(
"This task has been converted from a ticket. You can find the original ticket <a href='%(ticket_url)s' target='_blank'>on this link</a>.",
ticket_url=ticket_url
)
task.message_post(body=task_message)
# warn (in the chatter) that the ticket has been converted
task_url = f"{base_url}/web#id={task.id}&model=project.task&view_type=form"
ticket_message = _(
"This ticket has been converted into a task. You can find it <a href='%(task_url)s' target='_blank'>on this link</a>.",
task_url=task_url
)
self.message_post(body=ticket_message)
# archive the ticket
self.write({
"active": False,
"task_id": task.id
})
# transfer timesheets from ticket to task
self._onchange_task_id()
return {
"type": "ir.actions.act_window",
"view_mode": "form",
"target": "current",
"res_model": "project.task",
"res_id": task.id,
}
def _match_task_service_and_request_type(
self,
ticket_category_id: int,
ticket_request_type_id: int
) -> tuple[int, int]:
"""
This function permits to match the task service_id and request_type from the ticket category and request type
"""
helpdesk_ticket_category = self.env["helpdesk.ticket.category"].search(
[("id", "=", ticket_category_id)],
limit=1
)
task_service = self.env["task.service"].search([("name", "=", helpdesk_ticket_category.name)])
helpdesk_ticket_request_type = self.env["helpdesk.request.type"].search(
[("id", "=", ticket_request_type_id)],
limit=1
)
task_request_type = self.env["request.type"].search([("name", "=", helpdesk_ticket_request_type.name)])
return task_service.id, task_request_type.id

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="convert_to_task_helpdesk_ticket_view_form" model="ir.ui.view">
<field name="name">timesheet.helpdesk.ticket.form.view</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk_mgmt.ticket_view_form" />
<field name="priority" eval="20" />
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button
name="button_convert_to_task"
title="Convert to task"
string="Convert to task"
icon="fa-tasks text-success"
type="object"
confirm="Are you sure you want to convert this ticket into a task ? You'll be redirected to the newly created task and this ticket will be archived."
/>
</div>
</field>
</record>
</odoo>

View File

@@ -1 +0,0 @@
from . import project_task

View File

@@ -1,71 +0,0 @@
from odoo import models, api
class ProjectTask(models.Model):
"""
The function "create" is overloaded to adapt the field "user_ids" from the context of helpdesk.ticket to the one of project.task
This function is called when the user clicks on the button "create" in the task field of the ticket form
The function "onchange" is overloaded to adapt the field "user_ids" from the context of helpdesk.ticket to the one of project.task
This function is called when the user clicks on the button "create and modify" in the task field of the ticket form
"""
_inherit = "project.task"
@api.model
def create(self, vals_list):
if all(key in self.env.context for key in (
"default_user_id",
"default_ticket_category_id",
"default_ticket_request_type_id"
)):
user_ids = [self.env.context["default_user_id"]]
task_service_id, request_type_id = self._match_task_service_and_request_type(
ticket_category_id=self.env.context["default_ticket_category_id"],
ticket_request_type_id=self.env.context["default_ticket_request_type_id"]
)
return super(ProjectTask, self.with_context(
default_user_ids=user_ids,
default_service_id=task_service_id,
default_request_type_id=request_type_id
)).create(vals_list)
return super(ProjectTask, self).create(vals_list)
def onchange(self, values, field_name, field_onchange):
if all(key in self.env.context for key in (
"default_user_id",
"default_ticket_category_id",
"default_ticket_request_type_id"
)):
user_ids = [self.env.context["default_user_id"]]
task_service_id, request_type_id = self._match_task_service_and_request_type(
ticket_category_id=self.env.context["default_ticket_category_id"],
ticket_request_type_id=self.env.context["default_ticket_request_type_id"]
)
return super(ProjectTask, self.with_context(
default_user_ids=user_ids,
default_service_id=task_service_id,
default_request_type_id=request_type_id
)).onchange(values, field_name, field_onchange)
return super(ProjectTask, self).onchange(values, field_name, field_onchange)
def _match_task_service_and_request_type(
self,
ticket_category_id: int,
ticket_request_type_id: int
) -> tuple[int, int]:
helpdesk_ticket_category = self.env["helpdesk.ticket.category"].search(
[("id", "=", ticket_category_id)],
limit=1
)
task_service = self.env["task.service"].search([("name", "=", helpdesk_ticket_category.name)])
helpdesk_ticket_request_type = self.env["helpdesk.request.type"].search(
[("id", "=", ticket_request_type_id)],
limit=1
)
task_request_type = self.env["request.type"].search([("name", "=", helpdesk_ticket_request_type.name)])
return task_service.id, task_request_type.id

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="ticket_view_form_create_task_from_ticket" model="ir.ui.view">
<field name="name">helpdesk.ticket.form.task.from.ticket</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk_mgmt_project.ticket_view_form" />
<field name="priority" eval="99" />
<field name="arch" type="xml">
<xpath expr="//field[@name='task_id'][2]" position="attributes">
<attribute name="context">
{
'default_project_id': project_id,
'default_user_id': user_id,
'default_partner_id': partner_id,
'default_ticket_category_id': category_id,
'default_ticket_request_type_id': request_type_id,
'default_priority': priority
}
</attribute>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,35 +0,0 @@
# Copyright 2024 Joris Scampucci" (Elabore)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "helpdesk_portal_ticket_custom",
"version": "16.0.1.0.0",
"author": "Elabore",
"website": "https://elabore.coop",
"maintainer": "Joris Scampucci",
"license": "AGPL-3",
"category": "Tools",
"summary": "Customization for ticket portal view.",
# any module necessary for this one to work correctly
"depends": [
"base",
"helpdesk_mgmt",
],
"qweb": [],
"external_dependencies": {
"python": [],
},
# always loaded
"data": [
"views/portal_ticket_views.xml",
],
# only loaded in demonstration mode
"demo": [],
"js": [],
"css": [],
"installable": True,
# Install this module automatically if all dependency have been previously
# and independently installed. Used for synergetic or glue modules.
"auto_install": False,
"application": False,
}

View File

@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="ticket_priority_widget_template" name="Priority Widget Template">
<span t-attf-class="o_priority_star fa fa-star#{'' if ticket.priority >= ticket_priority else '-o'}" t-attf-title="Priorité: {{'Très haute' if ticket.priority == '3' else 'Haute' if ticket.priority == '2' else 'Moyenne' if ticket.priority == '1' else 'Basse'}}" />
</template>
<template id="ticket_priority_3_stars_template" name="Priority 3 Stars Widget Template">
<t t-call="helpdesk_portal_ticket_custom.ticket_priority_widget_template">
<t t-set="ticket_priority" t-value="'1'"/>
</t>
<t t-call="helpdesk_portal_ticket_custom.ticket_priority_widget_template">
<t t-set="ticket_priority" t-value="'2'"/>
</t>
<t t-call="helpdesk_portal_ticket_custom.ticket_priority_widget_template">
<t t-set="ticket_priority" t-value="'3'"/>
</t>
</template>
<!-- Ticket portal list -->
<template id="portal_ticket_list_inherit" inherit_id="helpdesk_mgmt.portal_ticket_list" priority="1">
<!-- Add priority field -->
<xpath expr="//thead/tr/th[2]" position="after">
<th>Priorité</th>
</xpath>
<xpath expr="//tbody/t/tr/td[2]" position="after">
<td>
<t t-call="helpdesk_portal_ticket_custom.ticket_priority_3_stars_template">
</t>
</td>
</xpath>
</template>
<template id="portal_ticket_form_inherit" inherit_id="helpdesk_mgmt.portal_helpdesk_ticket_page">
<xpath expr="//div[@class='col-9']" position="before">
<div>
<t t-call="helpdesk_portal_ticket_custom.ticket_priority_3_stars_template">
</t>
</div>
</xpath>
</template>
</odoo>

View File

@@ -3,7 +3,7 @@
{
"name": "helpdesk_portal_ticket_enriched_description_form",
"version": "16.0.1.0.0",
"version": "16.0.1.0.1",
"author": "Elabore",
"website": "https://elabore.coop",
"maintainer": "Stéphan Sainléger",

View File

@@ -1,4 +1,5 @@
import odoo.http as http
from odoo import _
from odoo.addons.helpdesk_mgmt.controllers.main import HelpdeskTicketController
@@ -8,15 +9,15 @@ class HelpdeskTicketControllerDescription(HelpdeskTicketController):
description = ""
if kw.get("small_description", False):
description = (
description + "<b>DESCRIPTION:</b><br/>" + kw["small_description"]
description + "<b>%s</b><br/>" % _(u"DESCRIPTION:") + kw["small_description"]
)
del kw["small_description"]
if kw.get("access", False):
description = description + "<br/><br/><b>ACCESS:</b><br/>" + kw["access"]
description = description + "<br/><br/><b>%s</b><br/>" % _(u"ACCESS:") + kw["access"]
del kw["access"]
if kw.get("bug_report", False):
description = (
description + "<br/><br/><b>BUG REPORT:</b><br/>" + kw["bug_report"]
description + "<br/><br/><b>%s</b><br/>" % _(u"BUG REPORT:") + kw["bug_report"]
)
del kw["bug_report"]
res.update({"description": description})

View File

@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-10-03 21:50+0000\n"
"PO-Revision-Date: 2024-10-03 21:50+0000\n"
"POT-Creation-Date: 2025-07-08 12:26+0000\n"
"PO-Revision-Date: 2025-07-08 12:26+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -42,17 +42,38 @@ msgstr ""
"<span class=\"col-md-7 col-sm-8\">Copier ici le message d'erreur complet (ex: code\n"
" d'erreur Odoo)</span>"
#. module: helpdesk_portal_ticket_enriched_description_form
#. odoo-python
#: code:addons/helpdesk_portal_ticket_enriched_description_form/controllers/main.py:0
#, python-format
msgid "ACCESS:"
msgstr "ACCÈS :"
#. module: helpdesk_portal_ticket_enriched_description_form
#: model_terms:ir.ui.view,arch_db:helpdesk_portal_ticket_enriched_description_form.helpdesk_create_ticket_description
msgid "Access"
msgstr "Accès"
#. module: helpdesk_portal_ticket_enriched_description_form
#. odoo-python
#: code:addons/helpdesk_portal_ticket_enriched_description_form/controllers/main.py:0
#, python-format
msgid "BUG REPORT:"
msgstr "RAPPORT DE BUG :"
#. module: helpdesk_portal_ticket_enriched_description_form
#: model_terms:ir.ui.view,arch_db:helpdesk_portal_ticket_enriched_description_form.helpdesk_create_ticket_description
msgid "Bug report"
msgstr "Rapport de bug"
#. module: helpdesk_portal_ticket_enriched_description_form
#. odoo-python
#: code:addons/helpdesk_portal_ticket_enriched_description_form/controllers/main.py:0
#, python-format
msgid "DESCRIPTION:"
msgstr "DESCRIPTION :"
#. module: helpdesk_portal_ticket_enriched_description_form
#: model_terms:ir.ui.view,arch_db:helpdesk_portal_ticket_enriched_description_form.helpdesk_create_ticket_description
msgid "Description"
msgstr ""
msgstr ""

View File

@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-10-03 21:44+0000\n"
"PO-Revision-Date: 2024-10-03 21:44+0000\n"
"POT-Creation-Date: 2025-07-08 12:29+0000\n"
"PO-Revision-Date: 2025-07-08 12:29+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -36,17 +36,38 @@ msgid ""
" code Odoo)</span>"
msgstr ""
#. module: helpdesk_portal_ticket_enriched_description_form
#. odoo-python
#: code:addons/helpdesk_portal_ticket_enriched_description_form/controllers/main.py:0
#, python-format
msgid "ACCESS:"
msgstr ""
#. module: helpdesk_portal_ticket_enriched_description_form
#: model_terms:ir.ui.view,arch_db:helpdesk_portal_ticket_enriched_description_form.helpdesk_create_ticket_description
msgid "Access"
msgstr ""
#. module: helpdesk_portal_ticket_enriched_description_form
#. odoo-python
#: code:addons/helpdesk_portal_ticket_enriched_description_form/controllers/main.py:0
#, python-format
msgid "BUG REPORT:"
msgstr ""
#. module: helpdesk_portal_ticket_enriched_description_form
#: model_terms:ir.ui.view,arch_db:helpdesk_portal_ticket_enriched_description_form.helpdesk_create_ticket_description
msgid "Bug report"
msgstr ""
#. module: helpdesk_portal_ticket_enriched_description_form
#. odoo-python
#: code:addons/helpdesk_portal_ticket_enriched_description_form/controllers/main.py:0
#, python-format
msgid "DESCRIPTION:"
msgstr ""
#. module: helpdesk_portal_ticket_enriched_description_form
#: model_terms:ir.ui.view,arch_db:helpdesk_portal_ticket_enriched_description_form.helpdesk_create_ticket_description
msgid "Description"
msgstr ""
msgstr ""

View File

@@ -3,7 +3,7 @@
{
"name": "helpdesk_portal_timesheet",
"version": "16.0.1.0.0",
"version": "16.0.1.0.1",
"author": "Elabore",
"website": "https://elabore.coop",
"maintainer": "Elabore",
@@ -12,7 +12,8 @@
"summary": "Show ticket timesheets in portal view",
# any module necessary for this one to work correctly
"depends": [
"helpdesk_mgmt_timesheet"
"helpdesk_mgmt_timesheet",
"sale_timesheet_line_exclude",
],
"qweb": [],
"external_dependencies": {
@@ -31,4 +32,4 @@
# and independently installed. Used for synergetic or glue modules.
"auto_install": False,
"application": False,
}
}

View File

@@ -4,30 +4,44 @@
<template id="portal_timesheet_table" name="Portal Timesheet Table">
<table class="o_portal_my_doc_table table table-sm">
<thead>
<tr>
<th>Date</th>
<th>Employee</th>
<th>Description</th>
<th t-if="is_uom_day" class="text-end">Days Spent</th>
<th t-else="" class="text-end">Hours Spent</th>
</tr>
<tr>
<th>Date</th>
<th>Employee</th>
<th>Description</th>
<th t-if="is_uom_day" class="text-end">Days Spent</th>
<th t-else="" class="text-end">Hours Spent</th>
</tr>
</thead>
<tr t-foreach="timesheets" t-as="timesheet">
<td><t t-esc="timesheet.date" t-options='{"widget": "date"}'/></td>
<td t-attf-title="#{timesheet.employee_id.name}"><t t-esc="timesheet.employee_id.name"/></td>
<td><t t-esc="timesheet.name"/></td>
<td class="text-end">
<span t-if="is_uom_day" t-esc="timesheet._get_timesheet_time_day()" t-options='{"widget": "timesheet_uom"}'/>
<span t-else="" t-field="timesheet.unit_amount" t-options='{"widget": "float_time"}'/>
</td>
<t t-if="not timesheet.exclude_from_sale_order">
<td>
<t t-esc="timesheet.date" t-options='{"widget": "date"}'/>
</td>
<td t-attf-title="#{timesheet.employee_id.name}">
<t t-esc="timesheet.employee_id.name"/>
</td>
<td>
<t t-esc="timesheet.name"/>
</td>
<td class="text-end">
<span t-if="is_uom_day" t-esc="timesheet._get_timesheet_time_day()" t-options='{"widget": "timesheet_uom"}'/>
<span t-else="" t-field="timesheet.unit_amount" t-options='{"widget": "float_time"}'/>
</td>
</t>
</tr>
<tfoot>
<tr>
<th colspan="3"></th>
<th class="text-end">
<t t-set="timesheets_amount" t-value="round(sum(timesheets.mapped('unit_amount')), 2) or 0.0"></t>
<div t-if="is_uom_day"><strong>Days Spent:</strong> <span t-esc="timesheets._convert_hours_to_days(timesheets_amount)" t-options='{"widget": "timesheet_uom"}'/></div>
<div t-else=""><strong>Hours Spent:</strong> <span t-esc="timesheets_amount" t-options='{"widget": "float_time"}'/></div>
<t t-set="timesheets_amount" t-value="round(sum(timesheets.filtered(lambda t: not t.exclude_from_sale_order).mapped('unit_amount')), 2) or 0.0"></t>
<div t-if="is_uom_day">
<strong>Days Spent:</strong>
<span t-esc="timesheets._convert_hours_to_days(timesheets_amount)" t-options='{"widget": "timesheet_uom"}'/>
</div>
<div t-else="">
<strong>Hours Spent:</strong>
<span t-esc="timesheets_amount" t-options='{"widget": "float_time"}'/>
</div>
</th>
</tr>
</tfoot>

View File

@@ -3,7 +3,7 @@
{
"name": "helpdesk_request_type",
"version": "16.0.1.0.0",
"version": "16.0.1.0.1",
"author": "Elabore",
"website": "https://elabore.coop",
"maintainer": "Stéphan Sainléger",

View File

@@ -0,0 +1,94 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * helpdesk_request_type
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-08 12:09+0000\n"
"PO-Revision-Date: 2025-07-08 12:09+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_request_type
#: model_terms:ir.ui.view,arch_db:helpdesk_request_type.portal_helpdesk_ticket_request_type
msgid "<strong>Request type:</strong>"
msgstr "<strong>Type de demande:</strong>"
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__create_uid
msgid "Created by"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__create_date
msgid "Created on"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__display_name
msgid "Display Name"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model,name:helpdesk_request_type.model_helpdesk_ticket
msgid "Helpdesk Ticket"
msgstr "Ticket d'assistance"
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__id
msgid "ID"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type____last_update
msgid "Last Modified on"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__write_uid
msgid "Last Updated by"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__write_date
msgid "Last Updated on"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model,name:helpdesk_request_type.model_helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_ticket__request_type_id
#: model_terms:ir.ui.view,arch_db:helpdesk_request_type.portal_create_ticket_request-type
msgid "Request Type"
msgstr "Type de demande"
#. module: helpdesk_request_type
#: model:ir.actions.act_window,name:helpdesk_request_type.act_helpdesk_request_types_list
#: model:ir.ui.menu,name:helpdesk_request_type.menu_helpdesk_request_types
#: model_terms:ir.ui.view,arch_db:helpdesk_request_type.helpdesk_request_type_view_tree
msgid "Request Types"
msgstr "Types de demande"
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__sequence
msgid "Sequence"
msgstr "Séquence"
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__name
msgid "name"
msgstr "nom"
#. module: helpdesk_mgmt
#: model_terms:ir.ui.view,arch_db:helpdesk_mgmt.portal_helpdesk_ticket_page
msgid ""
"<strong>Attachments:</strong>\n"
" <br/>"
msgstr ""
"<strong>Pièces jointes:</strong>\n"
" <br/>"

View File

@@ -0,0 +1,85 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * helpdesk_request_type
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-08 12:08+0000\n"
"PO-Revision-Date: 2025-07-08 12:08+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_request_type
#: model_terms:ir.ui.view,arch_db:helpdesk_request_type.portal_helpdesk_ticket_request_type
msgid "<strong>Request type:</strong>"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__create_uid
msgid "Created by"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__create_date
msgid "Created on"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__display_name
msgid "Display Name"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model,name:helpdesk_request_type.model_helpdesk_ticket
msgid "Helpdesk Ticket"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__id
msgid "ID"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type____last_update
msgid "Last Modified on"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__write_uid
msgid "Last Updated by"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__write_date
msgid "Last Updated on"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model,name:helpdesk_request_type.model_helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_ticket__request_type_id
#: model_terms:ir.ui.view,arch_db:helpdesk_request_type.portal_create_ticket_request-type
msgid "Request Type"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.actions.act_window,name:helpdesk_request_type.act_helpdesk_request_types_list
#: model:ir.ui.menu,name:helpdesk_request_type.menu_helpdesk_request_types
#: model_terms:ir.ui.view,arch_db:helpdesk_request_type.helpdesk_request_type_view_tree
msgid "Request Types"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__sequence
msgid "Sequence"
msgstr ""
#. module: helpdesk_request_type
#: model:ir.model.fields,field_description:helpdesk_request_type.field_helpdesk_request_type__name
msgid "name"
msgstr ""

View File

@@ -1,13 +1,13 @@
====================================
helpdesk_portal_ticket_custom
====================================
==========================================
helpdesk_timesheet_exclude_from_sale_order
==========================================
Customization for ticket portal view.
Add exclude_from_sale_order field in ticket's timesheets
# Installation
Use Odoo normal module installation procedure to install
`helpdesk_portal_ticket_custom`.
`helpdesk_timesheet_exclude_from_sale_order`.
# Known issues / Roadmap
@@ -24,7 +24,8 @@ detailed and welcomed feedback.
## Contributors
- Joris Scampucci
- Boris Gallet
- Laetitia Da Costa
## Funders
@@ -34,4 +35,4 @@ The development of this module has been financially supported by:
## Maintainer
This module is maintained by Elabore.
This module is maintained by Elabore.

View File

@@ -0,0 +1,16 @@
# Copyright 2025 Boris Gallet (Elabore)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "helpdesk_timesheet_exclude_from_sale_order",
"version": "16.0.1.0.0",
"summary": "Exclude tickets from sale timesheets",
"author": "Boris Gallet, Elabore Coop",
"website": "https://elabore.coop",
"license": "LGPL-3",
"category": "Helpdesk",
"depends": ["sale_timesheet_line_exclude","helpdesk_mgmt_timesheet"],
"data": ["views/helpdesk_ticket.xml"],
"installable": True,
"application": False,
"auto_install": False,
}

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="timesheet_helpdesk_ticket_view_form_exclude_from_sale_order" model="ir.ui.view">
<field name="name">timesheet.helpdesk.ticket.view.form.exclude.from.sale.order</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk_mgmt_timesheet.timesheet_helpdesk_ticket_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='unit_amount']" position="before">
<field name="exclude_from_sale_order" />
</xpath>
</field>
</record>
</odoo>