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çãoRotaO que faz
buscar_paginador_clienteGET /clienteUma página de clientes, por cursor
criar_clientePOST /clienteCadastra o cliente
buscar_auto_complete_clienteGET /cliente/autocompleteLista básica de clientes para seleção
buscar_pelo_filtro_clienteGET /cliente/filtroBusca clientes por filtro
buscar_informacoes_paginador_clienteGET /cliente/paginadorTotal, páginas e contagens dos clientes
sincronizar_clientePOST /cliente/sincronizarSincroniza um lote de clientes do Tiny
buscar_pelo_id_clienteGET /cliente/{id}Busca o cliente pelo id
atualizar_pelo_id_clientePATCH /cliente/{id}Atualiza o cliente
deletar_pelo_id_clienteDELETE /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>>
Exemplo
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>
Exemplo
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>
Exemplo
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>>
Exemplo
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>
Exemplo
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>
Exemplo
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>
Exemplo
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>
Exemplo
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>
Exemplo
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;
}

Nesta página