From efb6f1579411d601a3e2103ed72eaf5401929964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=91=D1=83=D1=80?= =?UTF-8?q?=D1=83=D0=BB=D0=B5=D0=B2?= Date: Wed, 5 Nov 2025 10:03:07 +0000 Subject: [PATCH] Upload New File --- main_flask.py | 261 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 main_flask.py diff --git a/main_flask.py b/main_flask.py new file mode 100644 index 0000000..2a652db --- /dev/null +++ b/main_flask.py @@ -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/', 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/', 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/') +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/') +def static_files(filename): + return send_from_directory(app.root_path + '/static', filename) + + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file