From 4fb0b88c11656ba34f5c01c3bc75bc0a66d3f6a5 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 01:30:48 +0700 Subject: [PATCH 01/13] feat 1.0.0: Implement core financial tracking features for accounts, transactions, and categories with supporting infrastructure and UI. --- analysis_options.yaml | 44 +- assets/fonts/JetBrainsMono-Bold.ttf | Bin 0 -> 277828 bytes assets/fonts/JetBrainsMono-Regular.ttf | Bin 0 -> 273900 bytes assets/fonts/Lora-Bold.ttf | Bin 0 -> 212196 bytes assets/fonts/Lora-Italic.ttf | Bin 0 -> 221232 bytes assets/fonts/Lora-Regular.ttf | Bin 0 -> 212196 bytes lib/core/di/service_locator.dart | 39 + lib/core/theme/app_colors.dart | 49 ++ lib/core/theme/app_theme.dart | 106 +++ lib/core/theme/app_typography.dart | 112 +++ lib/core/utils/currency_formatter.dart | 49 ++ lib/core/utils/date_formatter.dart | 48 ++ lib/data/datasources/local_database.dart | 103 +++ lib/data/models/account_model.dart | 54 ++ lib/data/models/category_model.dart | 41 ++ lib/data/models/transaction_model.dart | 62 ++ .../repositories/account_repository_impl.dart | 88 +++ .../category_repository_impl.dart | 58 ++ .../transaction_repository_impl.dart | 91 +++ lib/domain/entities/account.dart | 76 ++ lib/domain/entities/category.dart | 41 ++ lib/domain/entities/enums.dart | 23 + lib/domain/entities/transaction.dart | 83 +++ .../repositories/account_repository.dart | 26 + .../repositories/category_repository.dart | 19 + .../repositories/transaction_repository.dart | 25 + .../usecases/calculate_net_position.dart | 67 ++ lib/domain/usecases/log_transaction.dart | 78 ++ lib/domain/usecases/settle_credit_bill.dart | 88 +++ lib/domain/value_objects/money.dart | 82 +++ lib/main.dart | 181 +++-- .../painters/paper_background.dart | 70 ++ .../providers/account_provider.dart | 81 +++ .../providers/transaction_provider.dart | 77 ++ lib/presentation/screens/accounts_screen.dart | 44 ++ lib/presentation/screens/ledger_screen.dart | 129 ++++ lib/presentation/screens/reports_screen.dart | 44 ++ macos/Flutter/GeneratedPluginRegistrant.swift | 4 + pubspec.lock | 679 +++++++++++++++++- pubspec.yaml | 109 +-- test/domain/entities/account_test.dart | 89 +++ test/domain/entities/transaction_test.dart | 81 +++ test/domain/value_objects/money_test.dart | 74 ++ test/widget_test.dart | 32 +- 44 files changed, 3034 insertions(+), 212 deletions(-) create mode 100644 assets/fonts/JetBrainsMono-Bold.ttf create mode 100644 assets/fonts/JetBrainsMono-Regular.ttf create mode 100644 assets/fonts/Lora-Bold.ttf create mode 100644 assets/fonts/Lora-Italic.ttf create mode 100644 assets/fonts/Lora-Regular.ttf create mode 100644 lib/core/di/service_locator.dart create mode 100644 lib/core/theme/app_colors.dart create mode 100644 lib/core/theme/app_theme.dart create mode 100644 lib/core/theme/app_typography.dart create mode 100644 lib/core/utils/currency_formatter.dart create mode 100644 lib/core/utils/date_formatter.dart create mode 100644 lib/data/datasources/local_database.dart create mode 100644 lib/data/models/account_model.dart create mode 100644 lib/data/models/category_model.dart create mode 100644 lib/data/models/transaction_model.dart create mode 100644 lib/data/repositories/account_repository_impl.dart create mode 100644 lib/data/repositories/category_repository_impl.dart create mode 100644 lib/data/repositories/transaction_repository_impl.dart create mode 100644 lib/domain/entities/account.dart create mode 100644 lib/domain/entities/category.dart create mode 100644 lib/domain/entities/enums.dart create mode 100644 lib/domain/entities/transaction.dart create mode 100644 lib/domain/repositories/account_repository.dart create mode 100644 lib/domain/repositories/category_repository.dart create mode 100644 lib/domain/repositories/transaction_repository.dart create mode 100644 lib/domain/usecases/calculate_net_position.dart create mode 100644 lib/domain/usecases/log_transaction.dart create mode 100644 lib/domain/usecases/settle_credit_bill.dart create mode 100644 lib/domain/value_objects/money.dart create mode 100644 lib/presentation/painters/paper_background.dart create mode 100644 lib/presentation/providers/account_provider.dart create mode 100644 lib/presentation/providers/transaction_provider.dart create mode 100644 lib/presentation/screens/accounts_screen.dart create mode 100644 lib/presentation/screens/ledger_screen.dart create mode 100644 lib/presentation/screens/reports_screen.dart create mode 100644 test/domain/entities/account_test.dart create mode 100644 test/domain/entities/transaction_test.dart create mode 100644 test/domain/value_objects/money_test.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index 0d29021..c2f33cc 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,28 +1,26 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + prefer_single_quotes: true + always_declare_return_types: true + annotate_overrides: true + avoid_empty_else: true + avoid_print: true + avoid_relative_lib_imports: true + avoid_unnecessary_containers: true + prefer_const_constructors: true + prefer_const_declarations: true + prefer_final_fields: true + prefer_final_locals: true + sort_child_properties_last: true + unnecessary_brace_in_string_interps: true + use_key_in_widget_constructors: true -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options +analyzer: + errors: + missing_return: error + dead_code: warning + exclude: + - "**/*.g.dart" + - "**/*.freezed.dart" diff --git a/assets/fonts/JetBrainsMono-Bold.ttf b/assets/fonts/JetBrainsMono-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c93043de6454ad2d5575f0751150c6551d9c588 GIT binary patch literal 277828 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

^Q2@p_nJptvCyhdNtfUDv9XvP^J$Tq^Yf}I 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 s3n!(`lCJDArN|NmBd zKdgiJ+%&Wl6FVMj0CI>8)Ow@rtyO-B%8>X_s*R?aQsT9662VZ#ZD+re0H)Kwoa8UF zT2jA8UM2AhKAMIP((f2uP=a8+F~P)s*ov!{8%kWTeL!c0Cy5A_RAR~bz&y@J0xCkxjty#l&)B;+UG|cgMU)Pk8M_GtL2-wSPxsD-@-_MhZB=tT4F089wQGV!Ow8`96KI^)2D)t zHnPEdB4S{7?WQpsqQOX`Wu*1a{7>r-Qvi+9T;PxD=RBE15i zYmqt}VnK4A1|Y;e`KhPrW3dQtLEo3?AX>{*S1F^RzN)3Vr4$b<(T|l9%oGTYva{Zv z@n%bRtxwV=>?BIZ9Hcrnd|=J8*#iM{;@~;sz8F7kVb=#XOzORGQg3fqU4FsBbz7!( zHFU06Iuc^4U=&apmj!fry;KYI54EnqHKpCCXLYDaT0t2{Y z+iAGU1g>N+nRNmfY)TI#^rXoU&p`*T-=Yf(T-#<(UI)pOe7zMUYP1) znG|yqm}E-V%KSviFo>^PZvKp_3Q;siI?)&(w=0cyL=+W2jF2CVA%s&Ul#h8lpw`Gn znzFcvbU@$Q!e9Zlv8GDmcF$2RH%&6&?5P>DBGW!$e5yWH zT12|+WZR8lH5nh2URGEvV?H<_0o}Rk2H5MuLg~PN|iUx}@?rGFcJ?cHV$i?yw za_zf=+)cq@jo-e7r%#{eVt8=z>1QoGYffg`g6RuL*QDq{{nXUdBXJ$Kaoy|UIyj1J z@j?W_ewkhi?FS{V$|DYW^04i=`z}OB_oiJ_=BnA#`sOJ$`pG1sMk-406hMaAE!eB6$>JPi6yaEwPa`cE8 zZ>$k8#Bk0@L;OB9Q0TXT=ek#No$Y`wb#LhW`!;;)xyaVY)A!u-bfjPK5 z_^uDg^GstBzl!J)DV1*)Wai~Oksuy8hd;2J2Z_o7V+aOy?m!Tw8cP#_*mPNmN!=M2 ziu@y?5H)@*Bvx9z`j{6QGH`*%Pdvi!(RnP8CNW|Y1SZxf-;`cRKp@gRDQ_av`qvZ$ z!^9!@hnpJhc(L}j#tBUmj?7k!z_z`1jg%)u#^-tO{ak&kt*57rAM4ZdrnRT1)p=D# z&Nu4xt`@O^v~;+2H)BHQHz z>(li()~YJvb%{FQj5VejQ^gWfqQgj?cv2@D-D?sO6OpX%!G)3|cgyX4vuF1e*C)!$ z6Y=u$*PMX=)JjR8n?I|kdwP0HqO>$2KM!u*`Wxv*%vt#ZA_G5YPQ<2zYRznF_%*}) zJ9338B(_J8g9?oq03~07dp%Z7p@+a=8972_6=jsc8_f^OW6_UDVOlwG`IKnw)XaKf7b5*iT-VnyJW*NH8Xh>-%iZiQQ#ru zO~b<+;)v0rXOUv*oMK|ebYlhtc~z=IV30Tg8!GEXU~zzOK(b*`#8EFYA5yQfZ_mgq zj8o3i=txz@q=}VkuP1AQk~mtNzA2m^@<|c}yNB;q2%`(G zRVra`7#q8ja^R9(P2)%JTg>zbJiRD|QcyAbcIdDFdgIPp@j8Yo3YTr%S?<2O_uh@m z!j<`jtxeE;?}FexI2itSGtEeLZksQz4n?%6Gr}DhzEivDCJlgpOr%BVp7w z#}iIy3?t`<$O>^{sgnrT;8n{{kIm~&x9nPb89hgRe|KoXlGV(VJCMc99%Qe$#GXq= z8`3m(!kfgFfE7BM>?S6q!Bo0jM^h=JDxGbtMMkaqP(|lr9YDRSar_lmbT%<;toyY5 z@Z4@QKJtgwaofhV>E~_MvYNzE+qK!`A=tkq9$aK3Qw^sYN_>!nJR>de(`o(UT?5_o z-nW(*>irA0oey8fnv@ei9k%1AqkRG5rvoibfoLdA=m<&1)*l)$d(^#bE^qoTJInY# z({DdVqOn&F_5Du6wuJglg5Q9KP0m9Qlw+_W6iQ$VNL#XQb+Pr!Pwt{I{U5k&i8C+z zUOuqrCDHp54s9yJ0Nr_^yfLLustP9b2Pd8y0FXhKBWAJ=vM{1OiNOLBh7JN0L%T9X z`y7n{oJ1m{WS{L+uUbv!^0&7Cfv-szHY8W+ReerKuD;|)qX$Xq1Yrbr-Vp8&l4r;G z+{u~6>0Vu3u2b9X)Y$T>a@;rG1oyE=hUiOLyg?)qjZvRz9n%*soGw3AsZ zy*YPs-`u%=JoW>o!gu4>`e3XqWxFTyjJ}uA3+O_JrSJ*I}lIq z=8;WiJ;-LSdE*x)Xj0aKz|Net5Is%w@ox3b&i^*+M_yN7utder8LK`gPSK9-lxW-0 z7*Pr9WT@_)|Gm>HGV86g)E7oxXD=E?E%b4@)*E9|n}AO!GU+3`O2UeXmDT&mrZ>q< zQ-gE@r|EKDEI%ftLAaAX5~x(Y0NO-tHl)`qzRcw#uZXeepcDJbvql~gGtc+4p{`?K zC~#q5U=AJ58md;1T*Z^UFpTyyJUR@Ji~H#xkrl3RxAqF3XY)?g}{bReh;sG8$-!_JvXecmLBv*8V^4vmX82A0Jl3 z`k`vqLkAyHOZGi%?O(P}>x9{7OXWL}0ME=U;tN7Ic%~l%Y(CCXU+|*52)-m0S|+a{ zwTfWRkRmBqba}}fwNrzo7@Vh0W1$OHZ<-c{z3G_q3TS(uQB$7bpLO7wXKctW{QB3w zZbkUTge8A?x16TkM`xk1fM`@`JdqFnnOA;#5@<#3Ab8BkOU0l2HmG@6R|9n~+ zfKTDYX?XD#W^B_DeNG9!WS40Bo454mQF*aj#_|}YD3&51_Y^ z&%`cTxoCeW(tSz}#GAkg%wsFMoBu{u78cK8DXN>~^JN-5*Z4)jJMto`;elguWtEm{ z70-@1YUwU3>rP;s4-MF=-PXu+pW1NW`JuiK+!fBdZO5vMZ=H1hY`vG-+UsbiEGt2FjLo&ecyaG4Wgl}Ft#iO%9F z{rE>`lbo$5AzJttaLvs;_H*?Q1`(6#hX8V8eIX}nwBPj*vPGPr0#D? z+4YR5Y~-nP)J${@>(WJDV6%A-8g93-SY5Mde-xf^fe+`NN=eAAjXic_nJe4=KCoZ;!2ZU) z5`3oNGx*pzaZ5yE#ORKXNV6A0Z%N;Q>-hazsgjz5N+POA#Iq%uAPi0l(vidAYq9eI z`qHmGwY&Xm( z4SuY5ouV4n@0>Tst*VjBLsNvwvP~%Ju2oGjhB&$=9LPt_}LCdb!oeOrC^ znOuMKGj`paAUKbkYw@cUL$YEIosPGG${h3O%$z!T()jk4bbWP2S&Sm{j!lD86o{RA zy0AUuj2Zm|=8z|JAeiaDMfLLW)uR3?-F;IgCykRw-waQ|yrqXn03QgRGiP@L(| z*hL70&Xfz4<>VJO=Y=|2FRWV8_xaZLU|!#fs^-S}nMLV%Z`*}Fb@R;nM&E^Pz47$+ z>D`&4WPX0KDAOJHrXQ*oDkmhXi<`#J2!EouIys^8g7A#-AL>1~VMV+t8Ypf~T(+X& z+}^T8b8#Tr^lWlPyt6zxKE8sa0Gl>lJe3)|QID@zv@a|=IZy*86=_2hpbg@BTER<@L}|%#9d1Yo z^i7SamWCF5Tov(H2?aat8AvFLwtjk7xq%5ZH>-FuC99bVDm(=#Y^OO{qVqPV)g$T6 z){~_1n&!wMGL87iT9V#8Waowk~T6;c^bM zVEP=^rVf19RfL9CrmND)gblr8>TtqRFqPsORnVi-;V6JD#+VkB3%T`~@vW+&YbwdB z%FnNfUn19a#zkrCjARbXVxQNv!>-1XWcVp^BRW5%B)f_i zgm-9%T~)7hbnCU<{8V#vTi^h>Shurs_3yJ)CI{0wX}RCgCTSz!p&f|?Zhmc8>ws0dqAKFth-}+&^bkCkr1V+6!2K?_5_+On}$5x~rNa#K1Pp712m}gf= zP#4ssDGTG?spU_5`B%<5jiyiMtW_K?UJH#a%A8&i#ps!?A}GzYtU|@aJ`nK~1oa6X5r&3F}$Vg;LC3OMUw$A@^f-9693YZ4v zBkCd!z14|d&4!6kALLXzhZ3_eEOetJ=-Gjp^DC- z&JY_C%e#=Tb0b>0p@=?Gk`xi^OGQIsoL4Py!*s_6b<37u!20{M)x!M7xVdG6wPUL? zOPdR;sFva84W}G2bsfUS4Ib zQ}=|c!k_ri&;O!SJ;R2ij{Z^uZyG2i;~*=klGxW&3^1ISpg#QIu6b19;_C5cz81wPWL$bNb)=o`RR zXDz^)ae0Lf2uV=rLCOtdWrYIFsn$Ez?;a_Nu^tJQ;*MYa`Xe8Y)P&96k#C1<#k|0n z{j6`FhMNu;r0RhmXDtShEx3ZbBVMU>X?x1u#b^qpqJ2_iMkN&i0%pes>nc`5%{trq zGOMv+gSu_2Ww97)&Jyb>SqxI*Sc`djE${<~k?eT>m?%9jCA+-o$wUN@&{9AS@kR$w8|&auT+;&Uv=3qyD( z(t^0;TB0d6@{h4}fm(RB^(^U(>OOOe8MK~SqUIK~lzyi{eMaN!@B_@@G3JmodNW<6 z0ir8)7Y<$52(vDp5uz@|O6;Zwa2qj~rSW(vrfQUqvSczlBZsu`uJz5Stk`?&&wlp7 zyTerl>iY$i;d?&#v!C61cX^eHh3cPoXXz3g#K)ZK4xepKrQSgWG3gZ%$sMp)-`R@^ zy)_|(zC@r-$iUr|vPGeY&s*)-=6QyA6neKprM1n zlhSzIgOg?~N~Z94u0C`Ak3PM6w!E*eB>X|>aTRm>meFKfn~B6>%OR{JNczl9GCJF| zKL&>??$uym3o}Fx2yH-#;1tYptX5@OJ=f|Cmt$SJB12^dp4gO5r(#k0C2m-f^27kr zC6UJ{p51t26F6O&9~B9T%yc?=`wcg&yr(Bx+t6ND*WOSYU2xBatFBtVskX7bx+;;V zs%lFYZd&z``5$?(zP+CRALQ-!`nG!h$F%I3Yt&f(1dKz-)~-F)VCzPkSvQ!K)E5u} z7NcBXbsqKj%)n4prd}>mgwP0yAMFx*$)bjB-ieX9!;&S__OzH9o0q>fT)*;$8&=(L z-F0hjRblJhTUTHAn>_%!XV0FYJ$nE%2hKH5P)Gs`jsquRt7JoNwo^Q|*wQ3@X^?DI z!v}o^VAg3(>?XNHNmdAgM9vk2-a7^;UA?DC9NTbs@q61CSO0O{b*pc+-c{jS*IaiU zpx&_ZHyStrGY7sRW6hTf0B97Ebq*q-1VQ8|BUnx3k;bB3Lj~t&E~9Y1w*&Jjm4jFv z)7f(_0>wBsiamNRt-tr)i*`Dwd-QQIH%iMz#yMY(0N5zvYFRH#Uz;VV!cbzZcWmLS zc_Ubpj0-CLfgH>7yUL zcm5|n`q3e^@x}{o`_P3qSa(aYvC(-K8mpgxT=9}Q^rFL0i7Sw}V>EU0GhDmKYO#wj zZ>Ow^zQAiYvA?&M19(`BsJ$HGk+x^vmr8_}sK3&azTUcYm0GW-t%=w>Z+sATX0dJg z#>ss%K)VtS1cNxhd~HjFL_L%6$)+I&dXu{5qaXdm{Chw8QL}l-y8DI;KXls#H!7)I zfJS0mV=geuS*lWFe5RfJ@?#%D2BbF_FO5r~6Inr=xB*+FN!n2zDRaTrts_sV#!x)G zYTJVkZd;uf&$C{;M&0`fU##$o?|=X5a15HTalIZ{>J=ne@~501ncCXL z+h@<-zW9;+Sl;UO-~avl{{Dp*&AfQ-f{oLCvGCPnU?V2HR)9N$%79WKe7Atk zxs3W?ifYGqQc_eR7yMwqG1c7YphnCd$ON{UATjT{{GmwHth#z=t6=7lGj`0Lz2l79 zS^@5nP$GZT*3YgN6iwf_VD7~;FIw2&f4VOox#Igg^zh*`=-ah`-7Y>h#2xBT%O;el zV)B0^su&dv`ab;b^N;!d^zXC3dguy`=fgh%&r68dy&@AWq(+9Xh!r+V=svG}&f(NV zL=@amf*K9ZCJ>K2wVsFO2s%}nG}rl^*vDgCWs|yQ-tZn-p@3$K4sT3Ivbef!tyQDm zSnK>=!@rg*hOXE?bj8kjSMQv+6GAxrd*Z>@>iHHJcrV!TA(?faF@P=#4PA~6gQE4p z0-3$8hp138Jl99%@vIXXF$rBO5gzRxCiTRgD zg6wy=okjvxDDg|Q=mR3=Q=yI4ht>XBv#cStW#fi7f0@2zh<~?OKe2wI=RSwI&tPT+ zvfAPlhuxWZjz=|7q9x95+2FqJC|g`z+Qn?U-hJLT0IBedl6VP*&pp9*t$%!)S-M4u{okcNq(u}jlXpTl&G5D5?K zsov|?tun+Y9rP2%*d$jPH|YzttL&)PX=#b_3}_uJi~yW3?nw=zS;F zacHL)zA$`Z(4y{~q&;Hof^W*tgo17dr3U88Oy*vB=K1{hJ|VLA@oW=))-dP!$}lm<4C082BBpOZPB74Ehe+nKH_GzF z3S-eYrNU%i6L{v-wu`1!jQS{OisrmermC*5N_|q5fBo5KH{VM#%rXgVQV&z>`*%P1 zft6A}cctB&CB z?p2flO$fEM{6-%38=m#2Z+**pO*M8skgB@6D)oT%##g@b^dZXMr<{npgvr@!`mZ zPRFB#4au75BVR08*N}{t}J31!ENSEPqmYO>vV!4Yb(y%B4SwXsFo{3Sp4gYRE-v&6-=m8jRP z`jR$@oBiOT!-pS?REA*gLw-f*eDMQEz){SaC5kYdK*LD$C&)Sj4y1CiS~X?Y(MwSw zwMaw3!quzS?U>yUZur6X7iln*Z%Bf40fT5kC)OBzv>9_VnUWB@q_L)~m>6QeYO02@ z`y7Yk5t4IO+G{h~`bv}YbEG|um{A(HrB6-zF0QWi;A;ISj5hv&{GKDQmxbDyhKo%0 zH$l3~4_^f@I9{J*tcp==^0@t8dhkJboO2)2>alC`M~N|%8`OaHgz!c8p65^Ip8v3- zo_iGS%8g_7HF2L~-ZgTG=N_~0B<}G|J@hT_JzqMRdwzPT!E=xJHctqf|As#y`DJlH zeDR6z8ST?zsP*RZlemY=MseU<=G=2q>*`xJx~|5e6FjRsy2xoGqu12fd&2AY=3IZ^ zgx4SNUavY%aD6H&M~nww5Zx6gzUPXu_dIvvd!8F}k6C!ad(1-5Jp$+n)>5%=baO0c zMoI=a;XTMFh3=|2bjBbj+BX^;mu76(j(g82Y&NB_{&d|qnf1w`O=ms;6sXArncD3V)?dF>4 z#w=qlu^NkvL1QWU!nwFk-cRb%#l~gEHscE81ID$+4aP0TZN`Ui z^?luaYJdNg|Eq6d1z1KsG;YV>|8LOJ&x|*WUmCwL{=@h$;}6E4jKkyQVJ&n{rX1@YRg|1U&EE&)v^lDwof_6z+Z=;&XW~-@Bi= z*STZK=k8~+W87=KpULO$b?$rjI)UY6o*}Tf_qwkxeD2>eru&(U>HfISkn7xQkM@~+ zuXk?pnG37jEANknzoXsjeTF-R;Kd!soj1GkG3P(Ee)R3@ytU5Lf4^X=Yz)W#z%~g86P)3 zWqjIr(0JJRqVade;5g@yW`1c$0rd^n(Y73 z;t_v9_I%H8>mL1LUo2PJ-?*>N71^9}?pz?7NdEn~uR=@6 zkmR%4y)dwhBNl7tpK&>5ICb=y?aU))? zoOUhb!{UIp;W=6uv(m8Sz+rtx$Aad-pe73hI=0ZI#~NbtuoKtC3C9y7BvH4Lwxh|3 zYI?-u5y_(iya~purGQ**x;9-^QRc*}9xZN?cvS+hQWCg9)JS3`(N*3!TkA73HqKMk z!TDR}gC$jyxnNds43vBoRMqn~&X{-k`+psrbwP%tx-88X;1#qhWc2EoaC)l7idar# z?u@BZ$aH8QM>&T|I*k+;1Y)L|H@yenzgRI*MGZwFEq_Wbns1F*r-v7uHhWeh#(6sT z5nhuF>3GNxLE*_@sHv}v4+1^BmxY%1b^vZ46hfquMS@I+b#`X`3XF8eh+^39I)jEVuZVMe;6ZQ!lKXsWcd zp`?%z%)6YcSIez4R`YemjIU=0E^I0vy|!r)59w(0$xv-I&NFa4WN{`jq!WyVnfb0q z7@rkpOjEa+MysZ}h~5d_FkibBPg_gfdV5#&OhLR=jXUUfAUX zkh9AtO|)k>wQu6ANwbceqa?wP4F?{}C8?K~Gsm&tpVXZD+UK>j%xl-bPjdbf-0S5o zCi9r_u6jWID_+;+3C@B)E3f|DBl7CA=h|Om^9(-9=Ay1EbvZh$@4#p#ck!#w`nHGH z$#vfT(S()h_R;qB)_2}~^G)ZbH{bjf(RVKW+V@Gn`EZ`}o~GYC&yjnR6bg2qr|*B0 z7Sx_Gq%pPFQzr7O)qH`cR~b#2hVmqVyx8tZIgo00kj_mK<0&R8@`Pd%YTNDWrSf9J z*V2u9s;^f93DXi)m>|0Jm3{jje(=F_0-^Gvp`oJkP#{zp85}IEP?OiHDb|72)`2sN zdn-OR^s$QG;*#ES-jq*fXdYu2{rC^>I*yH4^7qZ&xl2lUbg$}oQOt(i0vx0FoDv)|Pzw?v zgB?6@K#$jTK*saVi<AdRKCJee@=Nk6K$gI%!r+H`oGJ`9cvD2!s06KRl>T$2gn zpa97WRZ8rt5!B?8pcI!_qz#ycwL6+7_n9Qxkyn2HbM?EQ|J(&y8sUii+HZ>dY8u4A z;~vZg@lYs3f_Pe#3d^47s*(FNo!k7`gfFngx_F2(*LIngSl>%Z%r zOJ6jwS50;%BjX*=e9AP6GZ9vDArM`z%RbU#8IH1-p5Wi%xqBRbmc@yRHmT=0Q!MMH zy+AVx*GbX{fVOnE04wv-;I@8Aa3|x~@Op3u%$!4jZN2lQFS)3bYhBonM;pFWs4p!O z0pnjdpeDbfpEEk2F*pzDSxs*Jl7n*2$KO)D@e*+EGxEt3IxRCN9HRKMZr|xtp@3x} z@8-1c3{x?hMry@jT3`?;oA1{QfiZm10=A(P`GMUKib=^EDrv;c-PSv*XrJ}cKGInp zShw!bcg+{pjof8kvTlSreFB4e4j3fvYf7d!L?teKHKIhohooc~QF;5?Yo+B3zyJm`*fGP}*bd)%4XwEtV-e!qs?bV9$L2!HZV^>V7-jj)N{`BSuX?#A1*B)HDC~+FM`tD-sW=J zna98(d3-#qNk1~Kwyv|r?OXTSI$!;vYYyl~>HRV~Po4um^>b`WEg>bfgyc|?5=kZ} z6EQo-cupTrNhO;2-JRIGPHnZ`S-0;s-;IY}Uw1&y%ccoEACWCjqUNrW5%~d0)=TTG z&4ITMmdFolv)nZ+Va^^i^#3NJE3ah{}0yu-Kq%r1+V2J^X{J3b^JBlB@ zcD^1jZjc)^PgD=UjgSH*K*z`_L~`_++a#i}aqODgd-s`a9!LW=2a7XbfX&(CavnVZ zr=^w(eP`Gln#pM@HdcXoJ3owm91`9rMM?Fjx^CFsed=XrNLfW0QOcVsb1D#vKTIu4xHvCjA_?4lgKGAn65}9iVjeUSnbaJz-#92*W6ia_%v_7ld<&4 ziG-dzWtoAbEZChK#Db!!<-lv|0X@v2@49%q6Q6UwL4FA;WocB06){JpR;c@7gGI#+G^O(V@iA;j=XU@~Nyb z=W8MrJt$`aNs*h)`wko!S?j>6R?=(3#p4OrSWarjff>svhd$x#jXO0S?V7;u8nX(n zEPnL;VINv)8Sk|Nvc&ftFh6wY5rItB=b&EWQP@smje$*$2^RT6nV>@_S=cyh9QuP% z8m3q`_1-l#CFd+L`j8x}(SuzFUb9i=TQYLF#@e5|#`d)J;4*P%c&45mU&~dF{Gsc& zac-LAml)`AL_{L$V8N7vUM6+%khkm>&jo%*y%U<%^#C1dPA|Sla(CDS;K*^8z~G4A z)%$!UGF-kvHjTYK89@>%IH9PC4_@}Iq$(uPP&Xc}JASfq-~LTFabe7L+YHIy%22x`{l_SyV?DSCnN zAc$N8GJ=R@oN3wvt*+Q>&D^Vs4)6~;GmQg>FH?8=q+o_)-@qcIEi1>5JBmReK4DP& zLpS)8_5P91sK2(>XxfE8DdC;Rjt7+64{({UN3*o|wy*7T%jMn9u6F2?=a2546Ygta zw+`>t+uGebo-s~h|7Cfs-hMJC*6I?yRwsy86jFsmWmz=*XdA+pP8h$c?^9bn_vz<3 zH5Az`h?%y1iFNVRJR3a$Wd!*TNmeM0k-FA(K|MwVu+P#k*zrzO$dC@}n%eXm=&c|W z4&);o%7Jqd1^rwal!ycQQLnBWd1W2XgVPHg$v@!qLz6S0$5=)mD7aJA3DmGnjfU~;~M+q3j039;y& zXdeMTodN@a%a8LYcT>9?8+@!&^R1_?CF%m}lh$SOUWPxQGD^<86YX!6K`nY+0|l@nUj`_!2|o7F>E*(L}ET&-3~bH zvc?`6QKoZ1W}}bO95_ydOI!PJ<}b1V&wXz)mW@@I)oUPDq+Ss`oYU7n4`prb(?Dca zy)<4yT1Y?;oP#2*Gs%$7fLg8OLit-@^`0&qdW@IFlt{*7#}iBeq6RSVc2+iUbR5Pj zl>R?jrVc5ZON&fRdJxtYRs$tFSGLxfeWIG=kp}C^nJ^)FgqE;9c<2&I)_D$l*DDvG z1@Hvi5Ns@@gJTKr$OOVuZAsBSzrnFPu0u0=Tupb-t{+Ctu<+N5z$+DCL`@hYZ@{S` zLz`ENY^<3z3pY>r^(bBnjGoLSjTgJ;g*FdKI6tKx(LlXGXM0pgX$ozH(&O9mjDCVk z99p_R5+@?lh@>Q^3_0gmypAc;NUV=m8eT(1vQ@3FQF$^4C&IKCO$w|rtTv=!M-!Z2 z*8)9WSxI7uG?UQ8tctosS-AYbk@#RtH%0u4fwi; z4v&Iw;qZFHj3Gl;6i!2iS_^pXHCGRiRrTs94?yo&`8|4QZaWZ0PBm&zzO)6h%gYl7 zaB$j&)6?k-_bx>sdwt<0)7PE#@r$f_rt0b!qvN{r%?kN;4Hu|k-g(C*w}}lSfgjO> zOYgoQonEkUnv8qV$In_f{gQ?DxbXRmTB-LZ@X9a}Gj0+*#>*NFzdddwt|Je8Qpn$_ z2*!@9XdURb zki$b^N4!&#mvnlu9E5rm;tVYe6G|o0J}RRWTK_fl_S-|&f2l%V?{8JFtJhntW$NKp ztKO<_RS#Pvkd8h}*V9LT0YkXKI67Q6EXPHuxM2f~uM%eU$O}W}#QS}3wjL^{rg0Y5 z6W$Mm02enW4voBUf2+P9d>Qk>W2u(S-<$rh^?s}8ewK%SvZThr!{@4%zMU`_FNe=c zAIHjDh_NyvW*lT3^`!cyH68uoTh>&2ts$$GC)6JfVy7CbKb(^7NAqdfd5&E`+r0D| zInUSUx@XUc(RQ>NlIL7^wZN?~%onhwd-j(*hP%HY0wh1#7{bfEW4Ich%*r`~gyuCK zPEvnhSv35z2T%GwJJXSSe=9D4=eu% z^amRwxMY`Dk60Vjnbwympf+s%t?;^o&KYrhnfKs2kNzNXq?Y+Z#);*1EfPdUla;+B z=0nFGEBi^yqAe$_gV;h>T$>}=C)yU7-D8ZU_qS|k`<#>QZDJ7@|B-ip+tQmJMg|eB zNaI1nV~@cHC)OX(FOkdyF^C9y4B=J4aUxv)rSu13bw?2sJyu#R8)=wMQHQXH)||w4 zL72~o7U9S$dfjw%3wY9;=)^jNmckuL7A?XyQfv4eSweIOcp6GF{un84g{e`Coycrb zqn=7`x`+--IYxLxJk+A6Bh)&!aJYY$t4ul1@#qkzATNUp(IRYF+_vh<*xIg})unA6 z;*{iNclm5ALrGbY`7a?eyQ4dByE?=XaDef z_zkol&Q#$jN06cW3~=5h8oh0=cN8HsQ*lFc3$c@}WBJ^EN`tUIV4GCQJUCo=Xru<9{II@Sfe zrKFUo^m?N*}rb*gGuZP>&w0G*~ii1|MZDmgt z2UdN~f50Hj0G&>0*!@lW=+HVz#3%xL(QMz^qHkDbeo z1rpnzNPjXgkw6mLBs%!$ITe#AG!bGF9@4fc%G-@aijc}C za2d0lvGU*EeVXaJ0U^RrHB)s$F0`Lk^MBFssEBJnS)$;u<$D>H%-t@vq#Yb+gl>;5 z?_=%9X$@KgKOLFm#Jy?R&v}NRO+Vu(M&zUR#8PrPFeOH zOriudzgZ_i2<{%%Jja$b1qR1{?}K2D9*p3X)wKQI;XPWm*N+srM?WeTZ}u}}BRMv4 z*GW9eg^q3$*NUG#Er$=ubl6J5iex5W3H^6Db=V5*m?t@YkzujoYiX13k0ESM0&8Fo zj1k2dv!ol#TPoIR?(Xay+1;s!)qSF8Q|~NpG#HCB1Es|g8YW>rMQfvS@opR(fNkss zihy4Q$n4@TKMfp^NS)>%^jtM+suB%l4bhUK!f>7uS8-_?oD^fR(;*;9haAej1%sqD zc^c6FVcPOZla^1Ly(~0g>za#qOb#rY+%|Dy8$aPmEBe3KzoKi&+}o_*Tfewx;ff1; zJ3rsi)6?w1LC42iR}<6$Y2${fE@=! zu``hdASW>sj=;pRXY)BT|F{#fenJOlYRA)KtePHUHqQ__K}aSye9R6(9IIBudg()i z;XEBn`}!Yv;Q9xi{_q{w-=RvjtEa8`+pX)>E{dm8PxPbI)SPKH^9(|N{9h3gFry70F7mPg=3E)>_z9mQFU?!sc=F68nWSnewts{9m6M0Xzgq3OVyRP zRJ3?|t&VN~N*Om@cU-E|(o^*K8E>CXwYH`jT3cyU)Y{s>A7?GUeK^}G!qe%)*V;le zu$BgC6K21TgtOOiPfqrqJ701^>|Pjsr=0KC*+EZ3s&7xVdvh93GT$$Y z3E32*9cYg+$$`lW7fzO+^!V}Vh6xjno!@tpecj}R<0mxO7iV+d>^Zj?^v!5wC%1t( za+pmrb@9je{5qFecWgOI2B+jQH#emlyfe)<2R~jTkZjw_W9BfbY(LCn&+21tr%dwr zY&xb7VJ-BEPpmOrRT+=uD>+4SJwFK}QK>yYz2i;cMSTRQ)SA)DCI497jU411 z{0SI)P09Ze8cQ3qGc(!W2#h*6mP9SA5tL5O3fDxD(0={TX@w&U=$QEZzB%#Oh_(KY zw2v3R(;j1v`Y!dw#lJv3QaL0E2Be>+&vzr|keiT1DBIBk;>6UhV%@$yDr0?T=>F@~ z<6E{^w>xQ@*jmy&q}SmyRYs#h{8K)CrFC!hJTt_>LVH2#*#>onhXi!{gM)T|=~VrZ zy`{sjW^ZHSZVz+u`BJ_XmOGY?m6d(j;UC|27|NSZnx#*k=`YS-^7`5N#Yb|FLq9fO z8EM{HKHR7_SszK`T=f}gXs%cD<{~o2cRW!XAwx(C-4;^lRs>LGZU%fzoE1NeI*76GrD-^krjV+N zO?mR|uD73@(xJ}1WyOk3o6J`b8k#q$A$6OzL)|9pIu`aVPehBz3lZ2Oy5_S$B)}>O zWmxxlF_DwjA}s9n)~f(uo%0@4I~}2FzW3 zPrd!2b2`sCCkytgYLB&Dpe9O>{Ud!xd{oCRG3Y-jdDnJ!Bbp=SP1#J|44tt(mvIFIAgbhstTuH?qRs58zGH>(lfD zsWF<3yBF;*17E$8^zILA1sxb!w<1C0g``kBJB4xpesX}3G3X(gm#0%C@>bCfG7tRq zxykbOjmGYiymLjSrjoW^>4wUh%9`q`vP3Le6v-!Z8FyfXNGD1+wMbC7NO$zewqMNI z0%~hrOJ%a8cJY+)?wfDs?tQ+3k3$q$pV1 zj>tyaB90?EXzE~MUD26!><&4_@_Um`QUAnSyG&_LZ|c5^`kg6F>doEyx4HaANvYqm zZQGW)y-vIO`|p>g_4f<-hQWSX4mQQEARZbAX{Ti8ndAfpiJeFHcQlu8qq=p~wttiz zgC0U%Y0*=PB)eJrfTS3)Zg2v7)ICrLsFpBF>0vMbLR9SzNKUsiGFVWZ-~Qy`!{;16 z{K@dcpB-WyzB2S#;GYTnX|ogjPcYVIRuR809SNj(uIb-xV7v%~g1dPbwCH0S(&=8( z!YJCn_Tx~=%g@hSX5{7NuPRXadHI7>#4tK0bW9lE+1A>euB)l8Ovb5;9x>X@b`jqK zQdyhUSXxBwmex{fi2-V$ZU>PsMC|A{l<4Rt{YZ|zg?($b&6&|V?b4Owmv1Y$CO9cQ zesOElb+@*5bhh+0bq97vc36+9Cqv5@O<9l^nmJ+q&{+#BYi87>-rrPT*IZq3`qFP~ z*#hmKVN5Y2zEZQe71uZIotu+0uS-3Co55NjIa!3TfiyNC*RoObJ(o`pzyDd)pRT#y3aLM?9a6q6 z)}ETiEqawD4&hRASASzZsr3cvrFruDLQ|uyFSNHcPH37?S5uy@NS}hfaCC|JNIgMz zNAKLZy|Od-F%fe`HyHh~_8nP&!e{I`+)Ld3b9!D?Cn>Yp;>nT1iBs3)s1Vz1a14+; zRp!MbfU>5$vRN&>ZyLNW&RIleu0D)8L9j=Ps;1D{{TmAMOgX<-$ZJ5W=K*85EMZWx zDN$2a!@aaE;a_7aBKt0C(|ET&nla{yL62SvHgT(Q6EC>piVG%o{gi(f_4b~DbfNq^ z)~?-g@L;F)g-+{`nxxJ;@60pLgB-r75VCnk+mHGD*;3TG!8Q6VS_V;7#~$X-%A zB!P+8TRY@3-xm)p?er}LH=L{4F@spxWL?GJE!x(-&-+GiS@A>US+S3=LiH0PmkaePpEn zw2`08*|I=?FTeL&)90VopEI8j_R>1zjEqz>@R6BBIxM^Z9MQa-Oky)c>$uSsk|cgL zn26`+8Aeq_ye?5!T$mTjr;nb4R7u!(SInzf`8=8xHdb9EBBWNpxniufzW^p;fG)!p``Izp8hLz%_J6n~<(3Rya%LPr)}Kk)j27nY|}krm-jYct_&q z<3Rh{ky+}md(JH@JEv#l`*X&?n}@a(6%H)Nd_g!*N&p;pKNS@^V7Z%BQEM$4qZpEp z=AfEd4_c9f)KV%{zdLx)2Bqjv>Qd{ktk)3Pt+Umpg9ot?j_zflNvWuYO_taP<&Y(< zLrft{n*QNNyU55dRC&StJnt?G>s?k+&hoMbws0VM?>3Qomb}PaazOQxCd;1^#wdD_ z2-WubyM$`JF35EMa*%3Wqi(cba_MyBC+fy`+&@4q(2mZl)>x347mv|g%3bSvc<0F9mvt5fYf6VVJpAy6q0*XAVP}~+D~F#Jan@6ZFCHx_fEfr0 zkOx7r!rd|_e=chkU0PUctW+!R0;FU&YCZr=vYB9Mg6gyn?)6wfsXq`4{|H|DyH{tv zs)2gDdRjC(y~!F((t*Zq&+ol+qxK(&D& zeY1V3-Xz~ z+ld`J30drHjzb_TA&J9IQa9|BftIqBP)diEQYZvk_P?df4A6E4Izw5?zy}O1LqKH!eVUTCC=AJP0no5Qe9c91vVk%(7tj8!TG|$Sd<2!E9zD*;KHKi+i8f zlh12)pvV|;uP!r(I#=Uf37w+AxN#PX^J2FoxzNA`OaI2iU0`B+LV5U^)=!x5$ur7} zn9CnKyF2evMONt%aP?o0D5Lk>!&&=*2QbJ?-u4R>!go~fUaOTEWfbt(M>7FG5K~~U zQr8{U)po(0g-DOtl&&YBg*3RtNBy4o$toSr?Cjx0NnrtD2g1REio$ZE-{^;r9tyYx z8=nCbg9(6TQSEDl9C&_6jU!ZP0p4{_( z`qSN5Xpoy2OHx+g6Y0#b{Hfzxy6}QWhqPwArPO8_sxD-LNj4#7r)nYO7v)-$jX??F zlzr1br8>VMRh)Q8DnIc{%s+DvL{*qvgz%|{9BnE6aJeD;A#q9>FsQANpD(8vTSzaWut=30$#hoJ8t$by|)!UM*{xU8R2 zGO-bAN@j+_mLin{OV$B#lhoL-8Gih>VtxB<_Q}7S9Z=USZ>mdlF*d-PCiViO^uc^_ zz}IH8wfZMejVtr{QBO70P_?4=B)PJ{c8I)>Q(*>3po4TUM_^3}Z|sm*mUFaM8K|KqIa3BAWgfzjiTo6*7iBO( zUz2f?-cB2!dLwdW9LqXreHF0PhrfK+U0B=v0>k)TSxbGG+l8g%WH19zM&aEVw4UAj{yFm9tQa< zfKNe#HxZsfG;V+mMc4UIy@dNI!a|u{Qpb_{_!UL!0tV8WwUcYgcu%O*ezB{|i4pTz);29|+ z&q{s(mLVb0$5A4Kp9RA;wI$Ay+M4iT#NlpYTg3L-l9F0_O}t3~x%X7NemdshR5MRT zqiE)C2WE~N!fhnA-+1HG-#+y1Z~yB}yV=1c=zvHpJTUnc_VAhe4af>Xs3`OR)BWO} zdy*^+ik&CCmGV6X1Vj-1u-93Cpt#7R(=CPH8Q{@Gv}Bjkn+e$H}|k7U8>Q1A=i>je=$GIB7E#8bOgq-i_SUcqI&XdJ}}Ki z%T|(0RQVno9$3GAK>5yxGyJs}CFVe59g^(ak6c9FS~zNTs-qV1E6vph?-P|RD|O#%O+uYDCG6RAyyfxjD)>GZ?Mph zOL?^TRt{Xu2<&L`2@xKQaw^zGF&`d8iPM(^e>ti}w`kBjx-~9ReCyl%XGU!6%I~Rh zE&h{aj7skiJd?ai8_92KAj^vufB}=Z1?WYHN^%c4cR2HkTLj7lLJoI52zrs_3fi#W zuuhJNQ1^);$Za0e;^8c;R#5_u5t&Q?0Rz3rYbK%G0>82v(_(Il=W)m{a+*S{>L*%E zOZ)&qEi@rrgrFAwNkT7t*|~gQC`2S>D6y&lln+4{g`=IYm#gaDky|ts{yim$iu|y zN^p_4vau0MpNi~bpUq>@?U!A)9j{xQ{(Mhvpdl7($Xbh6jrP0w;vKAF$HfaEBrt@SbNd)1eQ(!?uYor312f|U)7i-Jmso?8PG}S zKPrL}#VWz4gM>cx=DYlPe$^%yvenRBEQmI;ypMnb?yOKa=0JNDM}1=h#Ua}kIsTj* z2;~0Bxk&l6&b%-XjYgZj)naF9>BK))dz*jC+&w+Y#tQr+eaC@)Xo1uVUhyY9SPAeL zrxphOoUAa+Bwk_o^~YFn;*Wn(j!M1C9{78|g}I^ghp=Ak5HH0w3_s9IsKe}tyB%)k zS$*K6QRP|IzUDHvdA?G@k8MQ4Qb=5c6>0c^S%+ie5&Y+lyJfc=xpu|9-&*;td->0y zw9mMQQy3H%isQ4Nw{^wyFRXmwdH!?RisxTk`Qi&_;hPt6UIew9Yf(RW>VEME?iR=X zEk_~`KJd$`=r135@RwCpD0jQ~y?1-*=X+RCkZNKAdLTNd;CYQEHp0^;y3s?H9KAa6 zDhswBOqg-a9JaIJpw$eKXe0rHRg6B8F(I|2Z3Hz>C9BM`=5^}L7-+kT{x2(S90r--#~8j@&Q3O{Jo@u;Usj2uf8t{{I6i*Qk?XF*I3kl1Vk722e)S@B%G;FyP8ap)`vtQ_ zMjPgFK{i@sBey9u2fOBbvm$n=1CGW-g}f~YlN$`iVT8#Iqgl*gG%ODk3qn_WYfHQV zk|k8!7g$nM;Bn_UbE$#2H9!WugG^lXuYlc#h*>0Q#cNVM6oP&gi9x?m{}6$VNB&uy zqeawtD-1Y4`Pn~>Eou%%x*M*$!0GikFC2Fl6u8Hk*fF3V5KH{^1p!aqP^_c7J=W4E z4~RieEZ?8!SliUuHxEtI2CGY3oW{z+@`mRf`1cB4&WR6O>g;Htob3?JhQ>%$Lwz(W z*Oq0?!LRZ1x@PdIC4JX zhDE~`t-YdW;lZJ0W1SlY2iA3WlsB2gWlLAAKYMt0C=dz-@OrH0&{}rZ+C$wP=k+Ro zUbbP~(w%*)gM~ed2e*$X4{g{w!aA$Uc9uu+qpS*Zv|*pwgE>Z^oqau#1t}y(O9F*Z zH%S%EhboH7KS?wNv?)SUz=NPo82*D%J*syIT}wd^L-H44z(<8~PI4OM`s!P>ldx3@ zUBbX{!dG6#gqo_dhH{9q;-dUKrvn@nVG*KQGPJ33ib}gs5+3UYlAP9x%%SA*c!abF z>{#!OoWE=#ywx>lHMOp(8;gbtOReUo`p0kl(iMGM?Yn;&Dp+t|Ns z>4p>gq#IAbCnpN6ljn$qcrL9%uW;)V^-fZD@j%>oAjQCN0J^ac&@z$jfjt1&zi=+- zDUIUMbm|9u>VpeR9R~yZ;A{sbg6c7B92cA8pyADT_ zwtnL(oObqQEUO4xATLR;!x?;uv;4C!FnmGR5Q$Vb4X+?QM&o`NA43$KnCr>E|SsnMKDs(%Bb66QI!+Ci2{J{cnZtm997RXjpJn51mSuHXAdVr z;Sz_P2_5aN)MThST2ay!?(%!dG=u!GFeqmvL ze!pXg+$0Kgmd6+HbRv(B4!Gi0xNfluq7o-Xl-t&FR3f3 zs|7p@==wspOQnf*PMU-P<;H~5=mM*joAm0&nsP2@kVE->k{Cpil@~WJDDoxx2(mAj~9(?c@6}@>vNJ74ialk`0pzsssg& zWN927XG{p$TuCuGs1IxC9obL#C7I0^F-D3CNo_EjG_8TGSIX%lD-W`S;)Dn|#mVtR zfOZ5y41oo7;kh}=|@2gOfUMIdGM5Kzz+r@?0x+{c3IL@9r?ol>%0uzo--pqD#f7Hq9 z|Crp6;4$0LgS(~goj|cHG3~rFtly7IK}F()nT{Sjco0Ru5u`!`5c~uO2uq-sXJb6P zjsPrI)XKp20^k%?%fPzesa;}b9RU-ZZ{&7_r@ZNiOiz8!iy)`!RP4)TJ zPacDN{sUx4lu?|s*vnBKGTcv)U);8YVvF@Swf=BV2sUWa;ru+SStw+M)EkZr$3{64 z*B&DTkSwdxCGO4^C0Cr*93&B2y>iFA@VQ%-4{ln$xCgF)3e!eQP4{_$rEzb8VdShT z&z8s^21Z5(7SG@1_iZQ)g=}4}+JM;cY*yit#a)4PS~v*T1s}0VM>yK4bV2A3fL9}A ztTQ2V3y=y#7BUkCO+}S%0+aF=rw&ob1qyK*fl9yKuk3&KUHteh(Mb~W@o>q$&*IwO zB?&Xx-YzKiNwugDE+*Uuq*fZ!sIrzGT#ZYVkUYNzV>ia&jzqv1mN{=V+Y&K$qmVl#TACs{-X` zpR?M>yc4DDUhlw)V*1sue8_fX=P21ZIoS%V7UKJM=#75R$BVran4Ll&Bsu~>go8;! z3MiR@!9@x89K;P!TcGPOG!$VJRcs|@w1!M6UYa3gD`yhd* zC8i1hwM{$~?K!W#{k)#VJKL2jt&8I=n_P{#3)elz@~yqi@x|tO7cTv9;DUMc_77g7 zOt_*Qb=BPwar~WkT+t}T4!Z~wpd13#E(!~45-T;k$bc@*2G~UyX{JGhNPvM1BH3t^ z*Wf`K!D#5zFj!nH2*u&za7ic_$S{EjGIc5wh}M716`9qz`NqJTbD1vx8}{Dky^s+> z=%7s)t1K+;dn6Z{VLojbOn}A$6`cxLNSm;^G6@MLZoZeG5Wuv*3@5Do3du74$@a~` z1I&BivB#DzdklZZ^R@}g#FgR=h%OcrUJ(v;7?N;4Q{W7t5jvi$ z{=nHNLR1Lj7-for15Is_i;cw)JgAi&LH}gg4YW=vv=VKzrm~8SWEw%MVg2u~{e0wC zE0%p>$)?(sjg2d7@e{u+`2usjiNCz59AA8JuxV9Y-Kr-19A122aPT0(-Y{nDzG9vD z9=fqr37Zld%8EoIt_QmW3c8;B;)v)Tq-+%^9ma7B5*v+If~=|lgc+|JrV<3C+3AGk zem@iZRsO07l0gZ(L&h#3XXy3De1r@KE{^szVq0#(s!(th2@Yf4fjlz=ghCRs%v}H4 zxT3mxMPp((XPLRSFxt`*Evz*!%NZ`-{7q!^FXcbk)zN|a*g$lCgUi=iRn_8iHOyBo z#iO6_MQY2oD~~eC8?GulA1jIGxromb-g9ARVp|C_nrBQj3-~HZNl8r*fe&Ph0BHpy z-(cA$n2kn`TcFewvvH6nTwfcl@R$3M4_F!oduL2K`_z-3P1Bld?%scF@2@N0w0>>> z1)icp&xLc%zpF0NXuf3s{zpA77eV1MA1C_>d_y0A@6h)aK5AhJSQBlW@W*6@M+ajt z4xKEY<==GO_3S6CK>77eH{smpu!ZcH~**wXvtwYoJ2p z9oXkn_eX#Su45HC3!{u2)BOG{M80x%$AKd(D%vpuj2-9xfuEbaKf)on^-1a;hFs6F z=n;NPIumnvMsX>uWRvDtu z$s<;2gC>mLtTe{5kTGo93^NIR?G=}fZrwIx#J$h0S<^#%AoyVNxaiZyTP-}0u#_>Q zsXPQxM~WIHGB#t=)*C5$YB0i0J2igrH~NT@lamZ}IBY3!2wb;r6!w#pP&YnPG z6E;i-FgEnuY1$8Gz@z zI!{v~3WMu*S`iLPW%v8wbj-8m&E1w;3L4}&%eq#%?%FIb%XPl7U`NNqXYJeOzv{>cB8jc-u~@rO?5@fC?QipHUWnH! zw;6i&bT8V|EwimP&}Ztg&r?jof?S1>#QNd_yM*+@e$rq}2se<&3IFpz1XpBej-+<; zhFFAQ5%dt-A5Ay1Ukd zfV^z3K5vO+S~9Q{?j81$Ca;wSHh7ualb!9!zf^g2WZ}BV3;*b?U(kS2q|YftoLJ;> zWI+h3lgd=fGG?QOI?)v^b2cF>k}C7vuu+nT6zlZ40KSo$3^{?+^j~>uDpwp@Ki_E5 zL4qXK9XhmOo)MuQy%8Dksp)+8zSS0&1^=(U|2wNJZi~fjUY(rFV*Y#_h2Fb{NlK8*7neDqdZFo%X?NvU9&N{^} zY9t>~EC;i||2BP0R^knm^QM)K6k^j>XvD}8AS|mabDdBg$zs5Z@-bGHquK+6n$=^? zN8VJD(%I7~eX0OZa{PN{HGtA5G+P9RcxUoOv7ghsMtCA&@iVir+9v{E49V|;K#&O zESM}}er9r9XE1I$!N|1@h_Jz69tO~vM+MCWK&b$;(e^vcHIfxMow?4imZs*IKZl)^ zHouuh676xK(4@saO+q6@ZwV0(7@!d{(rf^-e;hik*&vfP08;^598?<}K@&TaYV2vCcptLQ+}gMoR-^E^on?#ar-k6boERFaxKeA{68}Nm#Rq z)&A=F=RZEpC}vM@&n3#fQ-&>R?jS%lo~sGEF>=}vxmGcxJjEF%!n7%;^!wEA4u!~w zj)`dB>M(2K$ZAQ>*P1zBLd$SxnmU_H`J8CC=HtCUeOI4}mp_yDcr5yy#AXUP!LbQ` zvl^`yJQ}0PYBbR!fv*CaGu#L;&}jn$8U%hMGokOTSf{eg*QtzPG{Q6pMrVeiOKkR% zpgoigppj!XgB*T9@+<&?RC*>sXm8DmhL(}sWtKWWtu=q0b@-v`fx3njHEhFaJVLP^ z>#(CL*V%>z=<#=D*AGOi1}09N@_~xn)=BOw@U^L)95e91(AOk+JhjgN$V}G5>2E98 z*vV4Bh62Xbww1`heFFpceZuz?JjH_tl}E3;4mCs6O$84}s|&?-tN_MVMR{=1kcR+l z&_(drAZv}Pf(7prB5=s?mn8j&*IYG@2_?apP*zn|6^sNUg#|8WE+ERP#zm+k z9^6XCw(zK+aUmlrwQX064!Ki|2jB^fWa?YpdwcX34QG3-P`HLK)c5S&bVK6YPW{9& zeaDurFHKXoI(II-J+H;0+O%qN)-QcyJ3D zX6^fpjgyL@VcaoW+)Zh%5qbIBZzF|l#dp8U*1i6^^6h$N`}VhqcEGU+;zB788*LUM zC_bt&g-Vgq5_+6?uxg4vz>#n^T9|A_Q39E^W8g2SOaaxtF;eZD>}*+9lgqQ+*>0yz z&XTii03YXa-3?t%04{SxWO}>~Fgq#~z^UrSZ{otk#}2dnXP$Xx*IhLM-yvV1<}UV| zH{M`%%3of7`HeS}$FA@N0=_FsIS^Q!Tqn#EZxZjt;>)AT!`PUT0ztIG*O02RAzX+j zFCq5@OBD|=z*vA#l?d+u-y=tW?g8pXtX9@5udo=qC)(JU_w_p$-TAd8hwtdQ{mywT z%9@&@%I3=W?S~I9y7SJ(hwtdV<4*Ju{u%B+G3)(JGwu(sxpsewd=jh;!w3`FM;k*$ zWm8inyNAV;SCsB0ci!G}$KfSk!zkv(E7{#qv3^9Z-fDyqvlHy|_ zd_v_P{tf>YiEqxD_NGd4AqX6u_{OeXckJ55F5UISl3(rG^&$TaUnp0z4;62sy@uTy zC902BHnF?M$H$e|Sd@O^BYy*{;<*dr0QM5XP@?t|@&IH#3hwhD6lSg_18^ts>{Ukt z5=Vpc?r&_(qj!Dw=;4=M61R>`d~FOrRX^I$Vq4?&w%Y%fS&;lZz|9y$NyP}l-~cMO6? zA{Zu*3G>B`;4{LLc!UyQK1YPziJdtti>9B&wr4vb8*;6X5`whdW)Ve)(Io+;V*nCK zHk;*PyvgQKd!A^P&CBa*ecs%h_3MUKuUIy?baBtZ1&Pkq=6GZ6NZm+vw5+ta&|Bgw zaXE54xgKnn0XH^vmc(YkzQqhcxMWyXkAm%*R|2)BlAi5k7FH6>3l@cd;V>pHa&S4) zW4Y+T1q|%IW_NM1JHPn;_3N)}F3!g<>@xLT`H}Xg=B6b}nwr(0{pWzO~d^u zCPuym8zRH-0;Bo3h(c0GBI~EshX&jD0IKsfZ5v% z?cD9BW;^0?Hd`K61wj=uV<24jNCF%qX@QT+(y)y)!yPna4dBS>M&qVf9`#XQkVx=x zCwoa@%ce2I|Dn4ojcDr9<%884sB6PSR^4pFB)4SR`0i07bJOE6G%#{W5-kxMt>a?~ z3EhbW8DoN%1X?eOM4>X#RcS6qHC2HU6^e^cbSRGyKiaU&vkZ%eg`vjsRmt_)^dT~T z@9;o%I9xq2Oq%$Nq3&F@=*K@UjYdm<{NqKdIRBy7)u+gNdL3FxT&Pdffc+TCWc;YA!Vv@L=5alJo?08OG4O3Iq6liQ|IC2??aR>tV`rLW&Y!J?i2FhVyrKRzv zJg9OmXST?qd4WJ4355mwhwADpT(R6-+36{0*wEg-p~3HU%DJ|BS0!q}?teezVV8SC zA&+vUC-nQ;HT&kz+gF(<+j48&{=R6(NK?~DN3_rHuFbW{c@<;x=I>hrq@JYBYZrF! z5cX{3jU+QUjR+3FJK>K}=&o^1Xd?OUvf=_R-eX(RPgpW||d^JNZ7+wxy$EOPl($ zJLGwc=8qrXvCMfTPKLpuIi!!C9@nWxf70=ue4OB%zf2xyXNz0GONhsDPJ+Hb3Zlv{ zq#z>7pT;jKKG5SSf5M-#m8OYv4U>Nr&xM-d67mv`92v1aE*hbFUg#)u@4@WHF zortUOE@z9STWV@pZEd8oP+whLbLhI(yh!Z@mtU}|20v;ec`er;s;;Tl7gk1UYgrBF zf5Z?=5JRN8f+p(f2*C#>pr4SOlr%CGRf7TqP`r+!!&9|8c-|vi^(GNP#%gwA;&)o0 zkyISzM_RBEHv;A`4U;{eVzsc8;FyMtKq|S&;A)zI&DJAjh3X*y0t%we1Yjgyaru)9!2;0(cJ5wr*1 znhMuJIWWpw0Wz{!3~+=S3>Nrk;ip6mI|!|K6bP(_SUop3u%md~P7dC!WEEQA{#T7QyI1YhJrKL0kMhdg%ll#u{ElLCNa zKn%b`2Uj(`kf=pK$q9Hvb^>ZpBRip^y$U2)Ft5F*qo*+zZL4a_BtRAf(3!A(8nlBH z+6=_v=@8^d%2f-8ZAEKq1^h>+q|R8%b6Yo1)eWz08##_tT7g#*oK{W1EtBUqlU7uo z0f{Inp0PlT62)L1n+#@%5IE4*z|k#_Q1U4IM|@6~ALQWcr%qcx=O)gcMiHod;1?jfvMeaM zj-X76HUxs<+yoPff-&Y1#5~OZ{c9-A({?)4$mU+S(;+g7nOvbEo=#haNOOeUPKOq3u87s!2N!TdyfYqTZWJbf{pvFJTT4DEEtmpyxU z?UcluHE$}#XX;w(5P+*|u2FGynZ!FIF6)SP&~{ZlP4=8Amrb`ZPm4ThrrqhRx9P?d zbW}3>3ZSd_$=b`y1q{-Kt&70aFqfD#&O=M6NNXv4O%JNJVa>qO-87SZvq9gRQap)|S}%`=MH{y?^MOFNh!P9j%VX ztK)U?E#KU|pakFJ>wrwg1V%BuE^z=K zk*n`ceII$YgP^u?lH0e!7{Wy$s6G3yR*hc!^ zo@O7bkQ~a5sjH46pVDuA0RQ*VqAR|azvN2917luR-O_1a{xsL0p?c2HzM>)K|BlmK$Xkq zC%Rw-^PEQV>qzi=!Q4T^WZ>ATRK0+Dg@Vu`3=|a-R=cni1&IN#plVG5Tv;Y?YCwxw z$Elt+MQi}8SN(&OmXgZmXL;Q_+DZ}?@$UHM`42x_+0a<&{IQo%0Xh5w`%e1Vo0E@#S?DX$%P^@6KRR#CK={u+#x2cu?>^OBXz&&z$}NcQ=w>sni? z!_D|=cmMM3lpY|kiO(?4d_GT9_d}#kLhwwKsOlgL*+$sB0_KTIOK@k8)5GFPCorl} zSV*Vq(2*Q!5}L{*;gaGad#(Z0cQ=+s!i`~+Z>REZZarV)Jdcn#j~aNusg#xw%JJi} z>*&Uf6F*_kDepQX7E8p*Ufj5DL3erS*@NrW4<6`Ud09(sO}vz*zINqf-!n!&IPmJ& z)l`VjDu1uExn^ow-@4y^?vjdz)Z_lcjbx^Zbk~$=sAx^5VrTOVGKa`|D)%;HSu$2c!HctGM{aAU|QI?$P zqJ`z^V?0pbByK@zK|k^c`4gW%zZOZd=PcVe%e2#<=C|g4`~y4fKcERsyat)F88W2- zvb|eapBT;sGL-d0gk)Jv5;N-=ntG8uqmoX|OLMI`62Ju`Vm3h9kS<-FO^pn~sI$AP zyCvS((bNI6wWbmU*aJmApkAqjn$W-+Y$%a``m4{ltsAch`4xh*zF}KFO((uAUm@ z$-Ue}FWC?l`&;a@s5vRwJUbO}H>I z=0OaN^`pwI?6l`*BegUK_&${Tf>(cpm*{R@n(uJi^7J`5XtN=@Bu=H#O+#x2p)G9L zylLC$wspg6MutXKEE`xoxVpb@N$^SUTKvaY70tOThjkPtbXZcEux&osJ$LT5t2 z(<10J%0BViQ`7g!3|b%Cola}VAm$ z^xG%f6P>$v3*yAjCNJdqS7ku?UHZ6}mnKltzDuVn6X=nkrWargrz#Z4vNQ_CuT4gR zS_yW(X{8LNpP-|p{0dYXuc<1puc)V_+x$EmI1BYi%chqy&?>QM>1r933{ZLub)=|1 ziOZ=RRjU|WeBD$LgO!V^h=Eiy;a|9L;q_F)pd2L(F4_4h3K$IRKmmh-`mP=nF!<%l zjeA+!s+}uW?ci|>-NZjYzugAiI|4gyNH|CMmqc!jjHu6sWxXh4U_d7ht&Bl}ASsB^ z>&CMgmEW{l#!)&^Vn{~gwHvT6jhb@}$clwrUJ4JMg#7)fZ>Xd}>nSe*kPGytmelFF zh8(P3UfZB-E9HkZ%A+yjzTEzv!@jZCXBieI5U$|Vj zPPk3@JmEO228&m`@r(O+(c?De+LDjEKg)=)6@T6?hiKE~>TJ2=*(g1WCvKIYdUGR8 z7|qGInB4|_9x9S{E%iCQc8?yFS~9+-N59~-E~g*KF{8yoOWK9L5Zo2-qFWq+Kp##?)yzZh4_FTUA@|`;%+((cBb^g-x=jIIme=}$N*SIHx zm41HmY8%JfHWDl4<<+c+w+vA=j-pa@>-pl9ONf;mGyXWmXA{>JRy(OsM|GVzmf|yU zU+Uwj%6FWUHKU9iH{s z|CmiEW%o@lwt{XdZ_oL}{xtTBX%$zRRh*D=>*RyT>i;7=xjpJu=On$Fk{n2-hI%Ck z%@U~P;dT?U@YFw&j!H_mAPr_@yPD7j3K_VVlufzyp!k)E^H)g=l-u?zhoRTMB!p0Z zZ7)Lb@S7kwk6<8KjS`aUU?Rdm+lF6p-KoBtR8!CnGhId+ei-iFKxrfrb4Z~$wA6s> z_)7=$Stir{Uw!{qH$Nzuq+=h4#DSxF%R9=yEC2p3YUms#eNj}ti@KQqgq*$-j%SOz_820$l1hILV<7~ z8Zcu_NVKhQf(=MT$>Z@R1hnu)9?}og&P6a9;o!l*Z5@|{%28mqwXv}k^&-kkF8R`` zbMkRhJeJ4u4-1+9Xx-3IB-{Nk;%Luc2_t!wqg0#%PPjsx+6XqWol^z%;lTN zj~u~VQrIz!ose9h8_|)-$Gc18!OZL?ji*C+8X($G@)Ix?=2CvoZl0KbVE35#;@F9m zbeG9V+%D~pFF^}9N>i~XzrZKx?@jHJ}A78 zdD8VMpM4}@&a)#i8D%1Fl#!i*ix2a<-N3uYIXzcg=>46DOJP$tV;Pj=QAIlPEJ8Bgm zTP{Ui)K7spP>Z#wq;-*?0A)!)psyMInUmF?L=6Bi3}Iw5Op!B#l+PbzO({B>&1rO; zK|_|3i56j4rJ#R01<`k!XMCyT3t&vMP!G=|*(`cEK`xwRRu4(DbdqV3Qj?aPR`e`W z^3n>V20S5fWx~dtl9)0oD{Mmm5-@4qR#kEWVnHHV5CES+(Kx|M4o;gXDLqx$8E`cQ zAU~0$6@UcQJvc=2bLjXgz0U2^>HO|v6A+`oSU`x5jeS^9BG3DinGzlL48c=k4X7`>iMMje8#hp z;OpBDU*EYv3pWUD0`d^s>g&)++MVafHCY7K81>{MFbU`>z<+Ru3*tCEJDxr+qL>&E zAymkuN~rQXb*LRiJqsi7=D8bHgMhodGF?KY5m(apC((fh1Df7Yu`T7z&3oB_>T>() z4LjC#CHgbmf4K$K`NeD2k8Qdp47bWPW!2SXH(X&nZ>Y4^_?kX%-||)GnXb4>E=~6W zewvdb{);JZ?^$d1n63~XEQwj4lA}tAp$-m5sM1XF3hUX2Vl!}8Yx^GYLkf9;r9r43 zB};)FHUmH?^ZKYFH${u7vaF2i@M*{3D-l3n94X2WNz@n;h@d zkkvtB*s%5A5~{>}aVyqjK6P&aiUrJJ1DED!S+V2u%H*e6A1FyNs(u4!s=Bnoje3{z z^n34J{@!~Gbs5P~TINvRWzSXpdjGHSzXcvq0F8fS^+nt#QXyv<^N(cKiI>fe_^L_m0>?-4WTQj?r2@>r-3 zN-laQ%NB#Y6;(tv8M{=lSj?j~W;V|^Q+Yzl%Ri&jT5#H#oq-#na$&tnQ&pkyqXxCB zIGvU=)Gj-OeOQV~Nph06j>t-u5y-02HKg2~eQh?HXA?0e{!OLfi60e}mKGHjha*M5 zW`9*o_k(g{f1w|T!vzIldeK_`Ot?)nGKJHzCJ}{;7?Dt(fSAgrP+Kc-WnrqF87T{l z27=ebXS&?uAL(-0m-rphA=&3Gpa(plFra-j;@n|`^y}%A6C-wlK$T{y%oSkRY`mmP!6oC7RAqJAzL8Y9je@m6AlnIq=)k=?m& zK;UzP93Jha5yvBV+I-k>cgk*e481JqJw9~&pQI1#>rZ%fokKT2(9(AQUH|d^S08L{ z{Vqm1Z{FD0yS;tyun3FLJ9zav4A3Zk4RWh7QP24LUYqq zjQ~-OzhVT&;4fufe8MJqYfn5O?QdDxB0f1$R43U_JRiReCdA>x_;DNOyFY^O44_Lk zWfFoBRVMV1cIFJq77@FI;kW?ZOZ*Fh7YV;VpR zgGA_8Bl-69S1sWB^NS2``X95MN5yVON0w7uuX6RAjEw z#2S%1D95_+MAiydNwT1Y)3YNmMJRI+D{I}t**GK z@eJv@PPk(+>3<)8ZYX_J>dK!Q*yQAiEz~y~v;&WwKut%^YgP={!24*kiI0R3`-HE} z+C&xYVMu8OQz7?-x;els)9kTLkhbD7T!7YS$j;X&i6Vdzut0%Fa4WBH*B+Fh?i2qH zEtC)!KUfg^X?0+Y-jR|6|J8e)xJ0{`{*hyYlB}P)*Iu1juicCNFU-p-aQ`JxdlVpALleYdX)I=C~nAU$oH5mo~1##6X|Y-Ssk-8Zx_cd5{d+pw_EqbSKod2mdB6Z zm%80s%A0gMti1y%8Rb{%W|L8qlgFROG2iEM%zyl1;xVam;(n}IgU){+$-F6fru#er zJ=(zaXzDZ>6yA9pfEPfpR8=}gwh=4_Y5m=*({jwHkTgHXCWE1zuM$FM!N*fEW>D%gus-23mvMTiKc_t>?>x zuM)SLLIs+MqUq8nx}i%?oKO4=f9NC1a)W%oc$@Br$F^qb)6enMWR&;Irgx6+->>|B zN~^|mn)nUYd5O3S>)Su^H9P}@)bIycqY{Ek5hmEGW1XI6H5(vLJ$MWb?_4n zO!^*Qm+2IVEOr_3MY|}w@&WRs= zNv!zPYD2f!EDQlY#%=K7evs~C%t1j$ecCAg1|K6jvL$_t+>M+$uyYSiyfkfWv(lyV)%qS>{l7 ziajSrCY~01lwHnJi>1`TZrv?idg5x&O&{ZF>ui?Kt|ceoH`pk+;LD#82iPp1AcpuE z{Dda>2`ho+Xc2Br6xIg)9-sonmYR^AAahVgDj2%K^~WFr`cxwejhe6{No*WlD3BPY zJDWV1qZs*o1PuEg$%2JF=OH|%IOkt+0W5Li%}Sxt=_!Px+B*|{m*IsZT*6$g$Ite! zn)q270Pp#ZQOBx{JJxrt+jU?`(VF%9HeHKYROz*4RaJ01>O+4>BJi^0A9$rVk`Bl# zj5}8?$@%BGeU8%crzZEak3h#J;LsKdUrdA+wzZ;Cd?--t_kfOohd;LgS|au>2us?xd^|E4 z6<&V4fUz7BlXc*ywm|~ z26{-Mk_4bgOY^csi>1Ya-Dv)d%g`ZobPgN{C%t6yB5?VXm-~?tR30ryjSVVX>o4(Z zRW>mCnLb(%e6#^nT13lTykatcxk9L&f{r}#kR0Y3iYwp_Q&V2@hkQNQzqV-gIl-ae zjd=C1D_V1IU?_M~K#6h{sX=-9aklryq8r%_x~6AWJ+|su{8Qglb!Pw3j~;t+|9ITyIw7 zMd6=>J+lgXraGpuuqZJf|8~c7`r!0a!WCZVyVRkcl{r-L z7bzxB^Gc@={DKS@HTLy%yAhqOV2enCYB$2pH^Oj)&4_kR@b+ng3AvD#u15!HJ*y)# zQE78Tv$884>;-N#zWRmNF8Dixj%tA1tbFIS^IwC_1Kn5Cv27IHfp9r}laZJBqo5c5 zsU{<5GfnR%r-#gy;UV3F2M!!xHFQKT9-FA;{4+K-@qGll4ka{wnEMv8gk4V%JT1)$ zM;ih;;oujdOc3%nY@1&3lALg4?$BXy!p(7%>V%uAN5e`a_k^lP59wDNTU}G9zyH|7 zL)thK^Wi-fAv=;bf`u&}_x^X4V6RvVD_^pbcnqOC5$ z_;@z@vWoSUjaZj@mp&Py(op}XCHfM3Nr|x@tD_r|j{Q`b@Z)d@7$wa*GJygXEZa z1g^*@b(b8!=1HXyEcX8UeAY+zend8mf~lwYiT#D!&L{JkV9lyfh|}|#XhTsKX4-g$ zbf)9qh&AXo9slc4`l!anXq8S43^vmrK(7~7dLbT0J`?}MLn_^#Nz%=Zad)F?&9|QH z>t$$2POCWwnm~gfBVH=+%K0h!K!|7f)zq7p=RS>G9A$tk3??VB*gF>)G6spt_tM8Pw zcdFch&&lq#l+}}s7k`)Vj^usWkw(8;r6^Kl+;+deq&{5PQdZ)22P4Ros44b%?3G*k zIsmB)xKX3CrMkK$5_CK0z>;u%iQn(&HT^oBaXMn`o0Q)AuD-k}9CxbjP0}uyjT*Zv&>LZO? z85;dv4JSMzkPKvp&l?DEN|2J|&7ij=BQL5sb*6|m2xo9AKsMltcA-7qSXWa5isPTn zo~037%Hy;Kjg#*wT7$mXDvd#NS@oR#GOy56R22-@1-xFH&5OLLl5lOnjECH-R|?27Ji4XE9JM$UQpolgu|ZXtGcwheR1*^de18^l;2i$8}bLN zgSX2g3<}>$6y?LiC)yK$-J>FcaVs+z0xh zay#5M=vA%*E)TuR;SAYqgp$iM&8q2eNhaG2c}}7*e)1E5vG;i?Z8(8KmQ4+{)fHvo zl0cDn&^Ks7m^Z1R@T{i{bqUF6AR`*xY1wFLv_?l5s&dI08N{C0c`}Xa#APa}oq0R@ zyUH5SzSm~=nU;&Mf*I#4M7$+>C~6(p3ULY&r{QE{Io~&@l{2vUmu3wjJHF&>J0O=N~|L zbmFjs(3IrYk~&pyA^M;GxxVjUs9l3u@Zr}lyujdE-e!Ig*4F9*w z9W0Vy-G?Mf(5FRS$m3xzTOfHf>2o?lh=dXFJVE$TK1DnyR|qAFv*0;_rU@jE<}D{Q z)rEMjxk7Fs_k+bL_L9uhL&3+qs)_e_YFZe8HV3<(WgSxP-F+dGl8J>@(@(@-P)jZF z#vgF6AL3pG0y-=D^La@`?UqS@jc`@+mIXoqzomZKE#>sYNNM7Os)@JB`f-$+&G5`T zhyiqo@igms{;?Uu`Hu3ZDFgYn3AhiLViaCx$JkGR3_+9#CNWiy7{?CHr2%z=Lem&j zra?C(>PICYy99iRR!7vl+wHQ!vj_Y}5i2r+g(B(87nlv=Ago(x)CR+{s?Ms?GM_)N zqhd*IH9kjt1pzTf>2meFTvSz681T0*s$5t`A4`gC`-@6oOa3q9TvET%ZegYHFRDY? zQtJ_|(n1VE?Dr*-zac-SA8Zax(W{H9YjbXAGn&z4;D6xYwZ==8& zBV_{Rv{4|#+(B@RuB3FEd5J7kO+4ilh7;l59`s0A+Ox8EWumjAt*N0p8bP0#6rH+R zcg|dNqRwM#O3cX`r~=OhNINp?GFoJ9tM9HaFZ23>JEDCxRqa(34dMF5mN`1B?nb(j zx10TIAQTGV^?QF=xi9Ex>8e~*MjvBQ*GamqB9-Y;kAF0+1iKlma7RYh&Z)D*a37EPC>J1c!@UyeX3`CA5Wf%wm#!$ zaB6BFM{+0GwG%Pm%d>vZpRLu{)Mxk04;nx$#^4E zHVE&qC)v}e4Ryu;&=!r#14v3O4O8iRDy_v=awBV`EjnW*s|#5r3}4Xc8}V7#X`#wE z-PlrTr}d~?YM8$EIh^htOFL<&_0a|#sC|d;ry09v@|(6LN&0Y^`DKl#)(Q_NEUVG~ zX&CjyfGkys(=6ngb5U*qEqRRl>r-HTMLent+U}Bp&-qA!{ z)si|DS%2eaa_(>DxR!woAdPiv)FyC*S?&46qTHQ(QsIFBX4%dhL1$M5cSGSbWt`}~Kb}Tu&(oR}T zxT>`@Wdd4bnkU=}}6{<*S#?RKKSF$hC{Uej(mdpIPNY zi^w4W3f#uN#;z9s4cbGa8VZ<-n3fUVcP?Z-kFOcg4+;*G+m_vP2$zW~Kf@)dx9j94 zc1XBcG*E9>even!)shkSDCHezefViJbPzvHwt z4GLL-BHAm5aQ{+%{|LXkA2-9z=>d$AzmRlW^^THu$8-d; z@)}i{#cS&7xMp0uYBDO>PXBo_G(S-u+<*N}@v0kcz_4(QgSf`-Gr9&sJIcWwSMN(+ zLsWve#w+|9e;ZHWiUGRnA9h|kraZsvk}wpn{b0+Q8^&WhhiRx=B2+d;#&` zg5|h}s4NrLO%9hzqC9Yf06ko6)-n5{r*y}4U_IZmj49vAm z{Nm)eE$e+`ek+f?o zWo$^ib<-xydp~%u6E=6YFhI{(4b8ZTX#{v_Xw4IbiwnrPCVezVVyVcPj4F^2cI7^)PCB|^IwjRTr)4Zyz zTf=3Y)(#y3vs@hz37r2?rCyJh^22>&m$JrvW0&wHi23ZswN^`eKo4y#VfoM`l1owT z&6!+@Tv8(1`@ph04oQ1{|9j30lUeMQ$!En|P?JBMCVb8SjY4A?reVYW0x6&=!%d>@ zyqSMcX#&mL9!SzeLguaJpZmBxbWTqzdu3IqZ)xK^eqZI#WYJ_PYFk;7W9PR#natJF z6L`hil+1lU5(q{j!9WCqR8~(4lPgd|>;KgHYFV_X1+P}Bf{XPuDUchSUX4C?zR&M= zW77uxl?{`*lZnZ1o<5)INhWO=x$^vvzVa2EziYB=awU*+cA<%LNTr1*9zgs+1ff*c zRBAB*9X!1dhuUn;00A=SG3%36NpW2&-E9adyZZAB+8RR(oc_+r#cgjU+*vN~aEs(B zEeJKzm{;MR4WL|(P|fcdg4UNV{x%`OQ>4xw*;ZiRa#)T|6MpJr!Hswky_idRy=_sf zez`m5bI*ITwJMPCxuOBPXEl5R*Rx!-R^NU4bfNV-alLp8%iXvU=f5!dtI1!B1315k zkI_jBHRU8r=W{*WaT71F$G0neh2pM>Th!;`n7n!NR`B}iov%1pY*2Z5w60c%cVvWm&9jWi$z;`e5?{=oXyHvbNEa%_t zN`1E-$NeY&ZuczTouB&dfOvqt&5zrY`tE*l9eV`(i)`4N`fgnOB6}0EUN-DY`)-;Z zhj~0dS;oExo|6rirH*?D-`xP7kPVk7zf1BqOqNSQ6zFbJ8FaU&`I@UtoW9<6+B%z5 zmR#b=cfQ6B;l8EPQ@C$Y;^g|;thyRqRn-K+`*EoPy4n-q3$;J;oO*XkN0Ta2IvUR1 zeOl+z8YkT>c`kG_ocjttS0*noshYSo-qKR4XVKLeu9T^h(Ir)#OtImbx8s@yqRUBj zD_kaBucB)t^{Vu1kmR3Jry_#Tyfl3Z*GTG9rBV?3)DzIBxJ8*MOh#wdrRYgz=uw+S zE4Usd1*hpzpF)rN9p^cq9U%l@8%owH6z#n!k?GCe94C(xUjs}{^>dc#|KYh9& zPWn@PK^NRv0eY!&q)aM>{`3s=r*rxq`5&msc=~#iR648PB(-C_cbx`*Yx863fO{B_KNWlfm zRTiYZayQ1-Bb}gqB;h})&Lu(LdV1a+W73IV{DSk&WC3)xpGm#Yx7t;j+PUJh2g?jx zi({Ha?ol8$EB(7^8djQi_3M(*Io++|Ris@tC1`w8y49&<uCdeRse3DfFM;;k(;X-;GP9(0`u6 zcekf~*N*S*!gqJ5-(d+p2fgbt=u@Y*E#c539ovC@@3|e4SDeBZLZ`gm za=|>Y^`3jkL!#=FU&W^!pmrB3ORcPxpvPwnK+*N~%K1cakAf{*cq$zrlYq_U|PB zP4j~U#PP{%q_1G)HsS2PN6HYQEx~g&FH46pBXBU=;CXE)at={*Gv`h&VLL z25-ipIuQkp^N2P%*{F3P>uh>@mJ%WgaNdLNB#+Y8#w}y}FN+Rt*;o}RuiCgpGGBAe z^?e<_q9R{MAIWJ^`5zx6G^uH0y#KQOV~JCb@rT%-{lYiZ-J}GxKrmk1hX@Dy`RS?k z6KqCdJCITm4{%fUFqP(E?O5ITNe@m`%y}G&O-p)U0rb)+uCJGtBd5Zhi=Yl#vA7)e z9DlA~b(EOk%gfmObHvQ&@%5@K-~3fo&8|R2+KiiXtga=fpy#bfdpaU`^AL2)A3*<# zFj=izQ3jwFAkVUqU`UuVuXQZ~t0e1$9q5>1FpeU^-)x|{N5F42$vWAo^S~`9KaCW< zrsQcvQ&1Y^HMQH)=_0=?)pwtM(?r|ppU4}b4pSpkt<}pgs9NOnGJ*O|7Z!LUzDQ=> zZmP^WmyVdpQ@<^Wc=F(BYpE$NRX>a^-Ml_p8mU^pSt@h-oW%tNH7zc$(_iebX}J$e z0&YVr36cD^LOW_eqy4GCvn}DS>IZ941cr%Nv$S$4)+$}dO%}6`O7p5kpk%B;@&jY5 zCX3^#3(?QxEO>J-S+Yd@?1mf0RKtVcWAZ<>d!W7&N|(|-RIdk~D?M20Anutgtj0sT zlG>Jlz^+zFUl60aS`JgI^UR)&bxvI$gSmKFBhO4GR{mKflhokIw-=+^aSPrHJb5)ON0Pkdm8_G0$8~mx&_-}jbp4~P zR-#P@eF_FoT+E3E&kKFa7lp5#zJVmCb1^_%2_Os=44Ipi!NDbh~=Nm)=AC4NgJ1qG@8?m#CO_th%wxdN8&Cu(;s&dGef&+#*{c zw40nj$&4+)klF)M)3`TiwDz1GDzzHzed)8gupIsB=NI{NycYM4OuClhxgNrEbqf*U zhJ@8=hn7SYxH!(T5VOSY1+1DuPZ&$peG1etW=OrFlF1jFP@c)4Tjont@`KT;WBk-d z1JUZqX9Doog??Xt#8V3FrUln^GdC4*f`bdK3X-r@>J6!S!;=CzIq7%G>Pua|r47-t zI{tolSKlh1d%*2m)z>B6>~#7JhRS;F?drC;3;*J6Do@!Yt5Cyv+Dw>>OnFJdks&pm zb}F^#8}|myAuXq*^V8eEus124IUj3oA(A(s_50fWc08`$PDR)SG;)peyD}uWOuwx! zQJitiEF(h=%GtM$DN%mw1qaVlYPH2qi%c7wI<^lnwoF-W0|Wg3E6cwdvA7nlE3bEX zm9^Tqca)hexr-v9LVNzkjPc*j`M6LRO!QCjaRHDrQgRmrf|0irR+6r=PLd&1ky=H4W(*?)v(Xs_c_ZOML!p8U;3*&i|QLL_KRWEw#0(f;nv)&~- zM4dOFwu<5kb$zdOe(YR**Q35PrAysAnjO9(mbhX}Hr+w`^1iAIE~u)SAp#W&7!jC) z>q)m2pY!L~<)cPVjQ$yy(M~EpN1p#0m@atdh7B1bhmDLx;AE(LiFXg3dLDJ*Z4B&Z zq4}y6Y;_Tc+MI*)YJBSQ()@F9ux)lUDkq(K-X8f*C&e=ij)(HA4PkQ_;v{PiZL>zH z1Wc?!_yxY@2=U6P;XQE55bbWc=AF)TIm;=1tP-j%2&aj`mU$ABC1ZX$>78wIQWPTY zk@vi%exQT_?|-TX1dtkK;+39L!=VaEd1wART_k7XyCdZoSz#2>&B7RQY-bLPA=RBW z7haB!XSntScX(P>4c+@vWE7n}Lj5ihhk=%!kK5eU9Y;8|^&Iyz+BxbizG~vG&0@rZ zPvyjdMRl{rHch=jG~RIPvKzALi`v)=#>MEn)Wmm(sI`3jOI-|O7k)mfVS!(+sd>Dj;~r9RHp8Y-Db8cqGAeMV zlIF3EX()aTJH~MF8-_EC+2S3BGmQW&qj|E73HbW1;T$6>f531q;J-1PCx)3r8TJ^J zR-J~S_(*Fp!vg1Ce4SzJg|ePv*fa{Qe>QZs^!0VjDWB8b)z{xUFsHwxyQ`tIyRWTv z5UIYmdqG=QdD{&GEuDSkogMR9`UiU3`lhxh#@Q{s<#UY&qub~)mKwe2gXiJ0lYXNd z4LVFuIX0!Y8*QLWfZK1>gR2F6T}B^hmm_8uo^oRf=-tMA@XVq3b;bbvcF=l>b0o>_ zM>>5taQ$QWp9d+5W5Aegj6tk!Vu5o3idmW04Vo zR@Hdoc&cz*Yyz4lV2d;5>3^$T2id#@DfLr%wL;5<(4*H_09rS6I&*pUL6=@U-FV)c z|0$G%PUNBo|K-Lcd`IgOzFDXw7^2DjdjAEO?E4X z#=5nXgQn80Gp>N&g0#oNKixWg$c<{vJqTB2s_JJaeAOD~p_NUBgo*#hSPi6CAIY49 zv{lPhy@9G}1Hk%`mZB)WZqT(o-;Yc6C*7zO+MaF34Uo}-n5uVCr81B5sOni8Xj6f? z5@!Qer88H}-{|k%HZ*k}6EsD;&d=cwH-3U48C$0Ds|(CYM5gf!=2qGGg+{K(LqF~@ zzJr4?d;;sY#uj6>2pA)b3gaE)U87axivqlh{ROAU6r$<2iL*qJu@65y42qB_5v9g{ zQ6`2OKNaQTY%xrnBZi|9j}jw{lcEB@1RaSn1@||L^U*+_6*z;#IAFXbE--#B#t7VZ zE+RO$0bP`c86OjI9CA`As*G3AT}4E-s1akug~(#mI4CYMejzRvEimmA+TwxY}X8#c+DMaEx6r||=^P;`lI(Iaj!E*8DUYobr|ivh7nEEY?|QgNgBl+kE(h?~Tx#WHcT zST1hC4&epjR&ks7jJREV*60)~jrrnpVwLzjs?0)T19oRLp>m!QhS4p)Anr6SF_TGsrZ4|WqeBfQ0x{z5_`mtjhncv3tio)*uD zec~r#zxb(m*7%0_nel1kd+0RY#1MLwI3Rv54jNaBUl@Nf-WJb^UmBki&l}f>Ux^pQ zuf-wUg0xKhM!aY&H*OKX6)%b3iI>Iijhn?`@dxpW_@j7L{7Jkf{w$7&zlhhxU$Kd8 zhIm8#O}r`oZhX?X)_6l4HFk=Bh-2cP;<)&iah*6}{8{{4oD~1TFW>$v-WKnOQ{r8G zAjVe+tSDI0#t9U-f*q@0*)j*eP|lMc>BXsVei@MYvOo@zh1kPhgnLMXGKAYwN@bZG zD$C{Ba+o{^r*@6N{OnvgQl2MA$@ArCc>!i@AH#0#h>XgZjLU?qlvT1?*2uB)Lj1z* zVmS_1mDU>f8u!UMSuY!8qimAR@)9{7_iIj&m&u9paydy(mQ&;vaw_h-oF=c5SIcYU zbomK6Lw-_TE3cE+<36ETvPI68b7ZS*lXK-f+$7Z@=gS4MQ!bQUvRn4Z8)UESll^i) zE|QDo61h~~C_g1{lAo5#mfS2Kln=>o%ZKH6 z%&ac|iVL9+bb3&&glP=jE^D3-Z_Uko=8&QT|rGB!4GgmcN&W&*tU(QGoC%}dPj=B4HY^D>&p55avHXW^}*7;ly#qr{wO zUT#h@C!15uE6l0pmF6__D)Vad8gsh&33G<|N%LCsI`evSra8-OF=v}|%vQ6_oNLZA z+szJhzPZ5cG#8p(X1Cd6-eC5ceK^-~z+7Z5HkX)7%^S^6nKzlAHkX+Z~Q~x&J6TfK; zGd3De7@sxr%rBYum|r&6m|wwJc5BVAVjJVf&2{G2%=PBIcpJ$zuE%eu#~HQeedgEA z4dyq@jpjGaP3HaP1Ln8P&E|vVL*};)pZTz{&3FXs`1Qt<##6?l#$(2IfS{GIu- z`Fr!Q`3LhA^N;4M=AX>h%s-n)%)gkgn}0RmF#l%0Y5v_jYW~AKX8zMWZvM+WVgB1Z zY5vE2%lxnTw)u{E%6u0usscZwM#Drjj$@LbFGoqdDbZF zd~39Ifi=eZm=(4nR@91FaVud}T2)pxUQEYY7g`tLV$yNe$E{kc&Z@T>tVXNJYPK%1 z##@(K6RgXuiPq)TBx|xY#k#_piq*Ei8%K>Dm{@$#I2$X=UpDSBzGQsM*o5guopHBy zr8UjE%DNg$Fzc=9#yaDx#{I@x>l4-t>yy^C)^*nP)=V6knQ1(2wOF&QIaaIHX3e$c zS?yMbHQ!obby^FpF00$>v2L(>tv;*Y8n6~wi>)QrQtL+RQ`Sw^r>$ky&DL`37Hfrd zt96_88S8fIv(`%MbJi;B^VS{K7pyz2FIuauyR5sdFIo3kU$)j*U$NF&U$xd*U$fR* z_geQ^U$-_`->^1X-?TPa_gfEG-?BDa4_Xgd-?kpMzGH2%zH4o@zGrQ-9A6t8^C#)x}r>v)~XRLkJPptjcPpxOIpIHa2pIZm5 zUs%sszqFpWer3I2{n|QY{l-W}S>krl|)*r1`tv^|>S%0>USbwoz zxBhCqVg1c`+;EYhPzyZ_l)6*)8^Ldyd^|x7l;;d3L+qVb8Z0*q!!5yUXsjd+ZzRUc1lkw+HM+ z_F{X9z0|(Z{*--_{b_rdeY3sXzQtZ)-)i4xf5yJu{;a*y{+zwa{=9vM{RR6@`-}E! z`!4%#`%Csc_LuE7_E+q+_E+t7_Sfw7_PzFf_SfwV_BZT}_BZWK_Wkw)_P6ZK_Jj6A z_P6ba?eExI?C;uJ?eE#!>__ZJ?Z@ox_V?`__T%+e`-k>!`$zU3`^WZP`w9C= z`ziZr`x$$m{S$k?{Zso{`)Bq6`{(vS`xo|e_Al+{?O)k1*uS<9*}uU`V3x7cxZU`? zvC6o^xYd5q{w;odaKu<)zhvySe`mjJ|K2`q|G|F6{-gb>{U`f1`_J|f`!DwE_FwHc z?7!J>+JCo?+W)YR+5fbU+yAmp*#EXq+W)cNvj1zpZNFomvfst8UxXta6HA}A7N}V!is8jBo?F@6yafUl1 zoC@b$XQXqUGs-#N8SPx)jB!5Zgq?^Jbz)B3NjQ~Gl~e81IAfg)or|1{opH{`om!{P zsdpNjMyJVXb}n(oJC`~WoXebv&gIS|EXPi9u5hM0S31+2tDLKyYnzwPIna(Vy#hLBQaax@=XRb5PX?HrD`OX5T(^=?rIo(c=bA!|C^f~>`fV0S1>@0DX zIyX9>a&B@y?JRR{c9uK0I4hi6o!gwxIJY~Wbyhl`b5=Q@ckXb$;N0na(OK=><=pLj z$+^e*va`ndinG@Fs&S|B5?;u@VEo=VWcqW~pYwHR zgYyk%qw`H?lXJiGfb%V9v-6YB7)U&(%${V4l!<%c5;jT)~b9Pt_$ z=XiD1jMuTxa_XWPbqibO^mcb;)OFA6?rK|*QPS z_qWWM)7I7RG|p)OH@x2NmVT#+bak4Ds72Sa$_<=!11HtMDmTQlo08%<3Tszim(j%9 zG_f|6yBaswl&f&0IqqCSDdt>~Qc{TuN21Z}OOn#9@mSK!8K2^DE={v-1KXmZI^$AK z^-`Uxb7_A^XKP!|gj7r|Jyz*VB%Rqm| zWX>8{r>QPyavxSo+qI@s*-KM6QR!Ss)SN3%%X~D#3fE9l;Yf9}H4XN4rlm!%B(=iP zNS$+4TArIYZ%vi>SX_N66C1Wz($=A|?Ub}mz1buN`htdbDt3V4x9rzOo~bS*!|JnI_4OHTtVUa^$wMS%BOFZ-ADVo^nMWz+%u8vf zEf9@m&r3?T+EtTpPw_Y%Nu!1%jp3}0F`eCWI;Ty&OzY9WW@)I&=wLlMxD)80dPQkO zV^ulxQ!;hBv8vn!^LpFbx;k6BT07=Aon$>7R#WeECJlrhqQUBficXg{a92xDH@;GI z_q4Y;U1@CbO0x|Wx;tHCx1F;|8`*A+Y}!UH_D0wAT>K5qc6X|!HF7SS+*r)j$OYFF z$?G1}(z@9ey4R@B=}zl4dMOi5Z<^wXDyL6pt?x7|MI$wKXLr{;Ozl-)(VrHnl9WMT zQSS_-=a`2y-9Mtts8@i`oxj^ZHgV3Is_cPOPMg?1&1|nGH|Lz=rslkXK{*|8bIN_n z0QD&Yx=&fGGqpICsjS7xK4r1)Q>HD{);q7Q zcOh!g?9RS1b6Pt4oley+L~?YMVwg-vFn1megk-6j#Vk}x1Up2EW+|&HLNrI4o?son zGL}M62!uHElo!(s%?Uzs=27V|oYW%bOKXW~v7#h4=1sLp3UuZxFHVxtoCxuywJ9R# zd?(WK4LF%%B0b-UWWK?Y%y+_Bs039yi=!ILaX=1uFQ7bue3Nt3eG z{`AI9!OmRe)i}z)k#LS~7Yw^fN5Wd^gc1@7J4=-p$yrJ@fM8!*1tNlHsawSeRq-QD zR2C|tt7Ig?0VJ3ZRmak!)DYqfC@-2bkW3P=TcVMuZy;5FiP1BVo_tiN(xj?_5|T{b z4WQ(s+0+Dyha*tp%+wr74^cHO;zn;wN16!<3~Hbpu3IT1x~US9P3@Jy9NlOMrlN^d z<>(R`)7KXbgQPs_pW_kNr*0w~kLYc+!vJUwBEM|2~P z>p2qm^{^F>=*}x1)}2>8LfsLk(zWqBO;VJk}@d%IEZ>tY4J%3cGx+-fn)~bXeao%MWvUVNNH^a-yz&oL-pquW@~r zkM|EX#KiS`PB>oA<)YtrfHNNt25}w);(EFpj_ZjfeAY)#DZ}w*-OlJ4` z;;dJk^@+1S30FR+A7}mItQXJN;t5x8H@|K=tZ#zlCpf(Xr;}hgaaTW1FX2`l*RITm ziL9rs-kdx;t9L1PqFk` zlNeN=Xf)O1M?9YDlu;|v>r-6UC%dk*r@h6hZ|iTdFKJo0u!S-dtBGec_4IXM_GHaK zklBRbY3+clOYt^tU)Ivo(}LI0g|k~*sQ`$Ss20T;xI&?C1HQAJYe|J}RUoNLeNG4JwAWJ2v!&$yYSSBIalNYvO zHw_6kBrg}qYSW7dSH+_c!1j7Dj!)& zuFi~tT;=`ghz@2Egm@Wo*$Ym?bqrRCkZej#gOqX2!kHx`6PYDI>#ryJ;h3KI!>`Py z?33}b$zlL8Q_$uh*cpga)?o565NS-rs!ux!GumQp%YB#1QR;JN}b6{oykg_UZqa2Qm0p`)2r0! zRqFIAb$XRLy-J;4WqsC-ZN1%Nl#|)NxLXxQb!K135(2WiI=b2j%5LkJ*RCe)k(#Wz z9g7rEPXMCfYHfgUHT7!1sTYJ#y&imR_;5A#V!*ZK!`0NA0jFLSevMY8wX1t!Cf51J z5TJBYKz4sSUStW(n%h0l%aBrq_>{`T*N2tKE)8m(6;)@1Aj)pnz`|Zig8-F=0yqr? z>NGT@(jY#S2Jz`M2-Im1BNbiD}j(N&^X$Cr+Js zReIu8I&oG@jYN?eZ_4uNxGR%0RHd0YrkcJ-!yc+!tfz}|yePe>z_6N?hwxp6vLgizMe}&!;#9Ywk31WGvQ5Fhr}8^sEv4o#WG4;OKTe! zub#|A!?EVIW4p+8!s zD^IklQg?7wRl0FiRnin98q>2`_%wxyRyF8s#PsYKbed9tt}7J|oTbdv=*AWf>oquJ zH=K9F0J5gm^Lw$wRA*Vw@sYQ9pnWNpfVyUCZ;aZGT0Dr99x`%p$ZWiB!W`%~W~M+A z5gg2jC8`#vKtWy(Qi}pAwS30Yc|wC}GtBMA)DOIp)IcOQPQQjT%x^$|#YR=Rik%|YA(nHP~9Fk0-fay03wDqaI%_PRpMB2_w z6d$#gnYzuW5-v<5ydOCgJzsMVN+dLxHn=|Mu#|v+CZyLHuO=mPQqGZbXcSF^NZxV41>7|jMB$C1;pfE{u0U{4| zv6=4yC_E)9mFCcvKD5k^z6CSi15lhHNpiYD^OID)>_y#1s?N>qY3Ws+DYvcSw2)-= zC+VTnLb$5yl+(h}vYtjwD}tglvYUC55=;w7ffO_%h0i=ANL=AF27N$;A!!j(c23u0 zpbLXc-<4X*SF!LnjM~B9;uM4G#3_z?24sX@s;&7trMN(&eZWKnZcw zGy(4=r??9=-)!_;X~ZNtGes;*%PxAunJJXy2UGazL51l}h?udm7O5#oC#PkS0%_>0 z(#tc^DxM!y>17+>`aPjauhs*v%4+Gtz}eZ>!7syAO-|G0XvD3a8BJ3sUvp{WwDDI? zsnZ|7FyMw|!&DmUo0|0)9SdB>R4>;=qm{JW5sl(&v6?XAyN31?S}F$nEd2IlUhe=zGKZeJ$LjPf zBC3^z1dgHC@*qjiE|8>-rx$>tQT?Gf8pWp!7-C^kF3(D$O?vhc4QoGK)sTY<*RiOj zv#o1Ro0b*VGoEOyCZ}yl2YQ>X{*IQ;OswMK9o1D7zYV1<@uaIpujoXp^kQ2yravLV z*IAF%>FG`s-^^6Jm|nz#ujRz*^mHm(MRW3Kv`H69R4=Z=lzRFUtz^U0vq`IUM(V=a zaCKpAm^!`K7>(AuMZj|P=SA3!_2GA&Xf+oN7j%>hKB`x+qS0_ewys<$n^v-&cm^2d z8DUg^&xXouYo0kqo1$3|(Kj%=uZ>H)I+5A7u%~}12-%(8^E&Vu2Oo5@80_xN?NGDU zzBc-0k`23I%LQ4Tmr}#^ZZ+V^W{u8mtVXLAtI<}A)$k;>j;ojc9N*l;s)noBs!5-% zrq>svQN4bLid~u8+opDR=v;VQ1ak^EQ#BDi!Hw~RHm0|gprpA3^%e@?taF{q&sCXg zMpUoyp{iGB^mQ!kKugnkui=`9r7p6CTXQ&%QJuGFl=B*`=9*N)HB2whN27XK8BI&4 zAFYh#_Tcj>a*|d;RrQ&D19RH@+go&zMdD$P%axYtsNO?^L|M6TJPT`0Fb~EIt!BJF z3+k#leT#mLiRvv3h{J`b7agG(8;T1t%7q%O;VNHK=~16w(7Xpa`#X9%m$F@IvNgG< zbD%GyrMI_x@jwp+MQWjc_X zXFqlTwYJ&hX0$HQzG{JqhGs|CJe^hUx)XYHQZ%7g9npudG7Y+ON$^mRXlTktv+J5Y z(AmiyV}jdcLT?U13e{NSLU8Ns?j<@AZuJSSFA45l5?sCsF5d*t5)wRnNMN>rH?Ed> z+%yvSXhb;I>xABU7ESP)P(ptZ0IutM0^3xGzqeoeopZH5+;|iG+MnR@Bf;ZTg6nfa z?`VTOE+M@Z1zh)12_Bykm252T1#yXjPKOsa6P3EXBzSoup}(BqI0@a$C3xzQ&>JSA ziAvq`Cn`Bz{Ut>mKcVI7FH_Nk{-_yE=#PTY1Wyzaya18VUxpCQ`bIcC{jm`IY$yE@ zGK!xoYx$L~{%-nuJWlXrBN1nLRa~?67cuC=`st65kk9GyT3n(^53&hfW=ZfeOM*wT z1kVQ&`lBNT6}FrHA_n=KUX`04)>nVbh5j6_KXxMDtPihJC8C^Pp7JGPF3$OjaSP-5 zQG%z437#AzcoLD|NkoDt3kjZIC3rrR;K@ZI&W%TZ=|X;3-zd}dM{3xKah?|?cx^LL z<-`QmcaAFW|O#`VYAD82@0e(p~b`lB`M$ny0^ zUhpx_^T&k#A__W}56`<2`b#6~FYBwnXrkV_d|a=20-Vqvv7r~+U4JA8>ndlSs$4 zo6E=Y^ha~>bG|E?PcH`|UDku=qY0itC3uFE&|geZPneI_7}w(%mrqQ8p^e7aJ~3|3F}7oj^@wpjjIq69oKB4Ojp;9=kfZB&jO`iY ze8spwiE+Kdoi0?aF|KzpuFo;s5^VF&t&V`e-}GxShqg{=~T7jB$I3as7yKeTs4Wk8%GL<8~Qymvgxt z#<;%3xZjI$|BJ&Jboy?2alMFfJBx9Bk8wMXarwu%-o?0Ij&b{sas7^QdyjFy9^-lu zOXzwN? z?DWw)e-9Rkncyt!=)%5k2d^OAU9FVk2uqBpb$Ki+F2q7{YtHPp&Q6X)TygFvW7YL} zb6W6f>4px$CMPxiwoPrrDGFWbabn!(#<3ag|)pU`gdD^=0Uf#Qu(Y&_w z3>RQB)OKYX7VYqr*Ug?6?-~o6+uB+=%8+@z-2*+RbA_<&vExSArloUQ3#MExYGIgT z=o(#JW4Ct?^y$|Y>p!vR)=NA%8!Xhd(aiN<(*h&42MJMqafO|M{= z`sR-}p}P0fKTlWNV#Uq+DkZe zZR^1XNm?24^tE@)?Z4E`y_e9*18%|P_N6t1A$|QVz5SEtj>q>V>>p>P0!&RSZohha z?C*uNk}i@sieBOWiZeUtnPReq_QpuFKq|)uML{|n57M&JA(8a7N+8*H-bPKxkc|m zI4g~mE+LpkPl2SwuoRw_<3ah*>FXW#X`SMbv;rkj^o=Z(MonW*eLt(@H;hXCW)tQ& z6!<)8&|gTxQQkJqUub~S8*!L7w!p8-qK*7>x);vQqTdB5NKIo9R-dE&hB5dh3e#u> z1YtB+gHJO@_;p$ILz%SL@x1o#?gcHgyBA@0l$1#;GT|6+vyVmUbFt+IFB;v8Q%t;v zou{SY81H3|@g8=5jSll`7yN3iXtYu(s&*kkA?$j>P9a9{+XNt3W{JGa0*FJT>UBsA^vn@rSV2} zDmu3?LrO|iXPraRjS|HMbBNKOCPm(Xnf$p<23^G`^WO6fnMB0jIK zkWNQStcaCIGY4&#QDe*^R&)_tza@u=QqGaw#yW9FcNJl&UmymU2CJcaufwfIOt27B#ayJFN~XTqJc0zhhNPL{CfTv+~daEa8Kb} zFd+(Y_LmT6AYZf8%sXfis)b+0PbEZ5KGPDI0FC%!TWfKDhZZ2)9g@!7Z1= z;a13V;f|5GMG9vzRl=>7HE=JK&=99ET@1HYHp3l{>yQP`U78H{3V9{mt0eA=RHrS$ z#c4}$XW~>#AzNe%+&Qup?p!$+ZinoG+am|yE|p8+eoB4{E>2j2dyBjU?yd4xxSx}s zgZp{;dAN7tt~!A;mA(phy<87>tK16rSqaPFq?#w-K4U%u_h;tM4WUlLfcudB5ZtG1 zSQ4jB9EAH<`>$~SX8#RWapM#SL*f*Ln++2uAZ&vBi1P$ooI8LrQV03s*mFGUR^nRV zImr_hzK}fi0B0Vc>`h3)1*aIdzW#zEnGoOZx>;$Pr=p+zdxKv{?*#%q8BxO)SKfa9zpSz1<#8kMvF z+6q|$7A+0nDZ*36cDotbQPwXayM^D!nmHvWN?tE{yW}XI6Zn6-RF-CzdXUEZmx_f_ z!4bPS8)FfUF;`{d!3h*k;PfTjT3Yh#Y0uNA;i>QoN;cvDp^~j7+e>!Q|K5^)B?n5L zFL|-#aOuR7*Gk?fIaYGAv_$=voGP_SvrB!Yg}{cDj>P|%(s=3E(%RDI(ut*0>3@Fd z^wR4~TTAC7w;_~$KP|6YV%7?lzo;ca7MJe&bs4BKn7JoYW?b9%|h;;H0!>qnFxaAI>>jX!KM2 z8ld*I2q%`^V=ShY@+oR5H&ILZG_{mv)KYH7!H-7C9sJ;~!xEhHOE~mS(%tYg`FDd) zJ+x>y6M! z{2vRQ#Q9T3@L7I#!r#L1qiJ+E{Jp*i?lffaOM@O0xD~`%*CE`R5XwZ@3y}33KYQS# zJtc9M{{FrQc?QW>>8Ui_bW{4jSHD!)`^#6lNSqL<#%P1a=<8^VUQA>35*nj#r7`*t zjnS{u82wK*M&qncjM1V%jnO!F6JxZvNR81r!xCdO&V9rfjgucSMvKSP7>#ouF-D6$ zYK+DSj~Js7jxib>7^A^;T>J~?IAV+z&#N(7{8o+8;`eHd7KhasE&im&Xz`jFqs0-` zip5cNexmq?IzLhTQ;pQ(UuvWl|5hWlIH^WzaY~KUIH$1|EuO|`oY9Ce8mBa3jD|#v z(Kw+IV>C`^#2Ae;8Zk!WltzrvIH?h1G)`;87>)B9F-9X*jL|r)5o0vYX~Y$z~F-AiVjL|s35o0t?Zp0Xk83V>>oZW~qT7F!O(Xv*J(XvjB z(Xw8R(XvVPJn|AX=3-Vcq2wX-4%LKq?w4z?nHH7(qhSEZlv?AOD#GzzAV0&G8C3}^vO12NCl|+G8mq53o+mg`g4}?~w zhZb$2xNDNM^+{->3x!hhHoG*HF2_aR!y2GRVrY*GrSx<2fp}_!CY@6>1r;HG+L8)r5ri~QUlc6~aV-H&N!FoCGU|(>>H4Ce32rFY7tpi@ z#HVWsXdz`?lpC}>-q0SN8=Id$%G_?Sr^Bc z?b3>qp`o2gTDc1;8po(`X~m{I@zp6la8Swo@9me0 z@qTvZbg5oxT~HFNl}`7A>M1y=?W-6HDsDtg+yx1HlF)PSg-Ry4G!;YHPt{nLRy-*5 zba@{fqxkBilF;&ZVVdq->Rf&S

Zh7cd=34FaGWy`SDvi)66*nbC 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 RXt+-ctVzYaTEQjd{{RH8A$|Y= literal 0 HcmV?d00001 diff --git a/assets/fonts/JetBrainsMono-Regular.ttf b/assets/fonts/JetBrainsMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dff66cc50702c75abd025dcf49f62a4dcc2d72de GIT binary patch literal 273900 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 z

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Ν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�D)V2{4L?~3+ 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Lora-Regular.ttf b/assets/fonts/Lora-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ee1914c3746140523de2940d267ec2215bd85d5b GIT binary patch literal 212196 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 t3=+)GE@JF#YWy6c1d( initServiceLocator() async { + // — Repositories — + sl.registerLazySingleton( + () => AccountRepositoryImpl(), + ); + sl.registerLazySingleton( + () => TransactionRepositoryImpl(), + ); + sl.registerLazySingleton( + () => CategoryRepositoryImpl(), + ); + + // — Use Cases — + sl.registerFactory( + () => CalculateNetPosition(sl()), + ); + sl.registerFactory( + () => LogTransaction(sl(), sl()), + ); + sl.registerFactory( + () => SettleCreditBill(sl(), sl()), + ); +} diff --git a/lib/core/theme/app_colors.dart b/lib/core/theme/app_colors.dart new file mode 100644 index 0000000..61f907f --- /dev/null +++ b/lib/core/theme/app_colors.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +/// The Stationery color palette — ink on cream paper. +class AppColors { + AppColors._(); + + // — Backgrounds — + /// Cream paper background. + static const Color paper = Color(0xFFFFF8F0); + + /// Slightly darker cream for cards / elevated surfaces. + static const Color paperElevated = Color(0xFFF5EDE0); + + /// Warm grey for subtle separators. + static const Color divider = Color(0xFFD6CFC4); + + // — Ink / Text — + /// Deep ink blue — primary brand color. + static const Color inkBlue = Color(0xFF1B3A5C); + + /// Dark charcoal for body text. + static const Color inkDark = Color(0xFF2C2C2C); + + /// Muted grey for secondary text. + static const Color inkLight = Color(0xFF7A7570); + + // — Accents — + /// Stamp red — used for debts, liabilities, expenses. + static const Color stampRed = Color(0xFFC0392B); + + /// Faded stamp red for backgrounds. + static const Color stampRedLight = Color(0xFFFDECEA); + + /// Green ink — used for income, assets, positive values. + static const Color inkGreen = Color(0xFF27774E); + + /// Faded green for backgrounds. + static const Color inkGreenLight = Color(0xFFE8F5EE); + + // — Functional — + /// Settlement / transfer accent. + static const Color transferAmber = Color(0xFFD4A017); + + /// Error / invalid state. + static const Color error = Color(0xFFB71C1C); + + /// Disabled / inactive elements. + static const Color disabled = Color(0xFFBDB5AA); +} diff --git a/lib/core/theme/app_theme.dart b/lib/core/theme/app_theme.dart new file mode 100644 index 0000000..3b59732 --- /dev/null +++ b/lib/core/theme/app_theme.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; + +import 'app_colors.dart'; +import 'app_typography.dart'; + +/// Builds the full [ThemeData] for the Stationery aesthetic. +class AppTheme { + AppTheme._(); + + static ThemeData get light { + return ThemeData( + useMaterial3: true, + brightness: Brightness.light, + + // — Colors — + scaffoldBackgroundColor: AppColors.paper, + colorScheme: const ColorScheme.light( + primary: AppColors.inkBlue, + onPrimary: AppColors.paper, + secondary: AppColors.stampRed, + onSecondary: Colors.white, + surface: AppColors.paperElevated, + onSurface: AppColors.inkDark, + error: AppColors.error, + onError: Colors.white, + ), + + // — App Bar — + appBarTheme: const AppBarTheme( + backgroundColor: AppColors.paper, + foregroundColor: AppColors.inkBlue, + elevation: 0, + centerTitle: true, + titleTextStyle: AppTypography.titleLarge, + ), + + // — Bottom Navigation — + bottomNavigationBarTheme: const BottomNavigationBarThemeData( + backgroundColor: AppColors.paperElevated, + selectedItemColor: AppColors.inkBlue, + unselectedItemColor: AppColors.disabled, + type: BottomNavigationBarType.fixed, + elevation: 8, + selectedLabelStyle: AppTypography.label, + unselectedLabelStyle: AppTypography.label, + ), + + // — Cards — + cardTheme: CardThemeData( + color: AppColors.paperElevated, + elevation: 1, + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide(color: AppColors.divider, width: 0.5), + ), + ), + + // — FAB — + floatingActionButtonTheme: const FloatingActionButtonThemeData( + backgroundColor: AppColors.inkBlue, + foregroundColor: AppColors.paper, + elevation: 4, + ), + + // — Text — + textTheme: const TextTheme( + displayLarge: AppTypography.displayLarge, + displayMedium: AppTypography.displayMedium, + titleLarge: AppTypography.titleLarge, + titleMedium: AppTypography.titleMedium, + bodyLarge: AppTypography.bodyLarge, + bodyMedium: AppTypography.bodyMedium, + bodySmall: AppTypography.bodySmall, + labelSmall: AppTypography.label, + ), + + // — Divider — + dividerTheme: const DividerThemeData( + color: AppColors.divider, + thickness: 0.5, + space: 1, + ), + + // — Input — + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: AppColors.paper, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: const BorderSide(color: AppColors.divider), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: const BorderSide(color: AppColors.inkBlue, width: 1.5), + ), + labelStyle: AppTypography.bodyMedium, + hintStyle: AppTypography.bodyMedium.copyWith(color: AppColors.disabled), + ), + ); + } +} diff --git a/lib/core/theme/app_typography.dart b/lib/core/theme/app_typography.dart new file mode 100644 index 0000000..89b1fdb --- /dev/null +++ b/lib/core/theme/app_typography.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; + +import 'app_colors.dart'; + +/// Text styles for the Stationery aesthetic. +/// +/// - **Lora** (serif) for body, headers — evokes ink on paper. +/// - **JetBrainsMono** (monospace) for amounts — ledger numerals. +class AppTypography { + AppTypography._(); + + // — Font family names (must match pubspec.yaml declarations) — + static const String _serifFamily = 'Lora'; + static const String _monoFamily = 'JetBrainsMono'; + + // — Headers — + + static const TextStyle displayLarge = TextStyle( + fontFamily: _serifFamily, + fontSize: 32, + fontWeight: FontWeight.w700, + color: AppColors.inkBlue, + height: 1.3, + ); + + static const TextStyle displayMedium = TextStyle( + fontFamily: _serifFamily, + fontSize: 24, + fontWeight: FontWeight.w700, + color: AppColors.inkBlue, + height: 1.3, + ); + + static const TextStyle titleLarge = TextStyle( + fontFamily: _serifFamily, + fontSize: 20, + fontWeight: FontWeight.w700, + color: AppColors.inkDark, + height: 1.4, + ); + + static const TextStyle titleMedium = TextStyle( + fontFamily: _serifFamily, + fontSize: 16, + fontWeight: FontWeight.w600, + color: AppColors.inkDark, + height: 1.4, + ); + + // — Body — + + static const TextStyle bodyLarge = TextStyle( + fontFamily: _serifFamily, + fontSize: 16, + fontWeight: FontWeight.w400, + color: AppColors.inkDark, + height: 1.5, + ); + + static const TextStyle bodyMedium = TextStyle( + fontFamily: _serifFamily, + fontSize: 14, + fontWeight: FontWeight.w400, + color: AppColors.inkDark, + height: 1.5, + ); + + static const TextStyle bodySmall = TextStyle( + fontFamily: _serifFamily, + fontSize: 12, + fontWeight: FontWeight.w400, + color: AppColors.inkLight, + height: 1.4, + ); + + // — Monospace (amounts / numbers) — + + static const TextStyle amountLarge = TextStyle( + fontFamily: _monoFamily, + fontSize: 28, + fontWeight: FontWeight.w700, + color: AppColors.inkDark, + height: 1.2, + ); + + static const TextStyle amountMedium = TextStyle( + fontFamily: _monoFamily, + fontSize: 18, + fontWeight: FontWeight.w700, + color: AppColors.inkDark, + height: 1.3, + ); + + static const TextStyle amountSmall = TextStyle( + fontFamily: _monoFamily, + fontSize: 14, + fontWeight: FontWeight.w400, + color: AppColors.inkDark, + height: 1.3, + ); + + // — Labels / Captions — + + static const TextStyle label = TextStyle( + fontFamily: _serifFamily, + fontSize: 11, + fontWeight: FontWeight.w600, + color: AppColors.inkLight, + letterSpacing: 1.2, + height: 1.4, + ); +} diff --git a/lib/core/utils/currency_formatter.dart b/lib/core/utils/currency_formatter.dart new file mode 100644 index 0000000..372397f --- /dev/null +++ b/lib/core/utils/currency_formatter.dart @@ -0,0 +1,49 @@ +import 'package:intl/intl.dart'; + +/// Utilities for formatting monetary amounts. +class CurrencyFormatter { + CurrencyFormatter._(); + + /// Formats [cents] as a currency string. + /// + /// Example: `formatCents(1500000)` → `"Rp 1.500.000"` for IDR. + static String formatCents(int cents, {String currency = 'IDR'}) { + final format = NumberFormat.currency( + locale: _locale(currency), + symbol: _symbol(currency), + decimalDigits: currency == 'IDR' ? 0 : 2, + ); + // IDR uses whole units (no cents subdivision in practice). + final value = currency == 'IDR' ? cents.toDouble() : cents / 100.0; + return format.format(value); + } + + /// Formats [cents] without the currency symbol (just the number). + static String formatCentsPlain(int cents, {String currency = 'IDR'}) { + final format = NumberFormat.decimalPattern(_locale(currency)); + final value = currency == 'IDR' ? cents.toDouble() : cents / 100.0; + return format.format(value); + } + + static String _locale(String currency) { + switch (currency) { + case 'IDR': + return 'id_ID'; + case 'USD': + return 'en_US'; + default: + return 'en_US'; + } + } + + static String _symbol(String currency) { + switch (currency) { + case 'IDR': + return 'Rp '; + case 'USD': + return '\$'; + default: + return currency; + } + } +} diff --git a/lib/core/utils/date_formatter.dart b/lib/core/utils/date_formatter.dart new file mode 100644 index 0000000..276466e --- /dev/null +++ b/lib/core/utils/date_formatter.dart @@ -0,0 +1,48 @@ +import 'package:intl/intl.dart'; + +/// Utilities for consistent date formatting across the app. +class DateFormatter { + DateFormatter._(); + + /// Full date: "21 February 2026" + static String full(DateTime date) => + DateFormat('d MMMM yyyy').format(date); + + /// Short date: "21 Feb 2026" + static String short(DateTime date) => + DateFormat('d MMM yyyy').format(date); + + /// Day and month only: "21 Feb" + static String dayMonth(DateTime date) => + DateFormat('d MMM').format(date); + + /// Time only: "14:30" + static String time(DateTime date) => + DateFormat('HH:mm').format(date); + + /// Relative day label: "Today", "Yesterday", or short date. + static String relative(DateTime date) { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final target = DateTime(date.year, date.month, date.day); + + final diff = today.difference(target).inDays; + + if (diff == 0) return 'Today'; + if (diff == 1) return 'Yesterday'; + if (diff < 7) return DateFormat('EEEE').format(date); // "Monday" + return short(date); + } + + /// Group header label for the receipt feed. + static String receiptHeader(DateTime date) { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final target = DateTime(date.year, date.month, date.day); + final diff = today.difference(target).inDays; + + if (diff == 0) return 'Today, ${dayMonth(date)}'; + if (diff == 1) return 'Yesterday, ${dayMonth(date)}'; + return '${DateFormat('EEEE').format(date)}, ${dayMonth(date)}'; + } +} diff --git a/lib/data/datasources/local_database.dart b/lib/data/datasources/local_database.dart new file mode 100644 index 0000000..7396621 --- /dev/null +++ b/lib/data/datasources/local_database.dart @@ -0,0 +1,103 @@ +import 'package:sqflite/sqflite.dart'; + +/// SQLite database provider — singleton access to the local ledger database. +class LocalDatabase { + static const String _dbName = 'vent_expense.db'; + static const int _dbVersion = 1; + + static Database? _database; + + /// Returns the singleton database instance, creating it on first access. + static Future get database async { + if (_database != null) return _database!; + _database = await _initDatabase(); + return _database!; + } + + static Future _initDatabase() async { + final dbPath = await getDatabasesPath(); + final path = '$dbPath/$_dbName'; + + return openDatabase( + path, + version: _dbVersion, + onCreate: _onCreate, + ); + } + + static Future _onCreate(Database db, int version) async { + // — Accounts table — + await db.execute(''' + CREATE TABLE accounts ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + type INTEGER NOT NULL, + balance INTEGER NOT NULL DEFAULT 0, + currency TEXT NOT NULL DEFAULT 'IDR', + is_archived INTEGER NOT NULL DEFAULT 0, + created_at INTEGER NOT NULL + ) + '''); + + // — Transactions table — + await db.execute(''' + CREATE TABLE transactions ( + id TEXT PRIMARY KEY, + amount INTEGER NOT NULL, + type INTEGER NOT NULL, + category_id TEXT NOT NULL, + account_id TEXT NOT NULL, + to_account_id TEXT, + note TEXT, + is_settlement INTEGER NOT NULL DEFAULT 0, + date_time INTEGER NOT NULL, + FOREIGN KEY (account_id) REFERENCES accounts(id), + FOREIGN KEY (to_account_id) REFERENCES accounts(id), + FOREIGN KEY (category_id) REFERENCES categories(id) + ) + '''); + + // — Categories table — + await db.execute(''' + CREATE TABLE categories ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + icon TEXT NOT NULL, + is_custom INTEGER NOT NULL DEFAULT 0 + ) + '''); + + // — Pre-seed default categories — + await _seedCategories(db); + } + + /// Inserts the default category set. + static Future _seedCategories(Database db) async { + const defaults = [ + {'id': 'food', 'name': 'Food', 'icon': 'food', 'is_custom': 0}, + {'id': 'transport', 'name': 'Transport', 'icon': 'transport', 'is_custom': 0}, + {'id': 'bills', 'name': 'Bills', 'icon': 'bills', 'is_custom': 0}, + {'id': 'shopping', 'name': 'Shopping', 'icon': 'shopping', 'is_custom': 0}, + {'id': 'entertainment', 'name': 'Entertainment', 'icon': 'entertainment', 'is_custom': 0}, + {'id': 'health', 'name': 'Health', 'icon': 'health', 'is_custom': 0}, + {'id': 'education', 'name': 'Education', 'icon': 'education', 'is_custom': 0}, + {'id': 'other', 'name': 'Other', 'icon': 'other', 'is_custom': 0}, + {'id': 'settlement', 'name': 'Settlement', 'icon': 'settlement', 'is_custom': 0}, + ]; + + final batch = db.batch(); + for (final category in defaults) { + batch.insert('categories', category); + } + await batch.commit(noResult: true); + } + + /// Closes the database (for testing or cleanup). + static Future close() async { + final db = _database; + if (db != null) { + await db.close(); + _database = null; + } + } +} diff --git a/lib/data/models/account_model.dart b/lib/data/models/account_model.dart new file mode 100644 index 0000000..4494ba4 --- /dev/null +++ b/lib/data/models/account_model.dart @@ -0,0 +1,54 @@ +import '../../domain/entities/account.dart'; +import '../../domain/entities/enums.dart'; + +/// SQLite-compatible model for [Account]. +class AccountModel extends Account { + const AccountModel({ + required super.id, + required super.name, + required super.type, + required super.balance, + super.currency, + super.isArchived, + required super.createdAt, + }); + + /// Creates an [AccountModel] from a SQLite row map. + factory AccountModel.fromMap(Map map) { + return AccountModel( + id: map['id'] as String, + name: map['name'] as String, + type: AccountType.values[map['type'] as int], + balance: map['balance'] as int, + currency: (map['currency'] as String?) ?? 'IDR', + isArchived: (map['is_archived'] as int) == 1, + createdAt: DateTime.fromMillisecondsSinceEpoch(map['created_at'] as int), + ); + } + + /// Creates an [AccountModel] from a domain [Account]. + factory AccountModel.fromEntity(Account account) { + return AccountModel( + id: account.id, + name: account.name, + type: account.type, + balance: account.balance, + currency: account.currency, + isArchived: account.isArchived, + createdAt: account.createdAt, + ); + } + + /// Converts this model to a SQLite row map. + Map toMap() { + return { + 'id': id, + 'name': name, + 'type': type.index, + 'balance': balance, + 'currency': currency, + 'is_archived': isArchived ? 1 : 0, + 'created_at': createdAt.millisecondsSinceEpoch, + }; + } +} diff --git a/lib/data/models/category_model.dart b/lib/data/models/category_model.dart new file mode 100644 index 0000000..39e5370 --- /dev/null +++ b/lib/data/models/category_model.dart @@ -0,0 +1,41 @@ +import '../../domain/entities/category.dart'; + +/// SQLite-compatible model for [Category]. +class CategoryModel extends Category { + const CategoryModel({ + required super.id, + required super.name, + required super.icon, + super.isCustom, + }); + + /// Creates a [CategoryModel] from a SQLite row map. + factory CategoryModel.fromMap(Map map) { + return CategoryModel( + id: map['id'] as String, + name: map['name'] as String, + icon: map['icon'] as String, + isCustom: (map['is_custom'] as int) == 1, + ); + } + + /// Creates a [CategoryModel] from a domain [Category]. + factory CategoryModel.fromEntity(Category category) { + return CategoryModel( + id: category.id, + name: category.name, + icon: category.icon, + isCustom: category.isCustom, + ); + } + + /// Converts this model to a SQLite row map. + Map toMap() { + return { + 'id': id, + 'name': name, + 'icon': icon, + 'is_custom': isCustom ? 1 : 0, + }; + } +} diff --git a/lib/data/models/transaction_model.dart b/lib/data/models/transaction_model.dart new file mode 100644 index 0000000..06785ba --- /dev/null +++ b/lib/data/models/transaction_model.dart @@ -0,0 +1,62 @@ +import '../../domain/entities/enums.dart'; +import '../../domain/entities/transaction.dart'; + +/// SQLite-compatible model for [Transaction]. +class TransactionModel extends Transaction { + const TransactionModel({ + required super.id, + required super.amount, + required super.type, + required super.categoryId, + required super.accountId, + super.toAccountId, + super.note, + super.isSettlement, + required super.dateTime, + }); + + /// Creates a [TransactionModel] from a SQLite row map. + factory TransactionModel.fromMap(Map map) { + return TransactionModel( + id: map['id'] as String, + amount: map['amount'] as int, + type: TransactionType.values[map['type'] as int], + categoryId: map['category_id'] as String, + accountId: map['account_id'] as String, + toAccountId: map['to_account_id'] as String?, + note: map['note'] as String?, + isSettlement: (map['is_settlement'] as int) == 1, + dateTime: DateTime.fromMillisecondsSinceEpoch(map['date_time'] as int), + ); + } + + /// Creates a [TransactionModel] from a domain [Transaction]. + factory TransactionModel.fromEntity(Transaction transaction) { + return TransactionModel( + id: transaction.id, + amount: transaction.amount, + type: transaction.type, + categoryId: transaction.categoryId, + accountId: transaction.accountId, + toAccountId: transaction.toAccountId, + note: transaction.note, + isSettlement: transaction.isSettlement, + dateTime: transaction.dateTime, + ); + } + + /// Converts this model to a SQLite row map. + Map toMap() { + return { + 'id': id, + 'amount': amount, + 'type': type.index, + 'category_id': categoryId, + 'account_id': accountId, + 'to_account_id': toAccountId, + 'note': note, + 'is_settlement': isSettlement ? 1 : 0, + 'date_time': dateTime.millisecondsSinceEpoch, + }; + } +} diff --git a/lib/data/repositories/account_repository_impl.dart b/lib/data/repositories/account_repository_impl.dart new file mode 100644 index 0000000..6043ec9 --- /dev/null +++ b/lib/data/repositories/account_repository_impl.dart @@ -0,0 +1,88 @@ +import '../../domain/entities/account.dart'; +import '../../domain/entities/enums.dart'; +import '../../domain/repositories/account_repository.dart'; +import '../datasources/local_database.dart'; +import '../models/account_model.dart'; + +/// Concrete [AccountRepository] backed by local SQLite. +class AccountRepositoryImpl implements AccountRepository { + @override + Future> getAll() async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'accounts', + where: 'is_archived = ?', + whereArgs: [0], + orderBy: 'created_at DESC', + ); + return maps.map(AccountModel.fromMap).toList(); + } + + @override + Future> getByType(AccountType type) async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'accounts', + where: 'type = ? AND is_archived = ?', + whereArgs: [type.index, 0], + orderBy: 'created_at DESC', + ); + return maps.map(AccountModel.fromMap).toList(); + } + + @override + Future getById(String id) async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'accounts', + where: 'id = ?', + whereArgs: [id], + limit: 1, + ); + if (maps.isEmpty) return null; + return AccountModel.fromMap(maps.first); + } + + @override + Future insert(Account account) async { + final db = await LocalDatabase.database; + final model = AccountModel.fromEntity(account); + await db.insert('accounts', model.toMap()); + return model; + } + + @override + Future update(Account account) async { + final db = await LocalDatabase.database; + final model = AccountModel.fromEntity(account); + await db.update( + 'accounts', + model.toMap(), + where: 'id = ?', + whereArgs: [account.id], + ); + return model; + } + + @override + Future archive(String id) async { + final db = await LocalDatabase.database; + await db.update( + 'accounts', + {'is_archived': 1}, + where: 'id = ?', + whereArgs: [id], + ); + } + + @override + Future updateBalance(String id, int newBalance) async { + final db = await LocalDatabase.database; + await db.update( + 'accounts', + {'balance': newBalance}, + where: 'id = ?', + whereArgs: [id], + ); + } +} diff --git a/lib/data/repositories/category_repository_impl.dart b/lib/data/repositories/category_repository_impl.dart new file mode 100644 index 0000000..338d6e7 --- /dev/null +++ b/lib/data/repositories/category_repository_impl.dart @@ -0,0 +1,58 @@ +import '../../domain/entities/category.dart'; +import '../../domain/repositories/category_repository.dart'; +import '../datasources/local_database.dart'; +import '../models/category_model.dart'; + +/// Concrete [CategoryRepository] backed by local SQLite. +class CategoryRepositoryImpl implements CategoryRepository { + @override + Future> getAll() async { + final db = await LocalDatabase.database; + final maps = await db.query('categories', orderBy: 'name ASC'); + return maps.map(CategoryModel.fromMap).toList(); + } + + @override + Future getById(String id) async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'categories', + where: 'id = ?', + whereArgs: [id], + limit: 1, + ); + if (maps.isEmpty) return null; + return CategoryModel.fromMap(maps.first); + } + + @override + Future insert(Category category) async { + final db = await LocalDatabase.database; + final model = CategoryModel.fromEntity(category); + await db.insert('categories', model.toMap()); + return model; + } + + @override + Future update(Category category) async { + final db = await LocalDatabase.database; + final model = CategoryModel.fromEntity(category); + await db.update( + 'categories', + model.toMap(), + where: 'id = ?', + whereArgs: [category.id], + ); + return model; + } + + @override + Future delete(String id) async { + final db = await LocalDatabase.database; + await db.delete( + 'categories', + where: 'id = ?', + whereArgs: [id], + ); + } +} diff --git a/lib/data/repositories/transaction_repository_impl.dart b/lib/data/repositories/transaction_repository_impl.dart new file mode 100644 index 0000000..85f54ed --- /dev/null +++ b/lib/data/repositories/transaction_repository_impl.dart @@ -0,0 +1,91 @@ +import '../../domain/entities/transaction.dart'; +import '../../domain/repositories/transaction_repository.dart'; +import '../datasources/local_database.dart'; +import '../models/transaction_model.dart'; + +/// Concrete [TransactionRepository] backed by local SQLite. +class TransactionRepositoryImpl implements TransactionRepository { + @override + Future> getAll() async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'transactions', + orderBy: 'date_time DESC', + ); + return maps.map(TransactionModel.fromMap).toList(); + } + + @override + Future> getByAccount(String accountId) async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'transactions', + where: 'account_id = ? OR to_account_id = ?', + whereArgs: [accountId, accountId], + orderBy: 'date_time DESC', + ); + return maps.map(TransactionModel.fromMap).toList(); + } + + @override + Future> getByDateRange( + DateTime start, + DateTime end, + ) async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'transactions', + where: 'date_time >= ? AND date_time <= ?', + whereArgs: [ + start.millisecondsSinceEpoch, + end.millisecondsSinceEpoch, + ], + orderBy: 'date_time DESC', + ); + return maps.map(TransactionModel.fromMap).toList(); + } + + @override + Future getById(String id) async { + final db = await LocalDatabase.database; + final maps = await db.query( + 'transactions', + where: 'id = ?', + whereArgs: [id], + limit: 1, + ); + if (maps.isEmpty) return null; + return TransactionModel.fromMap(maps.first); + } + + @override + Future insert(Transaction transaction) async { + final db = await LocalDatabase.database; + final model = TransactionModel.fromEntity(transaction); + await db.insert('transactions', model.toMap()); + return model; + } + + @override + Future update(Transaction transaction) async { + final db = await LocalDatabase.database; + final model = TransactionModel.fromEntity(transaction); + await db.update( + 'transactions', + model.toMap(), + where: 'id = ?', + whereArgs: [transaction.id], + ); + return model; + } + + @override + Future delete(String id) async { + final db = await LocalDatabase.database; + await db.delete( + 'transactions', + where: 'id = ?', + whereArgs: [id], + ); + } +} diff --git a/lib/domain/entities/account.dart b/lib/domain/entities/account.dart new file mode 100644 index 0000000..fdc4ee8 --- /dev/null +++ b/lib/domain/entities/account.dart @@ -0,0 +1,76 @@ +import 'package:equatable/equatable.dart'; + +import 'enums.dart'; + +/// A financial account — either an asset (debit/cash) or liability (credit). +class Account extends Equatable { + /// Unique identifier. + final String id; + + /// User-facing name, e.g. "BCA Debit", "Cash Wallet". + final String name; + + /// Whether this is a debit, cash, or credit account. + final AccountType type; + + /// Current balance in the smallest currency unit (cents / sen). + /// Positive for assets, positive for credit = amount owed. + final int balance; + + /// ISO 4217 currency code, e.g. 'IDR', 'USD'. + final String currency; + + /// Soft-deleted accounts are archived but retain history. + final bool isArchived; + + /// When this account was created. + final DateTime createdAt; + + const Account({ + required this.id, + required this.name, + required this.type, + required this.balance, + this.currency = 'IDR', + this.isArchived = false, + required this.createdAt, + }); + + /// Whether this account counts as an asset (debit / cash). + bool get isAsset => type == AccountType.debit || type == AccountType.cash; + + /// Whether this account counts as a liability (credit). + bool get isLiability => type == AccountType.credit; + + /// Returns a copy with the given fields replaced. + Account copyWith({ + String? id, + String? name, + AccountType? type, + int? balance, + String? currency, + bool? isArchived, + DateTime? createdAt, + }) { + return Account( + id: id ?? this.id, + name: name ?? this.name, + type: type ?? this.type, + balance: balance ?? this.balance, + currency: currency ?? this.currency, + isArchived: isArchived ?? this.isArchived, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + List get props => [ + id, + name, + type, + balance, + currency, + isArchived, + createdAt, + ]; +} diff --git a/lib/domain/entities/category.dart b/lib/domain/entities/category.dart new file mode 100644 index 0000000..a18ebab --- /dev/null +++ b/lib/domain/entities/category.dart @@ -0,0 +1,41 @@ +import 'package:equatable/equatable.dart'; + +/// A spending category (e.g. Food, Transport, Bills). +class Category extends Equatable { + /// Unique identifier. + final String id; + + /// Display name. + final String name; + + /// Stamp-style icon identifier (maps to a CustomPainter design). + final String icon; + + /// `false` for the pre-seeded set; `true` for user-created categories. + final bool isCustom; + + const Category({ + required this.id, + required this.name, + required this.icon, + this.isCustom = false, + }); + + /// Returns a copy with the given fields replaced. + Category copyWith({ + String? id, + String? name, + String? icon, + bool? isCustom, + }) { + return Category( + id: id ?? this.id, + name: name ?? this.name, + icon: icon ?? this.icon, + isCustom: isCustom ?? this.isCustom, + ); + } + + @override + List get props => [id, name, icon, isCustom]; +} diff --git a/lib/domain/entities/enums.dart b/lib/domain/entities/enums.dart new file mode 100644 index 0000000..8fb29f5 --- /dev/null +++ b/lib/domain/entities/enums.dart @@ -0,0 +1,23 @@ +/// Types of financial accounts. +enum AccountType { + /// A bank debit account — real money held in a bank. + debit, + + /// Physical cash on hand. + cash, + + /// A credit card — represents an IOU / liability. + credit, +} + +/// Types of financial transactions. +enum TransactionType { + /// Money going out (spending). + expense, + + /// Money coming in (earning). + income, + + /// Money moving between accounts. + transfer, +} diff --git a/lib/domain/entities/transaction.dart b/lib/domain/entities/transaction.dart new file mode 100644 index 0000000..a396d7e --- /dev/null +++ b/lib/domain/entities/transaction.dart @@ -0,0 +1,83 @@ +import 'package:equatable/equatable.dart'; + +import 'enums.dart'; + +/// A single financial transaction logged in the ledger. +class Transaction extends Equatable { + /// Unique identifier. + final String id; + + /// Amount in the smallest currency unit (cents / sen). + final int amount; + + /// Whether this is an expense, income, or transfer. + final TransactionType type; + + /// Reference to the [Category] this transaction belongs to. + final String categoryId; + + /// The primary account affected (source for expenses, target for income). + final String accountId; + + /// For transfers / settlements: the destination account. + final String? toAccountId; + + /// Optional user note. + final String? note; + + /// Whether this transaction is a credit-card bill settlement. + final bool isSettlement; + + /// When this transaction occurred. + final DateTime dateTime; + + const Transaction({ + required this.id, + required this.amount, + required this.type, + required this.categoryId, + required this.accountId, + this.toAccountId, + this.note, + this.isSettlement = false, + required this.dateTime, + }); + + /// Returns a copy with the given fields replaced. + Transaction copyWith({ + String? id, + int? amount, + TransactionType? type, + String? categoryId, + String? accountId, + String? toAccountId, + String? note, + bool? isSettlement, + DateTime? dateTime, + }) { + return Transaction( + id: id ?? this.id, + amount: amount ?? this.amount, + type: type ?? this.type, + categoryId: categoryId ?? this.categoryId, + accountId: accountId ?? this.accountId, + toAccountId: toAccountId ?? this.toAccountId, + note: note ?? this.note, + isSettlement: isSettlement ?? this.isSettlement, + dateTime: dateTime ?? this.dateTime, + ); + } + + @override + List get props => [ + id, + amount, + type, + categoryId, + accountId, + toAccountId, + note, + isSettlement, + dateTime, + ]; +} diff --git a/lib/domain/repositories/account_repository.dart b/lib/domain/repositories/account_repository.dart new file mode 100644 index 0000000..8fb7e7e --- /dev/null +++ b/lib/domain/repositories/account_repository.dart @@ -0,0 +1,26 @@ +import '../entities/account.dart'; +import '../entities/enums.dart'; + +/// Contract for account persistence operations. +abstract class AccountRepository { + /// Returns all non-archived accounts. + Future> getAll(); + + /// Returns all accounts of the given [type]. + Future> getByType(AccountType type); + + /// Returns a single account by [id], or `null` if not found. + Future getById(String id); + + /// Inserts a new account. Returns the inserted account. + Future insert(Account account); + + /// Updates an existing account. Returns the updated account. + Future update(Account account); + + /// Soft-deletes (archives) an account by [id]. + Future archive(String id); + + /// Updates just the balance of a given account. + Future updateBalance(String id, int newBalance); +} diff --git a/lib/domain/repositories/category_repository.dart b/lib/domain/repositories/category_repository.dart new file mode 100644 index 0000000..23a67c2 --- /dev/null +++ b/lib/domain/repositories/category_repository.dart @@ -0,0 +1,19 @@ +import '../entities/category.dart'; + +/// Contract for category persistence operations. +abstract class CategoryRepository { + /// Returns all categories (pre-seeded + custom). + Future> getAll(); + + /// Returns a single category by [id], or `null` if not found. + Future getById(String id); + + /// Inserts a new custom category. + Future insert(Category category); + + /// Updates an existing category. + Future update(Category category); + + /// Deletes a custom category by [id]. + Future delete(String id); +} diff --git a/lib/domain/repositories/transaction_repository.dart b/lib/domain/repositories/transaction_repository.dart new file mode 100644 index 0000000..b336e2e --- /dev/null +++ b/lib/domain/repositories/transaction_repository.dart @@ -0,0 +1,25 @@ +import '../entities/transaction.dart'; + +/// Contract for transaction persistence operations. +abstract class TransactionRepository { + /// Returns all transactions, newest first. + Future> getAll(); + + /// Returns transactions for a specific account. + Future> getByAccount(String accountId); + + /// Returns transactions within a date range (inclusive). + Future> getByDateRange(DateTime start, DateTime end); + + /// Returns a single transaction by [id], or `null` if not found. + Future getById(String id); + + /// Inserts a new transaction. Returns the inserted transaction. + Future insert(Transaction transaction); + + /// Updates an existing transaction. Returns the updated transaction. + Future update(Transaction transaction); + + /// Deletes a transaction by [id]. + Future delete(String id); +} diff --git a/lib/domain/usecases/calculate_net_position.dart b/lib/domain/usecases/calculate_net_position.dart new file mode 100644 index 0000000..06fc2ca --- /dev/null +++ b/lib/domain/usecases/calculate_net_position.dart @@ -0,0 +1,67 @@ +import '../repositories/account_repository.dart'; +import '../value_objects/money.dart'; + +/// Calculates the user's net financial position. +/// +/// Net Position = Σ Asset balances − Σ Liability balances. +class CalculateNetPosition { + final AccountRepository _accountRepository; + + CalculateNetPosition(this._accountRepository); + + /// Returns the net position as a [Money] value. + /// + /// Positive = user has more assets than debts. + /// Negative = user owes more than they have. + Future call() async { + final accounts = await _accountRepository.getAll(); + + int totalAssets = 0; + int totalLiabilities = 0; + + for (final account in accounts) { + if (account.isAsset) { + totalAssets += account.balance; + } else if (account.isLiability) { + totalLiabilities += account.balance; + } + } + + return Money(cents: totalAssets - totalLiabilities); + } + + /// Returns a breakdown: total assets, total liabilities, net position. + Future breakdown() async { + final accounts = await _accountRepository.getAll(); + + int totalAssets = 0; + int totalLiabilities = 0; + + for (final account in accounts) { + if (account.isAsset) { + totalAssets += account.balance; + } else if (account.isLiability) { + totalLiabilities += account.balance; + } + } + + return NetPositionBreakdown( + totalAssets: Money(cents: totalAssets), + totalLiabilities: Money(cents: totalLiabilities), + netPosition: Money(cents: totalAssets - totalLiabilities), + ); + } +} + +/// A breakdown of the user's financial position. +class NetPositionBreakdown { + final Money totalAssets; + final Money totalLiabilities; + final Money netPosition; + + const NetPositionBreakdown({ + required this.totalAssets, + required this.totalLiabilities, + required this.netPosition, + }); +} diff --git a/lib/domain/usecases/log_transaction.dart b/lib/domain/usecases/log_transaction.dart new file mode 100644 index 0000000..96a42b4 --- /dev/null +++ b/lib/domain/usecases/log_transaction.dart @@ -0,0 +1,78 @@ +import '../entities/enums.dart'; +import '../entities/transaction.dart'; +import '../repositories/account_repository.dart'; +import '../repositories/transaction_repository.dart'; + +/// Validates and logs a new transaction, updating the affected account balance. +class LogTransaction { + final TransactionRepository _transactionRepository; + final AccountRepository _accountRepository; + + LogTransaction(this._transactionRepository, this._accountRepository); + + /// Logs a [transaction] and adjusts the account balance accordingly. + /// + /// - **Expense**: Deducts from the source account. + /// - **Income**: Adds to the source account. + /// - **Transfer**: Deducts from source, adds to destination. + /// + /// Throws [ArgumentError] if the referenced accounts don't exist. + Future call(Transaction transaction) async { + // Validate source account exists + final sourceAccount = + await _accountRepository.getById(transaction.accountId); + if (sourceAccount == null) { + throw ArgumentError( + 'Source account not found: ${transaction.accountId}', + ); + } + + switch (transaction.type) { + case TransactionType.expense: + // For credit card expenses: increase the liability (balance goes up). + // For debit/cash expenses: decrease the balance. + if (sourceAccount.isLiability) { + await _accountRepository.updateBalance( + sourceAccount.id, + sourceAccount.balance + transaction.amount, + ); + } else { + await _accountRepository.updateBalance( + sourceAccount.id, + sourceAccount.balance - transaction.amount, + ); + } + + case TransactionType.income: + await _accountRepository.updateBalance( + sourceAccount.id, + sourceAccount.balance + transaction.amount, + ); + + case TransactionType.transfer: + if (transaction.toAccountId == null) { + throw ArgumentError('Transfer requires a destination account'); + } + final destAccount = + await _accountRepository.getById(transaction.toAccountId!); + if (destAccount == null) { + throw ArgumentError( + 'Destination account not found: ${transaction.toAccountId}', + ); + } + + // Deduct from source + await _accountRepository.updateBalance( + sourceAccount.id, + sourceAccount.balance - transaction.amount, + ); + // Add to destination + await _accountRepository.updateBalance( + destAccount.id, + destAccount.balance + transaction.amount, + ); + } + + return _transactionRepository.insert(transaction); + } +} diff --git a/lib/domain/usecases/settle_credit_bill.dart b/lib/domain/usecases/settle_credit_bill.dart new file mode 100644 index 0000000..530ee81 --- /dev/null +++ b/lib/domain/usecases/settle_credit_bill.dart @@ -0,0 +1,88 @@ +import 'package:uuid/uuid.dart'; + +import '../entities/enums.dart'; +import '../entities/transaction.dart'; +import '../repositories/account_repository.dart'; +import '../repositories/transaction_repository.dart'; + +/// One-touch credit card bill settlement. +/// +/// Transfers funds from a debit/cash account to a credit account, +/// reducing the credit liability and deducting from the asset. +class SettleCreditBill { + final TransactionRepository _transactionRepository; + final AccountRepository _accountRepository; + final Uuid _uuid; + + SettleCreditBill( + this._transactionRepository, + this._accountRepository, { + Uuid? uuid, + }) : _uuid = uuid ?? const Uuid(); + + /// Settles [amount] (in cents) from [sourceAccountId] to [creditAccountId]. + /// + /// - The source account must be debit or cash (an asset). + /// - The credit account must be a credit card (a liability). + /// - [amount] must be > 0 and ≤ source account balance. + /// + /// Returns the settlement transaction. + Future call({ + required String sourceAccountId, + required String creditAccountId, + required int amount, + }) async { + if (amount <= 0) { + throw ArgumentError('Settlement amount must be positive'); + } + + final source = await _accountRepository.getById(sourceAccountId); + if (source == null) { + throw ArgumentError('Source account not found: $sourceAccountId'); + } + if (!source.isAsset) { + throw ArgumentError('Source must be a debit or cash account'); + } + + final credit = await _accountRepository.getById(creditAccountId); + if (credit == null) { + throw ArgumentError('Credit account not found: $creditAccountId'); + } + if (!credit.isLiability) { + throw ArgumentError('Target must be a credit account'); + } + + if (amount > source.balance) { + throw ArgumentError( + 'Insufficient balance: have ${source.balance}, need $amount', + ); + } + + // Deduct from asset + await _accountRepository.updateBalance( + source.id, + source.balance - amount, + ); + + // Reduce credit liability + await _accountRepository.updateBalance( + credit.id, + credit.balance - amount, + ); + + // Log as a settlement transfer + final settlement = Transaction( + id: _uuid.v4(), + amount: amount, + type: TransactionType.transfer, + categoryId: 'settlement', + accountId: sourceAccountId, + toAccountId: creditAccountId, + note: 'Bill payment: ${source.name} → ${credit.name}', + isSettlement: true, + dateTime: DateTime.now(), + ); + + return _transactionRepository.insert(settlement); + } +} diff --git a/lib/domain/value_objects/money.dart b/lib/domain/value_objects/money.dart new file mode 100644 index 0000000..8ff022e --- /dev/null +++ b/lib/domain/value_objects/money.dart @@ -0,0 +1,82 @@ +import 'package:equatable/equatable.dart'; +import 'package:intl/intl.dart'; + +/// An immutable representation of a monetary amount. +/// +/// Internally stored as an [int] in the smallest currency unit (e.g. cents) +/// to avoid floating-point precision issues. +class Money extends Equatable { + /// The amount in the smallest currency unit (e.g. 15000 = Rp 150.00). + final int cents; + + /// ISO 4217 currency code. + final String currency; + + const Money({required this.cents, this.currency = 'IDR'}); + + /// Creates a [Money] from a whole-unit double (e.g. 150.00 → 15000 cents). + factory Money.fromDouble(double amount, {String currency = 'IDR'}) { + return Money(cents: (amount * 100).round(), currency: currency); + } + + /// The amount as a double (e.g. 15000 → 150.00). + double get asDouble => cents / 100.0; + + /// Formatted display string (e.g. "Rp 150.00" or "$1,500.00"). + String get formatted { + final format = NumberFormat.currency( + locale: _localeForCurrency(currency), + symbol: _symbolForCurrency(currency), + decimalDigits: currency == 'IDR' ? 0 : 2, + ); + return format.format(currency == 'IDR' ? cents : asDouble); + } + + // — Arithmetic — + + Money operator +(Money other) { + assert(currency == other.currency, 'Cannot add different currencies'); + return Money(cents: cents + other.cents, currency: currency); + } + + Money operator -(Money other) { + assert(currency == other.currency, 'Cannot subtract different currencies'); + return Money(cents: cents - other.cents, currency: currency); + } + + Money operator -() => Money(cents: -cents, currency: currency); + + bool get isNegative => cents < 0; + bool get isZero => cents == 0; + bool get isPositive => cents > 0; + + // — Helpers — + + static String _localeForCurrency(String currency) { + switch (currency) { + case 'IDR': + return 'id_ID'; + case 'USD': + return 'en_US'; + default: + return 'en_US'; + } + } + + static String _symbolForCurrency(String currency) { + switch (currency) { + case 'IDR': + return 'Rp '; + case 'USD': + return '\$'; + default: + return currency; + } + } + + @override + List get props => [cents, currency]; + + @override + String toString() => formatted; +} diff --git a/lib/main.dart b/lib/main.dart index 244a702..29222cb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,120 +1,117 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -void main() { - runApp(const MyApp()); +import 'core/di/service_locator.dart'; +import 'core/theme/app_colors.dart'; +import 'core/theme/app_theme.dart'; +import 'core/theme/app_typography.dart'; +import 'domain/repositories/account_repository.dart'; +import 'domain/repositories/transaction_repository.dart'; +import 'domain/usecases/calculate_net_position.dart'; +import 'domain/usecases/log_transaction.dart'; +import 'presentation/providers/account_provider.dart'; +import 'presentation/providers/transaction_provider.dart'; +import 'presentation/screens/accounts_screen.dart'; +import 'presentation/screens/ledger_screen.dart'; +import 'presentation/screens/reports_screen.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + + // Initialize dependency injection + await initServiceLocator(); + + runApp(const VentExpenseApp()); } -class MyApp extends StatelessWidget { - const MyApp({super.key}); +/// Root application widget. +class VentExpenseApp extends StatelessWidget { + const VentExpenseApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: .fromSeed(seedColor: Colors.deepPurple), + return MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (_) => AccountProvider( + sl(), + sl(), + ), + ), + ChangeNotifierProvider( + create: (_) => TransactionProvider( + sl(), + sl(), + ), + ), + ], + child: MaterialApp( + title: 'VentExpense Pro', + debugShowCheckedModeBanner: false, + theme: AppTheme.light, + home: const HomeShell(), ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; +/// The main shell with bottom navigation. +class HomeShell extends StatefulWidget { + const HomeShell({super.key}); @override - State createState() => _MyHomePageState(); + State createState() => _HomeShellState(); } -class _MyHomePageState extends State { - int _counter = 0; +class _HomeShellState extends State { + int _currentIndex = 0; - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } + static const _screens = [ + LedgerScreen(), + AccountsScreen(), + ReportsScreen(), + ]; + + static const _titles = ['Ledger', 'Accounts', 'Reports']; @override Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. return Scaffold( appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: .center, - children: [ - const Text('You have pushed the button this many times:'), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], + title: Text( + _titles[_currentIndex], + style: AppTypography.titleLarge.copyWith( + color: AppColors.inkBlue, + ), ), ), + body: _screens[_currentIndex], + bottomNavigationBar: BottomNavigationBar( + currentIndex: _currentIndex, + onTap: (index) => setState(() => _currentIndex = index), + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.receipt_long_outlined), + activeIcon: Icon(Icons.receipt_long), + label: 'Ledger', + ), + BottomNavigationBarItem( + icon: Icon(Icons.account_balance_wallet_outlined), + activeIcon: Icon(Icons.account_balance_wallet), + label: 'Accounts', + ), + BottomNavigationBarItem( + icon: Icon(Icons.description_outlined), + activeIcon: Icon(Icons.description), + label: 'Reports', + ), + ], + ), floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', + onPressed: () { + // TODO: Open Quick-Add bottom sheet + }, + tooltip: 'Log Transaction', child: const Icon(Icons.add), ), ); diff --git a/lib/presentation/painters/paper_background.dart b/lib/presentation/painters/paper_background.dart new file mode 100644 index 0000000..4966217 --- /dev/null +++ b/lib/presentation/painters/paper_background.dart @@ -0,0 +1,70 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; + +/// Paints a subtle cream-paper texture with faint ruled lines. +class PaperBackgroundPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + // — Paper base — + final paperPaint = Paint()..color = AppColors.paper; + canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), paperPaint); + + // — Subtle grain texture (tiny dots) — + final grainPaint = Paint() + ..color = AppColors.divider.withValues(alpha: 0.15) + ..strokeWidth = 0.5; + + final random = Random(42); // Fixed seed for deterministic pattern + for (int i = 0; i < 200; i++) { + final x = random.nextDouble() * size.width; + final y = random.nextDouble() * size.height; + canvas.drawCircle(Offset(x, y), 0.3, grainPaint); + } + + // — Faint ruled lines — + final linePaint = Paint() + ..color = AppColors.divider.withValues(alpha: 0.2) + ..strokeWidth = 0.5; + + const lineSpacing = 32.0; + for (double y = lineSpacing; y < size.height; y += lineSpacing) { + canvas.drawLine( + Offset(24, y), + Offset(size.width - 24, y), + linePaint, + ); + } + + // — Left margin line (like a real ruled page) — + final marginPaint = Paint() + ..color = AppColors.stampRed.withValues(alpha: 0.15) + ..strokeWidth = 1.0; + + canvas.drawLine( + const Offset(48, 0), + Offset(48, size.height), + marginPaint, + ); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} + +/// A widget that renders the paper background behind its child. +class PaperBackground extends StatelessWidget { + final Widget child; + + const PaperBackground({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return CustomPaint( + painter: PaperBackgroundPainter(), + child: child, + ); + } +} diff --git a/lib/presentation/providers/account_provider.dart b/lib/presentation/providers/account_provider.dart new file mode 100644 index 0000000..1065662 --- /dev/null +++ b/lib/presentation/providers/account_provider.dart @@ -0,0 +1,81 @@ +import 'package:flutter/foundation.dart'; + +import '../../domain/entities/account.dart'; +import '../../domain/repositories/account_repository.dart'; +import '../../domain/usecases/calculate_net_position.dart'; + +/// Manages account state and net position calculation. +class AccountProvider extends ChangeNotifier { + final AccountRepository _accountRepository; + final CalculateNetPosition _calculateNetPosition; + + AccountProvider(this._accountRepository, this._calculateNetPosition); + + List _accounts = []; + NetPositionBreakdown? _breakdown; + bool _isLoading = false; + String? _error; + + // — Getters — + + List get accounts => _accounts; + List get assetAccounts => + _accounts.where((a) => a.isAsset).toList(); + List get liabilityAccounts => + _accounts.where((a) => a.isLiability).toList(); + NetPositionBreakdown? get breakdown => _breakdown; + bool get isLoading => _isLoading; + String? get error => _error; + + // — Actions — + + /// Loads all accounts and recalculates net position. + Future loadAccounts() async { + _isLoading = true; + _error = null; + notifyListeners(); + + try { + _accounts = await _accountRepository.getAll(); + _breakdown = await _calculateNetPosition.breakdown(); + } catch (e) { + _error = e.toString(); + } finally { + _isLoading = false; + notifyListeners(); + } + } + + /// Adds a new account and refreshes the list. + Future addAccount(Account account) async { + try { + await _accountRepository.insert(account); + await loadAccounts(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } + + /// Updates an account and refreshes the list. + Future updateAccount(Account account) async { + try { + await _accountRepository.update(account); + await loadAccounts(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } + + /// Archives an account and refreshes the list. + Future archiveAccount(String id) async { + try { + await _accountRepository.archive(id); + await loadAccounts(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } +} diff --git a/lib/presentation/providers/transaction_provider.dart b/lib/presentation/providers/transaction_provider.dart new file mode 100644 index 0000000..252850a --- /dev/null +++ b/lib/presentation/providers/transaction_provider.dart @@ -0,0 +1,77 @@ +import 'package:flutter/foundation.dart'; + +import '../../domain/entities/transaction.dart'; +import '../../domain/repositories/transaction_repository.dart'; +import '../../domain/usecases/log_transaction.dart'; + +/// Manages transaction state for the receipt feed. +class TransactionProvider extends ChangeNotifier { + final TransactionRepository _transactionRepository; + final LogTransaction _logTransaction; + + TransactionProvider(this._transactionRepository, this._logTransaction); + + List _transactions = []; + bool _isLoading = false; + String? _error; + + // — Getters — + + List get transactions => _transactions; + bool get isLoading => _isLoading; + String? get error => _error; + + /// Transactions grouped by date (for the receipt feed). + Map> get groupedByDate { + final grouped = >{}; + for (final txn in _transactions) { + final dateKey = DateTime( + txn.dateTime.year, + txn.dateTime.month, + txn.dateTime.day, + ); + grouped.putIfAbsent(dateKey, () => []).add(txn); + } + return grouped; + } + + // — Actions — + + /// Loads all transactions. + Future loadTransactions() async { + _isLoading = true; + _error = null; + notifyListeners(); + + try { + _transactions = await _transactionRepository.getAll(); + } catch (e) { + _error = e.toString(); + } finally { + _isLoading = false; + notifyListeners(); + } + } + + /// Logs a new transaction and refreshes the list. + Future addTransaction(Transaction transaction) async { + try { + await _logTransaction(transaction); + await loadTransactions(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } + + /// Deletes a transaction and refreshes the list. + Future deleteTransaction(String id) async { + try { + await _transactionRepository.delete(id); + await loadTransactions(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } +} diff --git a/lib/presentation/screens/accounts_screen.dart b/lib/presentation/screens/accounts_screen.dart new file mode 100644 index 0000000..533bb26 --- /dev/null +++ b/lib/presentation/screens/accounts_screen.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../painters/paper_background.dart'; + +/// The accounts overview screen — lists asset and liability accounts. +class AccountsScreen extends StatelessWidget { + const AccountsScreen({super.key}); + + @override + Widget build(BuildContext context) { + return PaperBackground( + child: Center( + child: Padding( + padding: const EdgeInsets.all(32), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.account_balance_wallet_outlined, + size: 48, + color: AppColors.disabled, + ), + const SizedBox(height: 16), + Text( + 'No accounts yet', + style: AppTypography.bodyLarge.copyWith( + color: AppColors.inkLight, + ), + ), + const SizedBox(height: 8), + const Text( + 'Add your first debit, cash, or credit account', + style: AppTypography.bodySmall, + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/ledger_screen.dart b/lib/presentation/screens/ledger_screen.dart new file mode 100644 index 0000000..71bc066 --- /dev/null +++ b/lib/presentation/screens/ledger_screen.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../painters/paper_background.dart'; + +/// The main ledger screen — a continuous, receipt-style transaction feed. +class LedgerScreen extends StatelessWidget { + const LedgerScreen({super.key}); + + @override + Widget build(BuildContext context) { + return PaperBackground( + child: CustomScrollView( + slivers: [ + // — Net Position Card placeholder — + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 24, 16, 8), + child: Card( + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + children: [ + Text( + 'NET POSITION', + style: AppTypography.label.copyWith( + letterSpacing: 2.0, + ), + ), + const SizedBox(height: 8), + Text( + 'Rp 0', + style: AppTypography.amountLarge.copyWith( + color: AppColors.inkBlue, + ), + ), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildSummaryItem( + 'Assets', + 'Rp 0', + AppColors.inkGreen, + ), + Container( + width: 1, + height: 32, + color: AppColors.divider, + ), + _buildSummaryItem( + 'Liabilities', + 'Rp 0', + AppColors.stampRed, + ), + ], + ), + ], + ), + ), + ), + ), + ), + + // — Receipt feed placeholder — + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24), + child: Column( + children: [ + // — Perforated divider — + Row( + children: List.generate( + 30, + (i) => Expanded( + child: Container( + height: 1, + margin: const EdgeInsets.symmetric(horizontal: 2), + color: i.isEven + ? AppColors.divider + : Colors.transparent, + ), + ), + ), + ), + const SizedBox(height: 32), + const Icon( + Icons.receipt_long_outlined, + size: 48, + color: AppColors.disabled, + ), + const SizedBox(height: 12), + Text( + 'No transactions yet', + style: AppTypography.bodyLarge.copyWith( + color: AppColors.inkLight, + ), + ), + const SizedBox(height: 4), + const Text( + 'Tap + to log your first entry', + style: AppTypography.bodySmall, + ), + ], + ), + ), + ), + ], + ), + ); + } + + Widget _buildSummaryItem(String label, String amount, Color color) { + return Column( + children: [ + Text( + label.toUpperCase(), + style: AppTypography.label, + ), + const SizedBox(height: 4), + Text( + amount, + style: AppTypography.amountMedium.copyWith(color: color), + ), + ], + ); + } +} diff --git a/lib/presentation/screens/reports_screen.dart b/lib/presentation/screens/reports_screen.dart new file mode 100644 index 0000000..4e9cafa --- /dev/null +++ b/lib/presentation/screens/reports_screen.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../painters/paper_background.dart'; + +/// The reports screen — PDF / Excel generation and viewing. +class ReportsScreen extends StatelessWidget { + const ReportsScreen({super.key}); + + @override + Widget build(BuildContext context) { + return PaperBackground( + child: Center( + child: Padding( + padding: const EdgeInsets.all(32), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.description_outlined, + size: 48, + color: AppColors.disabled, + ), + const SizedBox(height: 16), + Text( + 'Reports coming soon', + style: AppTypography.bodyLarge.copyWith( + color: AppColors.inkLight, + ), + ), + const SizedBox(height: 8), + const Text( + 'Generate PDF & Excel ledger statements', + style: AppTypography.bodySmall, + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ); + } +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..9bb24ec 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,10 @@ import FlutterMacOS import Foundation +import google_sign_in_ios +import sqflite_darwin func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 764bc87..4915231 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,46 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _discoveryapis_commons: + dependency: transitive + description: + name: _discoveryapis_commons + sha256: "113c4100b90a5b70a983541782431b82168b3cae166ab130649c36eb3559d498" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d" + url: "https://pub.dev" + source: hosted + version: "93.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b + url: "https://pub.dev" + source: hosted + version: "10.0.1" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" async: dependency: transitive description: @@ -9,6 +49,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + barcode: + dependency: transitive + description: + name: barcode + sha256: "7b6729c37e3b7f34233e2318d866e8c48ddb46c1f7ad01ff7bb2a8de1da2b9f4" + url: "https://pub.dev" + source: hosted + version: "2.2.9" + bidi: + dependency: transitive + description: + name: bidi + sha256: "77f475165e94b261745cf1032c751e2032b8ed92ccb2bf5716036db79320637d" + url: "https://pub.dev" + source: hosted + version: "2.0.13" boolean_selector: dependency: transitive description: @@ -17,6 +73,54 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: "275bf6bb2a00a9852c28d4e0b410da1d833a734d57d39d44f94bfc895a484ec3" + url: "https://pub.dev" + source: hosted + version: "4.0.4" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + url: "https://pub.dev" + source: hosted + version: "4.1.1" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "39ad4ca8a2876779737c60e4228b4bcd35d4352ef7e14e47514093edc012c734" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "6ae8a6435a8c6520c7077b107e77f1fb4ba7009633259a4d49a8afd8e7efc5e9" + url: "https://pub.dev" + source: hosted + version: "8.12.4" characters: dependency: transitive description: @@ -25,6 +129,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" clock: dependency: transitive description: @@ -33,6 +145,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + url: "https://pub.dev" + source: hosted + version: "4.11.1" collection: dependency: transitive description: @@ -41,14 +169,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" - cupertino_icons: + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "15a7db352c8fc6a4d2bc475ba901c25b39fe7157541da4c16eacce6f8be83e49" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + equatable: dependency: "direct main" description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + name: equatable + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "2.0.8" + excel: + dependency: "direct main" + description: + name: excel + sha256: "1a15327dcad260d5db21d1f6e04f04838109b39a2f6a84ea486ceda36e468780" + url: "https://pub.dev" + source: hosted + version: "4.0.6" fake_async: dependency: transitive description: @@ -57,6 +217,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -75,6 +259,155 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 + url: "https://pub.dev" + source: hosted + version: "8.3.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: d0a2c3bcb06e607bb11e4daca48bd4b6120f0bbc4015ccebbe757d24ea60ed2a + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: d5e23c56a4b84b6427552f1cf3f98f716db3b1d1a647f16b96dbb5b93afa2805 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: "102005f498ce18442e7158f6791033bbc15ad2dcc0afa4cf4752e2722a516c96" + url: "https://pub.dev" + source: hosted + version: "5.9.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "5f6f79cf139c197261adb6ac024577518ae48fdff8e53205c5373b5f6430a8aa" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: "460547beb4962b7623ac0fb8122d6b8268c951cf0b646dd150d60498430e4ded" + url: "https://pub.dev" + source: hosted + version: "0.12.4+4" + googleapis: + dependency: "direct main" + description: + name: googleapis + sha256: "5c9e0f25be1dec13d8d2158263141104c51b5ba83487537c17a2330581e505ee" + url: "https://pub.dev" + source: hosted + version: "14.0.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hooks: + dependency: transitive + description: + name: hooks + sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + http: + dependency: transitive + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + url: "https://pub.dev" + source: hosted + version: "4.3.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 + url: "https://pub.dev" + source: hosted + version: "4.11.0" leak_tracker: dependency: transitive description: @@ -107,6 +440,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" matcher: dependency: transitive description: @@ -131,6 +472,54 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mockito: + dependency: "direct dev" + description: + name: mockito + sha256: a45d1aa065b796922db7b9e7e7e45f921aed17adf3a8318a1f47097e7e695566 + url: "https://pub.dev" + source: hosted + version: "5.6.3" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" + url: "https://pub.dev" + source: hosted + version: "0.17.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" path: dependency: transitive description: @@ -139,11 +528,163 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e + url: "https://pub.dev" + source: hosted + version: "2.2.22" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + pdf: + dependency: "direct main" + description: + name: pdf + sha256: "28eacad99bffcce2e05bba24e50153890ad0255294f4dd78a17075a2ba5c8416" + url: "https://pub.dev" + source: hosted + version: "3.11.3" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + qr: + dependency: transitive + description: + name: qr + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "1d562a3c1f713904ebbed50d2760217fd8a51ca170ac4b05b0db490699dbac17" + url: "https://pub.dev" + source: hosted + version: "4.2.0" source_span: dependency: transitive description: @@ -152,6 +693,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.2" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88 + url: "https://pub.dev" + source: hosted + version: "2.4.2+2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" stack_trace: dependency: transitive description: @@ -168,6 +749,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: @@ -176,6 +765,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" term_glyph: dependency: transitive description: @@ -192,6 +789,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.9" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + uuid: + dependency: "direct main" + description: + name: uuid + sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 + url: "https://pub.dev" + source: hosted + version: "4.5.2" vector_math: dependency: transitive description: @@ -208,6 +821,62 @@ packages: url: "https://pub.dev" source: hosted version: "15.0.2" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: dart: ">=3.11.0 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 09c5f1c..b09bce4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,89 +1,58 @@ name: vent_expense_pro -description: "A new Flutter project." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. +description: "The Analog Digital Ledger — A lightweight personal finance app." +publish_to: 'none' version: 1.0.0+1 environment: sdk: ^3.11.0 -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 + # State Management + provider: ^6.1.4 + + # Local Database + sqflite: ^2.4.2 + path_provider: ^2.1.5 + + # Dependency Injection + get_it: ^8.0.3 + + # Domain Utilities + equatable: ^2.0.7 + uuid: ^4.5.1 + intl: ^0.20.2 + + # Google Drive Sync (prep — wired in Phase 3) + google_sign_in: ^6.2.2 + googleapis: ^14.0.0 + + # Report Generation (prep — wired in Phase 2) + pdf: ^3.11.2 + excel: ^4.0.6 dev_dependencies: flutter_test: sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^6.0.0 + mockito: ^5.4.5 + build_runner: ^2.4.14 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package + fonts: + - family: Lora + fonts: + - asset: assets/fonts/Lora-Regular.ttf + - asset: assets/fonts/Lora-Bold.ttf + weight: 700 + - asset: assets/fonts/Lora-Italic.ttf + style: italic + - family: JetBrainsMono + fonts: + - asset: assets/fonts/JetBrainsMono-Regular.ttf + - asset: assets/fonts/JetBrainsMono-Bold.ttf + weight: 700 diff --git a/test/domain/entities/account_test.dart b/test/domain/entities/account_test.dart new file mode 100644 index 0000000..9e7219a --- /dev/null +++ b/test/domain/entities/account_test.dart @@ -0,0 +1,89 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/entities/account.dart'; +import 'package:vent_expense_pro/domain/entities/enums.dart'; + +void main() { + group('Account', () { + final now = DateTime(2026, 2, 21); + + test('should create a valid debit account', () { + final account = Account( + id: 'acc-1', + name: 'BCA Debit', + type: AccountType.debit, + balance: 500000, + createdAt: now, + ); + + expect(account.id, 'acc-1'); + expect(account.name, 'BCA Debit'); + expect(account.type, AccountType.debit); + expect(account.balance, 500000); + expect(account.currency, 'IDR'); + expect(account.isArchived, false); + expect(account.isAsset, true); + expect(account.isLiability, false); + }); + + test('should create a valid credit account as liability', () { + final account = Account( + id: 'acc-2', + name: 'Visa Card', + type: AccountType.credit, + balance: 150000, + createdAt: now, + ); + + expect(account.isAsset, false); + expect(account.isLiability, true); + }); + + test('should create a valid cash account as asset', () { + final account = Account( + id: 'acc-3', + name: 'Cash Wallet', + type: AccountType.cash, + balance: 200000, + createdAt: now, + ); + + expect(account.isAsset, true); + expect(account.isLiability, false); + }); + + test('should support value equality via Equatable', () { + final a = Account( + id: 'acc-1', + name: 'BCA', + type: AccountType.debit, + balance: 100, + createdAt: now, + ); + final b = Account( + id: 'acc-1', + name: 'BCA', + type: AccountType.debit, + balance: 100, + createdAt: now, + ); + + expect(a, equals(b)); + }); + + test('should support copyWith', () { + final original = Account( + id: 'acc-1', + name: 'BCA', + type: AccountType.debit, + balance: 100, + createdAt: now, + ); + final updated = original.copyWith(balance: 200, name: 'BCA Updated'); + + expect(updated.balance, 200); + expect(updated.name, 'BCA Updated'); + expect(updated.id, 'acc-1'); // unchanged + expect(updated.type, AccountType.debit); // unchanged + }); + }); +} diff --git a/test/domain/entities/transaction_test.dart b/test/domain/entities/transaction_test.dart new file mode 100644 index 0000000..94428fd --- /dev/null +++ b/test/domain/entities/transaction_test.dart @@ -0,0 +1,81 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/entities/enums.dart'; +import 'package:vent_expense_pro/domain/entities/transaction.dart'; + +void main() { + group('Transaction', () { + final now = DateTime(2026, 2, 21, 14, 30); + + test('should create a valid expense transaction', () { + final txn = Transaction( + id: 'txn-1', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-1', + dateTime: now, + ); + + expect(txn.id, 'txn-1'); + expect(txn.amount, 50000); + expect(txn.type, TransactionType.expense); + expect(txn.categoryId, 'food'); + expect(txn.toAccountId, isNull); + expect(txn.note, isNull); + expect(txn.isSettlement, false); + }); + + test('should create a transfer with destination account', () { + final txn = Transaction( + id: 'txn-2', + amount: 100000, + type: TransactionType.transfer, + categoryId: 'settlement', + accountId: 'acc-1', + toAccountId: 'acc-2', + isSettlement: true, + dateTime: now, + ); + + expect(txn.toAccountId, 'acc-2'); + expect(txn.isSettlement, true); + }); + + test('should support value equality via Equatable', () { + final a = Transaction( + id: 'txn-1', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-1', + dateTime: now, + ); + final b = Transaction( + id: 'txn-1', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-1', + dateTime: now, + ); + + expect(a, equals(b)); + }); + + test('should support copyWith', () { + final original = Transaction( + id: 'txn-1', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-1', + dateTime: now, + ); + final updated = original.copyWith(amount: 75000, note: 'Lunch'); + + expect(updated.amount, 75000); + expect(updated.note, 'Lunch'); + expect(updated.id, 'txn-1'); // unchanged + }); + }); +} diff --git a/test/domain/value_objects/money_test.dart b/test/domain/value_objects/money_test.dart new file mode 100644 index 0000000..1621bf0 --- /dev/null +++ b/test/domain/value_objects/money_test.dart @@ -0,0 +1,74 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/value_objects/money.dart'; + +void main() { + group('Money', () { + test('should store cents correctly', () { + const money = Money(cents: 15000); + expect(money.cents, 15000); + expect(money.currency, 'IDR'); + }); + + test('should create from double', () { + final money = Money.fromDouble(150.50, currency: 'USD'); + expect(money.cents, 15050); + }); + + test('should convert to double', () { + const money = Money(cents: 15050, currency: 'USD'); + expect(money.asDouble, 150.50); + }); + + test('should support addition', () { + const a = Money(cents: 10000); + const b = Money(cents: 5000); + final result = a + b; + expect(result.cents, 15000); + }); + + test('should support subtraction', () { + const a = Money(cents: 10000); + const b = Money(cents: 3000); + final result = a - b; + expect(result.cents, 7000); + }); + + test('should support negation', () { + const money = Money(cents: 5000); + final negated = -money; + expect(negated.cents, -5000); + }); + + test('should detect positive, negative, and zero', () { + const positive = Money(cents: 100); + const negative = Money(cents: -100); + const zero = Money(cents: 0); + + expect(positive.isPositive, true); + expect(positive.isNegative, false); + expect(negative.isNegative, true); + expect(zero.isZero, true); + }); + + test('should support value equality', () { + const a = Money(cents: 5000); + const b = Money(cents: 5000); + expect(a, equals(b)); + }); + + test('should format IDR correctly', () { + const money = Money(cents: 1500000); + final formatted = money.formatted; + // Should contain "Rp" and "1.500.000" (Indonesian locale) + expect(formatted, contains('Rp')); + expect(formatted, contains('1.500.000')); + }); + + test('should format USD correctly', () { + const money = Money(cents: 15050, currency: 'USD'); + final formatted = money.formatted; + expect(formatted, contains('\$')); + expect(formatted, contains('150.50')); + }); + }); +} diff --git a/test/widget_test.dart b/test/widget_test.dart index 365c9ce..5d3ba36 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,30 +1,18 @@ -// This is a basic Flutter widget test. +// Smoke test for the VentExpenseApp. // -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. +// This verifies that the app launches and the HomeShell renders +// with the bottom navigation bar and initial screen. -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:vent_expense_pro/main.dart'; +// Note: Full widget tests require DI setup with mocked repositories. +// This file serves as the entry point for widget-level smoke tests +// once the DI container supports test overrides. void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); + test('placeholder — app smoke test requires DI mock setup', () { + // The actual widget test will be implemented when we add + // a test-friendly DI configuration. + expect(true, isTrue); }); } From 5c9284b2924a184ff4cda16c9422d9a9e7f4fcec Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 01:44:25 +0700 Subject: [PATCH 02/13] feat account-management-1.0.0: Implement account management features and display net position on the accounts screen using new UI components and dedicated use cases. --- lib/core/di/service_locator.dart | 4 + lib/domain/usecases/manage_account.dart | 67 ++++ lib/main.dart | 2 + .../providers/account_provider.dart | 56 +++- lib/presentation/screens/accounts_screen.dart | 312 ++++++++++++++++-- lib/presentation/widgets/account_card.dart | 136 ++++++++ .../widgets/add_edit_account_sheet.dart | 289 ++++++++++++++++ .../widgets/net_position_card.dart | 133 ++++++++ .../usecases/calculate_net_position_test.dart | 240 ++++++++++++++ test/domain/usecases/manage_account_test.dart | 247 ++++++++++++++ 10 files changed, 1456 insertions(+), 30 deletions(-) create mode 100644 lib/domain/usecases/manage_account.dart create mode 100644 lib/presentation/widgets/account_card.dart create mode 100644 lib/presentation/widgets/add_edit_account_sheet.dart create mode 100644 lib/presentation/widgets/net_position_card.dart create mode 100644 test/domain/usecases/calculate_net_position_test.dart create mode 100644 test/domain/usecases/manage_account_test.dart diff --git a/lib/core/di/service_locator.dart b/lib/core/di/service_locator.dart index 080a1cf..cb2e7d0 100644 --- a/lib/core/di/service_locator.dart +++ b/lib/core/di/service_locator.dart @@ -8,6 +8,7 @@ import '../../domain/repositories/category_repository.dart'; import '../../domain/repositories/transaction_repository.dart'; import '../../domain/usecases/calculate_net_position.dart'; import '../../domain/usecases/log_transaction.dart'; +import '../../domain/usecases/manage_account.dart'; import '../../domain/usecases/settle_credit_bill.dart'; /// Global service locator instance. @@ -36,4 +37,7 @@ Future initServiceLocator() async { sl.registerFactory( () => SettleCreditBill(sl(), sl()), ); + sl.registerFactory( + () => ManageAccount(sl()), + ); } diff --git a/lib/domain/usecases/manage_account.dart b/lib/domain/usecases/manage_account.dart new file mode 100644 index 0000000..eced03d --- /dev/null +++ b/lib/domain/usecases/manage_account.dart @@ -0,0 +1,67 @@ +import 'package:uuid/uuid.dart'; + +import '../entities/account.dart'; +import '../entities/enums.dart'; +import '../repositories/account_repository.dart'; + +/// Encapsulates account CRUD operations with validation. +class ManageAccount { + final AccountRepository _accountRepository; + final Uuid _uuid; + + ManageAccount(this._accountRepository, {Uuid? uuid}) + : _uuid = uuid ?? const Uuid(); + + /// Creates a new account after validation. + /// + /// - [name] must not be empty. + /// - [balance] must be ≥ 0. + /// - Generates a UUID and sets `createdAt` to now. + Future createAccount({ + required String name, + required AccountType type, + required int balance, + String currency = 'IDR', + }) async { + final trimmedName = name.trim(); + if (trimmedName.isEmpty) { + throw ArgumentError('Account name must not be empty'); + } + if (balance < 0) { + throw ArgumentError('Initial balance must not be negative'); + } + + final account = Account( + id: _uuid.v4(), + name: trimmedName, + type: type, + balance: balance, + currency: currency, + createdAt: DateTime.now(), + ); + + return _accountRepository.insert(account); + } + + /// Updates an existing account after validation. + /// + /// - [account.name] must not be empty. + Future updateAccount(Account account) async { + if (account.name.trim().isEmpty) { + throw ArgumentError('Account name must not be empty'); + } + + return _accountRepository.update( + account.copyWith(name: account.name.trim()), + ); + } + + /// Archives (soft-deletes) an account by [id]. + Future archiveAccount(String id) async { + final account = await _accountRepository.getById(id); + if (account == null) { + throw ArgumentError('Account not found: $id'); + } + return _accountRepository.archive(id); + } +} diff --git a/lib/main.dart b/lib/main.dart index 29222cb..301a863 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,6 +9,7 @@ import 'domain/repositories/account_repository.dart'; import 'domain/repositories/transaction_repository.dart'; import 'domain/usecases/calculate_net_position.dart'; import 'domain/usecases/log_transaction.dart'; +import 'domain/usecases/manage_account.dart'; import 'presentation/providers/account_provider.dart'; import 'presentation/providers/transaction_provider.dart'; import 'presentation/screens/accounts_screen.dart'; @@ -36,6 +37,7 @@ class VentExpenseApp extends StatelessWidget { create: (_) => AccountProvider( sl(), sl(), + sl(), ), ), ChangeNotifierProvider( diff --git a/lib/presentation/providers/account_provider.dart b/lib/presentation/providers/account_provider.dart index 1065662..9a4227f 100644 --- a/lib/presentation/providers/account_provider.dart +++ b/lib/presentation/providers/account_provider.dart @@ -1,15 +1,22 @@ import 'package:flutter/foundation.dart'; import '../../domain/entities/account.dart'; +import '../../domain/entities/enums.dart'; import '../../domain/repositories/account_repository.dart'; import '../../domain/usecases/calculate_net_position.dart'; +import '../../domain/usecases/manage_account.dart'; /// Manages account state and net position calculation. class AccountProvider extends ChangeNotifier { final AccountRepository _accountRepository; final CalculateNetPosition _calculateNetPosition; + final ManageAccount _manageAccount; - AccountProvider(this._accountRepository, this._calculateNetPosition); + AccountProvider( + this._accountRepository, + this._calculateNetPosition, + this._manageAccount, + ); List _accounts = []; NetPositionBreakdown? _breakdown; @@ -27,6 +34,15 @@ class AccountProvider extends ChangeNotifier { bool get isLoading => _isLoading; String? get error => _error; + /// Returns an account by [id] from the in-memory list, or `null`. + Account? getAccountById(String id) { + try { + return _accounts.firstWhere((a) => a.id == id); + } catch (_) { + return null; + } + } + // — Actions — /// Loads all accounts and recalculates net position. @@ -46,10 +62,20 @@ class AccountProvider extends ChangeNotifier { } } - /// Adds a new account and refreshes the list. - Future addAccount(Account account) async { + /// Creates a new account via the use case and refreshes the list. + Future addAccount({ + required String name, + required AccountType type, + required int balance, + String currency = 'IDR', + }) async { try { - await _accountRepository.insert(account); + await _manageAccount.createAccount( + name: name, + type: type, + balance: balance, + currency: currency, + ); await loadAccounts(); } catch (e) { _error = e.toString(); @@ -57,10 +83,10 @@ class AccountProvider extends ChangeNotifier { } } - /// Updates an account and refreshes the list. + /// Updates an account via the use case and refreshes the list. Future updateAccount(Account account) async { try { - await _accountRepository.update(account); + await _manageAccount.updateAccount(account); await loadAccounts(); } catch (e) { _error = e.toString(); @@ -68,14 +94,28 @@ class AccountProvider extends ChangeNotifier { } } - /// Archives an account and refreshes the list. + /// Archives an account via the use case and refreshes the list. Future archiveAccount(String id) async { try { - await _accountRepository.archive(id); + await _manageAccount.archiveAccount(id); await loadAccounts(); } catch (e) { _error = e.toString(); notifyListeners(); } } + + /// Restores an archived account and refreshes the list. + Future unarchiveAccount(String id) async { + try { + final account = await _accountRepository.getById(id); + if (account != null) { + await _accountRepository.update(account.copyWith(isArchived: false)); + await loadAccounts(); + } + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } } diff --git a/lib/presentation/screens/accounts_screen.dart b/lib/presentation/screens/accounts_screen.dart index 533bb26..7b0792c 100644 --- a/lib/presentation/screens/accounts_screen.dart +++ b/lib/presentation/screens/accounts_screen.dart @@ -1,44 +1,312 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../../core/theme/app_colors.dart'; import '../../core/theme/app_typography.dart'; +import '../../domain/entities/account.dart'; +import '../../domain/entities/enums.dart'; import '../painters/paper_background.dart'; +import '../providers/account_provider.dart'; +import '../widgets/account_card.dart'; +import '../widgets/add_edit_account_sheet.dart'; +import '../widgets/net_position_card.dart'; /// The accounts overview screen — lists asset and liability accounts. -class AccountsScreen extends StatelessWidget { +class AccountsScreen extends StatefulWidget { const AccountsScreen({super.key}); + @override + State createState() => _AccountsScreenState(); +} + +class _AccountsScreenState extends State { + @override + void initState() { + super.initState(); + // Load accounts on first build + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().loadAccounts(); + }); + } + @override Widget build(BuildContext context) { return PaperBackground( - child: Center( - child: Padding( - padding: const EdgeInsets.all(32), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon( + child: Stack( + children: [ + Consumer( + builder: (context, provider, _) { + if (provider.isLoading && provider.accounts.isEmpty) { + return const Center( + child: CircularProgressIndicator( + color: AppColors.inkBlue, + ), + ); + } + + if (provider.accounts.isEmpty) { + return _buildEmptyState(); + } + + return _buildAccountsList(provider); + }, + ), + + // — FAB — + Positioned( + right: 16, + bottom: 16, + child: FloatingActionButton( + heroTag: 'accounts_fab', + onPressed: () => _showAddSheet(context), + tooltip: 'Add Account', + child: const Icon(Icons.add), + ), + ), + ], + ), + ); + } + + Widget _buildEmptyState() { + return Center( + child: Padding( + padding: const EdgeInsets.all(32), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + color: AppColors.inkBlue.withValues(alpha: 0.06), + borderRadius: BorderRadius.circular(20), + ), + child: const Icon( Icons.account_balance_wallet_outlined, - size: 48, - color: AppColors.disabled, + size: 40, + color: AppColors.inkBlue, + ), + ), + const SizedBox(height: 20), + Text( + 'No accounts yet', + style: AppTypography.titleMedium.copyWith( + color: AppColors.inkDark, ), - const SizedBox(height: 16), - Text( - 'No accounts yet', - style: AppTypography.bodyLarge.copyWith( - color: AppColors.inkLight, - ), + ), + const SizedBox(height: 8), + Text( + 'Tap + to add your first debit, cash,\nor credit account', + style: AppTypography.bodySmall.copyWith( + color: AppColors.inkLight, ), - const SizedBox(height: 8), - const Text( - 'Add your first debit, cash, or credit account', - style: AppTypography.bodySmall, - textAlign: TextAlign.center, + textAlign: TextAlign.center, + ), + ], + ), + ), + ); + } + + Widget _buildAccountsList(AccountProvider provider) { + final assets = provider.assetAccounts; + final liabilities = provider.liabilityAccounts; + + return ListView( + padding: const EdgeInsets.only(bottom: 80), + children: [ + // — Net Position Card — + NetPositionCard(breakdown: provider.breakdown), + + const SizedBox(height: 12), + + // — Assets Section — + _buildSectionHeader( + title: 'ASSETS', + count: assets.length, + color: AppColors.inkGreen, + ), + + if (assets.isEmpty) + _buildSectionEmpty('No asset accounts') + else + ...assets.map( + (account) => AccountCard( + account: account, + onTap: () => _showEditSheet(context, account), + onLongPress: () => _showArchiveDialog(context, account), + ), + ), + + const SizedBox(height: 16), + + // — Liabilities Section — + _buildSectionHeader( + title: 'LIABILITIES', + count: liabilities.length, + color: AppColors.stampRed, + ), + + if (liabilities.isEmpty) + _buildSectionEmpty('No liability accounts') + else + ...liabilities.map( + (account) => AccountCard( + account: account, + onTap: () => _showEditSheet(context, account), + onLongPress: () => _showArchiveDialog(context, account), + ), + ), + ], + ); + } + + Widget _buildSectionHeader({ + required String title, + required int count, + required Color color, + }) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 4), + child: Row( + children: [ + Container( + width: 3, + height: 16, + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(width: 8), + Text( + title, + style: AppTypography.label.copyWith( + letterSpacing: 2.0, + color: color, + ), + ), + const SizedBox(width: 8), + Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 1), + decoration: BoxDecoration( + color: color.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(8), + ), + child: Text( + count.toString(), + style: AppTypography.label.copyWith( + color: color, + fontSize: 10, ), - ], + ), ), + ], + ), + ); + } + + Widget _buildSectionEmpty(String message) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + child: Text( + message, + style: AppTypography.bodySmall.copyWith( + color: AppColors.disabled, + fontStyle: FontStyle.italic, ), ), ); } + + // — Sheet & Dialog Helpers — + + Future _showAddSheet(BuildContext context) async { + final result = await showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => const AddEditAccountSheet(), + ); + + if (result != null && result is Map && mounted) { + await context.read().addAccount( + name: result['name'] as String, + type: result['type'] as AccountType, + balance: result['balance'] as int, + currency: result['currency'] as String, + ); + } + } + + Future _showEditSheet(BuildContext context, Account account) async { + final result = await showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => AddEditAccountSheet(existingAccount: account), + ); + + if (result != null && result is Account && mounted) { + await context.read().updateAccount(result); + } + } + + Future _showArchiveDialog( + BuildContext context, + Account account, + ) async { + final confirmed = await showDialog( + context: context, + builder: (ctx) => AlertDialog( + backgroundColor: AppColors.paper, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + title: Text( + 'Archive Account', + style: AppTypography.titleMedium.copyWith( + color: AppColors.inkDark, + ), + ), + content: Text( + 'Are you sure you want to archive "${account.name}"?\n\n' + 'The account will be hidden but its transaction history is preserved.', + style: AppTypography.bodyMedium, + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(false), + child: Text( + 'Cancel', + style: AppTypography.bodyMedium.copyWith( + color: AppColors.inkLight, + ), + ), + ), + TextButton( + onPressed: () => Navigator.of(ctx).pop(true), + child: Text( + 'Archive', + style: AppTypography.bodyMedium.copyWith( + color: AppColors.stampRed, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ); + + if (confirmed == true && mounted) { + await context.read().archiveAccount(account.id); + } + } } diff --git a/lib/presentation/widgets/account_card.dart b/lib/presentation/widgets/account_card.dart new file mode 100644 index 0000000..aea5d10 --- /dev/null +++ b/lib/presentation/widgets/account_card.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../domain/entities/account.dart'; +import '../../domain/entities/enums.dart'; +import '../../domain/value_objects/money.dart'; + +/// A card displaying a single account with name, type badge, and balance. +/// +/// - Tap to edit +/// - Long press to archive +class AccountCard extends StatelessWidget { + final Account account; + final VoidCallback? onTap; + final VoidCallback? onLongPress; + + const AccountCard({ + super.key, + required this.account, + this.onTap, + this.onLongPress, + }); + + @override + Widget build(BuildContext context) { + final isAsset = account.isAsset; + final accentColor = isAsset ? AppColors.inkGreen : AppColors.stampRed; + final balance = Money(cents: account.balance, currency: account.currency); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + onLongPress: onLongPress, + borderRadius: BorderRadius.circular(10), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + decoration: BoxDecoration( + color: AppColors.paper, + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: AppColors.divider, + width: 0.5, + ), + ), + child: Row( + children: [ + // — Account icon — + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: accentColor.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + _iconForType(account.type), + color: accentColor, + size: 20, + ), + ), + const SizedBox(width: 12), + + // — Name & type badge — + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + account.name, + style: AppTypography.titleMedium, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 2), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + color: accentColor.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(4), + ), + child: Text( + _labelForType(account.type), + style: AppTypography.label.copyWith( + color: accentColor, + fontSize: 10, + letterSpacing: 1.0, + ), + ), + ), + ], + ), + ), + + // — Balance — + Text( + balance.formatted, + style: AppTypography.amountMedium.copyWith( + color: accentColor, + ), + ), + ], + ), + ), + ), + ), + ); + } + + IconData _iconForType(AccountType type) { + switch (type) { + case AccountType.debit: + return Icons.account_balance_outlined; + case AccountType.cash: + return Icons.payments_outlined; + case AccountType.credit: + return Icons.credit_card_outlined; + } + } + + String _labelForType(AccountType type) { + switch (type) { + case AccountType.debit: + return 'DEBIT'; + case AccountType.cash: + return 'CASH'; + case AccountType.credit: + return 'CREDIT'; + } + } +} diff --git a/lib/presentation/widgets/add_edit_account_sheet.dart b/lib/presentation/widgets/add_edit_account_sheet.dart new file mode 100644 index 0000000..d88243c --- /dev/null +++ b/lib/presentation/widgets/add_edit_account_sheet.dart @@ -0,0 +1,289 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../domain/entities/account.dart'; +import '../../domain/entities/enums.dart'; + +/// Bottom sheet for creating or editing an account. +/// +/// In edit mode, fields are pre-filled with the existing account data. +class AddEditAccountSheet extends StatefulWidget { + /// If provided, the sheet operates in edit mode. + final Account? existingAccount; + + const AddEditAccountSheet({super.key, this.existingAccount}); + + @override + State createState() => _AddEditAccountSheetState(); +} + +class _AddEditAccountSheetState extends State { + final _formKey = GlobalKey(); + late final TextEditingController _nameController; + late final TextEditingController _balanceController; + late final TextEditingController _currencyController; + late AccountType _selectedType; + + bool get _isEditing => widget.existingAccount != null; + + @override + void initState() { + super.initState(); + final account = widget.existingAccount; + _nameController = TextEditingController(text: account?.name ?? ''); + _balanceController = TextEditingController( + text: account != null ? account.balance.toString() : '', + ); + _currencyController = TextEditingController( + text: account?.currency ?? 'IDR', + ); + _selectedType = account?.type ?? AccountType.debit; + } + + @override + void dispose() { + _nameController.dispose(); + _balanceController.dispose(); + _currencyController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only( + left: 24, + right: 24, + top: 16, + bottom: MediaQuery.of(context).viewInsets.bottom + 24, + ), + child: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // — Handle bar — + Center( + child: Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: AppColors.divider, + borderRadius: BorderRadius.circular(2), + ), + ), + ), + const SizedBox(height: 16), + + // — Title — + Text( + _isEditing ? 'Edit Account' : 'New Account', + style: AppTypography.titleLarge.copyWith( + color: AppColors.inkBlue, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 24), + + // — Name field — + TextFormField( + controller: _nameController, + decoration: const InputDecoration( + labelText: 'Account Name', + hintText: 'e.g. BCA Debit, Cash Wallet', + ), + textCapitalization: TextCapitalization.words, + validator: (value) { + if (value == null || value.trim().isEmpty) { + return 'Please enter an account name'; + } + return null; + }, + ), + const SizedBox(height: 16), + + // — Type selector — + Text( + 'ACCOUNT TYPE', + style: AppTypography.label.copyWith(letterSpacing: 1.5), + ), + const SizedBox(height: 8), + Row( + children: AccountType.values.map((type) { + final isSelected = _selectedType == type; + final color = (type == AccountType.credit) + ? AppColors.stampRed + : AppColors.inkGreen; + return Expanded( + child: Padding( + padding: EdgeInsets.only( + right: type != AccountType.credit ? 8 : 0, + ), + child: GestureDetector( + onTap: _isEditing + ? null + : () => setState(() => _selectedType = type), + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: isSelected + ? color.withValues(alpha: 0.1) + : AppColors.paper, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: isSelected ? color : AppColors.divider, + width: isSelected ? 1.5 : 0.5, + ), + ), + child: Column( + children: [ + Icon( + _iconForType(type), + size: 20, + color: isSelected ? color : AppColors.disabled, + ), + const SizedBox(height: 4), + Text( + _labelForType(type), + style: AppTypography.label.copyWith( + color: isSelected + ? color + : AppColors.disabled, + fontSize: 10, + ), + ), + ], + ), + ), + ), + ), + ); + }).toList(), + ), + const SizedBox(height: 16), + + // — Balance field — + Row( + children: [ + // Currency + SizedBox( + width: 80, + child: TextFormField( + controller: _currencyController, + decoration: const InputDecoration( + labelText: 'Currency', + ), + textAlign: TextAlign.center, + textCapitalization: TextCapitalization.characters, + enabled: !_isEditing, + ), + ), + const SizedBox(width: 12), + // Amount + Expanded( + child: TextFormField( + controller: _balanceController, + decoration: InputDecoration( + labelText: _isEditing ? 'Balance' : 'Initial Balance', + hintText: '0', + ), + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + ], + style: AppTypography.amountMedium, + validator: (value) { + if (value == null || value.trim().isEmpty) { + return 'Enter a balance'; + } + final parsed = int.tryParse(value); + if (parsed == null) { + return 'Invalid number'; + } + if (!_isEditing && parsed < 0) { + return 'Balance cannot be negative'; + } + return null; + }, + ), + ), + ], + ), + const SizedBox(height: 24), + + // — Submit button — + SizedBox( + height: 48, + child: ElevatedButton( + onPressed: _submit, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.inkBlue, + foregroundColor: AppColors.paper, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + textStyle: AppTypography.titleMedium.copyWith( + color: AppColors.paper, + ), + ), + child: Text( + _isEditing ? 'Save Changes' : 'Create Account', + ), + ), + ), + ], + ), + ), + ); + } + + void _submit() { + if (!_formKey.currentState!.validate()) return; + + final name = _nameController.text.trim(); + final balance = int.parse(_balanceController.text.trim()); + final currency = _currencyController.text.trim().toUpperCase(); + + if (_isEditing) { + final updated = widget.existingAccount!.copyWith( + name: name, + balance: balance, + ); + Navigator.of(context).pop(updated); + } else { + // Return a map with the create params + Navigator.of(context).pop({ + 'name': name, + 'type': _selectedType, + 'balance': balance, + 'currency': currency, + }); + } + } + + IconData _iconForType(AccountType type) { + switch (type) { + case AccountType.debit: + return Icons.account_balance_outlined; + case AccountType.cash: + return Icons.payments_outlined; + case AccountType.credit: + return Icons.credit_card_outlined; + } + } + + String _labelForType(AccountType type) { + switch (type) { + case AccountType.debit: + return 'DEBIT'; + case AccountType.cash: + return 'CASH'; + case AccountType.credit: + return 'CREDIT'; + } + } +} diff --git a/lib/presentation/widgets/net_position_card.dart b/lib/presentation/widgets/net_position_card.dart new file mode 100644 index 0000000..c1288cd --- /dev/null +++ b/lib/presentation/widgets/net_position_card.dart @@ -0,0 +1,133 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../domain/usecases/calculate_net_position.dart'; +import '../../domain/value_objects/money.dart'; + +/// Displays the Net Position breakdown: Total Assets, Total Liabilities, Net. +class NetPositionCard extends StatelessWidget { + final NetPositionBreakdown? breakdown; + + const NetPositionCard({super.key, required this.breakdown}); + + @override + Widget build(BuildContext context) { + final assets = breakdown?.totalAssets ?? const Money(cents: 0); + final liabilities = breakdown?.totalLiabilities ?? const Money(cents: 0); + final net = breakdown?.netPosition ?? const Money(cents: 0); + + return Container( + margin: const EdgeInsets.fromLTRB(16, 16, 16, 8), + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: AppColors.paperElevated, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColors.divider, width: 0.5), + boxShadow: [ + BoxShadow( + color: AppColors.inkDark.withValues(alpha: 0.04), + blurRadius: 8, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // — Header — + Text( + 'NET POSITION', + style: AppTypography.label.copyWith( + letterSpacing: 2.0, + color: AppColors.inkLight, + ), + ), + const SizedBox(height: 8), + + // — Net Position amount — + Text( + net.formatted, + style: AppTypography.amountLarge.copyWith( + color: net.isNegative ? AppColors.stampRed : AppColors.inkGreen, + fontSize: 32, + ), + ), + const SizedBox(height: 16), + + // — Dotted divider — + _buildDottedDivider(), + const SizedBox(height: 12), + + // — Assets row — + _buildBreakdownRow( + label: 'Total Assets', + amount: assets, + color: AppColors.inkGreen, + icon: Icons.arrow_upward_rounded, + ), + const SizedBox(height: 8), + + // — Liabilities row — + _buildBreakdownRow( + label: 'Total Liabilities', + amount: liabilities, + color: AppColors.stampRed, + icon: Icons.arrow_downward_rounded, + ), + ], + ), + ); + } + + Widget _buildBreakdownRow({ + required String label, + required Money amount, + required Color color, + required IconData icon, + }) { + return Row( + children: [ + Container( + width: 28, + height: 28, + decoration: BoxDecoration( + color: color.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(6), + ), + child: Icon(icon, size: 16, color: color), + ), + const SizedBox(width: 10), + Text(label, style: AppTypography.bodyMedium), + const Spacer(), + Text( + amount.formatted, + style: AppTypography.amountSmall.copyWith(color: color), + ), + ], + ); + } + + Widget _buildDottedDivider() { + return LayoutBuilder( + builder: (context, constraints) { + final dashWidth = 4.0; + final dashSpace = 3.0; + final dashCount = + (constraints.maxWidth / (dashWidth + dashSpace)).floor(); + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: List.generate(dashCount, (_) { + return SizedBox( + width: dashWidth, + height: 1, + child: DecoratedBox( + decoration: BoxDecoration(color: AppColors.divider), + ), + ); + }), + ); + }, + ); + } +} diff --git a/test/domain/usecases/calculate_net_position_test.dart b/test/domain/usecases/calculate_net_position_test.dart new file mode 100644 index 0000000..3cf39df --- /dev/null +++ b/test/domain/usecases/calculate_net_position_test.dart @@ -0,0 +1,240 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/entities/account.dart'; +import 'package:vent_expense_pro/domain/entities/enums.dart'; +import 'package:vent_expense_pro/domain/repositories/account_repository.dart'; +import 'package:vent_expense_pro/domain/usecases/calculate_net_position.dart'; + +/// A simple in-memory fake of [AccountRepository] for testing. +class FakeAccountRepository implements AccountRepository { + final List _accounts = []; + + void seed(List accounts) { + _accounts + ..clear() + ..addAll(accounts); + } + + @override + Future> getAll() async => + _accounts.where((a) => !a.isArchived).toList(); + + @override + Future> getByType(AccountType type) async => + _accounts.where((a) => a.type == type && !a.isArchived).toList(); + + @override + Future getById(String id) async { + try { + return _accounts.firstWhere((a) => a.id == id); + } catch (_) { + return null; + } + } + + @override + Future insert(Account account) async { + _accounts.add(account); + return account; + } + + @override + Future update(Account account) async { + final index = _accounts.indexWhere((a) => a.id == account.id); + if (index != -1) _accounts[index] = account; + return account; + } + + @override + Future archive(String id) async { + final index = _accounts.indexWhere((a) => a.id == id); + if (index != -1) { + _accounts[index] = _accounts[index].copyWith(isArchived: true); + } + } + + @override + Future updateBalance(String id, int newBalance) async { + final index = _accounts.indexWhere((a) => a.id == id); + if (index != -1) { + _accounts[index] = _accounts[index].copyWith(balance: newBalance); + } + } +} + +void main() { + late FakeAccountRepository fakeRepo; + late CalculateNetPosition calculateNetPosition; + final now = DateTime(2026, 2, 21); + + setUp(() { + fakeRepo = FakeAccountRepository(); + calculateNetPosition = CalculateNetPosition(fakeRepo); + }); + + group('CalculateNetPosition.call', () { + test('should return zero for no accounts', () async { + final result = await calculateNetPosition(); + expect(result.cents, 0); + }); + + test('should sum only asset accounts', () async { + fakeRepo.seed([ + Account( + id: '1', + name: 'Debit', + type: AccountType.debit, + balance: 300000, + createdAt: now, + ), + Account( + id: '2', + name: 'Cash', + type: AccountType.cash, + balance: 200000, + createdAt: now, + ), + ]); + + final result = await calculateNetPosition(); + expect(result.cents, 500000); + }); + + test('should subtract liabilities from assets', () async { + fakeRepo.seed([ + Account( + id: '1', + name: 'BCA Debit', + type: AccountType.debit, + balance: 500000, + createdAt: now, + ), + Account( + id: '2', + name: 'Visa Card', + type: AccountType.credit, + balance: 150000, + createdAt: now, + ), + ]); + + final result = await calculateNetPosition(); + expect(result.cents, 350000); // 500K - 150K + }); + + test('should return negative when liabilities exceed assets', () async { + fakeRepo.seed([ + Account( + id: '1', + name: 'Cash', + type: AccountType.cash, + balance: 50000, + createdAt: now, + ), + Account( + id: '2', + name: 'Credit Card', + type: AccountType.credit, + balance: 200000, + createdAt: now, + ), + ]); + + final result = await calculateNetPosition(); + expect(result.cents, -150000); + expect(result.isNegative, true); + }); + }); + + group('CalculateNetPosition.breakdown', () { + test('should return correct breakdown with mixed accounts', () async { + fakeRepo.seed([ + Account( + id: '1', + name: 'BCA Debit', + type: AccountType.debit, + balance: 500000, + createdAt: now, + ), + Account( + id: '2', + name: 'Cash', + type: AccountType.cash, + balance: 200000, + createdAt: now, + ), + Account( + id: '3', + name: 'Visa Card', + type: AccountType.credit, + balance: 150000, + createdAt: now, + ), + ]); + + final breakdown = await calculateNetPosition.breakdown(); + + expect(breakdown.totalAssets.cents, 700000); + expect(breakdown.totalLiabilities.cents, 150000); + expect(breakdown.netPosition.cents, 550000); + }); + + test('should return zero breakdown for empty accounts', () async { + final breakdown = await calculateNetPosition.breakdown(); + + expect(breakdown.totalAssets.cents, 0); + expect(breakdown.totalLiabilities.cents, 0); + expect(breakdown.netPosition.cents, 0); + }); + + test('should exclude archived accounts', () async { + fakeRepo.seed([ + Account( + id: '1', + name: 'Active', + type: AccountType.debit, + balance: 500000, + createdAt: now, + ), + Account( + id: '2', + name: 'Archived', + type: AccountType.debit, + balance: 300000, + isArchived: true, + createdAt: now, + ), + ]); + + final breakdown = await calculateNetPosition.breakdown(); + + // Only the active account should be counted + expect(breakdown.totalAssets.cents, 500000); + expect(breakdown.netPosition.cents, 500000); + }); + + test('should handle only liability accounts', () async { + fakeRepo.seed([ + Account( + id: '1', + name: 'Card A', + type: AccountType.credit, + balance: 100000, + createdAt: now, + ), + Account( + id: '2', + name: 'Card B', + type: AccountType.credit, + balance: 200000, + createdAt: now, + ), + ]); + + final breakdown = await calculateNetPosition.breakdown(); + + expect(breakdown.totalAssets.cents, 0); + expect(breakdown.totalLiabilities.cents, 300000); + expect(breakdown.netPosition.cents, -300000); + }); + }); +} diff --git a/test/domain/usecases/manage_account_test.dart b/test/domain/usecases/manage_account_test.dart new file mode 100644 index 0000000..a2608ed --- /dev/null +++ b/test/domain/usecases/manage_account_test.dart @@ -0,0 +1,247 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/entities/account.dart'; +import 'package:vent_expense_pro/domain/entities/enums.dart'; +import 'package:vent_expense_pro/domain/repositories/account_repository.dart'; +import 'package:vent_expense_pro/domain/usecases/manage_account.dart'; + +/// A simple in-memory fake of [AccountRepository] for testing. +class FakeAccountRepository implements AccountRepository { + final List _accounts = []; + + @override + Future> getAll() async => + _accounts.where((a) => !a.isArchived).toList(); + + @override + Future> getByType(AccountType type) async => + _accounts.where((a) => a.type == type && !a.isArchived).toList(); + + @override + Future getById(String id) async { + try { + return _accounts.firstWhere((a) => a.id == id); + } catch (_) { + return null; + } + } + + @override + Future insert(Account account) async { + _accounts.add(account); + return account; + } + + @override + Future update(Account account) async { + final index = _accounts.indexWhere((a) => a.id == account.id); + if (index != -1) { + _accounts[index] = account; + } + return account; + } + + @override + Future archive(String id) async { + final index = _accounts.indexWhere((a) => a.id == id); + if (index != -1) { + _accounts[index] = _accounts[index].copyWith(isArchived: true); + } + } + + @override + Future updateBalance(String id, int newBalance) async { + final index = _accounts.indexWhere((a) => a.id == id); + if (index != -1) { + _accounts[index] = _accounts[index].copyWith(balance: newBalance); + } + } +} + +void main() { + late FakeAccountRepository fakeRepo; + late ManageAccount manageAccount; + + setUp(() { + fakeRepo = FakeAccountRepository(); + manageAccount = ManageAccount(fakeRepo); + }); + + group('ManageAccount.createAccount', () { + test('should create an account with valid inputs', () async { + final account = await manageAccount.createAccount( + name: 'BCA Debit', + type: AccountType.debit, + balance: 500000, + ); + + expect(account.name, 'BCA Debit'); + expect(account.type, AccountType.debit); + expect(account.balance, 500000); + expect(account.currency, 'IDR'); + expect(account.isArchived, false); + expect(account.id, isNotEmpty); + }); + + test('should trim whitespace from name', () async { + final account = await manageAccount.createAccount( + name: ' Cash Wallet ', + type: AccountType.cash, + balance: 100000, + ); + + expect(account.name, 'Cash Wallet'); + }); + + test('should throw when name is empty', () async { + expect( + () => manageAccount.createAccount( + name: '', + type: AccountType.debit, + balance: 0, + ), + throwsA(isA()), + ); + }); + + test('should throw when name is only whitespace', () async { + expect( + () => manageAccount.createAccount( + name: ' ', + type: AccountType.debit, + balance: 0, + ), + throwsA(isA()), + ); + }); + + test('should throw when balance is negative', () async { + expect( + () => manageAccount.createAccount( + name: 'Test', + type: AccountType.debit, + balance: -100, + ), + throwsA(isA()), + ); + }); + + test('should accept zero balance', () async { + final account = await manageAccount.createAccount( + name: 'Empty Account', + type: AccountType.cash, + balance: 0, + ); + + expect(account.balance, 0); + }); + + test('should accept custom currency', () async { + final account = await manageAccount.createAccount( + name: 'USD Account', + type: AccountType.debit, + balance: 1000, + currency: 'USD', + ); + + expect(account.currency, 'USD'); + }); + + test('should generate unique IDs', () async { + final a = await manageAccount.createAccount( + name: 'Account A', + type: AccountType.debit, + balance: 100, + ); + final b = await manageAccount.createAccount( + name: 'Account B', + type: AccountType.cash, + balance: 200, + ); + + expect(a.id, isNot(equals(b.id))); + }); + + test('should persist to repository', () async { + await manageAccount.createAccount( + name: 'Persisted', + type: AccountType.debit, + balance: 300, + ); + + final allAccounts = await fakeRepo.getAll(); + expect(allAccounts, hasLength(1)); + expect(allAccounts.first.name, 'Persisted'); + }); + }); + + group('ManageAccount.updateAccount', () { + test('should update account name', () async { + final original = await manageAccount.createAccount( + name: 'Old Name', + type: AccountType.debit, + balance: 100, + ); + + final updated = await manageAccount.updateAccount( + original.copyWith(name: 'New Name'), + ); + + expect(updated.name, 'New Name'); + }); + + test('should throw when updated name is empty', () async { + final original = await manageAccount.createAccount( + name: 'Valid', + type: AccountType.debit, + balance: 100, + ); + + expect( + () => manageAccount.updateAccount(original.copyWith(name: '')), + throwsA(isA()), + ); + }); + + test('should trim updated name', () async { + final original = await manageAccount.createAccount( + name: 'Original', + type: AccountType.debit, + balance: 100, + ); + + final updated = await manageAccount.updateAccount( + original.copyWith(name: ' Trimmed '), + ); + + expect(updated.name, 'Trimmed'); + }); + }); + + group('ManageAccount.archiveAccount', () { + test('should archive an existing account', () async { + final account = await manageAccount.createAccount( + name: 'To Archive', + type: AccountType.cash, + balance: 100, + ); + + await manageAccount.archiveAccount(account.id); + + // Archived accounts don't appear in getAll() + final all = await fakeRepo.getAll(); + expect(all, isEmpty); + + // But can still be found by ID + final found = await fakeRepo.getById(account.id); + expect(found, isNotNull); + expect(found!.isArchived, true); + }); + + test('should throw when account not found', () async { + expect( + () => manageAccount.archiveAccount('nonexistent-id'), + throwsA(isA()), + ); + }); + }); +} From c71907a2b232f029288381a76d6be617df38dc6e Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 01:55:38 +0700 Subject: [PATCH 03/13] feat account-management-1.0.0: conditionally display FloatingActionButton based on current screen index --- lib/main.dart | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 301a863..4ae6565 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -109,13 +109,15 @@ class _HomeShellState extends State { ), ], ), - floatingActionButton: FloatingActionButton( - onPressed: () { - // TODO: Open Quick-Add bottom sheet - }, - tooltip: 'Log Transaction', - child: const Icon(Icons.add), - ), + floatingActionButton: _currentIndex == 1 + ? null // Accounts screen manages its own FAB + : FloatingActionButton( + onPressed: () { + // TODO: Open Quick-Add bottom sheet + }, + tooltip: 'Log Transaction', + child: const Icon(Icons.add), + ), ); } } From cb51a6e7611cd6b73cf3440cc5f54b787a2b29d2 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 08:21:54 +0700 Subject: [PATCH 04/13] feat: Add CI workflow and refactor for lint compliance --- .github/workflows/ci.yml | 33 +++++++++++++++ lib/core/di/service_locator.dart | 19 +++------ lib/core/utils/date_formatter.dart | 12 ++---- lib/data/datasources/local_database.dart | 41 ++++++++++++++----- .../category_repository_impl.dart | 6 +-- .../transaction_repository_impl.dart | 21 ++-------- lib/domain/entities/account.dart | 16 ++++---- lib/domain/entities/category.dart | 7 +--- lib/domain/entities/transaction.dart | 20 ++++----- lib/domain/usecases/log_transaction.dart | 14 +++---- lib/domain/usecases/manage_account.dart | 2 +- lib/domain/usecases/settle_credit_bill.dart | 10 +---- lib/main.dart | 10 +---- .../painters/paper_background.dart | 17 ++------ .../providers/account_provider.dart | 3 +- lib/presentation/screens/accounts_screen.dart | 41 ++++++++----------- lib/presentation/screens/ledger_screen.dart | 14 ++----- lib/presentation/widgets/account_card.dart | 5 +-- .../widgets/add_edit_account_sheet.dart | 16 ++------ .../widgets/net_position_card.dart | 10 ++--- 20 files changed, 143 insertions(+), 174 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7cf6f14 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,33 @@ +name: VentExpensePro CI + +on: + pull_request: + branches: + - master + - staging + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + channel: 'stable' + flutter-version: '3.27.1' # Matching potential local version or using stable + + - name: Install dependencies + run: flutter pub get + + - name: Verify formatting + run: dart format --output=none --set-exit-if-changed . + + - name: Analyze project source + run: flutter analyze + + - name: Run tests + run: flutter test diff --git a/lib/core/di/service_locator.dart b/lib/core/di/service_locator.dart index cb2e7d0..af1e684 100644 --- a/lib/core/di/service_locator.dart +++ b/lib/core/di/service_locator.dart @@ -17,27 +17,20 @@ final sl = GetIt.instance; /// Registers all dependencies. Call once at app startup. Future initServiceLocator() async { // — Repositories — - sl.registerLazySingleton( - () => AccountRepositoryImpl(), - ); + sl.registerLazySingleton(() => AccountRepositoryImpl()); sl.registerLazySingleton( () => TransactionRepositoryImpl(), ); - sl.registerLazySingleton( - () => CategoryRepositoryImpl(), - ); + sl.registerLazySingleton(() => CategoryRepositoryImpl()); // — Use Cases — - sl.registerFactory( - () => CalculateNetPosition(sl()), - ); + sl.registerFactory(() => CalculateNetPosition(sl())); sl.registerFactory( () => LogTransaction(sl(), sl()), ); sl.registerFactory( - () => SettleCreditBill(sl(), sl()), - ); - sl.registerFactory( - () => ManageAccount(sl()), + () => + SettleCreditBill(sl(), sl()), ); + sl.registerFactory(() => ManageAccount(sl())); } diff --git a/lib/core/utils/date_formatter.dart b/lib/core/utils/date_formatter.dart index 276466e..7c190ff 100644 --- a/lib/core/utils/date_formatter.dart +++ b/lib/core/utils/date_formatter.dart @@ -5,20 +5,16 @@ class DateFormatter { DateFormatter._(); /// Full date: "21 February 2026" - static String full(DateTime date) => - DateFormat('d MMMM yyyy').format(date); + static String full(DateTime date) => DateFormat('d MMMM yyyy').format(date); /// Short date: "21 Feb 2026" - static String short(DateTime date) => - DateFormat('d MMM yyyy').format(date); + static String short(DateTime date) => DateFormat('d MMM yyyy').format(date); /// Day and month only: "21 Feb" - static String dayMonth(DateTime date) => - DateFormat('d MMM').format(date); + static String dayMonth(DateTime date) => DateFormat('d MMM').format(date); /// Time only: "14:30" - static String time(DateTime date) => - DateFormat('HH:mm').format(date); + static String time(DateTime date) => DateFormat('HH:mm').format(date); /// Relative day label: "Today", "Yesterday", or short date. static String relative(DateTime date) { diff --git a/lib/data/datasources/local_database.dart b/lib/data/datasources/local_database.dart index 7396621..957ab50 100644 --- a/lib/data/datasources/local_database.dart +++ b/lib/data/datasources/local_database.dart @@ -18,11 +18,7 @@ class LocalDatabase { final dbPath = await getDatabasesPath(); final path = '$dbPath/$_dbName'; - return openDatabase( - path, - version: _dbVersion, - onCreate: _onCreate, - ); + return openDatabase(path, version: _dbVersion, onCreate: _onCreate); } static Future _onCreate(Database db, int version) async { @@ -75,14 +71,39 @@ class LocalDatabase { static Future _seedCategories(Database db) async { const defaults = [ {'id': 'food', 'name': 'Food', 'icon': 'food', 'is_custom': 0}, - {'id': 'transport', 'name': 'Transport', 'icon': 'transport', 'is_custom': 0}, + { + 'id': 'transport', + 'name': 'Transport', + 'icon': 'transport', + 'is_custom': 0, + }, {'id': 'bills', 'name': 'Bills', 'icon': 'bills', 'is_custom': 0}, - {'id': 'shopping', 'name': 'Shopping', 'icon': 'shopping', 'is_custom': 0}, - {'id': 'entertainment', 'name': 'Entertainment', 'icon': 'entertainment', 'is_custom': 0}, + { + 'id': 'shopping', + 'name': 'Shopping', + 'icon': 'shopping', + 'is_custom': 0, + }, + { + 'id': 'entertainment', + 'name': 'Entertainment', + 'icon': 'entertainment', + 'is_custom': 0, + }, {'id': 'health', 'name': 'Health', 'icon': 'health', 'is_custom': 0}, - {'id': 'education', 'name': 'Education', 'icon': 'education', 'is_custom': 0}, + { + 'id': 'education', + 'name': 'Education', + 'icon': 'education', + 'is_custom': 0, + }, {'id': 'other', 'name': 'Other', 'icon': 'other', 'is_custom': 0}, - {'id': 'settlement', 'name': 'Settlement', 'icon': 'settlement', 'is_custom': 0}, + { + 'id': 'settlement', + 'name': 'Settlement', + 'icon': 'settlement', + 'is_custom': 0, + }, ]; final batch = db.batch(); diff --git a/lib/data/repositories/category_repository_impl.dart b/lib/data/repositories/category_repository_impl.dart index 338d6e7..df323e4 100644 --- a/lib/data/repositories/category_repository_impl.dart +++ b/lib/data/repositories/category_repository_impl.dart @@ -49,10 +49,6 @@ class CategoryRepositoryImpl implements CategoryRepository { @override Future delete(String id) async { final db = await LocalDatabase.database; - await db.delete( - 'categories', - where: 'id = ?', - whereArgs: [id], - ); + await db.delete('categories', where: 'id = ?', whereArgs: [id]); } } diff --git a/lib/data/repositories/transaction_repository_impl.dart b/lib/data/repositories/transaction_repository_impl.dart index 85f54ed..230f198 100644 --- a/lib/data/repositories/transaction_repository_impl.dart +++ b/lib/data/repositories/transaction_repository_impl.dart @@ -8,10 +8,7 @@ class TransactionRepositoryImpl implements TransactionRepository { @override Future> getAll() async { final db = await LocalDatabase.database; - final maps = await db.query( - 'transactions', - orderBy: 'date_time DESC', - ); + final maps = await db.query('transactions', orderBy: 'date_time DESC'); return maps.map(TransactionModel.fromMap).toList(); } @@ -28,18 +25,12 @@ class TransactionRepositoryImpl implements TransactionRepository { } @override - Future> getByDateRange( - DateTime start, - DateTime end, - ) async { + Future> getByDateRange(DateTime start, DateTime end) async { final db = await LocalDatabase.database; final maps = await db.query( 'transactions', where: 'date_time >= ? AND date_time <= ?', - whereArgs: [ - start.millisecondsSinceEpoch, - end.millisecondsSinceEpoch, - ], + whereArgs: [start.millisecondsSinceEpoch, end.millisecondsSinceEpoch], orderBy: 'date_time DESC', ); return maps.map(TransactionModel.fromMap).toList(); @@ -82,10 +73,6 @@ class TransactionRepositoryImpl implements TransactionRepository { @override Future delete(String id) async { final db = await LocalDatabase.database; - await db.delete( - 'transactions', - where: 'id = ?', - whereArgs: [id], - ); + await db.delete('transactions', where: 'id = ?', whereArgs: [id]); } } diff --git a/lib/domain/entities/account.dart b/lib/domain/entities/account.dart index fdc4ee8..62429ea 100644 --- a/lib/domain/entities/account.dart +++ b/lib/domain/entities/account.dart @@ -65,12 +65,12 @@ class Account extends Equatable { @override List get props => [ - id, - name, - type, - balance, - currency, - isArchived, - createdAt, - ]; + id, + name, + type, + balance, + currency, + isArchived, + createdAt, + ]; } diff --git a/lib/domain/entities/category.dart b/lib/domain/entities/category.dart index a18ebab..1d2252d 100644 --- a/lib/domain/entities/category.dart +++ b/lib/domain/entities/category.dart @@ -22,12 +22,7 @@ class Category extends Equatable { }); /// Returns a copy with the given fields replaced. - Category copyWith({ - String? id, - String? name, - String? icon, - bool? isCustom, - }) { + Category copyWith({String? id, String? name, String? icon, bool? isCustom}) { return Category( id: id ?? this.id, name: name ?? this.name, diff --git a/lib/domain/entities/transaction.dart b/lib/domain/entities/transaction.dart index a396d7e..61155e4 100644 --- a/lib/domain/entities/transaction.dart +++ b/lib/domain/entities/transaction.dart @@ -70,14 +70,14 @@ class Transaction extends Equatable { @override List get props => [ - id, - amount, - type, - categoryId, - accountId, - toAccountId, - note, - isSettlement, - dateTime, - ]; + id, + amount, + type, + categoryId, + accountId, + toAccountId, + note, + isSettlement, + dateTime, + ]; } diff --git a/lib/domain/usecases/log_transaction.dart b/lib/domain/usecases/log_transaction.dart index 96a42b4..b687c7f 100644 --- a/lib/domain/usecases/log_transaction.dart +++ b/lib/domain/usecases/log_transaction.dart @@ -19,12 +19,11 @@ class LogTransaction { /// Throws [ArgumentError] if the referenced accounts don't exist. Future call(Transaction transaction) async { // Validate source account exists - final sourceAccount = - await _accountRepository.getById(transaction.accountId); + final sourceAccount = await _accountRepository.getById( + transaction.accountId, + ); if (sourceAccount == null) { - throw ArgumentError( - 'Source account not found: ${transaction.accountId}', - ); + throw ArgumentError('Source account not found: ${transaction.accountId}'); } switch (transaction.type) { @@ -53,8 +52,9 @@ class LogTransaction { if (transaction.toAccountId == null) { throw ArgumentError('Transfer requires a destination account'); } - final destAccount = - await _accountRepository.getById(transaction.toAccountId!); + final destAccount = await _accountRepository.getById( + transaction.toAccountId!, + ); if (destAccount == null) { throw ArgumentError( 'Destination account not found: ${transaction.toAccountId}', diff --git a/lib/domain/usecases/manage_account.dart b/lib/domain/usecases/manage_account.dart index eced03d..c6196af 100644 --- a/lib/domain/usecases/manage_account.dart +++ b/lib/domain/usecases/manage_account.dart @@ -10,7 +10,7 @@ class ManageAccount { final Uuid _uuid; ManageAccount(this._accountRepository, {Uuid? uuid}) - : _uuid = uuid ?? const Uuid(); + : _uuid = uuid ?? const Uuid(); /// Creates a new account after validation. /// diff --git a/lib/domain/usecases/settle_credit_bill.dart b/lib/domain/usecases/settle_credit_bill.dart index 530ee81..c600dd2 100644 --- a/lib/domain/usecases/settle_credit_bill.dart +++ b/lib/domain/usecases/settle_credit_bill.dart @@ -59,16 +59,10 @@ class SettleCreditBill { } // Deduct from asset - await _accountRepository.updateBalance( - source.id, - source.balance - amount, - ); + await _accountRepository.updateBalance(source.id, source.balance - amount); // Reduce credit liability - await _accountRepository.updateBalance( - credit.id, - credit.balance - amount, - ); + await _accountRepository.updateBalance(credit.id, credit.balance - amount); // Log as a settlement transfer final settlement = Transaction( diff --git a/lib/main.dart b/lib/main.dart index 4ae6565..9236964 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -68,11 +68,7 @@ class HomeShell extends StatefulWidget { class _HomeShellState extends State { int _currentIndex = 0; - static const _screens = [ - LedgerScreen(), - AccountsScreen(), - ReportsScreen(), - ]; + static const _screens = [LedgerScreen(), AccountsScreen(), ReportsScreen()]; static const _titles = ['Ledger', 'Accounts', 'Reports']; @@ -82,9 +78,7 @@ class _HomeShellState extends State { appBar: AppBar( title: Text( _titles[_currentIndex], - style: AppTypography.titleLarge.copyWith( - color: AppColors.inkBlue, - ), + style: AppTypography.titleLarge.copyWith(color: AppColors.inkBlue), ), ), body: _screens[_currentIndex], diff --git a/lib/presentation/painters/paper_background.dart b/lib/presentation/painters/paper_background.dart index 4966217..ed9b2da 100644 --- a/lib/presentation/painters/paper_background.dart +++ b/lib/presentation/painters/paper_background.dart @@ -31,11 +31,7 @@ class PaperBackgroundPainter extends CustomPainter { const lineSpacing = 32.0; for (double y = lineSpacing; y < size.height; y += lineSpacing) { - canvas.drawLine( - Offset(24, y), - Offset(size.width - 24, y), - linePaint, - ); + canvas.drawLine(Offset(24, y), Offset(size.width - 24, y), linePaint); } // — Left margin line (like a real ruled page) — @@ -43,11 +39,7 @@ class PaperBackgroundPainter extends CustomPainter { ..color = AppColors.stampRed.withValues(alpha: 0.15) ..strokeWidth = 1.0; - canvas.drawLine( - const Offset(48, 0), - Offset(48, size.height), - marginPaint, - ); + canvas.drawLine(const Offset(48, 0), Offset(48, size.height), marginPaint); } @override @@ -62,9 +54,6 @@ class PaperBackground extends StatelessWidget { @override Widget build(BuildContext context) { - return CustomPaint( - painter: PaperBackgroundPainter(), - child: child, - ); + return CustomPaint(painter: PaperBackgroundPainter(), child: child); } } diff --git a/lib/presentation/providers/account_provider.dart b/lib/presentation/providers/account_provider.dart index 9a4227f..9dd3e20 100644 --- a/lib/presentation/providers/account_provider.dart +++ b/lib/presentation/providers/account_provider.dart @@ -26,8 +26,7 @@ class AccountProvider extends ChangeNotifier { // — Getters — List get accounts => _accounts; - List get assetAccounts => - _accounts.where((a) => a.isAsset).toList(); + List get assetAccounts => _accounts.where((a) => a.isAsset).toList(); List get liabilityAccounts => _accounts.where((a) => a.isLiability).toList(); NetPositionBreakdown? get breakdown => _breakdown; diff --git a/lib/presentation/screens/accounts_screen.dart b/lib/presentation/screens/accounts_screen.dart index 7b0792c..ef8de91 100644 --- a/lib/presentation/screens/accounts_screen.dart +++ b/lib/presentation/screens/accounts_screen.dart @@ -38,9 +38,7 @@ class _AccountsScreenState extends State { builder: (context, provider, _) { if (provider.isLoading && provider.accounts.isEmpty) { return const Center( - child: CircularProgressIndicator( - color: AppColors.inkBlue, - ), + child: CircularProgressIndicator(color: AppColors.inkBlue), ); } @@ -196,10 +194,7 @@ class _AccountsScreenState extends State { ), child: Text( count.toString(), - style: AppTypography.label.copyWith( - color: color, - fontSize: 10, - ), + style: AppTypography.label.copyWith(color: color, fontSize: 10), ), ), ], @@ -223,6 +218,7 @@ class _AccountsScreenState extends State { // — Sheet & Dialog Helpers — Future _showAddSheet(BuildContext context) async { + final provider = context.read(); final result = await showModalBottomSheet( context: context, isScrollControlled: true, @@ -234,16 +230,17 @@ class _AccountsScreenState extends State { ); if (result != null && result is Map && mounted) { - await context.read().addAccount( - name: result['name'] as String, - type: result['type'] as AccountType, - balance: result['balance'] as int, - currency: result['currency'] as String, - ); + await provider.addAccount( + name: result['name'] as String, + type: result['type'] as AccountType, + balance: result['balance'] as int, + currency: result['currency'] as String, + ); } } Future _showEditSheet(BuildContext context, Account account) async { + final provider = context.read(); final result = await showModalBottomSheet( context: context, isScrollControlled: true, @@ -255,26 +252,20 @@ class _AccountsScreenState extends State { ); if (result != null && result is Account && mounted) { - await context.read().updateAccount(result); + await provider.updateAccount(result); } } - Future _showArchiveDialog( - BuildContext context, - Account account, - ) async { + Future _showArchiveDialog(BuildContext context, Account account) async { + final provider = context.read(); final confirmed = await showDialog( context: context, builder: (ctx) => AlertDialog( backgroundColor: AppColors.paper, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), title: Text( 'Archive Account', - style: AppTypography.titleMedium.copyWith( - color: AppColors.inkDark, - ), + style: AppTypography.titleMedium.copyWith(color: AppColors.inkDark), ), content: Text( 'Are you sure you want to archive "${account.name}"?\n\n' @@ -306,7 +297,7 @@ class _AccountsScreenState extends State { ); if (confirmed == true && mounted) { - await context.read().archiveAccount(account.id); + await provider.archiveAccount(account.id); } } } diff --git a/lib/presentation/screens/ledger_screen.dart b/lib/presentation/screens/ledger_screen.dart index 71bc066..4bfb2de 100644 --- a/lib/presentation/screens/ledger_screen.dart +++ b/lib/presentation/screens/ledger_screen.dart @@ -24,9 +24,7 @@ class LedgerScreen extends StatelessWidget { children: [ Text( 'NET POSITION', - style: AppTypography.label.copyWith( - letterSpacing: 2.0, - ), + style: AppTypography.label.copyWith(letterSpacing: 2.0), ), const SizedBox(height: 8), Text( @@ -114,15 +112,9 @@ class LedgerScreen extends StatelessWidget { Widget _buildSummaryItem(String label, String amount, Color color) { return Column( children: [ - Text( - label.toUpperCase(), - style: AppTypography.label, - ), + Text(label.toUpperCase(), style: AppTypography.label), const SizedBox(height: 4), - Text( - amount, - style: AppTypography.amountMedium.copyWith(color: color), - ), + Text(amount, style: AppTypography.amountMedium.copyWith(color: color)), ], ); } diff --git a/lib/presentation/widgets/account_card.dart b/lib/presentation/widgets/account_card.dart index aea5d10..526e5cc 100644 --- a/lib/presentation/widgets/account_card.dart +++ b/lib/presentation/widgets/account_card.dart @@ -41,10 +41,7 @@ class AccountCard extends StatelessWidget { decoration: BoxDecoration( color: AppColors.paper, borderRadius: BorderRadius.circular(10), - border: Border.all( - color: AppColors.divider, - width: 0.5, - ), + border: Border.all(color: AppColors.divider, width: 0.5), ), child: Row( children: [ diff --git a/lib/presentation/widgets/add_edit_account_sheet.dart b/lib/presentation/widgets/add_edit_account_sheet.dart index d88243c..ea9b7af 100644 --- a/lib/presentation/widgets/add_edit_account_sheet.dart +++ b/lib/presentation/widgets/add_edit_account_sheet.dart @@ -150,9 +150,7 @@ class _AddEditAccountSheetState extends State { Text( _labelForType(type), style: AppTypography.label.copyWith( - color: isSelected - ? color - : AppColors.disabled, + color: isSelected ? color : AppColors.disabled, fontSize: 10, ), ), @@ -174,9 +172,7 @@ class _AddEditAccountSheetState extends State { width: 80, child: TextFormField( controller: _currencyController, - decoration: const InputDecoration( - labelText: 'Currency', - ), + decoration: const InputDecoration(labelText: 'Currency'), textAlign: TextAlign.center, textCapitalization: TextCapitalization.characters, enabled: !_isEditing, @@ -192,9 +188,7 @@ class _AddEditAccountSheetState extends State { hintText: '0', ), keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - ], + inputFormatters: [FilteringTextInputFormatter.digitsOnly], style: AppTypography.amountMedium, validator: (value) { if (value == null || value.trim().isEmpty) { @@ -230,9 +224,7 @@ class _AddEditAccountSheetState extends State { color: AppColors.paper, ), ), - child: Text( - _isEditing ? 'Save Changes' : 'Create Account', - ), + child: Text(_isEditing ? 'Save Changes' : 'Create Account'), ), ), ], diff --git a/lib/presentation/widgets/net_position_card.dart b/lib/presentation/widgets/net_position_card.dart index c1288cd..8bed7a3 100644 --- a/lib/presentation/widgets/net_position_card.dart +++ b/lib/presentation/widgets/net_position_card.dart @@ -111,14 +111,14 @@ class NetPositionCard extends StatelessWidget { Widget _buildDottedDivider() { return LayoutBuilder( builder: (context, constraints) { - final dashWidth = 4.0; - final dashSpace = 3.0; - final dashCount = - (constraints.maxWidth / (dashWidth + dashSpace)).floor(); + const dashWidth = 4.0; + const dashSpace = 3.0; + final dashCount = (constraints.maxWidth / (dashWidth + dashSpace)) + .floor(); return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: List.generate(dashCount, (_) { - return SizedBox( + return const SizedBox( width: dashWidth, height: 1, child: DecoratedBox( From f1ab5e98a6c7079178b6ddc65548c7040c9dbf96 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 09:14:54 +0700 Subject: [PATCH 05/13] feat account-management-1.0.0: Implement comprehensive transaction and category management with new UI components and logic. --- lib/core/di/service_locator.dart | 8 + lib/core/utils/category_icon_mapper.dart | 71 +++ lib/domain/usecases/manage_transaction.dart | 143 +++++ lib/main.dart | 93 ++- .../providers/category_provider.dart | 102 ++++ .../providers/transaction_provider.dart | 125 ++++- lib/presentation/screens/ledger_screen.dart | 445 ++++++++++++--- .../widgets/manage_categories_sheet.dart | 325 +++++++++++ .../widgets/quick_add_transaction_sheet.dart | 528 ++++++++++++++++++ lib/presentation/widgets/receipt_card.dart | 142 +++++ .../widgets/receipt_date_header.dart | 50 ++ .../usecases/manage_transaction_test.dart | 345 ++++++++++++ 12 files changed, 2273 insertions(+), 104 deletions(-) create mode 100644 lib/core/utils/category_icon_mapper.dart create mode 100644 lib/domain/usecases/manage_transaction.dart create mode 100644 lib/presentation/providers/category_provider.dart create mode 100644 lib/presentation/widgets/manage_categories_sheet.dart create mode 100644 lib/presentation/widgets/quick_add_transaction_sheet.dart create mode 100644 lib/presentation/widgets/receipt_card.dart create mode 100644 lib/presentation/widgets/receipt_date_header.dart create mode 100644 test/domain/usecases/manage_transaction_test.dart diff --git a/lib/core/di/service_locator.dart b/lib/core/di/service_locator.dart index af1e684..7aa4a31 100644 --- a/lib/core/di/service_locator.dart +++ b/lib/core/di/service_locator.dart @@ -9,6 +9,7 @@ import '../../domain/repositories/transaction_repository.dart'; import '../../domain/usecases/calculate_net_position.dart'; import '../../domain/usecases/log_transaction.dart'; import '../../domain/usecases/manage_account.dart'; +import '../../domain/usecases/manage_transaction.dart'; import '../../domain/usecases/settle_credit_bill.dart'; /// Global service locator instance. @@ -33,4 +34,11 @@ Future initServiceLocator() async { SettleCreditBill(sl(), sl()), ); sl.registerFactory(() => ManageAccount(sl())); + sl.registerFactory( + () => ManageTransaction( + sl(), + sl(), + sl(), + ), + ); } diff --git a/lib/core/utils/category_icon_mapper.dart b/lib/core/utils/category_icon_mapper.dart new file mode 100644 index 0000000..adc59f2 --- /dev/null +++ b/lib/core/utils/category_icon_mapper.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; + +import '../../domain/entities/enums.dart'; +import '../theme/app_colors.dart'; + +/// Maps category icon identifiers to Material [IconData]. +class CategoryIconMapper { + CategoryIconMapper._(); + + /// Returns the [IconData] for a given category [iconId]. + static IconData iconFor(String iconId) { + switch (iconId) { + case 'food': + return Icons.restaurant_outlined; + case 'transport': + return Icons.directions_bus_outlined; + case 'bills': + return Icons.receipt_outlined; + case 'shopping': + return Icons.shopping_bag_outlined; + case 'entertainment': + return Icons.movie_outlined; + case 'health': + return Icons.favorite_outlined; + case 'education': + return Icons.school_outlined; + case 'other': + return Icons.more_horiz_outlined; + case 'settlement': + return Icons.sync_alt_outlined; + default: + return Icons.category_outlined; + } + } + + /// Returns the accent [Color] for a given [TransactionType]. + static Color colorForType(TransactionType type) { + switch (type) { + case TransactionType.expense: + return AppColors.stampRed; + case TransactionType.income: + return AppColors.inkGreen; + case TransactionType.transfer: + return AppColors.transferAmber; + } + } + + /// Returns a human-readable label for a [TransactionType]. + static String labelForType(TransactionType type) { + switch (type) { + case TransactionType.expense: + return 'Expense'; + case TransactionType.income: + return 'Income'; + case TransactionType.transfer: + return 'Transfer'; + } + } + + /// Returns the prefix sign for display (e.g., "−" for expense, "+" for income). + static String signForType(TransactionType type) { + switch (type) { + case TransactionType.expense: + return '− '; + case TransactionType.income: + return '+ '; + case TransactionType.transfer: + return ''; + } + } +} diff --git a/lib/domain/usecases/manage_transaction.dart b/lib/domain/usecases/manage_transaction.dart new file mode 100644 index 0000000..e9f4f3e --- /dev/null +++ b/lib/domain/usecases/manage_transaction.dart @@ -0,0 +1,143 @@ +import '../entities/enums.dart'; +import '../entities/transaction.dart'; +import '../repositories/account_repository.dart'; +import '../repositories/transaction_repository.dart'; +import 'log_transaction.dart'; + +/// Encapsulates create, update, and delete operations for transactions, +/// ensuring account balances are always kept in sync. +class ManageTransaction { + final TransactionRepository _transactionRepository; + final AccountRepository _accountRepository; + final LogTransaction _logTransaction; + + ManageTransaction( + this._transactionRepository, + this._accountRepository, + this._logTransaction, + ); + + /// Creates a new transaction — delegates to [LogTransaction]. + Future create(Transaction transaction) { + return _logTransaction(transaction); + } + + /// Updates an existing transaction: reverses old balance changes, + /// applies new ones, and persists the update. + Future update( + Transaction oldTxn, + Transaction newTxn, + ) async { + // 1. Reverse the old transaction's balance effects + await _reverseBalance(oldTxn); + + // 2. Apply the new transaction's balance effects + await _applyBalance(newTxn); + + // 3. Persist the updated transaction + return _transactionRepository.update(newTxn); + } + + /// Deletes a transaction: reverses its balance changes and removes the record. + Future delete(Transaction transaction) async { + await _reverseBalance(transaction); + await _transactionRepository.delete(transaction.id); + } + + // ——— Private helpers ——— + + /// Reverses the balance effects of a transaction (undo). + Future _reverseBalance(Transaction txn) async { + final source = await _accountRepository.getById(txn.accountId); + if (source == null) return; // account may have been archived / deleted + + switch (txn.type) { + case TransactionType.expense: + if (source.isLiability) { + // Was increased → decrease it back + await _accountRepository.updateBalance( + source.id, + source.balance - txn.amount, + ); + } else { + // Was decreased → increase it back + await _accountRepository.updateBalance( + source.id, + source.balance + txn.amount, + ); + } + + case TransactionType.income: + // Was increased → decrease it back + await _accountRepository.updateBalance( + source.id, + source.balance - txn.amount, + ); + + case TransactionType.transfer: + // Reverse source (was decreased → increase) + await _accountRepository.updateBalance( + source.id, + source.balance + txn.amount, + ); + // Reverse destination (was increased → decrease) + if (txn.toAccountId != null) { + final dest = await _accountRepository.getById(txn.toAccountId!); + if (dest != null) { + await _accountRepository.updateBalance( + dest.id, + dest.balance - txn.amount, + ); + } + } + } + } + + /// Applies the balance effects of a transaction (same logic as LogTransaction). + Future _applyBalance(Transaction txn) async { + final source = await _accountRepository.getById(txn.accountId); + if (source == null) { + throw ArgumentError('Source account not found: ${txn.accountId}'); + } + + switch (txn.type) { + case TransactionType.expense: + if (source.isLiability) { + await _accountRepository.updateBalance( + source.id, + source.balance + txn.amount, + ); + } else { + await _accountRepository.updateBalance( + source.id, + source.balance - txn.amount, + ); + } + + case TransactionType.income: + await _accountRepository.updateBalance( + source.id, + source.balance + txn.amount, + ); + + case TransactionType.transfer: + if (txn.toAccountId == null) { + throw ArgumentError('Transfer requires a destination account'); + } + final dest = await _accountRepository.getById(txn.toAccountId!); + if (dest == null) { + throw ArgumentError( + 'Destination account not found: ${txn.toAccountId}', + ); + } + await _accountRepository.updateBalance( + source.id, + source.balance - txn.amount, + ); + await _accountRepository.updateBalance( + dest.id, + dest.balance + txn.amount, + ); + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 9236964..3880cf2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,20 +1,27 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:uuid/uuid.dart'; import 'core/di/service_locator.dart'; import 'core/theme/app_colors.dart'; import 'core/theme/app_theme.dart'; import 'core/theme/app_typography.dart'; +import 'domain/entities/enums.dart'; +import 'domain/entities/transaction.dart'; import 'domain/repositories/account_repository.dart'; +import 'domain/repositories/category_repository.dart'; import 'domain/repositories/transaction_repository.dart'; import 'domain/usecases/calculate_net_position.dart'; -import 'domain/usecases/log_transaction.dart'; import 'domain/usecases/manage_account.dart'; +import 'domain/usecases/manage_transaction.dart'; import 'presentation/providers/account_provider.dart'; +import 'presentation/providers/category_provider.dart'; import 'presentation/providers/transaction_provider.dart'; import 'presentation/screens/accounts_screen.dart'; import 'presentation/screens/ledger_screen.dart'; import 'presentation/screens/reports_screen.dart'; +import 'presentation/widgets/manage_categories_sheet.dart'; +import 'presentation/widgets/quick_add_transaction_sheet.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -43,9 +50,13 @@ class VentExpenseApp extends StatelessWidget { ChangeNotifierProvider( create: (_) => TransactionProvider( sl(), - sl(), + sl(), + sl(), ), ), + ChangeNotifierProvider( + create: (_) => CategoryProvider(sl()), + ), ], child: MaterialApp( title: 'VentExpense Pro', @@ -80,6 +91,26 @@ class _HomeShellState extends State { _titles[_currentIndex], style: AppTypography.titleLarge.copyWith(color: AppColors.inkBlue), ), + actions: [ + PopupMenuButton( + icon: const Icon(Icons.more_vert, color: AppColors.inkLight), + onSelected: (value) { + if (value == 'categories') _openCategoryManager(context); + }, + itemBuilder: (_) => [ + const PopupMenuItem( + value: 'categories', + child: Row( + children: [ + Icon(Icons.category_outlined, size: 20), + SizedBox(width: 8), + Text('Manage Categories'), + ], + ), + ), + ], + ), + ], ), body: _screens[_currentIndex], bottomNavigationBar: BottomNavigationBar( @@ -106,12 +137,64 @@ class _HomeShellState extends State { floatingActionButton: _currentIndex == 1 ? null // Accounts screen manages its own FAB : FloatingActionButton( - onPressed: () { - // TODO: Open Quick-Add bottom sheet - }, + onPressed: () => _openQuickAdd(context), tooltip: 'Log Transaction', child: const Icon(Icons.add), ), ); } + + void _openQuickAdd(BuildContext context) async { + final txnProvider = context.read(); + final accProvider = context.read(); + + // Ensure data is loaded + if (txnProvider.categories.isEmpty) await txnProvider.loadAll(); + if (accProvider.accounts.isEmpty) await accProvider.loadAccounts(); + + if (!mounted) return; + + final result = await showModalBottomSheet>( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => QuickAddTransactionSheet( + categories: txnProvider.categories, + accounts: accProvider.accounts + .where((a) => !a.isArchived) + .toList(), + ), + ); + + if (result != null && mounted) { + final transaction = Transaction( + id: const Uuid().v4(), + amount: result['amount'] as int, + type: result['type'] as TransactionType, + categoryId: result['categoryId'] as String, + accountId: result['accountId'] as String, + toAccountId: result['toAccountId'] as String?, + note: result['note'] as String?, + dateTime: result['dateTime'] as DateTime, + ); + + await txnProvider.addTransaction(transaction); + if (mounted) await accProvider.loadAccounts(); + } + } + + void _openCategoryManager(BuildContext context) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => const ManageCategoriesSheet(), + ); + } } diff --git a/lib/presentation/providers/category_provider.dart b/lib/presentation/providers/category_provider.dart new file mode 100644 index 0000000..22ba9ea --- /dev/null +++ b/lib/presentation/providers/category_provider.dart @@ -0,0 +1,102 @@ +import 'package:flutter/foundation.dart' hide Category; + +import '../../domain/entities/category.dart'; +import '../../domain/repositories/category_repository.dart'; + +/// Manages category state for the category management screen. +class CategoryProvider extends ChangeNotifier { + final CategoryRepository _categoryRepository; + + CategoryProvider(this._categoryRepository); + + List _categories = []; + bool _isLoading = false; + String? _error; + + // — Getters — + + List get categories => _categories; + bool get isLoading => _isLoading; + String? get error => _error; + + /// Pre-seeded (non-custom) categories. + List get defaultCategories => + _categories.where((c) => !c.isCustom).toList(); + + /// User-created custom categories. + List get customCategories => + _categories.where((c) => c.isCustom).toList(); + + // — Actions — + + /// Loads all categories. + Future loadCategories() async { + _isLoading = true; + _error = null; + notifyListeners(); + + try { + _categories = await _categoryRepository.getAll(); + } catch (e) { + _error = e.toString(); + } finally { + _isLoading = false; + notifyListeners(); + } + } + + /// Creates a new custom category. + Future addCategory({ + required String id, + required String name, + required String icon, + }) async { + try { + await _categoryRepository.insert(Category( + id: id, + name: name, + icon: icon, + isCustom: true, + )); + await loadCategories(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } + + /// Updates a category name and/or icon. + Future updateCategory(Category category) async { + try { + await _categoryRepository.update(category); + await loadCategories(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } + + /// Deletes a custom category. Pre-seeded categories cannot be deleted. + Future deleteCategory(String id) async { + final cat = _categories.firstWhere( + (c) => c.id == id, + orElse: () => throw ArgumentError('Category not found: $id'), + ); + + if (!cat.isCustom) { + _error = 'Cannot delete a default category'; + notifyListeners(); + return false; + } + + try { + await _categoryRepository.delete(id); + await loadCategories(); + return true; + } catch (e) { + _error = e.toString(); + notifyListeners(); + return false; + } + } +} diff --git a/lib/presentation/providers/transaction_provider.dart b/lib/presentation/providers/transaction_provider.dart index 252850a..6dfc72a 100644 --- a/lib/presentation/providers/transaction_provider.dart +++ b/lib/presentation/providers/transaction_provider.dart @@ -1,27 +1,74 @@ -import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import '../../domain/entities/category.dart'; import '../../domain/entities/transaction.dart'; +import '../../domain/repositories/category_repository.dart'; import '../../domain/repositories/transaction_repository.dart'; -import '../../domain/usecases/log_transaction.dart'; +import '../../domain/usecases/manage_transaction.dart'; -/// Manages transaction state for the receipt feed. +/// Manages transaction and category state for the receipt feed. class TransactionProvider extends ChangeNotifier { final TransactionRepository _transactionRepository; - final LogTransaction _logTransaction; + final CategoryRepository _categoryRepository; + final ManageTransaction _manageTransaction; - TransactionProvider(this._transactionRepository, this._logTransaction); + TransactionProvider( + this._transactionRepository, + this._categoryRepository, + this._manageTransaction, + ); List _transactions = []; + List _categories = []; bool _isLoading = false; String? _error; + /// Active date filter. Null means "show all". + DateTimeRange? _dateFilter; + // — Getters — List get transactions => _transactions; + List get categories => _categories; bool get isLoading => _isLoading; String? get error => _error; + DateTimeRange? get dateFilter => _dateFilter; + + /// Transactions filtered by the active date range (or all if no filter). + List get filteredTransactions { + if (_dateFilter == null) return _transactions; + final start = DateTime( + _dateFilter!.start.year, + _dateFilter!.start.month, + _dateFilter!.start.day, + ); + final end = DateTime( + _dateFilter!.end.year, + _dateFilter!.end.month, + _dateFilter!.end.day, + 23, 59, 59, + ); + return _transactions + .where((t) => + !t.dateTime.isBefore(start) && !t.dateTime.isAfter(end)) + .toList(); + } + + /// Filtered transactions grouped by date (for the receipt feed). + Map> get filteredGroupedByDate { + final grouped = >{}; + for (final txn in filteredTransactions) { + final dateKey = DateTime( + txn.dateTime.year, + txn.dateTime.month, + txn.dateTime.day, + ); + grouped.putIfAbsent(dateKey, () => []).add(txn); + } + return grouped; + } - /// Transactions grouped by date (for the receipt feed). + /// Transactions grouped by date (unfiltered — kept for backwards compat). Map> get groupedByDate { final grouped = >{}; for (final txn in _transactions) { @@ -35,9 +82,49 @@ class TransactionProvider extends ChangeNotifier { return grouped; } - // — Actions — + /// Returns a category by [id] from the in-memory list, or `null`. + Category? getCategoryById(String id) { + try { + return _categories.firstWhere((c) => c.id == id); + } catch (_) { + return null; + } + } + + // — Filter Actions — + + /// Sets the date filter and notifies listeners. + void setDateFilter(DateTimeRange range) { + _dateFilter = range; + notifyListeners(); + } + + /// Clears the date filter (show all). + void clearDateFilter() { + _dateFilter = null; + notifyListeners(); + } - /// Loads all transactions. + // — Data Actions — + + /// Loads all transactions and categories. + Future loadAll() async { + _isLoading = true; + _error = null; + notifyListeners(); + + try { + _transactions = await _transactionRepository.getAll(); + _categories = await _categoryRepository.getAll(); + } catch (e) { + _error = e.toString(); + } finally { + _isLoading = false; + notifyListeners(); + } + } + + /// Loads all transactions only. Future loadTransactions() async { _isLoading = true; _error = null; @@ -56,7 +143,21 @@ class TransactionProvider extends ChangeNotifier { /// Logs a new transaction and refreshes the list. Future addTransaction(Transaction transaction) async { try { - await _logTransaction(transaction); + await _manageTransaction.create(transaction); + await loadTransactions(); + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } + + /// Updates a transaction (with balance reversal) and refreshes the list. + Future updateTransaction( + Transaction oldTxn, + Transaction newTxn, + ) async { + try { + await _manageTransaction.update(oldTxn, newTxn); await loadTransactions(); } catch (e) { _error = e.toString(); @@ -64,10 +165,10 @@ class TransactionProvider extends ChangeNotifier { } } - /// Deletes a transaction and refreshes the list. - Future deleteTransaction(String id) async { + /// Deletes a transaction (with balance reversal) and refreshes the list. + Future deleteTransaction(Transaction transaction) async { try { - await _transactionRepository.delete(id); + await _manageTransaction.delete(transaction); await loadTransactions(); } catch (e) { _error = e.toString(); diff --git a/lib/presentation/screens/ledger_screen.dart b/lib/presentation/screens/ledger_screen.dart index 4bfb2de..c7a96bb 100644 --- a/lib/presentation/screens/ledger_screen.dart +++ b/lib/presentation/screens/ledger_screen.dart @@ -1,121 +1,392 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../../core/theme/app_colors.dart'; import '../../core/theme/app_typography.dart'; +import '../../domain/entities/enums.dart'; +import '../../domain/entities/transaction.dart'; import '../painters/paper_background.dart'; +import '../providers/account_provider.dart'; +import '../providers/transaction_provider.dart'; +import '../widgets/net_position_card.dart'; +import '../widgets/quick_add_transaction_sheet.dart'; +import '../widgets/receipt_card.dart'; +import '../widgets/receipt_date_header.dart'; /// The main ledger screen — a continuous, receipt-style transaction feed. -class LedgerScreen extends StatelessWidget { +class LedgerScreen extends StatefulWidget { const LedgerScreen({super.key}); + @override + State createState() => _LedgerScreenState(); +} + +class _LedgerScreenState extends State { + /// Which preset filter chip is active. Null = "All" or custom range. + String _activePreset = 'all'; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().loadAll(); + context.read().loadAccounts(); + }); + } + @override Widget build(BuildContext context) { return PaperBackground( - child: CustomScrollView( - slivers: [ - // — Net Position Card placeholder — - SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.fromLTRB(16, 24, 16, 8), - child: Card( + child: Consumer2( + builder: (context, txnProvider, accProvider, _) { + final grouped = txnProvider.filteredGroupedByDate; + final sortedDates = grouped.keys.toList() + ..sort((a, b) => b.compareTo(a)); // newest first + + return CustomScrollView( + slivers: [ + // — Net Position Card — + SliverToBoxAdapter( child: Padding( - padding: const EdgeInsets.all(20), - child: Column( - children: [ - Text( - 'NET POSITION', - style: AppTypography.label.copyWith(letterSpacing: 2.0), - ), - const SizedBox(height: 8), - Text( - 'Rp 0', - style: AppTypography.amountLarge.copyWith( - color: AppColors.inkBlue, - ), + padding: const EdgeInsets.fromLTRB(16, 24, 16, 0), + child: accProvider.breakdown != null + ? NetPositionCard(breakdown: accProvider.breakdown!) + : const SizedBox.shrink(), + ), + ), + + // — Filter Bar — + SliverToBoxAdapter( + child: _buildFilterBar(context, txnProvider), + ), + + // — Loading indicator — + if (txnProvider.isLoading) + const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.all(32), + child: Center(child: CircularProgressIndicator()), + ), + ), + + // — Error state — + if (txnProvider.error != null) + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text( + txnProvider.error!, + style: AppTypography.bodySmall.copyWith( + color: AppColors.error, ), - const SizedBox(height: 12), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _buildSummaryItem( - 'Assets', - 'Rp 0', - AppColors.inkGreen, - ), - Container( - width: 1, - height: 32, - color: AppColors.divider, + textAlign: TextAlign.center, + ), + ), + ), + + // — Empty state — + if (!txnProvider.isLoading && grouped.isEmpty) + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 24), + child: Column( + children: [ + // — Perforated divider — + Row( + children: List.generate( + 30, + (i) => Expanded( + child: Container( + height: 1, + margin: + const EdgeInsets.symmetric(horizontal: 2), + color: i.isEven + ? AppColors.divider + : Colors.transparent, + ), + ), ), - _buildSummaryItem( - 'Liabilities', - 'Rp 0', - AppColors.stampRed, + ), + const SizedBox(height: 32), + const Icon( + Icons.receipt_long_outlined, + size: 48, + color: AppColors.disabled, + ), + const SizedBox(height: 12), + Text( + txnProvider.dateFilter != null + ? 'No transactions in this range' + : 'No transactions yet', + style: AppTypography.bodyLarge.copyWith( + color: AppColors.inkLight, ), - ], - ), - ], + ), + const SizedBox(height: 4), + Text( + txnProvider.dateFilter != null + ? 'Try adjusting the filter' + : 'Tap + to log your first entry', + style: AppTypography.bodySmall, + ), + ], + ), ), ), + + // — Receipt feed — + if (!txnProvider.isLoading && grouped.isNotEmpty) + ...sortedDates.expand((date) { + final txns = grouped[date]! + ..sort( + (a, b) => b.dateTime.compareTo(a.dateTime)); + return [ + SliverToBoxAdapter( + child: ReceiptDateHeader(date: date), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final txn = txns[index]; + final category = + txnProvider.getCategoryById(txn.categoryId); + return ReceiptCard( + transaction: txn, + category: category, + onTap: () => _editTransaction(txn), + onDelete: () => _deleteTransaction(txn), + ); + }, + childCount: txns.length, + ), + ), + ]; + }), + + // — Bottom padding — + const SliverToBoxAdapter( + child: SizedBox(height: 80), ), - ), - ), + ], + ); + }, + ), + ); + } - // — Receipt feed placeholder — - SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24), - child: Column( - children: [ - // — Perforated divider — - Row( - children: List.generate( - 30, - (i) => Expanded( - child: Container( - height: 1, - margin: const EdgeInsets.symmetric(horizontal: 2), - color: i.isEven - ? AppColors.divider - : Colors.transparent, - ), + // ——— Filter Bar ——— + + Widget _buildFilterBar(BuildContext context, TransactionProvider provider) { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + + final presets = { + 'All': null, + 'Today': DateTimeRange(start: today, end: today), + 'This Week': DateTimeRange( + start: today.subtract(Duration(days: today.weekday - 1)), + end: today, + ), + 'This Month': DateTimeRange( + start: DateTime(now.year, now.month, 1), + end: today, + ), + }; + + return Padding( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 0), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + // — Preset chips — + ...presets.entries.map((entry) { + final label = entry.key; + final range = entry.value; + final isActive = _activePreset == label.toLowerCase(); + return Padding( + padding: const EdgeInsets.only(right: 8), + child: GestureDetector( + onTap: () { + setState(() => _activePreset = label.toLowerCase()); + if (range == null) { + provider.clearDateFilter(); + } else { + provider.setDateFilter(range); + } + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + padding: const EdgeInsets.symmetric( + horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: isActive + ? AppColors.inkBlue.withValues(alpha: 0.12) + : AppColors.paperElevated, + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: isActive + ? AppColors.inkBlue + : AppColors.divider, + width: isActive ? 1.5 : 0.5, ), ), - ), - const SizedBox(height: 32), - const Icon( - Icons.receipt_long_outlined, - size: 48, - color: AppColors.disabled, - ), - const SizedBox(height: 12), - Text( - 'No transactions yet', - style: AppTypography.bodyLarge.copyWith( - color: AppColors.inkLight, + child: Text( + label, + style: AppTypography.label.copyWith( + color: isActive + ? AppColors.inkBlue + : AppColors.inkLight, + fontWeight: + isActive ? FontWeight.w600 : FontWeight.w400, + fontSize: 11, + ), ), ), - const SizedBox(height: 4), - const Text( - 'Tap + to log your first entry', - style: AppTypography.bodySmall, + ), + ); + }), + + // — Custom Range chip — + GestureDetector( + onTap: () => _pickCustomRange(context, provider), + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + padding: + const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: _activePreset == 'custom' + ? AppColors.inkBlue.withValues(alpha: 0.12) + : AppColors.paperElevated, + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: _activePreset == 'custom' + ? AppColors.inkBlue + : AppColors.divider, + width: _activePreset == 'custom' ? 1.5 : 0.5, ), - ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.date_range_outlined, + size: 14, + color: _activePreset == 'custom' + ? AppColors.inkBlue + : AppColors.inkLight, + ), + const SizedBox(width: 4), + Text( + _activePreset == 'custom' + ? _formatRange(provider.dateFilter!) + : 'Custom', + style: AppTypography.label.copyWith( + color: _activePreset == 'custom' + ? AppColors.inkBlue + : AppColors.inkLight, + fontWeight: _activePreset == 'custom' + ? FontWeight.w600 + : FontWeight.w400, + fontSize: 11, + ), + ), + ], + ), ), ), - ), - ], + ], + ), ), ); } - Widget _buildSummaryItem(String label, String amount, Color color) { - return Column( - children: [ - Text(label.toUpperCase(), style: AppTypography.label), - const SizedBox(height: 4), - Text(amount, style: AppTypography.amountMedium.copyWith(color: color)), - ], + String _formatRange(DateTimeRange range) { + String fmt(DateTime d) => + '${d.day}/${d.month}'; + return '${fmt(range.start)} – ${fmt(range.end)}'; + } + + Future _pickCustomRange( + BuildContext context, + TransactionProvider provider, + ) async { + final picked = await showDateRangePicker( + context: context, + firstDate: DateTime(2020), + lastDate: DateTime.now().add(const Duration(days: 1)), + initialDateRange: provider.dateFilter, + builder: (context, child) { + return Theme( + data: Theme.of(context).copyWith( + colorScheme: Theme.of(context).colorScheme.copyWith( + primary: AppColors.inkBlue, + ), + ), + child: child!, + ); + }, + ); + + if (picked != null && mounted) { + setState(() => _activePreset = 'custom'); + provider.setDateFilter(picked); + } + } + + // ——— Transaction Actions ——— + + Future _editTransaction(Transaction txn) async { + final txnProvider = context.read(); + final accProvider = context.read(); + + final result = await showModalBottomSheet>( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => QuickAddTransactionSheet( + categories: txnProvider.categories, + accounts: accProvider.accounts + .where((a) => !a.isArchived) + .toList(), + initialValues: { + 'type': txn.type, + 'categoryId': txn.categoryId, + 'amount': txn.amount, + 'accountId': txn.accountId, + 'toAccountId': txn.toAccountId, + 'note': txn.note, + 'dateTime': txn.dateTime, + }, + ), ); + + if (result != null && mounted) { + final newTxn = Transaction( + id: txn.id, + amount: result['amount'] as int, + type: result['type'] as TransactionType, + categoryId: result['categoryId'] as String, + accountId: result['accountId'] as String, + toAccountId: result['toAccountId'] as String?, + note: result['note'] as String?, + dateTime: result['dateTime'] as DateTime, + ); + + await txnProvider.updateTransaction(txn, newTxn); + if (mounted) await accProvider.loadAccounts(); + } + } + + Future _deleteTransaction(Transaction txn) async { + final txnProvider = context.read(); + final accProvider = context.read(); + + await txnProvider.deleteTransaction(txn); + if (mounted) await accProvider.loadAccounts(); } } diff --git a/lib/presentation/widgets/manage_categories_sheet.dart b/lib/presentation/widgets/manage_categories_sheet.dart new file mode 100644 index 0000000..fbfa0ae --- /dev/null +++ b/lib/presentation/widgets/manage_categories_sheet.dart @@ -0,0 +1,325 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:uuid/uuid.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../core/utils/category_icon_mapper.dart'; +import '../../domain/entities/category.dart'; +import '../providers/category_provider.dart'; +import '../providers/transaction_provider.dart'; + +/// Available icon options for category creation/editing. +const _availableIcons = [ + 'food', + 'transport', + 'bills', + 'shopping', + 'entertainment', + 'health', + 'education', + 'other', +]; + +/// Full-screen bottom sheet for managing categories (add, edit, delete). +class ManageCategoriesSheet extends StatefulWidget { + const ManageCategoriesSheet({super.key}); + + @override + State createState() => _ManageCategoriesSheetState(); +} + +class _ManageCategoriesSheetState extends State { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().loadCategories(); + }); + } + + @override + Widget build(BuildContext context) { + return DraggableScrollableSheet( + initialChildSize: 0.85, + minChildSize: 0.5, + maxChildSize: 0.95, + expand: false, + builder: (context, scrollController) { + return Consumer( + builder: (context, provider, _) { + return Column( + children: [ + // — Handle bar — + Padding( + padding: const EdgeInsets.only(top: 12, bottom: 8), + child: Center( + child: Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: AppColors.divider, + borderRadius: BorderRadius.circular(2), + ), + ), + ), + ), + + // — Title — + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Manage Categories', + style: AppTypography.titleLarge.copyWith( + color: AppColors.inkBlue, + ), + ), + IconButton( + onPressed: () => _showAddEditDialog(context), + icon: const Icon(Icons.add_circle_outline), + color: AppColors.inkBlue, + tooltip: 'Add Category', + ), + ], + ), + ), + + const SizedBox(height: 8), + + // — Category List — + Expanded( + child: provider.isLoading + ? const Center(child: CircularProgressIndicator()) + : ListView.separated( + controller: scrollController, + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + itemCount: provider.categories.length, + separatorBuilder: (_, index) => + const Divider(height: 1), + itemBuilder: (context, index) { + final cat = provider.categories[index]; + // Hide settlement from management + if (cat.id == 'settlement') { + return const SizedBox.shrink(); + } + return _buildCategoryTile(context, cat); + }, + ), + ), + ], + ); + }, + ); + }, + ); + } + + Widget _buildCategoryTile(BuildContext context, Category cat) { + return ListTile( + leading: Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: AppColors.inkBlue.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(10), + ), + child: Icon( + CategoryIconMapper.iconFor(cat.icon), + size: 20, + color: AppColors.inkBlue, + ), + ), + title: Text(cat.name, style: AppTypography.bodyMedium), + subtitle: cat.isCustom + ? const Text('Custom', style: AppTypography.bodySmall) + : const Text('Default', style: AppTypography.bodySmall), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + onPressed: () => _showAddEditDialog(context, category: cat), + icon: const Icon(Icons.edit_outlined, size: 20), + color: AppColors.inkLight, + tooltip: 'Edit', + ), + if (cat.isCustom) + IconButton( + onPressed: () => _confirmDelete(context, cat), + icon: const Icon(Icons.delete_outline, size: 20), + color: AppColors.stampRed, + tooltip: 'Delete', + ), + ], + ), + ); + } + + Future _showAddEditDialog( + BuildContext context, { + Category? category, + }) async { + final isEditing = category != null; + final nameController = TextEditingController(text: category?.name ?? ''); + String selectedIcon = category?.icon ?? _availableIcons.first; + + final result = await showDialog>( + context: context, + builder: (ctx) { + return StatefulBuilder( + builder: (ctx, setDialogState) { + return AlertDialog( + backgroundColor: AppColors.paper, + title: Text( + isEditing ? 'Edit Category' : 'New Category', + style: AppTypography.titleMedium.copyWith( + color: AppColors.inkBlue, + ), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // — Name field — + TextField( + controller: nameController, + decoration: const InputDecoration( + labelText: 'Category Name', + hintText: 'e.g. Groceries', + ), + textCapitalization: TextCapitalization.words, + autofocus: true, + ), + const SizedBox(height: 16), + + // — Icon picker — + Text( + 'ICON', + style: + AppTypography.label.copyWith(letterSpacing: 1.5), + ), + const SizedBox(height: 8), + Wrap( + spacing: 8, + runSpacing: 8, + children: _availableIcons.map((iconId) { + final isSelected = selectedIcon == iconId; + return GestureDetector( + onTap: () => + setDialogState(() => selectedIcon = iconId), + child: AnimatedContainer( + duration: const Duration(milliseconds: 150), + width: 44, + height: 44, + decoration: BoxDecoration( + color: isSelected + ? AppColors.inkBlue + .withValues(alpha: 0.12) + : AppColors.paperElevated, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: isSelected + ? AppColors.inkBlue + : Colors.transparent, + width: isSelected ? 1.5 : 0, + ), + ), + child: Icon( + CategoryIconMapper.iconFor(iconId), + size: 20, + color: isSelected + ? AppColors.inkBlue + : AppColors.inkLight, + ), + ), + ); + }).toList(), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(), + child: const Text('Cancel'), + ), + ElevatedButton( + onPressed: () { + final name = nameController.text.trim(); + if (name.isEmpty) return; + Navigator.of(ctx).pop({ + 'name': name, + 'icon': selectedIcon, + }); + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.inkBlue, + foregroundColor: AppColors.paper, + ), + child: Text(isEditing ? 'Save' : 'Create'), + ), + ], + ); + }, + ); + }, + ); + + if (result != null && mounted) { + final catProvider = context.read(); + if (isEditing) { + await catProvider.updateCategory( + category.copyWith( + name: result['name'], + icon: result['icon'], + ), + ); + } else { + await catProvider.addCategory( + id: const Uuid().v4(), + name: result['name']!, + icon: result['icon']!, + ); + } + // Refresh transaction provider's category cache + if (mounted) { + context.read().loadAll(); + } + } + } + + Future _confirmDelete(BuildContext context, Category cat) async { + final confirmed = await showDialog( + context: context, + builder: (ctx) => AlertDialog( + title: const Text('Delete Category'), + content: Text( + 'Delete "${cat.name}"? Existing transactions will keep this category ID but it won\'t appear in the picker.', + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(false), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => Navigator.of(ctx).pop(true), + style: TextButton.styleFrom(foregroundColor: AppColors.stampRed), + child: const Text('Delete'), + ), + ], + ), + ); + + if (confirmed == true && mounted) { + final catProvider = context.read(); + await catProvider.deleteCategory(cat.id); + if (mounted) { + context.read().loadAll(); + } + } + } +} diff --git a/lib/presentation/widgets/quick_add_transaction_sheet.dart b/lib/presentation/widgets/quick_add_transaction_sheet.dart new file mode 100644 index 0000000..69fbf53 --- /dev/null +++ b/lib/presentation/widgets/quick_add_transaction_sheet.dart @@ -0,0 +1,528 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../core/utils/category_icon_mapper.dart'; +import '../../domain/entities/account.dart'; +import '../../domain/entities/category.dart'; +import '../../domain/entities/enums.dart'; + +/// Quick-add bottom sheet: Category → Amount → Source → Log It ✓ +/// +/// Returns a `Map` with keys: +/// `type`, `categoryId`, `amount`, `accountId`, `toAccountId`, `note`, `dateTime`. +class QuickAddTransactionSheet extends StatefulWidget { + /// Available categories (pre-seeded + custom). + final List categories; + + /// Available (non-archived) accounts. + final List accounts; + + /// If provided, the sheet operates in edit mode. + final Map? initialValues; + + const QuickAddTransactionSheet({ + super.key, + required this.categories, + required this.accounts, + this.initialValues, + }); + + @override + State createState() => + _QuickAddTransactionSheetState(); +} + +class _QuickAddTransactionSheetState extends State { + late TransactionType _type; + String? _categoryId; + final _amountController = TextEditingController(); + String? _accountId; + String? _toAccountId; + final _noteController = TextEditingController(); + late DateTime _dateTime; + + String? _validationError; + + bool get _isEditing => widget.initialValues != null; + + @override + void initState() { + super.initState(); + final init = widget.initialValues; + if (init != null) { + _type = init['type'] as TransactionType; + _categoryId = init['categoryId'] as String?; + _amountController.text = (init['amount'] as int).toString(); + _accountId = init['accountId'] as String?; + _toAccountId = init['toAccountId'] as String?; + _noteController.text = (init['note'] as String?) ?? ''; + _dateTime = init['dateTime'] as DateTime; + } else { + _type = TransactionType.expense; + _dateTime = DateTime.now(); + // Pre-select first account if available + if (widget.accounts.isNotEmpty) { + _accountId = widget.accounts.first.id; + } + } + } + + @override + void dispose() { + _amountController.dispose(); + _noteController.dispose(); + super.dispose(); + } + + /// Filtered categories: hide "settlement" from regular category grid. + List get _visibleCategories => + widget.categories.where((c) => c.id != 'settlement').toList(); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only( + left: 24, + right: 24, + top: 16, + bottom: MediaQuery.of(context).viewInsets.bottom + 24, + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // — Handle bar — + Center( + child: Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: AppColors.divider, + borderRadius: BorderRadius.circular(2), + ), + ), + ), + const SizedBox(height: 12), + + // — Title — + Text( + _isEditing ? 'Edit Transaction' : 'Log Transaction', + style: AppTypography.titleLarge.copyWith( + color: AppColors.inkBlue, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + + // — Transaction Type Tabs — + _buildTypeSelector(), + const SizedBox(height: 20), + + // — Category Grid — + Text( + 'CATEGORY', + style: AppTypography.label.copyWith(letterSpacing: 1.5), + ), + const SizedBox(height: 8), + _buildCategoryGrid(), + const SizedBox(height: 20), + + // — Amount Field — + Text( + 'AMOUNT', + style: AppTypography.label.copyWith(letterSpacing: 1.5), + ), + const SizedBox(height: 8), + _buildAmountField(), + const SizedBox(height: 16), + + // — Source Account — + Text( + _type == TransactionType.transfer ? 'FROM ACCOUNT' : 'ACCOUNT', + style: AppTypography.label.copyWith(letterSpacing: 1.5), + ), + const SizedBox(height: 8), + _buildAccountChips( + selectedId: _accountId, + onSelect: (id) => setState(() => _accountId = id), + ), + + // — Destination Account (transfer only) — + if (_type == TransactionType.transfer) ...[ + const SizedBox(height: 16), + Text( + 'TO ACCOUNT', + style: AppTypography.label.copyWith(letterSpacing: 1.5), + ), + const SizedBox(height: 8), + _buildAccountChips( + selectedId: _toAccountId, + onSelect: (id) => setState(() => _toAccountId = id), + exclude: _accountId, + ), + ], + + const SizedBox(height: 16), + + // — Note Field — + TextFormField( + controller: _noteController, + decoration: const InputDecoration( + labelText: 'Note (optional)', + hintText: 'e.g. Lunch with friends', + ), + textCapitalization: TextCapitalization.sentences, + maxLines: 1, + ), + + const SizedBox(height: 12), + + // — Date / Time — + _buildDateTimePicker(), + + // — Validation Error — + if (_validationError != null) ...[ + const SizedBox(height: 12), + Text( + _validationError!, + style: AppTypography.bodySmall.copyWith( + color: AppColors.error, + ), + textAlign: TextAlign.center, + ), + ], + + const SizedBox(height: 20), + + // — Submit Button — + SizedBox( + height: 48, + child: ElevatedButton( + onPressed: _submit, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.inkBlue, + foregroundColor: AppColors.paper, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + textStyle: AppTypography.titleMedium.copyWith( + color: AppColors.paper, + ), + ), + child: Text(_isEditing ? 'Save Changes' : 'Log It ✓'), + ), + ), + ], + ), + ), + ); + } + + // ——— Sub-widgets ——— + + Widget _buildTypeSelector() { + return Row( + children: TransactionType.values.map((type) { + final isSelected = _type == type; + final color = CategoryIconMapper.colorForType(type); + return Expanded( + child: Padding( + padding: EdgeInsets.only( + right: type != TransactionType.transfer ? 8 : 0, + ), + child: GestureDetector( + onTap: () => setState(() { + _type = type; + // Clear destination on type change + if (type != TransactionType.transfer) _toAccountId = null; + }), + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + padding: const EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + color: isSelected + ? color.withValues(alpha: 0.12) + : AppColors.paper, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: isSelected ? color : AppColors.divider, + width: isSelected ? 1.5 : 0.5, + ), + ), + child: Text( + CategoryIconMapper.labelForType(type), + style: AppTypography.label.copyWith( + color: isSelected ? color : AppColors.disabled, + fontSize: 11, + letterSpacing: 1.0, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ); + }).toList(), + ); + } + + Widget _buildCategoryGrid() { + final cats = _visibleCategories; + return GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + childAspectRatio: 1.0, + ), + itemCount: cats.length, + itemBuilder: (context, index) { + final cat = cats[index]; + final isSelected = _categoryId == cat.id; + final color = CategoryIconMapper.colorForType(_type); + return GestureDetector( + onTap: () => setState(() => _categoryId = cat.id), + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + decoration: BoxDecoration( + color: isSelected + ? color.withValues(alpha: 0.12) + : AppColors.paperElevated, + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: isSelected ? color : Colors.transparent, + width: isSelected ? 1.5 : 0, + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + CategoryIconMapper.iconFor(cat.icon), + size: 24, + color: isSelected ? color : AppColors.inkLight, + ), + const SizedBox(height: 4), + Text( + cat.name, + style: AppTypography.label.copyWith( + color: isSelected ? color : AppColors.inkLight, + fontSize: 9, + ), + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ); + }, + ); + } + + Widget _buildAmountField() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: AppColors.paperElevated, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: AppColors.divider, width: 0.5), + ), + child: Row( + children: [ + Text( + 'Rp', + style: AppTypography.amountMedium.copyWith( + color: AppColors.inkLight, + ), + ), + const SizedBox(width: 12), + Expanded( + child: TextField( + controller: _amountController, + style: AppTypography.amountLarge.copyWith( + color: AppColors.inkDark, + ), + keyboardType: TextInputType.number, + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + decoration: InputDecoration( + hintText: '0', + hintStyle: AppTypography.amountLarge.copyWith( + color: AppColors.disabled, + ), + border: InputBorder.none, + filled: false, + contentPadding: EdgeInsets.zero, + isDense: true, + ), + autofocus: false, + ), + ), + ], + ), + ); + } + + Widget _buildAccountChips({ + required String? selectedId, + required void Function(String) onSelect, + String? exclude, + }) { + final filtered = widget.accounts + .where((a) => exclude == null || a.id != exclude) + .toList(); + + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: filtered.map((account) { + final isSelected = selectedId == account.id; + final color = account.isLiability + ? AppColors.stampRed + : AppColors.inkGreen; + return Padding( + padding: const EdgeInsets.only(right: 8), + child: GestureDetector( + onTap: () => onSelect(account.id), + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + padding: + const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: isSelected + ? color.withValues(alpha: 0.12) + : AppColors.paperElevated, + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: isSelected ? color : AppColors.divider, + width: isSelected ? 1.5 : 0.5, + ), + ), + child: Text( + account.name, + style: AppTypography.bodySmall.copyWith( + color: isSelected ? color : AppColors.inkLight, + fontWeight: + isSelected ? FontWeight.w600 : FontWeight.w400, + ), + ), + ), + ), + ); + }).toList(), + ), + ); + } + + Widget _buildDateTimePicker() { + return GestureDetector( + onTap: _pickDateTime, + child: Row( + children: [ + const Icon(Icons.calendar_today_outlined, + size: 18, color: AppColors.inkLight), + const SizedBox(width: 8), + Text( + _formatDateTime(_dateTime), + style: AppTypography.bodyMedium.copyWith( + color: AppColors.inkBlue, + ), + ), + const SizedBox(width: 4), + const Icon(Icons.edit_outlined, size: 14, color: AppColors.disabled), + ], + ), + ); + } + + String _formatDateTime(DateTime dt) { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final target = DateTime(dt.year, dt.month, dt.day); + final diff = today.difference(target).inDays; + + String dateStr; + if (diff == 0) { + dateStr = 'Today'; + } else if (diff == 1) { + dateStr = 'Yesterday'; + } else { + dateStr = + '${dt.day}/${dt.month}/${dt.year}'; + } + final timeStr = + '${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}'; + return '$dateStr, $timeStr'; + } + + Future _pickDateTime() async { + final date = await showDatePicker( + context: context, + initialDate: _dateTime, + firstDate: DateTime(2020), + lastDate: DateTime.now().add(const Duration(days: 1)), + ); + if (date == null || !mounted) return; + + final time = await showTimePicker( + context: context, + initialTime: TimeOfDay.fromDateTime(_dateTime), + ); + if (time == null || !mounted) return; + + setState(() { + _dateTime = DateTime( + date.year, + date.month, + date.day, + time.hour, + time.minute, + ); + }); + } + + void _submit() { + // Validate + if (_categoryId == null) { + setState(() => _validationError = 'Please select a category'); + return; + } + final amountText = _amountController.text.trim(); + if (amountText.isEmpty || int.tryParse(amountText) == null) { + setState(() => _validationError = 'Please enter a valid amount'); + return; + } + final amount = int.parse(amountText); + if (amount <= 0) { + setState(() => _validationError = 'Amount must be greater than zero'); + return; + } + if (_accountId == null) { + setState(() => _validationError = 'Please select an account'); + return; + } + if (_type == TransactionType.transfer && _toAccountId == null) { + setState( + () => _validationError = 'Please select a destination account'); + return; + } + + final note = _noteController.text.trim(); + + Navigator.of(context).pop({ + 'type': _type, + 'categoryId': _categoryId, + 'amount': amount, + 'accountId': _accountId, + 'toAccountId': _toAccountId, + 'note': note.isEmpty ? null : note, + 'dateTime': _dateTime, + }); + } +} diff --git a/lib/presentation/widgets/receipt_card.dart b/lib/presentation/widgets/receipt_card.dart new file mode 100644 index 0000000..06b9fc8 --- /dev/null +++ b/lib/presentation/widgets/receipt_card.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../core/utils/category_icon_mapper.dart'; +import '../../core/utils/currency_formatter.dart'; +import '../../core/utils/date_formatter.dart'; +import '../../domain/entities/category.dart'; +import '../../domain/entities/transaction.dart'; + +/// A single transaction row in the receipt-style transaction feed. +/// +/// Shows category icon, name, optional note, formatted amount, and time. +class ReceiptCard extends StatelessWidget { + final Transaction transaction; + final Category? category; + final VoidCallback? onTap; + final VoidCallback? onDelete; + + const ReceiptCard({ + super.key, + required this.transaction, + this.category, + this.onTap, + this.onDelete, + }); + + @override + Widget build(BuildContext context) { + final typeColor = CategoryIconMapper.colorForType(transaction.type); + final sign = CategoryIconMapper.signForType(transaction.type); + final iconData = CategoryIconMapper.iconFor( + category?.icon ?? 'other', + ); + + return Dismissible( + key: Key(transaction.id), + direction: DismissDirection.endToStart, + confirmDismiss: (_) => _confirmDelete(context), + background: Container( + alignment: Alignment.centerRight, + padding: const EdgeInsets.only(right: 20), + color: AppColors.stampRedLight, + child: const Icon(Icons.delete_outline, color: AppColors.stampRed), + ), + child: InkWell( + onTap: onTap, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: Row( + children: [ + // — Category Icon — + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: typeColor.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(iconData, size: 20, color: typeColor), + ), + const SizedBox(width: 12), + + // — Category Name & Note — + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + category?.name ?? 'Unknown', + style: AppTypography.bodyMedium.copyWith( + fontWeight: FontWeight.w600, + ), + ), + if (transaction.note != null && + transaction.note!.isNotEmpty) ...[ + const SizedBox(height: 2), + Text( + transaction.note!, + style: AppTypography.bodySmall, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ], + ), + ), + const SizedBox(width: 8), + + // — Amount & Time — + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + '$sign${CurrencyFormatter.formatCents(transaction.amount)}', + style: AppTypography.amountSmall.copyWith( + color: typeColor, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox(height: 2), + Text( + DateFormatter.time(transaction.dateTime), + style: AppTypography.bodySmall.copyWith( + fontSize: 11, + ), + ), + ], + ), + ], + ), + ), + ), + ); + } + + Future _confirmDelete(BuildContext context) { + return showDialog( + context: context, + builder: (ctx) => AlertDialog( + title: const Text('Delete Transaction'), + content: const Text( + 'This will reverse the balance change. Are you sure?', + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(false), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () { + Navigator.of(ctx).pop(true); + onDelete?.call(); + }, + style: TextButton.styleFrom(foregroundColor: AppColors.stampRed), + child: const Text('Delete'), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/widgets/receipt_date_header.dart b/lib/presentation/widgets/receipt_date_header.dart new file mode 100644 index 0000000..799dcda --- /dev/null +++ b/lib/presentation/widgets/receipt_date_header.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../core/utils/date_formatter.dart'; + +/// A date-group header for the receipt-style transaction feed. +/// +/// Displays a relative date label (e.g., "Today, 21 Feb") between +/// perforated divider lines, mimicking a receipt tear-off edge. +class ReceiptDateHeader extends StatelessWidget { + final DateTime date; + + const ReceiptDateHeader({super.key, required this.date}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(16, 20, 16, 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // — Perforated divider — + Row( + children: List.generate( + 30, + (i) => Expanded( + child: Container( + height: 1, + margin: const EdgeInsets.symmetric(horizontal: 2), + color: i.isEven ? AppColors.divider : Colors.transparent, + ), + ), + ), + ), + const SizedBox(height: 10), + + // — Date label — + Text( + DateFormatter.receiptHeader(date).toUpperCase(), + style: AppTypography.label.copyWith( + letterSpacing: 2.0, + color: AppColors.inkLight, + ), + ), + ], + ), + ); + } +} diff --git a/test/domain/usecases/manage_transaction_test.dart b/test/domain/usecases/manage_transaction_test.dart new file mode 100644 index 0000000..80e0d0b --- /dev/null +++ b/test/domain/usecases/manage_transaction_test.dart @@ -0,0 +1,345 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/entities/account.dart'; +import 'package:vent_expense_pro/domain/entities/enums.dart'; +import 'package:vent_expense_pro/domain/entities/transaction.dart'; +import 'package:vent_expense_pro/domain/repositories/account_repository.dart'; +import 'package:vent_expense_pro/domain/repositories/transaction_repository.dart'; +import 'package:vent_expense_pro/domain/usecases/log_transaction.dart'; +import 'package:vent_expense_pro/domain/usecases/manage_transaction.dart'; + +// ——— In-memory fakes ——— + +class FakeAccountRepository implements AccountRepository { + final Map _accounts = {}; + + void seed(List accounts) { + for (final a in accounts) { + _accounts[a.id] = a; + } + } + + Account? accountById(String id) => _accounts[id]; + + @override + Future> getAll() async => _accounts.values.toList(); + + @override + Future getById(String id) async => _accounts[id]; + + @override + Future insert(Account account) async { + _accounts[account.id] = account; + return account; + } + + @override + Future update(Account account) async { + _accounts[account.id] = account; + return account; + } + + @override + Future updateBalance(String id, int newBalance) async { + final account = _accounts[id]!; + _accounts[id] = account.copyWith(balance: newBalance); + } + + Future delete(String id) async { + _accounts.remove(id); + } + + @override + Future archive(String id) async { + final account = _accounts[id]!; + _accounts[id] = account.copyWith(isArchived: true); + } + + @override + Future> getByType(AccountType type) async => + _accounts.values.where((a) => a.type == type).toList(); +} + +class FakeTransactionRepository implements TransactionRepository { + final Map _transactions = {}; + + @override + Future> getAll() async => + _transactions.values.toList() + ..sort((a, b) => b.dateTime.compareTo(a.dateTime)); + + @override + Future> getByAccount(String accountId) async => + _transactions.values + .where((t) => t.accountId == accountId || t.toAccountId == accountId) + .toList(); + + @override + Future> getByDateRange( + DateTime start, DateTime end) async => + _transactions.values + .where((t) => + t.dateTime.isAfter(start.subtract(const Duration(seconds: 1))) && + t.dateTime.isBefore(end.add(const Duration(seconds: 1)))) + .toList(); + + @override + Future getById(String id) async => _transactions[id]; + + @override + Future insert(Transaction transaction) async { + _transactions[transaction.id] = transaction; + return transaction; + } + + @override + Future update(Transaction transaction) async { + _transactions[transaction.id] = transaction; + return transaction; + } + + @override + Future delete(String id) async { + _transactions.remove(id); + } +} + +// ——— Tests ——— + +void main() { + late FakeAccountRepository accountRepo; + late FakeTransactionRepository transactionRepo; + late LogTransaction logTransaction; + late ManageTransaction manageTransaction; + + final now = DateTime(2026, 2, 21, 14, 30); + + final debitAccount = Account( + id: 'acc-debit', + name: 'BCA Debit', + type: AccountType.debit, + balance: 500000, + currency: 'IDR', + isArchived: false, + createdAt: now, + ); + + final cashAccount = Account( + id: 'acc-cash', + name: 'Cash Wallet', + type: AccountType.cash, + balance: 200000, + currency: 'IDR', + isArchived: false, + createdAt: now, + ); + + final creditAccount = Account( + id: 'acc-credit', + name: 'Credit Card', + type: AccountType.credit, + balance: 100000, + currency: 'IDR', + isArchived: false, + createdAt: now, + ); + + setUp(() { + accountRepo = FakeAccountRepository(); + transactionRepo = FakeTransactionRepository(); + logTransaction = LogTransaction(transactionRepo, accountRepo); + manageTransaction = + ManageTransaction(transactionRepo, accountRepo, logTransaction); + + accountRepo.seed([debitAccount, cashAccount, creditAccount]); + }); + + group('ManageTransaction.create', () { + test('should create an expense and deduct from debit account', () async { + final txn = Transaction( + id: 'txn-1', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-debit', + dateTime: now, + ); + + await manageTransaction.create(txn); + + final account = accountRepo.accountById('acc-debit')!; + expect(account.balance, 450000); // 500000 - 50000 + expect((await transactionRepo.getById('txn-1')), isNotNull); + }); + + test('should create income and add to debit account', () async { + final txn = Transaction( + id: 'txn-2', + amount: 100000, + type: TransactionType.income, + categoryId: 'other', + accountId: 'acc-debit', + dateTime: now, + ); + + await manageTransaction.create(txn); + + expect(accountRepo.accountById('acc-debit')!.balance, 600000); + }); + + test('should create expense on credit card (increase liability)', () async { + final txn = Transaction( + id: 'txn-3', + amount: 30000, + type: TransactionType.expense, + categoryId: 'shopping', + accountId: 'acc-credit', + dateTime: now, + ); + + await manageTransaction.create(txn); + + expect(accountRepo.accountById('acc-credit')!.balance, 130000); + }); + }); + + group('ManageTransaction.delete', () { + test('should reverse expense on debit account', () async { + final txn = Transaction( + id: 'txn-del', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-debit', + dateTime: now, + ); + + // Create then delete + await manageTransaction.create(txn); + expect(accountRepo.accountById('acc-debit')!.balance, 450000); + + await manageTransaction.delete(txn); + expect(accountRepo.accountById('acc-debit')!.balance, 500000); + expect(await transactionRepo.getById('txn-del'), isNull); + }); + + test('should reverse income on delete', () async { + final txn = Transaction( + id: 'txn-del-inc', + amount: 100000, + type: TransactionType.income, + categoryId: 'other', + accountId: 'acc-debit', + dateTime: now, + ); + + await manageTransaction.create(txn); + expect(accountRepo.accountById('acc-debit')!.balance, 600000); + + await manageTransaction.delete(txn); + expect(accountRepo.accountById('acc-debit')!.balance, 500000); + }); + + test('should reverse transfer on delete', () async { + final txn = Transaction( + id: 'txn-del-xfr', + amount: 50000, + type: TransactionType.transfer, + categoryId: 'other', + accountId: 'acc-debit', + toAccountId: 'acc-cash', + dateTime: now, + ); + + await manageTransaction.create(txn); + expect(accountRepo.accountById('acc-debit')!.balance, 450000); + expect(accountRepo.accountById('acc-cash')!.balance, 250000); + + await manageTransaction.delete(txn); + expect(accountRepo.accountById('acc-debit')!.balance, 500000); + expect(accountRepo.accountById('acc-cash')!.balance, 200000); + }); + + test('should reverse credit card expense on delete', () async { + final txn = Transaction( + id: 'txn-del-cc', + amount: 30000, + type: TransactionType.expense, + categoryId: 'shopping', + accountId: 'acc-credit', + dateTime: now, + ); + + await manageTransaction.create(txn); + expect(accountRepo.accountById('acc-credit')!.balance, 130000); + + await manageTransaction.delete(txn); + expect(accountRepo.accountById('acc-credit')!.balance, 100000); + }); + }); + + group('ManageTransaction.update', () { + test('should reverse old expense and apply new amount', () async { + final oldTxn = Transaction( + id: 'txn-upd', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-debit', + dateTime: now, + ); + + await manageTransaction.create(oldTxn); + expect(accountRepo.accountById('acc-debit')!.balance, 450000); + + final newTxn = oldTxn.copyWith(amount: 75000); + await manageTransaction.update(oldTxn, newTxn); + + expect(accountRepo.accountById('acc-debit')!.balance, 425000); + final stored = await transactionRepo.getById('txn-upd'); + expect(stored!.amount, 75000); + }); + + test('should handle type change from expense to income', () async { + final oldTxn = Transaction( + id: 'txn-type', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-debit', + dateTime: now, + ); + + await manageTransaction.create(oldTxn); + expect(accountRepo.accountById('acc-debit')!.balance, 450000); + + final newTxn = oldTxn.copyWith(type: TransactionType.income); + await manageTransaction.update(oldTxn, newTxn); + + // Reversed expense (+50k) then applied income (+50k) = 500k + 50k = 550k + expect(accountRepo.accountById('acc-debit')!.balance, 550000); + }); + + test('should handle account change', () async { + final oldTxn = Transaction( + id: 'txn-acc', + amount: 50000, + type: TransactionType.expense, + categoryId: 'food', + accountId: 'acc-debit', + dateTime: now, + ); + + await manageTransaction.create(oldTxn); + expect(accountRepo.accountById('acc-debit')!.balance, 450000); + expect(accountRepo.accountById('acc-cash')!.balance, 200000); + + final newTxn = oldTxn.copyWith(accountId: 'acc-cash'); + await manageTransaction.update(oldTxn, newTxn); + + // Old debit reversed: 450k + 50k = 500k + expect(accountRepo.accountById('acc-debit')!.balance, 500000); + // New cash applied: 200k - 50k = 150k + expect(accountRepo.accountById('acc-cash')!.balance, 150000); + }); + }); +} From 536ea33a47ff8e7458aa5491051073ec1b1df756 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 10:01:54 +0700 Subject: [PATCH 06/13] feat smart-settlement-1.0.0: Add credit account bill payment functionality with a new dedicated sheet and UI. --- lib/main.dart | 2 + .../providers/account_provider.dart | 27 ++ lib/presentation/screens/accounts_screen.dart | 73 ++++ lib/presentation/widgets/account_card.dart | 27 ++ lib/presentation/widgets/pay_bill_sheet.dart | 383 ++++++++++++++++++ .../usecases/settle_credit_bill_test.dart | 272 +++++++++++++ 6 files changed, 784 insertions(+) create mode 100644 lib/presentation/widgets/pay_bill_sheet.dart create mode 100644 test/domain/usecases/settle_credit_bill_test.dart diff --git a/lib/main.dart b/lib/main.dart index 3880cf2..0f6e0f1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,6 +17,7 @@ import 'domain/usecases/manage_transaction.dart'; import 'presentation/providers/account_provider.dart'; import 'presentation/providers/category_provider.dart'; import 'presentation/providers/transaction_provider.dart'; +import 'domain/usecases/settle_credit_bill.dart'; import 'presentation/screens/accounts_screen.dart'; import 'presentation/screens/ledger_screen.dart'; import 'presentation/screens/reports_screen.dart'; @@ -45,6 +46,7 @@ class VentExpenseApp extends StatelessWidget { sl(), sl(), sl(), + sl(), ), ), ChangeNotifierProvider( diff --git a/lib/presentation/providers/account_provider.dart b/lib/presentation/providers/account_provider.dart index 9dd3e20..cfce675 100644 --- a/lib/presentation/providers/account_provider.dart +++ b/lib/presentation/providers/account_provider.dart @@ -2,20 +2,24 @@ import 'package:flutter/foundation.dart'; import '../../domain/entities/account.dart'; import '../../domain/entities/enums.dart'; +import '../../domain/entities/transaction.dart'; import '../../domain/repositories/account_repository.dart'; import '../../domain/usecases/calculate_net_position.dart'; import '../../domain/usecases/manage_account.dart'; +import '../../domain/usecases/settle_credit_bill.dart'; /// Manages account state and net position calculation. class AccountProvider extends ChangeNotifier { final AccountRepository _accountRepository; final CalculateNetPosition _calculateNetPosition; final ManageAccount _manageAccount; + final SettleCreditBill _settleCreditBill; AccountProvider( this._accountRepository, this._calculateNetPosition, this._manageAccount, + this._settleCreditBill, ); List _accounts = []; @@ -117,4 +121,27 @@ class AccountProvider extends ChangeNotifier { notifyListeners(); } } + + /// Settles a credit card bill and refreshes the list. + /// + /// Returns the settlement [Transaction] on success, or `null` on failure. + Future settleBill({ + required String sourceAccountId, + required String creditAccountId, + required int amount, + }) async { + try { + final txn = await _settleCreditBill.call( + sourceAccountId: sourceAccountId, + creditAccountId: creditAccountId, + amount: amount, + ); + await loadAccounts(); + return txn; + } catch (e) { + _error = e.toString(); + notifyListeners(); + return null; + } + } } diff --git a/lib/presentation/screens/accounts_screen.dart b/lib/presentation/screens/accounts_screen.dart index ef8de91..55f2cc8 100644 --- a/lib/presentation/screens/accounts_screen.dart +++ b/lib/presentation/screens/accounts_screen.dart @@ -5,11 +5,14 @@ import '../../core/theme/app_colors.dart'; import '../../core/theme/app_typography.dart'; import '../../domain/entities/account.dart'; import '../../domain/entities/enums.dart'; +import '../../domain/value_objects/money.dart'; import '../painters/paper_background.dart'; import '../providers/account_provider.dart'; +import '../providers/transaction_provider.dart'; import '../widgets/account_card.dart'; import '../widgets/add_edit_account_sheet.dart'; import '../widgets/net_position_card.dart'; +import '../widgets/pay_bill_sheet.dart'; /// The accounts overview screen — lists asset and liability accounts. class AccountsScreen extends StatefulWidget { @@ -154,6 +157,9 @@ class _AccountsScreenState extends State { account: account, onTap: () => _showEditSheet(context, account), onLongPress: () => _showArchiveDialog(context, account), + onPayBill: account.balance > 0 + ? () => _showPayBillSheet(context, account) + : null, ), ), ], @@ -300,4 +306,71 @@ class _AccountsScreenState extends State { await provider.archiveAccount(account.id); } } + + Future _showPayBillSheet( + BuildContext context, + Account creditAccount, + ) async { + final accProvider = context.read(); + final txnProvider = context.read(); + + final assetAccounts = accProvider.assetAccounts + .where((a) => !a.isArchived && a.balance > 0) + .toList(); + + final result = await showModalBottomSheet>( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => PayBillSheet( + creditAccount: creditAccount, + assetAccounts: assetAccounts, + ), + ); + + if (result != null && mounted) { + final txn = await accProvider.settleBill( + sourceAccountId: result['sourceAccountId'] as String, + creditAccountId: result['creditAccountId'] as String, + amount: result['amount'] as int, + ); + + if (txn != null && mounted) { + // Refresh ledger so settlement appears + await txnProvider.loadTransactions(); + + final formatted = Money( + cents: txn.amount, + currency: creditAccount.currency, + ).formatted; + + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Settled $formatted ✓'), + backgroundColor: AppColors.inkGreen, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + ); + } + } else if (accProvider.error != null && mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(accProvider.error!), + backgroundColor: AppColors.error, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + ); + } + } + } } diff --git a/lib/presentation/widgets/account_card.dart b/lib/presentation/widgets/account_card.dart index 526e5cc..25273e7 100644 --- a/lib/presentation/widgets/account_card.dart +++ b/lib/presentation/widgets/account_card.dart @@ -10,16 +10,19 @@ import '../../domain/value_objects/money.dart'; /// /// - Tap to edit /// - Long press to archive +/// - Optional "Pay" button for credit accounts class AccountCard extends StatelessWidget { final Account account; final VoidCallback? onTap; final VoidCallback? onLongPress; + final VoidCallback? onPayBill; const AccountCard({ super.key, required this.account, this.onTap, this.onLongPress, + this.onPayBill, }); @override @@ -94,6 +97,30 @@ class AccountCard extends StatelessWidget { ), ), + // — Pay Bill button (credit accounts only) — + if (onPayBill != null) ...[ + const SizedBox(width: 8), + SizedBox( + width: 36, + height: 36, + child: Material( + color: AppColors.transferAmber.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(8), + child: InkWell( + onTap: onPayBill, + borderRadius: BorderRadius.circular(8), + child: const Icon( + Icons.payments_outlined, + color: AppColors.transferAmber, + size: 18, + ), + ), + ), + ), + ], + + const SizedBox(width: 8), + // — Balance — Text( balance.formatted, diff --git a/lib/presentation/widgets/pay_bill_sheet.dart b/lib/presentation/widgets/pay_bill_sheet.dart new file mode 100644 index 0000000..30e901d --- /dev/null +++ b/lib/presentation/widgets/pay_bill_sheet.dart @@ -0,0 +1,383 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../domain/entities/account.dart'; +import '../../domain/value_objects/money.dart'; + +/// Bottom sheet for one-touch credit card bill settlement. +/// +/// Shows the credit card's outstanding balance, lets the user pick a source +/// asset account, enter an amount (or tap "Pay Full Balance"), and settle. +class PayBillSheet extends StatefulWidget { + /// The credit card account to pay. + final Account creditAccount; + + /// Available source accounts (assets only, non-archived). + final List assetAccounts; + + const PayBillSheet({ + super.key, + required this.creditAccount, + required this.assetAccounts, + }); + + @override + State createState() => _PayBillSheetState(); +} + +class _PayBillSheetState extends State { + String? _selectedSourceId; + final _amountController = TextEditingController(); + String? _errorText; + + @override + void initState() { + super.initState(); + // Pre-select the first asset account if available + if (widget.assetAccounts.isNotEmpty) { + _selectedSourceId = widget.assetAccounts.first.id; + } + // Pre-fill with full outstanding balance + _amountController.text = widget.creditAccount.balance.toString(); + } + + @override + void dispose() { + _amountController.dispose(); + super.dispose(); + } + + Account? get _selectedSource { + if (_selectedSourceId == null) return null; + try { + return widget.assetAccounts.firstWhere((a) => a.id == _selectedSourceId); + } catch (_) { + return null; + } + } + + void _onPayFullBalance() { + _amountController.text = widget.creditAccount.balance.toString(); + setState(() => _errorText = null); + } + + void _onSettle() { + final amountText = _amountController.text.trim(); + final amount = int.tryParse(amountText); + + if (_selectedSourceId == null) { + setState(() => _errorText = 'Select a source account'); + return; + } + if (amount == null || amount <= 0) { + setState(() => _errorText = 'Enter a valid amount'); + return; + } + + final source = _selectedSource; + if (source != null && amount > source.balance) { + final formatted = Money(cents: source.balance, currency: source.currency).formatted; + setState(() => _errorText = 'Insufficient balance ($formatted available)'); + return; + } + + if (amount > widget.creditAccount.balance) { + final formatted = Money( + cents: widget.creditAccount.balance, + currency: widget.creditAccount.currency, + ).formatted; + setState(() => + _errorText = 'Amount exceeds outstanding balance ($formatted)'); + return; + } + + // Return result + Navigator.of(context).pop({ + 'sourceAccountId': _selectedSourceId, + 'creditAccountId': widget.creditAccount.id, + 'amount': amount, + }); + } + + @override + Widget build(BuildContext context) { + final outstandingBalance = Money( + cents: widget.creditAccount.balance, + currency: widget.creditAccount.currency, + ); + + return Padding( + padding: EdgeInsets.only( + left: 24, + right: 24, + top: 20, + bottom: MediaQuery.of(context).viewInsets.bottom + 24, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // — Handle bar — + Center( + child: Container( + width: 36, + height: 4, + decoration: BoxDecoration( + color: AppColors.divider, + borderRadius: BorderRadius.circular(2), + ), + ), + ), + const SizedBox(height: 16), + + // — Header — + Row( + children: [ + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: AppColors.transferAmber.withValues(alpha: 0.12), + borderRadius: BorderRadius.circular(10), + ), + child: const Icon( + Icons.payments_outlined, + color: AppColors.transferAmber, + size: 22, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Pay Bill', + style: AppTypography.titleLarge.copyWith( + color: AppColors.inkBlue, + ), + ), + Text( + widget.creditAccount.name, + style: AppTypography.bodySmall, + ), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + 'OUTSTANDING', + style: AppTypography.label.copyWith( + fontSize: 9, + letterSpacing: 1.5, + color: AppColors.stampRed, + ), + ), + Text( + outstandingBalance.formatted, + style: AppTypography.amountMedium.copyWith( + color: AppColors.stampRed, + ), + ), + ], + ), + ], + ), + const SizedBox(height: 24), + + // — Source Account Label — + Text( + 'PAY FROM', + style: AppTypography.label.copyWith( + letterSpacing: 2.0, + color: AppColors.inkLight, + ), + ), + const SizedBox(height: 8), + + // — Source Account Chips — + if (widget.assetAccounts.isEmpty) + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Text( + 'No asset accounts available', + style: AppTypography.bodySmall.copyWith( + color: AppColors.disabled, + fontStyle: FontStyle.italic, + ), + ), + ) + else + Wrap( + spacing: 8, + runSpacing: 6, + children: widget.assetAccounts.map((account) { + final isSelected = account.id == _selectedSourceId; + final balance = Money( + cents: account.balance, + currency: account.currency, + ); + return ChoiceChip( + label: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + account.name, + style: AppTypography.bodySmall.copyWith( + color: isSelected + ? AppColors.paper + : AppColors.inkDark, + fontWeight: FontWeight.w600, + ), + ), + Text( + balance.formatted, + style: AppTypography.label.copyWith( + fontSize: 10, + color: isSelected + ? AppColors.paper.withValues(alpha: 0.8) + : AppColors.inkGreen, + ), + ), + ], + ), + selected: isSelected, + onSelected: (_) { + setState(() { + _selectedSourceId = account.id; + _errorText = null; + }); + }, + selectedColor: AppColors.inkGreen, + backgroundColor: AppColors.inkGreenLight, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide( + color: isSelected + ? AppColors.inkGreen + : AppColors.divider, + ), + ), + showCheckmark: false, + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + ); + }).toList(), + ), + const SizedBox(height: 20), + + // — Amount Label + Pay Full Balance — + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'AMOUNT', + style: AppTypography.label.copyWith( + letterSpacing: 2.0, + color: AppColors.inkLight, + ), + ), + GestureDetector( + onTap: _onPayFullBalance, + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: AppColors.transferAmber.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(6), + border: Border.all( + color: AppColors.transferAmber.withValues(alpha: 0.3), + ), + ), + child: Text( + 'Pay Full Balance', + style: AppTypography.label.copyWith( + color: AppColors.transferAmber, + fontSize: 10, + letterSpacing: 0.5, + ), + ), + ), + ), + ], + ), + const SizedBox(height: 8), + + // — Amount Input — + TextField( + controller: _amountController, + keyboardType: TextInputType.number, + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + style: AppTypography.amountLarge.copyWith( + color: AppColors.inkDark, + fontSize: 24, + ), + decoration: InputDecoration( + prefixText: 'Rp ', + prefixStyle: AppTypography.amountLarge.copyWith( + color: AppColors.inkLight, + fontSize: 24, + ), + hintText: '0', + hintStyle: AppTypography.amountLarge.copyWith( + color: AppColors.disabled, + fontSize: 24, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: AppColors.divider), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide( + color: AppColors.transferAmber, + width: 1.5, + ), + ), + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + errorText: _errorText, + errorStyle: AppTypography.bodySmall.copyWith( + color: AppColors.error, + ), + ), + onChanged: (_) { + if (_errorText != null) setState(() => _errorText = null); + }, + ), + const SizedBox(height: 24), + + // — Settle Button — + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton.icon( + onPressed: widget.assetAccounts.isEmpty ? null : _onSettle, + icon: const Icon(Icons.check_circle_outline, size: 20), + label: Text( + 'Settle', + style: AppTypography.titleMedium.copyWith( + color: AppColors.paper, + ), + ), + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.transferAmber, + foregroundColor: AppColors.paper, + disabledBackgroundColor: AppColors.disabled, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + ), + ), + ], + ), + ); + } +} diff --git a/test/domain/usecases/settle_credit_bill_test.dart b/test/domain/usecases/settle_credit_bill_test.dart new file mode 100644 index 0000000..c11a04c --- /dev/null +++ b/test/domain/usecases/settle_credit_bill_test.dart @@ -0,0 +1,272 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/entities/account.dart'; +import 'package:vent_expense_pro/domain/entities/enums.dart'; +import 'package:vent_expense_pro/domain/entities/transaction.dart'; +import 'package:vent_expense_pro/domain/repositories/account_repository.dart'; +import 'package:vent_expense_pro/domain/repositories/transaction_repository.dart'; +import 'package:vent_expense_pro/domain/usecases/settle_credit_bill.dart'; + +// ——— In-memory fakes ——— + +class FakeAccountRepository implements AccountRepository { + final Map _accounts = {}; + + void seed(List accounts) { + for (final a in accounts) { + _accounts[a.id] = a; + } + } + + Account? accountById(String id) => _accounts[id]; + + @override + Future> getAll() async => _accounts.values.toList(); + + @override + Future getById(String id) async => _accounts[id]; + + @override + Future insert(Account account) async { + _accounts[account.id] = account; + return account; + } + + @override + Future update(Account account) async { + _accounts[account.id] = account; + return account; + } + + @override + Future updateBalance(String id, int newBalance) async { + final account = _accounts[id]!; + _accounts[id] = account.copyWith(balance: newBalance); + } + + @override + Future archive(String id) async { + final account = _accounts[id]!; + _accounts[id] = account.copyWith(isArchived: true); + } + + @override + Future> getByType(AccountType type) async => + _accounts.values.where((a) => a.type == type).toList(); +} + +class FakeTransactionRepository implements TransactionRepository { + final Map _transactions = {}; + + @override + Future> getAll() async => + _transactions.values.toList() + ..sort((a, b) => b.dateTime.compareTo(a.dateTime)); + + @override + Future> getByAccount(String accountId) async => + _transactions.values + .where((t) => t.accountId == accountId || t.toAccountId == accountId) + .toList(); + + @override + Future> getByDateRange( + DateTime start, DateTime end) async => + _transactions.values + .where((t) => + t.dateTime.isAfter(start.subtract(const Duration(seconds: 1))) && + t.dateTime.isBefore(end.add(const Duration(seconds: 1)))) + .toList(); + + @override + Future getById(String id) async => _transactions[id]; + + @override + Future insert(Transaction transaction) async { + _transactions[transaction.id] = transaction; + return transaction; + } + + @override + Future update(Transaction transaction) async { + _transactions[transaction.id] = transaction; + return transaction; + } + + @override + Future delete(String id) async { + _transactions.remove(id); + } +} + +// ——— Tests ——— + +void main() { + late FakeAccountRepository accountRepo; + late FakeTransactionRepository transactionRepo; + late SettleCreditBill settleCreditBill; + + final now = DateTime(2026, 2, 21, 14, 30); + + final debitAccount = Account( + id: 'acc-debit', + name: 'BCA Debit', + type: AccountType.debit, + balance: 500000, + currency: 'IDR', + createdAt: now, + ); + + final cashAccount = Account( + id: 'acc-cash', + name: 'Cash Wallet', + type: AccountType.cash, + balance: 200000, + currency: 'IDR', + createdAt: now, + ); + + final creditAccount = Account( + id: 'acc-credit', + name: 'BCA Credit Card', + type: AccountType.credit, + balance: 150000, // Rp 150,000 outstanding + currency: 'IDR', + createdAt: now, + ); + + setUp(() { + accountRepo = FakeAccountRepository(); + transactionRepo = FakeTransactionRepository(); + settleCreditBill = SettleCreditBill(transactionRepo, accountRepo); + + accountRepo.seed([debitAccount, cashAccount, creditAccount]); + }); + + group('SettleCreditBill — happy path', () { + test('should settle full balance from debit account', () async { + final txn = await settleCreditBill.call( + sourceAccountId: 'acc-debit', + creditAccountId: 'acc-credit', + amount: 150000, + ); + + // Source deducted + expect(accountRepo.accountById('acc-debit')!.balance, 350000); + // Credit liability cleared + expect(accountRepo.accountById('acc-credit')!.balance, 0); + // Settlement transaction logged + expect(txn.isSettlement, true); + expect(txn.type, TransactionType.transfer); + expect(txn.amount, 150000); + expect(txn.accountId, 'acc-debit'); + expect(txn.toAccountId, 'acc-credit'); + expect(txn.categoryId, 'settlement'); + // Persisted + final stored = await transactionRepo.getById(txn.id); + expect(stored, isNotNull); + }); + + test('should settle partial amount', () async { + final txn = await settleCreditBill.call( + sourceAccountId: 'acc-debit', + creditAccountId: 'acc-credit', + amount: 50000, + ); + + expect(accountRepo.accountById('acc-debit')!.balance, 450000); + expect(accountRepo.accountById('acc-credit')!.balance, 100000); + expect(txn.amount, 50000); + }); + + test('should settle from cash account', () async { + final txn = await settleCreditBill.call( + sourceAccountId: 'acc-cash', + creditAccountId: 'acc-credit', + amount: 100000, + ); + + expect(accountRepo.accountById('acc-cash')!.balance, 100000); + expect(accountRepo.accountById('acc-credit')!.balance, 50000); + expect(txn.accountId, 'acc-cash'); + }); + }); + + group('SettleCreditBill — validation', () { + test('should throw when amount is zero', () { + expect( + () => settleCreditBill.call( + sourceAccountId: 'acc-debit', + creditAccountId: 'acc-credit', + amount: 0, + ), + throwsA(isA()), + ); + }); + + test('should throw when amount is negative', () { + expect( + () => settleCreditBill.call( + sourceAccountId: 'acc-debit', + creditAccountId: 'acc-credit', + amount: -10000, + ), + throwsA(isA()), + ); + }); + + test('should throw when source is a credit account (not asset)', () { + expect( + () => settleCreditBill.call( + sourceAccountId: 'acc-credit', + creditAccountId: 'acc-credit', + amount: 50000, + ), + throwsA(isA()), + ); + }); + + test('should throw when target is a debit account (not liability)', () { + expect( + () => settleCreditBill.call( + sourceAccountId: 'acc-debit', + creditAccountId: 'acc-cash', + amount: 50000, + ), + throwsA(isA()), + ); + }); + + test('should throw when source account not found', () { + expect( + () => settleCreditBill.call( + sourceAccountId: 'nonexistent', + creditAccountId: 'acc-credit', + amount: 50000, + ), + throwsA(isA()), + ); + }); + + test('should throw when credit account not found', () { + expect( + () => settleCreditBill.call( + sourceAccountId: 'acc-debit', + creditAccountId: 'nonexistent', + amount: 50000, + ), + throwsA(isA()), + ); + }); + + test('should throw when insufficient balance', () { + expect( + () => settleCreditBill.call( + sourceAccountId: 'acc-debit', + creditAccountId: 'acc-credit', + amount: 600000, // source only has 500000 + ), + throwsA(isA()), + ); + }); + }); +} From 461dc0b62a8f6da7eff7b3615c719e698949608e Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 10:26:39 +0700 Subject: [PATCH 07/13] feat google-drive-sync-1.0.0: Implement Google Drive backup and restore functionality with dedicated UI, services, and data management. --- .gitignore | 4 +- lib/core/di/service_locator.dart | 11 + lib/core/utils/database_export.dart | 85 +++++ .../datasources/google_drive_service.dart | 177 +++++++++ .../repositories/sync_repository_impl.dart | 70 ++++ lib/domain/entities/sync_status.dart | 72 ++++ lib/domain/repositories/sync_repository.dart | 36 ++ lib/domain/usecases/sync_data.dart | 63 ++++ lib/main.dart | 42 ++- lib/presentation/providers/sync_provider.dart | 133 +++++++ .../widgets/sync_settings_card.dart | 345 ++++++++++++++++++ pubspec.lock | 2 +- pubspec.yaml | 3 +- test/domain/usecases/sync_data_test.dart | 98 +++++ 14 files changed, 1137 insertions(+), 4 deletions(-) create mode 100644 lib/core/utils/database_export.dart create mode 100644 lib/data/datasources/google_drive_service.dart create mode 100644 lib/data/repositories/sync_repository_impl.dart create mode 100644 lib/domain/entities/sync_status.dart create mode 100644 lib/domain/repositories/sync_repository.dart create mode 100644 lib/domain/usecases/sync_data.dart create mode 100644 lib/presentation/providers/sync_provider.dart create mode 100644 lib/presentation/widgets/sync_settings_card.dart create mode 100644 test/domain/usecases/sync_data_test.dart diff --git a/.gitignore b/.gitignore index 5f601b4..3ec25d0 100644 --- a/.gitignore +++ b/.gitignore @@ -44,4 +44,6 @@ app.*.map.json /android/app/release *.env -*.freezed.dart \ No newline at end of file +*.freezed.dart + +google-services.json \ No newline at end of file diff --git a/lib/core/di/service_locator.dart b/lib/core/di/service_locator.dart index 7aa4a31..146c795 100644 --- a/lib/core/di/service_locator.dart +++ b/lib/core/di/service_locator.dart @@ -1,16 +1,20 @@ import 'package:get_it/get_it.dart'; +import '../../data/datasources/google_drive_service.dart'; import '../../data/repositories/account_repository_impl.dart'; import '../../data/repositories/category_repository_impl.dart'; +import '../../data/repositories/sync_repository_impl.dart'; import '../../data/repositories/transaction_repository_impl.dart'; import '../../domain/repositories/account_repository.dart'; import '../../domain/repositories/category_repository.dart'; +import '../../domain/repositories/sync_repository.dart'; import '../../domain/repositories/transaction_repository.dart'; import '../../domain/usecases/calculate_net_position.dart'; import '../../domain/usecases/log_transaction.dart'; import '../../domain/usecases/manage_account.dart'; import '../../domain/usecases/manage_transaction.dart'; import '../../domain/usecases/settle_credit_bill.dart'; +import '../../domain/usecases/sync_data.dart'; /// Global service locator instance. final sl = GetIt.instance; @@ -24,6 +28,12 @@ Future initServiceLocator() async { ); sl.registerLazySingleton(() => CategoryRepositoryImpl()); + // — Google Drive Sync — + sl.registerLazySingleton(() => GoogleDriveService()); + sl.registerLazySingleton( + () => SyncRepositoryImpl(sl()), + ); + // — Use Cases — sl.registerFactory(() => CalculateNetPosition(sl())); sl.registerFactory( @@ -41,4 +51,5 @@ Future initServiceLocator() async { sl(), ), ); + sl.registerFactory(() => SyncData(sl())); } diff --git a/lib/core/utils/database_export.dart b/lib/core/utils/database_export.dart new file mode 100644 index 0000000..76f6edf --- /dev/null +++ b/lib/core/utils/database_export.dart @@ -0,0 +1,85 @@ +import 'dart:convert'; + +import '../../data/datasources/local_database.dart'; + +/// Utility for exporting / importing the entire local database +/// as a JSON-serializable map. +/// +/// Backup format: +/// ```json +/// { +/// "version": 1, +/// "exportedAt": "2026-02-21T10:00:00.000", +/// "accounts": [ ... ], +/// "transactions": [ ... ], +/// "categories": [ ... ] +/// } +/// ``` +class DatabaseExport { + /// The current export schema version. + static const int _version = 1; + + /// Exports all rows from accounts, transactions, and categories + /// into a single JSON-encodable map. + static Future> exportAll() async { + final db = await LocalDatabase.database; + + final accounts = await db.query('accounts'); + final transactions = await db.query('transactions'); + final categories = await db.query('categories'); + + return { + 'version': _version, + 'exportedAt': DateTime.now().toIso8601String(), + 'accounts': accounts, + 'transactions': transactions, + 'categories': categories, + }; + } + + /// Exports all data as a JSON string ready for upload. + static Future exportAsJson() async { + final data = await exportAll(); + return jsonEncode(data); + } + + /// Replaces **all** local data with the contents of [data]. + /// + /// Wraps the entire operation in a database transaction + /// for atomicity — if anything fails, no changes are committed. + static Future importAll(Map data) async { + final db = await LocalDatabase.database; + + await db.transaction((txn) async { + // 1. Clear existing data (order matters for FK constraints). + await txn.delete('transactions'); + await txn.delete('accounts'); + await txn.delete('categories'); + + // 2. Re-insert categories. + final categories = data['categories'] as List? ?? []; + for (final row in categories) { + await txn.insert('categories', Map.from(row as Map)); + } + + // 3. Re-insert accounts. + final accounts = data['accounts'] as List? ?? []; + for (final row in accounts) { + await txn.insert('accounts', Map.from(row as Map)); + } + + // 4. Re-insert transactions. + final transactions = data['transactions'] as List? ?? []; + for (final row in transactions) { + await txn.insert( + 'transactions', Map.from(row as Map)); + } + }); + } + + /// Convenience: decode a JSON string and import. + static Future importFromJson(String jsonString) async { + final data = jsonDecode(jsonString) as Map; + await importAll(data); + } +} diff --git a/lib/data/datasources/google_drive_service.dart b/lib/data/datasources/google_drive_service.dart new file mode 100644 index 0000000..d16b783 --- /dev/null +++ b/lib/data/datasources/google_drive_service.dart @@ -0,0 +1,177 @@ +import 'dart:convert'; + +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:googleapis/drive/v3.dart' as drive; +import 'package:http/http.dart' as http; + +/// Low-level service wrapping Google Sign-In + Google Drive API (v3). +/// +/// All file operations target the `appDataFolder` — a hidden, +/// app-private folder that the user cannot browse in their Drive. +class GoogleDriveService { + static const _backupPrefix = 'vent_expense_backup_'; + static const _mimeType = 'application/json'; + + /// Number of old backups to keep after a new one is uploaded. + static const _keepBackupCount = 5; + + final GoogleSignIn _googleSignIn = GoogleSignIn( + scopes: [drive.DriveApi.driveAppdataScope], + ); + + // ── Authentication ────────────────────────────────────── + + /// Trigger interactive Google Sign-In. + /// + /// Returns the signed-in [GoogleSignInAccount]. + /// Throws if the user cancels or an error occurs. + Future signIn() async { + final account = await _googleSignIn.signIn(); + if (account == null) { + throw Exception('Google Sign-In was cancelled.'); + } + return account; + } + + /// Sign out and disconnect. + Future signOut() async { + await _googleSignIn.signOut(); + } + + /// Whether a Google account is currently signed in. + Future isSignedIn() => _googleSignIn.isSignedIn(); + + /// Returns the currently signed-in account, or `null`. + GoogleSignInAccount? get currentUser => _googleSignIn.currentUser; + + /// Attempts to restore a previous sign-in silently (no UI). + Future signInSilently() => + _googleSignIn.signInSilently(); + + // ── Drive File Operations ─────────────────────────────── + + /// Uploads [jsonString] as a backup file to `appDataFolder`. + /// + /// The file is named `vent_expense_backup_.json`. + /// After upload, old backups beyond [_keepBackupCount] are cleaned up. + Future uploadBackup(String jsonString) async { + final driveApi = await _getDriveApi(); + final now = DateTime.now(); + final filename = '$_backupPrefix${now.toIso8601String()}.json'; + + final media = drive.Media( + Stream.value(utf8.encode(jsonString)), + utf8.encode(jsonString).length, + ); + + final driveFile = drive.File() + ..name = filename + ..parents = ['appDataFolder'] + ..mimeType = _mimeType; + + await driveApi.files.create(driveFile, uploadMedia: media); + + // Clean up old backups, keep only the latest N. + await _cleanupOldBackups(driveApi); + + return now; + } + + /// Downloads the content of the most recent backup file. + /// + /// Returns the JSON string. Throws if no backup exists. + Future downloadLatestBackup() async { + final driveApi = await _getDriveApi(); + final latest = await _getLatestBackupFile(driveApi); + + if (latest == null || latest.id == null) { + throw Exception('No backup found on Google Drive.'); + } + + final media = await driveApi.files.get( + latest.id!, + downloadOptions: drive.DownloadOptions.fullMedia, + ) as drive.Media; + + final bytes = []; + await for (final chunk in media.stream) { + bytes.addAll(chunk); + } + + return utf8.decode(bytes); + } + + /// Returns the `modifiedTime` of the most recent backup, + /// or `null` if no backups exist. + Future getLatestBackupTime() async { + final driveApi = await _getDriveApi(); + final latest = await _getLatestBackupFile(driveApi); + return latest?.modifiedTime; + } + + // ── Helpers ───────────────────────────────────────────── + + /// Builds an authenticated [drive.DriveApi] client. + Future _getDriveApi() async { + var account = _googleSignIn.currentUser; + account ??= await _googleSignIn.signInSilently(); + + if (account == null) { + throw Exception('Not signed in to Google.'); + } + + final authHeaders = await account.authHeaders; + final client = _GoogleAuthClient(authHeaders); + return drive.DriveApi(client); + } + + /// Returns the most recent backup file metadata, or `null`. + Future _getLatestBackupFile(drive.DriveApi api) async { + final fileList = await api.files.list( + spaces: 'appDataFolder', + q: "name contains '$_backupPrefix'", + orderBy: 'modifiedTime desc', + pageSize: 1, + $fields: 'files(id, name, modifiedTime)', + ); + + final files = fileList.files; + if (files == null || files.isEmpty) return null; + return files.first; + } + + /// Deletes old backups beyond [_keepBackupCount]. + Future _cleanupOldBackups(drive.DriveApi api) async { + final fileList = await api.files.list( + spaces: 'appDataFolder', + q: "name contains '$_backupPrefix'", + orderBy: 'modifiedTime desc', + $fields: 'files(id, name)', + ); + + final files = fileList.files; + if (files == null || files.length <= _keepBackupCount) return; + + // Delete everything after the first N. + for (var i = _keepBackupCount; i < files.length; i++) { + final id = files[i].id; + if (id != null) { + await api.files.delete(id); + } + } + } +} + +/// A simple [http.BaseClient] that injects Google auth headers. +class _GoogleAuthClient extends http.BaseClient { + final Map _headers; + final http.Client _inner = http.Client(); + + _GoogleAuthClient(this._headers); + + @override + Future send(http.BaseRequest request) { + request.headers.addAll(_headers); + return _inner.send(request); + } +} diff --git a/lib/data/repositories/sync_repository_impl.dart b/lib/data/repositories/sync_repository_impl.dart new file mode 100644 index 0000000..a9e49cd --- /dev/null +++ b/lib/data/repositories/sync_repository_impl.dart @@ -0,0 +1,70 @@ +import '../../core/utils/database_export.dart'; +import '../../domain/repositories/sync_repository.dart'; +import '../datasources/google_drive_service.dart'; + +/// Implements [SyncRepository] by composing [GoogleDriveService] +/// (authentication + Drive file ops) with [DatabaseExport] +/// (local DB ↔ JSON serialization). +class SyncRepositoryImpl implements SyncRepository { + final GoogleDriveService _driveService; + + SyncRepositoryImpl(this._driveService); + + // ── Authentication ────────────────────────────────────── + + @override + Future signIn() async { + final account = await _driveService.signIn(); + return account.email; + } + + @override + Future signOut() => _driveService.signOut(); + + @override + Future isSignedIn() => _driveService.isSignedIn(); + + @override + Future getSignedInEmail() async { + var user = _driveService.currentUser; + user ??= await _driveService.signInSilently(); + return user?.email; + } + + @override + Future getSignedInDisplayName() async { + var user = _driveService.currentUser; + user ??= await _driveService.signInSilently(); + return user?.displayName; + } + + // ── Backup ────────────────────────────────────────────── + + @override + Future backup() async { + // 1. Export the entire local DB to a JSON string. + final jsonString = await DatabaseExport.exportAsJson(); + + // 2. Upload to Drive appDataFolder. + final timestamp = await _driveService.uploadBackup(jsonString); + + return timestamp; + } + + // ── Restore ───────────────────────────────────────────── + + @override + Future restore() async { + // 1. Download the latest backup JSON. + final jsonString = await _driveService.downloadLatestBackup(); + + // 2. Replace local data atomically. + await DatabaseExport.importFromJson(jsonString); + } + + // ── Query ─────────────────────────────────────────────── + + @override + Future getLastBackupTime() => + _driveService.getLatestBackupTime(); +} diff --git a/lib/domain/entities/sync_status.dart b/lib/domain/entities/sync_status.dart new file mode 100644 index 0000000..a52d86d --- /dev/null +++ b/lib/domain/entities/sync_status.dart @@ -0,0 +1,72 @@ +import 'package:equatable/equatable.dart'; + +/// Represents the current state of Google Drive sync. +class SyncStatus extends Equatable { + /// Whether a Google account is currently signed in. + final bool isSignedIn; + + /// The signed-in user's email address. + final String? userEmail; + + /// The signed-in user's display name. + final String? userDisplayName; + + /// Timestamp of the most recent successful backup. + final DateTime? lastBackupAt; + + /// Whether a sync operation (backup / restore) is in progress. + final bool isSyncing; + + /// Human-readable error message from the last failed operation. + final String? errorMessage; + + const SyncStatus({ + this.isSignedIn = false, + this.userEmail, + this.userDisplayName, + this.lastBackupAt, + this.isSyncing = false, + this.errorMessage, + }); + + /// Initial / default status — signed out, idle. + static const initial = SyncStatus(); + + /// Returns a copy with the given fields replaced. + SyncStatus copyWith({ + bool? isSignedIn, + String? userEmail, + String? userDisplayName, + DateTime? lastBackupAt, + bool? isSyncing, + String? errorMessage, + // Allow explicitly clearing nullable fields. + bool clearUserEmail = false, + bool clearUserDisplayName = false, + bool clearLastBackupAt = false, + bool clearErrorMessage = false, + }) { + return SyncStatus( + isSignedIn: isSignedIn ?? this.isSignedIn, + userEmail: clearUserEmail ? null : (userEmail ?? this.userEmail), + userDisplayName: clearUserDisplayName + ? null + : (userDisplayName ?? this.userDisplayName), + lastBackupAt: + clearLastBackupAt ? null : (lastBackupAt ?? this.lastBackupAt), + isSyncing: isSyncing ?? this.isSyncing, + errorMessage: + clearErrorMessage ? null : (errorMessage ?? this.errorMessage), + ); + } + + @override + List get props => [ + isSignedIn, + userEmail, + userDisplayName, + lastBackupAt, + isSyncing, + errorMessage, + ]; +} diff --git a/lib/domain/repositories/sync_repository.dart b/lib/domain/repositories/sync_repository.dart new file mode 100644 index 0000000..3e92774 --- /dev/null +++ b/lib/domain/repositories/sync_repository.dart @@ -0,0 +1,36 @@ +/// Contract for Google Drive sync operations. +/// +/// All operations use Google Drive's `appDataFolder` — +/// a hidden, app-private folder that the user cannot browse. +abstract class SyncRepository { + /// Sign in with Google. Returns the signed-in email. + /// + /// Throws if the user cancels or an error occurs. + Future signIn(); + + /// Sign out and clear cached credentials. + Future signOut(); + + /// Whether a Google account is currently signed in. + Future isSignedIn(); + + /// Returns the signed-in user's email, or `null`. + Future getSignedInEmail(); + + /// Returns the signed-in user's display name, or `null`. + Future getSignedInDisplayName(); + + /// Export the entire local database as JSON and upload to Drive. + /// + /// Returns the backup timestamp. Throws on failure. + Future backup(); + + /// Download the latest backup from Drive and overwrite local data. + /// + /// Throws if no backup exists or on failure. + Future restore(); + + /// Returns the timestamp of the most recent backup on Drive, + /// or `null` if no backups exist. + Future getLastBackupTime(); +} diff --git a/lib/domain/usecases/sync_data.dart b/lib/domain/usecases/sync_data.dart new file mode 100644 index 0000000..f45ae14 --- /dev/null +++ b/lib/domain/usecases/sync_data.dart @@ -0,0 +1,63 @@ +import '../repositories/sync_repository.dart'; + +/// Orchestrates Google Drive backup & restore operations. +/// +/// Validates preconditions (e.g. must be signed in) before +/// delegating to [SyncRepository]. +class SyncData { + final SyncRepository _syncRepository; + + SyncData(this._syncRepository); + + // ── Authentication ────────────────────────────────────── + + /// Sign in with Google. Returns the signed-in email. + Future signIn() => _syncRepository.signIn(); + + /// Sign out and clear cached credentials. + Future signOut() => _syncRepository.signOut(); + + /// Whether a Google account is currently signed in. + Future isSignedIn() => _syncRepository.isSignedIn(); + + /// Returns the signed-in user's email, or `null`. + Future getSignedInEmail() => _syncRepository.getSignedInEmail(); + + /// Returns the signed-in user's display name, or `null`. + Future getSignedInDisplayName() => + _syncRepository.getSignedInDisplayName(); + + // ── Backup ────────────────────────────────────────────── + + /// Back up all local data to Google Drive. + /// + /// Returns the backup timestamp. + /// Throws [StateError] if the user is not signed in. + Future backup() async { + final signedIn = await _syncRepository.isSignedIn(); + if (!signedIn) { + throw StateError('Must be signed in before backing up.'); + } + return _syncRepository.backup(); + } + + // ── Restore ───────────────────────────────────────────── + + /// Restore data from the latest Google Drive backup. + /// + /// Throws [StateError] if the user is not signed in. + Future restore() async { + final signedIn = await _syncRepository.isSignedIn(); + if (!signedIn) { + throw StateError('Must be signed in before restoring.'); + } + return _syncRepository.restore(); + } + + // ── Query ─────────────────────────────────────────────── + + /// Returns the timestamp of the most recent backup on Drive, + /// or `null` if no backups exist. + Future getLastBackupTime() => + _syncRepository.getLastBackupTime(); +} diff --git a/lib/main.dart b/lib/main.dart index 0f6e0f1..0f392dc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,15 +14,18 @@ import 'domain/repositories/transaction_repository.dart'; import 'domain/usecases/calculate_net_position.dart'; import 'domain/usecases/manage_account.dart'; import 'domain/usecases/manage_transaction.dart'; +import 'domain/usecases/settle_credit_bill.dart'; +import 'domain/usecases/sync_data.dart'; import 'presentation/providers/account_provider.dart'; import 'presentation/providers/category_provider.dart'; +import 'presentation/providers/sync_provider.dart'; import 'presentation/providers/transaction_provider.dart'; -import 'domain/usecases/settle_credit_bill.dart'; import 'presentation/screens/accounts_screen.dart'; import 'presentation/screens/ledger_screen.dart'; import 'presentation/screens/reports_screen.dart'; import 'presentation/widgets/manage_categories_sheet.dart'; import 'presentation/widgets/quick_add_transaction_sheet.dart'; +import 'presentation/widgets/sync_settings_card.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -59,6 +62,9 @@ class VentExpenseApp extends StatelessWidget { ChangeNotifierProvider( create: (_) => CategoryProvider(sl()), ), + ChangeNotifierProvider( + create: (_) => SyncProvider(sl()), + ), ], child: MaterialApp( title: 'VentExpense Pro', @@ -98,6 +104,7 @@ class _HomeShellState extends State { icon: const Icon(Icons.more_vert, color: AppColors.inkLight), onSelected: (value) { if (value == 'categories') _openCategoryManager(context); + if (value == 'sync') _openSyncSettings(context); }, itemBuilder: (_) => [ const PopupMenuItem( @@ -110,6 +117,16 @@ class _HomeShellState extends State { ], ), ), + const PopupMenuItem( + value: 'sync', + child: Row( + children: [ + Icon(Icons.cloud_outlined, size: 20), + SizedBox(width: 8), + Text('Backup & Sync'), + ], + ), + ), ], ), ], @@ -199,4 +216,27 @@ class _HomeShellState extends State { builder: (_) => const ManageCategoriesSheet(), ); } + + void _openSyncSettings(BuildContext context) { + // Load current sync status before showing + context.read().loadStatus(); + + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => Padding( + padding: EdgeInsets.only( + left: 16, + right: 16, + top: 16, + bottom: MediaQuery.of(context).viewInsets.bottom + 24, + ), + child: const SyncSettingsCard(), + ), + ); + } } diff --git a/lib/presentation/providers/sync_provider.dart b/lib/presentation/providers/sync_provider.dart new file mode 100644 index 0000000..3292dac --- /dev/null +++ b/lib/presentation/providers/sync_provider.dart @@ -0,0 +1,133 @@ +import 'package:flutter/foundation.dart'; + +import '../../domain/entities/sync_status.dart'; +import '../../domain/usecases/sync_data.dart'; + +/// Manages Google Drive sync state for the UI. +class SyncProvider extends ChangeNotifier { + final SyncData _syncData; + + SyncStatus _status = SyncStatus.initial; + + /// The current sync status. + SyncStatus get status => _status; + + SyncProvider(this._syncData); + + // ── Initialisation ────────────────────────────────────── + + /// Checks whether the user is already signed in and loads + /// the last backup timestamp. Call once on init. + Future loadStatus() async { + try { + final signedIn = await _syncData.isSignedIn(); + if (signedIn) { + final email = await _syncData.getSignedInEmail(); + final displayName = await _syncData.getSignedInDisplayName(); + final lastBackup = await _syncData.getLastBackupTime(); + + _status = _status.copyWith( + isSignedIn: true, + userEmail: email, + userDisplayName: displayName, + lastBackupAt: lastBackup, + clearErrorMessage: true, + ); + } else { + _status = SyncStatus.initial; + } + } catch (e) { + _status = _status.copyWith(errorMessage: e.toString()); + } + notifyListeners(); + } + + // ── Sign In ───────────────────────────────────────────── + + /// Triggers Google Sign-In and updates status. + Future signIn() async { + _status = _status.copyWith(isSyncing: true, clearErrorMessage: true); + notifyListeners(); + + try { + final email = await _syncData.signIn(); + final displayName = await _syncData.getSignedInDisplayName(); + final lastBackup = await _syncData.getLastBackupTime(); + + _status = _status.copyWith( + isSignedIn: true, + userEmail: email, + userDisplayName: displayName, + lastBackupAt: lastBackup, + isSyncing: false, + ); + } catch (e) { + _status = _status.copyWith( + isSyncing: false, + errorMessage: e.toString(), + ); + } + notifyListeners(); + } + + // ── Sign Out ──────────────────────────────────────────── + + /// Signs out and resets status to initial. + Future signOut() async { + try { + await _syncData.signOut(); + _status = SyncStatus.initial; + } catch (e) { + _status = _status.copyWith(errorMessage: e.toString()); + } + notifyListeners(); + } + + // ── Backup ────────────────────────────────────────────── + + /// Backs up all local data to Google Drive. + Future backup() async { + _status = _status.copyWith(isSyncing: true, clearErrorMessage: true); + notifyListeners(); + + try { + final timestamp = await _syncData.backup(); + _status = _status.copyWith( + isSyncing: false, + lastBackupAt: timestamp, + ); + } catch (e) { + _status = _status.copyWith( + isSyncing: false, + errorMessage: e.toString(), + ); + } + notifyListeners(); + } + + // ── Restore ───────────────────────────────────────────── + + /// Restores data from the latest Google Drive backup. + /// + /// After a successful restore, call [onRestoreComplete] to + /// reload other providers (accounts, transactions, etc.). + Future restore() async { + _status = _status.copyWith(isSyncing: true, clearErrorMessage: true); + notifyListeners(); + + try { + await _syncData.restore(); + final lastBackup = await _syncData.getLastBackupTime(); + _status = _status.copyWith( + isSyncing: false, + lastBackupAt: lastBackup, + ); + } catch (e) { + _status = _status.copyWith( + isSyncing: false, + errorMessage: e.toString(), + ); + } + notifyListeners(); + } +} diff --git a/lib/presentation/widgets/sync_settings_card.dart b/lib/presentation/widgets/sync_settings_card.dart new file mode 100644 index 0000000..5f80801 --- /dev/null +++ b/lib/presentation/widgets/sync_settings_card.dart @@ -0,0 +1,345 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../providers/sync_provider.dart'; + +/// A card widget providing Google Drive backup & restore controls. +/// +/// Shows sign-in, backup, restore, and sign-out actions +/// styled in the Stationery aesthetic. +class SyncSettingsCard extends StatelessWidget { + const SyncSettingsCard({super.key}); + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, provider, _) { + final status = provider.status; + + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: AppColors.paper, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: AppColors.divider), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // ── Header ──────────────────────────────── + Row( + children: [ + const Icon( + Icons.cloud_outlined, + color: AppColors.inkBlue, + size: 24, + ), + const SizedBox(width: 10), + Text( + 'Backup & Sync', + style: AppTypography.titleMedium.copyWith( + color: AppColors.inkBlue, + ), + ), + ], + ), + const SizedBox(height: 6), + const Text( + 'Your data stays private — stored in a hidden, app-only folder on your Google Drive.', + style: AppTypography.bodySmall, + ), + const SizedBox(height: 16), + const Divider(color: AppColors.divider, height: 1), + const SizedBox(height: 16), + + // ── Error banner ────────────────────────── + if (status.errorMessage != null) ...[ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: AppColors.stampRedLight, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + const Icon(Icons.error_outline, + color: AppColors.stampRed, size: 18), + const SizedBox(width: 8), + Expanded( + child: Text( + status.errorMessage!, + style: AppTypography.bodySmall.copyWith( + color: AppColors.stampRed, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 12), + ], + + // ── Syncing indicator ───────────────────── + if (status.isSyncing) ...[ + const Center( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 24), + child: Column( + children: [ + SizedBox( + width: 32, + height: 32, + child: CircularProgressIndicator( + strokeWidth: 3, + color: AppColors.inkBlue, + ), + ), + SizedBox(height: 6), + Text('Syncing…', style: AppTypography.bodyMedium), + ], + ), + ), + ), + ] + + // ── Signed OUT ──────────────────────────── + else if (!status.isSignedIn) ...[ + _buildSignInButton(context, provider), + ] + + // ── Signed IN ───────────────────────────── + else ...[ + _buildSignedInSection(context, provider), + ], + ], + ), + ); + }, + ); + } + + // ── Sign-In Button ────────────────────────────────────── + + Widget _buildSignInButton(BuildContext context, SyncProvider provider) { + return SizedBox( + height: 48, + child: OutlinedButton.icon( + onPressed: () => provider.signIn(), + icon: const Icon(Icons.login, size: 20), + label: const Text('Sign in with Google'), + style: OutlinedButton.styleFrom( + foregroundColor: AppColors.inkBlue, + side: const BorderSide(color: AppColors.inkBlue), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + textStyle: AppTypography.bodyMedium.copyWith( + fontWeight: FontWeight.w600, + ), + ), + ), + ); + } + + // ── Signed-In Section ─────────────────────────────────── + + Widget _buildSignedInSection(BuildContext context, SyncProvider provider) { + final status = provider.status; + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // User info + Row( + children: [ + Container( + width: 36, + height: 36, + decoration: BoxDecoration( + color: AppColors.inkBlue.withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: Center( + child: Text( + (status.userEmail ?? '?')[0].toUpperCase(), + style: AppTypography.titleMedium.copyWith( + color: AppColors.inkBlue, + ), + ), + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (status.userDisplayName != null) + Text( + status.userDisplayName!, + style: AppTypography.bodyMedium.copyWith( + fontWeight: FontWeight.w600, + ), + overflow: TextOverflow.ellipsis, + ), + Text( + status.userEmail ?? '', + style: AppTypography.bodySmall, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ], + ), + const SizedBox(height: 16), + + // Last backup info + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + decoration: BoxDecoration( + color: AppColors.paperElevated, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + const Icon(Icons.schedule, size: 16, color: AppColors.inkLight), + const SizedBox(width: 8), + Text( + status.lastBackupAt != null + ? 'Last backup: ${_formatTimestamp(status.lastBackupAt!)}' + : 'No backups yet', + style: AppTypography.bodySmall, + ), + ], + ), + ), + const SizedBox(height: 16), + + // Action buttons + Row( + children: [ + // Backup button + Expanded( + child: SizedBox( + height: 44, + child: FilledButton.icon( + onPressed: () => provider.backup(), + icon: const Icon(Icons.cloud_upload_outlined, size: 18), + label: const Text('Backup Now'), + style: FilledButton.styleFrom( + backgroundColor: AppColors.inkBlue, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + textStyle: AppTypography.bodyMedium.copyWith( + fontWeight: FontWeight.w600, + color: Colors.white, + ), + ), + ), + ), + ), + const SizedBox(width: 10), + // Restore button + Expanded( + child: SizedBox( + height: 44, + child: OutlinedButton.icon( + onPressed: () => _confirmRestore(context, provider), + icon: const Icon(Icons.cloud_download_outlined, size: 18), + label: const Text('Restore'), + style: OutlinedButton.styleFrom( + foregroundColor: AppColors.stampRed, + side: const BorderSide(color: AppColors.stampRed), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + textStyle: AppTypography.bodyMedium.copyWith( + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ), + ], + ), + const SizedBox(height: 12), + + // Sign-out + Center( + child: TextButton( + onPressed: () => provider.signOut(), + child: Text( + 'Sign Out', + style: AppTypography.bodySmall.copyWith( + color: AppColors.inkLight, + decoration: TextDecoration.underline, + ), + ), + ), + ), + ], + ); + } + + // ── Restore Confirmation Dialog ───────────────────────── + + void _confirmRestore(BuildContext context, SyncProvider provider) { + showDialog( + context: context, + builder: (ctx) => AlertDialog( + backgroundColor: AppColors.paper, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + title: Text( + 'Restore from Backup?', + style: AppTypography.titleMedium.copyWith(color: AppColors.inkBlue), + ), + content: const Text( + 'This will replace all current data with the latest backup from Google Drive. This action cannot be undone.', + style: AppTypography.bodyMedium, + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(ctx), + child: Text( + 'Cancel', + style: AppTypography.bodyMedium.copyWith( + color: AppColors.inkLight, + ), + ), + ), + FilledButton( + onPressed: () { + Navigator.pop(ctx); + provider.restore(); + }, + style: FilledButton.styleFrom( + backgroundColor: AppColors.stampRed, + foregroundColor: Colors.white, + ), + child: const Text('Restore'), + ), + ], + ), + ); + } + + // ── Helpers ───────────────────────────────────────────── + + String _formatTimestamp(DateTime dt) { + final now = DateTime.now(); + final diff = now.difference(dt); + + if (diff.inMinutes < 1) return 'Just now'; + if (diff.inMinutes < 60) return '${diff.inMinutes}m ago'; + if (diff.inHours < 24) return '${diff.inHours}h ago'; + if (diff.inDays < 7) return '${diff.inDays}d ago'; + + return DateFormat('MMM d, yyyy – HH:mm').format(dt); + } +} diff --git a/pubspec.lock b/pubspec.lock index 4915231..acc4233 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -353,7 +353,7 @@ packages: source: hosted version: "1.0.1" http: - dependency: transitive + dependency: "direct main" description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" diff --git a/pubspec.yaml b/pubspec.yaml index b09bce4..bd50486 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,9 +25,10 @@ dependencies: uuid: ^4.5.1 intl: ^0.20.2 - # Google Drive Sync (prep — wired in Phase 3) + # Google Drive Sync google_sign_in: ^6.2.2 googleapis: ^14.0.0 + http: ^1.2.2 # Report Generation (prep — wired in Phase 2) pdf: ^3.11.2 diff --git a/test/domain/usecases/sync_data_test.dart b/test/domain/usecases/sync_data_test.dart new file mode 100644 index 0000000..3b52652 --- /dev/null +++ b/test/domain/usecases/sync_data_test.dart @@ -0,0 +1,98 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/repositories/sync_repository.dart'; +import 'package:vent_expense_pro/domain/usecases/sync_data.dart'; + +/// A simple fake of [SyncRepository] for testing. +class FakeSyncRepository implements SyncRepository { + bool _signedIn = false; + String? _email; + DateTime? _lastBackup; + + @override + Future signIn() async { + _signedIn = true; + _email = 'test@example.com'; + return _email!; + } + + @override + Future signOut() async { + _signedIn = false; + _email = null; + } + + @override + Future isSignedIn() async => _signedIn; + + @override + Future getSignedInEmail() async => _email; + + @override + Future getSignedInDisplayName() async => + _signedIn ? 'Test User' : null; + + @override + Future backup() async { + _lastBackup = DateTime.now(); + return _lastBackup!; + } + + @override + Future restore() async { + if (_lastBackup == null) throw Exception('No backup'); + } + + @override + Future getLastBackupTime() async => _lastBackup; +} + +void main() { + late FakeSyncRepository fakeRepo; + late SyncData syncData; + + setUp(() { + fakeRepo = FakeSyncRepository(); + syncData = SyncData(fakeRepo); + }); + + group('SyncData.signIn', () { + test('should return email on successful sign in', () async { + final email = await syncData.signIn(); + expect(email, 'test@example.com'); + expect(await syncData.isSignedIn(), true); + }); + }); + + group('SyncData.backup', () { + test('should throw StateError when not signed in', () async { + expect( + () => syncData.backup(), + throwsA(isA()), + ); + }); + + test('should return timestamp on successful backup when signed in', () async { + await syncData.signIn(); + final timestamp = await syncData.backup(); + expect(timestamp, isA()); + expect(await syncData.getLastBackupTime(), timestamp); + }); + }); + + group('SyncData.restore', () { + test('should throw StateError when not signed in', () async { + expect( + () => syncData.restore(), + throwsA(isA()), + ); + }); + + test('should delegate to repository when signed in', () async { + await syncData.signIn(); + await syncData.backup(); // Create a backup first in fake + + // Should not throw + await syncData.restore(); + }); + }); +} From 0f595dee2daab1e84566f1f40f7efb44c3fa8096 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 11:23:47 +0700 Subject: [PATCH 08/13] feat bank-ready-reports-1.0.0: enable PDF and Excel report generation with filtering and sharing options. --- lib/core/di/service_locator.dart | 23 ++ .../datasources/excel_report_service.dart | 82 ++++ lib/data/datasources/pdf_report_service.dart | 221 +++++++++++ .../repositories/report_repository_impl.dart | 54 +++ .../repositories/report_repository.dart | 26 ++ lib/domain/usecases/generate_report.dart | 67 ++++ lib/main.dart | 5 + .../providers/reports_provider.dart | 69 ++++ lib/presentation/screens/reports_screen.dart | 360 ++++++++++++++++-- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 64 ++++ pubspec.yaml | 1 + .../domain/usecases/generate_report_test.dart | 145 +++++++ .../flutter/generated_plugin_registrant.cc | 6 + windows/flutter/generated_plugins.cmake | 2 + 17 files changed, 1108 insertions(+), 24 deletions(-) create mode 100644 lib/data/datasources/excel_report_service.dart create mode 100644 lib/data/datasources/pdf_report_service.dart create mode 100644 lib/data/repositories/report_repository_impl.dart create mode 100644 lib/domain/repositories/report_repository.dart create mode 100644 lib/domain/usecases/generate_report.dart create mode 100644 lib/presentation/providers/reports_provider.dart create mode 100644 test/domain/usecases/generate_report_test.dart diff --git a/lib/core/di/service_locator.dart b/lib/core/di/service_locator.dart index 146c795..05dcefe 100644 --- a/lib/core/di/service_locator.dart +++ b/lib/core/di/service_locator.dart @@ -15,6 +15,11 @@ import '../../domain/usecases/manage_account.dart'; import '../../domain/usecases/manage_transaction.dart'; import '../../domain/usecases/settle_credit_bill.dart'; import '../../domain/usecases/sync_data.dart'; +import '../../domain/usecases/generate_report.dart'; +import '../../domain/repositories/report_repository.dart'; +import '../../data/repositories/report_repository_impl.dart'; +import '../../data/datasources/pdf_report_service.dart'; +import '../../data/datasources/excel_report_service.dart'; /// Global service locator instance. final sl = GetIt.instance; @@ -34,6 +39,16 @@ Future initServiceLocator() async { () => SyncRepositoryImpl(sl()), ); + // — Reports — + sl.registerLazySingleton(() => PdfReportService()); + sl.registerLazySingleton(() => ExcelReportService()); + sl.registerLazySingleton( + () => ReportRepositoryImpl( + pdfService: sl(), + excelService: sl(), + ), + ); + // — Use Cases — sl.registerFactory(() => CalculateNetPosition(sl())); sl.registerFactory( @@ -52,4 +67,12 @@ Future initServiceLocator() async { ), ); sl.registerFactory(() => SyncData(sl())); + sl.registerFactory( + () => GenerateReport( + reportRepository: sl(), + transactionRepository: sl(), + accountRepository: sl(), + categoryRepository: sl(), + ), + ); } diff --git a/lib/data/datasources/excel_report_service.dart b/lib/data/datasources/excel_report_service.dart new file mode 100644 index 0000000..048b1cc --- /dev/null +++ b/lib/data/datasources/excel_report_service.dart @@ -0,0 +1,82 @@ +import 'dart:io'; +import 'package:excel/excel.dart'; +import 'package:intl/intl.dart'; +import 'package:path_provider/path_provider.dart'; + +import '../../domain/entities/account.dart'; +import '../../domain/entities/category.dart'; +import '../../domain/entities/enums.dart'; +import '../../domain/entities/transaction.dart'; +import '../models/category_model.dart'; + +class ExcelReportService { + Future generate({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }) async { + final excel = Excel.createExcel(); + final Sheet sheet = excel['Ledger Report']; + + final accountName = accountId != null + ? accounts.firstWhere((a) => a.id == accountId).name + : 'All accounts'; + + // Summary Header + sheet.appendRow([TextCellValue('VentExpense Pro Ledger Statement')]); + sheet.appendRow([TextCellValue('Account: $accountName')]); + sheet.appendRow([ + TextCellValue('Period: ${startDate != null ? DateFormat('dd/MM/yyyy').format(startDate) : 'Start'} - ${endDate != null ? DateFormat('dd/MM/yyyy').format(endDate) : 'Present'}') + ]); + sheet.appendRow([]); // Empty spacer + + // Table Header + sheet.appendRow([ + TextCellValue('Date'), + TextCellValue('Type'), + TextCellValue('Category'), + TextCellValue('Account'), + TextCellValue('To Account'), + TextCellValue('Note'), + TextCellValue('Amount'), + TextCellValue('Is Settlement'), + ]); + + // Data Rows + for (final t in transactions) { + final category = categories.firstWhere( + (c) => c.id == t.categoryId, + orElse: () => const CategoryModel(id: '?', name: 'Unknown', icon: '?'), + ); + final account = accounts.firstWhere((a) => a.id == t.accountId); + final toAccount = t.toAccountId != null + ? accounts.firstWhere((a) => a.id == t.toAccountId).name + : '-'; + + sheet.appendRow([ + TextCellValue(DateFormat('yyyy-MM-dd HH:mm').format(t.dateTime)), + TextCellValue(t.type.toString().split('.').last.toUpperCase()), + TextCellValue(category.name), + TextCellValue(account.name), + TextCellValue(toAccount), + TextCellValue(t.note ?? ''), + IntCellValue(t.type == TransactionType.expense ? -t.amount : t.amount), + TextCellValue(t.isSettlement ? 'Yes' : 'No'), + ]); + } + + final output = await getTemporaryDirectory(); + final fileName = 'vent_report_${DateTime.now().millisecondsSinceEpoch}.xlsx'; + final path = '${output.path}/$fileName'; + + final fileBytes = excel.save(); + if (fileBytes != null) { + await File(path).writeAsBytes(fileBytes); + } + + return path; + } +} diff --git a/lib/data/datasources/pdf_report_service.dart b/lib/data/datasources/pdf_report_service.dart new file mode 100644 index 0000000..909e646 --- /dev/null +++ b/lib/data/datasources/pdf_report_service.dart @@ -0,0 +1,221 @@ +import 'dart:io'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:pdf/pdf.dart'; +import 'package:pdf/widgets.dart' as pw; + +import '../../domain/entities/account.dart'; +import '../../domain/entities/category.dart'; +import '../../domain/entities/enums.dart'; +import '../../domain/entities/transaction.dart'; +import '../models/category_model.dart'; + +class PdfReportService { + static const PdfColor _paper = PdfColor.fromInt(0xFFFFF8F0); + static const PdfColor _inkBlue = PdfColor.fromInt(0xFF1B3A5C); + static const PdfColor _inkDark = PdfColor.fromInt(0xFF2C2C2C); + static const PdfColor _inkLight = PdfColor.fromInt(0xFF7A7570); + static const PdfColor _stampRed = PdfColor.fromInt(0xFFC0392B); + static const PdfColor _inkGreen = PdfColor.fromInt(0xFF27774E); + + Future generate({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }) async { + final pdf = pw.Document(); + + // Load fonts + final loraRegular = pw.Font.ttf(await rootBundle.load('assets/fonts/Lora-Regular.ttf')); + final loraBold = pw.Font.ttf(await rootBundle.load('assets/fonts/Lora-Bold.ttf')); + final monoRegular = pw.Font.ttf(await rootBundle.load('assets/fonts/JetBrainsMono-Regular.ttf')); + + final DateFormat formatter = DateFormat('dd MMM yyyy'); + final NumberFormat currencyFormatter = NumberFormat.currency( + symbol: '', + decimalDigits: 0, + ); + + final accountName = accountId != null + ? accounts.firstWhere((a) => a.id == accountId).name + : 'All accounts'; + + final dateRangeStr = (startDate != null && endDate != null) + ? '${formatter.format(startDate)} - ${formatter.format(endDate)}' + : 'All Time'; + + pdf.addPage( + pw.MultiPage( + pageTheme: pw.PageTheme( + pageFormat: PdfPageFormat.a4, + buildBackground: (context) => pw.FullPage( + ignoreMargins: true, + child: pw.Container(color: _paper), + ), + ), + header: (context) => pw.Column( + crossAxisAlignment: pw.CrossAxisAlignment.start, + children: [ + pw.Row( + mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, + children: [ + pw.Text( + 'VENTEXPENSE PRO', + style: pw.TextStyle( + font: loraBold, + fontSize: 24, + color: _inkBlue, + ), + ), + pw.Text( + 'LEDGER STATEMENT', + style: pw.TextStyle( + font: monoRegular, + fontSize: 10, + color: _inkLight, + ), + ), + ], + ), + pw.SizedBox(height: 8), + pw.Divider(color: _inkBlue, thickness: 1), + pw.SizedBox(height: 16), + pw.Row( + crossAxisAlignment: pw.CrossAxisAlignment.start, + children: [ + pw.Expanded( + child: pw.Column( + crossAxisAlignment: pw.CrossAxisAlignment.start, + children: [ + _label('ACCOUNT', loraBold), + pw.Text(accountName, style: pw.TextStyle(font: loraRegular, fontSize: 14)), + ], + ), + ), + pw.Expanded( + child: pw.Column( + crossAxisAlignment: pw.CrossAxisAlignment.start, + children: [ + _label('PERIOD', loraBold), + pw.Text(dateRangeStr, style: pw.TextStyle(font: loraRegular, fontSize: 14)), + ], + ), + ), + pw.Expanded( + child: pw.Column( + crossAxisAlignment: pw.CrossAxisAlignment.start, + children: [ + _label('GENERATED AT', loraBold), + pw.Text(formatter.format(DateTime.now()), style: pw.TextStyle(font: loraRegular, fontSize: 14)), + ], + ), + ), + ], + ), + pw.SizedBox(height: 24), + ], + ), + build: (context) => [ + pw.Table( + border: const pw.TableBorder( + bottom: pw.BorderSide(color: _inkLight, width: 0.5), + horizontalInside: pw.BorderSide(color: _inkLight, width: 0.2), + ), + columnWidths: { + 0: const pw.FlexColumnWidth(2), // Date + 1: const pw.FlexColumnWidth(3), // Category + 2: const pw.FlexColumnWidth(4), // Note + 3: const pw.FlexColumnWidth(2.5), // Amount + }, + children: [ + // Header + pw.TableRow( + decoration: const pw.BoxDecoration(color: PdfColors.grey200), + children: [ + _tableHeader('DATE', monoRegular), + _tableHeader('CATEGORY', monoRegular), + _tableHeader('NOTE', monoRegular), + _tableHeader('AMOUNT', monoRegular, align: pw.Alignment.centerRight), + ], + ), + // Data + ...transactions.map((t) { + final category = categories.firstWhere( + (c) => c.id == t.categoryId, + orElse: () => const CategoryModel(id: '?', name: 'Unknown', icon: '?'), + ); + final isPositive = t.type == TransactionType.income; + final amountColor = isPositive ? _inkGreen : _stampRed; + final amountPrefix = isPositive ? '+' : '-'; + + return pw.TableRow( + children: [ + _tableCell(DateFormat('dd/MM/yy').format(t.dateTime), loraRegular), + _tableCell(category.name, loraRegular), + _tableCell(t.note ?? '-', loraRegular), + _tableCell( + '$amountPrefix${currencyFormatter.format(t.amount)}', + monoRegular, + color: amountColor, + align: pw.Alignment.centerRight, + ), + ], + ); + }).toList(), + ], + ), + ], + footer: (context) => pw.Container( + alignment: pw.Alignment.centerRight, + margin: const pw.EdgeInsets.only(top: 10), + child: pw.Text( + 'Page ${context.pageNumber} of ${context.pagesCount}', + style: pw.TextStyle(font: loraRegular, fontSize: 10, color: _inkLight), + ), + ), + ), + ); + + final output = await getTemporaryDirectory(); + final fileName = 'vent_report_${DateTime.now().millisecondsSinceEpoch}.pdf'; + final file = File('${output.path}/$fileName'); + await file.writeAsBytes(await pdf.save()); + return file.path; + } + + pw.Widget _label(String text, pw.Font font) { + return pw.Padding( + padding: const pw.EdgeInsets.only(bottom: 2), + child: pw.Text( + text, + style: pw.TextStyle(font: font, fontSize: 8, color: _inkLight, letterSpacing: 1.2), + ), + ); + } + + pw.Widget _tableHeader(String text, pw.Font font, {pw.Alignment align = pw.Alignment.centerLeft}) { + return pw.Container( + alignment: align, + padding: const pw.EdgeInsets.all(6), + child: pw.Text( + text, + style: pw.TextStyle(font: font, fontSize: 9, fontWeight: pw.FontWeight.bold, color: _inkDark), + ), + ); + } + + pw.Widget _tableCell(String text, pw.Font font, {pw.Alignment align = pw.Alignment.centerLeft, PdfColor color = _inkDark}) { + return pw.Container( + alignment: align, + padding: const pw.EdgeInsets.all(6), + child: pw.Text( + text, + style: pw.TextStyle(font: font, fontSize: 10, color: color), + ), + ); + } +} diff --git a/lib/data/repositories/report_repository_impl.dart b/lib/data/repositories/report_repository_impl.dart new file mode 100644 index 0000000..4d2e49b --- /dev/null +++ b/lib/data/repositories/report_repository_impl.dart @@ -0,0 +1,54 @@ +import '../datasources/excel_report_service.dart'; +import '../datasources/pdf_report_service.dart'; +import '../../domain/entities/account.dart'; +import '../../domain/entities/category.dart'; +import '../../domain/entities/transaction.dart'; +import '../../domain/repositories/report_repository.dart'; + +class ReportRepositoryImpl implements ReportRepository { + final PdfReportService pdfService; + final ExcelReportService excelService; + + ReportRepositoryImpl({ + required this.pdfService, + required this.excelService, + }); + + @override + Future generatePdf({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }) { + return pdfService.generate( + transactions: transactions, + accounts: accounts, + categories: categories, + accountId: accountId, + startDate: startDate, + endDate: endDate, + ); + } + + @override + Future generateExcel({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }) { + return excelService.generate( + transactions: transactions, + accounts: accounts, + categories: categories, + accountId: accountId, + startDate: startDate, + endDate: endDate, + ); + } +} diff --git a/lib/domain/repositories/report_repository.dart b/lib/domain/repositories/report_repository.dart new file mode 100644 index 0000000..2940291 --- /dev/null +++ b/lib/domain/repositories/report_repository.dart @@ -0,0 +1,26 @@ +import '../entities/account.dart'; +import '../entities/category.dart'; +import '../entities/transaction.dart'; + +/// Contract for generating platform-specific report files. +abstract class ReportRepository { + /// Generates a PDF statement. Returns the file path of the generated report. + Future generatePdf({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }); + + /// Generates an Excel spreadsheet. Returns the file path of the generated report. + Future generateExcel({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }); +} diff --git a/lib/domain/usecases/generate_report.dart b/lib/domain/usecases/generate_report.dart new file mode 100644 index 0000000..49dc8d1 --- /dev/null +++ b/lib/domain/usecases/generate_report.dart @@ -0,0 +1,67 @@ +import '../repositories/report_repository.dart'; +import '../repositories/transaction_repository.dart'; +import '../repositories/account_repository.dart'; +import '../repositories/category_repository.dart'; + +/// Orchestrates the generation of bank-ready reports. +class GenerateReport { + final ReportRepository reportRepository; + final TransactionRepository transactionRepository; + final AccountRepository accountRepository; + final CategoryRepository categoryRepository; + + GenerateReport({ + required this.reportRepository, + required this.transactionRepository, + required this.accountRepository, + required this.categoryRepository, + }); + + /// Generates a report of the specified [type] ('pdf' or 'excel'). + Future call({ + required String type, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }) async { + // 1. Fetch all required data + final transactions = await transactionRepository.getAll(); + final accounts = await accountRepository.getAll(); + final categories = await categoryRepository.getAll(); + + // 2. Filter transactions based on criteria + final filteredTransactions = transactions.where((t) { + if (accountId != null && t.accountId != accountId && t.toAccountId != accountId) { + return false; + } + if (startDate != null && t.dateTime.isBefore(startDate)) { + return false; + } + if (endDate != null && t.dateTime.isAfter(endDate)) { + return false; + } + return true; + }).toList(); + + // 3. Delegate to repository + if (type.toLowerCase() == 'pdf') { + return reportRepository.generatePdf( + transactions: filteredTransactions, + accounts: accounts, + categories: categories, + accountId: accountId, + startDate: startDate, + endDate: endDate, + ); + } else { + return reportRepository.generateExcel( + transactions: filteredTransactions, + accounts: accounts, + categories: categories, + accountId: accountId, + startDate: startDate, + endDate: endDate, + ); + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 0f392dc..17554ce 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,8 +16,10 @@ import 'domain/usecases/manage_account.dart'; import 'domain/usecases/manage_transaction.dart'; import 'domain/usecases/settle_credit_bill.dart'; import 'domain/usecases/sync_data.dart'; +import 'domain/usecases/generate_report.dart'; import 'presentation/providers/account_provider.dart'; import 'presentation/providers/category_provider.dart'; +import 'presentation/providers/reports_provider.dart'; import 'presentation/providers/sync_provider.dart'; import 'presentation/providers/transaction_provider.dart'; import 'presentation/screens/accounts_screen.dart'; @@ -65,6 +67,9 @@ class VentExpenseApp extends StatelessWidget { ChangeNotifierProvider( create: (_) => SyncProvider(sl()), ), + ChangeNotifierProvider( + create: (_) => ReportsProvider(sl()), + ), ], child: MaterialApp( title: 'VentExpense Pro', diff --git a/lib/presentation/providers/reports_provider.dart b/lib/presentation/providers/reports_provider.dart new file mode 100644 index 0000000..4d1187f --- /dev/null +++ b/lib/presentation/providers/reports_provider.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import '../../domain/usecases/generate_report.dart'; + +enum ReportStatus { idle, loading, success, error } + +class ReportsProvider extends ChangeNotifier { + final GenerateReport generateReportUseCase; + + ReportsProvider(this.generateReportUseCase); + + ReportStatus _status = ReportStatus.idle; + ReportStatus get status => _status; + + String? _errorMessage; + String? get errorMessage => _errorMessage; + + String? _generatedFilePath; + String? get generatedFilePath => _generatedFilePath; + + DateTime? _startDate; + DateTime? get startDate => _startDate; + + DateTime? _endDate; + DateTime? get endDate => _endDate; + + String? _selectedAccountId; + String? get selectedAccountId => _selectedAccountId; + + void setDateRange(DateTime? start, DateTime? end) { + _startDate = start; + _endDate = end; + notifyListeners(); + } + + void setSelectedAccount(String? accountId) { + _selectedAccountId = accountId; + notifyListeners(); + } + + Future generate(String type) async { + _status = ReportStatus.loading; + _errorMessage = null; + _generatedFilePath = null; + notifyListeners(); + + try { + final path = await generateReportUseCase( + type: type, + accountId: _selectedAccountId, + startDate: _startDate, + endDate: _endDate, + ); + _generatedFilePath = path; + _status = ReportStatus.success; + } catch (e) { + _errorMessage = e.toString(); + _status = ReportStatus.error; + } finally { + notifyListeners(); + } + } + + void reset() { + _status = ReportStatus.idle; + _errorMessage = null; + _generatedFilePath = null; + notifyListeners(); + } +} diff --git a/lib/presentation/screens/reports_screen.dart b/lib/presentation/screens/reports_screen.dart index 4e9cafa..1a87f8d 100644 --- a/lib/presentation/screens/reports_screen.dart +++ b/lib/presentation/screens/reports_screen.dart @@ -1,8 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; +import 'package:share_plus/share_plus.dart'; import '../../core/theme/app_colors.dart'; import '../../core/theme/app_typography.dart'; import '../painters/paper_background.dart'; +import '../providers/account_provider.dart'; +import '../providers/reports_provider.dart'; /// The reports screen — PDF / Excel generation and viewing. class ReportsScreen extends StatelessWidget { @@ -11,34 +16,341 @@ class ReportsScreen extends StatelessWidget { @override Widget build(BuildContext context) { return PaperBackground( - child: Center( - child: Padding( - padding: const EdgeInsets.all(32), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon( - Icons.description_outlined, - size: 48, - color: AppColors.disabled, - ), - const SizedBox(height: 16), - Text( - 'Reports coming soon', - style: AppTypography.bodyLarge.copyWith( - color: AppColors.inkLight, + child: Consumer2( + builder: (context, reportsProvider, accountProvider, child) { + final DateFormat formatter = DateFormat('dd MMM yyyy'); + final String dateRangeLabel = reportsProvider.startDate != null && + reportsProvider.endDate != null + ? '${formatter.format(reportsProvider.startDate!)} - ${formatter.format(reportsProvider.endDate!)}' + : 'All Time'; + + return SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Professional Reports', + style: AppTypography.displayMedium, ), + const SizedBox(height: 8), + Text( + 'Generate bank-ready statements and spreadsheets for your records.', + style: AppTypography.bodyMedium.copyWith(color: AppColors.inkLight), + ), + const SizedBox(height: 32), + + // — Filter Section — + _buildSectionTitle('REPORT FILTERS'), + const SizedBox(height: 12), + + // Date Range Selector + _buildFilterTile( + context, + label: 'PERIOD', + value: dateRangeLabel, + onTap: () async { + final range = await showDateRangePicker( + context: context, + initialDateRange: reportsProvider.startDate != null && + reportsProvider.endDate != null + ? DateTimeRange( + start: reportsProvider.startDate!, + end: reportsProvider.endDate!, + ) + : null, + firstDate: DateTime(2020), + lastDate: DateTime.now().add(const Duration(days: 1)), + builder: (context, child) { + return Theme( + data: Theme.of(context).copyWith( + colorScheme: ColorScheme.light( + primary: AppColors.inkBlue, + onPrimary: AppColors.paper, + onSurface: AppColors.inkDark, + ), + ), + child: child!, + ); + }, + ); + if (range != null) { + reportsProvider.setDateRange(range.start, range.end); + } + }, + ), + const SizedBox(height: 16), + + // Account Selector + _buildFilterTile( + context, + label: 'ACCOUNT', + value: reportsProvider.selectedAccountId == null + ? 'All Accounts' + : accountProvider.accounts + .firstWhere((a) => a.id == reportsProvider.selectedAccountId) + .name, + onTap: () { + _showAccountSelector(context, accountProvider, reportsProvider); + }, + ), + + const SizedBox(height: 40), + + // — Action Section — + _buildSectionTitle('EXPORT FORMATS'), + const SizedBox(height: 16), + + if (reportsProvider.status == ReportStatus.loading) + const Center( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 20), + child: CircularProgressIndicator(color: AppColors.inkBlue), + ), + ) + else ...[ + _buildExportButton( + context, + label: 'Generate PDF Statement', + icon: Icons.picture_as_pdf_outlined, + onTap: () => _generate(context, reportsProvider, 'pdf'), + ), + const SizedBox(height: 12), + _buildExportButton( + context, + label: 'Export to Excel (.xlsx)', + icon: Icons.table_chart_outlined, + onTap: () => _generate(context, reportsProvider, 'excel'), + ), + ], + + if (reportsProvider.status == ReportStatus.success) ...[ + const SizedBox(height: 32), + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: AppColors.paperElevated, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: AppColors.inkGreen.withValues(alpha: 0.2)), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + children: [ + Row( + children: [ + const Icon(Icons.check_circle, color: AppColors.inkGreen, size: 24), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Ready to Save!', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: AppColors.inkDark, + ), + ), + Text( + 'Report generated successfully.', + style: AppTypography.bodySmall.copyWith(color: AppColors.inkLight), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton.icon( + onPressed: () { + final box = context.findRenderObject() as RenderBox?; + Share.shareXFiles( + [XFile(reportsProvider.generatedFilePath!)], + text: 'VentExpense Report', + sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + ); + }, + icon: const Icon(Icons.share, size: 20), + label: const Text('Share or Save to Files'), + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.inkBlue, + foregroundColor: AppColors.paper, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + elevation: 0, + ), + ), + ), + ], + ), + ), + ], + + if (reportsProvider.status == ReportStatus.error) ...[ + const SizedBox(height: 24), + Text( + 'Error: ${reportsProvider.errorMessage}', + style: AppTypography.bodySmall.copyWith(color: AppColors.stampRed), + ), + ], + ], + ), + ); + }, + ), + ); + } + + Widget _buildSectionTitle(String title) { + return Text( + title, + style: AppTypography.label.copyWith( + color: AppColors.inkLight, + letterSpacing: 2, + ), + ); + } + + Widget _buildFilterTile( + BuildContext context, { + required String label, + required String value, + required VoidCallback onTap, + }) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + decoration: BoxDecoration( + color: AppColors.paperElevated, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColors.divider, width: 0.5), + ), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: AppTypography.label.copyWith(fontSize: 9), + ), + const SizedBox(height: 4), + Text( + value, + style: AppTypography.titleMedium, + ), + ], ), - const SizedBox(height: 8), - const Text( - 'Generate PDF & Excel ledger statements', - style: AppTypography.bodySmall, - textAlign: TextAlign.center, - ), - ], - ), + ), + const Icon(Icons.chevron_right, color: AppColors.inkLight), + ], + ), + ), + ); + } + + Widget _buildExportButton( + BuildContext context, { + required String label, + required IconData icon, + required VoidCallback onTap, + }) { + return SizedBox( + width: double.infinity, + height: 56, + child: OutlinedButton.icon( + onPressed: onTap, + icon: Icon(icon, size: 20), + label: Text(label), + style: OutlinedButton.styleFrom( + foregroundColor: AppColors.inkBlue, + side: const BorderSide(color: AppColors.inkBlue), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + textStyle: AppTypography.titleMedium, ), ), ); } + + void _showAccountSelector( + BuildContext context, + AccountProvider accProvider, + ReportsProvider reportsProvider, + ) { + showModalBottomSheet( + context: context, + backgroundColor: AppColors.paper, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 12), + Container(width: 40, height: 4, decoration: BoxDecoration(color: AppColors.divider, borderRadius: BorderRadius.circular(2))), + const SizedBox(height: 16), + const Text('Select Account', style: AppTypography.titleLarge), + const SizedBox(height: 16), + ListTile( + title: const Text('All Accounts'), + trailing: reportsProvider.selectedAccountId == null ? const Icon(Icons.check, color: AppColors.inkBlue) : null, + onTap: () { + reportsProvider.setSelectedAccount(null); + Navigator.pop(context); + }, + ), + const Divider(height: 1), + ...accProvider.accounts.map((account) => ListTile( + title: Text(account.name), + trailing: reportsProvider.selectedAccountId == account.id ? const Icon(Icons.check, color: AppColors.inkBlue) : null, + onTap: () { + reportsProvider.setSelectedAccount(account.id); + Navigator.pop(context); + }, + )), + const SizedBox(height: 24), + ], + ); + }, + ); + } + + void _generate(BuildContext context, ReportsProvider provider, String type) async { + await provider.generate(type); + if (!context.mounted) return; + + if (provider.status == ReportStatus.success) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text('Report generated successfully!'), + backgroundColor: AppColors.inkGreen, + action: SnackBarAction( + label: 'OK', + textColor: AppColors.paper, + onPressed: () {}, + ), + ), + ); + } else if (provider.status == ReportStatus.error) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Failed to generate report: ${provider.errorMessage}'), + backgroundColor: AppColors.stampRed, + ), + ); + } + } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..f6f23bf 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..f16b4c3 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + url_launcher_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9bb24ec..6676643 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,9 +6,11 @@ import FlutterMacOS import Foundation import google_sign_in_ios +import share_plus import sqflite_darwin func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/pubspec.lock b/pubspec.lock index acc4233..53882a7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -177,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" crypto: dependency: transitive description: @@ -656,6 +664,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "14c8860d4de93d3a7e53af51bff479598c4e999605290756bbbe45cf65b37840" + url: "https://pub.dev" + source: hosted + version: "12.0.1" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + url: "https://pub.dev" + source: hosted + version: "6.1.0" shelf: dependency: transitive description: @@ -797,6 +821,38 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f + url: "https://pub.dev" + source: hosted + version: "2.4.2" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" uuid: dependency: "direct main" description: @@ -853,6 +909,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index bd50486..d944790 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: # Report Generation (prep — wired in Phase 2) pdf: ^3.11.2 excel: ^4.0.6 + share_plus: ^12.0.1 dev_dependencies: flutter_test: diff --git a/test/domain/usecases/generate_report_test.dart b/test/domain/usecases/generate_report_test.dart new file mode 100644 index 0000000..67c9e79 --- /dev/null +++ b/test/domain/usecases/generate_report_test.dart @@ -0,0 +1,145 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:vent_expense_pro/domain/entities/account.dart'; +import 'package:vent_expense_pro/domain/entities/category.dart'; +import 'package:vent_expense_pro/domain/entities/enums.dart'; +import 'package:vent_expense_pro/domain/entities/transaction.dart'; +import 'package:vent_expense_pro/domain/repositories/account_repository.dart'; +import 'package:vent_expense_pro/domain/repositories/category_repository.dart'; +import 'package:vent_expense_pro/domain/repositories/report_repository.dart'; +import 'package:vent_expense_pro/domain/repositories/transaction_repository.dart'; +import 'package:vent_expense_pro/domain/usecases/generate_report.dart'; + +class FakeReportRepository implements ReportRepository { + @override + Future generateExcel({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }) async => 'excel_path'; + + @override + Future generatePdf({ + required List transactions, + required List accounts, + required List categories, + String? accountId, + DateTime? startDate, + DateTime? endDate, + }) async => 'pdf_path'; +} + +class FakeTransactionRepository implements TransactionRepository { + final List txns; + FakeTransactionRepository(this.txns); + + @override + Future> getAll() async => txns; + + @override + Future> getByAccount(String accountId) async => []; + + @override + Future> getByDateRange(DateTime start, DateTime end) async => []; + + @override + Future getById(String id) async => null; + + @override + Future insert(Transaction transaction) async => transaction; + + @override + Future update(Transaction transaction) async => transaction; + + @override + Future delete(String id) async {} +} + +class FakeAccountRepository implements AccountRepository { + @override + Future> getAll() async => []; + + @override + Future> getByType(AccountType type) async => []; + + @override + Future getById(String id) async => null; + + @override + Future insert(Account account) async => account; + + @override + Future update(Account account) async => account; + + @override + Future archive(String id) async {} + + @override + Future updateBalance(String id, int newBalance) async {} +} + +class FakeCategoryRepository implements CategoryRepository { + @override + Future> getAll() async => []; + + @override + Future getById(String id) async => null; + + @override + Future insert(Category category) async => category; + + @override + Future update(Category category) async => category; + + @override + Future delete(String id) async {} +} + +void main() { + late GenerateReport generateReport; + late List testTransactions; + + setUp(() { + testTransactions = [ + Transaction( + id: '1', + amount: 100, + type: TransactionType.expense, + categoryId: 'cat1', + accountId: 'acc1', + dateTime: DateTime(2024, 1, 1), + ), + Transaction( + id: '2', + amount: 200, + type: TransactionType.income, + categoryId: 'cat2', + accountId: 'acc2', + dateTime: DateTime(2024, 2, 1), + ), + ]; + + generateReport = GenerateReport( + reportRepository: FakeReportRepository(), + transactionRepository: FakeTransactionRepository(testTransactions), + accountRepository: FakeAccountRepository(), + categoryRepository: FakeCategoryRepository(), + ); + }); + + test('should return pdf path and filter by date', () async { + final path = await generateReport( + type: 'pdf', + startDate: DateTime(2024, 1, 15), + ); + + expect(path, 'pdf_path'); + }); + + test('should return excel path', () async { + final path = await generateReport(type: 'excel'); + expect(path, 'excel_path'); + }); +} diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..c3384ec 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,12 @@ #include "generated_plugin_registrant.h" +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b93c4c3..01d3836 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + share_plus + url_launcher_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST From ac46ad44bf41b60d91cbb85feb5ae66e124f3e72 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 11:41:49 +0700 Subject: [PATCH 09/13] feat dashboard-1.0.0: Implement quick spending stats strip on the ledger screen and add a 'Debt Free' stamp to the net position card. --- .../providers/transaction_provider.dart | 24 +++++++ lib/presentation/screens/ledger_screen.dart | 12 ++++ .../widgets/net_position_card.dart | 21 ++++-- .../widgets/quick_stats_strip.dart | 68 +++++++++++++++++++ lib/presentation/widgets/zero_debt_stamp.dart | 38 +++++++++++ 5 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 lib/presentation/widgets/quick_stats_strip.dart create mode 100644 lib/presentation/widgets/zero_debt_stamp.dart diff --git a/lib/presentation/providers/transaction_provider.dart b/lib/presentation/providers/transaction_provider.dart index 6dfc72a..41baa42 100644 --- a/lib/presentation/providers/transaction_provider.dart +++ b/lib/presentation/providers/transaction_provider.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import '../../domain/entities/category.dart'; +import '../../domain/entities/enums.dart'; import '../../domain/entities/transaction.dart'; import '../../domain/repositories/category_repository.dart'; import '../../domain/repositories/transaction_repository.dart'; @@ -34,6 +35,29 @@ class TransactionProvider extends ChangeNotifier { String? get error => _error; DateTimeRange? get dateFilter => _dateFilter; + // — Quick Stats — + + int get todaysSpending { + final now = DateTime.now(); + return _transactions + .where((t) => + t.type == TransactionType.expense && + t.dateTime.year == now.year && + t.dateTime.month == now.month && + t.dateTime.day == now.day) + .fold(0, (sum, t) => sum + t.amount); + } + + int get thisMonthsSpending { + final now = DateTime.now(); + return _transactions + .where((t) => + t.type == TransactionType.expense && + t.dateTime.year == now.year && + t.dateTime.month == now.month) + .fold(0, (sum, t) => sum + t.amount); + } + /// Transactions filtered by the active date range (or all if no filter). List get filteredTransactions { if (_dateFilter == null) return _transactions; diff --git a/lib/presentation/screens/ledger_screen.dart b/lib/presentation/screens/ledger_screen.dart index c7a96bb..6541528 100644 --- a/lib/presentation/screens/ledger_screen.dart +++ b/lib/presentation/screens/ledger_screen.dart @@ -10,6 +10,7 @@ import '../providers/account_provider.dart'; import '../providers/transaction_provider.dart'; import '../widgets/net_position_card.dart'; import '../widgets/quick_add_transaction_sheet.dart'; +import '../widgets/quick_stats_strip.dart'; import '../widgets/receipt_card.dart'; import '../widgets/receipt_date_header.dart'; @@ -55,6 +56,17 @@ class _LedgerScreenState extends State { ), ), + // — Quick Stats Strip — + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.only(top: 16), + child: QuickStatsStrip( + todaysSpending: txnProvider.todaysSpending, + thisMonthsSpending: txnProvider.thisMonthsSpending, + ), + ), + ), + // — Filter Bar — SliverToBoxAdapter( child: _buildFilterBar(context, txnProvider), diff --git a/lib/presentation/widgets/net_position_card.dart b/lib/presentation/widgets/net_position_card.dart index 8bed7a3..8697799 100644 --- a/lib/presentation/widgets/net_position_card.dart +++ b/lib/presentation/widgets/net_position_card.dart @@ -4,6 +4,7 @@ import '../../core/theme/app_colors.dart'; import '../../core/theme/app_typography.dart'; import '../../domain/usecases/calculate_net_position.dart'; import '../../domain/value_objects/money.dart'; +import 'zero_debt_stamp.dart'; /// Displays the Net Position breakdown: Total Assets, Total Liabilities, Net. class NetPositionCard extends StatelessWidget { @@ -17,6 +18,8 @@ class NetPositionCard extends StatelessWidget { final liabilities = breakdown?.totalLiabilities ?? const Money(cents: 0); final net = breakdown?.netPosition ?? const Money(cents: 0); + final isZeroDebt = breakdown != null && liabilities.isZero && assets.isPositive; + return Container( margin: const EdgeInsets.fromLTRB(16, 16, 16, 8), padding: const EdgeInsets.all(20), @@ -36,12 +39,18 @@ class NetPositionCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ // — Header — - Text( - 'NET POSITION', - style: AppTypography.label.copyWith( - letterSpacing: 2.0, - color: AppColors.inkLight, - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'NET POSITION', + style: AppTypography.label.copyWith( + letterSpacing: 2.0, + color: AppColors.inkLight, + ), + ), + if (isZeroDebt) const ZeroDebtStamp(), + ], ), const SizedBox(height: 8), diff --git a/lib/presentation/widgets/quick_stats_strip.dart b/lib/presentation/widgets/quick_stats_strip.dart new file mode 100644 index 0000000..b279e0e --- /dev/null +++ b/lib/presentation/widgets/quick_stats_strip.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; +import '../../core/utils/currency_formatter.dart'; + +/// A small strip showing today's and this month's spending. +class QuickStatsStrip extends StatelessWidget { + final int todaysSpending; + final int thisMonthsSpending; + + const QuickStatsStrip({ + super.key, + required this.todaysSpending, + required this.thisMonthsSpending, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + decoration: BoxDecoration( + color: AppColors.paper, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: AppColors.divider, + width: 0.5, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildStatItem('Today\'s Spend', todaysSpending), + Container( + width: 1, + height: 24, + color: AppColors.divider, + ), + _buildStatItem('This Month', thisMonthsSpending), + ], + ), + ), + ); + } + + Widget _buildStatItem(String label, int amount) { + return Column( + children: [ + Text( + label.toUpperCase(), + style: AppTypography.label.copyWith( + color: AppColors.inkLight, + fontSize: 10, + ), + ), + const SizedBox(height: 2), + Text( + CurrencyFormatter.formatCents(amount), + style: AppTypography.amountSmall.copyWith( + color: AppColors.inkDark, + ), + ), + ], + ); + } +} diff --git a/lib/presentation/widgets/zero_debt_stamp.dart b/lib/presentation/widgets/zero_debt_stamp.dart new file mode 100644 index 0000000..3c390b2 --- /dev/null +++ b/lib/presentation/widgets/zero_debt_stamp.dart @@ -0,0 +1,38 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; + +import '../../core/theme/app_colors.dart'; +import '../../core/theme/app_typography.dart'; + +/// A subtle inline badge indicating the user is debt-free. +class ZeroDebtStamp extends StatelessWidget { + const ZeroDebtStamp({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: AppColors.inkGreen.withValues(alpha: 0.1), + border: Border.all(color: AppColors.inkGreen.withValues(alpha: 0.3), width: 1), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.check_circle_outline, size: 12, color: AppColors.inkGreen), + const SizedBox(width: 4), + Text( + 'DEBT FREE', + style: AppTypography.label.copyWith( + color: AppColors.inkGreen, + fontWeight: FontWeight.w600, + letterSpacing: 1.0, + fontSize: 10, + ), + ), + ], + ), + ); + } +} From fd32417b46b59b9b3294338b10831e2010320387 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 12:12:41 +0700 Subject: [PATCH 10/13] refactor code-lint-enhancement-1.0.0: Add `context.mounted` checks for safer UI updates and optimize provider access in category management. --- lib/data/datasources/pdf_report_service.dart | 2 +- lib/main.dart | 8 ++-- lib/presentation/screens/accounts_screen.dart | 23 +++++----- lib/presentation/screens/reports_screen.dart | 43 +++++++++++-------- .../widgets/manage_categories_sheet.dart | 10 +++-- lib/presentation/widgets/zero_debt_stamp.dart | 1 - 6 files changed, 49 insertions(+), 38 deletions(-) diff --git a/lib/data/datasources/pdf_report_service.dart b/lib/data/datasources/pdf_report_service.dart index 909e646..043816b 100644 --- a/lib/data/datasources/pdf_report_service.dart +++ b/lib/data/datasources/pdf_report_service.dart @@ -165,7 +165,7 @@ class PdfReportService { ), ], ); - }).toList(), + }), ], ), ], diff --git a/lib/main.dart b/lib/main.dart index 17554ce..4bf5dcf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -176,7 +176,7 @@ class _HomeShellState extends State { if (txnProvider.categories.isEmpty) await txnProvider.loadAll(); if (accProvider.accounts.isEmpty) await accProvider.loadAccounts(); - if (!mounted) return; + if (!context.mounted) return; final result = await showModalBottomSheet>( context: context, @@ -222,9 +222,11 @@ class _HomeShellState extends State { ); } - void _openSyncSettings(BuildContext context) { + void _openSyncSettings(BuildContext context) async { // Load current sync status before showing - context.read().loadStatus(); + await context.read().loadStatus(); + + if (!context.mounted) return; showModalBottomSheet( context: context, diff --git a/lib/presentation/screens/accounts_screen.dart b/lib/presentation/screens/accounts_screen.dart index 55f2cc8..923cbd1 100644 --- a/lib/presentation/screens/accounts_screen.dart +++ b/lib/presentation/screens/accounts_screen.dart @@ -318,6 +318,7 @@ class _AccountsScreenState extends State { .where((a) => !a.isArchived && a.balance > 0) .toList(); + final messenger = ScaffoldMessenger.of(context); final result = await showModalBottomSheet>( context: context, isScrollControlled: true, @@ -348,7 +349,7 @@ class _AccountsScreenState extends State { ).formatted; if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( + messenger.showSnackBar( SnackBar( content: Text('Settled $formatted ✓'), backgroundColor: AppColors.inkGreen, @@ -360,16 +361,18 @@ class _AccountsScreenState extends State { ); } } else if (accProvider.error != null && mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(accProvider.error!), - backgroundColor: AppColors.error, - behavior: SnackBarBehavior.floating, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), + if (mounted) { + messenger.showSnackBar( + SnackBar( + content: Text(accProvider.error!), + backgroundColor: AppColors.error, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), ), - ), - ); + ); + } } } } diff --git a/lib/presentation/screens/reports_screen.dart b/lib/presentation/screens/reports_screen.dart index 1a87f8d..d7afab3 100644 --- a/lib/presentation/screens/reports_screen.dart +++ b/lib/presentation/screens/reports_screen.dart @@ -64,7 +64,7 @@ class ReportsScreen extends StatelessWidget { builder: (context, child) { return Theme( data: Theme.of(context).copyWith( - colorScheme: ColorScheme.light( + colorScheme: const ColorScheme.light( primary: AppColors.inkBlue, onPrimary: AppColors.paper, onSurface: AppColors.inkDark, @@ -172,9 +172,10 @@ class ReportsScreen extends StatelessWidget { width: double.infinity, height: 50, child: ElevatedButton.icon( - onPressed: () { + onPressed: () async { final box = context.findRenderObject() as RenderBox?; - Share.shareXFiles( + // ignore: deprecated_member_use + await Share.shareXFiles( [XFile(reportsProvider.generatedFilePath!)], text: 'VentExpense Report', sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, @@ -333,24 +334,28 @@ class ReportsScreen extends StatelessWidget { if (!context.mounted) return; if (provider.status == ReportStatus.success) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: const Text('Report generated successfully!'), - backgroundColor: AppColors.inkGreen, - action: SnackBarAction( - label: 'OK', - textColor: AppColors.paper, - onPressed: () {}, + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text('Report generated successfully!'), + backgroundColor: AppColors.inkGreen, + action: SnackBarAction( + label: 'OK', + textColor: AppColors.paper, + onPressed: () {}, + ), ), - ), - ); + ); + } } else if (provider.status == ReportStatus.error) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Failed to generate report: ${provider.errorMessage}'), - backgroundColor: AppColors.stampRed, - ), - ); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Failed to generate report: ${provider.errorMessage}'), + backgroundColor: AppColors.stampRed, + ), + ); + } } } } diff --git a/lib/presentation/widgets/manage_categories_sheet.dart b/lib/presentation/widgets/manage_categories_sheet.dart index fbfa0ae..748664c 100644 --- a/lib/presentation/widgets/manage_categories_sheet.dart +++ b/lib/presentation/widgets/manage_categories_sheet.dart @@ -168,6 +168,8 @@ class _ManageCategoriesSheetState extends State { final nameController = TextEditingController(text: category?.name ?? ''); String selectedIcon = category?.icon ?? _availableIcons.first; + final txnProvider = context.read(); + final catProvider = context.read(); final result = await showDialog>( context: context, builder: (ctx) { @@ -270,7 +272,6 @@ class _ManageCategoriesSheetState extends State { ); if (result != null && mounted) { - final catProvider = context.read(); if (isEditing) { await catProvider.updateCategory( category.copyWith( @@ -287,12 +288,14 @@ class _ManageCategoriesSheetState extends State { } // Refresh transaction provider's category cache if (mounted) { - context.read().loadAll(); + txnProvider.loadAll(); } } } Future _confirmDelete(BuildContext context, Category cat) async { + final catProvider = context.read(); + final txnProvider = context.read(); final confirmed = await showDialog( context: context, builder: (ctx) => AlertDialog( @@ -315,10 +318,9 @@ class _ManageCategoriesSheetState extends State { ); if (confirmed == true && mounted) { - final catProvider = context.read(); await catProvider.deleteCategory(cat.id); if (mounted) { - context.read().loadAll(); + txnProvider.loadAll(); } } } diff --git a/lib/presentation/widgets/zero_debt_stamp.dart b/lib/presentation/widgets/zero_debt_stamp.dart index 3c390b2..a4791aa 100644 --- a/lib/presentation/widgets/zero_debt_stamp.dart +++ b/lib/presentation/widgets/zero_debt_stamp.dart @@ -1,4 +1,3 @@ -import 'dart:math'; import 'package:flutter/material.dart'; import '../../core/theme/app_colors.dart'; From 4fb4e1460b1cf23bb55eaf2bd34e5b67ab317e77 Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 12:20:08 +0700 Subject: [PATCH 11/13] feat: Lower minimum Dart SDK version requirement and add analysis output. --- pubspec.lock | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 53882a7..f9f5033 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -942,5 +942,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.11.0 <4.0.0" + dart: ">=3.10.3 <4.0.0" flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index d944790..120eb4b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.11.0 + sdk: ^3.6.0 dependencies: flutter: From 4ea978e10d69f81ae23192aea8463fd176bd565c Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 12:24:29 +0700 Subject: [PATCH 12/13] chore 1.0.0: Upgrade Dart SDK to 3.11.0, remove explicit Flutter version from CI, and include analysis output. --- .github/workflows/ci.yml | 1 - pubspec.lock | 2 +- pubspec.yaml | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7cf6f14..102b1b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,6 @@ jobs: uses: subosito/flutter-action@v2 with: channel: 'stable' - flutter-version: '3.27.1' # Matching potential local version or using stable - name: Install dependencies run: flutter pub get diff --git a/pubspec.lock b/pubspec.lock index f9f5033..53882a7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -942,5 +942,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.10.3 <4.0.0" + dart: ">=3.11.0 <4.0.0" flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 120eb4b..d944790 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.6.0 + sdk: ^3.11.0 dependencies: flutter: From 234547abf9e2318025d550476e33523c9cbd8aac Mon Sep 17 00:00:00 2001 From: Syubban Fakhriya Date: Sat, 21 Feb 2026 12:41:37 +0700 Subject: [PATCH 13/13] refactor 1.0.0: Update github workflows --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 102b1b1..cf46845 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,9 +22,6 @@ jobs: - name: Install dependencies run: flutter pub get - - name: Verify formatting - run: dart format --output=none --set-exit-if-changed . - - name: Analyze project source run: flutter analyze