/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠAlex i ĠBre Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Use Serial izers ( Uuid Serializer :: class ) Ċ Ċ package Ġtech . alex ib . y aba . model Ċ Ċ import Ġcom . ben ash er 4 4 . uuid . Uuid Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . Use Serial izers Ċ import Ġtech . alex ib . y aba . util . Uuid Serializer Ċ Ċ @ Serializable Ċ data Ġclass ĠAccount ( ĊĠĠĠ Ġval Ġid : ĠU uid , ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġcurrent Balance : ĠDouble , ĊĠĠĠ Ġval Ġavailable Balance : ĠDouble ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġcredit Limit : ĠDouble ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġmask : ĠString , ĊĠĠĠ Ġval ĠitemId : ĠU uid , ĊĠĠĠ Ġval Ġtype : ĠAccount Type , ĊĠĠĠ Ġval Ġsubtype : ĠAccount Subtype , ĊĠĠĠ Ġval Ġhidden : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval Ġinstitution Name : ĠString Ċ ) Ċ Ċ fun ĠList < Account >. available Cash Balance () Ġ= ĊĠĠĠ Ġthis . filter Ġ{ Ġit . type Ġ== ĠAccount Type . DE POSITORY Ġ&& Ġit . available Balance Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ. sum Of Ġ{ Ġit . available Balance Ġ?: Ġ 0 . 0 Ġ} Ċ Ċ fun ĠList < Account >. current Cash Balance () Ġ= ĊĠĠĠ Ġthis . filter Ġ{ Ġit . type Ġ== ĠAccount Type . DE POSITORY Ġ}. sum Of Ġ{ Ġit . current Balance Ġ} Ċ Ċ @ Serializable Ċ enum Ġclass ĠAccount Type Ġ{ ĊĠĠĠ ĠDE POSITORY , ĊĠĠĠ ĠC RED IT , ĊĠĠĠ ĠIN VE ST MENT , ĊĠĠĠ ĠLO AN , ĊĠĠĠ ĠOTHER Ċ } Ċ Ċ @ Serializable Ċ enum Ġclass ĠAccount Subtype ( val Ġtext : ĠString ) Ġ{ Ċ // ĠĠĠ ĠCHECK ING (" Checking "), Ċ // ĠĠĠ ĠS AV INGS (" S avings "), Ċ // ĠĠĠ ĠCD (" CD "), Ċ // ĠĠĠ ĠC RED IT _ CARD (" Credit Ġcard "), Ċ // ĠĠĠ ĠM ONE Y _ MARK ET (" Money Ġmarket "), Ċ // ĠĠĠ ĠI RA (" IRA "), Ċ // ĠĠĠ ĠFO UR _ H UND RED _ ONE _ K (" 4 0 1 k "), Ċ // ĠĠĠ ĠST UD ENT (" Student ĠLo an "), Ċ // ĠĠĠ ĠM ORT G AGE (" M ort gage "), ĊĠĠĠ ĠFO UR _ H UND RED _ ONE _ A (" 4 0 1 a "), ĊĠĠĠ ĠFO UR _ H UND RED _ ONE _ K (" 4 0 1 k "), ĊĠĠĠ ĠFO UR _ H UND RED _ TH REE _ B (" 4 0 3 B "), ĊĠĠĠ ĠFO UR _ H UND RED _ FI F TY _ SE VEN _ B (" 4 5 7 b "), ĊĠĠĠ ĠF IVE _ H UND RED _ TW ENT Y _ N INE (" 5 2 9 "), ĊĠĠĠ ĠBRO KER AGE (" Broker age "), ĊĠĠĠ ĠC ASH _ ISA (" Cash ĠIS A "), ĊĠĠĠ ĠE DU C ATION _ SA V INGS _ ACCOUNT (" education Ġs avings Ġaccount "), ĊĠĠĠ ĠG IC (" g ic "), ĊĠĠĠ ĠHE ALTH _ RE IM B URSE MENT _ AR RANGE MENT (" health Ġre im bur sement Ġarrange ment "), ĊĠĠĠ ĠH SA (" h sa "), ĊĠĠĠ ĠIS A (" isa "), ĊĠĠĠ ĠI RA (" ira "), ĊĠĠĠ ĠL IF (" lif "), ĊĠĠĠ ĠL IRA (" li ra "), ĊĠĠĠ ĠLR IF (" lr if "), ĊĠĠĠ ĠLR SP (" lr sp "), ĊĠĠĠ ĠNON _ T AX ABLE _ BRO KER AGE _ ACCOUNT (" non - tax able Ġbroker age Ġaccount "), ĊĠĠĠ ĠOTHER (" other "), ĊĠĠĠ ĠPR IF (" pr if "), ĊĠĠĠ ĠRD SP (" rd sp "), ĊĠĠĠ ĠRESP (" resp "), ĊĠĠĠ ĠR LI F (" rl if "), ĊĠĠĠ ĠRR IF (" rr if "), ĊĠĠĠ ĠP ENSION (" pension "), ĊĠĠĠ ĠPROF IT _ SH AR ING _ PLAN (" profit Ġsharing Ġplan "), ĊĠĠĠ ĠRET I RE MENT (" ret ire ment "), ĊĠĠĠ ĠR OTH (" ro th "), ĊĠĠĠ ĠR OTH _ 4 0 1 _ K (" ro th Ġ 4 0 1 k "), ĊĠĠĠ ĠRR SP (" rr sp "), ĊĠĠĠ ĠSE P _ IRA (" sep Ġir a "), ĊĠĠĠ ĠS IMP LE _ IRA (" simple Ġir a "), ĊĠĠĠ ĠSIP P (" si pp "), ĊĠĠĠ ĠSTO CK _ PLAN (" stock Ġplan "), ĊĠĠĠ ĠT HR IFT _ SA V INGS _ PLAN (" thrift Ġs avings Ġplan "), ĊĠĠĠ ĠTF SA (" tf sa "), ĊĠĠĠ ĠTR UST (" trust "), ĊĠĠĠ ĠU G MA (" ug ma "), ĊĠĠĠ ĠUT MA (" ut ma "), ĊĠĠĠ ĠVARIABLE _ AN NU ITY (" variable Ġan nu ity "), ĊĠĠĠ ĠC RED IT _ CARD (" credit Ġcard "), ĊĠĠĠ ĠP AY PAL (" paypal "), ĊĠĠĠ ĠCD (" cd "), ĊĠĠĠ ĠCHECK ING (" checking "), ĊĠĠĠ ĠS AV INGS (" sav ings "), ĊĠĠĠ ĠM ONE Y _ MARK ET (" money Ġmarket "), ĊĠĠĠ ĠPRE PA ID (" pre paid "), ĊĠĠĠ ĠAUTO (" auto "), ĊĠĠĠ ĠCOMM ER CIAL (" commercial "), ĊĠĠĠ ĠCON STR UCTION (" construction "), ĊĠĠĠ ĠCON SUM ER (" consumer "), ĊĠĠĠ ĠHOME (" home "), ĊĠĠĠ ĠHOME _ EQ U ITY (" home Ġequ ity "), ĊĠĠĠ ĠLO AN (" loan "), ĊĠĠĠ ĠM ORT G AGE (" mort gage "), ĊĠĠĠ ĠOVER DR AFT (" over draft "), ĊĠĠĠ ĠLINE _ OF _ CRED IT (" line Ġof Ġcredit "), ĊĠĠĠ ĠST UD ENT (" student "), ĊĠĠĠ ĠC ASH _ MANAGE MENT (" cash Ġmanagement "), ĊĠĠĠ ĠK EO GH (" ke og h "), ĊĠĠĠ ĠMUTUAL _ F UND (" mut ual Ġfund "), ĊĠĠĠ ĠRE CUR RING (" recurring "), ĊĠĠĠ ĠRE WAR DS (" rewards "), ĊĠĠĠ ĠSA FE _ DE POSIT (" safe Ġdeposit "), ĊĠĠĠ ĠS AR SEP (" s arse p ") Ċ } Ċ Ċ // ĠTODO Ġthink Ġabout Ġimplementing Ġthis Ċ // Ġsealed Ġclass ĠAccount Model Ġ{ Ċ // ĠĠĠ Ġabstract Ġval Ġid : ĠU uid Ċ // ĠĠĠ Ġabstract Ġval Ġname : ĠString Ċ // ĠĠĠ Ġabstract Ġval Ġcurrent Balance : ĠDouble Ċ // ĠĠĠ Ġabstract Ġval Ġmask : ĠString Ċ // ĠĠĠ Ġabstract Ġval ĠitemId : ĠU uid Ċ // ĠĠĠ Ġabstract Ġval Ġhidden : ĠBoolean Ċ // ĠĠĠ Ġabstract Ġval Ġinstitution Name : ĠString Ċ // Ġ} Ċ // Ċ // Ġdata Ġclass ĠDep osit ory Account ( Ċ // ĠĠĠ Ġoverride Ġval Ġid : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġname : ĠString , Ċ // ĠĠĠ Ġoverride Ġval Ġcurrent Balance : ĠDouble , Ċ // ĠĠĠ Ġval Ġavailable Balance : ĠDouble ? Ġ= Ġnull , Ċ // ĠĠĠ Ġoverride Ġval Ġmask : ĠString , Ċ // ĠĠĠ Ġoverride Ġval ĠitemId : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġhidden : ĠBoolean Ġ= Ġfalse , Ċ // ĠĠĠ Ġoverride Ġval Ġinstitution Name : ĠString , Ċ // ĠĠĠ Ġval Ġtype : ĠType Ċ // Ġ) Ġ: ĠAccount Model () Ġ{ Ċ // ĠĠĠ Ġenum Ġclass ĠType Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠCHECK ING , Ċ // ĠĠĠĠĠĠĠ ĠS AV INGS , Ċ // ĠĠĠĠĠĠĠ ĠM ONE Y _ MARK ET , Ċ // ĠĠĠĠĠĠĠ ĠCD Ċ // ĠĠĠ Ġ} Ċ // Ġ} Ċ // Ċ // Ġdata Ġclass ĠCredit Card Account ( Ċ // ĠĠĠ Ġoverride Ġval Ġid : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġname : ĠString , Ċ // ĠĠĠ Ġoverride Ġval Ġcurrent Balance : ĠDouble , Ċ // ĠĠĠ Ġval Ġlimit : ĠDouble , Ċ // ĠĠĠ Ġoverride Ġval Ġmask : ĠString , Ċ // ĠĠĠ Ġoverride Ġval ĠitemId : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġhidden : ĠBoolean Ġ= Ġfalse , Ċ // ĠĠĠ Ġoverride Ġval Ġinstitution Name : ĠString , Ċ // Ġ) Ġ: ĠAccount Model () Ċ // Ċ // Ġdata Ġclass ĠInvest ment Account ( Ċ // ĠĠĠ Ġoverride Ġval Ġid : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġname : ĠString , Ċ // ĠĠĠ Ġoverride Ġval Ġcurrent Balance : ĠDouble , Ċ // ĠĠĠ Ġoverride Ġval Ġmask : ĠString , Ċ // ĠĠĠ Ġoverride Ġval ĠitemId : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġhidden : ĠBoolean Ġ= Ġfalse , Ċ // ĠĠĠ Ġoverride Ġval Ġinstitution Name : ĠString , Ċ // ĠĠĠ Ġval Ġtype : ĠType Ċ // Ġ) Ġ: ĠAccount Model () Ġ{ Ċ // ĠĠĠ Ġenum Ġclass ĠType Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠI RA , Ċ // ĠĠĠĠĠĠĠ ĠFO UR _ H UND RED _ ONE _ K , Ċ // ĠĠĠ Ġ} Ċ // Ġ} Ċ // Ċ // Ġdata Ġclass ĠLo an Account ( Ċ // ĠĠĠ Ġoverride Ġval Ġid : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġname : ĠString , Ċ // ĠĠĠ Ġoverride Ġval Ġcurrent Balance : ĠDouble , Ċ // ĠĠĠ Ġoverride Ġval Ġmask : ĠString , Ċ // ĠĠĠ Ġoverride Ġval ĠitemId : ĠU uid , Ċ // ĠĠĠ Ġoverride Ġval Ġhidden : ĠBoolean Ġ= Ġfalse , Ċ // ĠĠĠ Ġoverride Ġval Ġinstitution Name : ĠString , Ċ // ĠĠĠ Ġval Ġtype : ĠType Ċ // Ġ) Ġ: ĠAccount Model () Ġ{ Ċ // ĠĠĠ Ġenum Ġclass ĠType Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠST UD ENT , Ċ // ĠĠĠĠĠĠĠ ĠM ORT G AGE Ċ // ĠĠĠ Ġ} Ċ // Ġ} Ċ // Ċ // Ġfun ĠAccount . to Model (): ĠAccount Model Ġ= Ġwhen Ġ( this . type ) Ġ{ Ċ // ĠĠĠ ĠAccount Type . DE POSITORY Ġ-> ĠDep osit ory Account ( Ċ // ĠĠĠĠĠĠĠ Ġid Ġ= Ġid , Ċ // ĠĠĠĠĠĠĠ Ġname Ġ= Ġname , Ċ // ĠĠĠĠĠĠĠ Ġcurrent Balance Ġ= Ġcurrent Balance , Ċ // ĠĠĠĠĠĠĠ Ġavailable Balance Ġ= Ġavailable Balance , Ċ // ĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask , Ċ // ĠĠĠĠĠĠĠ ĠitemId Ġ= ĠitemId , Ċ // ĠĠĠĠĠĠĠ Ġhidden Ġ= Ġhidden , Ċ // ĠĠĠĠĠĠĠ Ġinstitution Name Ġ= Ġinstitution Name , Ċ // ĠĠĠĠĠĠĠ Ġtype Ġ= ĠDep osit ory Account . Type . valueOf ( subtype . name ) Ċ // ĠĠĠ Ġ) Ċ // ĠĠĠ ĠAccount Type . LO AN Ġ-> ĠLo an Account ( Ċ // ĠĠĠĠĠĠĠ Ġid Ġ= Ġid , Ċ // ĠĠĠĠĠĠĠ Ġname Ġ= Ġname , Ċ // ĠĠĠĠĠĠĠ Ġcurrent Balance Ġ= Ġcurrent Balance , Ċ // ĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask , Ċ // ĠĠĠĠĠĠĠ ĠitemId Ġ= ĠitemId , Ċ // ĠĠĠĠĠĠĠ Ġhidden Ġ= Ġhidden , Ċ // ĠĠĠĠĠĠĠ Ġinstitution Name Ġ= Ġinstitution Name , Ċ // ĠĠĠĠĠĠĠ Ġtype Ġ= ĠLo an Account . Type . valueOf ( subtype . name ) Ċ // ĠĠĠ Ġ) Ċ // ĠĠĠ ĠAccount Type . IN VE ST MENT Ġ-> ĠInvest ment Account ( Ċ // ĠĠĠĠĠĠĠ Ġid Ġ= Ġid , Ċ // ĠĠĠĠĠĠĠ Ġname Ġ= Ġname , Ċ // ĠĠĠĠĠĠĠ Ġcurrent Balance Ġ= Ġcurrent Balance , Ċ // ĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask , Ċ // ĠĠĠĠĠĠĠ ĠitemId Ġ= ĠitemId , Ċ // ĠĠĠĠĠĠĠ Ġhidden Ġ= Ġhidden , Ċ // ĠĠĠĠĠĠĠ Ġinstitution Name Ġ= Ġinstitution Name , Ċ // ĠĠĠĠĠĠĠ Ġtype Ġ= ĠInvest ment Account . Type . valueOf ( subtype . name ) Ċ // ĠĠĠ Ġ) Ċ // ĠĠĠ ĠAccount Type . CRED IT Ġ-> ĠCredit Card Account ( Ċ // ĠĠĠĠĠĠĠ Ġid Ġ= Ġid , Ċ // ĠĠĠĠĠĠĠ Ġname Ġ= Ġname , Ċ // ĠĠĠĠĠĠĠ Ġcurrent Balance Ġ= Ġcurrent Balance , Ċ // ĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask , Ċ // ĠĠĠĠĠĠĠ ĠitemId Ġ= ĠitemId , Ċ // ĠĠĠĠĠĠĠ Ġhidden Ġ= Ġhidden , Ċ // ĠĠĠĠĠĠĠ Ġinstitution Name Ġ= Ġinstitution Name , Ċ // ĠĠĠĠĠĠĠ Ġlimit Ġ= Ġcredit Limit Ġ?: Ġ 0 . 0 Ċ // ĠĠĠ Ġ) Ċ // Ġ} Ċ