Merge branch 'Report' of ParkSuMin/Cursovaya into main

This commit is contained in:
2024-11-21 12:52:11 +00:00
committed by Gogs
12 changed files with 124 additions and 59 deletions

View File

@@ -1,13 +1,12 @@
from flask import request, Blueprint, render_template, session, url_for
from checker import check_auth
from os import path
from .report_model import sales_report, make_report
from .report_model import view_report, make_report
import json
with open(path.join(path.dirname(__file__), 'reports.json')) as f:
report_list = json.load(f)
report_bp = Blueprint('report_bp', __name__, template_folder='templates')
@report_bp.route('/menu')
@@ -25,14 +24,16 @@ def create():
title='Создание отчета',
items = report_list)
else:
data = dict(month=request.form.get('month'), year=request.form.get('year'))
id = request.form.get('category')
with open(path.join(path.dirname(__file__), f'access/{id}.json')) as f:
data = dict(id=request.form.get('category'),
month=request.form.get('month'),
year=request.form.get('year'))
with open(path.join(path.dirname(__file__), f'access/{data['id']}.json')) as f:
report_access = json.load(f)
if session['role'] in report_access['write']:
proc_name = report_access['procedure']
ready_report = make_report(data, int(id),proc_name)
ready_report = make_report(data, proc_name)
if ready_report.status:
return render_template("OK.html")
else:
@@ -49,15 +50,15 @@ def view():
title='Просмотр отчета',
items = report_list)
else:
data = dict(month=request.form.get('month'),
year=request.form.get('year'),
id = request.form.get('category'))
id = request.form.get('category')
with open(path.join(path.dirname(__file__), f'access/{id}.json')) as f:
data = dict(id=request.form.get('category'),
month=request.form.get('month'),
year=request.form.get('year'))
with open(path.join(path.dirname(__file__), f'access/{data['id']}.json')) as f:
report_access = json.load(f)
if session['role'] in report_access['read']:
ready_report = sales_report(data, report_access['view'])
ready_report = view_report(data, report_access['view'])
if ready_report.status:
title= f'{report_access["title"]} за {data["month"]}-{data["year"]}'
return render_template("output.html", items=ready_report.result,

View File

@@ -1,7 +1,7 @@
{
"title" : "Отчет о продажах",
"title" : "Отчет о поставках заготовок",
"write" : ["Менеджер"],
"read" : ["Управляющий"],
"view" : "view_report",
"view" : "workpiece_report",
"procedure" : "report_workpiece"
}

7
App/Report/access/2.json Normal file
View File

@@ -0,0 +1,7 @@
{
"title" : "Отчет о поставках поставщиками",
"write" : ["Бухгалтер"],
"read" : ["Управляющий"],
"view" : "sellers_report",
"procedure" : "report_sellers"
}

View File

@@ -18,12 +18,13 @@ def check_report(input_data: dict) -> bool:
return False
return True
def sales_report(input_data: dict, view_script: str) -> InfoRespronse:
def view_report(input_data: dict, view_script: str) -> InfoRespronse:
status = check_report(input_data)
if not status:
return InfoRespronse((),
error_message = 'Отчет не найден',
status=False)
_sql = sql_provider.get(f'{view_script}.sql', input_data)
result = select_list(current_app.config['db_config'], _sql)
if result is None:
@@ -32,14 +33,15 @@ def sales_report(input_data: dict, view_script: str) -> InfoRespronse:
status=False)
return InfoRespronse(result, error_message='', status=True)
def make_report(input_data: dict, report_id: int, proc_name: str) -> InfoRespronse:
def make_report(input_data: dict, proc_name: str) -> InfoRespronse:
status = check_report(input_data)
if status:
return InfoRespronse((),
error_message = 'Отчет уже существует',
status=False)
test_data = (report_id,*input_data.values())
result = procedure(current_app.config['db_config'], proc_name, test_data)
data = tuple(input_data.values())
result = procedure(current_app.config['db_config'], proc_name, data)
if result is None:
return InfoRespronse((),
error_message = 'Ошибка в подключении к базе данных. Свяжитесь с администратором',

View File

@@ -1,3 +1,4 @@
[
{"id": 1, "name": "Покупки за месяц"}
{"id": 1, "name": "Заготовки"},
{"id": 2, "name": "Поставщики"}
]

View File

@@ -1,4 +1,4 @@
SELECT EXISTS (
SELECT 1 FROM reports
WHERE month = $month AND year = $year
WHERE report_category_id = '$id' AND (month = '$month' AND year = '$year')
) AS exist;

View File

@@ -0,0 +1,8 @@
SELECT
s.name AS Поставщик,
SUM(reports.count) AS 'Количество поставок',
SUM(reports.sum) AS Сумма
FROM reports
JOIN sellers s ON reports.item_id = s.sel_id
WHERE report_category_id = '$id' AND (month = '$month' AND year = '$year')
GROUP BY s.name;

View File

@@ -1,7 +1,8 @@
SELECT w.material AS Наименование,
SELECT w.name AS Наименование,
w.material AS Материал,
sum(sum) AS Сумма,
sum(reports.count) AS Количество
from reports
JOIN workpiece w ON reports.item_id = w.work_id
WHERE report_category_id = '$id' AND (month = '$month' AND year = '$year')
GROUP BY material;
GROUP BY w.material, w.name;

View File

@@ -10,36 +10,43 @@
<a href="{{ url_for('logout') }}"><button>Выход</button></a>
</div>
<h1>{{ title }}</h1>
<div class="form">
<form action="" method="post">
<label for="category">Выберите предмет формирования отчета</label>
<select name="category" id="category" required>
{% for item in items %}
<option value="{{ item['id'] }}">{{ item['name'] }}</option>
{% endfor %}
</select>
<label for="month">Выберите отчетный период</label>
<div class="period">
<select name="month" id="month" required>
<option value="1">Январь</option>
<option value="2">Февраль</option>
<option value="3">Март</option>
<option value="4">Апрель</option>
<option value="5">Май</option>
<option value="6">Июнь</option>
<option value="7">Июль</option>
<option value="8">Август</option>
<option value="9">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>
<input type="number" name="year" value="2024" min="1990" max="2100" required>
</div>
<form action="" method="post">
{% for item in items %}
<select name="category" required>
<option value="{{ item['id'] }}">{{ item['name'] }}</option>
</select>
{% endfor %}
<select name="month" required>
<option value="1">Январь</option>
<option value="2">Февраль</option>
<option value="3">Март</option>
<option value="4">Апрель</option>
<option value="5">Май</option>
<option value="6">Июнь</option>
<option value="7">Июль</option>
<option value="8">Август</option>
<option value="9">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>
<input type="number" name="year" value="2024" min="1990" max="2100" required>
{% if write %}
<button type="submit" value="write">Создать</button>
{% else %}
<button type="submit" value="read">Просмотр</button>
{% endif %}
</form>
<div class="return">
<a href="{{ url_for('index') }}"><button>Главное меню</button></a>
{% if write %}
<button type="submit" value="write">Создать</button>
{% else %}
<button type="submit" value="read">Просмотр</button>
{% endif %}
</form>
<div class="return">
<a href="{{ url_for('index') }}"><button>Главное меню</button></a>
</div>
</div>
</body>
</html>
</html>

View File

@@ -10,7 +10,7 @@
<a href="{{ url_for('logout') }}"><button>Выход</button></a>
</div>
<h1>Выберите вариант отчетов</h1>
<div style="text-align: center; margin: 20px 0;">
<div class="buttons_menu">
<a href="{{ url_for('report_bp.create') }}"><button>Создать отчет</button></a>
<a href="{{ url_for('report_bp.view') }}"><button>Читать отчеты</button></a>
</div>

View File

@@ -5,7 +5,8 @@
"Управляющий": [
"requests_bp",
"report_bp"],
"Бухгалтер": [
"report_bp"],
"Поставщик": [
"waybill_bp"]
}

View File

@@ -1,4 +1,4 @@
h1,h2 {
h1, h2 {
text-align: center;
}
@@ -26,6 +26,11 @@ div.logout, div.login {
text-align: center;
}
div.buttons_menu{
text-align: center;
margin: 20px 0;
}
div.logout button {
margin-top: -5px;
background-color: #ff0000;
@@ -37,11 +42,12 @@ div.login button {
}
div.return {
display: flex;
justify-content: center;
display: flex;
justify-content: center;
margin-top: 15px;
}
div.return button{
div.return button {
background-color: chocolate;
}
@@ -50,4 +56,35 @@ div.form {
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
text-align: center;
background-color: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
div.form label {
display: block;
margin-bottom: 5px;
font-size: 16px;
font-weight: bold;
color: #333;
}
div.form select, div.form input[type=number] {
margin-bottom: 15px;
padding: 5px;
font-size: 14px;
width: 100%;
box-sizing: border-box;
}
div.form .period {
display: flex;
gap: 10px;
justify-content: center;
}
div.form button {
margin-top: 15px;
}