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ção | Rota | O que faz |
|---|---|---|
criar_pelo_aplicativo_ticket | POST /publico/ticket | Abre um ticket pelo aplicativo atendido |
buscar_paginador_ticket | GET /ticket | Fila de tickets paginada |
criar_ticket | POST /ticket | Abre um ticket de suporte |
buscar_auto_complete_ticket | GET /ticket/autocomplete | Lista básica de tickets para seleção |
buscar_pelo_filtro_ticket | GET /ticket/filtro | Busca tickets por filtro |
buscar_pelo_id_ticket | GET /ticket/{id} | Busca um ticket pelo id |
atualizar_pelo_id_ticket | PATCH /ticket/{id} | Atualiza um ticket pelo id |
deletar_pelo_id_ticket | DELETE /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>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>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>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>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>>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>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>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>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;
}