package Ġno . nav . sy fo . sy k meld ing . service Ċ Ċ import Ġio . ktor . util . K tor Experimental API Ċ import Ġjava . time . LocalDate Ċ import Ġjava . util . UUID Ċ import Ġno . nav . sy fo . db . Database Interface Ċ import Ġno . nav . sy fo . log Ċ import Ġno . nav . sy fo . metrics . E GEN ME L DT _ SY K ME LD ING _ COUNTER Ċ import Ġno . nav . sy fo . p dl . service . P dl Person Service Ċ import Ġno . nav . sy fo . sy f osm register . client . Sy f osm register Sy k meld ing Client Ċ import Ġno . nav . sy fo . sy k meld ing . db . ant all Sy k meld inger In nen for Per i ode Ċ import Ġno . nav . sy fo . sy k meld ing . db . regist rer E gen meld t Sy k meld ing Ċ import Ġno . nav . sy fo . sy k meld ing . db . sy k meld ing Overlap per G ren se ver di Ċ import Ġno . nav . sy fo . sy k meld ing . error handling . exceptions . For Lang Per i ode Exception Ċ import Ġno . nav . sy fo . sy k meld ing . error handling . exceptions . For M ange E gen meld inger Exception Ċ import Ġno . nav . sy fo . sy k meld ing . error handling . exceptions . For Tid lig ste F om Exception Ċ import Ġno . nav . sy fo . sy k meld ing . error handling . exceptions . Ik ke Til gang Exception Ċ import Ġno . nav . sy fo . sy k meld ing . error handling . exceptions . Over l app Med E ks ist eren de Sy k meld ing Exception Ċ import Ġno . nav . sy fo . sy k meld ing . error handling . exceptions . Tom Before F om Date Exception Ċ import Ġno . nav . sy fo . sy k meld ing . kafka . Sy k meld ing Sy f oser vice Kafka Producer Ċ import Ġno . nav . sy fo . sy k meld ing . mapping . op prett F el les format Ċ import Ġno . nav . sy fo . sy k meld ing . mapping . op prett Received Sy k meld ing Ċ import Ġno . nav . sy fo . sy k meld ing . model . E gen meld t Sy k meld ing Ċ import Ġno . nav . sy fo . sy k meld ing . model . E gen meld t Sy k meld ing Request Ċ import Ġno . nav . sy fo . sy k meld ing . model . Pas ient Ċ import Ġno . nav . sy fo . sy k meld ing . util . extract H else Op pl ys ning er Ar be ids u for het Ċ Ċ const Ġval Ġmax Ant all D ager Sy k meld t Ġ= Ġ 1 6 Ċ Ċ @ K tor Experimental API Ċ class ĠE gen meld t Sy k meld ing Service Ġ@ K tor Experimental API Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġopp dater Topics Service : ĠO pp dater Topics Service , ĊĠĠĠ Ġprivate Ġval Ġdatabase : ĠDatabase Interface , ĊĠĠĠ Ġprivate Ġval Ġp dl Person Service : ĠP dl Person Service , ĊĠĠĠ Ġprivate Ġval Ġsy f oser vice Service Kafka Producer : ĠS yk meld ing Sy f oser vice Kafka Producer , ĊĠĠĠ Ġprivate Ġval Ġsy f osm register Sy k meld ing Client : ĠSy f osm register Sy k meld ing Client Ċ ) Ġ{ ĊĊĠĠĠ Ġsuspend Ġfun Ġval ider Og Regist rer E gen meld t Sy k meld ing ( sy k meld ing Request : ĠE gen meld t Sy k meld ing Request , Ġfn r : ĠString , Ġuser Token : ĠString , Ġcall Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġperson Ġ= Ġp dl Person Service . get Person Og Disk res jon sk ode ( fn r Ġ= Ġfn r , Ġuser Token Ġ= Ġuser Token , Ġcall Id Ġ= Ġcall Id ) ĊĠĠĠĠĠĠĠ Ġval Ġpas ient Ġ= ĠPas ient ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn r Ġ= Ġfn r , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġakt or Id Ġ= Ġperson . ak tor Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor nav n Ġ= Ġperson . nav n . for nav n , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmel lom nav n Ġ= Ġperson . nav n . mel lom nav n , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġet tern av n Ġ= Ġperson . nav n . et tern av n ) ĊĊĠĠĠĠĠĠĠ Ġval ider E gen meld t Sy k meld ing ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf om Ġ= Ġsy k meld ing Request . peri ode . f om , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtom Ġ= Ġsy k meld ing Request . peri ode . tom , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhar Fort rol ig Ad resse Ġ= Ġperson . fort rol ig Ad resse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn r Ġ= Ġfn r , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Token Ġ= Ġuser Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Id Ġ= Ġcall Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlog . info (" E gen meld t Sy k meld ing Request Ġvalid ert Ġok Ġfor Ġcall Id Ġ{}", Ġcall Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġant all Ar be id sg iv ere Ġ= Ġsy k meld ing Request . ar be ids for hold . size ĊĠĠĠĠĠĠĠ Ġif Ġ( sy k meld ing Request . ar be ids for hold . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregist rer E gen meld t Sy k meld ing ( E gen meld t Sy k meld ing ( UUID . randomUUID (), Ġfn r , Ġnull , Ġsy k meld ing Request . peri ode , Ġsy k meld ing Request . e gen Sy k dom ), Ġpas ient , Ġant all Ar be id sg iv ere , Ġcall Id ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġsy k meld ing Request . ar be ids for hold . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE gen meld t Sy k meld ing ( UUID . randomUUID (), Ġfn r , Ġit , Ġsy k meld ing Request . peri ode , Ġsy k meld ing Request . e gen Sy k dom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Opp ret ter Ġ{} Ġsy k meld inger Ġ{}", Ġlist . size , Ġcall Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( e gen meld t Sy k meld ing Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregist rer E gen meld t Sy k meld ing ( e gen meld t Sy k meld ing , Ġpas ient , Ġant all Ar be id sg iv ere , Ġcall Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregist rer E gen meld t Sy k meld ing ( e gen meld t Sy k meld ing : ĠE gen meld t Sy k meld ing , Ġpas ient : ĠPas ient , Ġant all Ar be id sg iv ere : ĠInt , Ġcall Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Regist rer er Ġsy k meld ing Ġmed Ġid Ġ{} Ġfor Ġcall Id Ġ{}", Ġe gen meld t Sy k meld ing . id , Ġcall Id ) ĊĠĠĠĠĠĠĠ Ġdatabase . regist rer E gen meld t Sy k meld ing ( e gen meld t Sy k meld ing ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfel les format Ġ= Ġopp rett F el les format ( sy k meld t Ġ= Ġpas ient , Ġsy k meld ing Id Ġ= Ġe gen meld t Sy k meld ing . id . toString (), Ġf om Ġ= Ġe gen meld t Sy k meld ing . peri ode . f om , Ġtom Ġ= Ġe gen meld t Sy k meld ing . peri ode . tom , Ġar be ids for hold Ġ= Ġe gen meld t Sy k meld ing . ar be ids for hold , Ġant all Ar be id sg iv ere Ġ= Ġant all Ar be id sg iv ere ) ĊĠĠĠĠĠĠĠ Ġval Ġreceived Sy k meld ing Ġ= Ġopp rett Received Sy k meld ing ( pas ient Ġ= Ġpas ient , Ġsy k meld ing Id Ġ= Ġe gen meld t Sy k meld ing . id . toString (), Ġfel les format Ġ= Ġfel les format ) ĊĊĠĠĠĠĠĠĠ Ġopp dater Topics Service . op pd ater OK Topic ( received Sy k meld ing ) ĊĠĠĠĠĠĠĠ Ġsy f oser vice Service Kafka Producer . publish Sy k meld ing To Kafka ( e gen meld t Sy k meld ing . id . toString (), Ġextract H else Op pl ys ning er Ar be ids u for het ( fel les format )) ĊĠĠĠĠĠĠĠ ĠE GEN ME L DT _ SY K ME LD ING _ COUNTER . inc () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġval ider E gen meld t Sy k meld ing ( f om : ĠLocalDate , Ġtom : ĠLocalDate , Ġhar Fort rol ig Ad resse : ĠBoolean , Ġfn r : ĠString , Ġuser Token : ĠString , Ġcall Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tom . is Before ( f om )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Tom - dat o Ġer Ġf Ã¸ r Ġf om - dat o Ġfor Ġcall Id Ġ{}", Ġcall Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTom Before F om Date Exception (" Tom - dat o Ġer Ġf Ã¸ r Ġf om - dat o ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( har Fort rol ig Ad resse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" B ru ker Ġhar Ġik ke Ġtil gang Ġtil Ġt jen est en , Ġcall Id Ġ{}", Ġcall Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠI k ke Til gang Exception (" Du Ġhar Ġde ss ver re Ġik ke Ġtil gang Ġtil Ġt jen est en ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( f om . is Before ( LocalDate . now ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" E gen meld ing Ġkan Ġik ke Ġstart e Ġf Ã¸ r Ġdag ens Ġdat o , Ġf om : Ġ{} Ġdag ens Ġdat o Ġ{}", Ġf om , ĠLocalDate . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFor Tid lig ste F om Exception (" E gen meld ing Ġkan Ġik ke Ġstart e Ġf Ã¸ r Ġdag ens Ġdat o ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( tom . is After ( f om . plus Days ( max Ant all D ager Sy k meld t . to Long ()))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" E gen meld t Ġsy k meld ing Ġkan Ġik ke Ġv Ã¦ re Ġmer Ġen n Ġ{} Ġd ager ", Ġmax Ant all D ager Sy k meld t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFor Lang Per i ode Exception (" E gen meld t Ġsy k meld ing Ġkan Ġik ke Ġv Ã¦ re Ġl enger Ġen n Ġ$ max Ant all D ager Sy k meld t Ġd ager ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( database . ant all Sy k meld inger In nen for Per i ode ( fn r , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf om Ġ= ĠLocalDate . now (). minus Months ( 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtom Ġ= ĠLocalDate . now ()) Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" B ru ker en Ġkan Ġbru ke Ġm aks Ġ 2 Ġe gen meld inger Ġi Ġl Ã¸ pet Ġav Ġ 4 ĠmÃ¥ ned er ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFor M ange E gen meld inger Exception (" Du Ġkan Ġbru ke Ġm aks Ġ 2 Ġe gen meld inger Ġi Ġl Ã¸ pet Ġav Ġ 4 ĠmÃ¥ ned er ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( database . sy k meld ing Overlap per G ren se ver di ( fn r , Ġf om Ġ= Ġf om , Ġtom Ġ= Ġtom , Ġant all D ager Ġ= Ġ 1 6 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Det ĠmÃ¥ Ġv Ã¦ re Ġminimum Ġ 1 6 Ġd agers Ġopp hold Ġmel lom Ġe gen meld inger ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFor M ange E gen meld inger Exception (" Det ĠmÃ¥ Ġv Ã¦ re Ġmin st Ġ 1 6 Ġd ager Ġmel lom Ġe gen meld inger ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( har Over l app ende Sy k meld inger I Register et ( token Ġ= Ġuser Token , Ġf om Ġ= Ġf om , Ġtom Ġ= Ġtom )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" B ru ker Ġhar Ġall ere de Ġsy k meld inger Ġsom Ġoverlap per Ġmed Ġval gt Ġper i ode Ġ{}", Ġcall Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOver l app Med E ks ist eren de Sy k meld ing Exception (" Du Ġhar Ġall ere de Ġle vert Ġsy k meld ing , Ġda Ġskal Ġdu Ġik ke Ġbru ke Ġden ne Ġe gen meld ingen ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhar Over l app ende Sy k meld inger I Register et ( token : ĠString , Ġf om : ĠLocalDate , Ġtom : ĠLocalDate ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtid lig ere Sy k meld inger Ġ= Ġsy f osm register Sy k meld ing Client . get Sy k meld inger ( token Ġ= Ġtoken , Ġf om Ġ= Ġf om , Ġtom Ġ= Ġtom ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtid lig ere Sy k meld inger . isNotEmpty () ĊĠĠĠ Ġ} Ċ } Ċ