Usando templates de novos registros na API
A API expõe um conjunto de queries no padrão getNewXXX que devolvem um objeto não persistido já preenchido com os valores default daquele tipo de registro. A ideia é que você use esse retorno como base para construir o input da mutation correspondente — em vez de descobrir manualmente todos os campos obrigatórios e seus defaults.
Exemplos disponíveis: getNewProduct, getNewPerson, getNewInvoice, getNewAccount, getNewActivity, getNewCategory, getNewContact, getNewLicensee, entre outras.
Algumas dessas queries aceitam o argumento based_on_id: passando o ID de um registro existente, o objeto retornado vem clonado a partir dele — útil para duplicar produtos, pessoas, vendas etc.
Por que usar?
- Você não precisa adivinhar quais campos são obrigatórios. Os valores default vêm do servidor, refletindo as regras do licenciado.
- Campos sequenciais (como
codeemProduct) já vêm com o próximo valor disponível, evitando colisões. - Defaults dependentes de configuração (regime tributário, moeda, séries de NF-e etc.) vêm corretos para o licenciado autenticado, sem o cliente precisar consultar essas configurações antes.
- Reduz divergência entre frontend e API: o frontend nativo do Fácil123 usa exatamente essas queries para popular o formulário de criação.
Exemplo — criando um produto
Primeiro busque o template:
curl -X POST https://app.facil123.com.br/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_TOKEN_AQUI" \
-d '{
"query": "{ getNewProduct { name code unit_id kind price price_method origin volumes gross_weight net_weight scale_enabled archived } }"
}'
Resposta típica:
{
"data": {
"getNewProduct": {
"name": null,
"code": "9764",
"unit_id": null,
"kind": "materia_prima",
"price": "0.0",
"price_method": "manual",
"origin": 0,
"volumes": "0.0",
"gross_weight": "0.0",
"net_weight": "0.0",
"scale_enabled": false,
"archived": false
}
}
}
Repare que:
codejá vem com o próximo valor sequencial ("9764") — você pode mantê-lo ou sobrescrever.kind,price_method,origine os pesos vêm com defaults sensatos.- Campos como
nameeunit_idficamnullporque dependem de você.
Agora basta sobrescrever os campos necessários e enviar para createProduct:
curl -X POST https://app.facil123.com.br/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_TOKEN_AQUI" \
-d '{
"query": "mutation($attributes: ProductInput!) { createProduct(attributes: $attributes) { id name code } }",
"variables": {
"attributes": {
"name": "Camiseta",
"code": "9764",
"unit_id": "1",
"kind": "mercadoria_para_revenda",
"price": "49.90",
"price_method": "manual",
"origin": 0,
"volumes": "0.0",
"gross_weight": "0.0",
"net_weight": "0.0",
"scale_enabled": false,
"archived": false
}
}
}'
Clonando um registro existente
Para usar um produto existente como base, passe based_on_id:
{
getNewProduct(based_on_id: "2468752") {
name
code
unit_id
kind
price
}
}
O retorno traz os campos copiados do produto 2468752, com code já alterado para o próximo sequencial disponível. O mesmo argumento existe em getNewPerson, getNewInvoice e em várias outras queries — consulte o schema para descobrir quais (veja Explorando a API por introspecção).
Cuidados ao mandar para a mutation
Lembre-se que o tipo de leitura (Product) tem mais campos do que o tipo de input (ProductInput). O retorno de getNewProduct traz apenas os campos que você pediu na query, então o ideal é selecionar exatamente os atributos que existem em ProductInput — assim o objeto já fica pronto para virar variables.attributes na mutation, sem filtragem extra.
Se você selecionar campos que não existem no input (como associações resolvidas — unit { name } em vez de unit_id), a mutation vai falhar com erro de validação do GraphQL.