Data mapping QSM¶
Esta página tem como objetivo apresentar as principais tabelas utilizadas no sistema QSM, oferecendo um ponto de partida para desenvolvedores que estão tendo seu primeiro contato com nosso banco de dados.
Considerações importantes¶
- Usamos o banco MySQL, mas costumamos liberar o acesso aos dados (apenas leitura) através do BigQuery.
-
Os databases criados na plataforma (pela tela /databases, por exemplo) são visualizações do MySQL, segue um exemplo:
-
Tabelas que possuem o prefixo
tables_
são databases materializados. -
Databases não materializados não são escaláveis, evite usar em aplicações que possuem muitos registros.
No futuro, todos os databases serão materializados
-
As colunas slug presentes em diversas tabelas não devem receber strings com caracteres especiais
A coluna slug é uma identificação única e legível usada naquela tabela.
- Código para transformar qualquer texto em um slug.
// Usamos a função abaixo quando queremos criar um slug
function slugify(
str,
separator = '-',
{ transformToLowerCase = true } = {}
) {
if (!str) {
return str
}
str = str.replace(/^\s+|\s+$/g, '') // trim
if (transformToLowerCase) {
str = str.toLowerCase()
}
// remove accents, swap ñ for n, etc
const from = 'ãàáäâèéëêìíïîòóöôùúüûñç·/_,:;'
const to = 'aaaaaeeeeiiiioooouuuunc------'
for (let i = 0, l = from.length; i < l; i++) {
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i))
}
str = str
.replace(/[^a-zA-Z0-9 -]/g, '') // remove invalid chars
.replace(/\s+/g, separator) // collapse whitespace and replace by -
.replace(/-+/g, separator) // collapse dashes
return str
}
- A coluna name, presente em diversas tabelas, é em sua maioria, no formato slug.
-
Todas as nossas tabelas possuem created_at, updated_at e deleted_at e estão no formato datetime com fuso zero, portanto lembre-se de converter a sua data para o fuso zero.
Por padrão, essas datas são preenchidas automaticamente quando as operações no banco são feitas através das nossas APIs.
-
Usamos o padrão snake_case para nossas tabelas e camelCase para os códigos presentes em nossas APIs ou rotinas internas (N8N e customizações especiais no front-end).
- Coluna sync presente em algumas tabelas indica que aquela linha foi criada/atualizada de maneira automática por alguma rotina de automação.
- Informação adicional do tipo, da categoria, do perfil ou de qualquer outra entidade é sempre um database, portanto sempre terá o prefixo
tables_data
, em caso de databases não materializados, outables_
, em caso de databases materializados.
ER¶
- Arquivo com principais tabelas do ER usado no qsm
Table "users" { "id" int [pk, not null, increment] "uuid" varchar(255) [default: NULL] "name" varchar(255) [not null] "gender" varchar(255) [default: NULL] "user" varchar(255) [not null] "pass" varchar(255) [default: NULL] "password_strength" varchar(255) [default: NULL] "cpf" varchar(255) [default: NULL] "email" varchar(255) [default: NULL] "telefones" varchar(255) [default: NULL] "matricula" varchar(255) [default: NULL] "ppessoa_codigo" int [default: NULL] "token" varchar(964) [default: NULL] "token_password_reset" varchar(255) [default: NULL] "token_password_reset_expiration_time" datetime [default: NULL] "token_password_reset_times" int [default: NULL] "registered" tinyint(1) [not null, default: '0'] "last_login_time" datetime [default: NULL] "user_created" users_user_created_enum [not null, default: 'false'] "created_time" timestamp [default: `CURRENT_TIMESTAMP`] "updated_time" timestamp [default: NULL] "user_profile_id" int [default: NULL] "sync" tinyint(1) [default: '0'] "form_response_id" int [default: NULL] "bio" varchar(500) [default: NULL] "birthday" varchar(10) [default: NULL] "instagram_url" varchar(255) [default: NULL] "facebook_url" varchar(255) [default: NULL] "twitter_url" varchar(255) [default: NULL] "linkedin_url" varchar(255) [default: NULL] "expires_at" datetime [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "media_id" int [default: NULL] Indexes { user_profile_id [name: "user_profile_id"] media_id [name: "media_id"] cpf [name: "users_cpf"] } } Table "users_profiles" { "id" int [pk, not null, increment] "name" varchar(255) [default: NULL] "name_plural" varchar(255) [default: NULL] "slug" varchar(255) [not null] "color" varchar(255) [default: NULL] "home_page_default" varchar(255) [default: NULL] "can_self_create_account" tinyint(1) [default: NULL] "form_id" int [default: NULL] "require_password_strength" int [not null, default: '2'] "webhook_url" varchar(255) [default: NULL] "webhook_type" users_profiles_webhook_type_enum [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "config_login_method_id" int [default: NULL] "mfa_type" users_profiles_mfa_type_enum [default: NULL] "query_params" varchar(255) [default: NULL] Indexes { slug [unique, name: "slug"] config_login_method_id [name: "config_login_method_id"] } } Table "groups" { "id" int [pk, not null, increment] "parent_id" int [default: NULL] "product_id" int [default: NULL] "cod" varchar(255) [not null] "parent_cod" varchar(255) [default: NULL] "name" varchar(255) [not null] "display_name" varchar(255) [default: NULL] "status" varchar(255) [default: 'active'] "type" varchar(255) [not null] "telefone" varchar(255) [default: NULL] "year" varchar(255) [default: NULL] "grades_template_id" int [default: NULL] "sync" tinyint(1) [default: '0'] "form_response_id" int [default: NULL] "acquisition_flow" json [default: NULL] "ingress_start_date" datetime [default: NULL] "ingress_end_date" datetime [default: NULL] "limit_members" int [default: NULL] "can_be_seen_by" json [default: NULL] "can_be_accessed_by" json [default: NULL] "preregistration" tinyint(1) [default: '0'] "waiting_list" tinyint(1) [default: '0'] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "created_by" int [default: NULL] Indexes { (cod, type) [unique, name: "groups_cod_type"] parent_id [name: "parent_id"] product_id [name: "product_id"] type [name: "type"] grades_template_id [name: "grades_template_id"] form_response_id [name: "form_response_id"] created_by [name: "groups_created_by_foreign_idx"] } } Table "permissions" { "id" int [pk, not null, increment] "name" varchar(255) [default: NULL] "description" varchar(255) [default: NULL] "type" varchar(255) [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] } Table "tickets" { "id" int [pk, not null, increment] "name" varchar(255) [default: NULL] "email" varchar(255) [default: NULL] "recipient" int [default: NULL] "description" varchar(255) [default: NULL] "ticket_type_id" int [default: NULL] "assigned_to" int [default: NULL] "status" varchar(255) [default: NULL] "form_response_id" int [default: NULL] "created_by" int [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "priority" tickets_priority_enum [default: NULL] "assigned_to_user" int [default: NULL] "parent_ticket_id" int [default: NULL] "category_id" int [default: NULL] "body" longtext [not null] "ticket_type_form_response_id" int [default: NULL] "shared_group_id" int [default: NULL] "is_appointment" tinyint(1) [not null, default: '0'] "schedule_date" datetime [default: NULL] "duration" time [default: NULL] "scheduled_at" datetime [default: NULL] "service_catalog_item_id" int [default: NULL] "calendar_id" int [default: NULL] "approval_group_id" int [default: NULL] Indexes { recipient [name: "recipient"] ticket_type_id [name: "ticket_type_id"] assigned_to [name: "assigned_to"] form_response_id [name: "form_response_id"] created_by [name: "created_by"] assigned_to_user [name: "tickets_assigned_to_user_foreign_idx"] parent_ticket_id [name: "tickets_parent_ticket_id_foreign_idx"] category_id [name: "tickets_category_id_foreign_idx"] ticket_type_form_response_id [name: "tickets_ticket_type_form_response_id_foreign_idx"] shared_group_id [name: "tickets_shared_group_id_foreign_idx"] approval_group_id [name: "tickets_approval_group_id_foreign_idx"] } } Table "chat_rooms" { "id" varchar(255) [pk, not null] "chat_status_id" int [default: NULL] "type" chat_rooms_type_enum [default: NULL] "requester_id" int [default: NULL] "created_by" int [default: NULL] "empty" tinyint(1) [default: '1'] "product_id" int [default: NULL] "members_count" int [default: NULL] "icon" varchar(255) [default: NULL] "name" varchar(255) [default: NULL] "webhook_url" varchar(255) [default: NULL] "json_data" json [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "assigned_to" int [default: NULL] "ticket_id" int [default: NULL] "first_reply_at" datetime [default: NULL] "last_reply_at" datetime [default: NULL] "last_reply_author" int [default: NULL] "last_reply_message" longtext Indexes { chat_status_id [name: "chat_status_id"] requester_id [name: "requester_id"] created_by [name: "created_by"] assigned_to [name: "chat_rooms_assigned_to_foreign_idx"] ticket_id [name: "chat_rooms_ticket_id_foreign_idx"] last_reply_author [name: "chat_rooms_last_reply_author_foreign_idx"] } } Table "ticket_user_actions" { "id" int [pk, not null, increment] "details" longtext "data" json [default: NULL] "ticket_id" int [default: NULL] "created_by" int [default: NULL] "is_automatic_message" tinyint(1) [default: NULL] "type" ticket_user_actions_type_enum [default: NULL] "description" varchar(255) [default: NULL] "ticket_type_id" int [default: NULL] "assigned_to_user" int [default: NULL] "status" varchar(255) [default: NULL] "priority" ticket_user_actions_priority_enum [default: NULL] "media_id" int [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "category_id" int [default: NULL] "assigned_to" int [default: NULL] "recipient" int [default: NULL] Indexes { ticket_id [name: "ticket_id"] created_by [name: "created_by"] ticket_type_id [name: "ticket_type_id"] assigned_to_user [name: "assigned_to_user"] media_id [name: "media_id"] category_id [name: "ticket_user_actions_category_id_foreign_idx"] assigned_to [name: "ticket_user_actions_assigned_to_foreign_idx"] recipient [name: "ticket_user_actions_recipient_foreign_idx"] } } Table "ticket_types" { "id" int [pk, not null, increment] "name" varchar(255) [not null] "type" varchar(255) [not null] "icon" varchar(255) [not null] "color" varchar(255) [not null] "description" varchar(255) [not null] "default_sla_id" int [default: NULL] "form_id" int [default: NULL] "created_by" int [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "configs" json [default: NULL] Indexes { form_id [name: "form_id"] default_sla_id [name: "ticket_types_ibfk_1"] } } Table "categories" { "id" int [pk, not null, increment] "name" varchar(255) [not null] "type" varchar(255) [not null] "icon" varchar(255) [not null] "color" varchar(255) [not null] "description" varchar(255) [not null] "form_id" int [default: NULL] "created_by" int [default: NULL] "default_sla_id" int [default: NULL] "default_group_id" int [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] "active" tinyint(1) [default: '1'] "duration" time [default: NULL] "bookable" tinyint(1) [not null, default: '0'] "concurrency" int [default: NULL] "min_schedule_time" time [default: NULL] "max_schedule_time" time [default: NULL] "open_for_schedule" tinyint(1) [default: NULL] "configs" json [default: NULL] Indexes { form_id [name: "form_id"] created_by [name: "created_by"] default_sla_id [name: "default_sla_id"] default_group_id [name: "default_group_id"] } } Table "calendars" { "id" int [pk, not null, increment] "title" varchar(255) [not null] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] } Table "calendars_default_hours" { "id" int [pk, not null, increment] "calendar_id" int [default: NULL] "day" calendars_default_hours_day_enum [not null] "start" time [not null] "end" time [not null] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] Indexes { calendar_id [name: "calendar_id"] } } Table "calendars_special_hours" { "id" int [pk, not null, increment] "calendar_id" int [default: NULL] "date" date [not null] "start" time [not null] "end" time [not null] "increase_hours" tinyint(1) [not null] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] Indexes { calendar_id [name: "calendar_id"] } } Table "sla_goals" { "id" int [pk, not null, increment] "sla_id" int [default: NULL] "goal_id" int [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] Indexes { (sla_id, goal_id) [unique, name: "sla_goals_slaId_goalId_unique"] goal_id [name: "goal_id"] } } Table "slas" { "id" int [pk, not null, increment] "name" varchar(255) [default: NULL] "description" varchar(255) [default: NULL] "default_assigned_to" int [default: NULL] "active" tinyint(1) [default: NULL] "calendar_id" int [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] Indexes { default_assigned_to [name: "default_assigned_to"] calendar_id [name: "calendar_id"] } } Table "ticket_SLA" { "id" int [pk, not null, increment] "assigned_to" int [default: NULL] "ticket_id" int [default: NULL] "sla_id" int [default: NULL] "started_at" datetime [default: NULL] "finished_at" datetime [default: NULL] "expires_at" datetime [default: NULL] "created_at" datetime [not null] "updated_at" datetime [not null] "deleted_at" datetime [default: NULL] Indexes { (ticket_id, sla_id) [unique, name: "ticket_SLA_sla_id_ticket_id_unique"] assigned_to [name: "assigned_to"] sla_id [name: "sla_id"] } } Ref "chat_rooms_last_reply_author_foreign_idx":"users"."id" < "chat_rooms"."last_reply_author" Ref "chat_rooms_ticket_id_foreign_idx":"tickets"."id" < "chat_rooms"."ticket_id" Ref "groups_created_by_foreign_idx":"users"."id" < "groups"."created_by" [update: cascade] Ref "sla_ibfk_1":"groups"."id" < "slas"."default_assigned_to" [update: cascade, delete: set null] Ref "ticket_SLA_ibfk_1":"groups"."id" < "ticket_SLA"."assigned_to" [update: cascade, delete: set null] Ref "ticket_SLA_ibfk_2":"tickets"."id" < "ticket_SLA"."ticket_id" [update: cascade, delete: cascade] Ref "ticket_SLA_ibfk_3":"slas"."id" < "ticket_SLA"."sla_id" [update: cascade, delete: cascade] Ref "ticket_user_actions_recipient_foreign_idx":"users"."id" < "ticket_user_actions"."recipient" Ref "tickets_approval_group_id_foreign_idx":"groups"."id" < "tickets"."approval_group_id" Ref "tickets_shared_group_id_foreign_idx":"groups"."id" < "tickets"."shared_group_id" Ref: "calendars_special_hours"."calendar_id" < "calendars"."id" Ref: "calendars_default_hours"."calendar_id" < "calendars"."id" Ref: "sla_goals"."sla_id" < "slas"."id" Ref: "users"."user_profile_id" < "users_profiles"."id" Ref: "tickets"."category_id" < "categories"."id" Ref: "tickets"."ticket_type_id" < "ticket_types"."id" Ref: "tickets"."recipient" < "users"."id" Ref: "tickets"."created_by" < "users"."id" Ref: "tickets"."assigned_to_user" < "users"."id"
Principais tabelas¶
A seguir será explicado as principais tabelas para o contexto QSM.
users¶
Principal função: Salvar informações básicas dos usuários da plataforma.
- Principais colunas:
1. user: informação usada para fazer login na plataforma.
2. name, email, telefone: colunas auto explicativas.
3. cpf: dê preferência a salvar apenas números.
4. formResponseId: indica a resposta do formulário presente no perfil do usuário.
As demais colunas são autoexplicativas.
Observação: Evite realizar mudanças diretamente nessas tabelas, pois muitas das informações dos usuários ficam em cache. Exemplo: caso mude o perfil desse usuário, é possível que suas novas permissões atreladas a esse perfil não sejam atualizadas. A maneira mais fácil de atualizar a cache de um usuário, se você realmente precisar, é ir na tela
/userprofiles
e adicionar uma permissão para o perfil na qual seu usuário faz parte
users_profiles¶
Principal função: salvar informações dos perfis de usuários.
- Principais colunas:
1.slug: nome identificador do perfil.
2.form_id: aponta para um formulário adicional presente em cada usuário. Essa coluna permite salvarmos informações adicionais para cada usuário baseado em seu perfil de usuário. Exemplo: Todos os clientes deverão ter a opção de salvar número do cartão.
3.config_login_method_id: nosso sistema permite escolher tipos de login conforme o perfil que exercem na organização. Exemplo: todos os atendentes irão acessar a plataforma com cpf e senha, enquanto que os clientes acessarão com a conta da Google.
groups¶
Principal função: Contém todos os grupos que existem na plataforma.
- Principais colunas:
1. type: é uma chave estrangeira para
groups_types
. Dentro da tabela groups_types temos a possibilidade de configurar formulários específicos.2. form_response_id: indica a resposta do formulário presente em group_types. Exemplo: no QSM cada fila é um grupo do tipo
fila
. Nesse tipo temos a presença de um formulário contendo a pergunta calendarId. Dessa forma, conseguimos especificar um calendário específico para cada fila.
Para indicar quais usuários estão em quais grupos, consulte a tabela
users_groups
permissions¶
Principal função: contém todas as permissões utilizadas na plataforma.
Sempre que queremos proteger uma determinada funcionalidade, utilizamos o conceito de permissões. Por exemplo: apenas usuários com a permissão ticket.list
é capaz de listar qualquer ticket.
- Principais colunas:
1. name: indica o nome da permissão. Use no formato similar das colunas slug.
databases¶
Principal função: permitir salvar informações customizadas em nosso sistema
Database é um dos núcleos da nossa plataforma low-code, permitindo que organizações crie databases específicos para suas necessidades.
Todos os databases não materializados possuem 2 visualizações do MySQL e começam com o prefixo tables_data_
. Uma dessas visualizações termina com o sufixo no_types
e serve apenas para uso interno. Sempre de preferência as views que terminam sem esse sufixo.
- Principais colunas:
Não possuem principais colunas, pois cada database terá colunas específicas para atender um determinado problema, porém podemos ressaltar colunas comuns a todos os databases:
created_by, created_at, updated_at, deleted_at, form_id
.
Databases materializados deixam de ser views e se tornam tabelas do MySQL com o prefixo tables_
mais o nome do database.
tickets¶
Principal função: contém informações de todos os chamados do QSM.
- Principais colunas:
1. ticket_type_form_response_id: id da resposta do formulário do tipo do chamado.
2. form_response_id: id da resposta do formulário da categoria do chamado.
3. assigned_to_user: id do atendente do chamado**.**
4. assigned_to: id da fila do chamado.
5. recipient: id do destinatário, em alguns contextos chamados de “cliente” ou “beneficiário”, do chamado.
6. status: indica o status do chamado.
7. ticket_type_id: indica o id do tipo do chamado.
8. category_id: indica o id da categoria do chamado.
9. description: resumo do chamado, geralmente um texto com menos de 250 caracteres.
10. body: texto explicativo do chamado, usado para detalhar mais informações à respeito daquele chamado. Aceitando inclusive passar um HTML.
Não usamos mais as colunas ‘e-mails’ e ‘name’, presente em tickets.
chat_rooms¶
Principal função: contém todos os atendimentos live chats da plataforma.
Não temos salvos em nosso banco relacional as mensagens dos usuários, caso deseje consultar essas informações é necessário solicitar acesso ao nosso outro banco.
- Principais colunas
id: é o mesmo id usado em nosso outro banco.
webhook_url: é o webhook que iremos acionar quando uma nova mensagem for enviada/recebida.
json_data: coluna json para salvar informações gerais sobre a conversa. Exemplo: salvar o id do cliente presente em outro sistema.
ticket_id: é a FK da tabela de tickets. Todos nossos atendimentos válidos possuem essa FK diferente de vazio.
first_reply_at, last_reply_at e last_reply_author: são colunas importantes e autoexplicativas.
Observação: colunas que não usamos no QSM. requester_id, empty, product_id, members_count, icon, type, chat_status_id, name, assigned_to.
SLAS¶
Em atendimentos live-chat, utilizamos 3 SLAs conforme mostrados na imagem abaixo.
No banco, essas informações são salvas nas tabelas ticket_slas, ticket_goals, slas, slas_goals e goals. O id do SLA para atendimentos é 1. Portanto, caso queira ver, no banco, detalhes de um SLA de ticketId 407438, faça:
SELECT x.* FROM org_slug.ticket_slas x
WHERE ticket_id = 407438
E caso queira ver as metas de SLA desse ticket, faça:
SELECT x.* FROM org_slug.ticket_goals x
WHERE ticket_id = 407438
ticket_user_actions¶
Principal função: Contém os eventos dos chamados.
- Principais colunas
details: armazena o texto de uma mensagem. Também aceita string no formato HTML.
data: uma coluna json para armazenar qualquer informação considerada útil para aquela ticketUserAction. Por padrão, costumamos salvar a alteração do ticket antes da mudança, além de registar o tipo e a categoria do chamado.
{ "old": { "assignedToUserName": "Luiz Antonio de Albuquerque Junior" }, // salvamos apenas as propriedades que mudamos "ticket": { "categoryName": "Produto precisando de revisão", "ticketTypeName": "Incidente/Problema" } }
is_automatic_message: indica se a mensagem é automática.
ticket_id: indica qual ticket pertence aquela alteração.
type, description, ticket_type_id, assigned_to_user, status, priority, media_id, category_id, assigned_to, recipient: são informações que mudaram no ticket. Se o usuário mudou apenas o status para resolvido, então apenas a coluna status estará preenchida, enquanto as demais colunas estarão vazias.
ticket_types e categories¶
Principal função: contém dados do tipo/categoria do chamado.
- Principais colunas
name: indica o nome da categoria/tipo.
type: é uma coluna slug do name. Serve como identificador memorável do tipo. Em automações de preferência pelo type, pois o name é algo mais provável de mudar no decorrer do projeto.
icon, color: são ícones que serão mostrados na mainTab do workspace.
form_id: FK para forms. Útil para customizar formulários adicionais para tipo/categoria do chamado.
default_sla_id: indica SLA padrão (presente apenas na categoria).
default_group_id: indica a fila daquela categoria. (presente apenas na categoria).
active: indica se é possível criar chamados para aquela categoria.
configs: apresenta customizações para a tela do workspace, agentOverview e qsm-api. Saiba mais em ‣.
Observação: a tabela de tipo e categoria são similares em conceito e em colunas. Em caso de sobreposição de configuração, damos sempre preferência à categoria.
ticketTypeAdditionalInfos e categoryAdditionalInfos¶
Principal função: Informações adicionais da categoria ou tipo do chamado.
Como já dito anteriormente, toda informação adicional é uma view do MySQL com prefixo table_data
ou uma tabela materializada com prefixo tables_
.
No exemplo acima, a view tables_data_category_table_100320
pertence à categoria cujo form_Id é 100320
.
Podemos identificar essa categoria com a seguinte query:
SELECT * from categories c where c.form_id = 100320
- Principais colunas
Como um database consiste na criação de tabelas baseadas em contextos específicos, as colunas principais variam conforme a necessidade de cada problema.
O mesmo raciocínio se aplica a qualquer informação adicional; porém às vezes colocamos o id do item em vez do form_id.
calendars¶
Principal função: Contém informações sobre horário útil e feriados
A tabela calendars
contém apenas o nome do calendário.
A tabela calendars_default_hours
contém informações sobre horários úteis.
A tabela calendars_special_hours
contém informações sobre feriados.
Observação 1: Nunca grave o end sendo menor que o start Observação 2: Para calendários 24 horas, utilize o formato abaixo
![]()
slas e goals¶
Principal função: Contém informações sobre SLAs.
Em nossa estrutura, um SLA pode possuir mais de uma meta. Meta é um objetivo, geralmente medido em tempo, para garantir a qualidade do serviço.
O cálculo das metas do SLA só faz sentido quando usamos um calendário, geralmente obtemos essa informação através da fila presente na categoria do chamado.
Por padrão, temos 3 metas para os atendimentos live-chats:
- chatTimeToResolve: tempo para resolver aquele atendimento.
- chatTimeBetweenResponses: tempo entre respostas.
- chatTimeToFirstReplyAt: tempo para a primeira resposta.
Já para os chamados que não são atendimentos, costumamos ter apenas um SLA chamado resolutionTime
para medir o tempo total para um chamado ser resolvido.
- Principais colunas da tabela SLAs
name: indica o nome do SLA.
default_group_id: indica a fila que aquele SLA se aplica, na prática, essa coluna não é usada, pois obtemos a fila pela própria categoria do chamado, mas fica a critério do desenvolvedor usar essa coluna em alguma automação customizada.
A fila é importante para obtermos o calendário que o SLA utilizará.
- Principais colunas da tabela goals
slug: identificador da meta. Usada em automações do cálculo do SLA
value: tempo em minutos
A tabela usada em nosso sistema é slas (no plural) e não sla.