From c91cda32be4e6b39a5226a5d326d56596f4fbe13 Mon Sep 17 00:00:00 2001 From: Nicolas Fley <nicolas.fley@student.ecp.fr> Date: Sat, 6 May 2017 16:41:10 +0200 Subject: [PATCH] at least we are quite close to the end --- model.rar | Bin 0 -> 15707 bytes scenario/my_foodora.ini | 80 ++++++ scenario/testScenario1.txt | 267 ++++++++++++++++++ src/Cards/FidelityCard.java | 1 - src/Cli/Clui.java | 69 +++-- src/Cli/Command.java | 8 +- src/Cli/Token.java | 2 +- src/Commands/AddDishRestaurantMenu.java | 2 +- src/Commands/AddItemToOrder.java | 4 +- src/Commands/AssociateCard.java | 1 + src/Commands/EndOrder.java | 7 +- src/Commands/EndOrderAt.java | 44 +++ src/Commands/OffDuty.java | 2 +- src/Commands/RegisterCourier.java | 3 +- src/Commands/RegisterCustomer.java | 3 +- src/Commands/RegisterManager.java | 42 +++ src/Commands/RegisterRestaurant.java | 2 +- src/Commands/RunTest.java | 32 +-- src/Commands/SetProfitPolicy.java | 6 +- src/Commands/SetSpecialOffer.java | 1 - src/Commands/ShowCourier.java | 6 +- src/Commands/ShowCourierOrdered.java | 33 +++ src/Commands/ShowCustomer.java | 8 +- src/Commands/ShowProfitBetween.java | 8 +- src/Commands/ShowRestaurantTop.java | 2 +- src/Commands/ShowTotalProfit.java | 2 +- model.di => src/Commands/model.di | 0 model.notation => src/Commands/model.notation | 0 model.uml => src/Commands/model.uml | 0 src/Core/Main.java | 9 +- src/Core/MyFoodora.java | 56 +++- src/Item/Meal.java | 24 +- src/Offers/MealOfTheWeek.java | 2 - src/Order/Order.java | 41 ++- src/Others/Date.java | 17 +- .../TargetProfitDeliveryCost.java | 2 + src/StrategyProfit/TargetProfitMarkup.java | 2 + .../TargetProfitServiceFee.java | 5 +- src/User/Courier.java | 15 +- src/User/Customer.java | 114 +++++++- src/User/MoralUser.java | 2 + src/User/Restaurant.java | 14 +- src/User/User.java | 8 +- src/test/TestCli.java | 40 ++- src/test/TestItem.java | 4 +- 45 files changed, 846 insertions(+), 144 deletions(-) create mode 100644 model.rar create mode 100644 src/Commands/EndOrderAt.java create mode 100644 src/Commands/RegisterManager.java create mode 100644 src/Commands/ShowCourierOrdered.java rename model.di => src/Commands/model.di (100%) rename model.notation => src/Commands/model.notation (100%) rename model.uml => src/Commands/model.uml (100%) diff --git a/model.rar b/model.rar new file mode 100644 index 0000000000000000000000000000000000000000..0073e7106ffd001a03b3a18c0cbbdef29ec1cf1d GIT binary patch literal 15707 zcmWGaEK-zWXE;Bhn1O+p0RoEFlsHT<X2@h<0Ar>N>zZp8_tkjG8uKwIFfcIW=BK3Q z#DGb?luU*VVhqfjp$^?ou2<-{yH{nM5?XGdqw_-dr6gxW$m;(J8(cQz<oAE5cwhZx z4&VC=56}0ln5&#n5W3-&Z{objCZ^@486`7+%jiy;FzLjj)t6-|;|uKWpX)bh*--HJ zf7tfIj+h-&J&d=`2uSD>ymd*U#9@LZgQYG5L)~j81}3dkk)7ge>%3%*MKIi!mtT@t zl9`{!uwnAa6amSA3nxWqGKh%o{-kWrzvEuITZ;R#cRRPsJ*#Dn5Km`jTy{>Ur%B?N z$-&;{#H79dU%&X3Ht&0RhNx!^>)lWTiOKnk-rW6NX879EXQ@`mI<Dp3_m68nh?*C% zYN_uog`gc<pDo*EfB%p2qW5n<Y;EQ}{eAz>-`oF~{{DAuedPX=MPK(%yR&}fLh<+i z<^TTQ|9Ai0*MG~buKt*RZt7{V4-qf^?wh{zPy2J`r7UrW|EzxhXXme9zv}0wZ{Ggf zzWcA(|NX4{)BgI#Z-02p`-g5_eD`PR?N$Z1^p9`7c=}D@vN_)}&;GExclk}N@0)18 zg0i?@{EMz{3}*lM<^S!Qe;Yo0{gZcj#><VDKOQ|MpI$Gs_kFdUxNg~(`#<gW�e% zVOpKtq3`n(=AHkzj6HnWy!#<d**A9vC*`LW|J-@<OSxFznHsC2yw@*pZ4LhQvb{O{ z&yK3!bq(IKT9eHF@K1g7cY99a;jcb+)zyF4=bwN3=lIiVgQ)*{&%f)(ybj;JqdUC5 zR4f1XxBq4SMeo(m>kIC0xPCYGnpNu7N0Vx6Ce&CS?rmu3t=MC`khhX~R<Lf-zuV?N z)dehKZiYO&vGLf-=9{liO%ONLyC1%DZ~lkOuf~DvFUU*(om+QhefwJdRgJHN_jZ5t z{#DnecR{7U|J?mQzWV96GJnoIu3j3h^Ih=b<z)7l)62i=nAsJ*`1-xExPQ;;I0O45 z&$QAL7n-dvUjN*5+1LHSny>k9K6Agi{=rPMK+XlGrh2jOlUWtkyEJB>S@&hW!@Vbm ze{~qR?TY#<=jvs)&->7PiOF9S#P3aD+>^lf@!-<;ij&N8%Zsxo?B9DXdfEovX<vUb z)_!I%KgW3AA?4Ptu+<f9SMz@VRMnc=|HWPZjFo8e)cX(PtN(M!zP<2#x%W()EzcL^ zJra3sz42I>*0w8wwH|eog)dsjmEX@^xtQ_OMW#zh%btioNjP+)n@_LfWO<^=p**ff zq5>Qa8<i4w?Jlr2oV-bY+V0i2xsPZm2sEBLy6MZz#seRvXVz?=XTkJ|!TiaTqRk26 z0xOTP-{#-Ag(LCD?czBSf{fXQp%*78Gu`QCy(!6cvgH?RAy)^BLc~Oa-7`*oSfgkd z<Fts8L(Et>UQ)?iv_(z3BgA2byT^pE9IiJZ5(%{%ehMgM``7P0_x_bvrhr9^$dQnS z9SUcXmo=(*DT+yG@%b-Y$jf{DZ5~T?h5o9O_LCne=kM&lsC_v!`|bM-tzC0}S?*w3 zzWJE;B&|oY(vI<*3yqs7m6dS6Gc@w1_{sZz2SP<$P0sd6POr{(U43fToWz>B-yc?J zaVdcmpN_s1eZq&w&TMAT^9i$<1CnQiuX5O8m7+9nr}na4U;TX~`Oi+ABz`)crGbx` zp@NUsAZcZ1%dsCR@w#u+7z*YvA8I%`-B3UC_s7m+^=Z?eFMZEZ+-oJ$dwm-JS=;vP z=+LljoJ$-T3xa(@*DAyacpPQ&nBt^k5t4j(wzB4H{wo_<4pn_(TX4*2$MgQBmlfGL zu6xJFRVBX2{rAQ6U(N0BUsLYh;;?)2kH4+<|Aoi3e}6SDdw<pKsONKT@xxwOvn7nR zB&V7k>3-GrMuPE%1^b4E%%G}-^Ckb>p2h3FYG=q&V7@uQDD{jw^Ty_#CR?t~o4!XW zbGJZ{cxdO=+h58fuYQ+lO?V|zf9<-iLx1@0-4T{Kky|#F+PP}*u&!PyES_^hf`>hr z<4N?ygyTQvyxtzt@lRV#_?9R*fh4)yOIrT*j_9A`e|L(X&d;rS@DUvGk6x{xkt)r3 z$jKTO+m5a5cY`ii_=Ht*Jrb3OZew_7@Z{UNX#4n64i6TtZm(wXxO+RzF=Iwc5$i!8 zS2yk^P6>+;L5|HQ!Y-|uaoVZs@brw9Gg8fxTyu2!W^y>V?TY#ne3{2tFy||~wovjh z)7oFVj(kjB!T$Qe7C|NPt-Oa9D=<vuQB+OtHaY*qcxKD1y5vgnGjF||xIzRjZFpK` zp(`BnNhaZ)udeOFU~%6)H_D|Ob|wGKH0oaAIpfe>(>W=VH?f|R`ow(YQDV%LJ_S`5 zj)-y<w#@k_Ryw`o`qR_5FY0#(LwO3rcOPDJ|CusecjI?o-NTsAF#F&XD}ILP=N!tN z_t(u-+`72&?VqKr{QL|SzR7BHTQB8`->7h`3K9rf&^EPonKa|h3A)wX-^+9u!WjGv zvX6;JoMYc{{oVH+2ecJbC!CU%NqF)4lY~O+b#ZB<fUo762bgy8<+UumP<}yr-n14g z&8eTI-H!y^nsM>w?@Kc8oqDyaee>?j-s<=@lke}(XNS5)c|pm(Z*|q|ne{#s=6+lM zfuq&r$jy~gE9>5=KH&PmStE7-Yr%6{UZ>xt_uA(ur##A6pY>}-L@BT4DxLiG_df4q zENPf)8Kkz{!@HzG)<Hag^9q}@UsF+KW>Z8`5yO(aHD-ou)w6dxJb(4=*+eXv*YHv1 z#3^6fUqv*uT##y(IkY#3b>U@2;mbc;w*FeajHhE(N=lFS2M>k^2J8(FF0*O%{H|YS zepu;eexd<$%L6$PHlLlH)$zfS48NhdYgT=Xum7j|_w$sB44fC9WeyCESh>7<-~ZJz zIx#{@TiArI9?a}nJi%ZFAD`gO){SEFXU@&-?phPuy;{w9;@|Qln?qGhJ6c_s1S~^x z(m!gRVl$iS!}Uni;(FnZd0g%cm9@$HPjBB}-Ee#Bo?gvU2YXY38V*ElT$c1sl9{pL zSdrxd@1HJ8hkq8&EiY2(|9mZHcQEIT38rjDq6Sg2Mgj%BCEMOqcFn(DuAFB7@nmPc zWP_Y>Lrn(Tw3@>jH^Nm;ygB{!WXc2HDGW7}*!-7Wjh;F$;*ia(=mLMAc~Yw@oVU;8 z=Wo)`y>s*GWK9bnS9Nign8wL7o<}+6xVFjujxuk5-?!tl>h1V*^B-UND3j+b_GrF+ zxcoQizcY0H{+hCW+tys~SHGpV>3xg(vypkHuBzRi7u?xeA@{b&{crzw#p74))dxTR zEmz~3^KHt^AlciSKDJ#~)3XznsyY7hs7%F-&2K)QJ2P{w$~-=;6TVE_5@Rb_D>;nq zu3S>HUstkPVR?0V)Ya~X8tzK_FWfL)9_P&;;J@+x$Ntyf1D{^A-#0hebg|9n8ya5O zpmIrQ=_2tnk~iY+I)ICR6(0*7^;>GzE0um0g~Z+UQ4C~g;R|10yU?&8@~Y^O4?Ek` z4^4EC`H^jXcFXn0X}S^FR=>8b$$7DIx6hu2odOOqA}80+uF_<B(B!5e<g!RG@z7#^ z%S$EFi6MWUiXVS#ZyWjSP{*>F8=H;ZD_8MOYwk|?DZSV3cEu_#oe(o^ZFX(1*}^x1 zU*(*f;b+MlkgOO}yxr*Kgyxp)W$KGRNvrJcerh<arTgjn1qtj959FE{my1tKf6e*A z$=v8?exVHGBL~*~J$vH6&eZs5)!HL_Qgu;l`qKC745l}qKYQl$`t_CbelNcsdP=!- z<*esy4`M}*ge2@xnAqIvD9|m~KWFuxcwx!B^ASaF1!gt}Br68DF1)PB0V?aOsuGS| zyshlF_H0zrMNO#~`I|NmQ+||O4wrS!k1Q18l?~rgEM&j`=)t9nn35JePvLRBXP|%2 zf_YB^f1N|-ep`d|J=ffx$LqfR!eArBP{YPEvsmc6+;m%;{ZBSs^k?MtXP<SyN0a$o zol^NCme3zt5`)j(_4(7(q-l}Bm89p8z+o)&=7Q><MS_WYcAnc^B>_&-E@}-|B%X=h zngA+o4cvA`SH~qS|9bdhn9A!Xn{6dieNwLc-u<>)YW30^n(J~BP94136nY{)#O+Q4 z-^~Ww&CS014eo9eUOid%>cpCzS~D0|74WTMR=@mM?fQk@>nksd`RlIo_i4SQyVmh{ zt4!?$=i7U?N^O`~(7D9nVL`B95YvNZ!{!Sroi0j;lb`FX<~Ri||G~w_b`@^tWllVT z>!$5Jue6lAJ>dV^C;55)t}~rPc2!<_zP~r*(i@ShW(KJVFJEe<=&zDKtH69Ffq%w> z%d=19MRQ)B+57WJyzaYV2Ak&$KQBny^@;3?o0P-y<M?E6@8U}ztrCwNetdQxN093K zqO2*O6dE%P1JPPc<?z<c-59GR<}2MCo(J=n&-P)_T%~qq<<2GXA?7m<@EabmOJVk_ zRGp|?tUv9$<pH@8hVqmtMFke&0&BkPeaN{<?4#ED@P`LhdAt_(Xgu^_nbH#0gKWv- z8Q`Sdw3y#9{>qCVHY<eoHvJBI{parHv#o-@#>s49VrzxgpI_ct*5S*z!tjjtMFmi) zlh9ijuqEf)`RQxIXQe#&e)zUdQpoJ@rK=2HNd<@a2Q4#L8!+=|RcnC4(i9I}!6y+W zhbou!p4%6FB7XChiXR<b0+w;T&!+5cFI#J~|H<3M&$(u-WKR5e?V1!<-qWmufj&uT z<(q7d@QJh99QELC66(o0zky}3PvjHr%&;@5wu!%{DGSVE+P)&m<j`(J@&0Z3GM;cB z!7Mhf<ld~3eP6eB-kvPj;*t8*x$GRn+Xc+46--v!8l->U{pQ%~Z)H~*dYB}PmY$up zzvR>Z$)~*z28$}!zn;d|nt07uII!REGWVR{oK?3c7_b_OOBk>SS=xn{^19ATOwx~a zn45J%J47upZeehTmOx|5%(Kt5>SL`YEw+5c7JPm~u-)t5GYS?zH9dE>)YPRTKEySX zLFyR8YZ<Aq&pcm}td`B!UVrm*4AVNMaGv$P^An93OAT8pO}5?Pnz5^NdGq639V^|C zqh>Z8=GyKdKc1Z0uvjGYNz8dKsh-s3K^1>mb32O)H|<XfoxpX1GhNH7dGd*sP9Lw> zIUG!M>RG?CH{{;BjW#nKFW+-uy1<&jvV}LdlIK~nRq-i?qK23S>KY2iK+3>XYTm@l zyu0P}SMzKv_)@8wR?OW0M$&kJY|JOoP4{(TT$f35uG+oq=)o5umrseUjbX5C&`S`W zA@!N{>f^IEKihR;Y%>?IKNt3x@M-<?_=ny7;x4KjCTsQPsOGJ|dHVum3Bz2*DOOS? zFVxkiO>bJV*HXN_{Nk}+$7HMIPHiwbU%8-zJ4j2C$w2p+PENV4vVh>E*J?ISNjq9y zI9n`qJZ9vrleM3idCb%1?NTw>BSEuPr0%MpG4ZDORo>ESb{nTfj2v!i{r*0Z|9Mx< zxLbGbdV_j{`(dq^o2$R~$evufgfUoDsdB^Ht^LKDa-&yoSfh39$R&k>9hx0084Da| z99IRmiw#1OoY#j<em3oe+HLEt-6ly3mb_RzD|5DlvEH}$`uuy>9OyOAHNP3aa@0}l z=-&Tz4?J!>J-F@yhlx=C`pa7v32ENj`bSA+i_p(Eg)Txdzo!3o2z=qad(X8Qo=49g zVCr`YPtWU(R#d+E;c?QntSC<3yTxl%HWsd5cVw}d7H5>&+tM&53;r!xFG8|K9bLQH zj`5t{yY}7Qeb*A)X5H#|b%)U~pm?te%cC71YI2R1o>w$sTX5W9?MkK#FDG<WJz1ys zeRanDPx`0VS@F0ZzJL0>-K3pPns56~OHahih<P(vm-~D<IA7!oC?nq0{#Mp6>m<~| z7rwZwYWlX)(#)s-)pKPhtn6O#IAhnppyQ8TmIg+~>%?6UPE+{PSP(22*z};ujZc)t zN#~R3mep!TP2fTjwUPYcypN>pOIyQ<8}(Zr@MthRnjq!cwb*{=r)TC?Kl5E0*en?= z&PW<PTeP|YWZ$$|j6rb=+7I2op4|QZ#!s!cCdK_nYb;FD9&BqoIIoHExJaY=k%ZEt zPqb5yX{{8yto_ns*7|>YvQ2G+)*W1I*CO`et;e366TJc~GRC#GGlZpB%Q#gSgqGU& z-dl9gWUb$f>pK2wC8@{fZ>UaTJ?Yt47^}sR84;CmiF-}>{K*Gfi-Hnj;=G#VcnwY+ zU3lGZx>0533Q^UUJEA_k|M=pX?LVuoXI%{o>$iOs^lWAb7A!o>;HW$$wS2B{PF-S> zexkd^zr9JVoE==E0+Y721vMsuyC=uwEG5qe7|pwVWxj7JPjt7|tQSI;*+piqlu=-R zWFR|h#mkQqJY?Sc-I#St`}&6|Y6==5P63T+GoO4G+iWO*e#M(`4IhVq6)jWuE^2<a zGBc{$Z^ov|+@)^+oZlaQ_+efB+dpoel?y(-I$U{nmgB40TKkX9>eIVi#TK<~OT$yM z87aXlj}`^RKa5fJE#!1!*S?~=xA^JxAD1T?Td&<+zVoTvw&P0=*i3g%tk3Z~z`B7c zWI|MkfzOrr&CeFFZeq%r;Tz1D`Sh5-?zR;l-`>gnu%vLGoNSNHo(*@j(<X!#wZ+%W z?9sgvV&r9@7ZPDTZ(57C=ZwOIW$#OZug70o_3GX<K{bb)q77UJL<@xWg;aU%{B+Mm zt7pQ#sNdahnjW>fsB(y9sY$O%58fXBQRBOV?gilzqrG}2TC?{j?3%jQF3NWyOM!Li z*S0hBX3VeiS@Lq;&&Fdv5Bb;YJhl#dFd_Csn$F&B*Q4cF(;4P1a{aqnMnRl|^AK-E zYSo+^{kOpz7$X>Uyv`bb>{--%w5a6>D_4hS)QRa^7`~^UFxbhx(0z9K`_Fmtr};OT zwteif+5i5Olya$n*vs`HDN_<+R&0pX*pl)()9P5upMM)>Ec&=v$t2lUu0F!J-QMWp zOa{B%_JX~C3*!FmVEVU%?cV{D`s5Q0YP*lu@89_JnWe|w%D$)3o-Y~FzX_a4lJzt; zvfub-^@>Dm<BKaEIn3Q8%u}s@TdC}X_rBw4+fK-C5qjS!?eixg<e2uQ2~GcQuuW}U zlrFs{BJSlwrk%gma9r~YaP~SpwcBdj<S8$U)u*-DY`s^pHS~h%kJdML0{>s`XUh8N zuJz{M1B?0smHT(t{og6XzUx`md8GGR_U_%w&vaaP;B4)0Utb}<RFPGSBmX_K`}ZfO zXRLewe*MF<?;D~Ys56*8I1^p_)9uktrzED3hXPZSwPNBPa=iIxyIf3i&HTcmn8TM= z?)#b@-P#`TnrBW{X_S2Y({J-PWF|B*F1}~}dU1n|IoIKRbG;l>ZL+c%p7;3#)g-;| zF*oA6@i_hf?<U4bMxCcR+bWH_pZ{cpbwL+@YYMgD`m#h}sUz>d0Apr0In#~pzvZPI zHs7;8rC}Dd{nyQdN4K!de8TQ-U}yF3P38gZ2Gs-E#aA=`+UnM?Q#MMfD>eKieCN!c z4d)FQ&oCA<%z1EqzR{tY=M0tyv=^vePSRfaj7Q{LLz9LQmo@u+`&U;S|3vMYenHoY z@$7>sd-&cnpFXG_p7lephHsxxmRmcM<gMkul11NtY0wOC_BwRYxcm99M!0K#FhN|q zzk#`)L$bE%^ZSTH|J$cNos*fmTjgE!<x>W4LmZ-4tVo%>ZOP2oXQ^UIcfS0$dEoww zwJA)c*kSvp9kU#(H_Ii?d%&}DnT6caZ%f7dX9_M^%&);*`*T{)3C6z<%J-;N&iFd( zd*`i%+GkX<K-77aC7ibo>ZoLM-a4p#rcrVB{Pk+KmEzNPg{XJ1a&>qK=v=lt@GfP# z+&3Pf-|U=kdrtOkTP+vyuJFo~uR@YF2d$vvFj6_EH5M1fEHq@)%H{A9P}Tadpz-d! z8wcJf-p+5I-h6ni&K6PG1Co+n>T7dWuZai@IH_@9XJEoE->b*`)?E{`{q(iKYUgJq zljJ+w*K6LMIjQGvlG|hRG}Az(fA@P2aF?*$ojR*?(|s3<K+u3yl>>Xl0lAL{mwnmP z`M3sJiY;UcTFbHA(b8tigQLuOd%m|h)ol22Uf}CtwV=A}cC9bYQ$=|u^>ELLi4gbF zm9)C$yYXRLgthHuZ|>h=6$kVTgnOhuKDzT|EBEG^<?3lSzOTw@yyic1;$H@5v#;@L zX^Vq<s;};8Dp&B{k>kR7ttqkZY<8p*$Jqr;7g$d*6*b4j9NoQK<4(A$b`le)@DY|` zu-<HOkR|uuLyx)q0_OkYH8#B}+I!%hUC_Rb)mpEn9PfUtvY6?qYtu{D#oCvc%a>kO zHat}~GquX^xLZ5(W?jh{-{XGG{OR*<vHsehuLO2A_%K{&h>deRba19Vf9S1O$@k+Q z2ybXvHSu4N!3@7MU$QJFsF$`JmOK4DV(vAe9};h_y=LCc6we@dgT0LBz{DHpFV6qR zz<z+~2g7`Z?AtT8IedZ_T#-!KY>Mee5<h(Ya!0^ae@64+ZoA`$?|#2>N?Ku82Y0C` z&!n=OleLfN1g7bp_jZz2KT~_})6w$MVBfjfvyyL#o)Q)i(NffK*zEJWGJmOx#);EU z*KaFe&t;H}WLz4VDw0?F>E5aamP-t2so&3^wTe0UbZK(n+m(e!L>iMnt*z{`P)%9H zbl25cW$q5wQ{6`Q9hm|r{q3-D&}LBWj9f7zR%1(Q*7h6B<tvXXYsqfvJ|-FVPss4% zp9f`Wi^C6aY+{e(Y~f@ooiP1v^0n>>eor{-E_*r5J<&Kld2`eS*{sM$r3<ndsux&_ z8t*LBYfzrT_f)b`>4t1h8cTOV>4xb)8rhlqg#HUCyt!Mns*|-SXs0rhSnOejaz0)? zWut_uV*QU=KYI>D-#O0kbE0M~xQv|hFeq+|LSLE3@1q~}uFsCBoblJBX}4O?L9X3X z%VJVRAt|kdd#PB@ynDUdY}eKDTraN@oGG|i?vd>St8b}`jZ~F2tT$IM>|=~))NhXd znZM%Ka=D419OSe}sD<0){1u}vb7;t_<_H;;UlcpQ_vXXJKZ>!-4)5Gk`%ixTk8Mik ztx8Mef=;DxXr7~}d0j2C?)rM&^xCTPGq#IwTdI8N<yXUuZ~B||?QIY<S5sC``)W5M zSZIG+^u6_`j6_d*ZvoZ*3z^Qk9M+g8pbcvvX!_pY5bOQpG>f2{Y3#?c9Yy<(toW_1 zAXyfEYOmzJMGGedHWn>9STcLFxbvUedrNz{k~c(XOaSFVuO_J$Zc}0ItCET}Tc5Im zJz^@%v#3J!6*PrRS@!-2-<xA*`*xh%viCrz-@NWs+kLNQ{tx+SZk04cOWZ2piC)Q~ zN3(ZKxfCvyw_~-(AIlr<7iQEmothGVXy=XpZ$71jw_8<R^hj?1H^pS%@y`#hE;7%H zdb^0vq5j{gvj4g7KH9rp4ocl&n*aVq*5{Mkx5#{pzI7>^H}~|evVX6{5BXNqcUdW= zBz@bddvS?sVEFFSw&foxmgg()u8PR4<V(JLXU4~*x949p--*hS`2Dr!R$iIu#^x7w zyYk|Kzxo%7>{l?%)@&DBfA(cv-|=LPv#P)UTW+lCnzyyG_Cn^lhi8~Shiw;oUOdb6 z%a<M7zOBx>e)ZPPpV#F(%*rFmPs;9_$@KMt_MfZow7%{ZGo1c1C#$|b{<STq{mPvp z-zH7BpVhu#nY!}CtZ$b;DK3|Cc%oNXzHrJjk5m8Va|hM_xBqoo^G`?N!yo@0>VNK# z?*ChNekc2n42RDfk9@!XtN#Cgt*>=OHnwbf?*D&Gz9-86;@+m}9~!A*>ub&1`)5_u ziFf%$UH!LRYC(8#)%;)CKN|0U{l{DX{)7L+kb~C@+%9!4Y`ypOVf~xPe}7vJuW9Vi z{TR};AnVfS$tR`+{V|rgE2a1%&0&kooI>*wm$ftIsa#TszVP<eDkhOl(goW-6unMl zKOZfZ)WY(v?7!HI8&wQGE{_wRKQ2E0W$tZ$No%3J-29w9Qk#n{GxllLNmiF7SJ?8L z5dCGYvPJxy=cFP5z4E4t7N=>>dFp9}*UXP`q$NdPuu&?v{#cW<=ZBh7VdsW-8n+q` zI4`QYzQ|NvcUET9f9X?GbpF(bDFqqy)C7Lo<ni`<<gxZ8JW>+hc4|*p7u{jY=|79r zSNF|aV;O_+x69TC*a|9q(wLmWU0!o)eeh+@ynn)PnbS`AIc%_2F?MKG{mAXLC+3Z^ zVAXm<*|!&WZajF~uKLlh+x>^W_-}bqxaV^2ajvUdU2+mys_QHi{X5TI|J_)o5&iY; z*6(ro57TBYxMfjre{)gi{jRuFC84e`1%v5pe9NCMzPP~U(!QCDMFAf9do*g<9>r}J z=;eJD{5L-{djIupe<DxKUcNPEU#;08pMP1ix1L)2S*w1j_g}R+Pkpy7ZFbmwEb-V8 zZO8VAncsH$|Gk&qd|5{E*H4McmN^PWT4k|6<7RKS%l^W3)$Y?f_GM2OFJFCblf>my z7Rk3+?Mhy;FJH3!{#CojZ$rN1UlE>>Ci7lset>=OyZbkutYQ*bYjLYA{eFDun>@br z7n;;}FHiopy6bSC$)m2T5@l)&-f4*!7R?LOzbd%nh)wyf#sBLj9D00y-|DHkI!Twc z`{GRxt#}ypX`{m5#ZOWUZ)?^$Bz3(yoA)Z6kAKby@uVha@6#Kbiu5lRKGpLU+hg;f zu4Z?{#+ap3S&dacT%ORbdq|+>>%(UPB1@jK>V@C1D;B;oLHWIv+Tz;db^A|e+sJG7 zR@yoXnO_jHY1F%Sb$auqTWn<w?tRR+xC75NU-+HJTJa#nEqq>Q-;r#`BzDGdjfl*& z!*zM~i<f_@F`wFe+~c65QD*o_g@mrIJ29_5E(<N3r}^1o<(`Pc*{@HzWYinX4nI5Z zQTgrLb5>qu%>24LLo|uc^2QtakDMFszE+&VyX|98zxtjxdo88km|glDx&3I^+~xlJ z?mzt<we3ugM9zkS>K!H@w2y~`UO#(i@neIFw>85W4vMlp{Qf2L+(Vb1Jx6vfKlwt` zeB$J5Cnp=8k<h+&XLjp5n`gf5T(8@1i5jOb6MCzvywfq}W}wKL1x}NG<UWnBsXW$p zdQ04jg%7U0xprs1?VpOLxlZ4of7zJ3Qd&Y$?oQ~hidl6QQMoVf)IYVY&i`hyeMyE% zrr|@DLsOH!_xJ5}_+soo?b!O+XHGpixpmKx+xu*61k<%jEuw1ko2x=@$8HzY3|V!d zBWOeJkA(B4?o-pN;vO(sd?^)ueEm#z(Cqq;vu1wP-KMm#`_Q51(dB!WE0zA3lcjOL z_GLinL$|%bY_0l|<u?r@)260<2;3RD?V4`rIWfg4KMk%Y9n@7eekOKfqxf-u%iu+< zE5l?St!X*pB<XOgOf)Na-jb&12Y>ePc-)#>TN`egc{?$8!EU9R>Ri$O4gb4eu{OWe zoLtoUWWFKGUf1(C&P=;GWwk>>SJ!Tvs?Fb4F042Cd2>O?8CkZPuIC>eJ0o%q<jOqt zoxEewx6q|NH($1|s?EE$HGKJnhQ+hO0u(*#U5yj$9$)#%^HqM8Mo!V2ocQ^+`);zP z+U}LUu<Z^1ffc7-ok-hv>*%(YoP?gLGO_*o>*JSIc2B;$X4Qn3pEgU*n`YK!XTo5e zsx2Vl{Y>rk!Noh|+EQ3mnbys`znp0n@1ebUno_gREa&d_HZ#x7dahM3qx~a4<D$Xj z{8`IuD;Jzzz2Uv@$1nRXG`~JvVj_`w`}VVy2P+qxT^+QJYtpYQtI`*>lXv~LTiVsZ z)5x^euWz>HiTPVrX1@8X*t^S(r;V$&+ubtavDd8m>wk8K*Ghl?RBTpN@zsh~W6j+k z4=2qDDDw)tpm?*!ROEtxTu(yj59fA<yytm)!)m_&wyRmZU;b_OoCY@@!83o`7Zq9@ zW$twpDX{xJV?x#yFWb#KHU^)r`~Ng4LtyvX>TL>#MQ>f(7QN6y{7A#{kGc8B;-+7S z<=9j&x!EXw?X|5pgVq%-Yhf*uO7Cl`+I)ZcwXF-U&e?LkN2_1|z{zD_65ICH&5oX) zCS7@Ij)L~zt$oS@TU2-&nWLvqS~jmp{Vq?b{Tr*Q7i@BhTX#mkcz!PAXaDj$t2(c( ze7*jvz1NiQrprHm^;yvsb|GL^yuhv>MSoRFcW$ZeGnMFEz4`cArz_v|H`qN9+{>Kn z%(b<VX-1EPVor6Tt;-T)=5^-cwP$q<-S6ErjlVeeaO%VT-barsf9s!M#h$<GY~88G z7A>o)a?z{#)@&8a&x-R|85Z+{Gkj|7<;z!Bd@EWWdB?7A_j&253D4Kg5AM>LviGmQ z|4OT)+g-IaG_>_Qo*nr=P2<VdMZF6i$uBtK_dLn%$<O!t&n8=c-1htAKl6vJ&!?^3 zt(?q~dGPwe&J$8yj1MDchW0Jnoj>`OObYL=rH?Ni)ZTSgN9NHl`96U!s&*L~W`}ZD ziuTM8yZ5YE?O<!(?}?$WLT8s%tjTI<)n>b6=q5J1hVxzd#^{na8=aXp9}!!-LTTfM z6%W5Vw^x6BpSk>aN1=+Tht;ZpknB@^qTa`Nb*5eU9?iL`O-}W$===Ov&zS`|83PNx z`ZbFew<`z#obo7CR(ev2>712+8k!HEaxK^pT*}VpWc;|NBrkk@y`}J<D<uzZO)d<c z#qOZYCiTtYyxViLqcKnYu1tATV_m?sR(-zz*FTZ#dXLS!e9q;k=aC6#4L*fmy6~^I z*NJQ6^=s~zgSIbzn|0|P*G;RBwxz#TJm&QI{zAH1OKIvB5w+=`dz~2yg-fb_3hrC} zVPRRI@8<HR=H{n0u_nAr-PSt`6^9g_Q0O!5{+5z(kiYF;(c}5kFD#hd<?uqpeKKp_ z^!AhNZ{<aN`EGh`VdGda<9tjlr$<ilSM47<Et$_UOtl`FyA>{v?PC45yHC&c=j-$< zuSybbA6|4g_oUasZBH&lid_70Jy_R$*^TOmnk7$J`BZ<r_Ri3K*`*bH!|V51ms=Z+ zFWAj_kb69=Ao{XtNKSHer2Dbghmw{?w!Z2)XV)1dRppzsttsc`gp@0JIgfp3o7DK+ z?-rUWenC6y`W42hv0s`qBbpbd?wG}NRb4});835CYdXgf&)#x(ujw7ZZ?0W=*HSda zUGl_j-78+-l4IYSI)&a{QhoEp?bydpcRW<dXq+_Tah=a&|Gz)uC;mzK7$|vc?hciy z52Ym1x*XG$%YHC%x*xsHzu<7eVgEUnC+_tLbk@tLbO&gw?W<jNyl&osm=?=ADV?c{ zd+l!R4QmOSJY$XPue$x0v&-MSVQo+9Gf&K2p`52K8~J5rr<S5%`PC0!HiRvEBx1Ac z@2|{ona1W$_q}Z4|C!{!^?U?1ke=;Uwx7K0a2waR7ti-f$@Zsfl{iGkIHqYG_V+D% zD=?=qq0A$#k;nVzj;lKo&(0{Dwz=Q_U-LA%hxaF^vu9s^zW;u<zt!j7Ex#vN-TrXq zN`{zq<VOhuH(Pt*fA;I+7eAhTw({lOMea}Y<fhEMyTpFQo_8OtQ?<@XC@o7i;a@Pz z+5hu-HnF#HO8bo+Bf|xEex7I+_<iCu)lXmT4?PWft9|xw?2dz$WnN(c0a@|qS1*3H z?T$$9&JSOslG3}m`~m`P^^Z?>(RF3&50#r5xL#~;^E~AgmfByI!Y@z0-~MS!U$o)> zyJ}9iciB&^?VrVOv5N2i?lT)hi*G;mGLaC!z0py0@l})muhhBtxhJjL9%ZCIv*J|l zUf~7o3qI`7_*Z1=z}&kc<6ctOBKartlQ->uzdSKT-{$g#19$4=PiIFkAC3Jp<(P1A z{<bTcdv7TC2iR<Gh?{Xe<0rSK#-HAQ@*;Nft7ZQ#VQIV5@I3$O?v1a~nNOY0W!UxI zLNLr>%bL5BH(oq)v@H8c-c~Ustyy!gblmH*NUjYO+TGrIb$_({nOwhj!rtY6n)@WB z`(G!BK7F`e@$xCLn7%*%+f1I?UHLxay`_HBEna!QBcA`QrhMI-!?b66+VS0**;3Dg zPrZJ5!AZbs-4vcb0$#2QHr#*tD`q3R&PFq>mHWhh`cGN6^z$mV?Aeq5i7(d3KVK}9 zt}J}*5HH(}fD6%|Lu6u)tlL)e#8=`)hWDGsJIC4=G)bMmKgXva=du4U`+2MFZmZ4V zYd92_s=3T!r&{51aURhx@*hs05O^nJB!1Iq(uBwpcmJErxK)26C+nF(ioxaQW<}<U zXDI%<{I+msnoqR<qxwDVntoHh?WmM^f9Cv0!QUTmT=Dg-@4eBq`@^HB$D^1mKW@Jj zy5DMTeD{JMIn_rmf0ir!FaBrCu^YS9{OkJ;#4h-}Z^8S!pEszoXzx66<n%(O?>o)X zv|dbXte>~;nt<|R(M7M#6iT#xclT;Dd(2pMG^yMnqSn~*$5H10qG$ij>#E>!TK0X` zj%}tIdu9lz$9?wm>j>XGvE%#3>x*ykn74m_a{Bw9_0LtGuYSlZ?rG%Kaa8y6oaytb zoY?0H?Q&NMD|xQ^+-^bh>)Y)-W_qR4BHzP`%=1?$R6bN^U(m5bDdC*kmjsTwyZaK$ z+hrRiriWdsd6WK9L;mld(uFJ3-e!7L|9^f{;#Y~h!2OEdqSyG>+2!ON<<Vce{$HX+ zbe{O)kN?l<%wJdUVp=oDa+dn{!+ZYqY&!p<eaSny-d#D<U&l{S5uVw8@zJAhZJ9$A ze`XtNe>wl#`BFKbf!S}h+4n9^^H+W;e~F`R<;`}#vzqDiFY$Z)n<`xz>G|0&^7)s; zm+Y4b{9I<$SN$tte|FoI2IF6iS*9h=_%41o(aF>N73y|2**@Ukf`~%n{lfeEFQ4vs zsek#Ue@N5aED7u1zy51yyykzUta^C)r!6yic<u!Md#QT=tLXg;nSs;eS=^O=-iSz! zRj~dd6@KxrdF=MaU%GGdpHJAdIbr>U%<RJ-PbB|-@jLX-p`Gi>_Z&>!E>rz>{_%<s z3DXyUc(T;PSR}1mOPeoUv$nU}GBZHoYW{{ZX&UQ$3z~CnY>v8LI(EOocfD?h^{hOO ztGu4y<tvXT#cZsP`ROeC=YQm;a+ZRVeMww$KGS6XZ9Z*!ts(WMGP|3}jfppMQu7z) zMezunzODFAcFI@x!s7{<$0tW$*m3#dIvM$Q(U+GO8D4pJdEL?b(rfK5)kM7!^}L*~ zc#SzQY~jqwwjryJ{I$F)&ZR9GD#I-*euR5XSWtOXX09XCy7+s!r)r!%Jws-FGUSbI z{`7a>)>O@nJKDc4R{y>4Z={j#>hGM5zm~>%Zd&NQa>KJ}*Lr5(QhXt5mzk8Z;XC&u zldsWwCA((xy?Ochxl-x13A*-N54U+~$K{-!9b@K@>UD4{ch>F~w+k<(Cq5`Wxi`!@ zS5#ed^CG`}zcLHMmnAixh^x(CTjF=?%WtF4ugh*_Ke^ue;$JA!fqw}ZrC0TD&Q9DF zc;lDd!*53H+iR_be@iq4?{`l&R8G(}`?Wpb58uUm>np0()bh<*^2|8zn*XXd?Y}lG z4&5qy<k8bkQ>H`n-jpBz6=RsR@srKQW$O|v%r>zF+FYM(abso7&2r}xi-Vt@*|@6L zc;b%TQ}Q{@j-Gh7;{5s7k=G@CTxH}fh1ZJtie8U2dH?R@j7`V2EX)d*OK+Jz=W%QI zlKbB0=ij(AL(+TSgYwN2cSj#&UcX7=>Ykdb(=3mkD>9#7qi`YrVBflR^S9pT`LC># zmu<TyCQ;SvPWCsiQ|I@m-74#^W-8Hmd}-qTz8g{V3Qdpv_CNGRcgMWAsQq;hxLG%< zn%zEm^TzBZiK{JpHrMU`b+Sy(%3k7SXV>(HGXih?GWE#G+m=|o;gj02B?(XF-v~IC z^g3egD%lO6zRK6$K5%JQ*csoAH+Egq=H2mm?g1_3%H^UA!N0=|m}ec^T<=={`$^qn zIeC*y;dlN|VVhFoFu{c33LgW5XFCG}Q{<|=9>|Joeg^c_;H9}a3>#d{iv$=ia`cMU z%)Ghx@2d9)pZZ;|og8tV?aj06*7t&3({?M1iq2NIHR@1eY2sn*cz<tq%$e9pOgH<R z?3j)RsJ;7Cep&4x&wlwgyZ4-t{W0}FXL$1rvDEu-Hk{eBJEgw<;c4&O3YF7d8}|RX zJ^kI?+qXPRA~vjg`7`V5@^^)~|K-2``QLx<@v<KmKc~!1-VpxCZ~OMt_owfEH2V;k zdh18~$!A?=clY<K46i%Bv)l9Uw%{pOw@jRR*{x-*J@eT;KXv)J&xD2D_LM&6b#=mr z^75sA_1jKAY@FVZ_;J@g8Ry!Wp)Wq?&UhPkc-`yd<wfm<S6=#gYIk0mz3Xb!Yd_x$ zdaVoe=N;xf7x{W)*}WU8x1;0tZV`OvXtE~d)ohNuuN&Uo4~)rHxEy)ob(!8ffnAoJ zUiQ)Te5>TlKi$3bIdqF;j_5R-48!Bo<4-HL$FJgTI(F&UPZK+zN2<N=w8TAPp1Ap# zSj*nLyw6u)#iXAR7d4|i=D2Fy|EYR^m*Yjp&}XYIb-D*F`L1_qh3Ea&C*Rw%iVNMY z3C-TWX1zVv9GAHQ%~LgMmp}82*yXg*aNEuBO^-8$e&uX@GV{~V8~2`8$L@8Jx2UU` z-+W<D)@rSHHpgzCsZjizs@~}Or#hf-{q)=`su5Oxf8ByM$$4)Jy2Rfw!~J-?DRcjf zTF$G5jn~?nuJ3&HThej%y$6TwFE3&-Ecv9%er;NpyQp9KW=l2&sgqf3P4@HsR_NWC zGyBra%O4&n$~i>TUXC|PxV(2w#r3%7`TI*0qLv8%a^dw7sj|vmdGVfu!P)k>pL6a{ zJd<d+|E7uZPbUS1w=JP2$+IQae_m85tm5*XIb>f6TS?`6G4`b|?gSO-`?m<K3g|hx z=2T38uI`<=HrKSW9!2RgP2+Ot%*)$Xc>HkSxhxeaoh5v=izi<T(lwFfJ7ZkGzb<d5 z|FP%!1=f2FuXr|{He~<AXg^D<SpJt`<IFhMdmIdr58muj**xX^+pkO0I?nSt-iSI; z@Y-<a%1Y5UEN3d;Ga7oW{wNqQJ;6Z2Ge2r)-i@-HzJl6|D~&I{``jBS&!71~x6F3R z)8ox+7rg#&9DMcDr%g+i>Fws7vEW+aw9LbG#(V92jZHpjw$JWalyJn~<e|md?Ul1< zeh^MnpAeeC6lWg0=9v9m@xsn}<!YaG3q{^}u-&aO+WY$Pw5IC@f!}XFKYr=U$!J^c z3;how?2Cj8ycM=>?y=v})DdW;zsyN`Rd2221DgQf`Gu(~mNZ>FIl;#zpiAWZH+$ZI zE0crTIrOIq=1jfb@~D>mKu-G?A>Zj1&dJV}N&jxlS+??2!KA4i-2Q7lGP~8@e>&gz z`R>%xtM7Lts6{SW^jYp($dcm$mox1OT$f#(c+O8H;@*tqt~;&r)MrF}b{90PELvA| zZQg~`mMno@w~I=mEPNu>U2k_Q`A^u<)_tbfZ=XlcS+gXm*1s<_`+rx<78x+>)=B%` zape@cmaMa|dS=+{-+PLR{^@>YW%=*<_<rgw{YBprjs!&1)T<}XaeMqCZEoSBHF`Pv ziEKG3PRcBmpDXH$JM3B}bFRM``a1c^Jg>X5%FXYU4(N8DPt{p0tQ^$1Uw>)ANud>; ze2%lGiXPwl@~g5#kK&C@fd!A|hWx$R?-(VKo2<B}pS{^R`B!Bu$L7>J9_e4pHTTS6 zycX9wW6pBH8LqEgoY(dG-UtqeHdigZEa3Ocqqy&x$oxr8x|T`PL*8-ay_q7>lex<< zvUky?1C|%_dt?F)&)Q5|{^;47z8|_<p6fa#iO!qy$X>A|=;xIO4YTasMCYhkoLt$+ zbj~jLsdUAL)t2U~-|#rso=SFFeenJLhjYwq{)$J=eI^;xp%tjT)3!D^t!h{D&g{(- zn|Q8um2Thk<j=%}cLtnZC#w%$Uc0q_-LvJ>{}*IP3pN<%zwZgR=@Juhow&h~?{H+z zgy$Qo{G;@$*_XcG+Q06hV7<qU9>&@AHAy?41Z-HO)7v6lTOH`e*7WN3{B8dk56ye9 z+sV`9y{~7&`n$8Q-1vC0CsNMwRmG1swMC10Or}d%I;6L%-2Acoi)FxU(?w0yYmQ3$ zPM)#L`s**>cL_;`WuJb8Kk=Cnnl?$}&bH)jc9W_vZ@+CZK_Hm><J?d0Rizb<2D)1G zKNO#}X_jq9K&vTh`K3ADK{t$Ehh#5W!Z<JL;|2zf#|0Y~Zphho?cv*9PCFb-+1NK+ zsdhGe(Rip<G;_;BsSV!I{}!G(tGJ>{q24!?Q+%IZx!3vr6YaD7R65jyYC0Y%Jbll$ zdE3UXca-#BqJ+qVXyrbA*Q$rgPxj4JI&|2geda2+FM{cgL0f*XUaWccW{$|K{cq~I z=Q5<<e;>)_^qIjh+it4un*&dhJfCJeOyyAuI3=c)fB&4o8Qq7se!mcXaeQ{`osJ&~ z(?sXjpLvu#srZ%{Pj}4sz{O8~Z)o2x75n*EkxkL3Yh^n-KjjJ?+HIJ3-Y0pBuXvwx zCnx*t9}_a-J`|R3?LWQmTaL@86B6qdrk;t@%h+j{!(^@)qM+gRs?jvyChMXpUnccB z9=<j&!q;T^!=m}q_4{=NYASs5^rp_37ZIVe#Bb5###H7*h8rGCN)25y-<F}~WGbul z<r_(dc@~OI)mwSlVxqKs_Qm)6Ew>BJ+sxs4N5rmW>77MJwHY@*1(#(sYp|uib>(QC zR$1<0E%|ZdTT_PRx-ott`L8wP#Pu)iY$?6{CvJPt-1D+!5;q_3a7sR9{Nr+b_wE%v zDLY+%ERK5Kp0;sGp!3P)byiV#_AFj??Q43<_0U*G4V{R)GlPpd+`oO4_&qtrTlwkv zpXZDB?PQZVw=^JX>TIPgKlUb`h;iC4aCFW+o}E_izxsmy1r{$ZXf6>=Yu44upL<d6 zgZotTKLsUo_GR5@(29Ta;^q46fS<RHKYdmD*ksOZ!K?1?-=7H&044SbaXwEt>>hN? zXnwhF#&3y+^y%*eH;VrI&slqVsfL4!`<G6wiRwaX@0m8a1|3K~<J0x*fl1KjNSA%{ zYVU3cGG4agKwBk?FuVEdE9~u`IV}>;7;N&;SND@jdFaIX|NOJdH3chQWp19ZZdrh5 z|C)vDpUOP+W3(snsl}W-{zdR2CreFsr`!CAPW+;NTRrz3$<E^W<r|aw|KqP9Pn9!^ zIB!O*^laxiYx=uQR(9@BQH78D{<Rq2dBd~t$??x2%_Z@(d9Q!TmS5F;C4n=D|F+Ef zV0C4_qX)|Q^Oo;j>|7=tmGw?cr#jkJ?&9Kw+!BRZ@-1$OQVrpg^bK{63tZIB(1_Ll zx7))y%i!akcQ3SrzU??(&MS0qy5gj4`CA%^H*(iY+DfSvJem=^^2}b9*!CHdlBQkR zEr024_s3Jc{XAU;|Ey#dwi(`8f4r4DZ+*~Kaqp7oDnmEMwvCPVp6=%G{B3txRPkA7 z^Ws0-9nMs1nPlk{8eW-p(Of{dKhY-Lb=jdETvhAuPpQx|c+TPWS3mg44R-c@1!p+- zX7A0J;I-lKyPfT)rcPFQTQ|*SlWt8w*oBg<pI_Z$WY{XjvD!s;dt$Qs;*M*ce?u%7 zF9la`v9Q{bxbaxF^9*a=;~Xo`^E&nw9%Pk|+gn>4diBAxmAYxkv)Ab@J}e`7dCs3N zSArwBSu(|wI5(V+t=NBf;@yG_{?i*8`<{w?nRZTFAc)_qXY23e`wzE2_VKY*`FDx4 z{jJT!8GTxBH(c7k>OAkJ<&W)tHQGq?><`x|Ea+cy?$7j}U$>g8o;~tO_VJA$5gO9< z7j)b`qFxzpIvwkq^Q~Q2jeq8&e~bJi=c-MvSGM^3D$HkNRG-jHiy4Jyq#X+`UoyE@ zVd|Eq_T_b{lb!Ms#hDfi1|IbdpA0S-InH@4>gKiJ;_IkuyuN>ojFK*#Rkrs!ry|zN zKYx>l@mueu3ug1YD4P+_TX)U(wuF3+V)fTA*W6mgPFN_|b?Pl#nAURBGOMmRzD9QO zr5oC>B7AFgBp3Ke7JN4BVqd*i^@*tNa(nTNzi-^TUf0e3wKd9CMJFgW`=(g`R?S({ zY@#mLb+zB@$t+v>|8e{|-39Vd|6h9VFfn^_f0_G1zK0)Q{WJ4?aqq-pr=!h0^L(l` znG?P)PW>shqgn0OgX?GY8D|A+MkOEAWHtL>Ge5yN%hg5PSKrT9XT?p$Lx%3&JqxAP zV=a2pKczfwS^Q9Y{+eUTVheUeOZF>iISKY2R_dFOn3H*iHHs(7$!U&toX3QT;{56} zWFMQ}I`Pma_f(Sat6$6!56whpUSz*h?K*E}$zO{v8#lGS2rEA`NrG$5tUx=#jErA% zf7-{ze94>RR$Bh{W-!mLhgL4z|D6`snHv^*sQy^sQ7ui=f8V#KZRlRaQ@F;-=upl= z?XCR$g3EOFY~tG&T&5be_uc0H5WO(pK&$ua&z3&8)cE!5r;>kn*n{sf2YtDxnRDBJ z-`tYF&aH{e8>_Xd`<2eUJ>2z!Evt1B)9%)pO_8jdCC$nsFX=hF`BnEnZME`S*@SI1 z+S7KLHC^faWWbT&DwivE`_Q79Wpj)crzEzSevjMt&f;M6;?-#;3b(ctI~Ij<2RAqI zh%+fjiX9D_A@E4X<)^8-<oxv1nX=1WUoL%J!l97c?bWmPWQs&_ou>4wW6AnzEE-Wg zhhH)+-tl|Fm-8oBbRREN$uJHKm0Y!@TU<Qnwv)$8Co$hy%bq>FUn7^feRjTc&^EVL z-$(rF3)%Y*_5FYJO}QaZ<L%QO8|SXC5m$V2=+msT2hEN4N$d?>VEBK3e)B<n$%{;d zN5krz;uG@gHU=Ijtl5~v@NL2Mi5>x48_pa%eRiHpN&lKHOK1HT$>}{*Vs<20Hz53L zf7^{7v7cIV67*Jtt@{2!u)O@e&H9G49gzx7emZA_PV~QLP?+^(`h4|@hdF;g*UY{u zam>N?kKpR()m&4$+}JA~zRBNMUF-5%eD`<OKZnxtUG}b8_GLHEW8N)w>sVLqi<DF9 z?U?5>eTDyz`M;06zNF4zB=kFb_X=jFd8Uf1=Ula%@~eM+__}o2ERmf*mlb~spLx=H z-OMk`FFc#8m83s!&H>x+%;)Z$SW$cJQ{CAd`{{?fO8FxHs;IX;eg5)p-1%0%u30B` z)nELSpfjUIn&YeRcK1zRih13>$g|H*+c8W2{6B|ag^~vov>-dA85kItK&<r*OT9!4 YSQ!Kupu3_OHmnowJ7QbS;K0rR040-Y5&!@I literal 0 HcmV?d00001 diff --git a/scenario/my_foodora.ini b/scenario/my_foodora.ini index e69de29..dd2dacb 100644 --- a/scenario/my_foodora.ini +++ b/scenario/my_foodora.ini @@ -0,0 +1,80 @@ +# initial login + +login ceo 123456789 + +############### +# Registering Users +############### + +registerManager 698697556 cto cto cto@mail.fr 987654321 0.0,0.0 22/03/1985 + +registerRestaurant 350697523 AuBonResto resto1 mail@mail.fr resto1pwd 0.02,0.03 +registerRestaurant 350697523 LaBonneBouffe resto2 mail@mail.fr resto2pwd -0.50,0.25 +registerRestaurant 350697523 AuCarreIrlandais resto3 mail@mail.fr resto3pwd 0.02,-0.3 +registerRestaurant 350697523 CafeDeLaPaix resto4 mail@mail.fr resto4pwd 23.2,-0.03 +registerRestaurant 350697523 Lolivier resto5 mail@mail.fr resto5pwd 0.02,0.36 + +registerCourier 649878446 Marc cour_marc marc@mail.fr marc_pwd 0.9,-9.0 22/03/1975 +registerCourier 498784515 Henri cour_henri henri@mail.fr henri_pwd -0.9,-9.0 12/09/1989 +registerCourier 498484516 Luc cour_luc henri@mail.fr luc_pwd 0.9,19.0 27/12/1995 + +registerCustomer 943684597 Louise custo_louise louise@mail.fr louise_pwd 5.3,9.1 23/02/1994 +registerCustomer 465131879 Jean custo_jean jean@mail.fr jean_pwd 3.3,-9.1 18/11/1985 +registerCustomer 648451648 Patrick custo_patrick patrick@mail.fr patrick_pwd 4.3,-3.1 12/02/1998 +registerCustomer 198745487 Mathieu custo_mathieu mathieu@mail.fr mathieu_pwd -8.3,-0.1 28/13/1958 +registerCustomer 877887446 Etienne custo_etienne etienne@mail.fr etienne_pwd -6.3,-6.1 21/12/1980 +registerCustomer 489446548 Jeanne custo_jeanne jeanne@mail.fr jeanne_pwd 7.3,-3.1 03/08/1989 +registerCustomer 489546844 Marie custo_marie marie@mail.fr marie_pwd 12.3,1.9 21/01/1997 + +############### +# Switching to restaurant +############### + +logout + +login resto1 resto1pwd + +############### +# Adding Dishes +############### + +addDishRestaurantMenu steackFrites MainDish normal 14.50 +addDishRestaurantMenu salad Starter vegetarian 5.80 +addDishRestaurantMenu cookie Dessert normal 3.00 +addDishRestaurantMenu mushroomPie MainDish vegetarian 12.50 +addDishRestaurantMenu tartare Starter glutenFree 8.50 +addDishRestaurantMenu brownie Dessert normal 14.50 +addDishRestaurantMenu fruits Dessert vegetarian 4.50 + +############### +# Creating Menus +############### + +createMeal menuEnfant FullMeal +createMeal menuBoucher FullMeal +createMeal menuVegetarien FullMeal +createMeal menuDuMidi FullMeal +createMeal menuLeger HalfMeal + +############### +# Adding Menus to Meals +############### + +addDishToMeal steackFrites menuEnfant +addDishToMeal salad menuEnfant +addDishToMeal cookie menuEnfant + +addDishToMeal tartare menuBoucher +addDishToMeal steackFrites menuBoucher +addDishToMeal brownie menuBoucher + +addDishToMeal salad menuVegetarien +addDishToMeal mushroomPie menuVegetarien +addDishToMeal fruits menuVegetarien + +addDishToMeal salad menuDuMidi +addDishToMeal steackFrites menuDuMidi +addDishToMeal cookie menuDuMidi + +addDishToMeal salad menuLeger +addDishToMeal mushroomPie menuLeger \ No newline at end of file diff --git a/scenario/testScenario1.txt b/scenario/testScenario1.txt index e69de29..45cd71f 100644 --- a/scenario/testScenario1.txt +++ b/scenario/testScenario1.txt @@ -0,0 +1,267 @@ +############### +# showing users +############### + +login ceo 123456789 + +showCustomer +showCourier +showRestaurantTop + +############### +# register a few more users +############### + +registerRestaurant 123756753 LaSalleHaute resto6 resto6@mail.fr resto6pwd 2.02,-1.03 +registerRestaurant 789321345 AuBistrot resto7 resto7@mail.fr resto7pwd -5.50,3.25 + +registerCourier 123786541 Lucie cour_lucie lucie@mail.fr lucie_pwd 1.5,-2.0 23/03/1998 +# registerCourier 789534123 Alexandre cour_alexandre alexandre@mail.fr alexandre_pwd -0.8,2.1 14/05/1982 +registerCourier 789534123 Pascal cour_pascal pascal@mail.fr pascal_pwd -0.8,2.1 14/05/1978 + +registerCustomer 943684597 Jacques custo_jacques jacques@mail.fr jacques_pwd 2.3,-9.8 23/02/1975 +registerCustomer 465131879 Gabrielle custo_gabrielle gabrielle@mail.fr gabrielle_pwd -3.3,2.1 18/03/1987 + +# show restaurants +showRestaurantTop + +# show customers +showCustomer + +# logout +logout + +############### +# login, adding and populate a meal to each restaurant +# 5 uniques Full meals +# 2 uniques Half meals +############### + + +login resto2 resto2pwd +addDishRestaurantMenu steackFrites MainDish normal 14.80 +addDishRestaurantMenu salad Starter vegetarian 5.20 +addDishRestaurantMenu cookie Dessert normal 3.00 +addDishRestaurantMenu mushroomPie MainDish vegetarian 11.50 +addDishRestaurantMenu tartare Starter glutenFree 9.50 +addDishRestaurantMenu brownie Dessert normal 12.50 +addDishRestaurantMenu fruits Dessert vegetarian 6.50 +createMeal menuEnfant FullMeal +addDishToMeal steackFrites menuEnfant +addDishToMeal salad menuEnfant +addDishToMeal cookie menuEnfant +createMeal menuDuMidi FullMeal +addDishToMeal salad menuDuMidi +addDishToMeal steackFrites menuDuMidi +addDishToMeal cookie menuDuMidi +createMeal menuLegerEntreePlat HalfMeal +addDishToMeal salad menuLegerEntreePlat +addDishToMeal mushroomPie menuLegerEntreePlat + +# login implies logout of the current logged entity +login resto3 resto3pwd +addDishRestaurantMenu steackFrites MainDish normal 14.80 +addDishRestaurantMenu salad Starter vegetarian 5.20 +addDishRestaurantMenu cookie Dessert normal 3.00 +addDishRestaurantMenu mushroomPie MainDish vegetarian 11.50 +addDishRestaurantMenu tartare Starter glutenFree 9.50 +addDishRestaurantMenu brownie Dessert normal 12.50 +addDishRestaurantMenu fruits Dessert vegetarian 6.50 +createMeal menuBoucher FullMeal +addDishToMeal tartare menuBoucher +addDishToMeal steackFrites menuBoucher +addDishToMeal brownie menuBoucher +createMeal menuDuMidi FullMeal +addDishToMeal salad menuDuMidi +addDishToMeal steackFrites menuDuMidi +addDishToMeal cookie menuDuMidi +createMeal menuLegerEntreePlat HalfMeal +addDishToMeal salad menuLegerEntreePlat +addDishToMeal mushroomPie menuLegerEntreePlat + +login resto4 resto4pwd +addDishRestaurantMenu steackFrites MainDish normal 14.80 +addDishRestaurantMenu salad Starter vegetarian 5.20 +addDishRestaurantMenu cookie Dessert normal 3.00 +addDishRestaurantMenu mushroomPie MainDish vegetarian 11.50 +addDishRestaurantMenu tartare Starter glutenFree 9.50 +addDishRestaurantMenu brownie Dessert normal 12.50 +addDishRestaurantMenu fruits Dessert vegetarian 6.50 +createMeal menuVegetarien FullMeal +addDishToMeal salad menuVegetarien +addDishToMeal mushroomPie menuVegetarien +addDishToMeal fruits menuVegetarien +createMeal menuDuMidi FullMeal +addDishToMeal salad menuDuMidi +addDishToMeal steackFrites menuDuMidi +addDishToMeal cookie menuDuMidi + +login resto5 resto5pwd +addDishRestaurantMenu steackFrites MainDish normal 14.50 +addDishRestaurantMenu salad Starter vegetarian 5.80 +addDishRestaurantMenu cookie Dessert normal 3.00 +addDishRestaurantMenu mushroomPie MainDish vegetarian 12.50 +addDishRestaurantMenu tartare Starter glutenFree 7.60 +addDishRestaurantMenu brownie Dessert normal 12.30 +addDishRestaurantMenu fruits Dessert vegetarian 6.50 +createMeal menuDuMidi FullMeal +addDishToMeal salad menuDuMidi +addDishToMeal steackFrites menuDuMidi +addDishToMeal cookie menuDuMidi +createMeal menuLegerEntreePlat HalfMeal +addDishToMeal salad menuLegerEntreePlat +addDishToMeal mushroomPie menuLegerEntreePlat + +login resto6 resto6pwd +addDishRestaurantMenu steackFrites MainDish normal 14.50 +addDishRestaurantMenu salad Starter vegetarian 5.80 +addDishRestaurantMenu cookie Dessert normal 3.00 +addDishRestaurantMenu mushroomPie MainDish vegetarian 12.50 +addDishRestaurantMenu tartare Starter glutenFree 8.50 +addDishRestaurantMenu brownie Dessert normal 14.50 +addDishRestaurantMenu fruits Dessert vegetarian 4.50 +createMeal menuLegerPlatDessert HalfMeal +addDishToMeal mushroomPie menuLegerPlatDessert +addDishToMeal cookie menuLegerPlatDessert +createMeal menuDuMidi FullMeal +addDishToMeal salad menuDuMidi +addDishToMeal steackFrites menuDuMidi +addDishToMeal cookie menuDuMidi + +login resto7 resto7pwd +addDishRestaurantMenu steackFrites MainDish normal 14.80 +addDishRestaurantMenu salad Starter vegetarian 5.20 +addDishRestaurantMenu cookie Dessert normal 3.00 +addDishRestaurantMenu mushroomPie MainDish vegetarian 11.50 +addDishRestaurantMenu tartare Starter glutenFree 8.50 +addDishRestaurantMenu brownie Dessert normal 14.50 +addDishRestaurantMenu fruits Dessert vegetarian 4.50 +createMeal menuLegerEntreePlat HalfMeal +addDishToMeal salad menuLegerEntreePlat +addDishToMeal mushroomPie menuLegerEntreePlat + +############### +# setting meal of the week for some restaurant (2,3,5,6) +############### + +# !!!!! +# Offers are stocked for each customer, waiting for connection to spam. +# !!!!! + +login resto2 resto2pwd +setSpecialOffer menuEnfant + +login resto3 resto3pwd +setSpecialOffer menuDuMidi + +login resto5 resto5pwd +setSpecialOffer menuLegerEntreePlat + +login resto6 resto6pwd +setSpecialOffer menuLegerPlatDessert + +# Show all the restaurant and their menu : + +login ceo 123456789 +showRestaurantTop + +# Before testing command let's add afidelity card : + +associateCard custo_gabrielle Point +associateCard custo_louise Lottery + +# Login a few customers + +login custo_jacques jacques_pwd +# login implies logout of the current logged entity +login custo_gabrielle gabrielle_pwd +login custo_louise louise_pwd + +createOrder resto6 maCommande +addItemToOrder maCommande menuDuMidi +addItemToOrder maCommande salad +addItemToOrder maCommande menuLegerPlatDessert + +endOrder maCommande + +login custo_gabrielle gabrielle_pwd + +createOrder resto5 maCommande2 +addItemToOrder maCommande2 menuDuMidi +addItemToOrder maCommande2 cookie +addItemToOrder maCommande2 menuLegerEntreePlat + +endOrder maCommande2 + +#########" +# Meal Of the week accuracy +### resto 2 & 3 & 4 have exactly the same prices, menuMidi is meal of the week for resto3 + +createOrder resto4 maCommande3 +createOrder resto3 maCommande4 +createOrder resto2 maCommande5 +# 5% reduc +addItemToOrder maCommande3 menuDuMidi +# 10% reduc +addItemToOrder maCommande4 menuDuMidi +# full price +addItemToOrder maCommande5 salad +addItemToOrder maCommande5 steackFrites +addItemToOrder maCommande5 cookie + +endOrder maCommande5 +endOrder maCommande3 +endOrder maCommande4 + +# last order, to test profit calculation + +createOrder resto2 maCommande6 +addItemToOrder maCommande6 menuDuMidi +addItemToOrder maCommande6 menuLegerEntreePlat +addItemToOrder maCommande6 cookie + +# at this point no courier available +endOrderAt maCommande6 05/04/2017 +login ceo 123456789 +# free a courier +offDuty cour_pascal +login custo_gabrielle gabrielle_pwd + +endOrderAt maCommande6 05/04/2017 + +# login again manager + +login ceo 123456789 + +# initial profit +showTotalProfit + +# set a markup profit strategy +setProfitPolicy markup 6.0 +showTotalProfit + +# set a serviceFee strategy +setProfitPolicy ServiceFee 5.0 +showTotalProfit + +setProfitPolicy deliveryCost 3.0 +showTotalProfit +showProfitBetween 01/05/2017 10/05/2017 + +showCourier +showCourierOrdered ASC +showCourierOrdered DESC + +########### +# other stuff : +########### + +# onDuty & offDuty +offDuty cour_marc +showCourier +onDuty cour_marc +showCourier + +showCustomer + +logout \ No newline at end of file diff --git a/src/Cards/FidelityCard.java b/src/Cards/FidelityCard.java index c52064b..48783c9 100644 --- a/src/Cards/FidelityCard.java +++ b/src/Cards/FidelityCard.java @@ -25,7 +25,6 @@ public abstract class FidelityCard implements VisitableCard { } public abstract String returnType(); - } diff --git a/src/Cli/Clui.java b/src/Cli/Clui.java index adfa162..2a6e3e7 100644 --- a/src/Cli/Clui.java +++ b/src/Cli/Clui.java @@ -11,12 +11,14 @@ import Commands.AssociateCard; import Commands.CreateMeal; import Commands.CreateOrder; import Commands.EndOrder; +import Commands.EndOrderAt; import Commands.Help; import Commands.Logout; import Commands.OffDuty; import Commands.OnDuty; import Commands.RegisterCourier; import Commands.RegisterCustomer; +import Commands.RegisterManager; import Commands.RegisterRestaurant; import Commands.RemoveSpecialOffer; import Commands.RenameMeal; @@ -25,6 +27,7 @@ import Commands.SetDeliveryPolicy; import Commands.SetProfitPolicy; import Commands.SetSpecialOffer; import Commands.ShowCourier; +import Commands.ShowCourierOrdered; import Commands.ShowCustomer; import Commands.ShowMeal; import Commands.ShowMenuItem; @@ -37,6 +40,7 @@ import Exception.ExceptionUnknownDishType; import Exception.ExceptionUnknownMealType; import Exception.ExceptionUnknownStartegyType; import Exception.ExceptionUnknownTypeOfUser; +import User.Customer; public class Clui { @@ -57,6 +61,7 @@ public class Clui { this.listOfCommand.add(new CreateMeal()); this.listOfCommand.add(new CreateOrder()); this.listOfCommand.add(new EndOrder()); + this.listOfCommand.add(new EndOrderAt()); this.listOfCommand.add(new Help()); this.listOfCommand.add(new Login()); this.listOfCommand.add(new Logout()); @@ -64,6 +69,7 @@ public class Clui { this.listOfCommand.add(new OnDuty()); this.listOfCommand.add(new RegisterCourier()); this.listOfCommand.add(new RegisterCustomer()); + this.listOfCommand.add(new RegisterManager()); this.listOfCommand.add(new RegisterRestaurant()); this.listOfCommand.add(new RemoveSpecialOffer()); this.listOfCommand.add(new RenameMeal()); @@ -72,6 +78,7 @@ public class Clui { this.listOfCommand.add(new SetProfitPolicy()); this.listOfCommand.add(new SetSpecialOffer()); this.listOfCommand.add(new ShowCourier()); + this.listOfCommand.add(new ShowCourierOrdered()); this.listOfCommand.add(new ShowCustomer()); this.listOfCommand.add(new ShowMeal()); this.listOfCommand.add(new ShowMenuItem()); @@ -88,35 +95,51 @@ public class Clui { return null; } - public void executeCommand(String command) throws ExceptionUnknownMealType, NumberFormatException, ExceptionUnknownDishType, ExceptionUnknownStartegyType, ExceptionUnknownTypeOfUser{ - StringTokenizer st = new StringTokenizer(command); - String commandName = st.nextToken(); - ArrayList<String> arguments = new ArrayList<String>(); - while (st.hasMoreTokens()) { - arguments.add(st.nextToken()); - } - - Command commandAsked; - commandAsked = getCommand(commandName); - if(commandAsked != null){ - try{ - if(commandAsked.isGoodArgument(arguments)){ - commandAsked.execute(arguments, foodora, activeUser); - }else{ - System.out.println("Error in the arguments."); + public void executeCommand(String command){ + if(!(command.equals("") || command.substring(0, 1).equals("#"))){ + StringTokenizer st = new StringTokenizer(command); + String commandName = st.nextToken(); + ArrayList<String> arguments = new ArrayList<String>(); + while (st.hasMoreTokens()) { + arguments.add(st.nextToken()); + } + + Command commandAsked; + commandAsked = getCommand(commandName); + if(commandAsked != null){ + try{ + if(commandAsked.isGoodArgument(arguments)){ + try { + commandAsked.execute(arguments, foodora, activeUser); + } catch (NumberFormatException | ExceptionUnknownMealType | ExceptionUnknownDishType + | ExceptionUnknownStartegyType | ExceptionUnknownTypeOfUser | java.lang.NullPointerException e) { + // TODO Auto-generated catch block + System.out.println("ERROR with command "+commandName+ " : " + e.getMessage()); + //e.printStackTrace(); + } + }else{ + System.out.println("Error in the arguments."); + } + }catch (errorWrongNumberOfParams ex) { + System.out.println(ex); } - }catch (errorWrongNumberOfParams ex) { - System.out.println(ex); + catch (errorWrongFormatValue ex) { + System.out.println(ex); + } + }else{ + System.out.println("Unknown command."); } - catch (errorWrongFormatValue ex) { - System.out.println(ex); + + // lifeTimeFunction + if(activeUser.getUser() instanceof Customer){ + Customer c = (Customer) activeUser.getUser(); + c.checkForPendingOffer(); } - }else{ - System.out.println("Unknown command."); + } } - public void launchClui() throws errorWrongNumberOfParams, errorWrongFormatValue, ExceptionUnknownMealType, NumberFormatException, ExceptionUnknownDishType, ExceptionUnknownStartegyType, ExceptionUnknownTypeOfUser{ + public void launchClui(){ System.out.println("Welcome to MyFoodora system, type help <> in order to have all the possible commands"); while(true){ String command = Input.string("===================\n" diff --git a/src/Cli/Command.java b/src/Cli/Command.java index efceeb0..a8683ea 100644 --- a/src/Cli/Command.java +++ b/src/Cli/Command.java @@ -26,12 +26,14 @@ public abstract class Command { public boolean isGoodArgument(ArrayList<String> arguments) throws errorWrongNumberOfParams,errorWrongFormatValue{ if(arguments.size() != listOfArgs.length){ - throw new errorWrongNumberOfParams("Error : "+Integer.toString(arguments.size())+" parameter insteed of "+Integer.toString(listOfArgs.length)); + throw new errorWrongNumberOfParams("Error : "+ commandName +" : "+Integer.toString(arguments.size())+" parameter insteed of "+Integer.toString(listOfArgs.length)); } int i = 0; for (String arg : arguments) { - listOfArgs[i].isTockenCorrect(arg); // throw une erreur, faut la catch au dessus ! - i++; + if(listOfArgs[i].isTockenCorrect(arg)) + i++; + else + throw new errorWrongFormatValue("Error : "+ commandName +" : " + i + " arg is wrong format"); } // trow une erreur return true; diff --git a/src/Cli/Token.java b/src/Cli/Token.java index f0d8160..740ada0 100644 --- a/src/Cli/Token.java +++ b/src/Cli/Token.java @@ -37,7 +37,7 @@ public class Token { return true; break; case position: - if(_value.matches("-?\\d+(\\.\\d+)\\,\\d+(\\.\\d+)?")) + if(_value.matches("-?\\d+(\\.\\d+)\\,-?\\d+(\\.\\d+)?")) return true; break; case decimal: diff --git a/src/Commands/AddDishRestaurantMenu.java b/src/Commands/AddDishRestaurantMenu.java index ec31513..be581f3 100644 --- a/src/Commands/AddDishRestaurantMenu.java +++ b/src/Commands/AddDishRestaurantMenu.java @@ -32,7 +32,7 @@ public class AddDishRestaurantMenu extends Command { if(activeUser.getUser() instanceof Restaurant){ Restaurant r = (Restaurant) activeUser.getUser(); r.addDish(arg.get(1), arg.get(0), arg.get(2), Double.parseDouble(arg.get(3))); - System.out.println("Customer added : " + foodora.getUserByName(arg.get(1), arg.get(2))); + System.out.println("Dish added : " + r.getDishByName(arg.get(0))); }else{ System.out.println("You need to be a logged Restaurant in order to access this function"); } diff --git a/src/Commands/AddItemToOrder.java b/src/Commands/AddItemToOrder.java index 27735c6..b5417b3 100644 --- a/src/Commands/AddItemToOrder.java +++ b/src/Commands/AddItemToOrder.java @@ -6,11 +6,8 @@ import Cli.Command; import Cli.Token; import Core.ActiveUserContext; import Core.MyFoodora; -import Exception.ExceptionUnknownDishType; -import Exception.ExceptionUnknownMealType; import Order.Order; import User.Customer; -import User.Restaurant; public class AddItemToOrder extends Command { @@ -28,6 +25,7 @@ public class AddItemToOrder extends Command { if(activeUser.getUser() instanceof Customer){ Customer c = (Customer) activeUser.getUser(); Order o = c.getOrderByName(arg.get(0)); + //System.out.println(c.getListOrder()); o.addItemByName(arg.get(1)); System.out.println(arg.get(1) + " added in "+arg.get(0)+"."); }else{ diff --git a/src/Commands/AssociateCard.java b/src/Commands/AssociateCard.java index 840f349..873607b 100644 --- a/src/Commands/AssociateCard.java +++ b/src/Commands/AssociateCard.java @@ -29,6 +29,7 @@ public class AssociateCard extends Command { if(activeUser.getUser() instanceof Manager){ Manager m = (Manager) activeUser.getUser(); Customer c = (Customer) foodora.getUserByUsername(arg.get(0)); + System.out.println("You are choosing a "+arg.get(1)+" card."); c.registerFidelityPlan(arg.get(1)); }else{ System.out.println("You need to be a logged Manager in order to access this function"); diff --git a/src/Commands/EndOrder.java b/src/Commands/EndOrder.java index 5de3bb6..eba1a55 100644 --- a/src/Commands/EndOrder.java +++ b/src/Commands/EndOrder.java @@ -15,8 +15,7 @@ public class EndOrder extends Command { public EndOrder() { super("endOrder", - new Token[]{new Token(Token.TypeToken.str,"orderName"), - new Token(Token.TypeToken.date,"orderDate")} + new Token[]{new Token(Token.TypeToken.str,"orderName")} ); // TODO Auto-generated constructor stub } @@ -26,8 +25,8 @@ public class EndOrder extends Command { // TODO Auto-generated method stub if(activeUser.getUser() instanceof Customer){ Customer c = (Customer) activeUser.getUser(); - c.getOrderByName(arg.get(0)).finalize(); - System.out.println(arg.get(1) + " finalized the "+arg.get(0)+"."); + System.out.println("finalising the command : "+ arg.get(0)); + c.placeOrder(c.getOrderByName(arg.get(0)), foodora); }else{ System.out.println("You need to be a logged Customer in order to access this function"); } diff --git a/src/Commands/EndOrderAt.java b/src/Commands/EndOrderAt.java new file mode 100644 index 0000000..14a6a10 --- /dev/null +++ b/src/Commands/EndOrderAt.java @@ -0,0 +1,44 @@ +package Commands; + +import java.util.ArrayList; + +import Cli.Command; +import Cli.Token; +import Core.ActiveUserContext; +import Core.MyFoodora; +import Exception.ExceptionUnknownDishType; +import Exception.ExceptionUnknownMealType; +import Exception.ExceptionUnknownStartegyType; +import Exception.ExceptionUnknownTypeOfUser; +import Order.Order; +import Others.Date; +import User.Customer; + +public class EndOrderAt extends Command { + + public EndOrderAt() { + super("endOrderAt", + new Token[]{new Token(Token.TypeToken.str,"orderName"), + new Token(Token.TypeToken.date,"orderDate")} + ); + // TODO Auto-generated constructor stub + } + + @Override + public void execute(ArrayList<String> arg, MyFoodora foodora, ActiveUserContext activeUser) throws NumberFormatException { + // TODO Auto-generated method stub + if(activeUser.getUser() instanceof Customer){ + Customer c = (Customer) activeUser.getUser(); + Order o = (Order) c.getOrderByName(arg.get(0)); + String[] parts = arg.get(1).split("/"); + int day = Integer.parseInt(parts[0]); + int month = Integer.parseInt(parts[1]); + int year = Integer.parseInt(parts[2]); + System.out.println("finalising the command : "+ arg.get(0) + ", the : "+arg.get(1)); + c.placeOrder(o, foodora,new Date(year,month,day)); + //System.out.println(foodora.getGlobalHistoric()); + }else{ + System.out.println("You need to be a logged Customer in order to access this function"); + } + } +} diff --git a/src/Commands/OffDuty.java b/src/Commands/OffDuty.java index 59f9ab7..88fac86 100644 --- a/src/Commands/OffDuty.java +++ b/src/Commands/OffDuty.java @@ -27,7 +27,7 @@ public class OffDuty extends Command { Manager m = (Manager) activeUser.getUser(); Courier d = (Courier) foodora.getUserByUsername(arg.get(0)); d.setAvailable(true); - System.out.println(arg.get(0) + " in now on duty."); + System.out.println(arg.get(0) + " in now available."); }else{ System.out.println("You need to be a logged Manager in order to access this function"); } diff --git a/src/Commands/RegisterCourier.java b/src/Commands/RegisterCourier.java index ba330da..660b8a5 100644 --- a/src/Commands/RegisterCourier.java +++ b/src/Commands/RegisterCourier.java @@ -8,6 +8,7 @@ import Core.ActiveUserContext; import Core.MyFoodora; import Exception.ExceptionUnknownTypeOfUser; import Others.Adress; +import User.Courier; import User.Manager; import User.User; @@ -33,7 +34,7 @@ public class RegisterCourier extends Command { Manager m = (Manager) activeUser.getUser(); // registerCourier 0123456789 resto1 resto1 mail password 0.01,0.02 22/03/1995 m.addUser(Long.parseLong(arg.get(0)), arg.get(1), arg.get(2), arg.get(3), arg.get(4), Adress.fromStr(arg.get(5)), true, arg.get(6), "1", foodora, User.COURIER , "Human"); - System.out.println("Courier added : " + foodora.getUserByName(arg.get(1), arg.get(2))); + System.out.println("Courier added : " + (Courier) foodora.getUserByUsername(arg.get(2))); }else{ System.out.println("You need to be a manager in order to access this function"); } diff --git a/src/Commands/RegisterCustomer.java b/src/Commands/RegisterCustomer.java index a2609aa..99352b2 100644 --- a/src/Commands/RegisterCustomer.java +++ b/src/Commands/RegisterCustomer.java @@ -8,6 +8,7 @@ import Core.ActiveUserContext; import Core.MyFoodora; import Exception.ExceptionUnknownTypeOfUser; import Others.Adress; +import User.Customer; import User.Manager; import User.User; @@ -33,7 +34,7 @@ public class RegisterCustomer extends Command { Manager m = (Manager) activeUser.getUser(); // registerRestaurant 0123456789 resto1 resto1 mail password 0.01,0.02 22/03/1995 m.addUser(Long.parseLong(arg.get(0)), arg.get(1), arg.get(2), arg.get(3), arg.get(4), Adress.fromStr(arg.get(5)), true, arg.get(6), "1", foodora, User.CUSTOMER , "Human"); - System.out.println("Customer added : " + foodora.getUserByName(arg.get(1), arg.get(2))); + System.out.println("Customer added : " + (Customer) foodora.getUserByUsername( arg.get(2))); }else{ System.out.println("You need to be a logged Manager in order to access this function"); } diff --git a/src/Commands/RegisterManager.java b/src/Commands/RegisterManager.java new file mode 100644 index 0000000..fa2657c --- /dev/null +++ b/src/Commands/RegisterManager.java @@ -0,0 +1,42 @@ +package Commands; + +import java.util.ArrayList; + +import Cli.Command; +import Cli.Token; +import Core.ActiveUserContext; +import Core.MyFoodora; +import Exception.ExceptionUnknownTypeOfUser; +import Others.Adress; +import User.Manager; +import User.User; + +public class RegisterManager extends Command { + + public RegisterManager() { + super("registerManager", + new Token[]{new Token(Token.TypeToken.integer,"tel") + ,new Token(Token.TypeToken.str,"name") + ,new Token(Token.TypeToken.str,"username") + ,new Token(Token.TypeToken.str,"mail") + ,new Token(Token.TypeToken.str,"password") + ,new Token(Token.TypeToken.position,"adress") + ,new Token(Token.TypeToken.date,"birthday")} + ); + // TODO Auto-generated constructor stub + } + + @Override + public void execute(ArrayList<String> arg, MyFoodora foodora, ActiveUserContext activeUser) throws NumberFormatException, ExceptionUnknownTypeOfUser { + // TODO Auto-generated method stub + if(activeUser.getUser() instanceof Manager){ + Manager m = (Manager) activeUser.getUser(); + // registerRestaurant 0123456789 resto1 resto1 mail password 0.01,0.02 22/03/1995 + m.addUser(Long.parseLong(arg.get(0)), arg.get(1), arg.get(2), arg.get(3), arg.get(4), Adress.fromStr(arg.get(5)), true, arg.get(6), "1", foodora, User.MANAGER , "Human"); + System.out.println("Manager added : " + (Manager) foodora.getUserByUsername(arg.get(2))); + }else{ + System.out.println("You need to be a logged Manager in order to access this function"); + } + } + +} diff --git a/src/Commands/RegisterRestaurant.java b/src/Commands/RegisterRestaurant.java index 64459ad..bb08018 100644 --- a/src/Commands/RegisterRestaurant.java +++ b/src/Commands/RegisterRestaurant.java @@ -33,7 +33,7 @@ public class RegisterRestaurant extends Command { Manager m = (Manager) activeUser.getUser(); // registerRestaurant 0123456789 resto1 resto1 mail password 0.01,0.02 m.addUser(Long.parseLong(arg.get(0)), arg.get(1), arg.get(2), arg.get(3), arg.get(4), Adress.fromStr(arg.get(5)), true, "1", "1", foodora, User.RESTAURANT , "Moral"); - System.out.println("Restaurant added : " + foodora.getUserByName(arg.get(1), arg.get(2))); + System.out.println("Restaurant added : " + (Restaurant) foodora.getUserByUsername(arg.get(2))); }else{ System.out.println("You need to be a manager in order to access this function"); } diff --git a/src/Commands/RunTest.java b/src/Commands/RunTest.java index ff7e301..aee3333 100644 --- a/src/Commands/RunTest.java +++ b/src/Commands/RunTest.java @@ -14,6 +14,7 @@ import Core.MyFoodora; import Exception.ExceptionUnknownDishType; import Exception.ExceptionUnknownMealType; import Exception.ExceptionUnknownStartegyType; +import Exception.ExceptionUnknownTypeOfUser; import User.Manager; public class RunTest extends Command { @@ -28,28 +29,15 @@ public class RunTest extends Command { @Override public void execute(ArrayList<String> arg, MyFoodora foodora, ActiveUserContext activeUser) { - if(activeUser.getUser() instanceof Manager){ - Clui clui = new Clui(foodora, activeUser); - String fileName = arg.get(0); - - //read file into stream, try-with-resources - try (Stream<String> stream = Files.lines(Paths.get(fileName))) { - - stream.forEach(command -> { - try { - clui.executeCommand(command); - } catch (NumberFormatException | ExceptionUnknownMealType | ExceptionUnknownDishType | ExceptionUnknownStartegyType e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - }); - - } catch (IOException e) { - e.printStackTrace(); - } - } - else{ - System.out.println("You need to be a manager in order to access this function"); + Clui clui = new Clui(foodora, activeUser); + String fileName = System.getProperty("user.dir") + "/" + arg.get(0); + + //read file into stream, try-with-resources + try (Stream<String> stream = Files.lines(Paths.get(fileName))) { + stream.forEach(command -> clui.executeCommand(command)); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } } diff --git a/src/Commands/SetProfitPolicy.java b/src/Commands/SetProfitPolicy.java index 85caeb8..ef1301f 100644 --- a/src/Commands/SetProfitPolicy.java +++ b/src/Commands/SetProfitPolicy.java @@ -15,7 +15,8 @@ public class SetProfitPolicy extends Command { public SetProfitPolicy() { super("setProfitPolicy", - new Token[]{new Token(Token.TypeToken.str,"profityPolicyName")} + new Token[]{new Token(Token.TypeToken.str,"profityPolicyName"), + new Token(Token.TypeToken.decimal,"valueTargetted")} ); // TODO Auto-generated constructor stub } @@ -26,7 +27,8 @@ public class SetProfitPolicy extends Command { if(activeUser.getUser() instanceof Manager){ Manager m = (Manager) activeUser.getUser(); foodora.getContextTargetProfitStrategy().setStrategy(arg.get(0)); - System.out.println(arg.get(0) + " is now the profit policy."); + foodora.getContextTargetProfitStrategy().execute(foodora, Double.parseDouble(arg.get(1))); + System.out.println(arg.get(0) + " is now the profit policy, target is : "+arg.get(1)+"."); }else{ System.out.println("You need to be a logged Manager in order to access this function"); } diff --git a/src/Commands/SetSpecialOffer.java b/src/Commands/SetSpecialOffer.java index c1f4dbe..8bb0974 100644 --- a/src/Commands/SetSpecialOffer.java +++ b/src/Commands/SetSpecialOffer.java @@ -23,7 +23,6 @@ public class SetSpecialOffer extends Command { if(activeUser.getUser() instanceof Restaurant){ Restaurant r = (Restaurant) activeUser.getUser(); r.addMealOfTheWeek(foodora, arg.get(0)); - System.out.println("Meal "+arg.get(0)+" is now the Meal Of The Week."); }else{ System.out.println("You need to be a logged Restaurant in order to access this function"); diff --git a/src/Commands/ShowCourier.java b/src/Commands/ShowCourier.java index a4a6fac..339d2af 100644 --- a/src/Commands/ShowCourier.java +++ b/src/Commands/ShowCourier.java @@ -9,6 +9,7 @@ import Core.MyFoodora; import Exception.ExceptionUnknownDishType; import Exception.ExceptionUnknownMealType; import Exception.ExceptionUnknownStartegyType; +import User.Courier; import User.Manager; public class ShowCourier extends Command { @@ -22,7 +23,10 @@ public class ShowCourier extends Command { @Override public void execute(ArrayList<String> arguments, MyFoodora foodora, ActiveUserContext activeUser) { if(activeUser.getUser() instanceof Manager){ - System.out.println(foodora.getListCourier().getList().toString()); + System.out.println("\n*************\nlist of couriers :"); + for(Courier c : foodora.getListCourier().getList()){ + System.out.println(c.toString()); + } } else{ System.out.println("You need to be a manager in order to access this function"); diff --git a/src/Commands/ShowCourierOrdered.java b/src/Commands/ShowCourierOrdered.java new file mode 100644 index 0000000..a5dc0f2 --- /dev/null +++ b/src/Commands/ShowCourierOrdered.java @@ -0,0 +1,33 @@ +package Commands; + +import java.util.ArrayList; + +import Cli.Command; +import Cli.Token; +import Core.ActiveUserContext; +import Core.MyFoodora; +import Exception.ExceptionUnknownDishType; +import Exception.ExceptionUnknownMealType; +import Exception.ExceptionUnknownStartegyType; +import Exception.ExceptionUnknownTypeOfUser; +import User.Manager; + +public class ShowCourierOrdered extends Command { + + public ShowCourierOrdered() { + super("showCourierOrdered", new Token[]{new Token(Token.TypeToken.str,"typeOrdering")}); + // TODO Auto-generated constructor stub + } + // + "showCustomers <> for the currently logged on myFoodora manager to display thelist of customers\n" + + @Override + public void execute(ArrayList<String> arg, MyFoodora foodora, ActiveUserContext activeUser) { + if(activeUser.getUser() instanceof Manager){ + System.out.println("\n*************\nlist of couriers ordered by "+arg.get(0)+" : \n" + foodora.getListCourierOrdered(arg.get(0)).toString()); + } + else{ + System.out.println("You need to be a manager in order to access this function"); + } + } + +} diff --git a/src/Commands/ShowCustomer.java b/src/Commands/ShowCustomer.java index 4f6a131..ba4eab6 100644 --- a/src/Commands/ShowCustomer.java +++ b/src/Commands/ShowCustomer.java @@ -6,12 +6,13 @@ import Cli.Command; import Cli.Token; import Core.ActiveUserContext; import Core.MyFoodora; +import User.Customer; import User.Manager; public class ShowCustomer extends Command { public ShowCustomer() { - super("showCustomers", new Token[]{}); + super("showCustomer", new Token[]{}); // TODO Auto-generated constructor stub } // + "showCustomers <> for the currently logged on myFoodora manager to display thelist of customers\n" @@ -19,7 +20,10 @@ public class ShowCustomer extends Command { @Override public void execute(ArrayList<String> arguments, MyFoodora foodora, ActiveUserContext activeUser) { if(activeUser.getUser() instanceof Manager){ - System.out.println(foodora.getListCustomer().getList().toString()); + System.out.println("\n*************\nlist of customers :"); + for(Customer c : foodora.getListCustomer().getList()){ + System.out.println(c.toString()); + } } else{ System.out.println("You need to be a manager in order to access this function"); diff --git a/src/Commands/ShowProfitBetween.java b/src/Commands/ShowProfitBetween.java index b1f875b..51694b7 100644 --- a/src/Commands/ShowProfitBetween.java +++ b/src/Commands/ShowProfitBetween.java @@ -20,9 +20,13 @@ public class ShowProfitBetween extends Command { // + "showCustomers <> for the currently logged on myFoodora manager to display thelist of customers\n" @Override - public void execute(ArrayList<String> arguments, MyFoodora foodora, ActiveUserContext activeUser) { + public void execute(ArrayList<String> arg, MyFoodora foodora, ActiveUserContext activeUser) { if(activeUser.getUser() instanceof Manager){ - System.out.println(foodora.getGlobalProfit()); + String[] db = arg.get(0).split("/"); + String[] de = arg.get(1).split("/"); + Others.Date dateBeg = new Others.Date(Integer.parseInt(db[2]), Integer.parseInt(db[1]), Integer.parseInt(db[0])); + Others.Date dateEnd = new Others.Date(Integer.parseInt(de[2]), Integer.parseInt(de[1]), Integer.parseInt(de[0])); + System.out.println("Total profit between "+dateBeg+" and "+ dateEnd +" : " + foodora.getProfitBetween(dateBeg, dateEnd)); } else{ System.out.println("You need to be a manager in order to access this function"); diff --git a/src/Commands/ShowRestaurantTop.java b/src/Commands/ShowRestaurantTop.java index 7863bfa..9318d5b 100644 --- a/src/Commands/ShowRestaurantTop.java +++ b/src/Commands/ShowRestaurantTop.java @@ -38,7 +38,7 @@ public class ShowRestaurantTop extends Command { listToSort.remove(mostSeller); } - System.out.println(sortListOfRestaurant.toString()); + System.out.println("\n*************\nlist of restaurants :" + sortListOfRestaurant.toString()); } else{ diff --git a/src/Commands/ShowTotalProfit.java b/src/Commands/ShowTotalProfit.java index 073454d..d50a55f 100644 --- a/src/Commands/ShowTotalProfit.java +++ b/src/Commands/ShowTotalProfit.java @@ -22,7 +22,7 @@ public class ShowTotalProfit extends Command { @Override public void execute(ArrayList<String> arguments, MyFoodora foodora, ActiveUserContext activeUser) { if(activeUser.getUser() instanceof Manager){ - System.out.println(foodora.getGlobalProfit()); + System.out.println("Total profit since the begining : " + foodora.getGlobalProfit()); } else{ System.out.println("You need to be a manager in order to access this function"); diff --git a/model.di b/src/Commands/model.di similarity index 100% rename from model.di rename to src/Commands/model.di diff --git a/model.notation b/src/Commands/model.notation similarity index 100% rename from model.notation rename to src/Commands/model.notation diff --git a/model.uml b/src/Commands/model.uml similarity index 100% rename from model.uml rename to src/Commands/model.uml diff --git a/src/Core/Main.java b/src/Core/Main.java index b606a98..27f526a 100644 --- a/src/Core/Main.java +++ b/src/Core/Main.java @@ -23,15 +23,20 @@ public class Main { // TODO Auto-generated constructor stub } - public static void main(String[] args) throws ExceptionUnknownStartegyType, errorWrongNumberOfParams, errorWrongFormatValue, ExceptionUnknownDishType, ExceptionUnknownMealType, ExceptionUnknownTypeOfUser { + public static void main(String[] args) { // TODO Auto-generated method stub - MyFoodora foodora = new MyFoodora(); + MyFoodora foodora = null; + foodora = new MyFoodora(); ActiveUserContext activeUser = new ActiveUserContext(foodora); foodora.setMarkupPercentage(0.05); foodora.setServiceFee(3.0); Clui clui = new Clui(foodora,activeUser); Manager manager = new Manager(650588938, "ceo", "ceo", "ceo@centrale.supelec.fr", "123456789", new Adress(15.0, 10.0), true, "25/15/1955", "jacquo"); + foodora.addManager(manager); + + clui.executeCommand("runtest scenario/my_foodora.ini"); + clui.executeCommand("runtest scenario/testScenario1.txt"); /* foodora.addManager(manager); diff --git a/src/Core/MyFoodora.java b/src/Core/MyFoodora.java index d51e6ab..7a74289 100644 --- a/src/Core/MyFoodora.java +++ b/src/Core/MyFoodora.java @@ -3,6 +3,8 @@ package Core; import java.time.ZoneId; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.TimeZone; @@ -57,15 +59,26 @@ public class MyFoodora { /** CONSTRUCTOR * @throws ExceptionUnknownStartegyType **/ - public MyFoodora() throws ExceptionUnknownStartegyType{ - this.contextTargetProfitStrategy = new ContextTargetProfitStrategy("DeliveryCost"); - this.contextDeliveryPolicy = new ContextDeliveryStrategy("FairOccupation"); + public MyFoodora(){ + try { + this.contextTargetProfitStrategy = new ContextTargetProfitStrategy("DeliveryCost"); + } catch (ExceptionUnknownStartegyType e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + try { + this.contextDeliveryPolicy = new ContextDeliveryStrategy("FairOccupation"); + } catch (ExceptionUnknownStartegyType e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } this.listRestaurant = new ListUser<Restaurant>(); this.listCustomer = new ListUser<Customer>(); this.listManager = new ListUser<Manager>(); this.listCourier = new ListUser<Courier>(); this.globalListUser = new ListUser<User>(); this.globalHistoric = new HistoricOrder(); + this.listPendingOrder = new ArrayList<Order>(); } /** CUSTOM **/ @@ -91,6 +104,7 @@ public class MyFoodora { return user; } } + System.out.println("\n /!\\ WARNING : " + username + " is not in user database."); return null; } @@ -224,6 +238,19 @@ public class MyFoodora { public ListUser<Courier> getListCourier() { return listCourier; } + public ListUser<Courier> getListCourierOrdered(String type) { + Collections.sort(listCourier.getList()); + switch(type){ + case "ASC": + break; + case "DESC": + Collections.reverse(listCourier.getList()); + break; + default: + System.out.println("Warning, "+type+" is unkown, only ASC & DESC are known."); + } + return listCourier; + } public HistoricOrder getGlobalHistoric() { return globalHistoric; } @@ -314,13 +341,18 @@ public class MyFoodora { } public int getNumberOfOrderLastMonth() { - Date date = null; // your date + /* + Date date = new Date(); // your date Calendar cal = Calendar.getInstance(); cal.setTimeZone(TimeZone.getDefault()); cal.setTime(date); int theYear = cal.get(Calendar.YEAR) + 1; int theMonth = cal.get(Calendar.MONTH) + 2; int theDay = cal.get(Calendar.DAY_OF_MONTH); + */ + int theDay = new java.util.Date().getDay(); + int theMonth = new java.util.Date().getMonth() + 1 ; + int theYear = new java.util.Date().getYear() + 1900; Others.Date today = new Others.Date(theYear, theMonth, theDay); int lastMonth = 0; int yearOfLastMonth = 0; @@ -334,7 +366,7 @@ public class MyFoodora { } int nbOfOrder = 0; for(Order order : this.globalHistoric.getListOrder()){ - if((order.getDate().getIntMonth()== lastMonth)&(order.getDate().getIntYear()==yearOfLastMonth)){ + if((order.getDate().getIntMonth()== lastMonth)&&(order.getDate().getIntYear()==yearOfLastMonth)){ nbOfOrder++; } } @@ -346,7 +378,19 @@ public class MyFoodora { double totalProfit = 0; for(Order order : this.globalHistoric.getListOrder()){ if(order != null){ - totalProfit = order.getPrice()*this.markupPercentage + this.serviceFee - this.deliveryCost ; + totalProfit += order.getPrice()*this.markupPercentage + this.serviceFee - this.deliveryCost ; + } + } + return totalProfit; + } + +public double getProfitBetween(Others.Date dateBeg, Others.Date dateEnd){ + + double totalProfit = 0; + for(Order order : this.globalHistoric.getListOrder()){ + //System.out.println(dateBeg + " - " + order.getDate() + " - " + dateBeg.compareTo(order.getDate())); + if(dateBeg.compareTo(order.getDate()) <= 0 && dateEnd.compareTo(order.getDate()) >= 0){ + totalProfit += order.getPrice()*this.markupPercentage + this.serviceFee - this.deliveryCost ; } } diff --git a/src/Item/Meal.java b/src/Item/Meal.java index 9f4040d..8620226 100644 --- a/src/Item/Meal.java +++ b/src/Item/Meal.java @@ -21,7 +21,7 @@ import Order.Order; */ public abstract class Meal extends Item{ - ArrayList<Dish> listDish = new ArrayList<Dish>(); + ArrayList<Dish> listDish = null; String [][] patternTypeInMeal; protected String typeOfMeal; protected long nbOfSell; @@ -33,7 +33,7 @@ public abstract class Meal extends Item{ public Meal(String name,String typeOfFood) { super(name,typeOfFood); this.nbOfSell = 0; - + this.listDish = new ArrayList<Dish>(); } /** add and remove dishes **/ @@ -43,22 +43,14 @@ public abstract class Meal extends Item{ int idInMenuInc=0; for(String[] tabOfType : this.getPatternTypeInMeal()){ for(String typeFromPatternType : tabOfType){ - if(typeFromPatternType==dish.getTypeInMeal()){ + if(typeFromPatternType.toLowerCase().equals(dish.getTypeInMeal().toLowerCase())){ idInMenu=idInMenuInc; } } idInMenuInc+=1; } if(idInMenu>-1){ - if(listDish.get(idInMenu)==null){ - listDish.set(idInMenu, dish); - } - else{ - if(Cli.Confirm.text("This dish : "+listDish.get(idInMenu).toString()+" exists already. Do you want to replace it ?))")){ - listDish.remove(idInMenu); - listDish.add(idInMenu, dish); - } - } + this.listDish.set(idInMenu, dish); } } @@ -139,11 +131,11 @@ public abstract class Meal extends Item{ @Override public String toString(){ String s=""; - s+="Menu : "+name; - s+="\nType of Food : "+typeOfFood; - s+="\nThis Menu contain : "; + s+="\n***\nMenu : "+name; + s+=", this Menu contain : "; for(Dish d:listDish){ - s+="\n"+d.toString(); + if(d != null) + s+=d.toString(); } return s; } diff --git a/src/Offers/MealOfTheWeek.java b/src/Offers/MealOfTheWeek.java index 42fe167..75a6772 100644 --- a/src/Offers/MealOfTheWeek.java +++ b/src/Offers/MealOfTheWeek.java @@ -75,8 +75,6 @@ public class MealOfTheWeek implements ObservableOffer { this.observers = observers; } - - @Override public void notifyObservers(Restaurant r) { if(this.changed){ diff --git a/src/Order/Order.java b/src/Order/Order.java index c83efd3..a58851f 100644 --- a/src/Order/Order.java +++ b/src/Order/Order.java @@ -40,13 +40,12 @@ public class Order implements Comparable<Order>{ this.listDish = new ArrayList<Dish>(); this.listMeal = new ArrayList<Meal>(); - nameOrder = _name; - restaurantAttached = _restaurant; + this.nameOrder = _name; + this.restaurantAttached = _restaurant; } /** CUSTOM **/ - @SuppressWarnings("deprecation") public void finalize(){ int theDay = new java.util.Date().getDay(); int theMonth = new java.util.Date().getMonth() + 1 ; @@ -64,6 +63,12 @@ public class Order implements Comparable<Order>{ foodora.getOrderPendingList().add(this); } + public void finalize(MyFoodora foodora, Others.Date _date){ + this.date = _date; + finalized = true; + foodora.getOrderPendingList().add(this); + } + public static ArrayList<Order> getListOfOrderInAPeriod(HistoricOrder historic,Period period){ ArrayList<Order> listOrder = new ArrayList<Order>(); int beginDay = period.getBeginingOfPeriod().getIntDay(); @@ -138,11 +143,13 @@ public class Order implements Comparable<Order>{ Item item = this.restaurantAttached.getDishByName(string); if(item != null) this.add((Dish) item); - item = this.restaurantAttached.getMealByName(string); - if(item != null) - this.add((Meal) item); - if(item == null) - System.out.println("Unknown item."); + else{ + item = this.restaurantAttached.getMealByName(string); + if(item != null) + this.add((Meal) item); + else + System.out.println("Unknown item."); + } } public void add(Dish d){ @@ -186,14 +193,18 @@ public class Order implements Comparable<Order>{ public double getPrice(){ price = 0; MealOfTheWeek mealOfTheWeekAttachedToRestaurant = restaurantAttached.getMealOfTheWeek(); - String nameOfTheMealOfTheWeek = null; - for(Meal m : restaurantAttached.getListOfMeal()){ - if(mealOfTheWeekAttachedToRestaurant.getMeal().getName() == m.getName()){ - nameOfTheMealOfTheWeek = m.getName(); + String nameOfTheMealOfTheWeek = ""; + if(mealOfTheWeekAttachedToRestaurant != null){ + if(mealOfTheWeekAttachedToRestaurant.getMeal() != null){ + for(Meal m : restaurantAttached.getListOfMeal()){ + if(mealOfTheWeekAttachedToRestaurant.getMeal().getName().toLowerCase().equals(m.getName().toLowerCase())){ + nameOfTheMealOfTheWeek = m.getName(); + } + } } } for(Meal meal : listMeal){ - if(meal.getName() == nameOfTheMealOfTheWeek){ + if(meal.getName().toLowerCase().equals(nameOfTheMealOfTheWeek.toLowerCase())){ price += meal.getPrice()*(1-restaurantAttached.getSpecialDiscountFactor()); } else{ @@ -229,7 +240,9 @@ public class Order implements Comparable<Order>{ this.listMeal = listMeal; } - + public String toString(){ + return "\n***\n Order, name : "+nameOrder+", date : "+ date +"\n Dishs : "+ listDish + "\n Meals : " + listMeal; + } public void setDate(Others.Date date) { this.date = date; diff --git a/src/Others/Date.java b/src/Others/Date.java index 69e97b2..f02845c 100644 --- a/src/Others/Date.java +++ b/src/Others/Date.java @@ -71,5 +71,20 @@ public class Date { public String toString() { return "Date dd/mm/yyyy : " + day + "/" + month + "/" + year ; } - + + public int compareTo(Others.Date date) { + if(date.getIntYear() < this.getIntYear()) + return 1; + else if(date.getIntMonth() < this.getIntMonth()) + return 1; + else if(date.getIntDay() < this.getIntDay()) + return 1; + else if(date.getIntYear() > this.getIntYear()) + return -1; + else if(date.getIntMonth() > this.getIntMonth()) + return -1; + else if(date.getIntDay() > this.getIntDay()) + return -1; + return 0; + } } diff --git a/src/StrategyProfit/TargetProfitDeliveryCost.java b/src/StrategyProfit/TargetProfitDeliveryCost.java index ab58274..5fe6345 100644 --- a/src/StrategyProfit/TargetProfitDeliveryCost.java +++ b/src/StrategyProfit/TargetProfitDeliveryCost.java @@ -17,6 +17,8 @@ public class TargetProfitDeliveryCost extends StrategyTargetProfitPolicy { double newDeliveryCost = myFoodora.getServiceFee() + (lastMonthIncome*myFoodora.getMarkupPercentage()-targetProfit)/numberOfOrder; if(newDeliveryCost > 0){ myFoodora.setDeliveryCost(newDeliveryCost); + }else{ + System.out.println("Warning, new deliveryCost is negative, aborted. " + newDeliveryCost); } } } diff --git a/src/StrategyProfit/TargetProfitMarkup.java b/src/StrategyProfit/TargetProfitMarkup.java index 76ac7aa..d56852a 100644 --- a/src/StrategyProfit/TargetProfitMarkup.java +++ b/src/StrategyProfit/TargetProfitMarkup.java @@ -17,6 +17,8 @@ public class TargetProfitMarkup extends StrategyTargetProfitPolicy { double newMarkupPercentage = (targetProfit-myFoodora.getServiceFee()*numberOfOrder+myFoodora.getDeliveryCost()*numberOfOrder)/lastMonthIncome; if(newMarkupPercentage >0){ myFoodora.setMarkupPercentage(newMarkupPercentage); + }else{ + System.out.println("Warning, new markupPercentage is negative, aborted. " + newMarkupPercentage); } } } diff --git a/src/StrategyProfit/TargetProfitServiceFee.java b/src/StrategyProfit/TargetProfitServiceFee.java index 1a44d06..f550fe6 100644 --- a/src/StrategyProfit/TargetProfitServiceFee.java +++ b/src/StrategyProfit/TargetProfitServiceFee.java @@ -17,8 +17,11 @@ public class TargetProfitServiceFee extends StrategyTargetProfitPolicy { double newServiceFee = (targetProfit-lastMonthIncome*myFoodora.getMarkupPercentage())/numberOfOrder + myFoodora.getDeliveryCost(); if(newServiceFee >0){ myFoodora.setServiceFee(newServiceFee); - + }else{ + System.out.println("Warning, new serviceFee is negative, aborted. " + newServiceFee); } + }else{ + System.out.println("Warning, no orders last month, new strategy can't be calculated"); } } diff --git a/src/User/Courier.java b/src/User/Courier.java index dba39a5..ab36214 100644 --- a/src/User/Courier.java +++ b/src/User/Courier.java @@ -22,7 +22,7 @@ import Others.Position; */ -public class Courier extends HumanUser { +public class Courier extends HumanUser{ private Position position; @@ -152,5 +152,16 @@ public class Courier extends HumanUser { System.out.println("The courier " + this.name + " has refused the delivery"); } - + public String toString(){ + return "Courier : "+name+", position : "+adress+", number of orders done : "+nbOfLivraison+", available : "+available; + } + + public int compareTo(User courier){ + if(courier instanceof Courier){ + Courier c = (Courier) courier; + return (int) c.getNbOfLivraison() - (int) this.getNbOfLivraison(); + } + return -1; + } + } diff --git a/src/User/Customer.java b/src/User/Customer.java index 312b20e..e740b15 100644 --- a/src/User/Customer.java +++ b/src/User/Customer.java @@ -36,8 +36,13 @@ public class Customer extends HumanUser implements VisiterCard,Observer { private FidelityCard card; private IDCard idCard; private ArrayList<Order> listOrder = new ArrayList<Order>(); + private ArrayList<String> listOffer = new ArrayList<String>(); private long nbOfOfferReceived; + public ArrayList<Order> getListOrder() { + return listOrder; + } + public Customer(long phoneNumber, String name, String username, String mail, String password, Adress adress, boolean activated, String birthdayDate, String surname) { super(phoneNumber, name, username, mail, password, adress, activated, birthdayDate, surname); @@ -63,7 +68,8 @@ public class Customer extends HumanUser implements VisiterCard,Observer { @Override public String toString() { - return "Customer [spamAgree=" + spamAgree + ", historique=" + historic + ", card=" + card + "]"; + return "\n***\n" + this.name + ", mail : " + this.mail + ", phone : " + Long.toString(this.phoneNumber) + ", position : " + this.adress + + ", spamAgree : " + spamAgree + "\nhave been delivered : " + historic.getListOrder().size() + " times.\ncard : " + card.toString(); } @@ -130,6 +136,81 @@ public class Customer extends HumanUser implements VisiterCard,Observer { System.out.println("You have to pay " + price); } + public void placeOrder(Order order, MyFoodora foodora){ + Restaurant restaurant = order.getRestaurantAttached(); + for(Dish dish : order.getListDish()){ + dish.setNbOfSell(dish.getNbOfSell() + 1); + } + for(Meal meal : order.getListMeal()){ + meal.setNbOfSell(meal.getNbOfSell() + 1); + } + this.historic.addOrder(order); + restaurant.historic.addOrder(order); + Courier chosenCourier = foodora.getContextDeliveryPolicy().getStrategy().chooseCourier(restaurant, this,foodora.getListCourier().getList()); + foodora.getOrderPendingList().add(order); + + // should be a waiting time here + if(chosenCourier == null) + System.out.println("No courier available now"); + else{ + chosenCourier.acceptDelivery(order); + foodora.getOrderPendingList().remove(order); + foodora.getGlobalHistoric().addOrder(order); + this.getListOrder().remove(order); + if (this.card instanceof PointFidelityCard){ + ((PointFidelityCard) this.card).setNbOfPoint(this.getPointInTheCard() + 1); + } + double price = order.getPrice()*(1 + foodora.getMarkupPercentage()) + foodora.getDeliveryCost() + foodora.getServiceFee(); + boolean chance = false; + if(this.card instanceof LotteryFidelityCard){ + chance = ((LotteryFidelityCard) this.card).getReduction(); + } + if(chance){ + price = price*0.75; + } + System.out.println("You have to pay " + price); + } + } + + public void placeOrder(Order order, MyFoodora foodora, Others.Date date){ + Restaurant restaurant = order.getRestaurantAttached(); + order.setDate(date); + if(!foodora.getOrderPendingList().contains(order)){ + for(Dish dish : order.getListDish()){ + dish.setNbOfSell(dish.getNbOfSell() + 1); + } + for(Meal meal : order.getListMeal()){ + meal.setNbOfSell(meal.getNbOfSell() + 1); + } + this.historic.addOrder(order); + restaurant.historic.addOrder(order); + foodora.getOrderPendingList().add(order); + } + Courier chosenCourier = foodora.getContextDeliveryPolicy().getStrategy().chooseCourier(restaurant, this,foodora.getListCourier().getList()); + + // should be a waiting time here + if(chosenCourier == null) + System.out.println("No courier available now"); + else{ + chosenCourier.acceptDelivery(order); + order.setDate(date); + foodora.getOrderPendingList().remove(order); + foodora.getGlobalHistoric().addOrder(order); + if (this.card instanceof PointFidelityCard){ + ((PointFidelityCard) this.card).setNbOfPoint(this.getPointInTheCard() + 1); + } + double price = order.getPrice()*(1 + foodora.getMarkupPercentage()) + foodora.getDeliveryCost() + foodora.getServiceFee(); + boolean chance = false; + if(this.card instanceof LotteryFidelityCard){ + chance = ((LotteryFidelityCard) this.card).getReduction(); + } + if(chance){ + price = price*0.75; + } + System.out.println("You have to pay " + price); + System.out.println("Your delivrer is " + chosenCourier.getName()); + } + } /* @@ -205,25 +286,29 @@ public class Customer extends HumanUser implements VisiterCard,Observer { public void registerFidelityPlan(String newTypeOfFidelityCard){ if(newTypeOfFidelityCard == this.card.returnType()){ System.out.println("You already have this card");} - else if ((newTypeOfFidelityCard != "Basic")&(newTypeOfFidelityCard != "Lottery")&(newTypeOfFidelityCard != "Point")){ + else if (! + (newTypeOfFidelityCard.toLowerCase().equals("basic") + || newTypeOfFidelityCard.toLowerCase().equals("lottery") + || newTypeOfFidelityCard.toLowerCase().equals("point")) + ){ System.out.println("You have to choose between Point, Lottery card"); } - else if (newTypeOfFidelityCard == "Basic"){ + else if (newTypeOfFidelityCard.toLowerCase().equals("basic")){ System.out.println("You have to choose between Point, Lottery card"); } else { - if (newTypeOfFidelityCard == "Point"){ + if (newTypeOfFidelityCard.toLowerCase().equals("point")){ idCard=IDCard.getInstance(); this.card = new PointFidelityCard(); } - if (newTypeOfFidelityCard == "Lottery"){ + if (newTypeOfFidelityCard.toLowerCase().equals("lottery")){ idCard=IDCard.getInstance(); this.card = new LotteryFidelityCard(); - } + System.out.println("Successfully done"); } - } + } public void unregisterFidelityPlan(){ if(this.card.returnType() == "Basic"){ @@ -297,15 +382,26 @@ public class Customer extends HumanUser implements VisiterCard,Observer { public Order getOrderByName(String string) { for(Order order : listOrder){ - if(order.getNameOrder().equals(string)); + if(order.getNameOrder().toLowerCase().equals(string.toLowerCase())) return order; } + System.out.println(this.getListOrder()); + System.out.println("\n/!\\ WARNING : " + string + " order is unkown."); return null; } + public void checkForPendingOffer(){ + if(listOffer.size() > 0){ + for(String offer : listOffer){ + System.out.println("\n/!\\ An offer has been received /!\\\n" + offer); + } + listOffer.clear(); + } + } + @Override public void update(String offer) { - System.out.println(offer); + listOffer.add(offer); this.nbOfOfferReceived++; } diff --git a/src/User/MoralUser.java b/src/User/MoralUser.java index 93600ad..4053d4c 100644 --- a/src/User/MoralUser.java +++ b/src/User/MoralUser.java @@ -1,5 +1,7 @@ package User; +import java.math.BigInteger; + import Others.Adress; public class MoralUser extends User { diff --git a/src/User/Restaurant.java b/src/User/Restaurant.java index 0c2f764..c703064 100644 --- a/src/User/Restaurant.java +++ b/src/User/Restaurant.java @@ -37,10 +37,6 @@ public class Restaurant extends MoralUser { this.generalDiscountFactor = 0.05; this.specialDiscountFactor = 0.1; } - - public Restaurant(){ - - } /** SETTERS @@ -81,7 +77,7 @@ public class Restaurant extends MoralUser { public Dish getDishByName(String name){ for(Dish d : listOfDish){ - if(d.getName() == name){ + if(d.getName().toLowerCase().equals(name.toLowerCase())){ return d; } } @@ -90,7 +86,7 @@ public class Restaurant extends MoralUser { public Meal getMealByName(String name){ for(Meal m : listOfMeal){ - if(m.getName() == name){ + if(m.getName().toLowerCase().equals(name.toLowerCase())){ return m; } } @@ -110,7 +106,9 @@ public class Restaurant extends MoralUser { @Override public String toString() { - return "Restaurant =" + this.name; + return "\n***\nRestaurant " + this.name + ", mail : " + this.mail + ", tel : "+ this.phoneNumber +", position : " + this.adress + + "\nList of Dishs : " + this.getListOfDish() + + "\nList of Meals : " + this.getListOfMeal(); } @@ -216,7 +214,7 @@ public class Restaurant extends MoralUser { public void addMealOfTheWeek(MyFoodora foodora, String nameOfMeal){ for(Meal meal : listOfMeal){ - if(meal.getName() == nameOfMeal){ + if(meal.getName().toLowerCase().equals(nameOfMeal.toLowerCase())){ this.mealOfTheWeek.setMeal(meal); } } diff --git a/src/User/User.java b/src/User/User.java index 25be834..87b4743 100644 --- a/src/User/User.java +++ b/src/User/User.java @@ -1,11 +1,6 @@ package User; import Others.Adress; -import java.io.*; -import java.util.*; - -import Cli.Input; -import Core.MyFoodora; import Order.HistoricOrder; public abstract class User implements Comparable<User> { @@ -76,8 +71,7 @@ public abstract class User implements Comparable<User> { @Override public String toString() { - return "User [id=" + id + ", phoneNumber=" + phoneNumber + ", name=" + name + ", username=" + username - + ", mail=" + mail + ", password=" + password + ", adress=" + adress + ", activated=" + activated + "]"; + return this.name + ", mail : " + this.mail + ", phone : " + Long.toString(this.phoneNumber) + ", position : " + this.adress; } /** GETTER & SETTER **/ diff --git a/src/test/TestCli.java b/src/test/TestCli.java index 4b805a9..0b4a457 100644 --- a/src/test/TestCli.java +++ b/src/test/TestCli.java @@ -2,9 +2,47 @@ package test; import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import Cli.Clui; +import Cli.errorWrongFormatValue; +import Core.ActiveUserContext; +import Core.MyFoodora; +import Exception.ExceptionUnknownStartegyType; +import Others.Adress; +import User.Manager; + public class TestCli { + @Rule + public final ExpectedException exception = ExpectedException.none(); - + @Test + public void testClui() throws ExceptionUnknownStartegyType{ + MyFoodora foodora = null; + foodora = new MyFoodora(); + ActiveUserContext activeUser = new ActiveUserContext(foodora); + Clui clui = new Clui(foodora,activeUser); + Manager manager = new Manager(650588938, "ceo", "ceo", "ceo@centrale.supelec.fr", "123456789", new Adress(15.0, 10.0), true, "25/15/1955", "jacquo"); + foodora.addManager(manager); + clui.executeCommand("login ceo 123456789"); + assert(activeUser.getUser() == manager); + } + /* + @Test + public void testTokenWrongFormat() { + exception.expect(errorWrongFormatValue.class); + MyFoodora foodora = null; + foodora = new MyFoodora(); + ActiveUserContext activeUser = new ActiveUserContext(foodora); + Clui clui = new Clui(foodora,activeUser); + Manager manager = new Manager(650588938, "ceo", "ceo", "ceo@centrale.supelec.fr", "123456789", new Adress(15.0, 10.0), true, "25/15/1955", "jacquo"); + foodora.addManager(manager); + clui.executeCommand("login ceo 123456789"); + clui.executeCommand("registerCustomer 943684597 Jacques custo_jacques jacques@mail.fr jacques_pwd -9.8 23/02/1975"); + } + */ } diff --git a/src/test/TestItem.java b/src/test/TestItem.java index abe35bb..fc26484 100644 --- a/src/test/TestItem.java +++ b/src/test/TestItem.java @@ -64,10 +64,8 @@ public class TestItem { Dish dish3 = factory1.createDish("Dessert", "soupe", "glutenfree", 5); meal.addDish(dish); meal.addDish(dish2); - System.out.println("please type n"); meal.addDish(dish3); - assertTrue(meal.getPrice() == 10.0); - + assertTrue(meal.getPrice() == 10.5); } -- GitLab