diff --git a/api/routers/__init__.py b/api/routers/__init__.py
index deaeac6..039138e 100644
--- a/api/routers/__init__.py
+++ b/api/routers/__init__.py
@@ -1,15 +1,17 @@
-from datetime import date, datetime, timedelta
+from datetime import datetime, timedelta
from fastapi import APIRouter, Depends, Request
from fastapi.responses import RedirectResponse
from db.handlers.access import AccessLevelHandler
from db.handlers.categories import CategoryHandler
+from db.handlers.orders import OrdersHandler
from utils import render, requestDict, logger
from .user import router as user
from .stocks import router as stocks
from .toolbox import router as toolbox
from .toolkit import router as toolkit
from .records import router as records
+from .orders import router as orders
router = APIRouter()
@@ -19,6 +21,7 @@ router.include_router(stocks, prefix="/stocks", tags=["stocks"])
router.include_router(toolbox, prefix="/toolbox", tags=["toolbox"])
router.include_router(toolkit, prefix="/toolkit", tags=["toolkit"])
router.include_router(records, prefix="/records", tags=["records"])
+router.include_router(orders, prefix="/orders", tags=["orders"])
@router.get("/")
@@ -52,6 +55,21 @@ async def post_requests(
from db.handlers.toolkit import ToolkitHandler
from db.handlers.user import UserHandler
+ def getDates(data: dict):
+ startDate = data.get("startDate")
+ if isinstance(startDate, str):
+ startDate = datetime.strptime(startDate, "%Y-%m-%d").date()
+ if startDate is None:
+ startDate = datetime.now().date() - timedelta(days=30)
+ endDate = data.get("endDate")
+ if isinstance(endDate, str):
+ endDate = datetime.strptime(endDate, "%Y-%m-%d").date()
+ if endDate is None:
+ endDate = datetime.now().date()
+ if startDate > endDate:
+ startDate, endDate = endDate, startDate
+ return startDate, endDate
+
reqData = {
"tab": request_data.get("body").get("tabId"),
}
@@ -105,18 +123,7 @@ async def post_requests(
"categories": categories,
}
case "jurnal_toolkits":
- startDate = request_data.get("body").get(
- "startDate", date.today() - timedelta(days=7)
- )
- if isinstance(startDate, str):
- startDate = datetime.strptime(startDate, "%Y-%m-%d").date()
-
- endDate = request_data.get("body").get("endDate", date.today())
- if isinstance(endDate, str):
- endDate = datetime.strptime(endDate, "%Y-%m-%d").date()
-
- if startDate > endDate:
- startDate, endDate = endDate, startDate
+ startDate, endDate = getDates(request_data.get("body"))
jurnal_toolkits = await StocksRecordsHandler.getLogs(startDate, endDate)
if isinstance(jurnal_toolkits, list):
@@ -147,18 +154,7 @@ async def post_requests(
"endDate": endDate.strftime("%Y-%m-%d"),
}
case "jurnal_service":
- startDate = request_data.get("body").get(
- "startDate", date.today() - timedelta(days=7)
- )
- if isinstance(startDate, str):
- startDate = datetime.strptime(startDate, "%Y-%m-%d").date()
-
- endDate = request_data.get("body").get("endDate", date.today())
- if isinstance(endDate, str):
- endDate = datetime.strptime(endDate, "%Y-%m-%d").date()
-
- if startDate > endDate:
- startDate, endDate = endDate, startDate
+ startDate, endDate = getDates(request_data.get("body"))
jurnal_service = await ServiceRecordsHandler.getLogs(startDate, endDate)
if isinstance(jurnal_service, list):
@@ -199,7 +195,33 @@ async def post_requests(
"users": users,
"accessLevels": accessLevels,
}
- # logger.info(resultData)
+ case "orders":
+ fullAccess = reqData["accessData"].get("view_all_toolboxes", False)
+ startDate, endDate = getDates(request_data.get("body"))
+ if fullAccess:
+ result = await OrdersHandler.get_all(startDate, endDate)
+ if "errorMessage" in result.keys():
+ resultData["message"] = result["errorMessage"]
+ else:
+ resultData["status"] = "ok"
+ if "orders" in result.keys():
+ resultData["data"]["orders"] = result["orders"]
+ else:
+ userId = reqData.get("userData").get("id")
+ result = await OrdersHandler.get_all_by_consumer(
+ userId, startDate, endDate
+ )
+ if "errorMessage" in result.keys():
+ resultData["message"] = result["errorMessage"]
+ else:
+ resultData["status"] = "ok"
+ if "orders" in result.keys():
+ resultData["data"]["orders"] = result["orders"]
+ if resultData["status"] == "ok":
+ resultData["data"]["startDate"] = startDate.strftime("%Y-%m-%d")
+ resultData["data"]["endDate"] = endDate.strftime("%Y-%m-%d")
+ resultData["data"]["users"] = await UserHandler.getAll()
+ resultData["data"]["fullAccess"] = fullAccess
case _:
pass
return resultData
diff --git a/api/routers/__pycache__/__init__.cpython-313.pyc b/api/routers/__pycache__/__init__.cpython-313.pyc
index 3eb2c86..2f92d94 100644
Binary files a/api/routers/__pycache__/__init__.cpython-313.pyc and b/api/routers/__pycache__/__init__.cpython-313.pyc differ
diff --git a/api/routers/__pycache__/orders.cpython-313.pyc b/api/routers/__pycache__/orders.cpython-313.pyc
new file mode 100644
index 0000000..64492da
Binary files /dev/null and b/api/routers/__pycache__/orders.cpython-313.pyc differ
diff --git a/api/routers/orders.py b/api/routers/orders.py
new file mode 100644
index 0000000..d8ebb46
--- /dev/null
+++ b/api/routers/orders.py
@@ -0,0 +1,42 @@
+from fastapi import APIRouter, Depends
+from db.handlers.orders import OrdersHandler
+from utils import requestDict, logger
+
+
+router = APIRouter()
+
+
+@router.get("/")
+async def get_requests():
+ return await OrdersHandler.countNew()
+
+
+@router.post("/")
+async def post_requests(
+ reqData: dict = Depends(requestDict),
+):
+ logger.info("Обновление заказа")
+ response = {"status": "error"}
+ orderId = reqData.get("body").get("orderId")
+ userId = reqData.get("body").get("userId")
+ status = reqData.get("body").get("status")
+ comment = reqData.get("body").get("comment")
+ if (orderId is not None and userId is not None) and (
+ status is not None or comment is not None
+ ):
+ result = await OrdersHandler.update(int(orderId), userId, status, comment)
+ if "errorMessage" in result.keys():
+ response["message"] = result["errorMessage"]
+ else:
+ response["status"] = "ok"
+ if "orders" in result.keys():
+ response["data"] = result["orders"]
+ return response
+
+
+@router.post("/new", summary="Добавление нового заказа")
+async def add_order(reqData: dict = Depends(requestDict)):
+ logger.info(f"Добавление нового заказа")
+ userId = reqData.get("body").get("userId")
+ customer_comment = reqData.get("body").get("customer_comment")
+ return await OrdersHandler.new(userId, customer_comment)
diff --git a/api/static/css/layout.css b/api/static/css/layout.css
index f090e7c..5f86c77 100644
--- a/api/static/css/layout.css
+++ b/api/static/css/layout.css
@@ -2,6 +2,7 @@ body {
background-image: url("../images/background.svg");
background-repeat: repeat;
background-size: 512px auto;
+ background-attachment: fixed;
}
.loader-bg {
diff --git a/api/static/js/index.js b/api/static/js/index.js
index 803ce47..10ea46a 100644
--- a/api/static/js/index.js
+++ b/api/static/js/index.js
@@ -89,7 +89,11 @@ async function checkActiveUser() {
}
}
-async function openTab(event, tabId) {
+async function openTab(event, tabId, autoLoad = false) {
+ const activeTab = loadFromStorage('tab');
+ if (activeTab && activeTab.tabId === tabId && !autoLoad) {
+ return;
+ }
// Убираем активный класс со всех вкладок и кнопок
document.querySelectorAll('.tab-nav-btn').forEach(btn => {
btn.classList.remove('active');
@@ -136,6 +140,12 @@ function prepareTabs() {
};
}
+ tabsData['orders'] = {
+ title: 'Заказы',
+ icon: 'bi-basket',
+ description: 'Управление заказами'
+ };
+
if (accessData.view_requests) {
tabsData['jurnal_toolkits'] = {
title: 'Журнал перемещений',
@@ -170,11 +180,11 @@ function prepareTabs() {