Ir al contenido

Plugin de ejemplo

simplegest.demo-product-extension añade la garantía a los productos usando solo el SDK. Su manual de usuario está en Garantía de productos.

Está escrito para el SDK 0.1 (sdk: { range: '^0.1.0' }) y sigue funcionando en el host 0.2.1, que honra los contratos 0.1.3, 0.2.0 y 0.2.1. Para pantallas propias, almacén, migraciones o validación de venta, la referencia son los plugins oficiales del SDK 0.2 (por ejemplo, plugins/simplegest.labels o plugins/simplegest.replenishment), descritos en El manifiesto y API del plugin.

Declara dos campos (warrantyMonths, entero de 0 a 120, y origin, enum), la columna Garantía, la acción Fin de garantía, el bloque de impresión warranty y las siete capacidades que necesita. El código completo está en El manifiesto.

No contiene código de formularios ni de tablas: los pinta el programa a partir del manifiesto.

import { definePluginClient } from '@simplegest/plugin-sdk'
/** Renderer behaviour of the demo plugin. Uses only the PluginContext API. */
export default definePluginClient({
id: 'simplegest.demo-product-extension',
activate(ctx) {
ctx.actions.handle('warranty-end', async ({ product }) => {
const fields = await ctx.products.getFields([product.id])
const months = fields[product.id]?.warrantyMonths
if (typeof months !== 'number' || months <= 0) {
ctx.ui.notify(`"${product.name}" no tiene garantía registrada`, 'warning')
return
}
const end = new Date()
end.setMonth(end.getMonth() + months)
ctx.ui.showInfo('Fin de garantía', [
`Producto: ${product.name}`,
`Garantía: ${months} meses`,
`Si se vende hoy, la garantía vence el ${end.toLocaleDateString('es-ES')}.`,
])
})
},
})
import type { PluginServerModule } from '@simplegest/plugin-sdk'
export const server: PluginServerModule = {
activate(ctx) {
ctx.print.provide('warranty', async (document) => {
const ids = [...new Set(document.lines.map((line) => line.productId).filter((id): id is string => !!id))]
if (ids.length === 0) return null
const fields = await ctx.fields.product(ids)
const lines = document.lines
.filter((line) => line.productId && typeof fields[line.productId]?.warrantyMonths === 'number' && Number(fields[line.productId]!.warrantyMonths) > 0)
.map((line) => `Garantía: ${line.description.slice(0, 36)}, ${fields[line.productId!]!.warrantyMonths} meses`)
return lines.length ? lines : null
})
},
}

Imprime «Garantía: Pendrive 64 GB, 24 meses» en la parte complementaria del ticket.

  1. Crea la carpeta plugins/<publisher>.<nombre>/ con manifest.ts y, si los necesita, client.ts y server.ts.

  2. Añade el manifiesto (y el server) a server/plugins/catalog.ts.

  3. Añade el client a src/platform/plugins/clientModules.ts.

  4. Ejecuta la suite de contrato (tests/sdk/plugin-sdk.test.ts): comprueba, entre otras cosas, que el plugin solo importa el SDK.

  1. Importa solo @simplegest/plugin-sdk.
  2. No asumas ids internos: usa siempre el uuid público.
  3. Funciona sin Internet o declara offline: 'degraded' | 'online-only'.
  4. No guardes datos de clientes que no necesites. Lo que guardes se exporta y se conserva al desinstalar.
  5. Maneja tus errores. Si fallas, el programa te aísla y te marca en error, pero el usuario lo verá.