termo_core 0.1.3 → 0.1.5

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,60 +1,10 @@
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
- * Envia um arquivo (imagem ou PDF de boletim)
6
- *
7
- * Exige uma sessão válida; as pastas (`produtos` e `boletins`) exigem a permissão `criar` ou `editar` no módulo `Configuracoes`. Formulário `multipart/form-data` com os campos `pasta` e `arquivo`. Imagem de produto (`produtos`, até 5 MB, PNG, JPG, WEBP ou GIF) vai para o TermoBucket (bucket público, app `portal-b2b`, pelo token do próprio app) e a `url` devolvida é o endereço público permanente dela, que vai nas `imagens` do produto (até 15). PDF de boletim (`boletins`, até 20 MB) fica no disco da API e a `url` é relativa (`/arquivo/boletins/<uuid>.pdf`).
8
- *
9
- * `POST /arquivo`
10
- */
11
- export function criar_arquivo(credencial_de_acesso, formulario, opcoes_da_chamada) {
12
- return chamar_servico({
13
- servico: SERVICO_DESTA_API,
14
- metodo_http: "POST",
15
- caminho_da_rota: "/arquivo",
16
- credencial_de_acesso,
17
- formulario,
18
- formato_da_resposta: "json",
19
- }, opcoes_da_chamada);
20
- }
21
- /**
22
- * Lê um arquivo enviado
23
- *
24
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve o conteúdo do arquivo com o `Content-Type` dele (imagem ou PDF). `caminho` é o que vem depois de `/arquivo/` na `url` devolvida pelo envio (ex.: `produtos/<uuid>.png`). Campos: `baixar` com o valor `1` força o download (Content-Disposition attachment); `nome` é o nome sugerido para o download (só letras, números, ponto, hífen e `_`).
25
- *
26
- * `GET /arquivo/{caminho}`
27
- */
28
- export function buscar_pelo_id_arquivo(credencial_de_acesso, caminho, parametros = {}, opcoes_da_chamada) {
29
- return chamar_servico({
30
- servico: SERVICO_DESTA_API,
31
- metodo_http: "GET",
32
- caminho_da_rota: `/arquivo/${codificar_parametro_de_caminho(caminho)}`,
33
- credencial_de_acesso,
34
- parametros_de_consulta: parametros,
35
- formato_da_resposta: "bytes",
36
- }, opcoes_da_chamada);
37
- }
38
- /**
39
- * Apaga um arquivo enviado
40
- *
41
- * Exige a permissão `excluir` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Apaga o arquivo do disco de verdade (não há exclusão lógica para arquivos). `caminho` é o que vem depois de `/arquivo/` na `url`.
42
- *
43
- * `DELETE /arquivo/{caminho}`
44
- */
45
- export function deletar_pelo_id_arquivo(credencial_de_acesso, caminho, opcoes_da_chamada) {
46
- return chamar_servico({
47
- servico: SERVICO_DESTA_API,
48
- metodo_http: "DELETE",
49
- caminho_da_rota: `/arquivo/${codificar_parametro_de_caminho(caminho)}`,
50
- credencial_de_acesso,
51
- formato_da_resposta: "sem_conteudo",
52
- }, opcoes_da_chamada);
53
- }
54
4
  /**
55
5
  * Lista as categorias com a situação do boletim
56
6
  *
57
- * Exige sessão. Uma linha por categoria do SKU (`sku_categoria` da tabela auxiliar, mais as que já têm boletim), tenha ela boletim ou não: `boletim_tecnico_id` e `atualizado_em` vêm nulos quando ainda não tem. `total_medidas` junta as medidas dos produtos da categoria e as já descritas; `situacao` é `vazio` (sem descrição e sem medida descrita), `completo` (com descrição e todas as medidas descritas) ou `incompleto`. `busca` procura no código e na descrição; `situacao` filtra. Ordem pelo código, 50 por página, por cursor: `cursor` é o `sku_categoria` da última linha recebida. As categorias saem de um cache em memória, descartado a cada gravação em boletim, medida, tabela auxiliar ou produto (e recarregado do banco no máximo a cada 10 minutos).
7
+ * Exige sessão. Uma linha por categoria do SKU (`sku_categoria` da tabela auxiliar, mais as que já têm boletim), tenha ela boletim ou não: `boletim_tecnico_id` e `atualizado_em` vêm nulos quando ainda não tem. `total_medidas` junta as medidas dos produtos da categoria e as já descritas; `situacao` é `vazio` (sem nome e sem descrição), `completo` (com nome e descrição) ou `incompleto` (só um dos dois); as medidas não contam. `busca` procura no código e na descrição; `situacao` filtra. Ordem pelo código, 50 por página, por cursor: `cursor` é o `sku_categoria` da última linha recebida. As categorias saem de um cache em memória, descartado a cada gravação em boletim, medida, tabela auxiliar ou produto (e recarregado do banco no máximo a cada 10 minutos).
58
8
  *
59
9
  * `GET /boletim_tecnico`
60
10
  */
@@ -604,23 +554,6 @@ export function buscar_informacoes_paginador_cliente(credencial_de_acesso, param
604
554
  formato_da_resposta: "json",
605
555
  }, opcoes_da_chamada);
606
556
  }
607
- /**
608
- * Sincroniza um lote de clientes do Tiny
609
- *
610
- * Só colaborador interno com `editar` no módulo `Configuracoes`. Traz 10 páginas (500 clientes) do TermoIntranetAPI pelo `termo_core` (token do próprio app no TermoAuth) e grava na tabela `cliente`: cliente que já entra no portal é casado pelo CNPJ da unidade dele e só recebe os campos do Tiny (`id_api`, `codigo`, `id_tiny`, `cpf_cnpj`, `tipo_pessoa`, `nome_fantasia`, `email_tiny`, `telefone_tiny`, `celular`, `cidade`, `uf`, `vendedor`, `situacao_tiny`); os demais entram sem login (`email` nulo, `status` `inativo`). A listagem de lá é por cursor: a primeira chamada vai sem `cursor` e a seguinte manda o `proximo_cursor` recebido (nulo no fim). `total` é o total de clientes ativos na intranet. O backend também sincroniza sozinho (`SINCRONIZACAO_CLIENTE_MINUTOS`, `_PAGINAS` e `_COMPLETA_HORAS`).
611
- *
612
- * `POST /cliente/sincronizar`
613
- */
614
- export function sincronizar_cliente(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
615
- return chamar_servico({
616
- servico: SERVICO_DESTA_API,
617
- metodo_http: "POST",
618
- caminho_da_rota: "/cliente/sincronizar",
619
- credencial_de_acesso,
620
- corpo_json: corpo_da_requisicao,
621
- formato_da_resposta: "json",
622
- }, opcoes_da_chamada);
623
- }
624
557
  /**
625
558
  * Busca o cliente pelo id
626
559
  *
@@ -790,7 +723,7 @@ export function deletar_pelo_id_contato(credencial_de_acesso, id, opcoes_da_cham
790
723
  /**
791
724
  * Lista uma página de cotações
792
725
  *
793
- * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Devolve só o array da página, até 50 cotações, das mais novas para as mais antigas; o total, as páginas e as contagens por situação vêm de `GET /cotacao/paginador`, com os mesmos filtros. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da própria sessão; colaborador interno pode omitir e vê todas. Filtros opcionais: `status` (um dos 5 valores, senão 400 `Status inválido`); `busca` procura o número (C-1048 ou 1048), o SKU ou o nome de um item e a razão social da unidade; `inicio`/`fim` são datas AAAA-MM-DD do envio, em Brasília, inclusivas; `cursor` é o id da última cotação da página anterior.
726
+ * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Devolve só o array da página, até 50 cotações, das mais novas para as mais antigas; o total, as páginas e as contagens por situação vêm de `GET /cotacao/paginador`, com os mesmos filtros. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da própria sessão; colaborador interno pode omitir e vê todas. Filtros opcionais: `status` (um dos 5 valores, senão 400 `Status inválido`); `busca` procura o número (C-1048 ou 1048), o SKU ou o nome de um item e a razão social da unidade; `inicio`/`fim` são datas AAAA-MM-DD do envio, em Brasília, inclusivas; `origem` (`carrinho`, `pedido_inteligente`) é exata; `cursor` é o id da última cotação da página anterior.
794
727
  *
795
728
  * `GET /cotacao`
796
729
  */
@@ -807,7 +740,7 @@ export function buscar_paginador_cotacao(credencial_de_acesso, parametros = {},
807
740
  /**
808
741
  * Cria uma cotação (carrinho enviado)
809
742
  *
810
- * Exige a permissão `criar` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Monta a cotação no servidor a partir dos itens (`produto_id`, `quantidade` acima de zero e até 9999, `embalagem_fechada`, `preco_unitario` visto pelo cliente), com 1 a 200 itens e sem produto repetido. Recalcula preços por faixa, confere `total_esperado` e grava com o status inicial. A unidade precisa ser da sessão (colaborador interno acessa todas) e, para quem não é colaborador interno, o autor é sempre quem chama. `acima_do_limite` indica que a cotação passa o limite de faturamento da unidade. Campos: `unidade_id` (uuid) é a unidade compradora, da sessão; `autor_cliente_id` é a pessoa autora (uuid; para quem não é colaborador interno vale sempre a própria pessoa); `itens` é a lista de 1 a 200 itens, cada um com `produto_id`, `quantidade`, `embalagem_fechada` e `preco_unitario`; `economia_tier` é a economia do grupo de cliente vista no carrinho (decimal, informativo); `carrinho_id` (opcional) é o carrinho aberto da unidade de onde os itens saíram: todo item precisa estar nele, o carrinho fecha junto com a cotação e os itens que não foram cotados seguem num carrinho novo; `endereco_id` (opcional) é um endereço de entrega da unidade, copiado para `endereco_entrega`; `observacao` (opcional) tem até 1000 caracteres. A cotação nasce com `numero` sequencial (exibido como C-1001) e `valida_ate` = hoje em Brasília + `cotacao_validade_dias` de Configurações (15 sem a chave).
743
+ * Exige a permissão `criar` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Monta a cotação no servidor a partir dos itens (`produto_id`, `quantidade` acima de zero e até 9999, `embalagem_fechada`, `preco_unitario` visto pelo cliente), com 1 a 200 itens e sem produto repetido. Recalcula preços por faixa, confere `total_esperado` e grava com o status inicial. A unidade precisa ser da sessão (colaborador interno acessa todas) e, para quem não é colaborador interno, o autor é sempre quem chama. `acima_do_limite` indica que a cotação passa o limite de faturamento da unidade. Campos: `unidade_id` (uuid) é a unidade compradora, da sessão, e o cliente da cotação é sempre o cliente dessa unidade (o nome dele fica em `autor_nome`); `itens` é a lista de 1 a 200 itens, cada um com `produto_id`, `quantidade`, `embalagem_fechada` e `preco_unitario`; `economia_tier` é a economia do grupo de cliente vista no carrinho (decimal, informativo); `carrinho_id` (opcional) é o carrinho aberto da unidade de onde os itens saíram: todo item precisa estar nele, o carrinho fecha junto com a cotação e os itens que não foram cotados seguem num carrinho novo; `pedido_inteligente_id` (opcional, nunca junto com `carrinho_id`) é o pedido inteligente revisado de onde os itens saíram: ele precisa estar `pronto`, todo item precisa ser um produto confirmado na revisão, a cotação sai com `origem` `pedido_inteligente` e o pedido vira `cotado`; sem ele, `origem` é `carrinho`; `endereco_id` (opcional) é um endereço de entrega da unidade, copiado para `endereco_entrega`; `observacao` (opcional) tem até 1000 caracteres. A cotação nasce com `numero` sequencial (exibido como C-1001) e `valida_ate` = hoje em Brasília + `cotacao_validade_dias` de Configurações (15 sem a chave).
811
744
  *
812
745
  * `POST /cotacao`
813
746
  */
@@ -841,7 +774,7 @@ export function buscar_auto_complete_cotacao(credencial_de_acesso, parametros =
841
774
  /**
842
775
  * Busca cotações por filtro
843
776
  *
844
- * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Devolve as cotações não excluídas que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1), das mais novas para as mais antigas. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da própria sessão; colaborador interno pode omitir e vê todas. `autor_cliente_id` e `status` (`rascunho`, `esperando_aprovacao`, `concluido`, `nao_aprovado`, `em_transporte`) são exatos.
777
+ * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Devolve as cotações não excluídas que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1), das mais novas para as mais antigas. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da própria sessão; colaborador interno pode omitir e vê todas. `origem` (`carrinho`, `pedido_inteligente`) e `status` (`rascunho`, `esperando_aprovacao`, `concluido`, `nao_aprovado`, `em_transporte`) são exatos.
845
778
  *
846
779
  * `GET /cotacao/filtro`
847
780
  */
@@ -1225,7 +1158,7 @@ export function deletar_pelo_id_fatura(credencial_de_acesso, id, opcoes_da_chama
1225
1158
  /**
1226
1159
  * Indicadores de compra de uma unidade
1227
1160
  *
1228
- * Exige a permissão `ver` no módulo `Dashboard` do perfil de quem chama (administrador e master têm tudo). Soma na hora as compras (notas emitidas pelo Tiny) do CNPJ da unidade `unidade_id`: total comprado, comparação com o período anterior (períodos de até 731 dias), notas, produtos diferentes, última compra, compras por mês, por tipo e os produtos mais comprados (até 6). `unidade_id` é obrigatório e precisa ser uma unidade da sessão (colaborador interno acessa todas). `inicio` e `fim` em AAAA-MM-DD (padrão: últimos 365 dias). `amostra: true` indica soma parcial. Até 30 chamadas por minuto por pessoa.
1161
+ * Exige a permissão `ver` no módulo `Dashboard` do perfil de quem chama (administrador e master têm tudo). Soma na hora as compras (notas emitidas pelo Tiny) do CNPJ da unidade `unidade_id`: total comprado, comparação com o período anterior (períodos de até 731 dias), notas, produtos diferentes, última compra, compras por mês, por tipo e os produtos mais comprados (até 10). `unidade_id` é obrigatório e precisa ser uma unidade da sessão (colaborador interno acessa todas). `inicio` e `fim` em AAAA-MM-DD (padrão: últimos 365 dias). `amostra: true` indica soma parcial. Até 30 chamadas por minuto por pessoa.
1229
1162
  *
1230
1163
  * `GET /indicador_compra/filtro`
1231
1164
  */
@@ -1257,133 +1190,101 @@ export function buscar_pelo_filtro_indicador_venda(credencial_de_acesso, paramet
1257
1190
  }, opcoes_da_chamada);
1258
1191
  }
1259
1192
  /**
1260
- * Uma página das notas fiscais, por cursor
1193
+ * Lista as RNCs e ocorrências da qualidade de uma unidade
1261
1194
  *
1262
- * Exige a permissão `ver` no módulo `Financeiro` do perfil de quem chama (administrador e master têm tudo). Lê a tabela `nota_fiscal`, que o backend sincroniza sozinho com as notas emitidas no Tiny (pela API da Termotubos), com parcelas e situação financeira; a emissão mais recente vem primeiro e a resposta é só o array das 50 notas da página. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só vê as notas do CNPJ dela; colaborador interno pode omitir e ver todas. Filtros: `filtro` (`todas`, `hoje`, `mes`; padrão `todas`; `hoje` e `mes` trocam o período), `busca` (CPF/CNPJ, número da nota ou nome do cliente), `inicio` e `fim` (AAAA-MM-DD) e `vendedor` (id no Tiny, só colaborador). A paginação é por cursor: a primeira página vai sem `cursor` e a seguinte manda em `cursor` o `id` da última nota recebida. Total, páginas e contagens vêm de `GET /nota_fiscal/paginador`, com o mesmo filtro.
1195
+ * Só colaborador interno. Consulta na hora a API de qualidade da Termotubos (intranet) pelo CNPJ da unidade (`unidade_id`, obrigatório), da mais recente para a mais antiga. Filtros: `situacao` (`todas`, `abertas`, `fechadas`, `rascunho`; padrão `todas`), `tipo` (`todos`, `rnc`, `ocorrencia`; padrão `todos`) e `busca` (número, nota fiscal, documento, código do produto, lote, problema, motivo, objetivo, responsável ou emitente). 50 por página; `pagina` começa em 1. Totais e contagens em `GET /nao_conformidade/paginador`.
1263
1196
  *
1264
- * `GET /nota_fiscal`
1197
+ * `GET /nao_conformidade`
1265
1198
  */
1266
- export function buscar_paginador_nota_fiscal(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1199
+ export function buscar_paginador_nao_conformidade(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1267
1200
  return chamar_servico({
1268
1201
  servico: SERVICO_DESTA_API,
1269
1202
  metodo_http: "GET",
1270
- caminho_da_rota: "/nota_fiscal",
1203
+ caminho_da_rota: "/nao_conformidade",
1271
1204
  credencial_de_acesso,
1272
1205
  parametros_de_consulta: parametros,
1273
1206
  formato_da_resposta: "json",
1274
1207
  }, opcoes_da_chamada);
1275
1208
  }
1276
1209
  /**
1277
- * Total, páginas e contagens das notas fiscais
1210
+ * Totais, contagens e resumo das RNCs de uma unidade
1278
1211
  *
1279
- * Mesma permissão, mesmos filtros e mesma regra de unidade de `GET /nota_fiscal` (o `cursor` é ignorado). Devolve `total` e `paginas` com o filtro escolhido, `tamanho` (50), `sincronizado_em` (a última sincronização; nulo se nunca houve) e `contagens` (`todas`, `hoje`, `mes`), que usam os outros filtros e trocam o período pelo do bloco.
1212
+ * Só colaborador interno. Mesmos filtros de `GET /nao_conformidade`. `total` e `paginas` seguem todos os filtros; `contagens` (todas, abertas, fechadas, rascunho, rnc, ocorrencias) seguem só a `busca`; o `resumo` (custo total, abertas com gravidade alta, abertura mais antiga ainda aberta, última abertura, média de dias para fechar e até 3 problemas que se repetem) olha todas as não conformidades da unidade.
1280
1213
  *
1281
- * `GET /nota_fiscal/paginador`
1214
+ * `GET /nao_conformidade/paginador`
1282
1215
  */
1283
- export function buscar_informacoes_paginador_nota_fiscal(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1216
+ export function buscar_informacoes_paginador_nao_conformidade(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1284
1217
  return chamar_servico({
1285
1218
  servico: SERVICO_DESTA_API,
1286
1219
  metodo_http: "GET",
1287
- caminho_da_rota: "/nota_fiscal/paginador",
1220
+ caminho_da_rota: "/nao_conformidade/paginador",
1288
1221
  credencial_de_acesso,
1289
1222
  parametros_de_consulta: parametros,
1290
1223
  formato_da_resposta: "json",
1291
1224
  }, opcoes_da_chamada);
1292
1225
  }
1293
1226
  /**
1294
- * Status da sincronização das notas fiscais
1227
+ * Busca uma RNC ou ocorrência completa pelo id da intranet
1295
1228
  *
1296
- * Só colaborador interno com `ver` no módulo `Financeiro`. Devolve a sincronização em andamento ou a última que terminou: `rodando`, `pagina` de `total_paginas` (páginas da API), `progresso` (percentual), `gravados`, `cancelada`, `concluida`, `erro`, `iniciada_em` e `terminada_em`.
1229
+ * Só colaborador interno. Traz os dados da lista e mais as etapas do tratamento (descrição, ação imediata, análise da causa raiz, ação corretiva, evidência, eficácia, justificativa e observação geral), cada uma com os responsáveis e as mensagens em texto (o HTML da intranet é convertido e as imagens coladas como link vêm em `imagens`), além dos custos e anexos.
1297
1230
  *
1298
- * `GET /nota_fiscal/sincronizacao`
1231
+ * `GET /nao_conformidade/{id}`
1299
1232
  */
1300
- export function buscar_sincronizacao_nota_fiscal(credencial_de_acesso, opcoes_da_chamada) {
1233
+ export function buscar_pelo_id_nao_conformidade(credencial_de_acesso, id, opcoes_da_chamada) {
1301
1234
  return chamar_servico({
1302
1235
  servico: SERVICO_DESTA_API,
1303
1236
  metodo_http: "GET",
1304
- caminho_da_rota: "/nota_fiscal/sincronizacao",
1237
+ caminho_da_rota: `/nao_conformidade/${codificar_parametro_de_caminho(id)}`,
1305
1238
  credencial_de_acesso,
1306
1239
  formato_da_resposta: "json",
1307
1240
  }, opcoes_da_chamada);
1308
1241
  }
1309
1242
  /**
1310
- * Inicia a sincronização das notas fiscais em segundo plano
1311
- *
1312
- * Só colaborador interno com `ver` no módulo `Financeiro`. Traz as notas fiscais emitidas no Tiny (pela API de notas fiscais da Termotubos) para a tabela `nota_fiscal`, com as parcelas lidas do XML das notas válidas que ainda não as têm, sem filtro de data (histórico inteiro), lote por lote, em segundo plano no servidor: a tela pode ser fechada. Responde 202 com o status inicial; acompanhe por `GET /nota_fiscal/sincronizacao`. O status fica em memória e se perde se o servidor reiniciar.
1313
- *
1314
- * `POST /nota_fiscal/sincronizacao`
1315
- */
1316
- export function iniciar_sincronizacao_nota_fiscal(credencial_de_acesso, opcoes_da_chamada) {
1317
- return chamar_servico({
1318
- servico: SERVICO_DESTA_API,
1319
- metodo_http: "POST",
1320
- caminho_da_rota: "/nota_fiscal/sincronizacao",
1321
- credencial_de_acesso,
1322
- formato_da_resposta: "json",
1323
- }, opcoes_da_chamada);
1324
- }
1325
- /**
1326
- * Cancela a sincronização das notas fiscais em andamento
1327
- *
1328
- * Só colaborador interno com `ver` no módulo `Financeiro`. Para antes do próximo lote; o que já foi gravado fica.
1329
- *
1330
- * `DELETE /nota_fiscal/sincronizacao`
1331
- */
1332
- export function cancelar_sincronizacao_nota_fiscal(credencial_de_acesso, opcoes_da_chamada) {
1333
- return chamar_servico({
1334
- servico: SERVICO_DESTA_API,
1335
- metodo_http: "DELETE",
1336
- caminho_da_rota: "/nota_fiscal/sincronizacao",
1337
- credencial_de_acesso,
1338
- formato_da_resposta: "sem_conteudo",
1339
- }, opcoes_da_chamada);
1340
- }
1341
- /**
1342
- * Busca uma nota fiscal pelo id do Tiny
1243
+ * Uma página das notas fiscais, por cursor
1343
1244
  *
1344
- * Exige a permissão `ver` no módulo `Financeiro` do perfil de quem chama (administrador e master têm tudo). Lê a nota da tabela `nota_fiscal` com itens, parcelas (vencimento, valor, situação) e situação financeira. Com `xml=1`, devolve o XML da nota como download (`application/xml`), buscado na hora na API da Termotubos. Quem não é colaborador interno só abre notas do CNPJ das próprias unidades (as outras respondem 404).
1245
+ * Exige a permissão `ver` no módulo `Financeiro` do perfil de quem chama (administrador e master têm tudo). Lê a tabela `nota_fiscal`, que o backend sincroniza sozinho com as notas emitidas no Tiny (pela API da Termotubos), com parcelas e situação financeira; a emissão mais recente vem primeiro e a resposta é só o array das 50 notas da página. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só vê as notas do CNPJ dela; colaborador interno pode omitir e ver todas. Filtros: `filtro` (`todas`, `hoje`, `mes`; padrão `todas`; `hoje` e `mes` trocam o período), `busca` (CPF/CNPJ, número da nota ou nome do cliente), `inicio` e `fim` (AAAA-MM-DD) e `vendedor` (id no Tiny, só colaborador). A paginação é por cursor: a primeira página vai sem `cursor` e a seguinte manda em `cursor` o `id` da última nota recebida. Total, páginas e contagens vêm de `GET /nota_fiscal/paginador`, com o mesmo filtro.
1345
1246
  *
1346
- * `GET /nota_fiscal/{id}`
1247
+ * `GET /nota_fiscal`
1347
1248
  */
1348
- export function buscar_pelo_id_nota_fiscal(credencial_de_acesso, id, parametros = {}, opcoes_da_chamada) {
1249
+ export function buscar_paginador_nota_fiscal(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1349
1250
  return chamar_servico({
1350
1251
  servico: SERVICO_DESTA_API,
1351
1252
  metodo_http: "GET",
1352
- caminho_da_rota: `/nota_fiscal/${codificar_parametro_de_caminho(id)}`,
1253
+ caminho_da_rota: "/nota_fiscal",
1353
1254
  credencial_de_acesso,
1354
1255
  parametros_de_consulta: parametros,
1355
1256
  formato_da_resposta: "json",
1356
1257
  }, opcoes_da_chamada);
1357
1258
  }
1358
1259
  /**
1359
- * Uma página da lista de Produtos do painel, por cursor
1260
+ * Total, páginas e contagens das notas fiscais
1360
1261
  *
1361
- * Só colaborador interno (mesma regra da leitura de `produto_conflito_sincronizacao`). Lê a tabela `produto` inteira de um cache em memória (descartado a cada gravação em produto ou em conflito de sincronização, e recarregado do banco no máximo a cada 10 minutos), em ordem alfabética do nome (sem diferença de maiúscula; empate pelo id), e devolve só o array das 50 linhas da página. A paginação é por cursor: a primeira página vai sem `cursor`, e a seguinte manda em `cursor` o `id` da última linha recebida. `busca` (sem acento e sem maiúscula) procura o texto no nome ou no SKU. `ultima_sincronizacao` (data ISO, AAAA-MM-DD ou data e hora com fuso) é o início da última sincronização do painel: produto criado depois dela vem com `estado` `novo` e produto da API sincronizado depois dela, `mudou`; com conflito de sincronização pendente, `conflito`; senão, `em-dia`. Total e páginas vêm de `GET /painel_produto/paginador`, com a mesma `busca`.
1262
+ * Mesma permissão, mesmos filtros e mesma regra de unidade de `GET /nota_fiscal` (o `cursor` é ignorado). Devolve `total` e `paginas` com o filtro escolhido, `tamanho` (50), `sincronizado_em` (a última sincronização; nulo se nunca houve) e `contagens` (`todas`, `hoje`, `mes`), que usam os outros filtros e trocam o período pelo do bloco.
1362
1263
  *
1363
- * `GET /painel_produto`
1264
+ * `GET /nota_fiscal/paginador`
1364
1265
  */
1365
- export function buscar_paginador_painel_produto(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1266
+ export function buscar_informacoes_paginador_nota_fiscal(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1366
1267
  return chamar_servico({
1367
1268
  servico: SERVICO_DESTA_API,
1368
1269
  metodo_http: "GET",
1369
- caminho_da_rota: "/painel_produto",
1270
+ caminho_da_rota: "/nota_fiscal/paginador",
1370
1271
  credencial_de_acesso,
1371
1272
  parametros_de_consulta: parametros,
1372
1273
  formato_da_resposta: "json",
1373
1274
  }, opcoes_da_chamada);
1374
1275
  }
1375
1276
  /**
1376
- * Total e páginas da lista de Produtos do painel
1277
+ * Busca uma nota fiscal pelo id do Tiny
1377
1278
  *
1378
- * Só colaborador interno (mesma regra da leitura de `produto_conflito_sincronizacao`). Recebe os mesmos parâmetros de `GET /painel_produto` (`cursor` e `ultima_sincronizacao` não mudam a conta) e devolve `total` (produtos com a `busca`), `paginas` (total dividido por `tamanho`, arredondado para cima, no mínimo 1) e `tamanho` (sempre 50).
1279
+ * Exige a permissão `ver` no módulo `Financeiro` do perfil de quem chama (administrador e master têm tudo). Lê a nota da tabela `nota_fiscal` com itens, parcelas (vencimento, valor, situação) e situação financeira. Com `xml=1`, devolve o XML da nota como download (`application/xml`), buscado na hora na API da Termotubos. Quem não é colaborador interno só abre notas do CNPJ das próprias unidades (as outras respondem 404).
1379
1280
  *
1380
- * `GET /painel_produto/paginador`
1281
+ * `GET /nota_fiscal/{id}`
1381
1282
  */
1382
- export function buscar_informacoes_paginador_painel_produto(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1283
+ export function buscar_pelo_id_nota_fiscal(credencial_de_acesso, id, parametros = {}, opcoes_da_chamada) {
1383
1284
  return chamar_servico({
1384
1285
  servico: SERVICO_DESTA_API,
1385
1286
  metodo_http: "GET",
1386
- caminho_da_rota: "/painel_produto/paginador",
1287
+ caminho_da_rota: `/nota_fiscal/${codificar_parametro_de_caminho(id)}`,
1387
1288
  credencial_de_acesso,
1388
1289
  parametros_de_consulta: parametros,
1389
1290
  formato_da_resposta: "json",
@@ -1507,257 +1408,206 @@ export function deletar_pelo_id_pedido(credencial_de_acesso, id, opcoes_da_chama
1507
1408
  }, opcoes_da_chamada);
1508
1409
  }
1509
1410
  /**
1510
- * Lista os pedidos de venda do ERP
1411
+ * Envia um pedido para a IA montar
1511
1412
  *
1512
- * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Consulta na hora os pedidos de venda do Tiny pela API da Termotubos. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só vê os pedidos do CNPJ dela, sem vendedor, canal e observações internas; colaborador interno pode omitir e ver todos. Filtros: `situacao` (`todos`, `aberto`, `aprovado`, `faturado`, `pronto`, `enviado`, `entregue`, `cancelado`; padrão `todos`), `busca` (texto), `inicio` e `fim` (AAAA-MM-DD) e `vendedor` (id no Tiny). 50 pedidos por página; `pagina` começa em 1. A resposta traz `itens`, `pagina`, `total_paginas`, `total_registros`, a contagem por situação e um resumo (pedidos de hoje e do mês). Até 60 chamadas por minuto por pessoa.
1413
+ * Exige a permissão `criar` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Formulário `multipart/form-data` com `unidade_id` (uma unidade da sessão), `texto` (opcional, até 4000 caracteres) e até 5 campos `arquivo` (áudio MP3, M4A, OGG, OPUS, WAV ou WEBM; PDF; foto PNG, JPG ou WEBP; planilha XLSX ou CSV), cada um com até 20 MB e o envio inteiro com até 25 MB; é preciso mandar o texto ou ao menos um anexo. Grava o pedido com `status` `analisando` e responde na hora; a análise roda no servidor: os anexos vão para o TermoBucket (privados), tudo vira texto (PDF e planilha no próprio Portal, foto, PDF escaneado e áudio pelo TermoAI) e a IA de texto escolhida em Provedores procura cada item no catálogo e no boletim técnico. Os nomes que a unidade já vinculou na revisão (veja o `PATCH`) vão para a IA e fecham os itens com o mesmo nome. Se a IA falhar ou não achar nenhum item, cada linha do texto vira um item `nao_encontrado` para o cliente vincular, e `aviso` explica isso. Acompanhe por `GET /pedido_inteligente/{id}` até `status` virar `pronto` (com os `itens` para revisar) ou `erro` (com o motivo em `erro`). Cada unidade manda no máximo 20 pedidos por hora.
1513
1414
  *
1514
- * `GET /pedido_venda`
1415
+ * `POST /pedido_inteligente`
1515
1416
  */
1516
- export function buscar_paginador_pedido_venda(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1417
+ export function criar_pedido_inteligente(credencial_de_acesso, formulario, opcoes_da_chamada) {
1517
1418
  return chamar_servico({
1518
1419
  servico: SERVICO_DESTA_API,
1519
- metodo_http: "GET",
1520
- caminho_da_rota: "/pedido_venda",
1420
+ metodo_http: "POST",
1421
+ caminho_da_rota: "/pedido_inteligente",
1521
1422
  credencial_de_acesso,
1522
- parametros_de_consulta: parametros,
1423
+ formulario,
1523
1424
  formato_da_resposta: "json",
1524
1425
  }, opcoes_da_chamada);
1525
1426
  }
1526
1427
  /**
1527
- * Acha o pedido de venda de uma entrega
1428
+ * Busca pedidos inteligentes por filtro
1528
1429
  *
1529
- * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Procura no Tiny o pedido de venda que gerou a entrega `expedicao_id` (id da entrega na API de logística) e devolve o `id` do pedido, para abrir em `GET /pedido_venda/{id}`. Quem não é colaborador interno só acha pedidos das próprias unidades.
1430
+ * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Devolve os pedidos não excluídos, até 50 por página (`pagina`, a partir de 1, padrão 1), dos mais novos para os mais antigos. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da própria sessão; colaborador interno pode omitir e vê todos. `status` (`analisando`, `pronto`, `cotado`, `erro`) é exato; uma análise parada há mais de 10 minutos conta como `erro`.
1530
1431
  *
1531
- * `GET /pedido_venda/filtro`
1432
+ * `GET /pedido_inteligente/filtro`
1532
1433
  */
1533
- export function buscar_pelo_filtro_pedido_venda(credencial_de_acesso, parametros, opcoes_da_chamada) {
1434
+ export function buscar_pelo_filtro_pedido_inteligente(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1534
1435
  return chamar_servico({
1535
1436
  servico: SERVICO_DESTA_API,
1536
1437
  metodo_http: "GET",
1537
- caminho_da_rota: "/pedido_venda/filtro",
1438
+ caminho_da_rota: "/pedido_inteligente/filtro",
1538
1439
  credencial_de_acesso,
1539
1440
  parametros_de_consulta: parametros,
1540
1441
  formato_da_resposta: "json",
1541
1442
  }, opcoes_da_chamada);
1542
1443
  }
1543
1444
  /**
1544
- * Busca um pedido de venda do ERP pelo id
1445
+ * Busca um pedido inteligente pelo id
1545
1446
  *
1546
- * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Consulta o pedido no Tiny com itens, valores, pagamento e rastreio, mais a entrega ligada a ele quando houver. Quem não é colaborador interno só abre pedidos do CNPJ das próprias unidades (os outros respondem 404) e não recebe vendedor, canal e observações internas.
1447
+ * Exige a permissão `ver` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Pedido de uma unidade fora da sessão responde 404, como se não existisse. Depois da análise, cada anexo guardado traz `url`, um link de download do TermoBucket que vale 15 minutos. Cada item traz `pedido_do_cliente` (o trecho que o cliente escreveu), `situacao` (`encontrado`, `escolher`, `indisponivel` ou `nao_encontrado`), `quantidade`, `escolhido`, `opcoes` e `observacao` (como a IA entendeu o item); `aviso` aparece quando o pedido foi montado sem a IA; `cotacao_id` aparece quando o pedido já virou cotação.
1547
1448
  *
1548
- * `GET /pedido_venda/{id}`
1449
+ * `GET /pedido_inteligente/{id}`
1549
1450
  */
1550
- export function buscar_pelo_id_pedido_venda(credencial_de_acesso, id, opcoes_da_chamada) {
1451
+ export function buscar_pelo_id_pedido_inteligente(credencial_de_acesso, id, opcoes_da_chamada) {
1551
1452
  return chamar_servico({
1552
1453
  servico: SERVICO_DESTA_API,
1553
1454
  metodo_http: "GET",
1554
- caminho_da_rota: `/pedido_venda/${codificar_parametro_de_caminho(id)}`,
1455
+ caminho_da_rota: `/pedido_inteligente/${codificar_parametro_de_caminho(id)}`,
1555
1456
  credencial_de_acesso,
1556
1457
  formato_da_resposta: "json",
1557
1458
  }, opcoes_da_chamada);
1558
1459
  }
1559
1460
  /**
1560
- * Paginador dos pedidos de venda salvos no portal
1461
+ * Grava a revisão do cliente
1561
1462
  *
1562
- * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só recebe os pedidos do CNPJ dela, sem vendedor, canal e marcadores; colaborador interno pode omitir e ver todos. Lê a cópia dos pedidos de venda da Intranet salva no banco do portal (atualizada por `POST /pedido_venda_tiny`) e devolve só a paginação, sem os itens (eles vêm de `GET /pedido_venda_tiny/filtro`): `pagina`, `por_pagina` (sempre 50), `total_paginas`, `total_registros` da situação pedida, a contagem por situação e `sincronizado_em` (a última sincronização). Filtros iguais aos da lista: `situacao` (`todos`, `aberto`, `aprovado`, `faturado`, `pronto`, `enviado`, `entregue`, `cancelado`; padrão `todos`), `busca` (CNPJ/CPF, número do pedido ou nome do cliente), `inicio` e `fim` (AAAA-MM-DD, data do pedido) e `vendedor` (id do vendedor no Tiny, só para colaborador interno).
1463
+ * Exige a permissão `editar` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Só vale com `status` `pronto`. `itens` tem uma escolha por item do pedido, na mesma ordem: `produto_id` é o produto escolhido (nulo tira o item da cotação), `quantidade` vai de 0 a 9999 (acima de zero) e `remover` (opcional, padrão `false`) tira o item do pedido. O produto pode ser o `escolhido`, uma das `opcoes` ou qualquer produto ativo do catálogo; neste último caso a unidade guarda o vínculo entre o nome que o cliente escreveu e o produto, e os próximos pedidos com o mesmo nome já chegam com ele.
1563
1464
  *
1564
- * `GET /pedido_venda_tiny`
1465
+ * `PATCH /pedido_inteligente/{id}`
1565
1466
  */
1566
- export function buscar_paginador_pedido_venda_tiny(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1467
+ export function atualizar_pelo_id_pedido_inteligente(credencial_de_acesso, id, corpo_da_requisicao, opcoes_da_chamada) {
1567
1468
  return chamar_servico({
1568
1469
  servico: SERVICO_DESTA_API,
1569
- metodo_http: "GET",
1570
- caminho_da_rota: "/pedido_venda_tiny",
1470
+ metodo_http: "PATCH",
1471
+ caminho_da_rota: `/pedido_inteligente/${codificar_parametro_de_caminho(id)}`,
1571
1472
  credencial_de_acesso,
1572
- parametros_de_consulta: parametros,
1473
+ corpo_json: corpo_da_requisicao,
1573
1474
  formato_da_resposta: "json",
1574
1475
  }, opcoes_da_chamada);
1575
1476
  }
1576
1477
  /**
1577
- * Sincroniza um lote de pedidos de venda com a Intranet
1478
+ * Cancela um pedido inteligente
1578
1479
  *
1579
- * Só colaborador interno com a permissão `ver` no módulo `Pedidos`. Lê 10 páginas (500 pedidos) da Intranet a partir de `pagina` (começa em 1) e grava no banco do portal, criando ou atualizando pelo id da Intranet. `modo`: `recentes` (padrão, os pedidos dos últimos 90 dias) ou `tudo` (todos os pedidos). Para sincronizar tudo, chame de novo com `proxima_pagina` até ela vir `null`. O backend também sincroniza sozinho: os últimos dias a cada 15 min e os últimos 90 dias a cada 6 h (`SINCRONIZACAO_*` no `.env`). Até 120 chamadas por minuto por pessoa.
1480
+ * Exige a permissão `excluir` no módulo `Cotacoes` do perfil de quem chama (administrador e master têm tudo). Exclusão lógica; uma análise em andamento para de gravar. O pedido que já virou cotação não sai (409).
1580
1481
  *
1581
- * `POST /pedido_venda_tiny`
1482
+ * `DELETE /pedido_inteligente/{id}`
1582
1483
  */
1583
- export function criar_pedido_venda_tiny(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
1484
+ export function deletar_pelo_id_pedido_inteligente(credencial_de_acesso, id, opcoes_da_chamada) {
1584
1485
  return chamar_servico({
1585
1486
  servico: SERVICO_DESTA_API,
1586
- metodo_http: "POST",
1587
- caminho_da_rota: "/pedido_venda_tiny",
1487
+ metodo_http: "DELETE",
1488
+ caminho_da_rota: `/pedido_inteligente/${codificar_parametro_de_caminho(id)}`,
1588
1489
  credencial_de_acesso,
1589
- corpo_json: corpo_da_requisicao,
1590
- formato_da_resposta: "json",
1490
+ formato_da_resposta: "sem_conteudo",
1591
1491
  }, opcoes_da_chamada);
1592
1492
  }
1593
1493
  /**
1594
- * Autocomplete dos pedidos de venda salvos no portal
1494
+ * Lista os pedidos de venda do ERP
1595
1495
  *
1596
- * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só recebe pedidos do CNPJ dela. Devolve só `id` (id na Intranet) e `rotulo` (`#número - cliente`), em ordem alfabética do cliente. `busca`: número do pedido (até 10 dígitos, `#` opcional) ou palavras do nome do cliente (por prefixo, sem acento). `pagina` começa em 1; `tamanho` padrão 10, máximo 50.
1496
+ * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Consulta na hora os pedidos de venda do Tiny pela API da Termotubos. Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só vê os pedidos do CNPJ dela, sem vendedor, canal e observações internas; colaborador interno pode omitir e ver todos. Filtros: `situacao` (`todos`, `aberto`, `aprovado`, `faturado`, `pronto`, `enviado`, `entregue`, `cancelado`; padrão `todos`), `busca` (texto), `inicio` e `fim` (AAAA-MM-DD) e `vendedor` (id no Tiny). 50 pedidos por página; `pagina` começa em 1. A resposta traz `itens`, `pagina`, `total_paginas`, `total_registros`, a contagem por situação e um resumo (pedidos de hoje e do mês). Até 60 chamadas por minuto por pessoa.
1597
1497
  *
1598
- * `GET /pedido_venda_tiny/autocomplete`
1498
+ * `GET /pedido_venda`
1599
1499
  */
1600
- export function buscar_auto_complete_pedido_venda_tiny(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1500
+ export function buscar_paginador_pedido_venda(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1601
1501
  return chamar_servico({
1602
1502
  servico: SERVICO_DESTA_API,
1603
1503
  metodo_http: "GET",
1604
- caminho_da_rota: "/pedido_venda_tiny/autocomplete",
1504
+ caminho_da_rota: "/pedido_venda",
1605
1505
  credencial_de_acesso,
1606
1506
  parametros_de_consulta: parametros,
1607
1507
  formato_da_resposta: "json",
1608
1508
  }, opcoes_da_chamada);
1609
1509
  }
1610
1510
  /**
1611
- * Uma página de pedidos de venda salvos no portal
1511
+ * Acha o pedido de venda de uma entrega
1612
1512
  *
1613
- * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só recebe os pedidos do CNPJ dela, sem vendedor, canal e marcadores; colaborador interno pode omitir e ver todos. Devolve só os itens de uma página (sempre 50, sem como mudar), do pedido mais recente para o mais antigo; a paginação e as contagens vêm de `GET /pedido_venda_tiny`. `pagina` começa em 1. Filtros: `situacao` (`todos`, `aberto`, `aprovado`, `faturado`, `pronto`, `enviado`, `entregue`, `cancelado`; padrão `todos`), `busca` (14 ou 11 dígitos = CNPJ/CPF; até 10 dígitos = número do pedido; texto = palavras do nome do cliente, por prefixo e sem acento), `inicio` e `fim` (AAAA-MM-DD, data do pedido) e `vendedor` (id do vendedor no Tiny). O detalhe de um pedido continua em `GET /pedido_venda/{id}`, com o `id` daqui.
1513
+ * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Procura no Tiny o pedido de venda que gerou a entrega `expedicao_id` (id da entrega na API de logística) e devolve o `id` do pedido, para abrir em `GET /pedido_venda/{id}`. Quem não é colaborador interno só acha pedidos das próprias unidades.
1614
1514
  *
1615
- * `GET /pedido_venda_tiny/filtro`
1515
+ * `GET /pedido_venda/filtro`
1616
1516
  */
1617
- export function buscar_pelo_filtro_pedido_venda_tiny(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1517
+ export function buscar_pelo_filtro_pedido_venda(credencial_de_acesso, parametros, opcoes_da_chamada) {
1618
1518
  return chamar_servico({
1619
1519
  servico: SERVICO_DESTA_API,
1620
1520
  metodo_http: "GET",
1621
- caminho_da_rota: "/pedido_venda_tiny/filtro",
1521
+ caminho_da_rota: "/pedido_venda/filtro",
1622
1522
  credencial_de_acesso,
1623
1523
  parametros_de_consulta: parametros,
1624
1524
  formato_da_resposta: "json",
1625
1525
  }, opcoes_da_chamada);
1626
1526
  }
1627
1527
  /**
1628
- * Um pedido de venda salvo no portal
1528
+ * Busca um pedido de venda do ERP pelo id
1629
1529
  *
1630
- * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só acha pedidos do CNPJ dela, sem vendedor, canal e marcadores. `id` é o id do pedido na Intranet (o mesmo da lista). Devolve só o resumo salvo no portal; os itens e o detalhe completo vêm de `GET /pedido_venda/{id}`. Pedidos são só leitura: não há `PATCH` nem `DELETE`.
1530
+ * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Consulta o pedido no Tiny com itens, valores, pagamento e rastreio, mais a entrega ligada a ele quando houver. Quem não é colaborador interno só abre pedidos do CNPJ das próprias unidades (os outros respondem 404) e não recebe vendedor, canal e observações internas.
1631
1531
  *
1632
- * `GET /pedido_venda_tiny/{id}`
1532
+ * `GET /pedido_venda/{id}`
1633
1533
  */
1634
- export function buscar_pelo_id_pedido_venda_tiny(credencial_de_acesso, id, parametros = {}, opcoes_da_chamada) {
1534
+ export function buscar_pelo_id_pedido_venda(credencial_de_acesso, id, opcoes_da_chamada) {
1635
1535
  return chamar_servico({
1636
1536
  servico: SERVICO_DESTA_API,
1637
1537
  metodo_http: "GET",
1638
- caminho_da_rota: `/pedido_venda_tiny/${codificar_parametro_de_caminho(id)}`,
1538
+ caminho_da_rota: `/pedido_venda/${codificar_parametro_de_caminho(id)}`,
1639
1539
  credencial_de_acesso,
1640
- parametros_de_consulta: parametros,
1641
1540
  formato_da_resposta: "json",
1642
1541
  }, opcoes_da_chamada);
1643
1542
  }
1644
1543
  /**
1645
- * Lista os perfis paginados
1544
+ * Paginador dos pedidos de venda salvos no portal
1646
1545
  *
1647
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Ordem alfabética. 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`.
1546
+ * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só recebe os pedidos do CNPJ dela, sem vendedor, canal e marcadores; colaborador interno pode omitir e ver todos. Lê a cópia dos pedidos de venda da Intranet salva no banco do portal (atualizada pela sincronização do backend) e devolve só a paginação, sem os itens (eles vêm de `GET /pedido_venda_tiny/filtro`): `pagina`, `por_pagina` (sempre 50), `total_paginas`, `total_registros` da situação pedida, a contagem por situação e `sincronizado_em` (a última sincronização). Filtros iguais aos da lista: `situacao` (`todos`, `aberto`, `aprovado`, `faturado`, `pronto`, `enviado`, `entregue`, `cancelado`; padrão `todos`), `busca` (CNPJ/CPF, número do pedido ou nome do cliente), `inicio` e `fim` (AAAA-MM-DD, data do pedido) e `vendedor` (id do vendedor no Tiny, só para colaborador interno).
1648
1547
  *
1649
- * `GET /perfil`
1548
+ * `GET /pedido_venda_tiny`
1650
1549
  */
1651
- export function buscar_paginador_perfil(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1550
+ export function buscar_paginador_pedido_venda_tiny(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1652
1551
  return chamar_servico({
1653
1552
  servico: SERVICO_DESTA_API,
1654
1553
  metodo_http: "GET",
1655
- caminho_da_rota: "/perfil",
1554
+ caminho_da_rota: "/pedido_venda_tiny",
1656
1555
  credencial_de_acesso,
1657
1556
  parametros_de_consulta: parametros,
1658
1557
  formato_da_resposta: "json",
1659
1558
  }, opcoes_da_chamada);
1660
1559
  }
1661
1560
  /**
1662
- * Cadastra um perfil de acesso
1663
- *
1664
- * Exige perfil administrador ou master. Perfil de acesso (RBAC) das pessoas do portal. `nome` obrigatório, até 120 caracteres e único (o `slug` sai do nome); `resumo` até 500; `tipo` é `termotubos` ou `cliente`; `base: true` marca o perfil dado ao cliente novo (só um, só de cliente, nunca administrador); `permissoes` por módulo (`Dashboard`, `Pedidos`, `Financeiro`, `Catalogo`, `Cotacoes`, `Assistente`, `Configuracoes`) com `ver`, `criar`, `editar`, `excluir` e a exibição no menu; `permissoes_administrativas` entre `contexto_administrativo.entrar`, `unidades.ler`, `pedidos.ler_todos`, `cotacoes.ler_todas`, `financeiro.ler_todos` e `usuarios.gerenciar`. Cada item de `permissoes` tem `modulo`, `pagina` (página do módulo; `*` vale para o módulo inteiro, padrão), `ver`, `criar`, `editar`, `excluir` (booleanos) e `mostrar_na_sidebar` e `mostrar_nas_configuracoes` (booleanos, exibição no menu). Campos: `base` (booleano) marca o perfil dado ao cliente novo (só um, só de cliente).
1665
- *
1666
- * `POST /perfil`
1667
- */
1668
- export function criar_perfil(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
1669
- return chamar_servico({
1670
- servico: SERVICO_DESTA_API,
1671
- metodo_http: "POST",
1672
- caminho_da_rota: "/perfil",
1673
- credencial_de_acesso,
1674
- corpo_json: corpo_da_requisicao,
1675
- formato_da_resposta: "json",
1676
- }, opcoes_da_chamada);
1677
- }
1678
- /**
1679
- * Lista básica de perfis para seleção
1561
+ * Autocomplete dos pedidos de venda salvos no portal
1680
1562
  *
1681
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve só id e nome, em ordem alfabética. `busca` procura no nome. `tamanho` tem padrão 10 e vai de 1 a 50; `pagina` começa em 1. A resposta traz `itens`, `total`, `pagina` e `tamanho`.
1563
+ * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só recebe pedidos do CNPJ dela. Devolve só `id` (id na Intranet) e `rotulo` (`#número - cliente`), em ordem alfabética do cliente. `busca`: número do pedido (até 10 dígitos, `#` opcional) ou palavras do nome do cliente (por prefixo, sem acento). `pagina` começa em 1; `tamanho` padrão 10, máximo 50.
1682
1564
  *
1683
- * `GET /perfil/autocomplete`
1565
+ * `GET /pedido_venda_tiny/autocomplete`
1684
1566
  */
1685
- export function buscar_auto_complete_perfil(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1567
+ export function buscar_auto_complete_pedido_venda_tiny(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1686
1568
  return chamar_servico({
1687
1569
  servico: SERVICO_DESTA_API,
1688
1570
  metodo_http: "GET",
1689
- caminho_da_rota: "/perfil/autocomplete",
1571
+ caminho_da_rota: "/pedido_venda_tiny/autocomplete",
1690
1572
  credencial_de_acesso,
1691
1573
  parametros_de_consulta: parametros,
1692
1574
  formato_da_resposta: "json",
1693
1575
  }, opcoes_da_chamada);
1694
1576
  }
1695
1577
  /**
1696
- * Busca perfis por filtro
1578
+ * Uma página de pedidos de venda salvos no portal
1697
1579
  *
1698
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve os perfis não excluídos que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1), em ordem alfabética. `nome` procura o trecho; `slug`, `base` e `tipo` são exatos.
1580
+ * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só recebe os pedidos do CNPJ dela, sem vendedor, canal e marcadores; colaborador interno pode omitir e ver todos. Devolve só os itens de uma página (sempre 50, sem como mudar), do pedido mais recente para o mais antigo; a paginação e as contagens vêm de `GET /pedido_venda_tiny`. `pagina` começa em 1. Filtros: `situacao` (`todos`, `aberto`, `aprovado`, `faturado`, `pronto`, `enviado`, `entregue`, `cancelado`; padrão `todos`), `busca` (14 ou 11 dígitos = CNPJ/CPF; até 10 dígitos = número do pedido; texto = palavras do nome do cliente, por prefixo e sem acento), `inicio` e `fim` (AAAA-MM-DD, data do pedido) e `vendedor` (id do vendedor no Tiny). O detalhe de um pedido continua em `GET /pedido_venda/{id}`, com o `id` daqui.
1699
1581
  *
1700
- * `GET /perfil/filtro`
1582
+ * `GET /pedido_venda_tiny/filtro`
1701
1583
  */
1702
- export function buscar_pelo_filtro_perfil(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1584
+ export function buscar_pelo_filtro_pedido_venda_tiny(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1703
1585
  return chamar_servico({
1704
1586
  servico: SERVICO_DESTA_API,
1705
1587
  metodo_http: "GET",
1706
- caminho_da_rota: "/perfil/filtro",
1588
+ caminho_da_rota: "/pedido_venda_tiny/filtro",
1707
1589
  credencial_de_acesso,
1708
1590
  parametros_de_consulta: parametros,
1709
1591
  formato_da_resposta: "json",
1710
1592
  }, opcoes_da_chamada);
1711
1593
  }
1712
1594
  /**
1713
- * Busca um perfil pelo id
1595
+ * Um pedido de venda salvo no portal
1714
1596
  *
1715
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Perfil excluído não é encontrado. Traz permissões e quantidade de pessoas.
1597
+ * Exige a permissão `ver` no módulo `Pedidos` do perfil de quem chama (administrador e master têm tudo). Quem não é colaborador interno precisa informar `unidade_id` de uma unidade da sessão e só acha pedidos do CNPJ dela, sem vendedor, canal e marcadores. `id` é o id do pedido na Intranet (o mesmo da lista). Devolve só o resumo salvo no portal; os itens e o detalhe completo vêm de `GET /pedido_venda/{id}`. Pedidos são só leitura: não há `PATCH` nem `DELETE`.
1716
1598
  *
1717
- * `GET /perfil/{id}`
1599
+ * `GET /pedido_venda_tiny/{id}`
1718
1600
  */
1719
- export function buscar_pelo_id_perfil(credencial_de_acesso, id, opcoes_da_chamada) {
1601
+ export function buscar_pelo_id_pedido_venda_tiny(credencial_de_acesso, id, parametros = {}, opcoes_da_chamada) {
1720
1602
  return chamar_servico({
1721
1603
  servico: SERVICO_DESTA_API,
1722
1604
  metodo_http: "GET",
1723
- caminho_da_rota: `/perfil/${codificar_parametro_de_caminho(id)}`,
1724
- credencial_de_acesso,
1725
- formato_da_resposta: "json",
1726
- }, opcoes_da_chamada);
1727
- }
1728
- /**
1729
- * Atualiza um perfil de acesso
1730
- *
1731
- * Exige perfil administrador ou master. Mesmas regras do cadastro; o tipo não muda. `permissoes` e `permissoes_administrativas`, quando enviados, substituem as anteriores. Cada item de `permissoes` tem `modulo`, `pagina` (página do módulo; `*` vale para o módulo inteiro, padrão), `ver`, `criar`, `editar`, `excluir` (booleanos) e `mostrar_na_sidebar` e `mostrar_nas_configuracoes` (booleanos, exibição no menu). Atualização parcial: campo ausente mantém o valor atual. Campos: `nome` é obrigatório quando enviado (mesmo limite do cadastro); `resumo` até 500 caracteres; `base` (booleano) marca o perfil dado ao cliente novo (só um, só de cliente).
1732
- *
1733
- * `PATCH /perfil/{id}`
1734
- */
1735
- export function atualizar_pelo_id_perfil(credencial_de_acesso, id, corpo_da_requisicao, opcoes_da_chamada) {
1736
- return chamar_servico({
1737
- servico: SERVICO_DESTA_API,
1738
- metodo_http: "PATCH",
1739
- caminho_da_rota: `/perfil/${codificar_parametro_de_caminho(id)}`,
1605
+ caminho_da_rota: `/pedido_venda_tiny/${codificar_parametro_de_caminho(id)}`,
1740
1606
  credencial_de_acesso,
1741
- corpo_json: corpo_da_requisicao,
1607
+ parametros_de_consulta: parametros,
1742
1608
  formato_da_resposta: "json",
1743
1609
  }, opcoes_da_chamada);
1744
1610
  }
1745
- /**
1746
- * Exclui um perfil de acesso
1747
- *
1748
- * Exige perfil administrador ou master. Recusa o perfil base e perfis com pessoas vinculadas. A exclusão é lógica: o registro some das leituras, mas a linha não é apagada.
1749
- *
1750
- * `DELETE /perfil/{id}`
1751
- */
1752
- export function deletar_pelo_id_perfil(credencial_de_acesso, id, opcoes_da_chamada) {
1753
- return chamar_servico({
1754
- servico: SERVICO_DESTA_API,
1755
- metodo_http: "DELETE",
1756
- caminho_da_rota: `/perfil/${codificar_parametro_de_caminho(id)}`,
1757
- credencial_de_acesso,
1758
- formato_da_resposta: "sem_conteudo",
1759
- }, opcoes_da_chamada);
1760
- }
1761
1611
  /**
1762
1612
  * Lista os produtos paginados
1763
1613
  *
@@ -1875,123 +1725,6 @@ export function deletar_pelo_id_produto(credencial_de_acesso, id, opcoes_da_cham
1875
1725
  formato_da_resposta: "sem_conteudo",
1876
1726
  }, opcoes_da_chamada);
1877
1727
  }
1878
- /**
1879
- * Lista os conflitos de sincronização paginados
1880
- *
1881
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Dos mais novos para os mais antigos; `resolvido` opcional filtra. 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`.
1882
- *
1883
- * `GET /produto_conflito_sincronizacao`
1884
- */
1885
- export function buscar_paginador_produto_conflito_sincronizacao(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1886
- return chamar_servico({
1887
- servico: SERVICO_DESTA_API,
1888
- metodo_http: "GET",
1889
- caminho_da_rota: "/produto_conflito_sincronizacao",
1890
- credencial_de_acesso,
1891
- parametros_de_consulta: parametros,
1892
- formato_da_resposta: "json",
1893
- }, opcoes_da_chamada);
1894
- }
1895
- /**
1896
- * Registra um conflito de sincronização de produto
1897
- *
1898
- * Exige a permissão `criar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Conflito entre o valor do portal e o da API da Termotubos (Tiny) num campo monitorado do produto. `campo` é `preco`, `preco_a_vista` ou `estoque`; `valor_local` e `valor_api` em texto (o da API precisa ser numérico). Campos: `produto_id` (uuid) é o produto do conflito.
1899
- *
1900
- * `POST /produto_conflito_sincronizacao`
1901
- */
1902
- export function criar_produto_conflito_sincronizacao(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
1903
- return chamar_servico({
1904
- servico: SERVICO_DESTA_API,
1905
- metodo_http: "POST",
1906
- caminho_da_rota: "/produto_conflito_sincronizacao",
1907
- credencial_de_acesso,
1908
- corpo_json: corpo_da_requisicao,
1909
- formato_da_resposta: "json",
1910
- }, opcoes_da_chamada);
1911
- }
1912
- /**
1913
- * Lista básica de conflitos de sincronização para seleção
1914
- *
1915
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve id e `rotulo` (`SKU - campo`), em ordem alfabética. `busca` procura no SKU e no campo; `resolvido` filtra. `tamanho` tem padrão 10 e vai de 1 a 50; `pagina` começa em 1. A resposta traz `itens`, `total`, `pagina` e `tamanho`.
1916
- *
1917
- * `GET /produto_conflito_sincronizacao/autocomplete`
1918
- */
1919
- export function buscar_auto_complete_produto_conflito_sincronizacao(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1920
- return chamar_servico({
1921
- servico: SERVICO_DESTA_API,
1922
- metodo_http: "GET",
1923
- caminho_da_rota: "/produto_conflito_sincronizacao/autocomplete",
1924
- credencial_de_acesso,
1925
- parametros_de_consulta: parametros,
1926
- formato_da_resposta: "json",
1927
- }, opcoes_da_chamada);
1928
- }
1929
- /**
1930
- * Busca conflitos de sincronização por filtro
1931
- *
1932
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Devolve os conflitos não excluídos que casam com o filtro, até 50 por página (`pagina`, a partir de 1, padrão 1), dos mais novos para os mais antigos. `produto_id` e `campo` são exatos; `resolvido` separa pendentes (`false`) e resolvidos (`true`).
1933
- *
1934
- * `GET /produto_conflito_sincronizacao/filtro`
1935
- */
1936
- export function buscar_pelo_filtro_produto_conflito_sincronizacao(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
1937
- return chamar_servico({
1938
- servico: SERVICO_DESTA_API,
1939
- metodo_http: "GET",
1940
- caminho_da_rota: "/produto_conflito_sincronizacao/filtro",
1941
- credencial_de_acesso,
1942
- parametros_de_consulta: parametros,
1943
- formato_da_resposta: "json",
1944
- }, opcoes_da_chamada);
1945
- }
1946
- /**
1947
- * Busca um conflito de sincronização pelo id
1948
- *
1949
- * Exige só uma sessão válida (qualquer pessoa logada no portal). Conflito excluído não é encontrado. Traz SKU e nome do produto.
1950
- *
1951
- * `GET /produto_conflito_sincronizacao/{id}`
1952
- */
1953
- export function buscar_pelo_id_produto_conflito_sincronizacao(credencial_de_acesso, id, opcoes_da_chamada) {
1954
- return chamar_servico({
1955
- servico: SERVICO_DESTA_API,
1956
- metodo_http: "GET",
1957
- caminho_da_rota: `/produto_conflito_sincronizacao/${codificar_parametro_de_caminho(id)}`,
1958
- credencial_de_acesso,
1959
- formato_da_resposta: "json",
1960
- }, opcoes_da_chamada);
1961
- }
1962
- /**
1963
- * Resolve um conflito de sincronização
1964
- *
1965
- * Exige a permissão `editar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Resolve um conflito pendente: `resolucao` `local` mantém o valor do portal e `api` aplica o valor da API no produto.
1966
- *
1967
- * `PATCH /produto_conflito_sincronizacao/{id}`
1968
- */
1969
- export function atualizar_pelo_id_produto_conflito_sincronizacao(credencial_de_acesso, id, corpo_da_requisicao, opcoes_da_chamada) {
1970
- return chamar_servico({
1971
- servico: SERVICO_DESTA_API,
1972
- metodo_http: "PATCH",
1973
- caminho_da_rota: `/produto_conflito_sincronizacao/${codificar_parametro_de_caminho(id)}`,
1974
- credencial_de_acesso,
1975
- corpo_json: corpo_da_requisicao,
1976
- formato_da_resposta: "json",
1977
- }, opcoes_da_chamada);
1978
- }
1979
- /**
1980
- * Exclui um conflito de sincronização
1981
- *
1982
- * 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.
1983
- *
1984
- * `DELETE /produto_conflito_sincronizacao/{id}`
1985
- */
1986
- export function deletar_pelo_id_produto_conflito_sincronizacao(credencial_de_acesso, id, opcoes_da_chamada) {
1987
- return chamar_servico({
1988
- servico: SERVICO_DESTA_API,
1989
- metodo_http: "DELETE",
1990
- caminho_da_rota: `/produto_conflito_sincronizacao/${codificar_parametro_de_caminho(id)}`,
1991
- credencial_de_acesso,
1992
- formato_da_resposta: "sem_conteudo",
1993
- }, opcoes_da_chamada);
1994
- }
1995
1728
  /**
1996
1729
  * Busca as embalagens e os componentes de um produto
1997
1730
  *
@@ -2009,89 +1742,6 @@ export function buscar_pelo_filtro_produto_estrutura(credencial_de_acesso, param
2009
1742
  formato_da_resposta: "json",
2010
1743
  }, opcoes_da_chamada);
2011
1744
  }
2012
- /**
2013
- * Importa ou sincroniza produtos do Tiny pelo SKU
2014
- *
2015
- * Exige a permissão `criar` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Importa no portal os produtos do Tiny pelos `skus` (1 a 100 por vez; vazios e repetidos são descartados). Produto novo é criado; produto que já existe é atualizado, e diferença de preço ou estoque em produto com preço definido no portal vira conflito de sincronização. Responde 200 com o resultado de cada SKU (`criado`, `atualizado`, `conflito` ou `falha`) e os totais. Até 10 chamadas por minuto por pessoa.
2016
- *
2017
- * `POST /produto_termotubos`
2018
- */
2019
- export function criar_produto_termotubos(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
2020
- return chamar_servico({
2021
- servico: SERVICO_DESTA_API,
2022
- metodo_http: "POST",
2023
- caminho_da_rota: "/produto_termotubos",
2024
- credencial_de_acesso,
2025
- corpo_json: corpo_da_requisicao,
2026
- formato_da_resposta: "json",
2027
- }, opcoes_da_chamada);
2028
- }
2029
- /**
2030
- * Busca produtos no catálogo da Termotubos (Tiny)
2031
- *
2032
- * Exige a permissão `ver` no módulo `Configuracoes` do perfil de quem chama (administrador e master têm tudo). Consulta o catálogo do Tiny pela API da Termotubos para importar produtos no portal. `busca` aceita SKUs separados por vírgula, ponto e vírgula ou espaço; termo terminado em `*` busca pelo prefixo (ex.: `B68*`). `apenas_ativos` filtra; `pagina` começa em 1 e `por_pagina` tem padrão 20 e vai de 1 a 50 (vale também para a busca por termos, paginada no servidor com `tem_mais`, `total_paginas` e `total_registros`). Cada item diz se já existe no portal (`ja_existe`). Termos inválidos voltam em `termos_invalidos`; `truncado: true` indica que a busca por prefixo foi cortada. Até 30 chamadas por minuto por pessoa.
2033
- *
2034
- * `GET /produto_termotubos/filtro`
2035
- */
2036
- export function buscar_pelo_filtro_produto_termotubos(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
2037
- return chamar_servico({
2038
- servico: SERVICO_DESTA_API,
2039
- metodo_http: "GET",
2040
- caminho_da_rota: "/produto_termotubos/filtro",
2041
- credencial_de_acesso,
2042
- parametros_de_consulta: parametros,
2043
- formato_da_resposta: "json",
2044
- }, opcoes_da_chamada);
2045
- }
2046
- /**
2047
- * Status da sincronização do catálogo com o Tiny
2048
- *
2049
- * Exige a permissão `ver` no módulo `Configuracoes`. Devolve a sincronização em andamento ou a última que terminou: `etapa` (`lendo` ou `gravando`), `gravados` de `total`, `cancelada`, `erro` e o `resumo` (conferidos, criados, atualizados, conflitos e falhas).
2050
- *
2051
- * `GET /produto_termotubos/sincronizacao`
2052
- */
2053
- export function buscar_sincronizacao_produto_termotubos(credencial_de_acesso, opcoes_da_chamada) {
2054
- return chamar_servico({
2055
- servico: SERVICO_DESTA_API,
2056
- metodo_http: "GET",
2057
- caminho_da_rota: "/produto_termotubos/sincronizacao",
2058
- credencial_de_acesso,
2059
- formato_da_resposta: "json",
2060
- }, opcoes_da_chamada);
2061
- }
2062
- /**
2063
- * Inicia a sincronização do catálogo com o Tiny em segundo plano
2064
- *
2065
- * Exige a permissão `criar` no módulo `Configuracoes`. Lê o catálogo do Tiny e grava no portal o que é novo ou mudou, em segundo plano no servidor: a tela pode ser fechada. `apenas_ativos` lê só os produtos ativos. Responde 202 com o status inicial; acompanhe por `GET /produto_termotubos/sincronizacao`. O status fica em memória e se perde se o servidor reiniciar.
2066
- *
2067
- * `POST /produto_termotubos/sincronizacao`
2068
- */
2069
- export function iniciar_sincronizacao_produto_termotubos(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
2070
- return chamar_servico({
2071
- servico: SERVICO_DESTA_API,
2072
- metodo_http: "POST",
2073
- caminho_da_rota: "/produto_termotubos/sincronizacao",
2074
- credencial_de_acesso,
2075
- parametros_de_consulta: parametros,
2076
- formato_da_resposta: "json",
2077
- }, opcoes_da_chamada);
2078
- }
2079
- /**
2080
- * Cancela a sincronização do catálogo em andamento
2081
- *
2082
- * Exige a permissão `excluir` no módulo `Configuracoes`. Para depois do lote em gravação; o que já foi gravado fica.
2083
- *
2084
- * `DELETE /produto_termotubos/sincronizacao`
2085
- */
2086
- export function cancelar_sincronizacao_produto_termotubos(credencial_de_acesso, opcoes_da_chamada) {
2087
- return chamar_servico({
2088
- servico: SERVICO_DESTA_API,
2089
- metodo_http: "DELETE",
2090
- caminho_da_rota: "/produto_termotubos/sincronizacao",
2091
- credencial_de_acesso,
2092
- formato_da_resposta: "sem_conteudo",
2093
- }, opcoes_da_chamada);
2094
- }
2095
1745
  /**
2096
1746
  * Busca os dados internos de um produto no Tiny
2097
1747
  *
@@ -2160,54 +1810,6 @@ export function buscar_informacoes_paginador_rastreamento(credencial_de_acesso,
2160
1810
  formato_da_resposta: "json",
2161
1811
  }, opcoes_da_chamada);
2162
1812
  }
2163
- /**
2164
- * Status da sincronização das entregas
2165
- *
2166
- * Só colaborador interno com `ver` no módulo `Pedidos`. Devolve a sincronização em andamento ou a última que terminou: `rodando`, `pagina` de `total_paginas` (páginas da API), `progresso` (percentual), `gravados`, `cancelada`, `concluida`, `erro`, `iniciada_em` e `terminada_em`.
2167
- *
2168
- * `GET /rastreamento/sincronizacao`
2169
- */
2170
- export function buscar_sincronizacao_rastreamento(credencial_de_acesso, opcoes_da_chamada) {
2171
- return chamar_servico({
2172
- servico: SERVICO_DESTA_API,
2173
- metodo_http: "GET",
2174
- caminho_da_rota: "/rastreamento/sincronizacao",
2175
- credencial_de_acesso,
2176
- formato_da_resposta: "json",
2177
- }, opcoes_da_chamada);
2178
- }
2179
- /**
2180
- * Inicia a sincronização das entregas em segundo plano
2181
- *
2182
- * Só colaborador interno com `ver` no módulo `Pedidos`. Traz as entregas (expedições) da API de logística da Termotubos para a tabela `rastreamento`, sem filtro de data (histórico inteiro), lote por lote, em segundo plano no servidor: a tela pode ser fechada. Responde 202 com o status inicial; acompanhe por `GET /rastreamento/sincronizacao`. O status fica em memória e se perde se o servidor reiniciar.
2183
- *
2184
- * `POST /rastreamento/sincronizacao`
2185
- */
2186
- export function iniciar_sincronizacao_rastreamento(credencial_de_acesso, opcoes_da_chamada) {
2187
- return chamar_servico({
2188
- servico: SERVICO_DESTA_API,
2189
- metodo_http: "POST",
2190
- caminho_da_rota: "/rastreamento/sincronizacao",
2191
- credencial_de_acesso,
2192
- formato_da_resposta: "json",
2193
- }, opcoes_da_chamada);
2194
- }
2195
- /**
2196
- * Cancela a sincronização das entregas em andamento
2197
- *
2198
- * Só colaborador interno com `ver` no módulo `Pedidos`. Para antes do próximo lote; o que já foi gravado fica.
2199
- *
2200
- * `DELETE /rastreamento/sincronizacao`
2201
- */
2202
- export function cancelar_sincronizacao_rastreamento(credencial_de_acesso, opcoes_da_chamada) {
2203
- return chamar_servico({
2204
- servico: SERVICO_DESTA_API,
2205
- metodo_http: "DELETE",
2206
- caminho_da_rota: "/rastreamento/sincronizacao",
2207
- credencial_de_acesso,
2208
- formato_da_resposta: "sem_conteudo",
2209
- }, opcoes_da_chamada);
2210
- }
2211
1813
  /**
2212
1814
  * Busca uma entrega pelo id da logística
2213
1815
  *
@@ -2224,123 +1826,6 @@ export function buscar_pelo_id_rastreamento(credencial_de_acesso, id, opcoes_da_
2224
1826
  formato_da_resposta: "json",
2225
1827
  }, opcoes_da_chamada);
2226
1828
  }
2227
- /**
2228
- * Lista os valores auxiliares paginados
2229
- *
2230
- * Exige sessão. Ordenado por tabela, campo e label. `tabela` e `campo` filtram (opcionais). Paginado com 50 itens por página (fixo); `pagina` começa em 1. A resposta traz `itens`, `total`, `pagina` e `tamanho`.
2231
- *
2232
- * `GET /tabela_auxiliar`
2233
- */
2234
- export function buscar_paginador_tabela_auxiliar(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
2235
- return chamar_servico({
2236
- servico: SERVICO_DESTA_API,
2237
- metodo_http: "GET",
2238
- caminho_da_rota: "/tabela_auxiliar",
2239
- credencial_de_acesso,
2240
- parametros_de_consulta: parametros,
2241
- formato_da_resposta: "json",
2242
- }, opcoes_da_chamada);
2243
- }
2244
- /**
2245
- * Cadastra um valor auxiliar
2246
- *
2247
- * Exige o módulo `Configuracoes` (criar). Valor de um campo que chega das integrações sem cadastro próprio (ex.: `tabela=produto`, `campo=marca_tiny`). `tabela`, `campo` e `label` obrigatórios; o trio é único. A sincronização do catálogo preenche a tabela sozinha.
2248
- *
2249
- * `POST /tabela_auxiliar`
2250
- */
2251
- export function criar_tabela_auxiliar(credencial_de_acesso, corpo_da_requisicao, opcoes_da_chamada) {
2252
- return chamar_servico({
2253
- servico: SERVICO_DESTA_API,
2254
- metodo_http: "POST",
2255
- caminho_da_rota: "/tabela_auxiliar",
2256
- credencial_de_acesso,
2257
- corpo_json: corpo_da_requisicao,
2258
- formato_da_resposta: "json",
2259
- }, opcoes_da_chamada);
2260
- }
2261
- /**
2262
- * Lista básica de valores de um campo para seleção
2263
- *
2264
- * Exige sessão. `tabela` e `campo` obrigatórios (ex.: `produto` e `marca_tiny`). Devolve só id e label, em ordem alfabética. `busca` procura no label. `tamanho` tem padrão 10 e vai de 1 a 50; `pagina` começa em 1. A resposta traz `itens`, `total`, `pagina` e `tamanho`.
2265
- *
2266
- * `GET /tabela_auxiliar/autocomplete`
2267
- */
2268
- export function buscar_auto_complete_tabela_auxiliar(credencial_de_acesso, parametros, opcoes_da_chamada) {
2269
- return chamar_servico({
2270
- servico: SERVICO_DESTA_API,
2271
- metodo_http: "GET",
2272
- caminho_da_rota: "/tabela_auxiliar/autocomplete",
2273
- credencial_de_acesso,
2274
- parametros_de_consulta: parametros,
2275
- formato_da_resposta: "json",
2276
- }, opcoes_da_chamada);
2277
- }
2278
- /**
2279
- * Busca valores auxiliares por filtro
2280
- *
2281
- * Exige sessão. Até 50 por página (`pagina`, a partir de 1, padrão 1). `tabela` e `campo` são exatos; `label` procura o trecho.
2282
- *
2283
- * `GET /tabela_auxiliar/filtro`
2284
- */
2285
- export function buscar_pelo_filtro_tabela_auxiliar(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
2286
- return chamar_servico({
2287
- servico: SERVICO_DESTA_API,
2288
- metodo_http: "GET",
2289
- caminho_da_rota: "/tabela_auxiliar/filtro",
2290
- credencial_de_acesso,
2291
- parametros_de_consulta: parametros,
2292
- formato_da_resposta: "json",
2293
- }, opcoes_da_chamada);
2294
- }
2295
- /**
2296
- * Busca um valor auxiliar pelo id
2297
- *
2298
- * Exige sessão. Registro excluído não é encontrado.
2299
- *
2300
- * `GET /tabela_auxiliar/{id}`
2301
- */
2302
- export function buscar_pelo_id_tabela_auxiliar(credencial_de_acesso, id, opcoes_da_chamada) {
2303
- return chamar_servico({
2304
- servico: SERVICO_DESTA_API,
2305
- metodo_http: "GET",
2306
- caminho_da_rota: `/tabela_auxiliar/${codificar_parametro_de_caminho(id)}`,
2307
- credencial_de_acesso,
2308
- formato_da_resposta: "json",
2309
- }, opcoes_da_chamada);
2310
- }
2311
- /**
2312
- * Atualiza o label de um valor auxiliar
2313
- *
2314
- * Exige o módulo `Configuracoes` (editar). Muda só o `label`; campo ausente mantém o valor atual.
2315
- *
2316
- * `PATCH /tabela_auxiliar/{id}`
2317
- */
2318
- export function atualizar_pelo_id_tabela_auxiliar(credencial_de_acesso, id, corpo_da_requisicao, opcoes_da_chamada) {
2319
- return chamar_servico({
2320
- servico: SERVICO_DESTA_API,
2321
- metodo_http: "PATCH",
2322
- caminho_da_rota: `/tabela_auxiliar/${codificar_parametro_de_caminho(id)}`,
2323
- credencial_de_acesso,
2324
- corpo_json: corpo_da_requisicao,
2325
- formato_da_resposta: "json",
2326
- }, opcoes_da_chamada);
2327
- }
2328
- /**
2329
- * Exclui um valor auxiliar
2330
- *
2331
- * Exige o módulo `Configuracoes` (excluir). A exclusão é lógica: o registro some das leituras, mas a linha não é apagada.
2332
- *
2333
- * `DELETE /tabela_auxiliar/{id}`
2334
- */
2335
- export function deletar_pelo_id_tabela_auxiliar(credencial_de_acesso, id, opcoes_da_chamada) {
2336
- return chamar_servico({
2337
- servico: SERVICO_DESTA_API,
2338
- metodo_http: "DELETE",
2339
- caminho_da_rota: `/tabela_auxiliar/${codificar_parametro_de_caminho(id)}`,
2340
- credencial_de_acesso,
2341
- formato_da_resposta: "sem_conteudo",
2342
- }, opcoes_da_chamada);
2343
- }
2344
1829
  /**
2345
1830
  * Lista as unidades paginadas
2346
1831
  *