Hadeeratef91 commited on
Commit
a6be064
·
verified ·
1 Parent(s): b0f7ea3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -32
app.py CHANGED
@@ -3,14 +3,15 @@ import pandas as pd
3
  import os
4
  import sqlite3
5
  from datetime import datetime
6
- from passlib.hash import bcrypt # ← بديل bcrypt
7
 
8
  st.set_page_config(page_title="نظام إدارة الشكاوى", layout="centered")
9
 
10
- # الاتصال بقاعدة البيانات وإنشاء الجداول إذا لم تكن موجودة
11
  conn = sqlite3.connect("complaints_system (1).db", check_same_thread=False)
12
  c = conn.cursor()
13
 
 
14
  c.execute('''CREATE TABLE IF NOT EXISTS users (
15
  id INTEGER PRIMARY KEY AUTOINCREMENT,
16
  username TEXT UNIQUE,
@@ -25,18 +26,21 @@ c.execute('''CREATE TABLE IF NOT EXISTS complaints (
25
  complaint_text TEXT,
26
  status TEXT,
27
  response TEXT,
28
- timestamp TEXT
 
29
  )''')
30
 
31
  conn.commit()
32
 
33
- # تهيئة session state
34
  if "is_logged_in" not in st.session_state:
35
  st.session_state.is_logged_in = False
36
  if "user_type" not in st.session_state:
37
  st.session_state.user_type = None
38
  if "username" not in st.session_state:
39
  st.session_state.username = ""
 
 
40
 
41
  # تسجيل الدخول
42
  if not st.session_state.is_logged_in:
@@ -48,12 +52,10 @@ if not st.session_state.is_logged_in:
48
  c.execute("SELECT * FROM users WHERE username=?", (username,))
49
  user = c.fetchone()
50
  if user:
51
- stored_hashed_password = user[2]
52
- role = user[3]
53
- if bcrypt.verify(password, stored_hashed_password): # ✅ التحقق بكلمة السر
54
  st.session_state.is_logged_in = True
55
  st.session_state.username = username
56
- st.session_state.user_type = "sender" if role == "sender" else "receiver"
57
  st.rerun()
58
  else:
59
  st.error("❌ كلمة المرور غير صحيحة.")
@@ -63,7 +65,7 @@ if not st.session_state.is_logged_in:
63
  # مقدم الشكوى
64
  elif st.session_state.user_type == "sender":
65
  st.title("📨 إرسال شكوى جديدة")
66
- complaint_text = st.text_area("📝 وصف الشكوى")
67
 
68
  if st.button("📤 إرسال الشكوى"):
69
  c.execute("SELECT * FROM complaints WHERE username=?", (st.session_state.username,))
@@ -72,59 +74,80 @@ elif st.session_state.user_type == "sender":
72
  next_id = len(user_complaints) + 1
73
  complaint_id = f"{prefix}_{next_id:07}"
74
 
75
-
76
  c.execute("SELECT * FROM complaints WHERE complaint_id=?", (complaint_id,))
77
  if c.fetchone():
78
  st.warning("⚠️ تم إرسال هذه الشكوى مسبقًا بناءً على المعرف!")
79
- elif complaint_text.strip() == "":
80
  st.warning("⚠️ الرجاء إدخال نص الشكوى.")
81
  else:
82
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
83
- c.execute("INSERT INTO complaints (complaint_id, username, complaint_text, status, response, timestamp) VALUES (?, ?, ?, ?, ?, ?)",
84
- (complaint_id, st.session_state.username, complaint_text.strip(), "Pending", "", timestamp))
85
  conn.commit()
86
  st.success("✅ تم تقديم الشكوى بنجاح")
 
87
  st.rerun()
88
 
89
  st.subheader("📋 الشكاوى السابقة")
90
  c.execute("SELECT * FROM complaints WHERE username=? ORDER BY id DESC", (st.session_state.username,))
91
  complaints = c.fetchall()
 
92
  for row in complaints:
93
- comp_id, username, text, status, response, timestamp = row[1], row[2], row[3], row[4], row[5], row[6]
94
- with st.expander(f"📨 {comp_id} | {status}"):
95
- if status.lower() == "pending" and (not response or response.strip() == ""):
 
 
 
96
  new_text = st.text_area("📝 تعديل الشكوى", value=text, key=f"edit_{comp_id}")
97
  if st.button("💾 حفظ التعديل", key=f"save_{comp_id}"):
98
  c.execute("UPDATE complaints SET complaint_text=? WHERE complaint_id=?", (new_text.strip(), comp_id))
99
  conn.commit()
100
- st.success("✅ تم تعديل الشكوى بنجاح")
101
  st.rerun()
102
  else:
103
- st.info(f"📢 تم تحديث حالة الشكوى إلى: {status}")
104
- if response and response.strip():
105
  st.success(f"💬 الرد: {response}")
106
-
107
- # مستقبل الشكوى
 
 
 
 
 
 
 
 
 
108
  elif st.session_state.user_type == "receiver":
109
  st.title("📬 إدارة الشكاوى")
110
- c.execute("SELECT * FROM complaints")
 
 
 
 
 
 
 
111
  complaints = c.fetchall()
112
 
113
  if not complaints:
114
- st.info("لا توجد شكاوى حالياً للتعامل معها.")
115
  else:
116
  st.subheader("📋 جميع الشكاوى")
117
  options = {f"{row[1]} - {row[2]}": row for row in complaints}
118
  selected = st.selectbox("اختر شكوى للتعامل معها", list(options.keys()))
119
  selected_row = options[selected]
120
 
121
- st.write(f"### ✉️ شكوى: {selected_row[1]}")
122
  st.subheader(f"📨 معرف الشكوى: {selected_row[1]}")
123
- st.write(f"**مقدم الشكوى:** {selected_row[2]}")
124
- st.write(f"**الوصف:** {selected_row[3]}")
 
 
 
125
 
126
  new_status = st.selectbox("🔄 تحديث الحالة", ["Pending", "In Progress", "Resolved"], index=["Pending", "In Progress", "Resolved"].index(selected_row[4]))
127
- new_response = st.text_area("📝 الرد على الشكوى", value=selected_row[5] or "")
128
 
129
  if st.button("💾 حفظ التعديلات"):
130
  c.execute("UPDATE complaints SET status=?, response=? WHERE complaint_id=?", (new_status, new_response.strip(), selected_row[1]))
@@ -132,7 +155,7 @@ elif st.session_state.user_type == "receiver":
132
  st.success("✅ تم حفظ التعديلات")
133
  st.rerun()
134
 
135
- # زر تسجيل الخروج يظهر دائمًا لأي مستخدم مسجل
136
  if st.session_state.get("is_logged_in"):
137
  st.markdown("---")
138
  if st.button("🚪 تسجيل الخروج"):
@@ -141,9 +164,9 @@ if st.session_state.get("is_logged_in"):
141
  st.session_state.username = ""
142
  st.rerun()
143
 
144
- # 📥 زر لتحميل قاعدة البيانات (لـ admin أو أي مستخدم)
145
- if os.path.exists("complaints_system.db"):
146
- with open("complaints_system.db", "rb") as db_file:
147
  st.download_button(
148
  label="📥 تحميل complaints_system.db",
149
  data=db_file,
@@ -151,4 +174,4 @@ if os.path.exists("complaints_system.db"):
151
  mime="application/octet-stream"
152
  )
153
  else:
154
- st.warning("⚠️ ملف قاعدة البيانات غير موجود في هذا المسار.")
 
3
  import os
4
  import sqlite3
5
  from datetime import datetime
6
+ from passlib.hash import bcrypt
7
 
8
  st.set_page_config(page_title="نظام إدارة الشكاوى", layout="centered")
9
 
10
+ # الاتصال بقاعدة البيانات
11
  conn = sqlite3.connect("complaints_system (1).db", check_same_thread=False)
12
  c = conn.cursor()
13
 
14
+ # إنشاء الجداول
15
  c.execute('''CREATE TABLE IF NOT EXISTS users (
16
  id INTEGER PRIMARY KEY AUTOINCREMENT,
17
  username TEXT UNIQUE,
 
26
  complaint_text TEXT,
27
  status TEXT,
28
  response TEXT,
29
+ timestamp TEXT,
30
+ user_comment TEXT
31
  )''')
32
 
33
  conn.commit()
34
 
35
+ # تهيئة الجلسة
36
  if "is_logged_in" not in st.session_state:
37
  st.session_state.is_logged_in = False
38
  if "user_type" not in st.session_state:
39
  st.session_state.user_type = None
40
  if "username" not in st.session_state:
41
  st.session_state.username = ""
42
+ if "complaint_input" not in st.session_state:
43
+ st.session_state.complaint_input = ""
44
 
45
  # تسجيل الدخول
46
  if not st.session_state.is_logged_in:
 
52
  c.execute("SELECT * FROM users WHERE username=?", (username,))
53
  user = c.fetchone()
54
  if user:
55
+ if bcrypt.verify(password, user[2]):
 
 
56
  st.session_state.is_logged_in = True
57
  st.session_state.username = username
58
+ st.session_state.user_type = "sender" if user[3] == "sender" else "receiver"
59
  st.rerun()
60
  else:
61
  st.error("❌ كلمة المرور غير صحيحة.")
 
65
  # مقدم الشكوى
66
  elif st.session_state.user_type == "sender":
67
  st.title("📨 إرسال شكوى جديدة")
68
+ st.session_state.complaint_input = st.text_area("📝 وصف الشكوى", value=st.session_state.complaint_input, key="complaint_input")
69
 
70
  if st.button("📤 إرسال الشكوى"):
71
  c.execute("SELECT * FROM complaints WHERE username=?", (st.session_state.username,))
 
74
  next_id = len(user_complaints) + 1
75
  complaint_id = f"{prefix}_{next_id:07}"
76
 
 
77
  c.execute("SELECT * FROM complaints WHERE complaint_id=?", (complaint_id,))
78
  if c.fetchone():
79
  st.warning("⚠️ تم إرسال هذه الشكوى مسبقًا بناءً على المعرف!")
80
+ elif st.session_state.complaint_input.strip() == "":
81
  st.warning("⚠️ الرجاء إدخال نص الشكوى.")
82
  else:
83
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
84
+ c.execute("INSERT INTO complaints (complaint_id, username, complaint_text, status, response, timestamp, user_comment) VALUES (?, ?, ?, ?, ?, ?, ?)",
85
+ (complaint_id, st.session_state.username, st.session_state.complaint_input.strip(), "Pending", "", timestamp, ""))
86
  conn.commit()
87
  st.success("✅ تم تقديم الشكوى بنجاح")
88
+ st.session_state.complaint_input = "" # مسح الصندوق
89
  st.rerun()
90
 
91
  st.subheader("📋 الشكاوى السابقة")
92
  c.execute("SELECT * FROM complaints WHERE username=? ORDER BY id DESC", (st.session_state.username,))
93
  complaints = c.fetchall()
94
+
95
  for row in complaints:
96
+ comp_id, username, text, status, response, timestamp, user_comment = row[1:]
97
+ with st.expander(f"📨 {comp_id} | الحالة: {status}"):
98
+ st.write(f"📅 تم الإرسال في: {timestamp}")
99
+ st.write(f"📄 الشكوى: {text}")
100
+
101
+ if status.lower() == "pending":
102
  new_text = st.text_area("📝 تعديل الشكوى", value=text, key=f"edit_{comp_id}")
103
  if st.button("💾 حفظ التعديل", key=f"save_{comp_id}"):
104
  c.execute("UPDATE complaints SET complaint_text=? WHERE complaint_id=?", (new_text.strip(), comp_id))
105
  conn.commit()
106
+ st.success("✅ تم تعديل الشكوى")
107
  st.rerun()
108
  else:
109
+ if response:
 
110
  st.success(f"💬 الرد: {response}")
111
+ if not user_comment:
112
+ comment = st.text_area("✏️ تعليقك على الرد", key=f"comment_{comp_id}")
113
+ if st.button("📩 إرسال التعليق", key=f"send_comment_{comp_id}"):
114
+ c.execute("UPDATE complaints SET user_comment=? WHERE complaint_id=?", (comment.strip(), comp_id))
115
+ conn.commit()
116
+ st.success("✅ تم إرسال التعليق بنجاح")
117
+ st.rerun()
118
+ else:
119
+ st.info(f"🗣️ تعليقك السابق: {user_comment}")
120
+
121
+ # مستقبل الشكوى (الـ admin أو الموظف)
122
  elif st.session_state.user_type == "receiver":
123
  st.title("📬 إدارة الشكاوى")
124
+
125
+ # تنبيه بوجود شكاوى جديدة
126
+ c.execute("SELECT COUNT(*) FROM complaints WHERE status = 'Pending'")
127
+ pending_count = c.fetchone()[0]
128
+ if pending_count > 0:
129
+ st.warning(f"🚨 يوجد {pending_count} شكوى جديدة لم يتم التعامل معها!")
130
+
131
+ c.execute("SELECT * FROM complaints ORDER BY id DESC")
132
  complaints = c.fetchall()
133
 
134
  if not complaints:
135
+ st.info("لا توجد شكاوى حالياً.")
136
  else:
137
  st.subheader("📋 جميع الشكاوى")
138
  options = {f"{row[1]} - {row[2]}": row for row in complaints}
139
  selected = st.selectbox("اختر شكوى للتعامل معها", list(options.keys()))
140
  selected_row = options[selected]
141
 
 
142
  st.subheader(f"📨 معرف الشكوى: {selected_row[1]}")
143
+ st.write(f"👤 مقدم الشكوى: {selected_row[2]}")
144
+ st.write(f"📝 الشكوى: {selected_row[3]}")
145
+ st.write(f"📅 الوقت: {selected_row[6]}")
146
+ if selected_row[7]:
147
+ st.info(f"🗣️ تعليق المستخدم على الرد: {selected_row[7]}")
148
 
149
  new_status = st.selectbox("🔄 تحديث الحالة", ["Pending", "In Progress", "Resolved"], index=["Pending", "In Progress", "Resolved"].index(selected_row[4]))
150
+ new_response = st.text_area("💬 الرد على الشكوى", value=selected_row[5] or "")
151
 
152
  if st.button("💾 حفظ التعديلات"):
153
  c.execute("UPDATE complaints SET status=?, response=? WHERE complaint_id=?", (new_status, new_response.strip(), selected_row[1]))
 
155
  st.success("✅ تم حفظ التعديلات")
156
  st.rerun()
157
 
158
+ # زر تسجيل الخروج دائم
159
  if st.session_state.get("is_logged_in"):
160
  st.markdown("---")
161
  if st.button("🚪 تسجيل الخروج"):
 
164
  st.session_state.username = ""
165
  st.rerun()
166
 
167
+ # زر لتحميل قاعدة البيانات
168
+ if os.path.exists("complaints_system (1).db"):
169
+ with open("complaints_system (1).db", "rb") as db_file:
170
  st.download_button(
171
  label="📥 تحميل complaints_system.db",
172
  data=db_file,
 
174
  mime="application/octet-stream"
175
  )
176
  else:
177
+ st.warning("⚠️ ملف قاعدة البيانات غير موجود.")