Merge branch 'Requests' of ParkSuMin/Cursovaya into main
This commit is contained in:
@@ -8,4 +8,9 @@ repos:
|
|||||||
- repo: https://github.com/pycqa/isort
|
- repo: https://github.com/pycqa/isort
|
||||||
rev: 5.12.0
|
rev: 5.12.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: isort
|
- id: isort
|
||||||
|
- repo: https://github.com/sqlfluff/sqlfluff
|
||||||
|
rev: 3.3.0
|
||||||
|
hooks:
|
||||||
|
- id: sqlfluff-fix
|
||||||
|
args: [ --dialect=mariadb ]
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
SELECT
|
SELECT
|
||||||
s.name AS Поставщик,
|
s.name AS Поставщик,
|
||||||
SUM(reports.count) AS 'Количество поставок',
|
reports.sum AS 'Сумма в рублях',
|
||||||
SUM(reports.sum) AS Сумма
|
reports.count AS 'Количество поставок'
|
||||||
FROM reports
|
FROM reports
|
||||||
JOIN sellers s ON reports.item_id = s.sel_id
|
JOIN sellers s ON reports.item_id = s.sel_id
|
||||||
WHERE report_category_id = '$id' AND (month = '$month' AND year = '$year')
|
WHERE report_category_id = '$id' AND (month = '$month' AND year = '$year')
|
||||||
GROUP BY s.name;
|
GROUP BY s.name
|
||||||
|
ORDER BY s.name;
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
SELECT w.name AS Наименование,
|
SELECT w.name AS Наименование,
|
||||||
w.material AS Материал,
|
reports.sum AS 'Сумма в рублях',
|
||||||
sum(sum) AS Сумма,
|
reports.count AS 'Количество поставленных заготовок'
|
||||||
sum(reports.count) AS Количество
|
|
||||||
from reports
|
from reports
|
||||||
JOIN workpiece w ON reports.item_id = w.work_id
|
JOIN workpiece w ON reports.item_id = w.work_id
|
||||||
WHERE report_category_id = '$id' AND (month = '$month' AND year = '$year')
|
WHERE report_category_id = '$id' AND (month = '$month' AND year = '$year')
|
||||||
GROUP BY w.material, w.name;
|
GROUP BY w.material, w.name
|
||||||
|
ORDER BY w.name;
|
||||||
@@ -4,8 +4,8 @@ from os import path
|
|||||||
from checker import check_auth
|
from checker import check_auth
|
||||||
from flask import Blueprint, render_template, request, url_for
|
from flask import Blueprint, render_template, request, url_for
|
||||||
|
|
||||||
from .requests_model import (materials_names, materials_per_seller,
|
from .requests_model import (materials_per_seller, sellers_names, sklad,
|
||||||
sellers_names, sklad)
|
workpiece_names)
|
||||||
|
|
||||||
with open(path.join(path.dirname(__file__), "zapros_menu.json"), encoding="utf-8") as f:
|
with open(path.join(path.dirname(__file__), "zapros_menu.json"), encoding="utf-8") as f:
|
||||||
requests_list = json.load(f)
|
requests_list = json.load(f)
|
||||||
@@ -24,12 +24,12 @@ def requests():
|
|||||||
@check_auth
|
@check_auth
|
||||||
def sklad_zapros():
|
def sklad_zapros():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
return render_template("zagotovki.html")
|
workpiece = workpiece_names()
|
||||||
|
return render_template("zagotovki.html", workpiece=workpiece)
|
||||||
else:
|
else:
|
||||||
zagotovki = sklad(request)
|
zagotovki = sklad(request)
|
||||||
if zagotovki.status:
|
if zagotovki.status:
|
||||||
material = dict(request.form)
|
header = "Поставки выбранной заготовки"
|
||||||
header = f'Заготовки на складе из материала "{material["material"]}"'
|
|
||||||
return render_template("output.html", items=zagotovki.result, header=header)
|
return render_template("output.html", items=zagotovki.result, header=header)
|
||||||
else:
|
else:
|
||||||
return render_template("error.html", error_message=zagotovki.error_message)
|
return render_template("error.html", error_message=zagotovki.error_message)
|
||||||
@@ -39,7 +39,8 @@ def sklad_zapros():
|
|||||||
@check_auth
|
@check_auth
|
||||||
def sellers_ship():
|
def sellers_ship():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
return render_template("sellers_ship.html")
|
sellers = sellers_names()
|
||||||
|
return render_template("sellers_ship.html", sellers=sellers)
|
||||||
else:
|
else:
|
||||||
zagotovki = materials_per_seller(request)
|
zagotovki = materials_per_seller(request)
|
||||||
if zagotovki.status:
|
if zagotovki.status:
|
||||||
|
|||||||
@@ -15,46 +15,28 @@ class InfoRespronse:
|
|||||||
status: bool
|
status: bool
|
||||||
|
|
||||||
|
|
||||||
def sellers_names() -> InfoRespronse:
|
def sellers_names() -> list:
|
||||||
db_config = current_app.config["db_config"]
|
db_config = current_app.config["db_config"]
|
||||||
|
|
||||||
_sql = sql_provider.get("sellers_names.sql", {})
|
_sql = sql_provider.get("sellers_names.sql", {})
|
||||||
result = select_list(db_config, _sql)
|
result = select_list(db_config, _sql)
|
||||||
if result is None:
|
return result
|
||||||
return InfoRespronse(
|
|
||||||
(),
|
|
||||||
error_message="Ошибка в подключении к базе данных. Свяжитесь с администратором",
|
|
||||||
status=False,
|
|
||||||
)
|
|
||||||
return InfoRespronse(result, error_message="", status=True)
|
|
||||||
|
|
||||||
|
|
||||||
def materials_names() -> InfoRespronse:
|
def workpiece_names() -> list:
|
||||||
db_config = current_app.config["db_config"]
|
db_config = current_app.config["db_config"]
|
||||||
|
|
||||||
_sql = sql_provider.get("materials_names.sql", {})
|
_sql = sql_provider.get("workpiece_names.sql", {})
|
||||||
result = select_list(db_config, _sql)
|
result = select_list(db_config, _sql)
|
||||||
if result is None:
|
return result
|
||||||
return InfoRespronse(
|
|
||||||
(),
|
|
||||||
error_message="Ошибка в подключении к базе данных. Свяжитесь с администратором",
|
|
||||||
status=False,
|
|
||||||
)
|
|
||||||
return InfoRespronse(result, error_message="", status=True)
|
|
||||||
|
|
||||||
|
|
||||||
def sklad(request) -> InfoRespronse:
|
def sklad(request) -> InfoRespronse:
|
||||||
db_config = current_app.config["db_config"]
|
db_config = current_app.config["db_config"]
|
||||||
material = dict(request.form)
|
workpiece = dict(request.form)
|
||||||
|
|
||||||
_sql = sql_provider.get("sklad_material.sql", material)
|
_sql = sql_provider.get("sklad_workpiece.sql", workpiece)
|
||||||
result = select_list(db_config, _sql)
|
result = select_list(db_config, _sql)
|
||||||
if result is None:
|
|
||||||
return InfoRespronse(
|
|
||||||
(),
|
|
||||||
error_message="Ошибка в подключении к базе данных. Свяжитесь с администратором",
|
|
||||||
status=False,
|
|
||||||
)
|
|
||||||
return InfoRespronse(result, error_message="", status=True)
|
return InfoRespronse(result, error_message="", status=True)
|
||||||
|
|
||||||
|
|
||||||
@@ -64,10 +46,4 @@ def materials_per_seller(request) -> InfoRespronse:
|
|||||||
seller = dict(request.form)
|
seller = dict(request.form)
|
||||||
_sql = sql_provider.get("ship_seller.sql", seller)
|
_sql = sql_provider.get("ship_seller.sql", seller)
|
||||||
result = select_list(db_config, _sql)
|
result = select_list(db_config, _sql)
|
||||||
if result is None:
|
|
||||||
return InfoRespronse(
|
|
||||||
(),
|
|
||||||
error_message="Ошибка в подключении к базе данных. Свяжитесь с администратором",
|
|
||||||
status=False,
|
|
||||||
)
|
|
||||||
return InfoRespronse(result, error_message="", status=True)
|
return InfoRespronse(result, error_message="", status=True)
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
SELECT DISTINCT material FROM workpiece;
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
SELECT w.waybill_date AS 'Дата поставки',
|
SELECT DATE_FORMAT(w.waybill_date, '%Y-%m-%d') AS 'Дата поставки',
|
||||||
|
TIME_FORMAT(w.waybill_date, '%H:%i') AS 'Время поставки',
|
||||||
SUM(w.total) AS 'Общая сумма (в рублях)',
|
SUM(w.total) AS 'Общая сумма (в рублях)',
|
||||||
SUM(wl.amount) as 'Общее количество заготовок'
|
SUM(wl.amount) as 'Общее количество заготовок'
|
||||||
FROM waybill w
|
FROM waybill w
|
||||||
|
|
||||||
JOIN (SELECT waybill_id, SUM(amount) AS amount FROM waybill_lines wl GROUP BY waybill_id)wl USING (waybill_id)
|
JOIN (SELECT waybill_id, SUM(amount) AS amount FROM waybill_lines wl GROUP BY waybill_id)wl USING (waybill_id)
|
||||||
JOIN (SELECT user_id, sel_id FROM external_users) eu USING(user_id)
|
JOIN (SELECT user_id, sel_id FROM external_users) eu USING(user_id)
|
||||||
JOIN (SELECT sel_id, name FROM sellers) s USING(sel_id)
|
JOIN (SELECT sel_id, name FROM sellers) s USING(sel_id)
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
SELECT weight AS 'Вес', price AS 'Цена (в рублях)',
|
|
||||||
count AS 'Количество', last_update AS 'Дата последнего обновления'
|
|
||||||
FROM workpiece
|
|
||||||
WHERE material = '$material'
|
|
||||||
12
App/Requests/sql/sklad_workpiece.sql
Normal file
12
App/Requests/sql/sklad_workpiece.sql
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
SELECT
|
||||||
|
DATE_FORMAT(w.waybill_date, '%Y-%m-%d') AS 'Дата поставки',
|
||||||
|
TIME_FORMAT(w.waybill_date, '%H:%i') AS 'Время поставки',
|
||||||
|
s.name AS 'Поставщик',
|
||||||
|
wl.amount AS 'Количество'
|
||||||
|
FROM waybill w
|
||||||
|
|
||||||
|
JOIN (SELECT waybill_id, work_id, amount FROM waybill_lines) wl USING(waybill_id)
|
||||||
|
JOIN (SELECT user_id, sel_id FROM external_users) eu USING(user_id)
|
||||||
|
JOIN (SELECT sel_id, name FROM sellers) s USING(sel_id)
|
||||||
|
WHERE work_id = '$workpiece'
|
||||||
|
GROUP BY waybill_date, name;
|
||||||
5
App/Requests/sql/workpiece_names.sql
Normal file
5
App/Requests/sql/workpiece_names.sql
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
SELECT
|
||||||
|
work_id,
|
||||||
|
name,
|
||||||
|
price
|
||||||
|
FROM workpiece;
|
||||||
@@ -33,11 +33,9 @@
|
|||||||
<form action="" method="post" style="display: inline-block;">
|
<form action="" method="post" style="display: inline-block;">
|
||||||
<label>Выберите поставщика</label>
|
<label>Выберите поставщика</label>
|
||||||
<select class="form-select" name="seller">
|
<select class="form-select" name="seller">
|
||||||
<option value="Alpha Supplies">Alpha Supplies</option>
|
{% for item in sellers %}
|
||||||
<option value="Beta Materials">Beta Materials</option>
|
<option value="{{ item["name"] }}">{{ item["name"] }}</option>
|
||||||
<option value="Gamma Parts">Gamma Parts</option>
|
{% endfor %}
|
||||||
<option value="Delta Components">Delta Components</option>
|
|
||||||
<option value="Epsilon Goods">Epsilon Goods</option>
|
|
||||||
</select>
|
</select>
|
||||||
<button type="submit" class="btn btn-primary">Отправить</button>
|
<button type="submit" class="btn btn-primary">Отправить</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html lang="ru" data-bs-theme="dark">
|
<html lang="ru" data-bs-theme="dark">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Количество заготовок на складе</title>
|
<title>Поставки заготовок на склад</title>
|
||||||
<link href="/static/css/main.css" type="text/css" rel="stylesheet">
|
<link href="/static/css/main.css" type="text/css" rel="stylesheet">
|
||||||
<link
|
<link
|
||||||
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
|
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<div class="row flex-nowrap justify-content-between pb-5">
|
<div class="row flex-nowrap justify-content-between pb-5">
|
||||||
<div class="col-1 pt-1"></div>
|
<div class="col-1 pt-1"></div>
|
||||||
<div class="col-10 text-center">
|
<div class="col-10 text-center">
|
||||||
<h1 class="display-5 fw-bold">Количество заготовок на складе</h1>
|
<h1 class="display-5 fw-bold">Поставки заготовок на склад</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-1 d-flex justify-content-end align-items-center">
|
<div class="col-1 d-flex justify-content-end align-items-center">
|
||||||
<a href="{{ url_for('logout') }}"><button class="btn btn-danger">Выход</button></a>
|
<a href="{{ url_for('logout') }}"><button class="btn btn-danger">Выход</button></a>
|
||||||
@@ -32,13 +32,11 @@
|
|||||||
<main class="flex-shrink-0">
|
<main class="flex-shrink-0">
|
||||||
<div class="form py-5">
|
<div class="form py-5">
|
||||||
<form action="" method="post" style="display: inline-block;">
|
<form action="" method="post" style="display: inline-block;">
|
||||||
<label>Выберите материал</label>
|
<label>Выберите заготовку</label>
|
||||||
<select class="form-select" name="material">
|
<select class="form-select" name="workpiece">
|
||||||
<option value="Сталь">Сталь</option>
|
{% for item in workpiece %}
|
||||||
<option value="Алюминий">Алюминий</option>
|
<option value="{{ item["work_id"] }}">{{ item["name"] }} ({{ item["price"] }}руб/шт.)</option>
|
||||||
<option value="Медь">Медь</option>
|
{% endfor %}
|
||||||
<option value="Пластик">Пластик</option>
|
|
||||||
<option value="Дерево">Дерево</option>
|
|
||||||
</select>
|
</select>
|
||||||
<button type="submit" class="btn btn-primary">Отправить</button>
|
<button type="submit" class="btn btn-primary">Отправить</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[
|
[
|
||||||
{"name": "Количество заготовок на складе", "url": "requests_bp.sklad_zapros"},
|
{"name": "Поставки заготовок", "url": "requests_bp.sklad_zapros"},
|
||||||
{"name": "Поставки поставщиками", "url": "requests_bp.sellers_ship"}
|
{"name": "Работа поставщиков", "url": "requests_bp.sellers_ship"}
|
||||||
]
|
]
|
||||||
Reference in New Issue
Block a user