Cliente
9 funções do TermoPortal para cliente.
// npm install termo_core --save-exact
import * as portal from "termo_core/portal";
// ou: import { portal } from "termo_core";| Função | Rota | O que faz |
|---|---|---|
buscar_paginador_cliente | GET /cliente | Uma página de clientes, por cursor |
criar_cliente | POST /cliente | Cadastra o cliente |
buscar_auto_complete_cliente | GET /cliente/autocomplete | Lista básica de clientes para seleção |
buscar_pelo_filtro_cliente | GET /cliente/filtro | Busca clientes por filtro |
buscar_informacoes_paginador_cliente | GET /cliente/paginador | Total, páginas e contagens dos clientes |
sincronizar_cliente | POST /cliente/sincronizar | Sincroniza um lote de clientes do Tiny |
buscar_pelo_id_cliente | GET /cliente/{id} | Busca o cliente pelo id |
atualizar_pelo_id_cliente | PATCH /cliente/{id} | Atualiza o cliente |
deletar_pelo_id_cliente | DELETE /cliente/{id} | Exclui o cliente |
buscar_paginador_cliente
GET/cliente Exige credencial
Uma página de clientes, por cursor
A tabela cliente tem os clientes do Tiny (cópia do TermoIntranetAPI mantida pela sincronização do backend) e, na mesma linha, o login de quem entra no portal pela área /app (email e identificador_termoauth; cada unidade tem um cliente só, unidade.cliente_id). Exige a permissão ver no módulo Configuracoes; quem não é colaborador interno vê só os clientes das próprias unidades. Ordem alfabética do nome (sem acento; empate pelo id). Devolve só o array dos 50 clientes da página; a seguinte manda em cursor o id do último cliente recebido. Filtros: busca (CPF/CNPJ ou palavras do nome e do nome fantasia, sem acento), acesso (com = tem login, sem = só cadastro do Tiny, solicitacoes = pediu acesso; sem ele, todos), uf, cidade, vendedor (nome no Tiny) e unidade_id. Total, páginas e contagens vêm de GET /cliente/paginador, com os mesmos filtros.
function buscar_paginador_cliente(
credencial_de_acesso: CredencialDeAcesso,
parametros: ParametrosDeBuscarPaginadorCliente = {},
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<Array<tipos.Cliente>>import { CredencialDeAcesso } from "termo_core";
import { buscar_paginador_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_paginador_cliente(credencial_de_acesso, { busca: "..." });Argumentos
Nome
Tipo
Retorno: Promise<Array<tipos.Cliente>> · Rust: Result<Vec<tipos::Cliente>, ErroAoChamarServico>
criar_cliente
POST/cliente Exige credencial
Cadastra o cliente
Cliente é o usuário de fora da Termotubos: entra pela área /app e cada unidade tem um cliente só (unidade.cliente_id). Exige a permissão administrativa usuarios.gerenciar; quem não é colaborador interno só cria cliente nas próprias unidades (informe ao menos uma em unidade_ids) e não escolhe perfil nem grupo. nome obrigatório até 150 caracteres; email válido e único entre clientes e colaboradores; telefone com 10 ou 11 dígitos; cargo até 120; status ativo, pendente ou inativo; perfil_id de cliente (sem ele vale o perfil base).
function criar_cliente(
credencial_de_acesso: CredencialDeAcesso,
corpo_da_requisicao: tipos.ClienteCriar,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Cliente>import { CredencialDeAcesso } from "termo_core";
import { criar_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await criar_cliente(credencial_de_acesso, corpo_da_requisicao);Argumentos
Nome
Tipo
Retorno: Promise<tipos.Cliente> · Rust: Result<tipos::Cliente, ErroAoChamarServico> · veja Cliente.
buscar_auto_complete_cliente
GET/cliente/autocomplete Exige credencial
Lista básica de clientes para seleção
Cliente é o usuário de fora da Termotubos: entra pela área /app e cada unidade tem um cliente só (unidade.cliente_id). Exige a permissão ver no módulo Configuracoes; quem não é colaborador interno vê só os clientes das próprias unidades. 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). Com tipo (uf, cidade ou vendedor; só colaborador interno) devolve, em vez da página, as opções do filtro da tela tiradas do cadastro do Tiny (valor, rotulo, clientes), da mais usada para a menos usada, até 50; busca procura trecho (sem acento).
function buscar_auto_complete_cliente(
credencial_de_acesso: CredencialDeAcesso,
parametros: ParametrosDeBuscarAutoCompleteCliente = {},
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.PaginaClienteAutoComplete>import { CredencialDeAcesso } from "termo_core";
import { buscar_auto_complete_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_auto_complete_cliente(credencial_de_acesso, { tipo: "..." });Argumentos
Nome
Tipo
Retorno: Promise<tipos.PaginaClienteAutoComplete> · Rust: Result<tipos::PaginaClienteAutoComplete, ErroAoChamarServico> · veja PaginaClienteAutoComplete.
buscar_pelo_filtro_cliente
GET/cliente/filtro Exige credencial
Busca clientes por filtro
Cliente é o usuário de fora da Termotubos: entra pela área /app e cada unidade tem um cliente só (unidade.cliente_id). Exige a permissão ver no módulo Configuracoes; quem não é colaborador interno vê só os clientes das próprias unidades. 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. acesso tem padrão com (só quem tem login no portal); sem, solicitacoes ou todos para os outros, porque o cadastro do Tiny inteiro tem dezenas de milhares de clientes.
function buscar_pelo_filtro_cliente(
credencial_de_acesso: CredencialDeAcesso,
parametros: ParametrosDeBuscarPeloFiltroCliente = {},
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<Array<tipos.Cliente>>import { CredencialDeAcesso } from "termo_core";
import { buscar_pelo_filtro_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_pelo_filtro_cliente(credencial_de_acesso, { nome: "..." });Argumentos
Nome
Tipo
Retorno: Promise<Array<tipos.Cliente>> · Rust: Result<Vec<tipos::Cliente>, ErroAoChamarServico>
buscar_informacoes_paginador_cliente
GET/cliente/paginador Exige credencial
Total, páginas e contagens dos clientes
Mesma permissão e mesmos parâmetros de GET /cliente (cursor não muda a conta). Devolve total (clientes com os filtros e o acesso), paginas (total dividido por tamanho, arredondado para cima, no mínimo 1), tamanho (sempre 50), contagens por acesso (todos, com_acesso, sem_acesso, solicitacoes), que usam os outros filtros e ignoram o acesso, e sincronizado_em (a última sincronização com o Tiny; nulo se nunca houve).
function buscar_informacoes_paginador_cliente(
credencial_de_acesso: CredencialDeAcesso,
parametros: ParametrosDeBuscarInformacoesPaginadorCliente = {},
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.ClientePaginador>import { CredencialDeAcesso } from "termo_core";
import { buscar_informacoes_paginador_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_informacoes_paginador_cliente(credencial_de_acesso, { busca: "..." });Argumentos
Nome
Tipo
Retorno: Promise<tipos.ClientePaginador> · Rust: Result<tipos::ClientePaginador, ErroAoChamarServico> · veja ClientePaginador.
sincronizar_cliente
POST/cliente/sincronizar Exige credencial
Sincroniza um lote de clientes do Tiny
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).
function sincronizar_cliente(
credencial_de_acesso: CredencialDeAcesso,
corpo_da_requisicao: tipos.ClienteSincronizar,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.SincronizacaoClientes>import { CredencialDeAcesso } from "termo_core";
import { sincronizar_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await sincronizar_cliente(credencial_de_acesso, corpo_da_requisicao);Argumentos
Nome
Tipo
Retorno: Promise<tipos.SincronizacaoClientes> · Rust: Result<tipos::SincronizacaoClientes, ErroAoChamarServico> · veja SincronizacaoClientes.
buscar_pelo_id_cliente
GET/cliente/{id} Exige credencial
Busca o cliente pelo id
Cliente é o usuário de fora da Termotubos: entra pela área /app e cada unidade tem um cliente só (unidade.cliente_id). O próprio cliente sempre se vê; ver outro exige a permissão ver em Configuracoes e, fora do colaborador interno, que ele seja de uma unidade da sessão. Traz unidades, perfil e grupo.
function buscar_pelo_id_cliente(
credencial_de_acesso: CredencialDeAcesso,
id: string,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Cliente>import { CredencialDeAcesso } from "termo_core";
import { buscar_pelo_id_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_pelo_id_cliente(credencial_de_acesso, id);Argumentos
Nome
Tipo
Retorno: Promise<tipos.Cliente> · Rust: Result<tipos::Cliente, ErroAoChamarServico> · veja Cliente.
atualizar_pelo_id_cliente
PATCH/cliente/{id} Exige credencial
Atualiza o cliente
Cliente é o usuário de fora da Termotubos: entra pela área /app e cada unidade tem um cliente só (unidade.cliente_id). Atualização parcial. Sem usuarios.gerenciar, o próprio cliente só altera nome, telefone, cargo e presente (heartbeat que grava ultimo_acesso_em). unidade_ids substitui as unidades do cliente.
function atualizar_pelo_id_cliente(
credencial_de_acesso: CredencialDeAcesso,
id: string,
corpo_da_requisicao: tipos.ClienteAtualizar,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Cliente>import { CredencialDeAcesso } from "termo_core";
import { atualizar_pelo_id_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await atualizar_pelo_id_cliente(credencial_de_acesso, id, corpo_da_requisicao);Argumentos
Nome
Tipo
Retorno: Promise<tipos.Cliente> · Rust: Result<tipos::Cliente, ErroAoChamarServico> · veja Cliente.
deletar_pelo_id_cliente
DELETE/cliente/{id} Exige credencial
Exclui o cliente
Cliente é o usuário de fora da Termotubos: entra pela área /app e cada unidade tem um cliente só (unidade.cliente_id). Exige usuarios.gerenciar; as unidades do cliente ficam sem cliente. Exclusão lógica.
function deletar_pelo_id_cliente(
credencial_de_acesso: CredencialDeAcesso,
id: string,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<void>import { CredencialDeAcesso } from "termo_core";
import { deletar_pelo_id_cliente } from "termo_core/portal";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
await deletar_pelo_id_cliente(credencial_de_acesso, id);Argumentos
Nome
Tipo
Retorno: Promise<void> · Rust: Result<(), ErroAoChamarServico> · sem corpo na resposta.
Tipos
Tipos usados pelas funções desta página. O nome é o mesmo nos dois pacotes.
Cliente
import type { Cliente } from "termo_core/portal";
export interface Cliente {
atualizado_em: string;
cargo?: string | null;
celular?: string | null;
cidade?: string | null;
codigo?: string | null;
cpf_cnpj?: string | null;
criado_em: string;
email?: string | null;
email_tiny?: string | null;
id: string;
id_api?: number | null;
id_tiny?: number | null;
nome: string;
nome_fantasia?: string | null;
sincronizado_em?: string | null;
situacao_tiny?: string | null;
status: string;
telefone?: string | null;
telefone_tiny?: string | null;
tipo_pessoa?: string | null;
uf?: string | null;
ultimo_acesso_em?: string | null;
unidades: Array<UnidadeDoCliente>;
vendedor?: string | null;
}ClienteAtualizar
import type { ClienteAtualizar } from "termo_core/portal";
export interface ClienteAtualizar {
cargo?: string | null;
email?: string | null;
nome?: string | null;
presente?: boolean | null;
status?: string | null;
telefone?: string | null;
unidade_ids?: Array<string> | null;
}ClienteCriar
import type { ClienteCriar } from "termo_core/portal";
export interface ClienteCriar {
cargo?: string | null;
email: string;
nome: string;
status?: string | null;
telefone?: string | null;
unidade_ids?: Array<string> | null;
}ClientePaginador
import type { ClientePaginador } from "termo_core/portal";
export interface ClientePaginador {
contagens: ContagemClientes;
paginas: number;
sincronizado_em?: string | null;
tamanho: number;
total: number;
}ClienteSincronizar
import type { ClienteSincronizar } from "termo_core/portal";
export interface ClienteSincronizar {
cursor?: number | null;
}ContagemClientes
import type { ContagemClientes } from "termo_core/portal";
export interface ContagemClientes {
com_acesso: number;
sem_acesso: number;
solicitacoes: number;
todos: number;
}PaginaClienteAutoComplete
import type { PaginaClienteAutoComplete } from "termo_core/portal";
export interface PaginaClienteAutoComplete {
itens: Array<PaginaClienteAutoCompleteItensItem>;
pagina: number;
tamanho: number;
total: number;
}PaginaClienteAutoCompleteItensItem
import type { PaginaClienteAutoCompleteItensItem } from "termo_core/portal";
export interface PaginaClienteAutoCompleteItensItem {
email?: string | null;
id: string;
nome: string;
}SincronizacaoClientes
import type { SincronizacaoClientes } from "termo_core/portal";
export interface SincronizacaoClientes {
cursor?: number | null;
gravados: number;
proximo_cursor?: number | null;
total: number;
}UnidadeDoCliente
import type { UnidadeDoCliente } from "termo_core/portal";
export interface UnidadeDoCliente {
cnpj: string;
id: string;
razao_social: string;
status?: string | null;
}