From 6fe49b5a2ec3ee9ccff07f1099a363f98e3c0171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 18 Sep 2024 12:43:35 +0300 Subject: [PATCH] Implementing the `OrderReportingAppService` Class --- .../sql-server-orders-table-content.png | Bin 8616 -> 9438 bytes ...tudio-order-reporting-app-service-impl.png | Bin 0 -> 10338 bytes docs/en/tutorials/modular-crm/part-05.md | 6 +- docs/en/tutorials/modular-crm/part-06.md | 61 +++++++++++++++++- 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 docs/en/tutorials/modular-crm/images/visual-studio-order-reporting-app-service-impl.png diff --git a/docs/en/tutorials/modular-crm/images/sql-server-orders-table-content.png b/docs/en/tutorials/modular-crm/images/sql-server-orders-table-content.png index 3e3794e53627940fd5ca3720be583f0707d111ea..8e4cb9e923fc5932cee62fcd2c157ca82a1dbc21 100644 GIT binary patch literal 9438 zcmaiabzD^K);0=)g3>7hI&^oJ(jg$CbT+g zyytx9Iq&cH{j=wu+4tPF*IL)LuC>G8Da$^?e2$5Ng7QpWPU<}h3aS{g?eh2`@;Vsc zK#GF$5=CC>%?FRn-&qDx-LoOsSUVf$J&8fzS!nd*K2^8ioa=FO z#h}+wTh@HxG;F%8K2D3`lu_<`Dexy31nA=7JKWTpUBI>bYF{|2@4{^>8!MHzp5iy{j`3{x7ZIh4kww- zQgm+w=QMeNBc*4efw2@K{37o0i%ngJy3O9mElKR)yeD^Vh7)8O$w#i&W~L(j5kbZl>Xcq<7&wBD zSl20p3OnR}cW~JuR^T``y>dP6a+a1=@wuAvs&3t14bRRedM5hQe&Y_$n)4tV$JN?tfNbUn!$`#*hC!2DqrS&kxvvZv!{LT|!)B%6E?8_d zUKUJaAGLV>ryiy(0`+*g*+*>=gE&mg$glD#Yxh`Z${IV=s249RqZ)W&cb@HxBWVkt zl^vlh5r^yQ307No@emG8V8IS&fkW3V%^RMD26@bLCgO0Bv+n4|cJj)I)MHvqmG5?x@0we(-*xT$S<11*ttT8bI`0E$ zUc89Z*x8dl-<$Ydu{|=rn!41{r!P7%BYRcQA>alDv^eh`!i&WPpyCTF2N107-EAF` zqjvvvaJ@l$C*kJjxh8SXVNjOo;IU+r<#@$vG^i>pY-cO9YAi?0GiV37*_|wYyCQec z*&eOi_V^-l68&?DejTcz-2?E1wuEG-i2hM!HppY|z#txcXB*HidoY=3_zWk*+{kWL z4~D6YVp8US*+DpBXddbRCGWf#LE;x8@MWj%Mo5$zk@ z&q58F&peb>CBkE=#8X;1&zFkGl!QbO?-n$qz*f7|g3_u<7}+Ay>^vAX$t^P@&?Dgs zg_q_+J~A!hOXzH|^TJ-&7h3E$$Lkim?m1}2y?qTSh;HN@0)AKBz2RY#9hdADs7g}O zk;&7vZ#YLdjGXz!WA$N%cw?kt)SwAIYtn7eWn$06doOo9pcXpbN;&-?<_#@586`Mc zYC3ba#=su5!=rH1fQ=!|U1h;iK{ZA!8PTn>o_!^L(wDZrn!~klXJ@w?tJL{bnFHci zyG=SBg6?3kIe1T#j>~1+hA+F@`kYDe&TvH}(mOj`bbp4}8Z!4E>KeOeQ|_+T=32_r zFwjZwG-Gt&Mt|-nxYm1!D0_soA(Y3n?opL3+h$@-M^!#vw|_8l=5|9zbg#xTXy!r$ zPgXdc@-dKO$Fh6J>MuHhWqysASWQh(wZ4i`xHl655*57$6Lxrc92iI|?bso-AB=a< zQ=eMJ>9yY$*{kBe*F$x`r0c7F``LNDC2svZeixHd{_|Js!#D=s>|pfDynd&RPLm_S zSLM)J19Y6X1^M9{P`}lTTum=$SxQ2E*vnPUm%)vwsaGI!g!g+Xd*r%5J%!I7<@g

`@ym! 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 literal 8616 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 diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-order-reporting-app-service-impl.png b/docs/en/tutorials/modular-crm/images/visual-studio-order-reporting-app-service-impl.png new file mode 100644 index 0000000000000000000000000000000000000000..d38e66365e56a676b1c690198361987da6dc829a GIT binary patch literal 10338 zcmaiaWmH|u*5$?tP9R9o1b2cH^x*CxxCVEZV1b~)f@>fIcXvr}I6!cR;1W1E1gAIm z-q-#5_4h`fAA6ipV^`IxwX4=zbIuA^QIf_)dyWPG0H&;rgc<4E>ZQQ^Vo5|)=2 z08j$55)ci~3|OYGBk5-5wtux*B|8soznp|gZoO@c#eNF2(kwkKEo?DECdi{9H5gHx zcm|VE*CmeCJxz{7x8Z9}MBJo12Hjo=(X00>iVCdB#~+D2un>P!nGNy_AfSg95K|S= z+a z;3!eon2Rgg+z%A`0w}|RzNf+mQqrp6;~>6L&Gemi@HHPAJn`2e7X}xV5E5*MnjaRf9qpEX z6pujHY{&-({CIDF6{^@k#Or(Dk_9yI;V|`xFy!=3|Ce+{P^^ z2V~y_;}NJHdAHfw*%8~|OOEdvzoS2}vepn*_mhSZC8K|Y<0p=vr7+XxNlWR)*If|=sWeDg_B z8PjRu-tY%>wh-kCo#rou~tFdUPr7J8Gnr1rwgRY#bshZhzz2x0XB{baJKGA(si)^X{t`71Xk7VNrB3 zUe3b?Jo6PBmE_XhgYn^lsH!)Gm}ByCTw?}8of3Ez?zFIhsaTXXAGRYoGB{oopZw)0 zj2?aH_y`}pzXaxhS>oQL0Ue6S#O*@9jyNGAR-Ep+@Vq}wHzgH&pc?O4h?&`O4vp+m z?G?$(3oAFPUxe1FOu}3yBtq~6s*UWg_%BZv&ix5#Y3=0h@5BFKKin^F(6J+_OJjfW z-wfh|dvvr#!9JG*eZam+% ztm-P4>X9p1x~bp0Cux~7{?>S5goCTB<~M$^9E&1IdRQ4oqv2kBed<^l<=5q? z?@iP%A0w;t*0Z{BW5w!CxEJ6NK(tOpKa+jm$ZM^w!OP=Six)iWz$^JvML9|3-kp$Q zrA*$@WOI@una3=-t4+tY9&T?&8|GQ%a_9b5}4Ni}%KQTlPwQRS2{^Y6t zcZ)wO8Vz1Mw_m3T_>Z*r2v-QojNERMobvS*HB-M5%uZ(*eZE79;k z$*<#_He1T?jb30tpev~_qqEu396^AVx~Q6Lx_Zb&4R<*)qwXT`Xe>k7?a2k1Jj!T?KX5WUk5m94B=}KD7RHCnr_!OV_M&; zn{To5r{>zwRG*EVR3vGCvFs;Ki66kBdbB3-g6hrs`ntCH-LA5~bt}!)4c&4_lNH<@ zEN|*`3*&aH`+?uJ-rj0>Hy#f-T6(yCOY?+a;2Hn^dVt4Z+f^+#?mNb*LzYe#?2+f_ zbn#uLBcBLZyiW$`;EbG|tG|6Sb#c7np3(bed%fjhpXvcyoH69rk0bir`t??D-82vy z@rQY=mg+)UNU<#V?YG5QQOW*5Qgbw7FBtY=2QS}!qQ9YZS<_c7x0lZ(qB)WH_f0SP zJR39U2xTDn>R{$50!EeLAUJsRXsCfHqN<`e-G~wYJF9%|azVRtDzw<#beeb{@3O_x z2y5?O3#mwMwnBuQWN+j+dff{Bj?R9y85AG-P<_ZMUw?%z>@U52tcDUqDI?{Khoqgv zz_`6Fvmw6JE3&OITw&N^cAvvGy8*#@m){S;H>sMvfGxz33#HkRBt51xCE5k_s4A_Y z!#{@2u0^?HxkgTt9J(H#7n^Vp8DdM#(IQ^zH96-^j%lfq)+soQ_Tni9Qme``m7@w1 z#8CE7pDGyl;=_eS>omJ1mpvm4q`ZoQ;G3)A2J93DQ_5IXJzCV@@JrYCw)_T zPRfV|Htz23g6%am@d?bxOCKx;<9|BO_8rA8ImFIAeAiYI@z1}%BnI#|QAWG71%NA| z$+BR~LHX^b(3jh~I1EhrrdO2EiHG^PzWB;k7MhEq&@HZ)p}zL!h5Bl%#@XLJgf<-= z0?o?wp}2z-pQ}YGd$M)kdkHlJ$~37ttA_QM{Q2eY?`Kw_WB~JO+rAfBe26_7h0+-y z2b}*bn|WyH+k`j%?zj_nr}}Tkz!cZ;nk*!%kf)G-KOQ!;e^r<7%YC&dB>;6E7>C# zAhV1Sl26BBY|Bn;Z-p6!m&ZJ*YFu5Q)Cpxd`t1adu3#33&pV6qNL6lDlB@QM9@I zwfr|WyNB@$FPCjNQAM|58|+qOp!dPRg?Zc3|BEpsLYravW#BCNNt0| zx56)kp_Wr8H8rjjN6qrwC1%H-p*t`XkNWft#u@-Gnn7`rA4S1{Cr5)u{LHvEQ{YcJ zs%6Azp76kzVUDv@$J+;KWoob zfyWw@}d!Ey-b?uC@k+q1=$&JOhIRc_kimx~uH#n1PnYTqrd7x*+IJLkfgrZDNxrVu+EUE(7eN~h| zfU^-(c&ztnp#7#daqnYI{pTXI7 z?}H1#l$~FdRj7@%wo0C-nuj98N2XhdtDQ);x1vE5_|C$6=jZ3Sl$msD6vf$5IZ7N0=~qZFQ90E4T(1Hs`xQP^C{g{tf#>fK zPU)1<>lq|_4QiJJQE*AmwFp;aNqH)GOJozSuyAlz7`NjoPvW^GeePs zei*TPp6!g8N0nN?YJP#k43#mr=(a7oc!xOAPzu#K#l0H~e7Wm@IPesOg#uqkM`zjh z&k{KDTLUk%)z08KLRT9$dV~OK*xrzhpCmlC{abIC5KLlmi69XwfXOIfl9dS1 zePtjOOD%_WL&VzpYOP@W9f@^vu02lBfoRswVLmri4JsxWasfvkMJ=fHfz{_pc~k~& z<~{XvNGz#S27R|lRonYN?rv_Ixu|G^KRS%NLJG3{=4o}O|BwkPMnyQO3Kn}~0hJLq zC1d-MhZJxDTyt?3@7lUJM%lq5+G>B@`v*SPp;N~l3~De$Ny@3pssTLA%cFBEYL5&W zv?{IAva+(0l9Ifm?Xf;d*qX1+0+e>iEN#iyxVKJh&f_@T{MY_ z23u%;V*zmq%@hc@;I|Z@=xzr2G%ULCGnP+e#>E%8nIT>Vrc+UqJ-&%?|PvPNy zt3RMNJQ6mi_9CqvL`G9W!zyKY$POJBlSm|Sjz}Li0)lSw4SbG!;NN0SAf;u#NQ?|h z!Zyo6MO9nnlL1Q$CwMF!VGyz+I_Ce^Jn1-!7ZtovMfO|U3oIo}2Q$3T?OWKY8&~&& zgF`55P*IlRZcmas^s>nopd$LBOSoM5K8`0xSE_qZ$x}j~`{L zK3tUWzy+8=qoc8uKz$Y|-`HK}699GD1uA0O+|#(bnZ;W9?u$D2LygTrx__6NX^v0f z&96K5x|xB{WO<*$HTChZZ%(5pa9jdBB>I<*Ce?ULYjvw^dRt z--OVJbEP>ta$>D0{+i%7TZjmEw-cW{K9HT4X9i7T0pTejn}Nbo^Y2h;!01Q4IC?!9 ze8BY~Igh=5>)L(G;nl*z!?lf&@6Dd3i0AOFpc@41kCf1mlv^5(GS_ijf~#6Qwd~VI z3DLI!kLih879K^AFbTpd4K|~FFn7tGqymu|5;mQT`F4E5OOvc=BAr~yiHMpc?AU>5 zSZDXf%1?)x2fh0{s_X6JUt8Kk-oY5@jms<&l7$Pb5=2s3Ft-$g`&Jmb4sGeH|cXfSZo4=*Zq#P$TiHt zA03#QngY~&Frsy~0&{oYJ0zSJqr7jQwq;2Cmi2rMk+jyQzc<=Wby#mb&KP{&o#rd1 zUmPrz(8B{mV3xf_Sx4WS))TyQ{|v9e{1czf3!84|Vz)`BX3T&G$7r#Yfef^}U?qDS zAFbB(=5js812%ttd;0V3n>YIJVRaz0qEltkBNBQe^$|tH^Ovg-$8eYY)dy@c%EXW$ ziLYT9BL04R(`9`z6b`nwi!C09aWwLB)A$kaYF2!EX<}84$Gs$3UR$Zpm^33JBQNhR z@k&wS5EA*-RrvhxZ@aKXT0M`~O8uXrL1H5az?$+TnZ*?wc$pb+w&j5ClE;Nf2+;l89- z@%w_8B0LsDK-a(D8BX}zv?}G-VTbFkS~JG({w$i9|FL%He1D+>OT6No&#JNbvFp7J z1UG6bwz|`a6G;-cT(3!Nv3Q}1!GGHS&ruOw+NbIIf}*iBe2V9)`-yAew2(OZQH8me zT>Zur2;bp$%&l?JL@};AIbgi_xIu7vKwtvG$Wx^El7Oy2{mX17(Wm-!82Ps3(FJf^ z6BgWKz5Zp7vpIJ{prMfwDmsNxkCwmCx)-R8`}5TZo43{%i!W z#1b56-{XK8Kx2rK-6H-M0`=sJMuI5T9vjLF-vsnp%Mh!mRwxyKU?I2A-4<2NN+SWp z1!{asO^*>!{NLbJakj5fzA1>dAS(+00UG8$b&@Ia4!MGHR5hWE{ojMb|Rj1x! zwfU>%59?q;%l*nh#esFdmen1kY@}%E?8jOgrG1|9Rf~3y`1g*?FY^Xj7A*r1-SnT> zH_vc*Oq9Vf&u2!2D(&n(G*{;P{rF&K)8}8cda~}(en#Q&=BdrraO$jE!7)NAI8S=T z`wYU8*WJa@vmdzksz-yFQ&mcqJd)-zWN6DS1Sk%RPMFM-}+uO&$usN>`qSV ze{Hb8xib86_v--};6B~*sofj7I^9x$3Qk~?GyHvzY=`ic2}rrToY-@3_deJ*teCs9 z9&Y6yL=lU^bW2alxJx}25c0nMo?_vK@ZIw6#}cL^M#>b0(D<=tBk1+T@l7CTZD0ec zrStOpob>Buw4kbft?H32nxWa$KB)-;*?oZ;s~R;g+n#&$EnCWcyhCA(*wR+1qQuo5 zvcBb_YZ}tUrP!5+R+n1v(}sM!9K*V%rF_Fp|3y$~hSpOOj!>u)8B6f}Dt*R>(7pER zhfYorUmZ0sjmYRUyHd?(@8us{Q6V~ittq%zwL%RoJFzK9=zWU3Reyz zhL4FvA}8kb8@<|?D2kygi-NjI=6osNT+C6~w>;dY%V%v&UuE?=X{$#%T>^uS_Ltc7lderPhy9va!VO+T5%K z83*4DbFEWqCeohXP+*oDylI7sCW_K9Qyf?}uYRwuE4x`%oyL_&c!S_{b+q+9`F`tD zUCbxCsPH*f3Mpj@B3%y$&X4C6R^m(fG!%Et3+P5k11!68_d6@*$0auh`uLh1gFKQ1 zW#!Q7CHNx$$Z~D0z5F;@F8N!>K@NF3r1&_#*NxhxLe4fqt=RSY0_Q2Sm50lc4v?c|@A`rX zCG@XzQr*t{&DN*jb6fNh@fzhRq5B1i1Lh>fMp7W3$=&PdXbQvXvnq2Spki_1`%bvy z1a>u_G})4fw_d7S{HMvn0Zd06;c9xBsd24*_TmA5D*b=uospTX`b{3A zFErh{$tfn%WkEX}Gnmp9)@Z25T_+e_{{AuM# z_f4g{HSZl40HEGq+pj{z|)oOsTQEa{n_w{wII_WrcM1E>S~watzgS{ za&)roCn&?n;nX_9S=S7KcSK_z$GVgCYH8CG7rHlIc#-YvX2!`9W zd)?{cpiJ6SM~;OT^n!+*+yjUBLe~+NMEA zWtMK)ch=lUoug~MXqXocc#J~(GnzHQ)&BA)haI)l@{)xrzp-iAI+IgEHV>U=?uP7j zlrYSnQ%OWX=GZ9A8(u0f-8-=8D>Y69YCJdV@DY_$IN=d~90$3ku|G6{_puEpw=v=F z1P&6r7D#aTNQ3>G0A=Mt0ak2YTNtam-_p|3$OPO=b?U6I#l>Pza>mOUZ0D-;3JU1B z+iGe~(`?GGmjARDJoqsOQc9SQovi+zD(SfFVWXCntI@}3Ub4SS-r?S;{0Y05yB}<= zLQc=P(3Kr#d}r9tQ$1O3rawuTlo)n`MspZ=aXh4OtPQye?^MRh(5i%u2HJ)CIj=~R zn^hRJU3cRt=l(i4ruH8GMN}0NvrTSl+;5zfPHdg5;Yrkg=*Xinn{K3SGvoa6L^?Mt zYmlR1brxDi$#I&H`fvIXxo!EL-wPDgow1aZl*)lE=MU^ge6HR1^w4Ur&~$9)ly&_V zMY{e>sV6s9E%2!}q&NXqc4kBR;;~%dIP`*lql2WJt^8?s!e0fMDUYn2%{eVE3GMm7 zKx5JlI<}2$FF&JkJ0mhnT^OW+jp(dt38G4lvsRj%4Id&XmzgtfucFW^nMMpnfM+LR zu>Pj{Oo7`nFDyJCsIA=)r59rVBlC~GbYGwu%N}4d3PTSK+Fes7W&!}B0os$urLo@% z2S3x{;;$A-B|j+D6n$(E*&j$r2u!Vf?Jrak0qigxsqq2rj9(c8uR>& zklhDKNcJimJ1X`Q@kv1F`W-$nYM`lH(8f$1GAvyUnFDncBCOYC$Zc#^c*B2*F%5du zl>bhJDU+6zQqg%xuMmB})o2@Zz}Dmft(o}XEcL9b?a6tI+Pm7C1nMUlp_9$h>BabP z;D+k+l1dHW^dUucgLXX;OUUi!n*CFV!!eoRyV2Xt7eH5b^pYNp`v1plnMWyJHz@5l zd=ZomSsR3hkmI0w@X-4UkYJ{iYkzc^Mztem0}1{N%3V}FHK(=TI-Rc1f>JD>I8v>L zryaa|xAWN`mMh@mINoMN*x4i}bd~DGs3zNn5MK#H4c&9XsUdw3&-IGPk7FzidKsmj z^E_XA6jQt|2fCi%x^a`4EWvr;e+QKkdiTDB4t>Rslj(%6Of&x|CV~~?OL3#Q+__wd z79!pEg`v0@OW8aeydV8@LOEwZzcKa`w zvP&V+xX7afCt79{Uh@Z|OP!T5PUsmp$MF{{rRMd5V}%oQb4?zH%T}NIiozfs4)I1_ zJ^?9O1o%Y)AUA_imtGM)BIXFvU5q9a6w2@SEC^K1!9ss>dfMIHecmFa-YC{t6l8c{ zRd0Bx6ITU`W;Ny?gB1LaO@x2x+oh}O7m5nhbGR8Z zQQF#Y2fI`XeFbAZ+2dUR*l1_ki0K2vrjIc{zc=R!#WtlX5e0>VjSaLA{leWgXd4+p zYz69Tct8GyO~`o#m*)6{F4<_6EvJ?4hExn(Z$_pKqxA8-5=GE8uuD=VdJ?1Bp}0 z<(k5?J7P3*Rf$FDx=vkRj>+UeTG;bK->F-DdgN(vQc_Z6Gq4Mr^^QJM;Z+mzI4>MDX9>ec2~GM^4{CqwJxXpYvuA3^;Uu`c6oE$sqXYn((eR> zKmHi?z`=Dvw)s9l&cN1&w*{Fdu&bXl8xE_HfCE5UuHJTT9Q+Q)Ydw=?peLl41;)oG zISPtnmEJ^<>83VU=3xrBp+?!|*}&U+SiUfDFj1k1#IX#H5|E*&Tecj3CI2(_xns4o zRT5@5!NmUaD&-QPthd5sbRacmd$`=Dudk0z$f~ep?a-$wRM6Z!cpdRp35rsP|1X1C ztkQwXxvv|SH6#>Xd~j*s-cS~Aavo5+F?F?w4Sdss8j(0&3+LAt+RDvwgW{_t<>6jD z=p-%XY48V93ghE((oQpqtWJ~H+=EtEfC{m@t=aF+B*odLc>7R--{-v{uF_1MyILNt zj5z{9zMqgmtvb$gh0*v*CF~_2x(&;$=yCBSR=0aFSiKl_OOatq!?CXP&4Ryp73&F zojg)=BZa7-OKpBn3!d{TpOf#xF0;tEPp#XXpu8s-c|)+-!O372-&rmz!6-X3>%c~F z^b>D&9Svy&g}dR9#mwD(9fdh=oXI2!TbaSD-u!>qy4Gz}8F!5obltHZ$8e65CveZ; zAQ=Hc5+DktTgiSrF-m~N|0D+fLq3GV&sV(&!*h(K&n8Q+n_Gmns--hC3Ghh60_Q$~ z!@y=W%;-tD)DGbTtZI0eq(SD?vX7?(Hj7~< z*MgouHeX5#5#V`h*(a5~;ciPS*Zg;zQ*0JEV@JE&LI|PaX z9(`cs@$$@n28X|OJglckwWi{rQz%tM1$b;~IIa4m9DVzvT74H|Q^BQyb}}ken##As zG02KdIFiF{SoMVr34-0g*MWlBs$B^(!aW)~=M>xw^ zbdr4Gs_`pHT0BU20rOQK#P?@+>}8D*dpC+@D%sV=A|&R|RS~L0tm|3j&Yi@0xunjfREf%wSzJ_Wfea6=`5 z+!Y^O2E+fLi~cQ7$el=-G85=F*z3RG-d}7w9ZKaSu9=#iKA5j7i4DO)tWtTZI$LkI z@I~l7+E_5B#mL#&*}I|Xxj9)m0+6{%z|>x@{oExSg2GxN{b!%z1iFhW3Q}1be`uB6 zqbwqrfoZT(tZk4DyM%ZN@c&WS@Ig;2pRhUO5JJd-jbE+J+d`em$0$NP;d z=&jrbESunHDJ9xuNoIjP`YG;U_^2uT^8Y4}7Q{tP#c>m?Rq}M<`*X!URb^DAAJtMc z{+a%s)u8Qiuf_k4Y3uEtgMov_$H-A=$ztBnjcl4zP9`%WHSLG1gyQJSh`rno>>3 ze8-V2>EED`pn{L~N>ja&!^@17nhei5jX^YzsD$PlYhYJes>UIwbBr2#9I}d)1~EkK zaexX&V1h`;g!V!nqE!P*fWayo zW9+duLpz5_;cDSxtN&H~WBj3|XxK}5P$`AV-gCn&9&;9$3s)N>vShiT^5(gksnYtc z`ER)Emb?P$pA7i+rTPET?1I&{!099%wWwmP6O#U=uJNYk>qr-(Iaa4%)UpHFc5UI-TCnO6d(P-TYK+OiL6iD8vZk(X`j(ZXO+7q`7*2O! w&|*f^--25<83|ZS98G~YAO2SR*B%gxn+dg9Ete3%yMutNq>@Crm{H*W0# + public class Order : CreationAuditedAggregateRoot { public Guid ProductId { get; set; } public string CustomerName { get; set; } @@ -70,7 +70,7 @@ namespace ModularCrm.Ordering.Entities } ```` -We are allowing to place only a single product within an order. In a real-world application, the `Order` entity would be much more complex. However, the complexity of the `Order` entity doesn't effect modularity, so we keep it simple to focus on modularity in this tutorial. +We are allowing to place only a single product within an order. In a real-world application, the `Order` entity would be much more complex. However, the complexity of the `Order` entity doesn't effect modularity, so we keep it simple to focus on modularity in this tutorial. We are inheriting from the [`CreationAuditedAggregateRoot` class](../../framework/architecture/domain-driven-design/entities.md) since I want to know when an order has been created and who has created it. ### Adding an `OrderState` Enumeration diff --git a/docs/en/tutorials/modular-crm/part-06.md b/docs/en/tutorials/modular-crm/part-06.md index 1f4d7392cd..80d464248a 100644 --- a/docs/en/tutorials/modular-crm/part-06.md +++ b/docs/en/tutorials/modular-crm/part-06.md @@ -547,7 +547,7 @@ namespace ModularCrm.Orders // Product data public Guid ProductId { get; set; } - public Guid ProductName { get; set; } + public string ProductName { get; set; } } } ```` @@ -560,4 +560,63 @@ After adding these files, the final folder structure should be like that: ##### Implementing the `OrderReportingAppService` Class +Create an `Orders` folder inside of the `ModularCrm.Application` project and add a class named `OrderReportingAppService` inside it. The final folder structure should be like that: + +![visual-studio-order-reporting-app-service-impl](images/visual-studio-order-reporting-app-service-impl.png) + +Open the `OrderReportingAppService.cs` file and change its content by the following code block: + +````csharp +using ModularCrm.Ordering.Entities; +using ModularCrm.Products; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace ModularCrm.Orders +{ + public class OrderReportingAppService : + ModularCrmAppService, + IOrderReportingAppService + { + private readonly IRepository _orderRepository; + private readonly IRepository _productRepository; + + public OrderReportingAppService( + IRepository orderRepository, + IRepository productRepository) + { + _orderRepository = orderRepository; + _productRepository = productRepository; + } + + public async Task> GetLatestOrders() + { + var orders = await _orderRepository.GetQueryableAsync(); + var products = await _productRepository.GetQueryableAsync(); + + var latestOrders = (from order in orders + join product in products on order.ProductId equals product.Id + orderby order.CreationTime descending + select new OrderReportDto + { + OrderId = order.Id, + CustomerName = order.CustomerName, + State = order.State, + ProductId = product.Id, + ProductName = product.Name + }) + .Take(10) + .ToList(); + + return latestOrders; + } + } +} +```` + + + s