termo_core 0.1.1 → 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.
- package/dist/portal/rotas.d.ts +20 -191
- package/dist/portal/rotas.js +37 -286
- package/dist/portal/tipos.d.ts +21 -140
- package/dist/sell/rotas.d.ts +10 -4
- package/dist/sell/rotas.js +5 -4
- package/dist/sell/tipos.d.ts +0 -2
- package/package.json +1 -1
package/dist/portal/rotas.d.ts
CHANGED
|
@@ -156,53 +156,6 @@ export interface ParametrosDeBuscarInformacoesPaginadorCliente {
|
|
|
156
156
|
unidade_id?: string;
|
|
157
157
|
cursor?: string;
|
|
158
158
|
}
|
|
159
|
-
/**
|
|
160
|
-
* Parâmetros de consulta e de cabeçalho de `/colaborador`.
|
|
161
|
-
*/
|
|
162
|
-
export interface ParametrosDeBuscarPaginadorColaborador {
|
|
163
|
-
pagina?: number;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Parâmetros de consulta e de cabeçalho de `/colaborador/autocomplete`.
|
|
167
|
-
*/
|
|
168
|
-
export interface ParametrosDeBuscarAutoCompleteColaborador {
|
|
169
|
-
busca?: string;
|
|
170
|
-
status?: string;
|
|
171
|
-
pagina?: number;
|
|
172
|
-
tamanho?: number;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Parâmetros de consulta e de cabeçalho de `/colaborador/filtro`.
|
|
176
|
-
*/
|
|
177
|
-
export interface ParametrosDeBuscarPeloFiltroColaborador {
|
|
178
|
-
nome?: string;
|
|
179
|
-
email?: string;
|
|
180
|
-
status?: string;
|
|
181
|
-
perfil_id?: string;
|
|
182
|
-
pagina?: number;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Parâmetros de consulta e de cabeçalho de `/configuracao`.
|
|
186
|
-
*/
|
|
187
|
-
export interface ParametrosDeBuscarPaginadorConfiguracao {
|
|
188
|
-
pagina?: number;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Parâmetros de consulta e de cabeçalho de `/configuracao/autocomplete`.
|
|
192
|
-
*/
|
|
193
|
-
export interface ParametrosDeBuscarAutoCompleteConfiguracao {
|
|
194
|
-
busca?: string;
|
|
195
|
-
pagina?: number;
|
|
196
|
-
tamanho?: number;
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Parâmetros de consulta e de cabeçalho de `/configuracao/filtro`.
|
|
200
|
-
*/
|
|
201
|
-
export interface ParametrosDeBuscarPeloFiltroConfiguracao {
|
|
202
|
-
chave?: string;
|
|
203
|
-
prefixo?: string;
|
|
204
|
-
pagina?: number;
|
|
205
|
-
}
|
|
206
159
|
/**
|
|
207
160
|
* Parâmetros de consulta e de cabeçalho de `/contato`.
|
|
208
161
|
*/
|
|
@@ -586,8 +539,6 @@ export interface ParametrosDeBuscarPaginadorProduto {
|
|
|
586
539
|
enriquecido?: boolean;
|
|
587
540
|
unidade?: string;
|
|
588
541
|
cor?: string;
|
|
589
|
-
material?: string;
|
|
590
|
-
diametro?: string;
|
|
591
542
|
categoria_tiny?: string;
|
|
592
543
|
marca_tiny?: string;
|
|
593
544
|
criado_desde?: string;
|
|
@@ -630,8 +581,6 @@ export interface ParametrosDeBuscarPeloFiltroProduto {
|
|
|
630
581
|
enriquecido?: boolean;
|
|
631
582
|
unidade?: string;
|
|
632
583
|
cor?: string;
|
|
633
|
-
material?: string;
|
|
634
|
-
diametro?: string;
|
|
635
584
|
categoria_tiny?: string;
|
|
636
585
|
marca_tiny?: string;
|
|
637
586
|
criado_desde?: string;
|
|
@@ -788,14 +737,6 @@ export interface ParametrosDeBuscarPeloFiltroUnidade {
|
|
|
788
737
|
cliente_id?: string;
|
|
789
738
|
pagina?: number;
|
|
790
739
|
}
|
|
791
|
-
/**
|
|
792
|
-
* Versão da API
|
|
793
|
-
*
|
|
794
|
-
* Rota pública: não exige sessão. Confere se a API está no ar e devolve a versão publicada do backend.
|
|
795
|
-
*
|
|
796
|
-
* `GET /`
|
|
797
|
-
*/
|
|
798
|
-
export declare function buscar_pelo_id_versao(opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.VersaoDaApi>;
|
|
799
740
|
/**
|
|
800
741
|
* Envia um arquivo (imagem ou PDF de boletim)
|
|
801
742
|
*
|
|
@@ -1116,134 +1057,6 @@ export declare function atualizar_pelo_id_cliente(credencial_de_acesso: Credenci
|
|
|
1116
1057
|
* `DELETE /cliente/{id}`
|
|
1117
1058
|
*/
|
|
1118
1059
|
export declare function deletar_pelo_id_cliente(credencial_de_acesso: CredencialDeAcesso, id: string, opcoes_da_chamada?: OpcoesDaChamada): Promise<void>;
|
|
1119
|
-
/**
|
|
1120
|
-
* Lista colaboradores paginados
|
|
1121
|
-
*
|
|
1122
|
-
* Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno.
|
|
1123
|
-
*
|
|
1124
|
-
* `GET /colaborador`
|
|
1125
|
-
*/
|
|
1126
|
-
export declare function buscar_paginador_colaborador(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarPaginadorColaborador, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.PaginaColaborador>;
|
|
1127
|
-
/**
|
|
1128
|
-
* Cadastra o colaborador
|
|
1129
|
-
*
|
|
1130
|
-
* 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.
|
|
1131
|
-
*
|
|
1132
|
-
* `POST /colaborador`
|
|
1133
|
-
*/
|
|
1134
|
-
export declare function criar_colaborador(credencial_de_acesso: CredencialDeAcesso, corpo_da_requisicao: tipos.ColaboradorCriar, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.Colaborador>;
|
|
1135
|
-
/**
|
|
1136
|
-
* Lista básica de colaboradores para seleção
|
|
1137
|
-
*
|
|
1138
|
-
* 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).
|
|
1139
|
-
*
|
|
1140
|
-
* `GET /colaborador/autocomplete`
|
|
1141
|
-
*/
|
|
1142
|
-
export declare function buscar_auto_complete_colaborador(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarAutoCompleteColaborador, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.PaginaColaboradorAutoComplete>;
|
|
1143
|
-
/**
|
|
1144
|
-
* Busca colaboradores por filtro
|
|
1145
|
-
*
|
|
1146
|
-
* 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.
|
|
1147
|
-
*
|
|
1148
|
-
* `GET /colaborador/filtro`
|
|
1149
|
-
*/
|
|
1150
|
-
export declare function buscar_pelo_filtro_colaborador(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarPeloFiltroColaborador, opcoes_da_chamada?: OpcoesDaChamada): Promise<Array<tipos.Colaborador>>;
|
|
1151
|
-
/**
|
|
1152
|
-
* Busca o colaborador pelo id
|
|
1153
|
-
*
|
|
1154
|
-
* Colaborador é o usuário da Termotubos: entra pela área `/painel` e também pode abrir o `/app`. Exige colaborador interno.
|
|
1155
|
-
*
|
|
1156
|
-
* `GET /colaborador/{id}`
|
|
1157
|
-
*/
|
|
1158
|
-
export declare function buscar_pelo_id_colaborador(credencial_de_acesso: CredencialDeAcesso, id: string, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.Colaborador>;
|
|
1159
|
-
/**
|
|
1160
|
-
* Atualiza o colaborador
|
|
1161
|
-
*
|
|
1162
|
-
* 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`).
|
|
1163
|
-
*
|
|
1164
|
-
* `PATCH /colaborador/{id}`
|
|
1165
|
-
*/
|
|
1166
|
-
export declare function atualizar_pelo_id_colaborador(credencial_de_acesso: CredencialDeAcesso, id: string, corpo_da_requisicao: tipos.ColaboradorAtualizar, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.Colaborador>;
|
|
1167
|
-
/**
|
|
1168
|
-
* Exclui o colaborador
|
|
1169
|
-
*
|
|
1170
|
-
* 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.
|
|
1171
|
-
*
|
|
1172
|
-
* `DELETE /colaborador/{id}`
|
|
1173
|
-
*/
|
|
1174
|
-
export declare function deletar_pelo_id_colaborador(credencial_de_acesso: CredencialDeAcesso, id: string, opcoes_da_chamada?: OpcoesDaChamada): Promise<void>;
|
|
1175
|
-
/**
|
|
1176
|
-
* Lista as configurações paginadas
|
|
1177
|
-
*
|
|
1178
|
-
* 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`.
|
|
1179
|
-
*
|
|
1180
|
-
* `GET /configuracao`
|
|
1181
|
-
*/
|
|
1182
|
-
export declare function buscar_paginador_configuracao(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarPaginadorConfiguracao, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.PaginaConfiguracao>;
|
|
1183
|
-
/**
|
|
1184
|
-
* Grava uma configuração do portal
|
|
1185
|
-
*
|
|
1186
|
-
* 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ó.
|
|
1187
|
-
*
|
|
1188
|
-
* `POST /configuracao`
|
|
1189
|
-
*/
|
|
1190
|
-
export declare function criar_configuracao(credencial_de_acesso: CredencialDeAcesso, corpo_da_requisicao: tipos.ConfiguracaoCriar, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.Configuracao>;
|
|
1191
|
-
/**
|
|
1192
|
-
* Lista básica de configurações para seleção
|
|
1193
|
-
*
|
|
1194
|
-
* 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`.
|
|
1195
|
-
*
|
|
1196
|
-
* `GET /configuracao/autocomplete`
|
|
1197
|
-
*/
|
|
1198
|
-
export declare function buscar_auto_complete_configuracao(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarAutoCompleteConfiguracao, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.PaginaConfiguracaoAutoComplete>;
|
|
1199
|
-
/**
|
|
1200
|
-
* Busca configurações por filtro
|
|
1201
|
-
*
|
|
1202
|
-
* 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_`).
|
|
1203
|
-
*
|
|
1204
|
-
* `GET /configuracao/filtro`
|
|
1205
|
-
*/
|
|
1206
|
-
export declare function buscar_pelo_filtro_configuracao(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarPeloFiltroConfiguracao, opcoes_da_chamada?: OpcoesDaChamada): Promise<Array<tipos.Configuracao>>;
|
|
1207
|
-
/**
|
|
1208
|
-
* Busca uma configuração pelo id
|
|
1209
|
-
*
|
|
1210
|
-
* Exige só uma sessão válida (qualquer pessoa logada no portal). Configuração excluída não é encontrada.
|
|
1211
|
-
*
|
|
1212
|
-
* `GET /configuracao/{id}`
|
|
1213
|
-
*/
|
|
1214
|
-
export declare function buscar_pelo_id_configuracao(credencial_de_acesso: CredencialDeAcesso, id: string, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.Configuracao>;
|
|
1215
|
-
/**
|
|
1216
|
-
* Atualiza o valor de uma configuração
|
|
1217
|
-
*
|
|
1218
|
-
* 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.
|
|
1219
|
-
*
|
|
1220
|
-
* `PATCH /configuracao/{id}`
|
|
1221
|
-
*/
|
|
1222
|
-
export declare function atualizar_pelo_id_configuracao(credencial_de_acesso: CredencialDeAcesso, id: string, corpo_da_requisicao: tipos.ConfiguracaoAtualizar, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.Configuracao>;
|
|
1223
|
-
/**
|
|
1224
|
-
* Exclui uma configuração
|
|
1225
|
-
*
|
|
1226
|
-
* 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.
|
|
1227
|
-
*
|
|
1228
|
-
* `DELETE /configuracao/{id}`
|
|
1229
|
-
*/
|
|
1230
|
-
export declare function deletar_pelo_id_configuracao(credencial_de_acesso: CredencialDeAcesso, id: string, opcoes_da_chamada?: OpcoesDaChamada): Promise<void>;
|
|
1231
|
-
/**
|
|
1232
|
-
* Mostra a situação do segredo do app gerado no TermoAuth
|
|
1233
|
-
*
|
|
1234
|
-
* 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.
|
|
1235
|
-
*
|
|
1236
|
-
* `GET /configuracao_provedor`
|
|
1237
|
-
*/
|
|
1238
|
-
export declare function buscar_pelo_id_configuracao_provedor(credencial_de_acesso: CredencialDeAcesso, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.ConfiguracaoProvedor>;
|
|
1239
|
-
/**
|
|
1240
|
-
* Grava ou limpa o segredo do app gerado no TermoAuth
|
|
1241
|
-
*
|
|
1242
|
-
* 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.
|
|
1243
|
-
*
|
|
1244
|
-
* `PATCH /configuracao_provedor`
|
|
1245
|
-
*/
|
|
1246
|
-
export declare function atualizar_pelo_id_configuracao_provedor(credencial_de_acesso: CredencialDeAcesso, corpo_da_requisicao: tipos.ConfiguracaoProvedorAtualizar, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.ConfiguracaoProvedor>;
|
|
1247
1060
|
/**
|
|
1248
1061
|
* Lista os contatos paginados
|
|
1249
1062
|
*
|
|
@@ -1524,6 +1337,22 @@ export declare function buscar_pelo_filtro_indicador_compra(credencial_de_acesso
|
|
|
1524
1337
|
* `GET /indicador_venda/filtro`
|
|
1525
1338
|
*/
|
|
1526
1339
|
export declare function buscar_pelo_filtro_indicador_venda(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarPeloFiltroIndicadorVenda, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.IndicadoresDeVenda>;
|
|
1340
|
+
/**
|
|
1341
|
+
* Gera um link de envio de imagem para o produto do SKU
|
|
1342
|
+
*
|
|
1343
|
+
* 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.
|
|
1344
|
+
*
|
|
1345
|
+
* `POST /link_envio_imagem`
|
|
1346
|
+
*/
|
|
1347
|
+
export declare function criar_link_envio_imagem(credencial_de_acesso: CredencialDeAcesso, corpo_da_requisicao: tipos.LinkEnvioImagemCriar, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.LinkEnvioImagem>;
|
|
1348
|
+
/**
|
|
1349
|
+
* Envia a imagem pelo link e a acrescenta ao produto
|
|
1350
|
+
*
|
|
1351
|
+
* 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.
|
|
1352
|
+
*
|
|
1353
|
+
* `PATCH /link_envio_imagem/{id}`
|
|
1354
|
+
*/
|
|
1355
|
+
export declare function atualizar_pelo_id_link_envio_imagem(id: string, formulario: FormData, opcoes_da_chamada?: OpcoesDaChamada): Promise<tipos.ImagemEnviada>;
|
|
1527
1356
|
/**
|
|
1528
1357
|
* Uma página das notas fiscais, por cursor
|
|
1529
1358
|
*
|
|
@@ -1767,7 +1596,7 @@ export declare function deletar_pelo_id_perfil(credencial_de_acesso: CredencialD
|
|
|
1767
1596
|
/**
|
|
1768
1597
|
* Lista os produtos paginados
|
|
1769
1598
|
*
|
|
1770
|
-
* 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`, `
|
|
1599
|
+
* 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.
|
|
1771
1600
|
*
|
|
1772
1601
|
* `GET /produto`
|
|
1773
1602
|
*/
|
|
@@ -1775,7 +1604,7 @@ export declare function buscar_paginador_produto(credencial_de_acesso: Credencia
|
|
|
1775
1604
|
/**
|
|
1776
1605
|
* Cadastra um produto
|
|
1777
1606
|
*
|
|
1778
|
-
* 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: `
|
|
1607
|
+
* 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.
|
|
1779
1608
|
*
|
|
1780
1609
|
* `POST /produto`
|
|
1781
1610
|
*/
|
|
@@ -1791,7 +1620,7 @@ export declare function buscar_auto_complete_produto(credencial_de_acesso: Crede
|
|
|
1791
1620
|
/**
|
|
1792
1621
|
* Busca produtos por filtro
|
|
1793
1622
|
*
|
|
1794
|
-
* 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`, `
|
|
1623
|
+
* 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.
|
|
1795
1624
|
*
|
|
1796
1625
|
* `GET /produto/filtro`
|
|
1797
1626
|
*/
|
|
@@ -1807,7 +1636,7 @@ export declare function buscar_pelo_id_produto(credencial_de_acesso: CredencialD
|
|
|
1807
1636
|
/**
|
|
1808
1637
|
* Atualiza um produto
|
|
1809
1638
|
*
|
|
1810
|
-
* 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; `
|
|
1639
|
+
* 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).
|
|
1811
1640
|
*
|
|
1812
1641
|
* `PATCH /produto/{id}`
|
|
1813
1642
|
*/
|
package/dist/portal/rotas.js
CHANGED
|
@@ -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`, `
|
|
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: `
|
|
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`, `
|
|
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; `
|
|
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
|
*/
|
package/dist/portal/tipos.d.ts
CHANGED
|
@@ -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
|
-
}
|
package/dist/sell/rotas.d.ts
CHANGED
|
@@ -198,6 +198,12 @@ export interface ParametrosDeBuscarAutoCompleteRobo {
|
|
|
198
198
|
pagina?: number;
|
|
199
199
|
tamanho?: number;
|
|
200
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Parâmetros de consulta e de cabeçalho de `/robo/equipes`.
|
|
203
|
+
*/
|
|
204
|
+
export interface ParametrosDeBuscarEquipesRobo {
|
|
205
|
+
robo_id?: string;
|
|
206
|
+
}
|
|
201
207
|
/**
|
|
202
208
|
* Parâmetros de consulta e de cabeçalho de `/robo/filtro`.
|
|
203
209
|
*/
|
|
@@ -391,7 +397,7 @@ export declare function buscar_sincronizacao_cliente(credencial_de_acesso: Crede
|
|
|
391
397
|
/**
|
|
392
398
|
* Inicia a sincronização dos clientes com o TermoIntranetAPI em segundo plano
|
|
393
399
|
*
|
|
394
|
-
* Só para o master do TermoAuth. Percorre toda a lista de clientes do TermoIntranetAPI (`GET /cliente`, paginada por cursor) usando o próprio token de quem chamou e grava aqui: entra todo cliente, pessoa física ou jurídica, com ou sem documento (`cnpj` guarda só os dígitos do CPF ou CNPJ, ou fica vazio); `ignorados` conta só o id repetido na mesma página. Cliente que já existe com o mesmo CNPJ e ainda sem vínculo recebe o `intranet_cliente_id`; cliente já vinculado tem razão social, nome fantasia, telefone (celular, ou telefone fixo na falta dele, só dígitos), e-mail, cidade e estado sobrescritos pela intranet; cliente novo é criado com `atendente_ativo` desligado. Os campos do TermoSell (`ativo
|
|
400
|
+
* Só para o master do TermoAuth. Percorre toda a lista de clientes do TermoIntranetAPI (`GET /cliente`, paginada por cursor) usando o próprio token de quem chamou e grava aqui: entra todo cliente, pessoa física ou jurídica, com ou sem documento (`cnpj` guarda só os dígitos do CPF ou CNPJ, ou fica vazio); `ignorados` conta só o id repetido na mesma página. Cliente que já existe com o mesmo CNPJ e ainda sem vínculo recebe o `intranet_cliente_id`; cliente já vinculado tem razão social, nome fantasia, telefone (celular, ou telefone fixo na falta dele, só dígitos), e-mail, cidade e estado sobrescritos pela intranet; cliente novo é criado com `atendente_ativo` desligado. Os campos do TermoSell (`ativo` e `atendente_ativo`) nunca são tocados. Roda em segundo plano no servidor e grava cada página no banco assim que chega: a tela pode ser fechada. Responde 202 com o status inicial; acompanhe por `GET /cliente/sincronizar`. Sem corpo.
|
|
395
401
|
*
|
|
396
402
|
* `POST /cliente/sincronizar`
|
|
397
403
|
*/
|
|
@@ -479,7 +485,7 @@ export declare function buscar_paginador_config_system_chatwoot(credencial_de_ac
|
|
|
479
485
|
/**
|
|
480
486
|
* Conecta a conta do Chatwoot
|
|
481
487
|
*
|
|
482
|
-
* Exige a permissão `criar` da área `configuracoes`.
|
|
488
|
+
* Exige a permissão `criar` da área `configuracoes`. Aceita quantas contas do Chatwoot forem precisas; o `nome` e o par `endereco` + `conta_id` não se repetem (`409`). `nome` (até 100 caracteres), `endereco` do Chatwoot (`http://` ou `https://`, até 200), `conta_id` (maior que zero), `token_acesso` (de 8 a 200 caracteres) e `endereco_publico` (o endereço `https://` deste backend que o Chatwoot vai chamar, até 200) são obrigatórios. Antes de gravar, cria no Chatwoot o robô de atendimento que avisa o TermoSell das mensagens; se o Chatwoot recusar, responde `400` com o motivo. A configuração nasce ativa. O token de acesso nunca volta: as respostas trazem só `token_acesso_mascarado`.
|
|
483
489
|
*
|
|
484
490
|
* `POST /config_system_chatwoot`
|
|
485
491
|
*/
|
|
@@ -727,11 +733,11 @@ export declare function buscar_auto_complete_robo(credencial_de_acesso: Credenci
|
|
|
727
733
|
/**
|
|
728
734
|
* Lista as equipes do Chatwoot
|
|
729
735
|
*
|
|
730
|
-
* Exige qualquer permissão da área `configuracoes` (qualquer ação liberada na área já libera a leitura). Consulta na hora
|
|
736
|
+
* Exige qualquer permissão da área `configuracoes` (qualquer ação liberada na área já libera a leitura). Consulta na hora as equipes (id e nome) de uma conta do Chatwoot ativa, para escolher a `equipe_id` da etapa `atendimento` ou do `gatilho` do fluxo. Com `robo_id`, usa a conta do Chatwoot dos números de WhatsApp (Z-API ou QR Code) ligados a esse robô; sem `robo_id` ou sem número ligado, usa a primeira conta ativa.
|
|
731
737
|
*
|
|
732
738
|
* `GET /robo/equipes`
|
|
733
739
|
*/
|
|
734
|
-
export declare function buscar_equipes_robo(credencial_de_acesso: CredencialDeAcesso, opcoes_da_chamada?: OpcoesDaChamada): Promise<Array<tipos.EquipeChatwoot>>;
|
|
740
|
+
export declare function buscar_equipes_robo(credencial_de_acesso: CredencialDeAcesso, parametros?: ParametrosDeBuscarEquipesRobo, opcoes_da_chamada?: OpcoesDaChamada): Promise<Array<tipos.EquipeChatwoot>>;
|
|
735
741
|
/**
|
|
736
742
|
* Busca robôs por filtro
|
|
737
743
|
*
|
package/dist/sell/rotas.js
CHANGED
|
@@ -236,7 +236,7 @@ export function buscar_sincronizacao_cliente(credencial_de_acesso, opcoes_da_cha
|
|
|
236
236
|
/**
|
|
237
237
|
* Inicia a sincronização dos clientes com o TermoIntranetAPI em segundo plano
|
|
238
238
|
*
|
|
239
|
-
* Só para o master do TermoAuth. Percorre toda a lista de clientes do TermoIntranetAPI (`GET /cliente`, paginada por cursor) usando o próprio token de quem chamou e grava aqui: entra todo cliente, pessoa física ou jurídica, com ou sem documento (`cnpj` guarda só os dígitos do CPF ou CNPJ, ou fica vazio); `ignorados` conta só o id repetido na mesma página. Cliente que já existe com o mesmo CNPJ e ainda sem vínculo recebe o `intranet_cliente_id`; cliente já vinculado tem razão social, nome fantasia, telefone (celular, ou telefone fixo na falta dele, só dígitos), e-mail, cidade e estado sobrescritos pela intranet; cliente novo é criado com `atendente_ativo` desligado. Os campos do TermoSell (`ativo
|
|
239
|
+
* Só para o master do TermoAuth. Percorre toda a lista de clientes do TermoIntranetAPI (`GET /cliente`, paginada por cursor) usando o próprio token de quem chamou e grava aqui: entra todo cliente, pessoa física ou jurídica, com ou sem documento (`cnpj` guarda só os dígitos do CPF ou CNPJ, ou fica vazio); `ignorados` conta só o id repetido na mesma página. Cliente que já existe com o mesmo CNPJ e ainda sem vínculo recebe o `intranet_cliente_id`; cliente já vinculado tem razão social, nome fantasia, telefone (celular, ou telefone fixo na falta dele, só dígitos), e-mail, cidade e estado sobrescritos pela intranet; cliente novo é criado com `atendente_ativo` desligado. Os campos do TermoSell (`ativo` e `atendente_ativo`) nunca são tocados. Roda em segundo plano no servidor e grava cada página no banco assim que chega: a tela pode ser fechada. Responde 202 com o status inicial; acompanhe por `GET /cliente/sincronizar`. Sem corpo.
|
|
240
240
|
*
|
|
241
241
|
* `POST /cliente/sincronizar`
|
|
242
242
|
*/
|
|
@@ -418,7 +418,7 @@ export function buscar_paginador_config_system_chatwoot(credencial_de_acesso, pa
|
|
|
418
418
|
/**
|
|
419
419
|
* Conecta a conta do Chatwoot
|
|
420
420
|
*
|
|
421
|
-
* Exige a permissão `criar` da área `configuracoes`.
|
|
421
|
+
* Exige a permissão `criar` da área `configuracoes`. Aceita quantas contas do Chatwoot forem precisas; o `nome` e o par `endereco` + `conta_id` não se repetem (`409`). `nome` (até 100 caracteres), `endereco` do Chatwoot (`http://` ou `https://`, até 200), `conta_id` (maior que zero), `token_acesso` (de 8 a 200 caracteres) e `endereco_publico` (o endereço `https://` deste backend que o Chatwoot vai chamar, até 200) são obrigatórios. Antes de gravar, cria no Chatwoot o robô de atendimento que avisa o TermoSell das mensagens; se o Chatwoot recusar, responde `400` com o motivo. A configuração nasce ativa. O token de acesso nunca volta: as respostas trazem só `token_acesso_mascarado`.
|
|
422
422
|
*
|
|
423
423
|
* `POST /config_system_chatwoot`
|
|
424
424
|
*/
|
|
@@ -934,16 +934,17 @@ export function buscar_auto_complete_robo(credencial_de_acesso, parametros = {},
|
|
|
934
934
|
/**
|
|
935
935
|
* Lista as equipes do Chatwoot
|
|
936
936
|
*
|
|
937
|
-
* Exige qualquer permissão da área `configuracoes` (qualquer ação liberada na área já libera a leitura). Consulta na hora
|
|
937
|
+
* Exige qualquer permissão da área `configuracoes` (qualquer ação liberada na área já libera a leitura). Consulta na hora as equipes (id e nome) de uma conta do Chatwoot ativa, para escolher a `equipe_id` da etapa `atendimento` ou do `gatilho` do fluxo. Com `robo_id`, usa a conta do Chatwoot dos números de WhatsApp (Z-API ou QR Code) ligados a esse robô; sem `robo_id` ou sem número ligado, usa a primeira conta ativa.
|
|
938
938
|
*
|
|
939
939
|
* `GET /robo/equipes`
|
|
940
940
|
*/
|
|
941
|
-
export function buscar_equipes_robo(credencial_de_acesso, opcoes_da_chamada) {
|
|
941
|
+
export function buscar_equipes_robo(credencial_de_acesso, parametros = {}, opcoes_da_chamada) {
|
|
942
942
|
return chamar_servico({
|
|
943
943
|
servico: SERVICO_DESTA_API,
|
|
944
944
|
metodo_http: "GET",
|
|
945
945
|
caminho_da_rota: "/robo/equipes",
|
|
946
946
|
credencial_de_acesso,
|
|
947
|
+
parametros_de_consulta: parametros,
|
|
947
948
|
formato_da_resposta: "json",
|
|
948
949
|
}, opcoes_da_chamada);
|
|
949
950
|
}
|
package/dist/sell/tipos.d.ts
CHANGED
|
@@ -54,7 +54,6 @@ export interface Cliente {
|
|
|
54
54
|
atendente_ativo: boolean;
|
|
55
55
|
ativo: boolean;
|
|
56
56
|
atualizado_em: string;
|
|
57
|
-
chatwoot_contato_id?: number | null;
|
|
58
57
|
cidade?: string | null;
|
|
59
58
|
cnpj: string;
|
|
60
59
|
criado_em: string;
|
|
@@ -352,7 +351,6 @@ export interface PaginaClienteItensItem {
|
|
|
352
351
|
atendente_ativo: boolean;
|
|
353
352
|
ativo: boolean;
|
|
354
353
|
atualizado_em: string;
|
|
355
|
-
chatwoot_contato_id?: number | null;
|
|
356
354
|
cidade?: string | null;
|
|
357
355
|
cnpj: string;
|
|
358
356
|
criado_em: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "termo_core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Todos os clientes da Termotubos num pacote só: um módulo por serviço e cada rota da API como uma função com fetch, com o endereço resolvido pelo ambiente atual.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "TI Termotubos <ti@termotubos.com.br>",
|