import java.util.ArrayList;
import java.util.List;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
enum CategoriaProduto {
MATERIA_PRIMA,
PRODUTO_ACABADO,
INSUMO,
EMBALAGEM
}
enum TipoMovimentacao {
ENTRADA,
SAIDA
}
class Movimentacao {
private TipoMovimentacao tipo;
private int quantidade;
private int saldoApos;
private LocalDateTime dataHora;
public Movimentacao(TipoMovimentacao tipo, int quantidade, int saldoApos) {
this.tipo = tipo;
this.quantidade = quantidade;
this.saldoApos = saldoApos;
this.dataHora = LocalDateTime.now();
}
@Override
public String toString() {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
return "[" + dataHora.format(fmt) + "] " +
tipo + " | Qtde: " + quantidade +
" | Saldo: " + saldoApos;
}
}
class Produto {
private int codigo;
private String nome;
private CategoriaProduto categoria;
private int quantidade;
private int estoqueMinimo;
private List<Movimentacao> historico;
public Produto(int codigo, String nome, CategoriaProduto categoria, int estoqueMinimo) {
this.codigo = codigo;
this.nome = nome;
this.categoria = categoria;
this.estoqueMinimo = estoqueMinimo;
this.quantidade = 0;
this.historico = new ArrayList<>();
}
public void adicionar(int quantidade) {
if (quantidade <= 0) {
System.out.println("Quantidade inválida para entrada.");
return;
}
this.quantidade += quantidade;
historico.add(new Movimentacao(TipoMovimentacao.ENTRADA, quantidade, this.quantidade));
}
public void remover(int quantidade) {
if (quantidade <= 0) {
System.out.println("Quantidade inválida para saída.");
return;
}
if (quantidade > this.quantidade) {
System.out.println("Saldo insuficiente em estoque.");
return;
}
this.quantidade -= quantidade;
historico.add(new Movimentacao(TipoMovimentacao.SAIDA, quantidade, this.quantidade));
}
public boolean estoqueBaixo() {
return quantidade < estoqueMinimo;
}
public void exibirHistorico() {
System.out.println("\n📄 Histórico de Movimentações - " + nome);
if (historico.isEmpty()) {
System.out.println("Nenhuma movimentação registrada.");
return;
}
for (Movimentacao m : historico) {
System.out.println(m);
}
}
@Override
public String toString() {
return "Produto #" + codigo +
" | " + nome +
" | Categoria: " + categoria +
" | Quantidade: " + quantidade +
" | Mínimo: " + estoqueMinimo;
}
}
class EstoqueService {
private List<Produto> produtos = new ArrayList<>();
public void adicionarProduto(Produto produto) {
produtos.add(produto);
}
public void listarEstoque() {
System.out.println("\n📦 RELATÓRIO DE ESTOQUE");
for (Produto p : produtos) {
System.out.println(p);
if (p.estoqueBaixo()) {
System.out.println("⚠️ ALERTA: Estoque abaixo do mínimo!");
}
}
}
}
public class Main {
public static void main(String[] args) {
EstoqueService estoque = new EstoqueService();
Produto alcool = new Produto(1, "Álcool Etílico", CategoriaProduto.MATERIA_PRIMA, 100);
Produto acucar = new Produto(2, "Açúcar", CategoriaProduto.PRODUTO_ACABADO, 50);
Produto melaco_dsm = new Produto(3, "Melaço - DSM", CategoriaProduto.PRODUTO_ACABADO, 120);
alcool.adicionar(80);
alcool.adicionar(30);
alcool.remover(20);
acucar.adicionar(200);
acucar.remover(170);
melaco_dsm.adicionar(150);
melaco_dsm.remover(120);
estoque.adicionarProduto(alcool);
estoque.adicionarProduto(acucar);
estoque.adicionarProduto(melaco_dsm);
estoque.listarEstoque();
alcool.exibirHistorico();
acucar.exibirHistorico();
melaco_dsm.exibirHistorico();
}
}
To embed this project on your website, copy the following code and paste it into your website's HTML: