-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLibrary.java
More file actions
80 lines (67 loc) · 2.91 KB
/
Copy pathLibrary.java
File metadata and controls
80 lines (67 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.Map;
public class Library {
private Map<String, Book> catalog = new HashMap<>();
private Map<String, Member> members = new HashMap<>();
private static final double DAILY_FINE_RATE = 2.50;
public void addBook(Book book) {
catalog.put(book.getIsbn(), book);
System.out.println("Book added to catalog: " + book.getTitle());
}
public void registerMember(Member member) {
members.put(member.getMemberId(), member);
System.out.println("Member registered: " + member.getName());
}
public boolean checkOutBook(String memberId, String isbn) {
Member member = members.get(memberId);
Book book = catalog.get(isbn);
if (member == null || book == null) {
System.out.println("Error: Invalid Member ID or ISBN.");
return false;
}
if (member.getUnpaidFines() > 10.00) {
System.out.println("Checkout blocked: Member has unpaid fines exceeding $10.00!");
return false;
}
if (!book.isAvailable()) {
System.out.println("Checkout failed: " + book.getTitle() + " is currently checked out.");
return false;
}
// Issue book for 14 days
book.setAvailable(false);
book.setDueDate(LocalDate.now().plusDays(14));
member.borrowBook(book);
System.out.printf("Success: '%s' checked out to %s. Due Date: %s%n",
book.getTitle(), member.getName(), book.getDueDate());
return true;
}
public boolean returnBook(String memberId, String isbn, LocalDate actualReturnDate) {
Member member = members.get(memberId);
Book book = catalog.get(isbn);
if (member == null || book == null || !member.getBorrowedBooks().contains(book)) {
System.out.println("Error: Return processing failed. Check details.");
return false;
}
// Calculate Overdue Fine
if (actualReturnDate.isAfter(book.getDueDate())) {
long daysOverdue = ChronoUnit.DAYS.between(book.getDueDate(), actualReturnDate);
double fine = daysOverdue * DAILY_FINE_RATE;
member.addFine(fine);
System.out.printf("OVERDUE NOTICE: Book returned %d days late. Fine of $%.2f applied to %s.%n",
daysOverdue, fine, member.getName());
}
book.setAvailable(true);
book.setDueDate(null);
member.returnBook(book);
System.out.println("Book successfully returned: " + book.getTitle());
return true;
}
public void displayCatalog() {
System.out.println("\n=== CURRENT LIBRARY CATALOG ===");
for (Book b : catalog.values()) {
System.out.println(b);
}
}
}