From 0df1bf90cfa9108857b0133c00f5a62b6008d23f Mon Sep 17 00:00:00 2001 From: Super User Date: Sun, 14 Jun 2026 15:34:53 -0400 Subject: [PATCH] Agrega PRIVACY.md, actualiza AGENTS.md --- AGENTS.md | 68 ++++++++--- PRIVACY.md | 37 ++++++ android/app/src/main/AndroidManifest.xml | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 11332 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 6452 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 16912 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 28501 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 36072 bytes lib/main.dart | 87 +++++++++++++- lib/screens/calendario_screen.dart | 46 ++++++-- lib/screens/configuracion_screen.dart | 5 +- lib/screens/crear_factura_screen.dart | 7 +- lib/screens/dashboard_screen.dart | 79 +++++++++---- lib/screens/estadisticas_screen.dart | 93 ++++++++++----- lib/screens/facturas_screen.dart | 59 ++++++---- lib/screens/servicios_screen.dart | 71 ++++++----- lib/screens/splash_screen.dart | 110 +++++++++++++++--- lib/utils/currency_utils.dart | 76 ++++++++++++ lib/utils/transitions.dart | 29 +++++ lib/widgets/stat_card.dart | 82 ++++++++++--- 20 files changed, 685 insertions(+), 166 deletions(-) create mode 100644 PRIVACY.md create mode 100644 lib/utils/currency_utils.dart create mode 100644 lib/utils/transitions.dart diff --git a/AGENTS.md b/AGENTS.md index f0382f3..722f850 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,48 +1,55 @@ -# HogarControl +# Factura del Hogar -Flutter app for tracking home bills and recurring expenses. All data stored locally via SQLite — no internet required, no accounts. +Flutter app for tracking home bills and recurring expenses. All data stored locally via SQLite — no internet, no accounts. ## Build & install ```bash export JAVA_HOME=/root/.sdkman/candidates/java/21.0.11-amzn -flutter pub get -flutter build apk --debug -adb install build/app/outputs/flutter-apk/app-debug.apk +/opt/flutter/bin/flutter pub get +/opt/flutter/bin/flutter build apk --debug +/opt/android-sdk/platform-tools/adb install build/app/outputs/flutter-apk/app-debug.apk ``` ## Prerequisites - **JDK 21** via SDKMAN: `sdk use java 21.0.11-amzn` -- **Android SDK** at `/opt/android-sdk` (set via `flutter config --android-sdk /opt/android-sdk`) +- **Android SDK** at `/opt/android-sdk` - **Flutter 3.27.4** at `/opt/flutter/bin` -- NDK `27.0.12077973` (set in `android/app/build.gradle`) +- **adb** at `/opt/android-sdk/platform-tools/adb` (not in PATH) +- NDK `27.0.12077973` in `android/app/build.gradle` -## Key config +## Verify -- `android/app/build.gradle` — compileSdk 35, minSdk 26, targetSdk 35, coreLibraryDesugaringEnabled, AGP 8.7.3 -- `android/settings.gradle` — AGP + Kotlin plugin versions -- Permissions: `INTERNET`, `POST_NOTIFICATIONS`, `RECEIVE_BOOT_COMPLETED`, `SCHEDULE_EXACT_ALARM` +```bash +/opt/flutter/bin/dart analyze +export JAVA_HOME=/root/.sdkman/candidates/java/21.0.11-amzn && /opt/flutter/bin/flutter build apk --debug +``` + +No test suite configured beyond the default boilerplate (`test/widget_test.dart`). Lint shows 3 pre-existing issues (unused import in test file, deprecated `value` on Color, async BuildContext) — safe to ignore. ## Stack - **State**: Provider (`ChangeNotifierProvider` for `Servicio`, `Factura`, `Configuracion`) -- **DB**: sqflite (single DB `hogarcontrol.db`, tables: `servicios`, `facturas`, `configuracion`) +- **DB**: sqflite (single `hogarcontrol.db`, tables: `servicios`, `facturas`, `configuracion`) - **Notifications**: `flutter_local_notifications` with `zonedSchedule` + timezone - **Charts**: fl_chart (bar chart) + table_calendar -- **UI**: Material 3, no router (manual Navigator pushes) +- **UI**: Material 3, `ThemeMode.system` (light/dark via system), custom `SmoothPageTransitionBuilder` (fade+slide on all pushes) +- **Navigation**: manual `Navigator.push` with `MaterialPageRoute` — no router ## Project layout | Path | Purpose | |---|---| -| `lib/main.dart` | App entry, MultiProvider setup, theme | +| `lib/main.dart` | Entry, MultiProvider, `_buildLightTheme()` / `_buildDarkTheme()` | | `lib/models/` | Data classes (`Servicio`, `Factura`, `Configuracion`) | | `lib/database/database_helper.dart` | Singleton DB with CRUD helpers | | `lib/providers/` | ChangeNotifier state classes | | `lib/screens/` | 9 screens (Splash → Dashboard → ...) | | `lib/services/notification_service.dart` | Local notification scheduling | -| `lib/widgets/` | Reusable UI components | +| `lib/widgets/` | `StatCard` (animated fade+slide on mount) | +| `lib/utils/currency_utils.dart` | 37 currencies with `formatPrice()`, `getSymbol()`, `getDisplayName()` | +| `lib/utils/transitions.dart` | `SmoothPageTransitionBuilder` for global page transitions | ## DB schema @@ -50,8 +57,37 @@ adb install build/app/outputs/flutter-apk/app-debug.apk - `facturas` — id, servicio_id (FK), monto, fecha_emision, fecha_vencimiento, estado, nota, fecha_pago - `configuracion` — id, dias_recordatorio (comma-separated), tema, moneda +## Key Android config + +- `android/app/build.gradle` — compileSdk 35, minSdk 26, targetSdk 35, coreLibraryDesugaringEnabled, AGP 8.7.3 +- `android/settings.gradle` — AGP 8.7.3, Kotlin 2.0.21 +- Permissions (main manifest): `POST_NOTIFICATIONS`, `RECEIVE_BOOT_COMPLETED`, `SCHEDULE_EXACT_ALARM` +- `INTERNET` only in debug/profile manifests (Flutter dev requirement — not in release) + +## Currency helper + +Always use `CurrencyUtils` instead of hardcoding symbols: +- `CurrencyUtils.formatPrice(amount, code)` — returns e.g. `$1,234.56` or `€1.234,56` +- `CurrencyUtils.getSymbol(code)` — symbol only +- `CurrencyUtils.getDisplayName(code)` — e.g. `"USD - US Dollar"` +- Zero-decimal currencies (JPY, KRW, CLP, PYG, COP) are handled automatically +- List: `CurrencyUtils.allCurrencies` (37 currencies) + +## Styling conventions + +- All cards use `BorderRadius.circular(16)` via `CardTheme` +- Input fields use `filled: true` with `BorderRadius.circular(12)` +- Page transitions: fade + slight vertical slide (defined in `transitions.dart`) +- List items animate in with `TweenAnimationBuilder` using staggered delays (`300 + i * 60` ms pattern) +- `StatCard` is a `StatefulWidget` with `SingleTickerProviderStateMixin` — delay via `delayMs` prop + ## Warnings -- `dart analyze` may flag unused imports/variables in screens — safe to ignore for widget-tree watchers +- `dart analyze` flags unused imports/variables in screens — safe to ignore for widget-tree watchers - Running as root causes flutter warnings but doesn't break builds - Flutter 3.27.4 has known warnings about x86 target deprecation + +## Remote + +- Origin: `https://git.devlab.lat/android/home-control.git` +- Credentials: `agent` + token `b453c4526d9b4857f1263c9a80514488` diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..ba32075 --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,37 @@ +# Política de Privacidad + +**Última actualización:** 14 de junio de 2026 + +## Responsable + +**Nombre de la app:** Factura del Hogar +**Desarrollador:** Agent +**Contacto:** agent@devlab.lat + +## Recopilación de datos + +Factura del Hogar **no recopila, almacena ni transmite ningún dato personal** del usuario. Toda la información ingresada en la aplicación (servicios, facturas, configuración) se almacena exclusivamente en el dispositivo del usuario mediante una base de datos SQLite local. + +## Permisos solicitados + +- **POST_NOTIFICATIONS:** para mostrar recordatorios de vencimiento de facturas. +- **RECEIVE_BOOT_COMPLETED:** para reprogramar recordatorios después de reiniciar el dispositivo. +- **SCHEDULE_EXACT_ALARM:** para programar notificaciones en horarios exactos. + +Ninguno de estos permisos se utiliza para acceder, recopilar o transmitir datos personales. + +## Conexión a internet + +La aplicación **no requiere conexión a internet** para funcionar. No realiza comunicaciones de red, no envía datos a servidores externos ni integra servicios de terceros que recopilen información. + +## Servicios de terceros + +Esta aplicación no integra SDKs de terceros (analíticas, publicidad, redes sociales, etc.). + +## Cambios en esta política + +Cualquier cambio en esta política de privacidad se reflejará en esta misma página. + +--- + +*Factura del Hogar — Controla tus gastos del hogar de forma privada y segura.* diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 48674ae..5f49743 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ 1cHS?fB*|5xG#|4Zi_>L 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 Y@NVoi=FXCRsIdi<P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..2edffb2bae15755b0382a83004910abbbf355a1f 100644 GIT binary patch literal 6452 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 H9sPd*H$wrC literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@UaV5oe{L*<*JlkkmYAiB#b zNh2O2VBiuVc&CA8UaM%_rM2D7P24R6%v>#A3xJcIlZSvSQaJO-=aC0|taQ=VD@cd6BY9?WO03dcI zCnf&Td-*ua%MZWr{$;~$T#nx+bRE8c@rf#!szjf}m{9E}RkW$Jw2dJ?K8PurBAOnB z9w{j?RO~6nJ@jN;_J7=pLw_Nw^U5%8VD?dqTa(C-)0{XrsDu z8K04^I=w7!+G{@Zie=j6k6C~5dt%x3=f6ppAqBRtyaC~;A%NME2xxU@1V|Q9#85;D zXF91)jdH3*ZiN?bm8ZD6HIQzHcEhjZejRD-NO-nq?$yO$ik!?Q?79I@MFHsE+WtlT zP^&h((h&$Hxt$dCZ#vpJ8z-HvAL9l5Cz`GQo>s=dC zZgODU}sN)xDV1yblO2J>Uw)aSJ#UOr6d!%#THstDu49)(b1^THvuIDK7 z&9Il%En5WW@{9-Vw`X!JOf5mT-~s?nXVAV-4`@;V0jfF-+LtW@RAm<6a;dI>rcjyb z2?9XBO6ld=l~~MZ2pz~w+*9Da$%7aKXHUEvAb)=|#pT_-`r$C=M_#7r;Od9vc7}mu zBFf{@rw_7EXtV?^2^kOHkg3n(pMi?&dHW}9ZLLH3RD=z^AekWRvq}u+%NO8T0TKdk z1gRViT!sL#TQb1>(rr(_0hY2yG#7RjZl^$cI;XQ00c=jgy5CDCldD#L6zxYO9ca=g z_8A8%(gvK^mZjaJP{oHC;vPbrQua;~^I(o;%B3h+-gCBvT-`4j+@h1%;FwBTCd5ZW z;iW_Lw#q$D^2s)39zagt%CO1r%+ee@nPUgIC-DR(hJ%|#5U@rkwZ3m>0=d~BTDCU; z|FNwL6113~{+L*<^@+3V8gvGi247!3s0_4dXdT)?RO1yu-jUy@Ux>wz<%h&N63Wz# zh@eP}AZJYc!VbU9AaNuMpeb(JRfu3G8exA*og5jOg9P|_gKmq7oCV|}z==voz`|DQ zO}RPjn*&K*8zL$+c^M6cdkZur`86A|0v`rJx%@iNX*q$nd}GIoAnr)&{@~)&kw5pu zJp-TTeZB|zhWIS5V1ipKKU4}QK74m_4R9O$o_0FXNdi`aRKv+b&Y}zv>F3Yh6V%U?=A5_1 z2p!0m(9zwyja`p0p%J5vPHZq&#nZe>mz0kyK9sDyGYRvB064xw7E_tu)%u)R13s(5 zBe3BaL2L_E7Kb!t`bDbO!B1jOzhK1!xqLwG)4eO;y2#4qrUdw_1Gb_!Ac#==01)ea z{Pn@tJe*TZrx2Yzb*RfgiWvGVor83*DpxR!xQyPF;M3Z+p`_l40sVD85XF@r9B-EQ zS=5IW=*>J$!Mij>;4D15aa~tX;(uX~K?D`VlAaFxieEXFo=Ulup4uVAx23)3n)G1u z0Xb_QYA~=t@*>bExX$9NTeF8hf^^m6reVv4tX?`;4TCeYPsCF5Xz6(K#8izkpL-?^Ir3Ho)Tfefn-fKH^y!k!)sg;?0`Pi5+E; z<1ORq2dw+3hmuyBOrn%pffY>tf9!6bn7WuF%UpW1-`QoTFyqZhz=xe~Qsr8D;`ot$4 zLsLV4+46Kf$_G#5#11_#IJ_7gGHR+N+|W2DD|F)odtVn4=EFs<4xn?^!$iOjSE?X% z6*~!ez{?zScp0H%QLLpC7myr+Od1{i0`7?oFovC?^l|-(R)5xg3K2LJ-=1LdGd$28 zJj{NPenwvOxOJaM4l&l;==CC}$1DyQT>oN#`{-K{2!9W@So-}b7p?XiB-iSQ9~iYn z1X3g4oA@vQAI3gc?D#|7>N3!~vTAs~DW#HbfV+roI{O^y_9l|9A-}3|fyvrB?7nlU z-^<-70EX;C-}H%ZaaL(gAHJnge8hRiC=|iiYUgod=a#wHAM>F4615;e6k5e-mo?_Y z4Yck|@J|Ruq&^5vTr|0@p&cyH0@rr6O``ompL4oT|CyoOFi|YDCp%s0I(HuH9vy-T zwLa&>m%z_0{Pr2y>18QrRj{i=I5}DpDz_lB9}`$U8C+u*G+TKfq3g<%FV@Zcj+kq> zqXXc4#2vKB>7=e^x(&bUyk3CTI7tQIdXVaC%tl5oz%G54NNSY9)rT%ZG+n$@KPuy* z+1j+P@o+q%t3Xn-?D_G++aDg8y8=0V9X<)&nnBFKFL0)VbmX!N8I?Jd@8|s&-G~J= zOS$%Hd|`)$b9(dpsGaqqK7Y^NvD+S(?J8_!YHuZn4qpNq zAfgwzmNJWG1X(T7JTX1iI;+j2R7zGy?svwPYOO11SncA~=sq1wGEAznYgP?Er1f@6 zkPDyjzso;qh+j?B&^9eyE|iMW0;^+WfPq}bUNlv-gtXO=>2rw)qu3gH?n15MeZ3+; zU{qkVD;Y3OxL0x7D_ZbugAxO%O?Q%vElUribK`s{3`o=YdlYStK%rizp-V87z9Zi` z`ukUMyCrmZ*&>Pu63F%H(1qhLfs!gSlfJZjLIcDu&EYwKaSd;+ahB3LLqo839q|4& zRcVXo${6N3X6l{uGAu0 z+`zvG2Caax#Tcglfez-y%1J)%zqvENRP??|EpIVsM6kVN!q@cS@SC(=qCuVS4%Iyp zG5E|zddtjmF}fy3w5GTK(yxMBKn51ttGWT(EP05k#;hyAtyGy3)U1B31uF5ju;g1R zJFtzjUl<bRF%442rXm4*Pe%{s}Y_=k!1n2-{q7<;XEX8-vIIS&e2 zVZSghB($dI{!>R5^tnK$nV+kU6l-Pn7N9Q$$(TWvK~5Fx&gWwlRYYErQnveDs=QJ{ zL@go}g3y3?!!Q?zYV^@in1I3_&$-lyuE*bOmPUhq4XMG4Vx7A=%MMT+J z1YLtXA6NUd>94se+w)%fg4pvS9#U_8u)jb-{V`+M$7X`T z8b)0rF*KsvE>Xcm;y0L9*<;t{b3y83Jpy<>yLBqK8|+!s8um@bKtXoVWjqCi3Kf+ZmpwRh-to}b zfM&K`G$>i`H=;tm`=8f5*R8KnbqpvV%k8rzxEnZTOP35wW4)7SD#) ztDL`A$fftQzE_$Z7d=Yvrkb=CLA;?kwBaV8%Em~?c8w|Fatp2#VB0su(p`Q^-9x*K zb$E6y$I_m3FF&+>eR%PlL-0Qx?8LY{G8X}}9<7n|;>EV#m$8+t^y;HWL^ zetKvSLD4aOKVDugHsQ3A(q4rrrHuA4_J9pr@TmWlnJ{NY`D8xM#qWY;$g+bz!Enax z_OiocS4nxF75qSG2-jI^6cU-7cPs&cC7{Nl3Sr!R0EayF!yD&t$P!g57b_f&wpO5; zdyZm`86j~6EPZLbGtMJ2;z$VFP4glXO9eXNZV6iw406n`=Xk5;emeJE|7PJ=y~#NL z!|0Eab;G@}aL#(0YH^1;y1WgQM|{Bzk`5A2Y+U7C7KNj_kVpt+4S8Qvea)Nt@Ri37 z*e0{SlAbw8xmN`TRzQ=zMq~Xc z;B@G6|F)}_=Q`y-oq6Fnn`l_=hp^fot7{(ird-=GR^1X42Wauv+rBONtkN8dq5!Ix zxU>WOesl)?^}X=jae#9wPCS(u32spz;~YlsKSJ&&atwWj6T&qZF`$Gw<|&sCC#IcN z@A2MS|5`oFxukRMtoz|QOd}$c?ftj7EEU;iX!$+0O7OVqoEP!&!puxlXx;y zfP%nD#m{!)Hi3hprN;Zb%gaG!HMXt;r`iUKqTu-Hv`OHx790nDOW__-+-!w)duDV* z;y}=Cbie^i-x+qV2X{6QAd0|sZ0GdLjmiHMiCB)1uVzXH>!{qy>_v11i5$Ghay{Qy zpPL|`#lQ#Dl{~pt6bg{_YYgxRC}!w=T?>z#r)`c>NDZmj~-s1}Z-c=@<_ zxoDnz`R*-!uG7<TK+pU^z9fR$0YB#x*KPGbKJUjf_N_>&9u9)NGsN&IdcyBqPvAF4-FiDpkI-j z@X->*)EjwQ>Ov1kd|BnL`DX>>Z76EsOdiiaHl^=m5;uE=7vfrlVH%*~Try zKcfkcajttea$rFj{LnPRr7-C|P%Eke2j$zzp#&eXmhA13&nCbDp>T@@dTF|#5_cuV ztHqnmA6||bYj-01Eu~94sW;$CD86b@1TT##qmZxANi_Lk_xd^AbOIY{ zRJt2{dc7+8cZw-*I|YG_$EOr)i{(A>WX;#<>q6Zqk4JVB%f>n~QEh(CvQ zih;@x=R`2q$Lp7>uEwLrTEs^qJx#DL=N|*q(6LYAsE_-d zttjM2PV>WzBgnd?>O9ESbC4Y^x$_MFCnt#JJQ zhlU)Fm}u-qw>uw7c8~mn+c|XkJ^b)DZphDtN057_;T^A58LzyDT- zPVuf~Tunl-GTsu%~@((emaE`PG2$fW*?w!`^{4dW5aX1Tqdl^=+oNzAsb zM4IYlGp>@d_zxS$3FpIwu~9COgdHU_s^`yUT(^~og*;Wb)VGm1PMN9C`CXW4+-g-- zKbV5$H94vRyS87NT)XEkOswZHASbqn7PQjtv40H!?R;e1mgJXCQzN=8eb-!j#ovuz za5uNvPRe{bh8xco-n|~ZBw3GGcP7^6-w0(1VFQn8P@}rvSn-5|?{A`7xG#+tBhHi~ zl&8E5(0^IARewGW?Jl;emutawJ>2zAUOM^Zafu-6Uq z619D^NO>;zlEl#Kx9J<0LfPevge>aNVbUB*_%p2Vw?2mMu%F zehtbG%XFqG*j`8~8f~mNSY}+|OQGsL<=c~n_PE(^1s7N2o3qB3J8{k`2P&?yRs^@c z4}L#8>DH@iyKwP7U!K2OIRO?BxIfxZ3;>DrJxCAaK&N#SMW`wTrf7ikhjN`mKxpmg z``U4%St@CFd**KoceWF8fE2uuaVZ^bmj zWUdw}pEeLW(1Akk(Bh!6N0N7RGv;W+PeMPSnvViRXaTprY3xGYfG7b7M$B4B=H6P= z$6I+MUYfVL($?5j+o`1V{fzXlgOA_KR611sU)2HJ#ol8x)G2V`J%2V;ER=U7gP&f? z#AX%|_Ss~$mVqNHE&Bh*5sqMb{KH;fr(7NDF`4&b^hTjUL1ga z#OnZXX!I2OydbxCWRl+Ukn>y#-Htq$0##8}QP63bcK-m0QqebOZ?Wl>q;g8bD`^~~0y^*`SP@nDh3+WLG72fTG~k5mClB-YieE%kB1gomR(7>d_#bXcgjVo%PwqK~Dgf5G z=qjo;JdetnP2B`RqhX=6tDi!a3x1VFa25sVp))GlV&r{HdS)r<4McI{)3H-{JQX-M*ROiD~fs zTXEn2GzA~GsC$;dZsYFCmm=57nG0+9$4AKd-9ZAp-v>AWmWnlop7{1&!wllCqmUk~ z8v%57szi=NVLuVcEp$-V=Iobet4;h1LUQ(>hUz0u%J zJtvjJY2q?JEUxz1cyJnI;QU?-cnXu(#zwv1F62q;AnIt!JBm6PpycU!Fp%Pj&1$Ke z4Yte`)SY7{$Er%ojI1vW>zp}-_bYy`W1p$SL3Qfz_N9#^em{pDL@fWLb}&&&A^GhG zLjB#pFxpJl=}lP!6ciV$WxU{_@SamIgn%Y$+rhc|QaIacCUs$igvKUU{frG`>otsb zC-#UI;Zi~*&D$?srVmz3(#)e4uJ1;qzeXewdQ?3cgMSC?#>IKR5oz`_EKY}XH7<3| zctvqwmE{CgY`nd_zEZa10(h+79qQ+!SNaQNffgm^^%=1q8fC5kEhIt;O&(m%{tY|L-ZobbSSBLZVI9g90 zXhxFa9HMLo8vlB#{hCj(+hC&9!_x&LaT4`D#fn_RR%11Vpf#wUWQicS+U~{;zD1I% zl^KKMyxqJ3b@=amVZXeC2`=zk3`WR(#nYKn>VKOWXpf>ppdJ|NFn$x zx)R|nbGp7gOX67SBNxe?5g^)ube8keF?eyHy_^cMx3vQU|FnrH+kWjZtYN0RUJhOJ znIgtv|J3wVY4~h;;sm?w^%8}>Gu8U7d*NAFD>SC&zmw0V(=^DkoblqXg_8XbxhN#Y zoC|@a$6HZwM_lo13JJQsJUMEVFhrV60n*dk35aSz2Zr?7Zb}_v#PVg5J_>naFw4Og z`0(4R_TF%f{DQpsewK4p1VenRhKPb9C*@3kIT(kD6&@D4%3nbfl-Ivc-udqflr2rA z&OzmWs~%!n|7T3WsBTbTGFo>w$Z_6^5ui`g z{`OKGbQ&pE{QHh2D;apCww;vv1?QAVYV)p7y-keIIYEO`8!o9LBA&M-3&LdRFK)uU z-*piw_QKoMc$(~BV~05FQ>I^zVz61eD429oj`}v@z4da5Ngn3ShsMR{rD#N6M-C)i zQ$m+lXCKGJ%?9C^X%lQ;%Ud{$qU)>zW%v}cu4_TMu6})or{6t`L5rlS;(Q70@;X$B zw%|3YOO~F^{XJsJC%2_fpy1j`i-Wbjsy*#5po2+smx1fsqU64lgxx2H#xX;!e#-{x zq&V7v69#n+*Un4)AYp2(ZXgn=cJqpG3~1W@^Ige~m*Fz++5Xk1>bYbM^!RyY8IgD! z_e3OA`tEXi+s^zJ>^#I^B0jONcYx&1IWG+0NVH)8e75UKaFfb4nC{gB4JM_pe+sGk zB~9@UN1lN9nXf0LUHn+6G3jJx+(%ZkSqo$+4Yk`QsFA#=hkc#(lYB)H6|4LLIek+W$gD$S5joCpS#&v^wA=k145o=;x~u>YED4IAooM{we>bm<-AW$gXi z!K{@zh%w>!s@CBTi5OkI1~$+WdHJhsz?RIvx z+?O_X1b0sy)5S`$nz)wq-~`zaISnmXsQhgPd`y+vLS{xZj*1kMTZQB<$mO5am?H@G z9^)?!joY&#XP0hT2XzDmS41eEH}WTmTx>yvnISuq(kG(S4zA+qGyU%W*lnQ=KY zP|8(wI`zk<>od)uOC7=C-X-sp!dB)>q$Jq=@kR2-de~;?+ROU8h`dW^WHR;>EZNR7 zLD3MUqwl%e&rJ!f_I_Ra8yn7T!=S(ZwOzEErJkaYLa^G=QP>vozhvfU-bra6A4WcE zPMwU=UAb9k@aS$?BQavw`Ko-2ir`URwAn+mATit{JL2tEcj{0@FRx3*;Ppm>+T;6$ z%{VUJ_Z=QYQdP*pxMd3Z_|KO#Esjpn6TCxUK{&Yte_radsf&JI&7AN$K9)n3?sZ@2hAI*x*- z2I4yFzZONI^2?tckKJ?J-WE5b>Ns9pCbtNNUc24=vkzam-J8WI&vn{6lHc$n3>7&J zkTtcx$Rc{(wF`V!pY8FRb*tQC+TWwl({o03 z3_nn35@a2om$|yxB$+`J7~g>2j%hY~_Y2UiWqXaaD9iu6*@j3ZNv#+$QmJzPYpBI# zR+viKt>rsW#5FhkW#FE%A9OZ2O)$|Q0?Ko0HFBvYh^egpZTgVL@;W_NdDzA;V`2); zv>2`M!eZ=pRWhz&3PJeh06Jeg7!ci8lpi_xrb*p%gBCx zhB|d((!UnNAJ>ga3m$XQs1W3zaJKJIKGMjPjX>!3^}mo_q^+Zx??Cz#knrgO8{Uh@j-~XESr&Kz8r!3gs71%Zty4Jzbbp zqGKa z-fdB*F|OtgAfZG~g$`F!O62ctE6KPY3Zxp>ena9;pIf4#-Ty4J%gBQ`pY|Sck_+7g zTc!3((s?7BfYF{LCH4bS8br184Q$0*FyEnvM>0xV*)I?WuG8~@MkpZ)tDJQ~$23N4 zR|_XHYMTtx?Hj&7VoCgURlkH%102U@)K{pY%|6#iRG!llxqVY-_U7M+nj!w)w*Z)%WUcrfL~=Bw;AG6MNHNi9**f{#AmvD;x^!bpK1OxSF6^)^Z5b0Wr!?tvry7KBH1FJk zntl-Mq4DZ&AzI4q=&*!8t)F%jJc8sqyse(8AjS2Osapji}SPC zstQI1W~n6~&WvyIQSwornL%OHHfq=1MG5cwwGFN6i1TC-usuq|IufwQoLSn;{7GtrP%I=;$~1E2T; z0SClB5|P{$DITY4C8}8Ot9O8fdBIo_Vwe;$J{vFdI8hZ$+!m5(ur;Bfj#3HQwM}-o zwDV_>f#Y=N-rJ_EX^b!j3XlxVUXcX0_qs|Q$wYxnF93zYd<|;!biRHS4Xri_!I}wJ zUyuwYJhe4Sz%st)2kN3imS-K0FiUweY?&bn;+JSORDWJC93+SGsa3saMY!d0#I)Ov zwUMxx(t2Yn)qzJ$PLd#~RP-i`$qu>{i%tgk_RWDP-$dgQm3`4S&Or9DOwF{25sRS- zZ)zIdb)h{jGo-SEo@c((GnKnr`I=8P`Q8jm(+Lma=j-4sJD(pyqaw}li;d>nHsoWE#z@E_sfehQ#?HaR6wdi)C@4$USKxC&Zwslc~))=b} zBqhb|5%itU@sSf(1x8Sj=&=}nqq04Of_WZqu z%oaVX`FSo6W%CdYA-nRR%f<0G<7Awuci|)if6Svu2`Uhj2(9=!wWt5y7v;m-+6U0s z&zBdPsX+D%x87@!PWWX;3L%DmqS32Urh&jt4gQLDffaZ2Y-Fmd*INb?heB#ZWt^?c z#d-O{f1-Swl&d}6v<3RrsHN2rk@3#tcw_~4ToO6CyuN+Q^dj=XYn5air)Fqfv=6;c zsQ}d+T={lBB%LGDOG{H&oGTl-S2$-j2^Bb#Lf>s+w12AdZC|XPmO>|{y)Ld*r(W7= z;*IPsFM2nVA=*WP!^p2bk$c&>$`(k>!H5K7enumwQTw*IcixfH#bI| z{l_D@O>MxWEz>QIK=wn-$Zy0pEPLbt)y&Nr8quFDTW#+|@K?-3QMfYWx$1Bk4aw0C z7ncw?1m~1RfqZF$IipW|G=EMFqNBw~9QGPx%)=G%k5!^8Ox~gMSK(sM>q<~Q)zGt! z6&r8YU~y$;ccTLOF(gn<&(O3Qh-Ex*#^)&nyRNP+dxmp;2`AemFQaG^i~CGLPX^ti4v}g3H|6r0iAoZz_#wxfYn3h?QDse! zeWz*4K7r`h`eVjh)6owM-KDXECb?b{Lw_XAadc=~@m&-zzOE@~6Gt$jHx5d~oh*U9S9Ng9Ix ze$%-1)d9XL=t)E|IQ4iIOra@3jVnFfF%hom2h4-hd8dU$g(MQ9Ir8z^kJA z=K_XQ>s0DuO>_rcXq?0{uOV1WFtx^p7-mV08QSPz$0~P>Li=3WCA*d_;HBeK!iiiTVe)Q4D>#n z)wQXcjH5K%)p-K$eTY6GDNZ``VIFQcMT|Y2bP`b%9Sy;vT#CcDZEcI16N6A1K8(ms z6I(##;#-TnVfXXK14&BCMtKRL^#n_o(5Gl0zwbQR2>%X)yS$!(hu{9oyATw7SADs} z?wEZ0(tO{e7J`|aUGtB|HA!L3g_K()U$Y3dj|FiaNt{@HKjO{k5RwgRkyDR%i z)-|zC&}X;DBfrLACuf*;E~@q~0Zo!=1BG);I4Qi^8G|rj1yFX=h`1Y_Q0q*Qrs=r2(DiGHp5e;fu3)fLa z7QF4i)uC98zBZz~dNFr__3SV>kmmt?ZpjHihSKyi46h&dak59x)@sMIO(~4K36&VK zOKw%7-5$ix2oWVeyU2Fm|jAXB~yV~S*Z{SD5I$T?6%CfIoSEF=p zJ7>_l{4sh%L|EhxczMVqw^FQNoOynuEV}ZS_aRZ!lO=SRM+eXhIAImpnN|=;P%hgr zKd>)Uima33Ov#@w0Th+C-<{aNHKUH-!Rb{wcyLA$=uNcA_;(rU(l-5F}w zRvqbv?O#ftydA0x#u)a0wzDqGNe|zSR#__GU6S06zs)+mr}fLCTUe?_fBVGP9Bcel7(he%d#Gn3YK6TU)WVdqfY?ZqT0q&Wv^+1cFqqeH#ll zK1k`|vWS@SCn;f0b_Z*Lr!s|BomxPH?Yn2>9nT4C*zzF$z zpAfV|O+XfWqu3Ooc%YW!4x2&%VgChYp6YF0dHa;|`$=2PvgD1+kQhxYGL$K4)2u?IMv#JEsr9*(jcqw0I_XzI(yUek*M)Q1((qF`No7Vnp=~$u zR=eKFRMHyL^lDv&D z;m=9Ch(uoUQU{jdbvplGjtN43ZTKEZzuAZ;Zc#)&Q-Hp-f;Iv~zYx=3)!y_*3R0d5 zZ_Gbxb!+v##BRtEjOZ|&i-8jhHs)!m&p!ym>vwqzgD(B&IfdWO@_a|p>vf;%t(xcB zbk@Dcw7Kb`SyK?zp~V#Aow-7>@L&c7yfQt-U0&-micgS_c6y$E&GOEE()Zu$y1Nd= zE}$Guw25$s(3Y=`#_hRu2NS?0Vw=-5ko*lUC~#k)5@`CNKhY%f3h943oj4P)&k3wJ z|1zz*x8PdOBn57&F;D^=mec;rnrOh7wvH2$m5(BS$# z8{tG@&L@o=tfG^i`tL1qKH_TxWSSaO9he&cd*fZlv@nO)6n!XjT&n&x_^n&Q0^c&& zv;)cMa4cAUEx(h&14oQ}W`*@JSOIDTetcPvWxLW{$fx>E8tKQ=!u4_OlcmQ}(a+D8 zhmeQwkdmXXL!vH8ibzBUhR5-6FUikS&xoMQk45RyXRKK$9e;xEp2@r0)je*mK?|0e z6JIeuMT+3u!q@2Yf30x}bNKbaNwAG%Ijb~FryBin@X&DN2C`{e%d}+v!1P~*PC&`4 ztP;_7bmPEgx%HYiKM*#0yNgvE`0h9|t+N`o6kl<-m}R6xyFc%6g&tOOTC^lOMvRtu z!2o6r!eZB_vjwy^?0vX-)+3g3x=@yXXji0glaN@FS|1~S#99oeR-0|D$r|an6}!1$ z&i4G44}q_34P1IA?~7?u%l}scWM^NQP2D`u4alhay-#B!!;iFhTWW`H*xhRSPatYHg8m2f-4GMoAc)z%sPapZvj}QjNuVJ3u5~; zC;i!tu;0U@!$ke;wTs%*6-*VJla-DmndRz~yQ;U~QxbLoJGHy!{;ZamL*y=$f5(yk zqYpC};p~X+j4sJ7atpW9!a=wzR_y}GNfzc0m5J3Pb1Gt^EfyfVh%O}?|4-aFqJi#! zHE*U(`e)kSrhfyAwyLd?rKDjM{C9%qr@@IGCrT%}Sm!~4WBzY}>Z2gQmM4SaB;u-f z-W^(2r9P3e4qA9pJzW?P1hhxMwD$qg7{h=e_z?&8g4oqKbA+>xZH>+nzR+AN&TTEw zv|FJ-(p^BQFwe$*M_Yul9)7{mwAZrk#u9v{L5VN99$N9XncGzaY#jGo2@|Q35Yri; zMS731N=gsU&*WddvnQ^&cBZ+G3Az-aBx(Q19hAv*{%MaVl#P(B-7A1~^;7wj!dSR? zOaOPp0vTZ3r{@IP=kP;rvah%O&(9qgbXrZyY00&{2Y-U9kAY6sQXm~Ca@Hlf!qXhU z=67+=ww`X{yjvP8Z8H+&ysjDEXC6xi;dp8nq!I~ztm>fcsDvHu8tw2Fphf(4qa-5& zq=RbYt3xikoA3B}#rBww?Wp;UMU$0!*e2K*9bj?5tzV(=A0*1w}a1TDTov&97#%@Of_N_^>B!%?eYc1ApGfYi?s6 zQOqCq9b@M_KLE6fzskMpC2>IV&M2ydob%A!DCddt*63p6FaeDBaNJedGqKI6PkFET z5b_G1{?Ew)N?-F=I$oH5h2~sr*2S6EnZ?-x(7FHY1L7$AaU{LSdo6Wm*4W#+9cY+y zi+76&M}{^Vvar1Bdhm9m*MaW4Lr1vS;(eXxliHH}yrlofh9vOd(z4%egt_nHGK%rr zX}yAVdraL75OapmbuO0d+eC-5+BI!+J8gpNk!KO#jb*I5PL(#b8{H!i^L9#jL*qli zGodhkSDE=A5S%TXGAPw!SQnn-=-qc2UFVtpU4<%A$P3D8TbmwJF_g+uptPMBa z+n~yF4X?jhXrbjQ1~S3>jXIa)?04(Q3|sik@@=HN`wGA%MwE$iAqOx}FNc-Q8kKg@XE#qX^xTG% zlt#6l_LUmjTgipfp2D$dER=e2+&-XkW}KenuX|3?)ui0BlSj!eAVA**Br5sX3ZkaQ*_OhG#$fhRzAMN+2~}Kv$1I-fw30!2CKKL*~BQ9 zRN~b@&s=NO6xHD>=mg~?ZEY;qeyqgmM>56aihSdIZ#o?(`M5XXVs*xmG!!T1r^o>L zy_M>j{rEfKI)uN3oGg*+QgV>7H%~NYWPeIPh2O(E38(O>FhViVJbKfuYJ_z>DCp=q zHJ$~4{=;8@J(t{N#Y8MY6xqEAy}#E^h?+{bMJ1!brz???jeOI);j7%O+;4WK*&%1D z6QPOISUm4{x)b4HC~CjTIGm-b`)^NIE(up?5N6jKmx8?ZbNvl2U(e3$tvoD?ysR#; zbi6t$!kG!w)l>be`?lk8-yGBX&+B`x_n$eAhh0L=aw87geYkh7&npK5!RMB{Ru3}0 z|B4QLCn|!DIU-I4Z~5%kzuotAkZk^j*7aF+z)#*B3IZSBTAZt661H4$_$UU&8r_Ev zim2U48Wx@AI=#s}uz^& z@DH!x%Zw-!vY!eqW{~4aNd+r#Ou&md1A< z*yucPsq{?S2!6LWfKyod2TKhHY}?C4y+ynd+{ghHy#-PI;-HS5ZSc8=7+8d72rcDx z8#argGy^9Ln_2w4n=EB8*FQh(`;abwhx#(jPzQgu<8;%ZhU+s9@?Y6RJ~-r6{_-_T zN&M0UyNBly3p=U`oGhOi$4+XO6_&v7!P^-qMp`R(4#yP{p8rWnrDmZFjz^l_4A33F zq7s%0p0Z{y7EN5J*&mjVzj*Rg$1AZV8B0mfEv{l1*GOV2!F@uatuiksD+vtmVwuN2 zfrQVehcKNpC{&NRI}op3?Vn&4sUkZX>f{+1ox7^;o9&zAMsgn48rR z%BT(yqWanqi%uXN-?ejM2>JWJ3B*S#JKPH^mK5rQlnZ9oG3aF2A>r_y2E{{6+uk{W z*gE@$L=K6mX%CanX~?<94-)B|@V3H^sb|W>HU2;sL%YG1znC|L(D*q`CEZVRpTJBA z47ik+E%AtfY%gzK(qIwVB8Uh}K8D9U&Dmo2W{4d-7sLR+dJe;tO^+-g8;EG&PjkGn zR91)(yja=nDYnR6mS=9HzEccy5ij2zZtU~tI9$-5B%gOUEK{BYV?uX;rA)^5?XR3K z_sQVjpTag;lVMBaZX|oN8R-kk&!1GCz$$-Z>66~{><)NY_k^)5(Z>B@#9p%h-}Doy zVHRHm%kST@E8V*|Zgvs>VcU!jd;lMGC&)t|3(*2!8WFojnDa3=r?rcrX^;syuUeFsLD8}H$wu?_+=SesY{e! z^>s45Jw;VK>qLDGxcme_%hR?yk++o0q$>u@bIJ?p)&k zi6KBVB^ng`8w*3UV={Ebeh9;+Vl0aRFPJC!yCgkLn*dLHWN!^c_pb72Whj|ETq;#6 zky!XE`m1W^orM8&+&|nRhNCoUS!g!vs-1Z%^o6J@ZIlIuu5xx7zQ0Wg zEZeY-6PbC3V&n0iYYfhSVw({4(HMI$>M9oZIj0E*_Xf{KTPmwKi^y8IA-106(E%Lw z>_rjxm*=@C@flMyVWW#{;i}<57-?m3HDXEzu&g8g6X}joA_aV-UHA;Y-?m#=4W>IvhLi!tXUh+^&>Fi2=O4M6r9=yay z=3{%-S@SAH&b0{?$Flb6%3}E+Y$~ASe22r6y?b6cPjrJWAdblbcBYQD!LNI3d=Vms9;!I`4>KMBE`?31MS1cg1Gunyz zmKFW|CFI`r$P>AVxOhy;RaWBT%@=B}r{=lQnc%s`*OR~fE;TIRLZmZ?0FMV1tkc;H zglj7P^(l$P<(LEUE71&39uw?;DWG;4tAh|2)Bg$*0qy?nPxpTfKKwWP#sTQ3c?W>? zYy&)`OVTqtcsb6*-s*UU0Pvl*AH-&^dl`Ta&(cSm0n$`hs9$nklwq{1A_PniJLjJQ zAXN0l=*t0UFN^4S8DPgnq-f&Mz8j!#5yrd9+6SP^N{n!neO*!KY8imJqP0pFwc;`7 zeHr$IUBZ{Y*_m*Rg>;4NFOYuE7Jw$51&H@#A}IP^j7ar?uz?rYNenGXV;%tD#UcQ* zW0fD2iJ;&<$7SG|Kj!tiuH47S^vC3Vb=B>GQTjbr0;3qJ-v!XeB_c6gv|MB4eJ!9o z0H=+%P0y52MhAcPfWyW~k$ML|(}VG?3!V4>06ETlZpAGkhyVZp07*qoM6N<$g4RN+ AU;qFB literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0ce52a1c911ea6ade8c0b705a6650301405ad5ce 100644 GIT binary patch literal 28501 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 T@;TzsIe@f;f_S-@q5uB}>&PXD literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..1479e73690c5daee75b428a807bf32e10fdc8899 100644 GIT binary patch literal 36072 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 diff --git a/lib/main.dart b/lib/main.dart index a318bf1..7ee84a4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'providers/servicio_provider.dart'; import 'providers/factura_provider.dart'; import 'providers/configuracion_provider.dart'; import 'screens/splash_screen.dart'; +import 'utils/transitions.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); @@ -25,14 +26,88 @@ class HogarControlApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'HogarControl', + title: 'Factura del Hogar', debugShowCheckedModeBanner: false, - theme: ThemeData( - colorSchemeSeed: Colors.teal, - useMaterial3: true, - brightness: Brightness.light, - ), + theme: _buildLightTheme(), + darkTheme: _buildDarkTheme(), + themeMode: ThemeMode.system, home: const SplashScreen(), ); } + + ThemeData _buildLightTheme() { + final colorScheme = ColorScheme.fromSeed( + seedColor: Colors.teal, + brightness: Brightness.light, + ); + return ThemeData( + colorScheme: colorScheme, + useMaterial3: true, + cardTheme: CardTheme( + elevation: 1, + shadowColor: colorScheme.shadow, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + clipBehavior: Clip.antiAlias, + ), + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: colorScheme.surfaceContainerHighest, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + ), + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + ), + pageTransitionsTheme: const PageTransitionsTheme( + builders: { + TargetPlatform.android: SmoothPageTransitionBuilder(), + TargetPlatform.iOS: SmoothPageTransitionBuilder(), + }, + ), + textTheme: const TextTheme( + titleLarge: TextStyle(fontWeight: FontWeight.w600), + titleMedium: TextStyle(fontWeight: FontWeight.w600), + ), + ); + } + + ThemeData _buildDarkTheme() { + final colorScheme = ColorScheme.fromSeed( + seedColor: Colors.teal, + brightness: Brightness.dark, + ); + return ThemeData( + colorScheme: colorScheme, + useMaterial3: true, + cardTheme: CardTheme( + elevation: 1, + shadowColor: colorScheme.shadow, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + clipBehavior: Clip.antiAlias, + ), + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: colorScheme.surfaceContainerHighest, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + ), + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + ), + pageTransitionsTheme: const PageTransitionsTheme( + builders: { + TargetPlatform.android: SmoothPageTransitionBuilder(), + TargetPlatform.iOS: SmoothPageTransitionBuilder(), + }, + ), + ); + } } diff --git a/lib/screens/calendario_screen.dart b/lib/screens/calendario_screen.dart index b45b4b9..02b0dfa 100644 --- a/lib/screens/calendario_screen.dart +++ b/lib/screens/calendario_screen.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:intl/intl.dart'; import 'package:table_calendar/table_calendar.dart'; import '../providers/factura_provider.dart'; import '../providers/servicio_provider.dart'; import '../providers/configuracion_provider.dart'; +import '../utils/currency_utils.dart'; class CalendarioScreen extends StatefulWidget { const CalendarioScreen({super.key}); @@ -54,7 +54,7 @@ class _CalendarioScreenState extends State { context.watch(); context.watch(); final configProv = context.watch(); - final symbol = configProv.config?.moneda == 'USD' ? '\$' : configProv.config?.moneda == 'EUR' ? '€' : 'MX\$'; + final moneda = configProv.config?.moneda ?? 'USD'; return Scaffold( appBar: AppBar(title: const Text('Calendario de pagos')), @@ -103,17 +103,41 @@ class _CalendarioScreenState extends State { Expanded( child: _selectedDay == null || (_eventos[DateTime(_selectedDay!.year, _selectedDay!.month, _selectedDay!.day)]?.isEmpty ?? true) ? Center(child: Text('Sin facturas en esta fecha', style: Theme.of(context).textTheme.bodyLarge)) - : ListView( - children: (_eventos[DateTime(_selectedDay!.year, _selectedDay!.month, _selectedDay!.day)] ?? []).map((e) { - return Card( - child: ListTile( - leading: CircleAvatar(backgroundColor: e['color'] as Color, child: Text((e['servicio'] as String).substring(0, 2).toUpperCase(), style: const TextStyle(color: Colors.white, fontSize: 12))), - title: Text(e['servicio'] as String), - subtitle: Text('$symbol${NumberFormat('#,##0.00').format(e['monto'])}'), - trailing: Chip(label: Text(e['estado'] as String, style: TextStyle(fontSize: 12, color: e['estado'] == 'Pagada' ? Colors.green : Colors.orange))), + : ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 16), + itemCount: (_eventos[DateTime(_selectedDay!.year, _selectedDay!.month, _selectedDay!.day)] ?? []).length, + itemBuilder: (_, i) { + final e = _eventos[DateTime(_selectedDay!.year, _selectedDay!.month, _selectedDay!.day)]![i]; + final esPagada = e['estado'] == 'Pagada'; + return TweenAnimationBuilder( + tween: Tween(begin: 0, end: 1), + duration: Duration(milliseconds: 250 + i * 80), + curve: Curves.easeOutCubic, + builder: (context, value, child) { + return Opacity( + opacity: value, + child: Transform.translate( + offset: Offset(0, 16 * (1 - value)), + child: child, + ), + ); + }, + child: Card( + margin: const EdgeInsets.only(bottom: 8), + child: ListTile( + leading: CircleAvatar(backgroundColor: e['color'] as Color, child: Text((e['servicio'] as String).substring(0, 2).toUpperCase(), style: const TextStyle(color: Colors.white, fontSize: 12))), + title: Text(e['servicio'] as String, style: const TextStyle(fontWeight: FontWeight.w500)), + subtitle: Text(CurrencyUtils.formatPrice((e['monto'] as num).toDouble(), moneda)), + trailing: Chip( + label: Text(e['estado'] as String, style: TextStyle(fontSize: 12, color: esPagada ? Colors.green : Colors.orange)), + backgroundColor: esPagada ? Colors.green.withValues(alpha: 0.12) : Colors.orange.withValues(alpha: 0.12), + side: BorderSide.none, + padding: const EdgeInsets.symmetric(horizontal: 4), + ), + ), ), ); - }).toList(), + }, ), ), ], diff --git a/lib/screens/configuracion_screen.dart b/lib/screens/configuracion_screen.dart index fbb86da..8edae29 100644 --- a/lib/screens/configuracion_screen.dart +++ b/lib/screens/configuracion_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../models/configuracion.dart'; import '../providers/configuracion_provider.dart'; +import '../utils/currency_utils.dart'; class ConfiguracionScreen extends StatefulWidget { const ConfiguracionScreen({super.key}); @@ -21,7 +22,7 @@ class _ConfiguracionScreenState extends State { {'label': 'Día de vencimiento', 'value': 0}, ]; - final List _monedas = ['USD', 'EUR', 'MXN', 'COP', 'ARS', 'PEN', 'CLP', 'BRL']; + final List _monedas = CurrencyUtils.allCurrencies; @override void initState() { @@ -59,7 +60,7 @@ class _ConfiguracionScreenState extends State { DropdownButtonFormField( value: _moneda, decoration: const InputDecoration(border: OutlineInputBorder()), - items: _monedas.map((m) => DropdownMenuItem(value: m, child: Text(m))).toList(), + items: _monedas.map((m) => DropdownMenuItem(value: m.code, child: Text(CurrencyUtils.getDisplayName(m.code)))).toList(), onChanged: (v) => setState(() => _moneda = v!), ), const SizedBox(height: 32), diff --git a/lib/screens/crear_factura_screen.dart b/lib/screens/crear_factura_screen.dart index 3a3e840..4430ecf 100644 --- a/lib/screens/crear_factura_screen.dart +++ b/lib/screens/crear_factura_screen.dart @@ -4,6 +4,8 @@ import 'package:intl/intl.dart'; import '../models/factura.dart'; import '../providers/factura_provider.dart'; import '../providers/servicio_provider.dart'; +import '../providers/configuracion_provider.dart'; +import '../utils/currency_utils.dart'; class CrearFacturaScreen extends StatefulWidget { const CrearFacturaScreen({super.key}); @@ -40,6 +42,9 @@ class _CrearFacturaScreenState extends State { Widget build(BuildContext context) { final servicioProv = context.watch(); final facturaProv = context.read(); + final configProv = context.watch(); + final moneda = configProv.config?.moneda ?? 'USD'; + final symbol = CurrencyUtils.getSymbol(moneda); return Scaffold( appBar: AppBar(title: const Text('Nueva factura')), @@ -58,7 +63,7 @@ class _CrearFacturaScreenState extends State { const SizedBox(height: 16), TextFormField( controller: _montoCtrl, - decoration: const InputDecoration(labelText: 'Monto', border: OutlineInputBorder(), prefixText: '\$ '), + decoration: InputDecoration(labelText: 'Monto', border: const OutlineInputBorder(), prefixText: '$symbol '), keyboardType: TextInputType.numberWithOptions(decimal: true), validator: (v) { if (v == null || v.isEmpty) return 'Ingresa el monto'; diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index 5066f87..9788a2e 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:intl/intl.dart'; import '../providers/servicio_provider.dart'; import '../providers/factura_provider.dart'; import '../providers/configuracion_provider.dart'; import '../widgets/stat_card.dart'; +import '../utils/currency_utils.dart'; import 'servicios_screen.dart'; import 'facturas_screen.dart'; import 'calendario_screen.dart'; @@ -37,13 +37,12 @@ class _DashboardScreenState extends State { final servicioProv = context.watch(); final configProv = context.watch(); final moneda = configProv.config?.moneda ?? 'USD'; - final symbol = moneda == 'USD' ? '\$' : moneda == 'EUR' ? '€' : moneda == 'MXN' ? 'MX\$' : '\$'; final pendientes = facturaProv.facturas.where((f) => f.estado == 'Pendiente').length; final vencidas = facturaProv.facturasVencidas.length; return Scaffold( - appBar: AppBar(title: const Text('HogarControl'), centerTitle: true, actions: [ + appBar: AppBar(title: const Text('Factura del Hogar'), centerTitle: true, actions: [ IconButton(icon: const Icon(Icons.settings), onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const ConfiguracionScreen()))), ]), body: RefreshIndicator( @@ -58,6 +57,7 @@ class _DashboardScreenState extends State { value: '$pendientes', icon: Icons.pending_actions, color: Colors.orange, + delayMs: 50, )), const SizedBox(width: 12), Expanded(child: StatCard( @@ -65,6 +65,7 @@ class _DashboardScreenState extends State { value: '$vencidas', icon: Icons.warning_rounded, color: Colors.red, + delayMs: 100, )), ], ), @@ -76,36 +77,74 @@ class _DashboardScreenState extends State { value: facturaProv.facturas.where((f) => f.estado == 'Pagada').length.toString(), icon: Icons.check_circle, color: Colors.green, + delayMs: 150, )), const SizedBox(width: 12), Expanded(child: StatCard( title: 'Total gastado', - value: '$symbol${NumberFormat('#,##0.00').format(facturaProv.facturas.where((f) => f.estado == 'Pagada').fold(0.0, (sum, f) => sum + f.monto))}', + value: CurrencyUtils.formatPrice(facturaProv.facturas.where((f) => f.estado == 'Pagada').fold(0.0, (sum, f) => sum + f.monto), moneda), icon: Icons.attach_money, color: Colors.blue, + delayMs: 200, )), ], ), - const SizedBox(height: 20), - Text('Próximos vencimientos', style: Theme.of(context).textTheme.titleMedium), - const SizedBox(height: 8), + const SizedBox(height: 24), + Row( + children: [ + Icon(Icons.event_note, size: 20, color: Theme.of(context).colorScheme.primary), + const SizedBox(width: 8), + Text('Próximos vencimientos', style: Theme.of(context).textTheme.titleMedium), + ], + ), + const SizedBox(height: 12), ...facturaProv.facturas .where((f) => f.estado == 'Pendiente') .take(5) - .map((f) { + .toList() + .asMap() + .entries + .map((entry) { + final i = entry.key; + final f = entry.value; final servicio = servicioProv.servicios.where((s) => s.id == f.servicioId).firstOrNull; - return Card( - child: ListTile( - leading: CircleAvatar( - backgroundColor: Color(servicio?.color ?? 0xFF6200EE), - child: Text(servicio?.nombre.substring(0, 2).toUpperCase() ?? '??', - style: const TextStyle(color: Colors.white, fontSize: 12)), - ), - title: Text(servicio?.nombre ?? 'Desconocido'), - subtitle: Text('Ven: ${f.fechaVencimiento} $symbol${NumberFormat('#,##0.00').format(f.monto)}'), - trailing: TextButton( - onPressed: () => facturaProv.marcarPagada(f.id!), - child: const Text('Pagar'), + return TweenAnimationBuilder( + tween: Tween(begin: 0, end: 1), + duration: Duration(milliseconds: 350 + i * 80), + curve: Curves.easeOutCubic, + builder: (context, value, child) { + return Opacity( + opacity: value, + child: Transform.translate( + offset: Offset(0, 16 * (1 - value)), + child: child, + ), + ); + }, + child: Card( + child: ListTile( + leading: CircleAvatar( + backgroundColor: Color(servicio?.color ?? 0xFF6200EE), + child: Text(servicio?.nombre.substring(0, 2).toUpperCase() ?? '??', + style: const TextStyle(color: Colors.white, fontSize: 12)), + ), + title: Text(servicio?.nombre ?? 'Desconocido'), + subtitle: Text('Vence: ${f.fechaVencimiento}'), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text(CurrencyUtils.formatPrice(f.monto, moneda), + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.primary)), + const SizedBox(width: 4), + IconButton( + icon: Icon(Icons.check_circle_outline, color: Theme.of(context).colorScheme.primary), + onPressed: () => facturaProv.marcarPagada(f.id!), + tooltip: 'Pagar', + ), + ], + ), ), ), ); diff --git a/lib/screens/estadisticas_screen.dart b/lib/screens/estadisticas_screen.dart index 23c37e7..3465a5e 100644 --- a/lib/screens/estadisticas_screen.dart +++ b/lib/screens/estadisticas_screen.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:intl/intl.dart'; import 'package:fl_chart/fl_chart.dart'; import '../providers/factura_provider.dart'; import '../providers/configuracion_provider.dart'; +import '../utils/currency_utils.dart'; class EstadisticasScreen extends StatefulWidget { const EstadisticasScreen({super.key}); @@ -26,7 +26,6 @@ class _EstadisticasScreenState extends State { final facturaProv = context.watch(); final configProv = context.watch(); final moneda = configProv.config?.moneda ?? 'USD'; - final symbol = moneda == 'USD' ? '\$' : moneda == 'EUR' ? '€' : moneda == 'MXN' ? 'MX\$' : '\$'; return Scaffold( appBar: AppBar(title: const Text('Estadísticas')), @@ -48,19 +47,33 @@ class _EstadisticasScreenState extends State { children: [ Text('Resumen $_year', style: Theme.of(context).textTheme.titleLarge), const SizedBox(height: 8), - Card( - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Gasto mensual actual', style: Theme.of(context).textTheme.titleSmall), - Text('$symbol${NumberFormat('#,##0.00').format(totalMes)}', - style: Theme.of(context).textTheme.headlineMedium), - ], + Card( + child: Padding( + padding: const EdgeInsets.all(20), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(12), + ), + child: Icon(Icons.attach_money, color: Theme.of(context).colorScheme.primary, size: 28), + ), + const SizedBox(width: 16), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Gasto mensual actual', style: Theme.of(context).textTheme.titleSmall), + const SizedBox(height: 4), + Text(CurrencyUtils.formatPrice(totalMes, moneda), + style: Theme.of(context).textTheme.headlineMedium), + ], + ), + ], + ), + ), ), - ), - ), const SizedBox(height: 20), Text('Gasto mensual ($_year)', style: Theme.of(context).textTheme.titleMedium), const SizedBox(height: 8), @@ -86,7 +99,7 @@ class _EstadisticasScreenState extends State { ); }), titlesData: FlTitlesData( - leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: true, reservedSize: 40, getTitlesWidget: (v, _) => Text('$symbol${v.toInt()}', style: const TextStyle(fontSize: 10)))), + leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: true, reservedSize: 40, getTitlesWidget: (v, _) => Text('${CurrencyUtils.getSymbol(moneda)}${v.toInt()}', style: const TextStyle(fontSize: 10)))), bottomTitles: AxisTitles(sideTitles: SideTitles(showTitles: true, getTitlesWidget: (v, _) { const meses = ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D']; return Text(meses[v.toInt()], style: const TextStyle(fontSize: 10)); @@ -109,27 +122,43 @@ class _EstadisticasScreenState extends State { child: Padding( padding: const EdgeInsets.all(16), child: Column( - children: gastoPorServicio.entries.map((e) { + children: gastoPorServicio.entries.toList().asMap().entries.map((entry) { + final i = entry.key; + final e = entry.value; final total = gastoPorServicio.values.fold(0.0, (a, b) => a + b); final pct = total > 0 ? e.value / total * 100 : 0.0; - return Padding( - padding: const EdgeInsets.only(bottom: 8), - child: Row( - children: [ - SizedBox(width: 100, child: Text(e.key, style: const TextStyle(fontSize: 13))), - Expanded( - child: ClipRRect( - borderRadius: BorderRadius.circular(4), - child: LinearProgressIndicator( - value: pct / 100, - backgroundColor: Colors.grey[200], - minHeight: 12, + return TweenAnimationBuilder( + tween: Tween(begin: 0, end: 1), + duration: Duration(milliseconds: 300 + i * 80), + curve: Curves.easeOutCubic, + builder: (context, value, child) { + return Opacity( + opacity: value, + child: Transform.translate( + offset: Offset(0, 12 * (1 - value)), + child: child, + ), + ); + }, + child: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Row( + children: [ + SizedBox(width: 100, child: Text(e.key, style: const TextStyle(fontSize: 13))), + Expanded( + child: ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: pct / 100, + backgroundColor: Colors.grey[200], + minHeight: 12, + ), ), ), - ), - const SizedBox(width: 8), - SizedBox(width: 70, child: Text('$symbol${NumberFormat('#,##0.00').format(e.value)}', style: const TextStyle(fontSize: 12), textAlign: TextAlign.right)), - ], + const SizedBox(width: 8), + SizedBox(width: 70, child: Text(CurrencyUtils.formatPrice(e.value, moneda), style: const TextStyle(fontSize: 12), textAlign: TextAlign.right)), + ], + ), ), ); }).toList(), diff --git a/lib/screens/facturas_screen.dart b/lib/screens/facturas_screen.dart index aadace0..8e2f25e 100644 --- a/lib/screens/facturas_screen.dart +++ b/lib/screens/facturas_screen.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:intl/intl.dart'; import '../providers/factura_provider.dart'; import '../providers/servicio_provider.dart'; import '../providers/configuracion_provider.dart'; +import '../utils/currency_utils.dart'; class FacturasScreen extends StatefulWidget { const FacturasScreen({super.key}); @@ -28,7 +28,6 @@ class _FacturasScreenState extends State { final servicioProv = context.watch(); final configProv = context.watch(); final moneda = configProv.config?.moneda ?? 'USD'; - final symbol = moneda == 'USD' ? '\$' : moneda == 'EUR' ? '€' : moneda == 'MXN' ? 'MX\$' : '\$'; return Scaffold( appBar: AppBar(title: const Text('Facturas')), @@ -75,28 +74,44 @@ class _FacturasScreenState extends State { final f = facturaProv.facturas[i]; final servicio = servicioProv.servicios.where((s) => s.id == f.servicioId).firstOrNull; final vencida = f.estado == 'Pendiente' && DateTime.tryParse(f.fechaVencimiento)?.isBefore(DateTime.now()) == true; - return Card( - child: ListTile( - leading: CircleAvatar( - backgroundColor: Color(servicio?.color ?? 0xFF6200EE), - child: Text(servicio?.nombre.substring(0, 2).toUpperCase() ?? '??', - style: const TextStyle(color: Colors.white, fontSize: 12)), - ), - title: Text('${servicio?.nombre ?? 'Desconocido'} - $symbol${NumberFormat('#,##0.00').format(f.monto)}'), - subtitle: Text('Vence: ${f.fechaVencimiento}${f.estado == 'Pagada' ? ' Pagada: ${f.fechaPago ?? ''}' : ''}'), - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - if (f.estado == 'Pendiente') + return TweenAnimationBuilder( + tween: Tween(begin: 0, end: 1), + duration: Duration(milliseconds: 300 + i * 50), + curve: Curves.easeOutCubic, + builder: (context, value, child) { + return Opacity( + opacity: value, + child: Transform.translate( + offset: Offset(0, 16 * (1 - value)), + child: child, + ), + ); + }, + child: Card( + margin: const EdgeInsets.only(bottom: 8), + child: ListTile( + leading: CircleAvatar( + backgroundColor: Color(servicio?.color ?? 0xFF6200EE), + child: Text(servicio?.nombre.substring(0, 2).toUpperCase() ?? '??', + style: const TextStyle(color: Colors.white, fontSize: 12)), + ), + title: Text('${servicio?.nombre ?? 'Desconocido'} - ${CurrencyUtils.formatPrice(f.monto, moneda)}', + style: const TextStyle(fontWeight: FontWeight.w500)), + subtitle: Text('Vence: ${f.fechaVencimiento}${f.estado == 'Pagada' ? ' Pagada: ${f.fechaPago ?? ''}' : ''}'), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (f.estado == 'Pendiente') + IconButton( + icon: Icon(Icons.check_circle, color: vencida ? Colors.red : Colors.green), + onPressed: () => facturaProv.marcarPagada(f.id!), + ), IconButton( - icon: Icon(Icons.check_circle, color: vencida ? Colors.red : Colors.green), - onPressed: () => facturaProv.marcarPagada(f.id!), + icon: const Icon(Icons.delete_outline, color: Colors.red), + onPressed: () => facturaProv.eliminarFactura(f.id!), ), - IconButton( - icon: const Icon(Icons.delete_outline, color: Colors.red), - onPressed: () => facturaProv.eliminarFactura(f.id!), - ), - ], + ], + ), ), ), ); diff --git a/lib/screens/servicios_screen.dart b/lib/screens/servicios_screen.dart index 3ed5ff8..0dde152 100644 --- a/lib/screens/servicios_screen.dart +++ b/lib/screens/servicios_screen.dart @@ -32,35 +32,50 @@ class ServiciosScreen extends StatelessWidget { itemCount: provider.servicios.length, itemBuilder: (_, i) { final s = provider.servicios[i]; - return Card( - child: ListTile( - leading: CircleAvatar( - backgroundColor: Color(s.color), - child: Icon(_getIcon(s.icono), color: Colors.white), + return TweenAnimationBuilder( + tween: Tween(begin: 0, end: 1), + duration: Duration(milliseconds: 300 + i * 60), + curve: Curves.easeOutCubic, + builder: (context, value, child) { + return Opacity( + opacity: value, + child: Transform.translate( + offset: Offset(0, 20 * (1 - value)), + child: child, + ), + ); + }, + child: Card( + margin: const EdgeInsets.only(bottom: 8), + child: ListTile( + leading: CircleAvatar( + backgroundColor: Color(s.color), + child: Icon(_getIcon(s.icono), color: Colors.white), + ), + title: Text(s.nombre, style: const TextStyle(fontWeight: FontWeight.w500)), + subtitle: Text('Vence día ${s.diaVencimiento}'), + trailing: IconButton( + icon: const Icon(Icons.delete_outline, color: Colors.red), + onPressed: () async { + final ok = await showDialog( + context: context, + builder: (_) => AlertDialog( + title: const Text('Eliminar servicio'), + content: Text('¿Eliminar ${s.nombre}? Se eliminarán sus facturas.'), + actions: [ + TextButton(onPressed: () => Navigator.pop(context, false), child: const Text('Cancelar')), + TextButton(onPressed: () => Navigator.pop(context, true), child: const Text('Eliminar')), + ], + ), + ); + if (ok == true) provider.eliminarServicio(s.id!); + }, + ), + onTap: () => Navigator.push( + context, + MaterialPageRoute(builder: (_) => CrearServicioScreen(servicio: s)), + ).then((_) => provider.cargarServicios()), ), - title: Text(s.nombre), - subtitle: Text('Vence día ${s.diaVencimiento}'), - trailing: IconButton( - icon: const Icon(Icons.delete_outline, color: Colors.red), - onPressed: () async { - final ok = await showDialog( - context: context, - builder: (_) => AlertDialog( - title: const Text('Eliminar servicio'), - content: Text('¿Eliminar ${s.nombre}? Se eliminarán sus facturas.'), - actions: [ - TextButton(onPressed: () => Navigator.pop(context, false), child: const Text('Cancelar')), - TextButton(onPressed: () => Navigator.pop(context, true), child: const Text('Eliminar')), - ], - ), - ); - if (ok == true) provider.eliminarServicio(s.id!); - }, - ), - onTap: () => Navigator.push( - context, - MaterialPageRoute(builder: (_) => CrearServicioScreen(servicio: s)), - ).then((_) => provider.cargarServicios()), ), ); }, diff --git a/lib/screens/splash_screen.dart b/lib/screens/splash_screen.dart index dc99f94..e7dbb6f 100644 --- a/lib/screens/splash_screen.dart +++ b/lib/screens/splash_screen.dart @@ -11,10 +11,39 @@ class SplashScreen extends StatefulWidget { State createState() => _SplashScreenState(); } -class _SplashScreenState extends State { +class _SplashScreenState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _scaleAnim; + late Animation _fadeAnim; + late Animation _slideAnim; + @override void initState() { super.initState(); + _controller = AnimationController( + duration: const Duration(milliseconds: 800), + vsync: this, + ); + _scaleAnim = Tween(begin: 0.5, end: 1.0).animate( + CurvedAnimation(parent: _controller, curve: Curves.elasticOut), + ); + _fadeAnim = Tween(begin: 0, end: 1).animate( + CurvedAnimation( + parent: _controller, + curve: const Interval(0.3, 0.7, curve: Curves.easeIn), + ), + ); + _slideAnim = Tween( + begin: const Offset(0, 0.3), + end: Offset.zero, + ).animate( + CurvedAnimation( + parent: _controller, + curve: const Interval(0.4, 0.8, curve: Curves.easeOutCubic), + ), + ); + _controller.forward(); _init(); } @@ -22,6 +51,7 @@ class _SplashScreenState extends State { await NotificationService.instance.init(); await context.read().cargarConfiguracion(); await NotificationService.instance.scheduleRecordatorios(); + await Future.delayed(const Duration(milliseconds: 1200)); if (mounted) { Navigator.of(context).pushReplacement( MaterialPageRoute(builder: (_) => const DashboardScreen()), @@ -29,21 +59,75 @@ class _SplashScreenState extends State { } } + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; return Scaffold( - backgroundColor: Theme.of(context).colorScheme.primary, - body: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(Icons.home_rounded, size: 80, color: Theme.of(context).colorScheme.onPrimary), - const SizedBox(height: 16), - Text('HogarControl', - style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.onPrimary)), - const SizedBox(height: 24), - CircularProgressIndicator(color: Theme.of(context).colorScheme.onPrimary), - ], + body: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + colorScheme.primary, + colorScheme.primaryContainer, + ], + ), + ), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ScaleTransition( + scale: _scaleAnim, + child: Icon( + Icons.home_rounded, + size: 80, + color: colorScheme.onPrimary, + ), + ), + FadeTransition( + opacity: _fadeAnim, + child: SlideTransition( + position: _slideAnim, + child: Column( + children: [ + const SizedBox(height: 16), + Text( + 'Factura del Hogar', + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: colorScheme.onPrimary, + ), + ), + const SizedBox(height: 8), + Text( + 'Controla tus gastos del hogar', + style: TextStyle( + fontSize: 14, + color: colorScheme.onPrimary.withValues(alpha: 0.8), + ), + ), + ], + ), + ), + ), + const SizedBox(height: 48), + FadeTransition( + opacity: _fadeAnim, + child: CircularProgressIndicator( + color: colorScheme.onPrimary, + ), + ), + ], + ), ), ), ); diff --git a/lib/utils/currency_utils.dart b/lib/utils/currency_utils.dart new file mode 100644 index 0000000..224f4cb --- /dev/null +++ b/lib/utils/currency_utils.dart @@ -0,0 +1,76 @@ +import 'package:intl/intl.dart'; + +class CurrencyInfo { + final String code; + final String name; + final String symbol; + + const CurrencyInfo({ + required this.code, + required this.name, + required this.symbol, + }); +} + +class CurrencyUtils { + static const List allCurrencies = [ + CurrencyInfo(code: 'USD', name: 'US Dollar', symbol: r'$'), + CurrencyInfo(code: 'EUR', name: 'Euro', symbol: '€'), + CurrencyInfo(code: 'GBP', name: 'British Pound', symbol: '£'), + CurrencyInfo(code: 'JPY', name: 'Japanese Yen', symbol: '¥'), + CurrencyInfo(code: 'MXN', name: 'Mexican Peso', symbol: r'MX$'), + CurrencyInfo(code: 'COP', name: 'Colombian Peso', symbol: r'$'), + CurrencyInfo(code: 'ARS', name: 'Argentine Peso', symbol: r'$'), + CurrencyInfo(code: 'PEN', name: 'Peruvian Sol', symbol: 'S/'), + CurrencyInfo(code: 'CLP', name: 'Chilean Peso', symbol: r'$'), + CurrencyInfo(code: 'BRL', name: 'Brazilian Real', symbol: r'R$'), + CurrencyInfo(code: 'CAD', name: 'Canadian Dollar', symbol: r'CA$'), + CurrencyInfo(code: 'AUD', name: 'Australian Dollar', symbol: r'A$'), + CurrencyInfo(code: 'CHF', name: 'Swiss Franc', symbol: 'CHF'), + CurrencyInfo(code: 'CNY', name: 'Chinese Yuan', symbol: '¥'), + CurrencyInfo(code: 'INR', name: 'Indian Rupee', symbol: '₹'), + CurrencyInfo(code: 'KRW', name: 'South Korean Won', symbol: '₩'), + CurrencyInfo(code: 'SEK', name: 'Swedish Krona', symbol: 'kr'), + CurrencyInfo(code: 'NOK', name: 'Norwegian Krone', symbol: 'kr'), + CurrencyInfo(code: 'NZD', name: 'New Zealand Dollar', symbol: r'NZ$'), + CurrencyInfo(code: 'UYU', name: 'Uruguayan Peso', symbol: r'$U'), + CurrencyInfo(code: 'PYG', name: 'Paraguayan Guarani', symbol: '₲'), + CurrencyInfo(code: 'BOB', name: 'Bolivian Boliviano', symbol: 'Bs'), + CurrencyInfo(code: 'CRC', name: 'Costa Rican Colón', symbol: '₡'), + CurrencyInfo(code: 'DOP', name: 'Dominican Peso', symbol: r'RD$'), + CurrencyInfo(code: 'GTQ', name: 'Guatemalan Quetzal', symbol: 'Q'), + CurrencyInfo(code: 'HNL', name: 'Honduran Lempira', symbol: 'L'), + CurrencyInfo(code: 'NIO', name: 'Nicaraguan Córdoba', symbol: r'C$'), + CurrencyInfo(code: 'PAB', name: 'Panamanian Balboa', symbol: 'B/.'), + CurrencyInfo(code: 'VES', name: 'Venezuelan Bolívar', symbol: 'Bs.S'), + CurrencyInfo(code: 'SGD', name: 'Singapore Dollar', symbol: r'S$'), + CurrencyInfo(code: 'HKD', name: 'Hong Kong Dollar', symbol: r'HK$'), + CurrencyInfo(code: 'TRY', name: 'Turkish Lira', symbol: '₺'), + CurrencyInfo(code: 'TWD', name: 'Taiwan Dollar', symbol: r'NT$'), + CurrencyInfo(code: 'THB', name: 'Thai Baht', symbol: '฿'), + CurrencyInfo(code: 'ZAR', name: 'South African Rand', symbol: 'R'), + CurrencyInfo(code: 'ILS', name: 'Israeli Shekel', symbol: '₪'), + CurrencyInfo(code: 'DKK', name: 'Danish Krone', symbol: 'kr'), + CurrencyInfo(code: 'PLN', name: 'Polish Zloty', symbol: 'zł'), + ]; + + static const _zeroDecimal = {'JPY', 'KRW', 'CLP', 'PYG', 'COP'}; + + static String getSymbol(String code) { + final idx = allCurrencies.indexWhere((c) => c.code == code); + return idx >= 0 ? allCurrencies[idx].symbol : r'$'; + } + + static String getDisplayName(String code) { + final idx = allCurrencies.indexWhere((c) => c.code == code); + return idx >= 0 ? '${allCurrencies[idx].code} - ${allCurrencies[idx].name}' : code; + } + + static String formatPrice(double amount, String code) { + final symbol = getSymbol(code); + final fmt = _zeroDecimal.contains(code) + ? NumberFormat('#,##0') + : NumberFormat('#,##0.00'); + return '$symbol${fmt.format(amount)}'; + } +} diff --git a/lib/utils/transitions.dart b/lib/utils/transitions.dart new file mode 100644 index 0000000..da1edc6 --- /dev/null +++ b/lib/utils/transitions.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +class SmoothPageTransitionBuilder extends PageTransitionsBuilder { + const SmoothPageTransitionBuilder(); + + @override + Widget buildTransitions( + PageRoute route, + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + const begin = Offset(0.0, 0.04); + const end = Offset.zero; + const curve = Curves.easeInOutCubic; + final tween = Tween(begin: begin, end: end).chain( + CurveTween(curve: curve), + ); + final fadeTween = Tween(begin: 0.0, end: 1.0); + return SlideTransition( + position: animation.drive(tween), + child: FadeTransition( + opacity: animation.drive(fadeTween), + child: child, + ), + ); + } +} diff --git a/lib/widgets/stat_card.dart b/lib/widgets/stat_card.dart index 2939ff4..0aef58c 100644 --- a/lib/widgets/stat_card.dart +++ b/lib/widgets/stat_card.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; -class StatCard extends StatelessWidget { +class StatCard extends StatefulWidget { final String title; final String value; final IconData icon; final Color color; + final int delayMs; const StatCard({ super.key, @@ -12,26 +13,79 @@ class StatCard extends StatelessWidget { required this.value, required this.icon, required this.color, + this.delayMs = 0, }); + @override + State createState() => _StatCardState(); +} + +class _StatCardState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _fadeAnim; + late Animation _slideAnim; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(milliseconds: 400), + vsync: this, + ); + _fadeAnim = Tween(begin: 0, end: 1).animate( + CurvedAnimation(parent: _controller, curve: Curves.easeOut), + ); + _slideAnim = Tween( + begin: const Offset(0, 0.15), + end: Offset.zero, + ).animate( + CurvedAnimation(parent: _controller, curve: Curves.easeOutCubic), + ); + if (widget.delayMs > 0) { + Future.delayed(Duration(milliseconds: widget.delayMs), () { + if (mounted) _controller.forward(); + }); + } else { + _controller.forward(); + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return Card( - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( + final theme = Theme.of(context); + return FadeTransition( + opacity: _fadeAnim, + child: SlideTransition( + position: _slideAnim, + child: Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon(icon, color: color, size: 20), - const SizedBox(width: 8), - Text(title, style: Theme.of(context).textTheme.bodySmall), + Row( + children: [ + Icon(widget.icon, color: widget.color, size: 20), + const SizedBox(width: 8), + Text(widget.title, style: theme.textTheme.bodySmall), + ], + ), + const SizedBox(height: 8), + Text( + widget.value, + style: theme.textTheme.headlineSmall + ?.copyWith(fontWeight: FontWeight.bold), + ), ], ), - const SizedBox(height: 8), - Text(value, style: Theme.of(context).textTheme.headlineSmall?.copyWith(fontWeight: FontWeight.bold)), - ], + ), ), ), );