- Java 21
- Instalar
Java 21
- Instalar
- Spring Boot 3.3.2
- Usando
JVM
winget search Oracle.JDK
- Usando
-
Clone o projeto
git clone https://github.com/omattaeus/salesphere.git
-
Rode
javac Starup.java
-
Pronto 🎉
Este sistema gerencia produtos e suas quantidades em estoque, enviando alertas por e-mail quando o estoque está baixo. A arquitetura inclui serviços para manipulação de produtos e um agendador para verificar periodicamente o estoque.
2.1.1 ProductService
O serviço ProductService gerencia as operações relacionadas aos produtos, como recuperação de produtos, criação de novos produtos, e verificação e notificação de estoque baixo.
ProductRepository:
Repositório para acessar dados dos produtos.ProductMapper:
Mapeador para converter entre entidades de produto e DTOs.JavaMailSender:
Enviador de e-mails para notificações de estoque baixo.
-
getAllProducts()
Recupera todos os produtos do repositório e os converte em DTOs.public List<ProductResponseDTO> getAllProducts()
-
createProduct(ProductRequestDTO productRequestDTO)
Cria um novo produto a partir dos dados fornecidos. Lança uma exceção se os dados do produto estiverem vazios ou inválidos.public ProductResponseDTO createProduct(ProductRequestDTO productRequestDTO)
-
getProductsWithLowStock()
Recupera todos os produtos cujo estoque está abaixo da quantidade mínima.public List<Product> getProductsWithLowStock()
-
checkStock()
Verifica produtos com estoque baixo e envia alertas por e-mail para cada produto com estoque abaixo do mínimo.public void checkStock()
-
sendLowStockAlert(Product product)
Envia um e-mail de alerta sobre o produto com estoque baixo.public void sendLowStockAlert(Product product)
2.2.1 StockScheduler
O agendador StockScheduler é responsável por verificar periodicamente o estoque e acionar a verificação do estoque baixo.
ProductService:
Serviço que realiza a verificação do estoque e envio de alertas.
-
checkStockPeriodically()
Método agendado para execução periódica (uma vez por hora) que chama o método checkStock() do ProductService.@Scheduled(cron = "0 0 * * * *") public void checkStockPeriodically()
2.3.1 Product
A classe Product representa um produto no sistema, incluindo informações detalhadas sobre o produto e seu estado de estoque.
@Entity: Marca a classe como uma entidade JPA.
@Table(name = "tb_product"): Define o nome da tabela no banco de dados.
-
id
Identificador único do produto.private Long id;
-
productName
Nome do produto.private String productName;
-
description
Descrição do produto.private String description;
-
brand
Marca do produto.private String brand;
-
purchasePrice
Preço de compra do produto.private Double purchasePrice;
-
salePrice
Preço de venda do produto.private Double salePrice;
-
stockQuantity
Quantidade em estoque.private Long stockQuantity;
-
minimumQuantity
Quantidade mínima em estoque.private Long minimumQuantity;
-
codeSku
Código SKU único do produto.private String codeSku;
-
category
Categoria do produto.
private Category category;
-
availability
Status de disponibilidade do produto.private AvailabilityEnum availability
Construtor:
Product(Long id, String productName, String description, String brand, Category category, Double purchasePrice, Double salePrice, Long stockQuantity, Long minimumQuantity, String codeSku, AvailabilityEnum availability)
Construtor com todos os campos necessários para criar um objeto Product.
public Product(Long id, String productName, String description,
String brand, Category category, Double purchasePrice,
Double salePrice, Long stockQuantity, Long
minimumQuantity, String codeSku,
AvailabilityEnum availability)
A verificação de estoque é realizada periodicamente pelo StockScheduler, que invoca o método checkStock() do ProductService. Se algum produto estiver com estoque abaixo do mínimo, um alerta é enviado por e-mail.
Produtos são criados através do método createProduct() do ProductService, que valida os dados e salva o novo produto no repositório.
Todos os produtos podem ser recuperados usando o método getAllProducts() do ProductService.
A classe Category representa uma categoria no sistema, associada a uma lista de produtos.
-
@Entity
Marca a classe como uma entidade JPA que será mapeada para uma tabela no banco de dados. -
@Table(name = "tb_category")
Define o nome da tabela no banco de dados como tb_category. -
@Getter
e@Setter
Geram automaticamente os métodos getters e setters para os atributos da classe. -
@AllArgsConstructor
Gera um construtor com todos os campos da classe. -
@NoArgsConstructor
Gera um construtor sem argumentos.
- Atributos
-
id
Identificador único da categoria. Tipo:Long
Anotações: -
@Id
-
@GeneratedValue(strategy = GenerationType.IDENTITY)
-
categoryEnum
Enum que representa a categoria. Tipo:CategoryEnum
Anotações:
-
@Enumerated(EnumType.STRING)
-
@Column(name = "category", unique = true, length = 20)
-
products
Lista de produtos associados a esta categoria. Tipo:List<Product>
Anotações:
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
products
Relacionamento de um-para-muitos com a entidade Product. A categoria pode estar associada a vários produtos.
Category category = new Category();
category.setCategoryEnum(CategoryEnum.ELECTRONICS);
List<Product> products = category.getProducts();