From d667b2d846f0b2602342b53a2bd7224920a37f94 Mon Sep 17 00:00:00 2001 From: manoraga Date: Tue, 4 Aug 2026 12:55:35 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20config.py=20=D1=81=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D0=B0=D0=BC=D0=B8=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20MS?= =?UTF-8?q?=20SQL=20ACCOUNT-01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 3 +- data/scud_orion_ai.db | Bin 425984 -> 516096 bytes main.py | 10 +-- modules/scud_export.py | 3 +- modules/zup_extractor.py | 161 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 9 deletions(-) create mode 100644 modules/zup_extractor.py diff --git a/config.py b/config.py index c2459d3..ee4ae3a 100644 --- a/config.py +++ b/config.py @@ -9,7 +9,8 @@ SCUD_DIR = os.path.join(DATA_DIR, "scud") ZUP_1C_DIR = os.path.join(DATA_DIR, "1c") OUTPUT_DIR = os.path.join(BASE_DIR, "output") -SHARE_1C_DIR = r"\\storage\SCUD\Обмен\Штат" +# Путь к намонтированной сетевой шаре 1С в Linux (вместо \\storage\SCUD\Обмен\Штат) +SHARE_1C_DIR = "/mnt/scud_share" for folder in [DATA_DIR, SCUD_DIR, ZUP_1C_DIR, OUTPUT_DIR]: os.makedirs(folder, exist_ok=True) diff --git a/data/scud_orion_ai.db b/data/scud_orion_ai.db index e225f1b9fc2c377b1cde0ca9b1fbc55263aa3dc5..f0d73855a80bf9d9fd4278fe9982e068e2e2df51 100644 GIT binary patch delta 71147 zcmZ^s2YeJo+rV#U_xAc-fNVm5+oRWzTq+P+Lhm622qA^W#%#gC?ri1hAU5mWVi(qM}asA=?$#u8ucGnKqjjnC3O|CVr6|Tju z`L4OHS*~fW?_9lIDXuSFAG&KK<+^fQnTM9fUE{2SC-rMggWq;dHSoKtX%76ZZkh=Pa7JgSYlHmF@I^owD*$ls~$P)OCi_C`KHj#1gD@C&5HzCp; zemh6n!mk{GpRR@h;bmYZhe^6^VUq6l4Jq(z4U+P)1k;}Ee2**H@}MN}sa!>M*^*_; z*DkG^zp$!oUd5`a)HaCkfi|pOQC2Z;Rn@Y}s#Sd3z)PtEoSx^6;JurR1Z7wluzR}& z(!5=eE5+~cdgvN&qjTbd0Exwz9Sh;NU1_${JLfi%$tC_Z@H^X2?iTxt;CH&8 zq;-~m0Q?sDd%^E$KPi+EJ5~oa4KE#96+l4qZ(9YwmA6&GZ^dn-aLR8R3BP5xk=&en zTMrT~(RBfS4U3`jd`YX>cZU*kPrAA+x}KC#(sksa9j;pszcaS4gWvw!%i*`J zRe5!=ci^7?eW!9kuvg&rTV9E>!GQK2^goOQ-;7`~{^)HkG4Rg~N1}HjPW=uYyV1(U zMdMT!?CUUesj3QG-7N*azo{we(pMJj6L{w4bHiF3I!s3m4x!8-erEi|m@bq-HVkxJ zZx7kNwqCU+SS)6*!B@U7AHu4rm{bp0NB(@32mQST!IvM*3T%1pWi{;FU}m7;buGKlJqhW2c1cx5F;RMohxhOaUPx*vT z4Ah-8;avlS#kl-BWDMl)apD6WK0Yw=M{?s@fGS~Sxj584>^8C)i3dxy=QZX0TyW7%x3 zHyspD8ZR5$32FR9w26Dfu+Q(W6MXB!69ZTGUJAs?4rgX(?|_`NjGT;gUtxFx?(!Rd zGErwYF+ARG=u%soROohN?sxvd?rG^cSs6K5UN8J)qfAWp2{p|4QK-!K(eA8ci1AA|Ncod%cH-EmJ?vYEvBcVdn z)?)u`t{wiP+UUZ$-T1CJ%xPN#X-t0#%eXNSZBkL8(W%}_P4uQgIB5f7gkv?98%}Vi4fx_kG!5UsRmj0x zw+gb+cG`B#hHEdPj*}d@4zHuLBhF#4U$I}bpSB;fA8;IS)H`-LwmMcg${kakaZZEd zisPc=wBwj_sx#N=b#``cb*^xhJL{dhoX4C8oTr@^omX52+;kCj#c>z8_EuwOW1P_- zToEqro{GA*6;2Dsgabmou**2rm}~Uf>hYCbLeDzm3S+r#mu;(Ug*a8r6}@6-=<4_` z$eWSk9hgE=b$QA257@;rAIn&+vN;pJVu4mFtu&en+)X_-%&YV)#vl&oX?5;nNKN8Rfc`GX5iK z(Zato{2Rl+GW-j}KQsIj!#}ogU9^(@z&N=*? zD#NE3eud$a48IIqr*9!%VjP@c_(g_aVEB24pJVtq!^d2FU8^RlnQ_p>a3jMJhQkaW zW%yZ!pK;Z-ZX=H{4h}Q?G{a9Ze2C#E89vDHfjY+G35FkMct67p42KvFGQ5xBy1k6W zW35>p!EheKxeO0yco@S&TXUT}q_u@SnBg3T2QfU5;Q$2s{Ru&aO3V7NQO-5Bn}aBqftG2E{;*U5cbTgd$xPG&fT;Z%mb45u+Xr4>U9 zHo28Wwmga9i40F*cs#@77#_>;7(Mrf24l3|0(ca|M9k#%`;&7WApfu!h8RqP#VX_V z!jt^-=q2tV*AA?hKOYfLwfgfF2FK!p4k!`t+RQzz$`Zy0$Ka`3xaU-h%HU}1uH!WM z(YoNM!02OFRR>FgBSDPvsmfD>BLd#%PR2)NJtaYH5*;}HLOhTbox-2&aax19gw!RhA{@$aOYCT zR{I{?LF$C%0bmPIz=S<|_9S;54_$OhbdCfAUhk&`(fCo2u6 z@>v681u!11D}iUAHlUJ1*NZM`H>nm8TkAN?om?a-n1NVCd51= zGgiunMwa3yMskmmpfa^5lWO0_aM|EWa*l9R+Usn$StFKT%x{@4h<}QGjMIhH{DbIK z?k~e-zyG+f%@J90WW^|s=k#SZDY6**MsrWIHF#R28W)V=!mNFMWD!o=3GK$PvE1YO zfJ!0@mF(I4Kdv0#Uynq*^DWdhaNx~!NsF?tAhG~bUtKLt#N0TLq~+&wcLcV!Pt*rB zB~pd!JAoAWt1+cGX#?tocUn0S=TG1g*yxl-=HsmsxHt9QuZdLRiiz9@jN5H;WZseD zNnCuZ^pA*C;Ej{HXY>I~io zRES_^R!-I+Xqvn+BRDovNOPp6w5Ggctik&$P&-_2;u146p+%!D5}43Z0mOQ*$3~{< z!|=WfVRRe`^?m9P&P?)1X_2yXGGjJqGa?1xef@ej$)jCExCUCsNc#m(j4i?)5Sa>I zs;YWr(Q+L0o^b)bFqG?=0%ZujTvi6j-I#G*6(I{Pq?PLrPa8apJ4xy#RO+-$@Do$k z?3)~!5_sb2L_A?Q_W=8X6htONOjfT>B6Y&jh1=U7!peZoigbPHG3DNckxAgCx|+UI zUv=Svq=N=&H@q1j@{Sqny2wQQTvzUAeJz+2nSh5)g}3EGH}3w9-W+%^Ow`z=i~PuV z+Rz0`N6f%?uR{NQr8XE`InFFch5bg`eruDJw+t}PH~Gb&@qOVtp(CG-26Cl_4S}>P z`FvSq9IbeDJ-87uisjFYSvc5-G*>XlfTaXdE#MW1k+s#4k=Wdq`$*qjPK=CzP+Jz4 z{^`rX;u1tC3&vj%OzdTl%1EBl>LotTRpb0*u2>&neuRu8p?;BQHYanBlJ|*3jWnaN z2SNFf;jO%M#NMxsb8u2d%Uj(CiX}ap3^HKRCmZrMGiKh7iwp~-J(7rDOXe*2;$`C` z{9y_=nyvo>B17R}rKQpMCE~fM+*V7V=KO8;U^jSRxSw&hOf?6z@{f%sHA?pK|iZ$xAOJ{`~P z4|pH8wbeQrtMjzsG^#h?1DCi?Q|W??x=7=!cU^H^be%SyHXbt`u#hDhWw8d9Zp^u6 zuj81qykn~;3onkXHm~h~V}&i(dCWG|dB9d~or;}lC;@+c5n1t^t-?HfY?m;>V%}xm zYF=S3H{-NRoP-bfgao5?g|*y*@?z8V2VTSQa{scA>3k z1u92VQ7-bL&VK*d76DAAD*gVHPP{b!gyD}FzQpiFhCgEXLxw*91_6xrzzd9n_ZdFV z@OuoOWB6T$-(mP|MF68k;4Q|%n+%_2_zc6R8GeIdMJTU5?=?jLqglMlcsRxID-54x z_+^G)VptK%YtMU85x{5`FEAdSXZSgWk28FX;bw-L7_Mt%EFuht89vJJvkX7Oup*S# z5_q`v{W|&S))q1&m6va#_q8RO8yUW#wSSL=VKc*~R$Q0uQN)gF3_Xh2QDdQ%his1` zcGT`GVn>Y?v7^R{*imKqUwwE)gscc&H3y2|Rbxf)s_~!t0Koqr4FAsXZw&vcW3u)u z|Dv-X{4>KpG5jOLKQMfi;VTS(uQ6TwmA}(0NdGN=%kVc0UuO7ghQDI?ONPHtSy}s) zKUXd2+OPZ>Wv$ZP#<0J&dykW0MUbl&na9rDw?(;S?bldsV?~%>r&+XR0&K%@9K$ZkT9G}(-0#6~cZRzWuG6|-k0NZ>BBTi0HCBY}8he-k z6=Az}UlF!ztgIerOjZx{{l7<9KF}Pn%Ln(+2Wlz4pW%9jAEc~>*OR$_7rOv+C*uG! zd@sWr8Q#F~dWP3Ayp~;nS;IJ3&G0o0uVQ#5!?g^rV0gLG|7%&gj5^S=EQ8^6hSM1K zGMvhA3d42%8H;3w`!U>?;XVxaX1Et+ErIv7<~sTA))w*|4DV+6c7_8CZ)4cU@YYrg z3ovXEY-!~nTi(p@CWd!0yp!P_4Bx8fanRe{qPGD4AH&x&yoccjKrCDC_s?M`6rQ2f zp;noOFg%#y9EJxmJdoi53}*wkYEZHm2bq+$%5Xiy+Zn!2kvJbTfTDY4H32WGJ-TI%^T?QZepMRPcBs1R1Lm~ zTp^m4_cFLsZe6_AHZ5wAlsTeKj%RWW_;4rGD*hvy7D7lwrW$qjSQfV~aP_Wqk1n(+ zO)UcRqLx&WJel~YFdw^R)CV+<0=3^H^@_dXQPflgPpGce;#&TuF&=v#6Q+^Xw_Zdz zug}rBP4lVyUTWIF{X$$noJ%62RK3%(rb=*1MLogp!uQ&UGR=^u_9bOP{*~3#q2HQ{7Ys9*OKU8vmi^pb~5n_&#i|Ol+D9PKnGk>U79^#!4bKl>^rW({*X~ zZD}fPDf<4=_~Z`bj&T_{*Ucq*AXc$NYF7I(!#Sc58+V0UieKLk}ED6F=$HLWQ<+oN>ET1%vK z#2T+<8VaQ!*6u6)u*OP1oS70GzIv37SaYCs#2PCdvBpYAtnqRt0&G8A!`xr0usVG8 zEMXihX1JQ+MGP-wcmcyz49};m8@^UD4(2gj!EialWem?{xRl{Jg!RMM62`%7hKm`V z#c&bBGZ~)2@O0o-y-gwGU>d^(3{Pb^pW!JCPiA-$Bfj!XWE@Ojcs#@77#_>;7=}kP zJc$L7BowBOtVzSG)r|%vsA~UmS>6i@C^kq!PXuA7!jHcrZ z#yy>ZMDK(6N}^Mcs0FZ>@sP@J3d8*wPG-0t!*mAH@;oBGlIRpf7Xdm2(XlcG(c1cB zBtYG~yP4r8h8r1MeC4@EwV>~< z=Wd4YV)#ymF~fH-yqn?MqZ}1q1)>(p)&8b^ZTF z#=!=LpJn(NhL13OnBk`xeu}WZ|3Abyc#`3R3?E?l35FkMct67pz^(fK5aS@o@IHq3 zGW;0Bk23rS!w0!)qB{!|-b0 zI(>lGFb-BRyprKshF37WoZ)2**U+JoE=5Zj2TK@U%y2csix^(W@B)Ub=uk-)0Xlxx zaV6tn9>Wz3mor?(@LYyV=?kuV;2g$53B$7)E@pTZ!$l0wWO(Qd#sXB3h!$&&!R2zM zI2PLPux+sJupBghY<8PwiffGfgs1s0c?;^!jWyKZE?!{-KQoez?~u4=R=1!yk_9tX zkhc)sn)M0X0jgFCssKb4DI=y(q#}|T*m^h-FHhu-=`~bJA{kLd5!eKay-8dbd~6Ep zgHt{fhT=EcbA9>~MGa7MqWe{2hCM!#4$%RTNlOUzRJQ}XP>r#eURFfX@V`midn9Fg z)r0X7FaEIu_atjSCz6Vfb>v=Tb7Ev91s+W#AQ1U|ofOS8qTiAZVxri3o_Ue}bh=M7 zZ=;*Lljwp$8Z(JPOYF>>7)b^%wY3uDHz>Il`~zERn`ADP_{<=Ryr6~=`(eeAe&ACn zDaB_J&h>D+lZj7Ih$U(`-k4I7MG>-zUeP)|h(MEap@{CmlR40OgFMsiG~U)e(g$3E z%B8Q4Mz59=tMP9fcP-JE1x+2$xB@kySb_;q;Ob2iMl{Tbh)oq0V!s(>;Ij5&2Hw{V zNmS`AooFp(E20-rlSu=JrTsH9(hI_DDUzK$cXx|sWF}DtOpmF0TN>#}Dk10NXgPwX z_ISA8OD5Ymsc1r47V8;pB|=lRdjPu!1OcSE7y-^&Gg(VgZ6sTWXGd7`)ycd{c=QeL9GoCc{Uig&S9 zG$%&7DZWWX>|o*^B-(*ctEjGC?2OtR>FQGUpSyiV@b#;SJ44B15D>gh$$u{Wh+FswzXJ zAv^wKD`75-xbcm4?gPEfZ(*bpEphi)yweV9Iy)WQ{?^g!h$lF?=SjuYZ{?pA=|J-= zaPX6MIM>DPBM$V9)A&ddbs*8|i3_@jwSgs9`_mQ))ZYe>7dGZj_VJPS;1SgBAz^{j zSD`_o>Ykv=2)b7>Yi(U5G4Q|-t@H?2MG^uJ{`i$XC6gjj;I5yZCh^o;FOI|qs(*f) z=u7FNpBZUK^Cd}9#_ZG!-pd>Np-xjkBR-w9s_^d9CNfrx6jA&kgR8Hz*fGGKZJS}; zV0pxR!t|rbEsio~2-W;HbSw9`;gH{dQ-W`8(-vq16ymW zXEd!-@>*Sj*g2Z}AHH&~b+o26DZ413ooSI-myO|e^VvCR0d9vB81jolA83Bl8VD2? zEYyrSdK^^$@AdGr_0CF~R)aIL$s-!Oy5~r~)FY#+Bd-_v7c^Z%<0?&TaZi^))`7_X zN*gpyA97LCDkW9XkOLRTEFdcL#d=qzO=J&7O^qh&-Z6oDQI~_h%}uo}4Xk@%G>)|s zxr6xo-AFIs-X=GZJrq!EzOhkvr(QO8!uM?wX5x}MGzNE`%uUumd~(xrcz9KnN6k_2 zP>H{p%q63=Y_br*=IXSjWi+~48RSplc7ud_S641khOR1>UL<)PT>MUKDn|nk)=%XH z-{giA{D2L1Dg-Oh6YBP&%?cc*}gG?QKeLNXAuFC=}gbzrWat>76!%$##;LdR8+zmXYSbOqFG3INYV<~z^wJ2}sikH`*_Y$Dd zqeuUYY3M?8UfB_ZuS^y?;y31ToAA%ekX!Xu+0Yrgm!k`&7H@~QazbZ5o{z((V`$OA z`aS4K-1F#)z0N8~h9PL4({;jl4|?0>vOH#-U{`vV84))pm^~S^UAYz`V^o&g?Y3W4hlQF(tchv3(+LGyi0N z!1y+r=eWk$(KXF^yRhC`VeQX<^|s! zox_d8`Qf7ba2j8Q0(nD{k$ePSN#_TO@>8mnJBU~G;=M@9!OJrEOe7zsrs&?6#n&L* z#U*&#N`s7r277ejvL9cJ0^UJAMfqs-61n%|+}5U#-m=qD zV(Df6)_lmk-aOoFG@UZtWm;&;f(>2A#T&#z(F12V?KdtrrU^d^PYY{>;ev^OgU5Us z->w(Bio)D|=vp+9t3odBO|FmMf0saV?~chvDAXVEKTmSmqWlBRy@CT?QN9|zE4n|A zULt7$b%@-bDITOM)r0%f=p~ZocmhVxR5>7x9dcJ02TT}u^1 z`OVag2Rp7qNuvBcW8wa|wFQ#q;STxy5F~%AnC^>;DV5{$d_En?-zcX0BWj9L*&xtG zz-e>EOi{k9UAsS2uaPttzn%~8v;4JUx<61%sT5zGMBbyX6w`fynxZs^`t{EvVScGy zyWiKYrIHN38sQDa#uQQhLc4aK*RG}6)cw}|2*UYXyLP{)T}#E}wZK=OMbHF&rd_+w zsnhE0RCaf%_c|L}_L!Ux9G#PSjVFKi00@Z>!fP zX@>F&9Iqc@k}ql3?zhxyQJPMZc5tx>NxrCEyWiBVr9zUlz@7&o#UH7c?z8HpG>ty= z;GG;q=0ok;eMY;M3P`00lsyb>`v=j>!S2(Fsn+WWP%TV-1xv? zaS1kk%lGXKTR{dw2qU%k!D3%0chZ$8xYHQ6twoxGM8CcBVf zun5AEz=g|qwoJKTG6VYuWA8T!Zwx&2%|Q~lKA_=YW$a9*%n(pgpz+%-_?|P|tlngo zESwhxvm-d93np?gr%0vY^?{+^y{QkeC``uC$~F@kV($05sbmRegfyU7^OSAQ@Y;ZI z=2x=OD%O2pb$Cr6;p|8HiP4NO889mw+h8xV^UVj7NqkA}61fQI=%fRr$CQgq4PO(u z^5(NlR{N^Ls{${)^}c>qHX^(-u>b8=J3r@yYXhs^p;9Eh%jMw}fx>q`)91zHFd5c@ z{tKxQ`R5*<0P{5v*gye+uqaj?Q08k}$!6Vb$6)(>Td8%S;=^ zjpE7-TmAl-ZG9!pE}GX;QFNSLvCp^!Z=H>L1~T4hHI=GpcG9S5!}~!&*q%A11pP;q zrLx%pPW7{{0|neE{cwFrvmIQlU*9DkBy_ zo$7Vb)#$a&R`U8-d=^#zi%e)L=Aym0{TVL3yUy+GW($N1^02g)aKR;AL&F7i{6Ku? z3~rk~8Z(>C;2cC-3!~GuzE6O{(tR_zR1qf8uxXZPf+a)UiMfZfq}c@CbrUlZuUq5z zWBR#KZL`=iH`3;B9~5zquyfVoW+M#@hTAPu$74@IiG3JA7Tna9?-CmcMmI+~f~&1faw(T-oFn_q9^oB5WxSDUE2duDUb;K=)}^~wsH5d;TQ zeYFUEhoNl9Zhc*FzO~I91P5|BpBfyvTZmts!>!flaal8IFZG&UWu@G1eD6T6m7ZE< zQyoo&`c#sa(cSsINoM^=`1Yv5)yFx`vA}+}?G@|yR<~u4d7bGtvDtXV*aBDOW|>1Z=;5r57~KjKo14YHGR^23GtWkB9XYZ^T!|a6(|; zA9NeO-ut|WDd5pTRC)ZlMYP~X6gKa@`hDcgUl*E5c;d04RKKS+h2u<@2`{!fqD5a&n8s|M<4u(=Q9 zj%`xK1>~Ga8!qq4rSwS$!Bqx{6*N0U-W7Wr?7WB-5_^hm6o*DEf&7by^x0A#F$dx< z(e3Pd>nRbFvL)a4@qdz36cHhUq{)CJz40;Ke3%B?rn4bBv3I&piWtcb+$20VODw_{ zzu;2?6F*I0V>d1$1U7w2`!#)3=0^CyxX1BM`PY2!z{Sr^ zWOH#Q^z)>XkG*TNFv8JP(1P)N5u5-%VEZ*aPa@{_Ylmr~!GW$dnE$ZeWI5*i-0?G< zR+(g*14}iVh3ok{VH{5W_2#A@^cN#Inm63`O+yC$eX}Os*p|?ce&p*dFliyjlo08KGNjvMa3NRM4|-m; zm>8OgSJ*+)GTDR7_|Jjdb+`w|s|WLLbA)CbDd2cfJJxq>XgWR+2R?SiApvhj{3B{$ zV?%|yTjO}$tr?+d^blml*RcIUHBl>_pn4q;D!^w1UOU%jRcI={#mIl7x)>44Cnb`I z%T2t1Jx>Tm{Q3c5GQJ}6Q&dL!-U26B2ioZH;s#FM7# zYE5N>qqW6^20P9u(3R+t1{>z4A?@^`q6RCzGEFD2o7iB%rwY*v(a3MJH<*vyJslaf zLf+h9!oeBnm#7n8euIcZGj$@m;szsr<053vW}9&??oh**s%{G#1pL5hD5?I}bF=U( zvygVHpn=Ef#YjC(+BdcVVbg4MtW8S}frOGYIkmNJT#>}L! zT0qiZH>HZ@#(RXf_<#96D3@DhxE-f;hUJ5jP$r%=1-%s)jqmtS25oO}*%Z_RkNZIA zLRNv>k*ls`DYyr|kgt<0R)x}cZ$%%fah?`R!_^!*rCJn(ytD?t+Y!bSmyxbX85v4d z#H#&xq`h-_p%nZ+kB+JVObqqM^@3KqzT!|aUT#EZRTrh9et43oNlCZ05A{9L--Oy| zOrK?TIdr)-AOB?)=1yxP&Yi>fqrRSP}K%kFK1uJHE@{KF%S_MEwVY^ zv`F+D?-%y+@1UPi0;mC0`~5>Z_-2R5j8PpkYdQ_;n0dPz_lcp6II9f3V2ze(NeEwf z3$@3AIKEMJRT^4PQkaDI<$^>%c@{St$G7D*nemj+Iy|H;|B~uqWoRvSw&O3WRb_c- z4IQgeA$w^x9Eg74BTm50Kk*~*tMPni)n{R7wekWvC0;v+tTJ>BeqG`<(fq{FDy8jy zHG$W?B%zhcOL9*l|Dqb?(oij4(w_fJwHO;(p|sVXEE6iovQ;nqN0Qd?`$|L0NhN8I zhjrj}onB}ePIJMlEqCNKv3q)`2A}W9Yik7SLrd|lPW%t*(`JO0;9K4N>#fUko&ip; zAK<8i!$KahUbK8={@k2onj|hXZWZ?NXVLGdCs$~ghYJp%0enrUE6#Oly`wKb)P+Pv zTQtZIb*3G1!&Nv5VYrP;#k0F0EmLQNJb1^05cPYzAoU!6UtvgAj(l6)6=_*r7;@vR zZb<7fDnp&Hy}Pa*t_XF+KXymjiSy$_9q_pxNINBNd?*PY-viH!^wh1M)P>sPmA#PG z^{fgd;?=#8*3adI67bSKx)-`EB;mBa=$yKSu__c#>$XIfrLglaVRPW4U*@Zsof&F} zZ@wdE|{LR75c-VKm)?wrYH{s#m^KdAbGIsG51j*ti%)sbk zBkn92;V6*=qZ>c*8cN1LoaRc@=nW5Uz_ZS9&!`rq!S%S~Sx#HmSrS}_|2oU5o!mA) zxE5c2llx2cQXO1_e|U@gShbiDTunwG>IVyaql4Fw5nUpF;~h@>l0a2(752T$X)W}K z;7Yvs9H)&0tAe%I`<~84NpJ;DI?uhOK5BAsxw6XUdY^kjwOtZihEKk)#o0GDSc9Lr zz#W4#^VQ*9J41oNHORTvvCICN?W(PVb*N>wd9&$G@imZ#^blt8*P^q?!etr?{QhnN zd>jH^G#m87r9F%eyz@b>2z$39GPBH5o1KE-5@>cRDsX`aXSQtlkb6?SH9AOkeN|WE ztMw=zuP+eikS0lM)%ypl@!)#&sG5d?;3C>Pb?gIcwKaQm9l-eDLQ>te`adJMfV^*7 zeoqWmDb3ZEhjevwY;eBP4o!X-?Ngsq5v;`ABf8hCI5>}VVu|?gM|6YovS5Xhe6W>q zc`EGV`sX?{nKWAku1L zWpIwty2gc&*18T0mf(vaU9&PWI9us1Hx|R%cfx)&j>zbuWB4|Pqhts;&av6P*LKGG zleLSbvpLR`CoV8974GMcps%?X4M+X{U2)q?jm{Q*7v*CDQ!4oPiDCwvwv$E=3X3K0 z+t#Jgab(s!K9SSUjK(*TS+=6z0W+g5_kcX?${85LcecaG#WSBb5k(p}T`4UaG(KW~ zxS_JqhKE$~t&TyP&}db{rQ#`^w-@$n1q;x4{rq%IqXl1Gz<)$0b^2BPqDCUCQlzI* zT`J5KqCM$w&=}}@zyuyn6e1_~#Fhh0Y$U>})vMh^i|+g)9yEx+3(0Em5>shqo4rwl z*MTT~EKzip9x^83)7AV-RatA1;f%qV%&d26PBY54sSt*Lsi}^RH>JfP&QAvv_ zh|X^mV2zr8QJ)*djXZv2DgTDvuCNi|x)RXg`i>K3;Zw6vvHosBBZrHZ@h|Dib8I7# zL4mRxNL!&i=k9~@1W{-oe0n)=j2gw)xMHJ{ zE(!(819o>6W)P(YvQbpu%1l*SnbqBdmAK~`T_ZX)n2$HC;SQ@$T^pQ2s}UIo2Bb$D zaojqtqxzuQ;AEV=j??4<6~Rfk-+EnIYl0JT+y+k5gBTv1fVqvj{&He)ywcRZzmd~M zhVz2sa9|Vne(PR;l)+_l<~!!vZ?_$`o`c!wFmt78zj&wdknph}z(QaGH^?x`pVwaS z)i$ODTsyzei~Nflz4Qf4S_pEkk9<_AmL9Z5M0c@7{@W57Qx7$5v$qoYOl?eo^@+s5 z_t!qiihX7`_6Jowss^WjAtpB_!zp@)S=SYf{Xk>)U7gEqZ5sO?sybq7)fA>T_JLS~ zh+I)JD;Q?14t)2FOy6dZiBZ+mSn?rXQDg7G;Adac=fL1bMRijmYg3-1w^6mZY;x2a z?75Dqjaby!GjQ?fYr07KW;gZ-gu^cqWw_SX-NCwhpfR$Cy)~w>TVQSD6C?xljY3Uh z*A|H%5se16HpU0ao9J?07HqVIM*aUe194y@(Tjo3LCKLV*Tboc6PBWmfz!=KvYeF# z-2zn|jM*^MHg?7@mUCbH=N#5c|)Fjmh%hIZti8n zCBOd&oUa+4qcknXJK@~ATW)II{EZKn;2&>7|Iu)s5}u8Z-HeVf)nJgAM~P`;ot$)c15)2OjS5oEcoT0`7BylS_UT>F{80MJP9ZN z!e1VuEpZXSrewI&VDVbNu`aQka9(wq;qcxqwln6%rUT+Hpu2gE&?HFwA{0g)pgp?N z?_VJJ+}q3X&{bkU&AjwMzS8Yw_`_AAcK9vWxwp^7&DXSc*Jpbv-m^lC$6IbiE}|6B z4cC<#GjZQ*xgPrP`fQ)0xchAtw*Y(HqJUQ%L0$AtdTcKVd_Uoy_-K0IiRs&Cn@9sw zi_=zts7l_>4buCVw7obmX_8jGz(>mVS%Hp|AJ)6d-d+@Vb#j9~-0bZ$A>5jpTHNMt zRD=J#iL>MK^7kE}R`Z0N|@jbe&$M?EL>ZVOBQu8z)J zM>R~q@3UU8CR&D=SDWq?PaA(Wb`=WwHRvGs4rlWF-xqunLveU_f1QY?DC8m%&yKh* zMK^-Z3pt4-H3`p3MSIjftvKW$!a_|1H8EsYI;iI_=|mU#AsgQKF|SSOi$YfN3{BT? zT*!j^e99kJL!J>bD{^J~XS_D69~m+!!|%0U38jHWANR#eKj&rDQ&C97yFb?jn-?;Y zSZhMGp&v3ilC-Of$J~x9#xBCY{!-v1NpQf?|OmAgEzUpah-#YZN7kaUF8yR z@J%b5!)Is7$1eNhh+6mHn9ux^w)vx(ScNtr<~$)kSAF&Wmz$$2k^1yhu*PVMJaMMe>mXow= z>29j>=lV_Xik_a@wcK94M$%n4?gef<^7K$lIZ-jCJ8{Vi+;HUSu9$LyVoDefIl+06 zr<-ERl444Ckg^?uJY8GNE{Z9~E2gx&#k?IioFHlLteA2;#gqd0;t7&>9>tW~Qqv^e zHcIeWP@v-XVJ45PUZ==yl;yIAh&<&6$1V0}Z6Dis_(WzO^IVXp+-$s0i13$qJIdph z86NWc*9yL|ArQ&Nfrz(G<~4~>eyEy^{IynTY-ka2rcF-@LJRT6HoA3&qR;~JK~b&U zDh*ZPe(f}oyRSMlAKT-RDxTVA4OJfbJs$C#s+Bz=G!MFKq9l$v33bE&uH@U}e_uAH zQay3}aDr}aU~H&Dk)q7r0@B=Pr*Qr8%0#41Dyl=}_|8Q1al4i_1)g69a}av05Pl#L z1oZdR3;EF#g|ul+NoX!!nS?aaR$-`=v~rqcG(R*)kq8g(s8hsV8!Ewnc0^ayCO0KC z8~@S?X}LNwRE+n!QKa=`y^IgUyrR_~_Hdzm0u`k^D929vCrx zLPv}hp)q7yr<($XMng<=IC4A+;5@C!%@5+oDn9F zbCCPvX?b1}|4x%Iuf1U7mIs8DYG#IY4sIoJ6IoT?a&oh%h_Z>&LOtZ8Q zc1Nr=WcdB*Tn?UG2fFLhUvPI2&R@l+i_+(CJrGYVh`yTvPZL&=Tj}!bFte_`$e``_nN&%r{osA2jU|6K&ty z8bHlCL;P86w(c}fHdR|bu{>s3Vo5XqYHl=dw-%Wt(|fKshtt&0`nT01-e6yBPdC2D z9d?8av92c(T);ZhF5fGQPanJ?2 zU&E)z@$vZB5!4&GUnMZa;y%TXq#EvcSr6zw`xZ5ku(;c?n3Upskm`Judp-*=XNDJ z#b*`M{i0$@qw$rld=8S&D5m=b#gs#j$DK$(*Pvmp*rdwHmba|qtae+nN}p9||O^DQa-dB+?_#}oW0#~;q`P!K*we><{s=efOH71!19k>TEh{uGYp zO(6eGD2Si&{YPOK;r@{{0!aRe8tyOfV@+IUTWOPcqgDZ_Qh7l=Q8xcYy+-b@@CQvW zz>zj$?_n-Qkbi?bp;zw9a240cc|~ah)$%U*h)XfczZwi0xxZF6YTzdljo@w_E%+1< zT+9Ec*T{VpyPCO7QCi=hFGYclXL@rUeCAoMzv%uoY9mT(>A*Czu%t$3>HZc^2?I;l;APKnLj?Ix zNSypE*tox^Stv@YNYje9p5u~5`CskY{eyNbt)z*fiS-z@Yxi$zVnwOez5`km61FJ+ zMI-dUyV;`qO7s#*E0nl+IK_1Tq_~!rN1X`r-w-_#QRMzkF{NcR4+Rg|I7D(&aQ_Zh zB$1+2(=Mef-G8Y0g`}m_PVm6aAX*E|Zpaq3bVX^g z^K*mj&+8zN;vhvJdU&RI%dRcG#B)B;4(B3c`f$3o3I_g_|_lVLFT zfQf&MUoAW+4&&4L_l$p{?_EQLGNFs}IwR=WI!+n4Sf@GK8OPZy_SNF^mVDbsrVQ)5 zw&CVCZ4X%kCT!2Md~Z2qf7jwO8y$C9+Mt7u67wGOa_2Pj0JPrO!E_3Zc9~68sGaj2 z@n`OB*K?wed%)H17Ev@FM{AASjpNZ^#BnD%|3SZt!xb-)Hz*FLy$0DXyYTYY;I)vQ zc+YF3nmK5;9r#p$cHWMMzfRm(abq)=XY$zTMhRT|Ewm&aTeOE3J=W+Ya{sM3mFk4g zNY_%=Oy&*_YT9Me8ygI|K%_0=5koIn6U9eUp+WXIas4YKay)K+112dlQtV~e7)K)D z{#Wyh-2c#&IHg^tf3=q%-}(kgji97X+KG>!By3btDeb@oCt;Q%n`mn7(yi8hq+O@+ z_g{n;!lET#x&=F4C!TGJDg6(7-r#Zsnbb_0G1ATSaiXV9Gyo*sgr9gF8Y&9$9{3~~JWG_Wx3@9$_WQe2M4ooknJ8_y zKSsZtrzFP{uf#*T&M{uGrg8AVVFr+$qI4~&{bXOX7^E%SJ3E8K4zb)%R{4fMdr zke~*pcseOFzM#Q1)H%!Hvp;Nm+xnZeon$tlNLBD^C0AFuk zhI9PUjT2;zH|CPEuOd8`EDf~BPfs^4 z!sqwFayr>VuV0rL9wwhYBl{2NVy&%Atiq4qh*ImwqHBwqdd$5$R`j=F7#DP!J~Zxf zP2dOdMrV-!jNk7RjUM4E$0FkyaWshMwu;}{t>R|WqqarpF0{~k+SK2?$eLmqW3gMd zT7I$|HNR!P*XA{MLERnCn<`u<>|?~IZD(y+cZ(+ObC=yX!;xUc1mIX5v4m+de9`;E9c45u4P4RHM|{{?v#!i|EC+t zz)>q8*2<=h3%! z`5}U55ZoOKk3n(@tnKpy9nvB5d~G`|@rXP*^l^gR6CBf=lb*5(FdU*DJwvdggiJ_4 zwndd9#6~gNo@HrkJvq-WR0|h55K<)O*!)9(NYnmAbk`mchNIeyOsyhYg*pYKGzmQU%$VnGPP+=;0B1E zk!sy(EA53YLfyEo)eX-W8r?cM-OBxF$TOUX<0tU(u6g{6=ws(|#!cu^XS^^3t#GU~ z#-SYhE2gE~KlTpdF|o64jk&vci}k$uWz#_GFw0`o6-&MCWAkn1f9$t|2z-|FdTYID zFL%V2BmTzK*@EIMp}}(Ac$CYt&oqv43~`9UhgPejL0HL|oQ?_nuZ9z@F8o%BZEIZDKTZq}xHp|4q< z+fqp(@yVj}v6cY25I3#jVGMFfO@LW0Fc`F)kuJjIjSO)FnnSzZf*kTxs$pBDk4#>J zK&!~{TR3QH=41 zG>D$1G>1v<2yz94L7yzWXLA}-{Qkal+JVVak*AtINtDjnr_tA2kq?l%B6=2UF_qp` zQ!aXzs4+Fm#Rg^UM)J`rz2n$x5Y)Uzo*E_A@@$$nNP3%=4)QEhN=YtPOU^32<@`rE z;Q`Z9^(?3NNCiUje5F!IZ?>)!X3q+c#F5SFBr#^WL^=FGskhQu*X{H?1N}?msa5Nq zD4l^SnGJ$HL48u4XQh?*gM=d8iEcuTuK8#N-@|zVdH8#seFcw@@3>uP6n?b-1m_4m zWFKuCX8XssU2G$cw0>c_Z0=zlY8q+UXt~FdYN;~+Ej}i`Z!WX0vhFt>vYp_*Fu5#e ztR``_`7ZM*)$7Y5Cir6eKU8(n%y&DN;($DtfQ{3D{XL z{i(VWJl8)?X-4*1c*GV>BHMfzY9-mm6%qtS`QCf%@=9co;5TJ-jjsPx=vG zSqGUZ*HBaRY@`{TH1j$vRYcAyjHzNp6yCWNnbnvGW7KOyD9}CuT~2hNng?W zg5>pz>A69vebSe%J9TXfDP&Pzqt-N0`U2iHIxi&^8p-Pp*Yhcz>Ud@8SzTu4+q7PG z=HnQ4G3;d6!7#Io&D&btugm7Gtt_&63&UoHO$>_+8yOZD=JgDRPV-1_0n9NBXEVX# zyqZJkUxxo-_-}^)V)#!TlS8M`A36)dzcc(B!@n~83&TG%{1d}JYD^EEMn7m4u_%nt-W%!dQw;Vc+K8{)_ zJND5fhA%Sw5yKxc`~kxk7=FKni(8HeK<60;?=gIi;ddE+hvBymALIXVAica`X*Pdu1yYZ=t#~4(~cP{Y3P7IcuTi7UDA+5EZXD8s=0{jucDzn zzULj?R)VUAM7;G~-5$Kz4GFmV9C}mrGPVIen@YC0&V5g}C!wq%9=AP@)IFcu_=a}) z=krM0bF!+TE&l6$Z7@bejr0qaL<3TK8IBHos@Kng)o|jq8Lkf02(zJq)iN^nZ;6-?(rN&bbTG9pU5?O+Eg23^AYr_2t#e%B1Wz-CZ*Aii`r`j5)(tndJQ|2^n9kpt;v7-iw? z7Tr>+GhTZik^;-xJV3XRgWfn%xsQElXMUI*y$hP^pd^gJ+oR+g)#;!f`~QEVdSW;; z(4pN^tODnfa0XPW+FIxK=3VsJ=Gi93LmPG2aUx|{sg?Bo$!OsZd-T1gs<%3 zr6U{T1*4|o4XzjZSO*K4Az8JK1moNxlzKE*GH-I|CDIYUNamc`3;VyEg zars3w4G+1>b-+6=an5+{1IW%}&I3;R8D?<9bt0c0nqJ2-y{MV#^~}0nk92ZorqeSs zot~NL^vq1BXKvl;nX=8_x;mp>2mQCeQrk1UP^XO;EaO`@&X#cuk7ala!=o7<#qdam zM*zcd_Ue$ulE*m6Wq3Hl!x$dQ@Q~JQX1YT&bcc2NF_W3;56w(}XpZ)WE#0A+=?=|I zcW7q1Lo?GIn%`l*#%O+r{+ zewg8h7=Do9Jq*_~{D8)EW?{Zxv!IRceGK2r@I4IQ&G20e-^nmmS(#aw?@%r1%)-2z z;oBJwFnk-s{?=@9Gu$c4Ei(&C$Ebxev#@kvIEmr*3@0+2z_7${d<#cEXJcu{IB3go z8;0W;b}`IM_$|zY-_kPSS3hTCX+7i5wlEWZi-mcBnPC&dBEv?81y2-*+!7_Pg_SbWX!R}6p2@D~h!&hTdpf7+UJ%>P%|m%v4J zBoEI!=N>?v@ty&1@Zu2f12x_#A|j%qprRrmpg~1Ne4`MJMt$$8y~aED9W^H8aAq`d zH*OB2$>z=)&2C~6bLb|UW8?8v_gwv+lmF*$*-($_?&|99s_N?Qs()!en7+`#mv!(Z zi|LZ#Q@k^nvw>e~5-thng;T;&RD6vefj-~BkHc9*U9Fh&%%$Ki!FG+E8r(IYotNPZ zF7-OojkOMxcKD9{d?MO$06Zbj?&rHwYtyVBr}bK@%=J2W zoeo~BgV*TbIvuQxtvdK#9lS*cZ`Q&0 z=-?(D+(^TGdVljKbm@MO_|G2VbDQJ$fr|-0KB<=F3hY;Lpo{zY1Qa+3qWt!LekbY+ zlD+xR0X~sIIs5r6^v*&4!V8D_E=kAa8v-fO+~;-vgC$+!nG}QLU-tKHw{13SPfLZl z-n7#Apm-FblKquC$zFyxT`9+87J^FV%j3|b`Qn=qKP~vcX31mC_)U=173IzsTcY6$ z#24tl7sz8w zSD9EuSH#I95GoUYr@l$$@^Ex;sTjRt37sAy4@38ri^piZA{i3mRA?V=SII+A?@IAY z8gH6B7$q(f&r;vK7J1O4zbq4J`n_%Cfz4e@gg9nYlppwhXdA=bhPZi-Cmad(g|=o} z3u~$6ElX!}6S&xW85_he#4KT-An?;UKR1ls3Gbhi40pr*99~LpTpf8a4!1ZSWV%o! zNNJ6$(CG)6M``Z&Z(Ir7$1mlFA<4zN)G6*|=+cX9B3&@Ku@h z=589TMdJ!I_Yr0@{TjS?<8pWnURO6xedk&SbaWas2Tgs2?MkDxXsjU*#*@)Mf9ERD z;71r2U29TfH5&35gXnMW#wv8_F=iM2t!?8nRP1AS(BG09E0O03=8*PV1$yg_Z{_Oj ztV1+aZ5x*YRi&ll(2)~@bI+UX-Sl6(HkQF(Yih=!bDfxKwDT$Li+pF}5>)XtvsK&f zVkA7Hr6s9xk-B3vqH9iWEQOkDYsaZc@7}GR%eJFL#I(^?1Q$}OMNOxijSJ9}8gVOK zQ(EJEsHwhw9I9%?uS1E~d5C#=OdA)VV`B;0zg$!)uk{O41wOt@ykV^&F5BU>-L`&a z`4ZlKSxh}4HqLkYFqJ zo?B$q32)KgWIg^EN(*F0)?lh^{S#SYL4dvq;^L zv4$pWh1>xM1NPVp(1>bwCE6?S+7Yqi&5II5KaN!=#`*Py7Ox(qNNhKKgwAkd`S1S zR?Z|P3nT`YtVcUNf(514@N=k=AR7CjYgdF;>ZcHXZE`bjLzljRm%gV8G|EG&l{1hd zO}I)IZ6T*O8`HH+k+S48)Gk(Aw{5qnR0JnDulJj2}U(hN4~lkb+qti2%gXPKvVLCWU2}f?Y)}MRe)%xKEhh* ziLO=(KT_YkZRC{Zua^l94dMzJ(o~+ z964r)(eUul&4F@mv#CJr!_f1nOr8of*VN#7blc0;pm!eO%y2xNPE3GYBh zArS+L>n51#W_URVr4@?*qrORN4qUd+nI%ROOTZA9%9Bxz1dBF%w)ncXL^dvQ zUHfekN-WZTE0!lB&s^~X8n0fS09k&-pQvx%?(+EN#1gS1bH|E2Z*ctPXm7h=i?
wiouVq`dyr8*hj5ta&DHqH0(FbF-lVF-$f=-XqSUS>3xfr4G zVl&laX`wt1&6yy6LVfdE<+;swO%xf8?5dQD$P6l9tj_H|St=#6T>;M<@forI2b z52nj=01>7{p_=_5R97d}<*OIIs6*d;%O9aTwisSd z?>{VLqrep|3FN70M%P;ML-&ZHLrsP2AMwBP=13X{nAG#+qfH;C?i+8eI-MnC+IGX+l61WOY%o0bT1`Z;z$6e(Hpz0i0;ll@uB{Yq*WKA|6#GhqLgmhRW?~+kh8lOy_W&}T&ft*SKY-+ zR9SD1+|c}w9^x3ypk>JGQTG(_aT;-gT;F^#MLXnDwY(0+e-1)rL@)7O3LA!fE%Njh zX~he}xdwtvfzGbKSxTfanz~3k30BE<$lO=_p024}UX2E&YDLyOc@^rBCcb~inD`8F zJsth*lWa>NN9twZlUxx^R(VL4zII{c5RVM(yLY8e)ZFLV1ZIZEi@p ziV;mr5?{YV{7o`AKC}O1kGBo7R$B%^Vt`y@ikJ-1^0K)cwih$$nA{co2t`U)H0LLQ zj&bJoC|#O|{j4=>r8=cED*ms=CW5)$2^IY!T#CF}gie<$Nx;3@S~T)Ep_4X$w}t3KP3T*x(q{Jt&5(E#mDbH= zjOb$Y{5M=QI6kodVrQ(kEYHE4xl>@Y+l4>)?|Fv(Hy8*PW%)%2gQ@gGm;WVPq1BIF z$sin*#^j;vUkVPuGzT477IN>AkbPPj@H@{Utdpiq6iH#rZL9EKzZm*#P9bmKkE zZ7``pNk+_%LNq}%3`dR90~KAjix^Hk?_8>YwH7C?cdXWhjdOREWOH1x@ErhBV*&R5z|`74Ux*frR@tiJ6O@ z-YiT+@sq?%x~}!gpx_4ilTHw`a9v-14gJ?@Wgu2X8W!|a1~hNIBqV93l||`~w-GLM z{<82bRfE^5WHz7uLa^RxVylKYi~U{jYuvD!Eve?VrWVFg;tZjYe~CN6HZiI}mF03? zTBqcpeP;yv>Y!AmOhfzrD$u?@Z;F!Jy!~%NqJ}I+nTk%nF8oSSB#l>c(CM>+pZ+#k znS$>7yP#3*OO(lI?i&Jaxk}keHk$aRKu2Tra>^vs?k$0KWO`dF6PuIX7R)p;Qob?) z4Lm2jNjF@jj7JIYXnF!mVO(%iG5fr5nMTf0#-fQAglGs+825h4nC6b}3MrbFmMeFm z{P%>fX>U@zD8_e!d_cYJAK9JYeeP$8Gv}Jd80U!H;b~MEx0+qgJc@Gx)$v|dS%CJQ z5PqW@&r{~3L(gkv=t`vo?KsTQ`$jO$im^eWu`lzKd8p(?ZP^9NTr}_{;bW=|Z<9aJNf8R+O~;dxs2 zEvuDk^fAM~h)(qt`qSk{D^+OcW5P@Hw>)JTDtKHwo-33})aMD|8%mOS?MekmGH|eg zraS6qSEI!DV3#uQOCbmK{g&@ZqxMwrb^~v>^1>eKBIKUWAEr51sNkJOZEeA9f^)ct zEkx&4IOM2mEw)D$3;4b?m9vyGH0l}QJpHX$S%MOu6+WQ8c^PFfdgZ8ANYp5hB<`42 z^{iA%iCmVt=Bp)HtM%ODU>w|2!*P`rVZVh&k(!A-T)He^^D|DgP zh?iH^p=I}Lm0*Rk7OmVTd_fP_SY-_iS53{J*{FCS2fl&*!d+D5(j=u0r5+GY)8E!B ztI_QP!q4=#24xi%h_r3s9jUBr{_e0aKtmX()S|Qpw4!*Ra(DB<2ZcU&Dxe_-h#lO@ zZn6Gk6)YCWU^2isL`;ED34I`>Rw71#? zqm@mmdz->wJ;4GoWav$>=ji3&60&1^t>okd6*Y< zb$JD-sDf#aI?Uvsrl|E=RjzrYDlm5r*}rj&aEHCCE!#T7qL|m4mKh~+kMJVAba{c@ z&%9>%w=AFJrP*pHl=Bp)@q6T}kZtQ}j@G_jmzvnTpozn^PW9z#YvdRqd`&YsUv&{JGkdX`^zsrE7^Cs^ zOQot4`&c!8*IKm|n&s6v_N7|2CH|HKapjBArBduh{+KVx(yFW05RW@^(kbY+AX+C87#Z+kABYr7-0QqQYxwp8^te5#GGYrS%o^O$on&RMKtg;f0o<@R5 z`{RK2n6yKa1C?)O6q?aVO?G76ragr0*knUTw=pV>*R{!ta_?jIX}?*}tg(V7_;#-* zGdY_ZhH?aE9cmmWB+^HBy_-z%XE-%Qz3t*U{i&VT+GIpdFS8HrY!DY|%ZZ_K-*<;{ zrx24wQ!=7SKyOO0yngHN~3G(O8d8KF1!U8%}Rr zhweShJVt+O)wmXA9bxXJt8Ue}2C6PC9fmG5{6duYg7$Z$KFT$Nqoh&!Mf3$ zX+0fxpEb+M*v6W#S_=4KrY+{D*?ODF^tehx`zh8d9umd?1Ptt6xKZft^Jkl1Do@-|FDBZ&t&qp zygGoNVviudA3MfFh|6=v1)*ROq?o4w<^IN|n%omZG3u@#=OIkM+a%xvB&LCo6;mU> zv+hx7${#Gm#(T^7JBh49f=TS@jblknAr*yS`9iIF35Rk^quxG~Y4MVJ9xg19zkk^B=2+?_@kU~*3h z1;>c+P;|Z?sg?K4fT#GFG}b+m6f`>j3L$18q|dzH*^#0rkJOACWZk35H;eOcHh+i^ z(xNAy6cpWeMQ}~dGmcgyXeZ{T=$RR5P;`%v^3VAi;UDjTz!|~c+>=7&*qpCAUd1(# zXY*tfJhLL>Cc2~JX>*>6t2W?>?C_8DS@g__VtQsr*yKD77$leg?i=eKL#9oa466QWp(B{p(j)MOf_(N3@N3_+Tp`lHy~IWMKzpn zZzCbX=$z_{d{aWNP1}wOXG{OILhz!S_3+lUcsd)$4}uIIs`OdwC)6HpY+`t(W~6%!zVT3ZZEdtm zFk4jVY=B8a%m}7kw^$TO<9*|xmD19r@Cc~er?igTpUHy(NbRTIeyBC-Uczb8)ff22 zLP7l8I@A*=xD-FQrYGDe-xyN6Gc(-XAMa;Z>!;;R-(7$O)4U+WPjy55J`Q-OUOwvV z3F**cM)h0a8y$I^9VTIJ!lStIh|!yoj#nJ(fE0tB9JwGF#yFhPQ_I5sY#7Acc5x!No?ps+!@kVj z#XlQ&FW*P-IX)787dAS28TT4X>`nYP;={JDA+Amr+ceV*(;L>8O*bqqYohs}xx%uZ zU1#~ieBLtAy4jrWIB08Q+HC*XI?eb#n`t{@Oo*G-%RW`C6f@)gW}phgN^Qb>Z5xt zDb9MfqTG$R?G1zm(G_PLM*^&%(;IR0pZiEz*0YVkCO3q;Axfr(g?LsjN91?bWhWJh zo*g8P46_kT3^xR$0mU)t9tg|hvY9#<+Q}nbC~XrCC$ydXS9CWJ6x?rz%WComEtE(V ztY;^xY2qO0otJ2IW(k+-a9J!Y71am-o%P75vJs-`xi>WwM+!;GpoDf20=HqYxaEyD1dX3y+29GFpEK8XP2m^{e?TM0wj4sabT1 z5gJ(!A~mp{-K0j*CD=9vBgA3iSkIndw_JQ&i=f^lBk%c3wC64^I4eB+2?JTr-XMcr zkbky@MPvXx!IT-8E4+I%^c?dRj*=o6yk}pCAFTTxGK3u`|R429gd( z6~Tm;0`y>v4Gaj@8&)yciYXey&sVp+oCNh}AP8XI25a~j0Ugq%fb%DTa|?)4`WNwWfdploSrWSWP{I?+4xnbl;z(@iZ1^d?P3MjxXyIeZn$>c9wl z>|7_T@aYnH0USC62c8Y}0hc&>o_^3vKsPv|KyHL^6&q*CT6v1RGGH7$@5Y@Vcg z1wn$c7BMf=&CLqn%!<&T(vXpWo4b|A7Y8Hy6nA3a@@pE(>d0UtHs&ZvIe{Kf2cAb^ zwkPd?8N6dBB#WN+4|bZ~V45Ak85n_j8h6v(zp>J+;cG`fi4s^j&7_R$w44ZDjvNvWz zuJ>!@kShR!-hd_kFkVCbVl4xyG|(AZ2P3O2#6MiaLn!Vb+u={k%no$Y^(l2XEQ!F! zBuA-69M1~`(>!*J$jielq%%D=m2ZW%e8SG9Eod%~NG#~+q`+f&ehxT~8mgF8kt;<( zt1{m38NO09-M$K97VUr}ew$5u!A*Ep_*UTfPV7zQis3U^KGD)^40xd0y1Hn!D5sb^ zsoytwTLj!x=Ht*>pSV}ph^Cfv*&rzUskhp->yaKy3VV|R9YeH7b{1KOg_&r>6X2j* zf00G>h!+Jq1o;@9oJ%>}wa=GuyNO1pWQ8{|-~`r^{K;Xwp$`c2QHQ16 z3cP8faT5Zq0GA|84&!ckNLY(UaMB&^=LA|p`=zDP_Aixl%`{gF11$iftgK^rp(_(g zQJYF`4vmx-NFdcjrNQMRaGLSPOm-HHmK%sCXwGn5kO>@m@%Lq1LBFWkKr{y9#2yOP z?y*g`mRnYt71MLZuZ>P|6lCj`xF^`xnBN(vEMIj>#Xb*IN;CnaWDaHM1WoYdAP9{$ z0D?6^64vxVIB0pSy^=K6=O#44?p;%yD1!|+vt~Mk3dg~o(qrxc7x+5j+@)^h$l>Q} zG(yCK3!D8sUk99Ny0u!d;dtZ{7<^ysYY&4}Ss9G2HD?=e1JZ+!PX?Klnvs?UfwCYh zJ#IUeYL%w>+M)DC%-P7964aRE!?TzugN`U+G4n_l9IOgr!}m{x452Y2UFG=Nkld%} z=3?doY#->3GUftZTZzvJlo271b7zN7 ztcZjklnnJ{WQIlyM+XB#DTb+3?Q4bRmNOsg!=#n^@H`HSa9sDJJg~1HN)VVf7@20# zI3J$USRX-DvdNXqK{Cn%z`cVx9ZR-J^Lz=Y-7+S6$ql?6oG%{TT*mxPkLLqDIKj_DODtTn-jvGm7m)5oBn!qqXW>rJRnGIz03>LYuJVYLJ3|Yf`Tl%B z!p^KPiQA9W4I8dRympBJ)A zqU~M&w*c|Yz7iIpiw>?g;+C^6Y+uA=ljg!aKh9@Nu?qch1#~IN%cr;77WlCjmG>M@Y1C2#A%a1*#lvfM2`xZLaHUo^u)GJ(THX}`~`Hpy8W6Hf; ze>RlIIsGCUt`Bn$*1`=@x-8<~4a3>47UOe5g6UYCk3VPpF;3zY<1kAiKNF7AU*S6m z*To|4J7JP#7kAw8VBB!XztAO)72mNRH?0*K?b$}Faii@k)6Zge+j{d!(*#=!E(7wh zK47h|9kmYT7^}&0j(y$!wPhAN+fiozflb)NFmU>{ALaf9M!5MiDp>5mX4uzl0)&<91uPTAF%BJysDc*7F!?pLgE})MLs-R|`im$=QT#dAF*r<~XGq(kt3wpm^JI`-S35$V$#c|Th<4xA zKG+M-v0yJwo*@n1ojv4k%upKyOxnTa?9B0ZfP7;@Z7i$-HioF7PqyPz0aJ7&| z`SA%tQBhPpZRi8He2e=s)oez8_0S2j{9?+sa{ojqN*@cH{$5yvdW~ZXX;CxZk53OO zDXhb&KQ@>eW=*RAUU|2-;u6HpHVgJlPkaKNQVjmFA^kd&Y^eW;v_-Uyqeiz#s&L?6!hZgyXuM#%L(bKKTZGtWL!$sSovY`(M>_`AO)IS@ahe~y zGeHkTc3ez*W-~dYqiLGs$No$}3o`0C2-;}bZ+_CW$M~H1q3{*|Ki&iKyCvfW6zZR} z(2pIY^h|=LTqw)K$k1LoV!AWV-q3WX2o>&4**nf z#7Yezvj) zgChXB)-%y5{C`U|(GPVhEF{2`K^d4;ZMfgd|NYipem z+Yd0>fiPocqHSH+LcJrw5WokoWS~NFNT!yN;va@Ldiu~B~39CKa6ZPgbRo(Q2rn}SqA(v-FB&2i_m#QQF z1KDE0A%U%1klJZ6H);+3u6SNMC1>QA2PJu#9qRC(X3+D0g`c=SVg5&FaC{fB0rAP~ zEP9}_{n)=*TI!rlt>yY;b_-t1use;c<(LkV6@KjLtgk0C0{koZ21sxw<=%jp&l^(M zCFD4Zo_#C)*yR~2WBT(lG+)R26QK+&{fIjEbQc$)%{^J7&uP?^e(dt8t8+#!kzDHz zlWA%%wm*?%S}wUUH_ehc%FW9?#HQd4kJJJ-i>`Twza!L)^?G=>mzE;##_mJ#0;Lj0 z!LdTWn2aj-W0xjn7UA_!bD3Xthh>!Q#|}+w+k{$C&;PNV$v`z$vVYHrIV}qP*u6

9IHiV9dg{DrqwU=B#fvkIYHw=e5 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 n2Z<};;!koJTzS OUT). +Адаптирован для Linux (Ubuntu 24.04). """ import argparse @@ -56,7 +57,7 @@ SERVER_NAME = r"172.16.31.221\SQL" DATABASE_NAME = "Orion-14.01.21-1" SQL_USER = "sa" SQL_PASSWORD = "123456" -ODBC_DRIVER = "SQL Server Native Client 10.0" +ODBC_DRIVER = "ODBC Driver 18 for SQL Server" SQL_QUERY_TEMPLATE = r""" DECLARE @InputDate DATE = '{target_date}'; diff --git a/modules/zup_extractor.py b/modules/zup_extractor.py new file mode 100644 index 0000000..1aa9ff5 --- /dev/null +++ b/modules/zup_extractor.py @@ -0,0 +1,161 @@ +import os +import logging +from datetime import date +import pyodbc +import pandas as pd +from config import DATA_DIR, normalize_fio + +logger = logging.getLogger(__name__) + +# Конфигурация MS SQL Server 1С:ЗУП 3.1 +ZUP_SQL_CONFIG = { + "driver": "{ODBC Driver 18 for SQL Server}", + "server": os.getenv("ZUP_MS_SQL_SERVER", "192.168.1.10"), # Укажите IP MS SQL 1С + "database": os.getenv("ZUP_MS_SQL_DB", "zup_db"), + "user": os.getenv("ZUP_MS_SQL_USER", "sa"), + "password": os.getenv("ZUP_MS_SQL_PASS", "your_password"), +} + + +def get_zup_connection_string() -> str: + """Формирует строку подключения pyodbc к MS SQL Server.""" + return ( + f"DRIVER={ZUP_SQL_CONFIG['driver']};" + f"SERVER={ZUP_SQL_CONFIG['server']};" + f"DATABASE={ZUP_SQL_CONFIG['database']};" + f"UID={ZUP_SQL_CONFIG['user']};" + f"PWD={ZUP_SQL_CONFIG['password']};" + f"TrustServerCertificate=yes;" + f"Encrypt=no;" + ) + + +def fetch_zup_absences_from_sql(target_date: date) -> pd.DataFrame: + """ + Извлекает оперативные отсутствия и действующие декреты из MS SQL 1С:ЗУП 3.1 + на указанную дату. + """ + query = """ + DECLARE @TargetDate DATE = ?; + + -- 1. Оперативные отсутствия (Отпуска, Командировки, Больничные, Отгулы) + SELECT + LTRIM(RTRIM(ref_emp._Description)) AS [ФИО], + CASE state._Fld16925RRef + WHEN 0x9C10B2452D414FDF4A90E2B2AB81D3F7 THEN N'Отпуск основной' + WHEN 0xBA63FCF94B4AD0664ED369D2E6505D67 THEN N'Командировка' + WHEN 0x8C3B61F23954155A40EB0108FC0932DB THEN N'Болезнь' + WHEN 0x853001C18D0965EE4B2702405C94054A THEN N'Отпуск неоплачиваемый по разрешению работодателя' + WHEN 0xB7335AEFD8708C3E462861FC59489A38 THEN N'Отпуск по беременности и родам' + ELSE N'Другое отсутствие' + END AS [Вид_отсутствия] + + FROM dbo._InfoRg16921 state WITH (NOLOCK) + INNER JOIN dbo._Reference299 ref_emp WITH (NOLOCK) + ON state._Fld16922RRef = ref_emp._IDRRef + + WHERE @TargetDate BETWEEN CAST(CASE WHEN YEAR(state._Fld16926) > 3000 THEN DATEADD(YEAR, -2000, state._Fld16926) ELSE state._Fld16926 END AS DATE) + AND CAST(CASE WHEN YEAR(state._Fld16927) > 3000 THEN DATEADD(YEAR, -2000, state._Fld16927) ELSE state._Fld16927 END AS DATE) + + UNION ALL + + -- 2. Динамический выбор ДЕЙСТВУЮЩИХ декретниц по уходу за ребенком + SELECT + active_state.fio AS [ФИО], + N'Отпуск по уходу за ребенком' AS [Вид_отсутствия] + + FROM ( + SELECT + LTRIM(RTRIM(ref_emp._Description)) AS fio, + all_states._Fld16925RRef AS state_guid, + CAST(CASE WHEN YEAR(all_states._Fld16926) > 3000 THEN DATEADD(YEAR, -2000, all_states._Fld16926) ELSE all_states._Fld16926 END AS DATE) AS date_start, + ROW_NUMBER() OVER ( + PARTITION BY all_states._Fld16922RRef + ORDER BY all_states._Fld16926 DESC + ) AS rn + FROM dbo._InfoRg16921 all_states WITH (NOLOCK) + INNER JOIN dbo._Reference299 ref_emp WITH (NOLOCK) + ON all_states._Fld16922RRef = ref_emp._IDRRef + WHERE CAST(CASE WHEN YEAR(all_states._Fld16926) > 3000 THEN DATEADD(YEAR, -2000, all_states._Fld16926) ELSE all_states._Fld16926 END AS DATE) <= @TargetDate + ) active_state + + WHERE active_state.rn = 1 + AND active_state.state_guid = 0xA4FBA038663B3C2A48DA151C262855E1 + AND active_state.date_start >= DATEADD(YEAR, -3, @TargetDate) + + ORDER BY [ФИО] ASC; + """ + + conn_str = get_zup_connection_string() + with pyodbc.connect(conn_str) as conn: + df = pd.read_sql(query, conn, params=[target_date]) + + if not df.empty: + df['fio_clean'] = df['ФИО'].apply(normalize_fio) + return df + + +def fetch_zup_staff_from_sql() -> pd.DataFrame: + """Извлекает весь актуальный штат из MS SQL 1С:ЗУП.""" + query = """ + SELECT DISTINCT + LTRIM(RTRIM(ref_emp._Description)) AS [ФИО], + N'Организация' AS [Подразделение], + N'Сотрудник' AS [Должность] + FROM dbo._Reference299 ref_emp WITH (NOLOCK) + WHERE ref_emp._Description <> '' + AND ref_emp._Marked = 0x00 + ORDER BY [ФИО] ASC; + """ + conn_str = get_zup_connection_string() + with pyodbc.connect(conn_str) as conn: + df = pd.read_sql(query, conn) + + if not df.empty: + df['fio_clean'] = df['ФИО'].apply(normalize_fio) + return df + + +def sync_zup_to_excel(target_date: date) -> bool: + """ + Извлекает данные из MS SQL и автоматически создает локальные Excel-файлы 1С: + data/1c/Штат_DD_MM_YYYY.xlsx + data/1c/Отсутствия_DD_MM_YYYY.xlsx + """ + try: + date_str_file = target_date.strftime("%d_%m_%Y") + c_1c_dir = os.path.join(DATA_DIR, "1c") + os.makedirs(c_1c_dir, exist_ok=True) + + df_staff = fetch_zup_staff_from_sql() + df_absences = fetch_zup_absences_from_sql(target_date) + + logger.info(f"[1С Direct SQL] Выгрузка за {target_date.strftime('%d.%m.%Y')}: Штат ({len(df_staff)} чел.), Отсутствия ({len(df_absences)} чел.)") + + # Сохранение в формате, который ожидает data_loader.py + staff_excel_path = os.path.join(c_1c_dir, f"Штат_{date_str_file}.xlsx") + absences_excel_path = os.path.join(c_1c_dir, f"Отсутствия_{date_str_file}.xlsx") + + # Формируем структуру Excel с нужным количеством пропущенных строк (skiprows) + with pd.ExcelWriter(staff_excel_path, engine='openpyxl') as writer: + # Пустой заголовок (8 строк) для эмуляции отчета 1С + dummy_headers = pd.DataFrame([[""] * 13] * 8) + dummy_headers.to_excel(writer, index=False, header=False) + + # Данные + df_staff[['ФИО', 'Подразделение', 'Должность']].to_excel(writer, startrow=8, index=False) + + with pd.ExcelWriter(absences_excel_path, engine='openpyxl') as writer: + # Пустой заголовок (3 строки) для эмуляции отчета 1С + dummy_headers = pd.DataFrame([[""] * 3] * 3) + dummy_headers.to_excel(writer, index=False, header=False) + + # Данные + df_absences[['ФИО', 'Вид_отсутствия']].to_excel(writer, startrow=3, index=False) + + logger.info(f"[✓] Успешно созданы файлы 1С за {target_date.strftime('%d.%m.%Y')}: {staff_excel_path}, {absences_excel_path}") + return True + + except Exception as e: + logger.error(f"[❌] Ошибка прямого импорта из MS SQL 1С: {e}") + return False \ No newline at end of file