Sistema de ServiçosJavaFX

Diagrama de Classe

JavaFXde Sistema Ordem de Serviço

Classe Enum Prioridade

No pacote br.com.clayton.sistemadeservicos.enuns, temos a enum Prioridade, que representa três níveis de prioridade: Baixa, Média e Alta. Essa estrutura é importante para categorizarmos o nível de urgência de um determinado serviço ou tarefa dentro do sistema de serviços.

Abaixo, vamos detalhar cada parte da classe Prioridade:

package br.com.clayton.sistemadeservicos.enuns;

public enum Prioridade {
    BAIXA(0, "Baixa"),
    MEDIA(1, "Média"),
    ALTA(2, "Alta");

    private Integer codigo;
    private String descricao;

    private Prioridade(Integer codigo, String descricao) {
        this.codigo = codigo;
        this.descricao = descricao;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public String getDescricao() {
        return descricao;
    }

    public static Prioridade toEnum(Integer cod) {
        if (cod == null) {
            return null;
        }
        for (Prioridade prioridade : Prioridade.values()) {
            if (cod.equals(prioridade.getCodigo())) {
                return prioridade;
            }
        }
        throw new IllegalArgumentException("Prioridade inválida");
    }
}

Explicação do Código

  1. Definição dos Valores da Enum:

    • A enum define três constantes: BAIXA, MEDIA, e ALTA, cada uma com um código e uma descrição.
    • Por exemplo, BAIXA(0, "Baixa") significa que o nível de prioridade “Baixa” possui o código 0 e a descrição "Baixa". Os códigos ajudam a referenciar esses valores em banco de dados ou na lógica de programação de forma simplificada.
  2. Atributos:

    • codigo: O código numérico associado à prioridade.
    • descricao: O texto descritivo associado à prioridade.
  3. Construtor:

    • O construtor Prioridade(Integer codigo, String descricao) define como cada instância da enum será criada, aceitando um codigo e uma descricao para inicializar as constantes.
  4. Métodos Acessores (getCodigo e getDescricao):

    • getCodigo: Retorna o código da prioridade.
    • getDescricao: Retorna a descrição da prioridade.
  5. Método toEnum(Integer cod):

    • Esse método converte um código Integer em uma instância da enum Prioridade. Ele verifica cada constante da enum para ver se o código coincide com o fornecido. Se não encontrar uma correspondência, lança uma exceção IllegalArgumentException com a mensagem “Prioridade inválida”.

Classe Enum Status

package br.com.clayton.sistemadeservicos.enuns;

public enum Status {
    ABERTO(0, "Aberto"),
    ANDAMENTO(1, "Andamento"),
    ENCERRADO(2, "Encerrado");

    private Integer codigo;
    private String descricao;

    private Status(Integer codigo, String descricao) {
        this.codigo = codigo;
        this.descricao = descricao;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public String getDescricao() {
        return descricao;
    }

    public static Status toEnum(Integer cod) {
        if (cod == null) {
            return null;
        }
        for (Status status : Status.values()) {
            if (cod.equals(status.getCodigo())) {
                return status;
            }
        }
        throw new IllegalArgumentException("Status inválido");
    }
}

Detalhes do Código

  1. Definição dos Valores da Enum:

    • Cada constante (ABERTO, ANDAMENTO, ENCERRADO) representa um estado de um serviço, com um código numérico e uma descrição textual.
    • Por exemplo, ABERTO(0, "Aberto") define que o estado “Aberto” possui o código 0 e a descrição "Aberto".
  2. Atributos:

    • codigo: Número associado ao estado.
    • descricao: Descrição do estado.
  3. Construtor:

    • Status(Integer codigo, String descricao): Construtor que inicializa cada constante com um código e uma descrição.
  4. Métodos Acessores (getCodigo e getDescricao):

    • getCodigo(): Retorna o código do status.
    • getDescricao(): Retorna a descrição do status.
  5. Método toEnum(Integer cod):

    • Converte um código inteiro em uma instância de Status, retornando a constante correspondente ou lançando uma exceção IllegalArgumentException se o código for inválido.

Dicas Para a Criação da Classe Cliente

Para a continuação do projeto, você irá desenvolver a implementação da entidade Cliente com base no modelo apresentado para a classe Técnico, considerando as diferenças específicas da classe Cliente. Siga os seguintes passos para completar a implementação:

Tarefas:

  1. XML (View):

    • Crie o arquivo XML para a tela de Cadastro de Cliente. Esta tela deve conter os campos específicos para um Cliente.
    • Atente-se para os campos únicos de Cliente e adapte conforme necessário.
  2. Controller:

    • Implemente o ClienteController para gerenciar as interações entre a view (XML) e o modelo Cliente.
    • Este controller deve permitir a criação, atualização, remoção e listagem de clientes.
  3. Model:

    • Desenvolva a classe Cliente no modelo, herdando de Pessoa, como indicado no diagrama de classes.
  4. DTO (Data Transfer Object):

    • Crie o ClienteDTO para transferir dados da classe Cliente de forma simplificada entre as camadas do sistema.
    • Mapeie os atributos específicos de Cliente e adapte o ClienteDTO para atender às necessidades do sistema.
  5. DAO (Data Access Object):

    • Implemente o ClienteDAO para gerenciar o acesso e a persistência dos dados dos Clientes.
    • Garanta que os métodos de criação, leitura, atualização e exclusão estejam de acordo com os requisitos da aplicação.
  6. Service:

    • Desenvolva a camada de ClienteService, onde serão implementadas as regras de negócios relacionadas aos Clientes.
    • Certifique-se de que as operações da camada de serviço respeitem as regras de negócio da entidade Cliente.

Dicas Para a Criação da Classe Chamado

Dando continuidade à estrutura do sistema, você deve implementar a classe Chamado seguindo as mesmas diretrizes de criação das camadas de XML, Controller, Model, DTO, DAO e Service, conforme apresentado na implementação de Tecnico.

Instruções

  1. Modelagem das Camadas:

    • Utilize as mesmas camadas apresentadas na implementação de Tecnico para desenvolver a estrutura de Chamado. Cada camada deve ser implementada separadamente, mantendo o padrão arquitetural definido.
  2. Campos Específicos da Classe Chamado:

    • Ao implementar, observe que a classe Chamado possui atributos específicos:
      • prioridade (do tipo Prioridade – Enum),
      • status (do tipo Status – Enum),
      • titulo (String),
      • observacoes (String),
      • tecnico e cliente (associações com Tecnico e Cliente).
    • Implemente o DTO considerando esses atributos, e defina corretamente o tipo de cada campo.
  3. Método de Encerramento do Chamado:

    • Diferente das demais classes, Chamado não deve permitir exclusão. Em vez disso, você deve implementar um método de fechamento do chamado.
    • Esse método deve:
      • Alterar o status para o valor que indica o encerramento.
      • Definir a dataFechamento para a data atual apenas quando o chamado for fechado.
  4. Observações sobre a Classe ChamadoService:

    • Na camada de Service, siga a estrutura de ChamadoService para lidar com as operações de findAll, findById, create e update.
    • O método update deve atualizar o chamado com os dados do DTO e verificar se o status do chamado é de fechamento, para definir a dataFechamento adequadamente.
    • Implemente o método newChamado na Service para instanciar um novo objeto Chamado a partir do DTO e configurar todas as associações e enums.
  5. Incluir lista de Chamado nas Classes Tecnico e Cliente

    Nas classes Cliente e Tecnico permite que o sistema estabeleça um relacionamento bidirecional entre essas classes e a entidade Chamado. Isso significa que cada Cliente e cada Tecnico podem ter uma lista de chamados associada a eles, e a entidade Chamado contém uma referência ao Cliente e ao Tecnico que estão atendendo a esse chamado.

    Explicação do Relacionamento e da Necessidade de Adicionar o Campo

    1. Relacionamento Bidirecional:
      Ao adicionar a lista de Chamado nas classes Cliente e Tecnico, o sistema permite navegar de um Cliente ou Tecnico diretamente para os chamados associados. Esse tipo de navegação é útil em várias operações, como:

      • Exibir todos os chamados de um Cliente específico.
      • Obter os chamados que um determinado Tecnico está atendendo.
    2. Desempenho e Flexibilidade:
      Esse relacionamento permite uma consulta direta sem necessidade de buscas adicionais no banco de dados. Com a lista de chamados em Cliente e Tecnico, o sistema consegue melhorar a performance ao evitar buscas complexas.

    3. Controle e Manutenção de Chamados:
      Quando o sistema de chamados é bidirecional, é mais fácil gerenciar o ciclo de vida de um Chamado dentro de cada cliente ou técnico. Além disso, isso ajuda a manter a consistência dos dados e facilita a implementação de regras de negócios, como a listagem de chamados ainda em aberto ou de alta prioridade.

    Exemplo de Implementação

    Aqui está a implementação com a adição da lista chamados nas classes Cliente e Tecnico:

Classe Cliente:

public class Cliente extends Pessoa {
    
    private List chamados = new ArrayList<>();

    // Construtores e métodos...

    public List getChamados() {
        return chamados;
    }

    public void setChamados(List chamados) {
        this.chamados = chamados;
    }
}

Classe Tecnico:

public class Tecnico extends Pessoa {
    private static final long serialVersionUID = 1L;

    private List chamados = new ArrayList<>();

    // Construtores e métodos...

    public List getChamados() {
        return chamados;
    }

    public void setChamados(List chamados) {
        this.chamados = chamados;
    }
}