termo_core 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -243,7 +243,7 @@ export declare function chave_ia_buscar_catalogo(credencial_de_acesso: Credencia
243
243
  /**
244
244
  * Executa um pedido no gateway de IA
245
245
  *
246
- * Com token de usuário, exige a permissão `criar` da área `gateway`; com token de aplicativo (outro back-end, via `termo_core::CredencialDeAcesso::token_do_aplicativo()`), qualquer app válido do TermoAuth entra e a conversa nova grava o slug do app em `aplicativo`. Atende o pedido com as chaves de IA cadastradas, trocando de chave e de IA quando uma falha, até as regras da categoria (`/config_system_gateway`) mandarem parar. `categoria` é obrigatória. Nas categorias de entrada em texto, `texto` é obrigatório; nas de entrada em imagem, áudio ou vídeo, `arquivo` é obrigatório: `{ base64, tipo_mime }` (até 20 MB, aceita data URL) ou `{ url }` (baixada pelo TermoAI), e `texto` é a pergunta sobre o arquivo (sem ele vale uma pergunta padrão). `provedor` fixa uma IA que atenda a categoria (só ela, sem trocar de IA). `provedor_preferido` (um `provedor` de `GET /gateway/modelos`) tenta primeiro as chaves dessa IA e só troca para as outras, na ordem de sempre, quando ela falha ou não tem chave livre; sem ele, a escolha é a de sempre; com `provedor` junto, vale o `provedor`. `instrucao` é a instrução de sistema, `idioma` ajuda transcrição e fala, `voz` escolhe a voz da fala. `historico` (no máximo as 40 últimas mensagens com texto, `papel` `usuario` ou `assistente`) dá contexto; sem ele, com `conversa_id` (de uma conversa da mesma categoria), o contexto vem da própria conversa. A pergunta e a resposta são gravadas na conversa informada ou numa conversa nova de origem `api`, cujo id volta em `conversa_id`; os arquivos da pergunta e da resposta ficam no TermoBucket (privados, do app `termo-ai`). A resposta traz `texto` ou `arquivo` (base64 com o tipo), a IA, o modelo, o apelido da chave que atendeu, os tokens (quando a IA informa), as tentativas que falharam e a duração. Ferramentas (opcional, só em `texto_para_texto`): `ferramentas` lista até 128 funções (`nome` com até 64 letras, números, `_` ou `-`; `descricao`; `parametros` em JSON Schema) que a IA pode pedir para chamar; só entram as IAs que aceitam ferramentas (Gemini, Groq, Mistral, Cerebras, NVIDIA, Cohere, Z.ai e Ollama). Quando a IA quer uma ferramenta, a resposta traz `chamadas_de_ferramenta` (`id`, `nome`, `argumentos` em objeto e `assinatura`, que deve voltar igual) e, às vezes, `texto`. Quem chamou executa as ferramentas e pede de novo com o `historico` estendido: a mensagem `assistente` com as `chamadas_de_ferramenta` (e `texto`, vazio se não houver) e uma mensagem `ferramenta` por resultado, com `chamada_id` e o resultado em `texto`; quando o histórico termina num resultado, `texto` do pedido é opcional. Mensagens de ferramenta no histórico exigem `ferramentas` no pedido. A conversa gravada guarda as chamadas na mensagem do assistente, mas não os resultados.
246
+ * Com token de usuário, exige a permissão `criar` da área `gateway`; com token de aplicativo (outro back-end, via `termo_core::CredencialDeAcesso::token_do_aplicativo()`), qualquer app válido do TermoAuth entra e a conversa nova grava o slug do app em `aplicativo`. Atende o pedido com as chaves de IA cadastradas, trocando de chave e de IA quando uma falha, até as regras da categoria (`/config_system_gateway`) mandarem parar. `categoria` é obrigatória. Nas categorias de entrada em texto, `texto` é obrigatório; nas de entrada em imagem, áudio ou vídeo, `arquivo` é obrigatório: `{ base64, tipo_mime }` (até 20 MB, aceita data URL) ou `{ url }` (baixada pelo TermoAI), e `texto` é a pergunta sobre o arquivo (sem ele vale uma pergunta padrão). `provedor` fixa uma IA que atenda a categoria (só ela, sem trocar de IA). `provedor_preferido` (um `provedor` de `GET /gateway/modelos`) tenta primeiro as chaves dessa IA e só troca para as outras, na ordem de sempre, quando ela falha ou não tem chave livre; sem ele, a escolha é a de sempre; com `provedor` junto, vale o `provedor`. `instrucao` é a instrução de sistema, `idioma` ajuda transcrição e fala, `voz` escolhe a voz da fala. `historico` (no máximo as 40 últimas mensagens com texto, `papel` `usuario` ou `assistente`) dá contexto; sem ele, com `conversa_id` (de uma conversa da mesma categoria), o contexto vem da própria conversa. A pergunta e a resposta são gravadas na conversa informada ou numa conversa nova de origem `api`, cujo id volta em `conversa_id`; os arquivos da pergunta e da resposta ficam no TermoBucket (privados, do app `termo-ai`). A resposta traz `texto` ou `arquivo` (base64 com o tipo), a IA, o modelo, o apelido da chave que atendeu, os tokens (quando a IA informa), as tentativas que falharam e a duração. Ferramentas (opcional, só em `texto_para_texto`): `ferramentas` lista até 128 funções (`nome` com até 64 letras, números, `_` ou `-`; `descricao`; `parametros` em JSON Schema) que a IA pode pedir para chamar; só entram as IAs que aceitam ferramentas (Gemini, Groq, Mistral, Cerebras, NVIDIA, Cohere, Z.ai e Ollama). Quando a IA quer uma ferramenta, a resposta traz `chamadas_de_ferramenta` (`id`, `nome`, `argumentos` em objeto e `assinatura`, que deve voltar igual) e, às vezes, `texto`. Quem chamou executa as ferramentas e pede de novo com o `historico` estendido: a mensagem `assistente` com as `chamadas_de_ferramenta` (e `texto`, vazio se não houver) e uma mensagem `ferramenta` por resultado, com `chamada_id` e o resultado em `texto`; quando o histórico termina num resultado, `texto` do pedido é opcional. Mensagens de ferramenta no histórico exigem `ferramentas` no pedido. A conversa gravada guarda as chamadas na mensagem do assistente, mas não os resultados. `modelo` (até 200 caracteres, só junto de `provedor`) troca o modelo do catálogo por outro da mesma IA. Em `texto_para_imagem`, `referencias` (até 14 imagens no formato de `arquivo`, até 20 MB somadas) vão junto do texto, `proporcao` (`1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9` ou `21:9`) e `tamanho` (`1K`, `2K` ou `4K`) definem a imagem; em `texto_para_texto`, `esquema` (objeto JSON Schema, sem `ferramentas`) faz a resposta vir em `texto` como JSON nesse formato. Com qualquer um desses quatro, só entram as IAs que os entendem (hoje o Gemini), e a conversa gravada não guarda as referências. A resposta traz também `tokens_de_entrada` e `tokens_de_saida` separados, quando a IA informa.
247
247
  *
248
248
  * `POST /gateway`
249
249
  */
package/dist/ai/rotas.js CHANGED
@@ -304,7 +304,7 @@ export function chave_ia_buscar_catalogo(credencial_de_acesso, opcoes_da_chamada
304
304
  /**
305
305
  * Executa um pedido no gateway de IA
306
306
  *
307
- * Com token de usuário, exige a permissão `criar` da área `gateway`; com token de aplicativo (outro back-end, via `termo_core::CredencialDeAcesso::token_do_aplicativo()`), qualquer app válido do TermoAuth entra e a conversa nova grava o slug do app em `aplicativo`. Atende o pedido com as chaves de IA cadastradas, trocando de chave e de IA quando uma falha, até as regras da categoria (`/config_system_gateway`) mandarem parar. `categoria` é obrigatória. Nas categorias de entrada em texto, `texto` é obrigatório; nas de entrada em imagem, áudio ou vídeo, `arquivo` é obrigatório: `{ base64, tipo_mime }` (até 20 MB, aceita data URL) ou `{ url }` (baixada pelo TermoAI), e `texto` é a pergunta sobre o arquivo (sem ele vale uma pergunta padrão). `provedor` fixa uma IA que atenda a categoria (só ela, sem trocar de IA). `provedor_preferido` (um `provedor` de `GET /gateway/modelos`) tenta primeiro as chaves dessa IA e só troca para as outras, na ordem de sempre, quando ela falha ou não tem chave livre; sem ele, a escolha é a de sempre; com `provedor` junto, vale o `provedor`. `instrucao` é a instrução de sistema, `idioma` ajuda transcrição e fala, `voz` escolhe a voz da fala. `historico` (no máximo as 40 últimas mensagens com texto, `papel` `usuario` ou `assistente`) dá contexto; sem ele, com `conversa_id` (de uma conversa da mesma categoria), o contexto vem da própria conversa. A pergunta e a resposta são gravadas na conversa informada ou numa conversa nova de origem `api`, cujo id volta em `conversa_id`; os arquivos da pergunta e da resposta ficam no TermoBucket (privados, do app `termo-ai`). A resposta traz `texto` ou `arquivo` (base64 com o tipo), a IA, o modelo, o apelido da chave que atendeu, os tokens (quando a IA informa), as tentativas que falharam e a duração. Ferramentas (opcional, só em `texto_para_texto`): `ferramentas` lista até 128 funções (`nome` com até 64 letras, números, `_` ou `-`; `descricao`; `parametros` em JSON Schema) que a IA pode pedir para chamar; só entram as IAs que aceitam ferramentas (Gemini, Groq, Mistral, Cerebras, NVIDIA, Cohere, Z.ai e Ollama). Quando a IA quer uma ferramenta, a resposta traz `chamadas_de_ferramenta` (`id`, `nome`, `argumentos` em objeto e `assinatura`, que deve voltar igual) e, às vezes, `texto`. Quem chamou executa as ferramentas e pede de novo com o `historico` estendido: a mensagem `assistente` com as `chamadas_de_ferramenta` (e `texto`, vazio se não houver) e uma mensagem `ferramenta` por resultado, com `chamada_id` e o resultado em `texto`; quando o histórico termina num resultado, `texto` do pedido é opcional. Mensagens de ferramenta no histórico exigem `ferramentas` no pedido. A conversa gravada guarda as chamadas na mensagem do assistente, mas não os resultados.
307
+ * Com token de usuário, exige a permissão `criar` da área `gateway`; com token de aplicativo (outro back-end, via `termo_core::CredencialDeAcesso::token_do_aplicativo()`), qualquer app válido do TermoAuth entra e a conversa nova grava o slug do app em `aplicativo`. Atende o pedido com as chaves de IA cadastradas, trocando de chave e de IA quando uma falha, até as regras da categoria (`/config_system_gateway`) mandarem parar. `categoria` é obrigatória. Nas categorias de entrada em texto, `texto` é obrigatório; nas de entrada em imagem, áudio ou vídeo, `arquivo` é obrigatório: `{ base64, tipo_mime }` (até 20 MB, aceita data URL) ou `{ url }` (baixada pelo TermoAI), e `texto` é a pergunta sobre o arquivo (sem ele vale uma pergunta padrão). `provedor` fixa uma IA que atenda a categoria (só ela, sem trocar de IA). `provedor_preferido` (um `provedor` de `GET /gateway/modelos`) tenta primeiro as chaves dessa IA e só troca para as outras, na ordem de sempre, quando ela falha ou não tem chave livre; sem ele, a escolha é a de sempre; com `provedor` junto, vale o `provedor`. `instrucao` é a instrução de sistema, `idioma` ajuda transcrição e fala, `voz` escolhe a voz da fala. `historico` (no máximo as 40 últimas mensagens com texto, `papel` `usuario` ou `assistente`) dá contexto; sem ele, com `conversa_id` (de uma conversa da mesma categoria), o contexto vem da própria conversa. A pergunta e a resposta são gravadas na conversa informada ou numa conversa nova de origem `api`, cujo id volta em `conversa_id`; os arquivos da pergunta e da resposta ficam no TermoBucket (privados, do app `termo-ai`). A resposta traz `texto` ou `arquivo` (base64 com o tipo), a IA, o modelo, o apelido da chave que atendeu, os tokens (quando a IA informa), as tentativas que falharam e a duração. Ferramentas (opcional, só em `texto_para_texto`): `ferramentas` lista até 128 funções (`nome` com até 64 letras, números, `_` ou `-`; `descricao`; `parametros` em JSON Schema) que a IA pode pedir para chamar; só entram as IAs que aceitam ferramentas (Gemini, Groq, Mistral, Cerebras, NVIDIA, Cohere, Z.ai e Ollama). Quando a IA quer uma ferramenta, a resposta traz `chamadas_de_ferramenta` (`id`, `nome`, `argumentos` em objeto e `assinatura`, que deve voltar igual) e, às vezes, `texto`. Quem chamou executa as ferramentas e pede de novo com o `historico` estendido: a mensagem `assistente` com as `chamadas_de_ferramenta` (e `texto`, vazio se não houver) e uma mensagem `ferramenta` por resultado, com `chamada_id` e o resultado em `texto`; quando o histórico termina num resultado, `texto` do pedido é opcional. Mensagens de ferramenta no histórico exigem `ferramentas` no pedido. A conversa gravada guarda as chamadas na mensagem do assistente, mas não os resultados. `modelo` (até 200 caracteres, só junto de `provedor`) troca o modelo do catálogo por outro da mesma IA. Em `texto_para_imagem`, `referencias` (até 14 imagens no formato de `arquivo`, até 20 MB somadas) vão junto do texto, `proporcao` (`1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9` ou `21:9`) e `tamanho` (`1K`, `2K` ou `4K`) definem a imagem; em `texto_para_texto`, `esquema` (objeto JSON Schema, sem `ferramentas`) faz a resposta vir em `texto` como JSON nesse formato. Com qualquer um desses quatro, só entram as IAs que os entendem (hoje o Gemini), e a conversa gravada não guarda as referências. A resposta traz também `tokens_de_entrada` e `tokens_de_saida` separados, quando a IA informa.
308
308
  *
309
309
  * `POST /gateway`
310
310
  */
@@ -364,12 +364,17 @@ export interface PedidoGateway {
364
364
  arquivo?: ArquivoDoPedido | null;
365
365
  categoria: string;
366
366
  conversa_id?: string | null;
367
+ esquema?: unknown;
367
368
  ferramentas?: Array<Ferramenta> | null;
368
369
  historico?: Array<MensagemDoHistorico> | null;
369
370
  idioma?: string | null;
370
371
  instrucao?: string | null;
372
+ modelo?: string | null;
373
+ proporcao?: string | null;
371
374
  provedor?: string | null;
372
375
  provedor_preferido?: string | null;
376
+ referencias?: Array<ArquivoDoPedido> | null;
377
+ tamanho?: string | null;
373
378
  texto?: string | null;
374
379
  voz?: string | null;
375
380
  }
@@ -426,6 +431,8 @@ export interface RespostaDoGateway {
426
431
  tentativas: Array<TentativaDaMensagem>;
427
432
  texto?: string | null;
428
433
  tokens?: number | null;
434
+ tokens_de_entrada?: number | null;
435
+ tokens_de_saida?: number | null;
429
436
  }
430
437
  export interface TentativaDaMensagem {
431
438
  chave: string;
@@ -78,7 +78,7 @@ export declare function buscar_pelo_filtro_board(credencial_de_acesso: Credencia
78
78
  /**
79
79
  * Baixa uma imagem do canvas guardada no banco
80
80
  *
81
- * Pública (o `<img>` do canvas não manda token): devolve os bytes da imagem que ficou no banco porque o TermoBucket falhou, com cache longo.
81
+ * Pública (o `<img>` do canvas não manda token): devolve os bytes das imagens antigas que ficaram no banco quando o TermoBucket falhava, com cache longo. Nenhuma imagem nova vai para o banco.
82
82
  *
83
83
  * `GET /board/imagem/{id}`
84
84
  */
@@ -171,7 +171,7 @@ export declare function elementos_organizar_board(credencial_de_acesso: Credenci
171
171
  /**
172
172
  * Envia uma imagem para o canvas
173
173
  *
174
- * Guarda uma imagem PNG, JPG, GIF ou WEBP de até 10 MB (`arquivo_base64`, cru com `tipo` ou como data URL) e devolve o endereço público para o elemento de imagem do canvas. A imagem vai ao TermoBucket como arquivo público; se o bucket falhar, fica no banco e o endereço é relativo à API (`/board/imagem/{id}`).
174
+ * Guarda uma imagem PNG, JPG, GIF ou WEBP de até 10 MB (`arquivo_base64`, cru com `tipo` ou como data URL) e devolve o endereço público para o elemento de imagem do canvas. A imagem vai ao TermoBucket como arquivo público e nunca fica no banco: se o bucket falhar, responde `503`.
175
175
  *
176
176
  * `POST /board/{id}/imagem`
177
177
  */
@@ -72,7 +72,7 @@ export function buscar_pelo_filtro_board(credencial_de_acesso, parametros = {},
72
72
  /**
73
73
  * Baixa uma imagem do canvas guardada no banco
74
74
  *
75
- * Pública (o `<img>` do canvas não manda token): devolve os bytes da imagem que ficou no banco porque o TermoBucket falhou, com cache longo.
75
+ * Pública (o `<img>` do canvas não manda token): devolve os bytes das imagens antigas que ficaram no banco quando o TermoBucket falhava, com cache longo. Nenhuma imagem nova vai para o banco.
76
76
  *
77
77
  * `GET /board/imagem/{id}`
78
78
  */
@@ -250,7 +250,7 @@ export function elementos_organizar_board(credencial_de_acesso, id, corpo_da_req
250
250
  /**
251
251
  * Envia uma imagem para o canvas
252
252
  *
253
- * Guarda uma imagem PNG, JPG, GIF ou WEBP de até 10 MB (`arquivo_base64`, cru com `tipo` ou como data URL) e devolve o endereço público para o elemento de imagem do canvas. A imagem vai ao TermoBucket como arquivo público; se o bucket falhar, fica no banco e o endereço é relativo à API (`/board/imagem/{id}`).
253
+ * Guarda uma imagem PNG, JPG, GIF ou WEBP de até 10 MB (`arquivo_base64`, cru com `tipo` ou como data URL) e devolve o endereço público para o elemento de imagem do canvas. A imagem vai ao TermoBucket como arquivo público e nunca fica no banco: se o bucket falhar, responde `503`.
254
254
  *
255
255
  * `POST /board/{id}/imagem`
256
256
  */
@@ -1244,6 +1244,14 @@ export declare function buscar_informacoes_paginador_nota_fiscal(credencial_de_a
1244
1244
  * `GET /nota_fiscal/{id}`
1245
1245
  */
1246
1246
  export declare function buscar_pelo_id_nota_fiscal(credencial_de_acesso: CredencialDeAcesso, id: number, parametros?: ParametrosDeBuscarPeloIdNotaFiscal, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.NotaFiscal>;
1247
+ /**
1248
+ * Baixa a nota fiscal em PDF (DANFE), gerado na hora a partir do XML
1249
+ *
1250
+ * Exige a permissão `ver` no módulo `Financeiro` do perfil de quem chama (administrador e master têm tudo). Confere a nota na tabela `nota_fiscal`, busca o XML autorizado na hora na API da Termotubos e monta o DANFE (A4 retrato, com código de barras da chave de acesso e quantas folhas os itens pedirem) em memória: nada é gravado em disco nem no banco. Responde `application/pdf` como download `nota-{numero}.pdf`. Quem não é colaborador interno só baixa notas do CNPJ das próprias unidades (as outras respondem 404).
1251
+ *
1252
+ * `GET /nota_fiscal/{id}/pdf`
1253
+ */
1254
+ export declare function baixar_nota_fiscal_via_xml_nota_fiscal(credencial_de_acesso: CredencialDeAcesso, id: number, opcoes_da_chamada?: OpcoesDaChamada): Promise<Uint8Array>;
1247
1255
  /**
1248
1256
  * Lista os pedidos paginados
1249
1257
  *
@@ -1399,7 +1407,7 @@ export declare function buscar_pelo_id_pedido_venda_tiny(credencial_de_acesso: C
1399
1407
  /**
1400
1408
  * Lista os produtos paginados
1401
1409
  *
1402
- * Exige só uma sessão válida (qualquer pessoa logada no portal). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny vêm vazios. Paginado com 50 itens por página (fixo); `pagina` começa em 1 (padrão 1). A resposta traz `itens`, `total` (registros que casam), `pagina` e `tamanho`. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1410
+ * Exige só uma sessão válida (qualquer pessoa logada no portal). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` (preço à vista, ou o preço base quando o à vista é zero, o mesmo da ordem) são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny de conferência (`nome_tiny`, `preco_tiny`, `preco_a_vista_tiny`, `preco_portal_b2b`, `preco_portal_b2b_a_prazo`, `precos_por_unidade`, `enriquecido_em`) vêm vazios; `categoria_tiny` e `marca_tiny` vêm preenchidos. Paginado com 50 itens por página (fixo); `pagina` começa em 1 (padrão 1). A resposta traz `itens`, `total` (registros que casam), `pagina` e `tamanho`. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1403
1411
  *
1404
1412
  * `GET /produto`
1405
1413
  */
@@ -1423,7 +1431,7 @@ export declare function buscar_auto_complete_produto(credencial_de_acesso: Crede
1423
1431
  /**
1424
1432
  * Busca produtos por filtro
1425
1433
  *
1426
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve os produtos não excluídos que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny vêm vazios. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1434
+ * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve os produtos não excluídos que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` (preço à vista, ou o preço base quando o à vista é zero, o mesmo da ordem) são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny de conferência (`nome_tiny`, `preco_tiny`, `preco_a_vista_tiny`, `preco_portal_b2b`, `preco_portal_b2b_a_prazo`, `precos_por_unidade`, `enriquecido_em`) vêm vazios; `categoria_tiny` e `marca_tiny` vêm preenchidos. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1427
1435
  *
1428
1436
  * `GET /produto/filtro`
1429
1437
  */
@@ -1431,7 +1439,7 @@ export declare function buscar_pelo_filtro_produto(credencial_de_acesso: Credenc
1431
1439
  /**
1432
1440
  * Busca um produto pelo id
1433
1441
  *
1434
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Produto excluído não é encontrado. Para quem não é colaborador interno, os dados do Tiny (`preco_tiny`, `preco_a_vista_tiny`, `categoria_tiny`, `marca_tiny`, `enriquecido_em`) vêm vazios. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1442
+ * Exige só uma sessão válida (qualquer pessoa logada no portal). Produto excluído não é encontrado. Para quem não é colaborador interno, os dados do Tiny de conferência (`nome_tiny`, `preco_tiny`, `preco_a_vista_tiny`, `preco_portal_b2b`, `preco_portal_b2b_a_prazo`, `precos_por_unidade`, `enriquecido_em`) vêm vazios; `categoria_tiny` e `marca_tiny` vêm preenchidos. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1435
1443
  *
1436
1444
  * `GET /produto/{id}`
1437
1445
  */
@@ -1439,7 +1447,7 @@ export declare function buscar_pelo_id_produto(credencial_de_acesso: CredencialD
1439
1447
  /**
1440
1448
  * Atualiza um produto
1441
1449
  *
1442
- * Exige a permissão `editar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Mesmas validações do cadastro (o SKU não muda). `embalagem_quantidade` e `embalagem_preco` aceitam `null` para apagar. Produto do Tiny não aceita `preco` nem `preco_a_vista` (400): o preço próprio do portal vai em `preco_portal_b2b`, maior que zero e até o preço a prazo do Tiny, e vira o preço à vista usado no portal; `null` apaga e o preço à vista volta ao do Tiny. A sincronização com o Tiny nunca muda o `preco_portal_b2b`. Produto que não veio do Tiny não aceita `preco_portal_b2b` (400). Atualização parcial: campo ausente mantém o valor atual. Campos: `nome` de 2 a 200 caracteres; `unidade` é a unidade de venda (obrigatória quando enviada); `embalagem` é o texto da embalagem de venda; `unidade_medida` é a unidade das quantidades (ex.: `m`, `un`); `embalagem_rotulo` é o nome da embalagem fechada (ex.: caixa); `incremento_minimo` maior que zero; `cor` é atributo em texto; `lancamento` (booleano) marca o produto como lançamento; `relevancia` (inteiro) ordena a vitrine, da maior para a menor; `imagens` até 15 URLs, sem itens vazios; `descricao` é o texto longo da vitrine (até 5000 caracteres); `especificacoes_texto` é a ficha técnica em texto (até 5000 caracteres); `outras_informacoes` é texto livre extra (até 2000 caracteres); `heuristica_pendente` é a lista de campos que ainda precisam de revisão manual. `nome_comercial` é o nome mostrado ao cliente e `resumo_caracteristicas` a linha curta de características do card; os dois aceitam texto ou `null` para limpar (vazio também limpa).
1450
+ * Exige a permissão `editar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Mesmas validações do cadastro (o SKU não muda). `embalagem_quantidade` e `embalagem_preco` aceitam `null` para apagar. Produto do Tiny não aceita `preco` nem `preco_a_vista` (400): o preço próprio do portal vai em `preco_portal_b2b` (à vista) e `preco_portal_b2b_a_prazo`, maiores que zero e com o à vista até o a prazo, e viram o `preco_a_vista` e o `preco` usados no portal; `null` apaga e o preço volta ao do Tiny. A sincronização com o Tiny nunca muda os dois. Produto que não veio do Tiny não aceita os dois (400). `precos_por_unidade` troca a lista das unidades: cada uma com `variacao_a_vista` e `variacao_a_prazo` em % (de -100 a 100; negativo é desconto, positivo é acréscimo) sobre o preço de referência (o Preço Portal B2B ou, sem ele, o do Tiny), `ativo` (padrão `true`) e `quantidade` (opcional, maior que zero: a quantidade que vai em cada embalagem dessa unidade). No produto do Tiny, a variação da unidade do produto entra no `preco_a_vista` e no `preco` usados no portal. Atualização parcial: campo ausente mantém o valor atual. Campos: `nome` de 2 a 200 caracteres; `unidade` é a unidade de venda (obrigatória quando enviada); `embalagem` é o texto da embalagem de venda; `unidade_medida` é a unidade das quantidades (ex.: `m`, `un`); `embalagem_rotulo` é o nome da embalagem fechada (ex.: caixa); `incremento_minimo` maior que zero; `cor` é atributo em texto; `lancamento` (booleano) marca o produto como lançamento; `relevancia` (inteiro) ordena a vitrine, da maior para a menor; `imagens` até 15 URLs, sem itens vazios; `descricao` é o texto longo da vitrine (até 5000 caracteres); `especificacoes_texto` é a ficha técnica em texto (até 5000 caracteres); `outras_informacoes` é texto livre extra (até 2000 caracteres); `heuristica_pendente` é a lista de campos que ainda precisam de revisão manual. `nome_comercial` é o nome mostrado ao cliente e `resumo_caracteristicas` a linha curta de características do card; os dois aceitam texto ou `null` para limpar (vazio também limpa).
1443
1451
  *
1444
1452
  * `PATCH /produto/{id}`
1445
1453
  */
@@ -1290,6 +1290,22 @@ export function buscar_pelo_id_nota_fiscal(credencial_de_acesso, id, parametros
1290
1290
  formato_da_resposta: "json",
1291
1291
  }, opcoes_da_chamada);
1292
1292
  }
1293
+ /**
1294
+ * Baixa a nota fiscal em PDF (DANFE), gerado na hora a partir do XML
1295
+ *
1296
+ * Exige a permissão `ver` no módulo `Financeiro` do perfil de quem chama (administrador e master têm tudo). Confere a nota na tabela `nota_fiscal`, busca o XML autorizado na hora na API da Termotubos e monta o DANFE (A4 retrato, com código de barras da chave de acesso e quantas folhas os itens pedirem) em memória: nada é gravado em disco nem no banco. Responde `application/pdf` como download `nota-{numero}.pdf`. Quem não é colaborador interno só baixa notas do CNPJ das próprias unidades (as outras respondem 404).
1297
+ *
1298
+ * `GET /nota_fiscal/{id}/pdf`
1299
+ */
1300
+ export function baixar_nota_fiscal_via_xml_nota_fiscal(credencial_de_acesso, id, opcoes_da_chamada) {
1301
+ return chamar_servico({
1302
+ servico: SERVICO_DESTA_API,
1303
+ metodo_http: "GET",
1304
+ caminho_da_rota: `/nota_fiscal/${codificar_parametro_de_caminho(id)}/pdf`,
1305
+ credencial_de_acesso,
1306
+ formato_da_resposta: "bytes",
1307
+ }, opcoes_da_chamada);
1308
+ }
1293
1309
  /**
1294
1310
  * Lista os pedidos paginados
1295
1311
  *
@@ -1611,7 +1627,7 @@ export function buscar_pelo_id_pedido_venda_tiny(credencial_de_acesso, id, param
1611
1627
  /**
1612
1628
  * Lista os produtos paginados
1613
1629
  *
1614
- * Exige só uma sessão válida (qualquer pessoa logada no portal). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny vêm vazios. Paginado com 50 itens por página (fixo); `pagina` começa em 1 (padrão 1). A resposta traz `itens`, `total` (registros que casam), `pagina` e `tamanho`. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1630
+ * Exige só uma sessão válida (qualquer pessoa logada no portal). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` (preço à vista, ou o preço base quando o à vista é zero, o mesmo da ordem) são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny de conferência (`nome_tiny`, `preco_tiny`, `preco_a_vista_tiny`, `preco_portal_b2b`, `preco_portal_b2b_a_prazo`, `precos_por_unidade`, `enriquecido_em`) vêm vazios; `categoria_tiny` e `marca_tiny` vêm preenchidos. Paginado com 50 itens por página (fixo); `pagina` começa em 1 (padrão 1). A resposta traz `itens`, `total` (registros que casam), `pagina` e `tamanho`. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1615
1631
  *
1616
1632
  * `GET /produto`
1617
1633
  */
@@ -1662,7 +1678,7 @@ export function buscar_auto_complete_produto(credencial_de_acesso, parametros =
1662
1678
  /**
1663
1679
  * Busca produtos por filtro
1664
1680
  *
1665
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve os produtos não excluídos que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny vêm vazios. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1681
+ * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve os produtos não excluídos que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1). `ordem` aceita `relevancia` (padrão: relevância, depois nome), `menor-preco`/`maior-preco` (preço à vista, ou o preço base quando o à vista é zero), `az`/`za` (nome), `mais-novo`/`mais-antigo` (data de cadastro); o desempate é sempre nome e id; outro valor responde 400 `Ordem inválida`. Filtros opcionais (todos combinam com E): `sku` exato e `skus` vários separados por vírgula (sem diferenciar maiúsculas); `nome` procura o trecho no nome, no SKU e no nome comercial, sem diferenciar maiúsculas nem acentos; `ativo`, `lancamento`, `importado_da_api`, `demonstracao` são exatos; `tem_preco_portal_b2b` (`true` só os que têm Preço Portal B2B); `tem_imagem` (ao menos uma imagem), `tem_estoque` (estoque maior que zero), `tem_descricao`, `tem_nome_comercial`, `tem_heuristica_pendente` e `enriquecido` (já enriquecido pelo Tiny) aceitam `true` ou `false`; `estoque_minimo`/`estoque_maximo` e `preco_minimo`/`preco_maximo` (preço à vista, ou o preço base quando o à vista é zero, o mesmo da ordem) são faixas inclusivas; `unidade` é exata e `cor`, `categoria_tiny` e `marca_tiny` procuram o trecho; `criado_desde`/`criado_ate` e `atualizado_desde`/`atualizado_ate` são datas AAAA-MM-DD inclusivas. Para quem não é colaborador interno, os dados do Tiny de conferência (`nome_tiny`, `preco_tiny`, `preco_a_vista_tiny`, `preco_portal_b2b`, `preco_portal_b2b_a_prazo`, `precos_por_unidade`, `enriquecido_em`) vêm vazios; `categoria_tiny` e `marca_tiny` vêm preenchidos. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1666
1682
  *
1667
1683
  * `GET /produto/filtro`
1668
1684
  */
@@ -1679,7 +1695,7 @@ export function buscar_pelo_filtro_produto(credencial_de_acesso, parametros = {}
1679
1695
  /**
1680
1696
  * Busca um produto pelo id
1681
1697
  *
1682
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Produto excluído não é encontrado. Para quem não é colaborador interno, os dados do Tiny (`preco_tiny`, `preco_a_vista_tiny`, `categoria_tiny`, `marca_tiny`, `enriquecido_em`) vêm vazios. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1698
+ * Exige só uma sessão válida (qualquer pessoa logada no portal). Produto excluído não é encontrado. Para quem não é colaborador interno, os dados do Tiny de conferência (`nome_tiny`, `preco_tiny`, `preco_a_vista_tiny`, `preco_portal_b2b`, `preco_portal_b2b_a_prazo`, `precos_por_unidade`, `enriquecido_em`) vêm vazios; `categoria_tiny` e `marca_tiny` vêm preenchidos. Para quem não é colaborador interno, `estoque` vem `null` (a quantidade nunca é mostrada ao cliente) e `disponivel` diz se há estoque.
1683
1699
  *
1684
1700
  * `GET /produto/{id}`
1685
1701
  */
@@ -1695,7 +1711,7 @@ export function buscar_pelo_id_produto(credencial_de_acesso, id, opcoes_da_chama
1695
1711
  /**
1696
1712
  * Atualiza um produto
1697
1713
  *
1698
- * Exige a permissão `editar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Mesmas validações do cadastro (o SKU não muda). `embalagem_quantidade` e `embalagem_preco` aceitam `null` para apagar. Produto do Tiny não aceita `preco` nem `preco_a_vista` (400): o preço próprio do portal vai em `preco_portal_b2b`, maior que zero e até o preço a prazo do Tiny, e vira o preço à vista usado no portal; `null` apaga e o preço à vista volta ao do Tiny. A sincronização com o Tiny nunca muda o `preco_portal_b2b`. Produto que não veio do Tiny não aceita `preco_portal_b2b` (400). Atualização parcial: campo ausente mantém o valor atual. Campos: `nome` de 2 a 200 caracteres; `unidade` é a unidade de venda (obrigatória quando enviada); `embalagem` é o texto da embalagem de venda; `unidade_medida` é a unidade das quantidades (ex.: `m`, `un`); `embalagem_rotulo` é o nome da embalagem fechada (ex.: caixa); `incremento_minimo` maior que zero; `cor` é atributo em texto; `lancamento` (booleano) marca o produto como lançamento; `relevancia` (inteiro) ordena a vitrine, da maior para a menor; `imagens` até 15 URLs, sem itens vazios; `descricao` é o texto longo da vitrine (até 5000 caracteres); `especificacoes_texto` é a ficha técnica em texto (até 5000 caracteres); `outras_informacoes` é texto livre extra (até 2000 caracteres); `heuristica_pendente` é a lista de campos que ainda precisam de revisão manual. `nome_comercial` é o nome mostrado ao cliente e `resumo_caracteristicas` a linha curta de características do card; os dois aceitam texto ou `null` para limpar (vazio também limpa).
1714
+ * Exige a permissão `editar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Mesmas validações do cadastro (o SKU não muda). `embalagem_quantidade` e `embalagem_preco` aceitam `null` para apagar. Produto do Tiny não aceita `preco` nem `preco_a_vista` (400): o preço próprio do portal vai em `preco_portal_b2b` (à vista) e `preco_portal_b2b_a_prazo`, maiores que zero e com o à vista até o a prazo, e viram o `preco_a_vista` e o `preco` usados no portal; `null` apaga e o preço volta ao do Tiny. A sincronização com o Tiny nunca muda os dois. Produto que não veio do Tiny não aceita os dois (400). `precos_por_unidade` troca a lista das unidades: cada uma com `variacao_a_vista` e `variacao_a_prazo` em % (de -100 a 100; negativo é desconto, positivo é acréscimo) sobre o preço de referência (o Preço Portal B2B ou, sem ele, o do Tiny), `ativo` (padrão `true`) e `quantidade` (opcional, maior que zero: a quantidade que vai em cada embalagem dessa unidade). No produto do Tiny, a variação da unidade do produto entra no `preco_a_vista` e no `preco` usados no portal. Atualização parcial: campo ausente mantém o valor atual. Campos: `nome` de 2 a 200 caracteres; `unidade` é a unidade de venda (obrigatória quando enviada); `embalagem` é o texto da embalagem de venda; `unidade_medida` é a unidade das quantidades (ex.: `m`, `un`); `embalagem_rotulo` é o nome da embalagem fechada (ex.: caixa); `incremento_minimo` maior que zero; `cor` é atributo em texto; `lancamento` (booleano) marca o produto como lançamento; `relevancia` (inteiro) ordena a vitrine, da maior para a menor; `imagens` até 15 URLs, sem itens vazios; `descricao` é o texto longo da vitrine (até 5000 caracteres); `especificacoes_texto` é a ficha técnica em texto (até 5000 caracteres); `outras_informacoes` é texto livre extra (até 2000 caracteres); `heuristica_pendente` é a lista de campos que ainda precisam de revisão manual. `nome_comercial` é o nome mostrado ao cliente e `resumo_caracteristicas` a linha curta de características do card; os dois aceitam texto ou `null` para limpar (vazio também limpa).
1699
1715
  *
1700
1716
  * `PATCH /produto/{id}`
1701
1717
  */
@@ -382,20 +382,50 @@ export interface CustoNaoConformidade {
382
382
  }
383
383
  export interface DadosInternosProdutoTermotubos {
384
384
  alterado_no_tiny?: string | null;
385
+ atualizado_na_intranet?: string | null;
385
386
  categoria_completa?: string | null;
387
+ codigo_de_servico?: string | null;
388
+ controla_estoque?: string | null;
386
389
  criado_no_tiny?: string | null;
387
390
  custo?: number | null;
388
391
  custo_medio?: number | null;
392
+ descricao_complementar?: string | null;
393
+ dias_de_preparacao?: number | null;
389
394
  disponivel?: number | null;
395
+ embalagem_altura?: number | null;
396
+ embalagem_comprimento?: number | null;
397
+ embalagem_descricao?: string | null;
398
+ embalagem_diametro?: number | null;
399
+ embalagem_largura?: number | null;
400
+ embalagem_tipo?: string | null;
401
+ embalagem_volumes?: number | null;
390
402
  estoque_atualizado_em?: string | null;
403
+ estoque_maximo?: number | null;
404
+ estoque_minimo?: number | null;
405
+ garantia?: string | null;
406
+ gtin_embalagem?: string | null;
391
407
  id_api: number;
408
+ ipi_classe?: string | null;
409
+ ipi_valor_fixo?: number | null;
392
410
  localizacao?: string | null;
411
+ marca?: string | null;
393
412
  observacoes?: string | null;
394
413
  preco?: number | null;
414
+ produto_pai_tiny_id?: number | null;
395
415
  reservado?: number | null;
396
416
  saldo?: number | null;
417
+ seo_descricao?: string | null;
418
+ seo_endereco?: string | null;
419
+ seo_palavras_chave?: string | null;
420
+ seo_titulo?: string | null;
421
+ seo_video?: string | null;
397
422
  sincronizado_na_api?: string | null;
423
+ situacao?: string | null;
424
+ sob_encomenda?: string | null;
398
425
  tiny_id?: number | null;
426
+ unidade?: string | null;
427
+ unidades_por_caixa?: number | null;
428
+ variacao?: string | null;
399
429
  }
400
430
  export interface DepositoProdutoTermotubos {
401
431
  atualizado_em?: string | null;
@@ -588,10 +618,13 @@ export interface IndicadoresDeVenda {
588
618
  }
589
619
  export interface ItemDoPedido {
590
620
  adicionais?: Array<AdicionalDoItem>;
621
+ atributos_escolhidos_pela_ia?: Array<string>;
622
+ atributos_faltando?: Array<string>;
591
623
  escolhido?: OpcaoDoItem | null;
592
624
  observacao?: string | null;
593
625
  opcoes: Array<OpcaoDoItem>;
594
626
  pedido_do_cliente: string;
627
+ produto_sem_estoque?: OpcaoDoItem | null;
595
628
  quantidade: number;
596
629
  situacao: string;
597
630
  }
@@ -705,8 +738,11 @@ export interface OpcaoDeFiltro {
705
738
  valor: string;
706
739
  }
707
740
  export interface OpcaoDoItem {
741
+ cor?: string | null;
708
742
  disponivel: boolean;
709
743
  imagem_url?: string | null;
744
+ medida?: string | null;
745
+ modelo?: string | null;
710
746
  nome: string;
711
747
  preco_unitario: number;
712
748
  produto_id: string;
@@ -925,8 +961,11 @@ export interface PaginaPedidoAutoComplete {
925
961
  export interface PaginaProdutoItensItem {
926
962
  ativo: boolean;
927
963
  atualizado_em: string;
964
+ calcular_polegada: boolean;
965
+ campos_revisados: Array<string>;
928
966
  categoria_tiny?: string | null;
929
967
  comprimento?: string | null;
968
+ comprimento_polegada?: string | null;
930
969
  comprimento_unidade?: string | null;
931
970
  cor?: string | null;
932
971
  criado_em: string;
@@ -954,6 +993,7 @@ export interface PaginaProdutoItensItem {
954
993
  lancamento: boolean;
955
994
  marca_tiny?: string | null;
956
995
  medida?: string | null;
996
+ medida_polegada?: string | null;
957
997
  medida_unidade?: string | null;
958
998
  ncm?: string | null;
959
999
  nome: string;
@@ -967,7 +1007,9 @@ export interface PaginaProdutoItensItem {
967
1007
  preco_a_vista: number;
968
1008
  preco_a_vista_tiny?: number | null;
969
1009
  preco_portal_b2b?: number | null;
1010
+ preco_portal_b2b_a_prazo?: number | null;
970
1011
  preco_tiny?: number | null;
1012
+ precos_por_unidade: Array<PrecoPorUnidade>;
971
1013
  quantidade_minima: number;
972
1014
  relevancia: number;
973
1015
  resumo_caracteristicas?: string | null;
@@ -1195,6 +1237,13 @@ export interface PedidoVendaTinyAutoComplete {
1195
1237
  id: number;
1196
1238
  rotulo: string;
1197
1239
  }
1240
+ export interface PrecoPorUnidade {
1241
+ ativo?: boolean;
1242
+ quantidade?: number | null;
1243
+ unidade: string;
1244
+ variacao_a_prazo?: number | null;
1245
+ variacao_a_vista?: number | null;
1246
+ }
1198
1247
  export interface ProblemaFrequente {
1199
1248
  problema: string;
1200
1249
  quantidade: number;
@@ -1202,8 +1251,11 @@ export interface ProblemaFrequente {
1202
1251
  export interface Produto {
1203
1252
  ativo: boolean;
1204
1253
  atualizado_em: string;
1254
+ calcular_polegada: boolean;
1255
+ campos_revisados: Array<string>;
1205
1256
  categoria_tiny?: string | null;
1206
1257
  comprimento?: string | null;
1258
+ comprimento_polegada?: string | null;
1207
1259
  comprimento_unidade?: string | null;
1208
1260
  cor?: string | null;
1209
1261
  criado_em: string;
@@ -1231,6 +1283,7 @@ export interface Produto {
1231
1283
  lancamento: boolean;
1232
1284
  marca_tiny?: string | null;
1233
1285
  medida?: string | null;
1286
+ medida_polegada?: string | null;
1234
1287
  medida_unidade?: string | null;
1235
1288
  ncm?: string | null;
1236
1289
  nome: string;
@@ -1244,7 +1297,9 @@ export interface Produto {
1244
1297
  preco_a_vista: number;
1245
1298
  preco_a_vista_tiny?: number | null;
1246
1299
  preco_portal_b2b?: number | null;
1300
+ preco_portal_b2b_a_prazo?: number | null;
1247
1301
  preco_tiny?: number | null;
1302
+ precos_por_unidade: Array<PrecoPorUnidade>;
1248
1303
  quantidade_minima: number;
1249
1304
  relevancia: number;
1250
1305
  resumo_caracteristicas?: string | null;
@@ -1256,6 +1311,7 @@ export interface Produto {
1256
1311
  }
1257
1312
  export interface ProdutoAtualizar {
1258
1313
  ativo?: boolean | null;
1314
+ calcular_polegada?: boolean | null;
1259
1315
  comprimento?: string | null;
1260
1316
  comprimento_unidade?: string | null;
1261
1317
  cor?: string | null;
@@ -1278,6 +1334,8 @@ export interface ProdutoAtualizar {
1278
1334
  preco?: number | null;
1279
1335
  preco_a_vista?: number | null;
1280
1336
  preco_portal_b2b?: number | null;
1337
+ preco_portal_b2b_a_prazo?: number | null;
1338
+ precos_por_unidade?: Array<PrecoPorUnidade> | null;
1281
1339
  quantidade_minima?: number | null;
1282
1340
  relevancia?: number | null;
1283
1341
  resumo_caracteristicas?: string | null;
@@ -313,7 +313,7 @@ export interface ParametrosDeBuscarPeloFiltroTicket {
313
313
  /**
314
314
  * Anexa um arquivo ou link
315
315
  *
316
- * Exige a permissão `criar` na área `projetos` ou `tickets`. Anexa a uma tarefa (`tarefa_id`) ou ticket (`ticket_id`), nunca aos dois. Mande o arquivo em `arquivo_base64` (com ou sem o prefixo `data:...;base64,`, até 10 MB, `tipo_mime` informa o formato) ou um link em `url` (`http://` ou `https://`, até 1000 caracteres). Com `importar_url: true`, o servidor baixa a imagem de `url` e guarda o arquivo no lugar do link (é o caminho para anexar imagens pelo MCP): só `https://`, sem redirecionamento, servidor de IP público, resposta `image/*` de até 10 MB; o `tipo_mime` vem da resposta. `nome` é obrigatório (até 200). O arquivo vai para o TermoBucket (privado, app `termo-suporte`); se o bucket falhar, fica no banco até a rotina do backend levá-lo. O corpo aceita até 16 MiB. A atividade da tarefa ou do ticket ganha a linha do anexo.
316
+ * Exige a permissão `criar` na área `projetos` ou `tickets`. Anexa a uma tarefa (`tarefa_id`) ou ticket (`ticket_id`), nunca aos dois. Mande o arquivo em `arquivo_base64` (com ou sem o prefixo `data:...;base64,`, até 10 MB, `tipo_mime` informa o formato) ou um link em `url` (`http://` ou `https://`, até 1000 caracteres). Com `importar_url: true`, o servidor baixa a imagem de `url` e guarda o arquivo no lugar do link (é o caminho para anexar imagens pelo MCP): só `https://`, sem redirecionamento, servidor de IP público, resposta `image/*` de até 10 MB; o `tipo_mime` vem da resposta. `nome` é obrigatório (até 200). O arquivo vai para o TermoBucket (privado, app `termo-suporte`); se o bucket falhar, responde `502` e nada é gravado (o arquivo nunca fica no banco). O corpo aceita até 16 MiB. A atividade da tarefa ou do ticket ganha a linha do anexo.
317
317
  *
318
318
  * `POST /anexo`
319
319
  */
@@ -329,7 +329,7 @@ export declare function buscar_pelo_filtro_anexo(credencial_de_acesso: Credencia
329
329
  /**
330
330
  * Baixa um anexo pelo id
331
331
  *
332
- * Exige a permissão de leitura na área `projetos` ou `tickets` (qualquer das ações `ler`, `criar`, `editar` ou `deletar` libera a leitura). Devolve os dados do anexo e, quando é arquivo, `url_download`: endereço de download assinado do TermoBucket (arquivo privado do app `termo-suporte`), válido por 15 minutos. `conteudo_base64` só vem preenchido enquanto o arquivo ainda está no banco (o TermoBucket falhou no envio; a rotina do backend leva ao bucket a cada 30 minutos). Os dois ficam vazios quando o anexo é um link.
332
+ * Exige a permissão de leitura na área `projetos` ou `tickets` (qualquer das ações `ler`, `criar`, `editar` ou `deletar` libera a leitura). Devolve os dados do anexo e, quando é arquivo, `url_download`: endereço de download assinado do TermoBucket (arquivo privado do app `termo-suporte`), válido por 15 minutos. `url_download` fica vazia quando o anexo é um link.
333
333
  *
334
334
  * `GET /anexo/{id}`
335
335
  */
@@ -4,7 +4,7 @@ import { TERMO_SUPPORT as SERVICO_DESTA_API } from "../base/servicos.js";
4
4
  /**
5
5
  * Anexa um arquivo ou link
6
6
  *
7
- * Exige a permissão `criar` na área `projetos` ou `tickets`. Anexa a uma tarefa (`tarefa_id`) ou ticket (`ticket_id`), nunca aos dois. Mande o arquivo em `arquivo_base64` (com ou sem o prefixo `data:...;base64,`, até 10 MB, `tipo_mime` informa o formato) ou um link em `url` (`http://` ou `https://`, até 1000 caracteres). Com `importar_url: true`, o servidor baixa a imagem de `url` e guarda o arquivo no lugar do link (é o caminho para anexar imagens pelo MCP): só `https://`, sem redirecionamento, servidor de IP público, resposta `image/*` de até 10 MB; o `tipo_mime` vem da resposta. `nome` é obrigatório (até 200). O arquivo vai para o TermoBucket (privado, app `termo-suporte`); se o bucket falhar, fica no banco até a rotina do backend levá-lo. O corpo aceita até 16 MiB. A atividade da tarefa ou do ticket ganha a linha do anexo.
7
+ * Exige a permissão `criar` na área `projetos` ou `tickets`. Anexa a uma tarefa (`tarefa_id`) ou ticket (`ticket_id`), nunca aos dois. Mande o arquivo em `arquivo_base64` (com ou sem o prefixo `data:...;base64,`, até 10 MB, `tipo_mime` informa o formato) ou um link em `url` (`http://` ou `https://`, até 1000 caracteres). Com `importar_url: true`, o servidor baixa a imagem de `url` e guarda o arquivo no lugar do link (é o caminho para anexar imagens pelo MCP): só `https://`, sem redirecionamento, servidor de IP público, resposta `image/*` de até 10 MB; o `tipo_mime` vem da resposta. `nome` é obrigatório (até 200). O arquivo vai para o TermoBucket (privado, app `termo-suporte`); se o bucket falhar, responde `502` e nada é gravado (o arquivo nunca fica no banco). O corpo aceita até 16 MiB. A atividade da tarefa ou do ticket ganha a linha do anexo.
8
8
  *
9
9
  * `POST /anexo`
10
10
  */
@@ -38,7 +38,7 @@ export function buscar_pelo_filtro_anexo(credencial_de_acesso, parametros = {},
38
38
  /**
39
39
  * Baixa um anexo pelo id
40
40
  *
41
- * Exige a permissão de leitura na área `projetos` ou `tickets` (qualquer das ações `ler`, `criar`, `editar` ou `deletar` libera a leitura). Devolve os dados do anexo e, quando é arquivo, `url_download`: endereço de download assinado do TermoBucket (arquivo privado do app `termo-suporte`), válido por 15 minutos. `conteudo_base64` só vem preenchido enquanto o arquivo ainda está no banco (o TermoBucket falhou no envio; a rotina do backend leva ao bucket a cada 30 minutos). Os dois ficam vazios quando o anexo é um link.
41
+ * Exige a permissão de leitura na área `projetos` ou `tickets` (qualquer das ações `ler`, `criar`, `editar` ou `deletar` libera a leitura). Devolve os dados do anexo e, quando é arquivo, `url_download`: endereço de download assinado do TermoBucket (arquivo privado do app `termo-suporte`), válido por 15 minutos. `url_download` fica vazia quando o anexo é um link.
42
42
  *
43
43
  * `GET /anexo/{id}`
44
44
  */
@@ -18,10 +18,6 @@ export interface AnexoAtualizar {
18
18
  nome: string;
19
19
  }
20
20
  export interface AnexoComConteudoParte2 {
21
- /**
22
- * O arquivo em base64, só enquanto ele ainda não foi levado ao TermoBucket.
23
- */
24
- conteudo_base64?: string | null;
25
21
  /**
26
22
  * URL de download do arquivo no TermoBucket, assinada por 15 minutos (vazia quando o anexo é um link).
27
23
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termo_core",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Todos os clientes da Termotubos num pacote só: um módulo por serviço e cada rota da API como uma função com fetch, com o endereço resolvido pelo ambiente atual.",
5
5
  "license": "MIT",
6
6
  "author": "TI Termotubos <ti@termotubos.com.br>",