aaaa
This commit is contained in:
parent
ae8100450b
commit
7361211306
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
7
.idea/misc.xml
Normal file
7
.idea/misc.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
||||||
|
<component name="PyCharmProfessionalAdvertiser">
|
||||||
|
<option name="shown" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/salim_project.iml" filepath="$PROJECT_DIR$/.idea/salim_project.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
12
.idea/salim_project.iml
Normal file
12
.idea/salim_project.iml
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
<component name="PyDocumentationSettings">
|
||||||
|
<option name="format" value="PLAIN" />
|
||||||
|
<option name="myDocStringFormat" value="Plain" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
68
.idea/workspace.xml
Normal file
68
.idea/workspace.xml
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="f37fcef4-db58-45e1-bebe-397708d723aa" name="Changes" comment="">
|
||||||
|
<change afterPath="$PROJECT_DIR$/Material_type_import.xlsx" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/Partner_products_import.xlsx" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/Partners_import.xlsx" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/Product_type_import.xlsx" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/Products_import.xlsx" afterDir="false" />
|
||||||
|
</list>
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="GitLabMergeRequestFiltersHistory"><![CDATA[{
|
||||||
|
"lastFilter": {
|
||||||
|
"state": "OPENED",
|
||||||
|
"assignee": {
|
||||||
|
"type": "org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsAssigneeFilterValue",
|
||||||
|
"username": "kantai777",
|
||||||
|
"fullname": "Salim kantai"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="ProjectColorInfo"><![CDATA[{
|
||||||
|
"associatedIndex": 5
|
||||||
|
}]]></component>
|
||||||
|
<component name="ProjectId" id="35BAGWogOT7xP0SU3Bm4cqqN04B" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"git-widget-placeholder": "main",
|
||||||
|
"last_opened_file_path": "/home/user_3d/PycharmProjects/salim_project",
|
||||||
|
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="RecentsManager">
|
||||||
|
<key name="CopyFile.RECENT_KEYS">
|
||||||
|
<recent name="$PROJECT_DIR$" />
|
||||||
|
</key>
|
||||||
|
</component>
|
||||||
|
<component name="SharedIndexes">
|
||||||
|
<attachedChunks>
|
||||||
|
<set>
|
||||||
|
<option value="bundled-python-sdk-babbdf50b680-746f403e7f0c-com.jetbrains.pycharm.community.sharedIndexes.bundled-PC-241.15989.155" />
|
||||||
|
</set>
|
||||||
|
</attachedChunks>
|
||||||
|
</component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="f37fcef4-db58-45e1-bebe-397708d723aa" name="Changes" comment="" />
|
||||||
|
<created>1762572998835</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1762572998835</updated>
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
BIN
Material_type_import.xlsx
Normal file
BIN
Material_type_import.xlsx
Normal file
Binary file not shown.
BIN
Partner_products_import.xlsx
Normal file
BIN
Partner_products_import.xlsx
Normal file
Binary file not shown.
BIN
Partners_import.xlsx
Normal file
BIN
Partners_import.xlsx
Normal file
Binary file not shown.
BIN
Product_type_import.xlsx
Normal file
BIN
Product_type_import.xlsx
Normal file
Binary file not shown.
BIN
Products_import.xlsx
Normal file
BIN
Products_import.xlsx
Normal file
Binary file not shown.
1
main.py
1
main.py
|
|
@ -438,3 +438,4 @@ def display_menu():
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
display_menu()
|
display_menu()
|
||||||
#frergrgrggr
|
#frergrgrggr
|
||||||
|
#aaabla
|
||||||
261
main_flask.py
Normal file
261
main_flask.py
Normal 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)
|
||||||
Loading…
Reference in a new issue