package Ġch . frequ enz di eb . ticket čĊč Ċ import Ġch . frequ enz di eb . common . ErrorCode č Ċ import Ġch . frequ enz di eb . common . Template Parser č Ċ import Ġch . frequ enz di eb . common . Validators . Companion . execute Validation č Ċ import Ġch . frequ enz di eb . common . zip To Pair When č Ċ import Ġch . frequ enz di eb . event . Event Repository č Ċ import Ġch . frequ enz di eb . event . con cert . Con cert č Ċ import Ġch . frequ enz di eb . event . location . Location Repository č Ċ import Ġch . frequ enz di eb . subscription . Subscription Repository č Ċ import Ġcom . open html top df . pdf box out . Pdf Renderer Builder č Ċ import Ġkotlinx . html . br č Ċ import Ġkotlinx . html . dom . create č Ċ import Ġkotlinx . html . h 1 č Ċ import Ġkotlinx . html . img č Ċ import Ġkotlinx . html . li č Ċ import Ġkotlinx . html . p č Ċ import Ġkotlinx . html . span č Ċ import Ġkotlinx . html . strong č Ċ import Ġkotlinx . html . style č Ċ import Ġkotlinx . html . ul č Ċ import Ġnet . gl xn . q rg en . core . image . ImageType č Ċ import Ġnet . gl xn . q rg en . javase . QR Code č Ċ import Ġorg . springframework . core . io . ByteArray Resource č Ċ import Ġorg . springframework . core . io . Resource Loader č Ċ import Ġorg . springframework . stereotype . Service č Ċ import Ġorg . w 3 c . dom . Document č Ċ import Ġorg . w 3 c . dom . Element č Ċ import Ġreactor . core . publisher . Mono č Ċ import Ġreactor . kotlin . core . publisher . zip č Ċ import Ġjava . io . ByteArray OutputStream č Ċ import Ġjava . time . format . DateTime Formatter č Ċ import Ġjava . util . Base 6 4 č Ċ import Ġjava . util . Locale čĊč Ċ @ Service č Ċ class ĠTicket Service ( čĊ ĉ private Ġval Ġresource Loader : ĠResource Loader , čĊ ĉ private Ġval Ġevent Repository : ĠEvent Repository , čĊ ĉ private Ġval Ġlocation Repository : ĠLocation Repository , čĊ ĉ private Ġval Ġticket Type Repository : ĠTicket Type Repository , čĊ ĉ private Ġval Ġticket Attribute Repository : ĠTicket Attribute Repository , čĊ ĉ private Ġval Ġsubscription Repository : ĠSubscription Repository , čĊ ĉ private Ġval Ġtemplate Parser : ĠTemplate Parser č Ċ ) Ġ{ čĊ ĉ fun Ġcreate QR Code ( ticket : ĠTicket ) Ġ= čĊĉ ĉ ticket . id ?. let Ġ{ čĊĉĉ ĉ encoder ( čĊĉĉĉ ĉ QR Code . from ( encoder ( it . toByteArray ())) čĊĉĉĉĉ ĉ . with Size ( 2 0 0 , Ġ 2 0 0 ) čĊĉĉĉĉ ĉ . to ( ImageType . PNG ) čĊĉĉĉĉ ĉ . stream () čĊĉĉĉĉ ĉ . toByteArray () čĊĉĉ ĉ ) čĊĉ ĉ }. or Empty () čĊčĊ ĉ fun Ġcreate PDF ( ticket : ĠTicket ): ĠMono < ByteArray Resource > Ġ{ čĊĉ ĉ ticket . execute Validation ( ErrorCode . TICK ET _ MISSING _ SUB SCRIPTION ) Ġ{ Ġticket . subscriptionId . isNotEmpty () Ġ} čĊčĊĉ ĉ return Ġtemplate Parser . parse HTML Template ( čĊĉĉ ĉ resource Loader . getResource (" classpath : ticket _ template . html "). inputStream čĊĉ ĉ ). run Ġ{ čĊĉĉ ĉ listOf ( čĊĉĉĉ ĉ add Subscription Tags ( ticket ), čĊĉĉĉ ĉ add Type Tags ( ticket ), čĊĉĉĉ ĉ add Event Tags ( ticket ) čĊĉĉ ĉ ). zip Ġ{ čĊĉĉĉ ĉ it . fold ( map Of ( čĊĉĉĉĉ ĉ " TICK ET _ QR _ CODE " Ġto čĊĉĉĉĉĉ ĉ create . img Ġ{ čĊĉĉĉĉĉĉ ĉ src Ġ= Ġ" data : image / png ; base 6 4 , ${ create QR Code ( ticket )}" čĊĉĉĉĉĉ ĉ } čĊĉĉĉ ĉ )) Ġ{ Ġacc , Ġcurr Ġ-> Ġacc . plus ( curr ) Ġ} čĊĉĉ ĉ }. map Ġ{ čĊĉĉĉ ĉ template Parser . replace Mark ups ( this , Ġit ) čĊĉĉ ĉ }. map Ġ{ Ġhtml Template Ġ-> čĊĉĉĉ ĉ ByteArray Resource ( ByteArray OutputStream (). also Ġ{ čĊĉĉĉĉ ĉ Pdf Renderer Builder (). apply Ġ{ čĊĉĉĉĉĉ ĉ use Fast Mode () čĊĉĉĉĉĉ ĉ with W 3 c Document ( html Template , Ġ"") čĊĉĉĉĉĉ ĉ to Stream ( it ) čĊĉĉĉĉĉ ĉ run () čĊĉĉĉĉ ĉ } čĊĉĉĉ ĉ }. toByteArray ()) čĊĉĉ ĉ } čĊĉ ĉ } čĊ ĉ } čĊčĊ ĉ private Ġfun ĠDocument . add Event Tags ( ticket : ĠTicket ): ĠMono < Map < String , ĠElement >> Ġ= čĊĉ ĉ event Repository . findById ( ticket . eventId ) čĊĉĉ ĉ . zip To Pair When Ġ{ Ġlocation Repository . findById ( it . location Id ) Ġ} čĊĉĉ ĉ . map Ġ{ Ġ( event , Ġlocation ) Ġ-> čĊĉĉĉ ĉ map Of ( čĊĉĉĉĉ ĉ " TICK ET _ TITLE " Ġto Ġcreate . h 1 Ġ{ Ġ+ event . name Ġ}, čĊĉĉĉĉ ĉ " TICK ET _ EVENT _ INFO " Ġto Ġcreate . span Ġ{ čĊĉĉĉĉĉ ĉ style Ġ= Ġ" margin - top : Ġ- 2 0 px ;" čĊĉĉĉĉĉ ĉ br Ġ{ Ġ+" Wo : Ġ${ location . name }" Ġ} čĊĉĉĉĉĉ ĉ br Ġ{ Ġ+" W ann : Ġ${ event . date . format ( DateTime Formatter . of Pattern (" d . ĠM MMM Ġy yyy ", ĠLocale . GER MAN )) }" Ġ} čĊĉĉĉĉ ĉ }, čĊĉĉĉĉ ĉ " TICK ET _ FO OTER " Ġto Ġcreate . p Ġ{ čĊĉĉĉĉĉ ĉ style Ġ= Ġ" font - size : Ġ 9 px ;" čĊĉĉĉĉĉ ĉ + event . terms . or Empty () čĊĉĉĉĉ ĉ }, čĊĉĉĉĉ ĉ when Ġ( event ) Ġ{ čĊĉĉĉĉĉ ĉ is ĠCon cert Ġ-> Ġ{ čĊĉĉĉĉĉĉ ĉ " TICK ET _ SECOND ARY _ TITLE " Ġto Ġcreate . span Ġ{ čĊĉĉĉĉĉĉĉ ĉ strong Ġ{ Ġ+" Live ĠAct s : Ġ" Ġ} čĊĉĉĉĉĉĉĉ ĉ ul Ġ{ čĊĉĉĉĉĉĉĉĉ ĉ event . live Act s . forEach Ġ{ Ġli Ġ{ Ġ+ it Ġ} Ġ} čĊĉĉĉĉĉĉĉ ĉ } čĊĉĉĉĉĉĉ ĉ } čĊĉĉĉĉĉ ĉ } čĊĉĉĉĉĉ ĉ else Ġ-> Ġ{ čĊĉĉĉĉĉĉ ĉ " TICK ET _ SECOND ARY _ TITLE " Ġto Ġcreate . span Ġ{ čĊĉĉĉĉĉĉĉ ĉ + "" čĊĉĉĉĉĉĉ ĉ } čĊĉĉĉĉĉ ĉ } čĊĉĉĉĉ ĉ } čĊĉĉĉ ĉ ) čĊĉĉ ĉ } čĊčĊ ĉ private Ġfun ĠDocument . add Type Tags ( ticket : ĠTicket ): ĠMono < Map < String , ĠElement >> Ġ= čĊĉ ĉ ticket Type Repository . findById ( ticket . type Id ) čĊĉĉ ĉ . zip To Pair When Ġ{ Ġticket Attribute Repository . findAll ById ( it . attribute Ids ). collect List () Ġ} čĊĉĉ ĉ . map Ġ{ Ġ( type , Ġattributes ) Ġ-> čĊĉĉĉ ĉ attributes čĊĉĉĉĉ ĉ . filter Ġ{ Ġ! it . tag . isNull OrEmpty () Ġ} čĊĉĉĉĉ ĉ . apply Ġ{ čĊĉĉĉĉĉ ĉ execute Validation ( čĊĉĉĉĉĉĉ ĉ errorCode Ġ= ĠErrorCode . TICK ET _ DUPLIC ATE _ TEMPLATE _ TAG , čĊĉĉĉĉĉĉ ĉ error Details Ġ= ĠarrayOf (" reason " Ġto Ġ" Duplicate ĠTags Ġfound Ġin ĠTicket Type - Attributes ") čĊĉĉĉĉĉ ĉ ) Ġ{ Ġdistinct By Ġ{ Ġit . tag Ġ}. size Ġ== Ġsize Ġ} čĊĉĉĉĉ ĉ } čĊĉĉĉĉ ĉ . map Ġ{ čĊĉĉĉĉĉ ĉ it . tag !! Ġto Ġcreate . p Ġ{ čĊĉĉĉĉĉĉ ĉ +" ${ it . text }: Ġ${ it . value }" čĊĉĉĉĉĉ ĉ } čĊĉĉĉĉ ĉ } čĊĉĉĉĉ ĉ . toMap () čĊĉĉĉĉ ĉ . plus ( map Of (" TICK ET _ TYPE " Ġto Ġcreate . p Ġ{ čĊĉĉĉĉĉ ĉ +" Ticket typ : Ġ${ type . name }" čĊĉĉĉĉ ĉ })) čĊĉĉ ĉ } čĊčĊ ĉ private Ġfun ĠDocument . add Subscription Tags ( ticket : ĠTicket ): ĠMono < Map < String , ĠElement >> Ġ= čĊĉ ĉ subscription Repository . findById ( ticket . subscriptionId ) čĊĉĉ ĉ . map Ġ{ čĊĉĉĉ ĉ map Of (" TICK ET _ OWNER _ INFO " Ġto Ġcreate . p Ġ{ čĊĉĉĉĉ ĉ +" Die ses ĠTicket Ġwurde Ġer stellt ĠfÃ¼r Ġ${ it . surname } Ġ${ it . name }" čĊĉĉĉ ĉ }) čĊĉĉ ĉ } čĊčĊ ĉ fun Ġencoder ( data : ĠByteArray ): ĠString Ġ= ĠBase 6 4 . get Encoder (). encode ToString ( data ) čĊčĊ ĉ fun Ġdecoder ( data : ĠString ): ĠString Ġ= ĠString ( Base 6 4 . get Decoder (). decode ( data )) č Ċ } čĊ