import java.util.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

// ===================== MAIN =====================
public class Main {

    public static void main(String[] args) {

        Fatura fatura = new Fatura(1000.00, 15); // limite e dia de vencimento

        fatura.adicionarCompra(new Compra("Supermercado", 300.00, 1));
        fatura.adicionarCompra(new Compra("Notebook", 2400.00, 12));
        fatura.adicionarCompra(new Compra("Celular", 1800.00, 10));

        fatura.imprimirFatura();
        fatura.gerarBoleto();
    }
}

// ===================== FATURA =====================
class Fatura {

    private double limiteTotal;
    private List<Compra> compras;
    private LocalDate dataVencimento;

    public Fatura(double limiteTotal, int diaVencimento) {
        this.limiteTotal = limiteTotal;
        this.compras = new ArrayList<>();
        this.dataVencimento = calcularVencimento(diaVencimento);
    }

    public void adicionarCompra(Compra compra) {
        compras.add(compra);
    }

    public double getTotalFatura() {
        double total = 0;
        for (Compra c : compras) {
            if (c.temParcelasPendentes()) {
                total += c.getValorParcela();
            }
        }
        return total;
    }

    public double getLimiteDisponivel() {
        return limiteTotal - getTotalFatura();
    }

    public void imprimirFatura() {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");

        System.out.println("===== FATURA DO CARTÃO =====");
        System.out.println("Vencimento: " + dataVencimento.format(fmt));
        System.out.println();

        for (Compra c : compras) {
            if (c.temParcelasPendentes()) {
                System.out.printf(
                    "- %s (%d/%d) | Parcela: R$ %.2f%n",
                    c.getDescricao(),
                    c.getParcelaAtual(),
                    c.getTotalParcelas(),
                    c.getValorParcela()
                );
            }
        }

        System.out.println();
        System.out.printf("Total da fatura: R$ %.2f%n", getTotalFatura());
        System.out.printf("Limite disponível: R$ %.2f%n", getLimiteDisponivel());
    }

    public void gerarBoleto() {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String codigoBarras = GeradorCodigoBarras.gerarCodigo(getTotalFatura());

        System.out.println("\n===== BOLETO PARA PAGAMENTO =====");
        System.out.printf("Valor: R$ %.2f%n", getTotalFatura());
        System.out.println("Vencimento: " + dataVencimento.format(fmt));
        System.out.println("Código de barras:");
        System.out.println(codigoBarras);
    }

    private LocalDate calcularVencimento(int diaVencimento) {
        LocalDate hoje = LocalDate.now();

        if (hoje.getDayOfMonth() > diaVencimento) {
            return hoje.plusMonths(1).withDayOfMonth(diaVencimento);
        }
        return hoje.withDayOfMonth(diaVencimento);
    }
}

// ===================== COMPRA =====================
class Compra {

    private String descricao;
    private double valorTotal;
    private int totalParcelas;
    private int parcelaAtual;

    public Compra(String descricao, double valorTotal, int totalParcelas) {
        this.descricao = descricao;
        this.valorTotal = valorTotal;
        this.totalParcelas = totalParcelas;
        this.parcelaAtual = 1;
    }

    public boolean temParcelasPendentes() {
        return parcelaAtual <= totalParcelas;
    }

    public double getValorParcela() {
        return valorTotal / totalParcelas;
    }

    public String getDescricao() {
        return descricao;
    }

    public int getTotalParcelas() {
        return totalParcelas;
    }

    public int getParcelaAtual() {
        return parcelaAtual;
    }
}

// ===================== GERADOR DE CÓDIGO DE BARRAS =====================
class GeradorCodigoBarras {

    public static String gerarCodigo(double valor) {
        String base = String.valueOf((int)(valor * 100));
        StringBuilder codigo = new StringBuilder();

        Random random = new Random();
        for (int i = 0; i < 44; i++) {
            codigo.append(random.nextInt(10));
            if (i % 4 == 3) codigo.append(" ");
        }

        return codigo.toString();
    }
}

Embed on website

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