termo_core 0.1.11 → 0.1.13

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.
@@ -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
  */
@@ -1036,6 +1036,14 @@ export declare function atualizar_pelo_id_cotacao(credencial_de_acesso: Credenci
1036
1036
  * `DELETE /cotacao/{id}`
1037
1037
  */
1038
1038
  export declare function deletar_pelo_id_cotacao(credencial_de_acesso: CredencialDeAcesso, id: string, opcoes_da_chamada?: OpcoesDaChamada): Promise<void>;
1039
+ /**
1040
+ * Baixa a cotação em PDF, gerado na hora
1041
+ *
1042
+ * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Monta em memória o PDF da cotação (A4 retrato, quantas folhas os itens pedirem) com o que a tela mostra: número (C-1001), data de envio e validade (`valida_ate`), razão social da unidade, endereço de entrega, itens (SKU, nome, unidade, quantidade, preço unitário e total da linha), subtotal, desconto, frete (“A combinar” quando zero), total e observação. Nunca traz estoque. Nada é gravado em disco nem no banco. Responde `application/pdf` como download `cotacao-C-{numero}.pdf`. Cotação excluída, ou de unidade fora da sessão, responde 404.
1043
+ *
1044
+ * `GET /cotacao/{id}/pdf`
1045
+ */
1046
+ export declare function baixar_cotacao_em_pdf_cotacao(credencial_de_acesso: CredencialDeAcesso, id: string, opcoes_da_chamada?: OpcoesDaChamada): Promise<Uint8Array>;
1039
1047
  /**
1040
1048
  * As 10 empresas que mais enviaram pedidos no período
1041
1049
  *
@@ -1244,6 +1252,14 @@ export declare function buscar_informacoes_paginador_nota_fiscal(credencial_de_a
1244
1252
  * `GET /nota_fiscal/{id}`
1245
1253
  */
1246
1254
  export declare function buscar_pelo_id_nota_fiscal(credencial_de_acesso: CredencialDeAcesso, id: number, parametros?: ParametrosDeBuscarPeloIdNotaFiscal, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.NotaFiscal>;
1255
+ /**
1256
+ * Baixa a nota fiscal em PDF (DANFE), gerado na hora a partir do XML
1257
+ *
1258
+ * 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).
1259
+ *
1260
+ * `GET /nota_fiscal/{id}/pdf`
1261
+ */
1262
+ export declare function baixar_nota_fiscal_via_xml_nota_fiscal(credencial_de_acesso: CredencialDeAcesso, id: number, opcoes_da_chamada?: OpcoesDaChamada): Promise<Uint8Array>;
1247
1263
  /**
1248
1264
  * Lista os pedidos paginados
1249
1265
  *
@@ -1399,7 +1415,7 @@ export declare function buscar_pelo_id_pedido_venda_tiny(credencial_de_acesso: C
1399
1415
  /**
1400
1416
  * Lista os produtos paginados
1401
1417
  *
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.
1418
+ * 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
1419
  *
1404
1420
  * `GET /produto`
1405
1421
  */
@@ -1423,7 +1439,7 @@ export declare function buscar_auto_complete_produto(credencial_de_acesso: Crede
1423
1439
  /**
1424
1440
  * Busca produtos por filtro
1425
1441
  *
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.
1442
+ * 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
1443
  *
1428
1444
  * `GET /produto/filtro`
1429
1445
  */
@@ -1431,7 +1447,7 @@ export declare function buscar_pelo_filtro_produto(credencial_de_acesso: Credenc
1431
1447
  /**
1432
1448
  * Busca um produto pelo id
1433
1449
  *
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.
1450
+ * 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
1451
  *
1436
1452
  * `GET /produto/{id}`
1437
1453
  */
@@ -1439,7 +1455,7 @@ export declare function buscar_pelo_id_produto(credencial_de_acesso: CredencialD
1439
1455
  /**
1440
1456
  * Atualiza um produto
1441
1457
  *
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).
1458
+ * 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
1459
  *
1444
1460
  * `PATCH /produto/{id}`
1445
1461
  */
@@ -854,6 +854,22 @@ export function deletar_pelo_id_cotacao(credencial_de_acesso, id, opcoes_da_cham
854
854
  formato_da_resposta: "sem_conteudo",
855
855
  }, opcoes_da_chamada);
856
856
  }
857
+ /**
858
+ * Baixa a cotação em PDF, gerado na hora
859
+ *
860
+ * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Monta em memória o PDF da cotação (A4 retrato, quantas folhas os itens pedirem) com o que a tela mostra: número (C-1001), data de envio e validade (`valida_ate`), razão social da unidade, endereço de entrega, itens (SKU, nome, unidade, quantidade, preço unitário e total da linha), subtotal, desconto, frete (“A combinar” quando zero), total e observação. Nunca traz estoque. Nada é gravado em disco nem no banco. Responde `application/pdf` como download `cotacao-C-{numero}.pdf`. Cotação excluída, ou de unidade fora da sessão, responde 404.
861
+ *
862
+ * `GET /cotacao/{id}/pdf`
863
+ */
864
+ export function baixar_cotacao_em_pdf_cotacao(credencial_de_acesso, id, opcoes_da_chamada) {
865
+ return chamar_servico({
866
+ servico: SERVICO_DESTA_API,
867
+ metodo_http: "GET",
868
+ caminho_da_rota: `/cotacao/${codificar_parametro_de_caminho(id)}/pdf`,
869
+ credencial_de_acesso,
870
+ formato_da_resposta: "bytes",
871
+ }, opcoes_da_chamada);
872
+ }
857
873
  /**
858
874
  * As 10 empresas que mais enviaram pedidos no período
859
875
  *
@@ -1290,6 +1306,22 @@ export function buscar_pelo_id_nota_fiscal(credencial_de_acesso, id, parametros
1290
1306
  formato_da_resposta: "json",
1291
1307
  }, opcoes_da_chamada);
1292
1308
  }
1309
+ /**
1310
+ * Baixa a nota fiscal em PDF (DANFE), gerado na hora a partir do XML
1311
+ *
1312
+ * 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).
1313
+ *
1314
+ * `GET /nota_fiscal/{id}/pdf`
1315
+ */
1316
+ export function baixar_nota_fiscal_via_xml_nota_fiscal(credencial_de_acesso, id, opcoes_da_chamada) {
1317
+ return chamar_servico({
1318
+ servico: SERVICO_DESTA_API,
1319
+ metodo_http: "GET",
1320
+ caminho_da_rota: `/nota_fiscal/${codificar_parametro_de_caminho(id)}/pdf`,
1321
+ credencial_de_acesso,
1322
+ formato_da_resposta: "bytes",
1323
+ }, opcoes_da_chamada);
1324
+ }
1293
1325
  /**
1294
1326
  * Lista os pedidos paginados
1295
1327
  *
@@ -1611,7 +1643,7 @@ export function buscar_pelo_id_pedido_venda_tiny(credencial_de_acesso, id, param
1611
1643
  /**
1612
1644
  * Lista os produtos paginados
1613
1645
  *
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.
1646
+ * 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
1647
  *
1616
1648
  * `GET /produto`
1617
1649
  */
@@ -1662,7 +1694,7 @@ export function buscar_auto_complete_produto(credencial_de_acesso, parametros =
1662
1694
  /**
1663
1695
  * Busca produtos por filtro
1664
1696
  *
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.
1697
+ * 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
1698
  *
1667
1699
  * `GET /produto/filtro`
1668
1700
  */
@@ -1679,7 +1711,7 @@ export function buscar_pelo_filtro_produto(credencial_de_acesso, parametros = {}
1679
1711
  /**
1680
1712
  * Busca um produto pelo id
1681
1713
  *
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.
1714
+ * 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
1715
  *
1684
1716
  * `GET /produto/{id}`
1685
1717
  */
@@ -1695,7 +1727,7 @@ export function buscar_pelo_id_produto(credencial_de_acesso, id, opcoes_da_chama
1695
1727
  /**
1696
1728
  * Atualiza um produto
1697
1729
  *
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).
1730
+ * 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
1731
  *
1700
1732
  * `PATCH /produto/{id}`
1701
1733
  */
@@ -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;
@@ -406,6 +436,16 @@ export interface DepositoProdutoTermotubos {
406
436
  reservado?: number | null;
407
437
  saldo?: number | null;
408
438
  }
439
+ export interface DescontoDoProduto {
440
+ atualizado_em?: string | null;
441
+ atualizado_por?: string | null;
442
+ estoque_minimo?: number | null;
443
+ origem?: string | null;
444
+ percentual_a_prazo: number;
445
+ percentual_a_vista: number;
446
+ situacao: string;
447
+ valido_ate?: string | null;
448
+ }
409
449
  export interface DetalheNaoConformidadeTermotubosParte2 {
410
450
  anexos: Array<AnexoNaoConformidade>;
411
451
  atualizado_por?: string | null;
@@ -588,10 +628,13 @@ export interface IndicadoresDeVenda {
588
628
  }
589
629
  export interface ItemDoPedido {
590
630
  adicionais?: Array<AdicionalDoItem>;
631
+ atributos_escolhidos_pela_ia?: Array<string>;
632
+ atributos_faltando?: Array<string>;
591
633
  escolhido?: OpcaoDoItem | null;
592
634
  observacao?: string | null;
593
635
  opcoes: Array<OpcaoDoItem>;
594
636
  pedido_do_cliente: string;
637
+ produto_sem_estoque?: OpcaoDoItem | null;
595
638
  quantidade: number;
596
639
  situacao: string;
597
640
  }
@@ -705,8 +748,11 @@ export interface OpcaoDeFiltro {
705
748
  valor: string;
706
749
  }
707
750
  export interface OpcaoDoItem {
751
+ cor?: string | null;
708
752
  disponivel: boolean;
709
753
  imagem_url?: string | null;
754
+ medida?: string | null;
755
+ modelo?: string | null;
710
756
  nome: string;
711
757
  preco_unitario: number;
712
758
  produto_id: string;
@@ -925,12 +971,16 @@ export interface PaginaPedidoAutoComplete {
925
971
  export interface PaginaProdutoItensItem {
926
972
  ativo: boolean;
927
973
  atualizado_em: string;
974
+ calcular_polegada: boolean;
975
+ campos_revisados: Array<string>;
928
976
  categoria_tiny?: string | null;
929
977
  comprimento?: string | null;
978
+ comprimento_polegada?: string | null;
930
979
  comprimento_unidade?: string | null;
931
980
  cor?: string | null;
932
981
  criado_em: string;
933
982
  demonstracao: boolean;
983
+ desconto?: DescontoDoProduto | null;
934
984
  descricao?: string | null;
935
985
  disponivel: boolean;
936
986
  embalagem?: string | null;
@@ -954,6 +1004,7 @@ export interface PaginaProdutoItensItem {
954
1004
  lancamento: boolean;
955
1005
  marca_tiny?: string | null;
956
1006
  medida?: string | null;
1007
+ medida_polegada?: string | null;
957
1008
  medida_unidade?: string | null;
958
1009
  ncm?: string | null;
959
1010
  nome: string;
@@ -964,10 +1015,14 @@ export interface PaginaProdutoItensItem {
964
1015
  peso_bruto?: number | null;
965
1016
  peso_liquido?: number | null;
966
1017
  preco: number;
1018
+ preco_a_prazo_sem_desconto?: number | null;
967
1019
  preco_a_vista: number;
1020
+ preco_a_vista_sem_desconto?: number | null;
968
1021
  preco_a_vista_tiny?: number | null;
969
1022
  preco_portal_b2b?: number | null;
1023
+ preco_portal_b2b_a_prazo?: number | null;
970
1024
  preco_tiny?: number | null;
1025
+ precos_por_unidade: Array<PrecoPorUnidade>;
971
1026
  quantidade_minima: number;
972
1027
  relevancia: number;
973
1028
  resumo_caracteristicas?: string | null;
@@ -1195,6 +1250,13 @@ export interface PedidoVendaTinyAutoComplete {
1195
1250
  id: number;
1196
1251
  rotulo: string;
1197
1252
  }
1253
+ export interface PrecoPorUnidade {
1254
+ ativo?: boolean;
1255
+ quantidade?: number | null;
1256
+ unidade: string;
1257
+ variacao_a_prazo?: number | null;
1258
+ variacao_a_vista?: number | null;
1259
+ }
1198
1260
  export interface ProblemaFrequente {
1199
1261
  problema: string;
1200
1262
  quantidade: number;
@@ -1202,12 +1264,16 @@ export interface ProblemaFrequente {
1202
1264
  export interface Produto {
1203
1265
  ativo: boolean;
1204
1266
  atualizado_em: string;
1267
+ calcular_polegada: boolean;
1268
+ campos_revisados: Array<string>;
1205
1269
  categoria_tiny?: string | null;
1206
1270
  comprimento?: string | null;
1271
+ comprimento_polegada?: string | null;
1207
1272
  comprimento_unidade?: string | null;
1208
1273
  cor?: string | null;
1209
1274
  criado_em: string;
1210
1275
  demonstracao: boolean;
1276
+ desconto?: DescontoDoProduto | null;
1211
1277
  descricao?: string | null;
1212
1278
  disponivel: boolean;
1213
1279
  embalagem?: string | null;
@@ -1231,6 +1297,7 @@ export interface Produto {
1231
1297
  lancamento: boolean;
1232
1298
  marca_tiny?: string | null;
1233
1299
  medida?: string | null;
1300
+ medida_polegada?: string | null;
1234
1301
  medida_unidade?: string | null;
1235
1302
  ncm?: string | null;
1236
1303
  nome: string;
@@ -1241,10 +1308,14 @@ export interface Produto {
1241
1308
  peso_bruto?: number | null;
1242
1309
  peso_liquido?: number | null;
1243
1310
  preco: number;
1311
+ preco_a_prazo_sem_desconto?: number | null;
1244
1312
  preco_a_vista: number;
1313
+ preco_a_vista_sem_desconto?: number | null;
1245
1314
  preco_a_vista_tiny?: number | null;
1246
1315
  preco_portal_b2b?: number | null;
1316
+ preco_portal_b2b_a_prazo?: number | null;
1247
1317
  preco_tiny?: number | null;
1318
+ precos_por_unidade: Array<PrecoPorUnidade>;
1248
1319
  quantidade_minima: number;
1249
1320
  relevancia: number;
1250
1321
  resumo_caracteristicas?: string | null;
@@ -1256,6 +1327,7 @@ export interface Produto {
1256
1327
  }
1257
1328
  export interface ProdutoAtualizar {
1258
1329
  ativo?: boolean | null;
1330
+ calcular_polegada?: boolean | null;
1259
1331
  comprimento?: string | null;
1260
1332
  comprimento_unidade?: string | null;
1261
1333
  cor?: string | null;
@@ -1278,6 +1350,8 @@ export interface ProdutoAtualizar {
1278
1350
  preco?: number | null;
1279
1351
  preco_a_vista?: number | null;
1280
1352
  preco_portal_b2b?: number | null;
1353
+ preco_portal_b2b_a_prazo?: number | null;
1354
+ precos_por_unidade?: Array<PrecoPorUnidade> | null;
1281
1355
  quantidade_minima?: number | null;
1282
1356
  relevancia?: number | null;
1283
1357
  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.11",
3
+ "version": "0.1.13",
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>",