|
|
2 hónapja | |
|---|---|---|
| .. | ||
| controllers | 2 hónapja | |
| data | 2 hónapja | |
| i18n | 2 hónapja | |
| migrations | 2 hónapja | |
| models | 2 hónapja | |
| scripts | 2 hónapja | |
| security | 2 hónapja | |
| static | 2 hónapja | |
| views | 2 hónapja | |
| wizard | 2 hónapja | |
| .gitignore | 2 hónapja | |
| README.md | 2 hónapja | |
| __init__.py | 2 hónapja | |
| __manifest__.py | 2 hónapja | |
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.
Este módulo proporciona funcionalidades adicionales para el módulo de Helpdesk de Odoo:
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:
helpdesk.team.share.wizard)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 |
Modelo helpdesk.request.type para categorizar tickets con diferentes tipos (por ejemplo, "Incidente", "Mejora").
Características:
code único para uso en lógica condicionalis_billable_default para sugerir facturación automáticaincident) y "Mejora" (code: improvement)Uso:
request_type_code para lógica condicionalExtensió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 condicionalaffected_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 webestimated_hours (Float): Horas estimadas después del análisisapproval_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:
many2many_binarySistema 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 camposhelpdesk.template.field: Campos incluidos en el template con configuración individualCaracterísticas del template:
helpdesk.ticket disponibles en form buildersequence para definir el orden de visualizaciónrequired para hacer campos obligatorios además de su configuración baserequired=True en el modelo no pueden ser eliminados del template (model_required=True)label_custom: Etiqueta personalizada del campoplaceholder: Texto de marcador de posicióndefault_value: Valor predeterminadohelp_text: Texto de ayuda (soporta HTML)widget: Widget para campos de selección (radio, checkbox, etc.)selection_options: Opciones personalizadas para campos selection no relacionalesvisibility_dependency): Campo del que depende la visibilidadvisibility_comparator): Operador de comparación (equal, !equal, contains, !contains, set, !set, greater, less, etc.)visibility_condition): Valor a compararIntegración con equipos:
template_id en helpdesk.team (opcional)Regeneración automática:
Gestión:
Snippet para el sitio web que muestra información sobre horas de soporte disponibles:
Ubicación en el editor: Sección "Content" → "Helpdesk Hours Available"
Muestra estadísticas agregadas de horas en las vistas del equipo:
Sistema que permite crear plantillas predefinidas de etapas y políticas SLA para aplicar rápidamente a equipos de helpdesk.
Características:
Modelos:
helpdesk.workflow.template: Plantilla principal con etapas y SLAshelpdesk.workflow.template.stage: Etapas dentro de una plantillahelpdesk.workflow.template.sla: Políticas SLA dentro de una plantillaGestión:
workflow_template_id y botón "Aplicar Plantilla"Uso:
Características avanzadas:
Bloquea automáticamente el formulario de creación de tickets cuando:
Muestra un mensaje informativo con opciones de contacto para adquirir más horas.
El módulo requiere los siguientes módulos de Odoo:
helpdesk - Módulo base de Helpdeskwebsite - Funcionalidades de sitio webwebsite_helpdesk - Helpdesk en el sitio websale - 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 serviciosrc/user/helpdesk_extrasInstala 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
incident, improvement)is_billable_default si este tipo debe sugerir facturación automáticaTipos predefinidos:
incident): Para reportar problemasimprovement, billable: True): Para solicitar mejorashelpdesk.ticketrequest_type_id)equal)incident)Ejemplo de template "Soporte Técnico":
request_type_id (sequence: 10, required: True)affected_module_id (sequence: 20, required: True)business_impact (sequence: 30)reproduce_steps (sequence: 40, visibility: request_type_id == 'incident')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.
Nota: El widget solo muestra información para usuarios portal autenticados que sean colaboradores de algún equipo.
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:
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
helpdesk.request.typeModelo 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 ticketsactive (Boolean, default=True): Si está activo y disponibleRestricciones:
code debe ser único (_sql_constraints)helpdesk.templateModelo para definir templates de formularios web.
Campos:
name (Char, required, translate): Nombre del templatedescription (Text, translate): Descripción del templateactive (Boolean, default=True): Si está activofield_ids (One2many): Campos incluidos en el templateComportamiento:
field_ids o active, regenera automáticamente formularios en todos los equipos que usan el templatehelpdesk.template.fieldModelo para campos incluidos en un template.
Campos:
template_id (Many2one, required): Template al que pertenecefield_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ónrequired (Boolean, default=False): Hacer obligatorio además de configuración basemodel_required (Boolean, readonly): Indica si el campo es obligatorio a nivel de modelo (no se puede eliminar)label_custom (Char): Etiqueta personalizada del campoplaceholder (Char): Texto de marcador de posicióndefault_value (Char): Valor predeterminadohelp_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 relacionalesvisibility_dependency (Many2one): Campo del que depende la visibilidadvisibility_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 many2onevisibility_condition_m2o_model (Char, related): Modelo del registro many2one (readonly)visibility_condition_selection (Selection, dynamic): Opción seleccionada cuando la dependencia es selectionRestricciones:
unique(template_id, field_id))model_required=True no pueden ser eliminados del templateComportamiento:
name, partner_name, partner_email, description)required=True en ir.model.fields y no website_form_blacklisted) se marcan automáticamente como model_required=Truevisibility_dependency, se limpian los valores de condición relacionadosvisibility_condition_m2o_id y visibility_condition_selection se sincronizan automáticamente con visibility_conditionhelpdesk.team.collaboratorModelo que relaciona partners con equipos de helpdesk.
Campos:
team_id (Many2one): Equipo de helpdeskpartner_id (Many2one): Partner colaboradorpartner_email (Char, related): Email del partneraccess_mode (Selection): Modo de acceso (admin, user_all, user_own)helpdesk.team (extendido)Extiende el modelo base con:
Campos:
collaborator_ids (One2many): Lista de colaboradorestemplate_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 disponibleshours_total_used (Float, computed): Total de horas usadashours_percentage_used (Float, computed): Porcentaje de horas usadashas_hours_stats (Boolean, computed): Indica si hay estadísticas disponiblesMé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 equipoaction_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 vistaapply_workflow_template(): Aplica una plantilla de flujo de trabajo creando etapas y SLAs realeshelpdesk.ticket (extendido)Extiende el modelo base con:
Campos:
request_type_id (Many2one, required): Tipo de solicitudrequest_type_code (Char, computed, store): Código del tipo para lógica condicionalaffected_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 clienteestimated_hours (Float): Horas estimadasapproval_status (Selection): Estado de aprobaciónattachment_ids (One2many): Archivos adjuntos al ticket (múltiples archivos permitidos)has_template (Boolean, computed): Indica si el equipo tiene template asignadoMé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/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 helpdeskRespuesta:
{
"should_block": true,
"has_collaborators": true,
"has_hours": false,
"message": "No tienes horas disponibles..."
}
helpdesk.request.type:
helpdesk.template y helpdesk.template.field:
helpdesk.team.collaborator:
Nota sobre ir.module.module:
ir.module.module por seguridadwebsite_form.py usa sudo() para leer módulos instalados cuando es necesarioEl 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.
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 errorLos mensajes pueden ser personalizados editando:
controllers/website_helpdesk_hours.py: Mensajes del APIstatic/src/js/website_helpdesk_form_block.js: Mensajes de bloqueoviews/snippets/s_helpdesk_hours.xml: Template del snippetLos templates permiten personalizar completamente los formularios web:
helpdesk.ticket disponibles en form buildersequenceNota 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.
sale esté instaladoteam_id esté disponible en el formulariouse_website_helpdesk_form = Truewebsite_form_view_id configurado_regenerate_form_from_template()Ejecuta regeneración manual desde shell de Odoo:
team = env['helpdesk.team'].browse(TEAM_ID)
team._regenerate_form_from_template()
env.cr.commit()
t-if en website_helpdesk_form.xml esté funcionando_regenerate_form_from_template() esté eliminando campos hardcodeados correctamenteteam.website_form_view_id.archwebsite_helpdesk_template_fields.js esté cargandodata-visibility-* estén presentes en el HTML generadovisibility_condition_m2o_id tenga un valor válidovisibility_condition_selection tenga un valor válidodynamic_many2one esté cargando correctamentevisibility_condition_m2o_model tenga el modelo correctovisibility_condition_m2o_id tenga un ID válido del modelo correctoEl módulo calcula horas disponibles basándose en:
Horas Prepago: Líneas de pedido de venta con:
sale o doneordered_prepaidremaining_hours > 0payment_state = 'paid')Horas de Crédito: Calculadas a partir de:
credit_limit - credit)account_use_credit_limit está habilitadoHoras Usadas: Calculadas desde:
qty_delivered de líneas de pedido prepagoEl método _is_order_paid() verifica que un pedido tenga al menos una factura:
postedpayment_state = 'paid'Esto asegura que solo se consideren horas de pedidos realmente pagados.
El sistema de templates genera XML dinámicamente replicando el comportamiento del form builder nativo de Odoo:
arch del template base website_helpdesk.ticket_submit_formsequence, con todas las propiedades editablesir.ui.view.save() para guardar el XML con formato nativo de OdooCaracterísticas técnicas:
lxml.etree y lxml.html para parsing y construcción de HTML/XMLir.ui.view.save() para guardar con formato nativo (igual que el form builder)helpdesk_{hash(field_name) % 10000} (similar a form builder)model._fields[field_name].selection o selection_options personalizadoplaceholder, default_value, help_text, widget, selection_optionss_website_form_field_hidden_if d-none y atributos data-visibility-*La regeneración de formularios se dispara automáticamente en:
helpdesk.team.create(): Si template está asignado al crearhelpdesk.team.write(): Si template_id cambiahelpdesk.team._ensure_submit_form_view(): Después de crear vista inicialhelpdesk.template.write(): Si field_ids o active cambianhelpdesk.template.field.create(): Al agregar campohelpdesk.template.field.write(): Al modificar campo (sequence, required, visibilidad)helpdesk.template.field.unlink(): Al eliminar campoEsto asegura que los formularios siempre estén sincronizados con la configuración del template.
M22 Tech
Este módulo está licenciado bajo LGPL-3.
helpdesk.workflow.template, helpdesk.workflow.template.stage, helpdesk.workflow.template.slaattachment_ids (One2many) para adjuntar múltiples archivos a ticketsmany2many_binary nativo de Odoo para gestión de adjuntoslabel_custom, placeholder, default_value, help_text, widget, y selection_options (igual que form builder nativo)required=True a nivel de modelo no pueden ser eliminados del template (model_required=True)DynamicMany2OneField para manejar many2one con modelo dinámicoir.ui.view.save() para formato nativo de OdooHelpdeskTemplateFieldListRenderer para ocultar botón eliminar en campos model_requiredhelpdesk.request.type)