├── .DS_Store
├── .gitignore
├── .idea
├── Library-System-Python-PyQt5.iml
├── misc.xml
├── modules.xml
├── vcs.xml
└── workspace.xml
├── CLients_report.xlsx
├── DB_Structure.py
├── Orm_test.py
├── README.md
├── __pycache__
├── icons_rc.cpython-36.pyc
└── icons_rc.cpython-38.pyc
├── books_report.xlsx
├── icons.qrc
├── icons
├── .DS_Store
├── Apps-Library-icon.png
├── books.png
├── dashboard.png
├── history.png
├── person.png
├── reports.png
├── settings.png
└── today.png
├── icons_rc.py
├── index.py
├── main.ui
├── outlint.txt
├── people.db
└── test.py
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/.DS_Store
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .autogit
--------------------------------------------------------------------------------
/.idea/Library-System-Python-PyQt5.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
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 |
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 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 | 1586134409708
127 |
128 |
129 | 1586134409708
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
--------------------------------------------------------------------------------
/CLients_report.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/CLients_report.xlsx
--------------------------------------------------------------------------------
/DB_Structure.py:
--------------------------------------------------------------------------------
1 | from peewee import *
2 | import datetime
3 |
4 | db = MySQLDatabase('lb', user='root', password='toor',
5 | host='localhost', port=3306)
6 |
7 |
8 |
9 |
10 | class Publisher(Model):
11 | name = CharField(unique=True)
12 | Location = CharField(null=True)
13 |
14 | class Meta:
15 | database = db
16 |
17 |
18 | class Author(Model):
19 | name = CharField(unique=True)
20 | Location = CharField(null=True)
21 |
22 | class Meta:
23 | database = db
24 |
25 |
26 |
27 | class Category(Model):
28 | category_name = CharField(unique=True)
29 | parent_category = IntegerField(null=True) ## Recursive relationship
30 |
31 | class Meta:
32 | database = db
33 |
34 |
35 | class Branch(Model):
36 | name = CharField()
37 | code = CharField(null=True , unique=True)
38 | location = CharField(null=True)
39 |
40 | class Meta:
41 | database = db
42 |
43 |
44 |
45 |
46 | BOOK_STATUS = (
47 | (1,'New'),
48 | (2,'Used'),
49 | (3,'Damaged')
50 | )
51 |
52 |
53 | class Books(Model):
54 | title = CharField(unique=True)
55 | description = TextField(null=True)
56 | category = ForeignKeyField(Category , backref='category' , null=True)
57 | code = CharField(null=True)
58 | barcode = CharField()
59 | # parts *
60 | part_order = IntegerField(null=True)
61 | price = DecimalField(null=True)
62 | publisher = ForeignKeyField(Publisher , backref='publisher' , null=True)
63 | author = ForeignKeyField(Author , backref='author' , null=True)
64 | image = CharField(null=True)
65 | status = CharField(choices=BOOK_STATUS) # Choices
66 | date = DateTimeField(default=datetime.datetime.now)
67 |
68 | class Meta:
69 | database = db
70 |
71 |
72 |
73 | class Clients(Model):
74 | name = CharField()
75 | mail = CharField(null=True , unique=True)
76 | phone = CharField(null=True)
77 | date = DateTimeField(default=datetime.datetime.now)
78 | national_id = IntegerField(null=True , unique=True)
79 |
80 | class Meta:
81 | database = db
82 |
83 |
84 |
85 | class Employee(Model):
86 | name = CharField()
87 | mail = CharField(null=True , unique=True)
88 | phone = CharField(null=True)
89 | date = DateTimeField(default=datetime.datetime.now)
90 | national_id = IntegerField(null=True , unique=True)
91 | Periority = IntegerField(null=True)
92 |
93 | class Meta:
94 | database = db
95 |
96 |
97 |
98 | PROCESS_TYPE = (
99 | (1,'Rent'),
100 | (2,'Retrieve')
101 | )
102 |
103 | class Daily_Movements(Model):
104 | book = ForeignKeyField(Books , backref='daily_book')
105 | client = ForeignKeyField(Clients , backref='book_client')
106 | type = CharField(choices=PROCESS_TYPE) #[rent - retrieve]
107 | date = DateTimeField(default=datetime.datetime.now)
108 | branch = ForeignKeyField(Branch , backref='Daily_branch' , null=True)
109 | Book_from = DateField(null=True)
110 | Book_to = DateField(null=True)
111 | employee = ForeignKeyField(Employee , backref='Daily_employee' , null=True)
112 |
113 | class Meta:
114 | database = db
115 |
116 |
117 | ACTIONS_TYPE = (
118 | (1,'Login'),
119 | (2,'Update'),
120 | (3,'Create'),
121 | (4,'Delete'),
122 | )
123 |
124 |
125 |
126 | TABLE_CHOICES = (
127 | (1,'Books'),
128 | (2,'Clients'),
129 | (3,'Employee'),
130 | (4,'Category'),
131 | (5,'Branch'),
132 | (6,'Daily Movements'),
133 | (7,'Publisher'),
134 | (8,'Author'),
135 | )
136 |
137 |
138 | class History(Model):
139 | employee = ForeignKeyField(Employee , backref='History_employee')
140 | action = CharField(choices=ACTIONS_TYPE) # Choices
141 | table = CharField(choices=TABLE_CHOICES) # Choices
142 | date = DateTimeField(default=datetime.datetime.now)
143 | branch = ForeignKeyField(Branch , backref='history_branch')
144 |
145 | class Meta:
146 | database = db
147 |
148 |
149 |
150 |
151 |
152 |
153 | db.connect()
154 | db.create_tables([ Author ,Category ,Branch ,Publisher ,Books , Clients , Employee , Daily_Movements , History ])
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
--------------------------------------------------------------------------------
/Orm_test.py:
--------------------------------------------------------------------------------
1 | from peewee import *
2 |
3 | # db = SqliteDatabase('people.db')
4 | # Connect to a MySQL database on network.
5 | db = MySQLDatabase('myapp', user='root', password='toor',
6 | host='localhost', port=3306)
7 |
8 |
9 | class Person(Model):
10 | name = CharField()
11 | birthday = DateField()
12 |
13 | class Meta:
14 | database = db # This model uses the "people.db" database.
15 |
16 |
17 | class Pet(Model):
18 | owner = ForeignKeyField(Person, backref='pets')
19 | name = CharField()
20 | animal_type = CharField()
21 |
22 | class Meta:
23 | database = db # this model uses the "people.db" database
24 |
25 |
26 | db.connect()
27 | db.create_tables([Pet , Person])
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PyQt5-Library-Management-System
2 |
--------------------------------------------------------------------------------
/__pycache__/icons_rc.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/__pycache__/icons_rc.cpython-36.pyc
--------------------------------------------------------------------------------
/__pycache__/icons_rc.cpython-38.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/__pycache__/icons_rc.cpython-38.pyc
--------------------------------------------------------------------------------
/books_report.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/books_report.xlsx
--------------------------------------------------------------------------------
/icons.qrc:
--------------------------------------------------------------------------------
1 |
2 |
3 | icons/reports.png
4 | icons/books.png
5 | icons/history.png
6 | icons/person.png
7 | icons/settings.png
8 | icons/dashboard.png
9 | icons/today.png
10 |
11 |
--------------------------------------------------------------------------------
/icons/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/.DS_Store
--------------------------------------------------------------------------------
/icons/Apps-Library-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/Apps-Library-icon.png
--------------------------------------------------------------------------------
/icons/books.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/books.png
--------------------------------------------------------------------------------
/icons/dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/dashboard.png
--------------------------------------------------------------------------------
/icons/history.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/history.png
--------------------------------------------------------------------------------
/icons/person.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/person.png
--------------------------------------------------------------------------------
/icons/reports.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/reports.png
--------------------------------------------------------------------------------
/icons/settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/settings.png
--------------------------------------------------------------------------------
/icons/today.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/icons/today.png
--------------------------------------------------------------------------------
/index.py:
--------------------------------------------------------------------------------
1 | from PyQt5.QtGui import *
2 | from PyQt5.QtWidgets import *
3 | from PyQt5.QtCore import *
4 | from PyQt5.uic import loadUiType
5 | import sys
6 | import mysql.connector
7 | import datetime
8 | from xlsxwriter import *
9 | from xlrd import *
10 | import pyqtgraph as pg
11 |
12 | MainUI,_ = loadUiType('main.ui')
13 |
14 |
15 | employee_id = 0
16 | employee_branch = 1
17 |
18 |
19 | class Main(QMainWindow , MainUI):
20 | def __init__(self , parent=None):
21 | super(Main, self).__init__(parent)
22 | QMainWindow.__init__(self)
23 | self.setupUi(self)
24 | self.UI_Changes()
25 | self.Db_Connect()
26 | self.Handel_Buttons()
27 |
28 | self.get_dashboard_data()
29 |
30 | # self.Open_Daily_movements_Tab()
31 | self.Show_All_Categories()
32 | self.Show_Branchies()
33 | self.Show_Publishers()
34 | self.Show_Authors()
35 |
36 | ##
37 | self.Show_All_Books()
38 | self.Show_All_CLients()
39 | self.Show_Employee()
40 | self.Retreive_Day_Work()
41 | self.Show_History()
42 |
43 |
44 | def UI_Changes(self):
45 | ## UI Changes in Login
46 | self.tabWidget.tabBar().setVisible(False)
47 |
48 |
49 | def Db_Connect(self):
50 | ## coneection between app and DB
51 | self.db = mysql.connector.connect(host='localhost' ,user='root', password='toor', db='lb')
52 | self.cur = self.db.cursor()
53 | print('Connection Accepted')
54 |
55 |
56 | def Handel_Buttons(self):
57 | ## Handel All Buttons In Our App
58 | self.pushButton.clicked.connect(self.Open_Daily_movements_Tab)
59 | self.pushButton_2.clicked.connect(self.Open_Books_Tap)
60 | self.pushButton_3.clicked.connect(self.Open_CLients_Tap)
61 | self.pushButton_4.clicked.connect(self.Open_Dashboard_Tap)
62 | self.pushButton_7.clicked.connect(self.Open_History_Tap)
63 | self.pushButton_6.clicked.connect(self.Open_Report_Tap)
64 | self.pushButton_5.clicked.connect(self.Open_Settings_Tab)
65 |
66 |
67 | self.pushButton_8.clicked.connect(self.Handel_to_Day_Work)
68 | self.pushButton_19.clicked.connect(self.Add_Branch)
69 | self.pushButton_20.clicked.connect(self.Add_Publisher)
70 | self.pushButton_21.clicked.connect(self.Add_Author)
71 | self.pushButton_22.clicked.connect(self.Add_Category)
72 |
73 | self.pushButton_27.clicked.connect(self.Add_Employee)
74 | self.pushButton_10.clicked.connect(self.Add_New_Book)
75 | self.pushButton_15.clicked.connect(self.Add_New_Client)
76 |
77 | self.pushButton_12.clicked.connect(self.Edit_Book_search)
78 | self.pushButton_11.clicked.connect(self.Edit_Book)
79 | self.pushButton_13.clicked.connect(self.Delete_Book)
80 | self.pushButton_9.clicked.connect(self.All_Books_Filter)
81 | self.pushButton_35.clicked.connect(self.Book_Export_Report)
82 |
83 | self.pushButton_17.clicked.connect(self.Edit_CLient_Search)
84 | self.pushButton_16.clicked.connect(self.Edit_CLient)
85 | self.pushButton_18.clicked.connect(self.Delete_Client)
86 | self.pushButton_37.clicked.connect(self.Client_Export_Report)
87 |
88 |
89 | self.pushButton_29.clicked.connect(self.Check_Employee)
90 | self.pushButton_28.clicked.connect(self.Edit_Employee_Data)
91 | self.pushButton_30.clicked.connect(self.Add_Employee_Permissions)
92 |
93 | self.pushButton_38.clicked.connect(self.User_Login_Permissions)
94 |
95 | self.pushButton_47.clicked.connect(self.get_dashboard_data)
96 |
97 | def Handel_Login(self):
98 | ## Handel Login
99 | pass
100 |
101 |
102 | def Handel_Reset_Passwors(self):
103 | # Handel Reset Password
104 | pass
105 |
106 |
107 | def Handel_to_Day_Work(self):
108 | ## Handel Day to day operations
109 | book_title = self.lineEdit.text()
110 | client_nationl_id = self.lineEdit_51.text()
111 | type = self.comboBox.currentIndex()
112 | from_date = str(datetime.date.today())
113 | # to_date = self.dateEdit_6.date()
114 | to_date = str(datetime.date.today())
115 | date = datetime.datetime.now()
116 | branch = 1
117 | employee = 1
118 |
119 |
120 |
121 | self.cur.execute('''
122 | INSERT INTO daily_movements(book_id , client_id , type,date,branch_id,book_from , book_to , employee_id)
123 | VALUES(%s , %s , %s , %s , %s , %s , %s , %s)
124 | ''',(book_title,client_nationl_id,type,date,branch,from_date,to_date,employee))
125 |
126 | global employee_id, employee_branch
127 | date = datetime.datetime.now()
128 | action = 3
129 | table = 6
130 | data = 'day to day work'
131 |
132 | self.cur.execute('''
133 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
134 | VALUES (%s , %s , %s , %s , %s , %s)
135 | ''', (employee_id, action, table, date, employee_branch,data))
136 |
137 |
138 | self.db.commit()
139 | self.Show_History()
140 | self.Retreive_Day_Work()
141 |
142 |
143 | def Retreive_Day_Work(self):
144 |
145 | self.cur.execute('''
146 | SELECT book_id ,type , client_id , book_from , book_to FROM daily_movements
147 | ''')
148 | data = self.cur.fetchall()
149 |
150 | self.tableWidget.setRowCount(0)
151 | self.tableWidget.insertRow(0)
152 |
153 | for row , form in enumerate(data):
154 | for column , item in enumerate(form):
155 | if column == 1 :
156 | if item == 0 :
157 | self.tableWidget.setItem(row, column, QTableWidgetItem(str("Rent")))
158 | else:
159 | self.tableWidget.setItem(row , column , QTableWidgetItem(str("Retrieve")))
160 |
161 | elif column == 2 :
162 | sql = ''' SELECT name FROM clients WHERE national_id = %s '''
163 | self.cur.execute(sql , [(item)])
164 | client_name = self.cur.fetchone()
165 | # self.tableWidget.setItem(row, column, QTableWidgetItem(str(client_name[0])))
166 |
167 | else:
168 | self.tableWidget.setItem(row, column, QTableWidgetItem(str(item)))
169 | column += 1
170 |
171 | row_position = self.tableWidget.rowCount()
172 | self.tableWidget.insertRow(row_position)
173 |
174 | ##########################################
175 | def Show_All_Books(self):
176 | ## show all books
177 | self.tableWidget_2.setRowCount(0)
178 | self.tableWidget_2.insertRow(0)
179 |
180 | self.cur.execute('''
181 | SELECT code , title , category_id , author_id , price FROM books
182 | ''')
183 |
184 | data = self.cur.fetchall()
185 |
186 | for row , form in enumerate(data):
187 | for col , item in enumerate(form):
188 | if col == 2 :
189 | sql = (''' SELECT category_name FROM category WHERE id = %s ''')
190 | self.cur.execute(sql , [(item)])
191 | category_name = self.cur.fetchone()
192 | self.tableWidget_2.setItem(row,col , QTableWidgetItem(str(category_name[0])))
193 |
194 | elif col == 3:
195 | sql = (''' SELECT name FROM author WHERE id = %s ''')
196 | self.cur.execute(sql , [(item+1)])
197 | author_name = self.cur.fetchone()
198 | self.tableWidget_2.setItem(row,col , QTableWidgetItem(str(author_name[0])))
199 | else:
200 | self.tableWidget_2.setItem(row, col, QTableWidgetItem(str(item)))
201 | col += 1
202 |
203 | row_position = self.tableWidget_2.rowCount()
204 | self.tableWidget_2.insertRow(row_position)
205 |
206 |
207 |
208 | def All_Books_Filter(self):
209 | book_title = self.lineEdit_2.text()
210 | category = self.comboBox_2.currentIndex()
211 |
212 | sql = '''
213 | SELECT code , title , category_id , author_id , publisher_id FROM books WHERE title = %s
214 | '''
215 | self.cur.execute(sql ,[(book_title)])
216 | data = self.cur.fetchall()
217 |
218 |
219 | self.tableWidget_2.setRowCount(0)
220 | self.tableWidget_2.insertRow(0)
221 | for row , form in enumerate(data):
222 | for col , item in enumerate(form):
223 | if col == 2 :
224 | sql = (''' SELECT category_name FROM category WHERE id = %s ''')
225 | self.cur.execute(sql , [(item)])
226 |
227 | category_name = self.cur.fetchone()
228 |
229 |
230 | self.tableWidget_2.setItem(row,col , QTableWidgetItem(str(item)))
231 | else:
232 | self.tableWidget_2.setItem(row, col, QTableWidgetItem(str(item)))
233 | col += 1
234 |
235 | row_position = self.tableWidget_2.rowCount()
236 | self.tableWidget_2.insertRow(row_position)
237 |
238 |
239 |
240 |
241 | def Add_New_Book(self):
242 | ## add new book
243 | book_title = self.lineEdit_3.text()
244 | category = self.comboBox_3.currentIndex()
245 | description = self.textEdit.toPlainText()
246 | price = self.lineEdit_4.text()
247 | code = self.lineEdit_5.text()
248 | publisher = self.comboBox_4.currentIndex()
249 | author = self.comboBox_5.currentIndex()
250 | status = self.comboBox_5.currentIndex()
251 | part_order = self.lineEdit_6.text()
252 | barcode = self.lineEdit_50.text()
253 | date = datetime.datetime.now()
254 |
255 |
256 | self.cur.execute('''
257 | INSERT INTO books(title,description,category_id,code,barcode,part_order,price,author_id ,publisher_id,status,date)
258 | VALUES (%s , %s , %s , %s,%s , %s , %s , %s , %s , %s , %s)
259 | ''',(book_title,description,category,code,barcode,part_order,price,author ,publisher,status , date))
260 |
261 |
262 | global employee_id , employee_branch
263 | action = 3
264 | table = 0
265 |
266 | self.cur.execute('''
267 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch , data)
268 | VALUES (%s , %s , %s , %s , %s , %s)
269 | ''',(employee_id,action,table,date,employee_branch,book_title))
270 |
271 |
272 |
273 | self.db.commit()
274 | self.Show_All_Books()
275 | self.Show_History()
276 |
277 |
278 | def Edit_Book_search(self):
279 | ## edit book
280 | book_code = self.lineEdit_8.text()
281 |
282 | sql = ('''
283 | SELECT * FROM books WHERE code = %s
284 | ''')
285 |
286 | self.cur.execute(sql , [(book_code)])
287 |
288 | data = self.cur.fetchone()
289 |
290 |
291 | self.lineEdit_10.setText(data[1])
292 | self.comboBox_10.setCurrentIndex(int(data[10]))
293 | self.lineEdit_7.setText(str(data[6]))
294 | self.comboBox_8.setCurrentIndex(int(data[11]))
295 | self.comboBox_9.setCurrentIndex(int(data[12]))
296 | self.comboBox_7.setCurrentIndex(int(data[8]))
297 | self.lineEdit_9.setText(str(data[5]))
298 | self.textEdit_2.setPlainText(data[2])
299 |
300 |
301 | def Edit_Book(self):
302 | book_title = self.lineEdit_10.text()
303 | category = self.comboBox_10.currentIndex()
304 | description = self.textEdit_2.toPlainText()
305 | price = self.lineEdit_7.text()
306 | code = self.lineEdit_8.text()
307 | publisher = self.comboBox_8.currentIndex()
308 | author = self.comboBox_9.currentIndex()
309 | status = self.comboBox_7.currentIndex()
310 | part_order = self.lineEdit_9.text()
311 | date = datetime.datetime.now()
312 |
313 | self.cur.execute('''
314 | UPDATE books SET title=%s ,description=%s ,code = %s ,part_order = %s , price = %s , status = %s , category_id=%s,publisher_id=%s,author_id=%s WHERE code = %s
315 | ''',(book_title,description,code,part_order,price,status,category,publisher,author,code))
316 |
317 |
318 | global employee_id , employee_branch
319 | action = 4
320 | table = 0
321 |
322 |
323 | self.cur.execute('''
324 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
325 | VALUES (%s , %s , %s , %s , %s , %s)
326 | ''',(employee_id,action,table,date,employee_branch,book_title))
327 |
328 |
329 |
330 |
331 | self.db.commit()
332 | self.Show_History()
333 | self.statusBar().showMessage('تم تعديل معلومات الكتاب بنجاح')
334 | # QMessageBox.information(self , "success" , "تم تعديل معلومات الكتاب بنجاح")
335 |
336 | self.Show_All_Books()
337 |
338 |
339 | def Delete_Book(self):
340 | ## delete book from DB
341 | book_code = self.lineEdit_8.text()
342 | date = datetime.datetime.now()
343 |
344 | delete_message = QMessageBox.warning(self ,"مسح معلومات" , "هل انت متاكد من مسح الكتاب",QMessageBox.Yes | QMessageBox.No )
345 |
346 | if delete_message == QMessageBox.Yes :
347 |
348 | sql = ('''
349 | DELETE FROM books WHERE code = %s
350 | ''' )
351 |
352 | global employee_id, employee_branch
353 | action = 5
354 | table = 1
355 |
356 | self.cur.execute('''
357 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch , data)
358 | VALUES (%s , %s , %s , %s , %s , %s)
359 | ''', (employee_id, action, table, date, employee_branch , book_code))
360 |
361 |
362 | self.cur.execute(sql , [(book_code)])
363 | self.db.commit()
364 | self.Show_History()
365 | self.statusBar().showMessage('تم مسح الكتاب بنجاح')
366 | self.Show_All_Books()
367 |
368 |
369 | ###########################################
370 | def Show_All_CLients(self):
371 | ## show all clients
372 | self.tableWidget_3.setRowCount(0)
373 | self.tableWidget_3.insertRow(0)
374 |
375 | self.cur.execute('''
376 | SELECT name , mail , phone , national_id , date FROM clients
377 | ''')
378 |
379 | data = self.cur.fetchall()
380 |
381 | ## row = iteration , form = data
382 | for row , form in enumerate(data):
383 | for col , item in enumerate(form):
384 | self.tableWidget_3.setItem(row,col , QTableWidgetItem(str(item)))
385 | col += 1
386 |
387 | row_position = self.tableWidget_3.rowCount()
388 | self.tableWidget_3.insertRow(row_position)
389 |
390 |
391 |
392 |
393 | def Add_New_Client(self):
394 | ## add new Client
395 | client_name = self.lineEdit_12.text()
396 | client_email = self.lineEdit_13.text()
397 | client_phone = self.lineEdit_14.text()
398 | client_national_id = self.lineEdit_15.text()
399 | date = datetime.datetime.now()
400 |
401 | self.cur.execute('''
402 | INSERT INTO clients(name,mail,phone,national_id,date)
403 | VALUES (%s , %s , %s ,%s , %s)
404 | ''' , (client_name , client_email , client_phone , client_national_id , date))
405 |
406 | global employee_id, employee_branch
407 | date = datetime.datetime.now()
408 | action = 3
409 | table = 2
410 |
411 | self.cur.execute('''
412 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data )
413 | VALUES (%s , %s , %s , %s , %s , %s)
414 | ''', (employee_id, action, table, date, employee_branch , client_name))
415 |
416 | self.db.commit()
417 | self.Show_All_CLients()
418 | self.Show_History()
419 | self.statusBar().showMessage('تم اضافه العميل بنجاح')
420 |
421 |
422 |
423 |
424 | def Edit_CLient_Search(self):
425 | ## edit client
426 | client_data = self.lineEdit_20.text()
427 |
428 | if self.comboBox_11.currentIndex() == 0 :
429 | sql = ('''SELECT * FROM clients WHERE name = %s''')
430 | self.cur.execute(sql , [(client_data)])
431 | data = self.cur.fetchone()
432 |
433 |
434 | if self.comboBox_11.currentIndex() == 1 :
435 | sql = ('''SELECT * FROM clients WHERE mail = %s''')
436 | self.cur.execute(sql , [(client_data)])
437 | data = self.cur.fetchone()
438 |
439 |
440 |
441 | if self.comboBox_11.currentIndex() == 2 :
442 | sql = ('''SELECT * FROM clients WHERE phone = %s''')
443 | self.cur.execute(sql , [(client_data)])
444 | data = self.cur.fetchone()
445 |
446 |
447 |
448 | if self.comboBox_11.currentIndex() == 3 :
449 | sql = ('''SELECT * FROM clients WHERE national_id = %s''')
450 | self.cur.execute(sql , [(client_data)])
451 | data = self.cur.fetchone()
452 |
453 |
454 |
455 | self.lineEdit_18.setText(data[1])
456 | self.lineEdit_17.setText(data[2])
457 | self.lineEdit_16.setText(data[3])
458 | self.lineEdit_19.setText(str(data[5]))
459 |
460 |
461 |
462 | def Edit_CLient(self):
463 | ## edit client
464 | client_name = self.lineEdit_18.text()
465 | client_mail = self.lineEdit_17.text()
466 | client_phone = self.lineEdit_16.text()
467 | client_national_id = self.lineEdit_19.text()
468 |
469 |
470 | self.cur.execute('''
471 | UPDATE clients SET name = %s , mail = %s , phone = %s , national_id = %s
472 | ''' , (client_name,client_mail,client_phone,client_national_id))
473 |
474 |
475 | global employee_id, employee_branch
476 | date = datetime.datetime.now()
477 | action = 4
478 | table = 2
479 |
480 | self.cur.execute('''
481 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch , data )
482 | VALUES (%s , %s , %s , %s , %s , %s)
483 | ''', (employee_id, action, table, date, employee_branch , client_name))
484 |
485 |
486 | self.db.commit()
487 | self.Show_History()
488 | self.statusBar().showMessage('تم تعديل معلومات العميل بنجاح')
489 | self.Show_All_CLients()
490 |
491 |
492 | def Delete_Client(self):
493 | ## delete client from DB
494 | client_data = self.lineEdit_20.text()
495 | delete_message = QMessageBox.warning(self ,"مسح معلومات" , "هل انت متاكد من مسح العميل",QMessageBox.Yes | QMessageBox.No )
496 |
497 | if delete_message == QMessageBox.Yes :
498 |
499 | if self.comboBox_11.currentIndex() == 0 :
500 | sql = ('''DELETE FROM clients WHERE name = %s''')
501 | self.cur.execute(sql , [(client_data)])
502 |
503 |
504 | if self.comboBox_11.currentIndex() == 1 :
505 | sql = ('''DELETE FROM clients WHERE mail = %s''')
506 | self.cur.execute(sql , [(client_data)])
507 |
508 |
509 | if self.comboBox_11.currentIndex() == 2 :
510 | sql = ('''DELETE FROM clients WHERE phone = %s''')
511 | self.cur.execute(sql , [(client_data)])
512 |
513 |
514 | if self.comboBox_11.currentIndex() == 3 :
515 | sql = ('''DELETE FROM clients WHERE national_id = %s''')
516 | self.cur.execute(sql , [(client_data)])
517 |
518 |
519 | global employee_id, employee_branch
520 | action = 5
521 | table = 2
522 | date = datetime.datetime.now()
523 |
524 | self.cur.execute('''
525 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
526 | VALUES (%s , %s , %s , %s , %s , %s)
527 | ''', (employee_id, action, table, date, employee_branch,client_data))
528 |
529 |
530 | self.db.commit()
531 | self.Show_History()
532 | self.statusBar().showMessage('تم مسح العميل بنجاح')
533 | self.Show_All_CLients()
534 |
535 |
536 | ###########################################
537 | ## history
538 |
539 | def Show_History(self):
540 | ## show all history to the admin
541 | self.tableWidget_4.setRowCount(0)
542 | self.tableWidget_4.insertRow(0)
543 |
544 | self.cur.execute('''
545 | SELECT employee_id , employee_branch , employee_action , affected_table , operation_date , data FROM history
546 | ''')
547 |
548 | data = self.cur.fetchall()
549 |
550 | ## row = iteration , form = data
551 | for row , form in enumerate(data):
552 | for col , item in enumerate(form):
553 |
554 | if col == 0 :
555 | sql = (''' SELECT name FROM employee WHERE id = %s ''')
556 | self.cur.execute(sql , [(item)])
557 | employee_name = self.cur.fetchone()
558 | self.tableWidget_4.setItem(row,col , QTableWidgetItem(str(employee_name[0])))
559 |
560 | elif col == 1 :
561 | sql = (''' SELECT name FROM branch WHERE id = %s ''')
562 | self.cur.execute(sql , [(item)])
563 | branch_name = self.cur.fetchone()
564 |
565 | self.tableWidget_4.setItem(row,col , QTableWidgetItem(str(branch_name)))
566 |
567 |
568 |
569 | elif col == 2 :
570 | action = ' '
571 | if item == 1 :
572 | action = 'Login'
573 |
574 | if item == 2 :
575 | action = 'Logout'
576 |
577 | if item == 3 :
578 | action = 'Add'
579 |
580 | if item == 4 :
581 | action = 'Edit'
582 |
583 | if item == 5 :
584 | action = 'Delet'
585 |
586 | if item == 6 :
587 | action = 'Search'
588 |
589 | self.tableWidget_4.setItem(row,col , QTableWidgetItem(str(action)))
590 |
591 |
592 |
593 | elif col == 3 :
594 | table = ' '
595 | if item == 1 :
596 | table = 'Books'
597 |
598 | if item == 2 :
599 | table = 'Clients'
600 |
601 | if item == 3 :
602 | table = 'History'
603 |
604 | if item == 4 :
605 | table = 'Branch'
606 |
607 | if item == 5 :
608 | table = 'Category'
609 |
610 | if item == 6 :
611 | table = 'Daily Movements'
612 |
613 |
614 | if item == 7 :
615 | table = 'Employee'
616 |
617 | if item == 8 :
618 | table = 'Publisher'
619 |
620 | if item == 8 :
621 | table = 'Author'
622 |
623 | self.tableWidget_4.setItem(row,col , QTableWidgetItem(str(table)))
624 | else:
625 | self.tableWidget_4.setItem(row,col , QTableWidgetItem(str(item)))
626 |
627 |
628 |
629 | col += 1
630 |
631 | row_position = self.tableWidget_4.rowCount()
632 | self.tableWidget_4.insertRow(row_position)
633 |
634 | ###########################################
635 | ### books report
636 |
637 | def All_Books_Report(self):
638 | ## report for all books
639 | pass
640 |
641 | def Books_Filter_Report(self):
642 | ## Show report for filtered books
643 | pass
644 |
645 |
646 | def Book_Export_Report(self):
647 | ## export books data to excel file
648 | self.cur.execute('''
649 | SELECT code , title , category_id , author_id , price FROM books
650 | ''')
651 |
652 | data = self.cur.fetchall()
653 | excel_file = Workbook('books_report.xlsx')
654 | sheet1 = excel_file.add_worksheet()
655 |
656 | sheet1.write(0,0,'Book Code')
657 | sheet1.write(0,1,'Book Title')
658 | sheet1.write(0,2,'Category')
659 | sheet1.write(0,3,'Author')
660 | sheet1.write(0,4,'Price')
661 |
662 |
663 | row_number = 1
664 | for row in data :
665 | column_number = 0
666 | for item in row :
667 | sheet1.write(row_number,column_number,str(item))
668 | column_number += 1
669 | row_number += 1
670 |
671 | excel_file.close()
672 | self.statusBar().showMessage('تم انشاء التقرير بنجاح')
673 |
674 | ###########################################
675 | ###########################################
676 | def All_Client_Report(self):
677 | ## report for all clients
678 | pass
679 |
680 | def Clients_Filter_Report(self):
681 | ## Show report for filtered clients
682 | pass
683 |
684 |
685 | def Client_Export_Report(self):
686 | ## export client data to excel file
687 | self.cur.execute('''
688 | SELECT name , mail , phone , national_id FROM clients
689 | ''')
690 |
691 | data = self.cur.fetchall()
692 | excel_file = Workbook('CLients_report.xlsx')
693 | sheet1 = excel_file.add_worksheet()
694 |
695 | sheet1.write(0, 0, 'CLient Name')
696 | sheet1.write(0, 1, 'CLient mail')
697 | sheet1.write(0, 2, 'CLient Phone')
698 | sheet1.write(0, 3, 'CLient National Id')
699 |
700 | row_number = 1
701 | for row in data:
702 | column_number = 0
703 | for item in row:
704 | sheet1.write(row_number, column_number, str(item))
705 | column_number += 1
706 | row_number += 1
707 |
708 | excel_file.close()
709 | self.statusBar().showMessage('تم انشاء التقرير بنجاح')
710 |
711 | ###########################################
712 | ###########################################
713 | def Monthly_Report(self):
714 | ## show one month report
715 | pass
716 |
717 |
718 | def Monthly_Report_Export(self):
719 | ## export monthly report to excel file
720 | pass
721 |
722 | ###########################################
723 | ###########################################
724 | ##### settings
725 |
726 | def Add_Branch(self):
727 | ## add new branch
728 | branch_name = self.lineEdit_21.text()
729 | branch_code = self.lineEdit_22.text()
730 | branch_location = self.lineEdit_23.text()
731 |
732 | self.cur.execute('''
733 | INSERT INTO branch(name , code , location)
734 | VALUES (%s , %s , %s)
735 | ''', (branch_name , branch_code,branch_location))
736 |
737 |
738 | global employee_id, employee_branch
739 | date = datetime.datetime.now()
740 | action = 3
741 | table = 4
742 |
743 | self.cur.execute('''
744 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch , data)
745 | VALUES (%s , %s , %s , %s , %s , %s)
746 | ''', (employee_id, action, table, date, employee_branch,branch_name))
747 |
748 | self.db.commit()
749 | self.Show_History()
750 |
751 |
752 |
753 |
754 |
755 | def Add_Category(self):
756 | ## add new category
757 | category_name = self.lineEdit_28.text()
758 | parent_category_Text = self.comboBox_13.currentText()
759 |
760 |
761 | self.cur.execute('''
762 | INSERT INTO category(category_name , parent_category)
763 | VALUES (%s , %s)
764 | ''' , (category_name,parent_category_Text))
765 |
766 |
767 |
768 | global employee_id, employee_branch
769 | date = datetime.datetime.now()
770 | action = 3
771 | table = 5
772 |
773 | self.cur.execute('''
774 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
775 | VALUES (%s , %s , %s , %s , %s , %s)
776 | ''', (employee_id, action, table, date, employee_branch,category_name))
777 |
778 | self.db.commit()
779 | self.Show_History()
780 |
781 | self.Show_All_Categories()
782 |
783 |
784 | def Add_Publisher(self):
785 | ## add new publisher
786 | publisher_name = self.lineEdit_24.text()
787 | publisher_location = self.lineEdit_25.text()
788 |
789 | self.cur.execute('''
790 | INSERT INTO publisher(name , location)
791 | VALUES (%s , %s)
792 | ''' , (publisher_name , publisher_location))
793 |
794 | global employee_id, employee_branch
795 | date = datetime.datetime.now()
796 | action = 3
797 | table = 8
798 |
799 | self.cur.execute('''
800 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
801 | VALUES (%s , %s , %s , %s , %s , %s)
802 | ''', (employee_id, action, table, date, employee_branch , publisher_name))
803 |
804 |
805 | self.db.commit()
806 |
807 |
808 |
809 |
810 |
811 | def Add_Author(self):
812 | ## add new author
813 | author_name = self.lineEdit_27.text()
814 | author_location = self.lineEdit_26.text()
815 |
816 | self.cur.execute('''
817 | INSERT INTO author(name , location)
818 | VALUES (%s , %s)
819 | ''' , (author_name , author_location))
820 |
821 | global employee_id, employee_branch
822 | date = datetime.datetime.now()
823 | action = 3
824 | table = 9
825 |
826 | self.cur.execute('''
827 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
828 | VALUES (%s , %s , %s , %s , %s , %s)
829 | ''', (employee_id, action, table, date, employee_branch,author_name))
830 |
831 | self.db.commit()
832 | self.Show_History()
833 |
834 |
835 |
836 |
837 | ###########################################################
838 | ############################################################
839 |
840 | def Show_All_Categories(self):
841 | self.comboBox_13.clear()
842 | self.cur.execute('''
843 | SELECT category_name FROM category
844 | ''')
845 |
846 | categories = self.cur.fetchall()
847 |
848 | for category in categories :
849 | self.comboBox_13.addItem(str(category[0]))
850 | self.comboBox_3.addItem(str(category[0]))
851 | self.comboBox_10.addItem(str(category[0]))
852 | self.comboBox_2.addItem(str(category[0]))
853 |
854 |
855 |
856 | def Show_Branchies(self):
857 |
858 | self.cur.execute('''
859 | SELECT name FROM branch
860 | ''')
861 |
862 | branchies = self.cur.fetchall()
863 |
864 | for branch in branchies:
865 | self.comboBox_21.addItem(branch[0])
866 | self.comboBox_22.addItem(branch[0])
867 |
868 |
869 | def Show_Publishers(self):
870 | self.cur.execute('''
871 | SELECT name FROM publisher
872 | ''')
873 |
874 | publishers = self.cur.fetchall()
875 | for publisher in publishers:
876 |
877 | self.comboBox_4.addItem(publisher[0])
878 | self.comboBox_8.addItem(publisher[0])
879 |
880 |
881 | def Show_Authors(self):
882 | self.cur.execute('''
883 | SELECT name FROM author
884 | ''')
885 |
886 | authors = self.cur.fetchall()
887 | for author in authors :
888 | self.comboBox_5.addItem(author[0])
889 | self.comboBox_9.addItem(author[0])
890 |
891 |
892 |
893 | def Show_Employee(self):
894 | self.cur.execute('''
895 | SELECT name FROM employee
896 | ''')
897 | employees = self.cur.fetchall()
898 | for employee in employees :
899 | self.comboBox_19.addItem(employee[0])
900 | self.comboBox_23.addItem(employee[0])
901 |
902 | ###########################################
903 | ###########################################
904 |
905 | def Add_Employee(self):
906 | ## add new employee
907 | employee_name = self.lineEdit_33.text()
908 | employee_email = self.lineEdit_34.text()
909 | employee_phone = self.lineEdit_35.text()
910 | employee_branch_ = self.comboBox_21.currentIndex()
911 | national_id = self.lineEdit_32.text()
912 | periority = self.lineEdit_44.text()
913 | password = self.lineEdit_36.text()
914 | password2 = self.lineEdit_37.text()
915 | global employee_id, employee_branch
916 | action = 3
917 | table = 7
918 | date = datetime.datetime.now()
919 |
920 | if password == password2 :
921 |
922 | self.cur.execute('''
923 | INSERT INTO employee (name , mail , phone , branch , national_id ,date, periority , password)
924 | VALUES (%s , %s , %s , %s , %s , %s , %s , %s)
925 | ''' , (employee_name,employee_email,employee_phone,employee_branch_,national_id,date,periority , password))
926 |
927 |
928 |
929 | self.cur.execute('''
930 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
931 | VALUES (%s , %s , %s , %s , %s , %s)
932 | ''', (employee_id, action, table, date, employee_branch,employee_email))
933 |
934 | self.db.commit()
935 | self.Show_History()
936 |
937 | self.lineEdit_33.setText('')
938 | self.lineEdit_34.setText('')
939 | self.lineEdit_35.setText('')
940 | self.lineEdit_32.setText('')
941 | self.lineEdit_44.setText('')
942 | self.lineEdit_36.setText('')
943 | self.lineEdit_37.setText('')
944 | self.statusBar().showMessage('تم اضافه الموظف بنجاح')
945 |
946 |
947 | else:
948 | print('wrong password')
949 |
950 |
951 | def Check_Employee(self):
952 | employee_name = self.lineEdit_39.text()
953 | employee_password = self.lineEdit_43.text()
954 |
955 | self.cur.execute(""" SELECT * FROM employee""")
956 | data = self.cur.fetchall()
957 |
958 |
959 | for row in data :
960 | if row[1] == employee_name and row[7] == employee_password :
961 |
962 |
963 | self.groupBox_9.setEnabled(True)
964 | self.lineEdit_40.setText(row[2])
965 | self.lineEdit_41.setText(row[3])
966 | self.comboBox_22.setCurrentIndex(row[8])
967 | self.lineEdit_38.setText(str(row[5]))
968 | self.lineEdit_45.setText(str(row[6]))
969 | self.lineEdit_42.setText(str(row[7]))
970 |
971 |
972 |
973 | def Edit_Employee_Data(self):
974 | ## edit employee data
975 | employee_name = self.lineEdit_39.text()
976 | employee_password = self.lineEdit_43.text()
977 | employee_email = self.lineEdit_40.text()
978 | employee_phone = self.lineEdit_41.text()
979 | employee_branch_ = self.comboBox_22.currentIndex()
980 | employee_national_id = self.lineEdit_38.text()
981 | employee_periority = self.lineEdit_45.text()
982 | employee_password2 = self.lineEdit_42.text()
983 |
984 | date = datetime.datetime.now()
985 |
986 | if employee_password == employee_password2 :
987 | self.cur.execute('''
988 | UPDATE employee SET mail=%s,phone=%s,national_id=%s,Periority=%s,password=%s,branch=%s WHERE name=%s
989 | ''',(employee_email,employee_phone,employee_national_id,employee_periority,employee_password2,employee_branch_,employee_name))
990 |
991 |
992 |
993 | global employee_id, employee_branch
994 | date = datetime.datetime.now()
995 | action = 4
996 | table = 7
997 |
998 | self.cur.execute('''
999 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch,data)
1000 | VALUES (%s , %s , %s , %s , %s , %s)
1001 | ''', (employee_id, action, table, date, employee_branch,employee_email))
1002 |
1003 |
1004 | self.db.commit()
1005 | self.Show_History()
1006 | self.lineEdit_39.setText('')
1007 | self.lineEdit_43.setText('')
1008 | self.lineEdit_40.setText('')
1009 | self.lineEdit_41.setText('')
1010 | self.lineEdit_38.setText('')
1011 | self.lineEdit_38.setText('')
1012 | self.lineEdit_45.setText('')
1013 | self.lineEdit_42.setText('')
1014 | self.comboBox_22.setCurrentIndex(0)
1015 | self.groupBox_9.setEnabled(False)
1016 | self.statusBar().showMessage('تم تعديل معلومات الموظف بنجاح')
1017 |
1018 |
1019 | ###########################################
1020 | ###########################################
1021 |
1022 | def Add_Employee_Permissions(self):
1023 | ## add permission to any employee
1024 |
1025 | employee_name = self.comboBox_19.currentText()
1026 |
1027 |
1028 | if self.checkBox_23.isChecked() == True :
1029 |
1030 | self.cur.execute('''
1031 | INSERT INTO employee_permissions (employee_name,books_tab,clients_tab,dashboard_tab,history_tab,reports_tab,settings_tab ,
1032 | add_book,edit_book,delete_book,import_book,export_book ,
1033 | add_client,edit_client,delete_client,import_client,export_client ,
1034 | add_branch,add_publisher,add_author,add_category,add_employee,edit_employee , is_admin)
1035 |
1036 | VALUES(%s , %s , %s , %s , %s , %s , %s , %s , %s , %s , %s , %s, %s , %s , %s , %s , %s, %s , %s , %s , %s , %s , %s , %s)
1037 | ''', (employee_name, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1,1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1 , 1))
1038 |
1039 | self.db.commit()
1040 | self.statusBar().showMessage('تم اضافه كل الصلاحيات للموظف بنجاح')
1041 |
1042 |
1043 | else:
1044 |
1045 |
1046 | books_tab = 0
1047 | clients_tab = 0
1048 | dashboard_tab = 0
1049 | history_tab = 0
1050 | reports_tab = 0
1051 | settings_tab = 0
1052 |
1053 | add_book = 0
1054 | edit_book = 0
1055 | delete_book = 0
1056 | import_book = 0
1057 | export_book = 0
1058 |
1059 | add_client = 0
1060 | edit_client = 0
1061 | delete_client = 0
1062 | import_client = 0
1063 | export_client = 0
1064 |
1065 |
1066 | add_branch = 0
1067 | add_publisher = 0
1068 | add_author= 0
1069 | add_category = 0
1070 | add_employee = 0
1071 | edit_employee = 0
1072 |
1073 |
1074 | ### tabs
1075 | if self.checkBox_7.isChecked() == True :
1076 | books_tab = 1
1077 |
1078 | if self.checkBox_9.isChecked() == True :
1079 | clients_tab = 1
1080 |
1081 | if self.checkBox_11.isChecked() == True :
1082 | dashboard_tab = 1
1083 |
1084 | if self.checkBox_12.isChecked() == True :
1085 | history_tab = 1
1086 |
1087 | if self.checkBox_13.isChecked() == True :
1088 | reports_tab = 1
1089 |
1090 | if self.checkBox_14.isChecked() == True :
1091 | settings_tab = 1
1092 |
1093 |
1094 | ### books
1095 | if self.checkBox.isChecked() == True :
1096 | add_book = 1
1097 |
1098 | if self.checkBox_2.isChecked() == True :
1099 | edit_book = 1
1100 |
1101 | if self.checkBox_4.isChecked() == True :
1102 | delete_book = 1
1103 |
1104 | if self.checkBox_8.isChecked() == True :
1105 | import_book = 1
1106 |
1107 | if self.checkBox_10.isChecked() == True :
1108 | export_book = 1
1109 |
1110 |
1111 | ### clients
1112 | if self.checkBox_3.isChecked() == True :
1113 | add_client = 1
1114 |
1115 | if self.checkBox_6.isChecked() == True :
1116 | edit_client = 1
1117 |
1118 | if self.checkBox_5.isChecked() == True :
1119 | delete_client = 1
1120 |
1121 | if self.checkBox_15.isChecked() == True :
1122 | import_client = 1
1123 |
1124 | if self.checkBox_16.isChecked() == True :
1125 | export_client = 1
1126 |
1127 |
1128 |
1129 | ### settings
1130 | if self.checkBox_17.isChecked() == True :
1131 | add_branch = 1
1132 |
1133 | if self.checkBox_18.isChecked() == True :
1134 | add_publisher = 1
1135 |
1136 | if self.checkBox_19.isChecked() == True :
1137 | add_author = 1
1138 |
1139 | if self.checkBox_20.isChecked() == True :
1140 | add_category = 1
1141 |
1142 | if self.checkBox_21.isChecked() == True :
1143 | add_employee = 1
1144 |
1145 | if self.checkBox_22.isChecked() == True :
1146 | edit_employee = 1
1147 |
1148 |
1149 |
1150 |
1151 | self.cur.execute('''
1152 | INSERT INTO employee_permissions (employee_name,books_tab,clients_tab,dashboard_tab,history_tab,reports_tab,settings_tab ,
1153 | add_book,edit_book,delete_book,import_book,export_book ,
1154 | add_client,edit_client,delete_client,import_client,export_client ,
1155 | add_branch,add_publisher,add_author,add_category,add_employee,edit_employee)
1156 |
1157 | VALUES(%s , %s , %s , %s , %s , %s , %s , %s , %s , %s , %s , %s, %s , %s , %s , %s , %s, %s , %s , %s , %s , %s , %s)
1158 | ''' , ( employee_name, books_tab ,clients_tab , dashboard_tab , history_tab ,reports_tab , settings_tab
1159 | , add_book , edit_book , delete_book , import_book , export_book ,
1160 | add_client , edit_client , delete_client , import_client , export_client ,
1161 | add_branch , add_publisher , add_author , add_category , add_employee , edit_employee))
1162 |
1163 | self.db.commit()
1164 | self.statusBar().showMessage('تم اضافه الصلاحيات للموظف بنجاح')
1165 |
1166 |
1167 |
1168 |
1169 | def Admin_Report(self):
1170 | ## send report to the admin
1171 | pass
1172 |
1173 |
1174 |
1175 | #########################################
1176 | #########################################
1177 |
1178 | def Open_Login_Tab(self):
1179 | self.tabWidget.setCurrentIndex(0)
1180 |
1181 |
1182 | def Open_Reset_Password_Tab(self):
1183 | self.tabWidget.setCurrentIndex(1)
1184 |
1185 |
1186 | def Open_Daily_movements_Tab(self):
1187 | self.tabWidget.setCurrentIndex(2)
1188 |
1189 |
1190 | def Open_Books_Tap(self):
1191 | self.tabWidget.setCurrentIndex(3)
1192 | self.tabWidget_2.setCurrentIndex(0)
1193 |
1194 |
1195 | def Open_CLients_Tap(self):
1196 | self.tabWidget.setCurrentIndex(4)
1197 | self.tabWidget_3.setCurrentIndex(0)
1198 |
1199 |
1200 | def Open_Dashboard_Tap(self):
1201 | self.get_dashboard_data()
1202 | self.tabWidget.setCurrentIndex(5)
1203 |
1204 |
1205 | def Open_History_Tap(self):
1206 | self.tabWidget.setCurrentIndex(6)
1207 |
1208 |
1209 |
1210 | def Open_Report_Tap(self):
1211 | self.tabWidget.setCurrentIndex(7)
1212 | self.tabWidget_5.setCurrentIndex(0)
1213 |
1214 |
1215 | def Open_Settings_Tab(self):
1216 | self.tabWidget.setCurrentIndex(8)
1217 |
1218 |
1219 |
1220 |
1221 |
1222 | ############################################
1223 | ####### User Login
1224 |
1225 | def User_Login_Permissions(self):
1226 | username = self.lineEdit_47.text()
1227 | password = self.lineEdit_48.text()
1228 |
1229 |
1230 | self.cur.execute(""" SELECT id , name , password , branch FROM employee""")
1231 | data_ = self.cur.fetchall()
1232 |
1233 | for row in data_ :
1234 | if row[1] == username and row[2] == password :
1235 | global employee_id , employee_branch
1236 | employee_id = row[0]
1237 | employee_branch = row[3]
1238 |
1239 |
1240 | ## load user permissions
1241 | self.groupBox_14.setEnabled(True)
1242 | self.cur.execute('''
1243 | SELECT * FROM employee_permissions WHERE employee_name = %s
1244 | ''',(username,))
1245 |
1246 | user_permissions = self.cur.fetchone()
1247 |
1248 | self.pushButton.setEnabled(True)
1249 |
1250 | if user_permissions[2] == 1 :
1251 | self.pushButton_2.setEnabled(True)
1252 |
1253 | if user_permissions[3] == 1 :
1254 | self.pushButton_3.setEnabled(True)
1255 |
1256 | if user_permissions[4] == 1 :
1257 | self.pushButton_4.setEnabled(True)
1258 |
1259 | if user_permissions[4] == 1 :
1260 | self.pushButton_7.setEnabled(True)
1261 |
1262 | if user_permissions[5] == 1 :
1263 | self.pushButton_7.setEnabled(True)
1264 |
1265 | if user_permissions[6] == 1 :
1266 | self.pushButton_6.setEnabled(True)
1267 |
1268 | if user_permissions[7] == 1 :
1269 | self.pushButton_5.setEnabled(True)
1270 |
1271 | if user_permissions[8] == 1 :
1272 | self.pushButton_10.setEnabled(True)
1273 |
1274 | if user_permissions[9] == 1 :
1275 | self.pushButton_11.setEnabled(True)
1276 |
1277 | if user_permissions[10] == 1 :
1278 | self.pushButton_13.setEnabled(True)
1279 |
1280 | if user_permissions[11] == 1:
1281 | self.pushButton_34.setEnabled(True)
1282 |
1283 | if user_permissions[12] == 1:
1284 | self.pushButton_35.setEnabled(True)
1285 |
1286 | if user_permissions[13] == 1:
1287 | self.pushButton_15.setEnabled(True)
1288 |
1289 | if user_permissions[14] == 1 :
1290 | self.pushButton_16.setEnabled(True)
1291 |
1292 | if user_permissions[15] == 1 :
1293 | self.pushButton_18.setEnabled(True)
1294 |
1295 | if user_permissions[16] == 1 :
1296 | self.pushButton_36.setEnabled(True)
1297 |
1298 | if user_permissions[17] == 1 :
1299 | self.pushButton_37.setEnabled(True)
1300 |
1301 | if user_permissions[18] == 1:
1302 | self.pushButton_34.setEnabled(True)
1303 |
1304 | if user_permissions[19] == 1:
1305 | self.pushButton_19.setEnabled(True)
1306 |
1307 | if user_permissions[20] == 1:
1308 | self.pushButton_20.setEnabled(True)
1309 |
1310 | if user_permissions[21] == 1:
1311 | self.pushButton_21.setEnabled(True)
1312 |
1313 |
1314 | if user_permissions[22] == 1:
1315 | self.pushButton_22.setEnabled(True)
1316 |
1317 | if user_permissions[23] == 1:
1318 | self.pushButton_27.setEnabled(True)
1319 |
1320 | if user_permissions[24] == 1:
1321 | self.pushButton_28.setEnabled(True)
1322 |
1323 |
1324 | date = datetime.datetime.now()
1325 | action = 1
1326 | table = 7
1327 |
1328 | self.cur.execute('''
1329 | INSERT INTO history(employee_id , employee_action , affected_table , operation_date , employee_branch , data)
1330 | VALUES (%s , %s , %s , %s , %s , %s)
1331 | ''', (employee_id, action, table, date, employee_branch , username))
1332 | self.db.commit()
1333 | self.Show_History()
1334 |
1335 |
1336 |
1337 |
1338 | ########### dashboard
1339 | def get_dashboard_data(self):
1340 | ## retrieve data
1341 | filter_date = self.dateEdit_7.date()
1342 | filter_date = filter_date.toPyDate()
1343 | year = str(filter_date).split('-')[0]
1344 |
1345 | self.cur.execute("""
1346 | SELECT COUNT(book_id), EXTRACT(MONTH FROM Book_from) as month
1347 | FROM daily_movements
1348 | WHERE year(Book_from) = %s
1349 | GROUP BY month
1350 | """ %(year))
1351 | pen = pg.mkPen(color=(255,0,0))
1352 | data = self.cur.fetchall()
1353 |
1354 |
1355 | books_count = []
1356 | rent_count = []
1357 |
1358 | for row in data:
1359 | books_count.append(row[0])
1360 | rent_count.append(row[1])
1361 |
1362 | print(books_count)
1363 | print(rent_count)
1364 | barchart = pg.BarGraphItem(x=rent_count , height=books_count , width=.2)
1365 |
1366 | self.widget.addItem(barchart)
1367 | # self.widget.plot(books_count , rent_count , pen=pen , symbol='+' , symbolSize=20,symbolBrush=('w'))
1368 | # self.widget.setBackground('w')
1369 | self.widget.setTitle('المبيعات') # size , color
1370 | self.widget.addLegend()
1371 | self.widget.setLabel('left' ,' عدد الكتب المعاره' , color='red' , size=40 )
1372 | self.widget.setLabel('bottom' ,' في شهر' , color='red' , size=40 )
1373 | self.widget.showGrid(x=True,y=True)
1374 |
1375 |
1376 |
1377 |
1378 |
1379 |
1380 |
1381 |
1382 | def main():
1383 | app = QApplication(sys.argv)
1384 | window = Main()
1385 | window.show()
1386 | app.exec_()
1387 |
1388 |
1389 | if __name__ == '__main__':
1390 | main()
--------------------------------------------------------------------------------
/main.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | MainWindow
4 |
5 |
6 |
7 | 0
8 | 0
9 | 1331
10 | 702
11 |
12 |
13 |
14 | MainWindow
15 |
16 |
17 | QToolTip
18 | {
19 | border: 1px solid black;
20 | background-color: #ffa02f;
21 | padding: 1px;
22 | border-radius: 3px;
23 | opacity: 100;
24 | }
25 |
26 | QWidget
27 | {
28 | color: #b1b1b1;
29 | background-color: #323232;
30 | }
31 |
32 | QTreeView, QListView
33 | {
34 | background-color: silver;
35 | margin-left: 5px;
36 | }
37 |
38 | QWidget:item:hover
39 | {
40 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #ca0619);
41 | color: #000000;
42 | }
43 |
44 | QWidget:item:selected
45 | {
46 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a);
47 | }
48 |
49 | QMenuBar::item
50 | {
51 | background: transparent;
52 | }
53 |
54 | QMenuBar::item:selected
55 | {
56 | background: transparent;
57 | border: 1px solid #ffaa00;
58 | }
59 |
60 | QMenuBar::item:pressed
61 | {
62 | background: #444;
63 | border: 1px solid #000;
64 | background-color: QLinearGradient(
65 | x1:0, y1:0,
66 | x2:0, y2:1,
67 | stop:1 #212121,
68 | stop:0.4 #343434/*,
69 | stop:0.2 #343434,
70 | stop:0.1 #ffaa00*/
71 | );
72 | margin-bottom:-1px;
73 | padding-bottom:1px;
74 | }
75 |
76 | QMenu
77 | {
78 | border: 1px solid #000;
79 | }
80 |
81 | QMenu::item
82 | {
83 | padding: 2px 20px 2px 20px;
84 | }
85 |
86 | QMenu::item:selected
87 | {
88 | color: #000000;
89 | }
90 |
91 | QWidget:disabled
92 | {
93 | color: #808080;
94 | background-color: #323232;
95 | }
96 |
97 | QAbstractItemView
98 | {
99 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4d4d4d, stop: 0.1 #646464, stop: 1 #5d5d5d);
100 | }
101 |
102 | QWidget:focus
103 | {
104 | /*border: 1px solid darkgray;*/
105 | }
106 |
107 | QLineEdit
108 | {
109 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4d4d4d, stop: 0 #646464, stop: 1 #5d5d5d);
110 | padding: 1px;
111 | border-style: solid;
112 | border: 1px solid #1e1e1e;
113 | border-radius: 5;
114 | }
115 |
116 | QPushButton
117 | {
118 | color: #b1b1b1;
119 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646);
120 | border-width: 1px;
121 | border-color: #1e1e1e;
122 | border-style: solid;
123 | border-radius: 6;
124 | padding: 3px;
125 | font-size: 12px;
126 | padding-left: 5px;
127 | padding-right: 5px;
128 | min-width: 40px;
129 | }
130 |
131 | QPushButton:pressed
132 | {
133 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525);
134 | }
135 |
136 | QComboBox
137 | {
138 | selection-background-color: #ffaa00;
139 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646);
140 | border-style: solid;
141 | border: 1px solid #1e1e1e;
142 | border-radius: 5;
143 | }
144 |
145 | QComboBox:hover,QPushButton:hover
146 | {
147 | border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a);
148 | }
149 |
150 |
151 | QComboBox:on
152 | {
153 | padding-top: 3px;
154 | padding-left: 4px;
155 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525);
156 | selection-background-color: #ffaa00;
157 | }
158 |
159 | QComboBox QAbstractItemView
160 | {
161 | border: 2px solid darkgray;
162 | selection-background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a);
163 | }
164 |
165 | QComboBox::drop-down
166 | {
167 | subcontrol-origin: padding;
168 | subcontrol-position: top right;
169 | width: 15px;
170 |
171 | border-left-width: 0px;
172 | border-left-color: darkgray;
173 | border-left-style: solid; /* just a single line */
174 | border-top-right-radius: 3px; /* same radius as the QComboBox */
175 | border-bottom-right-radius: 3px;
176 | }
177 |
178 | QComboBox::down-arrow
179 | {
180 | image: url(:/dark_orange/img/down_arrow.png);
181 | }
182 |
183 | QGroupBox
184 | {
185 | border: 1px solid darkgray;
186 | margin-top: 10px;
187 | }
188 |
189 | QGroupBox:focus
190 | {
191 | border: 1px solid darkgray;
192 | }
193 |
194 | QTextEdit:focus
195 | {
196 | border: 1px solid darkgray;
197 | }
198 |
199 | QScrollBar:horizontal {
200 | border: 1px solid #222222;
201 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848);
202 | height: 7px;
203 | margin: 0px 16px 0 16px;
204 | }
205 |
206 | QScrollBar::handle:horizontal
207 | {
208 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f);
209 | min-height: 20px;
210 | border-radius: 2px;
211 | }
212 |
213 | QScrollBar::add-line:horizontal {
214 | border: 1px solid #1b1b19;
215 | border-radius: 2px;
216 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a);
217 | width: 14px;
218 | subcontrol-position: right;
219 | subcontrol-origin: margin;
220 | }
221 |
222 | QScrollBar::sub-line:horizontal {
223 | border: 1px solid #1b1b19;
224 | border-radius: 2px;
225 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a);
226 | width: 14px;
227 | subcontrol-position: left;
228 | subcontrol-origin: margin;
229 | }
230 |
231 | QScrollBar::right-arrow:horizontal, QScrollBar::left-arrow:horizontal
232 | {
233 | border: 1px solid black;
234 | width: 1px;
235 | height: 1px;
236 | background: white;
237 | }
238 |
239 | QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal
240 | {
241 | background: none;
242 | }
243 |
244 | QScrollBar:vertical
245 | {
246 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848);
247 | width: 7px;
248 | margin: 16px 0 16px 0;
249 | border: 1px solid #222222;
250 | }
251 |
252 | QScrollBar::handle:vertical
253 | {
254 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f);
255 | min-height: 20px;
256 | border-radius: 2px;
257 | }
258 |
259 | QScrollBar::add-line:vertical
260 | {
261 | border: 1px solid #1b1b19;
262 | border-radius: 2px;
263 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a);
264 | height: 14px;
265 | subcontrol-position: bottom;
266 | subcontrol-origin: margin;
267 | }
268 |
269 | QScrollBar::sub-line:vertical
270 | {
271 | border: 1px solid #1b1b19;
272 | border-radius: 2px;
273 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d7801a, stop: 1 #ffa02f);
274 | height: 14px;
275 | subcontrol-position: top;
276 | subcontrol-origin: margin;
277 | }
278 |
279 | QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical
280 | {
281 | border: 1px solid black;
282 | width: 1px;
283 | height: 1px;
284 | background: white;
285 | }
286 |
287 |
288 | QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical
289 | {
290 | background: none;
291 | }
292 |
293 | QTextEdit
294 | {
295 | background-color: #242424;
296 | }
297 |
298 | QPlainTextEdit
299 | {
300 | background-color: #242424;
301 | }
302 |
303 | QHeaderView::section
304 | {
305 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565);
306 | color: white;
307 | padding-left: 4px;
308 | border: 1px solid #6c6c6c;
309 | }
310 |
311 | QCheckBox:disabled
312 | {
313 | color: #414141;
314 | }
315 |
316 | QDockWidget::title
317 | {
318 | text-align: center;
319 | spacing: 3px; /* spacing between items in the tool bar */
320 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232);
321 | }
322 |
323 | QDockWidget::close-button, QDockWidget::float-button
324 | {
325 | text-align: center;
326 | spacing: 1px; /* spacing between items in the tool bar */
327 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232);
328 | }
329 |
330 | QDockWidget::close-button:hover, QDockWidget::float-button:hover
331 | {
332 | background: #242424;
333 | }
334 |
335 | QDockWidget::close-button:pressed, QDockWidget::float-button:pressed
336 | {
337 | padding: 1px -1px -1px 1px;
338 | }
339 |
340 | QMainWindow::separator
341 | {
342 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434);
343 | color: white;
344 | padding-left: 4px;
345 | border: 1px solid #4c4c4c;
346 | spacing: 3px; /* spacing between items in the tool bar */
347 | }
348 |
349 | QMainWindow::separator:hover
350 | {
351 |
352 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #d7801a, stop:0.5 #b56c17 stop:1 #ffa02f);
353 | color: white;
354 | padding-left: 4px;
355 | border: 1px solid #6c6c6c;
356 | spacing: 3px; /* spacing between items in the tool bar */
357 | }
358 |
359 | QToolBar::handle
360 | {
361 | spacing: 3px; /* spacing between items in the tool bar */
362 | background: url(:/dark_orange/img/handle.png);
363 | }
364 |
365 | QMenu::separator
366 | {
367 | height: 2px;
368 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434);
369 | color: white;
370 | padding-left: 4px;
371 | margin-left: 10px;
372 | margin-right: 5px;
373 | }
374 |
375 | QProgressBar
376 | {
377 | border: 2px solid grey;
378 | border-radius: 5px;
379 | text-align: center;
380 | }
381 |
382 | QProgressBar::chunk
383 | {
384 | background-color: #d7801a;
385 | width: 2.15px;
386 | margin: 0.5px;
387 | }
388 |
389 | QTabBar::tab {
390 | color: #b1b1b1;
391 | border: 1px solid #444;
392 | border-bottom-style: none;
393 | background-color: #323232;
394 | padding-left: 10px;
395 | padding-right: 10px;
396 | padding-top: 3px;
397 | padding-bottom: 2px;
398 | margin-right: -1px;
399 | }
400 |
401 | QTabWidget::pane {
402 | border: 1px solid #444;
403 | top: 1px;
404 | }
405 |
406 | QTabBar::tab:last
407 | {
408 | margin-right: 0; /* the last selected tab has nothing to overlap with on the right */
409 | border-top-right-radius: 3px;
410 | }
411 |
412 | QTabBar::tab:first:!selected
413 | {
414 | margin-left: 0px; /* the last selected tab has nothing to overlap with on the right */
415 |
416 |
417 | border-top-left-radius: 3px;
418 | }
419 |
420 | QTabBar::tab:!selected
421 | {
422 | color: #b1b1b1;
423 | border-bottom-style: solid;
424 | margin-top: 3px;
425 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:.4 #343434);
426 | }
427 |
428 | QTabBar::tab:selected
429 | {
430 | border-top-left-radius: 3px;
431 | border-top-right-radius: 3px;
432 | margin-bottom: 0px;
433 | }
434 |
435 | QTabBar::tab:!selected:hover
436 | {
437 | /*border-top: 2px solid #ffaa00;
438 | padding-bottom: 3px;*/
439 | border-top-left-radius: 3px;
440 | border-top-right-radius: 3px;
441 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:0.4 #343434, stop:0.2 #343434, stop:0.1 #ffaa00);
442 | }
443 |
444 | QRadioButton::indicator:checked, QRadioButton::indicator:unchecked{
445 | color: #b1b1b1;
446 | background-color: #323232;
447 | border: 1px solid #b1b1b1;
448 | border-radius: 6px;
449 | }
450 |
451 | QRadioButton::indicator:checked
452 | {
453 | background-color: qradialgradient(
454 | cx: 0.5, cy: 0.5,
455 | fx: 0.5, fy: 0.5,
456 | radius: 1.0,
457 | stop: 0.25 #ffaa00,
458 | stop: 0.3 #323232
459 | );
460 | }
461 |
462 | QCheckBox::indicator{
463 | color: #b1b1b1;
464 | background-color: #323232;
465 | border: 1px solid #b1b1b1;
466 | width: 9px;
467 | height: 9px;
468 | }
469 |
470 | QRadioButton::indicator
471 | {
472 | border-radius: 6px;
473 | }
474 |
475 | QRadioButton::indicator:hover, QCheckBox::indicator:hover
476 | {
477 | border: 1px solid #ffaa00;
478 | }
479 |
480 | QCheckBox::indicator:checked
481 | {
482 | background-color: rgb(255, 255, 255);
483 | }
484 |
485 | QCheckBox::indicator:disabled, QRadioButton::indicator:disabled
486 | {
487 | border: 1px solid #444;
488 | }
489 |
490 |
491 | QSlider::groove:horizontal {
492 | border: 1px solid #3A3939;
493 | height: 8px;
494 | background: #201F1F;
495 | margin: 2px 0;
496 | border-radius: 2px;
497 | }
498 |
499 | QSlider::handle:horizontal {
500 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1,
501 | stop: 0.0 silver, stop: 0.2 #a8a8a8, stop: 1 #727272);
502 | border: 1px solid #3A3939;
503 | width: 14px;
504 | height: 14px;
505 | margin: -4px 0;
506 | border-radius: 2px;
507 | }
508 |
509 | QSlider::groove:vertical {
510 | border: 1px solid #3A3939;
511 | width: 8px;
512 | background: #201F1F;
513 | margin: 0 0px;
514 | border-radius: 2px;
515 | }
516 |
517 | QSlider::handle:vertical {
518 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 silver,
519 | stop: 0.2 #a8a8a8, stop: 1 #727272);
520 | border: 1px solid #3A3939;
521 | width: 14px;
522 | height: 14px;
523 | margin: 0 -4px;
524 | border-radius: 2px;
525 | }
526 |
527 | QAbstractSpinBox {
528 | padding-top: 2px;
529 | padding-bottom: 2px;
530 | border: 1px solid darkgray;
531 |
532 | border-radius: 2px;
533 | min-width: 50px;
534 | }
535 |
536 |
537 |
538 |
539 |
540 |
541 | 220
542 | 0
543 | 1101
544 | 641
545 |
546 |
547 |
548 |
549 | Segoe UI
550 | 20
551 |
552 |
553 |
554 | 5
555 |
556 |
557 |
558 | Page
559 |
560 |
561 |
562 |
563 | 400
564 | 430
565 | 271
566 | 51
567 |
568 |
569 |
570 |
571 | -1
572 |
573 |
574 |
575 | Login
576 |
577 |
578 |
579 |
580 |
581 | 380
582 | 150
583 | 371
584 | 41
585 |
586 |
587 |
588 |
589 |
590 |
591 | 150
592 | 150
593 | 141
594 | 31
595 |
596 |
597 |
598 |
599 | Segoe UI
600 | 20
601 |
602 |
603 |
604 | User Name
605 |
606 |
607 |
608 |
609 |
610 | 150
611 | 210
612 | 141
613 | 31
614 |
615 |
616 |
617 |
618 | Segoe UI
619 | 20
620 |
621 |
622 |
623 | Password
624 |
625 |
626 |
627 |
628 |
629 | 380
630 | 210
631 | 371
632 | 41
633 |
634 |
635 |
636 | QLineEdit::Password
637 |
638 |
639 |
640 |
641 |
642 | 130
643 | 310
644 | 791
645 | 61
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 | 50
655 | 20
656 | 501
657 | 31
658 |
659 |
660 |
661 |
662 | Segoe UI
663 | 20
664 |
665 |
666 |
667 | your password is incorrect , reset your password from here
668 |
669 |
670 |
671 |
672 |
673 | 580
674 | 20
675 | 181
676 | 31
677 |
678 |
679 |
680 |
681 | -1
682 |
683 |
684 |
685 | Rest Password
686 |
687 |
688 |
689 |
690 |
691 |
692 | Page
693 |
694 |
695 |
696 |
697 | 220
698 | 180
699 | 141
700 | 31
701 |
702 |
703 |
704 |
705 | Segoe UI
706 | 20
707 |
708 |
709 |
710 | Enter Your Mail
711 |
712 |
713 |
714 |
715 |
716 | 420
717 | 180
718 | 421
719 | 41
720 |
721 |
722 |
723 |
724 |
725 |
726 | 380
727 | 400
728 | 371
729 | 51
730 |
731 |
732 |
733 | Send Me On Gmail
734 |
735 |
736 |
737 |
738 |
739 | 160
740 | 280
741 | 791
742 | 61
743 |
744 |
745 |
746 |
747 |
748 |
749 |
750 |
751 | 90
752 | 20
753 | 291
754 | 31
755 |
756 |
757 |
758 |
759 | Segoe UI
760 | 20
761 |
762 |
763 |
764 | Login From Here
765 |
766 |
767 |
768 |
769 |
770 | 600
771 | 20
772 | 161
773 | 31
774 |
775 |
776 |
777 |
778 | -1
779 |
780 |
781 |
782 | Login
783 |
784 |
785 |
786 |
787 |
788 | 420
789 | 20
790 | 171
791 | 31
792 |
793 |
794 |
795 |
796 | -1
797 |
798 |
799 |
800 | Resend On Gmail
801 |
802 |
803 |
804 |
805 |
806 |
807 | Tab 1
808 |
809 |
810 |
811 |
812 | 30
813 | 40
814 | 231
815 | 41
816 |
817 |
818 |
819 |
820 | Segoe UI
821 | 20
822 |
823 |
824 |
825 | Book Title
826 |
827 |
828 |
829 |
830 |
831 | 880
832 | 40
833 | 181
834 | 41
835 |
836 |
837 |
838 |
839 | -1
840 |
841 |
842 |
843 | Add
844 |
845 |
846 |
847 |
848 |
849 | 510
850 | 40
851 | 111
852 | 41
853 |
854 |
855 |
856 |
857 | Segoe UI
858 | 25
859 |
860 |
861 | -
862 |
863 | rent
864 |
865 |
866 | -
867 |
868 | retrieve
869 |
870 |
871 |
872 |
873 |
874 |
875 | 10
876 | 130
877 | 1071
878 | 431
879 |
880 |
881 |
882 |
883 | Segoe UI
884 | 20
885 |
886 |
887 |
888 |
889 | book name
890 |
891 |
892 |
893 | 20
894 |
895 |
896 |
897 | AlignCenter
898 |
899 |
900 |
901 |
902 | type
903 |
904 |
905 |
906 | 20
907 |
908 |
909 |
910 | AlignCenter
911 |
912 |
913 |
914 |
915 | Client
916 |
917 |
918 |
919 | 20
920 |
921 |
922 |
923 | AlignCenter
924 |
925 |
926 |
927 |
928 | from
929 |
930 |
931 |
932 | 20
933 |
934 |
935 |
936 | AlignCenter
937 |
938 |
939 |
940 |
941 | to
942 |
943 |
944 |
945 | 20
946 |
947 |
948 |
949 | AlignCenter
950 |
951 |
952 |
953 |
954 |
955 |
956 | 270
957 | 40
958 | 231
959 | 41
960 |
961 |
962 |
963 |
964 | Segoe UI
965 | 20
966 |
967 |
968 |
969 | Client National Id
970 |
971 |
972 |
973 |
974 |
975 | 680
976 | 40
977 | 110
978 | 41
979 |
980 |
981 |
982 | M/d/yyyy
983 |
984 |
985 |
986 | 2020
987 | 1
988 | 1
989 |
990 |
991 |
992 |
993 |
994 |
995 | 650
996 | 50
997 | 21
998 | 31
999 |
1000 |
1001 |
1002 | To
1003 |
1004 |
1005 |
1006 |
1007 |
1008 | Tab 2
1009 |
1010 |
1011 |
1012 |
1013 | 0
1014 | 10
1015 | 1081
1016 | 601
1017 |
1018 |
1019 |
1020 |
1021 | 20
1022 |
1023 |
1024 |
1025 | 1
1026 |
1027 |
1028 |
1029 | All Books
1030 |
1031 |
1032 |
1033 |
1034 | 780
1035 | 30
1036 | 161
1037 | 41
1038 |
1039 |
1040 |
1041 | Search
1042 |
1043 |
1044 |
1045 |
1046 |
1047 | 20
1048 | 30
1049 | 321
1050 | 41
1051 |
1052 |
1053 |
1054 |
1055 | 20
1056 |
1057 |
1058 |
1059 | Book Title
1060 |
1061 |
1062 |
1063 |
1064 |
1065 | 470
1066 | 30
1067 | 201
1068 | 41
1069 |
1070 |
1071 | -
1072 |
1073 | ------------
1074 |
1075 |
1076 |
1077 |
1078 |
1079 |
1080 | 380
1081 | 30
1082 | 91
1083 | 41
1084 |
1085 |
1086 |
1087 | Category
1088 |
1089 |
1090 |
1091 |
1092 |
1093 | 5
1094 | 100
1095 | 1071
1096 | 391
1097 |
1098 |
1099 |
1100 |
1101 | Segoe UI
1102 | 20
1103 |
1104 |
1105 |
1106 |
1107 | book code
1108 |
1109 |
1110 |
1111 | Segoe UI
1112 | 20
1113 |
1114 |
1115 |
1116 |
1117 |
1118 | book title
1119 |
1120 |
1121 |
1122 | Segoe UI
1123 | 20
1124 |
1125 |
1126 |
1127 |
1128 |
1129 | book Category
1130 |
1131 |
1132 |
1133 | Segoe UI
1134 | 20
1135 |
1136 |
1137 |
1138 |
1139 |
1140 | book author
1141 |
1142 |
1143 |
1144 | Segoe UI
1145 | 20
1146 |
1147 |
1148 |
1149 |
1150 |
1151 | book price
1152 |
1153 |
1154 |
1155 | Segoe UI
1156 | 20
1157 |
1158 |
1159 |
1160 |
1161 |
1162 |
1163 | false
1164 |
1165 |
1166 |
1167 | 720
1168 | 500
1169 | 161
1170 | 41
1171 |
1172 |
1173 |
1174 | Import
1175 |
1176 |
1177 |
1178 |
1179 | false
1180 |
1181 |
1182 |
1183 | 890
1184 | 500
1185 | 161
1186 | 41
1187 |
1188 |
1189 |
1190 | Export
1191 |
1192 |
1193 |
1194 |
1195 |
1196 | Add New Book
1197 |
1198 |
1199 |
1200 | false
1201 |
1202 |
1203 |
1204 | 380
1205 | 470
1206 | 251
1207 | 41
1208 |
1209 |
1210 |
1211 | Add Book
1212 |
1213 |
1214 |
1215 |
1216 |
1217 | 60
1218 | 30
1219 | 471
1220 | 41
1221 |
1222 |
1223 |
1224 |
1225 | 20
1226 |
1227 |
1228 |
1229 | Book Title
1230 |
1231 |
1232 |
1233 |
1234 |
1235 | 60
1236 | 100
1237 | 471
1238 | 331
1239 |
1240 |
1241 |
1242 | Book Full Description
1243 |
1244 |
1245 |
1246 |
1247 |
1248 | 762
1249 | 30
1250 | 271
1251 | 41
1252 |
1253 |
1254 |
1255 |
1256 |
1257 |
1258 | 640
1259 | 30
1260 | 91
1261 | 31
1262 |
1263 |
1264 |
1265 | Category
1266 |
1267 |
1268 |
1269 |
1270 |
1271 | 760
1272 | 80
1273 | 271
1274 | 41
1275 |
1276 |
1277 |
1278 |
1279 |
1280 |
1281 | 640
1282 | 80
1283 | 91
1284 | 31
1285 |
1286 |
1287 |
1288 | Price
1289 |
1290 |
1291 |
1292 |
1293 |
1294 | 760
1295 | 130
1296 | 271
1297 | 41
1298 |
1299 |
1300 |
1301 |
1302 |
1303 |
1304 | 640
1305 | 140
1306 | 91
1307 | 31
1308 |
1309 |
1310 |
1311 | Code
1312 |
1313 |
1314 |
1315 |
1316 |
1317 | 640
1318 | 230
1319 | 91
1320 | 31
1321 |
1322 |
1323 |
1324 | Publisher
1325 |
1326 |
1327 |
1328 |
1329 |
1330 | 760
1331 | 230
1332 | 271
1333 | 41
1334 |
1335 |
1336 |
1337 |
1338 |
1339 |
1340 | 760
1341 | 280
1342 | 271
1343 | 41
1344 |
1345 |
1346 |
1347 |
1348 |
1349 |
1350 | 640
1351 | 290
1352 | 91
1353 | 31
1354 |
1355 |
1356 |
1357 | author
1358 |
1359 |
1360 |
1361 |
1362 |
1363 | 760
1364 | 330
1365 | 271
1366 | 41
1367 |
1368 |
1369 | -
1370 |
1371 | New
1372 |
1373 |
1374 | -
1375 |
1376 | Used
1377 |
1378 |
1379 | -
1380 |
1381 | Damaged
1382 |
1383 |
1384 |
1385 |
1386 |
1387 |
1388 | 640
1389 | 340
1390 | 91
1391 | 31
1392 |
1393 |
1394 |
1395 | Status
1396 |
1397 |
1398 |
1399 |
1400 |
1401 | 640
1402 | 380
1403 | 91
1404 | 31
1405 |
1406 |
1407 |
1408 | Part Order
1409 |
1410 |
1411 |
1412 |
1413 |
1414 | 760
1415 | 380
1416 | 271
1417 | 41
1418 |
1419 |
1420 |
1421 |
1422 |
1423 |
1424 | 640
1425 | 190
1426 | 91
1427 | 31
1428 |
1429 |
1430 |
1431 | barcode
1432 |
1433 |
1434 |
1435 |
1436 |
1437 | 760
1438 | 180
1439 | 271
1440 | 41
1441 |
1442 |
1443 |
1444 |
1445 |
1446 |
1447 | Edit Or Delete Book
1448 |
1449 |
1450 |
1451 |
1452 | 610
1453 | 160
1454 | 91
1455 | 31
1456 |
1457 |
1458 |
1459 | Price
1460 |
1461 |
1462 |
1463 |
1464 |
1465 | 730
1466 | 310
1467 | 281
1468 | 41
1469 |
1470 |
1471 | -
1472 |
1473 | New
1474 |
1475 |
1476 | -
1477 |
1478 | Used
1479 |
1480 |
1481 | -
1482 |
1483 | Damaged
1484 |
1485 |
1486 |
1487 |
1488 |
1489 |
1490 | 730
1491 | 160
1492 | 281
1493 | 41
1494 |
1495 |
1496 |
1497 |
1498 |
1499 |
1500 | 730
1501 | 210
1502 | 281
1503 | 41
1504 |
1505 |
1506 |
1507 |
1508 |
1509 | false
1510 |
1511 |
1512 |
1513 | 560
1514 | 450
1515 | 251
1516 | 41
1517 |
1518 |
1519 |
1520 | Save Book
1521 |
1522 |
1523 |
1524 |
1525 |
1526 | 40
1527 | 160
1528 | 471
1529 | 241
1530 |
1531 |
1532 |
1533 | Book Full Description
1534 |
1535 |
1536 |
1537 |
1538 |
1539 | 610
1540 | 360
1541 | 91
1542 | 31
1543 |
1544 |
1545 |
1546 | Part Order
1547 |
1548 |
1549 |
1550 |
1551 |
1552 | 730
1553 | 260
1554 | 281
1555 | 41
1556 |
1557 |
1558 |
1559 |
1560 |
1561 |
1562 | 732
1563 | 110
1564 | 281
1565 | 41
1566 |
1567 |
1568 |
1569 |
1570 |
1571 |
1572 | 200
1573 | 30
1574 | 311
1575 | 41
1576 |
1577 |
1578 |
1579 |
1580 |
1581 |
1582 | 610
1583 | 260
1584 | 91
1585 | 31
1586 |
1587 |
1588 |
1589 | author
1590 |
1591 |
1592 |
1593 |
1594 |
1595 | 610
1596 | 210
1597 | 91
1598 | 31
1599 |
1600 |
1601 |
1602 | Publisher
1603 |
1604 |
1605 |
1606 |
1607 |
1608 | 610
1609 | 110
1610 | 91
1611 | 31
1612 |
1613 |
1614 |
1615 | Category
1616 |
1617 |
1618 |
1619 |
1620 |
1621 | 730
1622 | 360
1623 | 281
1624 | 41
1625 |
1626 |
1627 |
1628 |
1629 |
1630 |
1631 | 40
1632 | 110
1633 | 471
1634 | 41
1635 |
1636 |
1637 |
1638 | Book Title
1639 |
1640 |
1641 |
1642 |
1643 |
1644 | 610
1645 | 320
1646 | 91
1647 | 31
1648 |
1649 |
1650 |
1651 | Status
1652 |
1653 |
1654 |
1655 |
1656 |
1657 | 120
1658 | 30
1659 | 71
1660 | 31
1661 |
1662 |
1663 |
1664 | Code
1665 |
1666 |
1667 |
1668 |
1669 |
1670 | 540
1671 | 30
1672 | 281
1673 | 41
1674 |
1675 |
1676 |
1677 | Search
1678 |
1679 |
1680 |
1681 |
1682 | false
1683 |
1684 |
1685 |
1686 | 120
1687 | 450
1688 | 131
1689 | 41
1690 |
1691 |
1692 |
1693 | Delete
1694 |
1695 |
1696 |
1697 |
1698 |
1699 |
1700 |
1701 | Page
1702 |
1703 |
1704 |
1705 |
1706 | 0
1707 | 10
1708 | 1091
1709 | 621
1710 |
1711 |
1712 |
1713 |
1714 | 20
1715 |
1716 |
1717 |
1718 | 0
1719 |
1720 |
1721 |
1722 | All Clients
1723 |
1724 |
1725 |
1726 |
1727 | 780
1728 | 30
1729 | 161
1730 | 41
1731 |
1732 |
1733 |
1734 | Search
1735 |
1736 |
1737 |
1738 |
1739 |
1740 | 100
1741 | 30
1742 | 321
1743 | 41
1744 |
1745 |
1746 |
1747 |
1748 | 20
1749 |
1750 |
1751 |
1752 | Client Name
1753 |
1754 |
1755 |
1756 |
1757 |
1758 | 5
1759 | 100
1760 | 1071
1761 | 391
1762 |
1763 |
1764 |
1765 |
1766 | Client Name
1767 |
1768 |
1769 |
1770 | Segoe UI
1771 | 20
1772 |
1773 |
1774 |
1775 |
1776 |
1777 | Client Mail
1778 |
1779 |
1780 |
1781 | Segoe UI
1782 | 20
1783 |
1784 |
1785 |
1786 |
1787 |
1788 | Client Phone
1789 |
1790 |
1791 |
1792 | Segoe UI
1793 | 20
1794 |
1795 |
1796 |
1797 |
1798 |
1799 | Client National_id
1800 |
1801 |
1802 |
1803 | Segoe UI
1804 | 20
1805 |
1806 |
1807 |
1808 |
1809 |
1810 | Join Date
1811 |
1812 |
1813 |
1814 | Segoe UI
1815 | 20
1816 |
1817 |
1818 |
1819 |
1820 |
1821 |
1822 |
1823 | 480
1824 | 30
1825 | 241
1826 | 41
1827 |
1828 |
1829 |
1830 |
1831 | 20
1832 |
1833 |
1834 | -
1835 |
1836 | Client Name
1837 |
1838 |
1839 | -
1840 |
1841 | Client Mail
1842 |
1843 |
1844 | -
1845 |
1846 | CLient Phone
1847 |
1848 |
1849 | -
1850 |
1851 | Client National Id
1852 |
1853 |
1854 |
1855 |
1856 |
1857 | false
1858 |
1859 |
1860 |
1861 | 710
1862 | 500
1863 | 161
1864 | 41
1865 |
1866 |
1867 |
1868 | Import
1869 |
1870 |
1871 |
1872 |
1873 | false
1874 |
1875 |
1876 |
1877 | 890
1878 | 500
1879 | 161
1880 | 41
1881 |
1882 |
1883 |
1884 | Export
1885 |
1886 |
1887 |
1888 |
1889 |
1890 | Add New Client
1891 |
1892 |
1893 |
1894 |
1895 | 510
1896 | 70
1897 | 321
1898 | 41
1899 |
1900 |
1901 |
1902 |
1903 |
1904 |
1905 | 510
1906 | 120
1907 | 321
1908 | 41
1909 |
1910 |
1911 |
1912 |
1913 |
1914 |
1915 | 510
1916 | 180
1917 | 321
1918 | 41
1919 |
1920 |
1921 |
1922 |
1923 |
1924 |
1925 | 510
1926 | 230
1927 | 321
1928 | 41
1929 |
1930 |
1931 |
1932 |
1933 |
1934 | false
1935 |
1936 |
1937 |
1938 | 410
1939 | 370
1940 | 321
1941 | 71
1942 |
1943 |
1944 |
1945 | Add Client
1946 |
1947 |
1948 |
1949 |
1950 |
1951 | 260
1952 | 80
1953 | 141
1954 | 31
1955 |
1956 |
1957 |
1958 | Client Name
1959 |
1960 |
1961 |
1962 |
1963 |
1964 | 260
1965 | 130
1966 | 141
1967 | 31
1968 |
1969 |
1970 |
1971 | Client Mail
1972 |
1973 |
1974 |
1975 |
1976 |
1977 | 260
1978 | 180
1979 | 141
1980 | 31
1981 |
1982 |
1983 |
1984 | Client Phone
1985 |
1986 |
1987 |
1988 |
1989 |
1990 | 260
1991 | 230
1992 | 141
1993 | 31
1994 |
1995 |
1996 |
1997 | Client National Id
1998 |
1999 |
2000 |
2001 |
2002 |
2003 | Edit Or Delete Client
2004 |
2005 |
2006 |
2007 |
2008 | 270
2009 | 280
2010 | 141
2011 | 31
2012 |
2013 |
2014 |
2015 | Client Phone
2016 |
2017 |
2018 |
2019 |
2020 |
2021 | 270
2022 | 180
2023 | 141
2024 | 31
2025 |
2026 |
2027 |
2028 | Client Name
2029 |
2030 |
2031 |
2032 |
2033 |
2034 | 270
2035 | 230
2036 | 141
2037 | 31
2038 |
2039 |
2040 |
2041 | Client Mail
2042 |
2043 |
2044 |
2045 |
2046 |
2047 | 270
2048 | 330
2049 | 151
2050 | 31
2051 |
2052 |
2053 |
2054 | Client National Id
2055 |
2056 |
2057 |
2058 |
2059 |
2060 | 520
2061 | 280
2062 | 321
2063 | 41
2064 |
2065 |
2066 |
2067 |
2068 |
2069 |
2070 | 520
2071 | 220
2072 | 321
2073 | 41
2074 |
2075 |
2076 |
2077 |
2078 |
2079 |
2080 | 520
2081 | 170
2082 | 321
2083 | 41
2084 |
2085 |
2086 |
2087 |
2088 |
2089 |
2090 | 520
2091 | 330
2092 | 321
2093 | 41
2094 |
2095 |
2096 |
2097 |
2098 |
2099 | false
2100 |
2101 |
2102 |
2103 | 510
2104 | 440
2105 | 311
2106 | 51
2107 |
2108 |
2109 |
2110 | Save Client Data
2111 |
2112 |
2113 |
2114 |
2115 |
2116 | 810
2117 | 40
2118 | 211
2119 | 41
2120 |
2121 |
2122 |
2123 | Search
2124 |
2125 |
2126 |
2127 |
2128 |
2129 | 462
2130 | 40
2131 | 241
2132 | 41
2133 |
2134 |
2135 |
2136 |
2137 | 20
2138 |
2139 |
2140 | -
2141 |
2142 | Client Name
2143 |
2144 |
2145 | -
2146 |
2147 | Client Mail
2148 |
2149 |
2150 | -
2151 |
2152 | CLient Phone
2153 |
2154 |
2155 | -
2156 |
2157 | Client National Id
2158 |
2159 |
2160 |
2161 |
2162 |
2163 |
2164 | 62
2165 | 40
2166 | 321
2167 | 41
2168 |
2169 |
2170 |
2171 |
2172 | 20
2173 |
2174 |
2175 |
2176 | Enter Client Data
2177 |
2178 |
2179 |
2180 |
2181 | false
2182 |
2183 |
2184 |
2185 | 162
2186 | 440
2187 | 121
2188 | 51
2189 |
2190 |
2191 |
2192 | Delete
2193 |
2194 |
2195 |
2196 |
2197 |
2198 |
2199 |
2200 | Page
2201 |
2202 |
2203 |
2204 |
2205 | 10
2206 | 60
2207 | 1081
2208 | 561
2209 |
2210 |
2211 |
2212 |
2213 |
2214 |
2215 | 200
2216 | 10
2217 | 181
2218 | 41
2219 |
2220 |
2221 |
2222 |
2223 | -1
2224 |
2225 |
2226 |
2227 | عرض
2228 |
2229 |
2230 |
2231 |
2232 |
2233 | 420
2234 | 10
2235 | 110
2236 | 41
2237 |
2238 |
2239 |
2240 | yyyy
2241 |
2242 |
2243 |
2244 | 2020
2245 | 1
2246 | 1
2247 |
2248 |
2249 |
2250 |
2251 |
2252 |
2253 | 610
2254 | 10
2255 | 141
2256 | 31
2257 |
2258 |
2259 |
2260 |
2261 | Segoe UI
2262 | 20
2263 |
2264 |
2265 |
2266 | ادخل السنه
2267 |
2268 |
2269 |
2270 |
2271 |
2272 | Page
2273 |
2274 |
2275 |
2276 |
2277 | 0
2278 | 120
2279 | 1091
2280 | 411
2281 |
2282 |
2283 |
2284 | true
2285 |
2286 |
2287 | true
2288 |
2289 |
2290 |
2291 | User
2292 |
2293 |
2294 |
2295 | Segoe UI
2296 | 20
2297 |
2298 |
2299 |
2300 |
2301 |
2302 | Branch
2303 |
2304 |
2305 |
2306 | Segoe UI
2307 | 20
2308 |
2309 |
2310 |
2311 |
2312 |
2313 | Action
2314 |
2315 |
2316 |
2317 | Segoe UI
2318 | 20
2319 |
2320 |
2321 |
2322 |
2323 |
2324 | Table
2325 |
2326 |
2327 |
2328 | Segoe UI
2329 | 20
2330 |
2331 |
2332 |
2333 |
2334 |
2335 | Date
2336 |
2337 |
2338 |
2339 | Segoe UI
2340 | 20
2341 |
2342 |
2343 |
2344 |
2345 |
2346 | Extra Data
2347 |
2348 |
2349 |
2350 | Segoe UI
2351 | 20
2352 |
2353 |
2354 |
2355 |
2356 |
2357 |
2358 |
2359 | 852
2360 | 50
2361 | 181
2362 | 41
2363 |
2364 |
2365 |
2366 | Search
2367 |
2368 |
2369 |
2370 |
2371 |
2372 | 430
2373 | 50
2374 | 131
2375 | 41
2376 |
2377 |
2378 | -
2379 |
2380 | -------------
2381 |
2382 |
2383 | -
2384 |
2385 | Login
2386 |
2387 |
2388 | -
2389 |
2390 | Logout
2391 |
2392 |
2393 | -
2394 |
2395 | Add
2396 |
2397 |
2398 | -
2399 |
2400 | Edit
2401 |
2402 |
2403 | -
2404 |
2405 | Delete
2406 |
2407 |
2408 | -
2409 |
2410 | Search
2411 |
2412 |
2413 |
2414 |
2415 |
2416 |
2417 | 380
2418 | 60
2419 | 51
2420 | 31
2421 |
2422 |
2423 |
2424 | Action
2425 |
2426 |
2427 |
2428 |
2429 |
2430 | 610
2431 | 60
2432 | 41
2433 | 31
2434 |
2435 |
2436 |
2437 | Table
2438 |
2439 |
2440 |
2441 |
2442 |
2443 | 650
2444 | 50
2445 | 121
2446 | 41
2447 |
2448 |
2449 | -
2450 |
2451 | ---------------
2452 |
2453 |
2454 | -
2455 |
2456 | Books
2457 |
2458 |
2459 | -
2460 |
2461 | Clients
2462 |
2463 |
2464 | -
2465 |
2466 | History
2467 |
2468 |
2469 | -
2470 |
2471 | Branch
2472 |
2473 |
2474 | -
2475 |
2476 | Category
2477 |
2478 |
2479 | -
2480 |
2481 | Daily Movements
2482 |
2483 |
2484 | -
2485 |
2486 | Employee
2487 |
2488 |
2489 | -
2490 |
2491 | Publisher
2492 |
2493 |
2494 | -
2495 |
2496 | Author
2497 |
2498 |
2499 |
2500 |
2501 |
2502 | true
2503 |
2504 |
2505 |
2506 | 870
2507 | 550
2508 | 161
2509 | 41
2510 |
2511 |
2512 |
2513 | Export
2514 |
2515 |
2516 |
2517 |
2518 |
2519 | 20
2520 | 60
2521 | 91
2522 | 31
2523 |
2524 |
2525 |
2526 | User Name
2527 |
2528 |
2529 |
2530 |
2531 |
2532 | 120
2533 | 50
2534 | 201
2535 | 41
2536 |
2537 |
2538 | -
2539 |
2540 | -------------------
2541 |
2542 |
2543 |
2544 |
2545 |
2546 |
2547 | Page
2548 |
2549 |
2550 |
2551 |
2552 | 0
2553 | 0
2554 | 1091
2555 | 611
2556 |
2557 |
2558 |
2559 |
2560 | 20
2561 |
2562 |
2563 |
2564 | 1
2565 |
2566 |
2567 |
2568 | Book Reports
2569 |
2570 |
2571 |
2572 |
2573 | 0
2574 | 90
2575 | 1081
2576 | 421
2577 |
2578 |
2579 |
2580 |
2581 | Code
2582 |
2583 |
2584 |
2585 | Segoe UI
2586 | 20
2587 |
2588 |
2589 |
2590 |
2591 |
2592 | Title
2593 |
2594 |
2595 |
2596 | Segoe UI
2597 | 20
2598 |
2599 |
2600 |
2601 |
2602 |
2603 | Category
2604 |
2605 |
2606 |
2607 | Segoe UI
2608 | 20
2609 |
2610 |
2611 |
2612 |
2613 |
2614 | Author
2615 |
2616 |
2617 |
2618 | Segoe UI
2619 | 20
2620 |
2621 |
2622 |
2623 |
2624 |
2625 | Status
2626 |
2627 |
2628 |
2629 | Segoe UI
2630 | 20
2631 |
2632 |
2633 |
2634 |
2635 |
2636 | Quantity
2637 |
2638 |
2639 |
2640 | Segoe UI
2641 | 20
2642 |
2643 |
2644 |
2645 |
2646 |
2647 |
2648 |
2649 | 80
2650 | 30
2651 | 101
2652 | 41
2653 |
2654 |
2655 |
2656 |
2657 | 20
2658 |
2659 |
2660 |
2661 |
2662 |
2663 |
2664 | 20
2665 | 40
2666 | 51
2667 | 16
2668 |
2669 |
2670 |
2671 | From
2672 |
2673 |
2674 |
2675 |
2676 |
2677 | 270
2678 | 30
2679 | 101
2680 | 41
2681 |
2682 |
2683 |
2684 |
2685 | 20
2686 |
2687 |
2688 |
2689 |
2690 |
2691 |
2692 | 230
2693 | 40
2694 | 31
2695 | 16
2696 |
2697 |
2698 |
2699 | To
2700 |
2701 |
2702 |
2703 |
2704 |
2705 | 510
2706 | 30
2707 | 113
2708 | 31
2709 |
2710 |
2711 |
2712 |
2713 |
2714 |
2715 | 430
2716 | 30
2717 | 61
2718 | 31
2719 |
2720 |
2721 |
2722 | Quantity
2723 |
2724 |
2725 |
2726 |
2727 |
2728 | 740
2729 | 30
2730 | 151
2731 | 41
2732 |
2733 |
2734 |
2735 | Search
2736 |
2737 |
2738 |
2739 |
2740 |
2741 | 870
2742 | 520
2743 | 161
2744 | 51
2745 |
2746 |
2747 |
2748 | Export
2749 |
2750 |
2751 |
2752 |
2753 |
2754 | CLient Reports
2755 |
2756 |
2757 |
2758 |
2759 | 80
2760 | 30
2761 | 101
2762 | 41
2763 |
2764 |
2765 |
2766 |
2767 | 20
2768 |
2769 |
2770 |
2771 |
2772 |
2773 |
2774 | 270
2775 | 30
2776 | 101
2777 | 41
2778 |
2779 |
2780 |
2781 |
2782 | 20
2783 |
2784 |
2785 |
2786 |
2787 |
2788 |
2789 | 500
2790 | 30
2791 | 113
2792 | 41
2793 |
2794 |
2795 |
2796 |
2797 |
2798 |
2799 | 20
2800 | 40
2801 | 51
2802 | 16
2803 |
2804 |
2805 |
2806 | From
2807 |
2808 |
2809 |
2810 |
2811 |
2812 | 740
2813 | 30
2814 | 151
2815 | 41
2816 |
2817 |
2818 |
2819 | Search
2820 |
2821 |
2822 |
2823 |
2824 |
2825 | 0
2826 | 90
2827 | 1081
2828 | 431
2829 |
2830 |
2831 |
2832 |
2833 | Name
2834 |
2835 |
2836 |
2837 | Segoe UI
2838 | 20
2839 |
2840 |
2841 |
2842 |
2843 |
2844 | Mail
2845 |
2846 |
2847 |
2848 | Segoe UI
2849 | 20
2850 |
2851 |
2852 |
2853 |
2854 |
2855 | Phone
2856 |
2857 |
2858 |
2859 | Segoe UI
2860 | 20
2861 |
2862 |
2863 |
2864 |
2865 |
2866 | Books
2867 |
2868 |
2869 |
2870 | Segoe UI
2871 | 20
2872 |
2873 |
2874 |
2875 |
2876 |
2877 |
2878 |
2879 | 230
2880 | 40
2881 | 31
2882 | 16
2883 |
2884 |
2885 |
2886 | To
2887 |
2888 |
2889 |
2890 |
2891 |
2892 | 410
2893 | 30
2894 | 81
2895 | 31
2896 |
2897 |
2898 |
2899 | Quantity
2900 |
2901 |
2902 |
2903 |
2904 |
2905 | 900
2906 | 530
2907 | 161
2908 | 51
2909 |
2910 |
2911 |
2912 | Export
2913 |
2914 |
2915 |
2916 |
2917 |
2918 | Monthly Report
2919 |
2920 |
2921 |
2922 |
2923 | 0
2924 | 110
2925 | 1081
2926 | 381
2927 |
2928 |
2929 |
2930 |
2931 |
2932 |
2933 | 310
2934 | 50
2935 | 51
2936 | 21
2937 |
2938 |
2939 |
2940 | Month
2941 |
2942 |
2943 |
2944 |
2945 |
2946 | 40
2947 | 50
2948 | 51
2949 | 21
2950 |
2951 |
2952 |
2953 | Year
2954 |
2955 |
2956 |
2957 |
2958 |
2959 | 670
2960 | 50
2961 | 151
2962 | 41
2963 |
2964 |
2965 |
2966 | Search
2967 |
2968 |
2969 |
2970 |
2971 |
2972 | 100
2973 | 40
2974 | 171
2975 | 41
2976 |
2977 |
2978 |
2979 |
2980 |
2981 |
2982 | 370
2983 | 45
2984 | 181
2985 | 41
2986 |
2987 |
2988 |
2989 |
2990 |
2991 |
2992 | 900
2993 | 510
2994 | 161
2995 | 41
2996 |
2997 |
2998 |
2999 | Export
3000 |
3001 |
3002 |
3003 |
3004 |
3005 |
3006 |
3007 | Page
3008 |
3009 |
3010 |
3011 |
3012 | 0
3013 | 0
3014 | 1091
3015 | 621
3016 |
3017 |
3018 |
3019 |
3020 | 20
3021 |
3022 |
3023 |
3024 | 1
3025 |
3026 |
3027 |
3028 | Add Data
3029 |
3030 |
3031 |
3032 |
3033 | 0
3034 | 10
3035 | 1081
3036 | 111
3037 |
3038 |
3039 |
3040 |
3041 | 20
3042 |
3043 |
3044 |
3045 | Add Branch
3046 |
3047 |
3048 |
3049 |
3050 | 40
3051 | 40
3052 | 251
3053 | 41
3054 |
3055 |
3056 |
3057 |
3058 | 20
3059 |
3060 |
3061 |
3062 | Branch Name
3063 |
3064 |
3065 |
3066 |
3067 |
3068 | 300
3069 | 40
3070 | 251
3071 | 41
3072 |
3073 |
3074 |
3075 |
3076 | 20
3077 |
3078 |
3079 |
3080 | Branch Code
3081 |
3082 |
3083 |
3084 |
3085 |
3086 | 560
3087 | 40
3088 | 251
3089 | 41
3090 |
3091 |
3092 |
3093 |
3094 | 20
3095 |
3096 |
3097 |
3098 | Branch Location
3099 |
3100 |
3101 |
3102 |
3103 | false
3104 |
3105 |
3106 |
3107 | 860
3108 | 40
3109 | 171
3110 | 41
3111 |
3112 |
3113 |
3114 | Add Branch
3115 |
3116 |
3117 |
3118 |
3119 |
3120 |
3121 | 0
3122 | 120
3123 | 1081
3124 | 121
3125 |
3126 |
3127 |
3128 |
3129 | 20
3130 |
3131 |
3132 |
3133 | Add Publisher
3134 |
3135 |
3136 |
3137 |
3138 | 30
3139 | 50
3140 | 261
3141 | 41
3142 |
3143 |
3144 |
3145 | Publisher Name
3146 |
3147 |
3148 |
3149 |
3150 |
3151 | 300
3152 | 50
3153 | 261
3154 | 41
3155 |
3156 |
3157 |
3158 |
3159 | 20
3160 |
3161 |
3162 |
3163 | Publisher Location
3164 |
3165 |
3166 |
3167 |
3168 | false
3169 |
3170 |
3171 |
3172 | 860
3173 | 40
3174 | 171
3175 | 41
3176 |
3177 |
3178 |
3179 | Add Publisher
3180 |
3181 |
3182 |
3183 |
3184 |
3185 |
3186 | 0
3187 | 230
3188 | 1081
3189 | 121
3190 |
3191 |
3192 |
3193 |
3194 | 20
3195 |
3196 |
3197 |
3198 | Add Author
3199 |
3200 |
3201 |
3202 | false
3203 |
3204 |
3205 |
3206 | 860
3207 | 50
3208 | 171
3209 | 41
3210 |
3211 |
3212 |
3213 | Add Author
3214 |
3215 |
3216 |
3217 |
3218 |
3219 | 30
3220 | 50
3221 | 261
3222 | 41
3223 |
3224 |
3225 |
3226 |
3227 | 20
3228 |
3229 |
3230 |
3231 | Author Name
3232 |
3233 |
3234 |
3235 |
3236 |
3237 | 300
3238 | 50
3239 | 261
3240 | 41
3241 |
3242 |
3243 |
3244 |
3245 | 20
3246 |
3247 |
3248 |
3249 | Author Location
3250 |
3251 |
3252 |
3253 |
3254 |
3255 |
3256 | 0
3257 | 370
3258 | 1081
3259 | 121
3260 |
3261 |
3262 |
3263 |
3264 | 20
3265 |
3266 |
3267 |
3268 | Add Category
3269 |
3270 |
3271 |
3272 | false
3273 |
3274 |
3275 |
3276 | 860
3277 | 50
3278 | 171
3279 | 41
3280 |
3281 |
3282 |
3283 | Add Category
3284 |
3285 |
3286 |
3287 |
3288 |
3289 | 30
3290 | 50
3291 | 261
3292 | 41
3293 |
3294 |
3295 |
3296 |
3297 | 20
3298 |
3299 |
3300 |
3301 | Category Name
3302 |
3303 |
3304 |
3305 |
3306 |
3307 | 440
3308 | 50
3309 | 181
3310 | 41
3311 |
3312 |
3313 | -
3314 |
3315 | -----------------
3316 |
3317 |
3318 |
3319 |
3320 |
3321 |
3322 | 330
3323 | 55
3324 | 111
3325 | 21
3326 |
3327 |
3328 |
3329 | Parent Category
3330 |
3331 |
3332 |
3333 |
3334 |
3335 |
3336 | Add Employee
3337 |
3338 |
3339 |
3340 |
3341 | 30
3342 | 20
3343 | 501
3344 | 541
3345 |
3346 |
3347 |
3348 | Add Employee
3349 |
3350 |
3351 |
3352 |
3353 | 210
3354 | 250
3355 | 231
3356 | 41
3357 |
3358 |
3359 |
3360 |
3361 |
3362 |
3363 | 20
3364 | 260
3365 | 191
3366 | 31
3367 |
3368 |
3369 |
3370 |
3371 | 17
3372 |
3373 |
3374 |
3375 | Employee National Id
3376 |
3377 |
3378 |
3379 |
3380 |
3381 | 210
3382 | 50
3383 | 231
3384 | 41
3385 |
3386 |
3387 |
3388 |
3389 |
3390 |
3391 | 210
3392 | 100
3393 | 231
3394 | 41
3395 |
3396 |
3397 |
3398 |
3399 |
3400 |
3401 | 50
3402 | 60
3403 | 121
3404 | 31
3405 |
3406 |
3407 |
3408 | Employee Name
3409 |
3410 |
3411 |
3412 |
3413 |
3414 | 210
3415 | 150
3416 | 231
3417 | 41
3418 |
3419 |
3420 |
3421 |
3422 |
3423 |
3424 | 50
3425 | 110
3426 | 141
3427 | 31
3428 |
3429 |
3430 |
3431 | Employee Mail
3432 |
3433 |
3434 |
3435 |
3436 |
3437 | 50
3438 | 160
3439 | 151
3440 | 31
3441 |
3442 |
3443 |
3444 | Employee Phone
3445 |
3446 |
3447 |
3448 |
3449 |
3450 | 210
3451 | 350
3452 | 231
3453 | 41
3454 |
3455 |
3456 |
3457 | QLineEdit::Password
3458 |
3459 |
3460 |
3461 |
3462 |
3463 | 50
3464 | 360
3465 | 151
3466 | 31
3467 |
3468 |
3469 |
3470 | Password
3471 |
3472 |
3473 |
3474 |
3475 |
3476 | 210
3477 | 400
3478 | 231
3479 | 41
3480 |
3481 |
3482 |
3483 | QLineEdit::Password
3484 |
3485 |
3486 |
3487 |
3488 |
3489 | 50
3490 | 410
3491 | 151
3492 | 31
3493 |
3494 |
3495 |
3496 | Password Again
3497 |
3498 |
3499 |
3500 |
3501 | false
3502 |
3503 |
3504 |
3505 | 140
3506 | 480
3507 | 201
3508 | 41
3509 |
3510 |
3511 |
3512 | Add Employee
3513 |
3514 |
3515 |
3516 |
3517 |
3518 | 50
3519 | 310
3520 | 151
3521 | 31
3522 |
3523 |
3524 |
3525 | Periority
3526 |
3527 |
3528 |
3529 |
3530 |
3531 | 210
3532 | 300
3533 | 231
3534 | 41
3535 |
3536 |
3537 |
3538 |
3539 |
3540 |
3541 | 210
3542 | 200
3543 | 231
3544 | 41
3545 |
3546 |
3547 |
3548 |
3549 |
3550 |
3551 | 50
3552 | 210
3553 | 91
3554 | 31
3555 |
3556 |
3557 |
3558 | Branch
3559 |
3560 |
3561 |
3562 |
3563 |
3564 | true
3565 |
3566 |
3567 |
3568 | 540
3569 | 20
3570 | 521
3571 | 551
3572 |
3573 |
3574 |
3575 | Edit Employee Informartion
3576 |
3577 |
3578 |
3579 |
3580 | 220
3581 | 40
3582 | 231
3583 | 41
3584 |
3585 |
3586 |
3587 |
3588 |
3589 |
3590 | 50
3591 | 50
3592 | 121
3593 | 31
3594 |
3595 |
3596 |
3597 | Employee Name
3598 |
3599 |
3600 |
3601 |
3602 |
3603 | 220
3604 | 90
3605 | 231
3606 | 41
3607 |
3608 |
3609 |
3610 |
3611 |
3612 |
3613 | 50
3614 | 100
3615 | 111
3616 | 31
3617 |
3618 |
3619 |
3620 | Password
3621 |
3622 |
3623 |
3624 |
3625 | false
3626 |
3627 |
3628 |
3629 | 170
3630 | 500
3631 | 181
3632 | 41
3633 |
3634 |
3635 |
3636 | Save
3637 |
3638 |
3639 |
3640 |
3641 |
3642 | 220
3643 | 140
3644 | 101
3645 | 31
3646 |
3647 |
3648 |
3649 | Check
3650 |
3651 |
3652 |
3653 |
3654 |
3655 | 340
3656 | 140
3657 | 111
3658 | 31
3659 |
3660 |
3661 |
3662 |
3663 | -1
3664 |
3665 |
3666 |
3667 | Forget Password
3668 |
3669 |
3670 |
3671 |
3672 | false
3673 |
3674 |
3675 |
3676 | 0
3677 | 170
3678 | 521
3679 | 321
3680 |
3681 |
3682 |
3683 |
3684 |
3685 |
3686 |
3687 |
3688 | 220
3689 | 120
3690 | 231
3691 | 41
3692 |
3693 |
3694 |
3695 |
3696 |
3697 |
3698 | 220
3699 | 20
3700 | 231
3701 | 41
3702 |
3703 |
3704 |
3705 |
3706 |
3707 |
3708 | 220
3709 | 270
3710 | 231
3711 | 41
3712 |
3713 |
3714 |
3715 |
3716 |
3717 |
3718 | 50
3719 | 160
3720 | 151
3721 | 31
3722 |
3723 |
3724 |
3725 |
3726 | 16
3727 |
3728 |
3729 |
3730 | Employee National Id
3731 |
3732 |
3733 |
3734 |
3735 |
3736 | 50
3737 | 30
3738 | 141
3739 | 31
3740 |
3741 |
3742 |
3743 | Employee Mail
3744 |
3745 |
3746 |
3747 |
3748 |
3749 | 50
3750 | 120
3751 | 141
3752 | 31
3753 |
3754 |
3755 |
3756 | Branch
3757 |
3758 |
3759 |
3760 |
3761 |
3762 | 220
3763 | 220
3764 | 231
3765 | 41
3766 |
3767 |
3768 |
3769 |
3770 |
3771 |
3772 | 50
3773 | 80
3774 | 151
3775 | 31
3776 |
3777 |
3778 |
3779 | Employee Phone
3780 |
3781 |
3782 |
3783 |
3784 |
3785 | 50
3786 | 250
3787 | 151
3788 | 31
3789 |
3790 |
3791 |
3792 | Password
3793 |
3794 |
3795 |
3796 |
3797 |
3798 | 220
3799 | 70
3800 | 231
3801 | 41
3802 |
3803 |
3804 |
3805 |
3806 |
3807 |
3808 | 220
3809 | 170
3810 | 231
3811 | 41
3812 |
3813 |
3814 |
3815 |
3816 |
3817 |
3818 | 50
3819 | 210
3820 | 151
3821 | 31
3822 |
3823 |
3824 |
3825 | Periority
3826 |
3827 |
3828 |
3829 |
3830 |
3831 |
3832 |
3833 | Add User Permissions
3834 |
3835 |
3836 |
3837 |
3838 | 390
3839 | 50
3840 | 351
3841 | 41
3842 |
3843 |
3844 |
3845 |
3846 |
3847 |
3848 | 230
3849 | 50
3850 | 141
3851 | 41
3852 |
3853 |
3854 |
3855 |
3856 | 26
3857 |
3858 |
3859 |
3860 | Employee
3861 |
3862 |
3863 |
3864 |
3865 |
3866 | 700
3867 | 480
3868 | 191
3869 | 51
3870 |
3871 |
3872 |
3873 | Apply
3874 |
3875 |
3876 |
3877 |
3878 |
3879 | 790
3880 | 51
3881 | 113
3882 | 41
3883 |
3884 |
3885 |
3886 | Check
3887 |
3888 |
3889 |
3890 |
3891 |
3892 | 90
3893 | 130
3894 | 211
3895 | 291
3896 |
3897 |
3898 |
3899 | App Tabs
3900 |
3901 |
3902 |
3903 |
3904 | 50
3905 | 60
3906 | 91
3907 | 21
3908 |
3909 |
3910 |
3911 | Books
3912 |
3913 |
3914 |
3915 |
3916 |
3917 | 50
3918 | 90
3919 | 91
3920 | 21
3921 |
3922 |
3923 |
3924 | CLients
3925 |
3926 |
3927 |
3928 |
3929 |
3930 | 50
3931 | 120
3932 | 121
3933 | 21
3934 |
3935 |
3936 |
3937 | Dashboard
3938 |
3939 |
3940 |
3941 |
3942 |
3943 | 50
3944 | 150
3945 | 91
3946 | 21
3947 |
3948 |
3949 |
3950 | History
3951 |
3952 |
3953 |
3954 |
3955 |
3956 | 50
3957 | 180
3958 | 91
3959 | 21
3960 |
3961 |
3962 |
3963 | Reports
3964 |
3965 |
3966 |
3967 |
3968 |
3969 | 50
3970 | 210
3971 | 91
3972 | 21
3973 |
3974 |
3975 |
3976 | Settings
3977 |
3978 |
3979 |
3980 |
3981 |
3982 |
3983 | 320
3984 | 130
3985 | 211
3986 | 291
3987 |
3988 |
3989 |
3990 | Books
3991 |
3992 |
3993 |
3994 |
3995 | 50
3996 | 70
3997 | 121
3998 | 21
3999 |
4000 |
4001 |
4002 | Add Book
4003 |
4004 |
4005 |
4006 |
4007 |
4008 | 50
4009 | 100
4010 | 121
4011 | 21
4012 |
4013 |
4014 |
4015 | Edit Book
4016 |
4017 |
4018 |
4019 |
4020 |
4021 | 50
4022 | 130
4023 | 121
4024 | 21
4025 |
4026 |
4027 |
4028 | Delete Book
4029 |
4030 |
4031 |
4032 |
4033 |
4034 | 50
4035 | 160
4036 | 121
4037 | 21
4038 |
4039 |
4040 |
4041 | Import Book
4042 |
4043 |
4044 |
4045 |
4046 |
4047 | 50
4048 | 190
4049 | 121
4050 | 21
4051 |
4052 |
4053 |
4054 | Export Book
4055 |
4056 |
4057 |
4058 |
4059 |
4060 |
4061 | 550
4062 | 130
4063 | 211
4064 | 291
4065 |
4066 |
4067 |
4068 | Clients
4069 |
4070 |
4071 |
4072 |
4073 | 50
4074 | 70
4075 | 131
4076 | 21
4077 |
4078 |
4079 |
4080 | Add Client
4081 |
4082 |
4083 |
4084 |
4085 |
4086 | 50
4087 | 100
4088 | 121
4089 | 21
4090 |
4091 |
4092 |
4093 | Edit Client
4094 |
4095 |
4096 |
4097 |
4098 |
4099 | 50
4100 | 130
4101 | 151
4102 | 21
4103 |
4104 |
4105 |
4106 | Delete CLient
4107 |
4108 |
4109 |
4110 |
4111 |
4112 | 50
4113 | 160
4114 | 121
4115 | 21
4116 |
4117 |
4118 |
4119 | Import CLient
4120 |
4121 |
4122 |
4123 |
4124 |
4125 | 50
4126 | 190
4127 | 121
4128 | 21
4129 |
4130 |
4131 |
4132 | Export CLient
4133 |
4134 |
4135 |
4136 |
4137 |
4138 |
4139 | 780
4140 | 130
4141 | 211
4142 | 291
4143 |
4144 |
4145 |
4146 | Settings
4147 |
4148 |
4149 |
4150 |
4151 | 50
4152 | 70
4153 | 131
4154 | 21
4155 |
4156 |
4157 |
4158 | Add Branch
4159 |
4160 |
4161 |
4162 |
4163 |
4164 | 50
4165 | 100
4166 | 121
4167 | 21
4168 |
4169 |
4170 |
4171 | Add Publisher
4172 |
4173 |
4174 |
4175 |
4176 |
4177 | 50
4178 | 130
4179 | 151
4180 | 21
4181 |
4182 |
4183 |
4184 | Add Author
4185 |
4186 |
4187 |
4188 |
4189 |
4190 | 50
4191 | 160
4192 | 121
4193 | 21
4194 |
4195 |
4196 |
4197 | Add Category
4198 |
4199 |
4200 |
4201 |
4202 |
4203 | 50
4204 | 190
4205 | 121
4206 | 21
4207 |
4208 |
4209 |
4210 | Add Employee
4211 |
4212 |
4213 |
4214 |
4215 |
4216 | 50
4217 | 220
4218 | 121
4219 | 21
4220 |
4221 |
4222 |
4223 | Edit Employee
4224 |
4225 |
4226 |
4227 |
4228 |
4229 |
4230 | 290
4231 | 490
4232 | 181
4233 | 31
4234 |
4235 |
4236 |
4237 | Add User As Admin
4238 |
4239 |
4240 |
4241 |
4242 |
4243 | Admin Report
4244 |
4245 |
4246 |
4247 |
4248 | 380
4249 | 390
4250 | 321
4251 | 51
4252 |
4253 |
4254 |
4255 | Set Schedule
4256 |
4257 |
4258 |
4259 |
4260 |
4261 | 80
4262 | 90
4263 | 131
4264 | 41
4265 |
4266 |
4267 |
4268 | Enter Your Mail
4269 |
4270 |
4271 |
4272 |
4273 |
4274 | 240
4275 | 100
4276 | 421
4277 | 41
4278 |
4279 |
4280 |
4281 |
4282 |
4283 |
4284 | 90
4285 | 180
4286 | 101
4287 | 31
4288 |
4289 |
4290 |
4291 | Set Date
4292 |
4293 |
4294 |
4295 |
4296 |
4297 | 240
4298 | 180
4299 | 110
4300 | 31
4301 |
4302 |
4303 |
4304 |
4305 |
4306 |
4307 | 240
4308 | 230
4309 | 118
4310 | 31
4311 |
4312 |
4313 |
4314 |
4315 |
4316 |
4317 | 90
4318 | 230
4319 | 101
4320 | 31
4321 |
4322 |
4323 |
4324 | Set Time
4325 |
4326 |
4327 |
4328 |
4329 |
4330 | 240
4331 | 280
4332 | 171
4333 | 41
4334 |
4335 |
4336 | -
4337 |
4338 | -------------
4339 |
4340 |
4341 | -
4342 |
4343 | Daily
4344 |
4345 |
4346 | -
4347 |
4348 | Monthly
4349 |
4350 |
4351 | -
4352 |
4353 | Annualy
4354 |
4355 |
4356 |
4357 |
4358 |
4359 |
4360 | 90
4361 | 280
4362 | 91
4363 | 21
4364 |
4365 |
4366 |
4367 | Report Type
4368 |
4369 |
4370 |
4371 |
4372 |
4373 |
4374 |
4375 |
4376 | false
4377 |
4378 |
4379 |
4380 | 0
4381 | -20
4382 | 221
4383 | 721
4384 |
4385 |
4386 |
4387 |
4388 |
4389 |
4390 |
4391 | false
4392 |
4393 |
4394 |
4395 | 10
4396 | 470
4397 | 201
4398 | 71
4399 |
4400 |
4401 |
4402 |
4403 | -1
4404 |
4405 |
4406 |
4407 | Reports
4408 |
4409 |
4410 |
4411 | :/icons/reports.png:/icons/reports.png
4412 |
4413 |
4414 |
4415 | 30
4416 | 30
4417 |
4418 |
4419 |
4420 |
4421 |
4422 | false
4423 |
4424 |
4425 |
4426 | 10
4427 | 550
4428 | 201
4429 | 71
4430 |
4431 |
4432 |
4433 |
4434 | -1
4435 |
4436 |
4437 |
4438 | Settings
4439 |
4440 |
4441 |
4442 | :/icons/settings.png:/icons/settings.png
4443 |
4444 |
4445 |
4446 | 30
4447 | 30
4448 |
4449 |
4450 |
4451 |
4452 |
4453 | false
4454 |
4455 |
4456 |
4457 | 10
4458 | 230
4459 | 201
4460 | 71
4461 |
4462 |
4463 |
4464 |
4465 | -1
4466 |
4467 |
4468 |
4469 | Clients
4470 |
4471 |
4472 |
4473 | :/icons/person.png:/icons/person.png
4474 |
4475 |
4476 |
4477 | 30
4478 | 30
4479 |
4480 |
4481 |
4482 |
4483 |
4484 | false
4485 |
4486 |
4487 |
4488 | 10
4489 | 70
4490 | 201
4491 | 71
4492 |
4493 |
4494 |
4495 |
4496 | -1
4497 |
4498 |
4499 |
4500 |
4501 |
4502 |
4503 | Today
4504 |
4505 |
4506 |
4507 | :/icons/today.png:/icons/today.png
4508 |
4509 |
4510 |
4511 | 30
4512 | 30
4513 |
4514 |
4515 |
4516 |
4517 |
4518 | false
4519 |
4520 |
4521 |
4522 | 10
4523 | 390
4524 | 201
4525 | 71
4526 |
4527 |
4528 |
4529 |
4530 | -1
4531 |
4532 |
4533 |
4534 | History
4535 |
4536 |
4537 |
4538 | :/icons/history.png:/icons/history.png
4539 |
4540 |
4541 |
4542 | 30
4543 | 30
4544 |
4545 |
4546 |
4547 |
4548 |
4549 | false
4550 |
4551 |
4552 |
4553 | 10
4554 | 150
4555 | 201
4556 | 71
4557 |
4558 |
4559 |
4560 |
4561 | -1
4562 |
4563 |
4564 |
4565 | Books
4566 |
4567 |
4568 |
4569 | :/icons/books.png:/icons/books.png
4570 |
4571 |
4572 |
4573 | 30
4574 | 30
4575 |
4576 |
4577 |
4578 |
4579 |
4580 | false
4581 |
4582 |
4583 |
4584 | 10
4585 | 310
4586 | 201
4587 | 71
4588 |
4589 |
4590 |
4591 |
4592 | -1
4593 |
4594 |
4595 |
4596 | Dashboard
4597 |
4598 |
4599 |
4600 | :/icons/dashboard.png:/icons/dashboard.png
4601 |
4602 |
4603 |
4604 | 30
4605 | 30
4606 |
4607 |
4608 |
4609 |
4610 |
4611 |
4621 |
4622 |
4623 |
4624 |
4625 | PlotWidget
4626 | QWidget
4627 |
4628 | 1
4629 |
4630 |
4631 |
4632 |
4633 |
4634 |
4635 |
4636 |
--------------------------------------------------------------------------------
/outlint.txt:
--------------------------------------------------------------------------------
1 | - daily movement ---- (add operation- export excl , csv)
2 | - books ---- (add - edit - remove - all books - one book - search - export , import )
3 | - clients ---- (add - edit - export , import )
4 | - reports :
5 | - client ---- (one client , top 10) from - to - export
6 | - books ---- (one book , top 10 ) - export
7 | - monthly (default) ---- (export)
8 | - from - to
9 |
10 | - history (admin) - ---- actions [daily movement] - filter (time , book , client )
11 | - dashboard - ---- today actions
12 | - settings (user - permssions , gmail , branch)
13 |
14 |
15 | - users [admin , employee]
16 | - permission (before actions)
17 | - employee periority
18 |
19 |
20 |
21 | ---------------------
22 | operation :
23 | - datetime
24 | - branch
25 | - user
26 |
27 |
28 | --------------------------------------------------------
29 | - books :
30 | - title
31 | - description
32 | - category
33 | - code
34 | - parts *
35 | - part_order
36 | - price
37 | - publisher
38 | - author
39 | - image *
40 | - status
41 | - date
42 |
43 | - clients :
44 | - name
45 | - mail
46 | - phone
47 | - date
48 | - national_id
49 |
50 |
51 | - employee : --
52 | - name
53 | - email
54 | - phone
55 | - date
56 | - national_id
57 | - periority
58 |
59 | - permissions
60 |
61 |
62 | - category :
63 | - category_name
64 | - parent_category
65 |
66 |
67 | - Branch :
68 | - name
69 | - code
70 | - location
71 |
72 |
73 | - daily_movements :
74 | - book
75 | - client
76 | - type [rent - retrieve]
77 | - date
78 | - branch
79 | - from to
80 | - employee
81 |
82 |
83 | - history : --
84 | - employee
85 | - action
86 | - table
87 | - date
88 | - branch
89 |
90 |
91 |
92 | - publisher
93 |
94 |
95 |
96 | - author
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | - sort on retrieve
105 | - sound
106 | - changed field *
107 |
108 |
109 |
110 | - calender
111 | - category order
112 |
113 | - daily movements - real data
114 | - search books with title & category
115 | - search for similarites
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
--------------------------------------------------------------------------------
/people.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Pythondeveloper6/Library-System-Python-PyQt5/28971eb5232d2f42de12fb396abacda12b4d3c65/people.db
--------------------------------------------------------------------------------
/test.py:
--------------------------------------------------------------------------------
1 | from peewee import *
2 | import datetime
3 |
4 | db = MySQLDatabase('lb', user='root', password='toor',
5 | host='localhost', port=3306)
6 |
7 | class Category(Model):
8 | category_name = CharField(unique=True)
9 | # parent_category = ForeignKeyField('Category.id ', backref='parent_category' , null=True)
10 |
11 | class Meta:
12 | database = db
13 |
14 |
15 | class Publisher(Model):
16 | name = CharField(unique=True)
17 | Location = CharField(null=True)
18 |
19 | class Meta:
20 | database = db
21 |
22 | class Author(Model):
23 | name = CharField(unique=True)
24 | Location = CharField(null=True)
25 |
26 | class Meta:
27 | database = db
28 |
29 |
30 | STATUS_CHOICES = (
31 | (0, 'Draft'),
32 | (1, 'Published'),
33 | (9, 'Deleted'))
34 |
35 |
36 | class Books(Model):
37 | title = CharField(unique=True)
38 | description = TextField(null=True)
39 | category = ForeignKeyField(Category , backref='category' , null=True)
40 | code = CharField(null=True)
41 | barcode = CharField()
42 | # parts *
43 | part_order = IntegerField(null=True)
44 | price = DecimalField(null=True)
45 | publisher = ForeignKeyField(Publisher , backref='publisher' , null=True)
46 | author = ForeignKeyField(Author , backref='book_author' , null=True)
47 | image = CharField(null=True)
48 | status = CharField(choices=STATUS_CHOICES) # Choices
49 | date = DateTimeField(default=datetime.datetime.now)
50 |
51 | class Meta:
52 | database = db
53 |
54 |
55 | class Clients(Model):
56 | name = CharField()
57 | mail = CharField(null=True , unique=True)
58 | phone = CharField(null=True)
59 | date = DateTimeField(default=datetime.datetime.now)
60 | national_id = IntegerField(null=True , unique=True)
61 |
62 | class Meta:
63 | database = db
64 |
65 |
66 | class Employee(Model):
67 | name = CharField()
68 | mail = CharField(null=True , unique=True)
69 | phone = CharField(null=True)
70 | date = DateTimeField(default=datetime.datetime.now)
71 | national_id = IntegerField(null=True , unique=True)
72 | Periority = IntegerField(null=True)
73 |
74 | class Meta:
75 | database = db
76 |
77 |
78 | class Branch(Model):
79 | name = CharField()
80 | code = CharField(null=True , unique=True)
81 | location = CharField(null=True)
82 |
83 | class Meta:
84 | database = db
85 |
86 | class Daily_Movements(Model):
87 | book = ForeignKeyField(Books , backref='daily_book')
88 | client = ForeignKeyField(Clients , backref='book_client')
89 | type = CharField() #[rent - retrieve]
90 | date = DateTimeField(default=datetime.datetime.now)
91 | branch = ForeignKeyField(Branch , backref='Daily_branch' , null=True)
92 | Book_from = DateField(null=True)
93 | Book_to = DateField(null=True)
94 | employee = ForeignKeyField(Employee , backref='Daily_employee' , null=True)
95 |
96 | class Meta:
97 | database = db
98 |
99 | class History(Model):
100 | employee = ForeignKeyField(Employee , backref='History_employee')
101 | action = CharField() # Choices
102 | table = CharField() # Choices
103 | date = DateTimeField(default=datetime.datetime.now)
104 | branch = ForeignKeyField(Branch , backref='history_branch')
105 |
106 | class Meta:
107 | database = db
108 |
109 |
110 |
111 | db.connect()
112 | db.create_tables([Author ,Category,Publisher,Branch , Books , Clients , Employee , Daily_Movements , History ])
--------------------------------------------------------------------------------