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"