diff --git a/index/ChildrensPrice.java b/index/ChildrensPrice.java new file mode 100644 index 00000000..c1cf552e --- /dev/null +++ b/index/ChildrensPrice.java @@ -0,0 +1,15 @@ +public class ChildrensPrice extends Price { + @Override + public int getPriceCode() { + return Movie.CHILDRENS; + } + + @Override + public double getCharge(int daysRented) { + double result = 1.5; + if (daysRented > 3) { + result += (daysRented - 3) * 1.5; + } + return result; + } +} diff --git a/index/Customer.java b/index/Customer.java new file mode 100644 index 00000000..8242561c --- /dev/null +++ b/index/Customer.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.List; + +public class Customer { + private String _name; + private List _rentals = new ArrayList<>(); + + public Customer(String name) { + _name = name; + } + + public void addRental(Rental arg) { + _rentals.add(arg); + } + + public String getName() { + return _name; + } + + public String statement() { + return new TextStatement().value(this); + } + + public String htmlStatement() { + return new HtmlStatement().value(this); + } + + public List getRentals() { + return _rentals; + } + + public double getTotalCharge() { + double result = 0; + for (Rental each : _rentals) { + result += each.getCharge(); + } + return result; + } + + public int getTotalFrequentRenterPoints() { + int result = 0; + for (Rental each : _rentals) { + result += each.getFrequentRenterPoints(); + } + return result; + } +} diff --git a/index/HtmlStatement.java b/index/HtmlStatement.java new file mode 100644 index 00000000..05da3acd --- /dev/null +++ b/index/HtmlStatement.java @@ -0,0 +1,17 @@ +public class HtmlStatement extends Statement { + @Override + protected String headerString(Customer customer) { + return "

Rentals for " + customer.getName() + "

\n"; + } + + @Override + protected String rentalString(Rental rental) { + return rental.getMovie().getTitle() + ": " + rental.getCharge() + "
\n"; + } + + @Override + protected String footerString(Customer customer) { + return "

You owe " + customer.getTotalCharge() + "

\n" + + "On this rental you earned " + customer.getTotalFrequentRenterPoints() + " frequent renter points

"; + } +} diff --git a/index/Main.java b/index/Main.java new file mode 100644 index 00000000..ae215a6f --- /dev/null +++ b/index/Main.java @@ -0,0 +1,26 @@ +public class Main { + public static void main(String[] args) { + // Criando filmes + Movie movie1 = new Movie("The Godfather", Movie.REGULAR); + Movie movie2 = new Movie("Frozen", Movie.CHILDRENS); + Movie movie3 = new Movie("Avengers: Endgame", Movie.NEW_RELEASE); + + // Criando aluguéis + Rental rental1 = new Rental(movie1, 5); + Rental rental2 = new Rental(movie2, 4); + Rental rental3 = new Rental(movie3, 2); + + // Criando cliente + Customer customer = new Customer("John Doe"); + customer.addRental(rental1); + customer.addRental(rental2); + customer.addRental(rental3); + + // Exibindo os relatórios + System.out.println("Relatório em texto:"); + System.out.println(customer.statement()); + + System.out.println("\nRelatório em HTML:"); + System.out.println(customer.htmlStatement()); + } +} diff --git a/index/Movie.java b/index/Movie.java new file mode 100644 index 00000000..a9b4771a --- /dev/null +++ b/index/Movie.java @@ -0,0 +1,45 @@ +public class Movie { + public static final int CHILDRENS = 2; + public static final int REGULAR = 0; + public static final int NEW_RELEASE = 1; + + private String _title; + private Price _price; + + public Movie(String title, int priceCode) { + _title = title; + setPriceCode(priceCode); + } + + public int getPriceCode() { + return _price.getPriceCode(); + } + + public void setPriceCode(int arg) { + switch (arg) { + case REGULAR: + _price = new RegularPrice(); + break; + case CHILDRENS: + _price = new ChildrensPrice(); + break; + case NEW_RELEASE: + _price = new NewReleasePrice(); + break; + default: + throw new IllegalArgumentException("Incorrect Price Code"); + } + } + + public String getTitle() { + return _title; + } + + public double getCharge(int daysRented) { + return _price.getCharge(daysRented); + } + + public int getFrequentRenterPoints(int daysRented) { + return _price.getFrequentRenterPoints(daysRented); + } +} diff --git a/index/NewReleasePrice.java b/index/NewReleasePrice.java new file mode 100644 index 00000000..8e04dfb0 --- /dev/null +++ b/index/NewReleasePrice.java @@ -0,0 +1,16 @@ +public class NewReleasePrice extends Price { + @Override + public int getPriceCode() { + return Movie.NEW_RELEASE; + } + + @Override + public double getCharge(int daysRented) { + return daysRented * 3; + } + + @Override + public int getFrequentRenterPoints(int daysRented) { + return (daysRented > 1) ? 2 : 1; + } +} diff --git a/index/Price.java b/index/Price.java new file mode 100644 index 00000000..3f2f9a05 --- /dev/null +++ b/index/Price.java @@ -0,0 +1,9 @@ +public abstract class Price { + public abstract int getPriceCode(); + + public abstract double getCharge(int daysRented); + + public int getFrequentRenterPoints(int daysRented) { + return 1; + } +} diff --git a/index/RegularPrice.java b/index/RegularPrice.java new file mode 100644 index 00000000..96612bd3 --- /dev/null +++ b/index/RegularPrice.java @@ -0,0 +1,15 @@ +public class RegularPrice extends Price { + @Override + public int getPriceCode() { + return Movie.REGULAR; + } + + @Override + public double getCharge(int daysRented) { + double result = 2; + if (daysRented > 2) { + result += (daysRented - 2) * 1.5; + } + return result; + } +} diff --git a/index/Rental.java b/index/Rental.java new file mode 100644 index 00000000..3f47c368 --- /dev/null +++ b/index/Rental.java @@ -0,0 +1,25 @@ +public class Rental { + private Movie _movie; + private int _daysRented; + + public Rental(Movie movie, int daysRented) { + _movie = movie; + _daysRented = daysRented; + } + + public int getDaysRented() { + return _daysRented; + } + + public Movie getMovie() { + return _movie; + } + + public double getCharge() { + return _movie.getCharge(_daysRented); + } + + public int getFrequentRenterPoints() { + return _movie.getFrequentRenterPoints(_daysRented); + } +} diff --git a/index/Statement.java b/index/Statement.java new file mode 100644 index 00000000..df771351 --- /dev/null +++ b/index/Statement.java @@ -0,0 +1,16 @@ +public abstract class Statement { + public String value(Customer customer) { + String result = headerString(customer); + for (Rental rental : customer.getRentals()) { + result += rentalString(rental); + } + result += footerString(customer); + return result; + } + + protected abstract String headerString(Customer customer); + + protected abstract String rentalString(Rental rental); + + protected abstract String footerString(Customer customer); +} diff --git a/index/TextStatement.java b/index/TextStatement.java new file mode 100644 index 00000000..ef5c9994 --- /dev/null +++ b/index/TextStatement.java @@ -0,0 +1,17 @@ +public class TextStatement extends Statement { + @Override + protected String headerString(Customer customer) { + return "Rental Record for " + customer.getName() + "\n"; + } + + @Override + protected String rentalString(Rental rental) { + return "\t" + rental.getMovie().getTitle() + "\t" + rental.getCharge() + "\n"; + } + + @Override + protected String footerString(Customer customer) { + return "Amount owed is " + customer.getTotalCharge() + "\n" + + "You earned " + customer.getTotalFrequentRenterPoints() + " frequent renter points"; + } +}