From 4ddef38c88a933dccbec73e73574c07e5e8461b7 Mon Sep 17 00:00:00 2001 From: sajaa45 Date: Tue, 29 Sep 2026 16:32:45 +0100 Subject: [PATCH] bugs fixed --- .../app/__pycache__/config.cpython-311.pyc | Bin 0 -> 12367 bytes .../app/__pycache__/database.cpython-311.pyc | Bin 0 -> 22454 bytes backend/app/__pycache__/main.cpython-311.pyc | Bin 0 -> 22652 bytes .../v1/__pycache__/auth_info.cpython-311.pyc | Bin 0 -> 10140 bytes .../v1/__pycache__/bootstrap.cpython-311.pyc | Bin 0 -> 27620 bytes .../api/v1/__pycache__/cities.cpython-311.pyc | Bin 0 -> 5755 bytes .../city_access_fast.cpython-311.pyc | Bin 0 -> 26470 bytes .../city_access_fixed.cpython-311.pyc | Bin 0 -> 21909 bytes .../company_settings.cpython-311.pyc | Bin 0 -> 14313 bytes .../v1/__pycache__/dashboard.cpython-311.pyc | Bin 0 -> 2379 bytes .../__pycache__/departments.cpython-311.pyc | Bin 0 -> 22836 bytes .../api/v1/__pycache__/health.cpython-311.pyc | Bin 0 -> 26191 bytes .../api/v1/__pycache__/login.cpython-311.pyc | Bin 0 -> 8674 bytes .../persistent_auth.cpython-311.pyc | Bin 0 -> 17004 bytes .../v1/__pycache__/profile.cpython-311.pyc | Bin 0 -> 24131 bytes .../users_lightning.cpython-311.pyc | Bin 0 -> 66125 bytes backend/app/api/v1/dashboard.py | 35 +++- .../async_processing.cpython-311.pyc | Bin 0 -> 21213 bytes .../app/core/__pycache__/auth.cpython-311.pyc | Bin 0 -> 29982 bytes .../circuit_breaker_fallback.cpython-311.pyc | Bin 0 -> 9833 bytes .../__pycache__/database_pool.cpython-311.pyc | Bin 0 -> 4523 bytes .../persistent_sessions.cpython-311.pyc | Bin 0 -> 26403 bytes .../__pycache__/redis_client.cpython-311.pyc | Bin 0 -> 11555 bytes .../supabase_connection_pool.cpython-311.pyc | Bin 0 -> 34857 bytes .../__pycache__/tenant_cache.cpython-311.pyc | Bin 0 -> 5097 bytes .../tenant_context.cpython-311.pyc | Bin 0 -> 2326 bytes .../tenant_resolver.cpython-311.pyc | Bin 0 -> 3525 bytes .../token_encryption.cpython-311.pyc | Bin 0 -> 12619 bytes backend/app/core/database_pool.py | 80 ++++---- .../models/__pycache__/auth.cpython-311.pyc | Bin 0 -> 1479 bytes .../__pycache__/profile.cpython-311.pyc | Bin 0 -> 5815 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 486 bytes .../__pycache__/middleware.cpython-311.pyc | Bin 0 -> 2691 bytes .../__pycache__/performance.cpython-311.pyc | Bin 0 -> 16802 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 1588 bytes .../__pycache__/reservations.cpython-311.pyc | Bin 0 -> 5944 bytes backend/app/services/cache.py | 21 +- backend/app/services/reservations.py | 186 +++++++++--------- backend/requirements.txt | 2 +- frontend/src/components/Dashboard.tsx | 41 ++-- frontend/src/components/RevenueSummary.tsx | 62 +++--- frontend/src/lib/secureApi.ts | 20 +- frontend/src/utils/StorageHealthChecker.ts | 9 +- frontend/src/utils/localStorageManager.ts | 20 +- 44 files changed, 267 insertions(+), 209 deletions(-) create mode 100644 backend/app/__pycache__/config.cpython-311.pyc create mode 100644 backend/app/__pycache__/database.cpython-311.pyc create mode 100644 backend/app/__pycache__/main.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/auth_info.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/bootstrap.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/cities.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/city_access_fast.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/city_access_fixed.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/company_settings.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/dashboard.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/departments.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/health.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/login.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/persistent_auth.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/profile.cpython-311.pyc create mode 100644 backend/app/api/v1/__pycache__/users_lightning.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/async_processing.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/auth.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/circuit_breaker_fallback.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/database_pool.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/persistent_sessions.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/redis_client.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/supabase_connection_pool.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/tenant_cache.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/tenant_context.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/tenant_resolver.cpython-311.pyc create mode 100644 backend/app/core/__pycache__/token_encryption.cpython-311.pyc create mode 100644 backend/app/models/__pycache__/auth.cpython-311.pyc create mode 100644 backend/app/models/__pycache__/profile.cpython-311.pyc create mode 100644 backend/app/monitoring/__pycache__/__init__.cpython-311.pyc create mode 100644 backend/app/monitoring/__pycache__/middleware.cpython-311.pyc create mode 100644 backend/app/monitoring/__pycache__/performance.cpython-311.pyc create mode 100644 backend/app/services/__pycache__/cache.cpython-311.pyc create mode 100644 backend/app/services/__pycache__/reservations.cpython-311.pyc diff --git a/backend/app/__pycache__/config.cpython-311.pyc b/backend/app/__pycache__/config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70c91b796f7b168d0f528d5dceac5821aa782b6f GIT binary patch literal 12367 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 J2K2*Y`X9f43B>>a literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/database.cpython-311.pyc b/backend/app/__pycache__/database.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8965b241e0aeb8717fbd27021cff7a3504237671 GIT binary patch literal 22454 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 DEalq6 literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/main.cpython-311.pyc b/backend/app/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed8a5dcafea406f06781c8600dd9604df4155e58 GIT binary patch literal 22652 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Óopco($6{GmYT%LDyv~>n|O+bRcWBUpaC0rOPi} zpUPMpWh)fYSm?WSV2LTqQBANsmh6rz7p}f~`PCZ@Qf;3aGWLGi-Vc=U0|wU{j@KMn zcg^)zuD^2IDfN%%gKr|^n~;4I_weY^QS~MKUkm3~7=alSBKTO0ySo4K{%heIjW-%^ zrKS4OO#P@_Kl)+arTrQ9fXp6{*aJ%dbmH;}sm!0Tw#nAEoW%=n=L^0Zh4-A#;5c>%Nx0&(upyJuu-*)A+ZK>z>% literal 0 HcmV?d00001 diff --git a/backend/app/api/v1/__pycache__/auth_info.cpython-311.pyc b/backend/app/api/v1/__pycache__/auth_info.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13330cc9198a33cbb0621814e2ee9efe5eb60459 GIT binary patch literal 10140 zcmbtaYit`=cD^%wKSfETEQ*pm*3*<_%S!BcBP-4-mJ~l_n{wB`0n>x;*#JeVqF~=R0TgJBP!H;2FLDPm{0s5c)6tQg}>jiKl- z7!{;qbdZkeg1VSKsE-+f1`4q>tD7>$OhHr395j=6{gfqU4O&UsFlCF`gLaZOPB~)E zpcB%FHBD6ot4Qn$x*#@BRmW#fySIaeU?s3{%C_<&wxSn-h*9U!EU8b>ET$W&~ zv|OQ2nlowh#wpgt8Q5yh4%}+48$N;dpA~ron_kGfR?FuFyzwkl-tKk0n_1H+@_W9) zz4;A_W#IV1Kw?JZc*QixO>=QpP#gzNo;*HuCBjXM(L`J^3SwBC5foE^yEwxM;x{_n zlvdo~8Sy+97o(A|$c1>dP_g3NP$V2V&-p3Ed6J8V<6?jl5>uBr9&)M&%387S2qe=i z%uI*J!U8wq*D3lVQ9)GngVBhn=mz4mNkb3jspv60c<$>SmaeF! zUsnY(SX~Nf4`jx$Q9bQpNK+|l(pab`&=Y7BvHI(%Ja-UPw4qb9TJwK3S3|`tHlC}o zqE_MR7lue;)|8_E4|CO}bfvjYQ+TeeNOYB0w;{eetru%bIT<39O7CilHK)+85o<~5 ze~muYYe!6>2^68vAl91JU)95ElK3)p8C}txL6<4NE!p=rCo=e8bqWm2O^10g1_zx9 z3qo`vj*|j&IVzqnFJn0|9Gwz&C@yj!OReBOm0sYW@@^QS=9J>oQVYMQ%|Jea(WTHi zE8cguOzixMzGZ`pOY!wk=~I0F=p8#1eN^OP0zSG7^SrSqJUzYki}qaVCD$etjgKdG zOwT^I_D{jRiX>vw`;uEHI5AW?&K>pO;b>)E`^S=N&gVfCwOL@6C>xN@d>h~WveDI<4}qR!aS$@m=V8?cVJc~ z$hj1aaEd_;k48e(X(MOtmvZgkYXv5R#S=S3z-av~c_@P=pVuum!})pWyEr z%Ig~pHQyPL!z0@pAKF_U*juF5-C6rzOLD3i51f;F*bP5=6ozFg8? zLj1Oukh7K>)TFI2E|9p^k9FFyP#XE2(!T*3c#Z-9WV>!o8^jW>LX-IFlZQsB3P_~o znKo|RPQ-U~?SXMs71G+)+PAbRWqcpt<)Nj0ADJS3g65PFP1K>Po@ST95N2n(S~G&prP5N0?Mzi~GbO~rOSlroT9ioTbMF1MY~7tM z?M(t%K2+*M94@6N+X`uR+nsK0tM{nNmGEy5{|FRvfEa8{WQON4y2g4P@OG5NHl;Y* z%}jHAEDDf25f{3dNK}k+5QpO|BNC&Mi6r78cSYP`wPJvF@_bZazmCh0cH#{oZ`Z~K)S$e8Dc||UPL@KygVvfjD-k4FoF3QPI2Js2|k)6T`MSQdJ8xK z_ir!`82JY4tYpi;J0}k?fTa4E{kS8H#!EdA2%fBE5^-jYH^ju+j}$f*$C%$=!0+iP z*uKA{zTcuQLr@!9k~egdddw6*+H;*oVi8jyu!dN$ggyZtpB4G=+X0~!aZ#Gm)ThA3 zR8fB#I8@ZpZB%ER9!2qfkO)q7T$sXL>Pge(*eFwm)JpYOeff+)IvG+lNQiaTCrAjC zrmxZ4;O5vynpUV8#f*Clfwe`N2zX23HeOThB`2}`O5@&+`&_&5ssT#O)1u|6t$qM_ z2{|Co){H9J=m=4(P3?>4s;?!}n@QXiv%Y@W*Dv`7SM>ifaX&1b2uWcsJ3KBAk4wXGX)-SP z;*vWK)(SL!1}2;vn^w?oIbC(tedN6Dls2Ecum92n5e}ng)kN0yuIzeOS{H~Bq{FNr z^|-cazE8l=E7gZZi!^u)YOu%PQySaT5!II$CNYm!)=%@`#zhJ>z2-n5TgGE2MAH8Q`&9A} zoPp{>FA%VK5xvP;BDuZ&3)G@z>BOC%NcPttLa{`J5MH)R+{vVII57iCBUxY8r|QI5YaHlj{Y zN6sRD7;+R(S*K+f0QXi9EYB_d6I`6TGR?0!v%W{B6l!c z7gJKt;DgPBYF;@dtD)$5F3gf^^9{aa$r?C%AazT_>tm8eH7~iP>~NITD06ltJ^QYQj-@PWhADhl}!@2*dIkt^icv*S zJOd^C8<^|^lB_Oh5=K=dz>`wU+?5D%946~a!y)R0+$SuvL8{o)4+Eh{f&~|y>Hzh( zD|U>SW37A_DcoO)w^iW^}7p;W^~#~&U- z#oNrE#f8|@z_(-4fk`JOTQR|AtfHIZ;))LNpkf523m{Q3u-w?pgsKkl0aEnXL&~4S zO|WFj6 znYaL5T1gbb%fe%9tvCwGoXk*hmAfd(oQvD2?kbr$+4-8%6)Ji&%kHwE*uwby!q&~i zMLvLsg=IMZ4iKRh2=g;g;+p5jsz�s2TVawCTZ(zXB2Wte~$Ok-17X`5u}!KQL|1 zShA)r+0?Z({=l?LGVOX?*YsiHVV(a$oqwrk`IT(lKDln+oGoXoduZG8z_umh&)T|W zTX!BAEZcJK%^4~~XXp=)%?+)3nZ@QM!#~*n*8ZvUjx+1sBYXEe^bS1m4rIOiW$*r# z{VRbLNF10ul&kW79F(d$Az-C#yKR#if41Vj*8q_kvaYb~3QMl=s=Ik1DY?7y^eAQE zsl487Y0jhdtVn zvc99T@2F(1f4pO_w6!v1&Fynd3-(-Nw^Uad=4^RmL1E?whU9@0(!goyozp~(KEb;7 zTTJF`-&v8*FE{k9?7Fu{I(=3?9hMr#vJGQ$!h>+U|8hgu_`@O=Rs8vVB6b zPvni89RccVcjJG08YJJYCpyaW+P4VEe|vnlPc0nEdOBrK=OfRi+kpjJ=1kVpBYS!Z zuP3vfF4@!d$kTZH^sml*cqZ>a)vfs&w7FMq-YqrnU9Oq8eO=he;BQBleA)Kha{F$n zF$m%QtQu!sXJyw}$#phY3wuaapQTpa4Idr8eOO}7sEY3XUWl`=o|ZumLLPG_>ki89 zpyUq1+&44xwp?Rp9$BhK0r+7$KbY$tUT#|!|Ij6M598qWf9-27R~7d!z+1LCC0@uDcN|#M`-yCQK&}r+^?_$=)6XN+bb!vBRb!P(qo?K3bLBaI6feW;EHy|! zL1=~=qQ6z6@;Yi7%Bv6JVxW*yq|a7s8!`9|5C~kL_%_*Z+oh)C_fG(UkaeAqT_>b< zp@4e>827>?Yd3w^ne%u*4Cd+^7acioOU~D^TGz0!YjLmSgO3i`y6tk^cF4>%b>$kj z=4-7kfR!q-Sf71YkL+F;kHJ|YIkRK!GX>mR_*hY(#V-}zOVyI68^T?2&Ym^*%jSN` z+`sDd{hd+XdQ>_!Ejce{ofl>2Mag`T3>dyv@OZ$&Ac(auYW8nE+K>Kq?@-ebFZ!~c zf|oD7)}vP4m#s}l4Z5$80dl@F7$D~>YcEdsyN^}r{@vAg%&Pkjs{zu7RfU?du}0$JVgcRtBFjRq$P>Y5dO>;4`Ev{d!RVTwv7}ziAMw z_Q&we0Rz&t=LO#`^yEvbA*I{MmM#BgA(naSO13#`yklDD52Dh#tGbfi>o+G`--a)) zWy?dLPM8spq>^@Lx19WG~J6e9NC<*@q`MV zrH#Il{uVeFP<6|&M8e&+%&sN+}40R96}1Y>!=xx&q7FAkMZ7%dk3CZ%gL4)$fW116=I_Dc;tD%X=ix zK?o~hHO`t3$>u|n`4HS#5RIU0bG5rckXBhihE{fh{?re$FOZ#B z%y}0&m+F?xlBG9m>6I(y;KOtffu1v|Tgi^^H``k}i)Rx~so?a=CR` zSl;^kcjcXfB(IX}L$vvWhW8rghO$(ROx0lh-?1`a KOKY;pX8#Z7rKY?9 literal 0 HcmV?d00001 diff --git a/backend/app/api/v1/__pycache__/bootstrap.cpython-311.pyc b/backend/app/api/v1/__pycache__/bootstrap.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb24193335d24a892649a785369605ab5225b4ac GIT binary patch literal 27620 zcmd6QX>c3YnP4~0#zg|WNl+wsillhxJ}A)=Pl*yG(Ih2Xlw}BHLlk5Xpt?aFFlcKN z&xBT~W@wM5%t@pQlXVh0@l;q_GrQW_nOcpL%qmlvOt-eZ#`Z>KZS8tz{AY?@$F(m1 z*xK)V-2l1)&}Nd^*=;_&epkQyeeb*8;}2XeI|a}9qknhBa)zS*8+uYtf$I45mXV^~ zqF8E@VrkY8re_V4hFRmJan>|xqA|=EHqTlnEwk21>ntu#XH50#ytpa}w+eyCgLTGi?SGl>^ zg4SR&PqwNhU`j@t@{)6>`+%M5sb10!BC*NJHd7NtP zivLIZU?djg=C}|a><9<11;f6nXf(#hxWJq*7-8q4p-9YkDa!dm5k3|GcVKP~+@V+~ z5Dvuyu~0P9X&(#5=D7&(3xvbINN_sH^8xOrFBXiz2kpMOAU7N0c}Usr3q)AoY?Pf3 z2YqZH7J!_50UsZV%s>DaygDD`W1aTl*|~6VHW-OPjx#eHWEZ*?^i2n*FGE67nMg3e zb);$p3Fe{^KIn^uW`lgE{bL-0R-p*Z0TEok(V-pjjgEyvwb6E3M zlgykZu0U8e4TPp+vavUEQ#Or+_*kn!W}uEi%vH9b%?87b$K!A zymV>cd)tOFc8p;iu&SK0r!TdJ#?-kP-`gL>Sse>%))!d;U%s|v(>zQX*`ll^*$v}5 z7l_>S^TAjQ#+jELnbpO^WFbonLiyPM7xP~W1+SxLeu@uH4GYPHLZ-yaFg2K|27?)NMCfZOT!U!4zx)flVa&qk;He$EPQm5l%;I0jvXet#em ziN**x;33`up_~n@cc@RnroO1|0=S|6LS5H(bfuw8=iE)si^z{vCF$wjLZA)MkG&@U_v9BnvyQhQp25df~gFQXez^m)62V8jQ0*K=@V|4 zLqXBfu4UuW{yP!DR1HQnRVUpgOXJH8OV8ge5KJ{-L}G)3Yfm*-w&LjeLoC1-0xZ#K z;RrOHP9qGE8kZu1olnca0Z#+|A=2>aG>QbtF?~&j$4(WZl&6^Qe!Met#AoeSV^O)_Z~>l4L{xu7S`LhbWU*i z(3pIrs9J-_`fYthlPZ-Oz>GO7m9}o_WUM7Y=@Fb2b2?Jv z&?7Vp=7jkQu3z%Z(KFP7C6+?lA#4TPp7XF)G9#H-aV9EZ(bp1YtnGeQ&1ouO;hHv) zzdd1L9jx>BGzclodxO3N$j!J!bFCZntxKPJgT5`uN|nEF3lqkyzRjP`&3dxZZDtIt z32W9EFtO51&$30YLB9=9`jOMud%>prqIeTu*mYk3+3}TSICNi>ZsH4P!p2(?cHWe5 z@P>qw8&5C;)P;rxSHiO5$h0uyV#^XPwmh>v5WTD`df^qeIoxV=pFrK5X)2%h}Jx7BvA8rjA1f2(jd^$YOBA!i92p^&l+61yW zz|MvuGTnyAsft#}mH+JtKDzzR+TC{!>6O*n#rmV*K?`?D9JX+0eONrsuRf@)x#4GqCgDnB$&_Z_U@S zorl8F=|Gr&rZb)JG8Dw)7WfbFcZ(9XvS`L9R_WE&cby-!9Ddw#_@PT|IVH86QX`cl z#LnHxai1ccG6arvr&MQmN@_=pI-s*Ou$(n2JEhtkTUf+s%u08-r|0=t6h;NGUhZ0G zI>;fa4ZCtMz@8#|J~s#f+8*JKLBOW_;tGC^d8&O;%L!ltQ!DgJ>)TFYd*5SUpWu7p z;nhbKKYdv^`@-X+FJJ<_`Dg7Cr)CQCq&v71Q2&3D-gpUn1LvXI8?844Ff*4|>sE)~ zZGX`Dxb2wGHudP)M>l?PUU*^Z@yRKS*PDOV&Twlw!yk)A!~et`62=aBF5MyP6xG>l zP;4POw;EWpy&D#u8GYP2Ds)~E&YTsV^Gjzg3hb4~XRc@yZ{#MO#q~o0vLVEhfs9*v zSvJV}zNp&(45#sW-xthKFb0Gi>x)p8wWWKJeM#v!gmdn&g9lw zAUk^pP7a^)51#BD9vSBl^OMc7z*IOWTlgU0!7tiN{^-##mpG>NWe$<_R! ztMK;Nl5KgP=xUH$4IjEnZa??>xjX099h9wf-A$D@NM&1vvX0fAi;j<&fXKM&;egbr(ZmPx)JpHyuKC;Cth%Ua@J9)U*dYXrA{g4$(a&xu*p8RC>J6-se{i zinU!*ZI@62bLZ?M7=L_=%ySa+oWMMnEUXfks?VP|O4ccZxhP{jfjQ&6?G#FnKR5~& zn1@%Dx5%83m=gkXB3bBJv}OK2hiBaknZTQ`fi>{0W9DOZ)T284aJli(wz}aW9R&>tK2Wfn#DJN2dQ|5{%nk0jlfoI~q_UM1|~h#7byDfe&N!}k0=oXPpO z=wV0JJj_2^omr{!&(_=?&Y#Z3W(h$zHDfJoA#xNlJ&oL`Y_13Nu^VxB-F(eYFMDEX zaV>?j-D7HvGX34y z{v7h)tHA;ixo%uBYjrDiE63j6mJU!5cps$V#=we~s3K0D;MHn(afl4YE3&#s71(t9 z03SwbTxP;M6&^Kr4!veJI5j^*uyAey0=P41oy92UY~bcp(60zjIiydx=h1o*Ek9Z~ zdfa)iTCFNaBh9s!9h!#AF4dzV+sGS`fpMdVm{d$#E>P>L`gvUGDmtv-!G&4<$-N9I z7U0MK*E9-@XkpXJInmuExw~!+C#~*3J|VN(Go%0G#Y+4G5E}!J`edwyZ z{le=n-gz;D9J?r686d~C?NZHlp=R$|-=bq_NMyVM<4xf}b%+BgR=RTg)_R4~ePBdp zzr^epnElBbU*=QzI&D%|P#t1J_9AnaQsZ1qUR!0y@;TA9RdQ|3U*!rwgq>c=Q446K zZCA3hN9ycb1gyMGbZ!%z+W-^o+LiKuuC&8w?gH#lwbJc4^uQyO9s(mWJrdI+Fg;J( zIv0U3Xcn2Rg5HpZSRo5+h|^_mRJ*x4!e3&YB(U)c1yM0 zLdiUu(Q~Tf!et@ENf&sBz4=9)lEYD61xL=`LD6T8-Ep>!7*k=ZRVy9H) z|D>~b?_d-4vnKnH*Z8xp`k^x8UzeG|{nxd9yM~LYpBLMY+l)WoQh(fJ{2P-Q+&UFM>YbO ze|}^mfca4>7qn3~RvQpp1#Dqfy3NcZ3m|`KGK>53P4tky|21FdjD-7s7D0xh$V_R_ z&mL_*!aFYzf;2?aZn>2$VNUSvHd;pkA9cCjm2EcV48362jh#lI zomtatWx`BEfOfFG8|Ixej=4lZ!VZ1ZO~n3t6DGD=5pHk>b_<3jm}@j=227So5RIpV z8C@B`0kK|v$fjY`!8^aywbPMlUB<=M5aOmb!Q>MhCKw`+M08tyfFW>Z!J*67or=@G zSzp4Dk0G#$FY96rnVb??5DN2T3*W8RLl7F6GDO5_TX4Jr*gs3&85TopL;N%nL&%xk z3Yvt32^<3YLc>z$eKTBieh!%DQ#XN3AreX->h7_=Xv7C9bs?Q}l?5}_1fUdt5W z+Q%(J(Rt8oyM15Kt?{Z+E{eQ#y?nUa7h-!fY5AVGRS~52$SxK%Xl^1GJ{I6#;*Mio%x6&Q z9IwM}x52sxk=E2>oSZ1wgr7HIl35%cKfkphBvu7YmY(Es~>towC~YB`eyb3LrEr zu6@K>G9{~OzTNW8mX!mmQ)1N);N34-lf_jZ6gNFCZd#cYi+4-KyO9~b?`cibx1-;T zuFgIf6Kjr0HAj|?Cd+F;>`)51Hh)mj@wlR6bw;e%D^=_jD)xS!=4rohe|)7z+_GKT zvRx>70nPZN;t-h&5_3UdE+ie5D8Crb$SELznyZ_)^KzD_Tj6V|hY!)l05= z9i`)4FQJ?@q`Qo^F+*CO68T=S(6mo#IwaQhNOe6zMMN>8Gb%Zwf-{;dYmq>BGqrkk zbxJDR0rhi@f%FmWCBqYU8Oj3IDQe5JhSjkjpZ($4wV`)jeD_5qM6n<4{11EI+xw{T zuMYk6kTzVn;Q!#l^y3TD0vi!8M5PNLs=#~{TS&a}zkqzF`wjn7c|q`i;iLhC9}Dy; zlz!k#`-S3$c+VI{gAE}W+d}Q{25KrbY07LPbh2ilRMoj;g<+{~{`NE9d}g(6ZA$bWkh}+$m}EJSz_jP!%JCnZ`tGT<17c&3)YwCU zlD@Vd6nwW}^`_`MAo&gmwcSg{K7xL7zUdUUTz{|?EHIBQD{sLc`oKT?*gq>oVxoUu z^3N;bqWgyAz9G18K=Hnob;|C+Dx$4UPh05-{nT5(5`FC5BY5{DoA)mt1;5aCMDU_X zK66B<-nq6<#UehdplpQ- z(R+6Js3NElo|(vz*fa@DQ;Nz5iH#A(HejV`+gvI?9ku&U``74qhTa_#N_T^K5Lyf)3S0rd)>Ux2xYvA61FD8Jw`x?C8F>pih0!4#ZP{-Qk zI0%k+ArDg1I<0}Y1+tdmH5pb8?d08m* zEl(|)o;nHv0^3f|OCu`-tDd(3a%}^XBptgl0Uan7AD4=cF9L)qUUa0ma`|M<{SSdF z*AM1Pfs$6n{92!(&q}>#wfA)!-}BV;?J>UBMWcI<8EoC`M9wteq-Rn8)ksr!nH zOD?tnyAC9x`gOi3jdYY;>i{hQni>$PO00`gZ33W~md<9vKnBkc!q-M5Z#g=?D(JMM z#2R{&yfvWH5${IOsgjdya1O{kJf!9e06jDlQO>IoX`3carA#_i&Dcx~XeVVnNDg#D zMRl_jXUpaVU*Ck(iZ0|IflDj%QUGHMf(fj>LWt2Q>_jHAW@xI(eIqV#-t@(8W8#W7(vLe z44gD8WSF9Q45bkG4?1IVL8eIPU|ufD_|tl21fb%2BP3NeEv5N@`wk>(#J;HmD+Nlc zR8mTER)65Ef9$Lm8up0Jy^?e9hp3~qbUG#T*g!?gM%gOYos`=r6@pkIMR`0``u)&| zbm&>=aj|ktsvHAyt8hyu4WUlb#jf;-&K;6-hf=C40?VRJQfgsPrgy!7a@R|R%|c=O zDu~tEzYG+gepoJ)o(A&>L|^z8nNf)u6`0X{cw!19S0jKe&78=|?b(+DB+cPJ^fQT=EO^=-EL|Jh#JS01(=Q$1*8=1ng3l7aqzDCI$M1(kt>D4gK`4g@S3NPNYZN}MBL$q(1F zp}!`tR8FWB1m&h-+h$-RYl721dX{@$oeO>Y@(V@uX^=H}C5>!yRa)N$@HDH93&zOq z99^QV3uf)|U%R4l_p2n*WV+Vm25zxRyXahp?oH04*TRO3;6=_kBgXc4>0_>ULE?yBr(U4%+4TE!%|(G3vAVcEwPcTz#&f z<_>uhHnx&AhhWxz9dr_3Ho`d*FayL>TA0h$ z#!&8(8l^1pB0vjYo>QeRF1(47>fmglm95tbdh^2g2B555IrLOfqKK>6L@AAlqI|hV zhBonSQ}()zY}0*(2P1MGwmGW@v!QNDo*vUc4(-?APD5rDW^UDnB|L1)J#(U9gPo=| zlqKTbFlAd#O4o*Iw`B{C6NL$P!Wiq#bj6jrlv@vdR_asX+P6Lp+s<~}GbXHT=Wo2@ zZn$@|paXl)w3+>%?Yd`QC{7gXu?n&e|C3=73nht?*ifbiULyM+w{;V9YkQ&u*4z&5 z*WlloJEJ0-SsO}jyYeVw6tm7ADwd6T6f2lV>z=>?*lz7ewhg9lu+iMDk-od81DKup zZl^)1DIr8t*U03%*aovFWef#DLluaPZsP0kodg0i)DaHc1VJV$RiZ$&Wn>4+T|1E6 zZAX<`^eCLvR`s*d00(#Ez$H6M>FQA|HFA7@s$^&6$&28#al*Hb}$gpz|9r1o~T!ir!!b)pQS{{=*I3uqkxYZ`v(2dG5~IVYbsgQd`oA-skR zt|-G>8-VIE5V!fB4KC-h+ymx%tMycznE-D25Zt>Hw>IqDzk6_ZKRAYlh7JrKP#gn8 zds}TlzN+`Opwu07e4{f_|2!9#Ei8;CoTheOhO?}|o0*P=qnzx5>zF`^0Ho%`i$|!T zBQgO_)MWr#Sc!IA3c#V*XaqAP0}027iRLd7C7cf}B*qo19bJem%f)Q)QUGSLRs%ZT zmc9|h56dCL9?FyU4lF;u4{}m?Ax|r+o;G$SeT~VQ`eb8AvZ*t`x-Dp7G%4h&tqK*b~INzbw6RxB|dD^0pWqf5@G-+{< z<#7fmZ6V@cg~R1hfQKKH3Y06O_>Zw}9|HjnVjXlL;EY#mXXj}8zAHrmT+#ftD2FrS zK5f$6)9Nrw5x3HD0+A-ih4tw_f~87RxCNM-+T8?XD_FCf2j*}V&sC36;RCFI=v4w9W^nCU`RHHqt`(lWDo*!*`IYA zOzg~YfWO2!@Jsmk7PU@MHPa}(PTMQJ4+{Ra;Zfl4f`1bfCN2p6fOu+3IyEI8pO%hK ze{ekX_;^S>{*rY3C1F1?(ZpvI)oU2QTm}t81`wqW8jhnV9bXW5!Z3lavxetUqCRLi zhaz))fv*?tLIfYa;JaSKMf?t5ByLKHo5IiM==5tjp!cgjMOd{>JL$$U9jMh4f{g;S zm;h$()+Rm`)d~wcxL_FW7h-e2i??Ncg&Hr)t#7yrP(KQ9x*|IThh!O??jOam%Nzi{ zh~9f>>A_dryrXk_=XMxuB84PZvB8Ov**V#IEy&@$a-hu=jRZl?h8c6nyjD)7Aablg zz&dmx=EpUlgA7;lR4vDNV%#|mbyhMgaaqE>j<5!Zk4J#Kd9dM7<5Griq(gu z>cdMmIMY#BfkJ@pjD@O1BezF{%Kd8~E!Yo6bRLkL2ZS6$&Mz3@V{qU(;+o~~y(s9( zxDQC~1JFiy>8;_X4#?kS-oAY9Pg{g7JHe#SU-YiNAaxuTN_xSFOrON`2~1zIq+-$b z1nykBDV4P@I^YC&RZY@c`^4Aqy@|Kaedqk!=hwQ$rk;l-V&kCb8@}nTX^<@^z21lNO)fB1^0kq6d~#Wz}~DF$Ppl}`2t3R z4Y6p$iTuJ_gYYujzcKQ)k@r1KNv7mZAy^UvN2oy(o-D4FidzI`=c0Ady2>UQ&nGr> zk>%GESf5a4vlU!sE3^(QH^q3?sSp%9x>8R2!skBREwo43N1VHWrD6|2> zl(u}7O+A#|B9yj>rEOAao5*aFm~8@sr-0H`TM54%6+L?;&tB2APcrQjO#2`ji?pPR ze7|)2TBTTeP|_T^f>T%P7LZ2~ffKQwD)ocne&Z5hluE1bo?00cO8Opv7E>RZf^2i^ zD5PuZTD`t@_1*Yif=1V%)Ho;1z54LD}Q8K+Km|jd;5%D#1bXsq5cz3^t@0p2}X3Dmz?JXVm?aU z*lgIZ0cPzqX3s;VLBt@{!PldP);_)(7Vqula`vdoe|K!BI6RT}v_3j5I(R)ZN?~%%T1XD@UTK<03 zj>py=f^`Q%L(+j)g`Isu`BgCQpM}0d2N;pzB!&}+Ne}qA&;?*~TrnauAu$sIGXd++ zR<`sK9BTZ?Q7t$+z$`B)Z^6{TSHRx1(pTBnO}*D`@84$piD^rJv+*a*W^l*78EI)( zC~^(1;)N|R*grWVfjl-m3p-~{#%6;H6OAP}uFT3==L+#XS zqB!n#D>oOzD_PVBY6TnlkKm^~D8kih(UDrYQ?Vc@G4@c4R=6SA^qQ`=`L*rz;yH1aIKxhUQfD^K}BC}(Av zcWwG{`5LXQ%?c8$Igh?waLt{jhc@}eSC6b+KQeHuI$r+eya&3Et*!v7rxBLaaC#nV z*mz_{canHw^>Q;R4-Qd0GRM1p{dkcr++3%w10V>L81h9573}cUBk@t+?b8$#jf8Ld zRMmo%W)CSc`%{HcrvDgkyC#VhG9Pn?lNUM-%h0;eQ=FbIQ;P+!6f;jv==XiQV;R~wRUwr#06Qn5znFA9{~I? z7A~n$RIcJ>+H5mJH9@W|oCgLP&vX9?YTN2k2)13|Rw%T;M%OvC(v%lDo6qqOCY#{S zTVA2R5Rl2{=`dVI-pVKx5#~t99@(ulAamiYT!3G~-BO^pG8?@Xl#O_M?nV3n=~^Ba zk~&$BDAbBOyW6?{0ck#gzThXp`drmQs!kCpPp!@+%hz7L_3B3@bt~;}cY#`bNsm<0 zvuFeIf9j)pVogVw|J^zCX-@Wi1|J!~D5-U$i zl_x=osTc_y8#!lDv)GTdDPD3dxzd~E;WfaBV7ojlGDjrlh(HY1rRjFfV$D;6S}!tB z3(GN^XXz(JwX6NY{?kIys8}>A6^#nc(T^B6?$IJsAu$zD*C#oC^+b8Q$aF|dhro0^ zE%&Yj1xGs?Q@b)T%QTxTS?3)%&v@OkORJLJg#pRkQBma?AT_Qi^+9&ryIEJq0;JaL ziCUccXGNpFicpxP!GKpzeu-2V}pRzUV_6#kJxltUKCe}S*KU!nB` zE!=1tU_yh`@{hC!n-w9slMWj-drZa7B_^>B;@` zgtf&XYhSkF6@{1#dq_52;el^xg`58_heJ~!po((APW+D!9O|c$|NKA>RVtdP4x)z0 zD+v(ml$p7kEc|zi&@_iAlX{sxUOvfl9thx27nys6Q5HC1ivNSc2GX<jo2T0_qDaCq?fS zs688*B-Ji_l}S=9LOzqE3T~0VB;~k8{xptsREI$6Op@{mdXrm+Bvm8mO_FLA@|koU zp4y5QD_{5C@!ql|ZB>iq66}KeMO&j}YrJK_dk#w$_b(5uObL!w(a|b7T5mD1{gKfA zm2rKjcZ)!kC(*80x0u|(NJ?3^oa;_I4M*8>t!3LM82al>RE2@=S>6R#n9x0|``7y4 zh2w7Ed@xR4*%o7<>sI-5x2%-dT8KGfVFBQuQf;pz6UoR8UJE|IE8ZoVJaw{ zyQKKIYr^%Hg~Y4CmgqAKB0Fq>9z@2(4SEP)Jbe@bQ@Ltfuh2(mx_kvHitp8lwT3l* ztpyJ$qCby4U^qo9^}_d>X>I&L;{*OLTGw8bwhydR7?{VtXefrn0O{cMpyUDjaMvT_ z!~K5|kq(?BVcAw&wNeJWpoobF4G;JSEq|sI0b%Qu-a14Xm~T{lt!i;ZXzjjLCDI2a z`ry;%j+Ggqvrla9mzw*NRkiEpuz~Jer_fFoHLM%a@wB*H8?MBDVx$a*Ad7Va`QimL z=I{NQS8%n7^frm!mX$Z$9ck{Q;dV-}NY3zn>L|zrk{Haj9X?(+VA_kcT4}-ADAG+5 f-K5WS-B?Zo$OVh!nDUSi%&8f^SU2c`30VF=RV=um literal 0 HcmV?d00001 diff --git a/backend/app/api/v1/__pycache__/cities.cpython-311.pyc b/backend/app/api/v1/__pycache__/cities.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c42bebe90744e652943726dc6911b209847638c GIT binary patch literal 5755 zcmdT|YfKwg7QW;0WBdeTi~$oE2NG}-UfGaGq1k2&*+PIO&`knuV!56napYI8$4Nu& zs%j%GiICPHq#irftJo*Q8ZXphFR0xHs zc`B@#*M#YLnj&MGkT$HF*M;@-`mkZ%0An<#4KZQkyiw`vLZ+~J-W;~fTPUPKJoN!+ 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 BmI43( literal 0 HcmV?d00001 diff --git a/backend/app/api/v1/__pycache__/city_access_fixed.cpython-311.pyc b/backend/app/api/v1/__pycache__/city_access_fixed.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dde9c6f2b279735f43ae40efd8d801486b4c0090 GIT binary patch literal 21909 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 a6zn8jC6``AEr{K~avUmH%5%tR+5Z6~Ngz-F literal 0 HcmV?d00001 diff --git a/backend/app/api/v1/__pycache__/health.cpython-311.pyc b/backend/app/api/v1/__pycache__/health.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7701eabba3c17e1a7476a0c27d85b69f03691c5b GIT binary patch literal 26191 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 E0i2ljy#N3J literal 0 HcmV?d00001 diff --git a/backend/app/api/v1/__pycache__/users_lightning.cpython-311.pyc b/backend/app/api/v1/__pycache__/users_lightning.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00e0cc7336830e0be47e751cf6078849818a78ac GIT binary patch literal 66125 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 str: + """The tenant always comes from the authenticated user, never a default.""" + tenant_id = getattr(current_user, "tenant_id", None) + if not tenant_id: + raise HTTPException(status_code=403, detail="No tenant associated with this user") + return tenant_id + + +@router.get("/dashboard/properties") +async def get_dashboard_properties( + current_user: dict = Depends(get_current_user) +) -> List[Dict[str, Any]]: + tenant_id = _require_tenant(current_user) + return await get_tenant_properties(tenant_id) + + @router.get("/dashboard/summary") async def get_dashboard_summary( property_id: str, current_user: dict = Depends(get_current_user) ) -> Dict[str, Any]: - - tenant_id = getattr(current_user, "tenant_id", "default_tenant") or "default_tenant" - + + tenant_id = _require_tenant(current_user) + revenue_data = await get_revenue_summary(property_id, tenant_id) - - total_revenue_float = float(revenue_data['total']) - + if revenue_data is None: + raise HTTPException(status_code=404, detail="Property not found") + return { "property_id": revenue_data['property_id'], - "total_revenue": total_revenue_float, + # Exact decimal string, already rounded to cents; never a float + "total_revenue": revenue_data['total'], "currency": revenue_data['currency'], "reservations_count": revenue_data['count'] } diff --git a/backend/app/core/__pycache__/async_processing.cpython-311.pyc b/backend/app/core/__pycache__/async_processing.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efee6a45e515219d5a8fe8a25ecf7d0ee73b8a31 GIT binary patch literal 21213 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 literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/circuit_breaker_fallback.cpython-311.pyc b/backend/app/core/__pycache__/circuit_breaker_fallback.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bea6b3dfee180edae255321c9b8ed08e198410ba GIT binary patch literal 9833 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 IO6Z#W4`ZHv)&Kwi literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/database_pool.cpython-311.pyc b/backend/app/core/__pycache__/database_pool.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30fdd5b98e7a31d3205359722403dfb1bd37537b GIT binary patch literal 4523 zcmb_fYitzP6~6P@_j;GLSqFP<20ySjfC&nvl!qgN3u<{ZiW^#1G?QiLt{E~rv$->l z?X9V-LMpei)HFhZs)@ueHxaEwrM7?i3+Rvj+(oN08p#rBg;f46GLa(GA3b+wXLgrY zh}1jxp1F^6&z*bjIp00=`*=KpAobk&+xb0E`!{WPiEmccuR-Msl99})C`aF{%9Pj~ zTjFwDiO=zjJ0|1=nUi@nPzvUP3}O)$&WAihYYd=(nky)KmNf|*>Al_M}SAv4n`8+|}WPi8s0yFhT>#8Tc^ z&qjSWN5H9O^w8E&(be;<S;0Kw)g(F*>D z16KeF2W6cA0mU#==qImVU>4CeXg{46na-_~jLa?~lS*i&Cpl#9BX*NFh$>Jkund|; zE4vqgX8Fn+hjr~kOiVE^mestXiDlg|X9zYvQ1|WJDZcaeaZ%AsT{O>O(b;NwMwE#H zQ^cZ9N)uV`@y6DaZA})KT8X#1X*23Ip+TbXAt$q}9Wl&2F^xIJJZEz%*0L<2=WGYc z1Q(TggKAO~9}n)#m&;Bm=mhVS^Je~R-oR2>*VT#gg5BLbA%6h$O_DG-48`~XkR^04 zb*zC{;SGl@2drqY(y7L)y z8f*bB37zFY| zCE1105pabtWs?jLV#iAPc}WMHE2{dO4PXWXfJ#ys5Z#VBO@a#x1r^&oE}YZhy5P?$ znrsIOYThs;JBjDZ3QW*7si2oiia9$DYyIofk3`Q$p87uOMD8Bs*(_!LY^BBQ?7-*9 zJG(086&1_-#B7|<10@vd2{jZ4{RlN$JLaiFqNuo$4pO5f6bbBrs?W?|V)Ket)a~$h z=L@(@CEEffL??j9{gjQtO(=H#J>q``uJn4lc?&c&(HiK5dB%Ui^!@`6z;85Bk8Y+g z+ik^C%SWv4-pl(MXj6FmOAss3T~7?d=}ukLqe8iIKiwmCwp$&vQ_6{JQG#L)MS|BFVxu@33dFPvoT z2P^n(`0!rtuZOn3In3S~VxWF&IC6MMxV2;3;Q`_HD+2V~9uT1C_7F$wdm~e9@b3Zx zwBsV6m!WeJdC4;h zrbh3iMr*0DdTOj1dq%eU2A8K+j#88EJ?`qL-S`JPS&taiI8~6LmQC_p+4% zPfISFrkfCt`X~wbm_;m85o})9^l$tA5Uh(8OFx5745T+UvKmemWm;M4J-Nf*n#BeP!T2G8tL!*u|Pi8|j_R;bsEJ=1ml1jQftI~Q*l0KNt ztL_NN(9ff5kX@8eu8gb_GIk3(w(21h3~3cVW6_0g9h!2*QEcuiH>@ea!R+5&Gs{)iK-mr#6wO(^xu#w+j%w z{RlxI$Iy%ZWx}?X3>etT&=f9XO~zVbL4^Msu!yJ3ll}q*<+ILjhI@SU(BRK5*tDv4 zukNBY1y)^{DsCWc94cEGyn@gXjfEb+z2NOsz2_; zF=RJz5gIz#oM93-3UVClJ9L1a3Hdf9)W@7y=5gqN>$H>P5cJVo!}uo9Koxc5d*Qz2-g>z2>fTy-q#hnw3N!)&lejt!?#d*txi6>QMv|{F;J8nd mhqUieYoN%WXz%j&Urww{ECm}p&!n%a;P4C>%yWpd@BaY`>lr!# literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/persistent_sessions.cpython-311.pyc b/backend/app/core/__pycache__/persistent_sessions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c15122c8546a929a747c5b78952ba2f953d7f871 GIT binary patch literal 26403 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 ZnSW>gCbz*j9kHbbkbBIdPDEzrzW~Bwd(8j< literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/supabase_connection_pool.cpython-311.pyc b/backend/app/core/__pycache__/supabase_connection_pool.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c497ad551e5187f6627a9157c369773bad35b800 GIT binary patch literal 34857 zcmeHwdvqMHk0yNd;OLA>7!;tc}e3k2UH!KWS+NRhN8f|SMA=9g3o9C5F;PBJK2b4JfoD(5J6<_a zHByCpU#xh%dZK2e#wOXNxZ_N%QQ3IiTd3tb_~*w+yCiFojPa>X7 zj!m9Qd`y`3wk;DJ#Y;~{qG!X2xcu^1G#;gz8i$xdlL&c3ic6R}5=|RS89O@H8FR#4 zqxP8d73YXszjxujDCUn9#a%H^+%xKod0%mjc;mj9?-eO$h>8(foEPekxiMrVncDqw zBpM%`9^Vr`B}dRB=q=uy)Cpe*$J0~Mv)R$)Ee<75N0QmWF`5^WzQ2;mOEE+|n2)B3Wa4ar1_h6y!#ds9|Ts zvvqo5G;FDs!|~*_JQ<3FM4z&^gvNk@@+d|M*jH1a>PM+AtXJN)%T#f>5kT)DnJ8e! z#Y##w7s$;Ayq_hgr+k$Fm!-Rb&KthDJ=(w%YT!vN@TB5-Qf@$urMc8pQ*&peSp?)C zGd3&jr7=xa4ULaQ5~0y4ImDYe5l^0;ioI=h#Z+nM5!glK@*d;Y#na$2GV}c zHYQny6KUTO`Ppzb=MU%ML%S`5Syf;-kcJPXgAZjV-Y<6nB&c}INj{(s`CK&BSRlVX zoQQ6vOf;f2nC-I@bI;D5xGBFspzVHM4II+~#}v;oKBNLGk(k~>|MzxrotA#-(s`comi18l4V5>z?8(as1W zQ%wbO>8+-C>M$LLf995gowG@;bDJ92t_8L$p6&mb4PJXBIVFRi{X%W7D^PpA9M)`k zHPzqL=%NIFORA+nPQBfF5+XXLruW=v(|UHOft^}lr{dYknl4u%4M;zTArY@|IO7Y4 zF&xvNX5oxK9DZp!GOouIg~PF_XgDm_Ay3AUNXmR_w&PJI9FggT84nmW20eLEUPEE) z0p6DQ%ZT>KMAsQ8$4x>7xGeq_?RJ-EQ6k{6xz;X90=Vt2r);whihIgd0DA1M4j$b> zv1Wj%5te1dHd{`SBeokcek}k!lDm|u@fgKDcF%#wSDxnqM$`~1ZOCSdG=eD8kd3#N z8XCpFI1Dy-{}6(5xqI9RzU}}ocY(W0;O;KKqL>@d6DtDr#yo&NaCd2>I93WiZX5BF zz&cVAE5VEl$VBT>eT+$S5-KY)7ch zNHayzsqyKF$%L5`$vcstARpq@<^^p=q6A?CD&5h?YI&_o^|Yn~hmQ*~yU?&$ePt>pAMR4L9XDeuE;ER}om z(Us$QseSU}1en|*un-|Ry%i(T3c>t{*^P1Sb_^fQxMLVtqb51TRX%_$kLV?ymAcYY z5qi0C2r)rM2$sN>io9%-eWyrFFj6C)SIrzER;bdfxry04c1Vu)QHNE8vT?+93}=c) z$HvjTM8+O}soT!5H{*s-9G{H6&8J_+&9OM+dO0#a9k;WU1^UW^YB`?=4o5-teW?%x^Z-F@a6`kcS!Z@ z(mcBq&#qq%^J$K{#>XbctcdT5PEAiHEy(p8wWyGgz+1%1I7p4sXJ@;P_?@a}Wwws{ zEJRWuToW=fLSi2UX*7?cfpn~*Q*taW^BJm>z$3_*abh_ewf6ssN7t4WM0pb=*b^=3 zy%C#zkxx}?jiYAtA*x4}zW))x7f@yMQsjy>3JuLGo|t`4&Vtd3WO7B)gzPa#%o%gV z+_9qTPHVa&k~!V0(iuV7W=;7~5&b|4r|F(15j(7lqTF|Mdr}>`Of42j#-fuiBTmOd zjQd!6f@(lA2@`04)Ap2PqXCp&D7j>tvAt@~4&lqvv(g(joAg?#;B0IJyB!&O|C)^B zZ2TgZNU6k7=rR+;Kk;rm6`zb>I43`rTEFxxx)6^}C*%Fw#;2l@@x){OBGU-UN~{8S z_&3tuV0@L*!#Hp3zLK~a)2cd^Kqn6|Lq-q5S{Yq>5_vfp>v~QeOIn1{WPIWrBvg59 z{9}{As@MDT?#HOoe`4ZxbCzd=B8@WeF<*f56;_%KB&UsFohq0E-W6#fKLqw>NOR zyft0BJKYdU*B?taw=8;H?WKznz&*)T5qLlVk0pVh1*Kpp?GI}HmIeRDdH=?n&hG_o zRcKF)sQ%-c|M)$JJ?MKN0YE_X`q+pKzir#sT`H3_BX1xuNMIv@O$3PZGua|%U}YlF zGPOn~Vj)iu*g~Lz0F$vvI%4ABTHGXl2jH^!OFK6z&W(#shpTyZ{i1|RF7Vl16(q>& z0P^!M@aUw(0{9=9m%YPN>O!yN1Ku2JNfiI$Fet@+S_J0{(M&1k)D>j92o2%5NbW)M z)G8(%Th`r6i^gK99W~xbl^|M1GyeV>fJe*6GmfR?V^K82`fg{=+MdhC^j0kJ`C^v~ z$AuI&XpIn!iFz5LaUvo(X7*rKY|IK$j%4Cs zat`HY$JeEA5HA#+_H)R%J=Ok5GESofDhaJElo;V|mwXm)VLc>MUFB?F=1OxkGYWEk z>N1^fOd(BzW)Epan$1&K*>vP)Qrqziu5^CtnD(hptNw`Qj})HGo~5TUbq$}-g(fRu zCPU9tRF|h%U5x3Pc5YCd8)&kwosH5wT{}0xF1f(xq*;^?_$;DVMDZ^ULpHe21(-sL zW-KhR6vfSc3>R4Q4e)smCPq81cWh9s=qDU)Tcq|}wG0W9Jhk->t*oisxN z@h?zbQf}pAb`e4Y_%EQrf*A>GZW3eiMVM~)aH@me0j>U6l&P>nOES>DL*sEWaDdH) z#-~o5g2tctXyjA`kZwYw@$=xOWSdCze@vY&#{sasBy2VWb7w?8mB_fyo~NrtF3eOW z#!gK_VI4j{mOPE+bRuycvS6yO0M}z3Q!x2w@U8^m!e!|;kiBwyx~3sry)Rwg2+r05 z`~d)G3l@X31&i_Mm4pLKucM)AUASX9hw;WOWWI&cQ{eQ0*`! zkK66S3-bZTUn;LK{Nd5SVX>|t`=>|b)&k?DtNR2l z|2pbv!eukXrD;pVf{+H#~AfDgmshF+d}-E$j(sq z2e`4WJ7;W36LMR{1Q}|MN%xFRcFfpL*(PnIILYc7bHo!-$|K6FND|uW2gDPR$GWbZ z#7Y=%qFS>fMjB6-c*2B(7D)~w;3$?dzOe)}XGt=1XPo0OD$6u_8OL~hQa(m^Ua^?T z*LpF|R-3yH5@g^Fc0Ak(HF`NAMQMF;6*04^g7{0pa>Yn%8lug4oD{i`Px^L}* zgy+58xpuDYz3zW^RPEfQb?#CspZLuq*D9{pe&xm2U%dL_EgRDK(zT7alwQFfXOyBB z@SaB!7ol0qr7D@?a2SiWNHQtIl-f|BIU@EtwTMQ6+2VAy=OcLw&BNT;!o)uUuTyb_ zd5goqfsoPVUp*To#$lID%nhx^+-0RfEy!FKqBL8LgYbjR-j%q?72T}X03pc1 zl2>H7LzD^pH~bw88^D)QAYbQD`PO9)nozLaVs89PWJ!>y2p&~UDD6+TtR*E_lfq6u zvSenk&>|XH)|wY_lS7M4#>~QtoLs9lGvJH9dJA_s7T;cB@jcIm4GfPoCfs2ncRaeC zneyEjBS?-+FR72M{1w!co7uifcOd`^Pj5j$s&T3QVlRA~@^k{w5@+S?z?<6^S~twM zZkRixwhn2nL+@|7mDCQ#)xfA07*#x@`ILcL$@;AqHzan<;+lWt_7H@VR-}^K2!sGE zHE&12(luwI$hRqD2LV!T3}=^m791s6h}G^SZhrAmov~Xv52@F|AE-ojyye8m;-4Rw zm$p<--pJA-l{vx`7}qj=T#?2ys??b>8`V{~vxq9plA5YtYFM!l{tjj71E4_-%~rhG zu+Xx0zGdxP-}_Z+%i~(hhV__u{*COZDzy&RELGfJRLu;1h1kopML_>Q9SAJx@ zQ&^*04`I=PM#@vur%s31I*_|)B%n-;!qw|kJO&YzAuQ=evZ^{=gF%6*hNap>1^zBl zBxtR6Sz3gxzT&kREf7*Xps9AQR`4yF^xZ`Ki!jlzJXInbnrrm#enL&Sf_PC}`SA)3M{#X;&L;~`Gci6ZM< zn2*mFsjfuZ4eb&!+EnXOEi`fXKct-8QgSy?bv60=%fQuKD7{PE8!iJa6xw2P7-(5EqS`2`%@ozPh}W;8&|JX# zms%dhzc^?h>A1fK;86k#Ukn2peg%H`6xiTdKt2V`Ul5)J#lW)?nS`sWH%0~C`0_maPw$s!m2xEo(6&}S;89};AnC?tdahI0 znNPW>6(j@S*9or0L~Iy@!8vyz4b(%kxX8NzEYo!-0#bE_D$2bLeoPtoEKPUzv-(`y zq9K*d$`W&`TTylKYao%=by5Kk_ows#+ zQ)~8e8!Hnl7*P$8Lw=N&l%ax@e?KZ9?<7E45Sbfawh|J|1g@aa>BZPe z_7nS-&@c?6zePDG05V0VBMFjkIDsIEIa3au!z6i@!ttJ}5hiQ=Hz}r+KN|~O{?e~g zSzn-N@7@d1INJx1ag(MVM(a_8zs=c0#*KV%`OkPosTo^5hf7eMQuVv@7i)%1>CcfM z;RLQjjCBUQEACX*zJ7e6vTMGwORenDDtoT%Bk{J1OvmNl=$!4i(V^C@)#~8yh=94% z@3(2Yjw*w6!t@N4&qBk#`G$S(C$;_0DaT&Wj-6E-#ULw>?6WtXyVddIRm$Lr-;Lhv_}(gYaGy4~Pr-TogxdIm*7(Ar%dyM00y+}F zdy=E9`~d+x1Nfwhx+_mVyd9{44B|y11Kjqn`0{}-9#CqB=aSmS{kY=1wU%F1|3S@v zQ1Ks3`^z5USacy9u8e+sZdd279_fP~-|l9|2Lm0u>l`1}xo~e;ozwJXq~j!Rz945T+#T84l}`cHODzh_FQqm#|7IcUh!ahV}Hu44hT8+)S4xPX=8O@mZX_@ z5k<|!K}3ek)Av^b{HFa4n1){k@qnyid(-wM+pCVSNJ{VHaZNzac=iWEK2$D72G%8L&k|^UtZ=J<4|w;2|n= zx2y&#$@B}}p! zmM2kix4+Me?P=cf}SpmzqE6|;@rRJbh<(}TFKlR z$_2R&55g0I`9$Q#TD>D6@mDN*%3PRo0(5v>pcDCkF9oP}7M!FxM8_}c9q|V8q_&#H zebQ(M`b_J7?DAnmF;ST0ccKKgF(GPZzC`)ioPG>9zlg*?2M%8nYDu4A(TPGG38Bt3cwKN2)1gA&dBLNYz0+ASr zotv4Ak)rtZc<(njJAvXRJ9>RpkB$Pr$s?47UdRV(|o%Kk@+9A+s)*&n?X z(}p9s(itDq;xDNUveqCM6gSeLHZ8RNmlG!r&K=b@Jg(Fp#CdCoUseAh&3{PoA1WwL z3~d|QA$@;`Z`Xk118>K!)s7EVyKp}&C#d_j5Fm{)XH!JmWCH&a|9Sp3dllziBIxVp zApYQT6I(-Y$p!u(k>z~A-$SKG@h=WzzT77YomI(v3NGKYm2<=ycfm&F*oIgI9-?R_$7jltQ_0A_7X>1W zi}aST%IsnxoaHTD-~z$we^Y<*OjVsWquj09h3sjVz_pw&W?0*+qLPrqwgJ4 zns=zpJGAB<^wMd?iR%uPLELccr3zcH*NFf+?*BGG7JE7FLRBcdYqA#5xQDhXy@m8d z%lHAsViDnW+y_gj2e#2-dWIbC#l4@lC&S)}?Z~iq(l(|5vwa4Uz6@zfk!A(%%i|UC z%29i*Q7Fmr0mN0suot185C z2X0!}7Ca@x64wi5rtZ=;7VYKy!n%){6>s73H1p~I{_ijzpA_|$%S`v5+0COwmG;GU4_I;!-pbxsVu3#Tmuh_c8Sib1&+ylc^1vRDkacu{U~ zM(&Bkqm}Upv_d@0&$joEMaD6Xu{@Jr9fpxidi={2R;nQc{tlwz zzmJq~!D;T)nx7)|XT$C4X03WFIUU>%b!nmf6xfIz1?|0WK7F%I+cK=Q9aP&6YHbIR z#+UBs!lfj=WgDeidAqIiU+jHzFE6OF;q?>bofxRjOsi1=LhO2hzdxwsIRqT)K(D489ND42odd> z^&6#`ueopfJcPf`IIyY6@#_%RUmH)>XH%mzQEzMg5F-d`VFG$a5KQ!vAeY&)b9*Vb z{47y5lVwY(g3$f~rCQ0c$hZu=axbrE3S%5$FLdO+;)SFmZ-tIrutM041v|*50#0(B zcpiR0CvMAGOnOpHPe4fE#D%HFvlN{P6vL@iA^|yr8-ylLv}S@w%5Mr!$bW`f9i8q6 z{HyD~wscnddWlZnLadnS^_1lsuZ8w;Z93GK*)&U*vnAABBmXsWvIS_yIW~!JaHx3B zxMXtb$T%j(CZTDueCI~~kCfpV0)I>(Lm&;1ah#h@GF7|$7ZgUawoK-&OtD@7BiMl) zGA`exBqbIyF8>$GOX4J373(U=jBQN*GKI|nSQp7~#}r+XYB9Pzhqh;v>>%p?8UWvF zcc(a@6+`!E^OmRmE3jU6R(e;E%KND=KBd&0em|z|8^M*Is((!Lk175!knO7aZ>+y2 z&kks<8`b(vTKy)qavJh;W4?t3UEZN0f?VcVhkZHLrthqY~o)vhC2*AX&|w%_jP(>gZa zY+KlJV1CO1b;~fgm)dbq>o`c!t#?9gY)h}`g|R;^zjgG-FQ`u(*Pb}8)Qs^{^`FuF zXB6Xncz0>b!QopkDYb`js{SLI|A^v0QfPhu&-OO#T_yd|D&M{u#~*EI+E?!QsN98n zGSARAaV!EiEmnw=+lN$lP*@X7G0amqyX zxjg7k7#|v%md7)-;z|F;Q&^sY1V<*S)yQJ{nuq+~@SJKliq1h*>y$fA=o&(L^7v}F z?XSRQLk9crxg4~+5C8@oeRrXyi--|AK>zMv274>O@_)s=UpH%I$zy?ngr>j@!I(tn zoy7~#7weNImRr~e3sWxIVPU^w6#)@JusSd;OSDmtU~La+>;IXc5i%fs9-Eqs+z@VBjTkm!LOihc0ZI@;kUo}Qf-qrv zXSNh;J4iG;BTAh$^-VTMu3so>B{0XlDz=u4a>W{M#`sWzVB8mMXR@ofq7-l_YR|6g zmVpJH<@F5d#;tv2lO}7D#A)>-<~8>ogc4t_82mY#7b8l4Ipd6w>_|U%Q0WKE_zgYmrNYF#?x~o2I=eqHGA3Eut9HP0Vku0WhQ_7eg>3ets#X%+`^I zjSx@mR`C>=@zZ6^FgwxlOSBXd7;#37iX~L^WeV-OTotSQ4xX3aOYWVex5baFr$3J$lQ5pE*rQb@EA2g`#>K=2xwbd zwxsM`Zkci;QnqK~vv;{E%`}@h$`NX5mLqgzb7t>;ei>9wD_Sc5<^Lbgf0XfT_=k<> z`Coc8&r1f~?hd4$*dNEI@N_{kL|Yx$8ZxVihBN%s1dI|tHvHHlN9G?rJZdUaBw;=_OEw}jv^C9Fd{PXE3u-qw{WF)x6-kER-P z>qY8Bq>RuvL_(=bN}iyPsL&^1Nhvvv8q$Ud{Y$gLl%(5cvB>R||B@>F#{~Y0z<(z2 zEd70pC^zEaN6<6jW?Ljvy*_)h@%B1$YKzfX@}BJcr$4+;E~z$k$q0MPPhV(R61 zrYa0I>GXI^D2I8ULziplhIxSe-;oPDpGi_;i{^|En-%3G)BmysbjA~#=HF+`c)49~ z>Rck>MtX9K&>bT(J~UTXAuqYE&L%kt!98&cbf2%Qp`pZwQHt9aC7<_s+wDO4YZqVr z%xj;yc2sM`cNn+PHx^FJ2Tmw~6L*7EZzEylQlclsv)gv zNC{@obg=5G8zuLzXG`VunzeN8yNwcxzgny`U`_p;7JN<#K6j_A5^hE?hadaO@z;-E z@hv*Hde<&G{Uv8@x0^e(=GAk~_k6!s`a7lSnw{F3owwS4+)EW`eokwCPN~g3ue!hD zet5gQPAl(3dr*cM-l=cCz6H)YWfZ(zc)Pmp+Q9YgYIV0(-F;(^*1L1QdZ$voGu_g@ z&@wRJGN85$YAu7;+}MJAy=0-LcfO|g#j~-#z}lzTGJV&hR(&Z+?L&AZGEup7B9bV9-We$43~H*xgXN#P?8$v zY3V81#GEDD7J^;#!LA!sYH*DfT%!cnkSfNn1XpXp)pKjr-~hk9Th(`C^e2P+)T;ej z)qW+IJ%M#=*D-9*gYAaHA5W+lO5L;U~{Y1KjZk6@Rzp@4oSj>hI^b_}0j4 z2NZt~^fWgjs(&@VMd|SA4D`-9wKWIl0|%AB!E_%(?w;H02H)%c&Z_rT(aTp8s{6m{ zR~lcsc~sjzf-67OpsWRDB`DuDyfwGXLFcjsr|RFT`L`^p|IKzh7(A6!?l;by8Y_*JGG718?@T3 zH!t2=``t@w?bFJk=hfQhl@oEbCcfy9Fy{_v6@$#5lxF){rJT-mMU7U`wNSBozGC&9 zTdmlrRcur$HX``-14_kutz!M$OKQa?ev9s?s97lQpD*vf@v>SzsFe?rlj_=ZUDHBc z|9l;V)(vWPgG$Ac=bgHy>pkD>|5`r=y>5+Gw??U0@?303FDyy`53gYB(EpWPvh4m~ zok1?V=fDp>2yNP3Cw*9Bf5InySl6(>#qr_bZs-0I*GF4d;NgcQzWvqSA67f)zRpJX z_3XZhGW;-PqwtoYE31OF&uVtJAKva@ z{L11V>_9E(|2|cR`x2hP9Y64KMP|5KmYi(bY#C=R2r|C52uNx`D#l$h`HuZoo3>-k{}s90n|NS*F$)^@C>9QCLH;j8^2VrLCpNr4`3r*wG ziPYpKYZDoom~6|%cULTaa{5%BrAU`}p}W^**8(OZ`G2FRREJTy+?l7>Owa#ansS2x zx?t<9@OIw`RKlaZQ3-V5ENs<*yE>nqf%QsYJ!5}hTVPmVZeU|3yU>*czv9rBh}zuxmk|5y8wa7C}Sf)eJRLJHWZ`ZsC*O^R`H zDaGOKCYu2VVt>cxxrkD`8K>&sqWQNd{w;S_ROv6PQde|oE4mc_vQBW1hl@pc0kIKU zhP<+C3F@GGFY@fAFdiXWF zx$3pE-L6#cF8ExY!nS&>@yR$!>uue;#k4Bcz0;1$=kccDRMq3m(NQF1AK%2(ar5=6 zD={9ApMzfvbA;q(Rqo!F<7@o3{u2>%DAlrK@$V3@^u*BJEcI%tG%>z~493K8dABaw zoh4guS2eyqF}q8x>ZFgC1`C|9Z!T2z%~$oQRjakC)eyc5o>+5{X|`l*76<{Du(feB zPBpki3vN;JPKJaIWF}AY6E<^1WFgfneFIUF9v-$RY4*OC^vJw3R$sG_8|%Rc~R{2xiBll>>`(gi!y%g z$%=%FgoJHNQD^2Kr@uOrkAj;C1vhgP+^tr1X;ocHu)xVsaKn7n2DNIVR)tku;nP4t z81`)?90(NLI5(s;Zp5huH)+95O5SOp;AR~KH_Iicum#(Qr8Cj%Zy^L3M9)I&}?_8(u3(hxlePEW%I6WO$8vQXueF!x}_He8lA}tN2x$T#fWX70(Q$ zUK4{rS|<2AEM7;{5+P(I=}SWTfpB4dwbqhK$*G6K>`^t7;~fXjw##IEnHBz9#yjY0 z?H8C_Oz$o1yq12KVh2Arh))aI^$kK0PtRNe->LcsC2r^iU2SNbn=BIeY8b)L7y5e!nHhf+-xp#wMmGvMT*l9jl36TP9;<746kr$IcYpAK_hGW$t>3 zIaHIro$J+^4*Y#QX3FRTa$$XMNSLY&pR>pX=7h#o>i?B;W%cTROOM$#0b6mCs@t># zDB^qnuzdu^0ou`O<~x}HT4V{RG_kgDa!U8S$=JdsUo%2mrW7~!3l@V2rn;BnPI;2o zPmw(F35b;;B{h1t-tJrb?yp23vC1QZ3AlCpw>31ked(lLc`|R zvLTxi+JFtRxZx0A8ux3Po;3$S1MvDbt$f|0Bb)3FsgpO(w`^2fHft@LmEcZn&=!U8 z-1i*LlF|ooTf;Zb0e)60HLsj)nLVntZ@&4A+Wwf@v_os!aphn-&^G%k^MOG%Fqq~l zZ-3c2RA;#`-MdwJ?17yL!o}B zy7$IQ^VMsV>NP^KK8a6>C~cGcRBNWRnkl7bYOyxATkf%rda&&7T7JhaCnX6W%Xzg! zf*ceWeE2gchil0zl0*)o#ThT#{GScANIL$ZxNYDNMRz=8k4r_lmt;mh$qnY zAQ3-uSSsoHM7rgy62Y+7p1_+fIl#8<@M-|VH#19vke%XXpy?(zOKR zbzO3O*2PPwI}_t|)9;6nJvD!IW3|b1BX{v`w#bRmawxSTKaa)0tuJ{5Qyj+6bNw+Y z%G6mI7k-#yA|aE0m>Gb%YKxhSna+!`PR1Xz?D7kg_#FbH0J>2(Q=+e_^u0TNV;>UR zq4;Ga%=o$6HQ)2YHDH89oRRSjvH{>jYVDGIY^l|o6H_5^7I_VRR_WbFzrgkMZNrLm z$-U%?h!(p2+Eg$-J>x~JuXPefu zO=&p9Pc`_A7JNoA&P6C24uc^Qd+g-oA zRr;{ix2MwaVPE5(pyLNY7w#>z5rf06C8u!%Yl(>tW~rVflya~m1xTM^irLPxFj!W& zKa(DB_SwYZ3CpCIgZ#W;C2^)&@T2U~g#&;r^5E{Z~Yopj92h#_WI#2Pkj_v$7 zhC5hE7|wryd*=CoE%($?{7@-vHnu3HXlre%Ybk8al_c>K%~E1Bih`Mh#+YoiN8dZ4 zZ8)L^k6dx3i-T8(zPRPemUMZ|)eQ^_D8;9sO1c?U14D{uh#N@+$wX1KE~FLG{Z9ZM z(Y2yOmt)qj423XiSVD!;(Gn_H0#=ems8HVV7D9+{@WYZJ zcHPHJVm15W$P~lZpV`-&NFPIVF*%*+_HiE<{O-2IJzK=kX5cK(7AH*7=Z-BEx!e87 z-G}e6CLbCY1hOQNDgP_;%asW+SaICZ=Obj~ONiCDGdbO70)!+?dBiKbq?$7)9ofVZ zQz(pmo^)l$n+;majx^-;k%jgR^X(hd_KjNmM(o3TvsYU=L=h*n_Wh7idBTR!Lc_ZG zhIMMgfYvY|qT9N(w#P)G=2oqF{bFS?`SNp6$f2LGj|o11fSUpi{k7&XENq~&Vg+*| z7x*eue(|)t{APuDVSQ7+>pzi|ZU;U`} zfVM~Q#V*Z1*#RuiI8S1#$z(NV1}ypS=#G@7GObBvV(9XZ=#k9{!WMZG0ir8%C&l&< z*g}uw6wBp+AJZLy7DOg?16&q==I^RjyU<(#*45FMF$CD;a`|T6V9E4*G*(b5xoa2g z2iOmP5TtLO)@rUAJ?wp)Gwo9W-4D!)LZ1y9U}XYb_dOGQor;0eYd!Vc_-Rj-M35Y z7fL(kOFPukF0Hgn@f0|*_i7=~IUnd$1KnBxXlQd)J{sJ3HeFhA#n1mB8k*DJqwEiU zei@H`!!lwaJ3cy9g4|xeU*cw_FyGLcqVKP_0d{xupQIx%Shj-66zM;3lyN67o+GDO zMqU_YApu1u%$7+I$rRJC&_?lDmP9-ulc>QzpHhsUAEn>c9fJ$6O!5U>PqFhq5<_8d zk(t8J+h0hIkDZi>-eo+-5c2JIL=EW&OeaUjPVv2WHMz2b;qA=6@s;rc4G!=RJu*7W zctZtMrkOwwfqnw(2%IIroN!;KyEh0Bk7Z<0?gP@ughDx#^ApcD{+rp4$(s?2Q%d{{ zScbv2*%s{%8>krpk7Ns6E~US;RD7BJr6u-EA%n{D&a~8}6gtyVt71LVQcy9@wA7EGRV_;S;2woN$VQyA)zY^)^T9m|dytJ7l;;ch2K#-78tl@7U6)H1oo*WlUp`x>h literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/tenant_cache.cpython-311.pyc b/backend/app/core/__pycache__/tenant_cache.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..346cd8792ba0bff67b3542fde15154c549b64cc5 GIT binary patch literal 5097 zcmbVQTWlN06`kEBspUhW9`r+|B(D|0Hlv4|*lr9(aqGxM5Y%RX%1u+n20?R&^4ff; zvr8wUsX_&ehD`-T1{6p@U4SVZ*M$Q#|NY5d`$-xE%r0QSKvBT{W1s{G{MCDBm&+w> zr*4P4cV=g2?#z9hduRFQ-rfL#vha_;UH*HJkbmJrt9b0j&Kfkfh)NcTDyU*c$cl?% zR$7#@o<)yyWG=aLgm{6A$Q@n%A#K+ZxPjVov7a1BD{gyeiMM1 z0oC_KPuGl~DlL$hTzoBXR?BJGWJWP)E}1iwR5EpmD(O7qEiJcXznEq;lQgKRs7WI^ z6L^gLW0EPqvutSjTry)yr*bQ%=d_kG;wgJ|Uis~Zoj*Zii%_yCfYhQYEJ|v>Dp5~b zgq@?TUg}eQw1>*W&iu4T?YZt*^s58>t)I$j07iJ)BUGO%r)4z=90C>xc=o6vm=#n9 z)n2GWz!g{NgLW^p`>2n~X|c@%-i6^^Sd~F1LuT+CSH(PPqIhCK%PwcAqUENuG@EBD zE)Cf#LyagOXvQVw+_^J~URYkvGh^oQ6xhcMsx+M}WQ>GiWKxbm>)l|6NNxXP~`cu7p@3SBXMj2Z=&>rgeSnX7sO8e0UFdl_f&a#dj9iwmIsc3(+o z`^KtR5>=P47|6*kmmL$`hMv2vZgPdUSfG>V8-Qw9M^vRYcQCA{c-K+uThvgJ%GG41 z01#yPEH^LL^7q;m1fNy7yDHFZd%(}QF1nn6k5lbMv@}4ykW-Z;+_}7=&<~e2M%5`L zp3hMw5AMZ2&~)nTFm48{A$lTdm|nisn8+Z^5z~XN6q8slJg@=m@zR{ZR&-PuxF17H zn$i+Aiea~*p<^$+(HDS#jUyx!-cUEMRD%cLY7Fh!IQFnVvKic-ulFluZ_`IY0~;gt z;MnJpTf?74Z$<9~r>eoJhBc?R>26g%;nf?Fo9fCqTyxjM0Ar1UzAo>>l1olvCx@or(I( zua~6jeQeMuQU>95+E2HHs)*c-YUPi?K^@28igBt z3K~xZ1M+Op+7bAoqs-GZLk$X81-$+LNL9c{D(B=dj>iN`jbdAkb{Msk=CdXg2i*v= z`hJ9}i&?7cLl8}DPF91XaJ8`k@PMl+kW%m*{L;eD{gN75ECT=KMIf2TYjOJyl7sKRv_@a&AQ zILHQ`PU)O^nsh#|3MJt*xe$PS;^I^i-yrM3lE5Yn+@D=4?g-WDB&uj2!0b{II!|HfhKKg4w zzJvHgq`eq*Z1T^@*v9_sgQpl?{jK;_g<) zwU3oHSYp0*L^ZvdL9@E)%jB1qC^Nk(y;xW>r3}r*JRCG;$lh@R!jW$2U;;O4OZ{Uj zbo6pVw4^HzKUeUxIQKJ4$Zz||-jU6f8`n0kl|xOjC2U*l#`wWollRAu-Wxw!8$Vtj zKi-sJ(ATJzZ;-&O0Es9~BKQw*Ql9S!M-PL0u=^e1L1^%kGasL+4xjye{!XYialAfp z93HHz7K+zH@oFgk@9^NpTrI5B!%9_Fo`yN*7!LDC(D+DvL70o~6kiq{$U8u7MT}@4znVPK2>;^YzYEc zA5ul!H%ISd3%rd3%k#k<27)q?+Lt_F5f%Nzmn0+8O`{ zB0L9LEi}_QBpL zKN@wBMs)wp*Y8KC??tC;(IfTf5y0&T;&uda%Ui?P8V;0uzYUSG1C_|FXl-=5K04jl zKlK2fCvHvF#%AhcGhdF@#!fbSJpB+2E#ePY+7g(ILJFAd2cZ>@_2cJWE}5l?gc(RA zvU#dt##roOnqn_sEC>L%l|_rUf`xF{%>SKTBcdPkb1lgL9b z3s!=vo4h>W4QwB)NR@?(eDh?Jz~gg?r75l?%Vzu&J{DrLpf1yAtSrNyK`sMuJ#)|Q z!NdeFP4v+-JV`N3k?c@Q<7UX=b^pHY6E*)t-9NGBYx*t;0;u5G^lRS#jr;9; Z66ueYuT}JFc(N9rtcNGpLipp#`VaJ4g^K_H literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/tenant_context.cpython-311.pyc b/backend/app/core/__pycache__/tenant_context.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b178241fe802b2b22395befbb17fe9c98db6389f GIT binary patch literal 2326 zcmb_dJ#5=X6h2a?ACs2k#7!IP$7LF~usS3_?G|VoI6&i~NKr|H+6-CPW{-A{Xg)eb~_plxQ1H)tT6=9@Fn8f6c)RmjEg!4ov(WOl)5t(qA zQI`BIwJQ^{2T#b`j?>TMDG&+HT>*?WoH87+Z-!S?eCs6gVA()BwqqkY0=;L`Z3=2|%JAGlcB>dE{ zC1Awo@FNh9i8EB=Fqrfk>3<-*px+zWu<(!+d2^+~9nJZgPXG_|fvQ$t2o8CgMqPU< zi!>}9By8?fB!Tp^acS+vn^%oqFML{-;8%xWhKat?yBp*nWCFXGgRm^d7eH*0=QMx6 zey_g$sYeSwEx2(%1S@Hwh#RsqOu;HlPLqON@Y{={34oV2S3f%jys)}qLQXMo67RVY$lU$fz1sGN9xeN{?8g1&GX5XT zT#1=E0q<4S17e2o=3&#*HOwM6$Jk2XQbuesH7`6`d${JQMPDttwD>ZnGZ*eeYQ8_F z<{7Zn1eRhNRX$?o7}p{=T|!*(Z4%XN)uR`EdeM!0h!4`Gf@`gk57N5Mtd_0^>hPxe z-VnAx%t6Yz+k^jtz#nOR={X|E>$+i@mSf;OZ|i!LdA!U79t?peBxI1lR14hK)aGAg zu5~Te@9;IT1Xkps{Rzl}gd|A^vMkX9G7>2wU3SS^ll@OpbdUCf6nS^`N#WTS`%7-6 z?p5l3rM{&;XzpYN^S@;M>^m;0L-$A>JS!_tlxH9BQ+K)QEm!^J>X!20^X)r>#Lqwa zvv0ek3f&{s11d|!oy)kD;$SHprbR}U%F!p#Ql1uIE}(8wfNpW8f!f8vm*Friz@rrH R1}&v&0p{tNkP3!(r3 literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/tenant_resolver.cpython-311.pyc b/backend/app/core/__pycache__/tenant_resolver.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc0bc94acbf5b49ed3746a781fa885e16a623266 GIT binary patch literal 3525 zcmb_ePiz!b7=JUf|7W)ay3pxT;vgU_f0ndRA}bh#N&{+5C`7EnWY{-thwjd-Z)d4p zYl4wOqX)g&V-piZIoN}TMm=!gz;W7a(#@Qj7!$oMsfmV@-+MDV+jiS((3yGP`}cj{ zd++yt-+S{-A`wII3_bbj_N0i=FSOEl0$yR|IuyP_7!4!LVLs0l_+g%-Wg#yN3p~<< z+YMc$1@ChRJ%r>w!yz6GARM@daPU44J&?SfFcyYTI#f9pdrLR;f|{2t%}@3<$AqhA<62gfV&ms;3KPQo(BHA5+?lX+9cPKan$nHV{L*8mB@ODlgt0d}98LU#~(VG2r3 z@MfW}^}+mF4t&f_afF}Zh7cBfFT(SCnL@LzgF?&Z<61uJ5Sm?8Zo0vNwQ~l32N^qm zjLF{fx(n<^xH33p56(=?H+hYWma=}0`dI^fR_@nwCe|?99M8OIeTD7HItMNnxMhm#;OL>f+LJ-mJ`aGqoW#e!V@YnbYnEllMvuYXylbBwzB+8J`Vm_%9%tv?v2}s z>r8Rd>GCRy*GDO;FmNh|+$A>Xp4n70K}Y-=#9dUEP<;1H!4{9eSCbCRnpNr4l9XMP zvh%MjNCQ=AVER(6U8*B4vA5PK+uP)N2*pz~H*E1ReAL9KN_|Vx=|$=E{E-FeVpY1h zfyvGnmy!n-lLuzU7m~fzWbbseCMLmabWg3L+m3ht8fp8Y?Xxz!^UOlzY&CM$j-0Kv zcT8I=Fiqq{*@n=~*f`d{10_G!B5Pv}qKEgRhyTau;nwo`Ib(2hF9C>-VC8$CY@0*} zU9e0Syk%7Quw>fG#udRXfslJiRQYW^`LT2wzRwJA1q;^)5-L z7Nt{jA1z21s?vq^JX{vLX5O{Mm*ArYnX1&YB=s#yeRJar()p@%zQur2kZgxp3_4*3 zHk<)5R?rHno_B&Q^m6pjZ#*=VKZUfC1@Q*rfS6Mp=Em9aNqEc;(YoN*fe=s+`gQ21 zI&i@^k5DhB8y7tsV(f~S=}a;{mHa~M@#)RoqsgUyUzMJ%&GmTwY;9{){L0p6tFKn+ zER~ItW}Pb%v#1ekawKm~WO8Pq5^)c%V`^oWnbTBbbB$Y-R8BRp4pE@BXnl*)0@(=& zlU-DFf+*2lfaSOh+`f*1IZr*?%icJLxu6ibJUn< zFpwNzc?=!vn87S9zDVTiFUq_J5U7yeW zaDx?_!nXj0`blPy45sP`#Dfl&&F^E`qp>HY#|2ijm0K)t3f~L0J<7a9gNeBlbp+WX zH+yoD)tbUL0-a{7iwT7z9U(GgPRN=p!Y_-9XPExTK+TE5Z_S(Rr-tkSEkd`_MR6^% z&mw2s&3ly`1Qi+sr3#3;z;Rri=ea-~Q4vC1w~cnM{%WZ0E_;`wsp-yYG&S?`LUeyM Zy8mvd9=geKFzb!wQ`Y{+CcSKhe*-`4a`pfK literal 0 HcmV?d00001 diff --git a/backend/app/core/__pycache__/token_encryption.cpython-311.pyc b/backend/app/core/__pycache__/token_encryption.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d67c4492d06e41c6050317f7bb24b1aeba69a182 GIT binary patch literal 12619 zcmcIKTWlLwcEiW;B}$Y;%A%-;N0M!cmPE%7MUG;}acswN9LtI2ZFhwv1jQLywE4=N zkrH#M#x2qXlX|<}t&6BYiZVqutA(?LQ1l~cfi^(e%#?Qy0%&5u`fYQice!6kj2dpimsLk|D7hlIIcjJ{PuY_VbCjqVd;PvPnsEU8U$_ zNzHaPeLHN^9On|*Wr=8>Sn@`OB$VZptnsM~^cc2iK2chVtt6G`Vk{2h6QRhl9Fv!6 zrRU}6E}wt?*b7(Ao`Z6i7*ixAk&@#2v}xqlGmotn+#-pCt>JK6U`v9cO|naTp8>yQ z747fv3l3Vti#*gi>$RdoaxOVUCqTGFm&8NfE%ErbWUE6h*3^Sd@fpOqL~4SR$De^r0xQ4|3Q*rvSL1ogI4_h_6EG3sH1{wEQ5WX2c63b@k ze>_8^Bb3mh^>&f$ZOs*pCSbv%(cJ#lq#UUM^a4(K5rR8hwS((FSg_yqReb)tZ&x|1 z`&r8uL&67%()cswp)=~xnZo(IS9e&Y#Z4>^y9Y{x*>d+AYWEu@?;BMIw|{hdD6%ya z*-$=tTW?}lUHv8cdknpBFrQdb(HullR!BPDK*F30sxhytioErXRkW^I6@!#Ht~JS< z`CqivYsbHsHsDp?^w@ASx~|RjS|hl zm`ig&Z=f*4b`nHD9xl2M(%%gVi>N&+{b*!B-d*Y}HP#)Bm&F zd%5+)+o6fA&_p>jrG}=;zKH6Jlw1+g4?So+T{Dxaa6mcbmjw_E?{kfOa?{|MW_1Ak z)IigXTyoP8_aNd87&CP%?a-(G-89rkzDao~T{RevGxN$P){kMt4-BrSyjQb7>Wv^} zZntL7+l$o5Gyy>-ZzpJ+2ftvUC=*0h@66Ps%fYz}j;-xHfV@65aM?j@$i|J`8Z3(Tk$V!9#Q+Ppzl zGMelbT9lM$1(a9WWGs)V+=p|8e)uyGj*JlmrG)H1Jim?+q!i0=`gNw*M zD&mYbQMwno1A7QN9W#S^4)DnT4Z$7m>wR2D=iP;M>$|VteZ64)+QD@PAA0xQom)Sl z_D9OzBdYhvLvPpJOZOJvy>j*c@+HE?3{_V&!Bt(i;Znak?T<#OOMg$@kfKV5La82a|B z!SRj0a`3nsJiZ;A-3rcrI#UjwQ-kLU?GL+p)vn>-KPr99pAwEQt?K~H&t>?F?sB(FFGYP zG6M@kW+8|hauhO1GAQjHZ-PYLOGf9LO!hT^W;F=|kR`$&CP-nEC+x0|IJzVAE8wJ(h_j|3E==u= zOlz47!dpM>)`luHS)6172%k(s5N;lxa2mlGs{A>fQeq5ov;w0I&Q{ z5P*mbas9(;=GHaVq0X#wHqsRFEYhVHRY~;!CvLqUI;*5v`)FQA9OE<^U@)4Fpda}Z1VD%Z&g(0zygPe$cD?JpGler1e{lWy zFa5HyDRPLWB`zK1?iHa|9Z)N@3`uzI*{ao2MTyhOFP1li@-i+2gFIp#EaT&%G zB^d=Q9Md5lIhWE&mMT2(B0<6KubC3oY&SSC@~!8&*M15{H&>(-)Z8x5i@5%2my!NDjV7$bQVpw?V#?llh>$BpgnMcme1 zAB@P}Fj_FD^B(96Ice9|+?U9I&~&JPbB&oGm>~~kH9v-~;m|=2T^V?gk(xx$b zcoY0;%^FYuD>`PvVq{vfV+~_{dNl>5$}k(hlaZ~A%=M} z50Dg`yn?A~*w91gMtL;sq%H(<5i6-?dj=sK;I;$*Jh_6!cti}hF`l2pf~yG9jZ0e} z8*>RVE)$s$kZT>`s*vZgku#GNDP(&?Yd9e|Fbi{VVhn?q(L};s&_5<$dKmhqUUQSz zQL0@q?l5$xccdlsF95OpH3Z-Y335Xt+k;bEgHs#n^5AK8@N~%)+Ue^rbnJuij zT!aI{=yc({>fH~i$g%CIGh0(vi@Xo2B8j9s2y);+dI7F9j@#X ziUD=sp~~nJmEp019{B}*I-0a zWUY;{3pLNEaY&{SjGA{A%?%it=_aH2Wqvu$e?y-|gF4C`-h)tE!2S!Ml8-|GO0k>k z8Bhab8`g4QLJdq5++X;5RIq{EW#3`dcX-=(bjx>ibFA!}ReiH1*DTY8I+H86vu3S_ z@}F)vTsy*s=PjhiZ1*UJwgJ}`r0X}2GF-IHbKtVJ-l8z12V7bW(12P0njJ{Am0fT3 zG_*2Erq%*uu}P1t*_4K(SH9_}C^{IvOt%TD>3}LaZ&58a&wVG9s|FQz$KW2fu9x8U zBZ0mV-FO3!aViEEEN~DK1<)F}yapW_iQRgLk`PlrGzsY7+J&JunxU{`w1#K_8bVY! zti|})az<8SZ^mwqO$uXZzGWpyNlH9Yr(i^3;A_bj*U5?`B$in3Xqv)&CWYr?Ng4VA zE0w&Nkn2-=UURUX;A+<<-->FsECh}>mw`E=nyWUVZ!D2VxTTK*7@%PVUU5$XE)-$J z>9_=K6}S_I3{hm%oEk4@lL>{qgrK^k8~sQm4uQtQRh1%}UENwwZM}38lMQ`O>E9B% z4A|vAgMhlhJA0~}#ohOpFBVsR6E6=OQwNUG0_4sgPnW!>EA74Ovs>*4OYH|ie)ojlzx<2KMO!&=01irp3lIJK?ydZM_Wo?K z>lbHA{+VCO8`B@=KFV!g+ZvlGd1v4N73kF=x)HN?l(DTdyF#)VS<-wlQH1ky27GZ* zRG=nb4H{OIiQj_+y?Qm>J=G=m$58(O{@K@>Sg+Li*idJlb3{VcflJ32PJtbSOs@)%Uhy+%b`RExw%`b(4IV?K=O^u99OP<0P5x7(2Hg;Q^uF)oEI~sW+*Vb^e4u%;LI#D3dJfLP^ znZ#&J(VVMr9t2ccSA%H<2$wS=unD^N!C9-s)0sClcS6oE9-ux4KuNEQ47_9opPjW z&8VT7O7B2rI080Hzyn4~z*BI+U6QvS*=?%g4gBotdso-5mc5gzce3Q2-0}4me3T!; zmbq{b-Vvwa>N*M%*3Nng7YL93_=iSJk#5FQASYr z5j1d_y^GeZW>11yPw;9?^MZT=9}`<{vPf$eGnpiju?g}US%cu$932|FfWw;=fZ27~;8jpJ1gqE7)aM4z3fQFCyjmk;7{1UGFo`ZP|X()CwMuf^2si!7HWG~P2{ z+liZq%wv2gWbu2v3_;Ulqjr33q(3mir$r8Un&Xrl^)oa)2y((>9v7{1VZG>v2Ree^gF z&Dn=$VAz`b6GOr^KAEBNosQF}HWDqQdwn!u@W6X7w2YGQ#)M9iqS4*UvM{bc9}}j9 zR3g0sF4DT;GY9Wa98n5SP$|}&RG4mbQc5u~?3 zSjyBTlaPgU21~LD(r`Ix;ApYcxaQG>*k}e{I&U;U)nsH^s#&~+H4O@$Z_H)V)SSh! zEM->G;*sVN&4FgT3$v%%lc1+oYgfSAWN-na7u^W`DMHd4O*g(i1dWi&HW{Ke@L%RS z8Yl?z0VEz|7a$&RVg~Lh_kUb!8-ZVC|L6xl-Z-i5KT-A$6fWF*>S1T_zOURltac6; zFO@r|wtc6ze5cC3XH?%ap9R#juWb2VDfwOjjd{OGf~V(Cz6OujD510#PI%4L zLO6lLw=S&m7A6+-DU4hL^#d|FCdlAUNGv7d`k|CQ45PDx+X1#s`t1O2Q={O;cXWs& z*VQl|Ry2(h8eEY1DB0I zv@TaUh>8l0_6*qka8}`7x;pgD2)pjI-<09d;eb;XJj7$Bt{vBaE|>#S+97(OoVh__ z+2z}jmwIe7%as?B1tRIN4(Yyt)z&f>Y_ z#=i>Jeuw^5xVAg=ufk20e%r6Yy;R!!SK&^U%)bhEv}FEOxMxe|Uxn+qL;ot=V9ETe kI str: + """Convert a plain postgresql:// URL into the asyncpg driver form.""" + for prefix in ("postgresql+asyncpg://", "postgresql://", "postgres://"): + if url.startswith(prefix): + return "postgresql+asyncpg://" + url[len(prefix):] + return url + + class DatabasePool: def __init__(self): self.engine = None self.session_factory = None - + self._lock = asyncio.Lock() + async def initialize(self): - """Initialize database connection pool""" - try: - # Create async engine with connection pooling - database_url = f"postgresql+asyncpg://{settings.supabase_db_user}:{settings.supabase_db_password}@{settings.supabase_db_host}:{settings.supabase_db_port}/{settings.supabase_db_name}" - - self.engine = create_async_engine( - database_url, - poolclass=QueuePool, - pool_size=20, # Number of connections to maintain - max_overflow=30, # Additional connections when needed - pool_pre_ping=True, # Validate connections - pool_recycle=3600, # Recycle connections every hour - echo=False # Set to True for SQL debugging - ) - - self.session_factory = async_sessionmaker( - bind=self.engine, - class_=AsyncSession, - expire_on_commit=False - ) - - logger.info("✅ Database connection pool initialized") - - except Exception as e: - logger.error(f"❌ Database pool initialization failed: {e}") - self.engine = None - self.session_factory = None - + """Initialize database connection pool (idempotent)""" + if self.session_factory: + return + async with self._lock: + if self.session_factory: + return + try: + # Async engines use AsyncAdaptedQueuePool by default + self.engine = create_async_engine( + _async_database_url(settings.database_url), + pool_size=20, # Number of connections to maintain + max_overflow=30, # Additional connections when needed + pool_pre_ping=True, # Validate connections + pool_recycle=3600, # Recycle connections every hour + echo=False # Set to True for SQL debugging + ) + + self.session_factory = async_sessionmaker( + bind=self.engine, + class_=AsyncSession, + expire_on_commit=False + ) + + logger.info("✅ Database connection pool initialized") + + except Exception as e: + logger.error(f"❌ Database pool initialization failed: {e}") + self.engine = None + self.session_factory = None + async def close(self): """Close database connections""" if self.engine: await self.engine.dispose() - - async def get_session(self) -> AsyncSession: - """Get database session from pool""" + self.engine = None + self.session_factory = None + + def get_session(self) -> AsyncSession: + """Get database session from pool (use with `async with`)""" if not self.session_factory: raise Exception("Database pool not initialized") return self.session_factory() @@ -56,5 +69,6 @@ async def get_session(self) -> AsyncSession: async def get_db_session() -> AsyncSession: """Dependency to get database session""" + await db_pool.initialize() async with db_pool.get_session() as session: yield session diff --git a/backend/app/models/__pycache__/auth.cpython-311.pyc b/backend/app/models/__pycache__/auth.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..927570546848f060494e1396ff9f7b2fce059784 GIT binary patch literal 1479 zcmah}y>HV%6hGT%$NB0fr79Jm(hg*yGg5^F5~|vS1gYxc#d32eaAiBeb|s30=r5I{@^hsRb-zz5r5HO+!N+=-*LUII0QAVxKS+3S~GSVf#cQt zx60S04QCcCj|nH1!ic4A6RvT}lr_+D9VAss2G1;9?FOyZ*J?vrDzzr?I!ep{8#97# zM?4g&%Y@F+Hj!`g(08K#?9ajfVGyoT2d-^Q%s?DJPuCy=c|h zi(fx#?uRDsLcr}&86f%Rmzw!xJy~z9r}^2Wmeg9cbb9WHeZ14Ai!eHLF)d6T%^q&F z=^Ts>ol7TXl4??I!Az>*?aR~0CtwBW8xnx2kO^QKgp!Kf%d5zVOvLNxwJ;p{u9oz0 z0&ki`m_nFFm_e9BkaoDybxuRwXS=Cgr5uf|-{$TE5M+J7=v6=sU*r;tY;#BSY*Im2=bvtUh#9UP*IVF95C zP!-vj2Tl;%E-U434j7hDFHE;kx`$vOT#Mvg)FEKhqaA>uNDeAzBH2tfTbo!pyT7KF z+7w5JF5Or<>HXzolIWF=WkRZ=yjqELU_NY~Ppv@FG>2a?8qCus>Te;JpgzrfGGDjDLEz@>O5 z#ElWB0GEz%S>iIljYYT|aarJU5qsmrjRTkG;~{%_;wFGAM7Rm!CV`uZj9DOV8n|=3 z5E^rmxEbKyiaa+(+$?Z&k>{p~n+NWEx$&!p&&KXHseL-?+S`xJds%wfQ4c zSg((h(-nWik;a z*=5EeOo|w#lI00_pER{Hl^nIksFkgZQ!D3>0qZv|@|!ldo>=CNZg5<~vdC(>-7wVs zYF({y5#Q2Hk!b9hbuKa*Z>W}2<8?=*KQXtej_w#-D2BPM;<}3X=Ej;(a3z0@_s4i0 zNVUG(RCl>Z82av>BNEOYuklh|C{?mht%^*wS~In#!J(e5R)5)44YXaYS~*x$D+M6p zHaIk2t*Z69>5w%W_;KX(2oneegh_;Hgc*ccfLGE9p!9nFy4q;a5A1QnzTWUBeyy=@ zW$|VN)B^jj0Ii{a-twi^di%=Zje~bwb_q&{UGnA@T5B(6+bb^@T!y8?7QFL|t@|%- zw%1hcEWp z_RE^fmZ5amvNt^kecLXZgVJGh-t?^Bo^{!5hs}D0S+I8l8h+caSc|>M1R@%=jjj`1 zwn0Q|GDJd56ow*U&Ek*}V9`9LwC?%$;%#5? zO*R{toMmeTErqOK!ajs4tgIr?t6^8b9D@$LP7Hv-#5W}liLA+(4pj4#I9`DS;_;#M zW*Vg`hve2MHK|6aND`F-iBi6df#Ac>zbc9rhhCS+Vy*UBQJeyTdE zRc%^^$ZXS+YgN?|nI=sd>w#(X{f8kwmWu2VQQXwcc8PzCJRgCNKy5H1LM%M@&vE z9!XI+#=g@Lgg-5Ooxt+Pp#!fI3t+JPgAJj-2_#XRwVv?Pmf%MaxQey`KZ>A5(y#fV zo~n@CYYNG8szMUq6LN6xn3(e2%XhfN>)YH$!QK#)posd8?rU(BYZ0ABya@S!<}|EO!Xy!LALKGZ=(!$@19d;4KHuMN6_j(&{=&ANx(Qg-BR_w5%SA+*>NcfA=>>Kmr z0^ckU7yYyxDXZr~K6{g(eF#Ha2qmnnB9NeASHL8L4!lmD0t|=ZC_#fgpZUQ^HIg!t ztpvzcG9+6`Ed`;b^v(tSP_yWju7Wx1ZG?9K0_F8gNy0oRNd zT8~*iPcOgl;c^b~+3rnrX?G2YLLFuri@csUSejK5-fH(R9JTi?hj9$s^ zL22aiqzo1;1QNMHHe*-7az73}17tjxspT{;kNHVjkMo^rck z*5Ry-=SPvMaodK^$Z{!hw%mkN<;VDn2$*p;euM-fYhtSPxb^t?U5WB*@|9*F6O$DBbei&+gttMXLKbD#jXpskX&zeMrNr!%VhW zhmQsgPGZfvQ;r_N=~PV_NLybLUY%Sg;(FZ)JNBo@BA_SjhX8@a$_*W^3n;H$g)J_- zE4ThpyzMe99d_HBJO^hdC>=tm_)CgImrHL6rLnK6bw}T}FhVSbfS=qV>FhW3`mRN< zNeZGMmqwsHJ&QH;B7O7u-wbqCMB$)~owg8?ToM$TECm2fEHvZS%KQHRI(%TMFaXNG z{YUtIJBrJ)>`C8t&n}+yw)@|TCoQUZ|+>sQ8wtkGgrvqw6mecUb5`n`!e6+}E z_-N@-$$o9nhqV!RDl&WqMWKED7<*3#)O1Q-J(8kuSUSeu(*ZSkhIRJ>3<})vi>AA=D%*dN!7E|SU3d@Y jA9&N4TsV@Va0r7!@9BV2m^_2#!+^erUNj%3C~y7)ctGk$ literal 0 HcmV?d00001 diff --git a/backend/app/monitoring/__pycache__/__init__.cpython-311.pyc b/backend/app/monitoring/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..854934a9241b7af8109cac2eb993ef561431c9cb GIT binary patch literal 486 zcmb`Cu};G<5Qfi58W&1csfZOibm>ARX2ix=1nTDH6vZYA#EEg-p-j95I}73&c!7?L z$SV_Dq;8$Cp;h|;oaIk<_J6;9uifrGxR@^9?>GVY^2H{Cb+SBj$un?ZzzGiuA_Er4 zkcBd0k!-P+j9DxxqXaVG!3$w+9!_BtJsw{ReOqanl&KiVs?1HL^D-N#B)v~E@$FuO zQEdA=vdN#y9^A}?o==3)d0N}vWyw{Qmu7QtsJ70ycD5a(oiRT6PJ5IIgS)EQB&NO^ z?OBS*s}#|8cCK~k{-Ps~mPhPCJ=zYwCn*ZVH(0t7Rwv^`so%XFYmAt?5fM+-eAPae r6`vL2Lie2B4_YgSCM1M>!teuzO+-o1!2h97JKk@NC+e5(x<`KimdAzU literal 0 HcmV?d00001 diff --git a/backend/app/monitoring/__pycache__/middleware.cpython-311.pyc b/backend/app/monitoring/__pycache__/middleware.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3819e487d52bb688c92622e7aff08c16580ea5f GIT binary patch literal 2691 zcma(TZHN;`boL|J-E7WyUd~I-Q&Y9p^vqq=^Mih&V%63vVx?fDEZfZ7UCzxW&hGUz zCUBsX{OAvbP=!*sA9A(mkNy+&Dt}+^4X`70$X?3bjb0uXHTE(P6MiPhFqK{jti)IhB$@1?T}x&K1q=ct&nK6 zC9=pnHZJ6|wtJGeG@EhwL~Odm&E`m^rD+R_?as4JfZRj`ffG?$#6nuaB9W&>EM1e+ z0W5=20k-*cPy3Ty<$J0YclPjvn@_mZ%v?xtFOarAEA3|rZJCwnx(}4#8-EqrvwNW1 z2_%44C1DN-tuoi$1}uDn=%9#7VoB)VpsNrRSELWoP3cq6+wBAl2$<{Gi7th8DnLIjA95>9Y9ha;Jx-Wsq>UD~0ZJ^$rj9jhqX1=osYo2T57}AF~3hW(90z zEBNCavZYJXIkX`Bm+fWc|JYuVir{k`EP|iPYDt;v+P(y-x4K{jtNmVB(pHZ`fAcWb zE;PMX4!Xm=(J$Uvpmx1lQr&oOd@m{c_YbsQ(-~EgOMz1GUT7J#zuUE-tht*zBOnge zcJPwcA3FjnsaXF)#^Eo;mA=3OZ^D#PkcP0RnI);&tjhw^ zrsWVOyL6r;Ri<__i3LIaY#uWm&r{RQ=4~VAfGEgt$2D^Wro+#jcZ^IP6Q=ORU;)Yv zXIfLd0pg3&#O`S(=A2^WQi`^ZmJ}C~9AwfwwU}Hm-C0;3NKBbE9n*Cw3vk)cpCRyf zDdo-wE-^8o4wHb)0#<&3P|7!eMmgX?!X!JtKu36&M;VJylF3tSbc{-dnCuX1nua+S z)U+(aCYM|mf(5B-a4l$zPv>?}9vMvSs7-lbF{SNxhaV(~Zu#@2NwZLBw%)Nj**lyk z3YX!C%sOCgX12KFKMuNy&Pc9?^EsSJPvKickM(t*z2WH_YMW2jbYA`VmRs?q{q^{` z7ay+;t*YViC&TgTxf|!J=PRK`5Dkq~6h9iPXnr(a(He448+;O3e|@1^UYf2)QeGt0 zK;pm&;nCS3<-EY+< zj&y59_0(7`{%Tzv_w{H43EEzNVybf73y#C6HUiU9o>UIvuklx$s( z-@ZYerk-qQC8PCBa45h2n7-nb&`iBnVm5P9vGOxB@CacVFdztm$LICfQBRpf{*sp(4NOgUu=FpI#BDcKH6UEuRhvQ>#sg~ ztM;Pmqm8xx>Z3J_&F`@`S{d=Q(OU=V+BQ$ywis;4Qv$euHK=Vr@Ea%p{sLap%D({J CgsqAI literal 0 HcmV?d00001 diff --git a/backend/app/monitoring/__pycache__/performance.cpython-311.pyc b/backend/app/monitoring/__pycache__/performance.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb779933641dc9f51cdd018835e0501c0383b2cb GIT binary patch literal 16802 zcmeG@ZEPFod3WUTOQJ|hq&_T(67^+?mMq1xo!GH#OOX`Yu`MT&o7i*`hT)xL+N3Do zQL(K`nbJ9^+IfIec(A*u1Dm<2yf~N#w4H`!gS%v#f8GgKm^eUyw;@;q3fi7oe_3+KeU_%E zD-=tGD3)eTaXLhkyD4OXyE$%7Fd-&k30V@>kTqco*=Wqi#O(=t$ewV79OT&&FG-Y! zN)yhIlRTT^WuY?2XN|iO?vOhd=LvZr&K56ERD>!L-jFvJ?+f`%6lXeBnQt6d^#Qc% zL-?y#sG6%VQTr&?et}{gADAEw{_6Ds+&;`dP@$S!&JxI3`pBFcNR3X&S7yu?s)g3n z7S&tFxmg!i&$_w#F^2VAV2aZHY&pkp^_*?Yv_Wgln2D{pz=RrD(NJ%Z){*;wcu3T3GJP6c?lwS2Q`1 z;?AYujgfJVhkOnw9*M>yf}mK&VqBb!YOM#voO`%`8IUU!M*($EA=9^j20~`&uZ1=B zK?=dl1hYaMLogd)7J}IUvm(aYLJqEkV+tb#DfV1SDWo_JDUMu9*{U)nY6^^Msp5QL zisR28=2CntDonTJkN}KpAQBK@IOALZJ4pr}hJin?l#p9Eb$*glN+2c9g(o5~f~D*f zAHm@bCj@mkg;XRlsn~?6Xp|F#5v7dd`6M4szyl1R;^32K!_nl_L@HnB$%t?==u+%q zQe!x*l!U_xGM#`s!{IYikvP5!o^0VTn~VZt7E-+84u>NX6Uh{LzW}k8v3N3);%zW) z3iC!X8Rv0*@VIdKDvUJ8CQ^JgVArYp0I4sVdm@vQx{s-(6<2$ZXDdymLq9j=X)OfRtB>36H0Fn{i<`Qog|v_O!UmQ0{^?zv0$tKQ3HBGU>%A`lS1Ip4Ci zDexDN{5zmPBWwkd(*!!Z`9mYax7 zqyT+ZaYQ50lU(>@ECoy7onr{$u}Boy3@ifn4WLGjk8wiK%hzDV*nYkiK^=m61bze! z2#^x_0D>R_LWr9X>qO9qpbUV*#DP)qoAH@JKuE3$F*3z1h_&SbzC&09U?jtCk?GF3 z^2FtI&mEjQ`1ZlfdSqDc6B!H=n1!keH@5DY2>!s52!pbr2+` zF4MLt{jH^KVq3q|)-Sj91DP_HUXeY`BGV5+A`lR@6WD$Oo#No&b^kvA6zCNBBK;C8@mfIC

);r+1bCgbKt~{JN}*J#F4b;Gbwa9>tpwRr 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 literal 0 HcmV?d00001 diff --git a/backend/app/services/cache.py b/backend/app/services/cache.py index b81474957..8c884b299 100644 --- a/backend/app/services/cache.py +++ b/backend/app/services/cache.py @@ -1,29 +1,34 @@ import json import redis.asyncio as redis -from typing import Dict, Any +from typing import Dict, Any, Optional import os # Initialize Redis client (typically configured centrally). redis_client = redis.Redis.from_url(os.getenv("REDIS_URL", "redis://localhost:6379/0")) -async def get_revenue_summary(property_id: str, tenant_id: str) -> Dict[str, Any]: +async def get_revenue_summary(property_id: str, tenant_id: str) -> Optional[Dict[str, Any]]: """ Fetches revenue summary, utilizing caching to improve performance. + Returns None when the property does not belong to the tenant. """ - cache_key = f"revenue:{property_id}" - + # Property IDs are only unique per tenant, so the tenant must be part + # of the key to keep tenants isolated. + cache_key = f"revenue:{tenant_id}:{property_id}" + # Try to get from cache cached = await redis_client.get(cache_key) if cached: return json.loads(cached) - + # Revenue calculation is delegated to the reservation service. from app.services.reservations import calculate_total_revenue - + # Calculate revenue result = await calculate_total_revenue(property_id, tenant_id) - + if result is None: + return None + # Cache the result for 5 minutes await redis_client.setex(cache_key, 300, json.dumps(result)) - + return result diff --git a/backend/app/services/reservations.py b/backend/app/services/reservations.py index 384bd00ab..b385e1a80 100644 --- a/backend/app/services/reservations.py +++ b/backend/app/services/reservations.py @@ -1,109 +1,103 @@ from datetime import datetime -from decimal import Decimal -from typing import Dict, Any, List +from decimal import Decimal, ROUND_HALF_UP +from typing import Dict, Any, List, Optional -async def calculate_monthly_revenue(property_id: str, month: int, year: int, db_session=None) -> Decimal: +from sqlalchemy import text + +from app.core.database_pool import db_pool + +CENT = Decimal("0.01") + + +def round_money(amount: Decimal) -> Decimal: + """Round once, at the end, to whole cents (half-up, like accounting).""" + return Decimal(amount).quantize(CENT, rounding=ROUND_HALF_UP) + + +async def get_tenant_properties(tenant_id: str) -> List[Dict[str, Any]]: + """Lists the properties that belong to a tenant.""" + await db_pool.initialize() + async with db_pool.get_session() as session: + result = await session.execute( + text(""" + SELECT id, name, timezone + FROM properties + WHERE tenant_id = :tenant_id + ORDER BY id + """), + {"tenant_id": tenant_id}, + ) + return [{"id": r.id, "name": r.name, "timezone": r.timezone} for r in result] + + +async def calculate_monthly_revenue(property_id: str, tenant_id: str, month: int, year: int) -> Decimal: """ Calculates revenue for a specific month. + The month is evaluated in the property's own timezone, not UTC, so a + booking at 23:30 UTC on Feb 29 in Paris counts in March. """ - start_date = datetime(year, month, 1) if month < 12: end_date = datetime(year, month + 1, 1) else: end_date = datetime(year + 1, 1, 1) - - print(f"DEBUG: Querying revenue for {property_id} from {start_date} to {end_date}") - - # SQL Simulation (This would be executed against the actual DB) - query = """ - SELECT SUM(total_amount) as total - FROM reservations - WHERE property_id = $1 - AND tenant_id = $2 - AND check_in_date >= $3 - AND check_in_date < $4 - """ - - # In production this query executes against a database session. - # result = await db.fetch_val(query, property_id, tenant_id, start_date, end_date) - # return result or Decimal('0') - - return Decimal('0') # Placeholder for now until DB connection is finalized - -async def calculate_total_revenue(property_id: str, tenant_id: str) -> Dict[str, Any]: + + query = text(""" + SELECT COALESCE(SUM(r.total_amount), 0) AS total + FROM reservations r + JOIN properties p + ON p.id = r.property_id AND p.tenant_id = r.tenant_id + WHERE r.property_id = :property_id + AND r.tenant_id = :tenant_id + AND (r.check_in_date AT TIME ZONE p.timezone) >= :start_date + AND (r.check_in_date AT TIME ZONE p.timezone) < :end_date + """) + + await db_pool.initialize() + async with db_pool.get_session() as session: + result = await session.execute(query, { + "property_id": property_id, + "tenant_id": tenant_id, + "start_date": start_date, + "end_date": end_date, + }) + return round_money(result.scalar_one()) + + +async def calculate_total_revenue(property_id: str, tenant_id: str) -> Optional[Dict[str, Any]]: """ - Aggregates revenue from database. + Aggregates revenue from database for one property of one tenant. + Returns None when the property does not belong to the tenant. """ - try: - # Import database pool - from app.core.database_pool import DatabasePool - - # Initialize pool if needed - db_pool = DatabasePool() - await db_pool.initialize() - - if db_pool.session_factory: - async with db_pool.get_session() as session: - # Use SQLAlchemy text for raw SQL - from sqlalchemy import text - - query = text(""" - SELECT - property_id, - SUM(total_amount) as total_revenue, - COUNT(*) as reservation_count - FROM reservations - WHERE property_id = :property_id AND tenant_id = :tenant_id - GROUP BY property_id - """) - - result = await session.execute(query, { - "property_id": property_id, - "tenant_id": tenant_id - }) - row = result.fetchone() - - if row: - total_revenue = Decimal(str(row.total_revenue)) - return { - "property_id": property_id, - "tenant_id": tenant_id, - "total": str(total_revenue), - "currency": "USD", - "count": row.reservation_count - } - else: - # No reservations found for this property - return { - "property_id": property_id, - "tenant_id": tenant_id, - "total": "0.00", - "currency": "USD", - "count": 0 - } - else: - raise Exception("Database pool not available") - - except Exception as e: - print(f"Database error for {property_id} (tenant: {tenant_id}): {e}") - - # Create property-specific mock data for testing when DB is unavailable - # This ensures each property shows different figures - mock_data = { - 'prop-001': {'total': '1000.00', 'count': 3}, - 'prop-002': {'total': '4975.50', 'count': 4}, - 'prop-003': {'total': '6100.50', 'count': 2}, - 'prop-004': {'total': '1776.50', 'count': 4}, - 'prop-005': {'total': '3256.00', 'count': 3} - } - - mock_property_data = mock_data.get(property_id, {'total': '0.00', 'count': 0}) - - return { + # LEFT JOIN from properties so that an owned property with no bookings + # returns 0, while a property of another tenant returns no row at all. + query = text(""" + SELECT + p.id AS property_id, + COALESCE(SUM(r.total_amount), 0) AS total_revenue, + COUNT(r.id) AS reservation_count + FROM properties p + LEFT JOIN reservations r + ON r.property_id = p.id AND r.tenant_id = p.tenant_id + WHERE p.id = :property_id AND p.tenant_id = :tenant_id + GROUP BY p.id + """) + + await db_pool.initialize() + async with db_pool.get_session() as session: + result = await session.execute(query, { "property_id": property_id, - "tenant_id": tenant_id, - "total": mock_property_data['total'], - "currency": "USD", - "count": mock_property_data['count'] - } + "tenant_id": tenant_id + }) + row = result.fetchone() + + if row is None: + return None + + return { + "property_id": property_id, + "tenant_id": tenant_id, + "total": str(round_money(row.total_revenue)), + "currency": "USD", + "count": row.reservation_count, + } diff --git a/backend/requirements.txt b/backend/requirements.txt index 6b777d2aa..06cb8bd4a 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -18,7 +18,7 @@ pytz redis>=5.0.0 requests sendgrid -sqlalchemy>=2.0.0 +sqlalchemy[asyncio]>=2.0.0 supabase tenacity>=8.0.0 uvicorn[standard] diff --git a/frontend/src/components/Dashboard.tsx b/frontend/src/components/Dashboard.tsx index a21bba404..4007a83bc 100644 --- a/frontend/src/components/Dashboard.tsx +++ b/frontend/src/components/Dashboard.tsx @@ -1,16 +1,30 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { RevenueSummary } from "./RevenueSummary"; +import { SecureAPI } from "../lib/secureApi"; -const PROPERTIES = [ - { id: 'prop-001', name: 'Beach House Alpha' }, - { id: 'prop-002', name: 'City Apartment Downtown' }, - { id: 'prop-003', name: 'Country Villa Estate' }, - { id: 'prop-004', name: 'Lakeside Cottage' }, - { id: 'prop-005', name: 'Urban Loft Modern' } -]; +interface Property { + id: string; + name: string; + timezone: string; +} const Dashboard: React.FC = () => { - const [selectedProperty, setSelectedProperty] = useState('prop-001'); + const [properties, setProperties] = useState([]); + const [selectedProperty, setSelectedProperty] = useState(''); + const [loadError, setLoadError] = useState(''); + + useEffect(() => { + // Only the properties of the logged-in user's tenant are returned + SecureAPI.getDashboardProperties() + .then((list: Property[]) => { + setProperties(list); + setSelectedProperty(list[0]?.id ?? ''); + }) + .catch((err) => { + console.error(err); + setLoadError('Failed to load properties'); + }); + }, []); return (

@@ -26,7 +40,7 @@ const Dashboard: React.FC = () => { Monthly performance insights for your properties

- + {/* Property Selector */}
@@ -35,7 +49,7 @@ const Dashboard: React.FC = () => { onChange={(e) => setSelectedProperty(e.target.value)} className="block w-full sm:w-auto min-w-[200px] px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 text-sm" > - {PROPERTIES.map((property) => ( + {properties.map((property) => ( @@ -46,7 +60,10 @@ const Dashboard: React.FC = () => {
- + {loadError &&
{loadError}
} + {selectedProperty && ( + + )}
diff --git a/frontend/src/components/RevenueSummary.tsx b/frontend/src/components/RevenueSummary.tsx index dbb6d0629..8c45128c7 100644 --- a/frontend/src/components/RevenueSummary.tsx +++ b/frontend/src/components/RevenueSummary.tsx @@ -3,45 +3,58 @@ import { SecureAPI } from '../lib/secureApi'; interface RevenueData { property_id: string; - total_revenue: number; + total_revenue: string; // exact decimal string, already rounded to cents by the server currency: string; reservations_count: number; } interface RevenueSummaryProps { - propertyId?: string; - debugTenant?: string; + propertyId: string; showRaw?: boolean; } -export const RevenueSummary: React.FC = ({ propertyId = 'prop-001', debugTenant, showRaw }) => { +// Adds thousands separators to a decimal string without converting it to a float +const formatAmount = (amount: string): string => { + const [whole, fraction = '00'] = amount.split('.'); + const sign = whole.startsWith('-') ? '-' : ''; + const digits = whole.replace('-', '').replace(/\B(?=(\d{3})+(?!\d))/g, ','); + return `${sign}${digits}.${fraction.padEnd(2, '0')}`; +}; + +export const RevenueSummary: React.FC = ({ propertyId, showRaw }) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); - const activeTenant = debugTenant || 'candidate'; - useEffect(() => { + let cancelled = false; + const fetchRevenue = async () => { setLoading(true); + setError(''); try { - // Use SecureAPI to handle authentication automatically - // We pass the simulatedTenant option which SecureAPI will attach as a header + // The tenant is resolved by the backend from the auth token const response = await SecureAPI.getDashboardSummary(propertyId, { - simulatedTenant: activeTenant, timestamp: Date.now() }); - setData(response); + // Ignore responses for a property the user already switched away from + if (!cancelled) setData(response); } catch (err) { - setError('Failed to load revenue data'); + if (!cancelled) { + setData(null); + setError('Failed to load revenue data'); + } console.error(err); } finally { - setLoading(false); + if (!cancelled) setLoading(false); } }; fetchRevenue(); - }, [propertyId, activeTenant]); + return () => { + cancelled = true; + }; + }, [propertyId]); if (loading) { return ( @@ -61,8 +74,6 @@ export const RevenueSummary: React.FC = ({ propertyId = 'pr if (error) return
{error}
; if (!data) return null; - const displayTotal = Math.round(data.total_revenue * 100) / 100; - return (
{showRaw && ( @@ -78,14 +89,7 @@ export const RevenueSummary: React.FC = ({ propertyId = 'pr

Total Revenue

- {data.currency} {displayTotal.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} - - {/* Fake trend indicator for premium feel */} - - - 12% + {data.currency} {formatAmount(data.total_revenue)}
@@ -101,18 +105,6 @@ export const RevenueSummary: React.FC = ({ propertyId = 'pr

{data.reservations_count} bookings

- - {/* Precision Warning Area */} -
- {Math.abs(data.total_revenue - displayTotal) > 0.000001 && showRaw && ( -
- - - - Precision Mismatch Detected -
- )} -
); diff --git a/frontend/src/lib/secureApi.ts b/frontend/src/lib/secureApi.ts index f85f04c90..16fcf46f2 100644 --- a/frontend/src/lib/secureApi.ts +++ b/frontend/src/lib/secureApi.ts @@ -1450,22 +1450,22 @@ export class SecureAPIClient { // ============= DASHBOARD API ============= /** - * Get dashboard summary with optional simulation header + * Get the properties owned by the current user's tenant */ - async getDashboardSummary(propertyId: string, options?: { simulatedTenant?: string, timestamp?: number }) { + async getDashboardProperties() { + return this.request('/api/v1/dashboard/properties'); + } + + /** + * Get dashboard summary; the tenant is always resolved server-side from the auth token + */ + async getDashboardSummary(propertyId: string, options?: { timestamp?: number }) { const queryParams = new URLSearchParams({ property_id: propertyId }); if (options?.timestamp) { queryParams.append('_t', options.timestamp.toString()); } - const requestOptions: RequestInit = {}; - if (options?.simulatedTenant) { - requestOptions.headers = { - 'X-Simulated-Tenant': options.simulatedTenant - }; - } - - return this.request(`/api/v1/dashboard/summary?${queryParams}`, requestOptions); + return this.request(`/api/v1/dashboard/summary?${queryParams}`); } async uploadCompanyLogo(logo_url: string) { diff --git a/frontend/src/utils/StorageHealthChecker.ts b/frontend/src/utils/StorageHealthChecker.ts index a7da9a0ee..ac5b37b42 100644 --- a/frontend/src/utils/StorageHealthChecker.ts +++ b/frontend/src/utils/StorageHealthChecker.ts @@ -168,9 +168,14 @@ export class StorageHealthChecker { try { const value = localStorage.getItem(key); if (!value) continue; - + + // Plain strings (version marker, language, ...) are legitimate values, + // not corruption. Only JSON-shaped values are validated below. + const trimmed = value.trim(); + if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) continue; + // Try to parse as JSON - const parsed = JSON.parse(value); + const parsed = JSON.parse(trimmed); // Check if it's our storage format if (typeof parsed === 'object' && parsed !== null) { diff --git a/frontend/src/utils/localStorageManager.ts b/frontend/src/utils/localStorageManager.ts index 735938973..7355b8a5d 100644 --- a/frontend/src/utils/localStorageManager.ts +++ b/frontend/src/utils/localStorageManager.ts @@ -14,6 +14,13 @@ import { storageRecoverySystem } from './StorageRecoverySystem'; const STORAGE_VERSION_KEY = 'app_storage_version'; const CURRENT_VERSION = '2.0.0'; // Keep at 2.0.0 to avoid forcing migration on existing users +// Session key used by localAuthClient; wiping it logs the user out +const AUTH_TOKEN_KEY = 'base360-auth-token'; + +// Keys that must survive any storage cleanup or migration +const isAuthKey = (key: string): boolean => + key === AUTH_TOKEN_KEY || key.includes('supabase') || key.includes('sb-'); + interface StorageSchema { version: string; timestamp: number; @@ -113,11 +120,11 @@ class LocalStorageManager { for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); - if (key && (key.includes('supabase') || key.includes('sb-'))) { + if (key && isAuthKey(key)) { const value = localStorage.getItem(key); if (value) { preservedData[key] = value; - console.log(`Preserving Supabase key: ${key}`); + console.log(`Preserving auth key: ${key}`); } } } @@ -239,14 +246,14 @@ class LocalStorageManager { for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); - if (key && (key.includes('supabase') || key.includes('sb-'))) { + if (key && isAuthKey(key)) { const value = localStorage.getItem(key); if (value) { preservedData[key] = value; } } } - + // Also preserve version key const versionValue = localStorage.getItem(STORAGE_VERSION_KEY); if (versionValue) { @@ -271,7 +278,12 @@ class LocalStorageManager { private clearCorruptedStorage(): void { console.warn('Clearing corrupted localStorage'); try { + // Never log the user out as a side effect of a storage cleanup + const authToken = localStorage.getItem(AUTH_TOKEN_KEY); localStorage.clear(); + if (authToken) { + localStorage.setItem(AUTH_TOKEN_KEY, authToken); + } localStorage.setItem(STORAGE_VERSION_KEY, CURRENT_VERSION); } catch (error) { console.error('Failed to clear corrupted storage:', error);