Pular para o conteúdo principal

Entidades do Domínio

Documentação das principais entidades do sistema PAC.

Visão Geral

O sistema possui várias entidades que representam os conceitos principais do domínio de conformidade.

Entidades Principais

User (Usuário)

Representa um usuário do sistema.

class IUser {
id: string;
email: string;
password: string;
name: string;
role: UserRole; // ADMIN, CLIENT, RESPONSAVEL_TECNICO, TECNICO
status: UserStatus; // ATIVO, INATIVO, BLOQUEADO
isActive: boolean;
entityId?: string; // ID da entidade relacionada
createdAt: Date;
updatedAt: Date;
}

Relacionamentos:

  • Um User pode estar vinculado a um Client, ResponsavelTecnico ou Tecnico

Client (Cliente/Empresa)

Representa uma empresa cliente do sistema.

class IClient {
id: string;

// Dados fiscais
razaoSocial: string;
nomeFantasia: string;
cnpj: string;
inscricaoEstadual?: string;
inscricaoMunicipal?: string;
regimeTributario?: RegimeTributario;

// Endereço
logradouro: string;
numero: string;
complemento?: string;
bairro: string;
cidade: string;
uf: UF;
cep: string;
pais: string;

// Contatos
telefone?: string;
celular?: string;
email: string;
contatoNome?: string;
contatoCargo?: string;
contatoEmail?: string;
contatoTelefone?: string;

// Controle
status: ClientStatus; // ATIVO, INATIVO, BLOQUEADO
observacoes?: string;

// Relacionamentos
userId?: string;
setores?: ISetor[];
tecnicos?: ITecnico[];

// Timestamps
dataCadastro: Date;
dataAtualizacao: Date;
}

Relacionamentos:

  • Um Client tem um User
  • Um Client tem muitos Setores
  • Um Client tem muitos Tecnicos
  • Um Client pode estar vinculado a muitos FormularioModelos

ResponsavelTecnico (Responsável Técnico)

Representa um profissional responsável técnico.

class IResponsavelTecnico {
id: string;
nome: string;
telefone?: string;
documento: string; // CPF ou registro profissional
funcao: string;
email: string;
status: ClientStatus;

// Vinculação obrigatória com User
userId: string;

// Relacionamentos
user?: IUser;
clientes?: IClient[];

// Timestamps
dataCadastro: Date;
dataAtualizacao: Date;
}

Relacionamentos:

  • Um ResponsavelTecnico tem um User
  • Um ResponsavelTecnico pode ter muitos Clients (many-to-many)

FormularioModelo (Modelo de Formulário)

Template de formulário criado pelo RT.

class IFormularioModelo {
id: string;
responsavelTecnicoId: string;
titulo: string;
subtitulo?: string;
descricao?: string;
ativo: boolean;
frequencia: FormularioFrequencia; // DIARIO, SEMANAL, PERSONALIZADO
diasSemana?: DiaSemana[]; // Para frequência semanal
horarios: string[]; // ['08:00', '14:00', '20:00']
status: FormularioStatus; // RASCUNHO, PUBLICADO, INATIVO

// Relacionamentos
responsavelTecnico?: IResponsavelTecnico;
perguntas?: IFormularioPergunta[];
clientes?: IClient[];

// Timestamps
dataCadastro: Date;
dataAtualizacao: Date;
}

Relacionamentos:

  • Um FormularioModelo pertence a um ResponsavelTecnico
  • Um FormularioModelo tem muitas FormularioPerguntas
  • Um FormularioModelo pode estar vinculado a muitos Clients (many-to-many)

FormularioPergunta (Pergunta do Formulário)

Pergunta dentro de um modelo de formulário.

class IFormularioPergunta {
id: string;
formularioModeloId: string;
perguntaPaiId?: string; // Para subperguntas
ordem: number;
tipo: TipoPergunta; // TEXTO, MULTIPLA_ESCOLHA, LISTA, NUMERICO
titulo: string;
subtitulo?: string;
obrigatorio: boolean;
textoRegraNegocio?: string;
justificarHabilitado: boolean;
textoJustificarPergunta?: string;
configuracaoTipo: ConfiguracaoTipo;
justificativasOpcoes?: OpcaoPergunta[];
acoesCorretivasOpcoes?: OpcaoAcaoCorretiva[];

// Relacionamentos
formularioModelo?: IFormularioModelo;
perguntaPai?: IFormularioPergunta;
subperguntas?: IFormularioPergunta[];

// Timestamps
dataCadastro: Date;
dataAtualizacao: Date;
}

Tipos de Configuração:

  • Texto: Campo de texto (singleline/multiline)
  • Múltipla Escolha: Opções com status de conformidade
  • Lista: Dropdown com opções
  • Numérico: Campo numérico com validações

FormularioInstancia (Instância de Formulário)

Preenchimento real de um formulário.

class IFormularioInstancia {
id: string;
formularioModeloId: string;
tecnicoId: string;
clienteId: string;
setorId?: string;
dataAgendada: Date;
horaAgendada: string;
status: StatusInstancia; // PENDENTE, EM_CONFORMIDADE, NAO_CONFORMIDADE, JUSTIFICADO
dataResposta?: Date;
resumoNaoConformidade?: string;

// Relacionamentos
formularioModelo?: IFormularioModelo;
tecnico?: ITecnico;
cliente?: IClient;
setor?: ISetor;
respostas?: IFormularioRespostaPergunta[];

// Timestamps
dataCadastro: Date;
dataAtualizacao: Date;
}

Status:

  • PENDENTE: Aguardando preenchimento
  • EM_CONFORMIDADE: Todas as respostas estão em conformidade
  • NAO_CONFORMIDADE: Há não conformidades não justificadas
  • JUSTIFICADO: Não conformidades foram justificadas

FormularioRespostaPergunta (Resposta da Pergunta)

Resposta de uma pergunta específica em uma instância.

class IFormularioRespostaPergunta {
id: string;
formularioInstanciaId: string;
formularioPerguntaId: string;
valorResposta?: string; // Resposta em texto/JSON
marcadoNaoConformidade?: boolean;
ehConformidade: boolean;
justificativasSelecionadas?: number[];
acoesCorretivasSelecionadas?: number[];

// Relacionamentos
formularioInstancia?: IFormularioInstancia;
formularioPergunta?: IFormularioPergunta;

// Timestamps
dataCadastro: Date;
dataAtualizacao: Date;
}

Chamado (Chamado de Suporte)

Comunicação entre cliente e RT.

interface IChamado {
id: string;
protocolo: string; // Protocolo único
titulo: string;
descricao: string;
resposta?: string;
status: StatusChamado; // AGUARDANDO, RESPONDIDO
clienteId: string;
responsavelTecnicoId: string;
dataCriacao: Date;
dataAtualizacao: Date;
dataResposta?: Date;
}

Setor (Setor da Empresa)

Setor dentro de uma empresa cliente.

class ISetor {
id: string;
clienteId: string;
nomeSetor: string;
contato?: string;
telefone?: string;
email?: string;
status: ClientStatus;

// Relacionamentos
cliente?: IClient;

// Timestamps
dataCriacao: Date;
dataAtualizacao: Date;
}

Tecnico (Técnico da Empresa)

Técnico que preenche formulários.

class ITecnico {
id: string;
clienteId: string;
nome: string;
email: string;
telefone?: string;
status: ClientStatus;
userId?: string;

// Relacionamentos
cliente?: IClient;
user?: IUser;

// Timestamps
dataCadastro: Date;
dataAtualizacao: Date;
}

Enums Importantes

UserRole

enum UserRole {
ADMIN = 'admin',
CLIENT = 'client',
RESPONSAVEL_TECNICO = 'responsavel_tecnico',
TECNICO = 'tecnico',
}

StatusInstancia

enum StatusInstancia {
PENDENTE = 'pendente',
EM_CONFORMIDADE = 'em_conformidade',
NAO_CONFORMIDADE = 'nao_conformidade',
JUSTIFICADO = 'justificado',
}

FormularioStatus

enum FormularioStatus {
RASCUNHO = 'rascunho',
PUBLICADO = 'publicado',
INATIVO = 'inativo',
}

FormularioFrequencia

enum FormularioFrequencia {
DIARIO = 'diario',
SEMANAL = 'semanal',
PERSONALIZADO = 'personalizado',
}

Diagrama de Relacionamentos

erDiagram
User ||--o| Client : "tem"
User ||--o| ResponsavelTecnico : "tem"
User ||--o| Tecnico : "tem"

ResponsavelTecnico ||--o{ FormularioModelo : "cria"
FormularioModelo ||--o{ FormularioPergunta : "contém"
FormularioModelo }o--o{ Client : "vinculado"

FormularioModelo ||--o{ FormularioInstancia : "gera"
FormularioInstancia }o--|| Client : "pertence"
FormularioInstancia }o--|| Tecnico : "preenchido por"
FormularioInstancia ||--o{ FormularioRespostaPergunta : "tem"

Client ||--o{ Setor : "tem"
Client ||--o{ Tecnico : "tem"
Client ||--o{ Chamado : "abre"
Chamado }o--|| ResponsavelTecnico : "respondido por"

Próximos Passos