From f864a5b84391daec4c2f5bc415f2f091bc5389d7 Mon Sep 17 00:00:00 2001 From: Paras Gaur Date: Thu, 9 Sep 2021 23:51:54 +0530 Subject: [PATCH] solved the problem --- .idea/.gitignore | 3 + .idea/misc.xml | 6 ++ .idea/modules.xml | 8 ++ .idea/runConfigurations.xml | 10 +++ .idea/vcs.xml | 6 ++ mock-machine-coding-2.iml | 11 +++ .../com/gaurparas/Driver.class | Bin 0 -> 3398 bytes .../com/gaurparas/EqualExpense.class | Bin 0 -> 1231 bytes .../com/gaurparas/EqualSplit.class | Bin 0 -> 351 bytes .../com/gaurparas/ExactExpense.class | Bin 0 -> 1337 bytes .../com/gaurparas/ExactSplit.class | Bin 0 -> 420 bytes .../com/gaurparas/Expense.class | Bin 0 -> 2050 bytes .../com/gaurparas/ExpenseManager.class | Bin 0 -> 4856 bytes .../com/gaurparas/ExpenseMetaData.class | Bin 0 -> 1042 bytes .../com/gaurparas/ExpenseService$1.class | Bin 0 -> 737 bytes .../com/gaurparas/ExpenseService.class | Bin 0 -> 2266 bytes .../com/gaurparas/ExpenseType.class | Bin 0 -> 1023 bytes .../com/gaurparas/PercentExpense.class | Bin 0 -> 1390 bytes .../com/gaurparas/PercentSplit.class | Bin 0 -> 611 bytes .../com/gaurparas/Split.class | Bin 0 -> 752 bytes .../com/gaurparas/User.class | Bin 0 -> 1220 bytes src/com/gaurparas/Driver.java | 61 +++++++++++++ src/com/gaurparas/EqualExpense.java | 23 +++++ src/com/gaurparas/EqualSplit.java | 8 ++ src/com/gaurparas/ExactExpense.java | 25 ++++++ src/com/gaurparas/ExactSplit.java | 9 ++ src/com/gaurparas/Expense.java | 60 +++++++++++++ src/com/gaurparas/ExpenseManager.java | 83 ++++++++++++++++++ src/com/gaurparas/ExpenseMetaData.java | 37 ++++++++ src/com/gaurparas/ExpenseService.java | 29 ++++++ src/com/gaurparas/ExpenseType.java | 7 ++ src/com/gaurparas/PercentExpense.java | 27 ++++++ src/com/gaurparas/PercentSplit.java | 18 ++++ src/com/gaurparas/Split.java | 26 ++++++ src/com/gaurparas/User.java | 47 ++++++++++ 35 files changed, 504 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 mock-machine-coding-2.iml create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/Driver.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/EqualExpense.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/EqualSplit.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/ExactExpense.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/ExactSplit.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/Expense.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/ExpenseManager.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/ExpenseMetaData.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/ExpenseService$1.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/ExpenseService.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/ExpenseType.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/PercentExpense.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/PercentSplit.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/Split.class create mode 100644 out/production/mock-machine-coding-2/com/gaurparas/User.class create mode 100644 src/com/gaurparas/Driver.java create mode 100644 src/com/gaurparas/EqualExpense.java create mode 100644 src/com/gaurparas/EqualSplit.java create mode 100644 src/com/gaurparas/ExactExpense.java create mode 100644 src/com/gaurparas/ExactSplit.java create mode 100644 src/com/gaurparas/Expense.java create mode 100644 src/com/gaurparas/ExpenseManager.java create mode 100644 src/com/gaurparas/ExpenseMetaData.java create mode 100644 src/com/gaurparas/ExpenseService.java create mode 100644 src/com/gaurparas/ExpenseType.java create mode 100644 src/com/gaurparas/PercentExpense.java create mode 100644 src/com/gaurparas/PercentSplit.java create mode 100644 src/com/gaurparas/Split.java create mode 100644 src/com/gaurparas/User.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0548357 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ca9c70c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/mock-machine-coding-2.iml b/mock-machine-coding-2.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/mock-machine-coding-2.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/out/production/mock-machine-coding-2/com/gaurparas/Driver.class b/out/production/mock-machine-coding-2/com/gaurparas/Driver.class new file mode 100644 index 0000000000000000000000000000000000000000..c99549a9c9044c7e5e22ab63d1ed546736738d4a GIT binary patch literal 3398 zcmbVOTW}j!8UD^{tzE5FlDn~-Y?3yYwvHV&cA}(eDu>V{R;j6Pjhu_q(qt`d?`RC&@KB3@~cz}OCCF9dven!S;IppW~ z=kp34#25JIq=GNvOA;PZ&;>)r!!jO`aZ19MLuB`87?0sA3KBRS##ixp2w%h3IlvhS zPbf&@Nv?TH!qW5 zvPc?jsFX8``;Cgl=blomO<7fj&Y@gsy02i=D`lf%RQm=h){I%{C$wq9vT42h?xADG zjL}y#>_T6*RUDo&8q{YI`N=0LUw8N=)S61 zAtGV(MA@{f=J;%xC^y_)jmU0U3z`J#8MvUL zQ7MpV)H`X|u#JLQVYqII4>B$jZ=Ii5%^9}MO_%xTWL+h#cQ!kiZs0k2gU_6^-?8MR zEWc&{PJ)PJYew$AVWaHqq^zZ!lQ1gbTN1u4;aLVHTdG%b=Is^_Y1oZZFL$|$GzejJ zb0C{9K>=u9=3ZwI>RTAv_?TqO$$;Am6!>BgeP#Ge?*4soXMeQn@ut#dF0Gt`F|)zPj%JKMn6H zl9A85skyv+Nv&|T(|P?=>D()U@mHGzla=k{EFpX&{j1?ZkB@6sG*)~tq zc)uh^b@yCNn?ma}B8CkuuG!PF=g3n=b;@nU)R%dOG5@&p{u`!ht(uErX@Xv~8X$kp7{$6ddX(b~_%C?52fJ0|boW8KW;zW~ zcCcysKaQtMNp%VbwJZL6b0sB6!FySgf_|O~CLwjTy1mckoA{z)%? zIDgLFqW7ghDi)8$mFKWsR~L|&NW6-hIJel5Ca^O9XLGo>y{}vnBpO9ehU=w=}y@E`RjAFB} z8e4=l*edj3n{bfiy+{c~sx4kNk0Qz*qcYip0mRt5RB6sgSih*l`|JT^a67U8fE~w2 za0fz6WK$TV9SV!E!}utzhFK@uk2^6$_si4C!=wwKNHHJ5DEXnn{)I8pwedp4U8DnK zp@6-}QZgSF+Q}RHC`I;@o=Vw6J3!-uq&bQBMI4qeA>q&^>JhSpyWN?Ddz>+S@1dfI wsVgJOB^*MmwS{B;G3JPSy)Cro-w=pjf4eJtJ=uSW0u{InL_CNoeFYr(FGny#@Bjb+ literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/EqualExpense.class b/out/production/mock-machine-coding-2/com/gaurparas/EqualExpense.class new file mode 100644 index 0000000000000000000000000000000000000000..3cce4fe6849e7cb4438f74875664e8431012b1b1 GIT binary patch literal 1231 zcma)5TTc@~6#k~&vZY-pl#8?=6)(^NrC#t_!h?dwq~Jr92OmtPWm5*X+qyeT;HT&h z&=+2O(cpv8SAU1U!o|!MNAiwiz-t;o6%)yJ35edBY)1w$^EKXN!A6y(6U|cZAO{ zr3Zcya3_jhC7Qh530%p**67jYV*Bm^!>9%d8I#@bIzm#=A)P%#vK>)nC}?QC7KZU& z!Ux?G(sNqi6)jX<5vZ;b@&3AKxm*Sw)&K0jTKunAS_+-5>U?sKJ7Swl$`vn`o-!oD zPB4sV;A4Ia19i!p&o_8C9EOQ2CayB1>Yc!A+V_PT+VJ`xlUP#QU?GLHg=<(QfQ9S0 zK`0A1F>T=%ZZnMZ?opVGVWL+XhK)@5znG%>h`VMy-Z+NA-p!=-`mJ~2NBwWv zGR#8jkS&(9xzT`<;?#G%$9@une9Rs0Z`%8`euf)fqbHsYcUzT5ja|DbtC*p`t)Kor zAO`9p(sWz&^3g{hke;6_=Zsw9J=j}%#xX!=ikv_|^}i01w2TCuX=E@&w~~gDrEp3b z!6>1WG=^~)p>zflgvgO>MP6gblWmeTF-(!}ET-vHL|)UaQ04h|h}9O35NFs}Jc7aS z5;+nQ44=@qS^f<36%z5oH$T4`hXgP}s`;>r0ZNxaf#}T=wIY#PAUcZrIU-k}G76zY nX`&($^?AI0gc{lV5O*l^Z<%arLnObBj2 zeOH7q(sT7{XH#XyJWYgYMrq8+gpDrnj&$=+oe^%2+y>v4lhGp4c}EK|SFe*}cc7U(k=7 e9Qe|Me^zupDuSPczy8?j)vt-(f0#BpqY`(mkD9D;sk(R6`UQ`V$mEDnhGEuY5 zVj^o+?Ucu7b-!Yis>YgO%e1s*Dz+h@JT7k;0_|C|WUSYAHx28#+$>Vll`ZFGaYI_B z^R6oud)urE4E>c@=Iwg+6k*EUa;;P3?2=sV@T*S0jD@D_0(he_rf#7Z( zs=%-(+RH_tuNm+`r2%@$nH`J=Iy0;<~yfnHDWIX(gXyi?2d=CF&I>P8RKIZ`kB80AR)7=YqR5ezco3T3_S z)sG?Cu2SQ}HR^^j!qWlroq7jICVm26wkv=LtMX$PT?Y z{U@j&#h6PpQzxn-?UG{qv4ZQ2@?DTRw+)fRI5P}DJwv;O3BQILKQXLf@&`it5`Q9y I((Xg-H-`T`T>t<8 literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/ExactSplit.class b/out/production/mock-machine-coding-2/com/gaurparas/ExactSplit.class new file mode 100644 index 0000000000000000000000000000000000000000..4c4bf29fac5d0e77ccf083549335b9be3d178c96 GIT binary patch literal 420 zcmZutO;5s55S*=rN?WM{it(g3z(g+IFkVDYjfp{ff7C{wDU|fX__sV56A%6Xf0S|B zkPwKM&70YIv$Om2`}Gar99%!W^@NEa$q+3+EY z($Tmd2+XVGF%o#bo=3OEY#OEaY8sPi`AMkaK&86GOVZ4rbtX94u)BU!VLn;JIv>%o zpt+#4p{YhPlbR*PJQv7VU{8`F4Wk=f4)j(oXD{kixv1g5MH3zuSdYI_3fk+fDutl? z@5cQACp?hJg8_`d33XPB=x)h7gVRsQp!WgeowR{%)+U>vv_`2-ra^REaSpLV1XdS2 PG%H`s%%6f?A_IGWyEa`J literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/Expense.class b/out/production/mock-machine-coding-2/com/gaurparas/Expense.class new file mode 100644 index 0000000000000000000000000000000000000000..33312ff809da065725e285b89fbdb4ea11248b88 GIT binary patch literal 2050 zcma)6>rN9<5dKcPTiUX6DHN!nTtsP?OHoll5JgdAQkA624}X{}u&GOWOS>iV96pGe z*qHdk2k@bcGiP^OINc_u$vJ1|%zX3B%y;_d@2}qgHn5jO9GeLYV2hWBylnHb!^@)q z><-|uK*Tu_NEJ@4Gb>-Vs-=9aGEaNC5ld|YPqe3 zEwH3q?-Y(}m3+x+HR@KwYUYa!v%SlRb;~(l0itSqa zmTL*jD(=re*X?T4e(gJO}MQ53Pp7-@Z|EKRMK@$#7s|IB_}ZydFe;{4d7+ni`(3(-|&AFWK%Z z8uEBH7dB?S>0PI@y|)~mpzu9^F41g`CX=9uz@laM1E&LjxD%A;vI6|^a$MjvnGN#^ zprmA|ovDEGMeXH!jQyJ9Q4PSx`~tgJoX%9O{lM6Hkb1$rJ(04U?qRLAdM#mMv*cwj1dEaFbs@g+&}_J zf%N4$_@VToyU+dY(W!k*PmWR@YV-8Z5T}0+9T5hgQ-mQQa7CVn=$rD$GbNQfWuu*a z(wLz8N&5PNC}Olvn?E7Ur8XkwY8z2AqqU)#8NChtJ6%UHMe9}RYCxkT2@KJ1m>@^U zK8g(8Zx9`VqVH+i`NXM(JTaN5JTXm8o|ur189Fm5_8%lnM(1*_k?lHWX=S2$+Sx}p ze<1cvIxwY}G>*&k9*FLz7nsAmAG}L&5%xBh+lX;N5m``DTBnFaMj~)m7&9m!CVR_? z7jVPJ%9Bq(B=WTbpORdq4| literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/ExpenseManager.class b/out/production/mock-machine-coding-2/com/gaurparas/ExpenseManager.class new file mode 100644 index 0000000000000000000000000000000000000000..c707939089dd0508250238765a372e9ab19be67c GIT binary patch literal 4856 zcmb_g33n6M75+w+G`2KG*sKBrP6Ni+*bWp3$i@j^Cn51dVjx=!8B2pLkR?SLv6QAs zTGFH>O;;eaX}XuTbW0ix4sFscZkz5)`d=Cjq2GNol14&l!#O?29=+u*?|%2Y_l@+{ zyRW?tU<3XYLN|`+I2wWvM;g$DV>&((Lcp0Emz9r(uoRDl(S(o5{Ho9G{TK z2^~*`5y2;QJgwuI5SsBRnV;10Y>3*=HQ>{Dz8;?m;j{Rh82G%7FNn!6>Npj`G8~b| z>3W>0#|t5x#g}CMWqG_9!dLK87+=NL0dh2M` zO6RS-hPgur&BJC-!A_=nhLU-^S3|>Caw2Wog`A~fP1SbaP&_l$Ghr5TSu|8QE(OYGB4{a%{#<)qbxHUFuS+<4; z{XH+PBjDu({}C{g?6UXR&Gbi%&ROfs6=h0lHzGXW-3+E)sy+bsjN+H z?I8^dE2BJ?Ek@c~%hvmZS;M{?(pI#*u`D)@*=GC@byQ+>e3xZMlsuqmSkUgA!plDa zJ}6l3Oh}5$9C7(cOtU1aU4m;%4I|g9c~)GqiKBoxTIYVQr(<&}Q%IBEUdOIH3sOms zm{TO58n2fz+lC}Ck#ISt;n8YFxjVa=JU44z)_aattif{Ws9sP-z#^F~+Z-@$vsWU~ zGe@jFimst-&N{r!jYAvI&=@b|a#q?du0=*2(K2@f`D`l5s25Z@8k1$xGi*8SMFP;U zv`Wew9U;t`$;5V&H>ixVGU}(?gKAh&TXnb?3FB~Gu`X-N@;HX%p?vy{4uChvQ4Om- zdIEEGPj#a2@73`=UKJXi`9G)iz5LaVyM&QsJ2aLl60;VgBQ`_lf1}@50W7#;jc)O{&hx7(6VaC8~BJA08_-|kj_UgE7;Ai+b**B7D z9e4Yzj@J#mf%^>n0>5OLR^EbA00w@A^JGuiqhoY?A(=|Z_OJ09lCzcdl5f@Ei?!-_ z)4(i#D_g%a@Ozxs@s@!<;Ey`~WZ=*E3uCQxq^M!wulSpRzvCYU{wYwsjTsFsm6DaY zsR(v-{Gb(=UQ-5Zr)}j-JHtz7K}|F4R1=mhopFA<`%2*LoxC!$1zOzfZHbN>Z{KlO zyawDQc_opHYfP^ArlJc~SzKc2c@nE+>XW4tFRTzRMnWBZ(#(%oM`@84I&U<8T1_e= zC?9|U?ln^d5<8qwuLbUm%4}vqZr@|Ey?9x3EN@#=G@p^+-8(j!>DeXs1ha3MQ#^)K z3zf?}oVrX>X=>B5hPE2e)dWhXxN{W*%`D&In3FEAuG`AJx)ns^iRP3!I&9jLJc2pS ze(7%?kVsqjaoyG6vY5*CcE+*yUX&ZNa)*;~!q^xm0=DHcQNz*y*2e~_x{s8U_f6w{ z-A7e6T+gM5OE0++ae}~AyayE7Nu~(K&ZQ>gs;mfgFp3-&u8bZKBNcd+Zf%1`Msow! z0ke=|f*Uw>ZbIC|xBYH@tEl5Ydm=Qfk!fyymFb}IRAAMXk z9E;eBe$F)9hTC0lCgpuxTh;L@^v-ECbj~1Dhx<9Lm#OR2Su8u7qrzN7M~kr%QRQTz zW5{(vlh}ssbfaNMF*t3I?t*l8#@{C%W)Rje14F~`+8H!z{Q8sUV2;Ly92x1F!CV$)#rz zeg%t~7f&N90s0l1-3W8s!jP6Rz~val3Ycg`oOwQhoAESPPcp>k(T3Cf7A7cnP$Y}u3Z^bn z9C?s>qopQHZD^qDP6o1;QLk*@2NBVD32QBpd0?XhyvZbBoY z+QA=J2Cw4GPJBK-nUZT@s*`7v2hTOQqz&jQc7x}3BGr6n~t20JPYC- bJmuauHj`YSfDeap2R}nRQiS4z!G`|;zWm+L literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/ExpenseMetaData.class b/out/production/mock-machine-coding-2/com/gaurparas/ExpenseMetaData.class new file mode 100644 index 0000000000000000000000000000000000000000..55f760be90fb5a902807f0b2e2839a951f2e9b91 GIT binary patch literal 1042 zcma)(O>fgc5Qg8ioj4Am=||cEZ3(44B<8~xE(p{M9}-e1heGa~U>R4AT{#ZoXMse7 z#DO2ck3zh&PAN)V#ASANcIKUDXMX;6dz)C?heM;B#87ZKhwFM1}{FHh3PbW9TxhzE;M1? zC@hZ6Upl@1Wfmq(&l5H)=!MLq#H+=ZJ!YT#4UsM<&=8T*ZJuPad>p=vg}t)`^iamx z!ZqA&!9}A5PfQaHg}s0NL}B$}6K_VR;kZz+d;KByxwbkNYQqvqdX}h~lfpb*D0Xbo zUgs_0yTh~Ne}nSx&0+cX=dk?;b2wj2)e7wvRl#b9S{?ycsIWneHlu!7k5#PkMkUi% z8BaP}#*^MQd#>TivteXE7)@M2vWkGlewvDtvGGQUj`C*e0!9HTP2-gkr1!&Vm zH(1j#3R`8?AGrDgPVq}sAoeoIb|uJmHHf_ovO|#FD?ns6GJzYFAkH#Kw-V%LHOOD9 VD<^V5ki#oLWHkbEi}SRw^BeKuoUi}@ literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/ExpenseService$1.class b/out/production/mock-machine-coding-2/com/gaurparas/ExpenseService$1.class new file mode 100644 index 0000000000000000000000000000000000000000..222145b3ff18de7d12b9d9247001bd27669eee42 GIT binary patch literal 737 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 literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/PercentSplit.class b/out/production/mock-machine-coding-2/com/gaurparas/PercentSplit.class new file mode 100644 index 0000000000000000000000000000000000000000..b55df7f91c233b5a04924e8ece43cfae38f2ea5e GIT binary patch literal 611 zcmZuvO;5r=6r5K|D{Tc41Vj&dveZN_-Y{Gwo`}()+!t(c4N%e#|CTY)n0W99_@j)k zOJjg|=*zx&voo{1{r>s<0&tE43p#2Am~kJoNJEPCbqa1xVz2fws-mg^4xc5 zuMBIjxE6T`Cg+)MG2Q0wNMSY{Y;y<3iYO_0TN!A)-a$E&Z?lrJ_THeqFnuX(D9}-Y t&XSM`@j~uQe&4%@drdFAmd!3Fi}j!-yA2uo zs!xY{bmtERmZ#jV23$EQ(K3*i5-XT#L`f6TN(<@a(G~ z4qM*2uaN8{=b$6+r2`w=4h)zMW?%^{{oY2R6v!*B+m-#cd)e%GE$)R;4Skmj&2q~c zfAru9%7!%y=3ti9VRxP=0K57MQQd!m_Qa`%Io5e(SWP;qH!b!+k5HcoQRrZ&9X1gMq*8B;KJ5}YUg!VeH*0%A-+3Rs?i vXrmm0WFDqK3V(tWQA%H~@%HNeMs@E6neVNPKvoE{`VWZOmfFZllDPT>tE+E@ literal 0 HcmV?d00001 diff --git a/out/production/mock-machine-coding-2/com/gaurparas/User.class b/out/production/mock-machine-coding-2/com/gaurparas/User.class new file mode 100644 index 0000000000000000000000000000000000000000..c2b8d70330a8d16414e2d412a8dee014a1d862a4 GIT binary patch literal 1220 zcmbV~&u-H|5XQgtpEynpZPO%>KnnrdCWh9R-ax$|kPuNpD&)RNt<+UwSB}G(M*@im zi31P7Lm_6?hDy%nf)6vZ-_FkbX4k)d|M&^u1icy@Jakb(m(3$KkJ&tNuVqr!Nd{9HPlEF-jpE630V|fXP{0mnGMbXVzD#0TS6)PMl${E^?X8~rKczpUZZDGy zs=hgh;_z%S8-?iyIhvAEA0%Tr9m+J~bs<{WWi%IP493YUn8-zXEmJuUKF-6G$n8m( zy`ixhz5Xf?ZO`-Vre**}ap?G&n%$wyJgSoRD!+&-iGM><-{;rDY7y4XlSMiXUq_7Z zGSe|%uZLSW^iYNCp~hx|jR%)zTpdGT>*h_~jjqCRCSdmZLv-o+9C}>~1{b5q;Cjka zN#&_3c^86u-X^ie( z9jeu)Xq$FU@=B;YVVS`&tmY4AR$v?CL@6GRP5u9IpZ4e}qBy I)X(tX4=HM*jsO4v literal 0 HcmV?d00001 diff --git a/src/com/gaurparas/Driver.java b/src/com/gaurparas/Driver.java new file mode 100644 index 0000000..94a9721 --- /dev/null +++ b/src/com/gaurparas/Driver.java @@ -0,0 +1,61 @@ +package com.gaurparas; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Driver { + public static void main(String... args){ + ExpenseManager expenseManager = new ExpenseManager(); + + expenseManager.addUser(new User("u1","User1","paras@gmail.com","+91-00000")); + expenseManager.addUser(new User("u2","User2","pushpendra@gmail.com","+91-00001")); + expenseManager.addUser(new User("u3","User3","abhinav@gmail.com","+91-00002")); + expenseManager.addUser(new User("u4","User4","jancy@gmail.com","+91-00003")); + + Scanner scanner = new Scanner(System.in); + while (true) { + String command = scanner.nextLine(); + String[] commands = command.split(" "); + String commandType = commands[0]; + + switch (commandType){ + case "SHOW": + if (commands.length == 1) { + expenseManager.showBalances(); + } else { + expenseManager.showBalance(commands[1]); + } + break; + case "EXPENSE": + String paidBy = commands[1]; + Double amount = Double.parseDouble(commands[2]); + int noOfUsers = Integer.parseInt(commands[3]); + String expenseType = commands[4 + noOfUsers]; + List splits = new ArrayList<>(); + switch (expenseType){ + case "EXACT": + for(int i=0;i splits, ExpenseMetaData metaData) { + super(amount, paidBy, splits, metaData); + } + + @Override + public boolean validate() { + List splits = getSplits(); + + for(Split split:splits) { + if (!(split instanceof EqualSplit)){ + return false; + } + } + + return true; + } +} diff --git a/src/com/gaurparas/EqualSplit.java b/src/com/gaurparas/EqualSplit.java new file mode 100644 index 0000000..4564b27 --- /dev/null +++ b/src/com/gaurparas/EqualSplit.java @@ -0,0 +1,8 @@ +package com.gaurparas; + +public class EqualSplit extends Split { + + public EqualSplit(User user) { + super(user); + } +} diff --git a/src/com/gaurparas/ExactExpense.java b/src/com/gaurparas/ExactExpense.java new file mode 100644 index 0000000..fad806f --- /dev/null +++ b/src/com/gaurparas/ExactExpense.java @@ -0,0 +1,25 @@ +package com.gaurparas; + +import java.util.List; + +public class ExactExpense extends Expense { + + public ExactExpense(double amount, User paidBy, List splits, ExpenseMetaData metaData) { + super(amount, paidBy, splits, metaData); + } + + @Override + public boolean validate() { + List splits = getSplits(); + double splitsAmount = 0; + + for(Split split:splits) { + if (!(split instanceof EqualSplit)){ + return false; + } + splitsAmount+=split.getAmount(); + } + + return splitsAmount == getAmount(); + } +} diff --git a/src/com/gaurparas/ExactSplit.java b/src/com/gaurparas/ExactSplit.java new file mode 100644 index 0000000..8bb1689 --- /dev/null +++ b/src/com/gaurparas/ExactSplit.java @@ -0,0 +1,9 @@ +package com.gaurparas; + +public class ExactSplit extends Split { + + public ExactSplit(User user, double amount) { + super(user); + this.amount = amount; + } +} diff --git a/src/com/gaurparas/Expense.java b/src/com/gaurparas/Expense.java new file mode 100644 index 0000000..bad742a --- /dev/null +++ b/src/com/gaurparas/Expense.java @@ -0,0 +1,60 @@ +package com.gaurparas; + +import java.util.List; + +public abstract class Expense { + private String id; + private List splits; + private User paidBy; + private double amount; + private ExpenseMetaData metaData; + + public Expense(double amount, User paidBy, List splits, ExpenseMetaData metaData) { + this.amount = amount; + this.paidBy = paidBy; + this.splits = splits; + this.metaData = metaData; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public double getAmount() { + return amount; + } + + public void setAmount(double amount) { + this.amount = amount; + } + + public User getPaidBy() { + return paidBy; + } + + public void setPaidBy(User paidBy) { + this.paidBy = paidBy; + } + + public List getSplits() { + return splits; + } + + public void setSplits(List splits) { + this.splits = splits; + } + + public ExpenseMetaData getMetadata() { + return metaData; + } + + public void setMetadata(ExpenseMetaData metaData) { + this.metaData = metaData; + } + + public abstract boolean validate(); +} diff --git a/src/com/gaurparas/ExpenseManager.java b/src/com/gaurparas/ExpenseManager.java new file mode 100644 index 0000000..dbcaed6 --- /dev/null +++ b/src/com/gaurparas/ExpenseManager.java @@ -0,0 +1,83 @@ +package com.gaurparas; + +import com.sun.deploy.cache.BaseLocalApplicationProperties; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ExpenseManager { + + List expenses; + Map userMap; + Map> balanceSheet; + + public ExpenseManager() { + expenses = new ArrayList(); + userMap = new HashMap(); + balanceSheet = new HashMap>(); + } + + public void addUser(User user) { + userMap.put(user.getId(), user); + balanceSheet.put(user.getId(), new HashMap()); + } + + public void showBalances() { + boolean isEmpty = true; + for(Map.Entry> allBalance : balanceSheet.entrySet()) { + for (Map.Entry userBalance : allBalance.getValue().entrySet()) { + if (userBalance.getValue() > 0) { + isEmpty = false; + printBalance(allBalance.getKey(), userBalance.getKey(), userBalance.getValue()); + } + } + } + if (isEmpty) { + System.out.println("No balances"); + } + } + + public void showBalance(String userId) { + boolean isEmpty = true; + for(Map.Entry userBalance : balanceSheet.get(userId).entrySet()) { + if(userBalance.getValue() != 0){ + isEmpty = false; + printBalance(userId, userBalance.getKey(), userBalance.getValue()); + } + } + if (isEmpty) { + System.out.println("No balances"); + } + } + + private void printBalance(String user1, String user2, Double amount) { + String user1Name = userMap.get(user1).getName(); + String user2Name = userMap.get(user2).getName(); + if (amount < 0) { + System.out.println(user1Name + " owes " + user2Name + ": " + Math.abs(amount)); + } else if (amount > 0) { + System.out.println(user2Name + " owes " + user1Name + ": " + Math.abs(amount)); + } + } + + public void addExpense(ExpenseType expenseType, Double amount, String paidBy, + List splits, ExpenseMetaData metaData) { + Expense expense = ExpenseService.createExpense(expenseType, amount, userMap.get(paidBy), + splits, metaData); + expenses.add(expense); + + Map userBalances = balanceSheet.get(paidBy); + for(Split split:splits) { + String oweUser = split.getUser().getId(); + double prevAmount = userBalances.getOrDefault(oweUser,0.0); + double currentAmount = split.getAmount(); + userBalances.put(oweUser,prevAmount + currentAmount); + + Map OweUserBalances = balanceSheet.get(oweUser); + prevAmount = OweUserBalances.getOrDefault(paidBy,0.0); + OweUserBalances.put(paidBy,prevAmount - currentAmount); + } + } +} diff --git a/src/com/gaurparas/ExpenseMetaData.java b/src/com/gaurparas/ExpenseMetaData.java new file mode 100644 index 0000000..61dc5ba --- /dev/null +++ b/src/com/gaurparas/ExpenseMetaData.java @@ -0,0 +1,37 @@ +package com.gaurparas; + +public class ExpenseMetaData { + private String name; + private String imgUrl; + private String notes; + + public ExpenseMetaData(String name, String imgUrl, String notes) { + this.name = name; + this.imgUrl = imgUrl; + this.notes = notes; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } +} diff --git a/src/com/gaurparas/ExpenseService.java b/src/com/gaurparas/ExpenseService.java new file mode 100644 index 0000000..32738eb --- /dev/null +++ b/src/com/gaurparas/ExpenseService.java @@ -0,0 +1,29 @@ +package com.gaurparas; + +import java.util.List; + +public class ExpenseService { + public static Expense createExpense(ExpenseType expenseType, double amount, User paidBy, + List splits, ExpenseMetaData metaData) { + switch (expenseType) { + case EXACT: + return new ExactExpense(amount, paidBy, splits, metaData); + case EQUAL: + int totalSplits = splits.size(); + double splitAmount = ((double) Math.round(amount*100/totalSplits))/100.0; + for(Split split:splits){ + split.setAmount(splitAmount); + } + splits.get(0).setAmount(splitAmount + (amount-splitAmount*totalSplits)); + return new EqualExpense(amount, paidBy, splits, metaData); + case PERCENT: + for(Split split:splits){ + double percentSplit = ((PercentSplit)split).getPercent(); + split.setAmount(amount*percentSplit/100); + } + return new PercentExpense(amount, paidBy, splits, metaData); + default: + return null; + } + } +} diff --git a/src/com/gaurparas/ExpenseType.java b/src/com/gaurparas/ExpenseType.java new file mode 100644 index 0000000..6eb856c --- /dev/null +++ b/src/com/gaurparas/ExpenseType.java @@ -0,0 +1,7 @@ +package com.gaurparas; + +public enum ExpenseType { + EQUAL, + EXACT, + PERCENT +} diff --git a/src/com/gaurparas/PercentExpense.java b/src/com/gaurparas/PercentExpense.java new file mode 100644 index 0000000..a139d71 --- /dev/null +++ b/src/com/gaurparas/PercentExpense.java @@ -0,0 +1,27 @@ +package com.gaurparas; + +import java.util.List; + +public class PercentExpense extends Expense{ + + + public PercentExpense(double amount, User paidBy, List splits, ExpenseMetaData metaData) { + super(amount, paidBy, splits, metaData); + } + + @Override + public boolean validate() { + List splits = getSplits(); + double splitsPercent = 0; + double total = 100; + + for(Split split:splits) { + if (!(split instanceof PercentSplit)){ + return false; + } + splitsPercent+=((PercentSplit) split).getPercent(); + } + + return splitsPercent == total; + } +} diff --git a/src/com/gaurparas/PercentSplit.java b/src/com/gaurparas/PercentSplit.java new file mode 100644 index 0000000..c2dde93 --- /dev/null +++ b/src/com/gaurparas/PercentSplit.java @@ -0,0 +1,18 @@ +package com.gaurparas; + +public class PercentSplit extends Split { + double percent; + + public PercentSplit(User user, double percent) { + super(user); + this.percent = percent; + } + + public double getPercent() { + return percent; + } + + public void setPercent(double percent) { + this.percent = percent; + } +} diff --git a/src/com/gaurparas/Split.java b/src/com/gaurparas/Split.java new file mode 100644 index 0000000..c82b81a --- /dev/null +++ b/src/com/gaurparas/Split.java @@ -0,0 +1,26 @@ +package com.gaurparas; + +public abstract class Split { + private User user; + double amount; + + public Split(User user) { + this.user = user; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public double getAmount() { + return amount; + } + + public void setAmount(double amount) { + this.amount = amount; + } +} diff --git a/src/com/gaurparas/User.java b/src/com/gaurparas/User.java new file mode 100644 index 0000000..7e612b4 --- /dev/null +++ b/src/com/gaurparas/User.java @@ -0,0 +1,47 @@ +package com.gaurparas; + +public class User { + private String id; + private String name; + private String email; + private String phone; + + public User(String id, String name, String email, String phone) { + this.id = id; + this.name = name; + this.email = email; + this.phone = phone; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +}