Upload New File

This commit is contained in:
parent 28db699514
commit 6079b1dda0

261
main_flask.py Normal file
View file

@ -0,0 +1,261 @@
from flask import Flask, render_template, send_from_directory, request, redirect, url_for, flash
import sqlite3
import os
from datetime import datetime
app = Flask(__name__)
app.secret_key = 'my_secret_key_12345'
def get_db_connection():
conn = sqlite3.connect('partners.db')
conn.row_factory = sqlite3.Row
return conn
def calculate_discount(total_quantity):
"""Рассчитывает скидку на основе общего количества проданной продукции"""
if total_quantity >= 300000:
return 15, '15% (более 300000 ед.)'
elif total_quantity >= 50000:
return 10, '10% (50000-300000 ед.)'
elif total_quantity >= 10000:
return 5, '5% (10000-50000 ед.)'
else:
return 0, '0% (до 10000 ед.)'
@app.route('/')
def index():
conn = get_db_connection()
partners = conn.execute('''
SELECT p.*, pt.type_name as partner_type_name,
COALESCE(SUM(s.quantity), 0) as total_quantity,
COALESCE(SUM(s.quantity * s.sale_price), 0) as total_sales
FROM Partner p
LEFT JOIN PartnerType pt ON p.partner_type_id = pt.id
LEFT JOIN Sale s ON p.id = s.partner_id
GROUP BY p.id
ORDER BY total_quantity DESC
''').fetchall()
partners_with_discount = []
for partner in partners:
total_quantity = partner['total_quantity'] or 0
discount_percent, discount_text = calculate_discount(total_quantity)
partner_dict = dict(partner)
partner_dict['total_quantity'] = total_quantity
partner_dict['total_sales'] = partner['total_sales'] or 0
partner_dict['discount_percent'] = discount_percent
partner_dict['discount_text'] = discount_text
partners_with_discount.append(partner_dict)
conn.close()
return render_template('index.html', partners=partners_with_discount)
@app.route('/add_sale/<int:partner_id>', methods=['GET', 'POST'])
def add_sale(partner_id):
if request.method == 'POST':
try:
product_id = request.form['product_id']
quantity = request.form['quantity']
sale_price = request.form['sale_price']
sale_date = request.form['sale_date']
conn = get_db_connection()
conn.execute('''
INSERT INTO Sale (product_id, partner_id, quantity, sale_price, sale_date)
VALUES (?, ?, ?, ?, ?)
''', (product_id, partner_id, quantity, sale_price, sale_date))
conn.commit()
conn.close()
flash('Продажа успешно добавлена!', 'success')
return redirect(url_for('sales_history', partner_id=partner_id))
except Exception as e:
flash(f'Ошибка при добавлении продажи: {str(e)}', 'error')
return redirect(url_for('add_sale', partner_id=partner_id))
# GET запрос - показываем форму
conn = get_db_connection()
partner = conn.execute('''
SELECT p.*, pt.type_name as partner_type_name
FROM Partner p
LEFT JOIN PartnerType pt ON p.partner_type_id = pt.id
WHERE p.id = ?
''', (partner_id,)).fetchone()
products = conn.execute('''
SELECT p.*, pt.type_name as product_type_name
FROM Product p
LEFT JOIN ProductType pt ON p.product_type_id = pt.id
ORDER BY p.product_name
''').fetchall()
conn.close()
if not partner:
flash('Партнер не найден', 'error')
return redirect(url_for('index'))
today = datetime.now().strftime('%Y-%m-%d')
return render_template('add_sale.html', partner=partner, products=products, today=today)
@app.route('/edit_partner/<int:partner_id>', methods=['GET', 'POST'])
def edit_partner(partner_id):
conn = get_db_connection()
if request.method == 'POST':
try:
name = request.form['name']
director = request.form.get('director', '')
email = request.form['email']
phone = request.form.get('phone', '')
legal_address = request.form.get('legal_address', '')
inn = request.form.get('inn', '')
partner_type_id = request.form['partner_type_id']
rating = request.form.get('rating', 0.0)
# Проверяем уникальность ИНН (исключая текущего партнера)
if inn:
existing = conn.execute(
'SELECT id FROM Partner WHERE inn = ? AND id != ?',
(inn, partner_id)
).fetchone()
if existing:
flash('Партнер с таким ИНН уже существует', 'error')
conn.close()
return redirect(url_for('edit_partner', partner_id=partner_id))
# Обновляем данные партнера
conn.execute('''
UPDATE Partner
SET name = ?, director = ?, email = ?, phone = ?,
legal_address = ?, inn = ?, partner_type_id = ?, rating = ?
WHERE id = ?
''', (name, director, email, phone, legal_address, inn, partner_type_id, rating, partner_id))
conn.commit()
conn.close()
flash('Данные партнера успешно обновлены!', 'success')
return redirect(url_for('index'))
except Exception as e:
flash(f'Ошибка при обновлении данных: {str(e)}', 'error')
conn.close()
return redirect(url_for('edit_partner', partner_id=partner_id))
# GET запрос - показываем форму редактирования
partner = conn.execute('''
SELECT p.*, pt.type_name as partner_type_name
FROM Partner p
LEFT JOIN PartnerType pt ON p.partner_type_id = pt.id
WHERE p.id = ?
''', (partner_id,)).fetchone()
partner_types = conn.execute('SELECT * FROM PartnerType ORDER BY type_name').fetchall()
conn.close()
if not partner:
flash('Партнер не найден', 'error')
return redirect(url_for('index'))
return render_template('edit_partner.html', partner=partner, partner_types=partner_types)
@app.route('/add_partner', methods=['GET', 'POST'])
def add_partner():
if request.method == 'POST':
# Получаем данные из формы
name = request.form['name']
director = request.form.get('director', '')
email = request.form['email']
phone = request.form.get('phone', '')
legal_address = request.form.get('legal_address', '')
inn = request.form.get('inn', '')
partner_type_id = request.form['partner_type_id']
rating = request.form.get('rating', 0.0)
try:
conn = get_db_connection()
conn.execute('''
INSERT INTO Partner (name, director, email, phone, legal_address, inn, partner_type_id, rating)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (name, director, email, phone, legal_address, inn, partner_type_id, rating))
conn.commit()
conn.close()
flash('Партнер успешно добавлен!', 'success')
return redirect(url_for('index'))
except Exception as e:
flash(f'Ошибка при добавлении партнера: {str(e)}', 'error')
return redirect(url_for('add_partner'))
# GET запрос - показываем форму
conn = get_db_connection()
partner_types = conn.execute('SELECT * FROM PartnerType').fetchall()
conn.close()
return render_template('add_partner.html', partner_types=partner_types)
@app.route('/sales_history/<int:partner_id>')
def sales_history(partner_id):
conn = get_db_connection()
partner = conn.execute('''
SELECT p.*, pt.type_name as partner_type_name
FROM Partner p
LEFT JOIN PartnerType pt ON p.partner_type_id = pt.id
WHERE p.id = ?
''', (partner_id,)).fetchone()
# Получаем историю продаж (исправлено: product_name вместо name)
sales = conn.execute('''
SELECT
s.*,
pr.product_name as product_name,
pr.article as product_article,
pt.type_name as product_type_name
FROM Sale s
LEFT JOIN Product pr ON s.product_id = pr.id
LEFT JOIN ProductType pt ON pr.product_type_id = pt.id
WHERE s.partner_id = ?
ORDER BY s.sale_date DESC, s.created_at DESC
''', (partner_id,)).fetchall()
# Считаем общую статистику
total_stats = conn.execute('''
SELECT
COUNT(*) as total_sales,
SUM(s.quantity) as total_quantity,
SUM(s.quantity * s.sale_price) as total_amount,
AVG(s.sale_price) as avg_price
FROM Sale s
WHERE s.partner_id = ?
''', (partner_id,)).fetchone()
conn.close()
return render_template('sales_history.html',
partner=partner,
sales=sales,
total_stats=total_stats)
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.route('/static/<path:filename>')
def static_files(filename):
return send_from_directory(app.root_path + '/static', filename)
if __name__ == '__main__':
app.run(debug=True)