diff --git a/Backend/src/__pycache__/__init__.cpython-312.pyc b/Backend/src/__pycache__/__init__.cpython-312.pyc index 8934a2f6..68f51181 100644 Binary files a/Backend/src/__pycache__/__init__.cpython-312.pyc 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 index abd96a2b..4f965054 100644 Binary files a/Backend/src/__pycache__/main.cpython-312.pyc and b/Backend/src/__pycache__/main.cpython-312.pyc differ diff --git a/Backend/src/config/__pycache__/database.cpython-312.pyc b/Backend/src/config/__pycache__/database.cpython-312.pyc index 6f7e73ee..988872d7 100644 Binary files a/Backend/src/config/__pycache__/database.cpython-312.pyc and b/Backend/src/config/__pycache__/database.cpython-312.pyc differ diff --git a/Backend/src/config/__pycache__/logging_config.cpython-312.pyc b/Backend/src/config/__pycache__/logging_config.cpython-312.pyc index 286c8eb7..906bf4cd 100644 Binary files a/Backend/src/config/__pycache__/logging_config.cpython-312.pyc and b/Backend/src/config/__pycache__/logging_config.cpython-312.pyc differ diff --git a/Backend/src/config/__pycache__/settings.cpython-312.pyc b/Backend/src/config/__pycache__/settings.cpython-312.pyc index 0e678cda..47a9c2da 100644 Binary files a/Backend/src/config/__pycache__/settings.cpython-312.pyc and b/Backend/src/config/__pycache__/settings.cpython-312.pyc differ diff --git a/Backend/src/middleware/__pycache__/auth.cpython-312.pyc b/Backend/src/middleware/__pycache__/auth.cpython-312.pyc index 2ec0e5f2..66228a7e 100644 Binary files a/Backend/src/middleware/__pycache__/auth.cpython-312.pyc and b/Backend/src/middleware/__pycache__/auth.cpython-312.pyc differ diff --git a/Backend/src/middleware/__pycache__/cookie_consent.cpython-312.pyc b/Backend/src/middleware/__pycache__/cookie_consent.cpython-312.pyc index 12cfee5c..1f86a17c 100644 Binary files a/Backend/src/middleware/__pycache__/cookie_consent.cpython-312.pyc and b/Backend/src/middleware/__pycache__/cookie_consent.cpython-312.pyc differ diff --git a/Backend/src/middleware/__pycache__/error_handler.cpython-312.pyc b/Backend/src/middleware/__pycache__/error_handler.cpython-312.pyc index 93da6889..e6a65c78 100644 Binary files a/Backend/src/middleware/__pycache__/error_handler.cpython-312.pyc and b/Backend/src/middleware/__pycache__/error_handler.cpython-312.pyc differ diff --git a/Backend/src/middleware/__pycache__/request_id.cpython-312.pyc b/Backend/src/middleware/__pycache__/request_id.cpython-312.pyc index ea615492..2b574b83 100644 Binary files a/Backend/src/middleware/__pycache__/request_id.cpython-312.pyc and b/Backend/src/middleware/__pycache__/request_id.cpython-312.pyc differ diff --git a/Backend/src/middleware/__pycache__/security.cpython-312.pyc b/Backend/src/middleware/__pycache__/security.cpython-312.pyc index 3ffd272c..b8a34e52 100644 Binary files a/Backend/src/middleware/__pycache__/security.cpython-312.pyc and b/Backend/src/middleware/__pycache__/security.cpython-312.pyc differ diff --git a/Backend/src/middleware/__pycache__/timeout.cpython-312.pyc b/Backend/src/middleware/__pycache__/timeout.cpython-312.pyc index 12ef31a5..5dfa254a 100644 Binary files a/Backend/src/middleware/__pycache__/timeout.cpython-312.pyc and b/Backend/src/middleware/__pycache__/timeout.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/models/__pycache__/__init__.cpython-312.pyc index 8664a45a..bba21412 100644 Binary files a/Backend/src/models/__pycache__/__init__.cpython-312.pyc and b/Backend/src/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/audit_log.cpython-312.pyc b/Backend/src/models/__pycache__/audit_log.cpython-312.pyc index 5bab501e..a546ed92 100644 Binary files a/Backend/src/models/__pycache__/audit_log.cpython-312.pyc and b/Backend/src/models/__pycache__/audit_log.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/banner.cpython-312.pyc b/Backend/src/models/__pycache__/banner.cpython-312.pyc index d992598b..972877be 100644 Binary files a/Backend/src/models/__pycache__/banner.cpython-312.pyc and b/Backend/src/models/__pycache__/banner.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/booking.cpython-312.pyc b/Backend/src/models/__pycache__/booking.cpython-312.pyc index e856c4bb..eceb1166 100644 Binary files a/Backend/src/models/__pycache__/booking.cpython-312.pyc and b/Backend/src/models/__pycache__/booking.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/chat.cpython-312.pyc b/Backend/src/models/__pycache__/chat.cpython-312.pyc index 499d5196..28512780 100644 Binary files a/Backend/src/models/__pycache__/chat.cpython-312.pyc and b/Backend/src/models/__pycache__/chat.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/checkin_checkout.cpython-312.pyc b/Backend/src/models/__pycache__/checkin_checkout.cpython-312.pyc index 144f3690..c77b351d 100644 Binary files a/Backend/src/models/__pycache__/checkin_checkout.cpython-312.pyc and b/Backend/src/models/__pycache__/checkin_checkout.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/cookie_integration_config.cpython-312.pyc b/Backend/src/models/__pycache__/cookie_integration_config.cpython-312.pyc index ec82a456..b8036457 100644 Binary files a/Backend/src/models/__pycache__/cookie_integration_config.cpython-312.pyc and b/Backend/src/models/__pycache__/cookie_integration_config.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/cookie_policy.cpython-312.pyc b/Backend/src/models/__pycache__/cookie_policy.cpython-312.pyc index 82349a37..24994892 100644 Binary files a/Backend/src/models/__pycache__/cookie_policy.cpython-312.pyc and b/Backend/src/models/__pycache__/cookie_policy.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/favorite.cpython-312.pyc b/Backend/src/models/__pycache__/favorite.cpython-312.pyc index 2e3f2279..8d47a002 100644 Binary files a/Backend/src/models/__pycache__/favorite.cpython-312.pyc and b/Backend/src/models/__pycache__/favorite.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/invoice.cpython-312.pyc b/Backend/src/models/__pycache__/invoice.cpython-312.pyc index 150faad0..e0a6bd0d 100644 Binary files a/Backend/src/models/__pycache__/invoice.cpython-312.pyc and b/Backend/src/models/__pycache__/invoice.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/page_content.cpython-312.pyc b/Backend/src/models/__pycache__/page_content.cpython-312.pyc index 4cae9e91..80f81e00 100644 Binary files a/Backend/src/models/__pycache__/page_content.cpython-312.pyc and b/Backend/src/models/__pycache__/page_content.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/password_reset_token.cpython-312.pyc b/Backend/src/models/__pycache__/password_reset_token.cpython-312.pyc index c0441dc5..47628d37 100644 Binary files a/Backend/src/models/__pycache__/password_reset_token.cpython-312.pyc and b/Backend/src/models/__pycache__/password_reset_token.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/payment.cpython-312.pyc b/Backend/src/models/__pycache__/payment.cpython-312.pyc index 08a69330..af736058 100644 Binary files a/Backend/src/models/__pycache__/payment.cpython-312.pyc and b/Backend/src/models/__pycache__/payment.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/promotion.cpython-312.pyc b/Backend/src/models/__pycache__/promotion.cpython-312.pyc index 15425cd7..d21d56d0 100644 Binary files a/Backend/src/models/__pycache__/promotion.cpython-312.pyc and b/Backend/src/models/__pycache__/promotion.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/refresh_token.cpython-312.pyc b/Backend/src/models/__pycache__/refresh_token.cpython-312.pyc index c0fc65cd..e929ee9d 100644 Binary files a/Backend/src/models/__pycache__/refresh_token.cpython-312.pyc and b/Backend/src/models/__pycache__/refresh_token.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/review.cpython-312.pyc b/Backend/src/models/__pycache__/review.cpython-312.pyc index 573a8ea0..84b09ff1 100644 Binary files a/Backend/src/models/__pycache__/review.cpython-312.pyc and b/Backend/src/models/__pycache__/review.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/role.cpython-312.pyc b/Backend/src/models/__pycache__/role.cpython-312.pyc index 79f39adf..010daa02 100644 Binary files a/Backend/src/models/__pycache__/role.cpython-312.pyc and b/Backend/src/models/__pycache__/role.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/room.cpython-312.pyc b/Backend/src/models/__pycache__/room.cpython-312.pyc index 71ea50da..ed213aa8 100644 Binary files a/Backend/src/models/__pycache__/room.cpython-312.pyc and b/Backend/src/models/__pycache__/room.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/room_type.cpython-312.pyc b/Backend/src/models/__pycache__/room_type.cpython-312.pyc index 2e2e68e9..4aa1eea6 100644 Binary files a/Backend/src/models/__pycache__/room_type.cpython-312.pyc and b/Backend/src/models/__pycache__/room_type.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/service.cpython-312.pyc b/Backend/src/models/__pycache__/service.cpython-312.pyc index f82914a7..4ccff8d4 100644 Binary files a/Backend/src/models/__pycache__/service.cpython-312.pyc and b/Backend/src/models/__pycache__/service.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/service_booking.cpython-312.pyc b/Backend/src/models/__pycache__/service_booking.cpython-312.pyc index 80c3f8a3..0a4d0b92 100644 Binary files a/Backend/src/models/__pycache__/service_booking.cpython-312.pyc and b/Backend/src/models/__pycache__/service_booking.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/service_usage.cpython-312.pyc b/Backend/src/models/__pycache__/service_usage.cpython-312.pyc index f6523ebc..4e2d2072 100644 Binary files a/Backend/src/models/__pycache__/service_usage.cpython-312.pyc and b/Backend/src/models/__pycache__/service_usage.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/system_settings.cpython-312.pyc b/Backend/src/models/__pycache__/system_settings.cpython-312.pyc index 7e1c5364..0e822e9c 100644 Binary files a/Backend/src/models/__pycache__/system_settings.cpython-312.pyc and b/Backend/src/models/__pycache__/system_settings.cpython-312.pyc differ diff --git a/Backend/src/models/__pycache__/user.cpython-312.pyc b/Backend/src/models/__pycache__/user.cpython-312.pyc index f7c5f6e1..bec9bef4 100644 Binary files a/Backend/src/models/__pycache__/user.cpython-312.pyc and b/Backend/src/models/__pycache__/user.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/routes/__pycache__/__init__.cpython-312.pyc index d64de917..ac0b76dc 100644 Binary files a/Backend/src/routes/__pycache__/__init__.cpython-312.pyc and b/Backend/src/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/about_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/about_routes.cpython-312.pyc index 100d5620..e520c5dd 100644 Binary files a/Backend/src/routes/__pycache__/about_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/about_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/admin_privacy_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/admin_privacy_routes.cpython-312.pyc index 1d0e0dc1..89b71652 100644 Binary files a/Backend/src/routes/__pycache__/admin_privacy_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/admin_privacy_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/audit_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/audit_routes.cpython-312.pyc index c3d24857..28a69f3e 100644 Binary files a/Backend/src/routes/__pycache__/audit_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/audit_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/auth_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/auth_routes.cpython-312.pyc index 6ab38810..c21a5078 100644 Binary files a/Backend/src/routes/__pycache__/auth_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/auth_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/banner_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/banner_routes.cpython-312.pyc index b8066e23..b245cb19 100644 Binary files a/Backend/src/routes/__pycache__/banner_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/banner_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/booking_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/booking_routes.cpython-312.pyc index 9090bfa9..3e9ed556 100644 Binary files a/Backend/src/routes/__pycache__/booking_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/booking_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/chat_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/chat_routes.cpython-312.pyc index 973c65d2..91bf1545 100644 Binary files a/Backend/src/routes/__pycache__/chat_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/chat_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/contact_content_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/contact_content_routes.cpython-312.pyc index 8b68b733..8fb48048 100644 Binary files a/Backend/src/routes/__pycache__/contact_content_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/contact_content_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/contact_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/contact_routes.cpython-312.pyc index 9287c3d0..4b0c20fd 100644 Binary files a/Backend/src/routes/__pycache__/contact_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/contact_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/favorite_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/favorite_routes.cpython-312.pyc index 7e3d5432..cd1a9e46 100644 Binary files a/Backend/src/routes/__pycache__/favorite_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/favorite_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/footer_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/footer_routes.cpython-312.pyc index 35267d80..4d36e4b4 100644 Binary files a/Backend/src/routes/__pycache__/footer_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/footer_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/home_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/home_routes.cpython-312.pyc index c1721f5b..e90707ce 100644 Binary files a/Backend/src/routes/__pycache__/home_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/home_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/invoice_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/invoice_routes.cpython-312.pyc index 42be7939..e81d0442 100644 Binary files a/Backend/src/routes/__pycache__/invoice_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/invoice_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/page_content_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/page_content_routes.cpython-312.pyc index 030cbc55..5135f46f 100644 Binary files a/Backend/src/routes/__pycache__/page_content_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/page_content_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/payment_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/payment_routes.cpython-312.pyc index 54074aa4..b14c41b8 100644 Binary files a/Backend/src/routes/__pycache__/payment_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/payment_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/privacy_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/privacy_routes.cpython-312.pyc index 2a06bc84..5a851c3c 100644 Binary files a/Backend/src/routes/__pycache__/privacy_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/privacy_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/promotion_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/promotion_routes.cpython-312.pyc index 7ba8ef25..36b3d2a2 100644 Binary files a/Backend/src/routes/__pycache__/promotion_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/promotion_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/report_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/report_routes.cpython-312.pyc index 77a874af..44609668 100644 Binary files a/Backend/src/routes/__pycache__/report_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/report_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/review_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/review_routes.cpython-312.pyc index e10d29a4..d59b28bf 100644 Binary files a/Backend/src/routes/__pycache__/review_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/review_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/room_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/room_routes.cpython-312.pyc index b9d6e939..9ff4a27c 100644 Binary files a/Backend/src/routes/__pycache__/room_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/room_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/service_booking_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/service_booking_routes.cpython-312.pyc index 4940abc2..4bd1096f 100644 Binary files a/Backend/src/routes/__pycache__/service_booking_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/service_booking_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/service_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/service_routes.cpython-312.pyc index 8ab0fdbb..9efd9383 100644 Binary files a/Backend/src/routes/__pycache__/service_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/service_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/system_settings_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/system_settings_routes.cpython-312.pyc index 219c8b74..1df28c71 100644 Binary files a/Backend/src/routes/__pycache__/system_settings_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/system_settings_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/__pycache__/user_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/user_routes.cpython-312.pyc index 83eb0152..6748acad 100644 Binary files a/Backend/src/routes/__pycache__/user_routes.cpython-312.pyc and b/Backend/src/routes/__pycache__/user_routes.cpython-312.pyc differ diff --git a/Backend/src/routes/service_booking_routes.py b/Backend/src/routes/service_booking_routes.py index 2d66de0b..5c9bfb33 100644 --- a/Backend/src/routes/service_booking_routes.py +++ b/Backend/src/routes/service_booking_routes.py @@ -295,7 +295,7 @@ async def create_service_stripe_payment_intent( intent = StripeService.create_payment_intent( amount=amount, currency=currency, - description=f"Service Booking + description=f"Service Booking #{booking.id}", db=db ) diff --git a/Backend/src/routes/system_settings_routes.py b/Backend/src/routes/system_settings_routes.py index b56b4513..18e22a7f 100644 --- a/Backend/src/routes/system_settings_routes.py +++ b/Backend/src/routes/system_settings_routes.py @@ -712,11 +712,77 @@ async def test_smtp_email( timestamp_str = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC") - test_html = f + test_html = f""" + + + + + + SMTP Test Email + + + + + + +
+ + + + + + + + + + +
+

SMTP Configuration Test

+
+

✅ Success!

+

+ Hello {admin_name}, +

+

+ This is a test email to verify that your SMTP configuration is working correctly. +

+
+

+ Test Details:
+ Sent by: {admin_name}
+ Timestamp: {timestamp_str}
+ Status: SMTP Configuration Active +

+
+

+ If you received this email, your SMTP settings are configured correctly and emails will be sent successfully. +

+
+

Hotel Booking System - SMTP Test

+
+
+ + + """ - test_text = f -.strip() + test_text = f""" +SMTP Configuration Test + +Hello {admin_name}, + +This is a test email to verify that your SMTP configuration is working correctly. + +Test Details: +- Sent by: {admin_name} +- Timestamp: {timestamp_str} +- Status: SMTP Configuration Active + +If you received this email, your SMTP settings are configured correctly and emails will be sent successfully. + +--- +Hotel Booking System - SMTP Test + """.strip() await send_email( diff --git a/Backend/src/schemas/__pycache__/admin_privacy.cpython-312.pyc b/Backend/src/schemas/__pycache__/admin_privacy.cpython-312.pyc index 2b5e98f9..0e07fa52 100644 Binary files a/Backend/src/schemas/__pycache__/admin_privacy.cpython-312.pyc and b/Backend/src/schemas/__pycache__/admin_privacy.cpython-312.pyc differ diff --git a/Backend/src/schemas/__pycache__/auth.cpython-312.pyc b/Backend/src/schemas/__pycache__/auth.cpython-312.pyc index 52afc7b8..463acd97 100644 Binary files a/Backend/src/schemas/__pycache__/auth.cpython-312.pyc and b/Backend/src/schemas/__pycache__/auth.cpython-312.pyc differ diff --git a/Backend/src/schemas/__pycache__/privacy.cpython-312.pyc b/Backend/src/schemas/__pycache__/privacy.cpython-312.pyc index df21ff7c..9723bac6 100644 Binary files a/Backend/src/schemas/__pycache__/privacy.cpython-312.pyc and b/Backend/src/schemas/__pycache__/privacy.cpython-312.pyc differ diff --git a/Backend/src/services/__pycache__/auth_service.cpython-312.pyc b/Backend/src/services/__pycache__/auth_service.cpython-312.pyc index 723a4c40..85c102ac 100644 Binary files a/Backend/src/services/__pycache__/auth_service.cpython-312.pyc and b/Backend/src/services/__pycache__/auth_service.cpython-312.pyc differ diff --git a/Backend/src/services/__pycache__/invoice_service.cpython-312.pyc b/Backend/src/services/__pycache__/invoice_service.cpython-312.pyc index f1042965..416ee25c 100644 Binary files a/Backend/src/services/__pycache__/invoice_service.cpython-312.pyc and b/Backend/src/services/__pycache__/invoice_service.cpython-312.pyc differ diff --git a/Backend/src/services/__pycache__/mfa_service.cpython-312.pyc b/Backend/src/services/__pycache__/mfa_service.cpython-312.pyc index d4e19515..75f5cbd6 100644 Binary files a/Backend/src/services/__pycache__/mfa_service.cpython-312.pyc and b/Backend/src/services/__pycache__/mfa_service.cpython-312.pyc differ diff --git a/Backend/src/services/__pycache__/paypal_service.cpython-312.pyc b/Backend/src/services/__pycache__/paypal_service.cpython-312.pyc index 9d2b7f13..93fb7555 100644 Binary files a/Backend/src/services/__pycache__/paypal_service.cpython-312.pyc and b/Backend/src/services/__pycache__/paypal_service.cpython-312.pyc differ diff --git a/Backend/src/services/__pycache__/privacy_admin_service.cpython-312.pyc b/Backend/src/services/__pycache__/privacy_admin_service.cpython-312.pyc index 75fd2ed3..930fa717 100644 Binary files a/Backend/src/services/__pycache__/privacy_admin_service.cpython-312.pyc and b/Backend/src/services/__pycache__/privacy_admin_service.cpython-312.pyc differ diff --git a/Backend/src/services/__pycache__/room_service.cpython-312.pyc b/Backend/src/services/__pycache__/room_service.cpython-312.pyc index 07186233..3494d70f 100644 Binary files a/Backend/src/services/__pycache__/room_service.cpython-312.pyc and b/Backend/src/services/__pycache__/room_service.cpython-312.pyc differ diff --git a/Backend/src/services/__pycache__/stripe_service.cpython-312.pyc b/Backend/src/services/__pycache__/stripe_service.cpython-312.pyc index f1cf0ccc..fe6de993 100644 Binary files a/Backend/src/services/__pycache__/stripe_service.cpython-312.pyc and b/Backend/src/services/__pycache__/stripe_service.cpython-312.pyc differ diff --git a/Backend/src/services/auth_service.py b/Backend/src/services/auth_service.py index 57cf5ab6..52dfd1d4 100644 --- a/Backend/src/services/auth_service.py +++ b/Backend/src/services/auth_service.py @@ -338,9 +338,7 @@ class AuthService: logger.info(f"Reset URL: {reset_url}") email_html = password_reset_email_template(reset_url) - - plain_text = f -.strip() + plain_text = f"Please click the following link to reset your password: {reset_url}\n\nIf you did not request this, please ignore this email." await send_email( to=user.email, diff --git a/Backend/src/utils/__pycache__/email_templates.cpython-312.pyc b/Backend/src/utils/__pycache__/email_templates.cpython-312.pyc index 3d6d3478..85460f0d 100644 Binary files a/Backend/src/utils/__pycache__/email_templates.cpython-312.pyc and b/Backend/src/utils/__pycache__/email_templates.cpython-312.pyc differ diff --git a/Backend/src/utils/__pycache__/mailer.cpython-312.pyc b/Backend/src/utils/__pycache__/mailer.cpython-312.pyc index 99b84e65..55f25d8f 100644 Binary files a/Backend/src/utils/__pycache__/mailer.cpython-312.pyc and b/Backend/src/utils/__pycache__/mailer.cpython-312.pyc differ diff --git a/Backend/src/utils/email_templates.py b/Backend/src/utils/email_templates.py index 18bda82f..26d44077 100644 --- a/Backend/src/utils/email_templates.py +++ b/Backend/src/utils/email_templates.py @@ -61,41 +61,136 @@ def get_base_template(content: str, title: str = "Hotel Booking", client_url: st else: full_logo_url = company_logo_url - logo_html = f + logo_html = f'{company_name}' else: - logo_html = f + logo_html = f'
{company_name}
' footer_contact = "" if company_phone or company_email or company_address: - footer_contact = + footer_contact = '
' if company_phone: - footer_contact += f + footer_contact += f'

Phone: {company_phone}

' if company_email: - footer_contact += f + footer_contact += f'

Email: {company_email}

' if company_address: - formatted_address = company_address.replace('\n', '
') - footer_contact += f - footer_contact += + footer_contact += f'

Address: {formatted_address}

' + footer_contact += '
' - return f + return f""" + + + + + + {title} + + + + + + +
+ + + + + + + + + + +
+ {logo_html} +

{company_tagline}

+
+ {content} +
+

© {datetime.now().year} {company_name}. All rights reserved.

+ {footer_contact} +
+
+ + + """ def welcome_email_template(name: str, email: str, client_url: str) -> str: company_settings = _get_company_settings() company_name = company_settings.get("company_name") or "Hotel Booking" - content = f + content = f""" +
+

Welcome to {company_name}!

+

+ Dear {name}, +

+

+ Thank you for registering with {company_name}. We're excited to have you as part of our community! +

+

+ You can now explore our luxurious rooms and make bookings. If you have any questions, feel free to contact us. +

+
+ + Explore Our Rooms + +
+
+ """ return get_base_template(content, f"Welcome to {company_name}", client_url) def password_reset_email_template(reset_url: str) -> str: - content = f + content = f""" +
+

Password Reset Request

+

+ You have requested to reset your password. Click the button below to create a new password. +

+

+ If you did not request this, please ignore this email and your password will remain unchanged. +

+
+ + Reset Password + +
+

+ If the button doesn't work, copy and paste this link into your browser:
+ {reset_url} +

+

+ This link will expire in 1 hour for security reasons. +

+
+ """ company_settings = _get_company_settings() company_name = company_settings.get("company_name") or "Hotel Booking" return get_base_template(content, f"Password Reset - {company_name}", reset_url.split('/reset-password')[0] if '/reset-password' in reset_url else "http://localhost:5173") def password_changed_email_template(email: str) -> str: - content = f + content = f""" +
+

Password Changed Successfully

+

+ Your password has been successfully changed. +

+
+

+ Security Notice: If you did not make this change, please contact us immediately to secure your account. +

+
+

+ For your security, we recommend: +

+ +
+ """ company_settings = _get_company_settings() company_name = company_settings.get("company_name") or "Hotel Booking" return get_base_template(content, f"Password Changed - {company_name}", "http://localhost:5173") @@ -121,21 +216,95 @@ def booking_confirmation_email_template( ) -> str: deposit_info = "" if requires_deposit and deposit_amount and amount_paid is None: - deposit_info = f + deposit_info = f""" +
+

+ Deposit Required: A deposit of {currency_symbol}{deposit_amount:.2f} is required to confirm your booking. +

+
+ """ payment_breakdown = "" if amount_paid is not None: remaining_due = total_price - amount_paid payment_type_label = "Deposit Payment" if payment_type == "deposit" else "Full Payment" - payment_breakdown = f + payment_breakdown = f""" +
+

Payment Summary

+
+ {payment_type_label}: + {currency_symbol}{amount_paid:.2f} +
+ """ if remaining_due > 0: - payment_breakdown += f + payment_breakdown += f""" +
+ Remaining Due: + {currency_symbol}{remaining_due:.2f} +
+ """ else: - payment_breakdown += f - payment_breakdown += + payment_breakdown += f""" +
+ Payment Complete +
+ """ + payment_breakdown += "
" - content = f + discount_info = "" + if original_price and discount_amount and discount_amount > 0: + discount_info = f""" +
+

+ Discount Applied: {currency_symbol}{discount_amount:.2f} off + {f'(Promo Code: {promotion_code})' if promotion_code else ''} +

+
+ """ + + content = f""" +
+
+
+

Booking Confirmed!

+
+ +
+

+ Dear {guest_name}, +

+ +

+ Your booking has been confirmed! We're excited to welcome you to our hotel. +

+ +
+

Booking Details

+

Booking Number: {booking_number}

+

Room: {room_type} (Room {room_number})

+

Check-in: {check_in}

+

Check-out: {check_out}

+

Guests: {num_guests}

+

Total Price: {currency_symbol}{total_price:.2f}

+
+ + {discount_info} + {deposit_info} + {payment_breakdown} + +

+ If you have any questions or need to make changes to your booking, please don't hesitate to contact us. +

+ +
+ + View Booking Details + +
+
+
+ """ company_settings = _get_company_settings() company_name = company_settings.get("company_name") or "Hotel Booking" return get_base_template(content, f"Booking Confirmation - {company_name}", client_url) @@ -153,22 +322,83 @@ def payment_confirmation_email_template( ) -> str: transaction_info = "" if transaction_id: - transaction_info = f + transaction_info = f""" +
+

+ Transaction ID: {transaction_id} +

+
+ """ payment_type_info = "" if payment_type: payment_type_label = "Deposit Payment (20%)" if payment_type == "deposit" else "Full Payment" - payment_type_info = f + payment_type_info = f""" +
+

+ Payment Type: {payment_type_label} +

+
+ """ total_price_info = "" remaining_due_info = "" if total_price is not None: - total_price_info = f + total_price_info = f""" +
+ Total Booking Amount: + {currency_symbol}{total_price:.2f} +
+ """ if payment_type == "deposit" and total_price > amount: remaining_due = total_price - amount - remaining_due_info = f + remaining_due_info = f""" +
+

+ Remaining Balance: {currency_symbol}{remaining_due:.2f} (due at check-in) +

+
+ """ - content = f + content = f""" +
+
+
💳
+

Payment Confirmed!

+
+ +
+

+ Dear {guest_name}, +

+ +

+ We have successfully received your payment. Thank you! +

+ +
+

Payment Details

+

Booking Number: {booking_number}

+

Amount Paid: {currency_symbol}{amount:.2f}

+

Payment Method: {payment_method.title()}

+ {transaction_info} + {payment_type_info} + {total_price_info} + {remaining_due_info} +
+ +

+ Your payment has been processed successfully. You will receive a separate booking confirmation email with all the details of your reservation. +

+ +
+ + View Booking Details + +
+
+
+ """ company_settings = _get_company_settings() company_name = company_settings.get("company_name") or "Hotel Booking" return get_base_template(content, f"Payment Confirmation - {company_name}", client_url) @@ -180,15 +410,49 @@ def booking_status_changed_email_template( client_url: str = "http://localhost:5173" ) -> str: status_colors = { - "confirmed": (" - "cancelled": (" - "checked_in": (" - "checked_out": (" + "confirmed": ("#10b981", "Confirmed", "✓", "#d1fae5", "#a7f3d0"), + "cancelled": ("#ef4444", "Cancelled", "✕", "#fee2e2", "#fecaca"), + "checked_in": ("#3b82f6", "Checked In", "→", "#dbeafe", "#bfdbfe"), + "checked_out": ("#8b5cf6", "Checked Out", "←", "#ede9fe", "#ddd6fe"), } - color, status_text, icon, bg_start, bg_end = status_colors.get(status.lower(), (" + color, status_text, icon, bg_start, bg_end = status_colors.get(status.lower(), ("#6b7280", "Updated", "•", "#f3f4f6", "#e5e7eb")) - content = f + content = f""" +
+
+
{icon}
+

Booking {status_text}

+
+ +
+

+ Dear {guest_name}, +

+ +

+ Your booking {booking_number} has been {status_text.lower()}. +

+ +
+

+ Booking Number: {booking_number}
+ Status: {status_text} +

+
+ +

+ If you have any questions or need assistance, please don't hesitate to contact us. +

+ +
+ + View Booking Details + +
+
+
+ """ company_settings = _get_company_settings() company_name = company_settings.get("company_name") or "Hotel Booking" return get_base_template(content, f"Booking {status_text} - {company_name}", client_url)