diff --git a/Backend/src/__pycache__/__init__.cpython-312.pyc b/Backend/src/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2fb27bd0 Binary files /dev/null and b/Backend/src/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/__pycache__/main.cpython-312.pyc b/Backend/src/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..9aa33fb4 Binary files /dev/null and b/Backend/src/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/src/ai/__pycache__/__init__.cpython-312.pyc b/Backend/src/ai/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c94ce751 Binary files /dev/null and b/Backend/src/ai/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/ai/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/ai/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..f2c33a9a Binary files /dev/null and b/Backend/src/ai/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/ai/models/__pycache__/ai_conversation.cpython-312.pyc b/Backend/src/ai/models/__pycache__/ai_conversation.cpython-312.pyc new file mode 100644 index 00000000..2ebf78ea Binary files /dev/null and b/Backend/src/ai/models/__pycache__/ai_conversation.cpython-312.pyc differ diff --git a/Backend/src/ai/models/__pycache__/chat.cpython-312.pyc b/Backend/src/ai/models/__pycache__/chat.cpython-312.pyc new file mode 100644 index 00000000..d3ff04aa Binary files /dev/null and b/Backend/src/ai/models/__pycache__/chat.cpython-312.pyc differ diff --git a/Backend/src/ai/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/ai/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9f3765fe Binary files /dev/null and b/Backend/src/ai/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/ai/routes/__pycache__/ai_assistant_routes.cpython-312.pyc b/Backend/src/ai/routes/__pycache__/ai_assistant_routes.cpython-312.pyc new file mode 100644 index 00000000..127a01ca Binary files /dev/null and b/Backend/src/ai/routes/__pycache__/ai_assistant_routes.cpython-312.pyc differ diff --git a/Backend/src/ai/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/ai/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d5f3c54e Binary files /dev/null and b/Backend/src/ai/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/ai/services/__pycache__/ai_assistant_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_assistant_service.cpython-312.pyc new file mode 100644 index 00000000..86b15cec Binary files /dev/null and b/Backend/src/ai/services/__pycache__/ai_assistant_service.cpython-312.pyc differ diff --git a/Backend/src/ai/services/__pycache__/ai_chat_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_chat_service.cpython-312.pyc new file mode 100644 index 00000000..4c5c54e9 Binary files /dev/null and b/Backend/src/ai/services/__pycache__/ai_chat_service.cpython-312.pyc differ diff --git a/Backend/src/ai/services/__pycache__/ai_knowledge_base.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_knowledge_base.cpython-312.pyc new file mode 100644 index 00000000..019189ac Binary files /dev/null and b/Backend/src/ai/services/__pycache__/ai_knowledge_base.cpython-312.pyc differ diff --git a/Backend/src/ai/services/__pycache__/ai_learning_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_learning_service.cpython-312.pyc new file mode 100644 index 00000000..c4aaf45e Binary files /dev/null and b/Backend/src/ai/services/__pycache__/ai_learning_service.cpython-312.pyc differ diff --git a/Backend/src/ai/services/__pycache__/ai_role_access_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_role_access_service.cpython-312.pyc new file mode 100644 index 00000000..2ff6bc95 Binary files /dev/null and b/Backend/src/ai/services/__pycache__/ai_role_access_service.cpython-312.pyc differ diff --git a/Backend/src/ai/services/__pycache__/ai_training_scheduler.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_training_scheduler.cpython-312.pyc new file mode 100644 index 00000000..fd4b1bf2 Binary files /dev/null and b/Backend/src/ai/services/__pycache__/ai_training_scheduler.cpython-312.pyc differ diff --git a/Backend/src/analytics/__pycache__/__init__.cpython-312.pyc b/Backend/src/analytics/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ef97dbfe Binary files /dev/null and b/Backend/src/analytics/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/analytics/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/analytics/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..79f48225 Binary files /dev/null and b/Backend/src/analytics/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/analytics/models/__pycache__/audit_log.cpython-312.pyc b/Backend/src/analytics/models/__pycache__/audit_log.cpython-312.pyc new file mode 100644 index 00000000..e07e4bb6 Binary files /dev/null and b/Backend/src/analytics/models/__pycache__/audit_log.cpython-312.pyc differ diff --git a/Backend/src/analytics/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/analytics/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..167a899a Binary files /dev/null and b/Backend/src/analytics/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/analytics/routes/__pycache__/analytics_routes.cpython-312.pyc b/Backend/src/analytics/routes/__pycache__/analytics_routes.cpython-312.pyc new file mode 100644 index 00000000..af7ad46c Binary files /dev/null and b/Backend/src/analytics/routes/__pycache__/analytics_routes.cpython-312.pyc differ diff --git a/Backend/src/analytics/routes/__pycache__/audit_routes.cpython-312.pyc b/Backend/src/analytics/routes/__pycache__/audit_routes.cpython-312.pyc new file mode 100644 index 00000000..f32acac8 Binary files /dev/null and b/Backend/src/analytics/routes/__pycache__/audit_routes.cpython-312.pyc differ diff --git a/Backend/src/analytics/routes/__pycache__/report_routes.cpython-312.pyc b/Backend/src/analytics/routes/__pycache__/report_routes.cpython-312.pyc new file mode 100644 index 00000000..ec5d350d Binary files /dev/null and b/Backend/src/analytics/routes/__pycache__/report_routes.cpython-312.pyc differ diff --git a/Backend/src/analytics/routes/report_routes.py b/Backend/src/analytics/routes/report_routes.py index 1adda9ed..535e8752 100644 --- a/Backend/src/analytics/routes/report_routes.py +++ b/Backend/src/analytics/routes/report_routes.py @@ -1,8 +1,10 @@ -from fastapi import APIRouter, Depends, HTTPException, status, Query +from fastapi import APIRouter, Depends, HTTPException, status, Query, Response from sqlalchemy.orm import Session, load_only, joinedload from sqlalchemy import func, and_ from typing import Optional from datetime import datetime, timedelta +import csv +import io from ...shared.config.database import get_db from ...security.middleware.auth import get_current_user, authorize_roles from ...auth.models.user import User @@ -164,15 +166,26 @@ async def get_customer_dashboard_stats(current_user: User=Depends(get_current_us raise HTTPException(status_code=500, detail=str(e)) @router.get('/revenue') -async def get_revenue_report(start_date: Optional[str]=Query(None), end_date: Optional[str]=Query(None), current_user: User=Depends(authorize_roles('admin', 'staff', 'accountant')), db: Session=Depends(get_db)): +async def get_revenue_report( + start_date: Optional[str]=Query(None), + end_date: Optional[str]=Query(None), + format: Optional[str]=Query('json', regex='^(json|csv)$'), + current_user: User=Depends(authorize_roles('admin', 'staff', 'accountant')), + db: Session=Depends(get_db) +): try: query = db.query(Payment).filter(Payment.payment_status == PaymentStatus.completed) if start_date: start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) query = query.filter(Payment.payment_date >= start) + else: + start = datetime.utcnow() - timedelta(days=30) if end_date: end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) query = query.filter(Payment.payment_date <= end) + else: + end = datetime.utcnow() + total_revenue = db.query(func.sum(Payment.amount)).filter(Payment.payment_status == PaymentStatus.completed).scalar() or 0.0 revenue_by_method = db.query(Payment.payment_method, func.sum(Payment.amount).label('total')).filter(Payment.payment_status == PaymentStatus.completed).group_by(Payment.payment_method).all() method_breakdown = {} @@ -181,6 +194,147 @@ async def get_revenue_report(start_date: Optional[str]=Query(None), end_date: Op method_breakdown[method_name] = float(total or 0) daily_revenue = db.query(func.date(Payment.payment_date).label('date'), func.sum(Payment.amount).label('total')).filter(Payment.payment_status == PaymentStatus.completed).group_by(func.date(Payment.payment_date)).order_by(func.date(Payment.payment_date).desc()).limit(30).all() daily_breakdown = [{'date': date.isoformat() if isinstance(date, datetime) else str(date), 'revenue': float(total or 0)} for date, total in daily_revenue] + + if format == 'csv': + # Generate CSV + output = io.StringIO() + writer = csv.writer(output) + writer.writerow(['Revenue Report']) + writer.writerow(['Period', f'{start.strftime("%Y-%m-%d")} to {end.strftime("%Y-%m-%d")}']) + writer.writerow(['Total Revenue', f'{total_revenue:.2f}']) + writer.writerow([]) + writer.writerow(['Revenue by Payment Method']) + writer.writerow(['Method', 'Amount']) + for method, amount in method_breakdown.items(): + writer.writerow([method, f'{amount:.2f}']) + writer.writerow([]) + writer.writerow(['Daily Revenue']) + writer.writerow(['Date', 'Revenue']) + for day in daily_breakdown: + writer.writerow([day['date'], f"{day['revenue']:.2f}"]) + + return Response( + content=output.getvalue(), + media_type='text/csv', + headers={ + 'Content-Disposition': f'attachment; filename="revenue_report_{start.strftime("%Y%m%d")}_{end.strftime("%Y%m%d")}.csv"' + } + ) + return success_response(data={'total_revenue': float(total_revenue), 'revenue_by_method': method_breakdown, 'daily_breakdown': daily_breakdown}) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get('/export') +async def export_reports( + start_date: Optional[str]=Query(None), + end_date: Optional[str]=Query(None), + format: Optional[str]=Query('csv', regex='^(csv|json)$'), + current_user: User=Depends(authorize_roles('admin', 'staff', 'accountant')), + db: Session=Depends(get_db) +): + """Export comprehensive reports in CSV or JSON format.""" + try: + if start_date: + start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) + else: + start = datetime.utcnow() - timedelta(days=30) + + if end_date: + end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) + else: + end = datetime.utcnow() + + # Get bookings data + bookings = db.query(Booking).filter( + and_( + Booking.created_at >= start, + Booking.created_at <= end + ) + ).all() + + # Get payments data + payments = db.query(Payment).filter( + and_( + Payment.created_at >= start, + Payment.created_at <= end + ) + ).all() + + if format == 'csv': + output = io.StringIO() + writer = csv.writer(output) + + # Bookings section + writer.writerow(['Bookings Report']) + writer.writerow(['Period', f'{start.strftime("%Y-%m-%d")} to {end.strftime("%Y-%m-%d")}']) + writer.writerow([]) + writer.writerow(['Booking ID', 'Booking Number', 'User ID', 'Room ID', 'Check In', 'Check Out', 'Status', 'Total Price', 'Created At']) + for booking in bookings: + writer.writerow([ + booking.id, + booking.booking_number, + booking.user_id, + booking.room_id, + booking.check_in_date.strftime('%Y-%m-%d') if booking.check_in_date else '', + booking.check_out_date.strftime('%Y-%m-%d') if booking.check_out_date else '', + booking.status.value if hasattr(booking.status, 'value') else str(booking.status), + float(booking.total_price) if booking.total_price else 0.0, + booking.created_at.isoformat() if booking.created_at else '' + ]) + + writer.writerow([]) + writer.writerow(['Payments Report']) + writer.writerow(['Payment ID', 'Booking ID', 'Amount', 'Payment Method', 'Payment Type', 'Status', 'Transaction ID', 'Payment Date', 'Created At']) + for payment in payments: + writer.writerow([ + payment.id, + payment.booking_id, + float(payment.amount) if payment.amount else 0.0, + payment.payment_method.value if hasattr(payment.payment_method, 'value') else str(payment.payment_method), + payment.payment_type.value if hasattr(payment.payment_type, 'value') else str(payment.payment_type), + payment.payment_status.value if hasattr(payment.payment_status, 'value') else str(payment.payment_status), + payment.transaction_id or '', + payment.payment_date.isoformat() if payment.payment_date else '', + payment.created_at.isoformat() if payment.created_at else '' + ]) + + return Response( + content=output.getvalue(), + media_type='text/csv', + headers={ + 'Content-Disposition': f'attachment; filename="reports_export_{start.strftime("%Y%m%d")}_{end.strftime("%Y%m%d")}.csv"' + } + ) + + # JSON format + return success_response(data={ + 'period': { + 'start_date': start.isoformat(), + 'end_date': end.isoformat() + }, + 'bookings': [{ + 'id': b.id, + 'booking_number': b.booking_number, + 'user_id': b.user_id, + 'room_id': b.room_id, + 'check_in_date': b.check_in_date.isoformat() if b.check_in_date else None, + 'check_out_date': b.check_out_date.isoformat() if b.check_out_date else None, + 'status': b.status.value if hasattr(b.status, 'value') else str(b.status), + 'total_price': float(b.total_price) if b.total_price else 0.0, + 'created_at': b.created_at.isoformat() if b.created_at else None + } for b in bookings], + 'payments': [{ + 'id': p.id, + 'booking_id': p.booking_id, + 'amount': float(p.amount) if p.amount else 0.0, + 'payment_method': p.payment_method.value if hasattr(p.payment_method, 'value') else str(p.payment_method), + 'payment_type': p.payment_type.value if hasattr(p.payment_type, 'value') else str(p.payment_type), + 'payment_status': p.payment_status.value if hasattr(p.payment_status, 'value') else str(p.payment_status), + 'transaction_id': p.transaction_id, + 'payment_date': p.payment_date.isoformat() if p.payment_date else None, + 'created_at': p.created_at.isoformat() if p.created_at else None + } for p in payments] + }) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file diff --git a/Backend/src/analytics/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/analytics/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..75632ca4 Binary files /dev/null and b/Backend/src/analytics/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/analytics/services/__pycache__/analytics_service.cpython-312.pyc b/Backend/src/analytics/services/__pycache__/analytics_service.cpython-312.pyc new file mode 100644 index 00000000..4ef2b2fe Binary files /dev/null and b/Backend/src/analytics/services/__pycache__/analytics_service.cpython-312.pyc differ diff --git a/Backend/src/analytics/services/__pycache__/audit_service.cpython-312.pyc b/Backend/src/analytics/services/__pycache__/audit_service.cpython-312.pyc new file mode 100644 index 00000000..ec72cb78 Binary files /dev/null and b/Backend/src/analytics/services/__pycache__/audit_service.cpython-312.pyc differ diff --git a/Backend/src/auth/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c416a74c Binary files /dev/null and b/Backend/src/auth/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/auth/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..423d60ea Binary files /dev/null and b/Backend/src/auth/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/auth/models/__pycache__/password_reset_token.cpython-312.pyc b/Backend/src/auth/models/__pycache__/password_reset_token.cpython-312.pyc new file mode 100644 index 00000000..ee709746 Binary files /dev/null and b/Backend/src/auth/models/__pycache__/password_reset_token.cpython-312.pyc differ diff --git a/Backend/src/auth/models/__pycache__/refresh_token.cpython-312.pyc b/Backend/src/auth/models/__pycache__/refresh_token.cpython-312.pyc new file mode 100644 index 00000000..cd3e30ce Binary files /dev/null and b/Backend/src/auth/models/__pycache__/refresh_token.cpython-312.pyc differ diff --git a/Backend/src/auth/models/__pycache__/role.cpython-312.pyc b/Backend/src/auth/models/__pycache__/role.cpython-312.pyc new file mode 100644 index 00000000..00c502df Binary files /dev/null and b/Backend/src/auth/models/__pycache__/role.cpython-312.pyc differ diff --git a/Backend/src/auth/models/__pycache__/user.cpython-312.pyc b/Backend/src/auth/models/__pycache__/user.cpython-312.pyc new file mode 100644 index 00000000..dcf5d51f Binary files /dev/null and b/Backend/src/auth/models/__pycache__/user.cpython-312.pyc differ diff --git a/Backend/src/auth/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9d3fae39 Binary files /dev/null and b/Backend/src/auth/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/auth/routes/__pycache__/auth_routes.cpython-312.pyc b/Backend/src/auth/routes/__pycache__/auth_routes.cpython-312.pyc new file mode 100644 index 00000000..6d613b2f Binary files /dev/null and b/Backend/src/auth/routes/__pycache__/auth_routes.cpython-312.pyc differ diff --git a/Backend/src/auth/routes/__pycache__/user_routes.cpython-312.pyc b/Backend/src/auth/routes/__pycache__/user_routes.cpython-312.pyc new file mode 100644 index 00000000..7bcf76b0 Binary files /dev/null and b/Backend/src/auth/routes/__pycache__/user_routes.cpython-312.pyc differ diff --git a/Backend/src/auth/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..a3b2691c Binary files /dev/null and b/Backend/src/auth/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/auth/schemas/__pycache__/auth.cpython-312.pyc b/Backend/src/auth/schemas/__pycache__/auth.cpython-312.pyc new file mode 100644 index 00000000..4d28c292 Binary files /dev/null and b/Backend/src/auth/schemas/__pycache__/auth.cpython-312.pyc differ diff --git a/Backend/src/auth/schemas/__pycache__/user.cpython-312.pyc b/Backend/src/auth/schemas/__pycache__/user.cpython-312.pyc new file mode 100644 index 00000000..45d9fead Binary files /dev/null and b/Backend/src/auth/schemas/__pycache__/user.cpython-312.pyc differ diff --git a/Backend/src/auth/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c7203fab Binary files /dev/null and b/Backend/src/auth/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/auth/services/__pycache__/auth_service.cpython-312.pyc b/Backend/src/auth/services/__pycache__/auth_service.cpython-312.pyc new file mode 100644 index 00000000..55e62376 Binary files /dev/null and b/Backend/src/auth/services/__pycache__/auth_service.cpython-312.pyc differ diff --git a/Backend/src/auth/services/__pycache__/mfa_service.cpython-312.pyc b/Backend/src/auth/services/__pycache__/mfa_service.cpython-312.pyc new file mode 100644 index 00000000..702da748 Binary files /dev/null and b/Backend/src/auth/services/__pycache__/mfa_service.cpython-312.pyc differ diff --git a/Backend/src/auth/services/__pycache__/oauth_service.cpython-312.pyc b/Backend/src/auth/services/__pycache__/oauth_service.cpython-312.pyc new file mode 100644 index 00000000..0ec25732 Binary files /dev/null and b/Backend/src/auth/services/__pycache__/oauth_service.cpython-312.pyc differ diff --git a/Backend/src/bookings/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7a64eda0 Binary files /dev/null and b/Backend/src/bookings/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/bookings/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3cef58bd Binary files /dev/null and b/Backend/src/bookings/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/bookings/models/__pycache__/booking.cpython-312.pyc b/Backend/src/bookings/models/__pycache__/booking.cpython-312.pyc new file mode 100644 index 00000000..3492f990 Binary files /dev/null and b/Backend/src/bookings/models/__pycache__/booking.cpython-312.pyc differ diff --git a/Backend/src/bookings/models/__pycache__/checkin_checkout.cpython-312.pyc b/Backend/src/bookings/models/__pycache__/checkin_checkout.cpython-312.pyc new file mode 100644 index 00000000..e592231d Binary files /dev/null and b/Backend/src/bookings/models/__pycache__/checkin_checkout.cpython-312.pyc differ diff --git a/Backend/src/bookings/models/__pycache__/group_booking.cpython-312.pyc b/Backend/src/bookings/models/__pycache__/group_booking.cpython-312.pyc new file mode 100644 index 00000000..5fc4f96b Binary files /dev/null and b/Backend/src/bookings/models/__pycache__/group_booking.cpython-312.pyc differ diff --git a/Backend/src/bookings/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c203a0e2 Binary files /dev/null and b/Backend/src/bookings/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/bookings/routes/__pycache__/booking_routes.cpython-312.pyc b/Backend/src/bookings/routes/__pycache__/booking_routes.cpython-312.pyc new file mode 100644 index 00000000..c2754009 Binary files /dev/null and b/Backend/src/bookings/routes/__pycache__/booking_routes.cpython-312.pyc differ diff --git a/Backend/src/bookings/routes/__pycache__/group_booking_routes.cpython-312.pyc b/Backend/src/bookings/routes/__pycache__/group_booking_routes.cpython-312.pyc new file mode 100644 index 00000000..a7dc3927 Binary files /dev/null and b/Backend/src/bookings/routes/__pycache__/group_booking_routes.cpython-312.pyc differ diff --git a/Backend/src/bookings/routes/booking_routes.py b/Backend/src/bookings/routes/booking_routes.py index 39dc9861..c3955ad1 100644 --- a/Backend/src/bookings/routes/booking_routes.py +++ b/Backend/src/bookings/routes/booking_routes.py @@ -1,6 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session, joinedload, selectinload, load_only from sqlalchemy import and_, or_, func +from sqlalchemy.exc import IntegrityError from typing import Optional from datetime import datetime import random @@ -25,6 +26,7 @@ from ...loyalty.services.loyalty_service import LoyaltyService from ...shared.utils.currency_helpers import get_currency_symbol from ...shared.utils.response_helpers import success_response from ..schemas.booking import CreateBookingRequest, UpdateBookingRequest +from ..schemas.admin_booking import AdminCreateBookingRequest router = APIRouter(prefix='/bookings', tags=['bookings']) def _generate_invoice_email_html(invoice: dict, is_proforma: bool=False) -> str: @@ -176,9 +178,13 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= role = db.query(Role).filter(Role.id == current_user.role_id).first() if role and role.name in ['admin', 'staff', 'accountant']: raise HTTPException(status_code=403, detail='Admin, staff, and accountant users cannot create bookings') + + import logging + logger = logging.getLogger(__name__) + + # Start transaction + transaction = db.begin() try: - import logging - logger = logging.getLogger(__name__) logger.info(f'Received booking request from user {current_user.id}: {booking_data.dict()}') # Extract validated data from Pydantic model @@ -194,8 +200,10 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= services = booking_data.services or [] invoice_info = booking_data.invoice_info.dict() if booking_data.invoice_info else {} - room = db.query(Room).filter(Room.id == room_id).first() + # Lock room row to prevent race conditions (SELECT FOR UPDATE) + room = db.query(Room).filter(Room.id == room_id).with_for_update().first() if not room: + transaction.rollback() raise HTTPException(status_code=404, detail='Room not found') # Parse dates (schema validation already ensures format is valid) @@ -210,9 +218,20 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= # Date validation already done in schema, but keeping as safety check if check_in >= check_out: + transaction.rollback() raise HTTPException(status_code=400, detail='Check-out date must be after check-in date') - overlapping = db.query(Booking).filter(and_(Booking.room_id == room_id, Booking.status != BookingStatus.cancelled, Booking.check_in_date < check_out, Booking.check_out_date > check_in)).first() + + # Check for overlapping bookings with row-level locking to prevent race conditions + overlapping = db.query(Booking).filter( + and_( + Booking.room_id == room_id, + Booking.status != BookingStatus.cancelled, + Booking.check_in_date < check_out, + Booking.check_out_date > check_in + ) + ).with_for_update().first() if overlapping: + transaction.rollback() raise HTTPException(status_code=409, detail='Room already booked for the selected dates') # Check for maintenance blocks @@ -370,19 +389,20 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= total_price = unit_price * quantity service_usage = ServiceUsage(booking_id=booking.id, service_id=service_id, quantity=quantity, unit_price=unit_price, total_price=total_price) db.add(service_usage) - db.commit() + + # Commit transaction - all database operations are atomic + transaction.commit() db.refresh(booking) - # Send booking confirmation notification + # Send booking confirmation notification (outside transaction) try: from ...notifications.services.notification_service import NotificationService if booking.status == BookingStatus.confirmed: NotificationService.send_booking_confirmation(db, booking) except Exception as e: - import logging - logger = logging.getLogger(__name__) logger.warning(f'Failed to send booking confirmation notification: {e}') + # Create invoice (outside transaction to avoid nested transaction issues) try: from ...payments.services.invoice_service import InvoiceService from ...shared.utils.mailer import send_email @@ -486,8 +506,17 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= message = f'Booking created. Please pay {deposit_percentage}% deposit to confirm.' if requires_deposit else 'Booking created successfully' return success_response(data={'booking': booking_dict}, message=message) except HTTPException: + if 'transaction' in locals(): + transaction.rollback() raise + except IntegrityError as e: + transaction.rollback() + logger.error(f'Database integrity error during booking creation: {str(e)}') + raise HTTPException(status_code=409, detail='Booking conflict detected. Please try again.') except Exception as e: + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Error creating booking: {str(e)}', exc_info=True) import logging import traceback logger = logging.getLogger(__name__) @@ -745,7 +774,14 @@ async def update_booking(id: int, booking_data: UpdateBookingRequest, current_us if booking_data.notes is not None: booking.special_requests = booking_data.notes + # Restrict staff from modifying booking prices (only admin can) if booking_data.total_price is not None: + from ...shared.utils.role_helpers import is_admin + if not is_admin(current_user, db): + raise HTTPException( + status_code=403, + detail='Staff members cannot modify booking prices. Please contact an administrator.' + ) booking.total_price = booking_data.total_price db.commit() @@ -908,60 +944,44 @@ async def check_booking_by_number(booking_number: str, db: Session=Depends(get_d raise HTTPException(status_code=500, detail=str(e)) @router.post('/admin-create', dependencies=[Depends(authorize_roles('admin', 'staff'))]) -async def admin_create_booking(booking_data: dict, current_user: User=Depends(authorize_roles('admin', 'staff')), db: Session=Depends(get_db)): +async def admin_create_booking(booking_data: AdminCreateBookingRequest, current_user: User=Depends(authorize_roles('admin', 'staff')), db: Session=Depends(get_db)): """Create a booking on behalf of a user (admin/staff only)""" + import logging + logger = logging.getLogger(__name__) + + # Start transaction + transaction = db.begin() try: - import logging - logger = logging.getLogger(__name__) - if not isinstance(booking_data, dict): - logger.error(f'Invalid booking_data type: {type(booking_data)}, value: {booking_data}') - raise HTTPException(status_code=400, detail='Invalid request body. Expected JSON object.') - - # Get user_id from booking_data (required for admin/staff bookings) - user_id = booking_data.get('user_id') - if not user_id: - raise HTTPException(status_code=400, detail='user_id is required for admin/staff bookings') + # Extract validated data from Pydantic model + user_id = booking_data.user_id + room_id = booking_data.room_id + check_in_date = booking_data.check_in_date + check_out_date = booking_data.check_out_date + total_price = booking_data.total_price + guest_count = booking_data.guest_count + notes = booking_data.notes + payment_method = booking_data.payment_method + payment_status = booking_data.payment_status + promotion_code = booking_data.promotion_code + status = booking_data.status + services = booking_data.services or [] + invoice_info = booking_data.invoice_info.dict() if booking_data.invoice_info else {} # Verify user exists target_user = db.query(User).filter(User.id == user_id).first() if not target_user: + transaction.rollback() raise HTTPException(status_code=404, detail='User not found') - logger.info(f'Admin/Staff {current_user.id} creating booking for user {user_id}: {booking_data}') + logger.info(f'Admin/Staff {current_user.id} creating booking for user {user_id}') - room_id = booking_data.get('room_id') - check_in_date = booking_data.get('check_in_date') - check_out_date = booking_data.get('check_out_date') - total_price = booking_data.get('total_price') - guest_count = booking_data.get('guest_count', 1) - if guest_count < 1 or guest_count > 20: - raise HTTPException(status_code=400, detail='Guest count must be between 1 and 20') - notes = booking_data.get('notes') - payment_method = booking_data.get('payment_method', 'cash') - payment_status = booking_data.get('payment_status', 'unpaid') # 'full', 'deposit', or 'unpaid' - promotion_code = booking_data.get('promotion_code') - status = booking_data.get('status', 'confirmed') # Default to confirmed for admin bookings - invoice_info = booking_data.get('invoice_info', {}) - - missing_fields = [] - if not room_id: - missing_fields.append('room_id') - if not check_in_date: - missing_fields.append('check_in_date') - if not check_out_date: - missing_fields.append('check_out_date') - if total_price is None: - missing_fields.append('total_price') - if missing_fields: - error_msg = f'Missing required booking fields: {', '.join(missing_fields)}' - logger.error(error_msg) - raise HTTPException(status_code=400, detail=error_msg) - - room = db.query(Room).filter(Room.id == room_id).first() + # Lock room row to prevent race conditions + room = db.query(Room).filter(Room.id == room_id).with_for_update().first() if not room: + transaction.rollback() raise HTTPException(status_code=404, detail='Room not found') - # Parse dates + # Parse dates (already validated by Pydantic) if 'T' in check_in_date or 'Z' in check_in_date or '+' in check_in_date: check_in = datetime.fromisoformat(check_in_date.replace('Z', '+00:00')) else: @@ -971,11 +991,7 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au else: check_out = datetime.strptime(check_out_date, '%Y-%m-%d') - # Validate dates - if check_in >= check_out: - raise HTTPException(status_code=400, detail='Check-out date must be after check-in date') - - # Check for overlapping bookings + # Check for overlapping bookings with row-level locking overlapping = db.query(Booking).filter( and_( Booking.room_id == room_id, @@ -983,8 +999,9 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au Booking.check_in_date < check_out, Booking.check_out_date > check_in ) - ).first() + ).with_for_update().first() if overlapping: + transaction.rollback() raise HTTPException(status_code=409, detail='Room already booked for the selected dates') booking_number = generate_booking_number() @@ -996,17 +1013,15 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au room_total = room_price * number_of_nights # Calculate services total if any - services = booking_data.get('services', []) services_total = 0.0 if services: from ...hotel_services.models.service import Service for service_item in services: - service_id = service_item.get('service_id') - quantity = service_item.get('quantity', 1) - if service_id: - service = db.query(Service).filter(Service.id == service_id).first() - if service and service.is_active: - services_total += float(service.price) * quantity + service_id = service_item.service_id + quantity = service_item.quantity + service = db.query(Service).filter(Service.id == service_id).first() + if service and service.is_active: + services_total += float(service.price) * quantity original_price = room_total + services_total @@ -1181,10 +1196,8 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au if services: from ...hotel_services.models.service import Service for service_item in services: - service_id = service_item.get('service_id') - quantity = service_item.get('quantity', 1) - if not service_id: - continue + service_id = service_item.service_id + quantity = service_item.quantity service = db.query(Service).filter(Service.id == service_id).first() if not service or not service.is_active: continue @@ -1199,7 +1212,8 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au ) db.add(service_usage) - db.commit() + # Commit transaction + transaction.commit() db.refresh(booking) # Load booking with relationships @@ -1305,12 +1319,16 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au message=f'Booking created successfully by {current_user.full_name}' ) except HTTPException: + if 'transaction' in locals(): + transaction.rollback() raise + except IntegrityError as e: + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Database integrity error during admin booking creation: {str(e)}') + raise HTTPException(status_code=409, detail='Booking conflict detected. Please try again.') except Exception as e: - import logging - import traceback - logger = logging.getLogger(__name__) - logger.error(f'Error creating booking (admin/staff): {str(e)}') - logger.error(f'Traceback: {traceback.format_exc()}') - db.rollback() - raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Error creating booking (admin/staff): {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while creating the booking') \ No newline at end of file diff --git a/Backend/src/bookings/schemas/__init__.py b/Backend/src/bookings/schemas/__init__.py index e69de29b..c9e62147 100644 --- a/Backend/src/bookings/schemas/__init__.py +++ b/Backend/src/bookings/schemas/__init__.py @@ -0,0 +1,9 @@ +from .booking import CreateBookingRequest, UpdateBookingRequest +from .admin_booking import AdminCreateBookingRequest + +__all__ = [ + 'CreateBookingRequest', + 'UpdateBookingRequest', + 'AdminCreateBookingRequest', +] + diff --git a/Backend/src/bookings/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c37c7b96 Binary files /dev/null and b/Backend/src/bookings/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/bookings/schemas/__pycache__/admin_booking.cpython-312.pyc b/Backend/src/bookings/schemas/__pycache__/admin_booking.cpython-312.pyc new file mode 100644 index 00000000..323c197c Binary files /dev/null and b/Backend/src/bookings/schemas/__pycache__/admin_booking.cpython-312.pyc differ diff --git a/Backend/src/bookings/schemas/__pycache__/booking.cpython-312.pyc b/Backend/src/bookings/schemas/__pycache__/booking.cpython-312.pyc new file mode 100644 index 00000000..355324fb Binary files /dev/null and b/Backend/src/bookings/schemas/__pycache__/booking.cpython-312.pyc differ diff --git a/Backend/src/bookings/schemas/admin_booking.py b/Backend/src/bookings/schemas/admin_booking.py new file mode 100644 index 00000000..8e00c3bb --- /dev/null +++ b/Backend/src/bookings/schemas/admin_booking.py @@ -0,0 +1,92 @@ +""" +Pydantic schemas for admin/staff booking creation. +""" +from pydantic import BaseModel, Field, field_validator, model_validator +from typing import Optional, List +from datetime import datetime +from .booking import ServiceItemSchema, InvoiceInfoSchema + + +class AdminCreateBookingRequest(BaseModel): + """Schema for admin/staff creating a booking on behalf of a user.""" + user_id: int = Field(..., gt=0, description="User ID for whom the booking is created") + room_id: int = Field(..., gt=0, description="Room ID") + check_in_date: str = Field(..., description="Check-in date (YYYY-MM-DD or ISO format)") + check_out_date: str = Field(..., description="Check-out date (YYYY-MM-DD or ISO format)") + total_price: float = Field(..., gt=0, description="Total booking price") + guest_count: int = Field(1, gt=0, le=20, description="Number of guests") + notes: Optional[str] = Field(None, max_length=1000, description="Special requests/notes") + payment_method: str = Field("cash", description="Payment method (cash, stripe, paypal)") + payment_status: str = Field("unpaid", description="Payment status (unpaid, full, deposit)") + promotion_code: Optional[str] = Field(None, max_length=50) + status: str = Field("confirmed", description="Booking status (pending, confirmed, etc.)") + services: Optional[List[ServiceItemSchema]] = Field(default_factory=list) + invoice_info: Optional[InvoiceInfoSchema] = None + + @field_validator('check_in_date', 'check_out_date') + @classmethod + def validate_date_format(cls, v: str) -> str: + """Validate date format.""" + try: + if 'T' in v or 'Z' in v or '+' in v: + datetime.fromisoformat(v.replace('Z', '+00:00')) + else: + datetime.strptime(v, '%Y-%m-%d') + return v + except (ValueError, TypeError): + raise ValueError('Invalid date format. Use YYYY-MM-DD or ISO format.') + + @field_validator('payment_method') + @classmethod + def validate_payment_method(cls, v: str) -> str: + """Validate payment method.""" + allowed_methods = ['cash', 'stripe', 'paypal', 'borica'] + if v not in allowed_methods: + raise ValueError(f'Payment method must be one of: {", ".join(allowed_methods)}') + return v + + @field_validator('payment_status') + @classmethod + def validate_payment_status(cls, v: str) -> str: + """Validate payment status.""" + allowed_statuses = ['unpaid', 'full', 'deposit'] + if v not in allowed_statuses: + raise ValueError(f'Payment status must be one of: {", ".join(allowed_statuses)}') + return v + + @field_validator('status') + @classmethod + def validate_status(cls, v: str) -> str: + """Validate booking status.""" + allowed_statuses = ['pending', 'confirmed', 'checked_in', 'checked_out', 'cancelled'] + if v not in allowed_statuses: + raise ValueError(f'Status must be one of: {", ".join(allowed_statuses)}') + return v + + @model_validator(mode='after') + def validate_dates(self): + """Validate that check-out is after check-in.""" + check_in = self.check_in_date + check_out = self.check_out_date + + if check_in and check_out: + try: + if 'T' in check_in or 'Z' in check_in or '+' in check_in: + check_in_dt = datetime.fromisoformat(check_in.replace('Z', '+00:00')) + else: + check_in_dt = datetime.strptime(check_in, '%Y-%m-%d') + + if 'T' in check_out or 'Z' in check_out or '+' in check_out: + check_out_dt = datetime.fromisoformat(check_out.replace('Z', '+00:00')) + else: + check_out_dt = datetime.strptime(check_out, '%Y-%m-%d') + + if check_in_dt >= check_out_dt: + raise ValueError('Check-out date must be after check-in date') + except (ValueError, TypeError) as e: + if 'Check-out date' in str(e): + raise + raise ValueError('Invalid date format') + + return self + diff --git a/Backend/src/bookings/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..a09bd7b3 Binary files /dev/null and b/Backend/src/bookings/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/bookings/services/__pycache__/group_booking_service.cpython-312.pyc b/Backend/src/bookings/services/__pycache__/group_booking_service.cpython-312.pyc new file mode 100644 index 00000000..a2587e92 Binary files /dev/null and b/Backend/src/bookings/services/__pycache__/group_booking_service.cpython-312.pyc differ diff --git a/Backend/src/content/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..897554ea Binary files /dev/null and b/Backend/src/content/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/content/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..e850999f Binary files /dev/null and b/Backend/src/content/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/content/models/__pycache__/banner.cpython-312.pyc b/Backend/src/content/models/__pycache__/banner.cpython-312.pyc new file mode 100644 index 00000000..bb7b6a3d Binary files /dev/null and b/Backend/src/content/models/__pycache__/banner.cpython-312.pyc differ diff --git a/Backend/src/content/models/__pycache__/blog.cpython-312.pyc b/Backend/src/content/models/__pycache__/blog.cpython-312.pyc new file mode 100644 index 00000000..3819401e Binary files /dev/null and b/Backend/src/content/models/__pycache__/blog.cpython-312.pyc differ diff --git a/Backend/src/content/models/__pycache__/cookie_integration_config.cpython-312.pyc b/Backend/src/content/models/__pycache__/cookie_integration_config.cpython-312.pyc new file mode 100644 index 00000000..f09cce18 Binary files /dev/null and b/Backend/src/content/models/__pycache__/cookie_integration_config.cpython-312.pyc differ diff --git a/Backend/src/content/models/__pycache__/cookie_policy.cpython-312.pyc b/Backend/src/content/models/__pycache__/cookie_policy.cpython-312.pyc new file mode 100644 index 00000000..0c3250ab Binary files /dev/null and b/Backend/src/content/models/__pycache__/cookie_policy.cpython-312.pyc differ diff --git a/Backend/src/content/models/__pycache__/page_content.cpython-312.pyc b/Backend/src/content/models/__pycache__/page_content.cpython-312.pyc new file mode 100644 index 00000000..1f3365cf Binary files /dev/null and b/Backend/src/content/models/__pycache__/page_content.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..dda24567 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/about_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/about_routes.cpython-312.pyc new file mode 100644 index 00000000..e444aa69 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/about_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/accessibility_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/accessibility_routes.cpython-312.pyc new file mode 100644 index 00000000..0a4fba71 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/accessibility_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/admin_privacy_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/admin_privacy_routes.cpython-312.pyc new file mode 100644 index 00000000..e64893be Binary files /dev/null and b/Backend/src/content/routes/__pycache__/admin_privacy_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/banner_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/banner_routes.cpython-312.pyc new file mode 100644 index 00000000..9f637fde Binary files /dev/null and b/Backend/src/content/routes/__pycache__/banner_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/blog_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/blog_routes.cpython-312.pyc new file mode 100644 index 00000000..d936e0c4 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/blog_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/cancellation_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/cancellation_routes.cpython-312.pyc new file mode 100644 index 00000000..2d339f70 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/cancellation_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/contact_content_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/contact_content_routes.cpython-312.pyc new file mode 100644 index 00000000..859c77d2 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/contact_content_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/contact_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/contact_routes.cpython-312.pyc new file mode 100644 index 00000000..961fbb12 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/contact_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/faq_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/faq_routes.cpython-312.pyc new file mode 100644 index 00000000..187b17b6 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/faq_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/footer_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/footer_routes.cpython-312.pyc new file mode 100644 index 00000000..05ba952b Binary files /dev/null and b/Backend/src/content/routes/__pycache__/footer_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/home_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/home_routes.cpython-312.pyc new file mode 100644 index 00000000..2d710ae4 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/home_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/page_content_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/page_content_routes.cpython-312.pyc new file mode 100644 index 00000000..e7451587 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/page_content_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/privacy_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/privacy_routes.cpython-312.pyc new file mode 100644 index 00000000..f81c6ac9 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/privacy_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/refunds_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/refunds_routes.cpython-312.pyc new file mode 100644 index 00000000..11890cf3 Binary files /dev/null and b/Backend/src/content/routes/__pycache__/refunds_routes.cpython-312.pyc differ diff --git a/Backend/src/content/routes/__pycache__/terms_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/terms_routes.cpython-312.pyc new file mode 100644 index 00000000..345ebbff Binary files /dev/null and b/Backend/src/content/routes/__pycache__/terms_routes.cpython-312.pyc differ diff --git a/Backend/src/content/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7255efda Binary files /dev/null and b/Backend/src/content/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/content/schemas/__pycache__/admin_privacy.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/admin_privacy.cpython-312.pyc new file mode 100644 index 00000000..63eb6dcb Binary files /dev/null and b/Backend/src/content/schemas/__pycache__/admin_privacy.cpython-312.pyc differ diff --git a/Backend/src/content/schemas/__pycache__/blog.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/blog.cpython-312.pyc new file mode 100644 index 00000000..3f6926ef Binary files /dev/null and b/Backend/src/content/schemas/__pycache__/blog.cpython-312.pyc differ diff --git a/Backend/src/content/schemas/__pycache__/page_content.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/page_content.cpython-312.pyc new file mode 100644 index 00000000..2fecd58b Binary files /dev/null and b/Backend/src/content/schemas/__pycache__/page_content.cpython-312.pyc differ diff --git a/Backend/src/content/schemas/__pycache__/privacy.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/privacy.cpython-312.pyc new file mode 100644 index 00000000..4f951dbc Binary files /dev/null and b/Backend/src/content/schemas/__pycache__/privacy.cpython-312.pyc differ diff --git a/Backend/src/guest_management/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2ed39734 Binary files /dev/null and b/Backend/src/guest_management/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d76ca8c0 Binary files /dev/null and b/Backend/src/guest_management/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/__pycache__/guest_communication.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_communication.cpython-312.pyc new file mode 100644 index 00000000..a9d43166 Binary files /dev/null and b/Backend/src/guest_management/models/__pycache__/guest_communication.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/__pycache__/guest_complaint.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_complaint.cpython-312.pyc new file mode 100644 index 00000000..a4444237 Binary files /dev/null and b/Backend/src/guest_management/models/__pycache__/guest_complaint.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/__pycache__/guest_note.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_note.cpython-312.pyc new file mode 100644 index 00000000..fc463d5b Binary files /dev/null and b/Backend/src/guest_management/models/__pycache__/guest_note.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/__pycache__/guest_preference.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_preference.cpython-312.pyc new file mode 100644 index 00000000..56de9772 Binary files /dev/null and b/Backend/src/guest_management/models/__pycache__/guest_preference.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/__pycache__/guest_segment.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_segment.cpython-312.pyc new file mode 100644 index 00000000..816f553f Binary files /dev/null and b/Backend/src/guest_management/models/__pycache__/guest_segment.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/__pycache__/guest_tag.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_tag.cpython-312.pyc new file mode 100644 index 00000000..0ed4ea5b Binary files /dev/null and b/Backend/src/guest_management/models/__pycache__/guest_tag.cpython-312.pyc differ diff --git a/Backend/src/guest_management/models/guest_complaint.py b/Backend/src/guest_management/models/guest_complaint.py new file mode 100644 index 00000000..68237c9c --- /dev/null +++ b/Backend/src/guest_management/models/guest_complaint.py @@ -0,0 +1,116 @@ +""" +Guest complaint management model. +""" +from sqlalchemy import Column, Integer, String, Text, Enum, ForeignKey, DateTime, Boolean, JSON +from sqlalchemy.orm import relationship +from datetime import datetime +import enum +from ...shared.config.database import Base + + +class ComplaintStatus(str, enum.Enum): + """Complaint status enumeration.""" + open = 'open' + in_progress = 'in_progress' + resolved = 'resolved' + closed = 'closed' + escalated = 'escalated' + + +class ComplaintPriority(str, enum.Enum): + """Complaint priority enumeration.""" + low = 'low' + medium = 'medium' + high = 'high' + urgent = 'urgent' + + +class ComplaintCategory(str, enum.Enum): + """Complaint category enumeration.""" + room_quality = 'room_quality' + service = 'service' + cleanliness = 'cleanliness' + noise = 'noise' + billing = 'billing' + staff_behavior = 'staff_behavior' + amenities = 'amenities' + other = 'other' + + +class GuestComplaint(Base): + """Model for guest complaints and their resolution.""" + __tablename__ = 'guest_complaints' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + + # Guest information + guest_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True) + booking_id = Column(Integer, ForeignKey('bookings.id'), nullable=True, index=True) + room_id = Column(Integer, ForeignKey('rooms.id'), nullable=True, index=True) + + # Complaint details + category = Column(Enum(ComplaintCategory), nullable=False, index=True) + priority = Column(Enum(ComplaintPriority), nullable=False, default=ComplaintPriority.medium, index=True) + status = Column(Enum(ComplaintStatus), nullable=False, default=ComplaintStatus.open, index=True) + + title = Column(String(255), nullable=False) + description = Column(Text, nullable=False) + + # Resolution + resolution = Column(Text, nullable=True) + resolved_at = Column(DateTime, nullable=True) + resolved_by = Column(Integer, ForeignKey('users.id'), nullable=True) + + # Assignment + assigned_to = Column(Integer, ForeignKey('users.id'), nullable=True, index=True) + escalated_to = Column(Integer, ForeignKey('users.id'), nullable=True) + + # Tracking + created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) + closed_at = Column(DateTime, nullable=True) + + # Additional information + guest_satisfaction_rating = Column(Integer, nullable=True) # 1-5 rating after resolution + guest_feedback = Column(Text, nullable=True) + internal_notes = Column(Text, nullable=True) + attachments = Column(JSON, nullable=True) # Array of file paths/URLs + + # Follow-up + requires_follow_up = Column(Boolean, nullable=False, default=False) + follow_up_date = Column(DateTime, nullable=True) + follow_up_completed = Column(Boolean, nullable=False, default=False) + + # Relationships + guest = relationship('User', foreign_keys=[guest_id]) + booking = relationship('Booking', foreign_keys=[booking_id]) + room = relationship('Room', foreign_keys=[room_id]) + assignee = relationship('User', foreign_keys=[assigned_to]) + resolver = relationship('User', foreign_keys=[resolved_by]) + escalator = relationship('User', foreign_keys=[escalated_to]) + + +class ComplaintUpdate(Base): + """Model for tracking complaint updates and communication.""" + __tablename__ = 'complaint_updates' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + complaint_id = Column(Integer, ForeignKey('guest_complaints.id'), nullable=False, index=True) + + # Update details + update_type = Column(String(50), nullable=False) # 'status_change', 'assignment', 'note', 'resolution' + description = Column(Text, nullable=False) + + # Who made the update + updated_by = Column(Integer, ForeignKey('users.id'), nullable=False) + + # Timestamp + created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True) + + # Additional data + update_metadata = Column(JSON, nullable=True) # Store additional context + + # Relationships + complaint = relationship('GuestComplaint', backref='updates') + updater = relationship('User', foreign_keys=[updated_by]) + diff --git a/Backend/src/guest_management/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..12f2b3f7 Binary files /dev/null and b/Backend/src/guest_management/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/guest_management/routes/__pycache__/complaint_routes.cpython-312.pyc b/Backend/src/guest_management/routes/__pycache__/complaint_routes.cpython-312.pyc new file mode 100644 index 00000000..4fb4ea20 Binary files /dev/null and b/Backend/src/guest_management/routes/__pycache__/complaint_routes.cpython-312.pyc differ diff --git a/Backend/src/guest_management/routes/__pycache__/guest_profile_routes.cpython-312.pyc b/Backend/src/guest_management/routes/__pycache__/guest_profile_routes.cpython-312.pyc new file mode 100644 index 00000000..54c3d84a Binary files /dev/null and b/Backend/src/guest_management/routes/__pycache__/guest_profile_routes.cpython-312.pyc differ diff --git a/Backend/src/guest_management/routes/complaint_routes.py b/Backend/src/guest_management/routes/complaint_routes.py new file mode 100644 index 00000000..7d8a9509 --- /dev/null +++ b/Backend/src/guest_management/routes/complaint_routes.py @@ -0,0 +1,437 @@ +""" +Routes for guest complaint management. +""" +from fastapi import APIRouter, Depends, HTTPException, Query +from sqlalchemy.orm import Session +from sqlalchemy import and_, or_, func +from typing import Optional +from datetime import datetime +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User +from ..models.guest_complaint import ( + GuestComplaint, ComplaintStatus, ComplaintPriority, ComplaintCategory, ComplaintUpdate +) +from ..schemas.complaint import ( + CreateComplaintRequest, UpdateComplaintRequest, + AddComplaintUpdateRequest, ResolveComplaintRequest +) +from ...shared.utils.response_helpers import success_response + +logger = get_logger(__name__) +router = APIRouter(prefix='/complaints', tags=['complaints']) + + +@router.post('/') +async def create_complaint( + complaint_data: CreateComplaintRequest, + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Create a new guest complaint.""" + try: + # Verify booking ownership if booking_id provided + if complaint_data.booking_id: + from ...bookings.models.booking import Booking + booking = db.query(Booking).filter(Booking.id == complaint_data.booking_id).first() + if not booking: + db.rollback() + raise HTTPException(status_code=404, detail='Booking not found') + + # Check if user owns the booking (unless admin/staff) + from ...shared.utils.role_helpers import is_admin, is_staff + if not (is_admin(current_user, db) or is_staff(current_user, db)): + if booking.user_id != current_user.id: + db.rollback() + raise HTTPException(status_code=403, detail='Access denied') + + complaint = GuestComplaint( + guest_id=current_user.id, + booking_id=complaint_data.booking_id, + room_id=complaint_data.room_id, + category=ComplaintCategory(complaint_data.category), + priority=ComplaintPriority(complaint_data.priority), + status=ComplaintStatus.open, + title=complaint_data.title, + description=complaint_data.description, + attachments=complaint_data.attachments or [] + ) + + db.add(complaint) + db.flush() + + # Create initial update + update = ComplaintUpdate( + complaint_id=complaint.id, + update_type='status_change', + description=f'Complaint created: {complaint_data.title}', + updated_by=current_user.id, + update_metadata={'status': 'open', 'priority': complaint_data.priority} + ) + db.add(update) + + db.commit() + db.refresh(complaint) + + return success_response( + data={'complaint': { + 'id': complaint.id, + 'title': complaint.title, + 'status': complaint.status.value, + 'priority': complaint.priority.value, + 'category': complaint.category.value, + 'created_at': complaint.created_at.isoformat() + }}, + message='Complaint created successfully' + ) + except HTTPException: + db.rollback() + raise + except Exception as e: + db.rollback() + logger.error(f'Error creating complaint: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while creating the complaint') + + +@router.get('/') +async def get_complaints( + status: Optional[str] = Query(None), + priority: Optional[str] = Query(None), + category: Optional[str] = Query(None), + assigned_to: Optional[int] = Query(None), + page: int = Query(1, ge=1), + limit: int = Query(20, ge=1, le=100), + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Get complaints with filtering.""" + try: + from ...shared.utils.role_helpers import is_admin, is_staff + + query = db.query(GuestComplaint) + + # Filter by user role + try: + is_admin_user = is_admin(current_user, db) + is_staff_user = is_staff(current_user, db) + except Exception as role_error: + logger.warning(f'Error checking user role: {str(role_error)}') + is_admin_user = False + is_staff_user = False + + if not (is_admin_user or is_staff_user): + # Customers can only see their own complaints + query = query.filter(GuestComplaint.guest_id == current_user.id) + elif assigned_to: + # Staff/admin can filter by assignee + query = query.filter(GuestComplaint.assigned_to == assigned_to) + + # Apply filters + if status: + try: + query = query.filter(GuestComplaint.status == ComplaintStatus(status)) + except ValueError: + logger.warning(f'Invalid status filter: {status}') + if priority: + try: + query = query.filter(GuestComplaint.priority == ComplaintPriority(priority)) + except ValueError: + logger.warning(f'Invalid priority filter: {priority}') + if category: + try: + query = query.filter(GuestComplaint.category == ComplaintCategory(category)) + except ValueError: + logger.warning(f'Invalid category filter: {category}') + + # Pagination + total = query.count() + offset = (page - 1) * limit + complaints = query.order_by(GuestComplaint.created_at.desc()).offset(offset).limit(limit).all() + + complaints_data = [] + for complaint in complaints: + complaints_data.append({ + 'id': complaint.id, + 'title': complaint.title, + 'category': complaint.category.value, + 'priority': complaint.priority.value, + 'status': complaint.status.value, + 'guest_id': complaint.guest_id, + 'booking_id': complaint.booking_id, + 'room_id': complaint.room_id, + 'assigned_to': complaint.assigned_to, + 'created_at': complaint.created_at.isoformat(), + 'updated_at': complaint.updated_at.isoformat() + }) + + return success_response( + data={ + 'complaints': complaints_data, + 'pagination': { + 'page': page, + 'limit': limit, + 'total': total, + 'total_pages': (total + limit - 1) // limit + } + }, + message='Complaints retrieved successfully' + ) + except HTTPException: + raise + except Exception as e: + logger.error(f'Error retrieving complaints: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail=f'An error occurred while retrieving complaints: {str(e)}') + + +@router.get('/{complaint_id}') +async def get_complaint( + complaint_id: int, + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Get a specific complaint with details.""" + try: + complaint = db.query(GuestComplaint).filter(GuestComplaint.id == complaint_id).first() + if not complaint: + raise HTTPException(status_code=404, detail='Complaint not found') + + # Check access + from ...shared.utils.role_helpers import is_admin, is_staff + if not (is_admin(current_user, db) or is_staff(current_user, db)): + if complaint.guest_id != current_user.id: + raise HTTPException(status_code=403, detail='Access denied') + + # Get updates + updates = db.query(ComplaintUpdate).filter( + ComplaintUpdate.complaint_id == complaint_id + ).order_by(ComplaintUpdate.created_at.asc()).all() + + complaint_data = { + 'id': complaint.id, + 'title': complaint.title, + 'description': complaint.description, + 'category': complaint.category.value, + 'priority': complaint.priority.value, + 'status': complaint.status.value, + 'guest_id': complaint.guest_id, + 'booking_id': complaint.booking_id, + 'room_id': complaint.room_id, + 'assigned_to': complaint.assigned_to, + 'resolution': complaint.resolution, + 'resolved_at': complaint.resolved_at.isoformat() if complaint.resolved_at else None, + 'resolved_by': complaint.resolved_by, + 'guest_satisfaction_rating': complaint.guest_satisfaction_rating, + 'guest_feedback': complaint.guest_feedback, + 'internal_notes': complaint.internal_notes if (is_admin(current_user, db) or is_staff(current_user, db)) else None, + 'attachments': complaint.attachments, + 'requires_follow_up': complaint.requires_follow_up, + 'follow_up_date': complaint.follow_up_date.isoformat() if complaint.follow_up_date else None, + 'created_at': complaint.created_at.isoformat(), + 'updated_at': complaint.updated_at.isoformat(), + 'updates': [{ + 'id': u.id, + 'update_type': u.update_type, + 'description': u.description, + 'updated_by': u.updated_by, + 'created_at': u.created_at.isoformat() + } for u in updates] + } + + return success_response( + data={'complaint': complaint_data}, + message='Complaint retrieved successfully' + ) + except HTTPException: + raise + except Exception as e: + logger.error(f'Error retrieving complaint: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while retrieving complaint') + + +@router.put('/{complaint_id}') +async def update_complaint( + complaint_id: int, + update_data: UpdateComplaintRequest, + current_user: User = Depends(authorize_roles('admin', 'staff')), + db: Session = Depends(get_db) +): + """Update a complaint (admin/staff only).""" + try: + complaint = db.query(GuestComplaint).filter(GuestComplaint.id == complaint_id).first() + if not complaint: + db.rollback() + raise HTTPException(status_code=404, detail='Complaint not found') + + # Track changes + changes = [] + + if update_data.status: + old_status = complaint.status.value + complaint.status = ComplaintStatus(update_data.status) + changes.append(f'Status changed from {old_status} to {update_data.status}') + + if update_data.status == 'resolved' and not complaint.resolved_at: + complaint.resolved_at = datetime.utcnow() + complaint.resolved_by = current_user.id + + if update_data.priority: + old_priority = complaint.priority.value + complaint.priority = ComplaintPriority(update_data.priority) + changes.append(f'Priority changed from {old_priority} to {update_data.priority}') + + if update_data.assigned_to is not None: + old_assignee = complaint.assigned_to + complaint.assigned_to = update_data.assigned_to + changes.append(f'Assigned to user {update_data.assigned_to}') + + if update_data.resolution: + complaint.resolution = update_data.resolution + + if update_data.internal_notes is not None: + complaint.internal_notes = update_data.internal_notes + + if update_data.requires_follow_up is not None: + complaint.requires_follow_up = update_data.requires_follow_up + + if update_data.follow_up_date: + complaint.follow_up_date = datetime.fromisoformat(update_data.follow_up_date.replace('Z', '+00:00')) + + # Create update record + if changes: + update = ComplaintUpdate( + complaint_id=complaint.id, + update_type='status_change' if update_data.status else 'note', + description='; '.join(changes), + updated_by=current_user.id + ) + db.add(update) + + db.commit() + db.refresh(complaint) + + return success_response( + data={'complaint': { + 'id': complaint.id, + 'status': complaint.status.value, + 'priority': complaint.priority.value, + 'assigned_to': complaint.assigned_to + }}, + message='Complaint updated successfully' + ) + except HTTPException: + db.rollback() + raise + except Exception as e: + db.rollback() + logger.error(f'Error updating complaint: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while updating complaint') + + +@router.post('/{complaint_id}/resolve') +async def resolve_complaint( + complaint_id: int, + resolve_data: ResolveComplaintRequest, + current_user: User = Depends(authorize_roles('admin', 'staff')), + db: Session = Depends(get_db) +): + """Resolve a complaint.""" + try: + complaint = db.query(GuestComplaint).filter(GuestComplaint.id == complaint_id).first() + if not complaint: + db.rollback() + raise HTTPException(status_code=404, detail='Complaint not found') + + complaint.status = ComplaintStatus.resolved + complaint.resolution = resolve_data.resolution + complaint.resolved_at = datetime.utcnow() + complaint.resolved_by = current_user.id + + if resolve_data.guest_satisfaction_rating: + complaint.guest_satisfaction_rating = resolve_data.guest_satisfaction_rating + if resolve_data.guest_feedback: + complaint.guest_feedback = resolve_data.guest_feedback + + # Create update record + update = ComplaintUpdate( + complaint_id=complaint.id, + update_type='resolution', + description=f'Complaint resolved: {resolve_data.resolution}', + updated_by=current_user.id, + update_metadata={ + 'satisfaction_rating': resolve_data.guest_satisfaction_rating, + 'guest_feedback': resolve_data.guest_feedback + } + ) + db.add(update) + + db.commit() + db.refresh(complaint) + + return success_response( + data={'complaint': { + 'id': complaint.id, + 'status': complaint.status.value, + 'resolved_at': complaint.resolved_at.isoformat() + }}, + message='Complaint resolved successfully' + ) + except HTTPException: + db.rollback() + raise + except Exception as e: + db.rollback() + logger.error(f'Error resolving complaint: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while resolving complaint') + + +@router.post('/{complaint_id}/updates') +async def add_complaint_update( + complaint_id: int, + update_data: AddComplaintUpdateRequest, + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Add an update to a complaint.""" + try: + complaint = db.query(GuestComplaint).filter(GuestComplaint.id == complaint_id).first() + if not complaint: + db.rollback() + raise HTTPException(status_code=404, detail='Complaint not found') + + # Check access + from ...shared.utils.role_helpers import is_admin, is_staff + if not (is_admin(current_user, db) or is_staff(current_user, db)): + if complaint.guest_id != current_user.id: + db.rollback() + raise HTTPException(status_code=403, detail='Access denied') + + update = ComplaintUpdate( + complaint_id=complaint_id, + update_type=update_data.update_type, + description=update_data.description, + updated_by=current_user.id, + update_metadata=update_data.metadata or {} + ) + + db.add(update) + db.commit() + db.refresh(update) + + return success_response( + data={'update': { + 'id': update.id, + 'update_type': update.update_type, + 'description': update.description, + 'created_at': update.created_at.isoformat() + }}, + message='Update added successfully' + ) + except HTTPException: + db.rollback() + raise + except Exception as e: + db.rollback() + logger.error(f'Error adding complaint update: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while adding update') + diff --git a/Backend/src/guest_management/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ca27c4e3 Binary files /dev/null and b/Backend/src/guest_management/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/guest_management/schemas/__pycache__/complaint.cpython-312.pyc b/Backend/src/guest_management/schemas/__pycache__/complaint.cpython-312.pyc new file mode 100644 index 00000000..e5647029 Binary files /dev/null and b/Backend/src/guest_management/schemas/__pycache__/complaint.cpython-312.pyc differ diff --git a/Backend/src/guest_management/schemas/complaint.py b/Backend/src/guest_management/schemas/complaint.py new file mode 100644 index 00000000..c10eb1bd --- /dev/null +++ b/Backend/src/guest_management/schemas/complaint.py @@ -0,0 +1,98 @@ +""" +Pydantic schemas for guest complaint management. +""" +from pydantic import BaseModel, Field, field_validator +from typing import Optional, List +from datetime import datetime + + +class CreateComplaintRequest(BaseModel): + """Schema for creating a guest complaint.""" + booking_id: Optional[int] = Field(None, gt=0, description="Related booking ID") + room_id: Optional[int] = Field(None, gt=0, description="Related room ID") + category: str = Field(..., description="Complaint category") + priority: str = Field("medium", description="Complaint priority") + title: str = Field(..., min_length=1, max_length=255, description="Complaint title") + description: str = Field(..., min_length=1, description="Complaint description") + attachments: Optional[List[str]] = Field(default_factory=list, description="Attachment URLs") + + @field_validator('category') + @classmethod + def validate_category(cls, v: str) -> str: + """Validate complaint category.""" + allowed = ['room_quality', 'service', 'cleanliness', 'noise', 'billing', 'staff_behavior', 'amenities', 'other'] + if v not in allowed: + raise ValueError(f'Category must be one of: {", ".join(allowed)}') + return v + + @field_validator('priority') + @classmethod + def validate_priority(cls, v: str) -> str: + """Validate complaint priority.""" + allowed = ['low', 'medium', 'high', 'urgent'] + if v not in allowed: + raise ValueError(f'Priority must be one of: {", ".join(allowed)}') + return v + + +class UpdateComplaintRequest(BaseModel): + """Schema for updating a complaint.""" + status: Optional[str] = Field(None, description="New status") + priority: Optional[str] = Field(None, description="New priority") + assigned_to: Optional[int] = Field(None, gt=0, description="Assign to user ID") + resolution: Optional[str] = Field(None, description="Resolution details") + internal_notes: Optional[str] = Field(None, description="Internal notes") + requires_follow_up: Optional[bool] = Field(None, description="Requires follow-up") + follow_up_date: Optional[str] = Field(None, description="Follow-up date (ISO format)") + + @field_validator('status') + @classmethod + def validate_status(cls, v: Optional[str]) -> Optional[str]: + """Validate complaint status.""" + if v: + allowed = ['open', 'in_progress', 'resolved', 'closed', 'escalated'] + if v not in allowed: + raise ValueError(f'Status must be one of: {", ".join(allowed)}') + return v + + @field_validator('priority') + @classmethod + def validate_priority(cls, v: Optional[str]) -> Optional[str]: + """Validate complaint priority.""" + if v: + allowed = ['low', 'medium', 'high', 'urgent'] + if v not in allowed: + raise ValueError(f'Priority must be one of: {", ".join(allowed)}') + return v + + +class AddComplaintUpdateRequest(BaseModel): + """Schema for adding an update to a complaint.""" + update_type: str = Field(..., description="Type of update") + description: str = Field(..., min_length=1, description="Update description") + metadata: Optional[dict] = Field(default_factory=dict, description="Additional metadata") + + @field_validator('update_type') + @classmethod + def validate_update_type(cls, v: str) -> str: + """Validate update type.""" + allowed = ['status_change', 'assignment', 'note', 'resolution', 'escalation'] + if v not in allowed: + raise ValueError(f'Update type must be one of: {", ".join(allowed)}') + return v + + +class ResolveComplaintRequest(BaseModel): + """Schema for resolving a complaint.""" + resolution: str = Field(..., min_length=1, description="Resolution details") + guest_satisfaction_rating: Optional[int] = Field(None, ge=1, le=5, description="Guest satisfaction rating (1-5)") + guest_feedback: Optional[str] = Field(None, description="Guest feedback on resolution") + + @field_validator('guest_satisfaction_rating') + @classmethod + def validate_rating(cls, v: Optional[int]) -> Optional[int]: + """Validate rating.""" + if v is not None and (v < 1 or v > 5): + raise ValueError('Rating must be between 1 and 5') + return v + diff --git a/Backend/src/guest_management/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7a9e891f Binary files /dev/null and b/Backend/src/guest_management/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/guest_management/services/__pycache__/guest_profile_service.cpython-312.pyc b/Backend/src/guest_management/services/__pycache__/guest_profile_service.cpython-312.pyc new file mode 100644 index 00000000..c320d87a Binary files /dev/null and b/Backend/src/guest_management/services/__pycache__/guest_profile_service.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..5ff37bd9 Binary files /dev/null and b/Backend/src/hotel_services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c775b9aa Binary files /dev/null and b/Backend/src/hotel_services/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/models/__pycache__/housekeeping_task.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/housekeeping_task.cpython-312.pyc new file mode 100644 index 00000000..cc5540a6 Binary files /dev/null and b/Backend/src/hotel_services/models/__pycache__/housekeeping_task.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/models/__pycache__/service.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/service.cpython-312.pyc new file mode 100644 index 00000000..d2f89b94 Binary files /dev/null and b/Backend/src/hotel_services/models/__pycache__/service.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/models/__pycache__/service_booking.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/service_booking.cpython-312.pyc new file mode 100644 index 00000000..51a7e714 Binary files /dev/null and b/Backend/src/hotel_services/models/__pycache__/service_booking.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/models/__pycache__/service_usage.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/service_usage.cpython-312.pyc new file mode 100644 index 00000000..6e39411b Binary files /dev/null and b/Backend/src/hotel_services/models/__pycache__/service_usage.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..6fb3ef38 Binary files /dev/null and b/Backend/src/hotel_services/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/routes/__pycache__/service_booking_routes.cpython-312.pyc b/Backend/src/hotel_services/routes/__pycache__/service_booking_routes.cpython-312.pyc new file mode 100644 index 00000000..a09a8766 Binary files /dev/null and b/Backend/src/hotel_services/routes/__pycache__/service_booking_routes.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/routes/__pycache__/service_routes.cpython-312.pyc b/Backend/src/hotel_services/routes/__pycache__/service_routes.cpython-312.pyc new file mode 100644 index 00000000..0807dda6 Binary files /dev/null and b/Backend/src/hotel_services/routes/__pycache__/service_routes.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ea3f7387 Binary files /dev/null and b/Backend/src/hotel_services/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/schemas/__pycache__/service_booking.cpython-312.pyc b/Backend/src/hotel_services/schemas/__pycache__/service_booking.cpython-312.pyc new file mode 100644 index 00000000..d717c24c Binary files /dev/null and b/Backend/src/hotel_services/schemas/__pycache__/service_booking.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b638c0c2 Binary files /dev/null and b/Backend/src/hotel_services/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/hotel_services/services/__pycache__/task_service.cpython-312.pyc b/Backend/src/hotel_services/services/__pycache__/task_service.cpython-312.pyc new file mode 100644 index 00000000..132b7c05 Binary files /dev/null and b/Backend/src/hotel_services/services/__pycache__/task_service.cpython-312.pyc differ diff --git a/Backend/src/loyalty/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ba4eab9c Binary files /dev/null and b/Backend/src/loyalty/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..056da99d Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/loyalty_point_transaction.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/loyalty_point_transaction.cpython-312.pyc new file mode 100644 index 00000000..6a34b301 Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/loyalty_point_transaction.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/loyalty_reward.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/loyalty_reward.cpython-312.pyc new file mode 100644 index 00000000..1870f29a Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/loyalty_reward.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/loyalty_tier.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/loyalty_tier.cpython-312.pyc new file mode 100644 index 00000000..1dcc6afe Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/loyalty_tier.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/package.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/package.cpython-312.pyc new file mode 100644 index 00000000..4a507db1 Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/package.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/promotion.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/promotion.cpython-312.pyc new file mode 100644 index 00000000..dcba8cec Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/promotion.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/referral.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/referral.cpython-312.pyc new file mode 100644 index 00000000..eaf636f3 Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/referral.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/reward_redemption.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/reward_redemption.cpython-312.pyc new file mode 100644 index 00000000..626950bf Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/reward_redemption.cpython-312.pyc differ diff --git a/Backend/src/loyalty/models/__pycache__/user_loyalty.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/user_loyalty.cpython-312.pyc new file mode 100644 index 00000000..88438bd9 Binary files /dev/null and b/Backend/src/loyalty/models/__pycache__/user_loyalty.cpython-312.pyc differ diff --git a/Backend/src/loyalty/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9330ba51 Binary files /dev/null and b/Backend/src/loyalty/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/loyalty/routes/__pycache__/loyalty_routes.cpython-312.pyc b/Backend/src/loyalty/routes/__pycache__/loyalty_routes.cpython-312.pyc new file mode 100644 index 00000000..4df75e39 Binary files /dev/null and b/Backend/src/loyalty/routes/__pycache__/loyalty_routes.cpython-312.pyc differ diff --git a/Backend/src/loyalty/routes/__pycache__/package_routes.cpython-312.pyc b/Backend/src/loyalty/routes/__pycache__/package_routes.cpython-312.pyc new file mode 100644 index 00000000..d23536a8 Binary files /dev/null and b/Backend/src/loyalty/routes/__pycache__/package_routes.cpython-312.pyc differ diff --git a/Backend/src/loyalty/routes/__pycache__/promotion_routes.cpython-312.pyc b/Backend/src/loyalty/routes/__pycache__/promotion_routes.cpython-312.pyc new file mode 100644 index 00000000..bdcf659b Binary files /dev/null and b/Backend/src/loyalty/routes/__pycache__/promotion_routes.cpython-312.pyc differ diff --git a/Backend/src/loyalty/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..cb20a0ca Binary files /dev/null and b/Backend/src/loyalty/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/loyalty/schemas/__pycache__/promotion.cpython-312.pyc b/Backend/src/loyalty/schemas/__pycache__/promotion.cpython-312.pyc new file mode 100644 index 00000000..674217b9 Binary files /dev/null and b/Backend/src/loyalty/schemas/__pycache__/promotion.cpython-312.pyc differ diff --git a/Backend/src/loyalty/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..bceb968b Binary files /dev/null and b/Backend/src/loyalty/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/loyalty/services/__pycache__/loyalty_service.cpython-312.pyc b/Backend/src/loyalty/services/__pycache__/loyalty_service.cpython-312.pyc new file mode 100644 index 00000000..47d1b917 Binary files /dev/null and b/Backend/src/loyalty/services/__pycache__/loyalty_service.cpython-312.pyc differ diff --git a/Backend/src/main.py b/Backend/src/main.py index 70952e6c..b48a45cc 100644 --- a/Backend/src/main.py +++ b/Backend/src/main.py @@ -103,7 +103,22 @@ app.add_exception_handler(Exception, general_exception_handler) @app.get('/health', tags=['health']) @app.get('/api/health', tags=['health']) async def health_check(db: Session=Depends(get_db)): - health_status = {'status': 'healthy', 'timestamp': datetime.utcnow().isoformat(), 'service': settings.APP_NAME, 'version': settings.APP_VERSION, 'environment': settings.ENVIRONMENT, 'checks': {'api': 'ok', 'database': 'unknown'}} + """Comprehensive health check endpoint""" + health_status = { + 'status': 'healthy', + 'timestamp': datetime.utcnow().isoformat(), + 'service': settings.APP_NAME, + 'version': settings.APP_VERSION, + 'environment': settings.ENVIRONMENT, + 'checks': { + 'api': 'ok', + 'database': 'unknown', + 'disk_space': 'unknown', + 'memory': 'unknown' + } + } + + # Check database try: from sqlalchemy import text db.execute(text('SELECT 1')) @@ -120,7 +135,59 @@ async def health_check(db: Session=Depends(get_db)): health_status['error'] = str(e) logger.error(f'Health check failed: {str(e)}') return JSONResponse(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, content=health_status) - return health_status + + # Check disk space (if available) + try: + import shutil + disk = shutil.disk_usage('/') + free_percent = (disk.free / disk.total) * 100 + if free_percent < 10: + health_status['checks']['disk_space'] = 'warning' + health_status['status'] = 'degraded' + else: + health_status['checks']['disk_space'] = 'ok' + health_status['disk_space'] = { + 'free_gb': round(disk.free / (1024**3), 2), + 'total_gb': round(disk.total / (1024**3), 2), + 'free_percent': round(free_percent, 2) + } + except Exception: + health_status['checks']['disk_space'] = 'unknown' + + # Check memory (if available) + try: + import psutil + memory = psutil.virtual_memory() + if memory.percent > 90: + health_status['checks']['memory'] = 'warning' + if health_status['status'] == 'healthy': + health_status['status'] = 'degraded' + else: + health_status['checks']['memory'] = 'ok' + health_status['memory'] = { + 'used_percent': round(memory.percent, 2), + 'available_gb': round(memory.available / (1024**3), 2), + 'total_gb': round(memory.total / (1024**3), 2) + } + except ImportError: + # psutil not available, skip memory check + health_status['checks']['memory'] = 'unavailable' + except Exception: + health_status['checks']['memory'] = 'unknown' + + # Determine overall status + if health_status['status'] == 'healthy' and any( + check == 'warning' for check in health_status['checks'].values() + ): + health_status['status'] = 'degraded' + + status_code = status.HTTP_200_OK + if health_status['status'] == 'unhealthy': + status_code = status.HTTP_503_SERVICE_UNAVAILABLE + elif health_status['status'] == 'degraded': + status_code = status.HTTP_200_OK # Still operational but degraded + + return JSONResponse(status_code=status_code, content=health_status) @app.get('/metrics', tags=['monitoring']) async def metrics(): @@ -129,7 +196,7 @@ async def metrics(): from .auth.routes import auth_routes, user_routes from .rooms.routes import room_routes, advanced_room_routes, rate_plan_routes from .bookings.routes import booking_routes, group_booking_routes -from .payments.routes import payment_routes, invoice_routes +from .payments.routes import payment_routes, invoice_routes, financial_routes, audit_trail_routes from .hotel_services.routes import service_routes, service_booking_routes from .content.routes import ( banner_routes, page_content_routes, home_routes, about_routes, @@ -140,9 +207,10 @@ from .content.routes import ( from .reviews.routes import review_routes, favorite_routes from .loyalty.routes import promotion_routes, loyalty_routes, package_routes from .guest_management.routes import guest_profile_routes +from .guest_management.routes.complaint_routes import router as complaint_routes from .notifications.routes import chat_routes, notification_routes, email_campaign_routes from .analytics.routes import analytics_routes, report_routes, audit_routes -from .security.routes import security_routes +from .security.routes import security_routes, compliance_routes from .system.routes import system_settings_routes, workflow_routes, task_routes from .ai.routes import ai_assistant_routes @@ -155,6 +223,8 @@ app.include_router(booking_routes.router, prefix=api_prefix) app.include_router(group_booking_routes.router, prefix=api_prefix) app.include_router(payment_routes.router, prefix=api_prefix) app.include_router(invoice_routes.router, prefix=api_prefix) +app.include_router(financial_routes.router, prefix=api_prefix) +app.include_router(audit_trail_routes.router, prefix=api_prefix) app.include_router(banner_routes.router, prefix=api_prefix) app.include_router(favorite_routes.router, prefix=api_prefix) app.include_router(service_routes.router, prefix=api_prefix) @@ -180,6 +250,7 @@ app.include_router(faq_routes.router, prefix=api_prefix) app.include_router(chat_routes.router, prefix=api_prefix) app.include_router(loyalty_routes.router, prefix=api_prefix) app.include_router(guest_profile_routes.router, prefix=api_prefix) +app.include_router(complaint_routes, prefix=api_prefix) app.include_router(analytics_routes.router, prefix=api_prefix) app.include_router(workflow_routes.router, prefix=api_prefix) app.include_router(task_routes.router, prefix=api_prefix) @@ -188,6 +259,7 @@ app.include_router(advanced_room_routes.router, prefix=api_prefix) app.include_router(rate_plan_routes.router, prefix=api_prefix) app.include_router(package_routes.router, prefix=api_prefix) app.include_router(security_routes.router, prefix=api_prefix) +app.include_router(compliance_routes.router, prefix=api_prefix) app.include_router(email_campaign_routes.router, prefix=api_prefix) app.include_router(page_content_routes.router, prefix=api_prefix) app.include_router(blog_routes.router, prefix=api_prefix) diff --git a/Backend/src/models/__init__.py b/Backend/src/models/__init__.py index 5d8cf6db..63bfa73b 100644 --- a/Backend/src/models/__init__.py +++ b/Backend/src/models/__init__.py @@ -24,6 +24,9 @@ from ..bookings.models.group_booking import GroupBooking, GroupBookingMember, Gr # Payment models from ..payments.models.payment import Payment + +# Guest management models +from ..guest_management.models.guest_complaint import GuestComplaint, ComplaintUpdate, ComplaintStatus, ComplaintPriority, ComplaintCategory from ..payments.models.invoice import Invoice, InvoiceItem # Hotel Services models @@ -111,7 +114,7 @@ __all__ = [ 'Promotion', 'Package', 'PackageItem', 'PackageStatus', 'PackageItemType', # Guest Management 'GuestPreference', 'GuestNote', 'GuestTag', 'guest_tag_association', 'GuestCommunication', 'CommunicationType', 'CommunicationDirection', - 'GuestSegment', 'guest_segment_association', + 'GuestSegment', 'guest_segment_association', 'GuestComplaint', 'ComplaintUpdate', 'ComplaintStatus', 'ComplaintPriority', 'ComplaintCategory', # Notifications 'Notification', 'NotificationTemplate', 'NotificationPreference', 'NotificationDeliveryLog', 'NotificationChannel', 'NotificationStatus', 'NotificationType', 'Campaign', 'CampaignStatus', 'CampaignType', 'CampaignSegment', 'EmailTemplate', 'CampaignEmail', 'EmailStatus', 'EmailClick', diff --git a/Backend/src/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..821060be Binary files /dev/null and b/Backend/src/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/notifications/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3e3cf66b Binary files /dev/null and b/Backend/src/notifications/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/notifications/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b3198eee Binary files /dev/null and b/Backend/src/notifications/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/notifications/models/__pycache__/email_campaign.cpython-312.pyc b/Backend/src/notifications/models/__pycache__/email_campaign.cpython-312.pyc new file mode 100644 index 00000000..df4efc86 Binary files /dev/null and b/Backend/src/notifications/models/__pycache__/email_campaign.cpython-312.pyc differ diff --git a/Backend/src/notifications/models/__pycache__/notification.cpython-312.pyc b/Backend/src/notifications/models/__pycache__/notification.cpython-312.pyc new file mode 100644 index 00000000..806278da Binary files /dev/null and b/Backend/src/notifications/models/__pycache__/notification.cpython-312.pyc differ diff --git a/Backend/src/notifications/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c42d0550 Binary files /dev/null and b/Backend/src/notifications/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/notifications/routes/__pycache__/chat_routes.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/chat_routes.cpython-312.pyc new file mode 100644 index 00000000..89fe20f4 Binary files /dev/null and b/Backend/src/notifications/routes/__pycache__/chat_routes.cpython-312.pyc differ diff --git a/Backend/src/notifications/routes/__pycache__/email_campaign_routes.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/email_campaign_routes.cpython-312.pyc new file mode 100644 index 00000000..23966993 Binary files /dev/null and b/Backend/src/notifications/routes/__pycache__/email_campaign_routes.cpython-312.pyc differ diff --git a/Backend/src/notifications/routes/__pycache__/notification_routes.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/notification_routes.cpython-312.pyc new file mode 100644 index 00000000..ad9fc924 Binary files /dev/null and b/Backend/src/notifications/routes/__pycache__/notification_routes.cpython-312.pyc differ diff --git a/Backend/src/notifications/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ad2ab781 Binary files /dev/null and b/Backend/src/notifications/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/notifications/services/__pycache__/email_campaign_service.cpython-312.pyc b/Backend/src/notifications/services/__pycache__/email_campaign_service.cpython-312.pyc new file mode 100644 index 00000000..321cd625 Binary files /dev/null and b/Backend/src/notifications/services/__pycache__/email_campaign_service.cpython-312.pyc differ diff --git a/Backend/src/notifications/services/__pycache__/notification_service.cpython-312.pyc b/Backend/src/notifications/services/__pycache__/notification_service.cpython-312.pyc new file mode 100644 index 00000000..f1ce042f Binary files /dev/null and b/Backend/src/notifications/services/__pycache__/notification_service.cpython-312.pyc differ diff --git a/Backend/src/payments/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b93d10e4 Binary files /dev/null and b/Backend/src/payments/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/payments/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7184086e Binary files /dev/null and b/Backend/src/payments/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/payments/models/__pycache__/financial_audit_trail.cpython-312.pyc b/Backend/src/payments/models/__pycache__/financial_audit_trail.cpython-312.pyc new file mode 100644 index 00000000..c6116dd6 Binary files /dev/null and b/Backend/src/payments/models/__pycache__/financial_audit_trail.cpython-312.pyc differ diff --git a/Backend/src/payments/models/__pycache__/invoice.cpython-312.pyc b/Backend/src/payments/models/__pycache__/invoice.cpython-312.pyc new file mode 100644 index 00000000..ff06df3e Binary files /dev/null and b/Backend/src/payments/models/__pycache__/invoice.cpython-312.pyc differ diff --git a/Backend/src/payments/models/__pycache__/payment.cpython-312.pyc b/Backend/src/payments/models/__pycache__/payment.cpython-312.pyc new file mode 100644 index 00000000..29da6ff2 Binary files /dev/null and b/Backend/src/payments/models/__pycache__/payment.cpython-312.pyc differ diff --git a/Backend/src/payments/models/financial_audit_trail.py b/Backend/src/payments/models/financial_audit_trail.py new file mode 100644 index 00000000..937f3753 --- /dev/null +++ b/Backend/src/payments/models/financial_audit_trail.py @@ -0,0 +1,71 @@ +""" +Financial audit trail model for tracking all financial transactions. +This ensures compliance and provides a complete audit log for financial operations. +""" +from sqlalchemy import Column, Integer, String, DateTime, Numeric, Text, Enum, ForeignKey, JSON, Index +from sqlalchemy.orm import relationship +from datetime import datetime +import enum +from ...shared.config.database import Base + + +class FinancialActionType(str, enum.Enum): + """Types of financial actions that can be audited.""" + payment_created = 'payment_created' + payment_completed = 'payment_completed' + payment_refunded = 'payment_refunded' + payment_failed = 'payment_failed' + invoice_created = 'invoice_created' + invoice_updated = 'invoice_updated' + invoice_paid = 'invoice_paid' + refund_processed = 'refund_processed' + price_modified = 'price_modified' + discount_applied = 'discount_applied' + promotion_applied = 'promotion_applied' + + +class FinancialAuditTrail(Base): + """Audit trail for all financial transactions and modifications.""" + __tablename__ = 'financial_audit_trail' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + + # Action details + action_type = Column(Enum(FinancialActionType), nullable=False, index=True) + action_description = Column(Text, nullable=False) + + # Related entities + payment_id = Column(Integer, ForeignKey('payments.id'), nullable=True, index=True) + invoice_id = Column(Integer, ForeignKey('invoices.id'), nullable=True, index=True) + booking_id = Column(Integer, ForeignKey('bookings.id'), nullable=True, index=True) + + # Financial details + amount = Column(Numeric(10, 2), nullable=True) + previous_amount = Column(Numeric(10, 2), nullable=True) + currency = Column(String(3), nullable=True, default='USD') + + # User information + performed_by = Column(Integer, ForeignKey('users.id'), nullable=False, index=True) + performed_by_email = Column(String(255), nullable=True) # Store email for audit even if user deleted + + # Additional context + audit_metadata = Column(JSON, nullable=True) # Store additional context (IP, user agent, etc.) + notes = Column(Text, nullable=True) + + # Timestamp + created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True) + + # Relationships + payment = relationship('Payment', foreign_keys=[payment_id]) + invoice = relationship('Invoice', foreign_keys=[invoice_id]) + booking = relationship('Booking', foreign_keys=[booking_id]) + user = relationship('User', foreign_keys=[performed_by]) + + # Indexes for common queries + __table_args__ = ( + Index('idx_financial_audit_created', 'created_at'), + Index('idx_financial_audit_action', 'action_type', 'created_at'), + Index('idx_financial_audit_user', 'performed_by', 'created_at'), + Index('idx_financial_audit_booking', 'booking_id', 'created_at'), + ) + diff --git a/Backend/src/payments/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c0332186 Binary files /dev/null and b/Backend/src/payments/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/payments/routes/__pycache__/audit_trail_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/audit_trail_routes.cpython-312.pyc new file mode 100644 index 00000000..17e5ff5d Binary files /dev/null and b/Backend/src/payments/routes/__pycache__/audit_trail_routes.cpython-312.pyc differ diff --git a/Backend/src/payments/routes/__pycache__/financial_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/financial_routes.cpython-312.pyc new file mode 100644 index 00000000..648f7273 Binary files /dev/null and b/Backend/src/payments/routes/__pycache__/financial_routes.cpython-312.pyc differ diff --git a/Backend/src/payments/routes/__pycache__/invoice_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/invoice_routes.cpython-312.pyc new file mode 100644 index 00000000..138e3ae3 Binary files /dev/null and b/Backend/src/payments/routes/__pycache__/invoice_routes.cpython-312.pyc differ diff --git a/Backend/src/payments/routes/__pycache__/payment_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/payment_routes.cpython-312.pyc new file mode 100644 index 00000000..381dc70e Binary files /dev/null and b/Backend/src/payments/routes/__pycache__/payment_routes.cpython-312.pyc differ diff --git a/Backend/src/payments/routes/audit_trail_routes.py b/Backend/src/payments/routes/audit_trail_routes.py new file mode 100644 index 00000000..59438852 --- /dev/null +++ b/Backend/src/payments/routes/audit_trail_routes.py @@ -0,0 +1,164 @@ +""" +Routes for financial audit trail access. +""" +from fastapi import APIRouter, Depends, HTTPException, Query +from sqlalchemy.orm import Session +from typing import Optional +from datetime import datetime +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import authorize_roles +from ...auth.models.user import User +from ..models.financial_audit_trail import FinancialAuditTrail, FinancialActionType +from ..services.financial_audit_service import financial_audit_service +from ...shared.utils.response_helpers import success_response + +logger = get_logger(__name__) +router = APIRouter(prefix='/financial/audit-trail', tags=['financial-audit']) + + +@router.get('/') +async def get_financial_audit_trail( + payment_id: Optional[int] = Query(None), + invoice_id: Optional[int] = Query(None), + booking_id: Optional[int] = Query(None), + action_type: Optional[str] = Query(None), + user_id: Optional[int] = Query(None), + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + page: int = Query(1, ge=1), + limit: int = Query(100, ge=1, le=1000), + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Get financial audit trail records with filters.""" + try: + # Parse dates + start = None + end = None + if start_date: + start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) + if end_date: + end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) + + # Parse action type + action_type_enum = None + if action_type: + try: + action_type_enum = FinancialActionType(action_type) + except ValueError: + raise HTTPException(status_code=400, detail=f'Invalid action_type: {action_type}') + + # Calculate offset + offset = (page - 1) * limit + + # Get audit trail + records = financial_audit_service.get_audit_trail( + db=db, + payment_id=payment_id, + invoice_id=invoice_id, + booking_id=booking_id, + action_type=action_type_enum, + user_id=user_id, + start_date=start, + end_date=end, + limit=limit, + offset=offset + ) + + # Format response + audit_data = [] + for record in records: + audit_data.append({ + 'id': record.id, + 'action_type': record.action_type.value, + 'action_description': record.action_description, + 'payment_id': record.payment_id, + 'invoice_id': record.invoice_id, + 'booking_id': record.booking_id, + 'amount': float(record.amount) if record.amount else None, + 'previous_amount': float(record.previous_amount) if record.previous_amount else None, + 'currency': record.currency, + 'performed_by': record.performed_by, + 'performed_by_email': record.performed_by_email, + 'metadata': record.audit_metadata, + 'notes': record.notes, + 'created_at': record.created_at.isoformat() if record.created_at else None + }) + + # Get total count for pagination + total_query = db.query(FinancialAuditTrail) + if payment_id: + total_query = total_query.filter(FinancialAuditTrail.payment_id == payment_id) + if invoice_id: + total_query = total_query.filter(FinancialAuditTrail.invoice_id == invoice_id) + if booking_id: + total_query = total_query.filter(FinancialAuditTrail.booking_id == booking_id) + if action_type_enum: + total_query = total_query.filter(FinancialAuditTrail.action_type == action_type_enum) + if user_id: + total_query = total_query.filter(FinancialAuditTrail.performed_by == user_id) + if start: + total_query = total_query.filter(FinancialAuditTrail.created_at >= start) + if end: + total_query = total_query.filter(FinancialAuditTrail.created_at <= end) + + total_count = total_query.count() + total_pages = (total_count + limit - 1) // limit + + return success_response( + data={ + 'audit_trail': audit_data, + 'pagination': { + 'page': page, + 'limit': limit, + 'total': total_count, + 'total_pages': total_pages + } + }, + message='Financial audit trail retrieved successfully' + ) + except HTTPException: + raise + except Exception as e: + logger.error(f'Error retrieving financial audit trail: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while retrieving audit trail') + + +@router.get('/{record_id}') +async def get_audit_record( + record_id: int, + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Get a specific audit trail record.""" + try: + record = db.query(FinancialAuditTrail).filter(FinancialAuditTrail.id == record_id).first() + if not record: + raise HTTPException(status_code=404, detail='Audit record not found') + + return success_response( + data={ + 'id': record.id, + 'action_type': record.action_type.value, + 'action_description': record.action_description, + 'payment_id': record.payment_id, + 'invoice_id': record.invoice_id, + 'booking_id': record.booking_id, + 'amount': float(record.amount) if record.amount else None, + 'previous_amount': float(record.previous_amount) if record.previous_amount else None, + 'currency': record.currency, + 'performed_by': record.performed_by, + 'performed_by_email': record.performed_by_email, + 'metadata': record.audit_metadata, + 'notes': record.notes, + 'created_at': record.created_at.isoformat() if record.created_at else None + }, + message='Audit record retrieved successfully' + ) + except HTTPException: + raise + except Exception as e: + logger.error(f'Error retrieving audit record: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while retrieving audit record') + diff --git a/Backend/src/payments/routes/financial_routes.py b/Backend/src/payments/routes/financial_routes.py new file mode 100644 index 00000000..7d244e24 --- /dev/null +++ b/Backend/src/payments/routes/financial_routes.py @@ -0,0 +1,446 @@ +from fastapi import APIRouter, Depends, HTTPException, Query, Response +from sqlalchemy.orm import Session +from sqlalchemy import func, and_, or_ +from typing import Optional +from datetime import datetime, timedelta +import csv +import io +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import authorize_roles +from ...auth.models.user import User +from ..models.payment import Payment, PaymentStatus, PaymentMethod +from ..models.invoice import Invoice, InvoiceStatus +from ...bookings.models.booking import Booking, BookingStatus +from ...shared.utils.response_helpers import success_response + +logger = get_logger(__name__) +router = APIRouter(prefix='/financial', tags=['financial']) + +@router.get('/profit-loss') +async def get_profit_loss_report( + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Generate Profit & Loss statement.""" + try: + # Parse dates + if start_date: + start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) + else: + start = datetime.utcnow().replace(day=1, hour=0, minute=0, second=0) + + if end_date: + end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) + else: + end = datetime.utcnow() + + # Revenue (completed payments) + revenue_query = db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + Payment.payment_date >= start, + Payment.payment_date <= end + ) + ) + total_revenue = revenue_query.scalar() or 0.0 + + # Revenue by source + revenue_by_method = db.query( + Payment.payment_method, + func.sum(Payment.amount).label('total') + ).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + Payment.payment_date >= start, + Payment.payment_date <= end + ) + ).group_by(Payment.payment_method).all() + + revenue_breakdown = {} + for method, total in revenue_by_method: + method_name = method.value if hasattr(method, 'value') else str(method) + revenue_breakdown[method_name] = float(total or 0) + + # Tax collected (from invoices) + tax_collected = db.query(func.sum(Invoice.tax_amount)).filter( + and_( + Invoice.status == InvoiceStatus.paid, + Invoice.paid_date >= start, + Invoice.paid_date <= end + ) + ).scalar() or 0.0 + + # Discounts given + discounts = db.query(func.sum(Invoice.discount_amount)).filter( + and_( + Invoice.status == InvoiceStatus.paid, + Invoice.paid_date >= start, + Invoice.paid_date <= end + ) + ).scalar() or 0.0 + + # Expenses (placeholder - would need expense tracking system) + # For now, we'll use refunds as expenses + refunds = db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.refunded, + Payment.payment_date >= start, + Payment.payment_date <= end + ) + ).scalar() or 0.0 + + # Net revenue + net_revenue = total_revenue - discounts + + # Gross profit (revenue - cost of goods sold) + # For hotel, COGS would be room maintenance, cleaning, etc. + # Placeholder: assume 30% COGS + estimated_cogs = net_revenue * 0.30 + gross_profit = net_revenue - estimated_cogs + + # Operating expenses (placeholder) + operating_expenses = refunds # Using refunds as proxy + + # Net profit + net_profit = gross_profit - operating_expenses + + return success_response(data={ + 'period': { + 'start_date': start.isoformat(), + 'end_date': end.isoformat() + }, + 'revenue': { + 'total_revenue': float(total_revenue), + 'revenue_by_method': revenue_breakdown, + 'tax_collected': float(tax_collected), + 'discounts': float(discounts), + 'net_revenue': float(net_revenue) + }, + 'costs': { + 'estimated_cogs': float(estimated_cogs), + 'gross_profit': float(gross_profit) + }, + 'expenses': { + 'refunds': float(refunds), + 'operating_expenses': float(operating_expenses) + }, + 'profit': { + 'net_profit': float(net_profit), + 'profit_margin': float((net_profit / net_revenue * 100) if net_revenue > 0 else 0) + } + }) + except Exception as e: + logger.error(f'Error generating P&L report: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + +@router.get('/balance-sheet') +async def get_balance_sheet( + as_of_date: Optional[str] = Query(None), + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Generate Balance Sheet statement.""" + try: + if as_of_date: + as_of = datetime.fromisoformat(as_of_date.replace('Z', '+00:00')) + else: + as_of = datetime.utcnow() + + # Assets + # Cash (completed payments - refunds) + total_cash = db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + Payment.payment_date <= as_of + ) + ).scalar() or 0.0 + + refunds_total = db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.refunded, + Payment.payment_date <= as_of + ) + ).scalar() or 0.0 + + cash = total_cash - refunds_total + + # Accounts Receivable (unpaid invoices) + accounts_receivable = db.query(func.sum(Invoice.balance_due)).filter( + and_( + Invoice.status != InvoiceStatus.paid, + Invoice.issue_date <= as_of + ) + ).scalar() or 0.0 + + total_assets = cash + accounts_receivable + + # Liabilities + # Accounts Payable (placeholder - would need vendor management) + accounts_payable = 0.0 + + # Deferred Revenue (deposits for future bookings) + deferred_revenue = db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_type == 'deposit', + Payment.payment_status == PaymentStatus.completed, + Payment.payment_date <= as_of + ) + ).scalar() or 0.0 + + total_liabilities = accounts_payable + deferred_revenue + + # Equity + # Retained Earnings (net profit over time) + all_revenue = db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + Payment.payment_date <= as_of + ) + ).scalar() or 0.0 + + all_refunds = db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.refunded, + Payment.payment_date <= as_of + ) + ).scalar() or 0.0 + + retained_earnings = all_revenue - all_refunds - (all_revenue * 0.30) # Minus estimated COGS + + total_equity = retained_earnings + + return success_response(data={ + 'as_of_date': as_of.isoformat(), + 'assets': { + 'cash': float(cash), + 'accounts_receivable': float(accounts_receivable), + 'total_assets': float(total_assets) + }, + 'liabilities': { + 'accounts_payable': float(accounts_payable), + 'deferred_revenue': float(deferred_revenue), + 'total_liabilities': float(total_liabilities) + }, + 'equity': { + 'retained_earnings': float(retained_earnings), + 'total_equity': float(total_equity) + }, + 'balance': { + 'total_liabilities_and_equity': float(total_liabilities + total_equity), + 'is_balanced': abs(total_assets - (total_liabilities + total_equity)) < 0.01 + } + }) + except Exception as e: + logger.error(f'Error generating balance sheet: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + +@router.get('/tax-report') +async def get_tax_report( + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + format: Optional[str] = Query('json', regex='^(json|csv)$'), + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Generate tax report with export capability.""" + try: + if start_date: + start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) + else: + start = datetime.utcnow().replace(day=1, hour=0, minute=0, second=0) + + if end_date: + end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) + else: + end = datetime.utcnow() + + # Get all paid invoices in period + invoices = db.query(Invoice).filter( + and_( + Invoice.status == InvoiceStatus.paid, + Invoice.paid_date >= start, + Invoice.paid_date <= end + ) + ).all() + + tax_data = [] + total_tax = 0.0 + total_revenue = 0.0 + + for invoice in invoices: + tax_amount = float(invoice.tax_amount) if invoice.tax_amount else 0.0 + revenue = float(invoice.total_amount) if invoice.total_amount else 0.0 + total_tax += tax_amount + total_revenue += revenue + + tax_data.append({ + 'invoice_number': invoice.invoice_number, + 'date': invoice.paid_date.isoformat() if invoice.paid_date else None, + 'customer_name': invoice.customer_name, + 'customer_tax_id': invoice.customer_tax_id, + 'subtotal': float(invoice.subtotal) if invoice.subtotal else 0.0, + 'tax_rate': float(invoice.tax_rate) if invoice.tax_rate else 0.0, + 'tax_amount': tax_amount, + 'total_amount': revenue + }) + + if format == 'csv': + # Generate CSV + output = io.StringIO() + writer = csv.DictWriter(output, fieldnames=[ + 'invoice_number', 'date', 'customer_name', 'customer_tax_id', + 'subtotal', 'tax_rate', 'tax_amount', 'total_amount' + ]) + writer.writeheader() + writer.writerows(tax_data) + + return Response( + content=output.getvalue(), + media_type='text/csv', + headers={ + 'Content-Disposition': f'attachment; filename="tax_report_{start.strftime("%Y%m%d")}_{end.strftime("%Y%m%d")}.csv"' + } + ) + + return success_response(data={ + 'period': { + 'start_date': start.isoformat(), + 'end_date': end.isoformat() + }, + 'summary': { + 'total_revenue': float(total_revenue), + 'total_tax_collected': float(total_tax), + 'invoice_count': len(tax_data) + }, + 'transactions': tax_data + }) + except Exception as e: + logger.error(f'Error generating tax report: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + +@router.get('/payment-reconciliation') +async def get_payment_reconciliation( + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Generate payment reconciliation report.""" + try: + if start_date: + start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) + else: + start = datetime.utcnow() - timedelta(days=30) + + if end_date: + end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) + else: + end = datetime.utcnow() + + # Get all payments in period + payments = db.query(Payment).filter( + and_( + Payment.created_at >= start, + Payment.created_at <= end + ) + ).all() + + reconciliation = { + 'period': { + 'start_date': start.isoformat(), + 'end_date': end.isoformat() + }, + 'by_status': {}, + 'by_method': {}, + 'discrepancies': [] + } + + # Group by status + for status in PaymentStatus: + status_payments = [p for p in payments if p.payment_status == status] + total = sum(float(p.amount) for p in status_payments) + reconciliation['by_status'][status.value] = { + 'count': len(status_payments), + 'total_amount': float(total) + } + + # Group by payment method + for method in PaymentMethod: + method_payments = [p for p in payments if p.payment_method == method] + total = sum(float(p.amount) for p in method_payments) + reconciliation['by_method'][method.value] = { + 'count': len(method_payments), + 'total_amount': float(total) + } + + # Find discrepancies (payments without matching invoices, etc.) + for payment in payments: + if payment.payment_status == PaymentStatus.completed: + # Check if invoice exists + invoice = db.query(Invoice).filter( + Invoice.booking_id == payment.booking_id + ).first() + + if not invoice: + reconciliation['discrepancies'].append({ + 'type': 'missing_invoice', + 'payment_id': payment.id, + 'booking_id': payment.booking_id, + 'amount': float(payment.amount), + 'date': payment.payment_date.isoformat() if payment.payment_date else None + }) + + return success_response(data=reconciliation) + except Exception as e: + logger.error(f'Error generating payment reconciliation: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + +@router.get('/refunds') +async def get_refund_history( + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Get refund history and statistics.""" + try: + query = db.query(Payment).filter( + Payment.payment_status == PaymentStatus.refunded + ) + + if start_date: + start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) + query = query.filter(Payment.payment_date >= start) + + if end_date: + end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) + query = query.filter(Payment.payment_date <= end) + + refunds = query.order_by(Payment.payment_date.desc()).all() + + total_refunded = sum(float(p.amount) for p in refunds) + + refund_list = [] + for refund in refunds: + refund_list.append({ + 'id': refund.id, + 'booking_id': refund.booking_id, + 'amount': float(refund.amount), + 'payment_method': refund.payment_method.value if hasattr(refund.payment_method, 'value') else str(refund.payment_method), + 'refund_date': refund.payment_date.isoformat() if refund.payment_date else None, + 'transaction_id': refund.transaction_id, + 'notes': refund.notes + }) + + return success_response(data={ + 'total_refunds': len(refunds), + 'total_refunded_amount': float(total_refunded), + 'refunds': refund_list + }) + except Exception as e: + logger.error(f'Error fetching refund history: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + diff --git a/Backend/src/payments/routes/payment_routes.py b/Backend/src/payments/routes/payment_routes.py index 8bdaf1c7..dc1753cf 100644 --- a/Backend/src/payments/routes/payment_routes.py +++ b/Backend/src/payments/routes/payment_routes.py @@ -1,5 +1,6 @@ from fastapi import APIRouter, Depends, HTTPException, status, Query, Request, Header from sqlalchemy.orm import Session, joinedload, selectinload, load_only +from sqlalchemy.exc import IntegrityError from typing import Optional from datetime import datetime import os @@ -20,7 +21,19 @@ from ..services.paypal_service import PayPalService from ..services.borica_service import BoricaService from ...loyalty.services.loyalty_service import LoyaltyService from ...analytics.services.audit_service import audit_service -from ..schemas.payment import CreatePaymentRequest, UpdatePaymentStatusRequest, CreateStripePaymentIntentRequest +from ..services.financial_audit_service import financial_audit_service +from ..models.financial_audit_trail import FinancialActionType +from ..schemas.payment import ( + CreatePaymentRequest, + UpdatePaymentStatusRequest, + CreateStripePaymentIntentRequest, + ConfirmStripePaymentRequest, + CreatePayPalOrderRequest, + CancelPayPalPaymentRequest, + CapturePayPalPaymentRequest, + CreateBoricaPaymentRequest, + ConfirmBoricaPaymentRequest +) logger = get_logger(__name__) router = APIRouter(prefix='/payments', tags=['payments']) @@ -186,6 +199,11 @@ async def create_payment( user_agent = request.headers.get('User-Agent') request_id = getattr(request.state, 'request_id', None) + import logging + logger = logging.getLogger(__name__) + + # Start transaction + transaction = db.begin() try: booking_id = payment_data.booking_id amount = payment_data.amount @@ -193,19 +211,56 @@ async def create_payment( payment_type = payment_data.payment_type mark_as_paid = payment_data.mark_as_paid notes = payment_data.notes + idempotency_key = payment_data.idempotency_key - booking = db.query(Booking).filter(Booking.id == booking_id).first() + # Idempotency check: if idempotency_key provided, check for existing payment + if idempotency_key: + existing_payment = db.query(Payment).filter( + Payment.transaction_id == idempotency_key, + Payment.booking_id == booking_id, + Payment.amount == amount + ).first() + if existing_payment: + transaction.rollback() + logger.info(f'Duplicate payment request detected with idempotency_key: {idempotency_key}') + return success_response( + data={'payment': existing_payment}, + message='Payment already exists (idempotency check)' + ) + + # Lock booking row to prevent race conditions + booking = db.query(Booking).filter(Booking.id == booking_id).with_for_update().first() if not booking: + transaction.rollback() raise HTTPException(status_code=404, detail='Booking not found') + from ...shared.utils.role_helpers import is_admin if not is_admin(current_user, db) and booking.user_id != current_user.id: + transaction.rollback() raise HTTPException(status_code=403, detail='Forbidden') - payment = Payment(booking_id=booking_id, amount=amount, payment_method=PaymentMethod(payment_method), payment_type=PaymentType(payment_type), payment_status=PaymentStatus.pending, payment_date=datetime.utcnow() if mark_as_paid else None, notes=notes) + + # Use idempotency_key as transaction_id if provided + transaction_id = idempotency_key if idempotency_key else None + + payment = Payment( + booking_id=booking_id, + amount=amount, + payment_method=PaymentMethod(payment_method), + payment_type=PaymentType(payment_type), + payment_status=PaymentStatus.pending, + payment_date=datetime.utcnow() if mark_as_paid else None, + notes=notes, + transaction_id=transaction_id + ) if mark_as_paid: payment.payment_status = PaymentStatus.completed payment.payment_date = datetime.utcnow() + db.add(payment) - db.commit() + db.flush() + + # Commit transaction + transaction.commit() db.refresh(payment) # Send payment receipt notification @@ -278,9 +333,21 @@ async def create_payment( return success_response(data={'payment': payment}, message='Payment created successfully') except HTTPException: + if 'transaction' in locals(): + transaction.rollback() raise + except IntegrityError as e: + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Database integrity error during payment creation: {str(e)}') + # Check if it's a duplicate payment error + if 'duplicate' in str(e).lower() or 'unique' in str(e).lower(): + raise HTTPException(status_code=409, detail='Duplicate payment detected. Please check if payment already exists.') + raise HTTPException(status_code=409, detail='Payment conflict detected. Please try again.') except Exception as e: - db.rollback() + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Error creating payment: {str(e)}', exc_info=True) # Log failed payment creation await audit_service.log_action( db=db, @@ -482,12 +549,11 @@ async def create_stripe_payment_intent(intent_data: CreateStripePaymentIntentReq raise HTTPException(status_code=500, detail=str(e)) @router.post('/stripe/confirm') -async def confirm_stripe_payment(payment_data: dict, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): +async def confirm_stripe_payment(payment_data: ConfirmStripePaymentRequest, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): + """Confirm a Stripe payment with validated input using Pydantic schema.""" try: - payment_intent_id = payment_data.get('payment_intent_id') - booking_id = payment_data.get('booking_id') - if not payment_intent_id: - raise HTTPException(status_code=400, detail='payment_intent_id is required') + payment_intent_id = payment_data.payment_intent_id + booking_id = payment_data.booking_id payment = await StripeService.confirm_payment(payment_intent_id=payment_intent_id, db=db, booking_id=booking_id) try: db.commit() @@ -549,7 +615,7 @@ async def stripe_webhook(request: Request, db: Session=Depends(get_db)): raise HTTPException(status_code=500, detail=str(e)) @router.post('/paypal/create-order') -async def create_paypal_order(order_data: dict, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): +async def create_paypal_order(order_data: CreatePayPalOrderRequest, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): try: from ..services.paypal_service import get_paypal_client_id, get_paypal_client_secret client_id = get_paypal_client_id(db) @@ -560,11 +626,9 @@ async def create_paypal_order(order_data: dict, current_user: User=Depends(get_c client_secret = settings.PAYPAL_CLIENT_SECRET if not client_id or not client_secret: raise HTTPException(status_code=500, detail='PayPal is not configured. Please configure PayPal settings in Admin Panel or set PAYPAL_CLIENT_ID and PAYPAL_CLIENT_SECRET environment variables.') - booking_id = order_data.get('booking_id') - amount = float(order_data.get('amount', 0)) - currency = order_data.get('currency', 'USD') - if not booking_id or amount <= 0: - raise HTTPException(status_code=400, detail='booking_id and amount are required') + booking_id = order_data.booking_id + amount = float(order_data.amount) + currency = order_data.currency or 'USD' if amount > 100000: raise HTTPException(status_code=400, detail=f"Amount ${amount:,.2f} exceeds PayPal's maximum of $100,000. Please contact support for large payments.") from ...shared.utils.role_helpers import is_admin @@ -603,11 +667,9 @@ async def create_paypal_order(order_data: dict, current_user: User=Depends(get_c raise HTTPException(status_code=500, detail=str(e)) @router.post('/paypal/cancel') -async def cancel_paypal_payment(payment_data: dict, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): +async def cancel_paypal_payment(payment_data: CancelPayPalPaymentRequest, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): try: - booking_id = payment_data.get('booking_id') - if not booking_id: - raise HTTPException(status_code=400, detail='booking_id is required') + booking_id = payment_data.booking_id payment = db.query(Payment).filter(Payment.booking_id == booking_id, Payment.payment_method == PaymentMethod.paypal, Payment.payment_status == PaymentStatus.pending).order_by(Payment.created_at.desc()).first() if not payment: payment = db.query(Payment).filter(Payment.booking_id == booking_id, Payment.payment_type == PaymentType.deposit, Payment.payment_status == PaymentStatus.pending).order_by(Payment.created_at.desc()).first() @@ -627,12 +689,10 @@ async def cancel_paypal_payment(payment_data: dict, current_user: User=Depends(g raise HTTPException(status_code=500, detail=str(e)) @router.post('/paypal/capture') -async def capture_paypal_payment(payment_data: dict, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): +async def capture_paypal_payment(payment_data: CapturePayPalPaymentRequest, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): try: - order_id = payment_data.get('order_id') - booking_id = payment_data.get('booking_id') - if not order_id: - raise HTTPException(status_code=400, detail='order_id is required') + order_id = payment_data.order_id + booking_id = payment_data.booking_id payment = await PayPalService.confirm_payment(order_id=order_id, db=db, booking_id=booking_id) try: db.commit() @@ -673,7 +733,7 @@ async def capture_paypal_payment(payment_data: dict, current_user: User=Depends( raise HTTPException(status_code=500, detail=str(e)) @router.post('/borica/create-payment') -async def create_borica_payment(payment_data: dict, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): +async def create_borica_payment(payment_data: CreateBoricaPaymentRequest, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): try: from ..services.borica_service import get_borica_terminal_id, get_borica_merchant_id terminal_id = get_borica_terminal_id(db) @@ -681,11 +741,9 @@ async def create_borica_payment(payment_data: dict, current_user: User=Depends(g if not terminal_id or not merchant_id: if not settings.BORICA_TERMINAL_ID or not settings.BORICA_MERCHANT_ID: raise HTTPException(status_code=500, detail='Borica is not configured. Please configure Borica settings in Admin Panel or set BORICA_TERMINAL_ID and BORICA_MERCHANT_ID environment variables.') - booking_id = payment_data.get('booking_id') - amount = float(payment_data.get('amount', 0)) - currency = payment_data.get('currency', 'BGN') - if not booking_id or amount <= 0: - raise HTTPException(status_code=400, detail='booking_id and amount are required') + booking_id = payment_data.booking_id + amount = float(payment_data.amount) + currency = payment_data.currency or 'BGN' if amount > 100000: raise HTTPException(status_code=400, detail=f"Amount {amount:,.2f} exceeds maximum of 100,000. Please contact support for large payments.") from ...shared.utils.role_helpers import is_admin @@ -705,7 +763,7 @@ async def create_borica_payment(payment_data: dict, current_user: User=Depends(g raise HTTPException(status_code=400, detail=f'For pay-on-arrival bookings, only the deposit amount ({expected_deposit_amount:,.2f}) should be charged, not the full booking amount ({float(booking.total_price):,.2f}).') transaction_id = BoricaService.generate_transaction_id(booking_id) client_url = settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') - return_url = payment_data.get('return_url', f'{client_url}/payment/borica/return') + return_url = f'{client_url}/payment/borica/return' description = f'Hotel Booking Payment - {booking.booking_number}' payment_request = BoricaService.create_payment_request(amount=amount, currency=currency, order_id=transaction_id, description=description, return_url=return_url, db=db) payment_type = PaymentType.full diff --git a/Backend/src/payments/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d9ad208f Binary files /dev/null and b/Backend/src/payments/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/payments/schemas/__pycache__/invoice.cpython-312.pyc b/Backend/src/payments/schemas/__pycache__/invoice.cpython-312.pyc new file mode 100644 index 00000000..6522444e Binary files /dev/null and b/Backend/src/payments/schemas/__pycache__/invoice.cpython-312.pyc differ diff --git a/Backend/src/payments/schemas/__pycache__/payment.cpython-312.pyc b/Backend/src/payments/schemas/__pycache__/payment.cpython-312.pyc new file mode 100644 index 00000000..027be558 Binary files /dev/null and b/Backend/src/payments/schemas/__pycache__/payment.cpython-312.pyc differ diff --git a/Backend/src/payments/schemas/payment.py b/Backend/src/payments/schemas/payment.py index b7051e0f..7a7121a8 100644 --- a/Backend/src/payments/schemas/payment.py +++ b/Backend/src/payments/schemas/payment.py @@ -13,6 +13,7 @@ class CreatePaymentRequest(BaseModel): payment_type: str = Field("full", description="Payment type (full, deposit)") mark_as_paid: Optional[bool] = Field(False, description="Mark payment as completed immediately") notes: Optional[str] = Field(None, max_length=1000, description="Payment notes") + idempotency_key: Optional[str] = Field(None, max_length=255, description="Idempotency key to prevent duplicate payments") @field_validator('payment_method') @classmethod @@ -53,3 +54,67 @@ class CreateStripePaymentIntentRequest(BaseModel): raise ValueError(f"Amount ${v:,.2f} exceeds Stripe's maximum of $999,999.99") return v + @field_validator('currency') + @classmethod + def validate_currency(cls, v: Optional[str]) -> Optional[str]: + """Validate currency code.""" + if v: + # Basic currency code validation (3 uppercase letters) + if not v.isupper() or len(v) != 3 or not v.isalpha(): + raise ValueError('Currency must be a valid 3-letter uppercase code (e.g., USD, EUR)') + return v + + +class ConfirmStripePaymentRequest(BaseModel): + """Schema for confirming a Stripe payment.""" + payment_intent_id: str = Field(..., min_length=1, max_length=255, description="Stripe payment intent ID") + booking_id: Optional[int] = Field(None, gt=0, description="Optional booking ID for validation") + + +class CreatePayPalOrderRequest(BaseModel): + """Schema for creating a PayPal order.""" + booking_id: int = Field(..., gt=0, description="Booking ID") + amount: float = Field(..., gt=0, le=999999.99, description="Payment amount") + currency: Optional[str] = Field("USD", description="Currency code") + + @field_validator('currency') + @classmethod + def validate_currency(cls, v: Optional[str]) -> Optional[str]: + """Validate currency code.""" + if v: + if not v.isupper() or len(v) != 3 or not v.isalpha(): + raise ValueError('Currency must be a valid 3-letter uppercase code (e.g., USD, EUR)') + return v + + +class CancelPayPalPaymentRequest(BaseModel): + """Schema for canceling a PayPal payment.""" + order_id: str = Field(..., min_length=1, max_length=255, description="PayPal order ID") + booking_id: Optional[int] = Field(None, gt=0, description="Optional booking ID") + + +class CapturePayPalPaymentRequest(BaseModel): + """Schema for capturing a PayPal payment.""" + order_id: str = Field(..., min_length=1, max_length=255, description="PayPal order ID") + booking_id: Optional[int] = Field(None, gt=0, description="Optional booking ID") + + +class CreateBoricaPaymentRequest(BaseModel): + """Schema for creating a Borica payment.""" + booking_id: int = Field(..., gt=0, description="Booking ID") + amount: float = Field(..., gt=0, le=999999.99, description="Payment amount") + currency: Optional[str] = Field("BGN", description="Currency code (default: BGN)") + + @field_validator('currency') + @classmethod + def validate_currency(cls, v: Optional[str]) -> Optional[str]: + """Validate currency code.""" + if v: + if not v.isupper() or len(v) != 3 or not v.isalpha(): + raise ValueError('Currency must be a valid 3-letter uppercase code (e.g., BGN, USD)') + return v + + +class ConfirmBoricaPaymentRequest(BaseModel): + """Schema for confirming a Borica payment (webhook).""" + response_data: dict = Field(..., description="Borica payment response data") diff --git a/Backend/src/payments/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..e4adb5ce Binary files /dev/null and b/Backend/src/payments/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/payments/services/__pycache__/borica_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/borica_service.cpython-312.pyc new file mode 100644 index 00000000..089bf2ed Binary files /dev/null and b/Backend/src/payments/services/__pycache__/borica_service.cpython-312.pyc differ diff --git a/Backend/src/payments/services/__pycache__/financial_audit_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/financial_audit_service.cpython-312.pyc new file mode 100644 index 00000000..1f9773eb Binary files /dev/null and b/Backend/src/payments/services/__pycache__/financial_audit_service.cpython-312.pyc differ diff --git a/Backend/src/payments/services/__pycache__/invoice_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/invoice_service.cpython-312.pyc new file mode 100644 index 00000000..92d4e2ba Binary files /dev/null and b/Backend/src/payments/services/__pycache__/invoice_service.cpython-312.pyc differ diff --git a/Backend/src/payments/services/__pycache__/paypal_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/paypal_service.cpython-312.pyc new file mode 100644 index 00000000..77d2f938 Binary files /dev/null and b/Backend/src/payments/services/__pycache__/paypal_service.cpython-312.pyc differ diff --git a/Backend/src/payments/services/__pycache__/stripe_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/stripe_service.cpython-312.pyc new file mode 100644 index 00000000..72273307 Binary files /dev/null and b/Backend/src/payments/services/__pycache__/stripe_service.cpython-312.pyc differ diff --git a/Backend/src/payments/services/financial_audit_service.py b/Backend/src/payments/services/financial_audit_service.py new file mode 100644 index 00000000..44e9f36e --- /dev/null +++ b/Backend/src/payments/services/financial_audit_service.py @@ -0,0 +1,102 @@ +""" +Service for creating and managing financial audit trail records. +""" +from sqlalchemy.orm import Session +from typing import Optional, Dict, Any +from datetime import datetime +from ..models.financial_audit_trail import FinancialAuditTrail, FinancialActionType +from ...auth.models.user import User +from ...shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +class FinancialAuditService: + """Service for financial audit trail operations.""" + + @staticmethod + def log_financial_action( + db: Session, + action_type: FinancialActionType, + performed_by: int, + action_description: str, + payment_id: Optional[int] = None, + invoice_id: Optional[int] = None, + booking_id: Optional[int] = None, + amount: Optional[float] = None, + previous_amount: Optional[float] = None, + currency: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None, + notes: Optional[str] = None + ) -> FinancialAuditTrail: + """Log a financial action to the audit trail.""" + try: + # Get user email for audit trail + user = db.query(User).filter(User.id == performed_by).first() + user_email = user.email if user else None + + audit_record = FinancialAuditTrail( + action_type=action_type, + action_description=action_description, + payment_id=payment_id, + invoice_id=invoice_id, + booking_id=booking_id, + amount=amount, + previous_amount=previous_amount, + currency=currency or 'USD', + performed_by=performed_by, + performed_by_email=user_email, + audit_metadata=metadata or {}, + notes=notes, + created_at=datetime.utcnow() + ) + + db.add(audit_record) + db.flush() # Flush to get ID without committing + + logger.info(f"Financial audit trail created: {action_type.value} by user {performed_by}") + return audit_record + except Exception as e: + logger.error(f"Error creating financial audit trail: {str(e)}", exc_info=True) + # Don't fail the main operation if audit logging fails + raise + + @staticmethod + def get_audit_trail( + db: Session, + payment_id: Optional[int] = None, + invoice_id: Optional[int] = None, + booking_id: Optional[int] = None, + action_type: Optional[FinancialActionType] = None, + user_id: Optional[int] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + limit: int = 100, + offset: int = 0 + ) -> list[FinancialAuditTrail]: + """Get audit trail records with filters.""" + query = db.query(FinancialAuditTrail) + + if payment_id: + query = query.filter(FinancialAuditTrail.payment_id == payment_id) + if invoice_id: + query = query.filter(FinancialAuditTrail.invoice_id == invoice_id) + if booking_id: + query = query.filter(FinancialAuditTrail.booking_id == booking_id) + if action_type: + query = query.filter(FinancialAuditTrail.action_type == action_type) + if user_id: + query = query.filter(FinancialAuditTrail.performed_by == user_id) + if start_date: + query = query.filter(FinancialAuditTrail.created_at >= start_date) + if end_date: + query = query.filter(FinancialAuditTrail.created_at <= end_date) + + query = query.order_by(FinancialAuditTrail.created_at.desc()) + query = query.limit(limit).offset(offset) + + return query.all() + + +financial_audit_service = FinancialAuditService() + diff --git a/Backend/src/payments/services/invoice_service.py b/Backend/src/payments/services/invoice_service.py index 85c4802c..bacd51f6 100644 --- a/Backend/src/payments/services/invoice_service.py +++ b/Backend/src/payments/services/invoice_service.py @@ -34,116 +34,134 @@ class InvoiceService: from ...rooms.models.room import Room from ...rooms.models.room_type import RoomType from ...hotel_services.models.service import Service + from sqlalchemy.exc import IntegrityError logger.info(f'Creating invoice from booking {booking_id}', extra={'booking_id': booking_id, 'request_id': request_id}) - booking = db.query(Booking).options( - selectinload(Booking.service_usages).selectinload(ServiceUsage.service), - selectinload(Booking.room).selectinload(Room.room_type), - selectinload(Booking.payments) - ).filter(Booking.id == booking_id).first() - if not booking: - logger.error(f'Booking {booking_id} not found', extra={'booking_id': booking_id, 'request_id': request_id}) - raise ValueError('Booking not found') - user = db.query(User).filter(User.id == booking.user_id).first() - if not user: - raise ValueError('User not found') - # Get tax_rate from system settings if not provided or is 0 - if tax_rate == 0.0: - tax_rate_setting = db.query(SystemSettings).filter(SystemSettings.key == 'tax_rate').first() - if tax_rate_setting and tax_rate_setting.value: - try: - tax_rate = float(tax_rate_setting.value) - except (ValueError, TypeError): - tax_rate = 0.0 + # Start transaction + transaction = db.begin() + try: + # Lock booking row to prevent race conditions + booking = db.query(Booking).options( + selectinload(Booking.service_usages).selectinload(ServiceUsage.service), + selectinload(Booking.room).selectinload(Room.room_type), + selectinload(Booking.payments) + ).filter(Booking.id == booking_id).with_for_update().first() + if not booking: + transaction.rollback() + logger.error(f'Booking {booking_id} not found', extra={'booking_id': booking_id, 'request_id': request_id}) + raise ValueError('Booking not found') + user = db.query(User).filter(User.id == booking.user_id).first() + if not user: + transaction.rollback() + raise ValueError('User not found') - invoice_number = generate_invoice_number(db, is_proforma=is_proforma) - booking_total = float(booking.total_price) - if invoice_amount is not None: - subtotal = float(invoice_amount) - if invoice_amount < booking_total and discount_amount > 0: - if discount_amount > subtotal * 0.5: - proportion = float(invoice_amount) / booking_total - original_discount = float(booking.discount_amount) if booking.discount_amount else discount_amount - discount_amount = original_discount * proportion - else: - subtotal = booking_total - tax_amount = (subtotal - discount_amount) * (tax_rate / 100) - total_amount = subtotal + tax_amount - discount_amount - amount_paid = sum((float(p.amount) for p in booking.payments if p.payment_status == PaymentStatus.completed)) - balance_due = total_amount - amount_paid - if balance_due <= 0: - status = InvoiceStatus.paid - paid_date = datetime.utcnow() - elif amount_paid > 0: - status = InvoiceStatus.sent - paid_date = None - else: - status = InvoiceStatus.draft - paid_date = None - # Get company information from system settings if not provided - company_name = kwargs.get('company_name') - company_address = kwargs.get('company_address') - company_phone = kwargs.get('company_phone') - company_email = kwargs.get('company_email') - company_tax_id = kwargs.get('company_tax_id') - company_logo_url = kwargs.get('company_logo_url') - - # If company info not provided, fetch from system settings - if not company_name or not company_address or not company_phone or not company_email: - company_settings = db.query(SystemSettings).filter( - SystemSettings.key.in_(['company_name', 'company_address', 'company_phone', 'company_email', 'company_logo_url']) - ).all() + # Get tax_rate from system settings if not provided or is 0 + if tax_rate == 0.0: + tax_rate_setting = db.query(SystemSettings).filter(SystemSettings.key == 'tax_rate').first() + if tax_rate_setting and tax_rate_setting.value: + try: + tax_rate = float(tax_rate_setting.value) + except (ValueError, TypeError): + tax_rate = 0.0 - settings_dict = {setting.key: setting.value for setting in company_settings if setting.value} + invoice_number = generate_invoice_number(db, is_proforma=is_proforma) + booking_total = float(booking.total_price) + if invoice_amount is not None: + subtotal = float(invoice_amount) + if invoice_amount < booking_total and discount_amount > 0: + if discount_amount > subtotal * 0.5: + proportion = float(invoice_amount) / booking_total + original_discount = float(booking.discount_amount) if booking.discount_amount else discount_amount + discount_amount = original_discount * proportion + else: + subtotal = booking_total + tax_amount = (subtotal - discount_amount) * (tax_rate / 100) + total_amount = subtotal + tax_amount - discount_amount + amount_paid = sum((float(p.amount) for p in booking.payments if p.payment_status == PaymentStatus.completed)) + balance_due = total_amount - amount_paid + if balance_due <= 0: + status = InvoiceStatus.paid + paid_date = datetime.utcnow() + elif amount_paid > 0: + status = InvoiceStatus.sent + paid_date = None + else: + status = InvoiceStatus.draft + paid_date = None + # Get company information from system settings if not provided + company_name = kwargs.get('company_name') + company_address = kwargs.get('company_address') + company_phone = kwargs.get('company_phone') + company_email = kwargs.get('company_email') + company_tax_id = kwargs.get('company_tax_id') + company_logo_url = kwargs.get('company_logo_url') - if not company_name and settings_dict.get('company_name'): - company_name = settings_dict['company_name'] - if not company_address and settings_dict.get('company_address'): - company_address = settings_dict['company_address'] - if not company_phone and settings_dict.get('company_phone'): - company_phone = settings_dict['company_phone'] - if not company_email and settings_dict.get('company_email'): - company_email = settings_dict['company_email'] - if not company_logo_url and settings_dict.get('company_logo_url'): - company_logo_url = settings_dict['company_logo_url'] - - invoice = Invoice(invoice_number=invoice_number, booking_id=booking_id, user_id=booking.user_id, issue_date=datetime.utcnow(), due_date=datetime.utcnow() + timedelta(days=due_days), paid_date=paid_date, subtotal=subtotal, tax_rate=tax_rate, tax_amount=tax_amount, discount_amount=discount_amount, total_amount=total_amount, amount_paid=amount_paid, balance_due=balance_due, status=status, is_proforma=is_proforma, company_name=company_name, company_address=company_address, company_phone=company_phone, company_email=company_email, company_tax_id=company_tax_id, company_logo_url=company_logo_url, customer_name=user.full_name or f'{user.email}', customer_email=user.email, customer_address=user.address, customer_phone=user.phone, customer_tax_id=kwargs.get('customer_tax_id'), notes=kwargs.get('notes'), terms_and_conditions=kwargs.get('terms_and_conditions'), payment_instructions=kwargs.get('payment_instructions'), created_by_id=created_by_id) - db.add(invoice) - db.flush() - services_total = sum((float(su.total_price) for su in booking.service_usages)) - booking_total = float(booking.total_price) - room_price = booking_total - services_total - nights = (booking.check_out_date - booking.check_in_date).days - if nights <= 0: - nights = 1 - if invoice_amount is not None and invoice_amount < booking_total: - proportion = float(invoice_amount) / booking_total - room_price = room_price * proportion - services_total = services_total * proportion - item_description_suffix = f' (Partial: {proportion * 100:.0f}%)' - else: - item_description_suffix = '' - room_item = InvoiceItem(invoice_id=invoice.id, description=f'Room: {booking.room.room_number} - {(booking.room.room_type.name if booking.room.room_type else 'N/A')} ({nights} night{('s' if nights > 1 else '')}){item_description_suffix}', quantity=nights, unit_price=room_price / nights if nights > 0 else room_price, tax_rate=tax_rate, discount_amount=0.0, line_total=room_price, room_id=booking.room_id) - db.add(room_item) - for service_usage in booking.service_usages: - service_item_price = float(service_usage.total_price) + # If company info not provided, fetch from system settings + if not company_name or not company_address or not company_phone or not company_email: + company_settings = db.query(SystemSettings).filter( + SystemSettings.key.in_(['company_name', 'company_address', 'company_phone', 'company_email', 'company_logo_url']) + ).all() + + settings_dict = {setting.key: setting.value for setting in company_settings if setting.value} + + if not company_name and settings_dict.get('company_name'): + company_name = settings_dict['company_name'] + if not company_address and settings_dict.get('company_address'): + company_address = settings_dict['company_address'] + if not company_phone and settings_dict.get('company_phone'): + company_phone = settings_dict['company_phone'] + if not company_email and settings_dict.get('company_email'): + company_email = settings_dict['company_email'] + if not company_logo_url and settings_dict.get('company_logo_url'): + company_logo_url = settings_dict['company_logo_url'] + + invoice = Invoice(invoice_number=invoice_number, booking_id=booking_id, user_id=booking.user_id, issue_date=datetime.utcnow(), due_date=datetime.utcnow() + timedelta(days=due_days), paid_date=paid_date, subtotal=subtotal, tax_rate=tax_rate, tax_amount=tax_amount, discount_amount=discount_amount, total_amount=total_amount, amount_paid=amount_paid, balance_due=balance_due, status=status, is_proforma=is_proforma, company_name=company_name, company_address=company_address, company_phone=company_phone, company_email=company_email, company_tax_id=company_tax_id, company_logo_url=company_logo_url, customer_name=user.full_name or f'{user.email}', customer_email=user.email, customer_address=user.address, customer_phone=user.phone, customer_tax_id=kwargs.get('customer_tax_id'), notes=kwargs.get('notes'), terms_and_conditions=kwargs.get('terms_and_conditions'), payment_instructions=kwargs.get('payment_instructions'), created_by_id=created_by_id) + db.add(invoice) + db.flush() + services_total = sum((float(su.total_price) for su in booking.service_usages)) + booking_total = float(booking.total_price) + room_price = booking_total - services_total + nights = (booking.check_out_date - booking.check_in_date).days + if nights <= 0: + nights = 1 if invoice_amount is not None and invoice_amount < booking_total: proportion = float(invoice_amount) / booking_total - service_item_price = service_item_price * proportion - service_item = InvoiceItem(invoice_id=invoice.id, description=f'Service: {service_usage.service.name}{item_description_suffix}', quantity=float(service_usage.quantity), unit_price=service_item_price / float(service_usage.quantity) if service_usage.quantity > 0 else service_item_price, tax_rate=tax_rate, discount_amount=0.0, line_total=service_item_price, service_id=service_usage.service_id) - db.add(service_item) - subtotal = room_price + services_total - tax_amount = (subtotal - discount_amount) * (tax_rate / 100) - total_amount = subtotal + tax_amount - discount_amount - balance_due = total_amount - amount_paid - invoice.subtotal = subtotal - invoice.tax_amount = tax_amount - invoice.total_amount = total_amount - invoice.balance_due = balance_due - db.commit() - db.refresh(invoice) - return InvoiceService.invoice_to_dict(invoice) + room_price = room_price * proportion + services_total = services_total * proportion + item_description_suffix = f' (Partial: {proportion * 100:.0f}%)' + else: + item_description_suffix = '' + room_item = InvoiceItem(invoice_id=invoice.id, description=f'Room: {booking.room.room_number} - {(booking.room.room_type.name if booking.room.room_type else 'N/A')} ({nights} night{('s' if nights > 1 else '')}){item_description_suffix}', quantity=nights, unit_price=room_price / nights if nights > 0 else room_price, tax_rate=tax_rate, discount_amount=0.0, line_total=room_price, room_id=booking.room_id) + db.add(room_item) + for service_usage in booking.service_usages: + service_item_price = float(service_usage.total_price) + if invoice_amount is not None and invoice_amount < booking_total: + proportion = float(invoice_amount) / booking_total + service_item_price = service_item_price * proportion + service_item = InvoiceItem(invoice_id=invoice.id, description=f'Service: {service_usage.service.name}{item_description_suffix}', quantity=float(service_usage.quantity), unit_price=service_item_price / float(service_usage.quantity) if service_usage.quantity > 0 else service_item_price, tax_rate=tax_rate, discount_amount=0.0, line_total=service_item_price, service_id=service_usage.service_id) + db.add(service_item) + subtotal = room_price + services_total + tax_amount = (subtotal - discount_amount) * (tax_rate / 100) + total_amount = subtotal + tax_amount - discount_amount + balance_due = total_amount - amount_paid + invoice.subtotal = subtotal + invoice.tax_amount = tax_amount + invoice.total_amount = total_amount + invoice.balance_due = balance_due + + # Commit transaction + transaction.commit() + db.refresh(invoice) + return InvoiceService.invoice_to_dict(invoice) + except IntegrityError as e: + transaction.rollback() + logger.error(f'Database integrity error during invoice creation: {str(e)}', extra={'booking_id': booking_id, 'request_id': request_id}) + raise ValueError(f'Invoice creation failed due to database conflict: {str(e)}') + except Exception as e: + transaction.rollback() + logger.error(f'Error creating invoice: {str(e)}', extra={'booking_id': booking_id, 'request_id': request_id}, exc_info=True) + raise @staticmethod def update_invoice(invoice_id: int, db: Session, updated_by_id: Optional[int]=None, request_id: Optional[str]=None, **kwargs) -> Dict[str, Any]: diff --git a/Backend/src/reviews/__pycache__/__init__.cpython-312.pyc b/Backend/src/reviews/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..8fa33815 Binary files /dev/null and b/Backend/src/reviews/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/reviews/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/reviews/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..4ad77b12 Binary files /dev/null and b/Backend/src/reviews/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/reviews/models/__pycache__/favorite.cpython-312.pyc b/Backend/src/reviews/models/__pycache__/favorite.cpython-312.pyc new file mode 100644 index 00000000..e218dbde Binary files /dev/null and b/Backend/src/reviews/models/__pycache__/favorite.cpython-312.pyc differ diff --git a/Backend/src/reviews/models/__pycache__/review.cpython-312.pyc b/Backend/src/reviews/models/__pycache__/review.cpython-312.pyc new file mode 100644 index 00000000..77402580 Binary files /dev/null and b/Backend/src/reviews/models/__pycache__/review.cpython-312.pyc differ diff --git a/Backend/src/reviews/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/reviews/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3b2ae01b Binary files /dev/null and b/Backend/src/reviews/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/reviews/routes/__pycache__/favorite_routes.cpython-312.pyc b/Backend/src/reviews/routes/__pycache__/favorite_routes.cpython-312.pyc new file mode 100644 index 00000000..c2b682aa Binary files /dev/null and b/Backend/src/reviews/routes/__pycache__/favorite_routes.cpython-312.pyc differ diff --git a/Backend/src/reviews/routes/__pycache__/review_routes.cpython-312.pyc b/Backend/src/reviews/routes/__pycache__/review_routes.cpython-312.pyc new file mode 100644 index 00000000..dfb10967 Binary files /dev/null and b/Backend/src/reviews/routes/__pycache__/review_routes.cpython-312.pyc differ diff --git a/Backend/src/reviews/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/reviews/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9dcbbe5c Binary files /dev/null and b/Backend/src/reviews/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/reviews/schemas/__pycache__/review.cpython-312.pyc b/Backend/src/reviews/schemas/__pycache__/review.cpython-312.pyc new file mode 100644 index 00000000..620f7b67 Binary files /dev/null and b/Backend/src/reviews/schemas/__pycache__/review.cpython-312.pyc differ diff --git a/Backend/src/rooms/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..705966d3 Binary files /dev/null and b/Backend/src/rooms/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/rooms/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..cadfed9e Binary files /dev/null and b/Backend/src/rooms/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/rooms/models/__pycache__/rate_plan.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/rate_plan.cpython-312.pyc new file mode 100644 index 00000000..d1d813c0 Binary files /dev/null and b/Backend/src/rooms/models/__pycache__/rate_plan.cpython-312.pyc differ diff --git a/Backend/src/rooms/models/__pycache__/room.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room.cpython-312.pyc new file mode 100644 index 00000000..6fbf789f Binary files /dev/null and b/Backend/src/rooms/models/__pycache__/room.cpython-312.pyc differ diff --git a/Backend/src/rooms/models/__pycache__/room_attribute.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_attribute.cpython-312.pyc new file mode 100644 index 00000000..96582ddc Binary files /dev/null and b/Backend/src/rooms/models/__pycache__/room_attribute.cpython-312.pyc differ diff --git a/Backend/src/rooms/models/__pycache__/room_inspection.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_inspection.cpython-312.pyc new file mode 100644 index 00000000..1c15dba0 Binary files /dev/null and b/Backend/src/rooms/models/__pycache__/room_inspection.cpython-312.pyc differ diff --git a/Backend/src/rooms/models/__pycache__/room_maintenance.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_maintenance.cpython-312.pyc new file mode 100644 index 00000000..75335f56 Binary files /dev/null and b/Backend/src/rooms/models/__pycache__/room_maintenance.cpython-312.pyc differ diff --git a/Backend/src/rooms/models/__pycache__/room_type.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_type.cpython-312.pyc new file mode 100644 index 00000000..717372ac Binary files /dev/null and b/Backend/src/rooms/models/__pycache__/room_type.cpython-312.pyc differ diff --git a/Backend/src/rooms/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..0496561a Binary files /dev/null and b/Backend/src/rooms/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/rooms/routes/__pycache__/advanced_room_routes.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/advanced_room_routes.cpython-312.pyc new file mode 100644 index 00000000..15b8a060 Binary files /dev/null and b/Backend/src/rooms/routes/__pycache__/advanced_room_routes.cpython-312.pyc differ diff --git a/Backend/src/rooms/routes/__pycache__/rate_plan_routes.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/rate_plan_routes.cpython-312.pyc new file mode 100644 index 00000000..f4cb5eea Binary files /dev/null and b/Backend/src/rooms/routes/__pycache__/rate_plan_routes.cpython-312.pyc differ diff --git a/Backend/src/rooms/routes/__pycache__/room_routes.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/room_routes.cpython-312.pyc new file mode 100644 index 00000000..1987291f Binary files /dev/null and b/Backend/src/rooms/routes/__pycache__/room_routes.cpython-312.pyc differ diff --git a/Backend/src/rooms/routes/room_routes.py b/Backend/src/rooms/routes/room_routes.py index 88bd83f4..83849fce 100644 --- a/Backend/src/rooms/routes/room_routes.py +++ b/Backend/src/rooms/routes/room_routes.py @@ -1,6 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, status, UploadFile, File, Request, Query from sqlalchemy.orm import Session from sqlalchemy import and_, or_, func +from sqlalchemy.exc import IntegrityError from typing import List, Optional from datetime import datetime from ...shared.config.database import get_db @@ -9,6 +10,8 @@ from ...security.middleware.auth import get_current_user, authorize_roles from ...auth.models.user import User from ..models.room import Room, RoomStatus from ..models.room_type import RoomType +from ..schemas.room import CreateRoomRequest, UpdateRoomRequest, BulkDeleteRoomsRequest +from ...shared.utils.response_helpers import success_response from ...reviews.models.review import Review, ReviewStatus from ...bookings.models.booking import Booking, BookingStatus from ..services.room_service import get_rooms_with_ratings, get_amenities_list, normalize_images, get_base_url @@ -210,22 +213,44 @@ async def get_room_by_number(room_number: str, request: Request, db: Session=Dep raise HTTPException(status_code=500, detail=str(e)) @router.post('/', dependencies=[Depends(authorize_roles('admin'))]) -async def create_room(room_data: dict, request: Request, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): +async def create_room(room_data: CreateRoomRequest, request: Request, current_user: User=Depends(authorize_roles('admin', 'staff')), db: Session=Depends(get_db)): + """Create a new room with validated input using Pydantic schema.""" + # Start transaction + transaction = db.begin() try: - room_type = db.query(RoomType).filter(RoomType.id == room_data.get('room_type_id')).first() + # Lock room type to prevent race conditions + room_type = db.query(RoomType).filter(RoomType.id == room_data.room_type_id).with_for_update().first() if not room_type: + transaction.rollback() raise HTTPException(status_code=404, detail='Room type not found') - existing = db.query(Room).filter(Room.room_number == room_data.get('room_number')).first() + + # Check for duplicate room number with locking + existing = db.query(Room).filter(Room.room_number == room_data.room_number).with_for_update().first() if existing: + transaction.rollback() raise HTTPException(status_code=400, detail='Room number already exists') - amenities_value = room_data.get('amenities', []) - if amenities_value is None: - amenities_value = [] - elif not isinstance(amenities_value, list): - amenities_value = [] - room = Room(room_type_id=room_data.get('room_type_id'), room_number=room_data.get('room_number'), floor=room_data.get('floor'), status=RoomStatus(room_data.get('status', 'available')), featured=room_data.get('featured', False), price=room_data.get('price', room_type.base_price), description=room_data.get('description'), capacity=room_data.get('capacity'), room_size=room_data.get('room_size'), view=room_data.get('view'), amenities=amenities_value) + + # Use price from request or default to room type base price + room_price = room_data.price if room_data.price is not None else float(room_type.base_price) if room_type.base_price else 0.0 + + room = Room( + room_type_id=room_data.room_type_id, + room_number=room_data.room_number, + floor=room_data.floor, + status=RoomStatus(room_data.status), + featured=room_data.featured, + price=room_price, + description=room_data.description, + capacity=room_data.capacity, + room_size=room_data.room_size, + view=room_data.view, + amenities=room_data.amenities or [] + ) db.add(room) - db.commit() + db.flush() + + # Commit transaction + transaction.commit() db.refresh(room) base_url = get_base_url(request) room_dict = {'id': room.id, 'room_type_id': room.room_type_id, 'room_number': room.room_number, 'floor': room.floor, 'status': room.status.value if isinstance(room.status, RoomStatus) else room.status, 'price': float(room.price) if room.price is not None and room.price > 0 else None, 'featured': room.featured, 'description': room.description, 'capacity': room.capacity, 'room_size': room.room_size, 'view': room.view, 'amenities': room.amenities if room.amenities else [], 'created_at': room.created_at.isoformat() if room.created_at else None, 'updated_at': room.updated_at.isoformat() if room.updated_at else None} @@ -235,67 +260,118 @@ async def create_room(room_data: dict, request: Request, current_user: User=Depe room_dict['images'] = [] if room.room_type: room_dict['room_type'] = {'id': room.room_type.id, 'name': room.room_type.name, 'description': room.room_type.description, 'base_price': float(room.room_type.base_price) if room.room_type.base_price else 0.0, 'capacity': room.room_type.capacity, 'amenities': room.room_type.amenities if room.room_type.amenities else [], 'images': []} - return {'status': 'success', 'message': 'Room created successfully', 'data': {'room': room_dict}} + return success_response(data={'room': room_dict}, message='Room created successfully') except HTTPException: + if 'transaction' in locals(): + transaction.rollback() raise + except IntegrityError as e: + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Database integrity error during room creation: {str(e)}') + raise HTTPException(status_code=409, detail='Room conflict detected. Please check room number.') except Exception as e: - db.rollback() - raise HTTPException(status_code=500, detail=str(e)) + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Error creating room: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while creating the room') @router.put('/{id}', dependencies=[Depends(authorize_roles('admin'))]) -async def update_room(id: int, room_data: dict, request: Request, current_user: User=Depends(authorize_roles('admin')), db: Session=Depends(get_db)): +async def update_room(id: int, room_data: UpdateRoomRequest, request: Request, current_user: User=Depends(authorize_roles('admin')), db: Session=Depends(get_db)): + """Update a room with validated input using Pydantic schema.""" + # Start transaction + transaction = db.begin() try: - room = db.query(Room).filter(Room.id == id).first() + # Lock room row to prevent race conditions + room = db.query(Room).filter(Room.id == id).with_for_update().first() if not room: + transaction.rollback() raise HTTPException(status_code=404, detail='Room not found') - if room_data.get('room_type_id'): - room_type = db.query(RoomType).filter(RoomType.id == room_data['room_type_id']).first() + + if room_data.room_type_id: + room_type = db.query(RoomType).filter(RoomType.id == room_data.room_type_id).first() if not room_type: + transaction.rollback() raise HTTPException(status_code=404, detail='Room type not found') - if 'room_type_id' in room_data: - room.room_type_id = room_data['room_type_id'] - if 'room_number' in room_data: - room.room_number = room_data['room_number'] - if 'floor' in room_data: - room.floor = room_data['floor'] - if 'status' in room_data: - room.status = RoomStatus(room_data['status']) - if 'featured' in room_data: - room.featured = room_data['featured'] - if 'price' in room_data: - room.price = room_data['price'] - if 'description' in room_data: - room.description = room_data['description'] - if 'capacity' in room_data: - room.capacity = room_data['capacity'] - if 'room_size' in room_data: - room.room_size = room_data['room_size'] - if 'view' in room_data: - room.view = room_data['view'] - if 'amenities' in room_data: - amenities_value = room_data['amenities'] - if amenities_value is None: - room.amenities = [] - elif isinstance(amenities_value, list): - room.amenities = amenities_value - else: - room.amenities = [] - db.commit() + room.room_type_id = room_data.room_type_id + + if room_data.room_number is not None: + # Check for duplicate room number + existing = db.query(Room).filter(Room.room_number == room_data.room_number, Room.id != id).first() + if existing: + transaction.rollback() + raise HTTPException(status_code=400, detail='Room number already exists') + room.room_number = room_data.room_number + + if room_data.floor is not None: + room.floor = room_data.floor + if room_data.status is not None: + room.status = RoomStatus(room_data.status) + if room_data.featured is not None: + room.featured = room_data.featured + if room_data.price is not None: + room.price = room_data.price + if room_data.description is not None: + room.description = room_data.description + if room_data.capacity is not None: + room.capacity = room_data.capacity + if room_data.room_size is not None: + room.room_size = room_data.room_size + if room_data.view is not None: + room.view = room_data.view + if room_data.amenities is not None: + room.amenities = room_data.amenities or [] + + # Commit transaction + transaction.commit() db.refresh(room) + base_url = get_base_url(request) - room_dict = {'id': room.id, 'room_type_id': room.room_type_id, 'room_number': room.room_number, 'floor': room.floor, 'status': room.status.value if isinstance(room.status, RoomStatus) else room.status, 'price': float(room.price) if room.price is not None and room.price > 0 else None, 'featured': room.featured, 'description': room.description, 'capacity': room.capacity, 'room_size': room.room_size, 'view': room.view, 'amenities': room.amenities if room.amenities else [], 'created_at': room.created_at.isoformat() if room.created_at else None, 'updated_at': room.updated_at.isoformat() if room.updated_at else None} + room_dict = { + 'id': room.id, + 'room_type_id': room.room_type_id, + 'room_number': room.room_number, + 'floor': room.floor, + 'status': room.status.value if isinstance(room.status, RoomStatus) else room.status, + 'price': float(room.price) if room.price is not None and room.price > 0 else None, + 'featured': room.featured, + 'description': room.description, + 'capacity': room.capacity, + 'room_size': room.room_size, + 'view': room.view, + 'amenities': room.amenities if room.amenities else [], + 'created_at': room.created_at.isoformat() if room.created_at else None, + 'updated_at': room.updated_at.isoformat() if room.updated_at else None + } try: room_dict['images'] = normalize_images(room.images, base_url) except: room_dict['images'] = [] if room.room_type: - room_dict['room_type'] = {'id': room.room_type.id, 'name': room.room_type.name, 'description': room.room_type.description, 'base_price': float(room.room_type.base_price) if room.room_type.base_price else 0.0, 'capacity': room.room_type.capacity, 'amenities': room.room_type.amenities if room.room_type.amenities else [], 'images': []} - return {'status': 'success', 'message': 'Room updated successfully', 'data': {'room': room_dict}} + room_dict['room_type'] = { + 'id': room.room_type.id, + 'name': room.room_type.name, + 'description': room.room_type.description, + 'base_price': float(room.room_type.base_price) if room.room_type.base_price else 0.0, + 'capacity': room.room_type.capacity, + 'amenities': room.room_type.amenities if room.room_type.amenities else [], + 'images': [] + } + return success_response(data={'room': room_dict}, message='Room updated successfully') except HTTPException: + if 'transaction' in locals(): + transaction.rollback() raise + except IntegrityError as e: + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Database integrity error during room update: {str(e)}') + raise HTTPException(status_code=409, detail='Room conflict detected. Please check room number.') except Exception as e: - db.rollback() - raise HTTPException(status_code=500, detail=str(e)) + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Error updating room: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while updating the room') @router.delete('/{id}', dependencies=[Depends(authorize_roles('admin'))]) async def delete_room(id: int, current_user: User=Depends(authorize_roles('admin')), db: Session=Depends(get_db)): @@ -313,30 +389,44 @@ async def delete_room(id: int, current_user: User=Depends(authorize_roles('admin raise HTTPException(status_code=500, detail=str(e)) @router.post('/bulk-delete', dependencies=[Depends(authorize_roles('admin'))]) -async def bulk_delete_rooms(room_ids: dict, current_user: User=Depends(authorize_roles('admin')), db: Session=Depends(get_db)): +async def bulk_delete_rooms(room_ids: BulkDeleteRoomsRequest, current_user: User=Depends(authorize_roles('admin')), db: Session=Depends(get_db)): + """Bulk delete rooms with validated input using Pydantic schema.""" + # Start transaction + transaction = db.begin() try: - ids = room_ids.get('ids', []) - if not ids or not isinstance(ids, list): - raise HTTPException(status_code=400, detail='Invalid room IDs provided') - if len(ids) == 0: - raise HTTPException(status_code=400, detail='No room IDs provided') - try: - ids = [int(id) for id in ids] - except (ValueError, TypeError): - raise HTTPException(status_code=400, detail='All room IDs must be integers') + ids = room_ids.room_ids + + # Check if rooms exist rooms = db.query(Room).filter(Room.id.in_(ids)).all() found_ids = [room.id for room in rooms] not_found_ids = [id for id in ids if id not in found_ids] if not_found_ids: + transaction.rollback() raise HTTPException(status_code=404, detail=f'Rooms with IDs {not_found_ids} not found') + + # Delete rooms deleted_count = db.query(Room).filter(Room.id.in_(ids)).delete(synchronize_session=False) - db.commit() - return {'status': 'success', 'message': f'Successfully deleted {deleted_count} room(s)', 'data': {'deleted_count': deleted_count, 'deleted_ids': ids}} + + # Commit transaction + transaction.commit() + return success_response( + data={'deleted_count': deleted_count, 'deleted_ids': ids}, + message=f'Successfully deleted {deleted_count} room(s)' + ) except HTTPException: + if 'transaction' in locals(): + transaction.rollback() raise + except IntegrityError as e: + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Database integrity error during bulk room deletion: {str(e)}') + raise HTTPException(status_code=409, detail='Cannot delete rooms due to existing relationships (bookings, etc.)') except Exception as e: - db.rollback() - raise HTTPException(status_code=500, detail=str(e)) + if 'transaction' in locals(): + transaction.rollback() + logger.error(f'Error bulk deleting rooms: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while deleting rooms') @router.post('/{id}/images', dependencies=[Depends(authorize_roles('admin', 'staff'))]) async def upload_room_images(id: int, images: List[UploadFile]=File(...), current_user: User=Depends(authorize_roles('admin', 'staff')), db: Session=Depends(get_db)): diff --git a/Backend/src/rooms/schemas/__init__.py b/Backend/src/rooms/schemas/__init__.py index e69de29b..2f69d11e 100644 --- a/Backend/src/rooms/schemas/__init__.py +++ b/Backend/src/rooms/schemas/__init__.py @@ -0,0 +1,8 @@ +from .room import CreateRoomRequest, UpdateRoomRequest, BulkDeleteRoomsRequest + +__all__ = [ + 'CreateRoomRequest', + 'UpdateRoomRequest', + 'BulkDeleteRoomsRequest', +] + diff --git a/Backend/src/rooms/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..a1376572 Binary files /dev/null and b/Backend/src/rooms/schemas/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/rooms/schemas/__pycache__/room.cpython-312.pyc b/Backend/src/rooms/schemas/__pycache__/room.cpython-312.pyc new file mode 100644 index 00000000..b11e373f Binary files /dev/null and b/Backend/src/rooms/schemas/__pycache__/room.cpython-312.pyc differ diff --git a/Backend/src/rooms/schemas/room.py b/Backend/src/rooms/schemas/room.py new file mode 100644 index 00000000..90990c70 --- /dev/null +++ b/Backend/src/rooms/schemas/room.py @@ -0,0 +1,107 @@ +""" +Pydantic schemas for room-related requests and responses. +""" +from pydantic import BaseModel, Field, field_validator +from typing import Optional, List + + +class CreateRoomRequest(BaseModel): + """Schema for creating a room.""" + room_type_id: int = Field(..., gt=0, description="Room type ID") + room_number: str = Field(..., min_length=1, max_length=20, description="Room number") + floor: int = Field(..., ge=1, le=200, description="Floor number") + status: str = Field("available", description="Room status") + featured: bool = Field(False, description="Whether room is featured") + price: Optional[float] = Field(None, ge=0, description="Room price (overrides room type base price)") + description: Optional[str] = Field(None, max_length=2000, description="Room description") + capacity: Optional[int] = Field(None, ge=1, le=20, description="Room capacity") + room_size: Optional[str] = Field(None, max_length=50, description="Room size (e.g., '25 sqm')") + view: Optional[str] = Field(None, max_length=100, description="Room view") + amenities: Optional[List[str]] = Field(default_factory=list, description="List of amenities") + + @field_validator('status') + @classmethod + def validate_status(cls, v: str) -> str: + """Validate room status.""" + allowed_statuses = ['available', 'occupied', 'maintenance', 'cleaning', 'reserved'] + if v not in allowed_statuses: + raise ValueError(f'Status must be one of: {", ".join(allowed_statuses)}') + return v + + @field_validator('amenities') + @classmethod + def validate_amenities(cls, v: Optional[List[str]]) -> List[str]: + """Ensure amenities is a list.""" + if v is None: + return [] + if not isinstance(v, list): + return [] + return v + + model_config = { + "json_schema_extra": { + "example": { + "room_type_id": 1, + "room_number": "101", + "floor": 1, + "status": "available", + "featured": False, + "price": 150.00, + "description": "Spacious room with city view", + "capacity": 2, + "room_size": "25 sqm", + "view": "City View", + "amenities": ["WiFi", "TV", "AC"] + } + } + } + + +class UpdateRoomRequest(BaseModel): + """Schema for updating a room.""" + room_type_id: Optional[int] = Field(None, gt=0, description="Room type ID") + room_number: Optional[str] = Field(None, min_length=1, max_length=20, description="Room number") + floor: Optional[int] = Field(None, ge=1, le=200, description="Floor number") + status: Optional[str] = Field(None, description="Room status") + featured: Optional[bool] = Field(None, description="Whether room is featured") + price: Optional[float] = Field(None, ge=0, description="Room price") + description: Optional[str] = Field(None, max_length=2000, description="Room description") + capacity: Optional[int] = Field(None, ge=1, le=20, description="Room capacity") + room_size: Optional[str] = Field(None, max_length=50, description="Room size") + view: Optional[str] = Field(None, max_length=100, description="Room view") + amenities: Optional[List[str]] = Field(None, description="List of amenities") + + @field_validator('status') + @classmethod + def validate_status(cls, v: Optional[str]) -> Optional[str]: + """Validate room status.""" + if v: + allowed_statuses = ['available', 'occupied', 'maintenance', 'cleaning', 'reserved'] + if v not in allowed_statuses: + raise ValueError(f'Status must be one of: {", ".join(allowed_statuses)}') + return v + + @field_validator('amenities') + @classmethod + def validate_amenities(cls, v: Optional[List[str]]) -> Optional[List[str]]: + """Ensure amenities is a list.""" + if v is not None and not isinstance(v, list): + return [] + return v + + +class BulkDeleteRoomsRequest(BaseModel): + """Schema for bulk deleting rooms.""" + room_ids: List[int] = Field(..., min_items=1, max_items=100, description="List of room IDs to delete") + + @field_validator('room_ids') + @classmethod + def validate_room_ids(cls, v: List[int]) -> List[int]: + """Validate room IDs are positive integers.""" + if not v: + raise ValueError('At least one room ID is required') + for room_id in v: + if room_id <= 0: + raise ValueError('All room IDs must be positive integers') + return v + diff --git a/Backend/src/rooms/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b71fe869 Binary files /dev/null and b/Backend/src/rooms/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/rooms/services/__pycache__/room_assignment_service.cpython-312.pyc b/Backend/src/rooms/services/__pycache__/room_assignment_service.cpython-312.pyc new file mode 100644 index 00000000..c6f90e81 Binary files /dev/null and b/Backend/src/rooms/services/__pycache__/room_assignment_service.cpython-312.pyc differ diff --git a/Backend/src/rooms/services/__pycache__/room_service.cpython-312.pyc b/Backend/src/rooms/services/__pycache__/room_service.cpython-312.pyc new file mode 100644 index 00000000..394229da Binary files /dev/null and b/Backend/src/rooms/services/__pycache__/room_service.cpython-312.pyc differ diff --git a/Backend/src/security/__pycache__/__init__.cpython-312.pyc b/Backend/src/security/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..96d43175 Binary files /dev/null and b/Backend/src/security/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/security/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/src/security/middleware/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..641b541d Binary files /dev/null and b/Backend/src/security/middleware/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/security/middleware/__pycache__/admin_ip_whitelist.cpython-312.pyc b/Backend/src/security/middleware/__pycache__/admin_ip_whitelist.cpython-312.pyc new file mode 100644 index 00000000..2b3e2694 Binary files /dev/null and b/Backend/src/security/middleware/__pycache__/admin_ip_whitelist.cpython-312.pyc differ diff --git a/Backend/src/security/middleware/__pycache__/auth.cpython-312.pyc b/Backend/src/security/middleware/__pycache__/auth.cpython-312.pyc new file mode 100644 index 00000000..02dce2d2 Binary files /dev/null and b/Backend/src/security/middleware/__pycache__/auth.cpython-312.pyc differ diff --git a/Backend/src/security/middleware/__pycache__/csrf.cpython-312.pyc b/Backend/src/security/middleware/__pycache__/csrf.cpython-312.pyc new file mode 100644 index 00000000..550fe4e1 Binary files /dev/null and b/Backend/src/security/middleware/__pycache__/csrf.cpython-312.pyc differ diff --git a/Backend/src/security/middleware/__pycache__/security.cpython-312.pyc b/Backend/src/security/middleware/__pycache__/security.cpython-312.pyc new file mode 100644 index 00000000..bed54503 Binary files /dev/null and b/Backend/src/security/middleware/__pycache__/security.cpython-312.pyc differ diff --git a/Backend/src/security/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/security/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..a8a7d59b Binary files /dev/null and b/Backend/src/security/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/security/models/__pycache__/gdpr_compliance.cpython-312.pyc b/Backend/src/security/models/__pycache__/gdpr_compliance.cpython-312.pyc new file mode 100644 index 00000000..fd002145 Binary files /dev/null and b/Backend/src/security/models/__pycache__/gdpr_compliance.cpython-312.pyc differ diff --git a/Backend/src/security/models/__pycache__/security_event.cpython-312.pyc b/Backend/src/security/models/__pycache__/security_event.cpython-312.pyc new file mode 100644 index 00000000..b0fe234e Binary files /dev/null and b/Backend/src/security/models/__pycache__/security_event.cpython-312.pyc differ diff --git a/Backend/src/security/routes/__init__.py b/Backend/src/security/routes/__init__.py index e69de29b..9735dc63 100644 --- a/Backend/src/security/routes/__init__.py +++ b/Backend/src/security/routes/__init__.py @@ -0,0 +1,5 @@ +from . import security_routes +from . import compliance_routes + +__all__ = ['security_routes', 'compliance_routes'] + diff --git a/Backend/src/security/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/security/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..478af519 Binary files /dev/null and b/Backend/src/security/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/security/routes/__pycache__/compliance_routes.cpython-312.pyc b/Backend/src/security/routes/__pycache__/compliance_routes.cpython-312.pyc new file mode 100644 index 00000000..bc147be9 Binary files /dev/null and b/Backend/src/security/routes/__pycache__/compliance_routes.cpython-312.pyc differ diff --git a/Backend/src/security/routes/__pycache__/security_routes.cpython-312.pyc b/Backend/src/security/routes/__pycache__/security_routes.cpython-312.pyc new file mode 100644 index 00000000..bbe3e3d1 Binary files /dev/null and b/Backend/src/security/routes/__pycache__/security_routes.cpython-312.pyc differ diff --git a/Backend/src/security/routes/compliance_routes.py b/Backend/src/security/routes/compliance_routes.py new file mode 100644 index 00000000..6586cd84 --- /dev/null +++ b/Backend/src/security/routes/compliance_routes.py @@ -0,0 +1,198 @@ +""" +Routes for compliance reporting and management. +""" +from fastapi import APIRouter, Depends, HTTPException, Query, Response +from sqlalchemy.orm import Session +from typing import Optional +from datetime import datetime, timedelta +import csv +import io +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import authorize_roles +from ...auth.models.user import User +from ...payments.models.financial_audit_trail import FinancialAuditTrail +from ...security.models.gdpr_compliance import DataSubjectRequest, DataSubjectRequestStatus +from ...analytics.models.audit_log import AuditLog +from ...shared.utils.response_helpers import success_response + +logger = get_logger(__name__) +router = APIRouter(prefix='/compliance', tags=['compliance']) + + +@router.get('/report') +async def get_compliance_report( + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + format: str = Query("json", regex="^(json|csv)$"), + current_user: User = Depends(authorize_roles('admin', 'accountant')), + db: Session = Depends(get_db) +): + """Generate comprehensive compliance report.""" + try: + # Parse dates + if start_date: + try: + # Try parsing as full datetime first + start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) + except ValueError: + # If that fails, parse as date only + start = datetime.strptime(start_date, '%Y-%m-%d') + else: + start = datetime.utcnow() - timedelta(days=30) + + if end_date: + try: + # Try parsing as full datetime first + end = datetime.fromisoformat(end_date.replace('Z', '+00:00')) + except ValueError: + # If that fails, parse as date only, set to end of day + end = datetime.strptime(end_date, '%Y-%m-%d').replace(hour=23, minute=59, second=59) + else: + end = datetime.utcnow() + + # Financial audit trail statistics + try: + financial_audits = db.query(FinancialAuditTrail).filter( + FinancialAuditTrail.created_at >= start, + FinancialAuditTrail.created_at <= end + ).count() + except Exception as e: + logger.warning(f'Error querying financial audit trail: {str(e)}') + financial_audits = 0 + + # GDPR requests statistics + try: + gdpr_requests = db.query(DataSubjectRequest).filter( + DataSubjectRequest.created_at >= start, + DataSubjectRequest.created_at <= end + ).count() + + gdpr_completed = db.query(DataSubjectRequest).filter( + DataSubjectRequest.created_at >= start, + DataSubjectRequest.created_at <= end, + DataSubjectRequest.status == DataSubjectRequestStatus.completed + ).count() + except Exception as e: + logger.warning(f'Error querying GDPR requests: {str(e)}') + gdpr_requests = 0 + gdpr_completed = 0 + + # Security audit logs + try: + security_audits = db.query(AuditLog).filter( + AuditLog.created_at >= start, + AuditLog.created_at <= end + ).count() + except Exception as e: + logger.warning(f'Error querying security audit logs: {str(e)}') + security_audits = 0 + + # Build report + report = { + 'period': { + 'start_date': start.isoformat(), + 'end_date': end.isoformat() + }, + 'financial_audit': { + 'total_actions': financial_audits, + 'description': 'Total financial transactions logged in audit trail' + }, + 'gdpr_compliance': { + 'total_requests': gdpr_requests, + 'completed_requests': gdpr_completed, + 'completion_rate': round((gdpr_completed / gdpr_requests * 100) if gdpr_requests > 0 else 0, 2), + 'description': 'GDPR data subject requests processed' + }, + 'security_audit': { + 'total_events': security_audits, + 'description': 'Total security audit events logged' + }, + 'compliance_status': 'compliant' if (gdpr_requests == 0 or gdpr_requests == gdpr_completed) else 'pending_review', + 'generated_at': datetime.utcnow().isoformat(), + 'generated_by': current_user.email if current_user.email else f'User {current_user.id}' + } + + if format.lower() == 'csv': + output = io.StringIO() + writer = csv.writer(output) + + writer.writerow(['Compliance Report']) + writer.writerow(['Period', f"{start.date()} to {end.date()}"]) + writer.writerow(['Generated At', datetime.utcnow().isoformat()]) + writer.writerow(['Generated By', current_user.email if current_user.email else f'User {current_user.id}']) + writer.writerow([]) + + writer.writerow(['Financial Audit']) + writer.writerow(['Total Actions', financial_audits]) + writer.writerow([]) + + writer.writerow(['GDPR Compliance']) + writer.writerow(['Total Requests', gdpr_requests]) + writer.writerow(['Completed Requests', gdpr_completed]) + writer.writerow(['Completion Rate', f"{report['gdpr_compliance']['completion_rate']}%"]) + writer.writerow([]) + + writer.writerow(['Security Audit']) + writer.writerow(['Total Events', security_audits]) + writer.writerow([]) + + writer.writerow(['Compliance Status', report['compliance_status']]) + + return Response( + content=output.getvalue(), + media_type='text/csv', + headers={ + 'Content-Disposition': f'attachment; filename="compliance_report_{datetime.utcnow().strftime("%Y%m%d")}.csv"' + } + ) + + return success_response( + data=report, + message='Compliance report generated successfully' + ) + except Exception as e: + logger.error(f'Error generating compliance report: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while generating compliance report') + + +@router.get('/gdpr-summary') +async def get_gdpr_summary( + current_user: User = Depends(authorize_roles('admin')), + db: Session = Depends(get_db) +): + """Get GDPR compliance summary.""" + try: + # Get statistics + total_requests = db.query(DataSubjectRequest).count() + pending_requests = db.query(DataSubjectRequest).filter( + DataSubjectRequest.status == DataSubjectRequestStatus.pending + ).count() + completed_requests = db.query(DataSubjectRequest).filter( + DataSubjectRequest.status == DataSubjectRequestStatus.completed + ).count() + + # Requests by type + from ...security.models.gdpr_compliance import DataSubjectRequestType + requests_by_type = {} + for req_type in DataSubjectRequestType: + count = db.query(DataSubjectRequest).filter( + DataSubjectRequest.request_type == req_type + ).count() + requests_by_type[req_type.value] = count + + return success_response( + data={ + 'total_requests': total_requests, + 'pending_requests': pending_requests, + 'completed_requests': completed_requests, + 'completion_rate': round((completed_requests / total_requests * 100) if total_requests > 0 else 0, 2), + 'requests_by_type': requests_by_type, + 'compliance_status': 'compliant' if pending_requests == 0 else 'pending_review' + }, + message='GDPR compliance summary retrieved successfully' + ) + except Exception as e: + logger.error(f'Error retrieving GDPR summary: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while retrieving GDPR summary') + diff --git a/Backend/src/security/routes/security_routes.py b/Backend/src/security/routes/security_routes.py index 690682bd..aa74b4d6 100644 --- a/Backend/src/security/routes/security_routes.py +++ b/Backend/src/security/routes/security_routes.py @@ -696,10 +696,11 @@ async def delete_user_data( @router.get("/gdpr/export/{user_id}") async def export_user_data( user_id: int, + format: str = Query("json", regex="^(json|csv)$"), db: Session = Depends(get_db), current_user: User = Depends(get_current_user) ): - """Export user data (GDPR portability request)""" + """Export user data (GDPR portability request) - supports JSON and CSV formats""" if current_user.id != user_id: # Check if user is admin from ...auth.models.role import Role @@ -708,8 +709,19 @@ async def export_user_data( raise HTTPException(status_code=403, detail="Access denied") try: - data = gdpr_service.export_user_data(db=db, user_id=user_id) - return {"status": "success", "data": data} + result = gdpr_service.export_user_data(db=db, user_id=user_id, format=format) + + if format.lower() == 'csv': + from fastapi.responses import Response + return Response( + content=result['data'], + media_type='text/csv', + headers={ + 'Content-Disposition': f'attachment; filename="user_data_{user_id}_{datetime.utcnow().strftime("%Y%m%d")}.csv"' + } + ) + + return {"status": "success", "data": result['data']} except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) diff --git a/Backend/src/security/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/security/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..726bec27 Binary files /dev/null and b/Backend/src/security/services/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/security/services/__pycache__/encryption_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/encryption_service.cpython-312.pyc new file mode 100644 index 00000000..6739aa2b Binary files /dev/null and b/Backend/src/security/services/__pycache__/encryption_service.cpython-312.pyc differ diff --git a/Backend/src/security/services/__pycache__/gdpr_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/gdpr_service.cpython-312.pyc new file mode 100644 index 00000000..88fafe04 Binary files /dev/null and b/Backend/src/security/services/__pycache__/gdpr_service.cpython-312.pyc differ diff --git a/Backend/src/security/services/__pycache__/privacy_admin_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/privacy_admin_service.cpython-312.pyc new file mode 100644 index 00000000..b2f7dc3d Binary files /dev/null and b/Backend/src/security/services/__pycache__/privacy_admin_service.cpython-312.pyc differ diff --git a/Backend/src/security/services/__pycache__/security_monitoring_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/security_monitoring_service.cpython-312.pyc new file mode 100644 index 00000000..91a369f1 Binary files /dev/null and b/Backend/src/security/services/__pycache__/security_monitoring_service.cpython-312.pyc differ diff --git a/Backend/src/security/services/__pycache__/security_scan_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/security_scan_service.cpython-312.pyc new file mode 100644 index 00000000..53cb46d0 Binary files /dev/null and b/Backend/src/security/services/__pycache__/security_scan_service.cpython-312.pyc differ diff --git a/Backend/src/security/services/gdpr_service.py b/Backend/src/security/services/gdpr_service.py index aae94f49..097225bf 100644 --- a/Backend/src/security/services/gdpr_service.py +++ b/Backend/src/security/services/gdpr_service.py @@ -156,9 +156,74 @@ class GDPRService: return False @staticmethod - def export_user_data(db: Session, user_id: int) -> Dict[str, Any]: - """Export user data in portable format (for portability request)""" - return GDPRService.get_user_data(db, user_id) + def export_user_data(db: Session, user_id: int, format: str = 'json') -> Dict[str, Any]: + """Export user data in portable format (for portability request) + + Args: + db: Database session + user_id: User ID to export + format: Export format ('json' or 'csv') + + Returns: + Dict containing exported data or CSV string + """ + data = GDPRService.get_user_data(db, user_id) + + if format.lower() == 'csv': + import csv + import io + + output = io.StringIO() + writer = csv.writer(output) + + # Write user data + writer.writerow(['Data Type', 'Field', 'Value']) + user_data = data.get('user', {}) + for key, value in user_data.items(): + writer.writerow(['User', key, value]) + + # Write bookings + writer.writerow([]) + writer.writerow(['Bookings']) + writer.writerow(['ID', 'Booking Number', 'Check In', 'Check Out', 'Total Price', 'Status']) + for booking in data.get('bookings', []): + writer.writerow([ + booking.get('id'), + booking.get('booking_number'), + booking.get('check_in_date'), + booking.get('check_out_date'), + booking.get('total_price'), + booking.get('status') + ]) + + # Write payments + writer.writerow([]) + writer.writerow(['Payments']) + writer.writerow(['ID', 'Amount', 'Payment Method', 'Payment Status', 'Payment Date']) + for payment in data.get('payments', []): + writer.writerow([ + payment.get('id'), + payment.get('amount'), + payment.get('payment_method'), + payment.get('payment_status'), + payment.get('payment_date') + ]) + + # Write reviews + writer.writerow([]) + writer.writerow(['Reviews']) + writer.writerow(['ID', 'Rating', 'Comment', 'Created At']) + for review in data.get('reviews', []): + writer.writerow([ + review.get('id'), + review.get('rating'), + review.get('comment'), + review.get('created_at') + ]) + + return {'format': 'csv', 'data': output.getvalue()} + + return {'format': 'json', 'data': data} @staticmethod def record_consent( diff --git a/Backend/src/shared/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..20bee488 Binary files /dev/null and b/Backend/src/shared/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/shared/config/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/config/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..24835475 Binary files /dev/null and b/Backend/src/shared/config/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/shared/config/__pycache__/database.cpython-312.pyc b/Backend/src/shared/config/__pycache__/database.cpython-312.pyc new file mode 100644 index 00000000..9f479635 Binary files /dev/null and b/Backend/src/shared/config/__pycache__/database.cpython-312.pyc differ diff --git a/Backend/src/shared/config/__pycache__/logging_config.cpython-312.pyc b/Backend/src/shared/config/__pycache__/logging_config.cpython-312.pyc new file mode 100644 index 00000000..a606bb5f Binary files /dev/null and b/Backend/src/shared/config/__pycache__/logging_config.cpython-312.pyc differ diff --git a/Backend/src/shared/config/__pycache__/settings.cpython-312.pyc b/Backend/src/shared/config/__pycache__/settings.cpython-312.pyc new file mode 100644 index 00000000..e8b0d865 Binary files /dev/null and b/Backend/src/shared/config/__pycache__/settings.cpython-312.pyc differ diff --git a/Backend/src/shared/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..5d59f3c0 Binary files /dev/null and b/Backend/src/shared/middleware/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/shared/middleware/__pycache__/cookie_consent.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/cookie_consent.cpython-312.pyc new file mode 100644 index 00000000..4339a78b Binary files /dev/null and b/Backend/src/shared/middleware/__pycache__/cookie_consent.cpython-312.pyc differ diff --git a/Backend/src/shared/middleware/__pycache__/error_handler.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/error_handler.cpython-312.pyc new file mode 100644 index 00000000..37f29969 Binary files /dev/null and b/Backend/src/shared/middleware/__pycache__/error_handler.cpython-312.pyc differ diff --git a/Backend/src/shared/middleware/__pycache__/request_id.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/request_id.cpython-312.pyc new file mode 100644 index 00000000..25e02fec Binary files /dev/null and b/Backend/src/shared/middleware/__pycache__/request_id.cpython-312.pyc differ diff --git a/Backend/src/shared/middleware/__pycache__/request_size_limit.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/request_size_limit.cpython-312.pyc new file mode 100644 index 00000000..178ce627 Binary files /dev/null and b/Backend/src/shared/middleware/__pycache__/request_size_limit.cpython-312.pyc differ diff --git a/Backend/src/shared/middleware/__pycache__/timeout.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/timeout.cpython-312.pyc new file mode 100644 index 00000000..d9805638 Binary files /dev/null and b/Backend/src/shared/middleware/__pycache__/timeout.cpython-312.pyc differ diff --git a/Backend/src/shared/middleware/error_handler.py b/Backend/src/shared/middleware/error_handler.py index f1ce8dec..2c442686 100644 --- a/Backend/src/shared/middleware/error_handler.py +++ b/Backend/src/shared/middleware/error_handler.py @@ -100,7 +100,22 @@ async def general_exception_handler(request: Request, exc: Exception): from ...shared.config.logging_config import get_logger logger = get_logger(__name__) request_id = getattr(request.state, 'request_id', None) - logger.error(f'Unhandled exception: {type(exc).__name__}: {str(exc)}', extra={'request_id': request_id, 'path': request.url.path, 'method': request.method, 'exception_type': type(exc).__name__}, exc_info=True) + + # Log full error details server-side + logger.error( + f'Unhandled exception: {type(exc).__name__}: {str(exc)}', + extra={ + 'request_id': request_id, + 'path': request.url.path, + 'method': request.method, + 'exception_type': type(exc).__name__, + 'client_ip': request.client.host if request.client else None, + 'user_agent': request.headers.get('User-Agent') + }, + exc_info=True + ) + + # Determine status code and message if isinstance(exc, Exception) and hasattr(exc, 'status_code'): status_code = exc.status_code if hasattr(exc, 'detail'): @@ -113,11 +128,17 @@ async def general_exception_handler(request: Request, exc: Exception): message = str(exc) if str(exc) else 'Internal server error' else: status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - message = str(exc) if str(exc) else 'Internal server error' + # Don't expose internal error details in production + if settings.is_production: + message = 'An internal server error occurred. Please try again later.' + else: + message = str(exc) if str(exc) else 'Internal server error' + response_content = error_response( message=message, request_id=request_id ) + # NEVER include stack traces in production responses # Always log stack traces server-side only for debugging if settings.is_development: @@ -126,6 +147,7 @@ async def general_exception_handler(request: Request, exc: Exception): env_check = os.getenv('ENVIRONMENT', 'development').lower() if env_check == 'development': response_content['stack'] = traceback.format_exc() + response_content['error_type'] = type(exc).__name__ else: # Log warning if development flag is set but environment says otherwise logger.warning(f'is_development=True but ENVIRONMENT={env_check}. Not including stack trace in response.') diff --git a/Backend/src/shared/utils/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b3ad74e6 Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/__pycache__/currency_helpers.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/currency_helpers.cpython-312.pyc new file mode 100644 index 00000000..4110e8aa Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/currency_helpers.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/__pycache__/email_templates.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/email_templates.cpython-312.pyc new file mode 100644 index 00000000..3d19df00 Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/email_templates.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/__pycache__/html_sanitizer.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/html_sanitizer.cpython-312.pyc new file mode 100644 index 00000000..913e5f4e Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/html_sanitizer.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/__pycache__/mailer.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/mailer.cpython-312.pyc new file mode 100644 index 00000000..d301d46f Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/mailer.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/__pycache__/request_helpers.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/request_helpers.cpython-312.pyc new file mode 100644 index 00000000..66fd6248 Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/request_helpers.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/__pycache__/response_helpers.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/response_helpers.cpython-312.pyc new file mode 100644 index 00000000..33fc08a0 Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/response_helpers.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/__pycache__/role_helpers.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/role_helpers.cpython-312.pyc new file mode 100644 index 00000000..3196c715 Binary files /dev/null and b/Backend/src/shared/utils/__pycache__/role_helpers.cpython-312.pyc differ diff --git a/Backend/src/shared/utils/role_helpers.py b/Backend/src/shared/utils/role_helpers.py index 9f078f38..2cd8c438 100644 --- a/Backend/src/shared/utils/role_helpers.py +++ b/Backend/src/shared/utils/role_helpers.py @@ -7,8 +7,13 @@ from ...auth.models.role import Role def get_user_role_name(user: User, db: Session) -> str: """Get the role name for a user""" - role = db.query(Role).filter(Role.id == user.role_id).first() - return role.name if role else 'customer' + if not user or not user.role_id: + return 'customer' + try: + role = db.query(Role).filter(Role.id == user.role_id).first() + return role.name if role else 'customer' + except Exception: + return 'customer' def is_admin(user: User, db: Session) -> bool: """Check if user is admin""" diff --git a/Backend/src/system/models/__pycache__/system_settings.cpython-312.pyc b/Backend/src/system/models/__pycache__/system_settings.cpython-312.pyc new file mode 100644 index 00000000..b29ab2f8 Binary files /dev/null and b/Backend/src/system/models/__pycache__/system_settings.cpython-312.pyc differ diff --git a/Backend/src/system/models/__pycache__/workflow.cpython-312.pyc b/Backend/src/system/models/__pycache__/workflow.cpython-312.pyc new file mode 100644 index 00000000..e670a2e5 Binary files /dev/null and b/Backend/src/system/models/__pycache__/workflow.cpython-312.pyc differ diff --git a/Backend/src/system/routes/__pycache__/system_settings_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/system_settings_routes.cpython-312.pyc new file mode 100644 index 00000000..ace06d82 Binary files /dev/null and b/Backend/src/system/routes/__pycache__/system_settings_routes.cpython-312.pyc differ diff --git a/Backend/src/system/routes/__pycache__/task_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/task_routes.cpython-312.pyc new file mode 100644 index 00000000..0a2ad1f5 Binary files /dev/null and b/Backend/src/system/routes/__pycache__/task_routes.cpython-312.pyc differ diff --git a/Backend/src/system/routes/__pycache__/workflow_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/workflow_routes.cpython-312.pyc new file mode 100644 index 00000000..f5c44587 Binary files /dev/null and b/Backend/src/system/routes/__pycache__/workflow_routes.cpython-312.pyc differ diff --git a/Backend/src/system/services/__pycache__/workflow_service.cpython-312.pyc b/Backend/src/system/services/__pycache__/workflow_service.cpython-312.pyc new file mode 100644 index 00000000..dfdd7ddc Binary files /dev/null and b/Backend/src/system/services/__pycache__/workflow_service.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc new file mode 100644 index 00000000..105cb8d3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc new file mode 100644 index 00000000..a7ea10f5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc new file mode 100644 index 00000000..39009a6f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc new file mode 100644 index 00000000..275c1af1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc new file mode 100644 index 00000000..04ed2e9d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc new file mode 100644 index 00000000..7b73c68a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..77575b97 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc new file mode 100644 index 00000000..debb3d45 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc new file mode 100644 index 00000000..a8657e00 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..efaa774a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc new file mode 100644 index 00000000..d8f25b2a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc new file mode 100644 index 00000000..6d8c79c5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc new file mode 100644 index 00000000..3a31168a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..47c3d780 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..34b358f3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..e6741e32 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc new file mode 100644 index 00000000..0340305f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c489af88 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc new file mode 100644 index 00000000..49ac95d0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc new file mode 100644 index 00000000..0f3c0974 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..a071aef0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..731e8e18 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/api.cpython-312.pyc new file mode 100644 index 00000000..cc272f60 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc new file mode 100644 index 00000000..a5406ee7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc new file mode 100644 index 00000000..a7bcae01 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc new file mode 100644 index 00000000..f71076a1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/esmtp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/esmtp.cpython-312.pyc new file mode 100644 index 00000000..571fd853 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/esmtp.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/protocol.cpython-312.pyc new file mode 100644 index 00000000..1440bfeb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/protocol.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/response.cpython-312.pyc new file mode 100644 index 00000000..b91196ca Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/response.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/smtp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/smtp.cpython-312.pyc new file mode 100644 index 00000000..b29df119 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/smtp.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc new file mode 100644 index 00000000..cd3ea2f4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..34459304 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..eb02f314 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc new file mode 100644 index 00000000..11032773 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc new file mode 100644 index 00000000..e85045a7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc new file mode 100644 index 00000000..24dcba9b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2ed58217 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc new file mode 100644 index 00000000..4e8f26b3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..78b221cf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 00000000..5fc25e08 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc new file mode 100644 index 00000000..ce7bb6b7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc new file mode 100644 index 00000000..40f6fd14 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc new file mode 100644 index 00000000..810a87ff Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc new file mode 100644 index 00000000..a3e340b4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc new file mode 100644 index 00000000..a6aa1461 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc new file mode 100644 index 00000000..72544100 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc new file mode 100644 index 00000000..63b46bf3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc new file mode 100644 index 00000000..6adfeea3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc new file mode 100644 index 00000000..05ab1255 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc new file mode 100644 index 00000000..471767bc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc new file mode 100644 index 00000000..a31b4541 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc new file mode 100644 index 00000000..cb74b210 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..1724b5b4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc new file mode 100644 index 00000000..d43b3259 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc new file mode 100644 index 00000000..b0756337 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc new file mode 100644 index 00000000..c6035583 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc new file mode 100644 index 00000000..0938df15 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc new file mode 100644 index 00000000..de853864 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc new file mode 100644 index 00000000..7e9f0c8d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..acbc05d7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc new file mode 100644 index 00000000..c442d585 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc new file mode 100644 index 00000000..e34f74a5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc new file mode 100644 index 00000000..d69a02d9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bcrypt/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bcrypt/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..795c49b1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bcrypt/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..25b2c08e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc new file mode 100644 index 00000000..89e7a347 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc new file mode 100644 index 00000000..c8fbf9ac Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc new file mode 100644 index 00000000..92bb8221 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc new file mode 100644 index 00000000..2faa0926 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc new file mode 100644 index 00000000..b322e54b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2a651707 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc new file mode 100644 index 00000000..0fe6248b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c4aefade Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc new file mode 100644 index 00000000..6623940c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_tokenizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_tokenizer.cpython-312.pyc new file mode 100644 index 00000000..dcbc6e59 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_tokenizer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 00000000..d20f3013 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc new file mode 100644 index 00000000..46a7a523 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/html5parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/html5parser.cpython-312.pyc new file mode 100644 index 00000000..8480f652 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/html5parser.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/serializer.cpython-312.pyc new file mode 100644 index 00000000..00eccdc1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/serializer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b6f1c0bf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/_base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/_base.cpython-312.pyc new file mode 100644 index 00000000..93b78d66 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/_base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/py.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/py.cpython-312.pyc new file mode 100644 index 00000000..0913b8db Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/py.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..0da68e4c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..0724b922 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-312.pyc new file mode 100644 index 00000000..7d5083f3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..e952866e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..2daf0f4f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..6571f10c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..eece9f2f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc new file mode 100644 index 00000000..c50579ca Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..69ce6554 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/api.cpython-312.pyc new file mode 100644 index 00000000..ccd482d3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/error.cpython-312.pyc new file mode 100644 index 00000000..cab99c9f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/error.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/lock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/lock.cpython-312.pyc new file mode 100644 index 00000000..051742e6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/lock.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/model.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/model.cpython-312.pyc new file mode 100644 index 00000000..8cc7838a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/model.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..450be934 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc new file mode 100644 index 00000000..f8058d54 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc new file mode 100644 index 00000000..11a8413b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc new file mode 100644 index 00000000..329a0eb7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc new file mode 100644 index 00000000..3a66e51e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc new file mode 100644 index 00000000..74fbb05d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..9d1aafc7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc new file mode 100644 index 00000000..6ada84ac Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d32cbd45 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 00000000..d60fa63c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 00000000..5303a25a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc new file mode 100644 index 00000000..f0890920 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc new file mode 100644 index 00000000..42d27b97 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..ce303a28 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc new file mode 100644 index 00000000..73fbb11c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc new file mode 100644 index 00000000..89b635e7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc new file mode 100644 index 00000000..5627c80d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc new file mode 100644 index 00000000..1c77cb4c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc new file mode 100644 index 00000000..50cebef4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..76bf5f63 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc new file mode 100644 index 00000000..20e2ee20 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..4e6df774 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..c9c901a9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/fernet.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/fernet.cpython-312.pyc new file mode 100644 index 00000000..6ce20e0e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/fernet.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..63892bfb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..eeeef84c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-312.pyc new file mode 100644 index 00000000..9f72801a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..83bd5c90 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..8eb410c1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-312.pyc new file mode 100644 index 00000000..b161a284 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c9625a28 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ae3171a5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-312.pyc new file mode 100644 index 00000000..fa9efc2d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc new file mode 100644 index 00000000..df6fc35e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..37c376df Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..8d696a25 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc new file mode 100644 index 00000000..f7acfa3f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7ac68e70 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc new file mode 100644 index 00000000..153678cd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc new file mode 100644 index 00000000..90962e3e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc new file mode 100644 index 00000000..df3e3291 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc new file mode 100644 index 00000000..66895bec Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc new file mode 100644 index 00000000..aeb00d1f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc new file mode 100644 index 00000000..9dd7f6f9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc new file mode 100644 index 00000000..1d4218f3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc new file mode 100644 index 00000000..3e1651aa Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..44f0728e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc new file mode 100644 index 00000000..1d851a77 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-312.pyc new file mode 100644 index 00000000..dc11d5e2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-312.pyc new file mode 100644 index 00000000..1964efe7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-312.pyc new file mode 100644 index 00000000..ba9ce528 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc new file mode 100644 index 00000000..a103a52a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-312.pyc new file mode 100644 index 00000000..b501c3e2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-312.pyc new file mode 100644 index 00000000..dab05009 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-312.pyc new file mode 100644 index 00000000..0c796aa9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..0d96b94f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-312.pyc new file mode 100644 index 00000000..5b850d8a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc new file mode 100644 index 00000000..33bdc8b1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..992f920c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-312.pyc new file mode 100644 index 00000000..53165ff9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-312.pyc new file mode 100644 index 00000000..e436fc03 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..e4becf1a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-312.pyc new file mode 100644 index 00000000..12385c72 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..bc3daee1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc new file mode 100644 index 00000000..016a0c6a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c8f443ef Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..c5c34993 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-312.pyc new file mode 100644 index 00000000..7c0a70f2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3c9f74e5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..36245790 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/certificate_transparency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/certificate_transparency.cpython-312.pyc new file mode 100644 index 00000000..37327060 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/certificate_transparency.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc new file mode 100644 index 00000000..4550b459 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/general_name.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/general_name.cpython-312.pyc new file mode 100644 index 00000000..0fd09543 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/general_name.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc new file mode 100644 index 00000000..1d5cf10c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc new file mode 100644 index 00000000..02678a99 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/verification.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/verification.cpython-312.pyc new file mode 100644 index 00000000..5099e2da Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/verification.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..26a6ae0f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc new file mode 100644 index 00000000..b7b805fa Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc new file mode 100644 index 00000000..126f5085 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc new file mode 100644 index 00000000..7b1edb63 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9b08bf6d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..2cff7149 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc new file mode 100644 index 00000000..2bfa8953 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc new file mode 100644 index 00000000..9b35ef07 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..af16bf04 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/exceptions_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/exceptions_types.cpython-312.pyc new file mode 100644 index 00000000..0123bf13 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/exceptions_types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc new file mode 100644 index 00000000..afdef37f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc new file mode 100644 index 00000000..ca955e87 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc new file mode 100644 index 00000000..942703cc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc new file mode 100644 index 00000000..35fbde4e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..19ac2e58 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 00000000..13e79d4e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc new file mode 100644 index 00000000..6d4fdfc1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/background.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/background.cpython-312.pyc new file mode 100644 index 00000000..b710ff06 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/background.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc new file mode 100644 index 00000000..2c35c6ee Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc new file mode 100644 index 00000000..63d2983c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc new file mode 100644 index 00000000..11d3c69d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc new file mode 100644 index 00000000..7d9f1aa7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..c5b8da0f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc new file mode 100644 index 00000000..34e63c54 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc new file mode 100644 index 00000000..b07cb7e3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc new file mode 100644 index 00000000..359df0f5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc new file mode 100644 index 00000000..466fd711 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc new file mode 100644 index 00000000..2a713d92 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc new file mode 100644 index 00000000..1f04aa5b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc new file mode 100644 index 00000000..04e32a53 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/types.cpython-312.pyc new file mode 100644 index 00000000..1d3e0233 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..52a8a04c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc new file mode 100644 index 00000000..58b11da6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..bc104ef2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc new file mode 100644 index 00000000..3fcb7987 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..6e113790 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..a71e4fa0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc new file mode 100644 index 00000000..3e8a80f8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc new file mode 100644 index 00000000..a0e03f94 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..82fee2c4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc new file mode 100644 index 00000000..5d18a877 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc new file mode 100644 index 00000000..ae5473b2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc new file mode 100644 index 00000000..f8fc42b3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..5a614694 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..57a09b74 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc new file mode 100644 index 00000000..f4717924 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..484fa801 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc new file mode 100644 index 00000000..f2c35eb3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc new file mode 100644 index 00000000..d6a02e4c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc new file mode 100644 index 00000000..e8de984c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..ba1b8f93 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..62fab2c1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..4a3f03b2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc new file mode 100644 index 00000000..307efa92 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc new file mode 100644 index 00000000..98a0b898 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc new file mode 100644 index 00000000..ed8b0b5f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc new file mode 100644 index 00000000..9bf9871b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc new file mode 100644 index 00000000..749eb35d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc new file mode 100644 index 00000000..212f53a1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc new file mode 100644 index 00000000..6e8e60f3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc new file mode 100644 index 00000000..409a1fc9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..e18a8f40 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc new file mode 100644 index 00000000..f4ca341c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..41b78124 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc new file mode 100644 index 00000000..ce707b9e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc new file mode 100644 index 00000000..220706e0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc new file mode 100644 index 00000000..5901eeef Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc new file mode 100644 index 00000000..990abe20 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc new file mode 100644 index 00000000..344ea370 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc new file mode 100644 index 00000000..6f287881 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 00000000..fb5150d8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..56197452 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc new file mode 100644 index 00000000..ea6d8c90 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc new file mode 100644 index 00000000..cf79b745 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc new file mode 100644 index 00000000..fcee7ab6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc new file mode 100644 index 00000000..930bd1f1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc new file mode 100644 index 00000000..b11a20c1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc new file mode 100644 index 00000000..d508b399 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc new file mode 100644 index 00000000..93ab0b1f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ee995e85 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc new file mode 100644 index 00000000..4049a7f8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc new file mode 100644 index 00000000..bfdc76a6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..2565cc96 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc new file mode 100644 index 00000000..cd0d7e03 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc new file mode 100644 index 00000000..e45951f4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc new file mode 100644 index 00000000..3f42306a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..fffafcf0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc new file mode 100644 index 00000000..329122ab Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc new file mode 100644 index 00000000..0e8a0d66 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc new file mode 100644 index 00000000..9acdf160 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc new file mode 100644 index 00000000..6d4f6b2c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc new file mode 100644 index 00000000..aa311cd9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc new file mode 100644 index 00000000..77621796 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc new file mode 100644 index 00000000..2099f52e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..0c473e8b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..959fc73e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..4e93220d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc new file mode 100644 index 00000000..b5a73483 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc new file mode 100644 index 00000000..0070ee07 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..454f0557 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 00000000..b717cd0b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc new file mode 100644 index 00000000..91bae824 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc new file mode 100644 index 00000000..3f507523 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc new file mode 100644 index 00000000..400ed724 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 00000000..966e3642 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc new file mode 100644 index 00000000..e06c2acc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc new file mode 100644 index 00000000..ecab8a8e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc new file mode 100644 index 00000000..ddaf8525 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc new file mode 100644 index 00000000..dfb3bba5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc new file mode 100644 index 00000000..8c680bd7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc new file mode 100644 index 00000000..81671264 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc new file mode 100644 index 00000000..041ef623 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc new file mode 100644 index 00000000..c44b8e1c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc new file mode 100644 index 00000000..daf260cf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc new file mode 100644 index 00000000..cb204d7b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc new file mode 100644 index 00000000..e8fbd3ae Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 00000000..cf73fa9b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..96bc2572 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc new file mode 100644 index 00000000..238c5210 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..b75c754f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc new file mode 100644 index 00000000..8adc1681 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc new file mode 100644 index 00000000..0955bd5b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 00000000..ef9bba39 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..f523ba29 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc new file mode 100644 index 00000000..f4e16082 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc new file mode 100644 index 00000000..c8117e60 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc new file mode 100644 index 00000000..478f0049 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc new file mode 100644 index 00000000..6feaa5dc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc new file mode 100644 index 00000000..5bf6b566 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..16bfc9e1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc new file mode 100644 index 00000000..ad5045fa Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..0e3d48e1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc new file mode 100644 index 00000000..8ab87d7d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc new file mode 100644 index 00000000..6107b9af Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc new file mode 100644 index 00000000..eb8e6313 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..e38b8d48 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3cfeb32b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..fb53262f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc new file mode 100644 index 00000000..a787e178 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d158c236 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..3c7e458b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc new file mode 100644 index 00000000..b8670cbd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/limits.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/limits.cpython-312.pyc new file mode 100644 index 00000000..2f6fa1a3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/limits.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc new file mode 100644 index 00000000..5066e3b1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc new file mode 100644 index 00000000..4aa0ee7f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..551e0cc1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7439a880 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/strategies.cpython-312.pyc new file mode 100644 index 00000000..291ae1d8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/strategies.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..12ff1e6c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..1265a57b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc new file mode 100644 index 00000000..1718b1a8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc new file mode 100644 index 00000000..c3686161 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..457e9756 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/bridge.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/bridge.cpython-312.pyc new file mode 100644 index 00000000..0f5881cc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/bridge.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc new file mode 100644 index 00000000..94a01907 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/memcachio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/memcachio.cpython-312.pyc new file mode 100644 index 00000000..c5402471 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/memcachio.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2886cb1a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/bridge.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/bridge.cpython-312.pyc new file mode 100644 index 00000000..d5ef1989 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/bridge.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/coredis.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/coredis.cpython-312.pyc new file mode 100644 index 00000000..9a27f2ce Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/coredis.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/redispy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/redispy.cpython-312.pyc new file mode 100644 index 00000000..c3f7c8fa Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/redispy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc new file mode 100644 index 00000000..e42a1849 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..bfafbbcd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..9263b63e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc new file mode 100644 index 00000000..055306ae Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memory.cpython-312.pyc new file mode 100644 index 00000000..c0ce8d03 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memory.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/mongodb.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/mongodb.cpython-312.pyc new file mode 100644 index 00000000..092b5ff7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/mongodb.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis.cpython-312.pyc new file mode 100644 index 00000000..f88d5291 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc new file mode 100644 index 00000000..91830365 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_sentinel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_sentinel.cpython-312.pyc new file mode 100644 index 00000000..4d85e846 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_sentinel.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/registry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/registry.cpython-312.pyc new file mode 100644 index 00000000..a0410de4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/registry.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9211fa05 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/decoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/decoders.cpython-312.pyc new file mode 100644 index 00000000..42c5b9ac Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/decoders.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..2607d2b3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/multipart.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/multipart.cpython-312.pyc new file mode 100644 index 00000000..e87f3c65 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/multipart.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..4a1a5c10 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc new file mode 100644 index 00000000..4aa32fe4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc new file mode 100644 index 00000000..eff75247 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2bed8584 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc new file mode 100644 index 00000000..388fc07a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b4671938 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc new file mode 100644 index 00000000..899516db Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc new file mode 100644 index 00000000..97882416 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc new file mode 100644 index 00000000..35096f48 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc new file mode 100644 index 00000000..bb7ec43f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc new file mode 100644 index 00000000..c0a43e65 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..5624dfd5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..e332d449 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc new file mode 100644 index 00000000..0e66a296 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc new file mode 100644 index 00000000..5b7e5335 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc new file mode 100644 index 00000000..ca2b3c45 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc new file mode 100644 index 00000000..b86a6c98 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc new file mode 100644 index 00000000..c8bd4c16 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_validate_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_validate_request.cpython-312.pyc new file mode 100644 index 00000000..01d2654c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_validate_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ce6970a5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_capture_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_capture_request.cpython-312.pyc new file mode 100644 index 00000000..b72fbede Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_capture_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_get_request.cpython-312.pyc new file mode 100644 index 00000000..4ba481d4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_get_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_reauthorize_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_reauthorize_request.cpython-312.pyc new file mode 100644 index 00000000..a048a05d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_reauthorize_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_void_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_void_request.cpython-312.pyc new file mode 100644 index 00000000..72697a3d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_void_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_get_request.cpython-312.pyc new file mode 100644 index 00000000..97eefb20 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_get_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_refund_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_refund_request.cpython-312.pyc new file mode 100644 index 00000000..e4aca873 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_refund_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/refunds_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/refunds_get_request.cpython-312.pyc new file mode 100644 index 00000000..00b3d08c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/refunds_get_request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..fbf7e2f9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/encoder.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/encoder.cpython-312.pyc new file mode 100644 index 00000000..1cbf073f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/encoder.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc new file mode 100644 index 00000000..d4d6e52c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/file.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/file.cpython-312.pyc new file mode 100644 index 00000000..1987e356 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/file.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_client.cpython-312.pyc new file mode 100644 index 00000000..9a2fc64f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_client.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc new file mode 100644 index 00000000..acf7955f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc new file mode 100644 index 00000000..28a37638 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ee95ea3a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_encoded_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_encoded_serializer.cpython-312.pyc new file mode 100644 index 00000000..22e9be5c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_encoded_serializer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_part.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_part.cpython-312.pyc new file mode 100644 index 00000000..e3d0c95e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_part.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc new file mode 100644 index 00000000..a4865d6a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc new file mode 100644 index 00000000..e618d745 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc new file mode 100644 index 00000000..9a5edaaf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..dfc05d82 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc new file mode 100644 index 00000000..00615fce Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc new file mode 100644 index 00000000..aa52cd2a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc new file mode 100644 index 00000000..c7934843 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc new file mode 100644 index 00000000..78b3671a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc new file mode 100644 index 00000000..2f0a92b6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc new file mode 100644 index 00000000..18459f94 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc new file mode 100644 index 00000000..99005068 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc new file mode 100644 index 00000000..dc363b0b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..0bebced4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc new file mode 100644 index 00000000..9fd83441 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc new file mode 100644 index 00000000..4366cfbc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc new file mode 100644 index 00000000..318815df Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc new file mode 100644 index 00000000..c5b2eb7c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc new file mode 100644 index 00000000..3367d579 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..6ea746e6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc new file mode 100644 index 00000000..4a294e3c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc new file mode 100644 index 00000000..b4778199 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc new file mode 100644 index 00000000..e9df91fd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc new file mode 100644 index 00000000..c6cd95ea Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc new file mode 100644 index 00000000..891f51c8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc new file mode 100644 index 00000000..7cc5eea4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc new file mode 100644 index 00000000..1ea2c7b2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc new file mode 100644 index 00000000..5cee4736 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc new file mode 100644 index 00000000..cbc14573 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc new file mode 100644 index 00000000..0414e887 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc new file mode 100644 index 00000000..e1e422d8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc new file mode 100644 index 00000000..44780604 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc new file mode 100644 index 00000000..e949844e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc new file mode 100644 index 00000000..7af1d8cb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc new file mode 100644 index 00000000..edd03c7d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc new file mode 100644 index 00000000..68a0639a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc new file mode 100644 index 00000000..5a0e4080 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc new file mode 100644 index 00000000..09ba755d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 00000000..62466e23 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc new file mode 100644 index 00000000..65ad5c33 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc new file mode 100644 index 00000000..cc924761 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c466859a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc new file mode 100644 index 00000000..b6b8c0e8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3ce8c689 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc new file mode 100644 index 00000000..77b54323 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc new file mode 100644 index 00000000..5dd960d0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..64d4c09e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc new file mode 100644 index 00000000..4c39def5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..0a78465f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..87d11f37 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/sources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/sources.cpython-312.pyc new file mode 100644 index 00000000..c714ac41 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/sources.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..96c7c71a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/version.cpython-312.pyc new file mode 100644 index 00000000..c081c9d0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..acda9a50 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc new file mode 100644 index 00000000..80b50db4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc new file mode 100644 index 00000000..95c3ef5c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..85a5e80b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2b5c0226 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc new file mode 100644 index 00000000..676f2cb1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..765257eb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/_auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/_auth.cpython-312.pyc new file mode 100644 index 00000000..d1bcb5ef Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/_auth.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/charset.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/charset.cpython-312.pyc new file mode 100644 index 00000000..0b8e034e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/charset.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/connections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/connections.cpython-312.pyc new file mode 100644 index 00000000..f34b4726 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/connections.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/converters.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/converters.cpython-312.pyc new file mode 100644 index 00000000..cee875b8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/converters.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/cursors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/cursors.cpython-312.pyc new file mode 100644 index 00000000..403938ba Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/cursors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/err.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/err.cpython-312.pyc new file mode 100644 index 00000000..692a0b4d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/err.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/optionfile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/optionfile.cpython-312.pyc new file mode 100644 index 00000000..35ca9cde Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/optionfile.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/protocol.cpython-312.pyc new file mode 100644 index 00000000..edf5de4a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/protocol.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/times.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/times.cpython-312.pyc new file mode 100644 index 00000000..4fbdb8d0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/times.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CLIENT.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CLIENT.cpython-312.pyc new file mode 100644 index 00000000..2350b0d1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CLIENT.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/COMMAND.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/COMMAND.cpython-312.pyc new file mode 100644 index 00000000..e8d4c9f5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/COMMAND.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CR.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CR.cpython-312.pyc new file mode 100644 index 00000000..bf7ce678 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CR.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/ER.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/ER.cpython-312.pyc new file mode 100644 index 00000000..467c7272 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/ER.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/FIELD_TYPE.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/FIELD_TYPE.cpython-312.pyc new file mode 100644 index 00000000..1bbeed1e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/FIELD_TYPE.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/SERVER_STATUS.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/SERVER_STATUS.cpython-312.pyc new file mode 100644 index 00000000..efa1ea8b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/SERVER_STATUS.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..4dd23781 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..995dc8ae Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/compat.cpython-312.pyc new file mode 100644 index 00000000..525cb088 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/hotp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/hotp.cpython-312.pyc new file mode 100644 index 00000000..4b9be985 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/hotp.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/otp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/otp.cpython-312.pyc new file mode 100644 index 00000000..3345a265 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/otp.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/totp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/totp.cpython-312.pyc new file mode 100644 index 00000000..a80630f6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/totp.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..20c5771f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..67a4daac Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/steam.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/steam.cpython-312.pyc new file mode 100644 index 00000000..3e71e64d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/steam.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/LUT.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/LUT.cpython-312.pyc new file mode 100644 index 00000000..83a218b6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/LUT.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..c55d3a3a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..909ffaaf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/constants.cpython-312.pyc new file mode 100644 index 00000000..6a531cb3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/constants.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..58ac6c54 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..1cac8e7d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..7f871d8b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3e3c199b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/pil.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/pil.cpython-312.pyc new file mode 100644 index 00000000..7cbcb6ed Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/pil.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..890ab716 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..8a97b02b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/pure.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/pure.cpython-312.pyc new file mode 100644 index 00000000..10d95aa2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/pure.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2cb03e5d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..97b64867 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..9cb98b87 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/pil.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/pil.cpython-312.pyc new file mode 100644 index 00000000..9f2ca9dc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/pil.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..f203940a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 00000000..f70e7098 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc new file mode 100644 index 00000000..3c53496f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc new file mode 100644 index 00000000..b2e03b3c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc new file mode 100644 index 00000000..d55b49e8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc new file mode 100644 index 00000000..6f1412fa Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc new file mode 100644 index 00000000..0909afb6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc new file mode 100644 index 00000000..da2c2ad2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc new file mode 100644 index 00000000..59df7285 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..44fc5e35 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc new file mode 100644 index 00000000..0a8b9cbf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc new file mode 100644 index 00000000..03fbd802 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc new file mode 100644 index 00000000..41fca48e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc new file mode 100644 index 00000000..f8335783 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc new file mode 100644 index 00000000..2ff50836 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc new file mode 100644 index 00000000..092d11cc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..dd06de27 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..bc13765e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/errors.cpython-312.pyc new file mode 100644 index 00000000..f50c1631 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/errors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/extension.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/extension.cpython-312.pyc new file mode 100644 index 00000000..651ddcb9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/extension.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..9006d7e6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/wrappers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/wrappers.cpython-312.pyc new file mode 100644 index 00000000..bb9bd85c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/wrappers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7313a9f6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc new file mode 100644 index 00000000..bd2a4773 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..7c26fce2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..25c8f518 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/exc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/exc.cpython-312.pyc new file mode 100644 index 00000000..80f0719a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/exc.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/inspection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/inspection.cpython-312.pyc new file mode 100644 index 00000000..35f85a3a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/inspection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/log.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/log.cpython-312.pyc new file mode 100644 index 00000000..ee8b8708 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/log.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/schema.cpython-312.pyc new file mode 100644 index 00000000..c0e0daff Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/schema.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/types.cpython-312.pyc new file mode 100644 index 00000000..d7b63867 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..fc86b14d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc new file mode 100644 index 00000000..1b5c088a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..a41a7de1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..aa022c52 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..e4f1bf29 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc new file mode 100644 index 00000000..a0ad5680 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc new file mode 100644 index 00000000..826a7834 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..59dd7383 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc new file mode 100644 index 00000000..55a421f1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc new file mode 100644 index 00000000..6643f6b7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc new file mode 100644 index 00000000..c3410ad0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc new file mode 100644 index 00000000..1cddc07d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc new file mode 100644 index 00000000..c3b552cd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc new file mode 100644 index 00000000..964cb2a2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc new file mode 100644 index 00000000..6d23c1cb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc new file mode 100644 index 00000000..9a948292 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc new file mode 100644 index 00000000..71641cc1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc new file mode 100644 index 00000000..87fbe3f3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc new file mode 100644 index 00000000..688f8caa Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc new file mode 100644 index 00000000..06618b9f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc new file mode 100644 index 00000000..a9982b2a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..5f0b7dd8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc new file mode 100644 index 00000000..043bc1ce Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..22cbb639 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc new file mode 100644 index 00000000..e20559c6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/create.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/create.cpython-312.pyc new file mode 100644 index 00000000..78dfa066 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/create.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc new file mode 100644 index 00000000..e6d82271 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/default.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/default.cpython-312.pyc new file mode 100644 index 00000000..ac20e3fb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/default.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/events.cpython-312.pyc new file mode 100644 index 00000000..a97e9d5d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/events.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc new file mode 100644 index 00000000..675d5d86 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-312.pyc new file mode 100644 index 00000000..43c96c64 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-312.pyc new file mode 100644 index 00000000..f9a62ec4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc new file mode 100644 index 00000000..c1767305 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/result.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/result.cpython-312.pyc new file mode 100644 index 00000000..79ceece8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/result.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/row.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/row.cpython-312.pyc new file mode 100644 index 00000000..d225e8d7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/row.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/url.cpython-312.pyc new file mode 100644 index 00000000..4cab5bdc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/url.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..52e34aaa Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d0288b16 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/api.cpython-312.pyc new file mode 100644 index 00000000..33393d6e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/attr.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/attr.cpython-312.pyc new file mode 100644 index 00000000..33b9ecd4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/attr.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..0ae51106 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-312.pyc new file mode 100644 index 00000000..7b8adcd4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/registry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/registry.cpython-312.pyc new file mode 100644 index 00000000..2dc1ffd4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/registry.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d51006bc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..915f1957 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc new file mode 100644 index 00000000..f56242bf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7a9321ac Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/engine.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/engine.cpython-312.pyc new file mode 100644 index 00000000..4fcb52bc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/engine.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..58533128 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc new file mode 100644 index 00000000..af0b1eda Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc new file mode 100644 index 00000000..d9d60150 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc new file mode 100644 index 00000000..7a82000d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..3764452e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc new file mode 100644 index 00000000..b85c6cb5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc new file mode 100644 index 00000000..00b3c27d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-312.pyc new file mode 100644 index 00000000..2e3da5b0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/context.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/context.cpython-312.pyc new file mode 100644 index 00000000..668df89c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/context.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc new file mode 100644 index 00000000..c008a423 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc new file mode 100644 index 00000000..2fa48d86 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc new file mode 100644 index 00000000..05c9a0b5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc new file mode 100644 index 00000000..2cc8c85f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc new file mode 100644 index 00000000..43ce462c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc new file mode 100644 index 00000000..7878e83b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/events.cpython-312.pyc new file mode 100644 index 00000000..b84840ad Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/events.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-312.pyc new file mode 100644 index 00000000..9e008261 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-312.pyc new file mode 100644 index 00000000..48eac4c6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc new file mode 100644 index 00000000..4290fa7e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc new file mode 100644 index 00000000..b08156dd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-312.pyc new file mode 100644 index 00000000..fd57fb5e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc new file mode 100644 index 00000000..fb04eb19 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc new file mode 100644 index 00000000..958476e0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc new file mode 100644 index 00000000..57ff2e85 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc new file mode 100644 index 00000000..fb554d6f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-312.pyc new file mode 100644 index 00000000..6121533d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/query.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/query.cpython-312.pyc new file mode 100644 index 00000000..e362b91a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/query.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc new file mode 100644 index 00000000..5af4483a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc new file mode 100644 index 00000000..ad5b9b52 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/session.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/session.cpython-312.pyc new file mode 100644 index 00000000..fdf60702 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/session.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state.cpython-312.pyc new file mode 100644 index 00000000..ba8c4ccf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc new file mode 100644 index 00000000..b55eeb09 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc new file mode 100644 index 00000000..9d7d7631 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc new file mode 100644 index 00000000..3b2130a7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-312.pyc new file mode 100644 index 00000000..e3dfad1d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc new file mode 100644 index 00000000..feea3804 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..939a13c3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc new file mode 100644 index 00000000..36a5e20d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..1de55a9f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..e61ba4b4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/events.cpython-312.pyc new file mode 100644 index 00000000..e1951a5f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/events.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-312.pyc new file mode 100644 index 00000000..509a41b0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..1ee5ae5c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc new file mode 100644 index 00000000..eb327c67 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc new file mode 100644 index 00000000..97dd5cdb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc new file mode 100644 index 00000000..bf1b3f29 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc new file mode 100644 index 00000000..a421a715 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc new file mode 100644 index 00000000..6666fe95 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc new file mode 100644 index 00000000..ababa497 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..81050f3b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc new file mode 100644 index 00000000..fe47607a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc new file mode 100644 index 00000000..8f1e3114 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc new file mode 100644 index 00000000..a2d716a1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-312.pyc new file mode 100644 index 00000000..e3a89ff1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc new file mode 100644 index 00000000..e334c0c4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc new file mode 100644 index 00000000..608341dd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-312.pyc new file mode 100644 index 00000000..066f2c32 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-312.pyc new file mode 100644 index 00000000..d0048a00 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/events.cpython-312.pyc new file mode 100644 index 00000000..1c0d0593 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/events.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-312.pyc new file mode 100644 index 00000000..b37ac5f4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-312.pyc new file mode 100644 index 00000000..dd0b746c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc new file mode 100644 index 00000000..73b5a12c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-312.pyc new file mode 100644 index 00000000..9b476e0d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-312.pyc new file mode 100644 index 00000000..0888880d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-312.pyc new file mode 100644 index 00000000..62639cac Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-312.pyc new file mode 100644 index 00000000..e1f02b3f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc new file mode 100644 index 00000000..0d84d0ab Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc new file mode 100644 index 00000000..635fa779 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc new file mode 100644 index 00000000..74113b67 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc new file mode 100644 index 00000000..d5031bf2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..63b37d1f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc new file mode 100644 index 00000000..dbf1f8d6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9586dbf6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-312.pyc new file mode 100644 index 00000000..629e708a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc new file mode 100644 index 00000000..a2bdb2f0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc new file mode 100644 index 00000000..873843d9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/compat.cpython-312.pyc new file mode 100644 index 00000000..db908b15 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc new file mode 100644 index 00000000..2352c455 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc new file mode 100644 index 00000000..887081bc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc new file mode 100644 index 00000000..00b62a3b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc new file mode 100644 index 00000000..ea90949f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/queue.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/queue.cpython-312.pyc new file mode 100644 index 00000000..a2ce8d11 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/queue.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/topological.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/topological.cpython-312.pyc new file mode 100644 index 00000000..9bc44435 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/topological.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/typing.cpython-312.pyc new file mode 100644 index 00000000..2c63bef4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/typing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..6cfaf23d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 00000000..3ebf80be Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_compat.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 00000000..3cd91596 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/applications.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/applications.cpython-312.pyc new file mode 100644 index 00000000..eda77be7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/applications.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/background.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/background.cpython-312.pyc new file mode 100644 index 00000000..752ccb7c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/background.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc new file mode 100644 index 00000000..b403f430 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/config.cpython-312.pyc new file mode 100644 index 00000000..6d60db71 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/config.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/convertors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/convertors.cpython-312.pyc new file mode 100644 index 00000000..7effcaf6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/convertors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc new file mode 100644 index 00000000..e207851f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..e94d22ae Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc new file mode 100644 index 00000000..f94cf157 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/requests.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/requests.cpython-312.pyc new file mode 100644 index 00000000..229d731c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/requests.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/responses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/responses.cpython-312.pyc new file mode 100644 index 00000000..dd6e9d82 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/responses.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/routing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/routing.cpython-312.pyc new file mode 100644 index 00000000..6d78cedc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/routing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc new file mode 100644 index 00000000..db09ce9f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/status.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/status.cpython-312.pyc new file mode 100644 index 00000000..be080f4e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/status.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/types.cpython-312.pyc new file mode 100644 index 00000000..6a8be8ad Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/websockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/websockets.cpython-312.pyc new file mode 100644 index 00000000..ef867caf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/websockets.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..895ff6ed Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..3b15fb7b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc new file mode 100644 index 00000000..3f3cc142 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc new file mode 100644 index 00000000..86c4e767 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..5c88689a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..41816b2b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_mode.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_mode.cpython-312.pyc new file mode 100644 index 00000000..4d55c194 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_mode.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_version.cpython-312.pyc new file mode 100644 index 00000000..d1d8f78e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_app_info.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_app_info.cpython-312.pyc new file mode 100644 index 00000000..ce4e3329 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_app_info.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_base_address.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_base_address.cpython-312.pyc new file mode 100644 index 00000000..48c12cd5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_base_address.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_encode.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_encode.cpython-312.pyc new file mode 100644 index 00000000..bac465f3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_encode.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error.cpython-312.pyc new file mode 100644 index 00000000..3e24de70 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error_object.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error_object.cpython-312.pyc new file mode 100644 index 00000000..657965ca Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error_object.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_http_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_http_client.cpython-312.pyc new file mode 100644 index 00000000..bf5162cf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_http_client.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_metrics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_metrics.cpython-312.pyc new file mode 100644 index 00000000..79a21b32 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_metrics.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_options.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_options.cpython-312.pyc new file mode 100644 index 00000000..11b483f9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_options.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_requestor_options.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_requestor_options.cpython-312.pyc new file mode 100644 index 00000000..b6d6101d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_requestor_options.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_object.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_object.cpython-312.pyc new file mode 100644 index 00000000..7c711cb7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_object.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_response.cpython-312.pyc new file mode 100644 index 00000000..abb3c864 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_response.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_util.cpython-312.pyc new file mode 100644 index 00000000..280867a6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..6ac829a7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..8091b7b9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc new file mode 100644 index 00000000..9a97adbe Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc new file mode 100644 index 00000000..bf3d45fc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc new file mode 100644 index 00000000..929e9d0a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..bc4b158c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc new file mode 100644 index 00000000..2cc38246 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc new file mode 100644 index 00000000..cd352c78 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..0ec5d7a7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc new file mode 100644 index 00000000..ed1b2b75 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc new file mode 100644 index 00000000..edc2b3ce Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc new file mode 100644 index 00000000..b016ace9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc new file mode 100644 index 00000000..87f22365 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7ee35c9f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc new file mode 100644 index 00000000..52910834 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..4f5eaeb1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc new file mode 100644 index 00000000..4265ff1e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..54e851b4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc new file mode 100644 index 00000000..0f17a5a9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc new file mode 100644 index 00000000..c562a2ef Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc new file mode 100644 index 00000000..a2b6e9b7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc new file mode 100644 index 00000000..73b2a5cf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc new file mode 100644 index 00000000..408019d4 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc new file mode 100644 index 00000000..7a1e23f8 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc new file mode 100644 index 00000000..a422f053 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc new file mode 100644 index 00000000..97aaf157 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc new file mode 100644 index 00000000..6b797605 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc new file mode 100644 index 00000000..aacd18d7 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc new file mode 100644 index 00000000..1ec28fc5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc new file mode 100644 index 00000000..c3493052 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..3c4c691c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc new file mode 100644 index 00000000..44a631b5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc new file mode 100644 index 00000000..f94fe161 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/config.cpython-312.pyc new file mode 100644 index 00000000..65e98b86 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/config.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc new file mode 100644 index 00000000..d1f0d23f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc new file mode 100644 index 00000000..7c1dea90 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..864e70a2 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/server.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/server.cpython-312.pyc new file mode 100644 index 00000000..d74c7931 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/server.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..ffaf035b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc new file mode 100644 index 00000000..1b74e8f6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..7f8e7598 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc new file mode 100644 index 00000000..9d1366a0 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc new file mode 100644 index 00000000..bbafb54c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..21f4a33f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc new file mode 100644 index 00000000..b1155b8e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc new file mode 100644 index 00000000..63d82a01 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc new file mode 100644 index 00000000..0ef96fe3 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 00000000..e8129d48 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..900450cc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..f3e20916 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..5198ca18 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc new file mode 100644 index 00000000..6243278d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc new file mode 100644 index 00000000..0b68490f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc new file mode 100644 index 00000000..b0221a36 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..d9c90f62 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc new file mode 100644 index 00000000..735f8bca Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc new file mode 100644 index 00000000..438e8a7e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9f84e614 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc new file mode 100644 index 00000000..685ee863 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc new file mode 100644 index 00000000..f8d344a9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc new file mode 100644 index 00000000..593420ca Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..89497c31 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_noop.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_noop.cpython-312.pyc new file mode 100644 index 00000000..dc0f28b1 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_noop.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_version.cpython-312.pyc new file mode 100644 index 00000000..f1ad73b5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/includes/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/includes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..b88bc5d9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/uvloop/includes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..49400b70 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/filters.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/filters.cpython-312.pyc new file mode 100644 index 00000000..fa274bfd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/filters.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..20d66660 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/run.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/run.cpython-312.pyc new file mode 100644 index 00000000..02169eb6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/run.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/version.cpython-312.pyc new file mode 100644 index 00000000..1ce06e69 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..883dce51 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/labels.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/labels.cpython-312.pyc new file mode 100644 index 00000000..ba735a8a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/labels.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..29e352fd Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/datastructures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/datastructures.cpython-312.pyc new file mode 100644 index 00000000..dee0f5f5 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/datastructures.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..a35e46cf Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/frames.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/frames.cpython-312.pyc new file mode 100644 index 00000000..c31ba29e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/frames.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/headers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/headers.cpython-312.pyc new file mode 100644 index 00000000..69a8525b Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/headers.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/http11.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/http11.cpython-312.pyc new file mode 100644 index 00000000..537a667a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/http11.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/imports.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/imports.cpython-312.pyc new file mode 100644 index 00000000..a96f1e43 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/imports.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/protocol.cpython-312.pyc new file mode 100644 index 00000000..647356c9 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/protocol.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/server.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/server.cpython-312.pyc new file mode 100644 index 00000000..ef43549d Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/server.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/streams.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/streams.cpython-312.pyc new file mode 100644 index 00000000..ee430dcc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/streams.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/typing.cpython-312.pyc new file mode 100644 index 00000000..19965edc Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/typing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/utils.cpython-312.pyc new file mode 100644 index 00000000..d8a87d3e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/utils.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/version.cpython-312.pyc new file mode 100644 index 00000000..0689773f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/version.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..9537c252 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/compatibility.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/compatibility.cpython-312.pyc new file mode 100644 index 00000000..d22ae148 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/compatibility.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..46d6015e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/base.cpython-312.pyc new file mode 100644 index 00000000..51addb78 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/base.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/permessage_deflate.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/permessage_deflate.cpython-312.pyc new file mode 100644 index 00000000..b1710943 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/permessage_deflate.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..8b6ec681 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 00000000..e71f421a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/exceptions.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/framing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/framing.cpython-312.pyc new file mode 100644 index 00000000..9836535c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/framing.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/handshake.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/handshake.cpython-312.pyc new file mode 100644 index 00000000..78630a77 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/handshake.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/http.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/http.cpython-312.pyc new file mode 100644 index 00000000..8cc2bf25 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/http.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/protocol.cpython-312.pyc new file mode 100644 index 00000000..9083fc80 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/protocol.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/server.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/server.cpython-312.pyc new file mode 100644 index 00000000..bad3507e Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/server.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2738a53a Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__wrapt__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__wrapt__.cpython-312.pyc new file mode 100644 index 00000000..8378e28c Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__wrapt__.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/arguments.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/arguments.cpython-312.pyc new file mode 100644 index 00000000..5449368f Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/arguments.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/decorators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/decorators.cpython-312.pyc new file mode 100644 index 00000000..570e3002 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/decorators.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/importer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/importer.cpython-312.pyc new file mode 100644 index 00000000..80682b89 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/importer.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/patches.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/patches.cpython-312.pyc new file mode 100644 index 00000000..047f2eb6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/patches.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/proxies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/proxies.cpython-312.pyc new file mode 100644 index 00000000..097c27ad Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/proxies.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/weakrefs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/weakrefs.cpython-312.pyc new file mode 100644 index 00000000..e98213d6 Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/weakrefs.cpython-312.pyc differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/wrappers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/wrappers.cpython-312.pyc new file mode 100644 index 00000000..49d3e9fb Binary files /dev/null and b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/wrappers.cpython-312.pyc differ diff --git a/Frontend/src/App.tsx b/Frontend/src/App.tsx index 46c46c89..b2b29c1f 100644 --- a/Frontend/src/App.tsx +++ b/Frontend/src/App.tsx @@ -59,6 +59,7 @@ const InvoiceEditPage = lazy(() => import('./pages/admin/InvoiceEditPage')); const ProfilePage = lazy(() => import('./pages/customer/ProfilePage')); const LoyaltyPage = lazy(() => import('./pages/customer/LoyaltyPage')); const GroupBookingPage = lazy(() => import('./pages/customer/GroupBookingPage')); +const ComplaintPage = lazy(() => import('./pages/customer/ComplaintPage')); const AboutPage = lazy(() => import('./features/content/pages/AboutPage')); const ContactPage = lazy(() => import('./features/content/pages/ContactPage')); const PrivacyPolicyPage = lazy(() => import('./features/content/pages/PrivacyPolicyPage')); @@ -93,6 +94,9 @@ const SecurityManagementPage = lazy(() => import('./pages/admin/SecurityManageme const EmailCampaignManagementPage = lazy(() => import('./pages/admin/EmailCampaignManagementPage')); const ReviewManagementPage = lazy(() => import('./pages/admin/ReviewManagementPage')); const BlogManagementPage = lazy(() => import('./pages/admin/BlogManagementPage')); +const ComplaintManagementPage = lazy(() => import('./pages/admin/ComplaintManagementPage')); +const FinancialAuditTrailPage = lazy(() => import('./pages/admin/FinancialAuditTrailPage')); +const ComplianceReportingPage = lazy(() => import('./pages/admin/ComplianceReportingPage')); const StaffDashboardPage = lazy(() => import('./pages/staff/DashboardPage')); const StaffBookingManagementPage = lazy(() => import('./pages/staff/BookingManagementPage')); @@ -401,6 +405,14 @@ function App() { } /> + + + + } + /> {} @@ -521,6 +533,18 @@ function App() { path="blog" element={} /> + } + /> + } + /> + } + /> {} diff --git a/Frontend/src/features/guest_management/services/complaintService.ts b/Frontend/src/features/guest_management/services/complaintService.ts new file mode 100644 index 00000000..10df2ee4 --- /dev/null +++ b/Frontend/src/features/guest_management/services/complaintService.ts @@ -0,0 +1,139 @@ +/** + * Service for managing guest complaints + */ +import apiClient from '../../../shared/services/apiClient'; + +export interface Complaint { + id: number; + title: string; + description: string; + category: string; + priority: 'low' | 'medium' | 'high' | 'urgent'; + status: 'open' | 'in_progress' | 'resolved' | 'closed' | 'escalated'; + guest_id: number; + booking_id?: number; + room_id?: number; + assigned_to?: number; + resolution?: string; + resolved_at?: string; + resolved_by?: number; + guest_satisfaction_rating?: number; + guest_feedback?: string; + internal_notes?: string; + attachments?: string[]; + requires_follow_up: boolean; + follow_up_date?: string; + created_at: string; + updated_at: string; + updates?: ComplaintUpdate[]; +} + +export interface ComplaintUpdate { + id: number; + update_type: string; + description: string; + updated_by: number; + created_at: string; +} + +export interface CreateComplaintRequest { + booking_id?: number; + room_id?: number; + category: string; + priority?: string; + title: string; + description: string; + attachments?: string[]; +} + +export interface UpdateComplaintRequest { + status?: string; + priority?: string; + assigned_to?: number; + resolution?: string; + internal_notes?: string; + requires_follow_up?: boolean; + follow_up_date?: string; +} + +export interface ResolveComplaintRequest { + resolution: string; + guest_satisfaction_rating?: number; + guest_feedback?: string; +} + +export interface AddComplaintUpdateRequest { + update_type: string; + description: string; + metadata?: Record; +} + +export interface ComplaintFilters { + status?: string; + priority?: string; + category?: string; + assigned_to?: number; + page?: number; + limit?: number; +} + +const complaintService = { + /** + * Create a new complaint + */ + async createComplaint(data: CreateComplaintRequest) { + const response = await apiClient.post('/complaints', data); + return response.data; + }, + + /** + * Get complaints with filters + */ + async getComplaints(filters: ComplaintFilters = {}) { + const params = new URLSearchParams(); + if (filters.status) params.append('status', filters.status); + if (filters.priority) params.append('priority', filters.priority); + if (filters.category) params.append('category', filters.category); + if (filters.assigned_to) params.append('assigned_to', filters.assigned_to.toString()); + if (filters.page) params.append('page', filters.page.toString()); + if (filters.limit) params.append('limit', filters.limit.toString()); + + const response = await apiClient.get(`/complaints?${params.toString()}`); + return response.data; + }, + + /** + * Get a specific complaint + */ + async getComplaint(complaintId: number) { + const response = await apiClient.get(`/complaints/${complaintId}`); + return response.data; + }, + + /** + * Update a complaint (admin/staff only) + */ + async updateComplaint(complaintId: number, data: UpdateComplaintRequest) { + const response = await apiClient.put(`/complaints/${complaintId}`, data); + return response.data; + }, + + /** + * Resolve a complaint (admin/staff only) + */ + async resolveComplaint(complaintId: number, data: ResolveComplaintRequest) { + const response = await apiClient.post(`/complaints/${complaintId}/resolve`, data); + return response.data; + }, + + /** + * Add an update to a complaint + */ + async addComplaintUpdate(complaintId: number, data: AddComplaintUpdateRequest) { + const response = await apiClient.post(`/complaints/${complaintId}/updates`, data); + return response.data; + }, +}; + +export default complaintService; + diff --git a/Frontend/src/features/guest_management/services/index.ts b/Frontend/src/features/guest_management/services/index.ts index e69de29b..9be15bcf 100644 --- a/Frontend/src/features/guest_management/services/index.ts +++ b/Frontend/src/features/guest_management/services/index.ts @@ -0,0 +1,3 @@ +export { default as complaintService } from './complaintService'; +export { default as guestProfileService } from './guestProfileService'; + diff --git a/Frontend/src/features/payments/services/financialAuditService.ts b/Frontend/src/features/payments/services/financialAuditService.ts new file mode 100644 index 00000000..1a294d87 --- /dev/null +++ b/Frontend/src/features/payments/services/financialAuditService.ts @@ -0,0 +1,65 @@ +/** + * Service for accessing financial audit trail + */ +import apiClient from '../../../shared/services/apiClient'; + +export interface FinancialAuditRecord { + id: number; + action_type: string; + action_description: string; + payment_id?: number; + invoice_id?: number; + booking_id?: number; + amount?: number; + previous_amount?: number; + currency: string; + performed_by: number; + performed_by_email?: string; + metadata?: Record; + notes?: string; + created_at: string; +} + +export interface FinancialAuditFilters { + payment_id?: number; + invoice_id?: number; + booking_id?: number; + action_type?: string; + user_id?: number; + start_date?: string; + end_date?: string; + page?: number; + limit?: number; +} + +const financialAuditService = { + /** + * Get financial audit trail with filters + */ + async getAuditTrail(filters: FinancialAuditFilters = {}) { + const params = new URLSearchParams(); + if (filters.payment_id) params.append('payment_id', filters.payment_id.toString()); + if (filters.invoice_id) params.append('invoice_id', filters.invoice_id.toString()); + if (filters.booking_id) params.append('booking_id', filters.booking_id.toString()); + if (filters.action_type) params.append('action_type', filters.action_type); + if (filters.user_id) params.append('user_id', filters.user_id.toString()); + if (filters.start_date) params.append('start_date', filters.start_date); + if (filters.end_date) params.append('end_date', filters.end_date); + if (filters.page) params.append('page', filters.page.toString()); + if (filters.limit) params.append('limit', filters.limit.toString()); + + const response = await apiClient.get(`/financial/audit-trail?${params.toString()}`); + return response.data; + }, + + /** + * Get a specific audit record + */ + async getAuditRecord(recordId: number) { + const response = await apiClient.get(`/financial/audit-trail/${recordId}`); + return response.data; + }, +}; + +export default financialAuditService; + diff --git a/Frontend/src/features/payments/services/index.ts b/Frontend/src/features/payments/services/index.ts index e69de29b..4f3c51f3 100644 --- a/Frontend/src/features/payments/services/index.ts +++ b/Frontend/src/features/payments/services/index.ts @@ -0,0 +1,4 @@ +export { default as paymentService } from './paymentService'; +export { default as invoiceService } from './invoiceService'; +export { default as financialAuditService } from './financialAuditService'; + diff --git a/Frontend/src/features/security/services/complianceService.ts b/Frontend/src/features/security/services/complianceService.ts new file mode 100644 index 00000000..6485239f --- /dev/null +++ b/Frontend/src/features/security/services/complianceService.ts @@ -0,0 +1,65 @@ +/** + * Service for compliance reporting + */ +import apiClient from '../../../shared/services/apiClient'; + +export interface ComplianceReport { + period: { + start_date: string; + end_date: string; + }; + financial_audit: { + total_actions: number; + description: string; + }; + gdpr_compliance: { + total_requests: number; + completed_requests: number; + completion_rate: number; + description: string; + }; + security_audit: { + total_events: number; + description: string; + }; + compliance_status: string; + generated_at: string; + generated_by: string; +} + +export interface GDPRSummary { + total_requests: number; + pending_requests: number; + completed_requests: number; + completion_rate: number; + requests_by_type: Record; + compliance_status: string; +} + +const complianceService = { + /** + * Get compliance report + */ + async getComplianceReport(startDate?: string, endDate?: string, format: 'json' | 'csv' = 'json') { + const params = new URLSearchParams(); + if (startDate) params.append('start_date', startDate); + if (endDate) params.append('end_date', endDate); + params.append('format', format); + + const response = await apiClient.get(`/compliance/report?${params.toString()}`, { + responseType: format === 'csv' ? 'blob' : 'json', + }); + return response.data; + }, + + /** + * Get GDPR compliance summary + */ + async getGDPRSummary() { + const response = await apiClient.get('/compliance/gdpr-summary'); + return response.data; + }, +}; + +export default complianceService; + diff --git a/Frontend/src/features/security/services/index.ts b/Frontend/src/features/security/services/index.ts index e69de29b..5f4a6721 100644 --- a/Frontend/src/features/security/services/index.ts +++ b/Frontend/src/features/security/services/index.ts @@ -0,0 +1,3 @@ +export { default as securityService } from './securityService'; +export { default as complianceService } from './complianceService'; + diff --git a/Frontend/src/pages/admin/ComplaintManagementPage.tsx b/Frontend/src/pages/admin/ComplaintManagementPage.tsx new file mode 100644 index 00000000..03b0e2d0 --- /dev/null +++ b/Frontend/src/pages/admin/ComplaintManagementPage.tsx @@ -0,0 +1,474 @@ +import React, { useState, useEffect } from 'react'; +import { + AlertCircle, + Search, + Filter, + Eye, + Edit, + CheckCircle, + Clock, + XCircle, + User, + Calendar, + Tag, + MessageSquare, + Download +} from 'lucide-react'; +import { toast } from 'react-toastify'; +import Loading from '../../shared/components/Loading'; +import EmptyState from '../../shared/components/EmptyState'; +import Pagination from '../../shared/components/Pagination'; +import complaintService, { Complaint, ComplaintFilters } from '../../features/guest_management/services/complaintService'; +import { formatDate } from '../../shared/utils/format'; + +const ComplaintManagementPage: React.FC = () => { + const [complaints, setComplaints] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedComplaint, setSelectedComplaint] = useState(null); + const [showDetailModal, setShowDetailModal] = useState(false); + const [showResolveModal, setShowResolveModal] = useState(false); + const [resolving, setResolving] = useState(false); + const [filters, setFilters] = useState({ + page: 1, + limit: 20, + }); + const [currentPage, setCurrentPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + const [totalItems, setTotalItems] = useState(0); + const itemsPerPage = 20; + + useEffect(() => { + fetchComplaints(); + }, [filters, currentPage]); + + useEffect(() => { + setFilters(prev => ({ ...prev, page: currentPage })); + }, [currentPage]); + + const fetchComplaints = async () => { + try { + setLoading(true); + const response = await complaintService.getComplaints({ + ...filters, + page: currentPage, + limit: itemsPerPage, + }); + setComplaints(response.data.complaints || []); + if (response.data.pagination) { + setTotalPages(response.data.pagination.total_pages || 1); + setTotalItems(response.data.pagination.total || 0); + } + } catch (error: any) { + toast.error(error.response?.data?.message || 'Unable to load complaints'); + } finally { + setLoading(false); + } + }; + + const handleViewDetails = async (complaintId: number) => { + try { + const response = await complaintService.getComplaint(complaintId); + setSelectedComplaint(response.data.complaint); + setShowDetailModal(true); + } catch (error: any) { + toast.error(error.response?.data?.message || 'Unable to load complaint details'); + } + }; + + const handleResolve = async (resolution: string, rating?: number, feedback?: string) => { + if (!selectedComplaint) return; + + try { + setResolving(true); + await complaintService.resolveComplaint(selectedComplaint.id, { + resolution, + guest_satisfaction_rating: rating, + guest_feedback: feedback, + }); + toast.success('Complaint resolved successfully'); + setShowResolveModal(false); + setShowDetailModal(false); + fetchComplaints(); + } catch (error: any) { + toast.error(error.response?.data?.message || 'Unable to resolve complaint'); + } finally { + setResolving(false); + } + }; + + const handleUpdateStatus = async (complaintId: number, status: string) => { + try { + await complaintService.updateComplaint(complaintId, { status }); + toast.success('Complaint status updated'); + fetchComplaints(); + if (selectedComplaint?.id === complaintId) { + setSelectedComplaint({ ...selectedComplaint, status: status as any }); + } + } catch (error: any) { + toast.error(error.response?.data?.message || 'Unable to update complaint'); + } + }; + + const getPriorityColor = (priority: string) => { + switch (priority) { + case 'urgent': + return 'bg-red-100 text-red-800 border-red-200'; + case 'high': + return 'bg-orange-100 text-orange-800 border-orange-200'; + case 'medium': + return 'bg-yellow-100 text-yellow-800 border-yellow-200'; + case 'low': + return 'bg-blue-100 text-blue-800 border-blue-200'; + default: + return 'bg-gray-100 text-gray-800 border-gray-200'; + } + }; + + const getStatusColor = (status: string) => { + switch (status) { + case 'resolved': + return 'bg-green-100 text-green-800'; + case 'closed': + return 'bg-gray-100 text-gray-800'; + case 'in_progress': + return 'bg-blue-100 text-blue-800'; + case 'escalated': + return 'bg-purple-100 text-purple-800'; + case 'open': + return 'bg-yellow-100 text-yellow-800'; + default: + return 'bg-gray-100 text-gray-800'; + } + }; + + if (loading && complaints.length === 0) { + return ; + } + + return ( +
+
+
+

Complaint Management

+

Manage and resolve guest complaints

+
+
+ + {/* Filters */} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + {/* Complaints List */} + {complaints.length === 0 ? ( + + ) : ( + <> +
+
+ + + + + + + + + + + + + + {complaints.map((complaint) => ( + + + + + + + + + + ))} + +
IDTitleCategoryPriorityStatusCreatedActions
{complaint.id}{complaint.title} + {complaint.category.replace('_', ' ')} + + + {complaint.priority} + + + + {complaint.status.replace('_', ' ')} + + + {formatDate(complaint.created_at)} + + +
+
+
+ + + + )} + + {/* Detail Modal */} + {showDetailModal && selectedComplaint && ( + { + setShowDetailModal(false); + setSelectedComplaint(null); + }} + onResolve={() => setShowResolveModal(true)} + onUpdateStatus={handleUpdateStatus} + /> + )} + + {/* Resolve Modal */} + {showResolveModal && selectedComplaint && ( + setShowResolveModal(false)} + onResolve={handleResolve} + resolving={resolving} + /> + )} +
+ ); +}; + +// Complaint Detail Modal Component +const ComplaintDetailModal: React.FC<{ + complaint: Complaint; + onClose: () => void; + onResolve: () => void; + onUpdateStatus: (id: number, status: string) => void; +}> = ({ complaint, onClose, onResolve, onUpdateStatus }) => { + return ( +
+
+
+

Complaint Details

+ +
+
+
+

{complaint.title}

+

{complaint.description}

+
+
+
+ +

{complaint.category.replace('_', ' ')}

+
+
+ +

{complaint.priority}

+
+
+ +

{complaint.status.replace('_', ' ')}

+
+
+ +

{formatDate(complaint.created_at)}

+
+
+ {complaint.resolution && ( +
+ +

{complaint.resolution}

+
+ )} + {complaint.updates && complaint.updates.length > 0 && ( +
+ +
+ {complaint.updates.map((update) => ( +
+

{update.description}

+

{formatDate(update.created_at)}

+
+ ))} +
+
+ )} +
+ {complaint.status !== 'resolved' && complaint.status !== 'closed' && ( + + )} + +
+
+
+
+ ); +}; + +// Resolve Complaint Modal Component +const ResolveComplaintModal: React.FC<{ + complaint: Complaint; + onClose: () => void; + onResolve: (resolution: string, rating?: number, feedback?: string) => void; + resolving: boolean; +}> = ({ complaint, onClose, onResolve, resolving }) => { + const [resolution, setResolution] = useState(''); + const [rating, setRating] = useState(); + const [feedback, setFeedback] = useState(''); + + return ( +
+
+
+

Resolve Complaint

+
+
+
+ +