forked from khushe-2811/Nexus-Library-System
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommand.py
More file actions
153 lines (124 loc) · 5.11 KB
/
command.py
File metadata and controls
153 lines (124 loc) · 5.11 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# ------------ command.py ------------
from datetime import datetime, date, timedelta
from state import Available, CheckedOut, Reserved
from factory import EBook as eb, PrintedBook as pb, Audiobook as ab
class Command:
def execute(self):
pass
def undo(self):
pass
class BorrowCommand(Command):
def __init__(self, db, user_id, item_id):
self.db = db
self.user_id = user_id
self.item_id = item_id
self.previous_state = None # Only initialize once
def execute(self):
user = self.db.find_user(self.user_id)
item = self.db.find_item(self.item_id)
if not item:
print("Error: Item not found")
return False
if isinstance(item.state, Reserved) and user.role.lower() not in ["faculty", "researcher"]:
print("Item is Reserved")
return False
if not isinstance(item.state, Available) and not isinstance(item.state, Reserved):
print("Item not available")
return False
# Role-based borrowing restrictions
if user.role.lower() == "guest" and isinstance(item, eb):
pass
elif user.role.lower() == "student" and isinstance(item, (pb, eb, ab)):
pass
elif user.role.lower() == "faculty":
pass
elif user.role.lower() == "researcher":
pass
elif user.role.lower() == "professor":
pass
else:
print(f"{user.role.capitalize()} is not allowed to borrow this item type.")
return False
if not user.can_borrow():
print("You have reached borrowing limit")
return False
try:
self.previous_state = item.state
item.checkout(user)
user.borrowed_items.append(item)
self.db.command_history.append(self)
item.borrow_date = date.today()
item.due_date = item.borrow_date + timedelta(days=user.borrow_period())
self.db.log_transaction("BORROW", self.user_id, self.item_id)
return True
except Exception as e:
print(f"Error: {str(e)}")
return False
def undo(self):
user = self.db.find_user(self.user_id)
item = self.db.find_item(self.item_id)
if not user or not item:
print("Undo failed: User or item not found")
return False
if not user.can_borrow():
print("Undo failed: User reached borrowing limit")
return False
if user and item and item in user.borrowed_items:
current_state = item.state
item.state = self.previous_state
user.borrowed_items.remove(item)
return True
return False
class ReturnCommand(Command):
def __init__(self, db, user_id, item_id,return_date=None):
self.db = db
self.user_id = user_id
self.item_id = item_id
self.return_date = return_date
self.fine_amount = 0
self.previous_state = None
def execute(self):
try:
user = self.db.find_user(self.user_id)
item = self.db.find_item(self.item_id)
if not item:
print("Error: Item not found")
return False
if item not in user.borrowed_items:
print("Error: This item isn't borrowed by the user")
return False
allowed_period = user.borrow_period()
due_date = item.due_date or (item.borrow_date + timedelta(days=allowed_period))
overdue_days = (self.return_date - due_date).days
if overdue_days > 0:
self.fine_amount = overdue_days * 15
user.fines += self.fine_amount
print(f"Late fee: ₹{self.fine_amount} ({overdue_days} days overdue)")
else:
print("Book returned on time. No fine.")
self.previous_state = item.state
item.return_item()
user.borrowed_items.remove(item)
self.db.command_history.append(self)
self.db.log_transaction("RETURN", self.user_id, self.item_id)
return True
except Exception as e:
print(f"Return failed: {str(e)}")
return False
def undo(self):
try:
user = self.db.find_user(self.user_id)
item = self.db.find_item(self.item_id)
if not user or not item:
print("Undo failed: User or item not found")
return False
if not user.can_borrow():
print("Undo failed: User reached borrowing limit")
return False
current_state = item.state
item.state = self.previous_state
user.borrowed_items.append(item)
return True
except Exception as e:
print(f"Undo failed: {str(e)}")
return False