File size: 2,359 Bytes
9d9d2a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c6edf1b
9d9d2a1
 
 
 
 
 
 
 
 
 
 
 
c6edf1b
9d9d2a1
c6edf1b
9d9d2a1
 
 
 
 
 
 
c6edf1b
9d9d2a1
c6edf1b
9d9d2a1
77c1453
9d9d2a1
 
 
 
 
c6edf1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d9d2a1
 
 
 
 
c6edf1b
9d9d2a1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import os
import gradio as gr

from src.db.connection import resolve_db_path, get_conn
from src.db.schema import init_schema
from src.db.seed import seed_if_empty
from src.services.scheduler_service import auto_close_if_needed

from src.ui.login_ui import render_login
from src.ui.rooms_ui import render_rooms_tab
from src.ui.reservations_ui import render_reservations_tab
from src.ui.payments_ui import render_payments_tab
from src.ui.income_expense_ui import render_income_expense_tab
from src.ui.closing_ui import render_closing_tab
from src.ui.admin_ui import render_admin_tab


def bootstrap():
    db_path, persistent = resolve_db_path()

    conn = get_conn(db_path)
    try:
        init_schema(conn)
        seed_if_empty(conn)
    finally:
        conn.close()

    auto_close_if_needed(
        db_path=db_path,
        actor="system",
        note="Auto-close on startup",
    )

    return db_path, persistent


DB_PATH, IS_PERSISTENT = bootstrap()


with gr.Blocks(title="Venus Hotel Front Desk") as demo:
    gr.Markdown("# 🏨 Venus Hotel Front Desk")

    if not IS_PERSISTENT:
        gr.Markdown("⚠️ Persistent storage is NOT enabled.")

    auth_state = gr.State(None)
    selected_room_state = gr.State(None)

    header_user = gr.Markdown("🔒 Not logged in")

    def update_header(auth):
        if not auth:
            return "🔒 Not logged in"
        return f"👤 Logged in as **{auth['username']}** ({auth['role']})"

    render_login(DB_PATH, auth_state)

    auth_state.change(
        update_header,
        inputs=[auth_state],
        outputs=[header_user],
    )

    with gr.Tabs():
        with gr.Tab("Rooms"):
            render_rooms_tab(DB_PATH, auth_state, selected_room_state)

        with gr.Tab("Reservations"):
            render_reservations_tab(DB_PATH, auth_state)

        with gr.Tab("Payments"):
            render_payments_tab(DB_PATH, auth_state)

        with gr.Tab("Income & Expenses"):
            render_income_expense_tab(DB_PATH, auth_state)

        with gr.Tab("Daily Closing"):
            render_closing_tab(DB_PATH, auth_state)

        with gr.Tab("Admin"):
            render_admin_tab(DB_PATH, auth_state)


if __name__ == "__main__":
    demo.queue(default_concurrency_limit=16).launch(
        server_name="0.0.0.0",
        server_port=int(os.environ.get("PORT", 7860)),
    )