From 546c70cbcd0aa99e82ce038944e89bc05a723aab Mon Sep 17 00:00:00 2001
From: Macbook
Date: Sun, 21 Dec 2025 03:45:02 +0300
Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D1=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
api/routers/__init__.py | 74 ++-
.../__pycache__/__init__.cpython-313.pyc | Bin 9681 -> 10872 bytes
.../__pycache__/orders.cpython-313.pyc | Bin 0 -> 2623 bytes
api/routers/orders.py | 42 ++
api/static/css/layout.css | 1 +
api/static/js/index.js | 628 +++++++++++++++++-
db/__pycache__/initialize.cpython-313.pyc | Bin 13778 -> 13778 bytes
.../__pycache__/orders.cpython-313.pyc | Bin 0 -> 7506 bytes
.../__pycache__/toolkit.cpython-313.pyc | Bin 18932 -> 19249 bytes
db/handlers/orders.py | 98 +++
db/handlers/toolkit.py | 13 +
db/schemas/__init__.py | 14 +-
.../__pycache__/__init__.cpython-313.pyc | Bin 356 -> 444 bytes
db/schemas/__pycache__/orders.cpython-313.pyc | Bin 0 -> 2144 bytes
db/schemas/orders.py | 30 +
15 files changed, 862 insertions(+), 38 deletions(-)
create mode 100644 api/routers/__pycache__/orders.cpython-313.pyc
create mode 100644 api/routers/orders.py
create mode 100644 db/handlers/__pycache__/orders.cpython-313.pyc
create mode 100644 db/handlers/orders.py
create mode 100644 db/schemas/__pycache__/orders.cpython-313.pyc
create mode 100644 db/schemas/orders.py
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 3eb2c8610faf529a6b2bbe04ce0c3c3d67d673b2..2f92d941b4c78bf2f49a3847bbbea42668f639c2 100644
GIT binary patch
literal 10872
zcmd5iZEzdMb$h_!gZLo6L3|Jd_yLe0DS)C#QD2lui59
-D!Q%`3yl$FMD
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
J;WnbY{{eKb*9QOq
literal 9681
zcmeG?TWlLwc6Wxuhe%3%QxqwRltfCRC6juZeo21G*2|G?j=6bA2}6rxnYK)7XDBC*
z7pZrRMHDQyQJMx(x{F2)@}ULtArx8E*d(pDXclocXgQf6!%XBv-Q5-l3KX&(Y?{BG
zJLHIxtc_!5TXcbr%robnd+)jTJnoq@XMDS|Qjg$z?Mh#ot4HX!xS?E{5^{TmK$o)*QG_Vp$1QXPt&b42VV4SKY(2(C8|lisjIq;IwCOHm9JHCX++~cDw$iqBV>-%v
zRWRD#1G>i-?HJc|leE)~&QfcV)_@dBqd2TMc5T+Ux&e)w6dv6KT|MprE-uXFETK$g
zYbR?$?$7bukV>Lb$s8l;FwCXTGg1YHDP}5{gwBcs$A@CsnH-LD$OzzxfsJuXEPiFH0yzh35Mg2G8dSs!DJ>i#jrp%9RmK7S@xnrQb`&X
z*a2e$TjbZDp2$g>sqEw=!+ws{0Mj(Ay!cb<$P5QVDGWoTq?u-!)9EKADwmw(p3+9R
zTz29dCuxfJr*x5AHam4H`=q2TAtlnebgoDO1W2&+EQ=*l5F&zcS-OdmA!H5Xqj3d(
zx6MF(Ox=k5a6sZHCU
zAf*6
zyBD}?749@et7*+HGDF3wScO6@-{UHLJn0I2bmCNCi!{OICnJ7
z`4r0RIPA23eC=l&TId;se(>zItSKuwb-{MjvnVEf^P1U9Hb!d~d<#nLYM9TjOHowJzQ^kT(w8
z^dfWcE6xG?y0Yt_hIorONKtQB0`|+QC_u?rI-dy$Sji2ZrNeXJciU)2sOVStDB@>W
zh8QL@BpeAihWPn~4+-GZ2t30wl#HwKGb{sMM{D3j=^MyN%p(wF+f5nNKGi{QKGS8ka5C&?{@iHMG7N_DdVS-75csdo`@vt3lqY
zu^rKsVKSo~vnz&-ITfsYZ$NZaT(hP88ii*S>LL{!!r@&;_Y$;e_d{UaXW{t$q0wvm
z-Ew8fC30^;Vlg{}>gn|AD#PXd{QvEaG)6T$1onv~7Pl%*8{+{-&3YgNd!kM{2(w!?d%
zqUnrvoh7VeI5CqirC(u;PwW^@9po$4u3+VR1BzSedSzY=ANoy~60I`U`;xceo64)~
zA!A!7o9$c5X8VS++2Yo?ZTDZoGXPS#jUaEox1_~h$1y^`}%&mF|1kd&Hsxr%>I8VhLtrN
zw-+PRA6v8V#0-?4nE&+uaYFIgyJX{k%5j3Y=Q!b57bhHF6DMBX5GNeUSue#2i05T*
z{v$<+U|9WaqQw0_m&=mG9dIr!-}+Q;l7w!OW9uA5@O#YO*4fJVHMUA_u$6I>tu|yA
z*j9A&y6nOTxgBI}8E4!X+o_zG@*UoJS`>azWvMRacVoMi5%-t_Rj<>vFi
z!5_~2b!b2{dQ^th0M(;U%P=j&lN`LA;|%jO9;Y5P1Efa(S%z-_RE^Hcuug^*8%C3(
z?*Nq;{hhIupT&^62MvEmEQgYA?dm%l+#EO-_QZZ7p({cfEBNZw%RVRye
zM5Sn1qCoYqOflf1lfp=qOP-RbQ`yu-Ne$>wN-~tHRQ*t{kaV~_CS&?yX-vk|49jNa
zvSzVNB$s59GdsW@`B(CPpMR6T!atM$dH(JE)%?%>`8V=QfWFQDi2osOyvaZ3&;M=y
z7x_1V{s!Ey`dKhOlB^ff%o7QyDJ4qfIEFhSk?E8~X3w#`FoNyF!=P#;7d$!12}RYJ
zOeNSSGTW(`oj+LC;>~1G>yi
zFf5dY5v#&%)VVBZlf`vrn3!W(NKwHF0GpP}|5{*tG&{*jswpNT(@)EE)pT~6#UGDC
zE*5`nDT^yhCJRyAGOnN(eH`kMGgH`-$)ZPAOe8b?440nFNE$5SP->k$Wc$fgPJ`kz
zL#d+Mu$yc(jMqPgfdzx(066^KCRaPR0LA)e<#d)?^J0!Y3ls3m4EHE_8LsMnsYB}H
z#0{!b{@1puK^0ZA-xEzf-sD@*2&QJy)XJM$7Y77W_o|9CX)X`I7@cF@D7spBSIeSP
zaJ38C_JYANUn|yx_?pmSlTgzk*7Wc-Jxk|>nts91zhbTx&3@kOUvLWM7SY_so7)y2
z70i1?^FH3Z@0wmPkF2UtrG0J~ilwlC(KWwU^tAGx*2N=&r%Uuic~A6erQkUt7>?YH
zn^7=7P~>)$H`W6;Z(uRTTiP!VFH`zwMt(4ow+_Br{V$&Do_zcfVQ4HrIG#5@`XTjL
zL2r4k_1V@rM$p%OTInp9oX=f)_R{=b!PFv}+IUl2e*1xIJ)&udHw_j1VbR~i`+Ed`
zRCGt5*REi~F5bVZVE4Q<^8CnxUa+@{_6To}EK!2J=eCNhw|*Z8-j~LnA6sw>jyBQJ&O6$d
z?1E#*?2&@EL-h9W-kzn?f_G4?9)x1GJ1Dx_cz2uN4vY5i?BPOPn^@Py*L4YXJ+S`l
z(6ZZmT_@C?cu#lr!B;N5d}(p-N4}lcb$s0k!5y0&DR^5&?+)I(^!0q;>k)iWu_ih@{Hdw>uZK7CZD_lxR+Tv(RrGooIQj~%z&hs@UERE^
zyI}VG^yDj#{M92r8Gn7~Y6sue%X@oeP0tQ}0oHQQhhC$L5-isS#M=Xn0`M~~b
zHSZ1xfsf~MO6@i$%(=kZn^qqui=Mc8j6{uLv7wu9
z=oT7wh_yTB4i}ob#il)c(;lIzSM>MJ4J|hWKR$RuaK-*Hvh>6&o|iof;~&*@{xZV5
zVxYoC=iCT*B1{VQ@xi{ga@R(LeaD613DI|AZgBlRy9)JqhlN1fH{R#|(mucZE`h4*
z{zNU?xKnK0&o>q=+jvs+o}3-UmJPoi5KR%@6v38#TCg=O)(f`Q^%|2c+tl*4>N04`
zW<5%j%-Va0RhOH0h|RqpH1`V4`^5TvbHnS`>BN?4YX8RT>?khtMF>?n?uaW`wBT!Y
z(bUA7ny_dyFYI2hys&TGg5a+$+u#VV?fkY5c^l^X3wGB_gMTrY_l7^RM{cTs_Pbyd
z{OW^XpAg(H`u5Km*98KIE`jz9fuO1+z8Y1T3Pv+LwIJHw8ljM9=Pe3C^DQTG4H1$(
zEV+8VlIl)K)kC-J$kij&L~m_FzBqBqjl5CG-}}{XT(RHyPTXoobwG4sV*S3GcI1cv
z@E;();$l!#`oZBnk5j}uy+opddZ#Z6_^*11gpvByj)NX(T(=Mj6LsBMjqwnXuu|8z
zVf;OUNI0nX$V!Zx+zFTNy-)z~UsnNlCuZyVq_ddx$~m6oT;EYn*5y1Bviw|niYtDph8IyJ
z=cmO~%#54(gPWZ2vG{`<3-6bZiKjCYQ!^%xPh9A|88oK-u5HUWz7oGh{(Ys$6RV5y41Af%H!7V!W#MX!oy2vmL8GG`^)6X
zg|k;HmM+QUL-$68h)?RCaev=Ed+3U9m9!Fr#QcM|5x(D6A<|MLt!~4kJm2@s(gI=m
h*BbwVN2u9;Q}q~0I15(i7czp!TW^w>#&V#F{{}f3w$}gv
diff --git a/api/routers/__pycache__/orders.cpython-313.pyc b/api/routers/__pycache__/orders.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..64492da243607bd6d30eafc53531d26753903d29
GIT binary patch
literal 2623
zcmbVOO>7fK6rR~#uQ##RiIad!Qi5@up9N&6knkfy)j(Q8Qk=?Lqf`k(PP_z@#2aR9
zXv)Qe13^7NQBjSkN{*oR0Ig6_t0EyTJ+3j5-Bl}8l?yjVp_S;VZ+2}bAktDs+L`y}
z{mkF{-rFTntVYm;&i(NlHiZ75Ot}GXwxz#exQt{Z<3Til2_9ewUzwyJSv;Q6XGkVpa??*NrV!wlywmSA(`^g<6SR)*fYiXp}G8c43(x
zb#^hby%8Pfj^oOz;wpXwxk|3y#jN7R@q!oEgi{iq&^<_uQPumwfv}oND#Wn&DKknU
zrb*Zkhe%8zT7NVVn^Fj!x
zk%yTISs|A1^8noZF|a?0FS8+=6Zw&VLfj7aD3)+YVhDXULl{?6iDXDQbptI?A4V`3
z(O{QB*dQ+b5hnJJ=2^Zo?GX`SFxA-(&od49bEK9lhN_gTZ0@S9zOH*
z0XXTaonFS}7l&wLWVRD0a0G?RF>1QCy5&fDsnk~XlVD!Uz7lx}_OymVllchnR@i#*QI0LhsjXVWCVdk3KZwD07j@Zic%ewrVN(cEiNTGjv01}z2Ka%P
z!KVNYFxtn}>1idAG@Pc|K}FM|6N+J*3@!$NEJ1>U^$jkbII0>fpu|EP
zpPB)&Vz6;=#!V`-8fex~O@S!djGBP;8h|BhXy>NgS}Ns1nwm;#)T!5Mgx<6v&Zyc7
z1h&8&MWN;ZBvAxD6_CwwZg6f;uif^L>nhZ~k!ja!eChszYt4np^OKpjoNHs=)tYs+
zF2r-L&h-9**l=Ow{77bPPW0wQe^&G_4Cll^`n}Z!tGW_uvO?1WpY?7n2(GNqn3>2n
zzxCMT&wDmM@NE8O-%b11@84eEAuHK|3Uz)7g3fNamcK>c)DX|IWzmmdm
zU3aPMya@jl1;!R4emFg$cWwrt{c+L;B3g~yOs6A%^x
zD6ln1Sv2UafUkhR>f!2X{^Im!rx&*8Je%^K
zK-Lq`gS|P=UY%?BmDVfY1Gf)^?w-7(N9TI7j-F>)9jq|d+u6Gd-`k3NcX0Q%*?{kw?|_pEjlW
zB99p1T;rL>`F&?MEHW5xT4E97E>fx}P+8NNrg=Gs-M=?9Wd?H%9gA!|ZYYTEr*x#s
ubwviK;+C@VA$|S9bd!!lzxX#_AI$l8E+P)^$$a>f4%A=>FET)yd;SO9;2-D!
literal 0
HcmV?d00001
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() {