from uuid import uuid4 from core.transaction import Transaction class Tracker: def __init__(self, data_manager) -> None: self.data_manager = data_manager self.users = {} self.items = {} self.transactions = [] self.debts = {} self._load_all_data() def _load_all_data(self): self.users = self.data_manager.load_users() self.items = self.data_manager.load_items() self.debts = self.data_manager.load_debts() self.transactions = self.data_manager.load_transactions() def add_purchase(self, user_id, item_id): if user_id not in self.users: return {"status": "error", "message": "User not found"} if item_id not in self.items: return {"status": "error", "message": "Item not found"} item = self.items[item_id] if user_id not in self.debts: self.debts[user_id] = 0.0 self.debts[user_id] += item.price transaction = Transaction(str(uuid4()), user_id, item_id, item.price) self.transactions.append(transaction) self.data_manager.save_debts(self.debts) self.data_manager.save_transactions(self.transactions) return { "status": "success", "message": f"Added {item.name} to {self.users[user_id].name}'s debt", "new_debt": self.debts[user_id], } def get_user_debt(self, user_id): return self.debts.get(user_id, 0.0) def get_all_debts(self): return { user_id: { "name": self.users[user_id].name, "debt": self.debts.get(user_id, 0.0), } for user_id in self.users } def adjust_debt(self, user_id, amount, admin_password): if not self._verify_admin(admin_password): return {"status": "error", "message": "Invalid password"} if user_id not in self.users: return {"status": "error", "message": "User not found"} if user_id not in self.debts: self.debts[user_id] = 0.0 self.debts[user_id] -= amount self.data_manager.save_debts(self.debts) from uuid import uuid4 from core.transaction import Transaction transaction = Transaction(str(uuid4()), user_id, "adjustment", -amount) self.transactions.append(transaction) self.data_manager.save_transactions(self.transactions) return { "status": "success", "message": f"Reduced debt by {amount}", "new_debt": self.debts[user_id], } def _verify_admin(self, pwd): from config import ADMIN_PASSWORD return pwd == ADMIN_PASSWORD def get_user_by_id(self, user_id): return self.users.get(user_id) def get_all_users(self): return self.users def get_items(self): return self.items def set_user_pin(self, user_id, pin): if user_id not in self.users: return {"status": "error", "message": "User not found"} self.users[user_id].pin = pin self.data_manager.save_users(self.users) return {"status": "success", "message": "PIN updated successfully"} def add_user(self, user_id, name): from core.user import User if user_id in self.users: return {"status": "error", "message": "User ID already exists"} self.users[user_id] = User(user_id, name, "4242") self.data_manager.save_users(self.users) return {"status": "success", "message": f"User {name} created successfully"} def remove_user(self, user_id): if user_id not in self.users: return {"status": "error", "message": "User not found"} name = self.users[user_id].name del self.users[user_id] if user_id in self.debts: del self.debts[user_id] self.data_manager.save_users(self.users) self.data_manager.save_debts(self.debts) return {"status": "success", "message": f"User {name} removed successfully"} def edit_user(self, user_id, name, pin=None): if user_id not in self.users: return {"status": "error", "message": "User not found"} self.users[user_id].name = name if pin is not None: self.users[user_id].pin = pin self.data_manager.save_users(self.users) return {"status": "success", "message": f"User {name} updated successfully"} def add_item(self, item_id, name, price): from core.item import Item if item_id in self.items: return {"status": "error", "message": "Item ID already exists"} try: price_val = float(price) except ValueError: return {"status": "error", "message": "Invalid price value"} self.items[item_id] = Item(item_id, name, price_val) self.data_manager.save_items(self.items) return {"status": "success", "message": f"Item {name} created successfully"} def remove_item(self, item_id): if item_id not in self.items: return {"status": "error", "message": "Item not found"} name = self.items[item_id].name del self.items[item_id] self.data_manager.save_items(self.items) return {"status": "success", "message": f"Item {name} removed successfully"} def edit_item(self, item_id, name, price): if item_id not in self.items: return {"status": "error", "message": "Item not found"} try: price_val = float(price) except ValueError: return {"status": "error", "message": "Invalid price value"} self.items[item_id].name = name self.items[item_id].price = price_val self.data_manager.save_items(self.items) return {"status": "success", "message": f"Item {name} updated successfully"}