import Ġio . ple o . ant ae us . core . external . Payment Provider Ċ import Ġio . ple o . ant ae us . core . services . Billing Queue Worker Ċ import Ġio . ple o . ant ae us . core . services . Billing Service Ċ import Ġio . ple o . ant ae us . core . services . Scheduled Payment Service Ċ import Ġio . ple o . ant ae us . data . Ant ae us Dal Ċ import Ġio . ple o . ant ae us . models . Currency Ċ import Ġio . ple o . ant ae us . models . Invoice Ċ import Ġio . ple o . ant ae us . models . Invoice Status Ċ import Ġio . ple o . ant ae us . models . Money Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . time . Instant Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . temporal . Temporal Adjust ers Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . ThreadPoolExecutor Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . random . Random Ċ Ċ // ĠThis Ġwill Ġcreate Ġall Ġschemas Ġand Ġsetup Ġinitial Ġdata Ċ internal Ġfun Ġsetup Initial Data ( dal : ĠAnt ae us Dal ) Ġ{ ĊĠĠĠ Ġval Ġcustomers Ġ= Ġ( 1 .. 1 0 0 ). map NotNull Ġ{ ĊĠĠĠĠĠĠĠ Ġdal . create Customer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Ġ= ĠCurrency . values ()[ Random . nextInt ( 0 , ĠCurrency . values (). size )] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcustomers . forEach Ġ{ Ġcustomer Ġ-> ĊĠĠĠĠĠĠĠ Ġ( 1 .. 1 0 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdal . create Invoice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Ġ= ĠMoney ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠBigDecimal ( Random . next Double ( 1 0 . 0 , Ġ 5 0 0 . 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġcustomer . currency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustomer Ġ= Ġcustomer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġif Ġ( it Ġ== Ġ 1 ) ĠInvoice Status . PENDING Ġelse ĠInvoice Status . PA ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ // ĠThis Ġis Ġthe Ġmocked Ġinstance Ġof Ġthe Ġpayment Ġprovider Ċ internal Ġfun Ġget Payment Provider (): ĠPayment Provider Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠPayment Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcharge ( invoice : ĠInvoice ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRandom . next Boolean () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġcreate Ġa Ġqueue Ġworker Ġfor Ġprocessing Ġscheduled Ġpayments Ċ internal Ġfun Ġget Billing Service Queue Worker ( scheduled Payment Service : ĠScheduled Payment Service , Ġbilling Service : ĠBilling Service ): ĠBilling Queue Worker Ġ{ ĊĠĠĠ Ġval Ġexecutor Ġ= ĠThreadPool Executor ( 1 0 , Ġ 1 0 , Ġ 3 0 , ĠTimeUnit . SECONDS , ĠLinked BlockingQueue < Runnable >(), ĠExec utors . default Thread Factory ()) ĊĠĠĠ Ġreturn ĠBilling Queue Worker ( thread Count Ġ= Ġ 4 , Ġpoll Wait Time Secs Ġ= ĠĠ 5 , Ġexecutor Ġ= Ġ Ġexecutor , scheduled Payment Service Ġ= Ġ Ġscheduled Payment Service , Ġbilling Service Ġ= Ġ Ġbilling Service ) Ċ } Ċ