package Ġio . ple o . ant ae us . core . services Ċ Ċ import Ġio . ple o . ant ae us . core . infrastructure . dto . Invoice Billing Worker Task DTO Ċ import Ġio . ple o . ant ae us . core . scheduler . Task Scheduler Ċ import Ġio . ple o . ant ae us . models . Invoice Status Ċ import Ġio . ple o . ant ae us . models . Schedule Ċ import Ġjava . time . Offset DateTime Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . quartz . Cron Schedule Builder Ċ import Ġorg . quartz . Job Ċ import Ġorg . quartz . Job Builder Ċ import Ġorg . quartz . Job DataMap Ċ import Ġorg . quartz . Job Detail Ċ import Ġorg . quartz . Job ExecutionContext Ċ import Ġorg . quartz . Job ExecutionException Ċ import Ġorg . quartz . Scheduler Ċ import Ġorg . quartz . Trigger Ċ import Ġorg . quartz . Trigger Builder Ċ import Ġorg . quartz . Trigger Key Ċ import Ġorg . quartz . impl . Std Scheduler Factory Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġwrapping Ġa ĠQu artz Ġ[ Scheduler ] Ġto Ġprovide Ġa Ġmechanism Ġto Ġtrigger Ġscheduling Ċ Ġ* Ġof Ġin voices Ġat Ġa Ġconfigured Ġinterval Ġ( every Ġminute , Ġhourly , Ġdaily ) Ġvia Ġa Ġcron Ġjob . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġforms Ġthe Ġentry Ġpoint Ġof Ġthe Ġinvoice Ġbilling Ġscheduling Ġmechanism . Ċ Ġ* ĠThe ĠJob Ġit Ġstarts Ġs chedules Ġin voices Ġthat Ġare Ġstill Ġoutstanding Ġ( i . e . Ġthose Ġwhose Ċ Ġ* Ġstatus Ġis Ġnot Ġ[ Invoice Status . PA ID ] Ġby Ġdeleg ating Ġto Ġthe Ġ[ Task Scheduler ]. Ċ Ġ* Ċ Ġ* ĠAn Ġinvoice Ġthat Ġis Ġsuccessfully Ġscheduled Ġfor Ġbilling Ġis Ġupdated Ġwith Ġa Ġnewly Ċ Ġ* Ġintroduced Ġ[ Invoice Status . SCHEDUL ED ] Ċ Ġ*/ Ċ class ĠBilling Service ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdestination Queue : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbilling Scheduling Job Cron : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinvoice Service : ĠInvoice Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcustomer Service : ĠCustomer Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtask Scheduler : ĠTask Scheduler , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġglobal Billing Schedule : ĠSchedule Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġprivate Ġval Ġtrigger Name Ġ= Ġ" billing Scheduling Trigger " ĊĠĠĠ Ġprivate Ġval Ġjob Name Ġ= Ġ" billing Scheduling Job " ĊĊĠĠĠ Ġprivate Ġval Ġcron Job Scheduler : ĠScheduler Ġ= ĠStd Scheduler Factory (). scheduler ĊĠĠĠ Ġprivate Ġval Ġcron Job : ĠJob Detail ĊĠĠĠ Ġprivate Ġval Ġcron Job Trigger : ĠTrigger ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcron Job Ġ= ĠJob Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. new Job ( Billing Scheduling Job :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Identity ( job Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġcron Job Trigger Ġ= ĠTrigger Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. new Trigger () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Identity ( trigger Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Schedule ( Cron Schedule Builder . cron Schedule Non validated Expression ( this . billing Scheduling Job Cron )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. using Job Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJob DataMap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" destination Queue " Ġto Ġthis . destination Queue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invoice Service " Ġto Ġthis . invoice Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" customer Service " Ġto Ġthis . customer Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" task Scheduler " Ġto Ġthis . task Scheduler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" global Billing Schedule " Ġto Ġthis . global Billing Schedule ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. for Job ( cron Job ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġschedule Billing (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Starting Ġbilling Ġscheduling Ġjob " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! cron Job Scheduler . is Started Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcron Job Scheduler . schedule Job ( cron Job , Ġcron Job Trigger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcron Job Scheduler . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcron Job Scheduler . re schedule Job ( Trigger Key . trigger Key ( trigger Name ), Ġcron Job Trigger ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) Ġ{ Ġ" An Ġexception Ġwith Ġmessage =' ${ e . message }' Ġhas Ġoccurred " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBilling Scheduling Job Ġ: ĠJob Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠJob ExecutionContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Queue Ġ= Ġcontext . merged Job DataMap [" destination Queue "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvoice Service Ġ= Ġcontext . merged Job DataMap [" invoice Service "] Ġas ĠInvoice Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustomer Service Ġ= Ġcontext . merged Job DataMap [" customer Service "] Ġas ĠCustomer Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Scheduler Ġ= Ġcontext . merged Job DataMap [" task Scheduler "] Ġas ĠTask Scheduler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglobal Billing Schedule Ġ= Ġcontext . merged Job DataMap [" global Billing Schedule "] Ġas ĠSchedule ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutstanding In voices Ġ= Ġinvoice Service . fetch All Pending () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( out standing In voices . isEmpty ()) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" There Ġare Ġno Ġpending Ġin voices Ġto Ġschedule ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutstanding In voices . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprecedence Ġorder : Ġinvoice Ġschedule Ġ-> Ġcustomer Ġschedule Ġ-> Ġglobal Ġschedule ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbilling Schedule Ġ= Ġit . billing Schedule ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcustomer Service . fetch ( it . customer Id ). billing Schedule ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġglobal Billing Schedule ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscheduled Ġ= Ġtask Scheduler . schedule ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġdestination Queue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= ĠInvoice Billing Worker Task DTO ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Id Ġ= Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscheduled On Ġ= ĠOffset DateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Ġ= Ġbilling Schedule ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scheduled ) Ġinvoice Service . update Status ( it . id , ĠInvoice Status . SCHEDUL ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ex ) Ġ{ Ġ" An Ġerror : Ġ'${ ex . message }' Ġhas Ġoccurred " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJob ExecutionException ( ex , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ