From d531b575699c2666fc12a4a61696101ba8a6eda6 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 09:47:08 +0200 Subject: [PATCH 01/15] domain model and class diagram --- src/class-diagram.png | Bin 0 -> 36381 bytes src/domain-model.md | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/class-diagram.png create mode 100644 src/domain-model.md diff --git a/src/class-diagram.png b/src/class-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4d99e50ee205c2aa919c0c9fa22342e8a656e021 GIT binary patch literal 36381 zcmc${c|6o>_&%Pav>>fyPbHm0$TqT8Ds?RFA!~%PjV1dsBD7$NvM-gB7CSK*V~t5; zP-18pTSkn19mdT3o*9%%=X`$O&+Gg9{c(D|%9wf2^E~%;U-xz2*K_Wk)z#$O#J6e9 znl+rKPaQwMX3ZaF;J>&HY~WvF&HJ*}tnpuS`uNd{9wtL5`*cy9F%fz9HaU3PILoc$ z0k_wxMP5GpR&&ePEh&GwZJW=3jT|_lHg32V8h)bySFOtHkwt*Z+V?>lW}P}-S=`L3hAa= z_EmV+0GTv@X_(+TQ-;el&bPU}<=6(1w52PP3qNij>Yb zXVqvNln~DfvAk8n7WEicm3zd574x2S)nIqlEz7>?Y>AjOJ0e&u3qEN{W2@WqFH7@s`ZY`5yA^Bo^B1&1*_2B#mf+`ay!43ySF-s2;}MXRvE-4E z>~@3s@j`D7abYh3R}YVv(0^T)EWYfn@f>tb?g39s?yBG4)x>x0jsM-AnaG=QuiV6+ z7V&7t|Nhvx$~yep_GM-_p8ix(aa5+@?&603O~5`XiT`u)B-o(hSn@={F%g9tTqaCN z{7uMBFX=OQRAOo1iOG9;C9D4b`riHDKR%L`lo;W z!pld&W!mQd|3m$s3o~fdUhw62aes+qeD!JM0iSiULipp~qW$~k=bK>t+akW>#E%Ey zVuoJ-f56fI2S@uq5piezTX*%_ef1yV=nf10xyIfD?E}g};^+42$lV!b zNiM(12CgP0P9{h;wp*4dPw|4qv1 zPjqK>%WpHyh`W?E6UQDh?i}Ae7)wn#sMIszm#5_Vv`A1YyXqy2)>VVEq-JcPeeDk^ zgH$rFIynH`vv+n|H;z0_*CN zVvpm?#&ZqHr(N*I5^S1>OiMeA6#J~-%}61%-dK2RVq%=|ih?HBWpCCIsrpkcimcqk z4t+{tn_B3osx-YwM$U{!%0%15lyrHRG*>9Emt|FM_w(Z+6BRa@^oMmt~0{6{Bv7Yom-IXHD%}0nEJ&jnAQZUajAr$jY55i@W)Xg>;VMRbP>7#yG=2XBF^OQdqX*Pjc#S!mOGw zNhLPrZ+9&1`)bbtGEvMQ@@9WZu-l--(|7BIgoJ>@o#{xu?;(*M4}tEt5M|_qWrzf9 z0WplCj3Ar+@7gr_ba;=V3}LEh5DlM<7)j;lj9(9E#-Vj_zhA!(#E;Ll{%Xz{)DWIOJ2`_WGv?G^`@1z!r%$SPs?2?f#NtY4 z>Yq5u6j1W9{u^hfRszD`%{lBo~+SL);&n!N@wchCuhaW~aC*S1nQ!{!|NMWlz#XCZsP7z!5fAl969(q0Gr*Ngc{7wtJ*pRg z?QHp#yIUO~Ji5ce_98T-&1G>@N_4L!rClw-hChluPO2l+8wIu;S$RzC-1_zFYg_k! z&(AK?Nou}c&)DkZkJvhzbLtlgYT`>i+e!+s-4E6-=ESVyY^}b}6N$qWU!r)aIe?Y@ zg~lsEYdKnn*U!}1eSC$oYEUrKYgn77ZJk*V7HYr-PZ`L87X=TG9m@;pJC=(*BOTZ* z?_DuJq_mB0#@gb+Rq!;PSK|WFI7XB-lV{eVJ@tV@e|{I{nGH&5{V#-HNeWsXU?3$Y zJ)8`u;jjma(7wHaCsS?Ba&@9aCwJvK)KL!$AiZkjbgO7NY;~~XpY1IWoZUkvR)Xd` z5`UlUpsoI{d4G4KLs7A5Pfk0@nsiK*-Wb5@uFJc;F_x`PPJd=SX(a408}-KI7ye4x z+*K4?Iz&16y<+w5e@T(5Egbr-kJjaxxAA5llHuGH&ti+CemDec_wTlD(hdp}h09oA!p_|5-RAD>pfVTBr50%E%^M*&TFcvFD_f z%;ks`6(FEKZg>K6wA64h9#OLdn`HwTJ+Inv>1v3i-o3q&aQ962x|50ep^gX4es2jP)8XOx!#_Ha&kMP!s zDg``hXb1Y-W@fqlq{SO8Zx*X{;r7kwh}{^`bYzJ>`%Jc-CVY(xB=!=+Jg9{qeB-4VBA8l0`I`r(D(t)Jb`iAvY| zbc?73={1o8NXe+}c9aJ2!tI}RRUPDgV8J9s?`%)HK6>%9ohzrlqwSL~0@?fR%X2f$ zY9!q;B8OA~KM=M6>)_tsz(Q$+!Y01*e9FT{hyS%O`j|e0#=6qiq%}gdVS`RUUtIU|jol%<`AV!wa2fmc)sZoOts9HBV zKBxECRg@j5f*F5S?={WnC=!`bffI%d$oBsjv6Ze5fGXtY-hzGTIa%(2Vn5EgtAU~J z{6M5S=Gca~GHK&xzTE@XDN~_0;-9oPsOo)) zkY=}T=eYi9w@p$Gegb7}2Low{-Mv=nstD4>sjcR3(v{H|*v(z_52pDGjaa#hi^Xlz zSZt**L@MWV?U>{maMykT#f8hqsi~qRTWlc6 z9T12GyvXW6Y}-An^!D^iAf)fNTzV5`e*PQp*uMHB3E8qq*m;cgXBY8$rwi8A`M2dX zgvgp%yyes{kz9y%2#MLYgoVF-j^~{EbOGtmqS)u;nd2647M#C)>|{ZuRM*<*yt~$w z5p3zT>EZ}MwRS!fGZ&L z-|kwfD>`c9oyvLzN3SOVsF~s4bhV?{Rh*Yy*aD8Wxa!*{ZhD%LNm3bq!!}duWEpm1)Hp@ z9NG(=R{1I*VLHh3MIGW_?^WWs`f-il9ey*Tt3GvJK%hS#z1=*|!>I3;&UC zm=egjD=yiA?Jt+K-T0D!5ZgCN(YvG|TM2$IQQF6$QE9Nbdm~rOuCj6~Xpa<|=#R$w zA``n^%lE)CACfXTxwkn~eMpAK$)w{uCl0hC+}cMYJ#`(6?t3I+mWVr$I}bk4eF$%) zJ##4&;A}Ex7o)Rp?4>E}4)2;*NAE|3x5w;72yPwb*P+iHcG~Q8`rY(d)|xzq(ycV= z$VxO#$-GesqoQ^@)ve_@0&-KK_H6%CHi_#!?X6=RG4x&1M$q;zJ3H$)+}5#b{5ofw z_#9#Oo^bxplFYWQ(PtgsO4DqeD!*56%{+}x3`&U18OJ;m^1_<%rc>~n(5$oMTb zJG=B~L`+}6{sTq?Nkbpylsj(>I2tIM__MzTfYNcT3*)~FW)R4INW zp-$>}9)TSNdmg0zLhM_foNW%{S(aWFwv$(`;t%r{MSFcaz~? z=XEs7UTuJVIJq|LR4x@|G{!FOrB-SB#$H3FHT26&TX=O@dc2u(u-_rJ2Iy?fgSOHS zWlauq?NZjE)xrk1G3(3>o$=Q_yMuV*#Pu@wW#J-z30nrsRL1*H({6phZt16Y$IvwP zT}f3vIW&6b!uV*;SHwMD7xocMmPv(ke3Eqfr%2V_q)|u%S$kPq{Qq#91K2CJWt4e(Qr8{x54WR0R0?&-CL zy&#T*@2Jp1?uR)hb1JsVu_`R_#}KRX5$$$$H;L}iu#Bx#H7!5&gRG!XXH`ln8#kP=PLGuQCDR(+*^7*qJl^Y*$3~NDs_gbJ* zWqsCkjrLxr(+8O?NfUUEz6SkM8WJBOTdy zP&GWz%MA4^;0daq7vxZ;Ny)54L|W&rApEVYv&fTwTo`aOJPE4^!f&bTc|+m%`*b5( z(58Isy89p5%ILkgg%hO(<2fXfRbjiwb~{a|=)tQg389Y{d_^&9%kCiIdz?9AI&g(I z_N{!1n8L{A4<2H(6RVY16VrBM8@jGspN{)yNakByt`G_U-XvPEbLwxe^XIJ7KPdR^ z{I8@dkX~+c)+a1Y*g`Z@SgL0T87w~*#^g;_Dg}1~c%=4;jO=shC~hwO3HTdmLk$Xm z-d&r_&+^rIu5?*-w%r9wAF~fh=V|90gx+e#_WxeO0v8=NOA5c zk}>wVR`kW!7R@1QQ%{ME=ATu0OC7V$)xN{|#AO+Dnl&GoZ~8_n70fyph!F2ysj>y< z_$ru7SI*PvT#0hGrFw{=^(}$tO2O7Wm&F^8Clt)YckCbtFgt}6MkutWPQVrDW@eAg z4gZrCq1}zGV0H-Wn!OWn`(92H&6u?aVtB=BkLoIzk)PkLj895qko?2mGj^0t$96_F z_nBG7AxioVF10*>IE5>tP1}^8S_IRTZ}Y3VQ}1~fB;^Ypuz_g5S94^vI>D&S50z$} zNdBF{WHJ@YkI`g4g1`?{SkDm zuEAR~%)}kq!TA)v`vRja095VmJ-UC;cc1+RWw;yVnZ>DT_G^r`_r~vr*lw>MEJU|C zBe#)BNGnw#RXW5v;Qh@V+4t1t`jol(;R zA2{gy2nVgx&ikMatCio_Qxla%%r7p}7Gaq(7Oq0 zU30x$cgCt6)|z0F=s;^!qg7HyZAQH4?9}!bx)AUFvd=~|clUf*GYylv2hSM4%8(tOH1pj8?uKXr0UUq8%3Zi^rCk{S8uYG_mroJ-y; z(BgyL1-Q2C_DpfR@_EuI)Ub3sl-JMigPWBcKex| z7SWQ%HbTBrA7;wdaPkRpMSFJLTJL4yzf|A`8H;EAjCd>@68}gm*RVS zF1(chax9ovb6`9k=ow_x!$8oETA9g?@kwh<)FgdOzItr?LvL2D4Y)R}RiAY^$AG3^ z=F!vbupQV5feddSwz@23`v;Xd*OR@lcf9R7*d*F%!3z5)jlH*8nN8Rs&Q9^pM$!m-GerwgJ7JtCc7(-i$Dn%l#`iFAa#MzUrt9`^Uw2EXG|5(?Z4Jf9 zs16eZ=di;1PU*L9#~b2pgT11oH_YsvE(|_E*Qp`nAEBU@Go^xqW!M`6MJ{#o(dA!H zdN(xqRX?V}(I5GwjiSs?FD>ATE-a>)clIo6i*ZtU=~iUTOWT0Wz1{I-?jyDk$7uP8 zOWfQRlx0=}G-HqPV}lx*w}lm~MzAP%p@-gkXQ4gS82JJbXZUPfJWcy@t6k8SxX0bD zGyL-E8rOua@$omxy=0Bse605Wb;B*ia;TT7X&2f*%G_F~s!nA~A02{@c2!?vFLEVa zrkvz0GcmBA1Y%Ijt32xlNgEj4F#lirsce^`O zd8Fm=XaAgGtehEjdK!UKJ(+b8w!bvaxBcS0>kI7JPyUv(72E1d@(Zc&hR+a-PV9+g z(VF!(jslt~gKdHycjEGiR%6PBU>xcny|Y|3pT}wO9<6IbB}3HRWiPGMdk>BG-`zwE zAZAk!*!d);fFw?EC=0N^*Dh3#+paU@b0%-jbkL$rsyi1v$pYDp{KYN} z4IZpf_=4WtH!kJQi{pRHGU(R#^rLXxflYgD`v?eKOepw6DK&}3@H}fO2{cxI(tl$_ zsa8+E9+L4cJf~13*gbU3@)ky_cD#e@YEj-)uhZhO`X|eI>#QE z$&QaApgoEEro((oa58?jqLVpeCX@BHp&-yD5 zd*ejeb&t7Y=B32fMk5^YTa5hnl>Vauy`1IVc5fkCsJQRU9DZG&5piNix55dMXmon( z4#l(4Q(OPht?XwE;xKB~1HZ)GC2+)eyKp%VfG0@su4-sk zx})fOVXG0p1m533v&5vUKvZ^n3v?o2dTn&~7>{l~mc6C7ph7LWmq%}Skqq2O88~GP z+AJFM*;r$!RVSk2H@hpsxvOaBL;E9=D%nu0!g_LAfi-`2;nq$3$n3+L)aps{myS-# z5r-nji8Z-+b3X1~h|b^8)HKNbFIEvUvL{co@*lJi7Pcv`sX5=nCNV10U;*olAUX#M zr)_=;jv-S;U0L5s{=<^DkMnkw(RG(B-#~QHIr7(Rb&3o~f>w!@eaE1)itaN5SyE15 zXODc`7dyN`ovp4xaX4{kIA|OA0D{o$hsDUO1aPQ!S(W}o3ai=q=?_ctgEBrgHT38kNxxxX_>u++uM&)LNI5$!esnVxu1!E z^x8lBVw|O$tj0{zY(uMv9A-CU%>b>s@`+Xh26DhK-%?s;g4k$oJ$*hVe20j3i96eY=rkjK`SStcgvIp|B?uYwb1jRCjxkuvW6*{;GYjmuz)Li1+dr3sWD(w>iV= z!`5NkaTsTdii5$$XzIG76x<)%wXAM%#;65+`4PBA1Nfxrhs@nC&30`X2(%d4^AvSI zHjW)OfB)|1oJI7NB0XXjYi7~8cxruW0llSkE&pGKbA{w(QlNQS$)5AsTDdBn$$ z42}aBde1IZ(r8rVEb57hDp}Ffay418weFq12tMg^oN-xTHp-op)z5&QxHR{pvSv+5 ztVF2(uvMAk{ioSiSwY)?WqrKW?PbBp3gq7FOG32>XUrD7UqFwP)-#CKN>=l&8L`TjW&TXd_Q!;?R8V(>D(_#g>b>2y*3bQXS&`eWQcGTw zmObP><#90>%eN`vU;m~JM{@)uLn=f{`IY>UCFofC8yXMy=jr-h-F4T?Z@LVQGv|Al ziNk;Ob~XDzYrh-}=ZzH;nlNjM zJ6Ul3PuidB;80s00QBC=8M9LZO^oF5OS9S%>+cGk`Lp9-kYmv%y#E}YBS^0R-M4>U z_A(71aehrD=2Bq|2J3aT$fv5CU#?SsS`xNZPLNocU08C`>zsaG^7zmL*ONM_ooA4C zjvowWeV$WVq5gIA^LbvaaLH(U8|uWciv=#axU#>=?g9)|;TOIj2#tJ>_3vGSa!>xb>y=RZHH$+OaV6YA~rgoU3UvlU`y5be3S*uEhh;uAh{{5x_0 z`@|3zeT)kN^{C?S>E@2g7!R-?l47_7@H5Q(fDIP4yO=9$7H$@dmS5Ax8^4BRRK_xy zcku=*cRhJ+o`GQO{@P(Zboq?%!Cvd~^!2mvv}X<>MmF+gdwBPxO7vHriDMxhVz$f^ z^%!)AQ31e7)IfD|An|dQkL4t_lTJ05)#nz#k=`9efu3GlEgG3vx-~)$syffxYQl1g3 zl{I0kzkN~|Vs>g@rlYsxW}ztd7XBgY7N_+L@`YQf_`%bR3)9DEW^2Sv#_tgYM?Ewb z#;!A-r*(>^1XvhQH9?v3n)iC#$Ti8?vUNq5bZrbbk1jxuz6Nh`mIQ!-(W>{-#ol;vQ>Q*UdAw$fM)!RA_0s{<_~Ma)yKE1e^~emr(K^^?VMD_#sgve znOztpU1tQU&m0p4b@^L1Ml+E)JQ{92J}I?ODJ7RoY487>+)e!=rrx$NpG8-~*1+Ma z3Q;HQZD74%5F2SfdQ2@~0eR0L!m}>>jxxW%ORf1+y36&iJb?>FuEJWtRk^tk+2G{b zS-=!b;~tKW6?Z~~W47b`XeuEzJ%%iWK1?kYXF%TFUar}LDYMMrIS ztv>C_MVjH=8NBB(WGVnkZOc&}=l3+9l*nLd3exvv2XrFTEq(4GNv zQL~r3Gux2rsOOmln%LXRp0v4s`Mt-NjW(tp-9bdz+88?}3HO*?3?OEReG~o1y*?d2x2TsfELh97A|QX~ zvS1clCX8)*?&T`DI1mO_jXlS2Dn&Rf#8AJWh8=t|BV-)#E1VX_ufgGA&iNREK5FNJ z4j8pw8bSNe`{RRLERZk3&q z0(bABjl1W00AhPofY4kydYw;TbaR;c4H^xGS)h#3THyLhOqqrF^+G;F_kc0%Ha;mE zehR|{hO`HB^veb-#&T>^TmFI>o%0zp$I=h~ZZ%dseOs1KpZIW)zRORM_CI&Mfp5&9 z=giQNl6-p)G*;wIvcss1Sv{tPwmj25bRMV=%uYY}5)M04+3J=pa_$pW?MvMxMx*CE zs&Kr}K~0V6dCM5@+2@)Kq9t2yK(0y zXI*H3G<1fdgGE znu%&}6ahpr{Hm!-{>SCqNI1@o_9Y3F*aq6#|}LWF4u&Ar_*BK@4NR{w+*Mo2qwnu^$l zWUh#IUVnN^iGBqZzU#f5mELeD&tEp>*#xt>=E0B%gF_PNf+8zeg+h|`vKY6Td2;tO z!9lW1Ap1;F`rNLZ#O^`9Y#K*Q!!RO@uYNCbv@;azZ&^}QBULp;Su#tm^b&%jKD~9{ z(owG#J)lOe;Hs(OjCa8qY`@*Qo?WYf#V}(?^Fc?0 z(s~K>dDO3ovard0X?ShPV0nq8>ONxR0><0EfU)-1E&NN$QUBL!*YZYx;1BvC6n}Od zx=cTtI}h4)i~t5l_-`^?W#ZIN$hgWx{7N(G4?ZE|*RyxUlE6UHK8AJ!vLd|uUjiJ! zomlrI6FcQij958@kAhwupHyoNjWOy7kmI}a((M%}+?g{hc445*2>CXB_>0v8q&5X_ zk<09u7LN)L28@8W_x^utQv_XVApR*Z(oT&*vlrYDgk?c@wdH}c#Z;^t&eSUeCwiR4uFo9m9n2;Faf&SZ04?O5UgX^O_b!rRCJ!)s zdBIqiw%;FC>p!isVC9!nNJxoCVva=2XLhCq7986ZzBjGuL8Zl2A9^s$7`?v1tv$Ss zsmn28as{q8FO6Ain3UA(ul}kZ48`B-sHEG^Zb zK(@-iz_|#R3R&&v#aqOgajN{K+BVd(;*&`^lgu)p>ldrR3bbL0pWlvO^kDNcH518_ zd>f~^nA_u>@JlvFdGq!KMYG%NSJf4E`!O0k+(8 zk*I&SvM`Uu;vBsO2*lNX?z+Sd-QEFeL43$8p#IZ){XarDU(kb#C*iWh7{1AT0z=3E z=;!^yb6m+{{>pt2v0wR9HXLQ=l&#NmdoQ(jmfnhC z!v$Et(CirT^$wh^e}D4gEw(~GL->D!(h9!ETmZ&m{@_vtF{b%|nFNL&fJf{5<&Z^x zn|s>q*}VMo%R-2bw=+N{e^v}OAr_fq1fu3304An2eaU|YVrI0cKZ#fq#&5eEm#?RLcn)o{XoY^t zYf!^mcEot=wkJCYiX$=|d9O8=n+tYNeiecdW38`1OH6jiNb+al4zfZWyjvBj?%zYK zuP)#X>OX7(tyQov?G8iqqy2`^UlmfORHE%C8z)0IA=)yeGC%hoSZoRZoHSvl#k$J| zbf7i_>WDi6JVb)Pi0&5HTwgRY*{SWeBX8XfrAo^O74b>@_oIt$4xC4hH13oPWZQ-D zZV5-hTqmuve7G${XJLgYAU|gNMZe=<#e(he%W9}*}#qoHH3mZB= zUhsbGgyPR{g}exLIC%#&wizAlKT&XM{~38;3JS9G9f1+P9u$8od8p6niBC2S(mCv1u0q22aIkR9PPksoHimCK74xl$=049DmizG<3Z+p) zP;89o41A!IxZ*;DycA#A!Y0b%8vMr3JTt96R>xjaKkfyG2QeCEOl?_@Q-6%yYGJW_ zfx}{9-6KAq$wE<2B2$St7!_t~LXE@8W%=c2sndFn) zPgY;&)ar9{>HhS(&AZFZWxDRQLE^ZJnZ3oQ`p~%=2}p|(VYJ4m)L3$Eve^pe`sr(8 zE~Y?-r=~KwddI384sm}b35>wZAp$~nw-5OP-8)-SeY)s6C;M|M*(s~Yv9my(d!c&r0a5a)#%&6^MU$vjeO#SuXS#~bSKY7%e^<=wjfVUs zgkFoQ_m<<6;Z1%S7#MiXZacW@1tcHf%`V(Ho^OkbaJrmNU`XenD_R?xyalN$WvJ43m!y?NQp; zd10kbSF$-ieyjPSOxd-s zK>zfI#bx9#vrK|}>15*Ya|lD38p(mf7J9M1vmH2}Zg$h_Fxvex^8J}{$5^=Uki~F= z>B6(36Xyy!N(bTdiJfza*Lc%;`Zh!#B{t9(8n){d)@ezh9(4!-Sb{{|MZCBcKR!w6 zr2Fl)X~A3Bae;qYpKZ_Pm4qoM`r=6&3sG+`nMI8b*Jyx6{Mqpj)_`&neF2TYNY`w_k*-`^cabwmNt=@g%d!yF5{CrDKt7z61 zY1Y@zJ-JdbHwuE=s|i5mTs#7 zAPX#%Z}N4Q_`=I8QkjVtkKeGkRNTJSNHq^^s`z{Ju^x1EAogP;gbn%;)5D=Vax^V&)F(qd(9`kvXzfZ?Sgy zd4|zprM3kE9mU}-P4X8J@$4^#igk^zf94i%+guiEh|u3$IAZLxN-!kj@2s;{$Z%es&9TR(zO@PRltBV%&>@r_Nzl{#F6kKmg-e zIWV5t#db{#39~ast3j0u>W~$;^h6IDe?Dwhd%D&XRvdq55W6Kvhu!M&=aYZMI5}hb ztx_V;KC+MM?53F>v@wq(?f%nD7ut=kJZ9bz_K{C9!I2FGpat&0<0KU`ro6ait6iy{k1%UL>D4TRd;7`e#K=x_HCh&c=u zS6N?I6ajqF5)cwGuCU#$)j%PUwLm4fblQ9McdKiT_gVYr+s(35URl2;edNW_k7@w| zUK-oXd3e20xTTE$>&;L>kyA@{+i$lVje;@xxF5@#*V85_r71xT5jQR$q|{2t`}zJD z;^2wN{D0Uupr@YO^$m`X$ZQjH?(rFs;VC-QFy^wws3ARVsw6+M#;%jBCc!Ij2E@gm z?w0{Uv9L$7=Q!W)n$wVNwwdY_ftc-d>PD(Cc)dU3&_ zNgl`g{Y7ueP0&lGN&?H7X6bx(Ik0b@=@TRfsLC=}kWpP_{hsZBY|-B$0X z`5n^^oH6C{3RJFY427-^F)jY0jpE(bd>jzjCa^W}e#FlvMX|d=!|Kl(z-DY_I|_oZ zTGH`Ra=hU=Y!Z3cTh<;m2Ymf}_ILF6*u#_iNB*X>jCY=Uqy6#I44*W@ew-!|SPM@H zw*CRkn5o{aHeS@v1+7nJgR8^k%mfu8k;i;hkUL?I6ckva6b>c5$#DsVmiDWh9LPE%QRvgFKC-l)RDJ&z^FP1tJ*BboE;%4|NxuE-?TE|@ zto$K&8l!k;!Nn}C47y@Zqm9x_scoLZo?jl4-P5-yV=@d85f+w-y$3RN1k0T4e{G}u zBF{c2tQYcl;t4#yZ6!1LS@voR-CPhD6$k4GFPr+P_3cFE2W;)zk@4^D%&V5VZ9a?dfp74a7rF^*Nvxf%GetZ3nt}=}ha?kzov+S529_7E*FI@_Wwj3W% zsb`V><)+8>0YZP0cc$lbnrVlEiTad=`X?0-grNI~?VO6Mcxo4Z9$J?=133wJgUfRyRMU`%(GPue7bO38g+MtKQ@@I_n3;d-zVqcMg@nRcG|Uw{Ireno_PrS4+HQ zj4%06Nv2R(jpk+#6(gdS>HK-hWGA(wb2@4+Po0uiPtk)->($D{1RXgHD)u>i85Qp) z_*C48jS`Osbhs7AxQtS}V7+>teNDq+C%-}oAL=sP75V#Sz} zU)GG77h1X(&oVCAz({Yj6RD`cEOZThoMlI-$bpL zH)df%itgNx8ZD(nSQ3Ey4#8mRYR{pVZBl@RgEdT2mTfoe`8Yj%}_ zj3M0CH7id&4BevjY?-_@cK_ZQ|WtfM!>(rS=Z; zD&ucXoh)&$DQPawX|~BKYOEjY3Tti9E=t{tY=4!q|F!Y{MC`Guk2H>k?jX0K5o`Z8 z?%Dp${lOMg*8-i7yvp}ol+P}=bxuX|1DlQ#CC|5@wic_fjwEoi z-aZoAz}5iOi<{>p4*XF|SAUt2T7a?_hi*Hr1>p%FO z=y6z$MQQC#(tA0z*x|2{H+H1h-=Qbfba+V0;GH-eSw0HnGw${I6}wsmM>7a@?5}Na z9$}1|^$;XNy_=??g$#4SoD+POFP0{84wwsWV~@8^rRUXWdrr!#D1hf_^6!f)8FPXp zb=Ej0TG8vAi`pQNUY>@(t2y=Ggi@6`lk*(nyGQKxDA%EQO{Xy1Tux$lHVX+!!N=II z6}vXyduLU;hd(dP+Tyzqow&7DZVSU&;QJ;9dQG5Pd-EwmBRr@616$~@Mk)(NUVt>@ zKI3UCo6J?v0Gq-kcU0;Z9|UCYG;7ON6`rDDr<Q`8F|OIoR{4COx3u9e=NY$No}4uCPP#aea2)^9c1=pZMCaN$ zU(VTzg~Jd$w?kx`Wasf}yfndoj;iXFsPoC6b5)|UDDaFn@_*b73c#a<9lq?&JiF-J zUv4J6V%k*a7eX=LLgd(1V)*Yz7r!%6d*y~;y=C{mt7`F|QqgeloY)O@p z%@>p}-$`7THA~h%(k!%G{eGWrSyJSxr7nm>1*iqc{gP@Kcolq8pfVDNbUj+G7d zjn8~Q+t?`%+uGoI72l)gZ)&CKe>f+btK-D70vx+wnAgIw-z@z%9Ql_DiWm0t^P z`zc@8sbFkOP+pKQx>*}^U3j7PONE3!(bHje_K~rg_p42~1F04rlMj_|p-^j2!aBWV z@7T&eLRPO%E3>r-QQ8)b+l(SN&1${X4!3>K9uI?pyXZu_^V2JXpV)>ktUD2jpV;yO z`d5H$pe49rY_YK)8ybLqzjKOHf*ksI*%-i zuCu>?4A-hKyh)>TUiEJ89cJeJu5~WrY$~L8KVnaASY6Qi87v2m*ClUo3|oftuMRug z+R7;>hD!bGdQwe-uMDAG-_1~4)?#7A{GX#1+aPABlg$lwma`(C(KnHtH>!9{#{KN- z5bFlY$ob0CcgzvpUZ!PGA;wc%#+h35uEZ^WtEcJO?ejzYe&* z<~_vPLAk^JKA5vbElgl)SMrD-FZ2dn;a*Ia;e!i~inN2Lay)-e7fPd~_Q=RyLhoHT zaMmtv^$KkXzn((&{Z1GB9x)81=HH^>{>HKsiXybPV_i`vD>n9x{4>!j?f0yR?$MZ# zP=+g+6r77(2+6@~tLF~E#GO@ba`!A(NygpUKC>G7BN9}P_C@A)EQE2@+K=~}yPEjm zzfYlaqOY^MeUby?L?uZ$C2(JoVUR_?SM$&X9k(_kl$ZSB6|(ow8W3n^JK!l}Rb1%N zbHNXJ6TW=p?AG`AGq}$F&POeU+dQ0{@j?*NPUHGLyWKagEAz86b!^*+lr$ndoi2!e zFO7+%))^h2K0u$#-guM5nI%Z9`E1XHXj2i&!Uy_RPS>?gM)FTKXwH|+N>#?0_)nAb zLXc}fdA@R2f4nsl*e%yLu<+ZIJM%~lV{aD`*FfjbRXspnzhT9VmA{PQ&3YgZ3&zx6E^#A!e928V3GWY0w+tyaId!c%Ra(Vxj~@1m39(0?Nt(Td-(8KkdgZ{s zk->NZKfL|k0lT{Pcu(m54VKn{J;ABCPu2Z~a|Q`^tSuQB*-!q{==r=e#=Xthdl@o1 z*V_G0$m(}j>mz-2sTz3u13rGv7LxJ41gyeM3t-uZFI)$%+*?HoU>>ySl7r|Z7MC6M zW4E_5XToI-!A!WEafNfz%U1(obJNdd&8}XEn(a^K(d-6m$Q}*H3DZzTWy11ikA9bY zO%m86EMKzNYO|WFZK_LT4R*rq+mX<_qyBjHth=4HN48NZ%jEaTZ>U$&<Z&W_jryfFh@LIp}MSk=YO-8sn@`Bvg+T9DRdVjh5mXa zEg*}GJ59b-(4y!{#)WN*x3~UuIW2KeP)Y3M9ph`ODuc{Q1XKWo2e(^K1e=WhhW5pz zK~P)LwqR10YlxrfMC6y9<~I`FI=%g|d$7zcOzvE|BY0f+DCn1cZ$A78GArfaP0m5E z4^MycNiUajOYQl3Z`#7#q7c$_Mm4Le<i^T+m4`KTZTkWu*CNpB6%>^8wWZd|WD%k=J!-Fg zEh?{{t$;G5Qow7F!2l6L2(9;NRV=LoK@n1~3T=@Dv;s*8!78Fc!jNK^LPR7XB%BBY z0trd(K1qNC=xF`=_>b>=IcM*+*ZQsB8us2!UD>2DABT1?qE8ciPDTAf<$f40w3l{t zZ3LMNCa?PO3d(**oTR+PIj>c`Ku-ufez*sy|KJ70#Ak^8yGuSEh4+hG4t2lE)$O%d zuszL{Cyrq@XZ11>llR_Rd;|4X!rye=fgc(4QcgGG(32_oszYNJxYaT4mPI2+bzSU% zV+$O*_&NjZi8Uw!>ThcJ>F?lJQ6{rsOu?2;u?5~Wecm+9J|8yq!jBGi+CD6Jl=IG9 z*52;08HWJJE(pkU=m0nsucdnA93@WuBuIT_@@vH8*W*$5Hwh2Cm=LB-Sb&70-{(Kf zJ=A-|zB%jXIv4eQU7=}KGfh+m)!aY%=^U+xZ$d%8Xa!CyE*jT0c!ILn+*-K4>1G$M zC95uq3Rw*plkOy`Ie8N;grGrp^>d%z9A5_7 zL9bQMiuE^iZG!Y7+=hDKfSbL0u3^vR&!9p0@b}>G-SvA z@2}F@fLb$DupuW*c&c%+ zluuK?b{bgBzM8)&xY_DrAQEMge=Pn{_bzN`t$p%x;fu7-FrqiuE0WEGtyUqmf=dpY z)6 zu>)ie8(y2K7sCr_!z;DsrNoqkLs>U3?ZtxMxbkQvm-b>rcM~lnPm`>87jT2F6ccpw zj*IIJXY|MuH43H%9$JPRnI4mV^d^?=K45BvvqmV(5C7=YU=W z`d2%YWwEv*6TzUJQC8C;&_%c`f}Z;l z>-OG0peI1rA{Lk}`WY4R4@!dP!C1y5L=hAvvSO|>O2N+YCAWCvgD4-vD+SMfM!9{G zgDvwgo~R56(2aC!21i zH!qz+B99{b{4&D8BnxS{BAY$?$YioLxpYG^cNI;%l$Qb)c(gg(1;s&QfXWU6+pXyA zw+?YI7EEKfGz+itM+~Wl2LDHHBc#8lQ9uNKc|0u=Vr!H_x~BDJiROf+K(w=7g;YXG zuvCF{qUVDVq_8iuBl&jv(%E8ZRb;rt5wFJkReATUkfugTT>UaCaNNuZ1SJv1q6IPQ z2%x0ftf?H0YMl8ALe9^S)UUs|-ccb8 z)xv()LO6EP4JGY15$BmpT=-Ho*MDkC5O{u9H(|6K9?RhYQfx1b@A1+F@X@&@OT|}l zvkGpyeaLn}@uh|Ml@t@)aA>9v#l-R=0I??7nnu>x*cfX&Mc%?BY+zLQ6Ny9%?pxES zK7)gfH03P|LhM~sW`xL;_^D(Zo*QAZ;Yixl#PBUomRsiVN#2>Y zLGfy=B2NI$u10z=B9c5WClf}_ko50ML(sQ~37||HOK|BHa$7b8J5P$`dF!DrW6Q~I zAF|BzTem|94*#{_ZafshNKYAMa_TqoLE9skLvR@DO&(vPmOpIsNv?c+pr_u|G7pP0 z_J$kw1(V8>v8XSd==D0+c!&BXju^eC{4h8+oG?&zQuz{3bn^sm5IXO-|9DH}t&0(R zqkx;$+HvFQa7JP%0T-7Ze&bVl1@OVuIbeJRlcK0V_Bui}2aR22@dJP4mPy z0Jof0iA}RIbg}#H0Dr8X1s8s7%qd<=4Xs@Uh(Tp{w8`jPHQFY*p5+8wb3C=dRPZd) zk#DEmk@DL~>bF#)F?C+eXjBebwv*36ub3twV)D^=R%vo1GZR0$xSmt*8JG%y9cC5} z!%xw+h|~S=)2nP+3L;9XU@|Zd$NdF>Sy=NfOfQF9fR_PZ*d`fqy7wEcnFB;1^2(d)W&H z46lm^sGBNyNk|P2+w2gLnXnK)SyD2%~j;k>$om}=sophHjO~;Y7IyqqB5mhfXq=Fmv5xLVVivHCB|23MzzttTU8Od*y zr6W{II}TcjNlQyhEPXud*8#6N2Z1f}*c^nv-{I{yKE$gi`$0Dj*4SUd}$46<)LUb+xrbMC-{wif9AnY9*N zU>OMxfU+su+d{eLNq!YiE{@cDGg67YhMxYy%Ye}}0Q;%z?ze_P5Zr`dY!LQ(Iiy)F zfRVprHb!yC?=pxc*#}eVQz{Xql@uY(5qbNMS8bEZd>O_By!!+Bn3zj14k9`Fz(yc} zqYRjv|I`+$0T&cPPyF7+rk6g3tII#8;MU z(XT)7t7kIqKW;0=0U5AgRuyL8Awa4$k9g_0)fNBuT8si{fSUhL{DUmmy_oxOKa0qD>;25!)iuTi(2MDRGGyJGG>fpc(k=rIYWZ|qs8*kX18Ao=&Akfot@O(CJ z_s0#wm$QCYi5xFxen3cP_!mj1+WYJo9Jy>y9qcz}QV#2RTuP)AzC7+}6)=KwID-N6 zR=}}T;Ccr7nQ4**qPw2HO5fCcZK6Ue31t*;$^F2O=w0*VvQG`N62Rq0e!g8t{M-W4 z{~F2!oPj}959}A&$JW6)tBTRJV4@~hQjpes07Xj(#zqH1x#^`V?4l7tn}QcdhxF^;J?CVep>{ySL8=fXUHdp z`;OFa3`{NNjspvTm1$5X96AgC1qAd9WX`;2b4h0)wJ3iyr3%|2boFn-+_*dHjhyp2 z{I_IvZwJ1+V?cPqKzOaZnk*60C8n`ubmmq4*K&NFQ8;aOP@5X7Y#p*(nf<=z%Epr_+ssF=OYKiD8)b_R-10x@An2PD}(x?e6y zR}37iZV&J7=%A`9nR!FKeMlp;IARHH8wij!gL@{=m3 zQ-NFM@FujDpl1J_hmO-i@A%<1s9tEl?1th9BX2yRZV?;+LQyVKT^6ujO-@ZM7Z+y~ zcu*pvV)MgmWyc=SFP_RIvt9od>R@d--m1X=D;8-Zg zUPd=h@IT%^Vw>aN>D!5kuaReBOMO$p5hWd6IbE7htIU6h8%W66LBg`Yid1Zl4)(X( zyQenU5rOx^Hla1~&=j?1;w`d&E9F#vq~$PLC|F(T6c2H4sn=ANx_qKwY-bklASoXh z*o-5si*8ndwmjz-usU<|u;5HRYb_BgJzKZ7T(tK4kmjDAkE=p|=#+Qll8;2kM9*IoOD`9Cb2+lvub%^X^T8-G6H|1#WT)VOb{~<9V^# zQ1=<6Hj}X!%XTt;*#W`{QqQGyS#K{9HFD<5(AsgPw8?d3d3Tpv+JOqWeOXkKblO^g zVnhiG=yXoBL}0Tr-HO{wEp$a;DACDG>xznhvGn?8G;&+Jvi>~Hb$0G2CV>^StbhWl zkXrz>D8wK+!HYJ*5mj__+S*U(Wm!(ns6G#!m9(9YIL>F5`>Q@yaKx$&cwxOGcc7rA z*f9SASVTh2WK5K1sd=|K{_WOLZ@k(wu&@LKusb{2n(AcBH)bCxsy<2z$7lhy-C z)+gX3UiwTVpy4{}yKU;_C*M=s?Q(r{_mF4OgS|DF+2s5cdd8ANaTCiv{gL=eeJnJY zqI=U!e*b+CwBJ2y?)-^~18Lz2Iyith)I2U@p{0;lGF3wmI1jE9Y*uGREr!pnLn1W| zrncWIIV5$myd+XJ_(*u7Lk+k4$C!X?8D?q<=OAt*fuZbZ%B)a={h;inUf?beeyUqU zHOd72ZOILFKQYpADr`d+qCk#wK|!oni@BcAsW&{g95xE>frEa7pY8BK<`%G%M1ajP zuViyH7Sc%%F%{E2xA34fdne7(y4w96oBaL#5BI=g?-HC1SA_v6JDKUmk^Yk-tTE)d z$3Rl*F5o+xyMdr^JQEI5aQF)fzNvSnM6z6X!ihfRa<9BMA>fT!P53={c|Gftm1W3} zU_CKS6mJJrSh+!D1!52{0GvxK+b5>+(NJFj6=^q8!C(1s?3PyySa1G9tQT;=lWsNb zc(8GR!#{(1Np^prF9(Fh5G*c0fVHT{32Jt?o`$n7*ad*-V5UZs47^^{?KNfZ@~Gag zyIVj1X&L#SdGZ{N>7FL6@@5bX)fdfmAXa_f2;~;cRh4tHXXjt0yG7P?hlho2Cm@al zG+$2w{`zS(I@c$-lC_SmprTA1>{Jm&d`?jlKDx^6;Zc1F%m&b)Q&!m8Lse$LOn(-I z)4&y_PeI)LGloVqkBbYbU1nQ0d>)s{o9oph{%&?Tx^HS~>QNfkIgK2jzbkbN zbIa7rb=r1}sQ`c(2f&{bE#fku6pQWryuSac8TUOlQ>+D*%3KKuwabB5{<9$A`H8RX zy!AbU)Y}^irQV!7RF6-(rIIp6?#tw_uUv$GTQSj>V^fF&kbVGU;bwiJ9-q|}ux=UF z3P9-H-kxaT{2>;yUXp!#Axb(A5}rvbewhnbufk5($9$7PO14~N*)E%eSN}`ug&D$&AcHsi7=-H#kgszvAjWVD0|xniK@CV=H7~=Yq@*MsJT=o& zF{IjKGT(+4>KY_Xw3s2V|at0Gd(!Y=Oc>(;r|Bs#TlHWmn{vX6I B46*> accounts | Account createAccount(String) | if customer wants to create current account | return current account | +| | | | if customer wants to create savings account | return savings account | +| | | String generateStatement(Account) | always | return statement with transaction dates, amounts and balance | +| | | boolean withdrawFunds(Account, float amount) | if balance >= amount | return true and subtract amount from balance | +| | | | if balance < amount | return false | +| | | boolean depositFunds(Account, float amount) | if amount > 0 | add amount to balance and return true | +| | | | if amount < 0 | return false | +| ----------- | | | | | +| Account - | - float balance | String generateStatement (transactions) | always | return statement with transaction dates, amounts and balance | +| abstract | - List transactions | boolean withdrawFunds(float amount) | if balance >= amount | subtract amount from balance, create Transaction and add to transactions list, return true | +| | | | if balance < amount | return false | +| | | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | +| | | | if amount < 0 | return false | +| ----------- | | | | | +| Savings | -inherits methods and variables from Account | | | | +| ----------- | | | | | +| Current | -inherits methods and variables from Account | | | | +| ----------- | | | | | +| Transaction | -LocalDate date | String generateStatement() | always | return String transaction date, amount and balance | +| | - float amount | | | | +| | - float balance | | | | +| | -String accountType | | | | \ No newline at end of file From 258e3db18050029e457ab2b932ca780fb292acc6 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 09:59:52 +0200 Subject: [PATCH 02/15] update model, customer test --- src/class-diagram.png | Bin 36381 -> 0 bytes src/domain-model.md | 7 +++-- src/img.png | Bin 0 -> 35882 bytes .../java/com/booleanuk/core/Customer.java | 8 +++++ .../java/com/booleanuk/core/CustomerTest.java | 29 ++++++++++++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) delete mode 100644 src/class-diagram.png create mode 100644 src/img.png create mode 100644 src/main/java/com/booleanuk/core/Customer.java create mode 100644 src/test/java/com/booleanuk/core/CustomerTest.java diff --git a/src/class-diagram.png b/src/class-diagram.png deleted file mode 100644 index 4d99e50ee205c2aa919c0c9fa22342e8a656e021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36381 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 B46*> accounts | Account createAccount(String) | if customer wants to create current account | return current account | -| | | | if customer wants to create savings account | return savings account | +| Customer | List accounts | boolean createAccount(String) | if customer wants to create current account | add Account to accounts and return true | +| | | | if customer wants to create savings account | add Account to accounts and return true | | | | String generateStatement(Account) | always | return statement with transaction dates, amounts and balance | | | | boolean withdrawFunds(Account, float amount) | if balance >= amount | return true and subtract amount from balance | | | | | if balance < amount | return false | @@ -19,9 +19,10 @@ As a customer: | ----------- | | | | | | Account - | - float balance | String generateStatement (transactions) | always | return statement with transaction dates, amounts and balance | | abstract | - List transactions | boolean withdrawFunds(float amount) | if balance >= amount | subtract amount from balance, create Transaction and add to transactions list, return true | -| | | | if balance < amount | return false | +| | - final int AccountId | | if balance < amount | return false | | | | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | | | | | if amount < 0 | return false | +| | | int getId() | always | return accountID | | ----------- | | | | | | Savings | -inherits methods and variables from Account | | | | | ----------- | | | | | diff --git a/src/img.png b/src/img.png new file mode 100644 index 0000000000000000000000000000000000000000..8f02dbb690f8e16ac983817ebaad2656fe8095fd GIT binary patch literal 35882 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 Date: Wed, 13 Aug 2025 10:14:41 +0200 Subject: [PATCH 03/15] createAccount ok --- src/domain-model.md | 4 ++-- src/img.png | Bin 35882 -> 0 bytes src/img_1.png | Bin 0 -> 36867 bytes src/main/java/com/booleanuk/core/Account.java | 17 ++++++++++++++++ src/main/java/com/booleanuk/core/Current.java | 5 +++++ .../java/com/booleanuk/core/Customer.java | 19 ++++++++++++++++-- src/main/java/com/booleanuk/core/Savings.java | 6 ++++++ .../java/com/booleanuk/core/Transaction.java | 5 +++++ 8 files changed, 52 insertions(+), 4 deletions(-) delete mode 100644 src/img.png create mode 100644 src/img_1.png create mode 100644 src/main/java/com/booleanuk/core/Account.java create mode 100644 src/main/java/com/booleanuk/core/Current.java create mode 100644 src/main/java/com/booleanuk/core/Savings.java create mode 100644 src/main/java/com/booleanuk/core/Transaction.java diff --git a/src/domain-model.md b/src/domain-model.md index 839632b71..5bf73178b 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -19,8 +19,8 @@ As a customer: | ----------- | | | | | | Account - | - float balance | String generateStatement (transactions) | always | return statement with transaction dates, amounts and balance | | abstract | - List transactions | boolean withdrawFunds(float amount) | if balance >= amount | subtract amount from balance, create Transaction and add to transactions list, return true | -| | - final int AccountId | | if balance < amount | return false | -| | | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | +| | - static int nextId | | if balance < amount | return false | +| | - int accountId | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | | | | | if amount < 0 | return false | | | | int getId() | always | return accountID | | ----------- | | | | | diff --git a/src/img.png b/src/img.png deleted file mode 100644 index 8f02dbb690f8e16ac983817ebaad2656fe8095fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35882 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

kIQb=!;xWYVosC1$XT9FIv-05% z>F|zN_JcRvcJ+0vS;KFGil=c8)}seTS(s_xm;hR8$ue}kHrf+z=;?Ll+;`3qV%k#G zo*6i`M5>oG9-Hgf)p}#ewF_lXeRa|=S>(4lRW1%A56*o^Ck0}q90@97o@)0z!KjHZ z@v8Q)Ti>@Dx55==$Grhde|#SczrW!QLN`b&%K+V5UVY)*X3gStJ#}zXiNQ5bQ!ke* zZ#B3Xy4>*l<{ndV)o|`Q79TJ-TJQ9HN1^OtQroQ289)GZDC|hAR{t67@n^0F*nOMb zV!# zr-4^&sr)WG?nTQ7IIL^BA*>F4&&Sm2afYH@NEJ4u6tN}#5nmTwh>Tn5SZiMLMt58e)XqGo}yJmDKcplQ_A^G_}cJpzge+iy)T=d^nM zJD8`O9l$!KTGH~=&iuRp z&jhm5B_7p%zT{eUfExQ^gYjb zSILd)BiNrpnP1@Q-vSrC%&(^Nu4O!G)b!_OmmLH%3=1KFAz9uw2TU*VRoSUsKsa~7t5_ATahqaIBR9<^l$jK? zZX3z-A|f?(Bcs=~jP+Hbw3@>~RCzSq$&c=9T9+tW%v9elXNAx^(1Ex?Y!bLulvquR zn)VPl@ z-grhA*w3NNwZLvz_O3;2kil616M+33Ab%9QX}ZaI6no=ow%T)2*W{Hk-KLQz1%cVL zl(BMlF>4$~EH+1y`8QqD$jC@-rMG!)zlZa|Rz53frM9ASb0P_)V7-A#Wg~mvgadVf!Pn*uUUftDR7=0faD3&sl^^|Bs=qNY;Lk4xYA%UnlVRRI9iu1?r zk332=G|H732Dt|2XROQ3qOyo1V+{iE4S@<#+)56Lj-{{@w5oz-I+;rzNKh z$b!8fHzAr?N)LE#Z~`5FAxgg54`USgjgMNvI+k+FmQ#2ktl4X7aRY_xL>EGuRqL-IV?9TFuKZTM8gaW0(??%nSwc{YI2GMO6y*;+p- zxhaO-v{WasjbS)|k63J1ssDN_d<8To)p@OXB{`XW5|j;y3Q$rf1Vrt5u6L)nZ!oMH zhol9->GlHPrjVcrEBiUPw6wJN*t2F;0C22i5QRcv-CSK4kbyYZXmAM@5fmL3%}E>l zM*XFqRMVlGH^rf|9smb_2w*jLLNyJVj$jHB1v>ymI}gFdUf}8<*&0mo8$b>I2tcYp z9QCif%WAg6Y%y{+5o5tOG{_6cAB%Hyb43TIdi)bgS~Q=Y1@l9Ex*c~53;q`J`AI=V zet)HH5WK7fJ1ay#!LG6WF54-F58h2}>7 z9KF5GB9Ta<)2B}#{ZI23Q*k4(TT?s{_9?K7@_QZVv90KC$g*F4H;*bpiD2ev{)bW; zd7Tu2ClSwJiDg|N<^~>h0uDeyIOI~zPSI>br$*iXP7b4pt7%95SLnmD;0Mi*=l*Or z4M0FhadOE4%`(aSKyJ_MG)*YTCNc#2z;Jlgo=ls!E?ny#*{pP0ShNLV0l1kgCCEvZ-3 zu+!UqR2@rU^C6~V66^;k4@J9}(G(n-jt%8Q5(9*3HiwULei;}~W$vC0RR5aaI;UO3 z532$y1RB}Ez`#!-_3Y~EYEztG=JFuFLF_{iH5lFFq3)v%>q`dd0u7ipM6LjDBEQYZ zlJqPu5&<_9AU`z81=XLF`04vU6!HCxsfVCG2S?GY7x!L?oHfgyvvt#Z|KkmZ!>j1I zYPH&gR{;F?1NjX`Vd|qFYa;=s7om0Qwh&GQ7L*paET@Xn&lV$s6k?g$#~tUx4Ya{7 z#4BWjgCI>T?8|qtB1l)_3B2s|qY*ck`f>yF9)*sC4t*KcG}c~6Z8b5GCWh`@J_||T zyB!~XxY(ppb6xpdsqgHB9KpkJF{{1&byo^_zVYD#&|c36@G@a)pa`~K;Xz18E0wQS0fc_iZ?XOoD+jP z)7GNaQ%D7ky{RmCk2)_|zeIEeFKmImuEK$l#{i&gZTG%)V7Z}cs`So(k?$LrTWc>W zfvJ@E`bY+0HlFZ@&h*+_n^!N-s7R}jiPMKAVKmPy35uIMrs0Z=*BLKV?CFb3sN}PH zzmW})lmAXeIHE)7iOXSW-brp~qpM=L8ex2s?AJoc6otB|PCTalvc zm!!O5Vu(&`ya0v76Rcc0ivvfBJbC9hPD|4R9%|;+D;&Qjs1DaVUeTQXXjNpKYLVFW z<2Xcb?i~5v1mt3|@K&%izwGhG8+yPY1gB~3-yD^{j=&P>YO?Si>_A)XE)}K{7V0?i z*>I%&GV0rTA|0wY-YUq!USi!8U=;1f_lKI~A)VuweK}P=ii}+y#=C5T7A~a*cL|nKE4i;%ipw!pAXCjmjC`Zq`ft8Rq`Kv<9Cj$qkauzcR z9k(Kdh3W4wv{dRMXsp?qrov%+?ptiVG#`%K+Uc-o?kePuOGsq~G+ndkA{!?Prx!ai zehjyB@sYu2QaVZNY9OTW_|EbE8n$}4ue&a;=z*gX4Wq~ybZb(d7K-AKF>TtMvQ9Pe z7OoXnzY$-;adOKiC_Ct<1q#@k!#SmOIEgDVkm8%jUC>64-{H$uVuqU*PO@{S99Za3 z`p$-7#{RZ>yxr8csJR2%XZovENEJ0huuApH6-NLxqR^?95yw0Y`zYR~WvMtwp`U)1 z_Py{=hsWuBF3_j{)mHVcV2y=VK-+G3Jl&|*YBxapVbb^b4^lCi^Le`$@Y)_PO%lfV zRk1d|x%?4b@tP^iVM-wgt5cm5FpoVVt}`4OX561q!X?gAM*S?C8~6Ndliwf(qwmmnAf-qQ-p7(v%sut=!w0_MWD;_ITjm;K**=JvdTfC)k|! zy1sqm3Cznf4Tto$iRXh7OhEL={zpLK$GMpou3|Fz_h#4@AkE|ff&;L4Pf)7JI_mk~ z=f|!7cE!u|x)q8_eKnK0p=x(R92Sc$VWTFj5{Q3XBoxkAj7}I`SjpvId%bTiA2dBl zc_@a&-GSDrzYI%r?QpxfX2BSHJGZ2guMdMyJHHcKD*8W;qzHrd-mutW1PnNYK8chX~Z4fl*l^ zSEqy<`cHh;?6};QYw^s!X78wQjC8W|<$_P3=-Cr)!jh|S0QeVD_&TaPVoMnK-is3Z z)fXpfV&TWEOa@@*mO67XFFcIBG4yRpx?~!(2?h!l<+2aR_OeWnpV?U*F`1HD8v&B2 zm_77AW|#doKenP^fNjY9pZRAqEWO(yGc;K7bB!kfN1Hhx5Oh^E zAR;!cH9bD;9!O35CjPxR9;+gLdwn9A3_-Z_fTCOC4EVa=$AV0Co93l_>No$t`T5<< zk5bu`&6%|}ash!Jp;2MhMm9m{FgNcX86g6IQJ0(jW(iTEOyw&T0(_BQSd1mr(^&$q zf1Cd?f1$lF)^AH-VJTjzPAj;jL|Yz^Z@)8Zz5;5XMulPH}Bj;et++g F{{!aQtLp#& literal 0 HcmV?d00001 diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java new file mode 100644 index 000000000..6dcc9d67b --- /dev/null +++ b/src/main/java/com/booleanuk/core/Account.java @@ -0,0 +1,17 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Account { + private float balance; + private List transactions; + private static int nextId = 0; + private int accountId; + + public Account(){ + this.balance = 0; + this.transactions = new ArrayList<>(); + this.accountId = nextId++; + } +} diff --git a/src/main/java/com/booleanuk/core/Current.java b/src/main/java/com/booleanuk/core/Current.java new file mode 100644 index 000000000..446c55fde --- /dev/null +++ b/src/main/java/com/booleanuk/core/Current.java @@ -0,0 +1,5 @@ +package com.booleanuk.core; + +public class Current extends Account { + +} diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 8f8967656..b6cab1094 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -1,8 +1,23 @@ package com.booleanuk.core; +import java.util.ArrayList; +import java.util.List; + public class Customer { + private List accounts; - public Boolean createAccount(String type) { - return null; + public Customer(){ + this.accounts = new ArrayList<>(); + } + public boolean createAccount(String type) { + String accountType = type.toUpperCase(); + if(accountType.equals("SAVINGS")){ + accounts.add(new Savings()); + return true; + } else if (accountType.equals("CURRENT")) { + accounts.add(new Current()); + return true; + } + return false; } } diff --git a/src/main/java/com/booleanuk/core/Savings.java b/src/main/java/com/booleanuk/core/Savings.java new file mode 100644 index 000000000..07672a64d --- /dev/null +++ b/src/main/java/com/booleanuk/core/Savings.java @@ -0,0 +1,6 @@ +package com.booleanuk.core; + +public class Savings extends Account{ + + +} diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java new file mode 100644 index 000000000..5ce3bf305 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -0,0 +1,5 @@ +package com.booleanuk.core; + +public class Transaction { + +} From 263926601017e43e6465a6eadb7adde6decdd1c4 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 10:26:25 +0200 Subject: [PATCH 04/15] depositFundsTest --- src/domain-model.md | 50 +++++++++---------- src/main/java/com/booleanuk/core/Account.java | 4 ++ .../java/com/booleanuk/core/Customer.java | 6 +++ .../java/com/booleanuk/core/AccountTest.java | 35 +++++++++++++ .../java/com/booleanuk/core/CustomerTest.java | 19 +++++++ 5 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/AccountTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 5bf73178b..4738862a7 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -7,28 +7,28 @@ As a customer: - I want to deposit and withdraw funds. -| Classes | Instance variables | Methods | Scenario | Output | -|-------------|----------------------------------------------|----------------------------------------------|---------------------------------------------|--------------------------------------------------------------------------------------------| -| Customer | List accounts | boolean createAccount(String) | if customer wants to create current account | add Account to accounts and return true | -| | | | if customer wants to create savings account | add Account to accounts and return true | -| | | String generateStatement(Account) | always | return statement with transaction dates, amounts and balance | -| | | boolean withdrawFunds(Account, float amount) | if balance >= amount | return true and subtract amount from balance | -| | | | if balance < amount | return false | -| | | boolean depositFunds(Account, float amount) | if amount > 0 | add amount to balance and return true | -| | | | if amount < 0 | return false | -| ----------- | | | | | -| Account - | - float balance | String generateStatement (transactions) | always | return statement with transaction dates, amounts and balance | -| abstract | - List transactions | boolean withdrawFunds(float amount) | if balance >= amount | subtract amount from balance, create Transaction and add to transactions list, return true | -| | - static int nextId | | if balance < amount | return false | -| | - int accountId | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | -| | | | if amount < 0 | return false | -| | | int getId() | always | return accountID | -| ----------- | | | | | -| Savings | -inherits methods and variables from Account | | | | -| ----------- | | | | | -| Current | -inherits methods and variables from Account | | | | -| ----------- | | | | | -| Transaction | -LocalDate date | String generateStatement() | always | return String transaction date, amount and balance | -| | - float amount | | | | -| | - float balance | | | | -| | -String accountType | | | | \ No newline at end of file +| Classes | Instance variables | Methods | Scenario | Output | +|-------------|----------------------------------------------|----------------------------------------------------|---------------------------------------------|--------------------------------------------------------------------------------------------| +| Customer | List accounts | boolean createAccount(String) | if customer wants to create current account | add Account to accounts and return true | +| | | | if customer wants to create savings account | add Account to accounts and return true | +| | | String generateStatement(int accountId) | always | return statement with transaction dates, amounts and balance | +| | | boolean withdrawFunds(int accountId, float amount) | if balance >= amount | return true and subtract amount from balance | +| | | | if balance < amount | return false | +| | | boolean depositFunds(int accountId, float amount) | if amount > 0 | add amount to balance and return true | +| | | | if amount < 0 | return false | +| ----------- | | | | | +| Account - | - float balance | String generateStatement (transactions) | always | return statement with transaction dates, amounts and balance | +| abstract | - List transactions | boolean withdrawFunds(float amount) | if balance >= amount | subtract amount from balance, create Transaction and add to transactions list, return true | +| | - static int nextId | | if balance < amount | return false | +| | - int accountId | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | +| | | | if amount < 0 | return false | +| | | int getId() | always | return accountID | +| ----------- | | | | | +| Savings | -inherits methods and variables from Account | | | | +| ----------- | | | | | +| Current | -inherits methods and variables from Account | | | | +| ----------- | | | | | +| Transaction | -LocalDate date | String generateStatement() | always | return String transaction date, amount and balance | +| | - float amount | | | | +| | - float balance | | | | +| | -String accountType | | | | \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 6dcc9d67b..a992cd570 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -14,4 +14,8 @@ public Account(){ this.transactions = new ArrayList<>(); this.accountId = nextId++; } + + public Boolean depositFunds(float amount) { + return null; + } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index b6cab1094..03dba12f6 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -9,6 +9,7 @@ public class Customer { public Customer(){ this.accounts = new ArrayList<>(); } + public boolean createAccount(String type) { String accountType = type.toUpperCase(); if(accountType.equals("SAVINGS")){ @@ -20,4 +21,9 @@ public boolean createAccount(String type) { } return false; } + + + public Boolean depositFunds(int accountId, int i) { + return null; + } } diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java new file mode 100644 index 000000000..6f86a7975 --- /dev/null +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class AccountTest { + + @Test + public void depositFundsOk(){ + Account savings = new Savings(); + Account current = new Current(); + + Assertions.assertTrue(savings.depositFunds(100)); + Assertions.assertTrue(savings.depositFunds(1)); + Assertions.assertTrue(savings.depositFunds(100.10F)); + Assertions.assertTrue(current.depositFunds(100)); + Assertions.assertTrue(current.depositFunds(1235678)); + Assertions.assertTrue(current.depositFunds(100.10F)); + } + + @Test + public void depositFundsNotOk(){ + Account current = new Current(); + Account savings = new Savings(); + + Assertions.assertFalse(current.depositFunds(0)); + Assertions.assertFalse(current.depositFunds(-10)); + Assertions.assertFalse(current.depositFunds(-1)); + Assertions.assertFalse(savings.depositFunds(0)); + Assertions.assertFalse(savings.depositFunds(-10)); + Assertions.assertFalse(savings.depositFunds(-1)); + + + } +} diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index fad890068..a28c8e8f0 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -26,4 +26,23 @@ public void createAccountNotOk(){ Assertions.assertFalse(customer.createAccount("123")); } + @Test + public void depositFundsOk(){ + Customer customer = new Customer(); + customer.createAccount("savings"); + customer.createAccount("current"); + + Assertions.assertTrue(customer.depositFunds(1, 100)); + Assertions.assertTrue(customer.depositFunds(2, 100000)); + } + + @Test + public void depositFundsNotOk(){ + Customer customer = new Customer(); + customer.createAccount("savings"); + customer.createAccount("current"); + Assertions.assertFalse(customer.depositFunds(1, -100)); + Assertions.assertFalse(customer.depositFunds(2, 0)); + } + } From 404dc228a5694a3c7238d9a3d5bab38ab82eed0e Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 10:45:28 +0200 Subject: [PATCH 05/15] depositFundsOk --- src/main/java/com/booleanuk/core/Account.java | 13 +++++++++++-- src/main/java/com/booleanuk/core/Customer.java | 12 ++++++++++-- src/main/java/com/booleanuk/core/Savings.java | 1 - src/main/java/com/booleanuk/core/Transaction.java | 12 ++++++++++++ src/test/java/com/booleanuk/core/AccountTest.java | 2 +- src/test/java/com/booleanuk/core/CustomerTest.java | 8 ++++---- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index a992cd570..bd9260737 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -1,5 +1,6 @@ package com.booleanuk.core; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -15,7 +16,15 @@ public Account(){ this.accountId = nextId++; } - public Boolean depositFunds(float amount) { - return null; + public boolean depositFunds(float amount) { + if (amount > 0){ + balance += amount; + transactions.add(new Transaction(LocalDate.now(),this.balance, amount, "credit")); + return true; + } return false; + } + + public int getId() { + return this.accountId; } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 03dba12f6..fb6680bf9 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -23,7 +23,15 @@ public boolean createAccount(String type) { } - public Boolean depositFunds(int accountId, int i) { - return null; + public boolean depositFunds(int accountId, float amount) { + if (!accounts.isEmpty() && amount > 0) { + for (Account account : accounts) { + if (account.getId() == accountId) { + account.depositFunds(amount); + return true; + } + } + } + return false; } } diff --git a/src/main/java/com/booleanuk/core/Savings.java b/src/main/java/com/booleanuk/core/Savings.java index 07672a64d..9f0e18a68 100644 --- a/src/main/java/com/booleanuk/core/Savings.java +++ b/src/main/java/com/booleanuk/core/Savings.java @@ -2,5 +2,4 @@ public class Savings extends Account{ - } diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index 5ce3bf305..6880496bf 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -1,5 +1,17 @@ package com.booleanuk.core; +import java.time.LocalDate; + public class Transaction { + private LocalDate date; + private float balance; + private float amount; + private String type; + public Transaction(LocalDate now, float balance, float amount, String type) { + this.date = now; + this.balance = balance; + this.amount = amount; + this.type = type; + } } diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index 6f86a7975..1cfdbf922 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -11,7 +11,7 @@ public void depositFundsOk(){ Account current = new Current(); Assertions.assertTrue(savings.depositFunds(100)); - Assertions.assertTrue(savings.depositFunds(1)); + Assertions.assertTrue(savings.depositFunds(1 )); Assertions.assertTrue(savings.depositFunds(100.10F)); Assertions.assertTrue(current.depositFunds(100)); Assertions.assertTrue(current.depositFunds(1235678)); diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index a28c8e8f0..60ee31af7 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -32,8 +32,8 @@ public void depositFundsOk(){ customer.createAccount("savings"); customer.createAccount("current"); - Assertions.assertTrue(customer.depositFunds(1, 100)); - Assertions.assertTrue(customer.depositFunds(2, 100000)); + Assertions.assertTrue(customer.depositFunds(0, 100)); + Assertions.assertTrue(customer.depositFunds(1, 100000)); } @Test @@ -41,8 +41,8 @@ public void depositFundsNotOk(){ Customer customer = new Customer(); customer.createAccount("savings"); customer.createAccount("current"); - Assertions.assertFalse(customer.depositFunds(1, -100)); - Assertions.assertFalse(customer.depositFunds(2, 0)); + Assertions.assertFalse(customer.depositFunds(0, -100)); + Assertions.assertFalse(customer.depositFunds(1, 0)); } } From 8cf0b5766bd674ae1fff6b172e63763918ff8b9b Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 10:56:00 +0200 Subject: [PATCH 06/15] withdrawFunds Test --- src/main/java/com/booleanuk/core/Account.java | 4 +++ .../java/com/booleanuk/core/Customer.java | 7 ++-- .../java/com/booleanuk/core/AccountTest.java | 35 +++++++++++++++++++ .../java/com/booleanuk/core/CustomerTest.java | 23 ++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index bd9260737..acb4b5472 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -27,4 +27,8 @@ public boolean depositFunds(float amount) { public int getId() { return this.accountId; } + + public Boolean withdrawFunds(float amount) { + return null; + } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index fb6680bf9..bc4e4a45b 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -27,11 +27,14 @@ public boolean depositFunds(int accountId, float amount) { if (!accounts.isEmpty() && amount > 0) { for (Account account : accounts) { if (account.getId() == accountId) { - account.depositFunds(amount); - return true; + return account.depositFunds(amount); } } } return false; } + + public Boolean withdrawFunds(int accountId, float amount) { + return null; + } } diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index 1cfdbf922..30e36d26a 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -29,6 +29,41 @@ public void depositFundsNotOk(){ Assertions.assertFalse(savings.depositFunds(0)); Assertions.assertFalse(savings.depositFunds(-10)); Assertions.assertFalse(savings.depositFunds(-1)); + } + + @Test + public void withdrawFundsOk(){ + Account current = new Current(); + Account savings = new Savings(); + current.depositFunds(1000000); + savings.depositFunds(1000000); + + Assertions.assertTrue(current.withdrawFunds(1)); + Assertions.assertTrue(current.withdrawFunds(5000)); + Assertions.assertTrue(current.withdrawFunds(1123423)); + Assertions.assertTrue(current.withdrawFunds(1.123F)); + Assertions.assertTrue(current.withdrawFunds(100F)); + Assertions.assertTrue(current.withdrawFunds(9876.1234F)); + Assertions.assertTrue(current.withdrawFunds(24)); + + Assertions.assertTrue(savings.withdrawFunds(1)); + Assertions.assertTrue(savings.withdrawFunds(5000)); + Assertions.assertTrue(savings.withdrawFunds(1123423)); + Assertions.assertTrue(savings.withdrawFunds(1.123F)); + Assertions.assertTrue(savings.withdrawFunds(100F)); + Assertions.assertTrue(savings.withdrawFunds(9876.1234F)); + Assertions.assertTrue(savings.withdrawFunds(24)); + } + + @Test + public void withdrawFundsNotOk(){ + Account current = new Current(); + Account savings = new Savings(); + + Assertions.assertFalse(current.withdrawFunds(0)); + Assertions.assertFalse(current.withdrawFunds(-10)); + Assertions.assertFalse(savings.withdrawFunds(0)); + Assertions.assertFalse(current.withdrawFunds(-1)); } diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 60ee31af7..b30d37b4a 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -45,4 +45,27 @@ public void depositFundsNotOk(){ Assertions.assertFalse(customer.depositFunds(1, 0)); } + @Test + public void withdrawFundsOk(){ + Customer customer = new Customer(); + customer.createAccount("savings"); + customer.depositFunds(0, 100); + + Assertions.assertTrue(customer.withdrawFunds(0, 10)); + Assertions.assertTrue(customer.withdrawFunds(0, 20)); + Assertions.assertTrue(customer.withdrawFunds(0, 40)); + Assertions.assertTrue(customer.withdrawFunds(0, 1)); + } + + @Test + public void withdrawFundsNotOk(){ + Customer customer = new Customer(); + customer.createAccount("savings"); + + Assertions.assertFalse(customer.withdrawFunds(0,100)); + customer.depositFunds(0, 100); + Assertions.assertFalse(customer.withdrawFunds(0,101)); + + } + } From 50f98f3dd7e2a681ffdf7990482262aefeb280ad Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 11:18:09 +0200 Subject: [PATCH 07/15] withdrawFunds ok --- src/main/java/com/booleanuk/core/Account.java | 10 +++++++--- .../java/com/booleanuk/core/Customer.java | 19 ++++++++++++++++--- .../java/com/booleanuk/core/AccountTest.java | 4 ++-- .../java/com/booleanuk/core/CustomerTest.java | 16 ++++++++-------- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index acb4b5472..4d1095df1 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -18,7 +18,7 @@ public Account(){ public boolean depositFunds(float amount) { if (amount > 0){ - balance += amount; + this.balance += amount; transactions.add(new Transaction(LocalDate.now(),this.balance, amount, "credit")); return true; } return false; @@ -28,7 +28,11 @@ public int getId() { return this.accountId; } - public Boolean withdrawFunds(float amount) { - return null; + public boolean withdrawFunds(float amount) { + if (amount > 0 && amount <= this.balance){ + this.balance -= amount; + transactions.add(new Transaction(LocalDate.now(),this.balance, amount, "debit")); + return true; + } return false; } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index bc4e4a45b..71404904a 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -27,14 +27,27 @@ public boolean depositFunds(int accountId, float amount) { if (!accounts.isEmpty() && amount > 0) { for (Account account : accounts) { if (account.getId() == accountId) { - return account.depositFunds(amount); + account.depositFunds(amount); + return true; } } } return false; } - public Boolean withdrawFunds(int accountId, float amount) { - return null; + public boolean withdrawFunds(int accountId, float amount) { + if (!accounts.isEmpty() && amount > 0) { + for (Account account : accounts) { + if (account.getId() == accountId) { + account.withdrawFunds(amount); + return true; + } + } + } + return false; + } + + public String generateStatement(int accountId) { + return ""; } } diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index 30e36d26a..57166575b 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -35,8 +35,8 @@ public void depositFundsNotOk(){ public void withdrawFundsOk(){ Account current = new Current(); Account savings = new Savings(); - current.depositFunds(1000000); - savings.depositFunds(1000000); + current.depositFunds(1000000000); + savings.depositFunds(1000000000); Assertions.assertTrue(current.withdrawFunds(1)); Assertions.assertTrue(current.withdrawFunds(5000)); diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index b30d37b4a..6aa0f2957 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -47,14 +47,15 @@ public void depositFundsNotOk(){ @Test public void withdrawFundsOk(){ - Customer customer = new Customer(); - customer.createAccount("savings"); - customer.depositFunds(0, 100); + Customer customer1 = new Customer(); + customer1.createAccount("savings"); + customer1.createAccount("current"); + customer1.depositFunds(1, 100); - Assertions.assertTrue(customer.withdrawFunds(0, 10)); - Assertions.assertTrue(customer.withdrawFunds(0, 20)); - Assertions.assertTrue(customer.withdrawFunds(0, 40)); - Assertions.assertTrue(customer.withdrawFunds(0, 1)); + Assertions.assertTrue(customer1.withdrawFunds(1, 10)); + Assertions.assertTrue(customer1.withdrawFunds(1, 20)); + Assertions.assertTrue(customer1.withdrawFunds(1, 40)); + Assertions.assertTrue(customer1.withdrawFunds(1, 1)); } @Test @@ -65,7 +66,6 @@ public void withdrawFundsNotOk(){ Assertions.assertFalse(customer.withdrawFunds(0,100)); customer.depositFunds(0, 100); Assertions.assertFalse(customer.withdrawFunds(0,101)); - } } From 95db9559a65bb3939dbd0b11f5ba463f374ca8a8 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 11:45:54 +0200 Subject: [PATCH 08/15] Fixed withdrawFunds Test --- .../java/com/booleanuk/core/CustomerTest.java | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 6aa0f2957..ea8e17f75 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.List; + public class CustomerTest { @Test @@ -31,9 +33,10 @@ public void depositFundsOk(){ Customer customer = new Customer(); customer.createAccount("savings"); customer.createAccount("current"); + List accounts = customer.getAccounts(); - Assertions.assertTrue(customer.depositFunds(0, 100)); - Assertions.assertTrue(customer.depositFunds(1, 100000)); + Assertions.assertTrue(customer.depositFunds(accounts.get(0).getId(), 100)); + Assertions.assertTrue(customer.depositFunds(accounts.get(1).getId(), 100000)); } @Test @@ -41,31 +44,35 @@ public void depositFundsNotOk(){ Customer customer = new Customer(); customer.createAccount("savings"); customer.createAccount("current"); - Assertions.assertFalse(customer.depositFunds(0, -100)); - Assertions.assertFalse(customer.depositFunds(1, 0)); + List accounts = customer.getAccounts(); + + Assertions.assertFalse(customer.depositFunds(accounts.get(0).getId(), -100)); + Assertions.assertFalse(customer.depositFunds(accounts.get(1).getId(), 0)); } @Test - public void withdrawFundsOk(){ - Customer customer1 = new Customer(); - customer1.createAccount("savings"); - customer1.createAccount("current"); - customer1.depositFunds(1, 100); - - Assertions.assertTrue(customer1.withdrawFunds(1, 10)); - Assertions.assertTrue(customer1.withdrawFunds(1, 20)); - Assertions.assertTrue(customer1.withdrawFunds(1, 40)); - Assertions.assertTrue(customer1.withdrawFunds(1, 1)); + public void withdrawFunds(){ + Customer customer = new Customer(); + customer.createAccount("savings"); + List accounts = customer.getAccounts(); + + customer.depositFunds(accounts.get(0).getId(),100); + + Assertions.assertTrue(customer.withdrawFunds(accounts.get(0).getId(), 10)); + Assertions.assertTrue(customer.withdrawFunds(accounts.get(0).getId(), 20)); + Assertions.assertTrue(customer.withdrawFunds(accounts.get(0).getId(), 40)); + Assertions.assertTrue(customer.withdrawFunds(accounts.get(0).getId(), 1)); } @Test public void withdrawFundsNotOk(){ Customer customer = new Customer(); customer.createAccount("savings"); + List accounts = customer.getAccounts(); - Assertions.assertFalse(customer.withdrawFunds(0,100)); - customer.depositFunds(0, 100); - Assertions.assertFalse(customer.withdrawFunds(0,101)); + Assertions.assertFalse(customer.withdrawFunds(accounts.get(0).getId(),100)); + customer.depositFunds(accounts.get(0).getId(), 100); + Assertions.assertFalse(customer.withdrawFunds(accounts.get(0).getId(),101)); } } From eb657eae7225ad90519a8e06cb594dd4a3bbd522 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 11:50:46 +0200 Subject: [PATCH 09/15] generateStatement tests --- src/domain-model.md | 2 +- src/main/java/com/booleanuk/core/Account.java | 7 ++++++- .../java/com/booleanuk/core/Customer.java | 10 +++++---- .../java/com/booleanuk/core/Transaction.java | 4 ++++ .../java/com/booleanuk/core/AccountTest.java | 11 ++++++++++ .../java/com/booleanuk/core/CustomerTest.java | 14 +++++++++++++ .../com/booleanuk/core/TransactionTest.java | 21 +++++++++++++++++++ 7 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/TransactionTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 4738862a7..3e6fd16c0 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -17,7 +17,7 @@ As a customer: | | | boolean depositFunds(int accountId, float amount) | if amount > 0 | add amount to balance and return true | | | | | if amount < 0 | return false | | ----------- | | | | | -| Account - | - float balance | String generateStatement (transactions) | always | return statement with transaction dates, amounts and balance | +| Account - | - float balance | String generateStatement() | always | return statement with transaction dates, amounts and balance | | abstract | - List transactions | boolean withdrawFunds(float amount) | if balance >= amount | subtract amount from balance, create Transaction and add to transactions list, return true | | | - static int nextId | | if balance < amount | return false | | | - int accountId | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 4d1095df1..35c56b9ca 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -13,7 +13,8 @@ public abstract class Account { public Account(){ this.balance = 0; this.transactions = new ArrayList<>(); - this.accountId = nextId++; + this.accountId = nextId; + nextId++; } public boolean depositFunds(float amount) { @@ -35,4 +36,8 @@ public boolean withdrawFunds(float amount) { return true; } return false; } + + public String generateStatement() { + return ""; + } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 71404904a..97526ae7d 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -27,8 +27,7 @@ public boolean depositFunds(int accountId, float amount) { if (!accounts.isEmpty() && amount > 0) { for (Account account : accounts) { if (account.getId() == accountId) { - account.depositFunds(amount); - return true; + return account.depositFunds(amount); } } } @@ -39,8 +38,7 @@ public boolean withdrawFunds(int accountId, float amount) { if (!accounts.isEmpty() && amount > 0) { for (Account account : accounts) { if (account.getId() == accountId) { - account.withdrawFunds(amount); - return true; + return account.withdrawFunds(amount); } } } @@ -50,4 +48,8 @@ public boolean withdrawFunds(int accountId, float amount) { public String generateStatement(int accountId) { return ""; } + + public List getAccounts(){ + return accounts; + } } diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index 6880496bf..e243a89c1 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -14,4 +14,8 @@ public Transaction(LocalDate now, float balance, float amount, String type) { this.amount = amount; this.type = type; } + + public String generateStatement() { + return ""; + } } diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index 57166575b..6f0406991 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -64,7 +64,18 @@ public void withdrawFundsNotOk(){ Assertions.assertFalse(current.withdrawFunds(-10)); Assertions.assertFalse(savings.withdrawFunds(0)); Assertions.assertFalse(current.withdrawFunds(-1)); + } + + @Test + public void generateStatement(){ + Account current = new Current(); + current.depositFunds(100); + current.withdrawFunds(50); + String content = current.generateStatement(); + Assertions.assertTrue(content.contains("date || credit || debit || balance")); + Assertions.assertTrue(content.contains("100")); + Assertions.assertTrue(content.contains("50"));; } } diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index ea8e17f75..236fde353 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -75,4 +75,18 @@ public void withdrawFundsNotOk(){ Assertions.assertFalse(customer.withdrawFunds(accounts.get(0).getId(),101)); } + @Test + public void generateStatement(){ + Customer customer = new Customer(); + customer.createAccount("savings"); + customer.depositFunds(0, 100); + customer.withdrawFunds(0,10); + + String content = customer.generateStatement(0); + + Assertions.assertTrue(content.contains("date || credit || debit || balance")); + Assertions.assertTrue(content.contains("100")); + Assertions.assertTrue(content.contains("10")); + Assertions.assertTrue(content.contains("90")); + } } diff --git a/src/test/java/com/booleanuk/core/TransactionTest.java b/src/test/java/com/booleanuk/core/TransactionTest.java new file mode 100644 index 000000000..6c2a719d1 --- /dev/null +++ b/src/test/java/com/booleanuk/core/TransactionTest.java @@ -0,0 +1,21 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; + +public class TransactionTest { + + @Test + public void generateStatement(){ + Transaction transaction = new Transaction(LocalDate.now(), 100, 10, "credit"); + String date = String.valueOf(LocalDate.now()); + String content = transaction.generateStatement(); + + Assertions.assertTrue(content.contains(date)); + Assertions.assertTrue(content.contains("10"));; + Assertions.assertTrue(content.contains("100")); + Assertions.assertTrue(content.contains("credit"));; + } +} From 218b66d98b1d147f6ef221244ae35d64806eb8e4 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 13:05:43 +0200 Subject: [PATCH 10/15] generateStatement ok --- src/main/java/com/booleanuk/core/Account.java | 6 +++- .../java/com/booleanuk/core/Customer.java | 10 +++++- .../java/com/booleanuk/core/Transaction.java | 7 +++- .../java/com/booleanuk/core/AccountTest.java | 7 ++-- .../java/com/booleanuk/core/CustomerTest.java | 36 +++++++++++++++---- .../com/booleanuk/core/TransactionTest.java | 9 ++--- 6 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 35c56b9ca..1c880ca46 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -38,6 +38,10 @@ public boolean withdrawFunds(float amount) { } public String generateStatement() { - return ""; + String transactionStrings = ""; + for(Transaction transaction : transactions){ + transactionStrings += transaction.generateStatement(); + } + return transactionStrings; } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 97526ae7d..3fec19cc6 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -46,7 +46,15 @@ public boolean withdrawFunds(int accountId, float amount) { } public String generateStatement(int accountId) { - return ""; + String transactions = String.format(" %-15s || %-15s || %-15s || %s " , "date", "credit", "debit", "balance"); + if(!accounts.isEmpty()){ + for(Account account: accounts){ + if (account.getId() == accountId){ + transactions += account.generateStatement(); + } + } + } return transactions; + } public List getAccounts(){ diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index e243a89c1..2266158d5 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -16,6 +16,11 @@ public Transaction(LocalDate now, float balance, float amount, String type) { } public String generateStatement() { - return ""; + String transaction = ""; + if (this.type.equals("credit")) { + transaction += "\n" + (String.format(" %-15s || %-15s || %-15s || %s " , String.valueOf(this.date) , this.amount, " ", this.balance )); + } else { + transaction += "\n" + (String.format(" %-15s || %-15s || %-15s || %s " , String.valueOf(this.date) , " ", this.amount, this.balance )); } + return transaction; } } diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index 6f0406991..cc93de5ad 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -73,9 +73,8 @@ public void generateStatement(){ current.withdrawFunds(50); String content = current.generateStatement(); - - Assertions.assertTrue(content.contains("date || credit || debit || balance")); - Assertions.assertTrue(content.contains("100")); - Assertions.assertTrue(content.contains("50"));; + System.out.println(content); + Assertions.assertTrue(content.contains("100.0")); + Assertions.assertTrue(content.contains("50.0"));; } } diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 236fde353..e1160ba1d 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.time.LocalDate; import java.util.List; public class CustomerTest { @@ -79,14 +80,35 @@ public void withdrawFundsNotOk(){ public void generateStatement(){ Customer customer = new Customer(); customer.createAccount("savings"); - customer.depositFunds(0, 100); - customer.withdrawFunds(0,10); + List accounts = customer.getAccounts(); + customer.depositFunds(accounts.get(0).getId(), 100); + customer.withdrawFunds(accounts.get(0).getId(),10); - String content = customer.generateStatement(0); + String content = customer.generateStatement(accounts.get(0).getId()); + System.out.println(content); + + Assertions.assertTrue(content.contains("100.0")); + Assertions.assertTrue(content.contains("10.0")); + Assertions.assertTrue(content.contains("90.0")); + } - Assertions.assertTrue(content.contains("date || credit || debit || balance")); - Assertions.assertTrue(content.contains("100")); - Assertions.assertTrue(content.contains("10")); - Assertions.assertTrue(content.contains("90")); + @Test + public void generateStatement2(){ + Customer customer = new Customer(); + customer.createAccount("current"); + List accounts = customer.getAccounts(); + customer.depositFunds(accounts.get(0).getId(), 1000); + customer.withdrawFunds(accounts.get(0).getId(),90); + customer.withdrawFunds(accounts.get(0).getId(),10); + customer.withdrawFunds(accounts.get(0).getId(),300); + + String content = customer.generateStatement(accounts.get(0).getId()); + System.out.println(content); + + Assertions.assertTrue(content.contains("1000.0")); + Assertions.assertTrue(content.contains("10.0")); + Assertions.assertTrue(content.contains("90.0")); + Assertions.assertTrue(content.contains("300.0")); + Assertions.assertTrue(content.contains(String.valueOf(LocalDate.now()))); } } diff --git a/src/test/java/com/booleanuk/core/TransactionTest.java b/src/test/java/com/booleanuk/core/TransactionTest.java index 6c2a719d1..527279ff1 100644 --- a/src/test/java/com/booleanuk/core/TransactionTest.java +++ b/src/test/java/com/booleanuk/core/TransactionTest.java @@ -11,11 +11,12 @@ public class TransactionTest { public void generateStatement(){ Transaction transaction = new Transaction(LocalDate.now(), 100, 10, "credit"); String date = String.valueOf(LocalDate.now()); - String content = transaction.generateStatement(); + String content = String.valueOf(transaction.generateStatement()); + + System.out.println(content); Assertions.assertTrue(content.contains(date)); - Assertions.assertTrue(content.contains("10"));; - Assertions.assertTrue(content.contains("100")); - Assertions.assertTrue(content.contains("credit"));; + Assertions.assertTrue(content.contains("10.0"));; + Assertions.assertTrue(content.contains("100.0")); } } From 0359eff445e3dabacd222da06b737b35ad37999f Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 13:11:24 +0200 Subject: [PATCH 11/15] class diagram --- src/Class-diagram-core.png | Bin 0 -> 42678 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Class-diagram-core.png diff --git a/src/Class-diagram-core.png b/src/Class-diagram-core.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d8ba4d472aba22ebbd5dc37da50dee01733434 GIT binary patch literal 42678 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 Date: Wed, 13 Aug 2025 13:21:40 +0200 Subject: [PATCH 12/15] calculate balance from transactions test --- src/domain-model.md | 40 ++++++++++- src/img_1.png | Bin 36867 -> 0 bytes .../java/com/booleanuk/extension/Account.java | 52 +++++++++++++++ .../java/com/booleanuk/extension/Current.java | 5 ++ .../com/booleanuk/extension/Customer.java | 63 ++++++++++++++++++ .../java/com/booleanuk/extension/Savings.java | 5 ++ .../com/booleanuk/extension/Transaction.java | 30 +++++++++ .../extension/AccountExtensionTest.java | 19 ++++++ 8 files changed, 213 insertions(+), 1 deletion(-) delete mode 100644 src/img_1.png create mode 100644 src/main/java/com/booleanuk/extension/Account.java create mode 100644 src/main/java/com/booleanuk/extension/Current.java create mode 100644 src/main/java/com/booleanuk/extension/Customer.java create mode 100644 src/main/java/com/booleanuk/extension/Savings.java create mode 100644 src/main/java/com/booleanuk/extension/Transaction.java create mode 100644 src/test/java/com/booleanuk/extension/AccountExtensionTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 3e6fd16c0..8e0e20143 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -31,4 +31,42 @@ As a customer: | Transaction | -LocalDate date | String generateStatement() | always | return String transaction date, amount and balance | | | - float amount | | | | | | - float balance | | | | -| | -String accountType | | | | \ No newline at end of file +| | -String accountType | | | | + + + +## Extensions - user stories + +As an engineer, +- I want account balances to be calculated based on transaction history instead of stored in memory. + +As a bank manager, +- I want accounts to be associated with specific branches. +- I want to approve or reject overdraft requests. + +As a customer, +- I want to be able to request an overdraft on my account. +- I want statements to be sent as messages to my phone. + + +| Classes | Instance variable | Methods | Scenario | Output | +|---------|-------------------|------------|----------|--------| +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | +| | | | | | diff --git a/src/img_1.png b/src/img_1.png deleted file mode 100644 index 0cc5936e4c27e95bbebc8245ec2c0eb35a72ac2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36867 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

kIQb=!;xWYVosC1$XT9FIv-05% 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 F{{!aQtLp#& diff --git a/src/main/java/com/booleanuk/extension/Account.java b/src/main/java/com/booleanuk/extension/Account.java new file mode 100644 index 000000000..10ef82f19 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Account.java @@ -0,0 +1,52 @@ +package com.booleanuk.extension; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public abstract class Account { + private float balance; + private List transactions; + private static int nextId = 0; + private int accountId; + + public Account(){ + this.balance = 0; + this.transactions = new ArrayList<>(); + this.accountId = nextId; + nextId++; + } + + public boolean depositFunds(float amount) { + if (amount > 0){ + this.balance += amount; + transactions.add(new Transaction(LocalDate.now(),this.balance, amount, "credit")); + return true; + } return false; + } + + public int getId() { + return this.accountId; + } + + public boolean withdrawFunds(float amount) { + if (amount > 0 && amount <= this.balance){ + this.balance -= amount; + transactions.add(new Transaction(LocalDate.now(),this.balance, amount, "debit")); + return true; + } return false; + } + + public String generateStatement() { + String transactionStrings = ""; + for(Transaction transaction : transactions){ + transactionStrings += transaction.generateStatement(); + } + return transactionStrings; + } + + + public int getBalance() { + return -1; + } +} diff --git a/src/main/java/com/booleanuk/extension/Current.java b/src/main/java/com/booleanuk/extension/Current.java new file mode 100644 index 000000000..1831675c6 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Current.java @@ -0,0 +1,5 @@ +package com.booleanuk.extension; + +public class Current extends Account { + +} diff --git a/src/main/java/com/booleanuk/extension/Customer.java b/src/main/java/com/booleanuk/extension/Customer.java new file mode 100644 index 000000000..a42a26f5b --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Customer.java @@ -0,0 +1,63 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; + +public class Customer { + private List accounts; + + public Customer(){ + this.accounts = new ArrayList<>(); + } + + public boolean createAccount(String type) { + String accountType = type.toUpperCase(); + if(accountType.equals("SAVINGS")){ + accounts.add(new Savings()); + return true; + } else if (accountType.equals("CURRENT")) { + accounts.add(new Current()); + return true; + } + return false; + } + + + public boolean depositFunds(int accountId, float amount) { + if (!accounts.isEmpty() && amount > 0) { + for (Account account : accounts) { + if (account.getId() == accountId) { + return account.depositFunds(amount); + } + } + } + return false; + } + + public boolean withdrawFunds(int accountId, float amount) { + if (!accounts.isEmpty() && amount > 0) { + for (Account account : accounts) { + if (account.getId() == accountId) { + return account.withdrawFunds(amount); + } + } + } + return false; + } + + public String generateStatement(int accountId) { + String transactions = String.format(" %-15s || %-15s || %-15s || %s " , "date", "credit", "debit", "balance"); + if(!accounts.isEmpty()){ + for(Account account: accounts){ + if (account.getId() == accountId){ + transactions += account.generateStatement(); + } + } + } return transactions; + + } + + public List getAccounts(){ + return accounts; + } +} diff --git a/src/main/java/com/booleanuk/extension/Savings.java b/src/main/java/com/booleanuk/extension/Savings.java new file mode 100644 index 000000000..b5fa48279 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Savings.java @@ -0,0 +1,5 @@ +package com.booleanuk.extension; + +public class Savings extends Account { + +} diff --git a/src/main/java/com/booleanuk/extension/Transaction.java b/src/main/java/com/booleanuk/extension/Transaction.java new file mode 100644 index 000000000..764a1be5f --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Transaction.java @@ -0,0 +1,30 @@ +package com.booleanuk.extension; + +import java.time.LocalDate; + +public class Transaction { + private LocalDate date; + private float balance; + private float amount; + private String type; + + public Transaction(LocalDate now, float balance, float amount, String type) { + this.date = now; + this.balance = balance; + this.amount = amount; + this.type = type; + } + + public String generateStatement() { + String transaction = ""; + if (this.type.equals("credit")) { + transaction += "\n" + (String.format(" %-15s || %-15s || %-15s || %s " , String.valueOf(this.date) , this.amount, " ", this.balance )); + } else { + transaction += "\n" + (String.format(" %-15s || %-15s || %-15s || %s " , String.valueOf(this.date) , " ", this.amount, this.balance )); } + return transaction; + } + + public String getType() { + return this.type; + } +} diff --git a/src/test/java/com/booleanuk/extension/AccountExtensionTest.java b/src/test/java/com/booleanuk/extension/AccountExtensionTest.java new file mode 100644 index 000000000..391b2990e --- /dev/null +++ b/src/test/java/com/booleanuk/extension/AccountExtensionTest.java @@ -0,0 +1,19 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class AccountExtensionTest { + + @Test + public void calculateBalanceFromTransactions(){ + + Account savings = new Savings(); + savings.depositFunds(100); + savings.depositFunds(100); + savings.depositFunds(100); + savings.withdrawFunds(50); + + Assertions.assertEquals(250, savings.getBalance()); + } +} From 6913fc6cc9a61a265ca21eac773b42bcde492cda Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 13:26:13 +0200 Subject: [PATCH 13/15] calculate balance from transactions ok --- src/main/java/com/booleanuk/extension/Account.java | 12 +++++++++--- .../java/com/booleanuk/extension/Transaction.java | 4 ++++ .../booleanuk/extension/AccountExtensionTest.java | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/extension/Account.java b/src/main/java/com/booleanuk/extension/Account.java index 10ef82f19..9b229161b 100644 --- a/src/main/java/com/booleanuk/extension/Account.java +++ b/src/main/java/com/booleanuk/extension/Account.java @@ -45,8 +45,14 @@ public String generateStatement() { return transactionStrings; } - - public int getBalance() { - return -1; + public float getBalance(){ + float sum = 0; + if (!transactions.isEmpty()){ + for(Transaction transaction: transactions){ + if(transaction.getType().equals("credit")){ + sum += transaction.getAmount(); + } else sum -= transaction.getAmount(); + } + } return sum; } } diff --git a/src/main/java/com/booleanuk/extension/Transaction.java b/src/main/java/com/booleanuk/extension/Transaction.java index 764a1be5f..5bdf8d0b5 100644 --- a/src/main/java/com/booleanuk/extension/Transaction.java +++ b/src/main/java/com/booleanuk/extension/Transaction.java @@ -27,4 +27,8 @@ public String generateStatement() { public String getType() { return this.type; } + + public float getAmount() { + return this.amount; + } } diff --git a/src/test/java/com/booleanuk/extension/AccountExtensionTest.java b/src/test/java/com/booleanuk/extension/AccountExtensionTest.java index 391b2990e..13bbb9fa7 100644 --- a/src/test/java/com/booleanuk/extension/AccountExtensionTest.java +++ b/src/test/java/com/booleanuk/extension/AccountExtensionTest.java @@ -16,4 +16,6 @@ public void calculateBalanceFromTransactions(){ Assertions.assertEquals(250, savings.getBalance()); } + + } From c58e9eb10b8b5b3a1dd498ce3a53357230a40555 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 14:18:07 +0200 Subject: [PATCH 14/15] overdraftTest --- .../java/com/booleanuk/extension/Account.java | 22 +++++++++++-- .../com/booleanuk/extension/Customer.java | 7 ++++ .../java/com/booleanuk/extension/Manager.java | 9 +++++ .../extension/CustomerExtensionTest.java | 33 +++++++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/booleanuk/extension/Manager.java create mode 100644 src/test/java/com/booleanuk/extension/CustomerExtensionTest.java diff --git a/src/main/java/com/booleanuk/extension/Account.java b/src/main/java/com/booleanuk/extension/Account.java index 9b229161b..39c96c8b5 100644 --- a/src/main/java/com/booleanuk/extension/Account.java +++ b/src/main/java/com/booleanuk/extension/Account.java @@ -9,12 +9,14 @@ public abstract class Account { private List transactions; private static int nextId = 0; private int accountId; + private String branch; + private boolean canOverdraft; public Account(){ this.balance = 0; this.transactions = new ArrayList<>(); - this.accountId = nextId; - nextId++; + this.accountId = nextId++; + this.canOverdraft = false; } public boolean depositFunds(float amount) { @@ -55,4 +57,20 @@ public float getBalance(){ } } return sum; } + + public String getBranch() { + return branch; + } + + public void setBranch(String branch) { + this.branch = branch; + } + + public boolean isCanOverdraft() { + return canOverdraft; + } + + public void setCanOverdraft(boolean canOverdraft) { + this.canOverdraft = canOverdraft; + } } diff --git a/src/main/java/com/booleanuk/extension/Customer.java b/src/main/java/com/booleanuk/extension/Customer.java index a42a26f5b..04ccfbfb5 100644 --- a/src/main/java/com/booleanuk/extension/Customer.java +++ b/src/main/java/com/booleanuk/extension/Customer.java @@ -60,4 +60,11 @@ public String generateStatement(int accountId) { public List getAccounts(){ return accounts; } + + + public Boolean requestOverdraft(Manager manager, int accountId, float amount) { + return null; + //manager.requestOverdraft(account, amount); + + } } diff --git a/src/main/java/com/booleanuk/extension/Manager.java b/src/main/java/com/booleanuk/extension/Manager.java new file mode 100644 index 000000000..f45f7f0a0 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Manager.java @@ -0,0 +1,9 @@ +package com.booleanuk.extension; + + +public class Manager { + + public Boolean requestOverdraft(Account account, float amount) { + return null; + } +} diff --git a/src/test/java/com/booleanuk/extension/CustomerExtensionTest.java b/src/test/java/com/booleanuk/extension/CustomerExtensionTest.java new file mode 100644 index 000000000..91fdbdb30 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/CustomerExtensionTest.java @@ -0,0 +1,33 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class CustomerExtensionTest { + + @Test + public void requestOverDraftOk(){ + Customer customer = new Customer(); + customer.createAccount("current"); + List accounts = customer.getAccounts(); + Manager manager = new Manager(); + + Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 10 )); + Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 40 )); + Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 349 )); + } + + @Test + public void requestOverDraftNotOk(){ + Customer customer = new Customer(); + customer.createAccount("savings"); + customer.createAccount("current"); + List accounts = customer.getAccounts(); + Manager manager = new Manager(); + + Assertions.assertFalse(customer.requestOverdraft(manager, accounts.get(0).getId(), 100)); + Assertions.assertFalse(customer.requestOverdraft(manager, accounts.get(1).getId(), 500)); + } +} From 40bd1a1c07e8e5a725cd9902fb501f0a9a46d9d2 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 14:59:35 +0200 Subject: [PATCH 15/15] overdraft ok --- src/class-diagram-extension.png | Bin 0 -> 50805 bytes src/domain-model.md | 60 ++++++++++++------ .../java/com/booleanuk/extension/Account.java | 22 ++----- .../com/booleanuk/extension/Customer.java | 9 ++- .../java/com/booleanuk/extension/Manager.java | 8 ++- .../extension/CustomerExtensionTest.java | 23 +++++++ 6 files changed, 83 insertions(+), 39 deletions(-) create mode 100644 src/class-diagram-extension.png diff --git a/src/class-diagram-extension.png b/src/class-diagram-extension.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ab5b11b78398766a77fbc806a51d39c271f412 GIT binary patch literal 50805 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 P{BvNR`QD7(ju-zAa~?Ev literal 0 HcmV?d00001 diff --git a/src/domain-model.md b/src/domain-model.md index 8e0e20143..623a1929e 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -49,24 +49,42 @@ As a customer, - I want statements to be sent as messages to my phone. -| Classes | Instance variable | Methods | Scenario | Output | -|---------|-------------------|------------|----------|--------| -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | + +| Classes | Instance variables | Methods | Scenario | Output | +|---------------|----------------------------------------------|------------------------------------------------------------------------|-------------------------------------------------------------|--------------------------------------------------------------------------------------------| +| Customer | List accounts | boolean createAccount(String) | if customer wants to create current account | add Account to accounts and return true | +| | | | if customer wants to create savings account | add Account to accounts and return true | +| | | String generateStatement(int accountId) | always | return statement with transaction dates, amounts and balance | +| | | boolean withdrawFunds(int accountId, float amount) | if balance >= amount | return true and subtract amount from balance | +| | | | if balance < amount | return false | +| | | boolean depositFunds(int accountId, float amount) | if amount > 0 | add amount to balance and return true | +| | | | if amount < 0 | return false | +| | | List getAccounts() | always | return list of accounts | +| | | boolean requestOverdraft(Manager manager, int accountId, float amount) | if account in accounts list | send request to overdraft to manager | +| | | | if account not in accounts list | return false | +| | | | | | +| ----------- | | | | | +| Account - | - float balance | String generateStatement() | always | return statement with transaction dates, amounts and balance | +| abstract | - List transactions | boolean withdrawFunds(float amount) | if balance >= amount | subtract amount from balance, create Transaction and add to transactions list, return true | +| | - static int nextId | | if balance < amount | return false | +| | - int accountId | boolean depositFunds(float amount) | if amount > 0 | add amount to balance, create Transaction and add to transactions list and return true | +| | | | if amount < 0 | return false | +| | | int getId() | always | return accountID | +| | | float getBalance() | always | return balance from transaction history | +| | | void withdrawFundsOverdraft(Manager manager, float amount) | if manager not null | subtract amount from balance | +| | | | if manager null | | +| ------------- | | | | | +| Savings | -inherits methods and variables from Account | | | | +| ----------- | | | | | +| Current | -inherits methods and variables from Account | | | | +| ----------- | | | | | +| Transaction | -LocalDate date | String generateStatement() | always | return String transaction date, amount and balance | +| | - float amount | String getType() | always | return type | +| | - float balance | float getAmount() | always | return amount | +| | -String accountType | | | | +| ------------- | | | | | +| Manager | | boolean requestOverdraft(Account account, float amount) | if account instanceof savings | return false | +| | | | if account instance of current and balance - amount <= -500 | return false | +| | | | if account instance of current and balance - amount >= -500 | call withdrawFundsOverdraft on account and return true | +| ------------- | | | | | + diff --git a/src/main/java/com/booleanuk/extension/Account.java b/src/main/java/com/booleanuk/extension/Account.java index 39c96c8b5..889769bd9 100644 --- a/src/main/java/com/booleanuk/extension/Account.java +++ b/src/main/java/com/booleanuk/extension/Account.java @@ -32,7 +32,7 @@ public int getId() { } public boolean withdrawFunds(float amount) { - if (amount > 0 && amount <= this.balance){ + if ((amount > 0 && amount <= this.balance) || (amount > 0 && canOverdraft)){ this.balance -= amount; transactions.add(new Transaction(LocalDate.now(),this.balance, amount, "debit")); return true; @@ -58,19 +58,11 @@ public float getBalance(){ } return sum; } - public String getBranch() { - return branch; - } - - public void setBranch(String branch) { - this.branch = branch; - } - - public boolean isCanOverdraft() { - return canOverdraft; - } - - public void setCanOverdraft(boolean canOverdraft) { - this.canOverdraft = canOverdraft; + void withdrawFundsOverdraft(Manager manager, float amount) { + if (manager == null ){ + throw new SecurityException("Only managers can change basket capacity"); + } + this.balance -= amount; + transactions.add(new Transaction(LocalDate.now(),this.balance, amount, "debit")); } } diff --git a/src/main/java/com/booleanuk/extension/Customer.java b/src/main/java/com/booleanuk/extension/Customer.java index 04ccfbfb5..73be2810f 100644 --- a/src/main/java/com/booleanuk/extension/Customer.java +++ b/src/main/java/com/booleanuk/extension/Customer.java @@ -63,8 +63,13 @@ public List getAccounts(){ public Boolean requestOverdraft(Manager manager, int accountId, float amount) { - return null; - //manager.requestOverdraft(account, amount); + if(!accounts.isEmpty()){ + for(Account account: accounts){ + if (account.getId() == accountId){ + return manager.requestOverdraft(account,amount); + } + } + } return false; } } diff --git a/src/main/java/com/booleanuk/extension/Manager.java b/src/main/java/com/booleanuk/extension/Manager.java index f45f7f0a0..e494734da 100644 --- a/src/main/java/com/booleanuk/extension/Manager.java +++ b/src/main/java/com/booleanuk/extension/Manager.java @@ -4,6 +4,12 @@ public class Manager { public Boolean requestOverdraft(Account account, float amount) { - return null; + if(account instanceof Savings){ + return false; + } + if (account.getBalance() - amount <= -500){ + return false; + } account.withdrawFundsOverdraft(this, amount); + return true; } } diff --git a/src/test/java/com/booleanuk/extension/CustomerExtensionTest.java b/src/test/java/com/booleanuk/extension/CustomerExtensionTest.java index 91fdbdb30..147f66725 100644 --- a/src/test/java/com/booleanuk/extension/CustomerExtensionTest.java +++ b/src/test/java/com/booleanuk/extension/CustomerExtensionTest.java @@ -17,6 +17,29 @@ public void requestOverDraftOk(){ Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 10 )); Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 40 )); Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 349 )); + Assertions.assertFalse(customer.requestOverdraft(manager,accounts.getFirst().getId(), 1000)); + + String content = customer.generateStatement(accounts.get(0).getId()); + System.out.println(content); + + } + + @Test + public void requestOverDraftOk2(){ + Customer customer = new Customer(); + customer.createAccount("current"); + List accounts = customer.getAccounts(); + Manager manager = new Manager(); + + customer.depositFunds(accounts.getFirst().getId(), 100); + + Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 400 )); + Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 40 )); + Assertions.assertTrue(customer.requestOverdraft(manager, accounts.get(0).getId(), 10 )); + + String content = customer.generateStatement(accounts.get(0).getId()); + System.out.println(content); + } @Test