Aleksmorshen commited on
Commit
7062c9d
·
verified ·
1 Parent(s): 6e88aef

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -317
app.py CHANGED
@@ -47,302 +47,7 @@ conn.commit()
47
  c.execute('''
48
  CREATE TABLE IF NOT EXISTS sales (
49
  id INTEGER PRIMARY KEY AUTOINCREMENT,
50
- product_id INTEGER NOT NULL,
51
- quantity INTEGER NOT NULL,
52
- sale_date DATE NOT NULL,
53
- FOREIGN KEY(product_id) REFERENCES products(id)
54
- )
55
- ''')
56
- conn.commit()
57
-
58
- # Функция для генерации случайного 13-значного токена
59
- def generate_token():
60
- return ''.join(random.choices(string.ascii_letters + string.digits, k=13))
61
-
62
- # Функция для получения идентификатора пользователя по токену
63
- def get_user_id_by_token(token):
64
- c.execute("SELECT id FROM users WHERE token=?", (token,))
65
- user = c.fetchone()
66
- return user[0] if user else None
67
-
68
- # Функция для получения товаров из корзины
69
- def get_cart_summary(user_id):
70
- c.execute('''
71
- SELECT p.name, c.quantity, p.sale_price, c.quantity * p.sale_price
72
- FROM cart c
73
- JOIN products p ON c.product_id = p.id
74
- WHERE p.user_id = ?
75
- ''', (user_id,))
76
- items = c.fetchall()
77
- total_quantity = sum(item[1] for item in items)
78
- total_price = sum(item[3] for item in items)
79
- return items, total_quantity, total_price
80
-
81
- # Функция для добавления продажи в отчет
82
- def record_sales():
83
- c.execute('''
84
- SELECT product_id, quantity FROM cart
85
- ''')
86
- cart_items = c.fetchall()
87
- for product_id, quantity in cart_items:
88
- c.execute('''
89
- INSERT INTO sales (product_id, quantity, sale_date)
90
- VALUES (?, ?, ?)
91
- ''', (product_id, quantity, datetime.now(pytz.timezone('Asia/Bishkek')).strftime('%Y-%m-%d %H:%M:%S')))
92
- c.execute('DELETE FROM cart')
93
- conn.commit()
94
-
95
- # Функция для генерации отчета за месяц
96
- def generate_monthly_report():
97
- start_date = (datetime.now().replace(day=1)).strftime('%Y-%m-%d')
98
- end_date = (datetime.now() + timedelta(days=31)).replace(day=1).strftime('%Y-%m-%d')
99
-
100
- c.execute('''
101
- SELECT p.name, SUM(s.quantity) AS total_quantity, p.sale_price, SUM(s.quantity) * p.sale_price AS total_sales,
102
- SUM(s.quantity) * (p.sale_price - p.purchase_price) AS profit
103
- FROM sales s
104
- JOIN products p ON s.product_id = p.id
105
- WHERE s.sale_date BETWEEN ? AND ?
106
- GROUP BY p.id
107
- ''', (start_date, end_date))
108
- sales_data = c.fetchall()
109
-
110
- # Расчёт общей суммы продаж и прибыли
111
- total_sales = sum(item[3] for item in sales_data)
112
- total_profit = sum(item[4] for item in sales_data)
113
-
114
- return sales_data, total_sales, total_profit
115
-
116
- # Функция для получения всех сделок
117
- def get_all_sales():
118
- c.execute('''
119
- SELECT s.id, p.name, s.quantity, s.sale_date
120
- FROM sales s
121
- JOIN products p ON s.product_id = p.id
122
- ORDER BY s.sale_date DESC
123
- ''')
124
- sales_data = c.fetchall()
125
- return sales_data
126
-
127
- # Страница регистрации
128
- def register():
129
- st.title('Регистрация')
130
- username = st.text_input("Введите ваше имя пользователя")
131
- admin_password = st.text_input("Введите пароль администратора", type="password")
132
-
133
- if st.button("Зарегистрироваться"):
134
- if admin_password == "1234":
135
- token = generate_token()
136
- try:
137
- c.execute("INSERT INTO users (username, token) VALUES (?, ?)", (username, token))
138
- conn.commit()
139
- st.success(f"Регистрация успешна! Ваш токен: {token}")
140
- except sqlite3.IntegrityError:
141
- st.error("Это имя пользователя уже занято. Попробуйте другое.")
142
- else:
143
- st.error("Неверный пароль администратора!")
144
-
145
- # Страница авторизации
146
- def login():
147
- st.title('Авторизация')
148
- token_input = st.text_input("Введите ваш токен")
149
-
150
- if st.button("Войти"):
151
- user_id = get_user_id_by_token(token_input)
152
- if user_id:
153
- st.session_state.logged_in = True # Устанавливаем состояние авторизации
154
- st.session_state.username = token_input
155
- st.session_state.user_id = user_id
156
- st.success("Добро пожаловать!")
157
- else:
158
- st.error("Неверный токен!")
159
-
160
- # Форма добавления товара
161
- def add_product():
162
- st.title("Добавление товара")
163
- product_name = st.text_input("Название товара").strip().lower() # Преобразование в нижний регистр
164
- product_description = st.text_area("Описание товара")
165
- purchase_price = st.number_input("Приходная цена", min_value=0.0, step=0.01) # Запрос приходной цены
166
- sale_price = st.number_input("От��ускная цена", min_value=0.0, step=0.01) # Запрос отпускной цены
167
- product_quantity = st.number_input("Количество на складе", min_value=0, step=1)
168
-
169
- if st.button("Добавить товар"):
170
- if product_name and sale_price:
171
- c.execute("INSERT INTO products (name, description, purchase_price, sale_price, quantity_in_stock, user_id) VALUES (?, ?, ?, ?, ?, ?)",
172
- (product_name, product_description, purchase_price, sale_price, product_quantity, st.session_state.user_id))
173
- conn.commit()
174
- st.success("Товар успешно добавлен!")
175
- else:
176
- st.error("Пожалуйста, введите все обязательные данные.")
177
-
178
- # Форма редактирования и удаления товара
179
- def edit_products():
180
- st.title("Редактирование товара")
181
- products = c.execute("SELECT id, name, description, purchase_price, sale_price, quantity_in_stock FROM products WHERE user_id=?",
182
- (st.session_state.user_id,)).fetchall()
183
-
184
- if products:
185
- product_names = [p[1] for p in products]
186
- product_id = st.selectbox("Выберите товар", product_names)
187
- product = next(p for p in products if p[1] == product_id)
188
-
189
- new_name = st.text_input("Новое название товара", product[1])
190
- new_description = st.text_area("Новое описание товара", product[2])
191
- new_purchase_price = st.number_input("Новая приходная цена", min_value=0.0, step=0.01, value=product[3])
192
- new_sale_price = st.number_input("Новая отпускная цена", min_value=0.0, step=0.01, value=product[4])
193
- new_quantity_in_stock = st.number_input("Новое количество на складе", min_value=0, step=1, value=product[5])
194
-
195
- if st.button("Сохранить изменения"):
196
- c.execute("UPDATE products SET name=?, description=?, purchase_price=?, sale_price=?, quantity_in_stock=? WHERE id=?",
197
- (new_name, new_description, new_purchase_price, new_sale_price, new_quantity_in_stock, product[0]))
198
- conn.commit()
199
- st.success("Изменения успешно сохранены!")
200
-
201
- if st.button("Удалить товар"):
202
- c.execute("DELETE FROM products WHERE id=?", (product[0],))
203
- c.execute("DELETE FROM cart WHERE product_id=?", (product[0],)) # Удаляем товар из корзины, если он там есть
204
- conn.commit()
205
- st.success("Товар успешно удалён!")
206
- else:
207
- st.info("Нет товаров для редактирования.")
208
-
209
- # Форма для добавления и удаления товара в корзину с поиском
210
- def add_to_cart():
211
- st.title("Отпуск товара")
212
-
213
- search_term = st.text_input("Поиск товара").strip().lower() # Преобразуем ввод в нижний регистр
214
-
215
- # Поиск товаров по ключевому слову (без учета регистра)
216
- c.execute("SELECT id, name, sale_price, quantity_in_stock FROM products WHERE user_id=? AND LOWER(name) LIKE ?",
217
- (st.session_state.user_id, f"%{search_term}%"))
218
- products = c.fetchall()
219
-
220
- if products:
221
- product_list = []
222
- for product in products:
223
- cols = st.columns(4)
224
- with cols[0]:
225
- st.write(product[1]) # Название товара
226
-
227
- with cols[1]:
228
- quantity = st.number_input(f"Количество для '{product[1]}'", min_value=1, max_value=product[3], key=f"quantity_{product[0]}")
229
-
230
- with cols[2]:
231
- add_button = st.button(f"Добавить в корзину", key=f"add_{product[0]}")
232
-
233
- if add_button:
234
- if quantity <= product[3]:
235
- # Обработка добавления товара в корзину
236
- c.execute('''
237
- INSERT INTO cart (product_id, quantity)
238
- VALUES (?, ?)
239
- ON CONFLICT(product_id)
240
- DO UPDATE SET quantity = quantity + excluded.quantity
241
- ''', (product[0], quantity))
242
-
243
- # Уменьшаем количество на складе
244
- c.execute("UPDATE products SET quantity_in_stock = quantity_in_stock - ? WHERE id=?",
245
- (quantity, product[0]))
246
- conn.commit()
247
- st.success(f"Товар '{product[1]}' успешно добавлен в корзину!")
248
- else:
249
- st.error(f"Недостаточн��е количество товара '{product[1]}' на складе!")
250
-
251
- with cols[3]:
252
- remove_button = st.button(f"Удалить из корзины", key=f"remove_{product[0]}")
253
-
254
- if remove_button:
255
- if quantity > 0:
256
- # Обработка удаления товара из корзины
257
- current_quantity = c.execute("SELECT quantity FROM cart WHERE product_id=?", (product[0],)).fetchone()
258
- if current_quantity:
259
- new_quantity = current_quantity[0] - quantity
260
- if new_quantity > 0:
261
- c.execute('''
262
- INSERT INTO cart (product_id, quantity)
263
- VALUES (?, ?)
264
- ON CONFLICT(product_id)
265
- DO UPDATE SET quantity = excluded.quantity
266
- ''', (product[0], new_quantity))
267
- else:
268
- c.execute("DELETE FROM cart WHERE product_id=?", (product[0],))
269
-
270
- # Увеличиваем количество на складе
271
- c.execute("UPDATE products SET quantity_in_stock = quantity_in_stock + ? WHERE id=?",
272
- (quantity, product[0]))
273
- conn.commit()
274
- st.success(f"Товар '{product[1]}' успешно удалён из корзины!")
275
- else:
276
- st.error(f"Товар '{product[1]}' не найден в корзине.")
277
- else:
278
- st.error(f"Введите количество для удаления товара '{product[1]}'.")
279
-
280
- # Отображение состояния корзины
281
- st.subheader("Состояние корзины")
282
- items, total_quantity, total_price = get_cart_summary(st.session_state.user_id)
283
-
284
- if items:
285
- # Создание DataFrame для таблицы
286
- df = pd.DataFrame(items, columns=["Название", "Количество", "Цена за единицу", "Итого"])
287
- st.dataframe(df.style.format({"Цена за единицу": "{:.2f}", "Итого": "{:.2f}"}), use_container_width=True)
288
-
289
- st.write(f"Общее количество: {total_quantity}, Общая стоимость: {total_price:.2f}")
290
-
291
- # Добавляем кнопку "Пробить" для оформления продажи
292
- if st.button("Пробить"):
293
- record_sales()
294
- st.success("Корзина успешно пробита! Все товары добавлены в отчет и корзина очищена.")
295
-
296
- # Кнопка для отображения сделок
297
- import streamlit as st
298
- import pandas as pd
299
- import sqlite3
300
- import random
301
- import string
302
- from datetime import datetime, timedelta
303
- import pytz
304
-
305
- # Подключение к базе данных SQLite3
306
- conn = sqlite3.connect('auth_system.db', check_same_thread=False)
307
- c = conn.cursor()
308
-
309
- # Создание таблиц, если они не существуют
310
- c.execute('''
311
- CREATE TABLE IF NOT EXISTS users (
312
- id INTEGER PRIMARY KEY AUTOINCREMENT,
313
- username TEXT NOT NULL UNIQUE,
314
- token TEXT NOT NULL
315
- )
316
- ''')
317
- conn.commit()
318
-
319
- c.execute('''
320
- CREATE TABLE IF NOT EXISTS products (
321
- id INTEGER PRIMARY KEY AUTOINCREMENT,
322
- name TEXT NOT NULL,
323
- description TEXT,
324
- purchase_price REAL NOT NULL,
325
- sale_price REAL NOT NULL,
326
- quantity_in_stock INTEGER NOT NULL DEFAULT 0,
327
- user_id INTEGER NOT NULL,
328
- FOREIGN KEY(user_id) REFERENCES users(id)
329
- )
330
- ''')
331
- conn.commit()
332
-
333
- c.execute('''
334
- CREATE TABLE IF NOT EXISTS cart (
335
- id INTEGER PRIMARY KEY AUTOINCREMENT,
336
- product_id INTEGER NOT NULL,
337
- quantity INTEGER NOT NULL,
338
- UNIQUE(product_id)
339
- )
340
- ''')
341
- conn.commit()
342
-
343
- c.execute('''
344
- CREATE TABLE IF NOT EXISTS sales (
345
- id INTEGER PRIMARY KEY AUTOINCREMENT,
346
  product_id INTEGER NOT NULL,
347
  quantity INTEGER NOT NULL,
348
  sale_date TIMESTAMP NOT NULL,
@@ -377,19 +82,22 @@ def get_cart_summary(user_id):
377
  # Функция для добавления продажи в отчет
378
  def record_sales():
379
  sales_details = []
 
 
 
380
  c.execute('SELECT product_id, quantity FROM cart')
381
  cart_items = c.fetchall()
 
382
  for product_id, quantity in cart_items:
383
- sale_date = datetime.now(pytz.timezone('Asia/Bishkek')).strftime('%Y-%m-%d %H:%M:%S')
384
  c.execute('''
385
- INSERT INTO sales (product_id, quantity, sale_date)
386
- VALUES (?, ?, ?)
387
- ''', (product_id, quantity, sale_date))
388
  sales_details.append((product_id, quantity, sale_date))
389
 
390
  c.execute('DELETE FROM cart')
391
  conn.commit()
392
- return sales_details
393
 
394
  # Функция для генерации отчета за месяц
395
  def generate_monthly_report():
@@ -415,10 +123,9 @@ def generate_monthly_report():
415
  # Функция для получения всех сделок
416
  def get_all_sales():
417
  c.execute('''
418
- SELECT s.id, p.name, s.quantity, s.sale_date
419
- FROM sales s
420
- JOIN products p ON s.product_id = p.id
421
- ORDER BY s.sale_date DESC
422
  ''')
423
  sales_data = c.fetchall()
424
  return sales_data
@@ -429,9 +136,9 @@ def get_sale_details(sale_id):
429
  SELECT p.name, s.quantity, p.sale_price, s.sale_date
430
  FROM sales s
431
  JOIN products p ON s.product_id = p.id
432
- WHERE s.id = ?
433
  ''', (sale_id,))
434
- sale_details = c.fetchone()
435
  return sale_details
436
 
437
  # Страница регистрации
@@ -510,13 +217,10 @@ def edit_products():
510
 
511
  if st.button("Удалить товар"):
512
  c.execute("DELETE FROM products WHERE id=?", (product[0],))
513
- c.execute("DELETE FROM cart WHERE product_id=?", (product[0],)) # Удаляем товар из корзины, если он там есть
514
  conn.commit()
515
- st.success("Товар успешно удалён!")
516
- else:
517
- st.info("Нет товаров для редактирования.")
518
 
519
- # Форма для добавления и удаления товара в корзину с поиском по названию
520
  def add_to_cart():
521
  st.title("Отпуск товара")
522
  products = c.execute("SELECT id, name, sale_price, quantity_in_stock FROM products WHERE user_id=?",
@@ -594,7 +298,7 @@ def add_to_cart():
594
 
595
  # Добавляем кнопку "Пробить" для оформления продажи
596
  if st.button("Пробить"):
597
- sales_details = record_sales()
598
  if sales_details:
599
  st.write("**Детали сделок:**")
600
  sale_details_df = pd.DataFrame(sales_details, columns=["ID товара", "Количество", "Дата и время"])
@@ -605,8 +309,15 @@ def add_to_cart():
605
  if st.button("Сделки"):
606
  sales_data = get_all_sales()
607
  if sales_data:
608
- df_sales = pd.DataFrame(sales_data, columns=["ID", "Название товара", "Количество", "Дата и время"])
609
- st.dataframe(df_sales.style.format({"Дата и время": lambda x: pd.to_datetime(x).strftime('%d-%m-%Y %H:%M:%S')}), use_container_width=True)
 
 
 
 
 
 
 
610
  else:
611
  st.info("Нет сделок для отображения.")
612
  else:
@@ -629,8 +340,15 @@ def monthly_report():
629
  if st.button("Сделки"):
630
  sales_data = get_all_sales()
631
  if sales_data:
632
- df_sales = pd.DataFrame(sales_data, columns=["ID", "Название товара", "Количество", "Дата и время"])
633
- st.dataframe(df_sales.style.format({"Дата и время": lambda x: pd.to_datetime(x).strftime('%d-%m-%Y %H:%M:%S')}), use_container_width=True)
 
 
 
 
 
 
 
634
  else:
635
  st.info("Нет сделок для отображения.")
636
  else:
 
47
  c.execute('''
48
  CREATE TABLE IF NOT EXISTS sales (
49
  id INTEGER PRIMARY KEY AUTOINCREMENT,
50
+ sale_id TEXT NOT NULL,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  product_id INTEGER NOT NULL,
52
  quantity INTEGER NOT NULL,
53
  sale_date TIMESTAMP NOT NULL,
 
82
  # Функция для добавления продажи в отчет
83
  def record_sales():
84
  sales_details = []
85
+ sale_id = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) # Уникальный идентификатор сделки
86
+ sale_date = datetime.now(pytz.timezone('Asia/Bishkek')).strftime('%Y-%m-%d %H:%M:%S')
87
+
88
  c.execute('SELECT product_id, quantity FROM cart')
89
  cart_items = c.fetchall()
90
+
91
  for product_id, quantity in cart_items:
 
92
  c.execute('''
93
+ INSERT INTO sales (sale_id, product_id, quantity, sale_date)
94
+ VALUES (?, ?, ?, ?)
95
+ ''', (sale_id, product_id, quantity, sale_date))
96
  sales_details.append((product_id, quantity, sale_date))
97
 
98
  c.execute('DELETE FROM cart')
99
  conn.commit()
100
+ return sales_details, sale_id
101
 
102
  # Функция для генерации отчета за месяц
103
  def generate_monthly_report():
 
123
  # Функция для получения всех сделок
124
  def get_all_sales():
125
  c.execute('''
126
+ SELECT DISTINCT sale_id, sale_date
127
+ FROM sales
128
+ ORDER BY sale_date DESC
 
129
  ''')
130
  sales_data = c.fetchall()
131
  return sales_data
 
136
  SELECT p.name, s.quantity, p.sale_price, s.sale_date
137
  FROM sales s
138
  JOIN products p ON s.product_id = p.id
139
+ WHERE s.sale_id = ?
140
  ''', (sale_id,))
141
+ sale_details = c.fetchall()
142
  return sale_details
143
 
144
  # Страница регистрации
 
217
 
218
  if st.button("Удалить товар"):
219
  c.execute("DELETE FROM products WHERE id=?", (product[0],))
 
220
  conn.commit()
221
+ st.success("Товар успешно удален!")
 
 
222
 
223
+ # Форма отпуска товара
224
  def add_to_cart():
225
  st.title("Отпуск товара")
226
  products = c.execute("SELECT id, name, sale_price, quantity_in_stock FROM products WHERE user_id=?",
 
298
 
299
  # Добавляем кнопку "Пробить" для оформления продажи
300
  if st.button("Пробить"):
301
+ sales_details, sale_id = record_sales()
302
  if sales_details:
303
  st.write("**Детали сделок:**")
304
  sale_details_df = pd.DataFrame(sales_details, columns=["ID товара", "Количество", "Дата и время"])
 
309
  if st.button("Сделки"):
310
  sales_data = get_all_sales()
311
  if sales_data:
312
+ sale_ids = [sale[0] for sale in sales_data]
313
+ for sale_id in sale_ids:
314
+ st.write(f"**Сделка ID:** {sale_id} ({next(sale for sale in sales_data if sale[0] == sale_id)[1]})")
315
+ sale_details = get_sale_details(sale_id)
316
+ if sale_details:
317
+ df_sales = pd.DataFrame(sale_details, columns=["Название товара", "Количество", "Цена за единицу", "Дата и время"])
318
+ st.dataframe(df_sales.style.format({"Дата и время": lambda x: pd.to_datetime(x).strftime('%d-%m-%Y %H:%M:%S')}), use_container_width=True)
319
+ else:
320
+ st.info("Нет деталей для отображения.")
321
  else:
322
  st.info("Нет сделок для отображения.")
323
  else:
 
340
  if st.button("Сделки"):
341
  sales_data = get_all_sales()
342
  if sales_data:
343
+ sale_ids = [sale[0] for sale in sales_data]
344
+ for sale_id in sale_ids:
345
+ st.write(f"**Сделка ID:** {sale_id} ({next(sale for sale in sales_data if sale[0] == sale_id)[1]})")
346
+ sale_details = get_sale_details(sale_id)
347
+ if sale_details:
348
+ df_sales = pd.DataFrame(sale_details, columns=["Название товара", "Количество", "Цена за единицу", "Дата и время"])
349
+ st.dataframe(df_sales.style.format({"Дата и время": lambda x: pd.to_datetime(x).strftime('%d-%m-%Y %H:%M:%S')}), use_container_width=True)
350
+ else:
351
+ st.info("Нет деталей для отображения.")
352
  else:
353
  st.info("Нет сделок для отображения.")
354
  else: