package Ġcom . example . work time administration . model . aggreg ates ĊĊ Ċ import Ġcom . fasterxml . jackson . annotation . Json Format Ċ import Ġcom . fasterxml . jackson . annotation . Json TypeInfo Ċ import Ġcom . fasterxml . jackson . annotation . Json TypeName Ċ import Ġevents . work time .* Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . temporal . Ch rono Unit Ċ import Ġjava . util .* Ċ Ċ const Ġval ĠWORK TIME _ AGG REG ATE Ġ= Ġ" work time " Ċ const Ġval ĠDATE _ TIME _ PATTERN Ġ= Ġ" dd . MM . yyyy ĠHH : mm : ss " ĊĊ Ċ @ Json TypeName (" work time ") Ċ @ Json TypeInfo ( use Ġ= ĠJson TypeInfo . Id . NAME , Ġinclude Ġ= ĠJson TypeInfo . As . PROPERTY ) Ċ class ĠWork time Entry ( ĊĠĠĠĠĠĠĠ Ġ@ Json Format ( shape Ġ= ĠJson Format . Shape . STRING , Ġpattern Ġ= ĠDATE _ TIME _ PATTERN ) Ġvar ĠstartTime : ĠLocalDateTime , ĊĠĠĠĠĠĠĠ Ġ@ Json Format ( shape Ġ= ĠJson Format . Shape . STRING , Ġpattern Ġ= ĠDATE _ TIME _ PATTERN ) Ġvar ĠendTime : ĠLocalDateTime , ĊĠĠĠĠĠĠĠ Ġvar Ġpause TimeIn Minutes : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġproject : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġemployee : ĠString , ĊĠĠĠĠĠĠĠ Ġvar Ġdescription : ĠString , ĊĠĠĠĠĠĠĠ Ġvar Ġtype : ĠEntry Type , ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġid : ĠString Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠ Ġvar Ġdeleted : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠAggregate () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġaggregate Name Ġ= ĠWORK TIME _ AGG REG ATE ĊĠĠĠĠĠĠĠ Ġare Times Valid ( startTime , ĠendTime , Ġpause TimeIn Minutes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime : ĠLocalDateTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime : ĠLocalDateTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause TimeIn Minutes : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemployee : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠEntry Type ĊĠĠĠĠĠĠĠ Ġ): ĠWork time Entry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠWork time Entry ( startTime , ĠendTime , Ġpause TimeIn Minutes , Ġproject , Ġemployee , Ġdescription , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . register Event ( Work time Created ( entry . id , ĠstartTime , ĠendTime , Ġpause TimeIn Minutes , Ġproject , Ġemployee , Ġdescription , Ġtype . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentry ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Project ( Ġproject : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( project Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Project Ġmust Ġbe Ġdefined ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . project Ġ= Ġproject ĊĠĠĠĠĠĠĠ Ġregister Event ( Work time Project Changed ( this . project )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Description ( description : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( description Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Description Ġmust Ġbe Ġdefined ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . description Ġ= Ġdescription ĊĠĠĠĠĠĠĠ Ġregister Event ( Work time Description Changed ( description )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadjust StartTime ( new StartTime : ĠLocalDateTime ) Ġ{ ĊĠĠĠĠĠĠĠ Ġare Times Valid ( new StartTime , Ġthis . endTime , Ġthis . pause TimeIn Minutes ) ĊĠĠĠĠĠĠĠ Ġthis . startTime Ġ= Ġnew StartTime ĊĠĠĠĠĠĠĠ Ġregister Event ( Work time Start time Adjust ed ( this . startTime )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadjust EndTime ( new EndTime : ĠLocalDateTime ) Ġ{ ĊĠĠĠĠĠĠĠ Ġare Times Valid ( this . startTime , Ġnew EndTime , Ġthis . pause TimeIn Minutes ) ĊĠĠĠĠĠĠĠ Ġthis . endTime Ġ= Ġnew EndTime ĊĠĠĠĠĠĠĠ Ġregister Event ( Work time End time Adjust ed ( this . endTime )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadjust Pause ( pause : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġare Times Valid ( this . startTime , Ġthis . endTime , Ġpause ) ĊĠĠĠĠĠĠĠ Ġthis . pause TimeIn Minutes Ġ= Ġpause ĊĠĠĠĠĠĠĠ Ġregister Event ( Work time Pause Adjust ed ( this . pause TimeIn Minutes )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Entry () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . deleted Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġregister Event ( Work time Deleted ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Pause Time S ufficient ( startTime : ĠLocalDateTime , ĠendTime : ĠLocalDateTime , Ġpause : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠEntry Type . WORK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtime span Ġ= ĠstartTime . until ( endTime , ĠCh rono Unit . HOUR S ). toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġtime span Ġ< Ġ 8 Ġ|| Ġtime span Ġin Ġ 8 .. 9 Ġ&& Ġpause Ġ>= Ġ 3 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġtime span Ġ>= Ġ 1 0 Ġ&& Ġpause Ġ>= Ġ 6 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( RuntimeException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġare Times Valid ( startTime : ĠLocalDateTime , ĠendTime : ĠLocalDateTime , Ġpause : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( startTime . is After ( endTime )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" The Ġstart Ġtime Ġmust Ġbe Ġafter Ġthe Ġend Ġtime ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Pause Time S ufficient ( startTime , ĠendTime , Ġpause )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" The Ġpause Ġtime Ġis Ġins ufficient ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Work time ĠEntry Ġ- ĠId : Ġ$ id , ĠDescription : Ġ$ description " ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠEntry Type ( type : ĠString ) Ġ{ ĊĠĠĠ ĠWORK (" WORK "), ĊĠĠĠ ĠV AC ATION (" V AC ATION "), ĊĠĠĠ ĠS ICK (" S ICK ") Ċ }