From b4a45a20de627d85ca74f9e56e0e071b1ac73c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B8=D0=BD=D0=B0?= <Алина@DESKTOP-PH8VQJA> Date: Sat, 18 May 2024 20:30:31 +0400 Subject: [PATCH] =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B6=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BA=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TypographyBusinessLogic.dll | Bin 0 -> 62976 bytes .../TypographyContracts.dll | Bin 0 -> 31744 bytes .../TypographyDataModels.dll | Bin 0 -> 6656 bytes .../TypographyFileImplement.dll | Bin 0 -> 40960 bytes .../TypographyListImplement.dll | Bin 0 -> 26112 bytes Typography/Typography.sln | 6 + .../BusinessLogics/OrderLogic.cs | 75 +++- .../BusinessLogics/ShopLogic.cs | 14 +- .../BindingModels/ShopBindingModel .cs | 3 +- .../BusinessLogicsContracts/IShopLogic.cs | 6 +- .../StoragesContracts/IShopStorage.cs | 4 +- .../ViewModels/ShopViewModel.cs | 5 +- .../TypographyDataModels/Models/IShopModel.cs | 3 +- .../DataFileSingleton.cs | 62 +++ .../Implements/ComponentStorage.cs | 85 ++++ .../Implements/OrderStorage.cs | 94 +++++ .../Implements/PrintedStorage.cs | 85 ++++ .../Implements/ShopStorage.cs | 134 ++++++ .../Models/Component.cs | 64 +++ .../TypographyFileImplement/Models/Order.cs | 86 ++++ .../TypographyFileImplement/Models/Printed.cs | 93 +++++ .../TypographyFileImplement/Models/Shop.cs | 111 +++++ .../TypographyFileImplement.csproj | 13 + .../Implements/ShopStorage .cs | 6 +- .../TypographyListImplement/Models/Shop.cs | 12 +- .../TypographyView/FormMain.Designer.cs | 338 +++++++-------- Typography/TypographyView/FormMain.cs | 9 + Typography/TypographyView/FormMain.resx | 62 +-- .../TypographyView/FormSale.Designer.cs | 120 ++++++ Typography/TypographyView/FormSale.cs | 79 ++++ Typography/TypographyView/FormSale.resx | 60 +++ .../TypographyView/FormShop.Designer.cs | 388 +++++++++--------- Typography/TypographyView/FormShop.cs | 7 + Typography/TypographyView/FormShop.resx | 71 +--- Typography/TypographyView/Program.cs | 20 +- .../TypographyView/TypographyView.csproj | 14 +- 36 files changed, 1610 insertions(+), 519 deletions(-) create mode 100644 Typography/ImplementationExtensions/TypographyBusinessLogic.dll create mode 100644 Typography/ImplementationExtensions/TypographyContracts.dll create mode 100644 Typography/ImplementationExtensions/TypographyDataModels.dll create mode 100644 Typography/ImplementationExtensions/TypographyFileImplement.dll create mode 100644 Typography/ImplementationExtensions/TypographyListImplement.dll create mode 100644 Typography/TypographyFileImplement/DataFileSingleton.cs create mode 100644 Typography/TypographyFileImplement/Implements/ComponentStorage.cs create mode 100644 Typography/TypographyFileImplement/Implements/OrderStorage.cs create mode 100644 Typography/TypographyFileImplement/Implements/PrintedStorage.cs create mode 100644 Typography/TypographyFileImplement/Implements/ShopStorage.cs create mode 100644 Typography/TypographyFileImplement/Models/Component.cs create mode 100644 Typography/TypographyFileImplement/Models/Order.cs create mode 100644 Typography/TypographyFileImplement/Models/Printed.cs create mode 100644 Typography/TypographyFileImplement/Models/Shop.cs create mode 100644 Typography/TypographyFileImplement/TypographyFileImplement.csproj create mode 100644 Typography/TypographyView/FormSale.Designer.cs create mode 100644 Typography/TypographyView/FormSale.cs create mode 100644 Typography/TypographyView/FormSale.resx diff --git a/Typography/ImplementationExtensions/TypographyBusinessLogic.dll b/Typography/ImplementationExtensions/TypographyBusinessLogic.dll new file mode 100644 index 0000000000000000000000000000000000000000..d1d4e48515618a9acc5c5abbebb609aa24d5fb4b GIT binary patch literal 62976 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 As{jB1 literal 0 HcmV?d00001 diff --git a/Typography/ImplementationExtensions/TypographyFileImplement.dll b/Typography/ImplementationExtensions/TypographyFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..44c5d5615bd216abbf527aafad40294d3838582e GIT binary patch literal 40960 zcmeIb3w%`7^)J58nVB=Myk_zO446RBk%SnY3ZfDMNL1b+(9$MDGC(BB;7p<*5GSIx zR@>TEt+k>cQcA7QqSg8$zR;>wTD7&c6^hzwt*zDG);{R}yVl<4%$X$qe*gB~`}y3@ z=icb7vtE0xwbx#IpMCZ`nE$D3$U{V4y#Dnsq6cv0znKF6YmkAs;P@XD(Ei{HRSy{F zzEHJneS5lcV=B2W74NKUjdyh=yDQfuDpNgOmF-=XvllL{>`b;L>hkkL)!Ou;IYj3g z9{Q*C3)?jvrqPvQqn_vnC|OEz?ftk`;&lKoq9Vaf6*n_De)VS%fzN*)YPpG_1Km^_f`E~4GXw#nz-9;nMxo6Rq`2OsG3X&eicqfyvXWy)$g0hw z^e_}%hB=BKt|9-pUzsr<*ya|b-jU8WpLhm#n$EvGj-M!qdSlY29h8(DNerX4<-qcClZbojq?{T{lX~&Wn0#@yiBE*T- z-qb1F?)2PtsADT#D(zSjLx)s5Bo6IRv)&D56}O<9-yFsKxRVV8ldlUAj2gPmc(GKhNH2#l?=~FZq<<63X77J z9wDt*5`*KK7(7WU8JzLl3iHbC>p^aHoU~#I*FX(7l~yt|)3{Y*ZmS<~s|snw5_VG) zLxD>xH89+2c5W-A#!8QrRxF8O{A*$;dTAxY(#);q z@wo8ZFk{C<3p1kuXeBoo?>(WUrao5X;MJbkXb`b64kzl3p`2=zs*j_o3D*SDCqO}_ z6Jh)>n- z6)#YtSPevFNi0G&HjY{8;FxI+j@jejm=O++DtB;HF3J_FniLo>PKZz~J%WG%SBfDB z81SbUf`9?1iXjN%_0YKp6$LMS=XJ+NCE=PGX#{VLHIw7fha~cD5r{e_kZmDOW&(*8 zqMnJdOh{IX>%H{Fq3mwcc2h}If}}P%ftyYQh)rTl`%3jV3X_>Vg@JaRx^f7ajwE&6 z5VCAwh>6DtCUJ*BpFL`=^-#@;rbqh6)r5leB)NZFNJ4P`Vq#|8yXmPQ#+otItd+#V z7D8&c9?qg)!UDno6mk`V+o zgaTCzLBK$jDuy6jQ&?Y-w*fVEavI6vn!>6b;=+>3foh0zEyPSFP!PI|kS{M?IFzlm z+EzAY1M5iJPwlm{oXpmdc9(i$uq@UvAOxwG6A{CJdKrNd;n-th3li0`IpPmH* zRZ)wsBpZQqiD33vNi2*)prEYe946GdVbKQoz=9k}@hwB@V)zhs!4`At!s(#$;M9fF zIWxx2LQ#s%g+F&4EYKs)1L+!ZtTbvo1;GGg#Ze4Fz`)H*F$4hv_a(&;1Pt7A6hjcM ziB;$yZXLPnOjG(S#DIomZtS2pGrP3_-xC zv>AecQDrj(0RtHsj7Z4ri z)Vz}{GsXcqHSZ+KjB#wdcE{ma%SUAMWX3pL%|9-iBQwU4E54cuKi1{XWv)@KXN^{7 zQ7&26{J;)KRjwc?Wo#xCLl7{qEm90Yz`*8OF$4kQM4KT97%`h62pA{X3_-xa%B5@w z0!EF^5Cr4E>)ID_4G)|{+tMlY9dl?6QpN)=^P!aqjIj`HOtfes!31{|#LM+5O zCcqJ5Jre*zv@>zOCU6ZUJDAXq6mlQB!jLl%=YA)1Ee)oGmlrTU`9>r$L&2$??9E1P zlBFL|xNh*Aa7{_+AhhoJ1TEERC_ME^3X%vY92!EQ!AVZwC5)O8+W>}{dTj_*$NK;GvDl&|?03Xbb9%|I$hDv7}&Wv635s^ZJ6-#7bVE2`nI15_Kq&I1_12 zpb)KOwkIBFa#lVaJ74(p|DWVT|=7^fyLDskBIQQ3kqxe%>dlqmxAesy0n1wsCl}4@Mq>3f}W7adw*$NIn{nu<` zqhyNhyc!C~z3I#FSvYVlyd>R+mRJjW(Uz-DRQ~3yhWgoF-6lR`T;qU{atT0lE{{B3@_sKvLG3q0TDUeC{&ijFxhzC-JcC zNSQJAJYXppo*gJXFBar>`DwICUx@(6W>^wC4!P%}!t9w`48n2O>rD;MSTp?vu(qAd zs7i~yx4Bm%I82oJIDu8nEqqB{g*L~RB(LVC6TwjVP|s0N#yx!tvwOb?1(~;B0&>j4 z6bz-WVP1wMG3>SU$zxa zlz^s)HEzj(?oQ%v@jY!ikG1L(^O9jCxpx^b>DW>r$E=q)@i)NH*bGZzcr>cv^RF7! z4fMl9$TO9|PWmT2vX*Dt3TTqGg)hl(plz%Zpf;*GH`*M;9`@G;Dg8}w@@nRpTbwYg zW7f;;`6kvq9`1VayyK4RP&O`>WaE-mQSA{i9#qP4y`tk~_}T82}3#ZA{-=p zVD(RiA53by{)h7zm|K{eiJ?Wsz?Wqpjze@yzk&zmS*C|FMe`rc@+D3Tl-lv*w1eU`LS!+iN>GA zO_ytVu%l0?W%Slv%g6H=m|K{e#2v-zZ38B2c`J}(*1H_TUGOnB!xCO9YGNk>xYqI> z)KMk(<@dTT>!68R=1cN!v~|_;Js_o)9gnEx_u0w4tcWF`rZ<6ht`L5g4S^-u5Ztxg zix{dnhCk>S)~gu!lKdV!wbyN|(!z8C<5gNX`|VJ3OWPgkADu|C0y?EV2V7O!PHkh( zOKnSIALKc;?Qnb7=JxeHwy$cNC3bD!hsaRdvmhO~PG_S_-p^WkEODRU+UCe|Y8%T? zB>jQd@oa179JvM`L-8kw)KG8-2h}#W;CCgsw#Bpf@r$3F+OB3lA8J465BBrXAU}3( zJ00>TzmE=~wg)@`0MQeCWW;D$T90L9K!?fF*d^zesi{l z--dP9_7>C?YCe+wSoft1ny78QBp*auyRNVzs@3`jVCM72#PN%?{*7Hd1PQ;%Q`3vB zfIE=CW&>eKHV}Kg^boJrn0Ar$-*p^da2$L|KFo&EGQ?}Oa0Wz{ThQ*n{^0~R9)a0w z^-6GU-zJ>_-!aamCw88A&)q3x%_Sc}40gt`Bj5^TQ&NEgZ>pyta^BN=xL<^75a_=|{P1bv!U9I|IXQFj4rqBa+4^VdUPG;(TZWVYEcj4TxNO4lT@ALX(BE z=5V3g9iI+io>mMhMGq@J#$nXE6nh}d$1cWG?2UM9PryiU0RChp_{jsD2AhMGz)JQr zhXSn6JMTg*4J02IL68Mj#Bv0|24>eINRb5{;z2y5DKIwajhZ+IxO7JO^Yihf z^5@*oJhTq}F#96uu=aP+V1Ido{PB8TXPf7!{K+4qgILc$$)R4=r{aXe31iS+{8acx zA=!KJdLAcp3v-h^VS6_NlL6TTzO z=GY8NVi;Pk_t(Hdy(59S^^WIC$CQ=)IcsT7F;uZma$q_86^vITU8Zw_O&-^I*2FQZ zJg0v-b)wa$hAvfPt?~& zeO?^X9A(NN*&KyM*i$ z79kJjmW6=w?2g%s+nVcf&f3ZvVmf_jzrW#LWU$RXf{6dIt(e9=T`HAcDHA^ZD1ykU|@Om(nz zGqm|!_7+@gW1i$FPEfAs9f*z@TBmvXoiLy^z5$5};W#_kl^mMz--U2`UsgFMUfxq_ zBf@9p@hjXM>DesJ+37f{_aujETZ?SriN&@l`fPJx4p0KBhe*3OIUX7)0e68Y>8D)M zx-=@q%6uBEtR_Yk6G=wbzUGeZXXWFCh^LuNeH)HsOtKbuEZUJBH5M(lmNTN*AE0%X zFBv*rb8d${XVk{(vR2BrD0kF`$b(FUEm%6e@(H~Gc~DYpR2*qt8YZnwD_GfHAP@Y6 z%2jS(2jyY9^aOhlb(Szh9=_(}VLfYoZ$R%bPSr_Ci4}S>LZYF%r zVC^`qx!=)5<;=)x3jY%-N5z3b^UCMf24qZ0&v!}d(*Fa7GgvEfGqw_3&X`=C;zJJj zUWRfan2N}UysVI!eNYW!3Ua@rhFqK}37Ti`F{3#dD7=3hx;(+ zLh5UQ)_f2gr@p2-p@=ri{`*jL!PTXYaSApLOaW$-Ybjh}%EMRkcQCCcC~_I*T4`vxM~Ua$zhDoQf%Okk^{B-?l}D`$ zH1lb8Vl!8Jk{EIeZ|MwbFy2#ElkbP(`)CmR13+zEuD07!uJ#|HJ^mtX^dJa(H&~1L z{24eLAkr1D-n(cXkCi~ec?K=*XDDuoX=b;yMIS%~DN@f_&3a(YHn()6|L%=?wh}o{ z*b32UlBXWd)AKOmR0Qr5Jb-5QfsaKxLUk``o_-SyXbtY3(-=Xz8r!1W#^cxMmM^$l zo}JUu7Uj0g=0L*c9N-fMF`WZLo;B?pI331aL4|Z7cNL4?z`KHyUgVP2r3ccR(*08wtbhPW@NHoY7mz`#r>DSGEf5$mj_XU{V9H@EUYUpTq0zHUVBTb+F)+9Z*GxI^rQNCau63|S^w)FnH8c-+%a_tM3)T1J#+%WMUQ&RXm$QSibl{k3eDmXw90pSag+`gECGxZT~}O2`6B%mq*400@TWnvFITW`#mRoaZ!{m7wJKfZV~%mF5M41JB0tb@LLPa;t(zMa%`s{wkTa7 z()%H`XtwaHke?{EMpl$ql#FmTu7`b#3d)D07k>?|D2dXn!fsghhZtWb_?yD75&Ut% zJ%Ya~_z1!875t9{-SG7b$>HMAE8YTXF54O@pz}fu?~ZJR$ET6KQ8YYsH9X!Nc@#SD zhME8MGLGbz((6eDjGqu8r|ih=F%hNLEnp!f(Cqh^`KD4 zW9Bx{B6?Od?-gn>J?Cn-lzt?dcObV7w1R#j)M24k(knvkM9LfRH1t!UUJ>e3^qR}c zr*ThW@5)Lu9d=o1!Do(GrmV#2O_!B5^tQ`NEB)4GWgVV}xSfh+J^jIDr5)=A%Tz4q z(}ylA8|cq2D_!)l%Sw{|?$X>y|8!|$4`XEgrO7MQLg{S}`Gr#cE~KDPvn1CSQP{|i z$|lMenaadgiVCIru#HNDQkm$bGNF{sOK6yJ0zDlK22P-8L4F`YTZ2V`Dta&Uf>A{e z3H+wOUkZFy;O&40H3mv>0{fA_0`P#p8gN{o7BDX`8Sv-+8Gz%h*?>`t^?Upb?-pF~ zrwixlz*&ywpL|)JBhq%4pDnDGR@Yl+10N-={uEdO{GtHszb;VORPcIfdy(ij2!2<9 z?Og3=U(JCPfUEp$;hMl|K-J0+%RjVOr!lY=u(>peY}_t6`CaiP4z4&u!>M$S_wqm) z?mJfkcGK4YAEzCF!;HOvZN@!-_ZbfXo@71+IK}fK;8D+OfNQ-+0Wb0X9`FY5Ujl5+ z2$s>ih7WLsSq!+q!_c4@;1BV&-ZHE!%z0C!f2IjR+*J!Nz)-Qi)p z37RWtKHxEv;VH%n=ua+calwS(32ECd`kkWB(AK|5bQIhw_*T)+i2miG&(PMtMsyUs zPVnnQ|3=ZjMf7hG{&zIwXzv35^TvMRJRNi@pAle$T=nq=<>1YS2zY29dZ46!*^3#b`gug3jQK^ORnKf(5z)r+Z zU)NMV?$&;KQByw<%0F7Qn=aIunp!XIHVM@y8T3<0HEVu_#`w0t-zH7f`o4@0u{|o( z+rgId-9{ljsVJikRto8avEo6j6w=8;y&e3Fk2OybsxQ!nH>C<`rk449d$A7B)3Rb; z5$;`!wQPFPUL!)Qv}|@!5styvXjxHkFV3yb*RqkpB7E|$Td3>lsqk%~VtU@8ZV#2x zdVbhM&i01y4VBZk6&0YO2SUT>O-=o|^e6ZX(}okXeHcd938nfljCKg6`Y?>XrDYZ2 zy~c35Q_JeYMKqkguVp_hd({|0j|p`};3s8ofO+?o`5a9@(6Y;eyNxmQxR%|3c{7Hd)3Tox?KZ0ECtCI{_SV((x=`GsS3_fI zHb3r5|9%xZkpeXmHTw5f=p~W&^Y?8rnrCOXnCz@N-d3}ZlT@|eh&3Ajlj2il)mc8sNH*4s6Ejt$4Yt+)sT9%J7s-?YJR$cy2V?5oZWmC$l z%<=Sqmfc#q*QlcdT6Sk?5#HT$wkofy+vhpu$4E9lSIAPh$qo#+2-l zaFscODzvP=Y`S?mRcqO-vI{}g3&k1qhtHtr9jY)qlUgQ9mQYz`;aRj(QOM`Wa3k@% zGMFm?&SxX7=Z8dnw`ip8LaBT<(p5sKd^XaxTDBV1Gn;PGvW`#@&89tCwlMgrF^BHZ zvQ@!1K;19Y6}YdA3D2cRwXC#sJg8@MyXw+B&sj8sA8KWGoEn}-KXa&=;j`(PsS+o8 zbXNFWS|X3HSD;4=!t?1GO>vLr)7kvEt9vw`Hs(+}g?ig~ylffTeWa;z!BX!6YL=&X zb>Cb>-9o)>+*S73@FIFxQ@50@1GNkXYea7wzOr<9G5t|f*OYAuFQw1(!#8Am!&}13 z>5rN^3Tg#?1_!WqWUHuKDE4q^cojXYsawjf0yXn=WyM$a_3)?YVNG3Ac1w6QEjvTW z_J(f>f0iEB)KO3^bkdnw4{KkXswueW;t#pH?t|@yuoS^y! zCEFW*I=qf<(9}^-?c|%qGL@wbR3Q|5crmgX zi|!RlS=mU>XxUw5e+_S>e+bn_+oNXQM*3*BYIjRnIPU^_V2+}EWyA7Pv~sR(vnsEf z{;H|H;i|j~Y5iGBb`;bm`h`$^)I#I(E~a;cQr@?a`q?1v!^FHTG;f~mZw9F6HRUU7 z%G*lwnrwed@_Om8ruK%HM`Teyf4w;G&RY*GVdBP z&*50$!E;UCS16>Z-+R8E_f?8&YNPk&ysyy+O$F%?D?N|q-9XKn3e!t@-=Ir1^|JX=-i@?JQ)B7T zyl>K-ntC5rZlZ@Z^)GrgZwHMymwTkV-%Qm)ZKsUq*LgS7`7YT`;_rfU-%Gq7`HP?xG!9a|b=<*+tK}G;gJ!x-@U4!&ee|f-Y{ALdK6+YHeoub>cj!l&;;3(@S6%JCOK)h|e)FTe@6umf zvODxod2OfNkljH&3$sz*NxedG)F0*DNndlx?xLHttQWGo=pLa|)OXV(F3r2?X|36U zPu$;4Khl)nQ<8rVy{ajW`d<2#tKIkLH(IvetjPZ!{mUiWPk}{h9CkytpY{r+a(y4& ztz{QLb{{?ElHE@~(z0I2?x&+dsi?nCe{gAjpZ=;fTWECt_lXuOe}2#C{0Ar?l=Al= zm1x<1b6oy|wA>~80kvq^ZpeN>ZwsaTJw$(UX+A`M*P353>hm8W&ywsoJWP2)ZKtbH zArDivrq+8Z@*kn|H1!Y9)ci+jgR9+R)U9Rv%^CTR(Irb&A8zuD%R4|{6-xD?pKj8! z-O%i(?aQ*>AE&E@;wqSt|2XY($)2F^Xjw00PtapRss24l&$%?8q?fg33(d-Zl3v%8 z-!m)!DSA^=GmW$JpQiU*?GDnPwQRpRHUA*xFV9By3=I>CYj{+^A%PxTI zS-RaN`yuVuvR=r32!n=v3G%;&?3XoXhWS^Xz8vD;VXBERXNr$G%=ZZ2tNBzglx5q_ z`5uLORpr4O$Jh48BrAzZ_>3$Fxz=kgxB68Jv;3z)XQ#3|KVIF0%} zPM!XY)1`mnyOlm8NCzVZIDFDL9594W#~+Lo;r$wh(*!mMY!bLw;3|P}K%C?Pmf~#f zVB|P@P&h{fe#JN#slw-mSSJr~D&9$ASRt@lV6DK(0{Z~*9;V>41)eK#nZVTo+XUi= z7D^A|g!+i@dBD$={e&i%{iQ#nY39=|83bR#y;R@8z-3u zBTE6T0-Vd4t-)2sVzVdQY#bs!;W$Kmes_rYr0x*$8PYzy8+yC3$~>IE*NB_H@a#9H znSrtg!Dr5EV*fSb^N`nwPy1dYKG%DV_{3=yd_5(8pE52md&*xhJ`gV-5TCGpKzx=K zH>*QGH$E0SAB&xjiBH@xI*x)mg#Ri{->@&^`EjO<;cZEM|USM{XAEd1k!z%H%U8+_8S+2C`FYenZKfqmk=PrUaTd^XZ&@F_^2F}-xD=Qh##E}(^3cWL;Go_$77 z^lP5|@-D`Hc}HVE@$<;TqS<7=QTn21m+_bUcc2+6_j>O!u8W4e`;2o+B7n1SZn4i; zQeNSGQuO-`uE2hSEAV;o^0Kz`&2Y1~AMt;Lk$N{j0-P)1b>a-asde5g+u=PVRrDUc z?F*UjQMlka??)m%WN_8}Lu`7{$EkEktbHK*uZ#ZcqMs+yBT{cAl8p+@VedzD1#-Pr z8|kXBmDKGj$+ltk6-_s{N*@jL z+{kp(Fu86Gb8~6hT5WLO+r)l{*fC6w$}qX=x~1N>3V*STV7K_~mIyBse#GR_zgjFr zr0uoR>L!tHmR8qFt81mzZH8Ii?EkKYhx60^{YHzo&wrbt@Pm;r_#YN)4;%b`)-K}< zQWdRX9^XHe@L12q_+DVXSbUSen_ehw_FrJmE&q-mb&ff*O6JQdnJ-&KdXh1{;4S}2 z#v;Jg2J6>hJ^v`b4lDLQ0gt1Kf;ya8j|HruR=`P=0X&Va0&Juk0M8NrQou&MEB`!T z2yhP8{SSjn0S^_#1-6Q`Riv%dO5VbR=%huuU8LJZx*gJ*!plXvQ~0}aroNU$s=roG{9KoAJzeP0T8nS+?=(mbatLP^L zZx{WHX!dEy`rAc+yXb5e{mTX4DLT6}WX;{8xm%=r1RfA+zlN;ygy=jW(x(JID}E1) z&Jhh+^QdSZ6`i*Pz9X7sawZK8S<_=mR!z>TPhimGd{&80mB~6|L}!dh#|mr^X@f`` zMcOF*IRfJ%jf=EZq^-hl13Xla5WHQy^oeGlXl@t$a*?J2xZrVV+bVdQhx^hl z(mvtziFCW*R|Q? zNAOC4RT?sXjNmf`HfYHFM!{PI#x-PqtKjWk?sZ1+J`GvAUGOVKx>N978nSe^;J0}> zGy6oRUpW04f;8nsOBltF=$2|q4)T==bmw+lZbc%O#SFTr;T+@+!PNbmy!`!$rl2>z^CJ1qDS4Ox0r@OMN? zmh{CML5B-Gf(I?`OQqmr1Xf#|u|~n0pxIj3DtMdlw+p^oAo+Bzy^V{0S^_lggJ(|a594T34WPKcM4~ha1IFGFZh!pJuI9f z!l69rOP=Hq5IGc1m2hSX-XM63;Bmp*L^C6tKH=;Xe3#(2iS&SQ`h{~?@FRl1DN@Q8 zzxk3w!K(zX21E{p(;%D{!Q+Bw1n(34GSS>6c)!3Wg>yu3qd@W|utDH#K;*4J@+O>& z;C+H$Ceoe4*(ICTHtJfZ2~V7c$>f{ zi?>s<@Nmg!RMFuQj=8do@tFc!1ZD*86nH@3VS!Z6nw0`)3TzRW5qMZ24HF%KGX=H? z%m~~m@PI%XE`9~>6i6eat-zTAGXf6?q~kQ#G1g2z{3LRc;O4o2s|vXvQqd0TLkVDct9XkiBw=l;9-F@n)#IiTLkVDcv$hr zu=GTH8g!ho1J6}28E+cDHQqO3W}P|5ywtqWv^)vV4$u3Z6TGv%o4i+ezwhn$9`gRd z8}beJRrzXtr}$R+F7kcO_jTWH-(9{#zCZhXR;hK0wb1&yb(eL}`ib?1W%$eeC;HFy zpX0yWzsrBO|1tlw{y+Hn6Sn-RB|lDS0yu#QV*eh(?l+9RdmewQn%0#r%EuQMN>%~- zqH6#jE!hBgMhX8ES4VUkU|abWfWPuFEcbl@aAgt0svtve(U$-}F8vyy(wP`${!hzp z5a~?=r2oU4ZF^IYZN6W`&|9?2(fo#Z`I&DoI1#Znt^97__m* znZ)^^wB06nUm4rKv54cjw)A1Z{xDmcTlP4hx99~xw}p)%w*Q$R>#r;Q3E&x}zXbFa zy${Hm{BN*$B)1+ikzLMn0MJB+{lG(jCbAp^o(E{+1S|}^0MNuKSU&I~K$DIGW#ZG$ z5pa$NG^r9}WZ-i|#lT17*SYw!L8ZW}@yTa{#sZo+AsY@j4y{dm>SiSP;{i>K=<&c$ z1~l>Mm@42C08M=2Weng{v^MeilM}(82592DJtqM_4ba57R}Jvf0r@vD#sfbS5brX; zo`FvrpA38s?3pwdPkScb@aE5VHvyV-Hogg9;EC@P;OD}&flp9O1HJ&Z4Se<)pH{(V zo=*q97|^68ux-#%K$Diiwn57QO1H$V3js~K2;L0Z1Zd*Ku@(5mfF^B$Hxu8YSO=JahwT*??K#=I$h*S(CGU0KyS+d6{@rW( z8hq<~N#8ZT2Yqk(e(x)=j%uOwQhOt!*nAtao#idAWM04`J_Wyj#WJD)FI$^YF!! zJXCKUJ`tFY`YpgZRDcRDzi)kWWlkl31*A%=s63hy`cShi=>lC?` zkl(2CO~xFUj9Q+II-HE^nT#r!jBgE01b-s<6TzPd{zUL6g5N}zaSn|#nyB7bNOO!; zl)$SKuO7U%;dMD)U&QM=}L@~L~Q@F{xM0YbnTsfyB(TN^Nh$4^} z1d}dyv^)KC#DX++r4uP>r}zWhIm(l!+7UK&ZdA_fI7Pz#1j!my`~e0XX52InWz z>G-;Y>a=hNc3LsvVZy0)r*+nI$4-d{w$@x8b7@}J+MP_vPzyOwT`}3&GXA=b8cB^GwCM`9MlJ5`6k$N0F0M=|EMcXTIGi8i}Dz~v00kSDlZDq18H zSdw);n}s zsbvB!z_g05=|})=n$y+OnMi4ha{}hFWK&o7BrH=pT43&IK@J%c_@5ZlM4H>v)!H(V z&Wm^SB$oA{kU^Z2*evv-czX)u?Dp2~_GDK)wHZWHccL>J!lc{~KsfM*UfICrJK`mTi3LZxF@dpHW#e) zU>0jN$_%#^veYsMF^nUSR@+fyvZEs*ole)CmFP;O+FPlqsZDur zQyvwiM;bB?BTI1vdKzn4mKx9pEqC=wdr~oLu|sh5)X>&O+8NDowM2K%*wEZOE8e;R zUnHH|p6F;p<=UATENW^S%yT+1Smg9!u*em}P)6@Ci7wnuhL$-?=g?wQNKhT?$U$YG$ygV7{r~GY}-7T%N}swX}>U$8Z70>W|x?nqq^SctVB1Ko5ZZm zSbP#4SXvXQwei*j^Rt9B$MjFw^BWlRa8vJ&qx_V%#@lTsYvh)xG#|)H_M~8;Nssta z+=Ox0rzU%rb*)W0JQ-n!a`Kr-IXpF*S<)Uuo0Gkx;6^e#*@GJmEkW+vI}@CSdGW3` zaL{?C=BARJnuEJ&f>!dBkdC`%mz@&c?1`NJJ=ts`g|(@(V*$8=>!xf_Xx&eTmOeU^ ztB(#(uVl6XXTmxPocQb%mjGQPOPw|n0x#ORoV76C#hpcxP*=;49{aAKv!%vAt?vt* zEn1RThg)MlO+~w467Y4h6I9jooB< z_Ld~e85C1i)R0amI@fe;Ue@02wy`XpLgMG*Um;Flo!>B6pGWUJY!R^>4i+|H7Nk05 zt&Dekq84@wYunfLq(m=k1i6gQM@)%SmM5DWz5V1GNM}VVX<}nZq9eXZFqfRo+53`g zE4$l^QrN__c4q~4^0*29f#IycZo&TIU7NE4U17rSZeP>h(cbNn&f1Kj<{FmGnPBtc zX+@yu6mlVNI5Y>HlHOAjHzYo<6R3= zb1uM*in-_Fam3BC7c5yf?QO`c_O3RVQ#{uSmcy4Bp2Km?@*KXJ>A5U>Ma$vZi)SL9 zYF$6b`%)KMEuk)k%ePxkFQhI-9uIjQcB{FUY2~*`JZRiyTyvCNo3KqPTKD3-_QXYs z;mTl^DfY9Z%SD#S^})s9SW<3XwCy>|>g07>>Phx7vJ7Q0WkAtb$MpW3C#@4eU0X+o zE-`0G<6DRjOM5!iLX0clgs_vgADCr=&DqqQ=;FywIW`B#xL-LtC$X8!8BpX)u|>pI z>teCw%z(sNy|sq{#`pnjK-Q;4*etV>j{!w5xUV{CF2uUwki#SBE$rlT+lR1-Lvs0rHc%ZD)3S zd|emzMeVI=2~8JGS~B4f{7{o6a;Lpo;IL^(q%OpsChgp~9EMun^+Z-~bk~&|hhR4j zfr8VCXot~3Poeg%B5n7?UWRf;s18wgws&J2mv$b7dF@J*p74s8amM84=5GAk_B6k} zHI+;!*LK%6qJSH^;vJjQU}tNTM^vU$x=vkOvYc8QEY3D{wXxU!be($%a(m2bxR#2c z6`bkk7H8eo@l;8Zt_~-2t|wFc6I{H1-)1iHMs-k1e)gJ(tELn)H$h5tKFPU*!wA?>fuPOcJiD=l6}oyC{IXwO;kAV zKlPInEtTbnZ@ApK_SW`p?wZ`y7p5?$;yoSRSRzyD?kuVDB_^S3A9`{-ok4<8PKj%1 zauO*`d5v=tD$(b1T@;;a{kSDqV-!$;)V7#!~LLr3Ds%X8y#_{D>x zqC)nZM6Y}Bo?18l;mT}ul<)RVf7&NT%&@-)Xca_A_uhmkA9+6KIjxe4RV3Tx-E^ z1>TJ-R|OU4_Cop)arZ$urAuL_OV@}K-SF9B36Fu0a<4BG&zn(0OW|=1-uFzX>;`AS zTN^=g+|d0{xy!8v;o+PAN!a3QB|ls3M7=Hr#eL{OZm86bq7l7L=!obzn>*MaN!4Y? z-sum%BhPu0oQ=t?kHHlL&sG1O4*AbPMCf(+JjB(3crhCE?95A|U)fc#;KuIYp2W`4 zKOk?VVFWytWcYwYB1{$tI!)jlh9e7ne$$MW1WKce&1hwGxv$bRDu&@VZ=#ioS07!@ zRK22V6;-RK3Pn{Ys#;Oiii#;Jrl{q%x#hN{9c~rMw9@R~kM`J-mRT`adjN+eK zGx3{yMzpWAz*|Yt<$@0{$g4C;qkUCIba}LI`0yfD2Q^ADM-lgD6yDRskEuqNkD{U? z0}{5U)CheVMV4Z53Px5ya}>lxJ$Jahz^jx7|h)$NQS72~>fC>VYus=?dL6kwQG}{x>Rv;|&d%=#@N(;~d3`FLYNM8d!7g7PNAYeWk2$9Ct1cwr0R-?QjBqwu}O>LLR_CggcjG2j=rfR^+?ljV=#| z?2bg2!vOb^#{=0y?ng#5ha!DV0lzLslwb=gF^DTXWe%Bs;b6Eb4W`xf0l&D&Kz-`! zRUI~cn3$PEsDz4&Qolc%c@5TI;a31Jw0=e0zGhVtGf_GwtO6^*CwW+m|8*eIPUWZ~ z+Q~Bp7oPN;VZSH3UM3>=JXxZhDkT->FvR0T(}$U-N5jnbd!rqk0hA%sVWGmbTUV;q zm4PT)!=tMmei4Q3R|L^~qcmZxTQJN!vzY8qx2aGoquV%CTsYKi9O_mT>NaI+n|5Xv zz)&V*hqR4Dsx+h9Ld?D_i+*0vpc{9ff`r&)w0Af&!Ck2mGY{Ck;3~lq0Y4mREjv_^)+)cX0m;$B zN+kFJg*!dzS3RkZX8O4&e3hQ`%Q!uw$Ejb((J$lkypy4R_FE6X{mO5>?yvIuk`jsE zmlf_uW%DA1dr>hJD8gPam}fXkng{>Fh}UmKSMwrX3<*5606{5Z%9;gS&uX#8Y%C}! z@Vk=|z#ULY1IPKjg7J!~mr^IYJdqW@$kx}odjfZ#*?dXlmC$sLHPUBVK93bG;l%}$ ztWsZV^|fAKEA+KmUt^{fF!2v2>HCP+f-44luw1E;yN;)=tZ;=Ifj|~?pT$cZoG#L9 z8#Wgj!sm2!x6~Z@!F*2ycmJ~4p^HRxjLkb^Wwqu2MjJ} zuv1HTdNchogYRnNwPO4Zu=)&`n#Zzz44%}jxX86`J?r)bS^5aRM~FY(8Te$Y;^X~* z47l9&1+!VT4y)E?)jOYDfF^3iNVsli2dll~0yxS@$P{|!dB}Il; z-}4lcH(R`ytBAI%3-+Fd5pBmL!tDZr%IIcwQG(4Z*ye`-*}R-3s1)9HfRg*%l`KO( zzrixpjxcvH6RX=kW}@6wgMA{qBWQ060wLJZh0G0*-$%FsDpfUjL>lx5>kUchD6+fW zi4BjWxD(ajufz=!SG2*k-PYM=>uf`5unu2YXIpf$gn%iTxl%T?f}u`$N0_EQmZZ%>Qb#PF}`5(^F`%Tj{`N4nbDiA{(<4Anp3`bG89q0`TC2Pqi*H%U0l{MhlW%b2hamHu8G_%hvNdtp@b) zuejmwbc2S~Ets>cF_}s*b$I-TPpleLCqzyCq*K?lO`MRJ6ki)(J7sdBbD7yx z*0hbEII;Php46InSMtJmb32*;+W*&QA8 z@wO6mrdv_G33-Q3wfNUqSQ(f)x3T|+{~wV7{_cqU+u)hpaAZE=6YeyK&wBIlT6utI zC(nNUx6?Bj*m<-R-*7k&rz1VMvwGKF67HV^I7~liC`nXA+p(JozLmr zXY9zG*t2`WXRK+QP4WrlM#QJjZ~p_k^|XOiDB zNa4z7nc1HGd;O}zIdBL5BYdlZZwcqZ<~p&+ncIk*a1YlZJ2>%`MW#jk^Z7jU`JD^) zZ|8+6IV=A+^P7!Bja%+nZnk&-{S%lkgp>HOR|Ee2XLjDvp}v z*A#pkgip}dK+eBZaVq|sfa@uMQ=lFwkrB0s+GyhHQ^uKei``0gMNarCsW zN9nP$7wexeE_|`RZ&xN4AIaJ~v#FtYe`HMDGq6-ZlZGPv-olbAZX?DEaXd$`+97}Om?8Y^YZysNwDT15IZ)ULn@;L$sK7V|) zZ7-|x{|Z-4G7FzyUq`f#kv!2~I1v*+2Z<`cd+tL-eG_HxM#qUl9(f4#c^+ISfInTTHr0hi4`# z*<~_wm?+@{Oj^LJ7)N8qV~j(C@oL7AX2xq6N4$(rWgG@9S^&Fje-5q)xr(m$q3@cv zjj)xhAU15}nWOmSjTBrEo`y!;W}}nx#5CBOW}|&0X&mWsakO`FWXZ*mAQwj59EKq9*GCt^U-(r;riw2>HRX-VbM=UEu4&Ie z4EA)+35Z%I0E9S&iJ6+fHEhpfLXyFGSOU9gas zvEbLaIuLVBPMgJc!{|N%Uo87nO`xe|pQZ_DTXvj@1rM3m!}aiPPJu=_c#U${o(y8( zRel6PelU#`Ll7`99TYFP42ea83&pEH*3zn3kPjV!>J+Gl$}d8IxB< zBnU#p(ohURz`*)Y3_-xaB2f%Mz`#mT3_*C_qy8fn%-!O=^yJ#%5K=K8F4;}MIWJf# zVSAw_khrkjs)-~Mi!}lDu)UNCl`*xxI!kl51ZiTM39$)+Z6?Gf2)3CJn;_U`LTsXe z_cAYfooDuy6nU>PfhAYfpnDuy6nU^y#>AZm>E z6H##D812q&L(~`+oOpqKAnsOnBEGX2`^P#WkI~PDs}v*k(d(f?zWVF|&Z@!iUhFKRn}jE?j^P zYycV8HB2BhA=WVgju00yfjEWeWddR$E@lEf3$cj_=nAo!31mQs%a}kzOqnaqsk?bR z%mgwL-pwQ7nHVUaYCr_R2+eaCf`EbAsx$-v1C>oN1W{v%DERDHyv~;A2H^&V4Niyc z?Z9~qF%)5YKof`{Z12znau~LEF(E_nE_*85NQe!joNXk;1_-v15F6N2krGaN3MP4+ zB{Tg@AU#5)nZRfXv6G3*nQ&_w=fKQe0p4y7*3BE`wu1M;Q}xw7qioO`WF}A!t=%ZO z{sl8}Ho&-08Rv(mbvR7shgf8nbC+;0T;4c6W+afJa0OW*JI;J~8YTi8frguozg8JD z-kt^{Gi|sXrdO>{*K{_#!i1e&T%+_2*b&Uk8`YuMq^re zFc~7NqU~;OI?=620tZ1YV!qjng(CA}@I5!zYNFvT$_Lb7{6o!ENjhtb;Oh$ksB z9K-DC4v%x9fFcfyGDM=V%B!%{<9$;C{ZG(N^1#%I1&NX^c=BFOI_(v&&300LX5BmQ zyi=0(8kKc5w>HslRvLP4`RG1GRUtW_ZriY5nz!=C7I!xLC7>g5#F!-^S>;j9QHV-)o9+1r9Bj!WdV(+Ju!V~@dODw?r1 zYGJDWtLdz@s(-F$A4LCA?tfaiaiiA<%l-g5E9w_3v$<5IqA2hz2d?Txq;WP`(=Q2I z9tAtc5%@W8O`lM1O)OE3T%x3AaE-zsqh^ev71t=1*#X3BkAb6V)YZVGMj^$PeGMq7 zQP%=-Y7{2N`>9bkqCb=_r$3)P4jWRV5P1MKsWDyRL!@yrmLvOsf`qx;04G#KDKVbn z;&G2>y7>2;n&w{rba7E*)kGabg}L$r_=kzYwZ-);S?#kihHjz3e8%!}ipT?KF^S9B zg3BILve*m$CuFfNDK?+1M~t&2MyJ=}5;JjabJP_)Id#N)OCnYaTgBT!H+<8HSFLO8 zT8MYLjdKgewR8sXx>hs5CwG1!@vdlHv%6T=$^x%zNxfdzp49si3208TuH9K@+1Iff z7T@Z;k9Cc^4q4Z3dzrOrU9-=;u2n7pJ?nZttV6_|=yfd~>viq%_&wHj4fn6twd;dr z??z`u{pxi+K?UpD!?~UV4=JAt>)KVYZ{P^tbzLWm*7a2OEtf|tUe_$MQ3fr04>)RF z-v~_BbsO_<0wwGEW+2YGM&WwD>v~$DKcBr9HcHlYu@7opvkz)rH^T|laN@f5xW}_x z{L|~&>)*Sq>j1X;>Fl4+z6Bk+X9gS-Tu=F!fZe;~nDByH;S-#1`#Z4VjP}3SuB>4+ zKs-)&#cQ|;JG|R*(^9PXLiADEq-?Z^IdO0pUQVn6oFl!%bAHZDxjVckMS6#K z_Q~_Gnrpf@?u>&}xrYv&JV+J3{>6!78c+%s?$r7PuD3aOqm$@x_-| z2F*!of!n8L?_)PCn`3+LJ-(KGFY#H`0`{3}0XwHWFYNJWfCmwGqHBS8tZRYCj@0)bVo@t3uhR4#LO~B(b1eaOze@L0<*-+s4*vtICo) zjR4=3J8=*!N+1tnYxKW8tuzp|H=aRTKUG){zlD2vbiy?QYh9HEJ_~R-P5~)C3p_Ph zM3FX3C$1C{6W>y~)?{6u2|qP&7?zt>7x$1{jN-saDA!4_u%sjjmXic^{}Z#EBup#~ zoC#eTI16WvxTV39h~hKCr~kXk1D{_P!F?RZk%z>2up}#1PHSi~(=&dSeFv-~>CzwH zz)d`NHtRX*qh8p=*&1`?PPE}U$uc_#`}U{6DQ}#CFh30pbJ7eYFyAfvE;i2<1^2Dt zrk`OfadV8*%Y;d(#!k9kIUR95iFi7UeDyzgRquf}AQO#{bW8~0V=>L8{$ zmbO(L(i6KXgsH9Ow3^XXxOWc77GeK4r>wtcTTwIcTm>Y8Y@d2WR%C} zejrt04%@>0Re4o8Zq6()ka>k3zR;XK^ez83g%}AC|lmA}?l)w~BRZ)3OP{ zCTF9?CTZa&;ftz?%Enf`-a}O(9!Rq)=v^+H0bVa>{_$v$~jP8Hv& zNZTHKu|dd(pDoP+JzLenFTt2o{+dqr+5h07xjeFyJhJXUO^1K#ZYk3C&unqxVz2hM zVQ9EW%TNU{RNhXIvVeVoB*0;%55j3yqQ#x zSrw3kM)>)OUnO(BDxug*JoTsOe6Wcgj~3=XRxQ70Mg5s>A3}mklc3I4oPY|%--&BT zf-X8+aTaj4QWo4wsLxg&Pkf2Xp*itvHOrHD%RbC*n3ja*9})TV{S^sZ?J1rID6WS67>A&4v~E{!ZJ6+k zcOh?N&NJTA*|*$R(TKMd7TIp;RcEV%kjdHVDx|~y8u!nGC-qf7wnTc0^N!lWf{QN|_>@g(=rh@J^V(D|yM($rfKk>xy4Rlu2FV;0b7oDJjb?xEc^v(B7;#1+C$yKnQ<_LH-784$t7(hGl zMb-%3(p~uO!WYk$2tL!>_##j8J1uk}XJ<5%cHB3&$FT>WT$phlnvVouDYxif1b)?e zw7in1ANY}AbI78f1gAop5qP@5E`g5-{FBAf8!fgF4BZvB==li4`z(gHL>X>?O^bdC z7{+^nPvH6XQ{iQJJpQG!D=T93C_PvarB_2=2RuFepWu80{3yL8oMpnfS2)iJhlF!I zI2NK|`-Hxt^cj)9TE-S`7t0@r)SNTUH z7RANd6@iaN*3muX{4{=3*{hHaffJ>S;O7h8A$UUY8G3X5&3)Mt>g*scPX1Z0VTA>!wC(+BQ zifMt)_!7gUoZIv03SBlg5l2qs#fd7@(j`WqAwSyrzwG1?*Z4xd4Ak7;~}gggEqU= zK3L7V)W<>H=u#~Eq@qGq(K|qWMpNO;G?HB z_1*GkK|QajA4Oga_~}JW{g23xK>bKlnaJ@#fL_zo2O}py{Zdo475@^j=q*j1Uhx-D ze->(w#22JX>It7u(GUEV6{HUf^=8@AmG_`>eN0itzjM8z-wUPk5~P3Anumxr-w|q0 z=y7B$NTJzm^Ubmx9YAfIBGjJH9;}5B)oR(g@BzGouh+88;VGaNXxSeB0j#A(TJ~}O z6i~~B`V?JYm0RU>hfudrlNGZn=m&}lO%2bmB2+ntdslu&s9mTx%h=Bdbqb~YjL`X7 z_G;h&R_g{W`+Z;vsLQnM(#k_P@b(LJOQ^q+Uw01*#lFn4rqB~g245PiD*BDqoElzW z#i+KS;7g2}gi^l5XsJ-jml&#M--F6Du4TS*1JunzaSRKs>GWHnIG@X`8MGXSdSnp!TyE9UZHkil zQcGVF>dmsBz|UIxnoxT}zk;8&^i3^0#dsc1AHJn!^Nb&WdP&QkL9S=gkG1SYKe`wj=(J7#OIN=ff3 zRQmI^Y@T6&>eaG8(et>wyiChN$iy5P(6VP>vw;S+?7Q%+fyT6KCf46v+O1`CD-BS$ zXxXFTL#W;#*RsdLkAeEMmR%P84emk?XxWbFUqC&gWlOB@QGyO>S(o)1s3*1TSo9># zr=wc-)2PpwPu~@av$W1yK)Z1BfH{E~vdLkD8 z{M~xwd=+w1&{TW{4f;aBiQVC_=KH}_#@>&nSLgpkD`)K9ujl`}{#f|ClptMt|bH~5^;Zt#hq-Qc~y%owYzG&W1Wn+@KpHygYw zZ#H=UO^M}{SWX$dcc%>ArBep)$IB%@|1LV+f;Z4z<%7nBR9Shw(M?N?n}82i?lTN? zu4U0agGckE@tw+tjeQ1>=}F^^$fLjyA<{mY7TO1#N4bw4j9zb?G!9pO&v;Vu-yqf+ z=(g}XMg#4R@(GG_vPJr>kbVcG-z}m!ApPEL@Eo{X?7u8_Dnwc#b}Gb9h1eMsJ4vxK zDs~1%b5!hn&fppHIkEFO@$iILONvfXtR=--QmkDk)|QC1o5k97qIt7eds1f0lQMIb z2>)ZEUnBZ=i2lcfe~0L|%Y0}zc(%72{h00TGB?@{o|ARb>RxHpF0-XwM(SQ^d(1cx zK1mNqZjTukm7kCxI@gCFjkY`tocvU0u z)=0cH67OT;|6?M3MP|_}(sr}VoI2sxNvk?(RVS^QQI{fkKvxYfnsINi6mSl$0Boe| z02kBUfM?MIfL(ML@B-oY0(Q}5^b5c+;40Lwn*u4oUx)gI-!J@r>ZkIuv`F^|e-B+n ze+u0s_)Vg76Lc1p?G>Ga!oOcb*8D8a_kRFn`wt2{BGRK8vd;6uKQ5ftHDvzJrR~o} z`U`<%u+N5utm8A-zRzI$0fBLm)@#T*b3|v3NaqUd5NW4|tkWerT_W8k{FH_)%?rLq zL+0Eh`ZtOGUV#TidcTIO^PupL2d6~a}ElAzlO{? zBKT1anR8t5*EM7g1=vp`Af5!6Qx=F}CdY+eA2@~H3Dt|VUZi=!_X+=?;70@=7x;$o z$zp4Mi`&Kp?-006-~jlW%kqNXjHfNX4jmNyh{c{97x;$o8-gtD2(qtt za1NHUpGO2fC!FKJF@hCrrvcCUkwd|^2^5%tW9&B$8$U4KH2&2Hm`QWBxy2kdcbgwJzhr*fe9ioW z`HorUTkN~ccdc)a?+d=yeP{c(_-+3U{#*Tz`oHb}ng5S|6Hh@6ya5Q}zYzY5;2c|p z>OLL&%V{|C@?(Pa(eWVB_Q;KZFO`23@Xg2_fY(Rv16)w?5a7|ue*kPX81AL701ky2 ze$vmdHvBlClKwHkoSl_V3IB-8ACOi`-w3dsU^&Cu@biGb6=|dK9pEpEg$FAC3HW_c zwsvbJLuJ1<{ECY=ia!<7>Lp@p^Tp36!rc4S(VqdHYq6c5MSlTU8~y{JvU5OsIqGN4 zp6H)M8VvE@?)xNTJ~ELr&K{OD@G?*aG8Y714$46G%78~e;XMJMiTj2K@F{>McJ4~R zX~?#LY~zp6Xa;x&?j5RupMvL-2F(OCaY~sEd={WdamY>Vjx)iT18CwbHw*Y&Kod{6 zP6Iv<(8L>&dcY*K3_LZO1H2hp2Hw!k1>OQJ1NSELfG@%*8#pn{2fl1OBCeCe9PbGKHU5H zU6kKi7Cw&%v??Ha+icbywlx~Apm*bnpcL?7xe0Sr!7vKF#ZSC0L zU~2nddRr@9n8}UevN1I{mhKxH0dEm?XZlAo_HZgY4r2KldthuZy@LA2NBG|r8QC@7 zWe<;LQ~jg4=I$QanI7HRGlYgi>EY3Ic6HA>%9XNMt7|X=6-S{!^-=G5ZZtjA++`0A zrlsp#^SSBabT-pZJv{@eiveX;QS0%ZdNe%%8TVD7xSKWUTrRaUtz`vjf}>jQab5SM z9MfW#=o}az-48AIG(tEluG+eFWvc%wygFZRtayPb8QO`gr&-K4l zQOEPrhU-(g+%eH&BRA#W0-8(i^%DiYSHJI6v=}+;jE){F{bEOiU{YfP2vIuGt zzGqM-k*YD7OyDG95}9_-&DA6-y`!novB~&j+poleDh-S?>$+Mh?y|>*Cu!AX=O*E< zvht0>A}p^>1?T#m!dNZ)e6>AlFm(!qRymOj-%?N2Ya}p>`3*er34@m!1RLG zyq@9QXbO{(8@l+`jKk%Qif6C1pTOFhv&XWq(W6t{J8EZ9L8!-BeZxC!mnS3dQf?B{ zS(m3qxj;H&>vFm?xe+_Z1=xv;iy5y0Cpwqrf3B&J22tUd3X4iwcu1DIQ^hq|%;B-= z%b+)1cQ;_PncR@xiQOQbaMe6G#7^vGIqOT-wzHeA%nT2}nBsXBToGRuT@lB#@QV0q@fEY21z5y&)_OXX z?cY_>d#{JBR=kJd>D#NP*S$xP(=Gd(SIt{hRKGpagT_6^HAmTX2*;$Nbrc&j>1!0j zlfeR0>=#H+7X>C4j&swa1%~R@LpwbeSVLT$q%_EOELEX^DFccw93J_=={nFnFsR!1 z;QXg&npZS?BHB zzi)S~@91;nj~hnF7bhbCq^gR^sG#ivS6NeIYm8W2U6Sh3qAqpn(x5JhK+rT}HTXqA zEdQ^8785TZgJCn4e>&DC*JH8ea(y}0A=g)8-Ew_BcAi{M#4eQUS7S@WQXQOP$D+QV zVVYJ{m~k*7>|;d827!rCoTgUg_ZXo-oT~DB%OF>@#WCggidIsDcZRht*h+e5xuedS z_*uTzZ@>Vm7r9abbZvo9|&m$ ze;g0(IM3CDz|7j9)-)%WG5utiQN(RVrv@!k1s5xHV_J%Z=ZR)CS{1a=v*Q8=B^8BZ zE*(pi1p^@y?xjrhT}>g!?;)iWkHw|`A?3}G_BQUgH>BJvXqz6VJY4o8?wW)jL#`j_ z0;KXI9vdxL##nO7*`&QYY!S655|=T1#Pbf9xi*(;F^R7@Afez)KIRQqHs zsqEdS`^8oIO*RE1vAov8)M7)JWE=-DOn#oHV6?ww0 zQ1!#`nLcY)z_bEBD^{cXjO%MsUt9FGPG1}JHDOvI(~5wSG4WeS6N5X;6bED_CbhS$ z;P>nJa8V0zDVP=DawbJr3YlOIE9tV54y(mwwK%LgmsRJm8eCR`!%DcUgdat_20zC~ zO}LzWh+U4#6iYED9?J+P!<-@JG{nY)GsYae;W1)~SbiU>D`qoO7|px6wBjO6yzJpw zng60f*%UbXgYQ%ObfgQ^~8Fk!Bp&m>4saXE`AY^=HomA{{M`y^<8H(j!WF5Y; z&QL7l=!`o$D+4~O`j6n{?TKi}yyr)|RX{I&M5dvDXX ziyz?NhfWlfNqe?IGn&_~>g%$z>CTanq`vt-`|4%Q7~Z~Ujr-h$9~TX##`)eL#4X~` zsKX1azjFG-U#uAvklPRZ`)lZ~6@Q+F|A-bF)GS0}%i^}}1B+VIi&HyNJC-g<_iu0O z?{8~s?LVV+X=+)zKb30PzNBSI3Tum<#WFJmfYmcSoP{5Tty#~!FW@`lI()AH zqCc!wjqf~spM~sMkBn9L@9Vsu4ZYpHnH`UX51jht&X3G}r1gd6Q!Zs2U1x5&7{}4v zmX~gS=^HOS@zT>T9onKEUv9~!@xX4&`kw6rO^X(7yw&TH)dGMwK5 zW8M(uiyfEwi+8i7eAYV;-%IjD2YIUN&p{vm41FWsXl?~ug*TA9;iFf zC logger, IOrderStorage orderStorage) + public OrderLogic(ILogger logger, IOrderStorage orderStorage, IPrintedStorage printedStorage, + IShopStorage shopStorage, IShopLogic shopLogic) { _logger = logger; _orderStorage = orderStorage; + _printedStorage = printedStorage; + _shopStorage = shopStorage; + _shopLogic = shopLogic; } public List? ReadList(OrderSearchModel? model) @@ -97,6 +104,21 @@ namespace TypographyBusinessLogic.BusinessLogics return false; } + if (newStatus == OrderStatus.Готов) + { + var supplyPrinted = _printedStorage.GetElement(new PrintedSearchModel { Id = orderView.PrintedId }); + if (supplyPrinted == null) + { + _logger.LogWarning("Printed not found in order"); + return false; + } + if(!SypplyFromOrder(supplyPrinted, orderView.Count)) + { + _logger.LogWarning("Supply of printeds to shops failed"); + return false; + } + } + model.Status = newStatus; if (newStatus == OrderStatus.Выдан) { @@ -110,5 +132,50 @@ namespace TypographyBusinessLogic.BusinessLogics } return true; } + + private bool SypplyFromOrder (PrintedViewModel model, int amount) + { + if(_shopStorage.GetFullList() + .Sum(x => x.MaxNumberPrinteds - x.ShopPrinteds.Sum(y => y.Value.Item2) < 0 ? 0 : x.MaxNumberPrinteds - x.ShopPrinteds.Sum(y => y.Value.Item2)) < amount) + //Тернарное выражение не учитывает переполненные обычными поставками магазины (т. к. это не отражается на других) + { + _logger.LogWarning("Insufficient capacity to accept an order"); + return false; + } + + foreach (var shop in _shopStorage.GetFullList()) + { + int freeSpace = shop.MaxNumberPrinteds - shop.ShopPrinteds.Sum(x => x.Value.Item2); + if (freeSpace < 0) + { + continue; + } + + if (freeSpace > amount) + { + if(!_shopLogic.SupplyPrinteds(new ShopSearchModel { Id = shop.Id}, model, amount)) + { + _logger.LogWarning("Shop partial fill failed"); + return false; + } + amount = 0; + } + if (freeSpace < amount) + { + if (!_shopLogic.SupplyPrinteds(new ShopSearchModel { Id = shop.Id }, model, freeSpace)) + { + _logger.LogWarning("Shop max fill failed"); + return false; + } + amount -= freeSpace; + } + + if (amount <= 0) + { + return true; + } + } + return true; + } } -} +} \ No newline at end of file diff --git a/Typography/TypographyBusinessLogic/BusinessLogics/ShopLogic.cs b/Typography/TypographyBusinessLogic/BusinessLogics/ShopLogic.cs index a42e032..27b163e 100644 --- a/Typography/TypographyBusinessLogic/BusinessLogics/ShopLogic.cs +++ b/Typography/TypographyBusinessLogic/BusinessLogics/ShopLogic.cs @@ -9,6 +9,7 @@ using TypographyContracts.BusinessLogicsContracts; using TypographyContracts.SearchModels; using TypographyContracts.StoragesContracts; using TypographyContracts.ViewModels; +using TypographyDataModels.Models; namespace TypographyBusinessLogic.BusinessLogics { @@ -87,8 +88,8 @@ namespace TypographyBusinessLogic.BusinessLogics return true; } - public bool SupplyPrinteds(ShopSearchModel shop, PrintedBindingModel printed, int amount) - { + public bool SupplyPrinteds(ShopSearchModel shop, IPrintedModel printed, int amount) + { if (shop == null) { throw new ArgumentNullException(nameof(shop)); @@ -125,7 +126,8 @@ namespace TypographyBusinessLogic.BusinessLogics ShopName = shopView.ShopName, Address = shopView.Address, OpeningDate = shopView.OpeningDate, - ShopPrinteds = shopView.ShopPrinteds + MaxNumberPrinteds = shopView.MaxNumberPrinteds, + ShopPrinteds = shopView.ShopPrinteds }) == null) { _logger.LogWarning("SupplyPrinteds. Update operation failed"); @@ -133,8 +135,12 @@ namespace TypographyBusinessLogic.BusinessLogics } return true; } + public bool SellPrinteds(PrintedBindingModel model, int amount) + { + return _shopStorage.SellPrinteds(model, amount); + } - private void CheckModel(ShopBindingModel model, bool withParams = true) + private void CheckModel(ShopBindingModel model, bool withParams = true) { if (model == null) { diff --git a/Typography/TypographyContracts/BindingModels/ShopBindingModel .cs b/Typography/TypographyContracts/BindingModels/ShopBindingModel .cs index aa6a644..aa31899 100644 --- a/Typography/TypographyContracts/BindingModels/ShopBindingModel .cs +++ b/Typography/TypographyContracts/BindingModels/ShopBindingModel .cs @@ -16,7 +16,8 @@ namespace TypographyContracts.BindingModels public string Address { get; set; } = string.Empty; public DateTime OpeningDate { get; set; } = DateTime.Now; + public int MaxNumberPrinteds { get; set; } - public Dictionary ShopPrinteds { get; set; } = new(); + public Dictionary ShopPrinteds { get; set; } = new(); } } diff --git a/Typography/TypographyContracts/BusinessLogicsContracts/IShopLogic.cs b/Typography/TypographyContracts/BusinessLogicsContracts/IShopLogic.cs index 56e0aa0..527d38b 100644 --- a/Typography/TypographyContracts/BusinessLogicsContracts/IShopLogic.cs +++ b/Typography/TypographyContracts/BusinessLogicsContracts/IShopLogic.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using TypographyContracts.BindingModels; using TypographyContracts.SearchModels; using TypographyContracts.ViewModels; +using TypographyDataModels.Models; namespace TypographyContracts.BusinessLogicsContracts { @@ -16,6 +17,7 @@ namespace TypographyContracts.BusinessLogicsContracts bool Create(ShopBindingModel model); bool Update(ShopBindingModel model); bool Delete(ShopBindingModel model); - bool SupplyPrinteds(ShopSearchModel shop, PrintedBindingModel printed, int amount); - } + bool SupplyPrinteds(ShopSearchModel shop, IPrintedModel printed, int amount); + bool SellPrinteds(PrintedBindingModel model, int amount); + } } diff --git a/Typography/TypographyContracts/StoragesContracts/IShopStorage.cs b/Typography/TypographyContracts/StoragesContracts/IShopStorage.cs index 9556633..ba4ef6e 100644 --- a/Typography/TypographyContracts/StoragesContracts/IShopStorage.cs +++ b/Typography/TypographyContracts/StoragesContracts/IShopStorage.cs @@ -12,5 +12,7 @@ namespace TypographyContracts.StoragesContracts ShopViewModel? Insert(ShopBindingModel model); ShopViewModel? Update(ShopBindingModel model); ShopViewModel? Delete(ShopBindingModel model); - } + bool SellPrinteds(PrintedBindingModel model, int amount); + + } } diff --git a/Typography/TypographyContracts/ViewModels/ShopViewModel.cs b/Typography/TypographyContracts/ViewModels/ShopViewModel.cs index 8099d05..eeebb10 100644 --- a/Typography/TypographyContracts/ViewModels/ShopViewModel.cs +++ b/Typography/TypographyContracts/ViewModels/ShopViewModel.cs @@ -21,6 +21,9 @@ namespace TypographyContracts.ViewModels [DisplayName("Дата открытия")] public DateTime OpeningDate { get; set; } = DateTime.Now; - public Dictionary ShopPrinteds { get; set; } = new(); + [DisplayName("Вместимость")] + public int MaxNumberPrinteds { get; set; } + + public Dictionary ShopPrinteds { get; set; } = new(); } } diff --git a/Typography/TypographyDataModels/Models/IShopModel.cs b/Typography/TypographyDataModels/Models/IShopModel.cs index 50df113..507c0d4 100644 --- a/Typography/TypographyDataModels/Models/IShopModel.cs +++ b/Typography/TypographyDataModels/Models/IShopModel.cs @@ -11,6 +11,7 @@ namespace TypographyDataModels.Models string ShopName { get; } string Address { get; } DateTime OpeningDate { get; } - Dictionary ShopPrinteds { get; } + int MaxNumberPrinteds { get; } + Dictionary ShopPrinteds { get; } } } diff --git a/Typography/TypographyFileImplement/DataFileSingleton.cs b/Typography/TypographyFileImplement/DataFileSingleton.cs new file mode 100644 index 0000000..152dc9f --- /dev/null +++ b/Typography/TypographyFileImplement/DataFileSingleton.cs @@ -0,0 +1,62 @@ +using TypographyFileImplement.Models; +using System.Xml.Linq; + +namespace TypographyFileImplement +{ + public class DataFileSingleton + { + private static DataFileSingleton? instance; + + private readonly string ComponentFileName = "Component.xml"; + private readonly string OrderFileName = "Order.xml"; + private readonly string PrintedFileName = "Printed.xml"; + private readonly string ShopFileName = "Shop.xml"; + + public List Components { get; private set; } + public List Orders { get; private set; } + public List Printeds { get; private set; } + public List Shops { get; private set; } + + public static DataFileSingleton GetInstance() + { + if (instance == null) + { + instance = new DataFileSingleton(); + } + return instance; + } + + public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement); + + public void SavePrinteds() => SaveData(Printeds, PrintedFileName, "Printeds", x => x.GetXElement); + + public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); + + public void SaveShops() => SaveData(Shops, ShopFileName, "Shops", x => x.GetXElement); + + private DataFileSingleton() + { + Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; + Printeds = LoadData(PrintedFileName, "Product", x => Printed.Create(x)!)!; + Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; + Shops = LoadData(ShopFileName, "Shop", x => Shop.Create(x)!)!; + } + + private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) + { + if (File.Exists(filename)) + { + return XDocument.Load(filename)?.Root?.Elements(xmlNodeName)?.Select(selectFunction)?.ToList(); + } + return new List(); + } + + private static void SaveData(List data, string filename, string xmlNodeName, Func selectFunction) + { + if (data != null) + { + new XDocument(new XElement(xmlNodeName, data.Select(selectFunction).ToArray())).Save(filename); + } + } + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Implements/ComponentStorage.cs b/Typography/TypographyFileImplement/Implements/ComponentStorage.cs new file mode 100644 index 0000000..ea0cbfe --- /dev/null +++ b/Typography/TypographyFileImplement/Implements/ComponentStorage.cs @@ -0,0 +1,85 @@ +using TypographyContracts.BindingModels; +using TypographyContracts.SearchModels; +using TypographyContracts.StoragesContracts; +using TypographyContracts.ViewModels; +using TypographyFileImplement.Models; + +namespace TypographyFileImplement.Implements +{ + public class ComponentStorage : IComponentStorage + { + private readonly DataFileSingleton source; + + public ComponentStorage() + { + source = DataFileSingleton.GetInstance(); + } + + public List GetFullList() + { + return source.Components + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(ComponentSearchModel model) + { + if (string.IsNullOrEmpty(model.ComponentName)) + { + return new(); + } + return source.Components + .Where(x => x.ComponentName.Contains(model.ComponentName)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ComponentViewModel? GetElement(ComponentSearchModel model) + { + if (string.IsNullOrEmpty(model.ComponentName) && !model.Id.HasValue) + { + return null; + } + return source.Components + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ComponentName) && x.ComponentName == model.ComponentName) || + (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + } + + public ComponentViewModel? Insert(ComponentBindingModel model) + { + model.Id = source.Components.Count > 0 ? source.Components.Max(x => x.Id) + 1 : 1; + var newComponent = Component.Create(model); + if (newComponent == null) + { + return null; + } + source.Components.Add(newComponent); + source.SaveComponents(); + return newComponent.GetViewModel; + } + + public ComponentViewModel? Update(ComponentBindingModel model) + { + var component = source.Components.FirstOrDefault(x => x.Id == model.Id); + if (component == null) + { + return null; + } + component.Update(model); + source.SaveComponents(); + return component.GetViewModel; + } + + public ComponentViewModel? Delete(ComponentBindingModel model) + { + var element = source.Components.FirstOrDefault(x => x.Id == model.Id); + if (element != null) + { + source.Components.Remove(element); + source.SaveComponents(); + return element.GetViewModel; + } + return null; + } + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Implements/OrderStorage.cs b/Typography/TypographyFileImplement/Implements/OrderStorage.cs new file mode 100644 index 0000000..de16f04 --- /dev/null +++ b/Typography/TypographyFileImplement/Implements/OrderStorage.cs @@ -0,0 +1,94 @@ +using TypographyContracts.BindingModels; +using TypographyContracts.SearchModels; +using TypographyContracts.StoragesContracts; +using TypographyContracts.ViewModels; +using TypographyFileImplement.Models; + +namespace TypographyFileImplement.Implements +{ + public class OrderStorage : IOrderStorage + { + private readonly DataFileSingleton source; + + public OrderStorage() + { + source = DataFileSingleton.GetInstance(); + } + + public List GetFullList() + { + return source.Orders + .Select(x => DefinePrintedName(x.GetViewModel)) + .ToList(); + } + + private OrderViewModel DefinePrintedName(OrderViewModel model) + { + string? printedName = source.Printeds.FirstOrDefault(x => model.PrintedId == x.Id)?.PrintedName; + if (printedName != null) + { + model.PrintedName = printedName; + } + return model; + } + + public List GetFilteredList(OrderSearchModel model) + { + if (model.Id == null) + { + return new(); + } + return source.Orders + .Where(x => x.Id == model.Id) + .Select(x => DefinePrintedName(x.GetViewModel)) + .ToList(); + } + + public OrderViewModel? GetElement(OrderSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + return DefinePrintedName(source.Orders + .FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel); + } + + public OrderViewModel? Insert(OrderBindingModel model) + { + model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1; + var newOrder = Order.Create(model); + if (newOrder == null) + { + return null; + } + source.Orders.Add(newOrder); + source.SaveOrders(); + return DefinePrintedName(newOrder.GetViewModel); + } + + public OrderViewModel? Update(OrderBindingModel model) + { + var order = source.Orders.FirstOrDefault(x => x.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + source.SaveOrders(); + return DefinePrintedName(order.GetViewModel); + } + + public OrderViewModel? Delete(OrderBindingModel model) + { + var element = source.Orders.FirstOrDefault(x => x.Id == model.Id); + if (element != null) + { + source.Orders.Remove(element); + source.SaveOrders(); + return DefinePrintedName(element.GetViewModel); + } + return null; + } + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Implements/PrintedStorage.cs b/Typography/TypographyFileImplement/Implements/PrintedStorage.cs new file mode 100644 index 0000000..6b69661 --- /dev/null +++ b/Typography/TypographyFileImplement/Implements/PrintedStorage.cs @@ -0,0 +1,85 @@ +using TypographyContracts.BindingModels; +using TypographyContracts.SearchModels; +using TypographyContracts.StoragesContracts; +using TypographyContracts.ViewModels; +using TypographyFileImplement.Models; + +namespace TypographyFileImplement.Implements +{ + public class PrintedStorage : IPrintedStorage + { + private readonly DataFileSingleton source; + + public PrintedStorage() + { + source = DataFileSingleton.GetInstance(); + } + + public List GetFullList() + { + return source.Printeds + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(PrintedSearchModel model) + { + if (string.IsNullOrEmpty(model.PrintedName)) + { + return new(); + } + return source.Printeds + .Where(x => x.PrintedName.Contains(model.PrintedName)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public PrintedViewModel? GetElement(PrintedSearchModel model) + { + if (string.IsNullOrEmpty(model.PrintedName) && !model.Id.HasValue) + { + return null; + } + return source.Printeds + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.PrintedName) && x.PrintedName == model.PrintedName) || + (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + } + + public PrintedViewModel? Insert(PrintedBindingModel model) + { + model.Id = source.Printeds.Count > 0 ? source.Printeds.Max(x => x.Id) + 1 : 1; + var newPrinted = Printed.Create(model); + if (newPrinted == null) + { + return null; + } + source.Printeds.Add(newPrinted); + source.SavePrinteds(); + return newPrinted.GetViewModel; + } + + public PrintedViewModel? Update(PrintedBindingModel model) + { + var printed = source.Printeds.FirstOrDefault(x => x.Id == model.Id); + if (printed == null) + { + return null; + } + printed.Update(model); + source.SavePrinteds(); + return printed.GetViewModel; + } + + public PrintedViewModel? Delete(PrintedBindingModel model) + { + var element = source.Printeds.FirstOrDefault(x => x.Id == model.Id); + if (element != null) + { + source.Printeds.Remove(element); + source.SavePrinteds(); + return element.GetViewModel; + } + return null; + } + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Implements/ShopStorage.cs b/Typography/TypographyFileImplement/Implements/ShopStorage.cs new file mode 100644 index 0000000..3352eb9 --- /dev/null +++ b/Typography/TypographyFileImplement/Implements/ShopStorage.cs @@ -0,0 +1,134 @@ +using System.Linq; +using System.Net; +using TypographyContracts.BindingModels; +using TypographyContracts.SearchModels; +using TypographyContracts.StoragesContracts; +using TypographyContracts.ViewModels; +using TypographyFileImplement.Models; + +namespace TypographyFileImplement.Implements +{ + public class ShopStorage : IShopStorage + { + private readonly DataFileSingleton source; + + public ShopStorage() + { + source = DataFileSingleton.GetInstance(); + } + + public List GetFullList() + { + return source.Shops + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(ShopSearchModel model) + { + if (string.IsNullOrEmpty(model.ShopName)) + { + return new(); + } + return source.Shops + .Where(x => x.ShopName.Contains(model.ShopName)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ShopViewModel? GetElement(ShopSearchModel model) + { + if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue) + { + return null; + } + return source.Shops + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ShopName) && x.ShopName == model.ShopName) || + (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + } + + public ShopViewModel? Insert(ShopBindingModel model) + { + model.Id = source.Shops.Count > 0 ? source.Shops.Max(x => x.Id) + 1 : 1; + var newShop = Shop.Create(model); + if (newShop == null) + { + return null; + } + source.Shops.Add(newShop); + source.SaveShops(); + return newShop.GetViewModel; + } + + public ShopViewModel? Update(ShopBindingModel model) + { + var shop = source.Shops.FirstOrDefault(x => x.Id == model.Id); + if (shop == null) + { + return null; + } + shop.Update(model); + source.SaveShops(); + return shop.GetViewModel; + } + + public ShopViewModel? Delete(ShopBindingModel model) + { + var element = source.Shops.FirstOrDefault(x => x.Id == model.Id); + if (element != null) + { + source.Shops.Remove(element); + source.SaveShops(); + return element.GetViewModel; + } + return null; + } + + public bool SellPrinteds(PrintedBindingModel model, int amount) + { + var sellPrinted = source.Printeds.FirstOrDefault(x => x.Id == model.Id); + if (sellPrinted == null) + { + return false; + } + + if (source.Shops.SelectMany(x => x.ShopPrinteds.Where(y => y.Key == sellPrinted.Id)).Sum(x => x.Value.Item2) < amount) + { + return false; + } + + foreach(var shop in source.Shops) + { + var shopPrinteds = shop.ShopPrinteds; + + foreach(var printed in shopPrinteds.Where(x => x.Key == sellPrinted.Id)) + { + int minAmount = amount > printed.Value.Item2 ? printed.Value.Item2 : amount; + shopPrinteds[printed.Value.Item1.Id] = (printed.Value.Item1, printed.Value.Item2 - minAmount); + + amount -= minAmount; + if (amount == 0) + { + break; + } + } + + Update(new ShopBindingModel + { + Id = shop.Id, + ShopName = shop.ShopName, + Address = shop.Address, + OpeningDate = shop.OpeningDate, + MaxNumberPrinteds = shop.MaxNumberPrinteds, + ShopPrinteds = shopPrinteds + }); + + if (amount == 0) + { + break; + } + } + return true; + } + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Models/Component.cs b/Typography/TypographyFileImplement/Models/Component.cs new file mode 100644 index 0000000..5b8d4dc --- /dev/null +++ b/Typography/TypographyFileImplement/Models/Component.cs @@ -0,0 +1,64 @@ +using TypographyContracts.BindingModels; +using TypographyContracts.ViewModels; +using TypographyDataModels.Models; +using System.Xml.Linq; + +namespace TypographyFileImplement.Models +{ + public class Component : IComponentModel + { + public int Id { get; private set; } + public string ComponentName { get; private set; } = string.Empty; + public double Cost { get; set; } + + public static Component? Create(ComponentBindingModel model) + { + if (model == null) + { + return null; + } + return new Component() + { + Id = model.Id, + ComponentName = model.ComponentName, + Cost = model.Cost + }; + } + + public static Component? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Component() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ComponentName = element.Element("ComponentName")!.Value, + Cost = Convert.ToDouble(element.Element("Cost")!.Value) + }; + } + + public void Update(ComponentBindingModel model) + { + if (model == null) + { + return; + } + ComponentName = model.ComponentName; + Cost = model.Cost; + } + + public ComponentViewModel GetViewModel => new() + { + Id = Id, + ComponentName = ComponentName, + Cost = Cost + }; + + public XElement GetXElement => new("Component", + new XAttribute("Id", Id), + new XElement("ComponentName", ComponentName), + new XElement("Cost", Cost.ToString())); + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Models/Order.cs b/Typography/TypographyFileImplement/Models/Order.cs new file mode 100644 index 0000000..5f9a36e --- /dev/null +++ b/Typography/TypographyFileImplement/Models/Order.cs @@ -0,0 +1,86 @@ +using TypographyContracts.BindingModels; +using TypographyContracts.ViewModels; +using TypographyDataModels.Models; +using System.Xml.Linq; +using TypographyDataModels.Enums; + +namespace TypographyFileImplement.Models +{ + public class Order : IOrderModel + { + public int Id { get; private set; } + public int PrintedId { get; private set; } + public int Count { get; private set; } + public double Sum { get; private set; } + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + public DateTime DateCreate { get; private set; } = DateTime.Now; + public DateTime? DateImplement { get; private set; } + + public static Order? Create(OrderBindingModel model) + { + if (model == null) + { + return null; + } + return new Order() + { + Id = model.Id, + PrintedId = model.PrintedId, + Count = model.Count, + Sum = model.Sum, + Status = model.Status, + DateCreate = model.DateCreate, + DateImplement = model.DateImplement + }; + } + + public static Order? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Order() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + PrintedId = Convert.ToInt32(element.Element("PrintedId")!.Value), + Count = Convert.ToInt32(element.Element("Count")!.Value), + Sum = Convert.ToDouble(element.Element("Sum")!.Value), + Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), + DateCreate = Convert.ToDateTime(element.Element("DateCreate")!.Value), + DateImplement = String.IsNullOrEmpty(element.Element("DateImplement")!.Value) ? null : + Convert.ToDateTime(element.Element("DateImplement")!.Value) + }; + } + + public void Update(OrderBindingModel model) + { + if (model == null) + { + return; + } + Status = model.Status; + DateImplement = model.DateImplement; + } + + public OrderViewModel GetViewModel => new() + { + Id = Id, + PrintedId = PrintedId, + Count = Count, + Sum = Sum, + Status = Status, + DateCreate = DateCreate, + DateImplement = DateImplement + }; + + public XElement GetXElement => new("Order", + new XAttribute("Id", Id), + new XElement("PrintedId", PrintedId), + new XElement("Count", Count), + new XElement("Sum", Sum.ToString()), + new XElement("Status", Status.ToString()), + new XElement("DateCreate", DateCreate.ToString()), + new XElement("DateImplement", DateImplement.ToString())); + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Models/Printed.cs b/Typography/TypographyFileImplement/Models/Printed.cs new file mode 100644 index 0000000..cab067a --- /dev/null +++ b/Typography/TypographyFileImplement/Models/Printed.cs @@ -0,0 +1,93 @@ +using TypographyContracts.BindingModels; +using TypographyContracts.ViewModels; +using TypographyDataModels.Models; +using System.Xml.Linq; + +namespace TypographyFileImplement.Models +{ + public class Printed : IPrintedModel + { + public int Id { get; private set; } + public string PrintedName { get; private set; } = string.Empty; + public double Price { get; private set; } + public Dictionary Components { get; private set; } = new(); + + private Dictionary? _productComponents = null; + + public Dictionary PrintedComponents + { + get + { + if (_productComponents == null) + { + var source = DataFileSingleton.GetInstance(); + _productComponents = Components.ToDictionary(x => x.Key, y => + ((source.Components.FirstOrDefault(z => z.Id == y.Key) as IComponentModel)!,y.Value)); + } + return _productComponents; + } + } + + public static Printed? Create(PrintedBindingModel model) + { + if (model == null) + { + return null; + } + return new Printed() + { + Id = model.Id, + PrintedName = model.PrintedName, + Price = model.Price, + Components = model.PrintedComponents.ToDictionary(x => x.Key, x => x.Value.Item2) + }; + } + + public static Printed? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Printed() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + PrintedName = element.Element("ProductName")!.Value, + Price = Convert.ToDouble(element.Element("Price")!.Value), + Components = element.Element("ProductComponents")!.Elements("ProductComponent").ToDictionary(x => + Convert.ToInt32(x.Element("Key")?.Value), x => + Convert.ToInt32(x.Element("Value")?.Value)) + }; + } + + public void Update(PrintedBindingModel model) + { + if (model == null) + { + return; + } + PrintedName = model.PrintedName; + Price = model.Price; + Components = model.PrintedComponents.ToDictionary(x => x.Key, x =>x.Value.Item2); + _productComponents = null; + } + + public PrintedViewModel GetViewModel => new() + { + Id = Id, + PrintedName = PrintedName, + Price = Price, + PrintedComponents = PrintedComponents + }; + + public XElement GetXElement => new("Product", + new XAttribute("Id", Id), + new XElement("ProductName", PrintedName), + new XElement("Price", Price.ToString()), + new XElement("ProductComponents", Components.Select(x => + new XElement("ProductComponent", + new XElement("Key", x.Key), + new XElement("Value", x.Value))) + .ToArray())); + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/Models/Shop.cs b/Typography/TypographyFileImplement/Models/Shop.cs new file mode 100644 index 0000000..78cb2a0 --- /dev/null +++ b/Typography/TypographyFileImplement/Models/Shop.cs @@ -0,0 +1,111 @@ +using TypographyContracts.BindingModels; +using TypographyContracts.ViewModels; +using TypographyDataModels.Models; +using System.Xml.Linq; +using System.Diagnostics; + +namespace TypographyFileImplement.Models +{ + public class Shop : IShopModel + { + public int Id { get; private set; } + + public string ShopName { get; private set; } = string.Empty; + + public string Address { get; private set; } = string.Empty; + + public DateTime OpeningDate { get; private set; } = DateTime.Now; + + public int MaxNumberPrinteds { get; private set; } + + public Dictionary Printeds { get; private set; } = new(); + + private Dictionary? _shopPrinteds = null; + + public Dictionary ShopPrinteds + { + get + { + if (_shopPrinteds == null) + { + var source = DataFileSingleton.GetInstance(); + _shopPrinteds = Printeds.ToDictionary(x => x.Key, y => + ((source.Printeds.FirstOrDefault(z => z.Id == y.Key) as IPrintedModel)!, y.Value)); + } + return _shopPrinteds; + } + } + + public static Shop? Create(ShopBindingModel model) + { + if (model == null) + { + return null; + } + return new Shop() + { + Id = model.Id, + ShopName = model.ShopName, + Address = model.Address, + OpeningDate = model.OpeningDate, + MaxNumberPrinteds = model.MaxNumberPrinteds, + Printeds = model.ShopPrinteds.ToDictionary(x => x.Key, x => x.Value.Item2) + }; + } + + public static Shop? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Shop() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ShopName = element.Element("ShopName")!.Value, + Address = element.Element("Address")!.Value, + OpeningDate = Convert.ToDateTime(element.Element("OpeningDate")!.Value), + MaxNumberPrinteds = Convert.ToInt32(element.Element("MaxNumberPrinteds")!.Value), + Printeds = element.Element("ShopPrinteds")!.Elements("ShopPrinted").ToDictionary( + x => Convert.ToInt32(x.Element("Key")?.Value), x => + Convert.ToInt32(x.Element("Value")?.Value)) + }; + } + + public void Update(ShopBindingModel model) + { + if (model == null) + { + return; + } + ShopName = model.ShopName; + Address = model.Address; + OpeningDate = model.OpeningDate; + MaxNumberPrinteds = model.MaxNumberPrinteds; + Printeds = model.ShopPrinteds.ToDictionary(x => x.Key, x => x.Value.Item2); + _shopPrinteds = null; + } + + public ShopViewModel GetViewModel => new() + { + Id = Id, + ShopName = ShopName, + Address = Address, + OpeningDate = OpeningDate, + MaxNumberPrinteds = MaxNumberPrinteds, + ShopPrinteds = ShopPrinteds + }; + + public XElement GetXElement => new("Shop", + new XAttribute("Id", Id), + new XElement("ShopName", ShopName), + new XElement("Address", Address), + new XElement("OpeningDate", OpeningDate.ToString()), + new XElement("MaxNumberPrinteds", MaxNumberPrinteds), + new XElement("ShopPrinteds", Printeds.Select(x => + new XElement("ShopPrinted", + new XElement("Key", x.Key), + new XElement("Value", x.Value))) + .ToArray())); + } +} \ No newline at end of file diff --git a/Typography/TypographyFileImplement/TypographyFileImplement.csproj b/Typography/TypographyFileImplement/TypographyFileImplement.csproj new file mode 100644 index 0000000..db73c6b --- /dev/null +++ b/Typography/TypographyFileImplement/TypographyFileImplement.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/Typography/TypographyListImplement/Implements/ShopStorage .cs b/Typography/TypographyListImplement/Implements/ShopStorage .cs index 7ac6108..92fec7e 100644 --- a/Typography/TypographyListImplement/Implements/ShopStorage .cs +++ b/Typography/TypographyListImplement/Implements/ShopStorage .cs @@ -105,5 +105,9 @@ namespace TypographyListImplement.Implements } return null; } - } + public bool SellPrinteds(PrintedBindingModel model, int amount) + { + throw new NotImplementedException(); + } + } } diff --git a/Typography/TypographyListImplement/Models/Shop.cs b/Typography/TypographyListImplement/Models/Shop.cs index a62caf8..8e17579 100644 --- a/Typography/TypographyListImplement/Models/Shop.cs +++ b/Typography/TypographyListImplement/Models/Shop.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using TypographyContracts.BindingModels; @@ -15,7 +16,9 @@ namespace TypographyListImplement.Models public string ShopName { get; private set; } = string.Empty; public string Address { get; private set; } = string.Empty; public DateTime OpeningDate { get; private set; } = DateTime.Now; - public Dictionary ShopPrinteds { get; private set; } = new(); + public int MaxNumberPrinteds { get; private set; } + public Dictionary ShopPrinteds { get; private set; } = new(); + public static Shop? Create(ShopBindingModel? model) { @@ -29,7 +32,8 @@ namespace TypographyListImplement.Models ShopName = model.ShopName, Address = model.Address, OpeningDate = model.OpeningDate, - ShopPrinteds = new() + MaxNumberPrinteds = model.MaxNumberPrinteds, + ShopPrinteds = new() }; } public void Update(ShopBindingModel? model) @@ -41,7 +45,8 @@ namespace TypographyListImplement.Models ShopName = model.ShopName; Address = model.Address; OpeningDate = model.OpeningDate; - ShopPrinteds = model.ShopPrinteds; + MaxNumberPrinteds = model.MaxNumberPrinteds; + ShopPrinteds = model.ShopPrinteds; } public ShopViewModel GetViewModel => new() { @@ -49,6 +54,7 @@ namespace TypographyListImplement.Models ShopName = ShopName, Address = Address, OpeningDate = OpeningDate, + MaxNumberPrinteds = MaxNumberPrinteds, ShopPrinteds = ShopPrinteds }; } diff --git a/Typography/TypographyView/FormMain.Designer.cs b/Typography/TypographyView/FormMain.Designer.cs index bc93e30..7745d21 100644 --- a/Typography/TypographyView/FormMain.Designer.cs +++ b/Typography/TypographyView/FormMain.Designer.cs @@ -20,173 +20,181 @@ base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - buttonCreateOrder = new Button(); - buttonTakeOrderInWork = new Button(); - buttonIssuedOrder = new Button(); - dataGridViewOrders = new DataGridView(); - buttonRef = new Button(); - buttonOrderReady = new Button(); - menuStrip = new MenuStrip(); - directoriesToolStripMenuItem = new ToolStripMenuItem(); - componentsToolStripMenuItem = new ToolStripMenuItem(); - printedsToolStripMenuItem = new ToolStripMenuItem(); - shopsToolStripMenuItem = new ToolStripMenuItem(); - supplyToolStripMenuItem = new ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)dataGridViewOrders).BeginInit(); - menuStrip.SuspendLayout(); - SuspendLayout(); - // - // buttonCreateOrder - // - buttonCreateOrder.Location = new Point(1224, 70); - buttonCreateOrder.Margin = new Padding(5, 5, 5, 5); - buttonCreateOrder.Name = "buttonCreateOrder"; - buttonCreateOrder.Size = new Size(330, 46); - buttonCreateOrder.TabIndex = 0; - buttonCreateOrder.Text = "Создать заказ"; - buttonCreateOrder.UseVisualStyleBackColor = true; - buttonCreateOrder.Click += ButtonCreateOrder_Click; - // - // buttonTakeOrderInWork - // - buttonTakeOrderInWork.Location = new Point(1224, 162); - buttonTakeOrderInWork.Margin = new Padding(5, 5, 5, 5); - buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; - buttonTakeOrderInWork.Size = new Size(330, 46); - buttonTakeOrderInWork.TabIndex = 1; - buttonTakeOrderInWork.Text = "Отдать на выполнение"; - buttonTakeOrderInWork.UseVisualStyleBackColor = true; - buttonTakeOrderInWork.Click += ButtonTakeOrderInWork_Click; - // - // buttonIssuedOrder - // - buttonIssuedOrder.Location = new Point(1224, 379); - buttonIssuedOrder.Margin = new Padding(5, 5, 5, 5); - buttonIssuedOrder.Name = "buttonIssuedOrder"; - buttonIssuedOrder.Size = new Size(330, 46); - buttonIssuedOrder.TabIndex = 2; - buttonIssuedOrder.Text = "Заказ выдан"; - buttonIssuedOrder.UseVisualStyleBackColor = true; - buttonIssuedOrder.Click += ButtonIssuedOrder_Click; - // - // dataGridViewOrders - // - dataGridViewOrders.BackgroundColor = SystemColors.ControlLightLight; - dataGridViewOrders.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridViewOrders.Location = new Point(0, 50); - dataGridViewOrders.Margin = new Padding(5, 5, 5, 5); - dataGridViewOrders.Name = "dataGridViewOrders"; - dataGridViewOrders.RowHeadersVisible = false; - dataGridViewOrders.RowHeadersWidth = 51; - dataGridViewOrders.RowTemplate.Height = 29; - dataGridViewOrders.SelectionMode = DataGridViewSelectionMode.FullRowSelect; - dataGridViewOrders.Size = new Size(1156, 506); - dataGridViewOrders.TabIndex = 3; - // - // buttonRef - // - buttonRef.Location = new Point(1224, 487); - buttonRef.Margin = new Padding(5, 5, 5, 5); - buttonRef.Name = "buttonRef"; - buttonRef.Size = new Size(330, 46); - buttonRef.TabIndex = 4; - buttonRef.Text = "Обновить список"; - buttonRef.UseVisualStyleBackColor = true; - buttonRef.Click += ButtonRef_Click; - // - // buttonOrderReady - // - buttonOrderReady.Location = new Point(1224, 265); - buttonOrderReady.Margin = new Padding(5, 5, 5, 5); - buttonOrderReady.Name = "buttonOrderReady"; - buttonOrderReady.Size = new Size(330, 46); - buttonOrderReady.TabIndex = 5; - buttonOrderReady.Text = "Заказ готов"; - buttonOrderReady.UseVisualStyleBackColor = true; - buttonOrderReady.Click += ButtonOrderReady_Click; - // - // menuStrip - // - menuStrip.ImageScalingSize = new Size(20, 20); - menuStrip.Items.AddRange(new ToolStripItem[] { directoriesToolStripMenuItem, supplyToolStripMenuItem }); - menuStrip.Location = new Point(0, 0); - menuStrip.Name = "menuStrip"; - menuStrip.Padding = new Padding(10, 3, 0, 3); - menuStrip.Size = new Size(1580, 42); - menuStrip.TabIndex = 6; - menuStrip.Text = "menuStrip1"; - // - // directoriesToolStripMenuItem - // - directoriesToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { componentsToolStripMenuItem, printedsToolStripMenuItem, shopsToolStripMenuItem }); - directoriesToolStripMenuItem.Name = "directoriesToolStripMenuItem"; - directoriesToolStripMenuItem.Size = new Size(184, 36); - directoriesToolStripMenuItem.Text = "Справочники"; - // - // componentsToolStripMenuItem - // - componentsToolStripMenuItem.Name = "componentsToolStripMenuItem"; - componentsToolStripMenuItem.Size = new Size(377, 44); - componentsToolStripMenuItem.Text = "Компоненты"; - componentsToolStripMenuItem.Click += ComponentsToolStripMenuItem_Click; - // - // printedsToolStripMenuItem - // - printedsToolStripMenuItem.Name = "printedsToolStripMenuItem"; - printedsToolStripMenuItem.Size = new Size(377, 44); - printedsToolStripMenuItem.Text = "Печатная продукция"; - printedsToolStripMenuItem.Click += PrintedsToolStripMenuItem_Click; - // - // shopsToolStripMenuItem - // - shopsToolStripMenuItem.Name = "shopsToolStripMenuItem"; - shopsToolStripMenuItem.Size = new Size(377, 44); - shopsToolStripMenuItem.Text = "Магазины"; - shopsToolStripMenuItem.Click += ShopsToolStripMenuItem_Click; - // - // supplyToolStripMenuItem - // - supplyToolStripMenuItem.Name = "supplyToolStripMenuItem"; - supplyToolStripMenuItem.Size = new Size(282, 36); - supplyToolStripMenuItem.Text = "Пополнение магазина"; - supplyToolStripMenuItem.Click += SupplyToolStripMenuItem_Click; - // - // FormMain - // - AutoScaleDimensions = new SizeF(13F, 32F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1580, 605); - Controls.Add(buttonOrderReady); - Controls.Add(buttonRef); - Controls.Add(dataGridViewOrders); - Controls.Add(buttonIssuedOrder); - Controls.Add(buttonTakeOrderInWork); - Controls.Add(buttonCreateOrder); - Controls.Add(menuStrip); - MainMenuStrip = menuStrip; - Margin = new Padding(5, 5, 5, 5); - Name = "FormMain"; - StartPosition = FormStartPosition.CenterScreen; - Text = "Типография"; - Load += FormMain_Load; - ((System.ComponentModel.ISupportInitialize)dataGridViewOrders).EndInit(); - menuStrip.ResumeLayout(false); - menuStrip.PerformLayout(); - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonCreateOrder = new Button(); + buttonTakeOrderInWork = new Button(); + buttonIssuedOrder = new Button(); + dataGridViewOrders = new DataGridView(); + buttonRef = new Button(); + buttonOrderReady = new Button(); + menuStrip = new MenuStrip(); + directoriesToolStripMenuItem = new ToolStripMenuItem(); + componentsToolStripMenuItem = new ToolStripMenuItem(); + printedsToolStripMenuItem = new ToolStripMenuItem(); + shopsToolStripMenuItem = new ToolStripMenuItem(); + магазиныToolStripMenuItem = new ToolStripMenuItem(); + supplyToolStripMenuItem = new ToolStripMenuItem(); + saleToolStripMenuItem = new ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)dataGridViewOrders).BeginInit(); + menuStrip.SuspendLayout(); + SuspendLayout(); + // + // buttonCreateOrder + // + buttonCreateOrder.Location = new Point(1100, 31); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(203, 29); + buttonCreateOrder.TabIndex = 0; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += ButtonCreateOrder_Click; + // + // buttonTakeOrderInWork + // + buttonTakeOrderInWork.Location = new Point(1100, 66); + buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; + buttonTakeOrderInWork.Size = new Size(203, 29); + buttonTakeOrderInWork.TabIndex = 1; + buttonTakeOrderInWork.Text = "Отдать на выполнение"; + buttonTakeOrderInWork.UseVisualStyleBackColor = true; + buttonTakeOrderInWork.Click += ButtonTakeOrderInWork_Click; + // + // buttonIssuedOrder + // + buttonIssuedOrder.Location = new Point(1100, 136); + buttonIssuedOrder.Name = "buttonIssuedOrder"; + buttonIssuedOrder.Size = new Size(203, 29); + buttonIssuedOrder.TabIndex = 2; + buttonIssuedOrder.Text = "Заказ выдан"; + buttonIssuedOrder.UseVisualStyleBackColor = true; + buttonIssuedOrder.Click += ButtonIssuedOrder_Click; + // + // dataGridViewOrders + // + dataGridViewOrders.BackgroundColor = SystemColors.ControlLightLight; + dataGridViewOrders.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewOrders.Location = new Point(0, 31); + dataGridViewOrders.Name = "dataGridViewOrders"; + dataGridViewOrders.RowHeadersVisible = false; + dataGridViewOrders.RowHeadersWidth = 51; + dataGridViewOrders.RowTemplate.Height = 29; + dataGridViewOrders.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewOrders.Size = new Size(1078, 402); + dataGridViewOrders.TabIndex = 3; + // + // buttonRef + // + buttonRef.Location = new Point(1100, 171); + buttonRef.Name = "buttonRef"; + buttonRef.Size = new Size(203, 29); + buttonRef.TabIndex = 4; + buttonRef.Text = "Обновить список"; + buttonRef.UseVisualStyleBackColor = true; + buttonRef.Click += ButtonRef_Click; + // + // buttonOrderReady + // + buttonOrderReady.Location = new Point(1100, 101); + buttonOrderReady.Name = "buttonOrderReady"; + buttonOrderReady.Size = new Size(203, 29); + buttonOrderReady.TabIndex = 5; + buttonOrderReady.Text = "Заказ готов"; + buttonOrderReady.UseVisualStyleBackColor = true; + buttonOrderReady.Click += ButtonOrderReady_Click; + // + // menuStrip + // + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { directoriesToolStripMenuItem, магазиныToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(1315, 28); + menuStrip.TabIndex = 6; + menuStrip.Text = "menuStrip1"; + // + // directoriesToolStripMenuItem + // + directoriesToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { componentsToolStripMenuItem, printedsToolStripMenuItem, shopsToolStripMenuItem }); + directoriesToolStripMenuItem.Name = "directoriesToolStripMenuItem"; + directoriesToolStripMenuItem.Size = new Size(117, 24); + directoriesToolStripMenuItem.Text = "Справочники"; + // + // componentsToolStripMenuItem + // + componentsToolStripMenuItem.Name = "componentsToolStripMenuItem"; + componentsToolStripMenuItem.Size = new Size(237, 26); + componentsToolStripMenuItem.Text = "Компоненты"; + componentsToolStripMenuItem.Click += ComponentsToolStripMenuItem_Click; + // + // printedsToolStripMenuItem + // + printedsToolStripMenuItem.Name = "printedsToolStripMenuItem"; + printedsToolStripMenuItem.Size = new Size(237, 26); + printedsToolStripMenuItem.Text = "Печатная продукция"; + printedsToolStripMenuItem.Click += PrintedsToolStripMenuItem_Click; + // + // shopsToolStripMenuItem + // + shopsToolStripMenuItem.Name = "shopsToolStripMenuItem"; + shopsToolStripMenuItem.Size = new Size(237, 26); + shopsToolStripMenuItem.Text = "Магазины"; + shopsToolStripMenuItem.Click += ShopsToolStripMenuItem_Click; + // + // магазиныToolStripMenuItem + // + магазиныToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { supplyToolStripMenuItem, saleToolStripMenuItem }); + магазиныToolStripMenuItem.Name = "магазиныToolStripMenuItem"; + магазиныToolStripMenuItem.Size = new Size(94, 24); + магазиныToolStripMenuItem.Text = "Магазины"; + // + // supplyToolStripMenuItem + // + supplyToolStripMenuItem.Name = "supplyToolStripMenuItem"; + supplyToolStripMenuItem.Size = new Size(224, 26); + supplyToolStripMenuItem.Text = "Пополнение"; + supplyToolStripMenuItem.Click += SupplyToolStripMenuItem_Click; + // + // saleToolStripMenuItem + // + saleToolStripMenuItem.Name = "saleToolStripMenuItem"; + saleToolStripMenuItem.Size = new Size(224, 26); + saleToolStripMenuItem.Text = "Продажа"; + saleToolStripMenuItem.Click += SaleToolStripMenuItem_Click; + // + // FormMain + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1315, 433); + Controls.Add(buttonOrderReady); + Controls.Add(buttonRef); + Controls.Add(dataGridViewOrders); + Controls.Add(buttonIssuedOrder); + Controls.Add(buttonTakeOrderInWork); + Controls.Add(buttonCreateOrder); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; + Name = "FormMain"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Типография"; + Load += FormMain_Load; + ((System.ComponentModel.ISupportInitialize)dataGridViewOrders).EndInit(); + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } - #endregion + #endregion - private Button buttonCreateOrder; + private Button buttonCreateOrder; private Button buttonTakeOrderInWork; private Button buttonIssuedOrder; private DataGridView dataGridViewOrders; @@ -197,6 +205,8 @@ private ToolStripMenuItem componentsToolStripMenuItem; private ToolStripMenuItem printedsToolStripMenuItem; private ToolStripMenuItem shopsToolStripMenuItem; + private ToolStripMenuItem магазиныToolStripMenuItem; private ToolStripMenuItem supplyToolStripMenuItem; + private ToolStripMenuItem saleToolStripMenuItem; } } \ No newline at end of file diff --git a/Typography/TypographyView/FormMain.cs b/Typography/TypographyView/FormMain.cs index ac8b728..823eb53 100644 --- a/Typography/TypographyView/FormMain.cs +++ b/Typography/TypographyView/FormMain.cs @@ -78,6 +78,15 @@ namespace TypographyView } } + private void SaleToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormSale)); + if (service is FormSale form) + { + form.ShowDialog(); + } + } + private void ButtonCreateOrder_Click(object sender, EventArgs e) { var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); diff --git a/Typography/TypographyView/FormMain.resx b/Typography/TypographyView/FormMain.resx index 6c82d08..81a9e3d 100644 --- a/Typography/TypographyView/FormMain.resx +++ b/Typography/TypographyView/FormMain.resx @@ -1,64 +1,4 @@ - - - + diff --git a/Typography/TypographyView/FormSale.Designer.cs b/Typography/TypographyView/FormSale.Designer.cs new file mode 100644 index 0000000..4c5dcd1 --- /dev/null +++ b/Typography/TypographyView/FormSale.Designer.cs @@ -0,0 +1,120 @@ +namespace TypographyView +{ + partial class FormSale + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonSave = new Button(); + buttonCancel = new Button(); + comboBoxPrinted = new ComboBox(); + textBoxAmount = new TextBox(); + labelAmount = new Label(); + labelPrinted = new Label(); + SuspendLayout(); + // + // buttonSave + // + buttonSave.Location = new Point(205, 80); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(102, 29); + buttonSave.TabIndex = 0; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(313, 80); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(102, 29); + buttonCancel.TabIndex = 1; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // comboBoxPrinted + // + comboBoxPrinted.FormattingEnabled = true; + comboBoxPrinted.Location = new Point(172, 12); + comboBoxPrinted.Name = "comboBoxPrinted"; + comboBoxPrinted.Size = new Size(243, 28); + comboBoxPrinted.TabIndex = 2; + // + // textBoxAmount + // + textBoxAmount.Location = new Point(172, 46); + textBoxAmount.Name = "textBoxAmount"; + textBoxAmount.Size = new Size(243, 27); + textBoxAmount.TabIndex = 3; + // + // labelAmount + // + labelAmount.AutoSize = true; + labelAmount.Location = new Point(12, 49); + labelAmount.Name = "labelAmount"; + labelAmount.Size = new Size(90, 20); + labelAmount.TabIndex = 4; + labelAmount.Text = "Количество"; + // + // labelPrinted + // + labelPrinted.AutoSize = true; + labelPrinted.Location = new Point(12, 15); + labelPrinted.Name = "labelPrinted"; + labelPrinted.Size = new Size(154, 20); + labelPrinted.TabIndex = 5; + labelPrinted.Text = "Печатная продукция"; + // + // FormSale + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(427, 118); + Controls.Add(labelPrinted); + Controls.Add(labelAmount); + Controls.Add(textBoxAmount); + Controls.Add(comboBoxPrinted); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Name = "FormSale"; + StartPosition = FormStartPosition.CenterParent; + Text = "Продажа"; + Load += FormSale_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonSave; + private Button buttonCancel; + private ComboBox comboBoxPrinted; + private TextBox textBoxAmount; + private Label labelAmount; + private Label labelPrinted; + } +} \ No newline at end of file diff --git a/Typography/TypographyView/FormSale.cs b/Typography/TypographyView/FormSale.cs new file mode 100644 index 0000000..247b19b --- /dev/null +++ b/Typography/TypographyView/FormSale.cs @@ -0,0 +1,79 @@ +using TypographyContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using TypographyContracts.BindingModels; +using TypographyContracts.SearchModels; + +namespace TypographyView +{ + public partial class FormSale : Form + { + private readonly ILogger _logger; + private readonly IPrintedLogic _logicP; + private readonly IShopLogic _logicS; + + public FormSale(ILogger logger, IPrintedLogic logicP, IShopLogic logicS) + { + InitializeComponent(); + _logger = logger; + _logicP = logicP; + _logicS = logicS; + } + + private void FormSale_Load(object sender, EventArgs e) + { + _logger.LogInformation("Загрузка печатной продукции для поставки"); + var _listP = _logicP.ReadList(null); + if (_listP != null) + { + comboBoxPrinted.DisplayMember = "PrintedName"; + comboBoxPrinted.ValueMember = "Id"; + comboBoxPrinted.DataSource = _listP; + comboBoxPrinted.SelectedItem = null; + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + if (comboBoxPrinted.SelectedValue == null) + { + MessageBox.Show("Выберите печатную продукцию", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxAmount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + _logger.LogInformation("Создание продажи"); + try + { + var operationResult = _logicS.SellPrinteds( + new PrintedBindingModel() + { + Id = Convert.ToInt32(comboBoxPrinted.SelectedValue), + PrintedName = comboBoxPrinted.Text + }, + Convert.ToInt32(textBoxAmount.Text)); + if (!operationResult) + { + throw new Exception("Ошибка при создании продажи. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка создания продажи"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} \ No newline at end of file diff --git a/Typography/TypographyView/FormSale.resx b/Typography/TypographyView/FormSale.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Typography/TypographyView/FormSale.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Typography/TypographyView/FormShop.Designer.cs b/Typography/TypographyView/FormShop.Designer.cs index 9b3f2e9..e13022d 100644 --- a/Typography/TypographyView/FormShop.Designer.cs +++ b/Typography/TypographyView/FormShop.Designer.cs @@ -20,198 +20,206 @@ base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - buttonCancel = new Button(); - buttonSave = new Button(); - groupBoxPrinteds = new GroupBox(); - dataGridViewPrinteds = new DataGridView(); - dataGridViewTextBoxColumn1 = new DataGridViewTextBoxColumn(); - ColumnPrintedName = new DataGridViewTextBoxColumn(); - ColumnAmount = new DataGridViewTextBoxColumn(); - buttonRef = new Button(); - labelName = new Label(); - labelAddress = new Label(); - textBoxAddress = new TextBox(); - textBoxName = new TextBox(); - labelDate = new Label(); - dateTimePickerOpening = new DateTimePicker(); - groupBoxPrinteds.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)dataGridViewPrinteds).BeginInit(); - SuspendLayout(); - // - // buttonCancel - // - buttonCancel.Location = new Point(1086, 885); - buttonCancel.Margin = new Padding(5, 5, 5, 5); - buttonCancel.Name = "buttonCancel"; - buttonCancel.Size = new Size(166, 46); - buttonCancel.TabIndex = 0; - buttonCancel.Text = "Закрыть"; - buttonCancel.UseVisualStyleBackColor = true; - buttonCancel.Click += ButtonCancel_Click; - // - // buttonSave - // - buttonSave.Location = new Point(910, 885); - buttonSave.Margin = new Padding(5, 5, 5, 5); - buttonSave.Name = "buttonSave"; - buttonSave.Size = new Size(166, 46); - buttonSave.TabIndex = 1; - buttonSave.Text = "Сохранить"; - buttonSave.UseVisualStyleBackColor = true; - buttonSave.Click += ButtonSave_Click; - // - // groupBoxPrinteds - // - groupBoxPrinteds.Controls.Add(dataGridViewPrinteds); - groupBoxPrinteds.Controls.Add(buttonRef); - groupBoxPrinteds.Location = new Point(20, 178); - groupBoxPrinteds.Margin = new Padding(5, 5, 5, 5); - groupBoxPrinteds.Name = "groupBoxPrinteds"; - groupBoxPrinteds.Padding = new Padding(5, 5, 5, 5); - groupBoxPrinteds.Size = new Size(1232, 698); - groupBoxPrinteds.TabIndex = 2; - groupBoxPrinteds.TabStop = false; - groupBoxPrinteds.Text = "Печатная продукция"; - // - // dataGridViewPrinteds - // - dataGridViewPrinteds.BackgroundColor = SystemColors.ControlLightLight; - dataGridViewPrinteds.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridViewPrinteds.Columns.AddRange(new DataGridViewColumn[] { dataGridViewTextBoxColumn1, ColumnPrintedName, ColumnAmount }); - dataGridViewPrinteds.GridColor = SystemColors.ControlLightLight; - dataGridViewPrinteds.Location = new Point(10, 42); - dataGridViewPrinteds.Margin = new Padding(5, 5, 5, 5); - dataGridViewPrinteds.Name = "dataGridViewPrinteds"; - dataGridViewPrinteds.RowHeadersVisible = false; - dataGridViewPrinteds.RowHeadersWidth = 51; - dataGridViewPrinteds.RowTemplate.Height = 29; - dataGridViewPrinteds.SelectionMode = DataGridViewSelectionMode.FullRowSelect; - dataGridViewPrinteds.Size = new Size(1037, 640); - dataGridViewPrinteds.TabIndex = 4; - // - // dataGridViewTextBoxColumn1 - // - dataGridViewTextBoxColumn1.HeaderText = "Id"; - dataGridViewTextBoxColumn1.MinimumWidth = 6; - dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1"; - dataGridViewTextBoxColumn1.Visible = false; - dataGridViewTextBoxColumn1.Width = 125; - // - // ColumnPrintedName - // - ColumnPrintedName.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - ColumnPrintedName.HeaderText = "Печатное изделие"; - ColumnPrintedName.MinimumWidth = 6; - ColumnPrintedName.Name = "ColumnPrintedName"; - // - // ColumnAmount - // - ColumnAmount.HeaderText = "Количество"; - ColumnAmount.MinimumWidth = 6; - ColumnAmount.Name = "ColumnAmount"; - ColumnAmount.Width = 125; - // - // buttonRef - // - buttonRef.Location = new Point(1056, 42); - buttonRef.Margin = new Padding(5, 5, 5, 5); - buttonRef.Name = "buttonRef"; - buttonRef.Size = new Size(166, 46); - buttonRef.TabIndex = 3; - buttonRef.Text = "Обновить"; - buttonRef.UseVisualStyleBackColor = true; - buttonRef.Click += ButtonRef_Click; - // - // labelName - // - labelName.AutoSize = true; - labelName.Location = new Point(20, 24); - labelName.Margin = new Padding(5, 0, 5, 0); - labelName.Name = "labelName"; - labelName.Size = new Size(120, 32); - labelName.TabIndex = 0; - labelName.Text = "Название"; - // - // labelAddress - // - labelAddress.AutoSize = true; - labelAddress.Location = new Point(20, 77); - labelAddress.Margin = new Padding(5, 0, 5, 0); - labelAddress.Name = "labelAddress"; - labelAddress.Size = new Size(80, 32); - labelAddress.TabIndex = 1; - labelAddress.Text = "Адрес"; - // - // textBoxAddress - // - textBoxAddress.Location = new Point(208, 72); - textBoxAddress.Margin = new Padding(5, 5, 5, 5); - textBoxAddress.Name = "textBoxAddress"; - textBoxAddress.Size = new Size(336, 39); - textBoxAddress.TabIndex = 3; - // - // textBoxName - // - textBoxName.Location = new Point(208, 24); - textBoxName.Margin = new Padding(5, 5, 5, 5); - textBoxName.Name = "textBoxName"; - textBoxName.Size = new Size(336, 39); - textBoxName.TabIndex = 4; - // - // labelDate - // - labelDate.AutoSize = true; - labelDate.Location = new Point(20, 133); - labelDate.Margin = new Padding(5, 0, 5, 0); - labelDate.Name = "labelDate"; - labelDate.Size = new Size(175, 32); - labelDate.TabIndex = 5; - labelDate.Text = "Дата открытия"; - // - // dateTimePickerOpening - // - dateTimePickerOpening.Location = new Point(208, 125); - dateTimePickerOpening.Margin = new Padding(5, 5, 5, 5); - dateTimePickerOpening.Name = "dateTimePickerOpening"; - dateTimePickerOpening.Size = new Size(336, 39); - dateTimePickerOpening.TabIndex = 6; - // - // FormShop - // - AutoScaleDimensions = new SizeF(13F, 32F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1271, 949); - Controls.Add(dateTimePickerOpening); - Controls.Add(labelDate); - Controls.Add(labelName); - Controls.Add(labelAddress); - Controls.Add(textBoxName); - Controls.Add(textBoxAddress); - Controls.Add(groupBoxPrinteds); - Controls.Add(buttonSave); - Controls.Add(buttonCancel); - Margin = new Padding(5, 5, 5, 5); - Name = "FormShop"; - StartPosition = FormStartPosition.CenterParent; - Text = "Магазин"; - Load += FormShop_Load; - groupBoxPrinteds.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)dataGridViewPrinteds).EndInit(); - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonCancel = new Button(); + buttonSave = new Button(); + groupBoxPrinteds = new GroupBox(); + dataGridViewPrinteds = new DataGridView(); + dataGridViewTextBoxColumn1 = new DataGridViewTextBoxColumn(); + ColumnPrintedName = new DataGridViewTextBoxColumn(); + ColumnAmount = new DataGridViewTextBoxColumn(); + buttonRef = new Button(); + labelName = new Label(); + labelAddress = new Label(); + textBoxAddress = new TextBox(); + textBoxName = new TextBox(); - #endregion + labelDate = new Label(); + textBoxMaxNumber = new TextBox(); + labelMaxNumber = new Label(); + dateTimePickerOpening = new DateTimePicker(); + groupBoxPrinteds.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewPrinteds).BeginInit(); + SuspendLayout(); + // + // buttonCancel + // + buttonCancel.Location = new Point(668, 586); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(102, 29); + buttonCancel.TabIndex = 0; + buttonCancel.Text = "Закрыть"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Location = new Point(560, 586); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(102, 29); + buttonSave.TabIndex = 1; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // groupBoxPrinteds + // + groupBoxPrinteds.Controls.Add(dataGridViewPrinteds); + groupBoxPrinteds.Controls.Add(buttonRef); + groupBoxPrinteds.Location = new Point(12, 144); + groupBoxPrinteds.Name = "groupBoxPrinteds"; + groupBoxPrinteds.Size = new Size(758, 436); + groupBoxPrinteds.TabIndex = 2; + groupBoxPrinteds.TabStop = false; + groupBoxPrinteds.Text = "Печатная продукция"; + // + // dataGridViewPrinteds + // + dataGridViewPrinteds.BackgroundColor = SystemColors.ControlLightLight; + dataGridViewPrinteds.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewPrinteds.Columns.AddRange(new DataGridViewColumn[] { dataGridViewTextBoxColumn1, ColumnPrintedName, ColumnAmount }); + dataGridViewPrinteds.GridColor = SystemColors.ControlLightLight; + dataGridViewPrinteds.Location = new Point(6, 26); + dataGridViewPrinteds.Name = "dataGridViewPrinteds"; + dataGridViewPrinteds.RowHeadersVisible = false; + dataGridViewPrinteds.RowHeadersWidth = 51; + dataGridViewPrinteds.RowTemplate.Height = 29; + dataGridViewPrinteds.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewPrinteds.Size = new Size(638, 400); + dataGridViewPrinteds.TabIndex = 4; + // + // dataGridViewTextBoxColumn1 + // + dataGridViewTextBoxColumn1.HeaderText = "Id"; + dataGridViewTextBoxColumn1.MinimumWidth = 6; + dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1"; + dataGridViewTextBoxColumn1.Visible = false; + dataGridViewTextBoxColumn1.Width = 125; + // + // ColumnPrintedName + // + ColumnPrintedName.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + ColumnPrintedName.HeaderText = "Печатное изделие"; + ColumnPrintedName.MinimumWidth = 6; + ColumnPrintedName.Name = "ColumnPrintedName"; + // + // ColumnAmount + // + ColumnAmount.HeaderText = "Количество"; + ColumnAmount.MinimumWidth = 6; + ColumnAmount.Name = "ColumnAmount"; + ColumnAmount.Width = 125; + // + // buttonRef + // + buttonRef.Location = new Point(650, 26); + buttonRef.Name = "buttonRef"; + buttonRef.Size = new Size(102, 29); + buttonRef.TabIndex = 3; + buttonRef.Text = "Обновить"; + buttonRef.UseVisualStyleBackColor = true; + buttonRef.Click += ButtonRef_Click; + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(12, 15); + labelName.Name = "labelName"; + labelName.Size = new Size(77, 20); + labelName.TabIndex = 0; + labelName.Text = "Название"; + // + // labelAddress + // + labelAddress.AutoSize = true; + labelAddress.Location = new Point(12, 48); + labelAddress.Name = "labelAddress"; + labelAddress.Size = new Size(51, 20); + labelAddress.TabIndex = 1; + labelAddress.Text = "Адрес"; + // + // textBoxAddress + // + textBoxAddress.Location = new Point(128, 45); + textBoxAddress.Name = "textBoxAddress"; + textBoxAddress.Size = new Size(208, 27); + textBoxAddress.TabIndex = 3; + // + // textBoxName + // + textBoxName.Location = new Point(128, 12); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(208, 27); + textBoxName.TabIndex = 4; + // + // labelDate + // + labelDate.AutoSize = true; + labelDate.Location = new Point(12, 81); + labelDate.Name = "labelDate"; + labelDate.Size = new Size(110, 20); + labelDate.TabIndex = 5; + labelDate.Text = "Дата открытия"; + // + // textBoxMaxNumber + // + textBoxMaxNumber.Location = new Point(128, 111); + textBoxMaxNumber.Name = "textBoxMaxNumber"; + textBoxMaxNumber.Size = new Size(104, 27); + textBoxMaxNumber.TabIndex = 6; + // + // labelMaxNumber + // + labelMaxNumber.AutoSize = true; + labelMaxNumber.Location = new Point(12, 114); + labelMaxNumber.Name = "labelMaxNumber"; + labelMaxNumber.Size = new Size(100, 20); + labelMaxNumber.TabIndex = 7; + labelMaxNumber.Text = "Вместимость"; + // + // dateTimePickerOpening + // + dateTimePickerOpening.Location = new Point(128, 78); + dateTimePickerOpening.Name = "dateTimePickerOpening"; + dateTimePickerOpening.Size = new Size(208, 27); + dateTimePickerOpening.TabIndex = 8; + // + // FormShop + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(782, 628); + Controls.Add(dateTimePickerOpening); + Controls.Add(labelMaxNumber); + Controls.Add(textBoxMaxNumber); + Controls.Add(labelDate); + Controls.Add(labelName); + Controls.Add(labelAddress); + Controls.Add(textBoxName); + Controls.Add(textBoxAddress); + Controls.Add(groupBoxPrinteds); + Controls.Add(buttonSave); + Controls.Add(buttonCancel); + Name = "FormShop"; + StartPosition = FormStartPosition.CenterParent; + Text = "Магазин"; + Load += FormShop_Load; + groupBoxPrinteds.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewPrinteds).EndInit(); + ResumeLayout(false); + PerformLayout(); + } - private Button buttonCancel; + #endregion + + private Button buttonCancel; private Button buttonSave; private GroupBox groupBoxPrinteds; private Label labelName; @@ -224,6 +232,8 @@ private DataGridViewTextBoxColumn ColumnPrintedName; private DataGridViewTextBoxColumn ColumnAmount; private Label labelDate; + private TextBox textBoxMaxNumber; + private Label labelMaxNumber; private DateTimePicker dateTimePickerOpening; } } \ No newline at end of file diff --git a/Typography/TypographyView/FormShop.cs b/Typography/TypographyView/FormShop.cs index 992e367..a4a7ff2 100644 --- a/Typography/TypographyView/FormShop.cs +++ b/Typography/TypographyView/FormShop.cs @@ -36,6 +36,7 @@ namespace TypographyView textBoxName.Text = view.ShopName; textBoxAddress.Text = view.Address; dateTimePickerOpening.Value = view.OpeningDate; + textBoxMaxNumber.Text = view.MaxNumberPrinteds.ToString(); _shopPrinteds = view.ShopPrinteds ?? new Dictionary(); LoadData(); } @@ -87,6 +88,11 @@ namespace TypographyView MessageBox.Show("Заполните адрес", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + if (string.IsNullOrEmpty(textBoxMaxNumber.Text)) + { + MessageBox.Show("Заполните вместимость", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } _logger.LogInformation("Сохранение магазина"); try { @@ -96,6 +102,7 @@ namespace TypographyView ShopName = textBoxName.Text, Address = textBoxAddress.Text, OpeningDate = dateTimePickerOpening.Value.Date, + MaxNumberPrinteds = Convert.ToInt32(textBoxMaxNumber.Text), ShopPrinteds = _shopPrinteds }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); diff --git a/Typography/TypographyView/FormShop.resx b/Typography/TypographyView/FormShop.resx index b92e6b9..0bbad28 100644 --- a/Typography/TypographyView/FormShop.resx +++ b/Typography/TypographyView/FormShop.resx @@ -1,64 +1,4 @@ - - - + @@ -126,13 +66,4 @@ True - - True - - - True - - - True - \ No newline at end of file diff --git a/Typography/TypographyView/Program.cs b/Typography/TypographyView/Program.cs index 33b0b9b..7b7ee3a 100644 --- a/Typography/TypographyView/Program.cs +++ b/Typography/TypographyView/Program.cs @@ -1,17 +1,15 @@ using TypographyBusinessLogic.BusinessLogics; using TypographyContracts.BusinessLogicsContracts; using TypographyContracts.StoragesContracts; -using TypographyListImplement.Implements; +using TypographyFileImplement.Implements; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; -using System; namespace TypographyView { internal static class Program { - private static ServiceProvider? _serviceProvider; public static ServiceProvider? ServiceProvider => _serviceProvider; @@ -29,6 +27,7 @@ namespace TypographyView _serviceProvider = services.BuildServiceProvider(); Application.Run(_serviceProvider.GetRequiredService()); } + private static void ConfigureServices(ServiceCollection services) { services.AddLogging(option => @@ -41,21 +40,22 @@ namespace TypographyView services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - } + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + } } } \ No newline at end of file diff --git a/Typography/TypographyView/TypographyView.csproj b/Typography/TypographyView/TypographyView.csproj index d5e8cf5..bc5359e 100644 --- a/Typography/TypographyView/TypographyView.csproj +++ b/Typography/TypographyView/TypographyView.csproj @@ -12,12 +12,6 @@ - - - Always - - - @@ -26,8 +20,14 @@ - + + + + Always + + + \ No newline at end of file