package Ġser g . ch up rin . fin ances . feature . dashboard . domain . builder Ċ Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . combine Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġser g . ch up rin . fin ances . core . api . domain . model . User Ċ import Ġser g . ch up rin . fin ances . core . api . domain . model . period . Data Period Ċ import Ġser g . ch up rin . fin ances . core . api . domain . model . transaction . Transaction Ċ import Ġser g . ch up rin . fin ances . core . api . domain . model . transaction . query . Transactions Query Ċ import Ġser g . ch up rin . fin ances . core . api . domain . repository . Transaction Repository Ċ import Ġser g . ch up rin . fin ances . feature . dashboard . domain . model . Dashboard Widget Ċ import Ġser g . ch up rin . fin ances . feature . dashboard . setup . domain . model . Dashboard Widget Type Ċ import Ġjava . math . BigDecimal Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠSer ge y ĠCh up rin Ġon Ġ 1 7 . 0 4 . 2 0 2 0 . Ċ Ġ*/ Ċ class ĠDashboard Balance Widget Builder Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġtransaction Repository : ĠTransaction Repository Ċ ) Ġ: ĠDashboard Widget Builder < Dashboard Widget . Balance > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġis ForType ( widget Type : ĠDashboard Widget Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwidget Type Ġ== ĠDashboard Widget Type . BAL ANCE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( ĊĠĠĠĠĠĠĠ ĠcurrentUser : ĠUser , ĊĠĠĠĠĠĠĠ Ġcurrent Period : ĠData Period ĊĠĠĠ Ġ): ĠFlow < Dashboard Widget . Balance > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcombine ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( currentUser ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( current Period ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall User Transactions Flow ( currentUser ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġuser , Ġdata Period , Ġall Transactions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( income Amount , Ġexpense Amount , Ġbalance Amount ) Ġ= Ġcalculate Amount s ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Period Ġ= Ġdata Period , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions Ġ= Ġall Transactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDashboard Widget . Balance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ= Ġbalance Amount , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġuser . default Currency , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Period Income s Ġ= Ġincome Amount , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Period Exp enses Ġ= Ġexpense Amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Amount s ( ĊĠĠĠĠĠĠĠ Ġtransactions : ĠList < Transaction >, ĊĠĠĠĠĠĠĠ Ġdata Period : ĠData Period ĊĠĠĠ Ġ): ĠTrip le < BigDecimal , ĠBigDecimal , ĠBigDecimal > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLooks Ġnot Ġvery Ġgood Ġbut Ġit 's Ġmore Ġbetter Ġto Ġiterate Ġthe Ġcollection Ġonly Ġonce ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġcalculate Ġboth Ġamounts Ġsimultaneously Ġwithout Ġcreating Ġintermediate Ġcollections . ĊĠĠĠĠĠĠĠ Ġvar Ġincome Amount Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġvar Ġexpense Amount Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġvar Ġbalance Amount Ġ= ĠBigDecimal . ZERO ĊĊĠĠĠĠĠĠĠ Ġtransactions . forEach Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction . dateTime Ġ<= Ġdata Period . endDate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Amount Ġ+= Ġtransaction . amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction . dateTime Ġin Ġdata Period ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction . is Expense ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpense Amount Ġ+= Ġtransaction . amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( transaction . isIn come ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincome Amount Ġ+= Ġtransaction . amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( income Amount . abs (), Ġexpense Amount . abs (), Ġbalance Amount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġall User Transactions Flow ( currentUser : ĠUser ): ĠFlow < List < Transaction >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction Repository . transactions Flow ( Transactions Query ( owner Id Ġ= ĠcurrentUser . id )) ĊĠĠĠ Ġ} Ċ Ċ }