package Ġcover os R 3 z . timer ec ording . utility Ċ Ċ import Ġcover os R 3 z . authentication . types . CurrentUser Ċ import Ġcover os R 3 z . authentication . types . Role Ċ import Ġcover os R 3 z . authentication . utility . IR o les Checker Ċ import Ġcover os R 3 z . authentication . utility . Roles Checker Ċ import Ġcover os R 3 z . persistence . types . DataAccess Ċ import Ġcover os R 3 z . persistence . utility . Pure Memory Database Ċ import Ġcover os R 3 z . system . logging . I Logger Ċ import Ġcover os R 3 z . system . misc . types . Date Ċ import Ġcover os R 3 z . system . misc . types . DayOfWeek Ċ import Ġcover os R 3 z . system . misc . types . calculate S unday Date Ċ import Ġcover os R 3 z . system . misc . types . day OfWeek Calc Ċ import Ġcover os R 3 z . timer ec ording . exceptions . Exceeded Daily Hours Amount Exception Ċ import Ġcover os R 3 z . timer ec ording . exceptions . Multiple Sub missions In Period Exception Ċ import Ġcover os R 3 z . timer ec ording . types .* Ċ Ċ class ĠTime Recording Utilities ( ĊĠĠĠ Ġval Ġp md : ĠPure Memory Database , ĊĠĠĠ Ġval Ġcu : ĠCurrent User , ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠILogger , ĊĠĠĠ Ġprivate Ġval Ġrc : ĠI Roles Checker Ġ= ĠRoles Checker Ċ ) Ġ: ĠI Time Recording Utilities Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtime Entry Invalid Bad Employee Ġ= Ġ" a Ġtime Ġentry Ġwith Ġa Ġnon - registered Ġemployee Ġis Ġinvalid " ĊĠĠĠ Ġprivate Ġval Ġtime Entry Invalid Bad Project Ġ= Ġ" a Ġtime Ġentry Ġwith Ġa Ġnon - registered Ġproject Ġis Ġinvalid " ĊĠĠĠ Ġprivate Ġval Ġemployee DataAccess : ĠData Access < Employee > Ġ= Ġp md . data Access ( Employee . directory Name ) ĊĠĠĠ Ġprivate Ġval Ġproject DataAccess : ĠData Access < Project > Ġ= Ġp md . data Access ( Project . directory Name ) ĊĠĠĠ Ġprivate Ġval Ġtime Entry DataAccess : ĠData Access < Time Entry > Ġ= Ġp md . data Access ( Time Entry . directory Name ) ĊĠĠĠ Ġprivate Ġval Ġsubmitted Periods DataAccess : ĠData Access < Submitted Period > Ġ= Ġp md . data Access ( Submitted Period . directory Name ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġspecial Ġcommand Ġto Ġchange Ġthe Ġcurrent Ġuser . Ġ ĠCare ful ĊĠĠĠĠ Ġ* Ġwho Ġyou Ġemp ower Ġto Ġuse Ġthis . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġchange User ( cu : ĠCurrent User ): ĠI Time Recording Utilities Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTime Recording Utilities ( pmd , Ġcu , Ġlogger , Ġrc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġregion Ġtime entries ĊĊĠĠĠ Ġoverride Ġfun ĠcreateTime Entry ( entry : ĠTime Entry Pre Database ): ĠRecord Time Result Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Or Modify Entry ( entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck IsValid Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Time Entry Ġ= Ġtime Entry DataAccess . act On Ġ{ Ġentries Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe Ġnew Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Index Ġ= Ġentries . next Index . get And Increment () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Trace ( cu ) Ġ{ Ġ" new Ġtime - entry Ġindex Ġis Ġ$ new Index " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Time Entry Ġ= ĠTime Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Entry Id ( new Index ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . employee , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . details ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentries . add ( new Time Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Trace ( cu ) Ġ{ Ġ" re corded Ġa Ġnew Ġtime Entry : Ġ$ new Time Entry " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Time Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{ Ġ" Creating Ġnew Ġtime Ġentry : Ġ${ new Time Entry . short String () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Time Entry ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck IsValid Entry ( entry : ĠTime Entry Pre Database ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġwill Ġthrow Ġan Ġexception Ġif Ġthe Ġproject Ġor Ġemployee Ġin ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġtime Ġentry Ġdon 't Ġexist Ġin Ġthe Ġlist Ġof Ġprojects Ġ/ Ġemployees ĊĠĠĠĠĠĠĠĠ Ġ* Ġor Ġis Ġmissing Ġin Ġthe Ġtime Ġentry ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġcheck ( find Project ById ( entry . project . id ) Ġ!= ĠNO _ PROJECT ) Ġ{ Ġtime Entry Invalid Bad Project Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( find Employee ById ( entry . employee . id ) Ġ!= ĠNO _ EMP LOY EE ) Ġ{ Ġtime Entry Invalid Bad Employee Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchange Entry ( entry : ĠTime Entry ): ĠRecord Time Result Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġval Ġold Entry Ġ= Ġfind Time Entry ById ( entry . id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Or Modify Entry ( entry . to Time Entry Pre Database (), Ġold Entry Ġ= Ġold Entry ) Ġ{ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Pre Database Ġ= Ġentry . to Time Entry Pre Database () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck IsValid Entry ( entry Pre Database ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( old Entry . employee Ġ== Ġentry . employee ) Ġ{ Ġ" Employee Ġfield Ġof Ġa Ġtime Ġentry Ġmay Ġnot Ġbe Ġchanged " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Entry DataAccess . act On Ġ{ Ġentries Ġ-> Ġentries . update ( entry ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{ Ġ" modified Ġan Ġexisting Ġtime Entry : Ġ$ entry " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Trace ( cu ) Ġ{ Ġ" old Ġtime - entry Ġis Ġ$ old Entry Ġand Ġnew Ġtime - entry Ġis Ġ$ entry " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{ Ġ" over writing Ġold Ġentry Ġwith Ġnew Ġentry . Ġold : Ġ${ old Entry . short String ()} Ġ Ġnew : Ġ${ entry . short String ()} "} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Or Modify Entry ( entry : ĠTime Entry Pre Database , Ġold Entry : ĠTime Entry Ġ= ĠNO _ TIME ENTRY , Ġbehavior : Ġ() Ġ-> ĠTime Entry ): ĠRecord Time Result { ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcu ĊĠĠĠĠĠĠĠ Ġ// Ġensure Ġtime Ġentry Ġuser Ġis Ġthe Ġlogged Ġin Ġuser , Ġor ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġthe Ġsystem ĊĠĠĠĠĠĠĠ Ġif Ġ( user . employee Ġ!= Ġentry . employee ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Warn ( cu ) Ġ{" time Ġwas Ġnot Ġrecorded Ġsuccessfully : Ġcurrent Ġuser Ġ${ user . name . value } Ġdoes Ġnot Ġhave Ġaccess Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġmodify Ġtime Ġfor Ġ${ entry . employee . name . value } "} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRecord Time Result ( Status Enum . USER _ EMP LOY EE _ MIS MATCH , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfirm LessThan 2 4 Hours ( entry . time , Ġentry . employee , Ġentry . date , Ġold Entry ) ĊĠĠĠĠĠĠĠ Ġif ( isIn AS ub mitted Period ( entry . employee , Ġentry . date )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRecord Time Result ( Status Enum . LOCK ED _ AL READY _ SUBMIT TED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Time Entry Ġ= Ġbehavior () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecord Time Result ( Status Enum . SUCCESS , Ġnew Time Entry ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{" Error Ġadding Ġtime Ġentry : Ġ${ ex . message } "} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ex . message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Entry Invalid Bad Employee Ġ-> ĠRecord Time Result ( Status Enum . INVALID _ EMP LOY EE , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Entry Invalid Bad Project Ġ-> ĠRecord Time Result ( Status Enum . INVALID _ PROJECT , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRecord Time Result ( Status Enum . NULL , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfirm LessThan 2 4 Hours ( time : ĠTime , Ġemployee : ĠEmployee , Ġdate : ĠDate , Ġold Entry : ĠTime Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{" confirm ing Ġtotal Ġtime Ġis Ġless Ġthan Ġ 2 4 Ġhours "} ĊĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġthe Ġemployee Ġhas Ġa Ġtotal Ġ( new Ġplus Ġexisting ) Ġof Ġless Ġthan Ġ 2 4 Ġhours ĊĠĠĠĠĠĠĠ Ġval Ġminutes Re corded Ġ: ĠTime Ġ= Ġ Ġtime Entry DataAccess . read ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ( time Entries ): ĠTime Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġemployee Ġhasn 't Ġentered Ġany Ġtime Ġon Ġthis Ġdate , Ġreturn Ġ 0 Ġminutes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Minutes Ġ= Ġtime Entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . date Ġ== Ġdate Ġ&& Ġit . employee Ġ== Ġemployee Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum By Ġ{ Ġte Ġ-> Ġte . time . numberOf Minutes Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTime ( total Minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġtw enty Four Hours Ġ= Ġ 2 4 Ġ* Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġemployee Ġis Ġentering Ġin Ġmore Ġthan Ġ 2 4 Ġhours Ġin Ġa Ġday , Ġthat 's Ġinvalid . ĊĊĠĠĠĠĠĠĠ Ġval Ġexisting Plus New Minutes Ġ= Ġif Ġ( old Entry Ġ== ĠNO _ TIME ENTRY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Trace ( cu ) Ġ{ Ġ" creating Ġa Ġnew Ġtime Ġentry " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġminutes Re corded . numberOf Minutes Ġ+ Ġtime . numberOf Minutes ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Trace ( cu ) Ġ{ Ġ" editing Ġa Ġtime Ġentry " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġminutes Re corded . numberOf Minutes Ġ- Ġold Entry . time . numberOf Minutes Ġ+ Ġtime . numberOf Minutes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( existing Plus New Minutes Ġ> Ġtw enty Four Hours ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{" More Ġminutes Ġentered Ġ($ existing Plus New Minutes ) Ġthan Ġexists Ġin Ġa Ġday Ġ( 1 4 4 0 ) "} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEx ceeded Daily Hours Amount Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetTime Entries For Time Period ( employee : ĠEmployee , Ġtime Period : ĠTime Period ): ĠSet < Time Entry > Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Entry DataAccess . read Ġ{ Ġtime Entries Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Entries . filter Ġ{ Ġit . employee Ġ== Ġemployee Ġ&& Ġtime Period . contains ( it . date ) Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Time Entry ( time Entry : ĠTime Entry ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġval Ġdid Delete Ġ= Ġtime Entry DataAccess . act On Ġ{ Ġtime entries Ġ-> Ġtime entries . remove ( time Entry ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! did Delete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" failed Ġto Ġfind Ġthis Ġtime Ġentry Ġto Ġdelete : Ġ${ time Entry . short String () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{ Ġ" Deleted Ġtime Ġentry : Ġ${ time Entry . short String ()} Ġ" Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Time Entry ById ( id : ĠTime Entry Id ): ĠTime Entry Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( time Entry DataAccess . read Ġ{ Ġtime entries Ġ-> Ġtime entries . count Ġ{ Ġit . id Ġ== Ġid Ġ} Ġin Ġ 0 .. 1 Ġ}) Ġ{ Ġ" There Ġmust Ġbe Ġ 0 Ġor Ġ 1 Ġtime Ġentry Ġwith Ġid Ġof Ġ$ id " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Entry DataAccess . read Ġ{ Ġtime entries Ġ-> Ġtime entries . single OrNull Ġ{ Ġit . id Ġ== Ġid Ġ} Ġ?: ĠNO _ TIME ENTRY Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Entries For Employee On Date ( employee : ĠEmployee , Ġdate : ĠDate ): ĠSet < Time Entry > Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Entry DataAccess . read Ġ{ Ġtime Entries Ġ-> Ġtime Entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . employee Ġ== Ġemployee Ġ&& Ġit . date Ġ== Ġdate Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Entries For Employee ( employee : ĠEmployee ): ĠSet < Time Entry > Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Entry DataAccess . read Ġ{ Ġtime Entries Ġ-> Ġtime Entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . employee Ġ== Ġemployee Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġprojects ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Project ( projectName : ĠProject Name ) Ġ: ĠProject Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . ADMIN , ĠRole . SYSTEM ) ĊĠĠĠĠĠĠĠ Ġrequire ( find Project ByName ( projectName ) Ġ== ĠNO _ PROJECT ) Ġ{" Cannot Ġcreate Ġa Ġnew Ġproject Ġif Ġone Ġalready Ġexists Ġby Ġthat Ġsame Ġname "} ĊĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{" Creating Ġa Ġnew Ġproject , Ġ\" ${ projectName . value }\ "" } ĊĊĠĠĠĠĠĠĠ Ġreturn Ġproject DataAccess . act On Ġ{ Ġprojects Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Project Ġ= ĠProject ( ProjectId ( projects . next Index . get And Increment ()), ĠProject Name ( projectName . value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojects . add ( new Project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{ Ġ" Re corded Ġa Ġnew Ġproject , Ġ\" ${ projectName . value }\ ", Ġid : Ġ${ new Project . id . value }, Ġto Ġthe Ġdatabase " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Project ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlist All Projects (): ĠList < Project > Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġreturn Ġproject DataAccess . read Ġ{ Ġit . toList () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Project ById ( id : ĠProject Id ): ĠProject Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġcheck ( project DataAccess . read Ġ{ Ġit . count Ġ{ Ġp Ġ-> Ġp . id Ġ== Ġid Ġ} Ġin Ġ 0 .. 1 Ġ}) Ġ{" There Ġmust Ġbe Ġ 0 Ġor Ġ 1 Ġproject Ġwith Ġid Ġof Ġ$ id "} ĊĠĠĠĠĠĠĠ Ġreturn Ġproject DataAccess . read Ġ{ Ġit . single OrNull Ġ{ Ġp Ġ-> Ġp . id Ġ== Ġid Ġ} Ġ?: ĠNO _ PROJECT Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Project ByName ( name : ĠProject Name ): ĠProject Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( project DataAccess . read Ġ{ Ġit . count Ġ{ Ġp Ġ-> Ġp . name Ġ== Ġname Ġ} Ġin Ġ 0 .. 1 Ġ}) Ġ{" There Ġmust Ġbe Ġ 0 Ġor Ġ 1 Ġproject Ġwith Ġname Ġof Ġ${ name . value } "} ĊĠĠĠĠĠĠĠ Ġreturn Ġproject DataAccess . read Ġ{ Ġit . single OrNull Ġ{ Ġp Ġ-> Ġp . name Ġ== Ġname Ġ} Ġ?: ĠNO _ PROJECT Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Project ( project : ĠProject ): ĠDelete Project Result Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġval Ġfound Project Ġ= Ġproject DataAccess . read Ġ{ Ġit . single OrNull Ġ{ Ġp Ġ-> Ġp . id Ġ== Ġproject . id Ġ} Ġ?: ĠNO _ PROJECT Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( found Project Ġ!= ĠNO _ PROJECT ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( time Entry DataAccess . read Ġ{ Ġtime entries Ġ-> Ġtime entries . any { Ġit . project Ġ== Ġproject Ġ} Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDelete Project Result . USED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject DataAccess . act On Ġ{ Ġprojects Ġ-> Ġprojects . remove ( project ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{ Ġ" deleted Ġproject : Ġ${ project . name . value } Ġid : Ġ${ project . id . value }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDelete Project Result . SUCCESS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Employee ( employee : ĠEmployee ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{ Ġ" deleted Ġemployee : Ġ${ employee . name . value } Ġid : Ġ${ employee . id . value }" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire Ġ( employee Ġ!= ĠNO _ EMP LOY EE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġemployee DataAccess . act On Ġ{ Ġemployees Ġ-> Ġemployees . remove ( employee ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Project Used For Time Entry ( project : ĠProject ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Ġ( project Ġ!= ĠNO _ PROJECT ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Entry DataAccess . read Ġ{ Ġtime entries Ġ-> Ġtime entries . any { Ġit . project Ġ== Ġproject Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetTime For Week ( employee : ĠEmployee , Ġtoday Date : ĠDate ): ĠTime Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( employee Ġ!= ĠNO _ EMP LOY EE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġs unday Ġ= Ġcalculate S unday Date ( today Date ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġget ĠS unday Ġas Ġan Ġepoch Ġday ĊĠĠĠĠĠĠĠ Ġval Ġs unday ED Ġ= Ġs unday . epoch Day ĊĠĠĠĠĠĠĠ Ġrequire Ġ( day OfWeek Calc ( s unday ED ) Ġ== ĠDay OfWeek . S unday ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtotal Minutes Over Week Ġ= Ġtime Entry DataAccess . read Ġ{ Ġtime entries Ġ-> Ġtime entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( s unday ED .. ( s unday ED Ġ+ Ġ 6 )). contains ( it . date . epoch Day ) Ġ&& Ġit . employee Ġ== Ġemployee Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum By Ġ{ Ġit . time . numberOf Minutes Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTime ( total Minutes Over Week ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġemployees ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Employee ( employ e ename : ĠEmployee Name ) Ġ: ĠEmployee Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . ADMIN , ĠRole . SYSTEM ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Employee Ġ= Ġ Ġemployee DataAccess . act On Ġ{ Ġemployees Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Employee Ġ= ĠEmployee ( Employee Id ( employees . next Index . get And Increment ()), ĠEmployee Name ( employ e ename . value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemployees . add ( new Employee ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{ Ġ" Re corded Ġa Ġnew Ġemployee , Ġ\" ${ employ e ename . value }\ ", Ġid : Ġ${ new Employee . id . value }, Ġto Ġthe Ġdatabase " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Employee ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{" Created Ġa Ġnew Ġemployee , Ġ\" ${ new Employee . name . value }\ "" } ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Employee ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Employee ById ( id : ĠEmployee Id ): ĠEmployee Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġcheck ( employee DataAccess . read Ġ{ Ġemployees Ġ-> Ġemployees . count Ġ{ it . id Ġ== Ġid } Ġ} Ġin Ġ 0 .. 1 ) Ġ{" There Ġmust Ġbe Ġ 0 Ġor Ġ 1 Ġemployee Ġwith Ġid Ġof Ġ$ id "} ĊĠĠĠĠĠĠĠ Ġreturn Ġemployee DataAccess . read Ġ{ Ġemployees Ġ-> Ġemployees . single OrNull Ġ{ it . id Ġ== Ġid } Ġ?: ĠNO _ EMP LOY EE Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Employee ByName ( name : ĠEmployee Name ): ĠEmployee Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġcheck ( employee DataAccess . read Ġ{ Ġemployees Ġ-> Ġemployees . count Ġ{ it . name Ġ== Ġname } Ġ} Ġin Ġ 0 .. 1 ) Ġ{" T There Ġmust Ġbe Ġ 0 Ġor Ġ 1 Ġemployee Ġwith Ġname Ġof Ġ${ name . value } "} ĊĠĠĠĠĠĠĠ Ġreturn Ġemployee DataAccess . read Ġ{ Ġemployees Ġ-> Ġemployees . single OrNull Ġ{ it . name Ġ== Ġname } Ġ?: ĠNO _ EMP LOY EE Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlist All Employees (): ĠList < Employee > Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . SYSTEM , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN , ĠRole . NONE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġemployee DataAccess . read Ġ{ Ġit . toList () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġsubmit t als ĊĊĠĠĠ Ġoverride Ġfun Ġsubmit Time Period ( time Period : ĠTime Period ): ĠSub mitted Period Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġval Ġexisting Submission Ġ= Ġget Submitted Time Period ( time Period ) ĊĠĠĠĠĠĠĠ Ġcheck Ġ( existing Submission Ġ== ĠNull Submitted Period ) Ġ{ Ġ" Cannot Ġsubmit Ġan Ġalready - submitted Ġperiod " Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{ Ġ" Submit ting Ġtime Ġperiod : Ġ${ time Period . start . stringValue } Ġto Ġ${ time Period . end . stringValue }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġalready Exists Ġ= Ġsubmitted Periods DataAccess . read Ġ{ Ġsubmissions Ġ-> Ġsubmissions . any { Ġit . employee Ġ== Ġcu . employee Ġ&& Ġit . bounds Ġ== Ġtime Period } Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( already Exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMultiple Sub missions In Period Exception (" A Ġsubmission Ġalready Ġexists Ġfor Ġ${ cu . employee . name . value } Ġon Ġ$ time Period ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsubmitted Periods DataAccess . act On { Ġsubmissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Submission Ġ= ĠSub mitted Period ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubmission Id ( submissions . next Index . get And Increment ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcu . employee , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Period , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAppro val Status . UN APPRO VED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{ Ġ" Re corded Ġa Ġnew Ġtime Ġperiod Ġsubmission ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġemployee Ġid Ġ\" ${ cu . employee . id . value }\ ", Ġid : Ġ${ new Submission . id . value }, Ġfrom Ġ${ new Submission . bounds . start . stringValue } Ġto Ġ${ new Submission . bounds . end . stringValue }, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġthe Ġdatabase " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmissions . add ( new Submission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Submission ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun submit Time Period ( time Period : ĠTime Period ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . REG ULAR , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġval Ġsubmitted Period Ġ= Ġget Submitted Time Period ( time Period ) ĊĠĠĠĠĠĠĠ Ġcheck Ġ( submitted Period Ġ!= ĠNull Submitted Period ) Ġ{ Ġ" Cannot Ġun submit Ġa Ġnon - submitted Ġperiod " Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . log Audit ( cu ) Ġ{ Ġ" Un submit ting Ġtime Ġperiod : Ġ${ time Period . start . stringValue } Ġto Ġ${ time Period . end . stringValue }" Ġ} ĊĠĠĠĠĠĠĠ Ġsubmitted Periods DataAccess . act On Ġ{ Ġsubmissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmissions . remove ( submitted Period ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Debug ( cu ) Ġ{ Ġ" Un submitted Ġa Ġtime Ġperiod Ġsubmission , Ġemployee Ġid Ġ\" ${ submitted Period . employee . id . value }\ ", Ġid : Ġ${ submitted Period . id . value }, Ġfrom Ġthe Ġdatabase " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Submitted Time Period ( time Period : ĠTime Period , Ġemployee : ĠEmployee ) Ġ: ĠSub mitted Period Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( submitted Periods DataAccess . read Ġ{ Ġsubmissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmissions . count Ġ{ Ġit . employee Ġ== Ġemployee Ġ&& Ġit . bounds Ġ== Ġtime Period Ġ} Ġin Ġ 0 .. 1 ĊĠĠĠĠĠĠĠ Ġ}) Ġ{" There Ġmust Ġbe Ġeither Ġ 0 Ġor Ġ 1 Ġsubmitted Ġtime Ġperiods Ġwith Ġemployee Ġ= Ġ$ employee Ġand Ġtime period Ġ= Ġ$ time Period "} ĊĠĠĠĠĠĠĠ Ġreturn Ġsubmitted Periods DataAccess . read Ġ{ Ġsubmissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmissions . single OrNull Ġ{ Ġit . employee Ġ== Ġemployee Ġ&& Ġit . bounds Ġ== Ġtime Period Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠNull Submitted Period ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Submitted Time Period ( time Period : ĠTime Period ) Ġ: ĠSub mitted Period Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Submitted Time Period ( time Period , Ġcu . employee ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠisIn AS ub mitted Period ( employee : ĠEmployee , Ġdate : ĠDate ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġfollowing Ġclosure Ġreturns Ġa Ġboolean Ġdepending Ġon Ġwhether Ġthe Ġprovided Ġdate Ġfalls Ġwithin ĊĠĠĠĠĠĠĠ Ġ// Ġany Ġof Ġthe Ġsubmission Ġdate Ġranges Ġfor Ġthe Ġprovided Ġemployee ĊĠĠĠĠĠĠĠ Ġreturn Ġsubmitted Periods DataAccess . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmissions Ġ-> Ġsubmissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter { it . employee Ġ== Ġemployee } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. any { it . bounds . contains ( date )} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġappro vals ĊĊĠĠĠ Ġoverride Ġfun Ġapprove Time sheet ( employee : ĠEmployee , ĠstartDate : ĠDate ) Ġ: ĠAppro val Result Status { ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġif Ġ( employee Ġ== ĠNO _ EMP LOY EE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Warn ( cu ) Ġ{ Ġ" Cannot Ġapprove Ġtimes heet Ġfor ĠNO _ EMP LOY EE " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAppro val Result Status . FAILURE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! ĠisIn AS ub mitted Period ( employee , ĠstartDate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Warn ( cu ) Ġ{ Ġ" Cannot Ġapprove Ġtimes heet Ġfor Ġun submitted Ġperiod " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAppro val Result Status . FAILURE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġst p Ġ= Ġget Submitted Time Period ( Time Period . getTime Period For Date ( startDate ), Ġemployee ) ĊĠĠĠĠĠĠĠ Ġval Ġis Approved Ġ= Ġsubmitted Periods DataAccess . act On Ġ{ Ġsubmissions Ġ-> Ġsubmissions . update ( stp . copy ( approval Status Ġ= ĠAppro val Status . APPRO VED )) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Approved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Audit Ġ( cu ) Ġ{ Ġ" Approved Ġ${ employee . name . value }' s Ġtimes heet Ġthat Ġstarts Ġon Ġ${ startDate . stringValue }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAppro val Result Status . SUCCESS ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Audit Ġ( cu ) Ġ{ Ġ" Failed Ġto Ġapprove Ġ${ employee . name . value }' s Ġtimes heet Ġthat Ġstarts Ġon Ġ${ startDate . stringValue }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAppro val Result Status . FAILURE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Approved ( employee : ĠEmployee , ĠstartDate : ĠDate ): ĠAppro val Status Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġst p Ġ= Ġget Submitted Time Period ( Time Period . getTime Period For Date ( startDate ), Ġemployee ) ĊĠĠĠĠĠĠĠ Ġreturn Ġst p . approval Status ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun approve Time sheet ( employee : ĠEmployee , ĠstartDate : ĠDate ): ĠAppro val Result Status Ġ{ ĊĠĠĠĠĠĠĠ Ġrc . check Allowed ( cu , ĠRole . APPRO VER , ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠ Ġif Ġ( employee Ġ== ĠNO _ EMP LOY EE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Warn ( cu ) Ġ{ Ġ" Cannot Ġun approve Ġtimes heet Ġfor ĠNO _ EMP LOY EE " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAppro val Result Status . FAILURE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! ĠisIn AS ub mitted Period ( employee , ĠstartDate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Warn ( cu ) Ġ{ Ġ" Cannot Ġun approve Ġtimes heet Ġfor Ġun submitted Ġperiod " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAppro val Result Status . FAILURE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtime Period Ġ= ĠTime Period . getTime Period For Date ( startDate ) ĊĠĠĠĠĠĠĠ Ġif Ġ( get Submitted Time Period ( time Period , Ġemployee ). approval Status Ġ== ĠAppro val Status . UN APPRO VED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Warn ( cu ) Ġ{ Ġ" Cannot Ġun approve Ġan Ġalready - un approved Ġtimes heet " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAppro val Result Status . FAILURE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġst p Ġ= Ġget Submitted Time Period ( time Period , Ġemployee ) ĊĠĠĠĠĠĠĠ Ġval Ġis Un approved Ġ= Ġsubmitted Periods DataAccess . act On Ġ{ Ġsubmissions Ġ-> Ġsubmissions . update ( stp . copy ( approval Status Ġ= ĠAppro val Status . UN APPRO VED )) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Un approved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Audit Ġ( cu ) Ġ{ Ġ" Un approved Ġ${ employee . name . value }' s Ġtimes heet Ġthat Ġstarts Ġon Ġ${ startDate . stringValue }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAppro val Result Status . SUCCESS ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Audit Ġ( cu ) Ġ{ Ġ" Failed Ġto Ġun approve Ġ${ employee . name . value }' s Ġtimes heet Ġthat Ġstarts Ġon Ġ${ startDate . stringValue }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAppro val Result Status . FAILURE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region Ċ Ċ }