Metadata-Version: 2.1
Name: odoo-addon-helpdesk_mgmt_project_domain
Version: 16.0.1.0.0.4
Summary: Enable to set a project domain on ticket
Home-page: https://github.com/OCA/helpdesk
Author: Escodoo,Odoo Community Association (OCA)
Author-email: support@odoo-community.org
License: AGPL-3
Classifier: Programming Language :: Python
Classifier: Framework :: Odoo
Classifier: Framework :: Odoo :: 16.0
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
Requires-Python: >=3.10
Requires-Dist: odoo-addon-helpdesk-mgmt-project<16.1dev,>=16.0dev
Requires-Dist: odoo<16.1dev,>=16.0a

.. image:: https://odoo-community.org/readme-banner-image
   :target: https://odoo-community.org/get-involved?utm_source=readme
   :alt: Odoo Community Association

============================
Helpdesk Mgmt Project Domain
============================

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

.. |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/license-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%2Fhelpdesk-lightgray.png?logo=github
    :target: https://github.com/OCA/helpdesk/tree/16.0/helpdesk_mgmt_project_domain
    :alt: OCA/helpdesk
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
    :target: https://translation.odoo-community.org/projects/helpdesk-16-0/helpdesk-16-0-helpdesk_mgmt_project_domain
    :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/helpdesk&target_branch=16.0
    :alt: Try me on Runboat

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

This module allows you to configure domains to filter projects and tasks
available for selection in helpdesk tickets. It provides both static
domain configuration and dynamic Python-based filtering for enhanced
flexibility.

**Table of contents**

.. contents::
   :local:

Use Cases / Context
===================

This module allows you to configure domains to filter projects and tasks
available for selection in helpdesk tickets, reducing errors and
improving efficiency.

Key Benefits
------------

- **Automated Filtering:** Configure domains to show only relevant
  projects and tasks for each team
- **Error Reduction:** Minimize manual selection errors by limiting
  available options
- **Smart Task Filtering:** Tasks are automatically filtered by the
  selected project
- **Flexible Configuration:** Use static domains or dynamic Python code
  for complex rules

Main Use Cases
--------------

Project Filtering
~~~~~~~~~~~~~~~~~

- Show only active projects
- Filter by client/partner
- Separate internal from external projects
- Filter by project tags or categories

Task Filtering
~~~~~~~~~~~~~~

- Show only tasks from selected project
- Filter by assignment status (assigned/unassigned)
- Filter by priority or urgency
- Filter by task tags or phases

Advanced Rules
~~~~~~~~~~~~~~

- Use Python code for dynamic filtering based on ticket data
- Combine multiple conditions with AND/OR operators
- Apply different rules for different teams

Configuration
=============

To configure this module, you need to:

1. Configure global project and task domains at company level.
2. Configure team-specific project and task domains.
3. Set up Python-based dynamic domains (optional).

Global Configuration (Company)
------------------------------

1. Go to **Settings > Helpdesk** to configure the global project and
   task domains.
2. In the "Project & Task Domain Configuration" section, set the
   **Project Domain** field using the visual domain builder.
3. Set the **Task Domain** field using the visual domain builder.
4. These domains will be applied to all teams that don't have their own
   domains configured.
5. You can also Activate or Deactivate the global domains.

Team Configuration
------------------

1. Go to **Helpdesk > Configuration > Teams** to configure team-specific
   domains.
2. Edit or create a team.
3. In the **Project Domain** tab:

   - Set the **Project Domain** field using the visual domain builder.
   - Configure the **Project Domain Python Code** field for dynamic
     domains (optional).

4. In the **Task Domain** tab:

   - Set the **Task Domain** field using the visual domain builder.
   - Configure the **Task Domain Python Code** field for dynamic domains
     (optional).

5. Team domains will be combined with the company domain using AND
   logic.

Domain Builder Usage
--------------------

Both "Project Domain" and "Task Domain" fields use a visual builder that
allows:

1. **Click on the field** to open the domain builder.
2. **Select the field** from the Project/Task model (e.g., Active,
   Partner, Type, User).
3. **Choose the operator** (e.g., =, !=, >, <, in, not in).
4. **Define the value** (e.g., True, False, partner name, user name).
5. **Add more conditions** with AND/OR logic.
6. **Save** the domain configuration.

Domain Examples
---------------

Project Domain Examples
~~~~~~~~~~~~~~~~~~~~~~~

Only Active Projects
^^^^^^^^^^^^^^^^^^^^

- Field: Active
- Operator: =
- Value: True
- Domain: ``[('active', '=', True)]``

Projects with Partner
^^^^^^^^^^^^^^^^^^^^^

- Field: Partner
- Operator: !=
- Value: False
- Domain: ``[('partner_id', '!=', False)]``

Projects from Specific Client
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Field: Partner
- Operator: =
- Value: [Client Name]
- Domain: ``[('partner_id', '=', 123)]`` (where 123 is the client ID)

Projects by Tags (Internal Projects)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Field: Tags
- Operator: in
- Value: [Internal]
- Domain: ``[('tag_ids', 'in', [4])]`` (where 4 is the tag ID)

Projects by Tags (External Projects)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Field: Tags
- Operator: in
- Value: [External]
- Domain: ``[('tag_ids', 'in', [5])]`` (where 5 is the tag ID)

Mixed Project Tags (Internal OR External)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Field: Tags
- Operator: in
- Value: [Internal, External]
- Domain: ``['|', ('tag_ids', 'in', [4]), ('tag_ids', 'in', [5])]``

Task Domain Examples
~~~~~~~~~~~~~~~~~~~~

Only Active Tasks
^^^^^^^^^^^^^^^^^

- Field: Active
- Operator: =
- Value: True
- Domain: ``[('active', '=', True)]``

Tasks by Tags (Development)
^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Field: Tags
- Operator: in
- Value: [Development]
- Domain: ``[('tag_ids', 'in', [1])]`` (where 1 is the tag ID)

Tasks by Tags (Testing)
^^^^^^^^^^^^^^^^^^^^^^^

- Field: Tags
- Operator: in
- Value: [Testing]
- Domain: ``[('tag_ids', 'in', [2])]`` (where 2 is the tag ID)

Mixed Task Tags (Development OR Testing)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Field: Tags
- Operator: in
- Value: [Development, Testing]
- Domain: ``['|', ('tag_ids', 'in', [1]), ('tag_ids', 'in', [2])]``

Unassigned Tasks
^^^^^^^^^^^^^^^^

- Field: User
- Operator: =
- Value: False
- Domain: ``[('user_ids', '=', False)]``

Tasks Assigned to Specific User
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Field: User
- Operator: in
- Value: [User Name]
- Domain: ``[('user_ids', 'in', [123])]`` (where 123 is the user ID)

Tasks with High Priority
^^^^^^^^^^^^^^^^^^^^^^^^

- Field: Priority
- Operator: =
- Value: 1
- Domain: ``[('priority', '=', '1')]``

Python Domain Code
------------------

For advanced users, you can use Python code to create dynamic domains:

1. Go to the team configuration.
2. Edit the **Project Domain Python Code** or **Task Domain Python
   Code** field.
3. Write Python code that returns a domain list.
4. Available variables: ticket, env, user, company, AND, OR, normalize.

Example Python Code
~~~~~~~~~~~~~~~~~~~

Project Domain Example - Client Projects Team
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: python

   # Filter projects based on ticket partner (from demo data)
   if ticket.partner_id:
       domain = [('commercial_partner_id', '=', ticket.commercial_partner_id.id)]
   else:
       domain = [('id', '=', 0)]  # No projects if no partner

Task Domain Example - Unassigned Tasks
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: python

   # Filter tasks not assigned to anyone (from demo data)
   domain = [('user_ids', '=', False)]

Task Domain Example - Project-based Filtering
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: python

   # Filter tasks based on ticket project
   if ticket.project_id:
       domain = [('project_id', '=', ticket.project_id.id)]
   else:
       domain = [('id', '=', 0)]  # No tasks if no project selected

Task Domain Example - Mixed Tags
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: python

   # Filter tasks by development or testing tags (from demo data)
   domain = ['|', ('tag_ids', 'in', [1]), ('tag_ids', 'in', [2])]

Task Domain Example - Priority and Assignment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: python

   # Filter high priority tasks assigned to specific users
   if ticket.partner_id:
       domain = AND([
           [('priority', '=', '1')],  # High priority
           [('user_ids', '!=', False)]  # Assigned tasks
       ])
   else:
       domain = [('priority', '=', '1')]  # High priority only

Domain Combination Logic
------------------------

All domains are combined using AND logic:

For Projects:
~~~~~~~~~~~~~

1. **Company global project domain** (base filter for all teams).
2. **Team static project domain** (always combined with company domain).
3. **Team Python project code** (always combined with company + team
   domains).

For Tasks:
~~~~~~~~~~

1. **Company global task domain** (base filter for all teams).
2. **Team static task domain** (always combined with company domain).
3. **Team Python task code** (always combined with company + team
   domains).

The final project domain will be: Company Project Domain AND Team
Project Domain AND Python Project Domain.

The final task domain will be: Company Task Domain AND Team Task Domain
AND Python Task Domain.

Permissions
-----------

There are no specific permissions required for this module. The domain
filtering respects the user's existing project access permissions set in
the system.

Troubleshooting
---------------

If domains are not working as expected:

1. Check that the domain syntax is correct.
2. Verify that the Python code (if used) has no syntax errors.
3. Ensure that the fields referenced in domains exist in the Project
   model.
4. Check the Odoo logs for any domain evaluation errors.

Usage
=====

How It Works
------------

Project Filtering
~~~~~~~~~~~~~~~~~

1. **Ticket Creation**: When a ticket is created, the system checks:

   - If the team has a configured project domain
   - If not, uses the company's global project domain
   - If no domain is configured, all projects remain available

2. **Ticket Editing**: The project domain is automatically applied to
   the "Project" field of the ticket

3. **Validation**: If the project domain is invalid, the system ignores
   it and shows all projects

Task Filtering
~~~~~~~~~~~~~~

1. **Project Selection**: When a project is selected in a ticket:

   - The system applies the configured task domain
   - Tasks are automatically filtered by the selected project
   - Only tasks belonging to the selected project are shown

2. **Dynamic Filtering**: Task filtering is updated when:

   - The project field changes
   - The team changes
   - Other relevant ticket fields change

3. **Smart Filtering**: The system ensures tasks are always relevant to
   the selected project, preventing selection of tasks from other
   projects

Domain Application
~~~~~~~~~~~~~~~~~~

- **Static Domains**: Applied immediately when fields change
- **Python Domains**: Evaluated dynamically based on current ticket data
- **Combination Logic**: All applicable domains are combined using AND
  logic
- **Fallback Behavior**: If any domain fails, the system gracefully
  falls back to showing all available options

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

Bugs are tracked on `GitHub Issues <https://github.com/OCA/helpdesk/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/helpdesk/issues/new?body=module:%20helpdesk_mgmt_project_domain%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
-------

* Escodoo

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

- `Escodoo <https://escodoo.com.br>`__:

  - Marcel Savegnago marcel.savegnago@escodoo.com.br

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.

.. |maintainer-marcelsavegnago| image:: https://github.com/marcelsavegnago.png?size=40px
    :target: https://github.com/marcelsavegnago
    :alt: marcelsavegnago

Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-marcelsavegnago| 

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

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
