Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
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
|
419 |
-
FROM sales
|
420 |
-
|
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.
|
433 |
''', (sale_id,))
|
434 |
-
sale_details = c.
|
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 |
-
|
609 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
633 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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:
|