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.
addCustomField
Sección titulada «addCustomField»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.
createTable
Sección titulada «createTable»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.
Tablas core extensibles (CoreTableName)
Sección titulada «Tablas core extensibles (CoreTableName)»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
Qué pasa al desactivar o borrar un plugin
Sección titulada «Qué pasa al desactivar o borrar un plugin»- 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.