termo_core 0.1.0 → 0.1.2

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.
@@ -1,21 +1,6 @@
1
1
  // Gerado pelo gerador do TermoCore (`cargo run -p gerador`). Não edite à mão: a próxima geração sobrescreve.
2
2
  import { chamar_servico, codificar_parametro_de_caminho } from "../base/requisicao.js";
3
3
  import { TERMO_PORTAL as SERVICO_DESTA_API } from "../base/servicos.js";
4
- /**
5
- * Versão da API
6
- *
7
- * Rota pública: não exige sessão. Confere se a API está no ar e devolve a versão publicada do backend.
8
- *
9
- * `GET /`
10
- */
11
- export function buscar_pelo_id_versao(opcoes_da_chamada) {
12
- return chamar_servico({
13
- servico: SERVICO_DESTA_API,
14
- metodo_http: "GET",
15
- caminho_da_rota: "/",
16
- formato_da_resposta: "json",
17
- }, opcoes_da_chamada);
18
- }
19
4
  /**
20
5
  * Envia um arquivo (imagem ou PDF de boletim)
21
6
  *
@@ -685,273 +670,6 @@ export function deletar_pelo_id_cliente(credencial_de_acesso, id, opcoes_da_cham
685
670
  formato_da_resposta: "sem_conteudo",
686
671
  }, opcoes_da_chamada);
687
672
  }
688
- /**
689
- * Lista colaboradores paginados
690
- *
691
- * Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno.
692
- *
693
- * `GET /colaborador`
694
- */
695
- export function buscar_paginador_colaborador(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
696
- return chamar_servico({
697
- servico: SERVICO_DESTA_API,
698
- metodo_http: "GET",
699
- caminho_da_rota: "/colaborador",
700
- credencial_de_acesso,
701
- parametros_de_consulta: parametros,
702
- formato_da_resposta: "json",
703
- }, opcoes_da_chamada);
704
- }
705
- /**
706
- * Cadastra o colaborador
707
- *
708
- * Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno com `usuarios.gerenciar`. `perfil_id` de colaborador (sem ele vale o perfil `acesso-inicial`, só leitura); só administrador atribui perfil de administrador.
709
- *
710
- * `POST /colaborador`
711
- */
712
- export function criar_colaborador(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
713
- return chamar_servico({
714
- servico: SERVICO_DESTA_API,
715
- metodo_http: "POST",
716
- caminho_da_rota: "/colaborador",
717
- credencial_de_acesso,
718
- corpo_json: corpo_da_requisicao,
719
- formato_da_resposta: "json",
720
- }, opcoes_da_chamada);
721
- }
722
- /**
723
- * Lista básica de colaboradores para seleção
724
- *
725
- * Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno. Devolve id, nome e e-mail em ordem alfabética; `busca` procura no nome e no e-mail; `tamanho` de 1 a 50 (padrão 10).
726
- *
727
- * `GET /colaborador/autocomplete`
728
- */
729
- export function buscar_auto_complete_colaborador(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
730
- return chamar_servico({
731
- servico: SERVICO_DESTA_API,
732
- metodo_http: "GET",
733
- caminho_da_rota: "/colaborador/autocomplete",
734
- credencial_de_acesso,
735
- parametros_de_consulta: parametros,
736
- formato_da_resposta: "json",
737
- }, opcoes_da_chamada);
738
- }
739
- /**
740
- * Busca colaboradores por filtro
741
- *
742
- * Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno. Até 50 por página (`pagina`, a partir de 1, padrão 1), em ordem alfabética; `nome` e `email` procuram o trecho, os demais são exatos.
743
- *
744
- * `GET /colaborador/filtro`
745
- */
746
- export function buscar_pelo_filtro_colaborador(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
747
- return chamar_servico({
748
- servico: SERVICO_DESTA_API,
749
- metodo_http: "GET",
750
- caminho_da_rota: "/colaborador/filtro",
751
- credencial_de_acesso,
752
- parametros_de_consulta: parametros,
753
- formato_da_resposta: "json",
754
- }, opcoes_da_chamada);
755
- }
756
- /**
757
- * Busca o colaborador pelo id
758
- *
759
- * Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno.
760
- *
761
- * `GET /colaborador/{id}`
762
- */
763
- export function buscar_pelo_id_colaborador(credencial_de_acesso, id, opcoes_da_chamada) {
764
- return chamar_servico({
765
- servico: SERVICO_DESTA_API,
766
- metodo_http: "GET",
767
- caminho_da_rota: `/colaborador/${codificar_parametro_de_caminho(id)}`,
768
- credencial_de_acesso,
769
- formato_da_resposta: "json",
770
- }, opcoes_da_chamada);
771
- }
772
- /**
773
- * Atualiza o colaborador
774
- *
775
- * Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Atualização parcial. Exige colaborador interno com `usuarios.gerenciar`; o próprio colaborador só altera nome, telefone, cargo e `presente` (heartbeat que grava `ultimo_acesso_em`).
776
- *
777
- * `PATCH /colaborador/{id}`
778
- */
779
- export function atualizar_pelo_id_colaborador(credencial_de_acesso, id, corpo_da_requisicao, opcoes_da_chamada) {
780
- return chamar_servico({
781
- servico: SERVICO_DESTA_API,
782
- metodo_http: "PATCH",
783
- caminho_da_rota: `/colaborador/${codificar_parametro_de_caminho(id)}`,
784
- credencial_de_acesso,
785
- corpo_json: corpo_da_requisicao,
786
- formato_da_resposta: "json",
787
- }, opcoes_da_chamada);
788
- }
789
- /**
790
- * Exclui o colaborador
791
- *
792
- * Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno com `usuarios.gerenciar`. Exclusão lógica.
793
- *
794
- * `DELETE /colaborador/{id}`
795
- */
796
- export function deletar_pelo_id_colaborador(credencial_de_acesso, id, opcoes_da_chamada) {
797
- return chamar_servico({
798
- servico: SERVICO_DESTA_API,
799
- metodo_http: "DELETE",
800
- caminho_da_rota: `/colaborador/${codificar_parametro_de_caminho(id)}`,
801
- credencial_de_acesso,
802
- formato_da_resposta: "sem_conteudo",
803
- }, opcoes_da_chamada);
804
- }
805
- /**
806
- * Lista as configurações paginadas
807
- *
808
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Ordem de chave. 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`.
809
- *
810
- * `GET /configuracao`
811
- */
812
- export function buscar_paginador_configuracao(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
813
- return chamar_servico({
814
- servico: SERVICO_DESTA_API,
815
- metodo_http: "GET",
816
- caminho_da_rota: "/configuracao",
817
- credencial_de_acesso,
818
- parametros_de_consulta: parametros,
819
- formato_da_resposta: "json",
820
- }, opcoes_da_chamada);
821
- }
822
- /**
823
- * Grava uma configuração do portal
824
- *
825
- * Exige a permissão `criar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Configuração chave/valor do portal (vitrine). `chave` precisa ser uma das chaves conhecidas (ex.: `produtos_mostrar_preco`) e `valor` (texto) segue o tipo da chave: booleano `true`/`false`, hora `HH:MM`, decimal ou texto com limite. Cada chave existe uma vez só.
826
- *
827
- * `POST /configuracao`
828
- */
829
- export function criar_configuracao(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
830
- return chamar_servico({
831
- servico: SERVICO_DESTA_API,
832
- metodo_http: "POST",
833
- caminho_da_rota: "/configuracao",
834
- credencial_de_acesso,
835
- corpo_json: corpo_da_requisicao,
836
- formato_da_resposta: "json",
837
- }, opcoes_da_chamada);
838
- }
839
- /**
840
- * Lista básica de configurações para seleção
841
- *
842
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve só id e chave, em ordem de chave. `busca` procura o trecho na chave. `tamanho` tem padrão 10 e vai de 1 a 50; `pagina` começa em 1. A resposta traz `itens`, `total`, `pagina` e `tamanho`.
843
- *
844
- * `GET /configuracao/autocomplete`
845
- */
846
- export function buscar_auto_complete_configuracao(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
847
- return chamar_servico({
848
- servico: SERVICO_DESTA_API,
849
- metodo_http: "GET",
850
- caminho_da_rota: "/configuracao/autocomplete",
851
- credencial_de_acesso,
852
- parametros_de_consulta: parametros,
853
- formato_da_resposta: "json",
854
- }, opcoes_da_chamada);
855
- }
856
- /**
857
- * Busca configurações por filtro
858
- *
859
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve as configurações não excluídas que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1), em ordem de chave. `chave` é exata; `prefixo` pega as chaves que começam com o texto (ex.: `produtos_`).
860
- *
861
- * `GET /configuracao/filtro`
862
- */
863
- export function buscar_pelo_filtro_configuracao(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
864
- return chamar_servico({
865
- servico: SERVICO_DESTA_API,
866
- metodo_http: "GET",
867
- caminho_da_rota: "/configuracao/filtro",
868
- credencial_de_acesso,
869
- parametros_de_consulta: parametros,
870
- formato_da_resposta: "json",
871
- }, opcoes_da_chamada);
872
- }
873
- /**
874
- * Busca uma configuração pelo id
875
- *
876
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Configuração excluída não é encontrada.
877
- *
878
- * `GET /configuracao/{id}`
879
- */
880
- export function buscar_pelo_id_configuracao(credencial_de_acesso, id, opcoes_da_chamada) {
881
- return chamar_servico({
882
- servico: SERVICO_DESTA_API,
883
- metodo_http: "GET",
884
- caminho_da_rota: `/configuracao/${codificar_parametro_de_caminho(id)}`,
885
- credencial_de_acesso,
886
- formato_da_resposta: "json",
887
- }, opcoes_da_chamada);
888
- }
889
- /**
890
- * Atualiza o valor de uma configuração
891
- *
892
- * Exige a permissão `editar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Troca o `valor`, validado pelo tipo da chave.
893
- *
894
- * `PATCH /configuracao/{id}`
895
- */
896
- export function atualizar_pelo_id_configuracao(credencial_de_acesso, id, corpo_da_requisicao, opcoes_da_chamada) {
897
- return chamar_servico({
898
- servico: SERVICO_DESTA_API,
899
- metodo_http: "PATCH",
900
- caminho_da_rota: `/configuracao/${codificar_parametro_de_caminho(id)}`,
901
- credencial_de_acesso,
902
- corpo_json: corpo_da_requisicao,
903
- formato_da_resposta: "json",
904
- }, opcoes_da_chamada);
905
- }
906
- /**
907
- * Exclui uma configuração
908
- *
909
- * Exige a permissão `excluir` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). A exclusão é lógica: o registro some das leituras, mas a linha não é apagada.
910
- *
911
- * `DELETE /configuracao/{id}`
912
- */
913
- export function deletar_pelo_id_configuracao(credencial_de_acesso, id, opcoes_da_chamada) {
914
- return chamar_servico({
915
- servico: SERVICO_DESTA_API,
916
- metodo_http: "DELETE",
917
- caminho_da_rota: `/configuracao/${codificar_parametro_de_caminho(id)}`,
918
- credencial_de_acesso,
919
- formato_da_resposta: "sem_conteudo",
920
- }, opcoes_da_chamada);
921
- }
922
- /**
923
- * Mostra a situação do segredo do app gerado no TermoAuth
924
- *
925
- * Só um master do TermoAuth (e-mail `@termotubos.com.br`) lê. Nunca devolve o valor: `segredo_do_app_gerado_no_termo_auth` traz só `configurado` e o final mascarado (`final_visivel`). `criptografia_disponivel` é falso quando o servidor está sem a `GLOBAL_SECRET_CRIPTOGRAFIA`; nesse caso o segredo aparece como não configurado.
926
- *
927
- * `GET /configuracao_provedor`
928
- */
929
- export function buscar_pelo_id_configuracao_provedor(credencial_de_acesso, opcoes_da_chamada) {
930
- return chamar_servico({
931
- servico: SERVICO_DESTA_API,
932
- metodo_http: "GET",
933
- caminho_da_rota: "/configuracao_provedor",
934
- credencial_de_acesso,
935
- formato_da_resposta: "json",
936
- }, opcoes_da_chamada);
937
- }
938
- /**
939
- * Grava ou limpa o segredo do app gerado no TermoAuth
940
- *
941
- * Só um master do TermoAuth (e-mail `@termotubos.com.br`) grava. O segredo do app `portal-b2b` é guardado cifrado (AES-256-GCM com a `GLOBAL_SECRET_CRIPTOGRAFIA`) e entregue na hora ao `termo_core`, sem deploy. Campo ausente não muda nada, texto troca o segredo e `null` (ou texto vazio) limpa. No máximo 2.000 caracteres, sem quebra de linha.
942
- *
943
- * `PATCH /configuracao_provedor`
944
- */
945
- export function atualizar_pelo_id_configuracao_provedor(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
946
- return chamar_servico({
947
- servico: SERVICO_DESTA_API,
948
- metodo_http: "PATCH",
949
- caminho_da_rota: "/configuracao_provedor",
950
- credencial_de_acesso,
951
- corpo_json: corpo_da_requisicao,
952
- formato_da_resposta: "json",
953
- }, opcoes_da_chamada);
954
- }
955
673
  /**
956
674
  * Lista os contatos paginados
957
675
  *
@@ -1538,6 +1256,39 @@ export function buscar_pelo_filtro_indicador_venda(credencial_de_acesso, paramet
1538
1256
  formato_da_resposta: "json",
1539
1257
  }, opcoes_da_chamada);
1540
1258
  }
1259
+ /**
1260
+ * Gera um link de envio de imagem para o produto do SKU
1261
+ *
1262
+ * Exige colaborador interno com a permissão `editar` no módulo `Configuracoes`. Serve para enviar a imagem de um arquivo local (ex.: uma pasta do computador) sem passar o conteúdo pela ferramenta: gere um link por imagem e envie o arquivo direto para a `url_envio` com `curl -X PATCH -F "arquivo=@<caminho do arquivo>" <url_envio>` (sem token: o link já autoriza). O envio grava a imagem no TermoBucket e já a acrescenta ao fim das `imagens` do produto (a primeira continua a principal); a resposta traz a `url` da imagem e a lista de `imagens` do produto. O link é de uso único e vence em 15 minutos (`expira_em`). Campos: `sku` do produto, sem diferenciar maiúsculas. Na resposta, `imagens_no_produto` e `vagas_de_imagem` dizem quantas imagens ele já tem e quantas ainda cabem (até 15). Imagem PNG, JPG, WEBP ou GIF até 5 MB. Dica: com o nome do arquivo começando pelo SKU (`<SKU>.png`, `<SKU>_2.png`), dá para enviar uma pasta inteira descobrindo o produto pelo nome.
1263
+ *
1264
+ * `POST /link_envio_imagem`
1265
+ */
1266
+ export function criar_link_envio_imagem(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
1267
+ return chamar_servico({
1268
+ servico: SERVICO_DESTA_API,
1269
+ metodo_http: "POST",
1270
+ caminho_da_rota: "/link_envio_imagem",
1271
+ credencial_de_acesso,
1272
+ corpo_json: corpo_da_requisicao,
1273
+ formato_da_resposta: "json",
1274
+ }, opcoes_da_chamada);
1275
+ }
1276
+ /**
1277
+ * Envia a imagem pelo link e a acrescenta ao produto
1278
+ *
1279
+ * Rota pública: quem autoriza é o próprio link (`id` de uso único gerado pelo `POST /link_envio_imagem`, válido por 15 minutos). Formulário `multipart/form-data` com o campo `arquivo` (PNG, JPG, WEBP ou GIF até 5 MB; o tipo sai dos bytes). Grava a imagem no TermoBucket e a acrescenta ao fim das `imagens` do produto. Se o envio falha (formato, tamanho, TermoBucket fora do ar), o link continua valendo até vencer.
1280
+ *
1281
+ * `PATCH /link_envio_imagem/{id}`
1282
+ */
1283
+ export function atualizar_pelo_id_link_envio_imagem(id, formulario, opcoes_da_chamada) {
1284
+ return chamar_servico({
1285
+ servico: SERVICO_DESTA_API,
1286
+ metodo_http: "PATCH",
1287
+ caminho_da_rota: `/link_envio_imagem/${codificar_parametro_de_caminho(id)}`,
1288
+ formulario,
1289
+ formato_da_resposta: "json",
1290
+ }, opcoes_da_chamada);
1291
+ }
1541
1292
  /**
1542
1293
  * Uma página das notas fiscais, por cursor
1543
1294
  *
@@ -2043,7 +1794,7 @@ export function deletar_pelo_id_perfil(credencial_de_acesso, id, opcoes_da_chama
2043
1794
  /**
2044
1795
  * Lista os produtos paginados
2045
1796
  *
2046
- * 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`, `material`, `diametro`, `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.
1797
+ * 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.
2047
1798
  *
2048
1799
  * `GET /produto`
2049
1800
  */
@@ -2060,7 +1811,7 @@ export function buscar_paginador_produto(credencial_de_acesso, parametros = {},
2060
1811
  /**
2061
1812
  * Cadastra um produto
2062
1813
  *
2063
- * Exige a permissão `criar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Produto do catálogo. `sku` até 32 letras, números, ponto, hífen e `_`, único; `nome` de 2 a 200 caracteres; `preco` e `preco_a_vista` maiores que zero (à vista não maior que o base); `unidade` de venda obrigatória; `estoque` não negativo; `incremento_minimo` e `quantidade_minima` maiores que zero; até 15 `imagens` (URLs; a primeira é a principal). Campos: `aplicacao` é o texto de onde o produto é usado; `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); `embalagem_quantidade` é quantas unidades vêm na embalagem fechada (não negativa); `embalagem_preco` é o preço da embalagem fechada (não negativo); `diametro`, `material`, `cor` e `temperatura` são atributos técnicos em texto; `material` é atributo técnico em texto; `temperatura` é atributo técnico em texto; `lancamento` (booleano) marca o produto como lançamento; `relevancia` (inteiro) ordena a vitrine, da maior para a menor; `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); `demonstracao` (booleano) marca produto de demonstração; `importado_da_api` (booleano) marca produto vindo do Tiny; `heuristica_pendente` é a lista de campos que ainda precisam de revisão manual.
1814
+ * Exige a permissão `criar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Produto do catálogo. `sku` até 32 letras, números, ponto, hífen e `_`, único; `nome` de 2 a 200 caracteres; `preco` e `preco_a_vista` maiores que zero (à vista não maior que o base); `unidade` de venda obrigatória; `estoque` não negativo; `incremento_minimo` e `quantidade_minima` maiores que zero; até 15 `imagens` (URLs; a primeira é a principal). Campos: `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); `embalagem_quantidade` é quantas unidades vêm na embalagem fechada (não negativa); `embalagem_preco` é o preço da embalagem fechada (não negativo); `cor` é atributo em texto; `lancamento` (booleano) marca o produto como lançamento; `relevancia` (inteiro) ordena a vitrine, da maior para a menor; `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); `demonstracao` (booleano) marca produto de demonstração; `importado_da_api` (booleano) marca produto vindo do Tiny; `heuristica_pendente` é a lista de campos que ainda precisam de revisão manual.
2064
1815
  *
2065
1816
  * `POST /produto`
2066
1817
  */
@@ -2094,7 +1845,7 @@ export function buscar_auto_complete_produto(credencial_de_acesso, parametros =
2094
1845
  /**
2095
1846
  * Busca produtos por filtro
2096
1847
  *
2097
- * 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`, `material`, `diametro`, `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.
1848
+ * 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.
2098
1849
  *
2099
1850
  * `GET /produto/filtro`
2100
1851
  */
@@ -2127,7 +1878,7 @@ export function buscar_pelo_id_produto(credencial_de_acesso, id, opcoes_da_chama
2127
1878
  /**
2128
1879
  * Atualiza um produto
2129
1880
  *
2130
- * 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; `aplicacao` é o texto de onde o produto é usado; `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; `diametro`, `material`, `cor` e `temperatura` são atributos técnicos em texto; `material` é atributo técnico em texto; `temperatura` é atributo técnico 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).
1881
+ * 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).
2131
1882
  *
2132
1883
  * `PATCH /produto/{id}`
2133
1884
  */
@@ -213,41 +213,6 @@ export interface ClientePaginador {
213
213
  export interface ClienteSincronizar {
214
214
  cursor?: number | null;
215
215
  }
216
- export interface Colaborador {
217
- atualizado_em: string;
218
- cargo?: string | null;
219
- criado_em: string;
220
- email: string;
221
- foto_url?: string | null;
222
- id: string;
223
- nome: string;
224
- perfil_id: string;
225
- perfil_nome: string;
226
- status: string;
227
- telefone?: string | null;
228
- ultimo_acesso_em?: string | null;
229
- }
230
- export interface ColaboradorAtualizar {
231
- cargo?: string | null;
232
- nome?: string | null;
233
- perfil_id?: string | null;
234
- presente?: boolean | null;
235
- status?: string | null;
236
- telefone?: string | null;
237
- }
238
- export interface ColaboradorAutoComplete {
239
- email: string;
240
- id: string;
241
- nome: string;
242
- }
243
- export interface ColaboradorCriar {
244
- cargo?: string | null;
245
- email: string;
246
- nome: string;
247
- perfil_id?: string | null;
248
- status?: string | null;
249
- telefone?: string | null;
250
- }
251
216
  export interface CompraDoMes {
252
217
  comprado: number;
253
218
  mes: string;
@@ -257,33 +222,6 @@ export interface CompraPorTipo {
257
222
  comprado: number;
258
223
  tipo: string;
259
224
  }
260
- export interface Configuracao {
261
- atualizado_em: string;
262
- chave: string;
263
- criado_em: string;
264
- id: string;
265
- valor: string;
266
- }
267
- export interface ConfiguracaoAtualizar {
268
- valor: string;
269
- }
270
- export interface ConfiguracaoAutoComplete {
271
- chave: string;
272
- id: string;
273
- }
274
- export interface ConfiguracaoCriar {
275
- chave: string;
276
- valor: string;
277
- }
278
- export interface ConfiguracaoProvedor {
279
- atualizado_em: string;
280
- atualizado_por?: string | null;
281
- criptografia_disponivel: boolean;
282
- segredo_do_app_gerado_no_termo_auth: ValorProtegido;
283
- }
284
- export interface ConfiguracaoProvedorAtualizar {
285
- segredo_do_app_gerado_no_termo_auth?: string | null;
286
- }
287
225
  export interface ContagemClientes {
288
226
  com_acesso: number;
289
227
  sem_acesso: number;
@@ -575,6 +513,15 @@ export interface HistoricoPrecoTermotubos {
575
513
  preco?: number | null;
576
514
  preco_promocional?: number | null;
577
515
  }
516
+ export interface ImagemDoLink {
517
+ arquivo: string;
518
+ }
519
+ export interface ImagemEnviada {
520
+ imagens: Array<string>;
521
+ produto_id: string;
522
+ sku: string;
523
+ url: string;
524
+ }
578
525
  export interface ImportacaoProdutos {
579
526
  atualizados: number;
580
527
  conflitos: number;
@@ -645,6 +592,18 @@ export interface ItemSincronizado {
645
592
  resultado: string;
646
593
  sku: string;
647
594
  }
595
+ export interface LinkEnvioImagem {
596
+ expira_em: string;
597
+ id: string;
598
+ imagens_no_produto: number;
599
+ produto_id: string;
600
+ sku: string;
601
+ url_envio: string;
602
+ vagas_de_imagem: number;
603
+ }
604
+ export interface LinkEnvioImagemCriar {
605
+ sku: string;
606
+ }
648
607
  export interface NotaFiscalParte2 {
649
608
  parcelas: Array<ParcelaNotaFiscal>;
650
609
  parcelas_lidas: boolean;
@@ -769,60 +728,6 @@ export interface PaginaClienteAutoComplete {
769
728
  tamanho: number;
770
729
  total: number;
771
730
  }
772
- export interface PaginaColaboradorItensItem {
773
- atualizado_em: string;
774
- cargo?: string | null;
775
- criado_em: string;
776
- email: string;
777
- foto_url?: string | null;
778
- id: string;
779
- nome: string;
780
- perfil_id: string;
781
- perfil_nome: string;
782
- status: string;
783
- telefone?: string | null;
784
- ultimo_acesso_em?: string | null;
785
- }
786
- export interface PaginaColaborador {
787
- itens: Array<PaginaColaboradorItensItem>;
788
- pagina: number;
789
- tamanho: number;
790
- total: number;
791
- }
792
- export interface PaginaColaboradorAutoCompleteItensItem {
793
- email: string;
794
- id: string;
795
- nome: string;
796
- }
797
- export interface PaginaColaboradorAutoComplete {
798
- itens: Array<PaginaColaboradorAutoCompleteItensItem>;
799
- pagina: number;
800
- tamanho: number;
801
- total: number;
802
- }
803
- export interface PaginaConfiguracaoItensItem {
804
- atualizado_em: string;
805
- chave: string;
806
- criado_em: string;
807
- id: string;
808
- valor: string;
809
- }
810
- export interface PaginaConfiguracao {
811
- itens: Array<PaginaConfiguracaoItensItem>;
812
- pagina: number;
813
- tamanho: number;
814
- total: number;
815
- }
816
- export interface PaginaConfiguracaoAutoCompleteItensItem {
817
- chave: string;
818
- id: string;
819
- }
820
- export interface PaginaConfiguracaoAutoComplete {
821
- itens: Array<PaginaConfiguracaoAutoCompleteItensItem>;
822
- pagina: number;
823
- tamanho: number;
824
- total: number;
825
- }
826
731
  export interface PaginaContatoItensItem {
827
732
  atualizado_em: string;
828
733
  cargo?: string | null;
@@ -983,7 +888,6 @@ export interface PaginaPerfilAutoComplete {
983
888
  total: number;
984
889
  }
985
890
  export interface PaginaProdutoItensItem {
986
- aplicacao?: string | null;
987
891
  ativo: boolean;
988
892
  atualizado_em: string;
989
893
  categoria_tiny?: string | null;
@@ -991,7 +895,6 @@ export interface PaginaProdutoItensItem {
991
895
  criado_em: string;
992
896
  demonstracao: boolean;
993
897
  descricao?: string | null;
994
- diametro?: string | null;
995
898
  disponivel: boolean;
996
899
  embalagem?: string | null;
997
900
  embalagem_altura?: number | null;
@@ -1013,7 +916,6 @@ export interface PaginaProdutoItensItem {
1013
916
  incremento_minimo: number;
1014
917
  lancamento: boolean;
1015
918
  marca_tiny?: string | null;
1016
- material?: string | null;
1017
919
  ncm?: string | null;
1018
920
  nome: string;
1019
921
  nome_comercial?: string | null;
@@ -1032,7 +934,6 @@ export interface PaginaProdutoItensItem {
1032
934
  resumo_caracteristicas?: string | null;
1033
935
  sincronizado_em?: string | null;
1034
936
  sku: string;
1035
- temperatura?: string | null;
1036
937
  tipo_tiny?: string | null;
1037
938
  unidade: string;
1038
939
  unidade_medida: string;
@@ -1363,7 +1264,6 @@ export interface PerfilPermissaoEntrada {
1363
1264
  ver: boolean;
1364
1265
  }
1365
1266
  export interface Produto {
1366
- aplicacao?: string | null;
1367
1267
  ativo: boolean;
1368
1268
  atualizado_em: string;
1369
1269
  categoria_tiny?: string | null;
@@ -1371,7 +1271,6 @@ export interface Produto {
1371
1271
  criado_em: string;
1372
1272
  demonstracao: boolean;
1373
1273
  descricao?: string | null;
1374
- diametro?: string | null;
1375
1274
  disponivel: boolean;
1376
1275
  embalagem?: string | null;
1377
1276
  embalagem_altura?: number | null;
@@ -1393,7 +1292,6 @@ export interface Produto {
1393
1292
  incremento_minimo: number;
1394
1293
  lancamento: boolean;
1395
1294
  marca_tiny?: string | null;
1396
- material?: string | null;
1397
1295
  ncm?: string | null;
1398
1296
  nome: string;
1399
1297
  nome_comercial?: string | null;
@@ -1412,17 +1310,14 @@ export interface Produto {
1412
1310
  resumo_caracteristicas?: string | null;
1413
1311
  sincronizado_em?: string | null;
1414
1312
  sku: string;
1415
- temperatura?: string | null;
1416
1313
  tipo_tiny?: string | null;
1417
1314
  unidade: string;
1418
1315
  unidade_medida: string;
1419
1316
  }
1420
1317
  export interface ProdutoAtualizar {
1421
- aplicacao?: string | null;
1422
1318
  ativo?: boolean | null;
1423
1319
  cor?: string | null;
1424
1320
  descricao?: string | null;
1425
- diametro?: string | null;
1426
1321
  embalagem?: string | null;
1427
1322
  embalagem_preco?: number | null;
1428
1323
  embalagem_quantidade?: number | null;
@@ -1433,7 +1328,6 @@ export interface ProdutoAtualizar {
1433
1328
  imagens?: Array<string> | null;
1434
1329
  incremento_minimo?: number | null;
1435
1330
  lancamento?: boolean | null;
1436
- material?: string | null;
1437
1331
  nome?: string | null;
1438
1332
  nome_comercial?: string | null;
1439
1333
  outras_informacoes?: string | null;
@@ -1443,7 +1337,6 @@ export interface ProdutoAtualizar {
1443
1337
  quantidade_minima?: number | null;
1444
1338
  relevancia?: number | null;
1445
1339
  resumo_caracteristicas?: string | null;
1446
- temperatura?: string | null;
1447
1340
  unidade?: string | null;
1448
1341
  unidade_medida?: string | null;
1449
1342
  }
@@ -1490,12 +1383,10 @@ export interface ProdutoConflitoSincronizacaoCriar {
1490
1383
  valor_local: string;
1491
1384
  }
1492
1385
  export interface ProdutoCriar {
1493
- aplicacao?: string | null;
1494
1386
  ativo?: boolean | null;
1495
1387
  cor?: string | null;
1496
1388
  demonstracao?: boolean | null;
1497
1389
  descricao?: string | null;
1498
- diametro?: string | null;
1499
1390
  embalagem?: string | null;
1500
1391
  embalagem_preco?: number | null;
1501
1392
  embalagem_quantidade?: number | null;
@@ -1507,7 +1398,6 @@ export interface ProdutoCriar {
1507
1398
  importado_da_api?: boolean | null;
1508
1399
  incremento_minimo?: number | null;
1509
1400
  lancamento?: boolean | null;
1510
- material?: string | null;
1511
1401
  nome: string;
1512
1402
  outras_informacoes?: string | null;
1513
1403
  preco: number;
@@ -1515,7 +1405,6 @@ export interface ProdutoCriar {
1515
1405
  quantidade_minima?: number | null;
1516
1406
  relevancia?: number | null;
1517
1407
  sku: string;
1518
- temperatura?: string | null;
1519
1408
  unidade: string;
1520
1409
  unidade_medida?: string | null;
1521
1410
  }
@@ -1784,10 +1673,6 @@ export interface UnidadeReferencia {
1784
1673
  id: string;
1785
1674
  razao_social: string;
1786
1675
  }
1787
- export interface ValorProtegido {
1788
- configurado: boolean;
1789
- final_visivel?: string | null;
1790
- }
1791
1676
  export interface VendaAgrupada {
1792
1677
  chave?: string | null;
1793
1678
  pedidos: number;
@@ -1799,7 +1684,3 @@ export interface VendaDoDia {
1799
1684
  pedidos: number;
1800
1685
  vendido: number;
1801
1686
  }
1802
- export interface VersaoDaApi {
1803
- sucesso: boolean;
1804
- versao: string;
1805
- }