Controllers e ciclo de vida de documentos

Todo documento em execução é uma instância de Document. É no controller que regras de negócio, validações e efeitos colaterais são consolidados.

Acesso básico com neo.get_doc

import neo

doc = neo.get_doc("Task", "TASK-0001")
doc.status = "Closed"
doc.save()

Criação em memória:

doc = neo.get_doc({
    "doctype": "Task",
    "title": "Revisar documentação NEO",
    "status": "Open"
})
doc.insert()

Métodos úteis

Método
Uso

neo.get_doc()

Carrega ou instancia documento

neo.new_doc()

Cria documento vazio

doc.insert()

Insere novo registro

doc.save()

Persiste alterações

doc.submit()

Submete documento

doc.cancel()

Cancela documento

doc.append()

Adiciona linha em child table

Exemplo de controller

Eventos comuns do ciclo de vida

  • before_insert

  • after_insert

  • validate

  • before_save

  • on_update

  • before_submit

  • on_submit

  • before_cancel

  • on_cancel

Cada evento deve ser usado com intenção clara.

Estratégia para distribuir lógica

validate

Consistência do documento antes da gravação.

before_save

Cálculo de derivados e ajustes internos.

on_submit

Ações que só fazem sentido após confirmação formal.

Serviços auxiliares

Quando a lógica atravessa vários DocTypes ou precisa ser reutilizada.

Relação entre controller e front-end

O front-end pode disparar uma ação, mas o controller continua sendo a fonte da verdade. Isso vale para:

  • botões do formulário;

  • chamadas RPC;

  • portal;

  • importações;

  • jobs.

Exemplo de botão no front-end chamando backend

Cliente:

Servidor:

Erros comuns

  • lógica crítica apenas em Client Script;

  • uso excessivo de ignore_permissions=True;

  • consultas pesadas em validate;

  • integração externa antes do commit.

Atualizado