170 lines
6.0 KiB
Python
170 lines
6.0 KiB
Python
from uuid import uuid4
|
|
from core.transaction import Transaction
|
|
from utils.helpers import validate_pin, parse_price
|
|
|
|
|
|
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, "Abbuchung", -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"}
|
|
if not validate_pin(pin):
|
|
return {"status": "error", "message": "Invalid PIN format"}
|
|
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"}
|
|
if pin is not None and not validate_pin(pin):
|
|
return {"status": "error", "message": "Invalid PIN format"}
|
|
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 = parse_price(str(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 = parse_price(str(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"}
|