+ Implemented processFile and saveReport in ReportGenerator

+ Implemented loadProducts in main
This commit is contained in:
2026-05-20 23:28:01 +03:30
parent 8e6d1d1760
commit 3e026baf9c
2 changed files with 115 additions and 68 deletions
+14 -9
View File
@@ -15,15 +15,20 @@ public class Main {
} }
Scanner scanner = new Scanner(input); Scanner scanner = new Scanner(input);
// TODO: while (scanner.hasNextLine()){
// - Read each line from products.csv String line = scanner.nextLine();
// - For each line, parse productId, name, and price String[] values = line.split(",");
// - The format of the file is like this:
// [productId],[name],[price]
// - Store Product objects in the productCatalog ArrayList
// NOTE int productId = Integer.parseInt(values[0]);
// - The data in products.csv is guaranteed to be valid. String productName = values[1];
double productPrice = Double.parseDouble(values[2]);
Product product = new Product(productId,productName,productPrice);
productCatalog.add(product);
}
scanner.close();
} }
public static void main(String[] args) public static void main(String[] args)
@@ -43,4 +48,4 @@ public class Main {
reportGenerator.saveReport(); reportGenerator.saveReport();
System.out.println("=== Report saved as report.txt"); System.out.println("=== Report saved as report.txt");
} }
} }
+101 -59
View File
@@ -1,4 +1,11 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.ParseException;
import java.util.List; import java.util.List;
import java.util.Scanner;
public class ReportGenerator { public class ReportGenerator {
@@ -8,7 +15,7 @@ public class ReportGenerator {
private double totalFinalCost; private double totalFinalCost;
private int totalQuantity; private int totalQuantity;
private double totalDiscountValue; private double totalDiscountValue;
private int totalInvalidLines; private int totalInvalidLines = 0;
public ReportGenerator(String ordersFilePath, List<Product> productList) { public ReportGenerator(String ordersFilePath, List<Product> productList) {
this.ordersFilePath = ordersFilePath; this.ordersFilePath = ordersFilePath;
@@ -17,67 +24,102 @@ public class ReportGenerator {
public void processFile() public void processFile()
{ {
// TODO: Path path = Paths.get(ordersFilePath);
// 1. Open the order details CSV file try {
// 2. Read the file line by line Scanner scanner = new Scanner(path);
// 3. Split each line using comma delimiter while(scanner.hasNextLine()){
// (each line is guaranteed to contain exactly two commas) String line = scanner.nextLine();
// 4. Each line contains exactly 3 values in the format:
// [productId],[quantity],[discountPercent] String[] values = line.split(",");
// 5. Attempt to convert values: int productId;
// - productId -> int int quantity;
// - quantity -> int int discount;
// - discountPercent -> int
// NOTE: // Product id
// - quantity and discountPercent may contain invalid characters
// (e.g., letters instead of numbers). try{
// - If parsing any value fails (NumberFormatException), productId = Integer.parseInt(values[0]);
// the entire line must be considered invalid. if (productId <= 0 ){
// - Use try-catch blocks and exception handling to safely System.err.println("Error, invalid product id : " + productId);
// handle parsing and validation errors without stopping totalInvalidLines++;
// the processing of the remaining lines. continue;
// 6. Validate parsed values: }
// - productId must be greater than 0 }
// - quantity must be greater than 0 catch (NumberFormatException e){
// - discountPercent must be between 0 and 99 inclusive System.err.println("Error, invalid format for product id : " + values[0]);
// 7. Look for a Product in productList that matches productId totalInvalidLines++;
// 8. If no Product with that ID exists in the catalog, continue;
// the entire line is considered invalid }
// 9. If all values are valid and the product exists, calculate:
// subtotal = quantity * product price // Quantity
// discountValue = subtotal * discountPercent / 100
// finalCost = subtotal - discountValue try{
// 10. Update report totals: quantity = Integer.parseInt(values[1]);
// - totalQuantity += quantity if (quantity <= 0){
// - totalFinalCost += finalCost System.err.println("Error, invalid quantity amount : " + quantity);
// - totalDiscountValue += discountValue totalInvalidLines++;
// 11. If any parsing error, validation failure, or missing product occurs: continue;
// - increment totalInvalidLines }
// - skip the line and continue processing the next line }
// 12. Close all file resources catch (NumberFormatException e){
System.err.println("Error, invalid format for quantity : " + values[1]);
totalInvalidLines++;
continue;
}
// Discount
try {
discount = Integer.parseInt(values[2]);
if (discount < 0 || discount > 99){
System.err.println("Error, invalid discount amount : " + discount);
totalInvalidLines++;
continue;
}
}
catch (NumberFormatException e){
System.err.println("Error, invalid format for discount : " + values[2]);
totalInvalidLines++;
continue;
}
try {
Product product = productList.get(productId - 1);
double subTotal = quantity * product.getPrice();
double discountValue = subTotal * discount / 100;
double finalCost = subTotal - discountValue;
totalQuantity += quantity;
totalFinalCost += finalCost;
totalDiscountValue += discountValue;
}
catch (IndexOutOfBoundsException e){
System.err.println("Error, no such product exists with this id : " + productId);
totalInvalidLines++;
continue;
}
}
scanner.close();
} catch (IOException e) {
System.out.println("Unable to read order details.");
}
} }
public void saveReport() public void saveReport()
{ {
// TODO: try{
// 1. Build a formatted report string FileWriter fileWriter = new FileWriter("report.txt");
// 2. Include: fileWriter.write(" ========= SALES REPORT =========\n");
// - total quantity fileWriter.write("Total Quantity Sold: " + totalQuantity + "\n");
// - total final cost fileWriter.write("Total Final Cost : $" + totalFinalCost + "\n");
// - total discount value fileWriter.write("Total Discount Value : $" + totalDiscountValue + "\n");
// - total invalid lines fileWriter.write("Invalid Rows : " + totalInvalidLines + "\n");
// 3. Create/open output report file (name it report.txt) fileWriter.write("================================");
// 4. Write report string into file fileWriter.close();
// 5. Handle file writing exceptions }
// 6. Close writer resources catch (IOException e) {
System.err.println(e.getMessage());
/* Example Structure }
========= SALES REPORT =========
Total Quantity Sold: 42
Total Final Cost: $1520.75
Total Discount Value: $230.50
Invalid Rows: 3
================================
*/
} }
} }