package Ġorg . tok end . template . features . nf cp ayment . logic Ċ Ċ import Ġio . reactivex . Single Ċ import Ġorg . tok end . rx . extensions . to Single Ċ import Ġorg . tok end . template . di . providers . Api Provider Ċ import Ġorg . tok end . template . di . providers . Repository Provider Ċ import Ġorg . tok end . template . di . providers . Wallet Info Provider Ċ import Ġorg . tok end . template . features . nf cp ayment . model . Ful filled Pos Payment Request Ċ import Ġorg . tok end . template . features . nf cp ayment . model . Pos Payment Request Ċ import Ġjava . math . BigDecimal Ċ Ċ class ĠPos Payment Request Ful fill er ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrepository Provider : ĠRepository Provider , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwallet Info Provider : ĠWallet Info Provider , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġapi Provider : ĠApi Provider , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconnection State Provider : Ġ(() Ġ-> ĠBoolean )? Ċ ) Ġ{ ĊĠĠĠ Ġclass ĠIns ufficient Or Missing Balance Exception ( asset Code : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Amount : ĠBigDecimal ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException (" Ins ufficient Ġor Ġmissing Ġbalance Ġof Ġ$ asset Code ") ĊĊĠĠĠ Ġprivate Ġval Ġis Online : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconnection State Provider ?. invoke () Ġ?: Ġtrue ĊĊĠĠĠ Ġfun Ġfulfill ( request : ĠPos Payment Request ): ĠSingle < Ful filled Pos Payment Request > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Sender Balance ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġbalance Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ul filled Pos Payment Request ( balance Id , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sender Balance ( request : ĠPos Payment Request ): ĠSingle < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . defer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Online ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Remote Balance Id ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Cached Balance Id ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Remote Balance Id ( request : ĠPos Payment Request ): ĠSingle < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsigned Api Ġ= Ġapi Provider . get Signed Api () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠSingle . error ( IllegalStateException (" No Ġsigned ĠAPI Ġinstance Ġfound ")) ĊĠĠĠĠĠĠĠ Ġval ĠaccountId Ġ= Ġwallet Info Provider . get Wallet Info ()?. accountId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠSingle . error ( IllegalStateException (" No Ġwallet Ġinfo Ġfound ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġasset Code Ġ= Ġrequest . asset . code ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsigned Api . v 3 . accounts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Balances ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġbalances Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= Ġbalances ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . asset . id Ġ== Ġasset Code Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġbalance ?. state ?. available Ġ?: ĠBigDecimal . ZERO ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( balance Ġ== Ġnull Ġ|| Ġavailable Ġ< Ġrequest . amount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . error ( Ins ufficient Or Missing Balance Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . amount Ġ- Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( balance . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cached Balance Id ( request : ĠPos Payment Request ): ĠSingle < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasset Code Ġ= Ġrequest . asset . code ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrepository Provider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. balances () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Ġ{ Ġrepository Provider . balances (). items List Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġbalances Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= Ġbalances ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . asset Code Ġ== Ġasset Code Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġbalance ?. available Ġ?: ĠBigDecimal . ZERO ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( balance Ġ== Ġnull Ġ|| Ġavailable Ġ< Ġrequest . amount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . error ( Ins ufficient Or Missing Balance Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . amount Ġ- Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( balance . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }