package Ġnet . cord a . finance . contracts Ċ Ċ import Ġnet . cord a . core . serialization . C ord a Serializable Ċ import Ġjava . time . DayOfWeek Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ import Ġjava . util . Collections . empty Sorted Set Ċ Ċ /** Ċ Ġ* ĠA Ġbusiness Ġcalendar Ġperforms Ġdate Ġcalculations Ġthat Ġtake Ġinto Ġaccount Ġnational Ġh olidays Ġand Ġweek ends . ĠThis Ġis Ġa Ċ Ġ* Ġtypical Ġfeature Ġof Ġfinancial Ġcontracts , Ġin Ġwhich Ġa Ġbusiness Ġmay Ġnot Ġwant Ġa Ġpayment Ġevent Ġto Ġfall Ġon Ġa Ġday Ġwhen Ċ Ġ* Ġno Ġstaff Ġare Ġaround Ġto Ġhandle Ġproblems . Ċ Ġ*/ Ċ @ C ord a Serializable Ċ open Ġclass ĠBusiness Calendar ( val Ġh oliday Dates : ĠSorted Set < LocalDate >) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠEMPTY Ġ= ĠBusiness Calendar ( empty Sorted Set ()) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcalculate Days Between ( startDate : ĠLocalDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendDate : ĠLocalDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cb Year : ĠDay Count Basis Year , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cb Day : ĠDay Count Basis Day ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRight Ġnow Ġwe Ġare Ġonly Ġconsidering ĠActual / 3 6 0 Ġand Ġ 3 0 / 3 6 0 Ġ.. ĠWe 'll Ġdo Ġthe Ġrest Ġlater . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠThe Ġrest . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cb Day Ġ== ĠDay Count Basis Day . D Actual Ġ-> Ġ( endDate . to Epoch Day () Ġ- ĠstartDate . to Epoch Day ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cb Day Ġ== ĠDay Count Basis Day . D 3 0 Ġ&& Ġd cb Year Ġ== ĠDay Count Basis Year . Y 3 6 0 Ġ-> Ġ(( endDate . year Ġ- ĠstartDate . year ) Ġ* Ġ 3 6 0 . 0 Ġ+ Ġ( endDate . month Value Ġ- ĠstartDate . month Value ) Ġ* Ġ 3 0 . 0 Ġ+ ĠendDate . day OfMonth Ġ- ĠstartDate . day OfMonth ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" Can 't Ġcalculate Ġdays Ġusing Ġconvention Ġ$ dcb Day Ġ/ Ġ$ dcb Year ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠParses Ġa Ġdate Ġof Ġthe Ġform ĠYYYY - MM - DD , Ġlike Ġ 2 0 1 6 - 0 1 - 1 0 Ġfor Ġ 1 0 th ĠJan . Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġparse Date FromString ( it : ĠString ): ĠLocalDate Ġ= ĠLocalDate . parse ( it , ĠDateTime Formatter . ISO _ LOCAL _ DATE ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCalculates Ġan Ġevent Ġschedule Ġthat Ġmoves Ġevents Ġaround Ġto Ġensure Ġthey Ġfall Ġon Ġworking Ġdays . Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Generic Schedule ( startDate : ĠLocalDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod : ĠFrequency , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar : ĠBusiness Calendar Ġ= ĠEMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Roll Convention : ĠDate Roll Convention Ġ= ĠDate Roll Convention . Following , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Of Additional Periods : ĠInt Ġ= ĠInteger . MAX _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendDate : ĠLocalDate ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Offset : ĠInt ? Ġ= Ġnull ): ĠList < LocalDate > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠArrayList < LocalDate >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġctr Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Date Ġ= ĠstartDate ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Date Ġ= Ġget Offset Date ( current Date , Ġperiod ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( period Offset Ġ== Ġnull Ġ|| Ġperiod Offset Ġ<= Ġctr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . add ( calendar . apply Roll Convention ( current Date , Ġdate Roll Convention )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠFix Ġadd l Ġperiod Ġlogic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( ctr Ġ> Ġno Of Additional Periods ) Ġ|| Ġ( current Date Ġ>= ĠendDate Ġ?: Ġcurrent Date )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalculates Ġthe Ġdate Ġfrom Ġ@ startDate Ġmoving Ġforward Ġ' steps ' Ġof Ġtime Ġsize Ġ' period '. ĠDoes Ġnot Ġapply Ġcalendar ĊĠĠĠĠĠĠĠĠ Ġ* Ġlogic Ġ/ Ġroll Ġconventions . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Offset Date ( startDate : ĠLocalDate , Ġperiod : ĠFrequency , Ġsteps : ĠInt Ġ= Ġ 1 ): ĠLocalDate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( steps Ġ== Ġ 0 ) Ġreturn ĠstartDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġperiod . offset ( startDate , Ġsteps . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠBusiness Calendar ): ĠBusiness Calendar Ġ= ĠBusiness Calendar (( this . holiday Dates Ġ+ Ġother . holiday Dates ). to Sorted Set ()) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġother Ġis ĠBusiness Calendar Ġ&& Ġthis . holiday Dates Ġ== Ġother . holiday Dates ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġh oliday Dates . hashCode () ĊĊĠĠĠ Ġopen Ġfun Ġis Working Day ( date : ĠLocalDate ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . day OfWeek Ġ== ĠDay OfWeek . S ATUR DAY Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . day OfWeek Ġ== ĠDay OfWeek . S UND AY Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh oliday Dates . contains ( date ) Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġapply Roll Convention ( test Date : ĠLocalDate , Ġdate Roll Convention : ĠDate Roll Convention ): ĠLocalDate Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( date Roll Convention Ġ== ĠDate Roll Convention . Actual ) Ġreturn Ġtest Date ĊĊĠĠĠĠĠĠĠ Ġvar Ġdirection Ġ= Ġdate Roll Convention . direction (). value ĊĠĠĠĠĠĠĠ Ġvar Ġtrial Date Ġ= Ġtest Date ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is Working Day ( trial Date )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrial Date Ġ= Ġtrial Date . plus Days ( direction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe 've Ġmoved Ġto Ġthe Ġnext Ġworking Ġday Ġin Ġthe Ġright Ġdirection , Ġbut Ġif Ġwe 're Ġusing Ġthe Ġ" modified " Ġdate Ġroll ĊĠĠĠĠĠĠĠ Ġ// Ġconvention Ġand Ġwe 've Ġcros sed Ġinto Ġanother Ġmonth , Ġreverse Ġthe Ġdirection Ġinstead Ġto Ġstay Ġwithin Ġthe Ġmonth . ĊĠĠĠĠĠĠĠ Ġ// ĠProbably Ġbetter Ġexplained Ġhere : Ġhttp :// www . invest op edia . com / terms / m / modified following . asp ĊĊĠĠĠĠĠĠĠ Ġif Ġ( date Roll Convention . is Modified Ġ&& Ġtest Date . month Ġ!= Ġtrial Date . month ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġ- direction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrial Date Ġ= Ġtest Date ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! is Working Day ( trial Date )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrial Date Ġ= Ġtrial Date . plus Days ( direction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrial Date ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġdate Ġwhich Ġis Ġthe Ġinbound Ġdate Ġplus / minus Ġa Ġgiven Ġnumber Ġof Ġbusiness Ġdays . ĊĠĠĠĠ Ġ* ĠTODO : ĠMake Ġmore Ġefficient Ġif Ġnecessary ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmove Business Days ( date : ĠLocalDate , Ġdirection : ĠDate Roll Direction , Ġi : ĠInt ): ĠLocalDate Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( i Ġ>= Ġ 0 ){ " Days Ġto Ġadd / subtract Ġmust Ġbe Ġpositive "} ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 ) Ġreturn Ġdate ĊĠĠĠĠĠĠĠ Ġvar Ġret Date Ġ= Ġdate ĊĠĠĠĠĠĠĠ Ġvar Ġctr Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( ctr Ġ< Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Date Ġ= Ġret Date . plus Days ( direction . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Working Day ( ret Date )) Ġctr ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret Date ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Business Calendar ($ holiday Dates )" Ċ } Ċ