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();
}
}
To embed this program on your website, copy the following code and paste it into your website's HTML: