Skip to content

Desarrollo de plugins con paquetes OPM

En esta sección, aprenderás a crear, instalar y distribuir tus propios plugins como paquetes OPM para OTOBO.


1. Estructura de un .sopm

El archivo SOPM (*.sopm) contiene todos los metadatos de tu paquete:

xml
<?xml version="1.0" encoding="utf-8"?>
<otobo_package version="1.0">
  <Name>MyExtension</Name>
  <Version>1.0.0</Version>
  <Framework>10.0.x</Framework>   <!-- Versión mínima de OTOBO -->
  <Vendor>TuNombre GmbH</Vendor>
  <URL>https://github.com/tu-usuario/otobo-mipackage</URL>
  <License>GPL-3.0</License>
  <Description Lang="es">Extensión para funciones especiales</Description>
  <ChangeLog Version="1.0.0" Date="13.06.2025 12:00:00">Publicación inicial</ChangeLog>
  <Filelist>
    <File Location="Kernel/Config/Files/XML/MyExtension.xml" Permission="644"></File>
    <File Location="Kernel/System/MyExtension.pm"            Permission="644"></File>
    <File Location="Kernel/Modules/AgentMyPage.pm"           Permission="644"></File>
    <File Location="Kernel/Output/HTML/Standard/AgentMyPage.tt" Permission="644"></File>
    <File Location="Kernel/Language/es_MyExtension.pm"       Permission="644"></File>
  </Filelist>
</otobo_package>
  • Name/Version/Framework: Identificación única del paquete y versión compatible de OTOBO.
  • Filelist: Todos los archivos que se copian durante la instalación.

2. Archivos y estructura de directorios

Crea tu paquete en un directorio propio, por ejemplo, MyExtension/:

MyExtension/
├─ MyExtension.sopm
├─ Kernel/
│  ├─ Config/Files/XML/MyExtension.xml
│  ├─ System/MyExtension.pm
│  ├─ Modules/AgentMyPage.pm
│  ├─ Output/HTML/Standard/AgentMyPage.tt
│  └─ Language/es_MyExtension.pm
└─ sql/
   └─ create_tables.sql      # opcional, para migraciones de base de datos
  • Kernel/Config/Files/XML/: Registra módulos, menús o campos dinámicos.
  • Kernel/System/: Clase de lógica de negocio.
  • Kernel/Modules/: Controlador de frontend.
  • Plantillas y lenguaje: Archivos TT + archivos de traducción.pm.

3. Compilación e instalación del paquete

3.1 Crear OPM

Utiliza la herramienta de línea de comandos para crear un OPM a partir de tu SOPM:

bash
cd /ruta/a/MyExtension
bin/otobo.Console.pl Dev::Package::Build \
  --sopm-file MyExtension.sopm \
  --output /tmp/MyExtension.opm

3.2 Instalación

Interfaz de administración: Carga el paquete en Admin → Configuración → Administración de paquetes. Consola:

bash
bin/otobo.Console.pl Admin::Package::Install /tmp/MyExtension.opm

Para desinstalar o actualizar:

bash
bin/otobo.Console.pl Admin::Package::Uninstall /tmp/MyExtension.opm
bin/otobo.Console.pl Admin::Package::Upgrade   /tmp/MyExtension.opm

4. Puntos de extensión

4.1 Campos dinámicos

En Kernel/Config/Files/XML/MyExtension.xml, registra un nuevo controlador de campo dinámico:

xml
<Setting Name="DynamicFields::Driver###MyCustomField" Required="0" Valid="1">
  <Navigation>DynamicFields::Driver</Navigation>
  <Value>
    <Array>
      <Item><Hash>
        <Item Key="DriverName">MyCustomField</Item>
        <Item Key="Module">Kernel::System::DynamicField::Driver::MyCustomField</Item>
      </Hash></Item>
    </Array>
  </Value>
</Setting>

Implementa el controlador en Kernel/System/DynamicField/Driver/MyCustomField.pm.

4.2 Controladores de eventos

Registra tu controlador de eventos:

xml
<Setting Name="Event::EventHandler###MyHandler" Required="0" Valid="1">
  <Navigation>Event::EventHandler</Navigation>
  <Value>
    <Array>
      <Item><Hash>
        <Item Key="Module">Kernel::System::Event::Handler::MyHandler</Item>
      </Hash></Item>
    </Array>
  </Value>
</Setting>

Implementa el controlador en Kernel/System/Event/Handler/MyHandler.pm (método Run()).

4.3 Filtros de salida

xml
<Setting Name="Output::Filter###MyFilter" Required="0" Valid="1">
  <Navigation>Output::Filter</Navigation>
  <Value>
    <Array>
      <Item><Hash>
        <Item Key="Module">Kernel::System::Output::Filter::MyFilter</Item>
      </Hash></Item>
    </Array>
  </Value>
</Setting>

Implementa el filtro en Kernel/System/Output/Filter/MyFilter.pm.


5. Implementación y OTOpar

  • Índice de repositorio: Crea Packages.xml para tu propio repositorio:

    bash
    bin/otobo.Console.pl Dev::Package::RepositoryIndex \
      --directory /var/www/otobo-packages
  • Agrega la URL de tu repositorio en SysConfig Package::RepositoryList.

  • OTOpar: Carga tu OPM en https://otopar.perl-services.de para que otros puedan instalarlo directamente.


6. Ejemplo: Paquete MyCalendar

  1. SOPM crea con nombre MyCalendar.
  2. Script de base de datos sql/create_calendar.sql para la tabla calendar_events.
  3. Configuración XML define un nuevo campo de ticket "Fecha".
  4. Módulo principal Kernel/System/CalendarEvent.pm con métodos CRUD.
  5. Módulo de frontend Kernel/Modules/AgentCalendar.pm, plantilla AgentCalendar.tt.
  6. Compila el paquete y carga en OTOpar.

7. Consejos y mejores prácticas

  • Número de versión en sopm actualiza (SemVer).
  • Migraciones de base de datos en sql/ versiona de forma limpia.
  • Pruebas unitarias para clases de sistema y módulos.
  • Documentación en README y POD en módulos Perl.
  • Traducciones en Language/es_*.pm y en_*.pm.

Con esto, tienes una base sólida para desarrollar, distribuir y mantener plugins de OTOBO en proyectos de clientes. ¡Disfruta!