package Ġio . ple o . ant ae us . core . services Ċ Ċ import Ġio . ple o . ant ae us . core . exceptions . Currency Mismatch Exception Ċ import Ġio . ple o . ant ae us . core . exceptions . Customer NotFoundException Ċ import Ġio . ple o . ant ae us . core . exceptions . Network Exception Ċ import Ġio . ple o . ant ae us . models .* Ċ import Ġkotlinx . coroutines .* ĊĊ Ċ class ĠInvoice Payment Service Ġ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbilling Service Ġ: ĠBilling Service , ĊĠĠĠĠĠĠĠ Ġ// ĠInclude d Ġto Ġdeal Ġwith Ġcurrency Ġmismatch ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcustomer Service : ĠCustomer Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinvoice Service : ĠInvoice Service ĊĠĠĠ Ġ) Ġ{ ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPay Ġa Ġsingle Ġ[ invoice ]. ĠReturns Ġa Ġpair Ġrepresenting Ġthe Ġinvoice Ġid Ġand Ġthe Ġbilling Ġoutcome . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġpay Invoice ( invoice Ġ: ĠInvoice ) Ġ: ĠPair < Int , ĠInvoice Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Service . update Status ById ( invoice . id , ĠInvoice Status . PAY ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġbilling Service . pay Invoice ( invoice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Service . update Status ById ( invoice . id , ĠInvoice Status . PA ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( invoice . id , ĠInvoice Status . PA ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Service . update Status ById ( invoice . id , ĠInvoice Status . FAILED _ EMPTY _ ACCOUNT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( invoice . id , ĠInvoice Status . FAILED _ EMPTY _ ACCOUNT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNetwork Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Service . update Status ById ( invoice . id , ĠInvoice Status . FAILED _ NETWORK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( invoice . id , ĠInvoice Status . FAILED _ NETWORK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠCurrency Mismatch Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Service . update Status ById ( invoice . id , ĠInvoice Status . FAILED _ CUR RE NCY _ MIS MATCH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( invoice . id , ĠInvoice Status . FAILED _ CUR RE NCY _ MIS MATCH ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠCustomer NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Service . update Status ById ( invoice . id , ĠInvoice Status . FAILED _ CUSTOMER _ NOT _ FOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( invoice . id , ĠInvoice Status . FAILED _ CUSTOMER _ NOT _ FOUND ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthe ĠBilling Service Ġto Ġpay Ġall Ġthe Ġin voices Ġthat Ġare Ġdue . ĊĠĠĠĠ Ġ* ĠThe Ġoperations Ġrun Ġin Ġthe Ġsame Ġthread , Ġbecause ĠSQLite Ġis Ġnot Ġthread - safe . ĊĠĠĠĠ Ġ* ĠWith Ġa Ġmore Ġadvanced ĠDB Ġwe Ġcould Ġachieve Ġrow - level Ġlocks Ġand Ġperform Ġall ĊĠĠĠĠ Ġ* Ġoperations Ġconcurrent ly , Ġfor Ġexample Ġusing Ġthe ĠIO ĠDispatcher . ĊĠĠĠĠ Ġ* ĠWith Ġa Ġ" real " Ġpayment Ġprovider ĠAPI , Ġwe Ġcould Ġtransform Ġthe Ġpay Invoice Ġfunction ĊĠĠĠĠ Ġ* Ġto Ġa Ġsuspend Ġone , Ġso Ġthat Ġit Ġcan Ġbe Ġput Ġon Ġhold Ġwhile Ġwaiting Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġnetwork Ġresponse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Obsolete Cor outines Api ĊĠĠĠ Ġsuspend Ġfun Ġperform All Payments By Status ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ: ĠInvoice Status Ġ= ĠInvoice Status . PENDING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠList < Pair < Int , ĠInvoice Status >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġto Pay Ġ: ĠList < Invoice > Ġ= Ġinvoice Service . fetch By Status ( status ) ĊĠĠĠĠĠĠĠ Ġ// val Ġscope Ġ= ĠCor outine Scope ( Dispatch ers . IO ) ĊĠĠĠĠĠĠĠ Ġval Ġsingle Thread Ġ= Ġnew Single Thread Context (" context ") ĊĊĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Pay . map Ġ{ Ġinvoice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( single Thread ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpay Invoice ( invoice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġjobs . await All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExample Ġof Ġfunction Ġto Ġdeal Ġwith Ġcurrency Ġmismatch ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġmanage Currency Mismatch () Ġ: ĠList < Pair < Int , ĠInvoice Status >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Pay Ġ: ĠList < Invoice > Ġ= Ġinvoice Service . fetch By Status ( Invoice Status . FAILED _ CUR RE NCY _ MIS MATCH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsingle Thread Ġ= Ġnew Single Thread Context (" context ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= Ġto Pay . map Ġ{ Ġinvoice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustomer : ĠCustomer Ġ= Ġcustomer Service . fetch ( invoice . customer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( single Thread ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġcould Ġslightly Ġmodify Ġthe Ġpay Invoice Ġfunction Ġto Ġreceive Ġan Ġadditional ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparameter Ġrepresenting Ġthe Ġcurrency Ġof Ġchoice Ġ( it Ġwould Ġcall Ġthe Ġbilling Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbank 's Ġfunction Ġcharge ( invoice , Ġcurrency ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpay Invoice With Currency ( invoice , Ġcustomer . currency ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠCustomer NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( single Thread ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( invoice . customer Id , ĠInvoice Status . FAILED _ CUSTOMER _ NOT _ FOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġjobs . await All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġother ĠCUR RE NCY _ MIS MATCH Ġoccurs , Ġdeal Ġwith Ġthem Ġsomehow , Ġdepending Ġon Ġthe Ġreasons ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhy Ġthis Ġcould Ġoccur r ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĊ Ċ }