odoo 7d09762e6b Fix: Corregir dominio inválido en helpdesk_security.xml před 2 měsíci
..
controllers 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
data 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
i18n 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
migrations 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
models 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
scripts 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
security 7d09762e6b Fix: Corregir dominio inválido en helpdesk_security.xml před 2 měsíci
static 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
views 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
wizard 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
.gitignore 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
README.md 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
__init__.py 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci
__manifest__.py 3d7cb9f4a0 Merge commit 'd0020587d153b119e22bb62a5df860b3eab3a052' as 'helpdesk_extras' před 2 měsíci

README.md

Helpdesk Extras

Módulo de Odoo 18.0 que extiende las funcionalidades del módulo Helpdesk con características adicionales para compartir equipos con partners externos, gestión avanzada de tickets, sistema de templates y control de horas disponibles.

📋 Descripción

Este módulo proporciona funcionalidades adicionales para el módulo de Helpdesk de Odoo:

  • Compartir equipos de helpdesk con partners externos (usuarios portal)
  • Control de acceso granular por partner con tres niveles de permisos
  • Sistema de tipos de solicitud para categorizar tickets (Incidentes, Mejoras, etc.)
  • Campos extendidos en tickets para gestión avanzada (módulo afectado, impacto, autorización, etc.)
  • Sistema de templates para formularios web personalizables por equipo
  • Condiciones de visibilidad dinámicas en formularios web
  • Sistema de plantillas de flujo de trabajo (Workflow Templates) para configurar rápidamente etapas y políticas SLA
  • Widget de horas disponibles para el sitio web con barra de progreso
  • Estadísticas de horas en las vistas del backend
  • Bloqueo de formularios cuando no hay horas disponibles

🚀 Características Principales

1. Compartir Equipos con Partners Externos

Permite compartir equipos de helpdesk con partners externos (usuarios portal) mediante un asistente intuitivo. Los partners pueden acceder al portal y gestionar tickets según su nivel de acceso.

Características:

  • Asistente de compartir equipo (helpdesk.team.share.wizard)
  • Gestión de colaboradores desde la vista del equipo
  • Suscripción automática como seguidores del equipo
  • Envío de invitaciones por correo electrónico

2. Control de Acceso Granular

Tres niveles de acceso para los colaboradores:

Modo de Acceso Descripción
Administrator Puede ver todos los tickets y gestionar otros usuarios
User - All Tickets Puede ver todos los tickets y crear sus propios tickets
User - Own Tickets Solo puede crear y ver sus propios tickets

3. Sistema de Tipos de Solicitud

Modelo helpdesk.request.type para categorizar tickets con diferentes tipos (por ejemplo, "Incidente", "Mejora").

Características:

  • Campo code único para uso en lógica condicional
  • Campo is_billable_default para sugerir facturación automática
  • Gestión desde Helpdesk > Configuración > Tipos de Solicitud
  • Datos iniciales: "Incidente" (code: incident) y "Mejora" (code: improvement)

Uso:

  • Los tickets requieren un tipo de solicitud (por defecto: "Incidente")
  • El código del tipo se almacena en request_type_code para lógica condicional
  • Permite mostrar/ocultar campos según el tipo seleccionado

4. Campos Extendidos en Tickets

Extensión del modelo helpdesk.ticket con campos adicionales para gestión avanzada:

Campos principales:

  • request_type_id (Many2one, requerido): Tipo de solicitud (Incidente, Mejora, etc.)
  • request_type_code (Char, computed): Código del tipo para lógica condicional
  • affected_module_id (Many2one): Módulo de Odoo afectado (solo módulos instalados y aplicaciones)
  • business_impact (Selection): Impacto del negocio (Critical, High, Normal)
  • reproduce_steps (Html): Pasos para reproducir el problema (visible solo para "Incidente")
  • business_goal (Html): Objetivo de negocio (visible solo para "Mejora")
  • client_authorization (Boolean): Autorización del cliente desde formulario web
  • estimated_hours (Float): Horas estimadas después del análisis
  • approval_status (Selection): Estado de aprobación (N/A, Waiting, Approved, Rejected)
  • attachment_ids (One2many): Archivos adjuntos al ticket (múltiples archivos permitidos)

Visibilidad condicional:

  • reproduce_steps: Solo visible cuando request_type_code == 'incident'
  • business_goal: Solo visible cuando request_type_code == 'improvement'

Organización en vista:

  • Todos los campos custom se muestran en la pestaña "Extras" del formulario de tickets
  • Los campos están organizados en grupos:
    • Request Information: Tipo de solicitud, módulo afectado, impacto
    • Details: Pasos de reproducción y objetivo de negocio (con visibilidad condicional)
    • Approval & Billing: Autorización, horas estimadas, estado de aprobación
    • Attachments: Campo para adjuntar múltiples archivos con widget many2many_binary
    • Template Information: Información sobre el template activo (si aplica)

5. Sistema de Templates para Formularios Web

Sistema flexible de templates que permite personalizar los formularios web de creación de tickets por equipo.

Modelos:

  • helpdesk.template: Define un template con nombre, descripción y campos
  • helpdesk.template.field: Campos incluidos en el template con configuración individual

Características del template:

  • Campos personalizables: Solo campos del modelo helpdesk.ticket disponibles en form builder
  • Orden configurable: Campo sequence para definir el orden de visualización
  • Obligatoriedad adicional: Campo required para hacer campos obligatorios además de su configuración base
  • Protección de campos obligatorios: Los campos marcados como required=True en el modelo no pueden ser eliminados del template (model_required=True)
  • Propiedades editables de campos (igual que el form builder nativo):
    • label_custom: Etiqueta personalizada del campo
    • placeholder: Texto de marcador de posición
    • default_value: Valor predeterminado
    • help_text: Texto de ayuda (soporta HTML)
    • widget: Widget para campos de selección (radio, checkbox, etc.)
    • selection_options: Opciones personalizadas para campos selection no relacionales
  • Condiciones de visibilidad dinámicas:
    • Campo de dependencia (visibility_dependency): Campo del que depende la visibilidad
    • Comparador (visibility_comparator): Operador de comparación (equal, !equal, contains, !contains, set, !set, greater, less, etc.)
    • Valor de condición (visibility_condition): Valor a comparar
    • Soporte dinámico para many2one: Cuando la dependencia es many2one, muestra un selector dinámico con registros del modelo relacionado
    • Soporte dinámico para selection: Cuando la dependencia es selection, muestra las opciones disponibles del campo

Integración con equipos:

  • Campo template_id en helpdesk.team (opcional)
  • Cuando un equipo tiene template asignado:
    • Los campos del template se muestran en el formulario web cuando se crea un ticket
    • El formulario web se regenera automáticamente con solo los campos del template
    • Los campos hardcodeados que no están en el template se ocultan automáticamente

Regeneración automática:

  • Al asignar/quitar template en un equipo
  • Al modificar campos del template (agregar, eliminar, cambiar secuencia, requerido, visibilidad)
  • Al activar/desactivar template
  • Al crear un equipo con template ya asignado

Gestión:

  • Menú: Helpdesk > Configuración > Plantillas
  • Vistas: Lista y formulario para templates y campos de template

6. Widget de Horas Disponibles

Snippet para el sitio web que muestra información sobre horas de soporte disponibles:

  • Horas prepago restantes: Horas disponibles de pedidos prepago pagados
  • Crédito disponible: Horas calculadas a partir del crédito disponible del partner
  • Barra de progreso: Visualización del porcentaje de horas usadas vs disponibles
  • Estados dinámicos: Muestra mensajes cuando no hay horas disponibles
  • Enlaces de contacto: Integración con WhatsApp y correo electrónico

Ubicación en el editor: Sección "Content" → "Helpdesk Hours Available"

7. Estadísticas de Horas en Backend

Muestra estadísticas agregadas de horas en las vistas del equipo:

  • Vista Kanban: Barra de progreso con porcentaje de horas usadas
  • Vista Form: Campos calculados con totales de horas disponibles y usadas
  • Cálculo automático: Agrega horas de todos los colaboradores del equipo

8. Sistema de Plantillas de Flujo de Trabajo (Workflow Templates)

Sistema que permite crear plantillas predefinidas de etapas y políticas SLA para aplicar rápidamente a equipos de helpdesk.

Características:

  • Plantillas reutilizables: Define una vez y aplica a múltiples equipos
  • Etapas predefinidas: Configura etapas con nombres, secuencias, y propiedades (fold, leyendas, etc.)
  • Políticas SLA predefinidas: Define políticas SLA con tiempos, prioridades, y etapas excluidas
  • Aplicación con un clic: Wizard intuitivo para aplicar plantillas a equipos
  • Reemplazo opcional: Opción para reemplazar etapas y SLAs existentes
  • Plantillas predefinidas: Incluye 3 plantillas listas para usar:
    • Soporte Básico: 3 etapas (Nuevo, En Progreso, Resuelto) con SLAs básicos
    • Soporte Premium: 4 etapas (incluye En Espera) con SLAs más rápidos y etapas excluidas
    • Desarrollo: 5 etapas (Nuevo, Análisis, En Progreso, Pruebas, Completado) con SLAs por prioridad

Modelos:

  • helpdesk.workflow.template: Plantilla principal con etapas y SLAs
  • helpdesk.workflow.template.stage: Etapas dentro de una plantilla
  • helpdesk.workflow.template.sla: Políticas SLA dentro de una plantilla

Gestión:

  • Menú: Helpdesk > Configuración > Plantillas de Flujo de Trabajo
  • Vistas: Kanban, Lista y Formulario para plantillas
  • Vista integrada en equipos: Campo workflow_template_id y botón "Aplicar Plantilla"

Uso:

  1. Crea o selecciona una plantilla de flujo de trabajo
  2. Configura etapas y políticas SLA en la plantilla
  3. En el equipo, selecciona la plantilla y haz clic en "Aplicar Plantilla"
  4. El sistema crea automáticamente las etapas y SLAs reales basados en la plantilla

Características avanzadas:

  • Etapas excluidas en SLAs: Configura etapas donde el tiempo NO cuenta hacia el plazo del SLA (útil para "En Espera")
  • Duplicación de plantillas: Duplica plantillas completas con todas sus etapas y SLAs
  • Traducciones: Plantillas disponibles en español (MX) e inglés (US)
  • Vista Kanban optimizada: Vista Kanban simplificada siguiendo mejores prácticas de Odoo 18

9. Bloqueo de Formularios

Bloquea automáticamente el formulario de creación de tickets cuando:

  • El equipo tiene colaboradores configurados
  • El usuario no tiene horas disponibles

Muestra un mensaje informativo con opciones de contacto para adquirir más horas.

📦 Dependencias

El módulo requiere los siguientes módulos de Odoo:

  • helpdesk - Módulo base de Helpdesk
  • website - Funcionalidades de sitio web
  • website_helpdesk - Helpdesk en el sitio web
  • sale - Módulo de ventas (para horas prepago)
  • account - Módulo de contabilidad (para verificación de pagos)

Módulos opcionales:

  • sale_timesheet - Si está instalado, mejora el cálculo de horas de servicio

🔧 Instalación

  1. Asegúrate de tener los módulos dependientes instalados
  2. Copia el módulo en src/user/helpdesk_extras
  3. Actualiza la lista de aplicaciones en Odoo
  4. Instala el módulo "Helpdesk Extras"

    # Desde el directorio workspace
    ./odoo_dev.sh restart
    # Luego en Odoo: Apps > Actualizar lista de aplicaciones > Buscar "Helpdesk Extras" > Instalar
    

📖 Uso

Compartir un Equipo con Partners

  1. Ve a Helpdesk > Configuración > Equipos
  2. Abre el equipo que deseas compartir
  3. Haz clic en el botón "Share Team" (o en el botón de estadísticas "Collaborators")
  4. En el asistente:
    • Agrega partners desde el campo de búsqueda
    • Selecciona el modo de acceso para cada colaborador
    • Opcionalmente, marca "Send Invitation" para enviar correo
  5. Haz clic en "Share"

Configurar Tipos de Solicitud

  1. Ve a Helpdesk > Configuración > Tipos de Solicitud
  2. Crea o edita tipos según necesites
  3. Configura el código único (por ejemplo, incident, improvement)
  4. Marca is_billable_default si este tipo debe sugerir facturación automática

Tipos predefinidos:

  • Incidente (code: incident): Para reportar problemas
  • Mejora (code: improvement, billable: True): Para solicitar mejoras

Crear y Configurar Templates

  1. Ve a Helpdesk > Configuración > Plantillas
  2. Crea un nuevo template:
    • Ingresa nombre y descripción
    • Activa el template
  3. Agrega campos al template:
    • Selecciona campos del modelo helpdesk.ticket
    • Define el orden (sequence)
    • Marca como requerido si es necesario
    • Configura condiciones de visibilidad si aplica:
      • Campo de dependencia (ej: request_type_id)
      • Comparador (ej: equal)
      • Valor de condición (ej: incident)

Ejemplo de template "Soporte Técnico":

  • Campo: request_type_id (sequence: 10, required: True)
  • Campo: affected_module_id (sequence: 20, required: True)
  • Campo: business_impact (sequence: 30)
  • Campo: reproduce_steps (sequence: 40, visibility: request_type_id == 'incident')

Asignar Template a un Equipo

  1. Ve a Helpdesk > Configuración > Equipos
  2. Abre el equipo que deseas configurar
  3. En el campo "Template", selecciona un template
  4. Guarda el equipo
  5. El formulario web se regenerará automáticamente con los campos del template

Nota: Si el equipo ya tiene un formulario web activo (use_website_helpdesk_form = True), la regeneración ocurre inmediatamente. Si no, se generará cuando se active el formulario web.

Agregar el Widget de Horas al Sitio Web

  1. Ve a Website > Editar
  2. En el editor, busca el snippet "Helpdesk Hours Available" en la sección "Content"
  3. Arrastra el snippet a la página
  4. El widget mostrará automáticamente las horas del usuario autenticado

Nota: El widget solo muestra información para usuarios portal autenticados que sean colaboradores de algún equipo.

Configurar Parámetros del Sistema

El módulo utiliza los siguientes parámetros de configuración (opcionales):

  • helpdesk_extras.whatsapp_number: Número de WhatsApp para contacto (formato: sin espacios ni caracteres especiales)
  • helpdesk_extras.packages_url: URL de la página de paquetes (por defecto: /shop)

Configuración:

  1. Ve a Configuración > Técnico > Parámetros > Parámetros del Sistema
  2. Crea o edita los parámetros según necesites

🏗️ Estructura del Módulo

helpdesk_extras/
├── __init__.py
├── __manifest__.py
├── README.md
├── controllers/
│   ├── __init__.py
│   ├── helpdesk_portal.py          # Extiende portal de helpdesk
│   ├── website_form.py              # Maneja formularios web
│   └── website_helpdesk_hours.py    # API JSON para horas disponibles
├── data/
│   ├── helpdesk_request_type_data.xml  # Datos iniciales de tipos
│   ├── helpdesk_form_data.xml         # Whitelist de campos para form builder
│   └── helpdesk_workflow_template_data.xml # Plantillas predefinidas de flujo de trabajo
├── models/
│   ├── __init__.py
│   ├── helpdesk_team.py             # Extiende helpdesk.team (templates, colaboradores)
│   ├── helpdesk_team_collaborator.py # Modelo de colaboradores
│   ├── helpdesk_ticket.py           # Extiende helpdesk.ticket (campos adicionales)
│   ├── helpdesk_request_type.py     # Modelo de tipos de solicitud
│   ├── helpdesk_template.py        # Modelos de templates (template y template.field)
│   ├── helpdesk_workflow_template.py # Modelo de plantillas de flujo de trabajo
│   ├── helpdesk_workflow_template_stage.py # Modelo de etapas en plantillas
│   └── helpdesk_workflow_template_sla.py # Modelo de políticas SLA en plantillas
├── security/
│   ├── helpdesk_security.xml        # Reglas de acceso
│   └── ir.model.access.csv          # Permisos CRUD
├── static/
│   └── src/
│       ├── js/
│       │   ├── website_helpdesk_form_block.js              # Bloqueo de formularios
│       │   ├── helpdesk_template_field_list.js             # Lista de campos template (oculta botón eliminar para model_required)
│       │   └── helpdesk_template_field_m2o_widget.js       # Widget dinámico many2one para condiciones de visibilidad
│       ├── xml/
│       │   ├── helpdesk_template_field_list.xml            # Template para lista de campos template
│       │   └── helpdesk_template_field_m2o_widget.xml      # Template para widget many2one dinámico
│       └── snippets/
│           └── s_helpdesk_hours/
│               ├── 000.js            # Lógica del snippet
│               └── 000.scss          # Estilos del snippet
├── views/
│   ├── helpdesk_request_type_views.xml  # Vistas de tipos de solicitud
│   ├── helpdesk_template_views.xml      # Vistas de templates
│   ├── helpdesk_workflow_template_views.xml # Vistas de plantillas de flujo de trabajo
│   ├── helpdesk_team_views.xml          # Vistas del equipo
│   ├── helpdesk_ticket_views.xml        # Vistas de tickets (pestaña Extras)
│   ├── helpdesk_portal_templates.xml    # Templates del portal
│   ├── website_helpdesk_form.xml         # Herencia del formulario web
│   └── snippets/
│       ├── s_helpdesk_hours.xml         # Template del snippet
│       └── snippets.xml
├── i18n/
│   ├── es_MX.po                        # Traducciones español (México)
│   └── en_US.po                        # Traducciones inglés (US)
└── wizard/
    ├── __init__.py
    ├── helpdesk_team_share_wizard.py              # Wizard principal
    ├── helpdesk_team_share_collaborator_wizard.py # Líneas del wizard
    ├── helpdesk_team_share_wizard_views.xml       # Vistas del wizard
    ├── helpdesk_workflow_template_apply_wizard.py # Wizard para aplicar plantillas
    └── helpdesk_workflow_template_apply_wizard_views.xml # Vistas del wizard de aplicar

🔍 Modelos

helpdesk.request.type

Modelo para categorizar tipos de solicitudes de tickets.

Campos:

  • name (Char, required, translate): Nombre del tipo (ej: "Incidente", "Mejora")
  • code (Char, required, unique): Código interno único para lógica (ej: incident, improvement)
  • is_billable_default (Boolean): Si True, sugiere facturación automática al crear tickets
  • active (Boolean, default=True): Si está activo y disponible

Restricciones:

  • code debe ser único (_sql_constraints)

helpdesk.template

Modelo para definir templates de formularios web.

Campos:

  • name (Char, required, translate): Nombre del template
  • description (Text, translate): Descripción del template
  • active (Boolean, default=True): Si está activo
  • field_ids (One2many): Campos incluidos en el template

Comportamiento:

  • Al modificar field_ids o active, regenera automáticamente formularios en todos los equipos que usan el template

helpdesk.template.field

Modelo para campos incluidos en un template.

Campos:

  • template_id (Many2one, required): Template al que pertenece
  • field_id (Many2one, required): Campo de helpdesk.ticket (solo campos disponibles en form builder)
  • field_name (Char, related): Nombre del campo (readonly)
  • field_type (Selection, related): Tipo del campo (readonly)
  • sequence (Integer, default=10): Orden de visualización
  • required (Boolean, default=False): Hacer obligatorio además de configuración base
  • model_required (Boolean, readonly): Indica si el campo es obligatorio a nivel de modelo (no se puede eliminar)
  • label_custom (Char): Etiqueta personalizada del campo
  • placeholder (Char): Texto de marcador de posición
  • default_value (Char): Valor predeterminado
  • help_text (Html): Texto de ayuda (soporta HTML)
  • widget (Selection): Widget para campos de selección (radio, checkbox, etc.)
  • selection_options (Text): Opciones personalizadas para campos selection no relacionales
  • visibility_dependency (Many2one): Campo del que depende la visibilidad
  • visibility_dependency_type (Char, computed): Tipo del campo de dependencia (many2one, selection, char, etc.)
  • visibility_comparator (Selection): Operador de comparación (equal, !equal, contains, !contains, set, !set, greater, less, etc.)
  • visibility_condition (Char): Valor a comparar (texto libre o sincronizado desde campos dinámicos)
  • visibility_condition_m2o_id (Integer): ID del registro many2one cuando la dependencia es many2one
  • visibility_condition_m2o_model (Char, related): Modelo del registro many2one (readonly)
  • visibility_condition_selection (Selection, dynamic): Opción seleccionada cuando la dependencia es selection

Restricciones:

  • Un campo solo puede estar una vez en un template (unique(template_id, field_id))
  • Los campos con model_required=True no pueden ser eliminados del template

Comportamiento:

  • Al crear/modificar/eliminar, regenera automáticamente formularios en equipos que usan el template padre
  • Al crear un template, se agregan automáticamente los campos obligatorios del modelo (name, partner_name, partner_email, description)
  • Los campos obligatorios del modelo (required=True en ir.model.fields y no website_form_blacklisted) se marcan automáticamente como model_required=True
  • Al cambiar visibility_dependency, se limpian los valores de condición relacionados
  • Los valores de visibility_condition_m2o_id y visibility_condition_selection se sincronizan automáticamente con visibility_condition

helpdesk.team.collaborator

Modelo que relaciona partners con equipos de helpdesk.

Campos:

  • team_id (Many2one): Equipo de helpdesk
  • partner_id (Many2one): Partner colaborador
  • partner_email (Char, related): Email del partner
  • access_mode (Selection): Modo de acceso (admin, user_all, user_own)

helpdesk.team (extendido)

Extiende el modelo base con:

Campos:

  • collaborator_ids (One2many): Lista de colaboradores
  • template_id (Many2one): Template asignado al equipo (opcional)
  • workflow_template_id (Many2one): Plantilla de flujo de trabajo asignada (opcional)
  • hours_total_available (Float, computed): Total de horas disponibles
  • hours_total_used (Float, computed): Total de horas usadas
  • hours_percentage_used (Float, computed): Porcentaje de horas usadas
  • has_hours_stats (Boolean, computed): Indica si hay estadísticas disponibles

Métodos:

  • _compute_hours_stats(): Calcula estadísticas de horas agregadas
  • _check_helpdesk_team_sharing_access(): Verifica acceso del usuario
  • _get_new_collaborators(): Obtiene partners que pueden ser agregados
  • _add_collaborators(): Agrega colaboradores al equipo
  • action_open_share_team_wizard(): Abre el wizard de compartir
  • _is_order_paid(): Verifica si un pedido tiene facturas pagadas
  • _regenerate_form_from_template(): Regenera el XML del formulario web basado en el template usando ir.ui.view.save() para formato nativo
  • _restore_default_form(): Restaura el formulario por defecto cuando se quita el template
  • _build_template_field_html(): Construye el HTML de un campo del template (replica form builder nativo) con todas las propiedades editables
  • _ensure_submit_form_view(): Asegura que el formulario se regenere si hay template después de crear la vista
  • apply_workflow_template(): Aplica una plantilla de flujo de trabajo creando etapas y SLAs reales

helpdesk.ticket (extendido)

Extiende el modelo base con:

Campos:

  • request_type_id (Many2one, required): Tipo de solicitud
  • request_type_code (Char, computed, store): Código del tipo para lógica condicional
  • affected_module_id (Many2one): Módulo afectado (solo instalados y aplicaciones)
  • business_impact (Selection): Impacto (Critical, High, Normal)
  • reproduce_steps (Html): Pasos para reproducir (visible solo si request_type_code == 'incident')
  • business_goal (Html): Objetivo de negocio (visible solo si request_type_code == 'improvement')
  • client_authorization (Boolean): Autorización del cliente
  • estimated_hours (Float): Horas estimadas
  • approval_status (Selection): Estado de aprobación
  • attachment_ids (One2many): Archivos adjuntos al ticket (múltiples archivos permitidos)
  • has_template (Boolean, computed): Indica si el equipo tiene template asignado

Métodos:

  • _default_request_type_id(): Valor por defecto (tipo "Incidente")
  • _compute_has_template(): Calcula si el equipo tiene template
  • _get_template_fields(): Obtiene campos del template del equipo

🌐 Controladores y APIs

/helpdesk/hours/available (JSON, auth="user")

Retorna información de horas disponibles para el usuario autenticado.

Respuesta:

{
  "total_available": 25.0,
  "hours_used": 10.0,
  "prepaid_hours": 15.0,
  "credit_hours": 10.0,
  "credit_available": 500.0,
  "highest_price": 50.0,
  "whatsapp_number": "1234567890",
  "email": "support@example.com",
  "packages_url": "/shop"
}

/helpdesk/form/check_block (JSON, auth="public")

Verifica si el formulario de tickets debe ser bloqueado.

Parámetros:

  • team_id (int): ID del equipo de helpdesk

Respuesta:

{
  "should_block": true,
  "has_collaborators": true,
  "has_hours": false,
  "message": "No tienes horas disponibles..."
}

🔐 Seguridad

Reglas de Acceso

helpdesk.request.type:

  • Usuarios Internos: Lectura (1,0,0,0)
  • Gestores Helpdesk: Acceso completo (1,1,1,1)
  • Usuarios Portal/Público: Lectura (1,0,0,0) - Necesario para dropdowns en formulario web

helpdesk.template y helpdesk.template.field:

  • Usuarios Internos: Lectura (1,0,0,0)
  • Gestores Helpdesk: Acceso completo (1,1,1,1)

helpdesk.team.collaborator:

  • Usuarios Helpdesk: Pueden leer, escribir, crear y eliminar colaboradores
  • Gestores Helpdesk: Acceso completo a colaboradores
  • Usuarios Portal: Solo lectura de colaboradores (para verificar su acceso)

Nota sobre ir.module.module:

  • Los usuarios Portal NO tienen acceso directo a ir.module.module por seguridad
  • El controlador website_form.py usa sudo() para leer módulos instalados cuando es necesario
  • No se otorgan permisos de lectura a usuarios públicos en el CSV

Reglas de Registro

El módulo incluye reglas de seguridad en security/helpdesk_security.xml que controlan el acceso a tickets basado en el modo de acceso del colaborador.

🎨 Personalización

Personalizar el Widget de Horas

El snippet utiliza clases CSS específicas que pueden ser personalizadas:

  • .s_helpdesk_hours: Contenedor principal
  • .s_helpdesk_hours_progress_bar: Barra de progreso
  • .s_helpdesk_hours_normal_content: Contenido normal
  • .s_helpdesk_hours_no_hours: Mensaje sin horas
  • .s_helpdesk_hours_loading: Estado de carga
  • .s_helpdesk_hours_error: Mensaje de error

Personalizar Mensajes

Los mensajes pueden ser personalizados editando:

  • controllers/website_helpdesk_hours.py: Mensajes del API
  • static/src/js/website_helpdesk_form_block.js: Mensajes de bloqueo
  • views/snippets/s_helpdesk_hours.xml: Template del snippet

Personalizar Templates de Formularios

Los templates permiten personalizar completamente los formularios web:

  1. Crear template: Helpdesk > Configuración > Plantillas
  2. Seleccionar campos: Solo campos de helpdesk.ticket disponibles en form builder
  3. Configurar orden: Campo sequence
  4. Configurar visibilidad: Dependencias y condiciones
  5. Asignar a equipo: El formulario se regenera automáticamente

Nota técnica: El sistema replica exactamente el comportamiento del form builder nativo de Odoo, generando XML dinámicamente usando lxml.etree y guardándolo en ir.ui.view.arch del website_form_view_id del equipo.

🐛 Troubleshooting

El widget no muestra horas

  1. Verifica que el usuario sea un colaborador de algún equipo
  2. Verifica que haya pedidos prepago con facturas pagadas
  3. Revisa los logs del servidor para errores
  4. Verifica que el módulo sale esté instalado

El formulario no se bloquea

  1. Verifica que el equipo tenga colaboradores configurados
  2. Verifica que el JavaScript esté cargando correctamente
  3. Revisa la consola del navegador para errores
  4. Verifica que el team_id esté disponible en el formulario

Las estadísticas no se calculan

  1. Verifica que haya colaboradores en el equipo
  2. Verifica que los colaboradores tengan pedidos prepago
  3. Verifica que las facturas estén pagadas
  4. Revisa los logs para errores en el cálculo

Los campos del template no aparecen en el formulario web

  1. Verifica que el equipo tenga un template asignado
  2. Verifica que el template esté activo
  3. Verifica que el equipo tenga use_website_helpdesk_form = True
  4. Verifica que el equipo tenga website_form_view_id configurado
  5. Revisa los logs para errores en _regenerate_form_from_template()
  6. Ejecuta regeneración manual desde shell de Odoo:

    team = env['helpdesk.team'].browse(TEAM_ID)
    team._regenerate_form_from_template()
    env.cr.commit()
    

Los campos hardcodeados aparecen junto con los del template

  1. Verifica que la condición t-if en website_helpdesk_form.xml esté funcionando
  2. Verifica que _regenerate_form_from_template() esté eliminando campos hardcodeados correctamente
  3. Revisa el XML generado en team.website_form_view_id.arch
  4. Limpia caché del navegador y recarga la página

Las condiciones de visibilidad no funcionan

  1. Verifica que el campo de dependencia esté correctamente configurado
  2. Verifica que el comparador y valor de condición sean correctos
  3. Revisa que el JavaScript website_helpdesk_template_fields.js esté cargando
  4. Verifica que los atributos data-visibility-* estén presentes en el HTML generado
  5. Para campos many2one, verifica que visibility_condition_m2o_id tenga un valor válido
  6. Para campos selection, verifica que visibility_condition_selection tenga un valor válido

El campo many2one en condiciones de visibilidad muestra "Sin nombre"

  1. Verifica que el widget dynamic_many2one esté cargando correctamente
  2. Revisa la consola del navegador para errores de JavaScript
  3. Verifica que visibility_condition_m2o_model tenga el modelo correcto
  4. Verifica que visibility_condition_m2o_id tenga un ID válido del modelo correcto
  5. Limpia la caché del navegador y recarga la página

📝 Notas Técnicas

Cálculo de Horas

El módulo calcula horas disponibles basándose en:

  1. Horas Prepago: Líneas de pedido de venta con:

    • Estado: sale o done
    • Producto tipo servicio con política ordered_prepaid
    • remaining_hours > 0
    • Facturas del pedido pagadas (payment_state = 'paid')
  2. Horas de Crédito: Calculadas a partir de:

    • Crédito disponible del partner (credit_limit - credit)
    • Precio unitario más alto de horas prepago
    • Solo si account_use_credit_limit está habilitado
  3. Horas Usadas: Calculadas desde:

    • qty_delivered de líneas de pedido prepago
    • Convertidas a horas usando UoM

Verificación de Pagos

El método _is_order_paid() verifica que un pedido tenga al menos una factura:

  • Con estado posted
  • Con payment_state = 'paid'

Esto asegura que solo se consideren horas de pedidos realmente pagados.

Sistema de Templates - Generación de XML

El sistema de templates genera XML dinámicamente replicando el comportamiento del form builder nativo de Odoo:

  1. Base limpia: Usa el arch del template base website_helpdesk.ticket_submit_form
  2. Eliminación de campos hardcodeados: Remueve todos los campos custom que no están en el template activo
  3. Inserción de campos del template: Agrega campos según sequence, con todas las propiedades editables
  4. Estructura nativa: Replica exactamente la estructura HTML/CSS del form builder (clases, IDs, atributos)
  5. Guardado nativo: Usa ir.ui.view.save() para guardar el XML con formato nativo de Odoo

Características técnicas:

  • Usa lxml.etree y lxml.html para parsing y construcción de HTML/XML
  • Usa ir.ui.view.save() para guardar con formato nativo (igual que el form builder)
  • IDs dinámicos: helpdesk_{hash(field_name) % 10000} (similar a form builder)
  • Soporte para todos los tipos de campo: char, text, html, integer, float, boolean, selection, many2one
  • Opciones de selection pobladas desde model._fields[field_name].selection o selection_options personalizado
  • Propiedades editables: placeholder, default_value, help_text, widget, selection_options
  • Visibilidad condicional usando clases s_website_form_field_hidden_if d-none y atributos data-visibility-*
  • Soporte dinámico para condiciones many2one y selection con widgets personalizados

Regeneración Automática

La regeneración de formularios se dispara automáticamente en:

  • helpdesk.team.create(): Si template está asignado al crear
  • helpdesk.team.write(): Si template_id cambia
  • helpdesk.team._ensure_submit_form_view(): Después de crear vista inicial
  • helpdesk.template.write(): Si field_ids o active cambian
  • helpdesk.template.field.create(): Al agregar campo
  • helpdesk.template.field.write(): Al modificar campo (sequence, required, visibilidad)
  • helpdesk.template.field.unlink(): Al eliminar campo

Esto asegura que los formularios siempre estén sincronizados con la configuración del template.

👥 Autor

M22 Tech

📄 Licencia

Este módulo está licenciado bajo LGPL-3.

🔄 Changelog

18.0.1.0.3

  • Sistema de Plantillas de Flujo de Trabajo (Workflow Templates): Nuevo sistema para crear y aplicar plantillas predefinidas de etapas y políticas SLA
    • Modelos: helpdesk.workflow.template, helpdesk.workflow.template.stage, helpdesk.workflow.template.sla
    • Wizard de aplicación con opción de reemplazar etapas/SLAs existentes
    • 3 plantillas predefinidas: Soporte Básico, Soporte Premium, Desarrollo
    • Soporte para etapas excluidas en políticas SLA (el tiempo no cuenta hacia el plazo)
    • Duplicación de plantillas con todas sus etapas y SLAs
    • Traducciones completas en español (MX) e inglés (US)
    • Vista Kanban optimizada siguiendo mejores prácticas de Odoo 18
    • Integración en vista de equipos con campo y botón de aplicación

18.0.1.0.2

  • Campo de archivos múltiples: Agregado campo attachment_ids (One2many) para adjuntar múltiples archivos a tickets
  • Reorganización de vista: Todos los campos custom del modelo se muestran en la pestaña "Extras" del formulario de tickets
  • Widget de archivos: Campo de archivos usa widget many2many_binary nativo de Odoo para gestión de adjuntos
  • Organización mejorada: Campos organizados en grupos lógicos (Request Information, Details, Approval & Billing, Attachments)

18.0.1.0.1

  • Propiedades editables de campos en templates: Agregado soporte para label_custom, placeholder, default_value, help_text, widget, y selection_options (igual que form builder nativo)
  • Protección de campos obligatorios: Los campos required=True a nivel de modelo no pueden ser eliminados del template (model_required=True)
  • Condiciones de visibilidad mejoradas:
    • Soporte dinámico para campos many2one con widget personalizado que cambia el modelo según la dependencia
    • Soporte dinámico para campos selection con opciones del campo de dependencia
    • Widget DynamicMany2OneField para manejar many2one con modelo dinámico
  • Mejoras en generación de formularios: Uso de ir.ui.view.save() para formato nativo de Odoo
  • Campos automáticos en templates: Los campos obligatorios del modelo se agregan automáticamente al crear un template
  • Pestaña "Fields" por defecto: La pestaña de campos es la primera al abrir un template
  • Widget JavaScript personalizado: HelpdeskTemplateFieldListRenderer para ocultar botón eliminar en campos model_required

18.0.1.0.0

  • Versión inicial
  • Compartir equipos con partners externos
  • Widget de horas disponibles
  • Estadísticas de horas en backend
  • Bloqueo de formularios
  • Sistema de tipos de solicitud (helpdesk.request.type)
  • Campos extendidos en tickets (módulo afectado, impacto, pasos de reproducción, etc.)
  • Sistema de templates para formularios web personalizables
  • Condiciones de visibilidad dinámicas en formularios
  • Regeneración automática de formularios basada en templates
  • Integración completa con form builder nativo de Odoo