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çãoRotaO que faz
buscar_paginador_clienteGET /clienteLista os clientes com paginação
criar_clientePOST /clienteCadastra um cliente
buscar_auto_complete_clienteGET /cliente/autocompleteLista básica de clientes para seleção
buscar_pelo_filtro_clienteGET /cliente/filtroBusca clientes por filtro
buscar_sincronizacao_clienteGET /cliente/sincronizarStatus da sincronização dos clientes com o TermoIntranetAPI
sincronizar_com_intranet_clientePOST /cliente/sincronizarInicia a sincronização dos clientes com o TermoIntranetAPI em segundo plano
cancelar_sincronizacao_clienteDELETE /cliente/sincronizarCancela a sincronização dos clientes em andamento
buscar_pelo_id_clienteGET /cliente/{id}Busca um cliente pelo id
atualizar_pelo_id_clientePATCH /cliente/{id}Atualiza um cliente pelo id
deletar_pelo_id_clienteDELETE /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>
Exemplo
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>
Exemplo
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>
Exemplo
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>>
Exemplo
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>
Exemplo
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>
Exemplo
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>
Exemplo
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>
Exemplo
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>
Exemplo
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>
Exemplo
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;
}

Nesta página