Ir al contenido

Migraciones y tablas

El campo migration del PluginContext permite a un plugin extender el modelo de datos del ERP. Ambos métodos son idempotentes: se ejecutan en cada arranque del servidor (y en cada hot reload) sin duplicar campos ni tablas.

Añade un campo a una tabla core del ERP:

await migration.addCustomField({
pluginId: 'mi-plugin', // id del plugin propietario del campo
tableName: 'BusinessPartner', // tabla core (CoreTableName) — PascalCase
fieldName: 'loyalty_points',
type: 'INTEGER', // TEXT | INTEGER | DECIMAL | BOOLEAN | JSONB
label: 'Puntos de fidelidad', // etiqueta visible en la UI
});

Tipos de campo disponibles: TEXT, INTEGER, DECIMAL, BOOLEAN, JSONB.

El campo aparece automáticamente en los formularios de la entidad, y su valor viaja en customFields / pluginData de los documentos — ver Custom fields (API REST) y FactuAPI.

Crea una tabla propia del plugin en el schema del tenant:

await migration.createTable({
pluginId: 'mi-plugin',
tableName: 'mi_plugin_movimientos',
columns: [
{ name: 'id', type: 'UUID', primaryKey: true },
{ name: 'partner_id', type: 'UUID' },
{ name: 'invoice_id', type: 'UUID', nullable: true },
{ name: 'points', type: 'INTEGER' },
{ name: 'reason', type: 'TEXT' },
{ name: 'created_at', type: 'TIMESTAMP', default: 'now()' },
],
});

Tipos de columna: TEXT, INTEGER, DECIMAL, BOOLEAN, JSONB, UUID, TIMESTAMP (dos más que addCustomField). Flags por columna: primaryKey, nullable, default.

Para leer y escribir en la tabla usa db.forTenant(tenantId) — ver PluginContext § db.

addCustomField autocompleta estas 35 tablas (acepta también cualquier string):

Documentos:

Venta SalesInvoice, SalesOrder, SalesDeliveryNote
Compra PurchaseInvoice, PurchaseOrder, PurchaseDeliveryNote
Líneas de venta SalesInvoiceLine, SalesOrderLine, SalesDeliveryNoteLine
Líneas de compra PurchaseInvoiceLine, PurchaseOrderLine, PurchaseDeliveryNoteLine

Maestros:

BusinessPartner, Item, Warehouse, WarehouseZone, Category, UnitOfMeasure, AccountingPeriod, DocumentSeries

Contabilidad:

ChartOfAccount, CostCenter, ProfitCenter, InternalOrder, DimensionRule, JournalEntry, JournalEntryLine, AccountMapping

RRHH:

Employee, Department, Position, Contract, Payroll, PayrollLine, Leave

  • Al desactivar el plugin en un tenant, sus campos custom se ignoran en validación y sus hooks dejan de ejecutarse, pero las tablas y los datos no se borran.
  • No existe un mecanismo de rollback de migraciones: si publicas un campo o tabla, planifica su evolución de forma compatible.

Ver Activación por empresa.