@m3r/sdk 0.5.0

Sample 0.6.1

Extensão de referência fatiada por pastas — o index só orquestra. O SDK e o Core já entregam isso de ponta a ponta.

Pasta: m3r-developer-platform/examples/sample-extension. Só @m3r/sdk. Sem React, SQL ou TypeORM.

O contrato da SDK continua 0.5.0. A sample 0.6.1 é o roteiro de homologação e o padrão de pastas: um domínio, um register, o index.ts só chama.

Árvore e ordem do activate: Padrões.

Pastas

src/index.ts                 → defineExtension + registerVendas(ctx)
src/shared/pedido.ts         → helpers (código, valor, writeAudit)
src/vendas/register.ts       → tabela → tela → nav → relatório → IP → evento
src/vendas/tabelas/*.ts
src/vendas/telas/*.ts
src/vendas/relatorios/*.ts
src/vendas/nav.ts
src/vendas/ips.ts
src/vendas/events.ts

Não há compras/ nem estoque/ vazios. O próximo domínio entra com o mesmo molde e uma linha no activate.

O que já funciona

CanalO que a sample prova
IPCarimba [M3R-DEMO], bloqueia BLOQUEAR, botões no pedido e na lista, Faturar / Cancelar / Pedido Rápido
AFTER_SAVEwriteAudit grava auditoria (origem=ip)
tables.ensureJSONB (demo_auditoria) e física FAX#### (demo_lote, sem physicalName fixo)
recordsSemeia DEMO-001 na física se estiver vazia
screensPágina, modal com SdkFormBind, hideField / disableField, actions com openReport:
reportsFiltro data / enum / texto; PDF e Excel; um relatório na tabela física
Eventoscreated / fulfilled / cancelled — os dois últimos também gravam auditoria
GestãoConfigurações → Extensões lista, mostra logs e desliga o tenant

Sequência para ver no ERP

  1. M3R: Validate Project → M3R: Deploy Extension (obrigatório em production) → M3R: Run Extension.
  2. Novo pedido, salvar: observação termina com [M3R-DEMO].
  3. Vendas → Auditoria demo: linha origem=ip, acao=gravado.
  4. No pedido, Nova auditoria: pedido_codigo vem do bind; origem some; acao trava.
  5. Cadastros → Lote físico: DEMO-001. Relatório Posição de lotes exporta PDF/Excel.
  6. Faturar ou cancelar: nova linha na auditoria + log no host.
  7. Configurações → Extensões: Logs / Desativar / Ativar.

Desativar não apaga FAX#### nem as linhas.

Como o index inicia

src/index.ts
import { defineExtension } from "@m3r/sdk";
import { registerVendas } from "./vendas/register";

export default defineExtension({
  async activate(ctx) {
    await registerVendas(ctx);
  },
  async deactivate(ctx) {
    ctx.logger.info("Sample encerrada — tabelas e records permanecem");
  }
});

AFTER_SAVE e tables.ensure não ficam no index. O registerVendas chama ensureAuditoriaTable antes de ligar o IP que grava a linha.