package Ġorg . w ats i . domain . entities Ċ Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġorg . th reet en . bp . Clock Ċ import Ġorg . th reet en . bp . Instant Ċ import Ġorg . th reet en . bp . LocalDate Ċ import Ġorg . w ats i . domain . utils . Date Utils Ċ import Ġjava . io . Serializable Ċ import Ġjava . util . UUID Ċ Ċ data Ġclass ĠMember ( ĊĠĠĠ Ġval Ġid : ĠUUID , ĊĠĠĠ Ġval Ġen rolled At : ĠInstant , ĊĠĠĠ Ġval Ġhouse hold Id : ĠUUID ?, ĊĠĠĠ Ġval Ġphoto Id : ĠUUID ?, ĊĠĠĠ Ġval Ġthumbnail Photo Id : ĠUUID ?, ĊĠĠĠ Ġval Ġphoto Url : ĠString ?, ĊĠĠĠ Ġval Ġcard Id : ĠString ?, ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġgender : ĠGender , ĊĠĠĠ Ġval Ġlanguage : ĠString ?, ĊĠĠĠ Ġval Ġbirth date : ĠLocalDate , ĊĠĠĠ Ġval Ġbirth date Accuracy : ĠDate Accuracy Ġ= ĠDate Accuracy . Y , ĊĠĠĠ Ġval ĠphoneNumber : ĠString ?, ĊĠĠĠ Ġval Ġmembership Number : ĠString ?, ĊĠĠĠ Ġval Ġmedical Record Number : ĠString ?, ĊĠĠĠ Ġval Ġneeds Renew al : ĠBoolean ?, ĊĠĠĠ Ġval Ġrelationship To Head : ĠRelationship To Head ?, ĊĠĠĠ Ġval Ġarchived At : ĠInstant ?, ĊĠĠĠ Ġval Ġarchived Reason : ĠArch ived Reason ?, ĊĠĠĠ Ġval Ġrenew ed At : ĠInstant ?, ĊĠĠĠ Ġval Ġcoverage EndDate : ĠLocalDate ? Ċ ) Ġ: ĠSerializable Ġ{ ĊĊĠĠĠ Ġclass ĠMember NotFoundException ( message : ĠString ) Ġ: ĠException ( message ) ĊĊĠĠĠ Ġenum Ġclass ĠGender Ġ{ ĠM , ĠF Ġ} ĊĠĠĠ Ġenum Ġclass ĠDate Accuracy Ġ{ ĠY , ĠM , ĠD Ġ} ĊĠĠĠ Ġenum Ġclass ĠArch ived Reason Ġ{ ĊĠĠĠĠĠĠĠ ĠDE ATH , ĊĠĠĠĠĠĠĠ ĠDIV OR CE , ĊĠĠĠĠĠĠĠ ĠFOR MED _ OWN _ HO USE H OLD , ĊĠĠĠĠĠĠĠ ĠNO _ LON GER _ EL IG IBLE , ĊĠĠĠĠĠĠĠ ĠRE LOCATION , ĊĠĠĠĠĠĠĠ ĠUN PA ID , ĊĠĠĠĠĠĠĠ ĠOTHER ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠRelationship To Head Ġ{ ĊĠĠĠĠĠĠĠ ĠS ELF , ĊĠĠĠĠĠĠĠ ĠS PO USE , ĊĠĠĠĠĠĠĠ ĠCH ILD , ĊĠĠĠĠĠĠĠ ĠP ARENT , ĊĠĠĠĠĠĠĠ ĠG RAND CHILD , ĊĠĠĠĠĠĠĠ ĠG RAN DP ARENT , ĊĠĠĠĠĠĠĠ ĠHO USE _ STA FF , ĊĠĠĠĠĠĠĠ ĠOTHER ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠMembers hip Status Ġ{ ĊĠĠĠĠĠĠĠ ĠACT IVE , ĊĠĠĠĠĠĠĠ ĠEX PI RED , ĊĠĠĠĠĠĠĠ ĠDE LETED , ĊĠĠĠĠĠĠĠ ĠUNKNOWN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Absent ee (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġphoto Url Ġ== Ġnull Ġ&& Ġthumbnail Photo Id Ġ== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Age Years ( clock : ĠClock ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDate Utils . get Years Ago ( birth date , Ġclock ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdiff ( previous : ĠMember ): ĠList < Delta > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson Builder (). serialize Null s (). create () ĊĠĠĠĠĠĠĠ Ġval Ġprevious Map Ġ= Ġgson . fromJson ( gson . toJson ( previous ), ĠMap :: class . java ) Ġas ĠMap < String , ĠAny ?> ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Map Ġ= Ġgson . fromJson ( gson . toJson ( this ), ĠMap :: class . java ) Ġas ĠMap < String , ĠAny ?> ĊĠĠĠĠĠĠĠ Ġval Ġdiff Fields Ġ= Ġcurrent Map . keys . filter Ġ{ Ġcurrent Map [ it ] Ġ!= Ġprevious Map [ it ] Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdiff Fields . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDelta ( action Ġ= ĠDelta . Action . EDIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Name Ġ= ĠDelta . ModelName . MEMBER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Id Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Age Months ( clock : ĠClock ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDate Utils . getMonth s Ago ( birth date , Ġclock ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Age Days ( clock : ĠClock ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDate Utils . get Days Ago ( birth date , Ġclock ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġphoto Exists (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġphoto Url Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmember Status ( clock : ĠClock ): ĠMembers hip Status Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( house hold Id Ġ== Ġnull Ġ|| Ġcoverage EndDate Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMembers hip Status . UNKNOWN ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( relationship To Head Ġ== ĠRelationship To Head . SELF Ġ&& Ġarchived Reason Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMembers hip Status . DELETED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Date Ġ= ĠDate Utils . instant To LocalDate ( clock . instant (), Ġclock ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( coverage EndDate Ġ< Ġcurrent Date ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMembers hip Status . EXPI RED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMembers hip Status . ACTIVE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbene ficiary Status ( clock : ĠClock ): ĠMembers hip Status Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( house hold Id Ġ== Ġnull Ġ|| Ġcoverage EndDate Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMembers hip Status . UNKNOWN ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( arch ived Reason Ġ== ĠArch ived Reason . UN PA ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMembers hip Status . EXPI RED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( arch ived Reason Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMembers hip Status . DELETED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Date Ġ= ĠDate Utils . instant To LocalDate ( clock . instant (), Ġclock ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( coverage EndDate Ġ< Ġcurrent Date ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMembers hip Status . EXPI RED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMembers hip Status . ACTIVE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLANGUAGE _ CHO ICE _ OTHER Ġ= Ġ" Other " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLANGUAGE _ R UK IG A Ġ= Ġ" R uk iga " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLANGUAGE _ R UTO OR O Ġ= Ġ" R uto oro " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLANGUAGE _ K IN Y AR W AND A Ġ= Ġ" K iny ar w anda " ĊĠĠĠĠĠĠĠ Ġval ĠCOMMON _ L ANGU AGES Ġ= ĠlistOf ( LANGUAGE _ R UK IG A , ĠLANGUAGE _ R UTO OR O , ĠLANGUAGE _ K IN Y AR W AND A ) ĊĠĠĠĠĠĠĠ Ġval ĠLANGUAGE _ CHO ICES Ġ= ĠlistOf ( LANGUAGE _ R UK IG A , ĠLANGUAGE _ R UTO OR O , ĠLANGUAGE _ K IN Y AR W AND A , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLANGUAGE _ CHO ICE _ OTHER ) ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ AGE Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġsets Ġthe Ġlimit Ġon Ġthe Ġoldest Ġa Ġnew born Ġcan Ġbe Ġto Ġen roll . ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ NEW B OR N _ AGE _ IN _ MONTH S Ġ= Ġ 1 2 L ĊĊĠĠĠĠĠĠĠ Ġfun ĠisValid FullName ( name : ĠString , Ġmin Length : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname . split (' Ġ'). filter { Ġit . isNotBlank () Ġ}. count () Ġ>= Ġmin Length ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠisValid Medical Record Number ( medical Record Number : ĠString , Ġmin Length : ĠInt , ĠmaxLength : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmedical Record Number . length Ġin Ġmin Length .. maxLength ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠisValid Card Id ( card Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcard Id . matches ( Regex ("[ A - Z ]{ 3 }[ 0 - 9 ]{ 6 } ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġformat Card Id ( card Id : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"${ card Id . substring ( 0 , Ġ 3 )} Ġ${ card Id . substring ( 3 , Ġ 6 )} Ġ${ card Id . substring ( 6 , Ġ 9 )}" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ