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();
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: