US2006 - ArthurSchiavom/gestao-informacao-chao-de-fabrica--projeto-academico GitHub Wiki
=======================================
O Gestor de Produção pretende que o programa carregue Produtos para a base de dados através de um ficheiro CSV.
Como Gestor de Projeto pretendo que:
- A funcionalidade permita carregar múltiplos produtos como indicado nos ficheiros exemplos fornecidos.
- A funcionalidade mostre no final o número de produtos carregados, o número de carregamentos falhados e qual as linhas que falharam associadas ao motivo da falha.
- A funcionalidade permite escolher entre substituir e ignorar linhas relativas a produtos repetidos.
O utilizador inicia o caso de uso. O sistema pede o caminho do ficheiro e se deve substituir produtos repetidos. O utilizador indica a informação pedida. O sistema apresenta o resultado da importação. O sistema pede ao utilizador que pressione enter para continuar. O utilizador pressiona enter. O caso de uso termina.
Um produto é caracterizado pelos seguintes valores:
- Código ùnico - Único
- Código Comercial - Único
- Descrição Breve - Máximo de 30 palavras
- Descrição Completa - Não é vazia
- Unidade - É especificada
- Categoria - É especificada
- Ficha de Produção - opcional
Uma ficha de produção é caracterizada por:
- Uma lista de quantidades de matéria prima.
Uma quantidade de matéria prima é caracterizada por:
- Matéria prima
- Quantidade
Uma matéria prima é caracterizada por:
- Tipo de matéria prima (produto ou material)
- ID da matéria prima (código único de produto ou código interno de material)
Note-se que o repositório é obtido através de PersistenceContext.repositories().produto(), que é a metodologia utilizada em toda a aplicação sempre que um repositório é necessário.
- Repository Pattern - Para abstrair o sistema de persistência de objetos, facilitando a implementação com diferentes tecnologias
- Factory Method - Para a instanciação de objetos do domínio.
- Simple Factory - Na instanciação de repositórios, neste caso através de PersistenceContext.repositories().produto().
- Builder - Para permitir um controlo granular do sucesso/falha de cada atributo de produto criado.
- Command - Para especificar o que fazer quando uma opção do menu é escolhida. Também utilizado na criação de um seletor de opções (OptionSelector).
- Data Transfer Object - Para poder transferir o resultado da operação do controller para a UI sem misturar os dois layers.
- Controller - Para separar o layer da interface do layer de domínio, introduzindo então um layer de aplicação encarregue do processamento, mas não responsável por caracterizar o negócio ou interagir com o utilizador.
- Polymorphism & Template method - Usado na implementação do repositório específico de cada entidade bem como na implementação da UI específica deste caso de uso.
- Dependency inversion & Protected variation & Strategy - RegistarProdutosDeCsvController é utilizado como uma instância da interface RegistarProdutosDeFicheiroController. JpaProdutoRepository é utilizado como uma instância da interface ProdutoRepository. CsvFileScanner é utilizado como uma instância da interface FileScanner<String[]>.
- Liskov Substitution principle & Dependency inversion - Em todas as implementações de interfaces e extensões de classes.
- Pure fabrication - Controller e UI.
- Information expert & HC/LC - Sempre presente: cada classe tem uma responsabilidade bem definida, visando a sua independência de outras classes.
- Singleton - Utilizado na RepositoryFactory
- Código ùnico - Único
- Código Comercial - Único
- Descrição Breve - Máximo de 30 palavras
- Descrição Completa - Não é vazia
- Unidade - É especificada
- Categoria - É especificada
- Ficha de Produção - opcional
- O código único deve ser único
- O código Comercial deve ser único
- A descrição Breve deve ter no máximo de 30 caractéres
- A Ficha de Produção é opcional
- A Descrição Completa é especificada
- A Unidade é especificada
- A Categoria é especificada
- O número de campos fornecidos é o esperado
- O cabeçalho é o esperado
- O ficheiro existe
Seria possível utilizar o padrão adapter para facilitar a adição de novos sistemas de carregamento para diferentes tipos de ficheiros. No entanto, tal possibilidade não foi posta ou mencionada e a introdução deste padrão no sistema atual não apresenta dificuldade.


