OneCompiler

q14

163

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

public class PreviousBookingDataWithDateRange {

// Simulated database for booking details
static Map<String, List<BookingDetails>> bookingDatabase = new HashMap<>();

public static void main(String[] args) {
    // Prepopulate the database with sample booking data
    populateSampleData();

    Scanner scanner = new Scanner(System.in);

    System.out.println("Officer: Enter Customer ID to view Previous Bookings: ");
    String customerId = scanner.nextLine().trim();

    if (customerId.isEmpty()) {
        System.out.println("Error: Customer ID cannot be empty. Please provide a valid ID.");
        return;
    }

    System.out.println("Enter the start date (yyyy-mm-dd): ");
    String startDateInput = scanner.nextLine().trim();

    System.out.println("Enter the end date (yyyy-mm-dd): ");
    String endDateInput = scanner.nextLine().trim();

    try {
        LocalDate startDate = LocalDate.parse(startDateInput);
        LocalDate endDate = LocalDate.parse(endDateInput);

        // Validate date range
        if (endDate.isBefore(startDate)) {
            System.out.println("Error: End date cannot be earlier than start date.");
            return;
        }

        // Fetch and display filtered bookings
        if (bookingDatabase.containsKey(customerId)) {
            List<BookingDetails> bookings = bookingDatabase.get(customerId);

            // Filter bookings by date range
            List<BookingDetails> filteredBookings = filterBookingsByDateRange(bookings, startDate, endDate);

            if (filteredBookings.isEmpty()) {
                System.out.println("No bookings found for the specified date range.");
            } else {
                // Sort filtered bookings in descending order of booking date
                filteredBookings.sort((b1, b2) -> b2.getBookingDate().compareTo(b1.getBookingDate()));
                displayBookingDetails(filteredBookings);
            }
        } else {
            System.out.println("Error: Customer ID not found in the system. Please verify the ID.");
        }
    } catch (DateTimeParseException e) {
        System.out.println("Error: Invalid date format. Please use yyyy-mm-dd.");
    }

    scanner.close();
}

// Method to filter bookings by date range
private static List<BookingDetails> filterBookingsByDateRange(List<BookingDetails> bookings, LocalDate startDate, LocalDate endDate) {
    List<BookingDetails> filteredBookings = new ArrayList<>();
    for (BookingDetails booking : bookings) {
        if ((booking.getBookingDate().isEqual(startDate) || booking.getBookingDate().isAfter(startDate)) &&
            (booking.getBookingDate().isEqual(endDate) || booking.getBookingDate().isBefore(endDate))) {
            filteredBookings.add(booking);
        }
    }
    return filteredBookings;
}

// Method to populate sample data
private static void populateSampleData() {
    List<BookingDetails> customer1Bookings = Arrays.asList(
        new BookingDetails("CUST001", "BKG001", LocalDate.of(2024, 12, 1), "Alice Smith", "456 Elm St, Shelbyville, USA", 50.0, "Delivered"),
        new BookingDetails("CUST001", "BKG002", LocalDate.of(2024, 11, 25), "Bob Brown", "321 Oak St, Springfield, USA", 30.0, "In Transit"),
        new BookingDetails("CUST001", "BKG003", LocalDate.of(2024, 11, 20), "Charlie Davis", "789 Maple Ave, Springfield, USA", 70.0, "Booked")
    );

    List<BookingDetails> customer2Bookings = Arrays.asList(
        new BookingDetails("CUST002", "BKG004", LocalDate.of(2024, 11, 15), "David Evans", "123 Main St, Shelbyville, USA", 45.0, "Delivered"),
        new BookingDetails("CUST002", "BKG005", LocalDate.of(2024, 11, 10), "Eve Foster", "987 Birch St, Springfield, USA", 60.0, "Returned")
    );

    bookingDatabase.put("CUST001", customer1Bookings);
    bookingDatabase.put("CUST002", customer2Bookings);
}

// Method to display booking details
private static void displayBookingDetails(List<BookingDetails> bookings) {
    System.out.printf("\n%-12s %-12s %-15s %-20s %-30s %-10s %-10s\n", 
            "Customer ID", "Booking ID", "Booking Date", "Receiver Name", "Delivered Address", "Amount", "Status");
    System.out.println("---------------------------------------------------------------------------------------------------------");

    for (BookingDetails booking : bookings) {
        System.out.printf("%-12s %-12s %-15s %-20s %-30s %-10.2f %-10s\n",
            booking.getCustomerId(), booking.getBookingId(), booking.getBookingDate(),
            booking.getReceiverName(), booking.getDeliveredAddress(), 
            booking.getAmount(), booking.getStatus());
    }
}

}

// Class to represent booking details
class BookingDetails {
private String customerId;
private String bookingId;
private LocalDate bookingDate;
private String receiverName;
private String deliveredAddress;
private double amount;
private String status;

// Constructor
public BookingDetails(String customerId, String bookingId, LocalDate bookingDate, 
                      String receiverName, String deliveredAddress, 
                      double amount, String status) {
    this.customerId = customerId;
    this.bookingId = bookingId;
    this.bookingDate = bookingDate;
    this.receiverName = receiverName;
    this.deliveredAddress = deliveredAddress;
    this.amount = amount;
    this.status = status;
}

// Getters
public String getCustomerId() { return customerId; }
public String getBookingId() { return bookingId; }
public LocalDate getBookingDate() { return bookingDate; }
public String getReceiverName() { return receiverName; }
public String getDeliveredAddress() { return deliveredAddress; }
public double getAmount() { return amount; }
public String getStatus() { return status; }

}