Ticket

8 funções do TermoSupport para ticket.

// npm install termo_core --save-exact
import * as support from "termo_core/support";
// ou: import { support } from "termo_core";
FunçãoRotaO que faz
criar_pelo_aplicativo_ticketPOST /publico/ticketAbre um ticket pelo aplicativo atendido
buscar_paginador_ticketGET /ticketFila de tickets paginada
criar_ticketPOST /ticketAbre um ticket de suporte
buscar_auto_complete_ticketGET /ticket/autocompleteLista básica de tickets para seleção
buscar_pelo_filtro_ticketGET /ticket/filtroBusca tickets por filtro
buscar_pelo_id_ticketGET /ticket/{id}Busca um ticket pelo id
atualizar_pelo_id_ticketPATCH /ticket/{id}Atualiza um ticket pelo id
deletar_pelo_id_ticketDELETE /ticket/{id}Exclui um ticket pelo id

criar_pelo_aplicativo_ticket

POST/publico/ticket Pública

Abre um ticket pelo aplicativo atendido

Rota pública, sem o token do TermoAuth: o backend do aplicativo se identifica pela chave pública dele (pk_live_..., a mesma do cadastro do aplicativo) no cabeçalho X-Chave-Publica. Só aplicativo ativo abre ticket. titulo (até 200), descricao (até 20000) e solicitante_nome (até 120) são obrigatórios; solicitante_email, origem_url (a tela onde o problema aconteceu), tipo e prioridade seguem as regras do POST /ticket. O ticket entra na fila com o canal APLICATIVO, o status NOVO e o prazo do SLA. Chamada de servidor para servidor: o navegador recebe erro de CORS.

function criar_pelo_aplicativo_ticket(
  parametros: ParametrosDeCriarPeloAplicativoTicket,
  corpo_da_requisicao: tipos.TicketDoAplicativo,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.TicketAberto>
Exemplo
import { criar_pelo_aplicativo_ticket } from "termo_core/support";

const resposta = await criar_pelo_aplicativo_ticket({ "X-Chave-Publica": "..." }, corpo_da_requisicao);

Argumentos

Nome

Tipo

Retorno: Promise<tipos.TicketAberto> · Rust: Result<tipos::TicketAberto, ErroAoChamarServico> · veja TicketAberto.

buscar_paginador_ticket

GET/ticket Exige credencial

Fila de tickets paginada

Exige a permissão de leitura na área tickets (qualquer das ações ler, criar, editar ou deletar libera a leitura). A fila de atendimento: abertos primeiro, do mais urgente e com prazo mais próximo para o menos urgente; depois os resolvidos e fechados. Sempre 50 por página: tamanho é ignorado. Aceita os mesmos filtros do GET /ticket/filtro.

function buscar_paginador_ticket(
  credencial_de_acesso: CredencialDeAcesso,
  parametros: ParametrosDeBuscarPaginadorTicket = {},
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.PaginaTicket>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_paginador_ticket } from "termo_core/support";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_paginador_ticket(credencial_de_acesso, { pagina: 1 });

Argumentos

Nome

Tipo

Retorno: Promise<tipos.PaginaTicket> · Rust: Result<tipos::PaginaTicket, ErroAoChamarServico> · veja PaginaTicket.

criar_ticket

POST/ticket Exige credencial

Abre um ticket de suporte

Exige a permissão criar na área tickets. Abre o ticket para um aplicativo. titulo (até 200) e descricao (até 20000) são obrigatórios. tipo é BUG, DUVIDA (padrão), MELHORIA, ACESSO ou OUTRO; prioridade é BAIXA, MEDIA (padrão), ALTA ou URGENTE; canal é PAINEL (padrão), APLICATIVO, EMAIL, WHATSAPP ou TELEFONE. O solicitante é o colaborador de solicitante_id, ou alguém de fora por solicitante_nome e solicitante_email; sem nenhum, é quem abriu. Sem prazo, vale o SLA da prioridade (urgente 4 h, alta 24 h, média 72 h, baixa 7 dias). Com responsavel_id o ticket já nasce em atendimento e o responsável é notificado.

function criar_ticket(
  credencial_de_acesso: CredencialDeAcesso,
  corpo_da_requisicao: tipos.TicketCriar,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Ticket>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { criar_ticket } from "termo_core/support";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await criar_ticket(credencial_de_acesso, corpo_da_requisicao);

Argumentos

Nome

Tipo

Retorno: Promise<tipos.Ticket> · Rust: Result<tipos::Ticket, ErroAoChamarServico> · veja Ticket.

buscar_auto_complete_ticket

GET/ticket/autocomplete Exige credencial

Lista básica de tickets para seleção

Exige a permissão de leitura na área tickets (qualquer das ações ler, criar, editar ou deletar libera a leitura). Devolve id, número e título, do número maior para o menor. busca procura no título ou pelo número; aplicativo_id limita a um aplicativo.

function buscar_auto_complete_ticket(
  credencial_de_acesso: CredencialDeAcesso,
  parametros: ParametrosDeBuscarAutoCompleteTicket = {},
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.PaginaTicketAutoComplete>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_auto_complete_ticket } from "termo_core/support";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_auto_complete_ticket(credencial_de_acesso, { busca: "..." });

Argumentos

Nome

Tipo

Retorno: Promise<tipos.PaginaTicketAutoComplete> · Rust: Result<tipos::PaginaTicketAutoComplete, ErroAoChamarServico> · veja PaginaTicketAutoComplete.

buscar_pelo_filtro_ticket

GET/ticket/filtro Exige credencial

Busca tickets por filtro

Exige a permissão de leitura na área tickets (qualquer das ações ler, criar, editar ou deletar libera a leitura). Devolve até 2000 tickets do mais novo para o mais antigo. Os filtros se somam: aplicativo_id, status, abertos (sem os resolvidos e fechados; false só eles), responsavel_id, sem_responsavel, solicitante_id, prioridade, tipo, atrasados e busca (título, descrição, solicitante ou número, com ou sem #).

function buscar_pelo_filtro_ticket(
  credencial_de_acesso: CredencialDeAcesso,
  parametros: ParametrosDeBuscarPeloFiltroTicket = {},
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<Array<tipos.Ticket>>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_pelo_filtro_ticket } from "termo_core/support";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_pelo_filtro_ticket(credencial_de_acesso, { aplicativo_id: "..." });

Argumentos

Nome

Tipo

Retorno: Promise<Array<tipos.Ticket>> · Rust: Result<Vec<tipos::Ticket>, ErroAoChamarServico>

buscar_pelo_id_ticket

GET/ticket/{id} Exige credencial

Busca um ticket pelo id

Exige a permissão de leitura na área tickets (qualquer das ações ler, criar, editar ou deletar libera a leitura). Devolve o ticket com aplicativo, solicitante, responsável, prazo (e se está atrasado), as tarefas de projeto criadas a partir dele e as contagens de comentários e anexos.

function buscar_pelo_id_ticket(
  credencial_de_acesso: CredencialDeAcesso,
  id: string,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Ticket>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_pelo_id_ticket } from "termo_core/support";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_pelo_id_ticket(credencial_de_acesso, id);

Argumentos

Nome

Tipo

Retorno: Promise<tipos.Ticket> · Rust: Result<tipos::Ticket, ErroAoChamarServico> · veja Ticket.

atualizar_pelo_id_ticket

PATCH/ticket/{id} Exige credencial

Atualiza um ticket pelo id

Exige a permissão editar na área tickets. Atualização parcial com as regras da abertura, mais status (NOVO, EM_ATENDIMENTO, AGUARDANDO, RESOLVIDO, FECHADO). Resolver ou fechar grava a data; reabrir apaga. Sair de NOVO conta como primeira resposta. Trocar a prioridade sem mandar prazo refaz o prazo pelo SLA a partir da abertura. null em responsavel_id, prazo ou solicitante_email apaga o valor. Cada mudança entra na atividade; o novo responsável e o solicitante (na troca de status) são notificados.

function atualizar_pelo_id_ticket(
  credencial_de_acesso: CredencialDeAcesso,
  id: string,
  corpo_da_requisicao: tipos.TicketAtualizar,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Ticket>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { atualizar_pelo_id_ticket } from "termo_core/support";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await atualizar_pelo_id_ticket(credencial_de_acesso, id, corpo_da_requisicao);

Argumentos

Nome

Tipo

Retorno: Promise<tipos.Ticket> · Rust: Result<tipos::Ticket, ErroAoChamarServico> · veja Ticket.

deletar_pelo_id_ticket

DELETE/ticket/{id} Exige credencial

Exclui um ticket pelo id

Exige a permissão deletar na área tickets. Exclusão lógica. As tarefas criadas a partir do ticket continuam nos projetos.

function deletar_pelo_id_ticket(
  credencial_de_acesso: CredencialDeAcesso,
  id: string,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<void>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { deletar_pelo_id_ticket } from "termo_core/support";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
await deletar_pelo_id_ticket(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.

AplicativoResumo

O aplicativo como aparece dentro dos projetos e tickets.

import type { AplicativoResumo } from "termo_core/support";

export interface AplicativoResumo {
  cor: string;
  id: string;
  nome: string;
}

ColaboradorResumo

Quem aparece como dono, membro, responsável, solicitante ou autor nos projetos, tarefas e tickets.

import type { ColaboradorResumo } from "termo_core/support";

export interface ColaboradorResumo {
  id: string;
  nome: string;
}

EtiquetaResumo

A etiqueta como aparece dentro da tarefa.

import type { EtiquetaResumo } from "termo_core/support";

export interface EtiquetaResumo {
  cor: string;
  id: string;
  nome: string;
}

PaginaTicket

import type { PaginaTicket } from "termo_core/support";

export interface PaginaTicket {
  itens: Array<PaginaTicketItensItem>;
  pagina: number;
  tamanho: number;
  total: number;
}

PaginaTicketAutoComplete

import type { PaginaTicketAutoComplete } from "termo_core/support";

export interface PaginaTicketAutoComplete {
  itens: Array<PaginaTicketAutoCompleteItensItem>;
  pagina: number;
  tamanho: number;
  total: number;
}

PaginaTicketAutoCompleteItensItem

import type { PaginaTicketAutoCompleteItensItem } from "termo_core/support";

export interface PaginaTicketAutoCompleteItensItem {
  id: string;
  numero: number;
  titulo: string;
}

PaginaTicketItensItem

import type { PaginaTicketItensItem } from "termo_core/support";

export interface PaginaTicketItensItem {
  anexos_total: number;
  aplicativo: AplicativoResumo;
  /**
   * `true` quando o prazo passou antes de o ticket ser resolvido.
   */
  atrasado: boolean;
  atualizado_em: string;
  canal: string;
  comentarios_total: number;
  criado_em: string;
  descricao: string;
  fechado_em?: string | null;
  id: string;
  /**
   * Número sequencial mostrado como #1024.
   */
  numero: number;
  origem_url?: string | null;
  /**
   * Prazo de atendimento (SLA).
   */
  prazo?: string | null;
  primeira_resposta_em?: string | null;
  prioridade: string;
  resolvido_em?: string | null;
  responsavel?: ColaboradorResumo | null;
  solicitante?: ColaboradorResumo | null;
  solicitante_email?: string | null;
  solicitante_nome: string;
  status: string;
  tarefas: Array<TicketTarefa>;
  tipo: string;
  titulo: string;
}

Tarefa

import type { Tarefa } from "termo_core/support";

export interface Tarefa {
  anexos_total: number;
  atualizado_em: string;
  comentarios_total: number;
  concluida: boolean;
  concluida_em?: string | null;
  criado_em: string;
  criador?: ColaboradorResumo | null;
  descricao?: string | null;
  /**
   * Esforço em pontos (o número do cartão).
   */
  estimativa?: number | null;
  etiquetas: Array<EtiquetaResumo>;
  id: string;
  inicio?: string | null;
  marco: boolean;
  ordem: number;
  prazo?: string | null;
  prioridade?: string | null;
  projeto_cor: string;
  projeto_id: string;
  projeto_nome: string;
  responsavel?: ColaboradorResumo | null;
  /**
   * Coluna do quadro. Subtarefa não tem coluna.
   */
  secao_id?: string | null;
  secao_nome?: string | null;
  subtarefas_concluidas: number;
  subtarefas_total: number;
  tarefa_pai_id?: string | null;
  tarefa_pai_titulo?: string | null;
  /**
   * Ticket de suporte que deu origem à tarefa.
   */
  ticket_id?: string | null;
  ticket_numero?: number | null;
  titulo: string;
}

Ticket

import type { Ticket } from "termo_core/support";

export interface Ticket {
  anexos_total: number;
  aplicativo: AplicativoResumo;
  /**
   * `true` quando o prazo passou antes de o ticket ser resolvido.
   */
  atrasado: boolean;
  atualizado_em: string;
  canal: string;
  comentarios_total: number;
  criado_em: string;
  descricao: string;
  fechado_em?: string | null;
  id: string;
  /**
   * Número sequencial mostrado como #1024.
   */
  numero: number;
  origem_url?: string | null;
  /**
   * Prazo de atendimento (SLA).
   */
  prazo?: string | null;
  primeira_resposta_em?: string | null;
  prioridade: string;
  resolvido_em?: string | null;
  responsavel?: ColaboradorResumo | null;
  solicitante?: ColaboradorResumo | null;
  solicitante_email?: string | null;
  solicitante_nome: string;
  status: string;
  tarefas: Array<TicketTarefa>;
  tipo: string;
  titulo: string;
}

TicketAberto

import type { TicketAberto } from "termo_core/support";

export interface TicketAberto {
  id: string;
  numero: number;
}

TicketAtualizar

import type { TicketAtualizar } from "termo_core/support";

export interface TicketAtualizar {
  aplicativo_id?: string | null;
  canal?: string | null;
  descricao?: string | null;
  prazo?: string | null;
  prioridade?: string | null;
  responsavel_id?: string | null;
  solicitante_email?: string | null;
  solicitante_nome?: string | null;
  status?: string | null;
  tipo?: string | null;
  titulo?: string | null;
}

TicketCriar

import type { TicketCriar } from "termo_core/support";

export interface TicketCriar {
  aplicativo_id: string;
  canal?: string | null;
  descricao: string;
  origem_url?: string | null;
  /**
   * Sem prazo, vale o SLA da prioridade.
   */
  prazo?: string | null;
  prioridade?: string | null;
  responsavel_id?: string | null;
  solicitante_email?: string | null;
  /**
   * Sem solicitante nem nome, quem abriu o ticket no painel é o solicitante.
   */
  solicitante_id?: string | null;
  solicitante_nome?: string | null;
  tipo?: string | null;
  titulo: string;
}

TicketDoAplicativo

O que o aplicativo manda para abrir um ticket pela chave pública.

import type { TicketDoAplicativo } from "termo_core/support";

export interface TicketDoAplicativo {
  descricao: string;
  origem_url?: string | null;
  prioridade?: string | null;
  solicitante_email?: string | null;
  solicitante_nome: string;
  tipo?: string | null;
  titulo: string;
}

TicketTarefa

Tarefa de projeto criada a partir do ticket.

import type { TicketTarefa } from "termo_core/support";

export interface TicketTarefa {
  concluida: boolean;
  id: string;
  projeto_id: string;
  projeto_nome: string;
  titulo: string;
}

Nesta página