Cliente
10 funções do TermoSell para cliente.
// npm install termo_core --save-exact
import * as sell from "termo_core/sell";
// ou: import { sell } from "termo_core";| Função | Rota | O que faz |
|---|---|---|
buscar_paginador_cliente | GET /cliente | Lista os clientes com paginação |
criar_cliente | POST /cliente | Cadastra um 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_sincronizacao_cliente | GET /cliente/sincronizar | Status da sincronização dos clientes com o TermoIntranetAPI |
sincronizar_com_intranet_cliente | POST /cliente/sincronizar | Inicia a sincronização dos clientes com o TermoIntranetAPI em segundo plano |
cancelar_sincronizacao_cliente | DELETE /cliente/sincronizar | Cancela a sincronização dos clientes em andamento |
buscar_pelo_id_cliente | GET /cliente/{id} | Busca um cliente pelo id |
atualizar_pelo_id_cliente | PATCH /cliente/{id} | Atualiza um cliente pelo id |
deletar_pelo_id_cliente | DELETE /cliente/{id} | Exclui um cliente pelo id |
buscar_paginador_cliente
GET/cliente Exige credencial
Lista os clientes com paginação
Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Ordena pela razão social. pagina começa em 1 (padrão 1; valores menores viram 1). A página tem sempre 50 itens: tamanho é aceito, mas ignorado. total conta todos os registros não excluídos.
function buscar_paginador_cliente(
credencial_de_acesso: CredencialDeAcesso,
parametros: ParametrosDeBuscarPaginadorCliente = {},
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.PaginaCliente>import { CredencialDeAcesso } from "termo_core";
import { buscar_paginador_cliente } from "termo_core/sell";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_paginador_cliente(credencial_de_acesso, { pagina: 1 });Argumentos
Nome
Tipo
Retorno: Promise<tipos.PaginaCliente> · Rust: Result<tipos::PaginaCliente, ErroAoChamarServico> · veja PaginaCliente.
criar_cliente
POST/cliente Exige credencial
Cadastra um cliente
Exige a permissão criar da área clientes. Cria o cliente e, na mesma transação, o acesso dele com perfil cliente e o email informado. Obrigatórios: razao_social (até 150 caracteres), cnpj (exatamente 14 dígitos, só números; pode se repetir, porque a intranet repete CNPJ) e email (até 160 caracteres, gravado em minúsculas). Opcionais: nome_fantasia (até 150), telefone (até 20; é por ele que o robô reconhece o cliente no WhatsApp), cidade (até 120) e estado (2 letras, gravado em maiúsculas). Texto vazio nos opcionais vira null. O cliente nasce ativo e com atendente_ativo desligado.
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/sell";
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
Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Devolve só id, razão social e CNPJ, em ordem alfabética da razão social. busca procura o trecho na razão social (sem diferenciar maiúsculas) ou no CNPJ. pagina começa em 1 (padrão 1) e tamanho tem padrão 10, sem máximo; valores menores que 1 viram 1. total conta os registros que casam com a busca.
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/sell";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_auto_complete_cliente(credencial_de_acesso, { busca: "..." });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
Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Devolve todos os clientes que casam com o filtro, sem paginação, em ordem alfabética da razão social. razao_social procura o trecho na razão social ou no nome fantasia; email e cidade procuram por trecho; todos sem diferenciar maiúsculas. cnpj procura o trecho no CNPJ (só dígitos); telefone compara só os dígitos, por trecho; estado compara a sigla exata; ativo e atendente_ativo filtram pela situação. Sem filtro, devolve todos.
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/sell";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_pelo_filtro_cliente(credencial_de_acesso, { razao_social: "..." });Argumentos
Nome
Tipo
Retorno: Promise<Array<tipos.Cliente>> · Rust: Result<Vec<tipos::Cliente>, ErroAoChamarServico>
buscar_sincronizacao_cliente
GET/cliente/sincronizar Exige credencial
Status da sincronização dos clientes com o TermoIntranetAPI
Só para o master do TermoAuth. Devolve a sincronização em andamento ou a última que terminou: rodando, paginas gravadas, cancelada, erro (sem permissão no TermoIntranetAPI, indisponibilidade ou falha no banco) e os totais em resultado. O status fica em memória e se perde se o servidor reiniciar; o que já foi gravado fica.
function buscar_sincronizacao_cliente(
credencial_de_acesso: CredencialDeAcesso,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.StatusDaSincronizacao>import { CredencialDeAcesso } from "termo_core";
import { buscar_sincronizacao_cliente } from "termo_core/sell";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_sincronizacao_cliente(credencial_de_acesso);Argumentos
Nome
Tipo
Retorno: Promise<tipos.StatusDaSincronizacao> · Rust: Result<tipos::StatusDaSincronizacao, ErroAoChamarServico> · veja StatusDaSincronizacao.
sincronizar_com_intranet_cliente
POST/cliente/sincronizar Exige credencial
Inicia a sincronização dos clientes com o TermoIntranetAPI em segundo plano
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, atendente_ativo, chatwoot_contato_id) 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.
function sincronizar_com_intranet_cliente(
credencial_de_acesso: CredencialDeAcesso,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.StatusDaSincronizacao>import { CredencialDeAcesso } from "termo_core";
import { sincronizar_com_intranet_cliente } from "termo_core/sell";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await sincronizar_com_intranet_cliente(credencial_de_acesso);Argumentos
Nome
Tipo
Retorno: Promise<tipos.StatusDaSincronizacao> · Rust: Result<tipos::StatusDaSincronizacao, ErroAoChamarServico> · veja StatusDaSincronizacao.
cancelar_sincronizacao_cliente
DELETE/cliente/sincronizar Exige credencial
Cancela a sincronização dos clientes em andamento
Só para o master do TermoAuth. Para antes da próxima página; o que já foi gravado fica.
function cancelar_sincronizacao_cliente(
credencial_de_acesso: CredencialDeAcesso,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<void>import { CredencialDeAcesso } from "termo_core";
import { cancelar_sincronizacao_cliente } from "termo_core/sell";
const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
await cancelar_sincronizacao_cliente(credencial_de_acesso);Argumentos
Nome
Tipo
Retorno: Promise<void> · Rust: Result<(), ErroAoChamarServico> · sem corpo na resposta.
buscar_pelo_id_cliente
GET/cliente/{id} Exige credencial
Busca um cliente pelo id
Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Devolve o cliente com o e-mail do acesso e o ultimo_pedido dele na intranet (null quando não foi possível consultar). Cliente excluído responde 404.
function buscar_pelo_id_cliente(
credencial_de_acesso: CredencialDeAcesso,
id: string,
opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.ClienteDetalhe>import { CredencialDeAcesso } from "termo_core";
import { buscar_pelo_id_cliente } from "termo_core/sell";
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.ClienteDetalhe> · Rust: Result<tipos::ClienteDetalhe, ErroAoChamarServico> · veja ClienteDetalhe.
atualizar_pelo_id_cliente
PATCH/cliente/{id} Exige credencial
Atualiza um cliente pelo id
Exige a permissão editar da área clientes. Atualização parcial: só os campos enviados mudam. razao_social não pode ficar vazia (até 150 caracteres); nome_fantasia (até 150), telefone (até 20), cidade (até 120) e estado (2 letras) aceitam texto vazio para apagar o valor. ativo liga ou desliga o cliente e atendente_ativo liga ou desliga o atendimento pelo robô no WhatsApp: o robô só responde cliente ativo com atendente_ativo ligado; os demais vão direto para a equipe. CNPJ e e-mail não mudam por aqui.
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/sell";
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 um cliente pelo id
Exige a permissão deletar da área clientes. A exclusão é lógica e leva junto o acesso do cliente, na mesma transação: os dois somem das consultas, o CNPJ e o e-mail ficam livres para um novo cadastro e não há como restaurar.
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/sell";
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/sell";
export interface Cliente {
atendente_ativo: boolean;
ativo: boolean;
atualizado_em: string;
chatwoot_contato_id?: number | null;
cidade?: string | null;
cnpj: string;
criado_em: string;
email?: string | null;
estado?: string | null;
id: string;
intranet_cliente_id?: number | null;
nome_fantasia?: string | null;
razao_social: string;
telefone?: string | null;
}ClienteAtualizar
import type { ClienteAtualizar } from "termo_core/sell";
export interface ClienteAtualizar {
atendente_ativo?: boolean | null;
ativo?: boolean | null;
cidade?: string | null;
estado?: string | null;
nome_fantasia?: string | null;
razao_social?: string | null;
telefone?: string | null;
}ClienteCriar
import type { ClienteCriar } from "termo_core/sell";
export interface ClienteCriar {
cidade?: string | null;
cnpj: string;
email: string;
estado?: string | null;
nome_fantasia?: string | null;
razao_social: string;
telefone?: string | null;
}ClienteDetalhe
import type { ClienteDetalhe } from "termo_core/sell";
export type ClienteDetalhe = Cliente & ClienteDetalheParte2;ClienteDetalheParte2
import type { ClienteDetalheParte2 } from "termo_core/sell";
export interface ClienteDetalheParte2 {
ultimo_pedido?: Pedido | null;
}ItemPedido
import type { ItemPedido } from "termo_core/sell";
export interface ItemPedido {
descricao: string;
quantidade: number;
unidade: string;
valor_unitario: number;
}PaginaCliente
import type { PaginaCliente } from "termo_core/sell";
export interface PaginaCliente {
itens: Array<PaginaClienteItensItem>;
pagina: number;
tamanho: number;
total: number;
}PaginaClienteAutoComplete
import type { PaginaClienteAutoComplete } from "termo_core/sell";
export interface PaginaClienteAutoComplete {
itens: Array<PaginaClienteAutoCompleteItensItem>;
pagina: number;
tamanho: number;
total: number;
}PaginaClienteAutoCompleteItensItem
import type { PaginaClienteAutoCompleteItensItem } from "termo_core/sell";
export interface PaginaClienteAutoCompleteItensItem {
cnpj: string;
id: string;
razao_social: string;
}PaginaClienteItensItem
import type { PaginaClienteItensItem } from "termo_core/sell";
export interface PaginaClienteItensItem {
atendente_ativo: boolean;
ativo: boolean;
atualizado_em: string;
chatwoot_contato_id?: number | null;
cidade?: string | null;
cnpj: string;
criado_em: string;
email?: string | null;
estado?: string | null;
id: string;
intranet_cliente_id?: number | null;
nome_fantasia?: string | null;
razao_social: string;
telefone?: string | null;
}Pedido
import type { Pedido } from "termo_core/sell";
export interface Pedido {
cliente_id: string;
emitido_em: string;
itens: Array<ItemPedido>;
numero: string;
valor_total: number;
}ResultadoDaSincronizacao
import type { ResultadoDaSincronizacao } from "termo_core/sell";
export interface ResultadoDaSincronizacao {
atualizados: number;
criados: number;
ignorados: number;
recebidos: number;
}StatusDaSincronizacao
import type { StatusDaSincronizacao } from "termo_core/sell";
export interface StatusDaSincronizacao {
cancelada: boolean;
erro?: string | null;
iniciada_em?: string | null;
paginas: number;
resultado: ResultadoDaSincronizacao;
rodando: boolean;
terminada_em?: string | null;
}