Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions setup/shopfloor_reception_helpdesk/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
6 changes: 6 additions & 0 deletions setup/shopfloor_reception_helpdesk_mobile/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
78 changes: 78 additions & 0 deletions shopfloor_reception_helpdesk/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
============================
Shopfloor Reception Helpdesk
============================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:95ca35958dc1759c81813ab6346c438756ab14f791a1fcdc258df16ca85f4d30
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fwms-lightgray.png?logo=github
:target: https://github.com/OCA/wms/tree/16.0/shopfloor_reception_helpdesk
:alt: OCA/wms
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/wms-16-0/wms-16-0-shopfloor_reception_helpdesk
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/wms&target_branch=16.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows to present services for shopfloor reception helpdesk
tickets declarations.

**Table of contents**

.. contents::
:local:

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/wms/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/wms/issues/new?body=module:%20shopfloor_reception_helpdesk%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* ACSONE SA/NV

Contributors
------------

- Denis Roussel denis.roussel@acsone.eu
- Nicolas Delbovier nicolas.delbovier@acsone.eu

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/wms <https://github.com/OCA/wms/tree/16.0/shopfloor_reception_helpdesk>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
3 changes: 3 additions & 0 deletions shopfloor_reception_helpdesk/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import services
from . import actions
from . import wizards
12 changes: 12 additions & 0 deletions shopfloor_reception_helpdesk/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Copyright 2025 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

{
"name": "Shopfloor Reception Helpdesk",
"summary": """This module allows to create helpdesk tickets in reception scenarios""",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "ACSONE SA/NV,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/wms",
"depends": ["shopfloor_reception", "helpdesk_mgmt_stock", "helpdesk_motive"],
}
3 changes: 3 additions & 0 deletions shopfloor_reception_helpdesk/actions/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import messages
from . import data
from . import schema
33 changes: 33 additions & 0 deletions shopfloor_reception_helpdesk/actions/data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright 2025 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.addons.component.core import Component
from odoo.addons.shopfloor_base.utils import ensure_model


class DataAction(Component):

_inherit = "shopfloor.data.action"

def _get_picking_parser(self, record, **kw):
parser = super()._get_picking_parser(record, **kw)
if record.picking_type_id.allow_helpdesk_ticket:
parser.append("helpdesk_ticket_allowed")
return parser

@ensure_model("stock.helpdesk.ticket.create")
def helpdesk_wizard(self, record, **kw):
parser = self._helpdesk_wizard_parser
data = self._jsonify(record, parser, **kw)
return data

@property
def _helpdesk_wizard_parser(self):
return [
"id",
"description",
("motive_id:motive", self._helpdesk_motive_parser),
]

@property
def _helpdesk_motive_parser(self):
return ["id", "name"]
18 changes: 18 additions & 0 deletions shopfloor_reception_helpdesk/actions/messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Copyright 2025 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _

from odoo.addons.component.core import Component


class MessageAction(Component):
_inherit = "shopfloor.message.action"

def helpdesk_ticket_created(self, ticket):
return {
"message_type": "success",
"body": _(
"Helpdesk ticket (%(ticket_name)s) created!",
ticket_name=ticket.display_name,
),
}
30 changes: 30 additions & 0 deletions shopfloor_reception_helpdesk/actions/schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Copyright 2025 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.addons.component.core import Component


class ShopfloorSchemaAction(Component):
_inherit = "shopfloor.schema.action"

def picking(self):
schema = super().picking()
schema.update(
{"helpdesk_ticket_allowed": {"required": False, "type": "boolean"}}
)
return schema

def helpdesk_wizard(self):
return {
"id": {"required": True, "type": "integer"},
"description": {
"type": "string",
"nullable": True,
},
"motive": self._schema_dict_of(self.helpdesk_motive(), required=False),
}

def helpdesk_motive(self):
return {
"id": {"required": True, "type": "integer"},
"name": {"type": "string", "nullable": False, "required": True},
}
2 changes: 2 additions & 0 deletions shopfloor_reception_helpdesk/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Denis Roussel <denis.roussel@acsone.eu>
- Nicolas Delbovier <nicolas.delbovier@acsone.eu>
2 changes: 2 additions & 0 deletions shopfloor_reception_helpdesk/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
This module allows to present services for shopfloor reception helpdesk
tickets declarations.
1 change: 1 addition & 0 deletions shopfloor_reception_helpdesk/services/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import reception
182 changes: 182 additions & 0 deletions shopfloor_reception_helpdesk/services/reception.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# Copyright 2025 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.addons.base_rest.components.service import to_int
from odoo.addons.component.core import Component
from odoo.addons.helpdesk_mgmt_stock.wizards.stock_helpdesk_ticket_create import (
StockHelpdeskTicketCreate,
)
from odoo.addons.stock.models.stock_move_line import StockMoveLine
from odoo.addons.stock.models.stock_picking import Picking


class Reception(Component):
_inherit = "shopfloor.reception"

def start_helpdesk(self, picking_id: int, selected_line_id: int):
"""
Endpoint to start to fill in Helpdesk details
"""
picking = self.env["stock.picking"].browse(picking_id).exists()
line = self.env["stock.move.line"].browse(selected_line_id).exists()
# Create wizard in order to keep information through screens
wizard = self._create_helpdesk_wizard(picking, line)
return self._response(
next_state="start_helpdesk",
data={
"selected_move_line": self._data_for_move_lines(line),
"picking": self.data.picking(picking),
"helpdesk_wizard": self.data.helpdesk_wizard(wizard),
"available_motives": self._get_available_motives(picking),
},
)

def create_helpdesk(
self,
picking_id: int,
selected_line_id: int,
helpdesk_wizard_id: int,
description: str,
motive_id: int,
):
"""
Endpoint to create the helpdesk ticket
"""
picking = self.env["stock.picking"].browse(picking_id).exists()
line = self.env["stock.move.line"].browse(selected_line_id).exists()

wizard = (
self.env["stock.helpdesk.ticket.create"].browse(helpdesk_wizard_id).exists()
)
wizard.write(
{
"description": description,
"motive_id": motive_id,
}
)

ticket = self._create_helpdesk(picking, line, wizard)
message = {}
if ticket:
message = self.msg_store.helpdesk_ticket_created(ticket)
return self._response(
next_state="set_destination",
data={
"selected_move_line": self._data_for_move_lines(line),
"picking": self.data.picking(picking),
},
message=message,
)

def _prepare_ticket_wizard_values(self, picking: Picking, line: StockMoveLine):
return {}

def _create_helpdesk_wizard(self, picking: Picking, line: StockMoveLine):
wizard = (
self.env["stock.helpdesk.ticket.create"]
.with_context(active_model="stock.move", active_id=line.move_id.id)
.create(self._prepare_ticket_wizard_values(picking, line))
)
return wizard

def _create_helpdesk(
self,
picking: Picking,
line: StockMoveLine,
wizard: StockHelpdeskTicketCreate,
**kwargs,
):
tickets_before = line.move_id.helpdesk_ticket_ids
wizard.action_create_helpdesk_ticket()
ticket = line.move_id.helpdesk_ticket_ids - tickets_before
return ticket

def _get_available_motives(self, picking: Picking) -> list[dict]:
default_helpdesk_team = picking.picking_type_id.default_helpdesk_team_id
return self.env["helpdesk.ticket.motive"].search_read(
[("team_id", "in", default_helpdesk_team.ids + [False])], ["id", "name"]
)


class ShopfloorReceptionValidator(Component):
_inherit = "shopfloor.reception.validator"

def start_helpdesk(self):
return {
"picking_id": {"coerce": to_int, "required": True, "type": "integer"},
"selected_line_id": {
"coerce": to_int,
"type": "integer",
"required": True,
},
}

def create_helpdesk(self):
return {
"picking_id": {"coerce": to_int, "required": True, "type": "integer"},
"selected_line_id": {
"coerce": to_int,
"type": "integer",
"required": True,
},
"helpdesk_wizard_id": {
"coerce": to_int,
"type": "integer",
"required": True,
},
"description": {"type": "string", "required": True},
"motive_id": {"coerce": to_int, "type": "integer", "required": False},
}


class ShopfloorReceptionValidatorResponse(Component):
_inherit = "shopfloor.reception.validator.response"

def _states(self):
states = super()._states()
states.update(
{
"start_helpdesk": self._schema_start_helpdesk,
"create_helpdesk": self._schema_create_helpdesk,
}
)
return states

@property
def _schema_start_helpdesk(self):
return {
"selected_move_line": {
"type": "list",
"schema": {"type": "dict", "schema": self.schemas.move_line()},
},
"picking": {"type": "dict", "schema": self.schemas.picking()},
"helpdesk_wizard": {
"type": "dict",
"schema": self.schemas.helpdesk_wizard(),
},
"available_motives": {
"type": "list",
"schema": {"type": "dict", "schema": self.schemas.helpdesk_motive()},
},
}

@property
def _schema_create_helpdesk(self):
return {
"selected_move_line": {
"type": "list",
"schema": {"type": "dict", "schema": self.schemas.move_line()},
},
"picking": {"type": "dict", "schema": self.schemas.picking()},
}

def _create_helpdesk_next_states(self):
return {"set_destination", "select_move"}

def _start_helpdesk_next_states(self):
return {"start_helpdesk"}

def start_helpdesk(self):
return self._response_schema(next_states=self._start_helpdesk_next_states())

def create_helpdesk(self):
return self._response_schema(next_states=self._create_helpdesk_next_states())
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading