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.
manifest.ts
Sección titulada «manifest.ts»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.
client.ts
Sección titulada «client.ts»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')}.`, ]) }) },})server.ts
Sección titulada «server.ts»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.
Registrar un plugin interno
Sección titulada «Registrar un plugin interno»-
Crea la carpeta
plugins/<publisher>.<nombre>/conmanifest.tsy, si los necesita,client.tsyserver.ts. -
Añade el manifiesto (y el
server) aserver/plugins/catalog.ts. -
Añade el
clientasrc/platform/plugins/clientModules.ts. -
Ejecuta la suite de contrato (
tests/sdk/plugin-sdk.test.ts): comprueba, entre otras cosas, que el plugin solo importa el SDK.
Reglas para autores
Sección titulada «Reglas para autores»- Importa solo
@simplegest/plugin-sdk. - No asumas ids internos: usa siempre el
uuidpúblico. - Funciona sin Internet o declara
offline: 'degraded' | 'online-only'. - No guardes datos de clientes que no necesites. Lo que guardes se exporta y se conserva al desinstalar.
- Maneja tus errores. Si fallas, el programa te aísla y te marca en error, pero el usuario lo verá.