From 7b129e08368b7ba07c7cf096847a2062502629b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B5=D0=BD=D0=B8=D1=81=20=D0=9A=D1=80=D0=B8=D0=B2?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Fri, 14 Aug 2026 00:54:30 +0700 Subject: [PATCH] photo_bot: remove AI validator, restore prepare_ad_photo workflow --- instruct/__pycache__/handlers.cpython-311.pyc | Bin 0 -> 32997 bytes lk/__pycache__/handlers.cpython-311.pyc | Bin 0 -> 55492 bytes .../__pycache__/handlers.cpython-311.pyc | Bin 0 -> 15756 bytes sd_dispatcher | 1 + .../__pycache__/handlers.cpython-311.pyc | Bin 0 -> 34893 bytes service_desk/test_basic.py | 33 + service_desk/test_date_format.py | 40 ++ service_desk/test_filter.py | 88 +++ service_desk/test_list_tickets.py | 80 +++ service_desk/test_list_tickets_debug.py | 57 ++ service_desk/test_list_tickets_july.py | 97 +++ .../__pycache__/handlers.cpython-311.pyc | Bin 0 -> 11059 bytes utils/__pycache__/states.cpython-311.pyc | Bin 0 -> 1879 bytes utils/__pycache__/texts.cpython-311.pyc | Bin 0 -> 42317 bytes utils/texts.py.bak | 655 ++++++++++++++++++ 15 files changed, 1051 insertions(+) create mode 100644 instruct/__pycache__/handlers.cpython-311.pyc create mode 100644 lk/__pycache__/handlers.cpython-311.pyc create mode 100644 photo_bot/__pycache__/handlers.cpython-311.pyc create mode 160000 sd_dispatcher create mode 100644 service_desk/__pycache__/handlers.cpython-311.pyc create mode 100644 service_desk/test_basic.py create mode 100644 service_desk/test_date_format.py create mode 100644 service_desk/test_filter.py create mode 100644 service_desk/test_list_tickets.py create mode 100644 service_desk/test_list_tickets_debug.py create mode 100644 service_desk/test_list_tickets_july.py create mode 100644 transcription_bot/__pycache__/handlers.cpython-311.pyc create mode 100644 utils/__pycache__/states.cpython-311.pyc create mode 100644 utils/__pycache__/texts.cpython-311.pyc create mode 100644 utils/texts.py.bak diff --git a/instruct/__pycache__/handlers.cpython-311.pyc b/instruct/__pycache__/handlers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5072fda092a3249e97a40af058e361f3f16d18d9 GIT binary patch literal 32997 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 J{>V|*{|Dperbhq( literal 0 HcmV?d00001 diff --git a/photo_bot/__pycache__/handlers.cpython-311.pyc b/photo_bot/__pycache__/handlers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..546fe29b2ff1399fc50db29ddcc2d744b0ad9544 GIT binary patch literal 15756 zcmdseZEzdMmEa5p-`@biFHoc)krY2fg47o!QL-b7q9j`UkVR6mVaqVY0V&Y(hBuG?srMk_ZEvjPI zs$BcyUiT0mLy?huPVH6QpxN`f=k@FNx?g|2*ZdzAi;;q-?c57v|5i^?{|hIwkA4~W z)9W-vU7=WtrNfj@e$zghq*Xo@c{4tSywyH6d24(cc&ozNh}Ng2aTzA8i|BoN0;|J@ zh|y;xuqJGZn0;mfYr~d^)n|>^d^VESh3yfC&p}{1?2HuoiU_O^yCTKDVgeh&C6Q8J zDS?gQvPikFoWQ2AJ5u4Rh^+Iii&Xk5BUQet$a>%Uh{xxNZ18P}Z1io6RQswUHNF~x zZw}W+Hu*Nul!^+f#_F<-5UhU-q<q*!;_Yk}k!N$~<9GL<@NgtOUQL)7@tCjh_tt>r2HI)1j zm+WhxB|RJ9gM26w#BgtSZ`WY(3=gmc!@Uz>J~STSaE7Kk5*Q6Os3h&N*aRQsBwcSX z9>-afj`Mb$}i`f4n)~- zC_0)gK6JFFzvDo6-yu@5{+R#u=;T>h6w`$Afq)L8}&zm(Fs3pgZTfJJE&&gXtt*$-9$Xd z`9rLv4Gi<4SX8peaG~Ph&atN~sF6bKn}dh1B!7 z*NpSpo@$rQcD#1$?}nMJBB5x9po$uaHj5Y7*N2MzPui1+gwcL#$7zAU0ezBz1ggwj@O* z)U1&;y<>h0+VkyPo9>{J`h-4Z&g12wgicu-OduBgQ%X%!QByUwg^H^uRcDx|sY#lq zo~CH{B{aM{Pi+b$;@9QVFA$LH`eHmT%Wu8Pd@){G%K-2juox(QeV#{UpCk?ZhWt0a zx&W@p!>o<9E8AGfS;D|N_5%8v<(+JivV79W=O$|CMUxf(0aQcRc=D|8=5 zk9Eyjs$rxk##++0CT`6Gxb}pND@)k9l7ux?Fp9FgfF9Tqc4hCwh_j|D@)&t2VNgoA z)=0*qVD+&qf8lrKY1UBOiKOE%GJ0zh4l-kD9*xVWV|5;%hWRP!IOo8;7Q%AwBt1#V z^Ham7iAx{{x`Gza&(NaqRpFcHU4X9%FL{Kol8l$oHS|;Tp>SS!)q_3~X3!$~8}z<# z-h7+mJRW2{>_pJR$2=Ttiag;^B*a4juTgRy=sMUj)HCSsf(=iP z|KPFy-YMIu7{4zXgN;)7tamsTk<Hp70sp|z(WCvxmP-swIRb1X6x|m*6Nrq5 zgBX8G)#Q;>gRu!Objlz%5$udbM?Cvud{zSVebT-kdC;5CR3AaZFG3?<^fY@U-N3}D zvEVR2k-#1L9q6PFp-rcS^XPA(2LWEuq44oiL5IS3+@U{(4t)>GKu3AdPoSHAOi26$ zy$^j0)#2WS+HnVGYro_*8qsTz0eT`_YWGZdfB_?V6DR>|K;$E=Qc&(1VYR;dKm#BZ z5v0qI`FEgoF9FITx(4}`INyli17u=_Au6@3b!f5OIPpBes7K#}GS@(jJ_4qJU7|`@ zBJ?*3v4pSTJP-q@VQu>cMisu9q&3O8N#vQK=^bl&PxW8kGuAdc!pd~4*{ZNkw0||44mjcc3=We z-zPojyXafcL;uwS(SL`AN}*Zw8hRbgd5A8xdm1VwRV*&4#{>LnNymn`Xdn`lbb(WG zlB4(gM_{k+_e=Un;DsQ32i&n3aHz&-0S=~GN@Ak1Nl72)xe=Tvsbk~8sHB|pdAK%42??05Nw!Xiwyg3 zNgal93fp0x4-B8?)TB@dHtD)}gdY!wPDyIq1d;{@E-+|@4Ll25Y;yLH3|(i2gX4G~ z-QeVK({Xry=kUZW>F{10M3eLw!17Aw;R%j|1Axr40do#aM8Bm44<1r36S7hPsefDc09+&7~+zH%x9(X=0mZv2c z@h#*C6XfFF@w1W}vjRsNe>BF2M$XDdCHbhsJq48Tq8$HcXr^iEQ$1yKTpYa=yAZp2 z>W$GiW3R`4bXus|DOT+ith+?(uIWP=wf5yBv$|9bQr8LUI#FE*Kn6-pUP@d@%pF3t zI|bV=(Y9;)@ZF-)%e%j|=klKEo{YWhviV!q%hucWx|{YoRKG{C?-lKPr@Pbk=VrT+ z{W%D!N%_6lCckf-l;03fci%NwW=_vBsZnI`3I?xe@Geobrea}3T5q_dyP%sj2zs}u zcO$)fiGdH~D~ax5yiahH&sz<;fB*h!*-KhV@A`I3(AD0mZ@;N)N4oZm#W7ny*EwH@ zEL#Q3R?)H*3L1{n3xTxRa_P{8L&!BaXMji!f_X?Z4IAMZTlA&S>wHY@F_2Qdenu>5R4FmDt7D43jA-zgqW$O{np4wC_p5eN1#86G{fe zl7Sg!=HM%)yRM3>2T{!)^w?3s^`z)}a>kHpYFjw_iyEQnkk|yWJTrUXO80Bsb0NW1 zFS_cHtNzym=t|h@F&J2)aD2zR zV@Z=wLc4CPU(yw1=&7dNONM;Lr$#DD?^7+A@>w#aC5AFsmh6%h z8T5^1+uYOSmA02$F~4S>dwSj=*td%It;oJLZFb%^ufJ(tpJD`ajcBex<{FU4P)jNy z(LG$=6jp1M(YU!Q3O7dyu&Y zt1hOPkFo0Z64h1a7vdDc%c}cm$b|(T9fm6IFELnj0ODVVdF|)UlFseS&$p{PcjjdMfvY|<)u=wDn1V%M&K_V zgy>)3H%;9&Iz(f|t#xgSy6Yu3Dh1;S(Rc!>R|$8FmP?Hn8gCUh2*sPl;?0ZNnMT3* zCDHgLq+T=p2`Zw7bG;4;Y^oy~@~>dFk~JhjjbSwMe;IZ;2|86kD_a+s8dex^Sat5)4O4W2PO5lI9vk?~nb%m2 z@)*q37aG`722n*xXI1eV zD_dYz#eD?rY?WJomgfFlS$|$iFt%djtnI2QX;_n|)+|RbDjvcUm@BvCvBz?TBG&$n zL)oI+sq^5=%1Q$!#hv+b2|epnYB3nLOl(oY0OmQ@2os`{=7ce|E?*)K@$GqdtSSp9 z%H8s6A-&V@?=V9{`X_K|) z-u^t*LPwFZFCM7|^(@0(UUSv2f|&;PC3&Y;($215o`;#F1NzaqrsPNSJU)yQn2U3} z9oQu`WJ{(Rvryq1jQ6k?%X{1l$5XN>QIvEl#^L5{SsvR{mY;+(;Q$v1)T-F6=SD-) zm2j~e@~aQ5OkaIKD_6KeU@SY7dPy8V)ug>@t}@ADkn@==2Owu|my%eq;-m`J);xZq zn5}(h)5@8j_bV{!-lUF15GVWOz`>XED6Du%5!~SWNQRPeBjw-K0 za<`I)hmI=uId}9Tj4pWRM^*HEHT8w1Kl$j=Pl6kD#V%xb@;^xWNj$eGq|c8*axRB+ zOhZebWL&vT!cMyhtRL8pBYX|)E$q>;{=Kgz#Oi7C?gU8k`mX;|;)`*Z~px4*1Qo z{@3@h*DvR^BR;_M#McI1Sa1uzCwtA%wNWSt&z&z3mOGAi1FzUqi`~B9)+G))@Zf;~ z>8s7)3Bzbb;6=pb-(69~l#x)zm&yFlNn_)qlKP3GU5B6-v?DPt65yvy%QwyNN66M= zp0N5%IkH#K_|p@SQ~2`)K7pbCOu7I!b*^gMdDp;zcTsp%(vaI_6I(IrRqU=jPpo=i z_k%vUNSvLxC^&nuV-|PO#axScWqtTAh`0c)z6kOZS_r{UT2ORZQ-~WMEo9ptN|CjPLc-PmytM!FLOzz;czg( zEmOCGdlS3zWz%Au!#gexJKH2Jxk(V0v|KO}1Lq&!UvbzN#o^0mlIAqekDrlD9oWX% z84h7a@ZApZzJhO;dmMw7!DAf*hy9?f{-I+%;7SB{=tSHPmj{9zb`NqV38i>A7#!!G z#~JvL#o_HDhmAlSSQRM_8-XM(KkNsep;W}iCZpjPT&5&?d+ID)D&(HSX!rser^UGH zcmVjtb~(u`TUur5i1C%fmLQ3N_T}(-v!NnyewB>mmLhl}!Q-k2Z>W4n(h`dMWj8Hc zapWatIKoOgE->kjPDCUFG|pIvfJWJ~NnFj=kx(=cCOnd9P&+KQ5IzQRG0cG;u1So? zqVXV*AXhx0KJGaF%;C>Qa_7=7`>kiqORe85R<#OMTg58ymNFVAiNI$&qnj;Ho2;`9 zH%%4DRFQU;&vd5Ej+w3{4P{=pWTf;aWc4B)4jFyP>}1M>ng<2_kf83SQs2 zor1nv)K?>Yb=u_ob`+UvAjod%a~IBCjn1DCt3ZM_(bfk3B+Isp-Few?)jMA*y0_%K zbs2lr9QdH?pp7q$T^PGsKL6#JF~Qmu1gz^@#yajxM#ZS=-Thbfq=Dmv> z7N0>4-N^IAoF?7S^4Asrv*OxuaYr|L^7wp(&~QR*IDx8HhB^I`2Gfu!$?-ix^%D{o z=C1`4U*Jk2%gD@1neGuOKY0XMAEiAW9fvTvl9}b=M#{BLEUKH|cC*NfioADS8&f;y zkD%S-g6l=m^&)b;n08mb+4y?nEw~O*yIZW?eSKuEQE>N)?q1|tCERtnMc1a(q~K~1 zT`kDfk|`~}JbC5ZYv)p9Lg^N<6x`Buu{TrZe#4Mz6v~>#vSw7)oGF7csI29#d&3*e z^Niqb65UP6wMtm#=Lb(OwqZv0i|+l%wR*VYdG3Z@Jp3&3JO^R6JL7JeA6TeEd;BOc zCb(Y^-7g^5D&hY9Owl?#x?aSN;#{05sh=;JA4NMyZ-v4r5*0!*F%%O@#>J9xWPf;o zegLm7rU$?svvcMkOm9}lZ07~vj4xw`v7b7Ewgd$8DbaiinNQ`%TyFf&jS02}(bj<3 z+C+vvw1K@=wAUhgZFbbBvt!aLRJMwht&7L;$UGoA4!kM+u>F zuUNVFMhPx=RCFFi=2e1R4lb1x-=kVIwv4lUuKEqQe6Ua>ICqN9oin<0ar2xH6*tRa z#+WWDozXAPNw>Erb;o|Vgp!Xl?hT@Q^R1?XH+1Mp?iN3Z&ivIq zIIhqgs!!w>q$>8~1jI`eRs5HTmlYX!0SH#aGWYTb4-2K+#L{iRVR5TG!kdJ$7O|`a zMmAtFkA?}zFieVDW#Xk(mm{f8p`>0csYmuzLb{~<%GhgT8CRX)Y7kuw>Gid+;+AfJ z>9*7fvu!C}p&gGD8L6t8H+`@B=5=UGP^cUcD@SIHIr@$B?SiXKbhZ6o)d2GADSJ7z zje#fkPqJ~wS(6%oD_GmcZiQoL{6!(miD6D~#zkiwnI9gOdjqHf1T%^qF7v1@L#nI$ z-#GMU-|KzzyM%Sy#dX`|+$9y`fKlZtx!gT>T5#2gt~x|QR>6jdf@R|Z1q1ClM(K+?hp;XkRt=~?y$+}bv3}tfR<bbm?r|FwWiI^1<~S7B+5 zl)(nuU_T8r>=K@4<4!Q>|Kqxf-dgG(cRIQ~%nf}@H>0_+(+u#(jJjKA_*lna*hpj8 zL}05E@IUq#yBl>MH!>J*rZMd8Y=gwFYmI$X%&%K&`^uSrF4q8jb7RLgUmFG2&FY38 zr*1t)pV&p+dfa$|W`3h@Ilh5<>He@m137=#q=B42Y{qcIHu+dePK)?{E1b_p zxfwWeaM;nvVf&4IdDlkn=6WMw`|;v4j(o4yRgfFW{&U~*J>8?-J@TPZ&%?cOd{39t zVRG0uC0Vn1UVN&K%STF!e3=*So#Q*b@0QH$wzl1fxY$sJSaN`soN{q|wvPL8XqAD`UXHk^Da+_ccsx500=GUOswb{}A^)M3Qd##xXhL{gC1U z_{#~1KGW}&Pl1nfA3ze+mWunq{0DP8P2Zsm)8vzH$5@?4= dJC;-(D%zGhv_#=|VSJCFRL&em;TNKS{|Bz2Drf)z literal 0 HcmV?d00001 diff --git a/sd_dispatcher b/sd_dispatcher new file mode 160000 index 0000000..b7b099c --- /dev/null +++ b/sd_dispatcher @@ -0,0 +1 @@ +Subproject commit b7b099cb38cc6060293fb41a9969181dc977eda3 diff --git a/service_desk/__pycache__/handlers.cpython-311.pyc b/service_desk/__pycache__/handlers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2ef18d768c9ee007f610d6e0678ba59b5b00e0f GIT binary patch literal 34893 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 {len(reqs)} заявок") + for r in reqs: + print(f" {r.get('id')}: {r.get('subject')}") + +if __name__ == "__main__": + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + asyncio.run(test_filters()) diff --git a/service_desk/test_list_tickets.py b/service_desk/test_list_tickets.py new file mode 100644 index 0000000..0bceb68 --- /dev/null +++ b/service_desk/test_list_tickets.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +"""Получение списка заявок из ServiceDesk Plus через API v3.""" + +import asyncio +import httpx +import json +import urllib3 + +BASE_URL = "https://192.168.1.237:8080" +API_TOKEN = "062CE056-C1F5-490C-A6DF-FD2C653A71DD" + +async def list_tickets(): + url = f"{BASE_URL}/api/v3/requests" + headers = { + "authtoken": API_TOKEN, + "Accept": "application/vnd.manageengine.sdp.v3+json" + } + + params = { + "input_data": json.dumps({ + "list_info": { + "row_count": 50, + "start_index": 1 + } + }) + } + + async with httpx.AsyncClient(verify=False, timeout=30.0) as client: + resp = await client.get(url, headers=headers, params=params) + data = resp.json() + + requests = data.get("requests", []) + print(f"Всего заявок: {len(requests)}\n") + + for req in requests: + req_id = req.get("request_id", req.get("id", "?")) + subject = req.get("subject", req.get("short_description", "?")) + + # Группа + group = req.get("group", {}) + if isinstance(group, dict): + group_name = group.get("name", "?") + else: + group_name = str(group) + + # Статус + status = req.get("status", {}) + if isinstance(status, dict): + status_name = status.get("name", "?") + else: + status_name = str(status) + + # Приоритет + priority = req.get("priority", {}) + if isinstance(priority, dict): + priority_name = priority.get("name", "?") + else: + priority_name = str(priority) + + # Описание (убираем HTML) + desc = req.get("description", "") + desc_clean = desc.replace("

", "").replace("

", "").replace("
", "\n").replace("
", "\n").replace("
", "\n") + desc_clean = desc_clean[:300] + + # Создатель + requester = req.get("requester", {}) + req_name = requester.get("name", "?") if isinstance(requester, dict) else "?" + + print(f"--- Заявка #{req_id} ---") + print(f" Тема: {subject}") + print(f" Группа: {group_name}") + print(f" Статус: {status_name}") + print(f" Приоритет: {priority_name}") + print(f" Автор: {req_name}") + print(f" Описание:\n {desc_clean}") + print() + +if __name__ == "__main__": + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + asyncio.run(list_tickets()) diff --git a/service_desk/test_list_tickets_debug.py b/service_desk/test_list_tickets_debug.py new file mode 100644 index 0000000..fd7f262 --- /dev/null +++ b/service_desk/test_list_tickets_debug.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +"""Дебаг запроса к ServiceDesk Plus API v3.""" + +import asyncio +import httpx +import json +import urllib3 + +BASE_URL = "https://192.168.1.237:8080" +API_TOKEN = "062CE056-C1F5-490C-A6DF-FD2C653A71DD" + +async def debug(): + url = f"{BASE_URL}/api/v3/requests" + headers = { + "authtoken": API_TOKEN, + "Accept": "application/vnd.manageengine.sdp.v3+json" + } + + # Разные варианты формата + variants = [ + # Вариант 1: input_data как JSON + { + "input_data": json.dumps({ + "list_info": { + "row_count": 5, + "start_index": 1 + } + }) + }, + # Вариант 2: без input_data, просто параметры + None, + # Вариант 3: input_data без json.dumps + { + "input_data": { + "list_info": { + "row_count": 5, + "start_index": 1 + } + } + } + ] + + for i, params in enumerate(variants): + print(f"\n=== Вариант {i+1} ===") + print(f"Params: {params}") + + async with httpx.AsyncClient(verify=False, timeout=15.0) as client: + try: + resp = await client.get(url, headers=headers, params=params) + print(f"HTTP {resp.status_code}") + print(f"Response: {resp.text[:500]}") + except Exception as e: + print(f"Error: {e}") + +if __name__ == "__main__": + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + asyncio.run(debug()) diff --git a/service_desk/test_list_tickets_july.py b/service_desk/test_list_tickets_july.py new file mode 100644 index 0000000..7e441b3 --- /dev/null +++ b/service_desk/test_list_tickets_july.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +"""Получение списка заявок из ServiceDesk Plus с 20 июля 2026. Экспорт: Группа, Описание, Назначено, Категория в JSONL.""" + +import asyncio +import httpx +import json +import urllib3 +from datetime import datetime, timezone +from html import unescape +import re + +BASE_URL = "https://192.168.1.237:8080" +API_TOKEN = "062CE056-C1F5-490C-A6DF-FD2C653A71DD" + +FROM_DATE_MS = int(datetime(2026, 7, 20, 0, 0, 0, tzinfo=timezone.utc).timestamp() * 1000) + +def get_ts(req): + ct = req.get("created_time", {}) + if isinstance(ct, dict): + v = ct.get("value", "0") + return int(v) if v else 0 + return 0 + +def clean_html(text): + if not text: + return "" + text = re.sub(r'<[^>]+>', '', text) + text = unescape(text) + return text.strip() + +def get_name(obj): + """Извлечь имя из объекта группы/техника/категории.""" + if not obj: + return "" + if isinstance(obj, dict): + return obj.get("name", "") or obj.get("display_value", "") + return str(obj) + +async def fetch_ticket_detail(client, req_id): + try: + resp = await client.get( + f"{BASE_URL}/api/v3/requests/{req_id}", + headers={"authtoken": API_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json"}, + timeout=15.0 + ) + data = resp.json() + return data.get("request", data) + except Exception as e: + return {} + +async def list_tickets(): + url = f"{BASE_URL}/api/v3/requests" + headers = {"authtoken": API_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json"} + + async with httpx.AsyncClient(verify=False, timeout=30.0) as client: + resp = await client.get(url, headers=headers) + data = resp.json() + all_reqs = data.get("requests", []) + + from_20 = [r for r in all_reqs if get_ts(r) >= FROM_DATE_MS] + + # Получаем детали для каждой заявки + tasks = [fetch_ticket_detail(client, r.get("request_id", r.get("id", "?"))) for r in from_20] + details = await asyncio.gather(*tasks) + + rows = [] + for req, detail in zip(from_20, details): + # Группа — из списка (есть там) + group = req.get("group", {}) + group_name = get_name(group) + + # Описание — из детального запроса + desc = detail.get("description", "") + desc_clean = clean_html(desc) + + # Назначено (специалист) — из детального запроса + tech = detail.get("technician", {}) + assignee = get_name(tech) + + # Категория — из детального запроса + cat = detail.get("category", {}) + category = get_name(cat) + + rows.append({ + "group": group_name, + "description": desc_clean, + "assignee": assignee, + "category": category + }) + + # Выводим JSONL + for row in rows: + print(json.dumps(row, ensure_ascii=False)) + +if __name__ == "__main__": + urllib3.disable_warnings() + asyncio.run(list_tickets()) diff --git a/transcription_bot/__pycache__/handlers.cpython-311.pyc b/transcription_bot/__pycache__/handlers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf9eee9250090ccf1cb838d2aa15c916412c0832 GIT binary patch literal 11059 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 literal 0 HcmV?d00001 diff --git a/utils/__pycache__/texts.cpython-311.pyc b/utils/__pycache__/texts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649d6a02479bf34139b8303f0c43ccb116fa63fd GIT binary patch literal 42317 zcmchA3v^Ufnr@w{N+78K36StqiZ>Am@23bNARrhJ!YhhpNEHx?37$&fD=LZ)R1|!4 z8*OP~x7u-a&rC#U;{&yOrtfvuJnpHU>f5=srq^|O=gz&o?yNPLahx^deSY7+&pEZv zsR}PMx02dt?|t^;-+TZ2|Ns5(fA9LqkRhc3eERksy8F}n1A+g-fb%J{JzsxY5(vB+ zhzIHeaU&j#hvMOQQM@=lC_Xq|5-*KM;$?3{>W%o2L@+)y5!xS)4|^h9AJ)R<2p1)c zc*Xvp#12msOUmN-h$o8b2WcrsBIRH$T#0Z=yebiL>5LYVsgYnVuN8)2V@5dsp zEIuwVM9VWCaYNm3IDQSn!-9dt;Dqsx5eWPgU-hXkM{G%6Y=yv}T6Zn-4o9lUJIL}= zCu5*~gutQFOhB5E0)q-i5w5gho(O-H2FoObM`_{72#?mnQxG0w=bZ}w*!VQGZ93XK zLu+?wyc+MuY5A^0c)S*#iSRX&*BPne_$R2+y$JEr7q;_AiA0It}_o z2+!2QixHk>r(FX7Y}>yS{u(XaGKA;Y@0P%Qw4N`H-+;LJXyeShmM=i; zti0HTcG)YDZxK?=_VvwT`~51sUt;@jgnud0&h@2TX1`yJ_saz?)kilWe7y$u8iZG9 z;k5|gVCP*2|4QxM%?Pj3!s`*fQ44QCcr{>Ik=L@D5PL&j>>9hCjmWoFE9Vx3*J
B*BsT!WUT4dH!SIE8Sd7CwS-Jbqti!X=`bCw~7E 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Неизвестная команда.\n\n" + "Пожалуйста, используйте только цифры, соответствующие нужным пунктам меню, и отправьте выбранную цифру мне в сообщении." +) + +# --- Emoji Digits --- +# Используются для навигации и выбора пунктов меню +EMOJI_DIGITS = { + "0": "0⃣", + "1": "1⃣", + "2": "2⃣", + "3": "3⃣", + "4": "4⃣", + "5": "5⃣", + "6": "6⃣", + "7": "7⃣", + "8": "8⃣", + "9": "9⃣", + "10": "🔟" +} + +# --- Footer Templates --- +# Шаблоны подвалов сообщений для навигации + +def _footer(emojis: dict) -> str: + """Стандартный футер с кнопками Назад и Меню""" + return f"\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _footer_main_only(emojis: dict) -> str: + """Футер только с кнопкой Меню""" + return f"\n\n{emojis['0']} — В главное меню" + + +# ========================================================= +# TRANSCRIPTION BOT +# ========================================================= +# Модуль для расшифровки аудио и видео файлов + +# --- Private functions (Internal logic) --- + +def _transcription_welcome(emojis: dict) -> str: + return ( + f"🎙 Добро пожаловать! Я — Ассистент расшифровки совещаний.\n\n" + f"Я помогу вам перевести аудио или видео в текст, а также подготовлю краткое резюме вашей встречи.\n\n" + f"📎 Для начала работы просто отправьте нужный файл прямо в этот чат.\n\n" + f"{emojis['0']} — В главное меню" + ) + +def _transcription_unknown(emojis: dict) -> str: + return ( + f"⚠️ Неизвестная команда.\n\n" + f"Пожалуйста, отправьте в сообщении мне нужную цифру соответствующего пункта меню в чат." + ) + +def _transcription_bad_extension(ext: str, emojis: dict) -> str: + return ( + f"❌ Ошибка: Недопустимый формат файла ({ext}).\n\n" + f"Пожалуйста, отправьте поддерживаемый аудио или видео файл.\n\n" + f"{_footer(emojis)}" + ) + +def _transcription_uploading() -> str: + return "⏳ Загружаю файл..." + +def _transcription_success(email: str, emojis: dict) -> str: + return ( + f"✅ Хорошо, файл принят в обработку.\n\n" + f"Как только всё будет готово, я отправлю вам результаты на почту ({email}).\n\n" + f"⏳ Обычно это занимает от 5 до 30 минут.\n\n" + f"{_footer(emojis)}" + ) + +def _transcription_api_error(status_code: int, emojis: dict) -> str: + return f"❌ Ошибка API сервера ({status_code}).{_footer(emojis)}" + +def _transcription_system_error(emojis: dict) -> str: + return f"❌ Произошла системная ошибка при передаче файла.{_footer(emojis)}" + +# --- Public constants and functions --- + +TRANSCRIPTION_MAIN_MENU_TEXT = _transcription_welcome(EMOJI_DIGITS) +TRANSCRIPTION_UNKNOWN_CMD_TEXT = _transcription_unknown(EMOJI_DIGITS) + +def transcription_error_bad_extension(ext: str) -> str: + return _transcription_bad_extension(ext, EMOJI_DIGITS) + +TRANSCRIPTION_UPLOADING_TEXT = _transcription_uploading() + +def transcription_success_received(email: str) -> str: + return _transcription_success(email, EMOJI_DIGITS) + +def transcription_error_api(status_code: int) -> str: + return _transcription_api_error(status_code, EMOJI_DIGITS) + +def transcription_error_system() -> str: + return _transcription_system_error(EMOJI_DIGITS) + + +# ========================================================= +# SERVICE DESK BOT +# ========================================================= +# Модуль для создания и управления заявками в Service Desk + +# --- Private functions (Internal logic) --- + +def _sd_welcome(emojis: dict) -> str: + return ( + f"🎫 Режим создания заявки в Service Desk\n\n" + f"• Опишите проблему текстом.\n" + f"• Можно прикрепить фото или документ.\n\n" + f"{emojis['0']} — В главное меню" + ) + +def _sd_unknown(emojis: dict) -> str: + return ( + f"⚠️ Неизвестная команда.\n" + f"Пожалуйста, используйте цифры меню из сообщения выше.\n\n" + f"{emojis['9']} — Назад\n" + f"{emojis['0']} — В главное меню" + ) + +def _sd_text_required(emojis: dict) -> str: + return f"⚠️ Сначала опишите проблему текстом." + +def _sd_creating() -> str: + return "⏳ Создаю заявку, пожалуйста, подождите..." + +def _sd_ticket_created(ticket_id: int, subject: str, description: str, emojis: dict) -> str: + clean_desc = description.replace("\n", " ").strip() + if len(clean_desc) > 150: + clean_desc = clean_desc[:147] + "..." + return ( + f"✅ Заявка #{ticket_id} создана!\n\n" + f"📌 Тема: {subject}\n\n" + f"📝 Текст: {clean_desc}\n\n" + f"Если нужно добавить скриншоты или документ — отправьте их сейчас.\n\n" + f"{_footer(emojis)}" + ) + +def _sd_ticket_create_error(emojis: dict) -> str: + return f"❌ Ошибка создания заявки.{_footer_main_only(emojis)}" + +def _sd_system_error(emojis: dict) -> str: + return f"❌ Системная ошибка. Попробуйте позже.{_footer_main_only(emojis)}" + +def _sd_uploading_file(ticket_id: int, emojis: dict) -> str: + return f"⏳ Загружаю файл в заявку #{ticket_id}..." + +def _sd_file_attached(emojis: dict) -> str: + return f"✅ Файл успешно прикреплен!{_footer(emojis)}" + +def _sd_file_upload_error(emojis: dict) -> str: + return f"❌ Ошибка загрузки файла.{_footer_main_only(emojis)}" + +# --- Public constants and functions --- + +SD_MAIN_MENU_TEXT = _sd_welcome(EMOJI_DIGITS) +SD_UNKNOWN_CMD_TEXT = _sd_unknown(EMOJI_DIGITS) +SD_TEXT_REQUIRED = _sd_text_required(EMOJI_DIGITS) +SD_CREATING = _sd_creating() + +def sd_ticket_created(ticket_id: int, subject: str, description: str) -> str: + return _sd_ticket_created(ticket_id, subject, description, EMOJI_DIGITS) + +def sd_ticket_create_error() -> str: + return _sd_ticket_create_error(EMOJI_DIGITS) + +def sd_system_error() -> str: + return _sd_system_error(EMOJI_DIGITS) + +def sd_uploading_file(ticket_id: int) -> str: + return _sd_uploading_file(ticket_id, EMOJI_DIGITS) + +def sd_file_attached() -> str: + return _sd_file_attached(EMOJI_DIGITS) + +def sd_file_upload_error() -> str: + return _sd_file_upload_error(EMOJI_DIGITS) + + +# ========================================================= +# PHOTO BOT +# ========================================================= +# Модуль для обновления фото профиля + +# --- Private functions (Internal logic) --- + +def _photo_welcome(emojis: dict) -> str: + return ( + f"🖼 Режим обновления фото профиля\n\n" + f"📸 Пришлите мне вашу фотографию.\n\n" + f"{emojis['0']} — В главное меню" + ) + +def _photo_unknown(emojis: dict) -> str: + return ( + f"⚠️ Неизвестная команда.\n" + f"Пожалуйста, используйте цифры меню из сообщения выше.\n\n" + f"{emojis['9']} — Назад\n" + f"{emojis['0']} — В главное меню" + ) + +def _photo_error_handling(emojis: dict) -> str: + return ( + f"⚠️ В данный момент выполнить это действие невозможно. " + f"Информация о проблеме передана ответственным.\n" + f"Приносим извинения за доставленные неудобства.\n\n" + f"{emojis['0']} — В главное меню" + ) + +def _photo_uploading() -> str: + return "⏳ Отправка..." + +def _photo_success_sent() -> str: + return "📩 Фото отправлено на утверждение." + +def _photo_cancel(emojis: dict) -> str: + return ( + f"🚫 Отменено. Пришлите другое фото.\n\n" + f"{emojis['0']} — В главное меню" + ) + +def _photo_processing() -> str: + return "⏳ Обработка..." + +def _photo_preview_ready(emojis: dict) -> str: + return ( + f"... Фото готово!\n\n" + f"{emojis['1']} — Отправить на утверждение\n" + f"{emojis['2']} — Попробовать другое\n\n" + f"{emojis['0']} — В главное меню" + ) + +def _photo_error_processing(error_text: str, emojis: dict) -> str: + return ( + f"❌ Ошибка: {error_text}\n\n" + f"Пожалуйста, отправьте другое фото.\n\n" + f"{emojis['0']} — В главное меню" + ) + +# --- Public constants and functions --- + +PHOTO_MAIN_MENU_TEXT = _photo_welcome(EMOJI_DIGITS) +PHOTO_UNKNOWN_CMD_TEXT = _photo_unknown(EMOJI_DIGITS) + +def photo_error_handling() -> str: + return _photo_error_handling(EMOJI_DIGITS) + +PHOTO_UPLOADING_TEXT = _photo_uploading() + +def photo_success_sent() -> str: + return _photo_success_sent() + +def photo_cancel_text() -> str: + return _photo_cancel(EMOJI_DIGITS) + +PHOTO_PROCESSING_TEXT = _photo_processing() + +def photo_preview_ready() -> str: + return _photo_preview_ready(EMOJI_DIGITS) + +def photo_error_processing(error_text: str) -> str: + return _photo_error_processing(error_text, EMOJI_DIGITS) + + +# ========================================================= +# SEARCH BOT +# ========================================================= +# Модуль поиска по регламентам + +# --- Private functions (Internal logic) --- + +def _search_welcome(emojis: dict) -> str: + return ( + f"📚 Поиск по регламентам\n\n" + f"Введите ваш вопрос (например: 'время хранения электронных документов' ).\n" + f"Бот найдет наиболее подходящие абзацы из нормативных документов.\n\n" + f"Для возврата в главное меню отправьте {emojis['0']}." + ) + +def _search_unknown(emojis: dict) -> str: + return ( + f"⚠️ Неизвестная команда.\n" + f"Пожалуйста, используйте цифры меню из сообщения выше.\n\n" + f"{emojis['9']} — Назад\n" + f"{emojis['0']} — В главное меню" + ) + +def _search_searching() -> str: + return "🔍 Ищу информацию в регламентах..." + +def _search_not_found(emojis: dict) -> str: + return ( + f"🤖 Точной информации в регламентах не найдено.\n\n" + f"Для выхода отправьте {emojis['0']}." + ) + +def _search_feedback_thanks(emojis: dict) -> str: + return ( + f"🙏 Спасибо за ваш отзыв! Мы передали его разработчикам.\n\n" + f"🔍 Можете сразу задать следующий вопрос по регламентам.\n\n" + f"Для выхода отправьте {emojis['0']}." + ) + +def _search_feedback_info(emojis: dict) -> str: + return ( + f"⚠️ Информация передана.\n\n" + f"Если желаете, напишите прямо сейчас текстовым сообщением, что конкретно вам не понравилось в ответе.\n\n" + f"{emojis['1']} — Задать ещё вопрос\n" + f"{emojis['0']} — Выйти в главное меню" + ) + +def _search_unavailable(emojis: dict) -> str: + return ( + "⚠️ В данный момент выполнить это действие невозможно. " + "Информация о проблеме передана ответственным.\n" + "Приносим извинения за доставленные неудобства.\n\n" + f"{emojis['0']} — В главное меню" + ) + +# --- Public constants and functions --- + +SEARCH_MAIN_MENU_TEXT = _search_welcome(EMOJI_DIGITS) +SEARCH_UNKNOWN_CMD_TEXT = _search_unknown(EMOJI_DIGITS) + +def search_searching_text() -> str: + return _search_searching() + +def search_not_found_text(emojis: dict) -> str: + return _search_not_found(emojis) + +def search_feedback_thanks_text(emojis: dict) -> str: + return _search_feedback_thanks(emojis) + +def search_feedback_info_text(emojis: dict) -> str: + return _search_feedback_info(emojis) + +def search_unavailable_action(emojis: dict) -> str: + return _search_unavailable(emojis) + + +# ========================================================= +# LK BOT +# ========================================================= +# Модуль Личного Кабинета (финансовые документы, табель и др.) + +# --- Constants --- + +DOC_TYPES = { + "1": "Справка о доходах физического лица (2-НДФЛ)", + "2": "Справка об удержаниях за ДМС", + "3": "Справка о средней заработной плате", + "4": "Справка о получении единовременного пособия по рождению ребенка", + "5": "Справка о получении ежемесячного пособия и назначении отпуска по уходу за ребенком", + "6": "Справка об удержаниях по исполнительным листам", + "7": "Копия трудовой книжки" +} + +# --- Private functions (Internal logic) --- + +def _lk_error_handling(emojis: dict) -> str: + return ( + "⚠️ В данный момент выполнить это действие невозможно. Информация о проблеме передана ответственным. Приносим извинения за доставленные неудобства.\n\n" + f"{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + +def _lk_auth_processing(emojis: dict) -> str: + return "⏳ Проверка безопасности... Запрашиваю контакты авторизации..." + +def _lk_auth_success(emojis: dict) -> str: + return "⏳ Авторизация успешна. Загружаю детализацию расчетного листа..." + +def _lk_auth_2fa_expired(emojis: dict) -> str: + return f"⏱ Время действия кода подтверждения изменилось или истекло.\nПожалуйста, запросите расчетный лист заново.{emojis['9']} — Назад" + +def _lk_auth_2fa_wrong_code(emojis: dict, attempts_left: int) -> str: + return ( + f"⚠️ Неверный код подтверждения.\nОсталось попыток: {attempts_left}. Попробуйте еще раз или вернитесь назад.\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + +def _lk_auth_2fa_blocked_max(emojis: dict, minutes: int) -> str: + return ( + f"❌ Превышено максимальное количество попыток ввода кода.\nДоступ к финансовым документам заблокирован на {minutes} минут.
\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + +def _lk_payslip_loading(emojis: dict) -> str: + return "⏳ Формирую архив расчетных листков..." + +def _lk_vacation_loading(emojis: dict) -> str: + return "⏳ Формирую справку по отпускам..." + +def _lk_sick_loading(emojis: dict) -> str: + return "⏳ Загружаю историю больничных листов..." + +def _lk_missions_loading(emojis: dict) -> str: + return "⏳ Загружаю историю командировок..." + +def _lk_rewards_loading(emojis: dict) -> str: + return "⏳ Ищу информацию о ваших наградах..." + +def _lk_transfers_loading(emojis: dict) -> str: + return "⏳ Загружаю историю кадровых перемещений..." + +def _lk_tabel_loading(emojis: dict) -> str: + return "⏳ Рассчитываю баланс рабочего времени..." + +def _lk_auth_sending(emojis: dict) -> str: + return "⏳ Отправка заявки..." + +def _lk_success_submission(emojis: dict) -> str: + return ( + "✅ Ваша заявка успешно отправлена!\n" + "Специалисты свяжутся с вами по готовности документа.\n\n" + f"{emojis['9']} — Назад в список справок\n{emojis['0']} — В главное меню" + ) + +def _lk_main_menu_text(header: str, emojis: dict) -> str: + return ( + f"{header}\n" + f"{emojis['1']} — Расчётный лист\n" + f"{emojis['2']} — Информация о днях отпуска\n" + f"{emojis['3']} — Больничные\n" + f"{emojis['4']} — Командировки\n" + f"{emojis['5']} — Награды\n" + f"{emojis['6']} — Переводы\n" + f"{emojis['7']} — Табель учёта рабочего времени\n" + f"{emojis['8']} — Справки\n\n" + f"{emojis['0']} — Вернуться в главное меню" + ) + +def _lk_tabel_months_menu_text(prev_1, prev_2, months_ru, emojis: dict) -> str: + return ( + "⏱ Выберите месяц для просмотра табеля:\n\n" + f"{emojis['1']} — {months_ru[prev_1.month]} {prev_1.year} г.\n" + f"{emojis['2']} — {months_ru[prev_2.month]} {prev_2.year} г.\n\n" + f"{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + +def _lk_payslip_months_menu_text(months_data: list, months_ru: dict, emojis: dict) -> str: + menu_text = "📅 Выберите месяц для просмотра:\n\n" + for idx, cmonth in enumerate(months_data, start=1): + month_name = months_ru.get((cmonth - 1) % 12 + 1, '00') + year = (cmonth - 1) // 12 + menu_text += f"{emojis[str(idx)]} — {month_name} {year} г.\n" + menu_text += f"\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + return menu_text + +def _lk_docs_quantity_prompt(emojis: dict) -> str: + return f"Укажите необходимое количество экземпляров (максимум — 5 шт.):\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _lk_docs_year_prompt(emojis: dict) -> str: + return f"📅 Выберите год, за который требуется справка:\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _lk_years_menu(current_year: int, emojis: dict) -> str: + lines = ["📅 Выберите год запрашиваемого периода:\n"] + for i in range(1, 9): + year = current_year - (i - 1) + emoji = emojis.get(str(i), f"{i}⃣") + lines.append(f"{emoji} — {year} год") + lines.append(f"\n{emojis.get('9', '9⃣')} — Назад\n{emojis.get('0', '0⃣')} — В главное меню") + return "\n".join(lines) + +def _lk_docs_avg_salary_prompt(emojis: dict) -> str: + return f"Укажите количество месяцев для расчета средней ЗП (например: 3):\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _lk_docs_child_age_prompt(emojis: dict) -> str: + return f"👶 Выберите возраст ребенка (до скольки лет):\n\n{emojis['1']} — до 1.5 лет\n{emojis['2']} — до 3 лет\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _lk_docs_period_prompt(year: int, emojis: dict) -> str: + return f"за {year} год\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _lk_docs_child_age_options(emojis: dict) -> str: + return f"{emojis['1']} — до 1.5 лет\n{emojis['2']} — до 3 лет\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _lk_docs_period_options(emojis: dict) -> str: + return f"{emojis['1']} — до 1.5 лет\n{emojis['2']} — до 3 лет\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +def _lk_nav_text(emojis: dict) -> str: + return f"\n\n{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + +# --- Public constants and functions --- + +LK_DOCS_MENU_TEXT = ( + "\n".join([f"{EMOJI_DIGITS[k]} — {v}" for k, v in DOC_TYPES.items()]) + + f"\n\n{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню" +) +LK_UNKNOWN_CMD_TEXT = ( + "⚠️ Неизвестная команда.\n" + "Пожалуйста, выберите пункт меню, используя цифры или кнопки.
\n" + f"{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню" +) + + +def lk_error_handling(emojis: dict) -> str: + return _lk_error_handling(emojis) + +def lk_auth_processing(emojis: dict) -> str: + return _lk_auth_processing(emojis) + +def lk_auth_success(emojis: dict) -> str: + return _lk_auth_success(emojis) + +def lk_auth_2fa_expired(emojis: dict) -> str: + return _lk_auth_2fa_expired(emojis) + +def lk_auth_2fa_wrong_code(emojis: dict, attempts_left: int) -> str: + return _lk_auth_2fa_wrong_code(emojis, attempts_left) + +def lk_auth_2fa_blocked_max(emojis: dict, minutes: int) -> str: + return _lk_auth_2fa_blocked_max(emojis, minutes) + +def lk_payslip_loading(emojis: dict) -> str: + return _lk_payslip_loading(emojis) + +def lk_vacation_loading(emojis: dict) -> str: + return _lk_vacation_loading(emojis) + +def lk_sick_loading(emojis: dict) -> str: + return _lk_sick_loading(emojis) + +def lk_missions_loading(emojis: dict) -> str: + return _lk_missions_loading(emojis) + +def lk_rewards_loading(emojis: dict) -> str: + return _lk_rewards_loading(emojis) + +def lk_transfers_loading(emojis: dict) -> str: + return _lk_transfers_loading(emojis) + +def lk_tabel_loading(emojis: dict) -> str: + return _lk_tabel_loading(emojis) + +def lk_auth_sending(emojis: dict) -> str: + return _lk_auth_sending(emojis) + +def lk_success_submission(emojis: dict) -> str: + return _lk_success_submission(emojis) + +def lk_main_menu_text(header: str, emojis: dict) -> str: + return _lk_main_menu_text(header, emojis) + +def lk_tabel_months_menu_text(prev_1, prev_2, months_ru, emojis: dict) -> str: + return _lk_tabel_months_menu_text(prev_1, prev_2, months_ru, emojis) + +def lk_payslip_months_menu_text(months_data: list, months_ru: dict, emojis: dict) -> str: + return _lk_payslip_months_menu_text(months_data, months_ru, emojis) + +def lk_docs_quantity_prompt(emojis: dict) -> str: + return _lk_docs_quantity_prompt(emojis) + +def lk_docs_year_prompt(emojis: dict) -> str: + return _lk_docs_year_prompt(emojis) + +def lk_docs_avg_salary_prompt(emojis: dict) -> str: + return _lk_docs_avg_salary_prompt(emojis) + +def lk_docs_child_age_prompt(emojis: dict) -> str: + return _lk_docs_child_age_prompt(emojis) + +def lk_docs_period_prompt(year: int, emojis: dict) -> str: + return _lk_docs_period_prompt(year, emojis) + +def lk_docs_child_age_options(emojis: dict) -> str: + return _lk_docs_child_age_options(emojis) + +def lk_docs_period_options(emojis: dict) -> str: + return _lk_docs_period_options(emojis) + +def lk_nav_text(emojis: dict) -> str: + return _lk_nav_text(emojis) + +def lk_years_menu(current_year: int, emojis: dict) -> str: + return _lk_years_menu(current_year, emojis) + + +# ========================================================= +# INSTRUCT BOT (Инструкции) +# ========================================================= +# Модуль инструкций + +# --- Private functions (Internal logic) --- + +def _instruct_main_menu(emojis: dict) -> str: + return ( + f"📋 Выберите инструкцию:\n\n" + f"{emojis['1']} — 🖥 Trueconf\n" + f"{emojis['2']} — 📧 Почта\n\n" + f"{emojis['0']} — В главное меню" + ) + +def _instruct_trueconf(emojis: dict) -> str: + """Статический текст Trueconf — без проверки группы.""" + return ( + "🖥 Инструкция по Trueconf\n\n" + "Данная функция находится в разработке.\n\n" + f"{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + + +def _instruct_trueconf_with_ad(emojis: dict, cn: str, ticket_id: str = None) -> str: + """ + Текст Trueconf с проверкой группы 2FA. + cn — CN пользователя из AD. + ticket_id — номер созданной заявки в SD. + """ + from utils.ad_checker import check_group_membership + + result = check_group_membership(cn, "2FA") + + if not result["found"]: + ticket_part = f"\n\n🎫 Заявка #{ticket_id} создана!" if ticket_id else "" + return ( + f"🖥 Инструкция по Trueconf\n\n" + f"Пользователь {cn} не найден в Active Directory.{ticket_part}\n\n" + f"{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + + if result["in_group"]: + body = ( + f"🖥 Инструкция по Trueconf\n\n" + f"{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + else: + body = ( + f"ℹ Доступ к Trueconf пока не настроен.\n\n" + f"🎫 Заявка #23651 для настройки создана в ServiceDesk!\n\n" + f"🔄 После выполнения заявки запросите инструкцию ещё раз.\n\n" + f"{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + + return body + + +def _instruct_email(emojis: dict) -> str: + return ( + "📧 Инструкция по Почте\n\n" + "Данная функция находится в разработке.\n\n" + f"{emojis['9']} — Назад\n{emojis['0']} — В главное меню" + ) + +# --- Public constants and functions --- + +INSTRUCT_MAIN_MENU_TEXT = _instruct_main_menu(EMOJI_DIGITS) +INSTRUCT_TRUECONF_TEXT = _instruct_trueconf(EMOJI_DIGITS) +INSTRUCT_TRUECONF_WITH_AD = _instruct_trueconf_with_ad +INSTRUCT_EMAIL_TEXT = _instruct_email(EMOJI_DIGITS) \ No newline at end of file