package Ġcom . housing . movie . features . plan . data . service Ċ Ċ import Ġcom . housing . movie . exceptions . NotFoundException Ċ import Ġcom . housing . movie . features . order . data . repository . Order Repository Ċ import Ġcom . housing . movie . features . order . domain . entity . Order Ċ import Ġcom . housing . movie . features . plan . data . repository . Plan Repository Ċ import Ġcom . housing . movie . features . plan . domain . entity . Plan Ċ import Ġcom . housing . movie . features . plan . domain . service . Plan Service Ċ import Ġcom . housing . movie . features . plan . domain . use case . update _ plan . Update Plan Request Ċ import Ġcom . housing . movie . features . statistic . domain . use case . top _ purchase _ plan . Top Purchase Plan QueryParams Ċ import Ġcom . housing . movie . features . statistic . domain . use case . top _ purchase _ plan . Top Purchase Plan Response Ċ import Ġcom . housing . movie . utils . DateTime Helper Ċ import Ġorg . springframework . data . repository . findById OrNull Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġjava . util .* Ċ Ċ @ Service Ċ class ĠPlan ServiceImpl ( ĊĠĠĠ Ġprivate Ġval Ġplan Repository : ĠPlan Repository , ĊĠĠĠ Ġprivate Ġval Ġorder Repository : ĠOrder Repository , Ċ ) Ġ: ĠPlan Service Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL AN _ NOT _ FOUND Ġ= Ġ" Plan Ġnot Ġfound ." ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Plans (): ĠList < Plan > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplan Repository . findAll (). toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġoverride Ġfun Ġdelete Plan ( id : ĠUUID ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplan Ġ= Ġplan Repository . findById OrNull ( id ) Ġ?: Ġthrow ĠNotFound Exception ( PLAN _ NOT _ FOUND ) ĊĊĠĠĠĠĠĠĠ Ġplan . enabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġoverride Ġfun Ġenable Plan ( id : ĠUUID ): ĠPlan Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplan Ġ= Ġplan Repository . findById OrNull ( id ) Ġ?: Ġthrow ĠNotFound Exception ( PLAN _ NOT _ FOUND ) ĊĊĠĠĠĠĠĠĠ Ġplan . enabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġplan ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Plan ( update Plan Request : ĠUpdate Plan Request ): ĠPlan Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġplan Ġ= Ġplan Repository . findById OrNull ( update Plan Request . id ) Ġ?: Ġthrow ĠNotFound Exception ( PLAN _ NOT _ FOUND ) ĊĊĠĠĠĠĠĠĠ Ġplan Ġ= Ġupdate Plan Request . update Plan ( plan ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġplan Repository . save ( plan ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtop Purchase Plan ( top Purchase Plan QueryParams : ĠTop Purchase Plan QueryParams ): ĠList < Top Purchase Plan Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartDate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDateTime Helper . string To Calendar ( top Purchase Plan QueryParams . start _ date , ĠDateTime Helper . Format . DD __ MM __ YYYY ) ĊĊĠĠĠĠĠĠĠ Ġval ĠendDate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDateTime Helper . string To Calendar ( top Purchase Plan QueryParams . end _ date , ĠDateTime Helper . Format . DD __ MM __ YYYY ) ĊĊĠĠĠĠĠĠĠ Ġval Ġplans Ġ= Ġplan Repository . findAll (). toList () ĊĊĠĠĠĠĠĠĠ Ġval Ġdefault StartDate Ġ= ĠCalendar . getInstance (). also Ġ{ Ġit . set ( 1 9 9 0 , ĠCalendar . J AN U ARY , Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdefault EndDate Ġ= ĠCalendar . getInstance () ĊĊĠĠĠĠĠĠĠ Ġval Ġplan And Total Purchase Value Ġ= Ġmutable Map Of < Plan , ĠDouble >() ĊĊĠĠĠĠĠĠĠ Ġplans . forEach Ġ{ Ġplan Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorders Ġ= Ġmutable ListOf < Order >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( startDate Ġ== Ġnull ) Ġ&& Ġ( endDate Ġ== Ġnull )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorders . addAll ( order Repository . findBy Plan _ Id ( plan Id Ġ= Ġplan . id )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( startDate Ġ== Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorders . addAll ( order Repository . findBy Plan _ Id And Order Time Between ( plan . id , Ġdefault StartDate , ĠendDate !! )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( endDate Ġ== Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorders . addAll ( order Repository . findBy Plan _ Id And Order Time Between ( plan . id , ĠstartDate , Ġdefault EndDate )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorders . addAll ( order Repository . findBy Plan _ Id And Order Time Between ( plan . id , ĠstartDate , ĠendDate )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplan And Total Purchase Value [ plan ] Ġ= Ġorders . sum Of Ġ{ Ġorder Ġ-> Ġorder . total Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġplan And Total Purchase Value . toList (). sorted By Descending Ġ{ Ġ(_, Ġtotal Value ) Ġ-> Ġtotal Value Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . map Ġ{ Ġ( plan , Ġtotal Value ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTop Purchase Plan Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplan Id Ġ= Ġplan . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġplan . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= Ġtotal Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }