Uma farmácia necessita controlar todos os produtos que comercializa. Sabe-se que nesse estabelecimento os produtos comercializados são medicamentos e artigos de higiene. Os medicamentos possuem código, descrição, preço de compra, percentual de lucro e data de vencimento. Os produtos de higiene possuem código, descrição e preço de compra. Sabe-se que todo o produto de higiene gera como lucro 30% do preço de compra. Crie classes que representem o contexto descrito.
Depois disso, você deverá:
a) Criar um método que permita cadastrar um produto (cadastre um por vez):
no momento do cadastro deverá ser feita uma verificação para não aceitar códigos repetidos (crie um método especificamente para fazer esta verificação);
o usuário decidirá se deseja cadastrar um medicamento ou um produto de higiene;
ao final do cadastramento, utilize o método apropriado para calcular o lucro do produto;
poderão ser cadastrados, no máximo 15 produtos.
b) Crie um método para mostrar todas as informações do produto mais caro (pode ser um medicamento ou um produto de higiene).
c) Mostre todos os dados de todos os produtos vendidos na loja.
d) Crie um método que permita alterar os dados de determinado produto cujo código é informado pelo usuário (se for informado código inválido, mostre a mensagem “Produto inexistente”.
N sei como cadastra o produto
Pergunta pro usuário se ele quer cadastrar um medicamento ou produto de higiene.
Os medicamentos possuem código, descrição, preço de compra, percentual de lucro e data de vencimento.
Os produtos de higiene possuem código, descrição e preço de compra.
itajun
Abril 15, 2018, 9:13am
#5
Espero que ajude…
/**
* @author itamar
*/
public class Products {
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("ddMMyyyy");
abstract class Product {
private String code;
private String description;
private float cost;
protected float profitMargin;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public float getCost() {
return cost;
}
public void setCost(float cost) {
this.cost = cost;
}
public float getProfitMargin() {
return profitMargin;
}
public float getListingPrice() {
return cost + (cost * profitMargin / 100);
}
protected Map<String, Consumer> getEditableFields() {
Map<String, Consumer> result = new LinkedHashMap<>();
result.put("Code", e -> this.setCode(String.valueOf(e)));
result.put("Description", e -> this.setDescription(String.valueOf(e)));
result.put("Cost", e -> this.setCost(Float.valueOf(String.valueOf(e))));
return result;
}
public String toString() {
StringBuilder result = new StringBuilder();
result.append("Code: ").append(code).append(",")
.append("Description: ").append(description).append(",")
.append("Cost: ").append(cost).append(",")
.append("Profit Margin: ").append(profitMargin).append(",")
.append("Listing Price: ").append(getListingPrice());
return result.toString();
}
}
class Medicine extends Product {
private Date expiryDate;
public Date getExpiryDate() {
return expiryDate;
}
public void setExpiryDate(Date expiryDate) {
this.expiryDate = expiryDate;
}
public void setProfitMargin(float profitMargin) {
this.profitMargin = profitMargin;
}
private void setExpiryDateAsString(String expiryDate) {
try {
this.expiryDate = DATE_FORMAT.parse(expiryDate);
} catch (ParseException e) {
throw new IllegalArgumentException("Couldn't parse the date. Accepted format is ddMMyyyy");
}
}
@Override
public Map<String, Consumer> getEditableFields() {
Map<String, Consumer> result = super.getEditableFields();
result.put("Expiry Date",
e -> this.setExpiryDateAsString(String.valueOf(e)));
return result;
}
public String toString() {
return new StringBuffer(super.toString()).append(",")
.append("Expiry Date: ").append(DATE_FORMAT.format(expiryDate))
.toString();
}
}
class Hygiene extends Product {
public Hygiene() {
this.profitMargin = 30;
}
}
private void editProduct(Product product) {
Scanner scanner = new Scanner(System.in);
for (Map.Entry<String, Consumer> field : product.getEditableFields().entrySet()) {
if (product.getCode() != null && "Code".equals(field.getKey())) {
continue;
}
System.out.print(String.format("%s: ", field.getKey()));
String value = scanner.nextLine();
field.getValue().accept(value);
}
if (stock.containsKey(product.getCode()) && stock.get(product.getCode()) != product) {
throw new IllegalArgumentException(String.format("Product with code %s already exists", product.getCode()));
}
stock.put(product.getCode(), product);
}
private void listAllProducts() {
System.out.println("All products:");
stock.values().stream()
.sorted(Comparator.comparing(Product::getDescription))
.forEach(System.out::println);
}
private void showMostExpensive() {
System.out.println("Most expensive product:");
stock.values().stream()
.sorted(Comparator.comparing(Product::getListingPrice).reversed())
.findFirst()
.ifPresent(System.out::println);
}
private void updateProduct() {
System.out.print("Enter product code: ");
Scanner scanner = new Scanner(System.in);
String code = scanner.nextLine();
Product product = stock.get(code);
if (product == null) {
throw new IllegalArgumentException(String.format("Product %s not found", code));
}
System.out.println(String.format("Editing product: %s", product));
editProduct(product);
}
private Map<String, Product> stock;
private Map<String, Runnable> options;
public Products() {
stock = new HashMap<>();
options = new LinkedHashMap<>();
options.put("0 - Exit", () -> System.exit(0));
options.put("1 - Create Medicine", () -> editProduct(new Medicine()));
options.put("2 - Create Hygiene Product", () -> editProduct(new Hygiene()));
options.put("3 - List all products", this::listAllProducts);
options.put("4 - Show most expensive", this::showMostExpensive);
options.put("5 - Update product", this::updateProduct);
}
public void mainLoop() {
Scanner scanner = new Scanner(System.in);
do {
System.out.println("Enter your option");
options.keySet().stream().forEach(System.out::println);
try {
byte option = scanner.nextByte();
if (option > options.size() - 1) {
throw new IllegalArgumentException(String.format("Option %d is invalid", option));
}
options.values().stream().skip(option).findFirst().ifPresent(e -> e.run());
} catch (Exception e) {
System.err.printf("Error: %s\n", e.getMessage());
scanner.nextLine();
}
} while (true);
}
public static void main(String... args) {
new Products().mainLoop();
}
}