From 156d1c4464126b4311b461731308baafa96bc803 Mon Sep 17 00:00:00 2001 From: Priec Date: Sat, 12 Sep 2026 19:33:21 +0200 Subject: [PATCH] default accounting currency --- Cargo.lock | 36 +++++++++---------- common/proto/table_definition.proto | 20 ++++++----- common/src/proto/descriptor.bin | Bin 264740 -> 265148 bytes common/src/proto/komp_ac.table_definition.rs | 22 +++++++----- search/src/lib.rs | 23 ++++++++---- server | 2 +- 6 files changed, 62 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6e02c186..28bea8cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -207,7 +207,7 @@ dependencies = [ "objc2-foundation", "parking_lot", "percent-encoding", - "windows-sys 0.59.0", + "windows-sys 0.52.0", "x11rb", ] @@ -1161,7 +1161,7 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "client" -version = "0.8.57" +version = "0.8.58" dependencies = [ "anyhow", "async-trait", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "common" -version = "0.8.57" +version = "0.8.58" dependencies = [ "icu_casemap", "prost", @@ -2574,7 +2574,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2738,7 +2738,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4248,7 +4248,7 @@ dependencies = [ [[package]] name = "komp-app" -version = "0.8.57" +version = "0.8.58" dependencies = [ "anyhow", "common", @@ -4749,7 +4749,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5934,7 +5934,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6618,7 +6618,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6675,7 +6675,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6782,7 +6782,7 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "search" -version = "0.8.57" +version = "0.8.58" dependencies = [ "anyhow", "common", @@ -6970,7 +6970,7 @@ dependencies = [ [[package]] name = "server" -version = "0.8.57" +version = "0.8.58" dependencies = [ "anyhow", "bcrypt", @@ -7963,7 +7963,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -8577,7 +8577,7 @@ checksum = "e78122066b0cb818b8afd08f7ed22f7fdbc3e90815035726f0840d0d26c0747a" [[package]] name = "tui-canvas" -version = "0.8.57" +version = "0.8.58" dependencies = [ "anyhow", "arboard", @@ -8608,7 +8608,7 @@ dependencies = [ [[package]] name = "tui-canvas-validation-core" -version = "0.8.57" +version = "0.8.58" dependencies = [ "regex", "serde", @@ -8618,7 +8618,7 @@ dependencies = [ [[package]] name = "tui-pages" -version = "0.8.57" +version = "0.8.58" dependencies = [ "criterion", "crossterm", @@ -8864,7 +8864,7 @@ dependencies = [ [[package]] name = "ux-config" -version = "0.8.57" +version = "0.8.58" dependencies = [ "toml", ] @@ -9338,7 +9338,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 40f5bf67..a94dc887 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -122,6 +122,9 @@ message GetModuleConfigurationRequest { message SetModuleConfigurationRequest { ModuleScope scope = 1; repeated string enabled_modules = 2; + // Initializes an existing profile's bookkeeping currency. Empty leaves it unchanged. + // Global scope and changes to an already configured currency are rejected. + string accounting_currency = 3; } message ModuleConfiguration { @@ -130,6 +133,7 @@ message ModuleConfiguration { repeated string selected_modules = 3; repeated string inherited_modules = 4; repeated string effective_modules = 5; + string accounting_currency = 6; } message CreateCustomExchangeRatesTableRequest { @@ -172,11 +176,11 @@ message PostTableDefinitionRequest { // Empty means the row is identified by its id alone. repeated string row_display_columns = 7; - // ISO-4217 currency the profile keeps its accounting in. A profile is one - // accounting entity and keeps one set of books, so this is required only when - // the request creates the profile, and is ignored afterwards. It is unrelated - // to individual MONEY-column currencies: tables may hold money in any currency, and amounts convert - // to this one when they reach the ledger. + // Default ISO-4217 currency for this table's MONEY columns. Explicit column + // currencies take precedence; when omitted, the profile currency is used. + // The resolved default is saved for columns added later. When this request + // creates a profile, it also initializes that profile's bookkeeping currency. + // Supplying a table default never changes an existing profile's currency. string accounting_currency = 8; // Initial compiled direct-rate provider. It is enabled for each initial @@ -187,7 +191,7 @@ message PostTableDefinitionRequest { repeated string foreign_currencies = 12; // When true, the table is stored once in the global physical schema and is - // visible from every profile. profile_name and accounting_currency are ignored. + // visible from every profile. profile_name is ignored. bool global = 9; // Names for the columns a definition row generates, in place of the ones the @@ -398,8 +402,8 @@ message ColumnDefinition { // from quantity-ledger contributions. bool quantity_ledger = 4; - // Canonical uppercase ISO-4217 currency code. Required for MONEY and forbidden - // for every other field type. + // Canonical uppercase ISO-4217 currency code. MONEY inherits the table/profile + // default when omitted. Forbidden for field types without currency support. string currency = 5; // When true, the server rejects omitted or explicitly null values. diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index eb6c1214ca0f3b81ef14621effe83d38400516b0..9312d2354b3462024cc2abd557c82ebd3e4a9716 100644 GIT binary patch delta 20109 zcmZ{sd6-qjwdhaPuDwt9X`ty10=9q$keO~~oY0r&5Mw4annaU)?*+A0ZU}f8l6W&5 z0To9?QMQVTAoHMrNDBc46oR0jf`B3#M^qG}qKQQG{Z8c*u04z^aMtovE& z=F(zSFh*;gMt{+rY9Ca^b4LyzJABxP;s4bzrZ{Y5vEdKH$BZ35^2*}Xqeopad_+U{ zF~v(qjrz@R8XB&arHJ% zp?J=SQI`%IQ5Tjgm%&jTqf9?DA`hmyH^E#qcY~jc%ZZS6m!6 zx}i9_;XfKK8!M^`%?h!Y8;iXaffQ8PK2QW5Uxc)Y(qz2K-KbQdst}n-rDnXUIF2G? zBArXkgp$(j3eC|8Ca}`Y15$Z{YSAiSB-o~{m!)u`(mi~kG8PK~W5KGLfVOhlB_Nt6 zs&3t_rc#9K&2>t5_oW(DU{FOz!6sE2RoAJsbEu4}>r~fn-YDq$vQZJ5z@RBY)AeOd z;*0B5S_)Q0R@hq=i4`}LRT+mtl|j`FWmN`MH>jrm;dHP`6Llvk-N{=VJFEy;LUxj3 z?A#c{$WBsz@JyQAta7*d!IM^QRuy%&uSN#%7Nu*g9E4iXsRgNfi>f>(l%n+()$UkC zHMS>{RqhV2wG>lzvZ|=JYGYA*yV6A~2%#3t2c+)p52y`;ngmfgT|)E~nbV2H%0tEc-pR}33BVr=o;3(u9;i;j)Iy zNrw%m7Jq+L!^q;O-wq#3+UkQ|DYXeSNL^E;sc~a$e!Pg{(G6opjrbjz?{aS;#bZdO zmlwq_X|jYF#bK9U&Z7~-#x{(uFaBH_u{Mux_|I_-W5!|=nRKkA?$BNzNyfuQj2TrN zepF^3d)2V9p~nA|(hJ24$6bB(h-)Oz52J@A+|p#-$cEoFV3tks|Il|(DSKzGTV5by6B82%W;#(f+x#ylSjjoDm}q#$fMy&)xBroc4t9FYBngH)?S*G0)13*(>&1?=-Z(3ZVds^w?Vb63HmBivni{;K;3crrm{(u z^mCJ{I^Nq*iHc3C*gqgDHmN~F3KJ7DMLtb-tK55yM=nr0YPnlgv@g6a86qzkVqatR zPt~tg{l4HKo}z4D@DPZyeX91j!V;Mmd6~KIHa_q(^{DFmZdpij!n>-{0DGfdbL^QJC%^8b5OR*q92j;$x*< zMuHFpgQytuv8rri-9ag$AFE?)ZL6gUSv(JtDSW9cTc8U!3Q=`13^s_WgCR+Ps5&S~ zLRN*!H2GBJ{_R%<8G}z%MGxCbrS$Ey&^HLJAO@BQYM9EOh0cMf{Va5@Qri4HbPhrm zbe#ijsqY+!=;xtxmD0CEN)NVugXkOR`UVm;r9-N!XDCM1A=Rs2KvW%40|)sYKwl_* ziZ7I%0T@(8sQN-xbql3v`a*RN?MiO`LY;JSVYAGMN-^UwD`f2|Rm{%+rFyzAs)*@3@pplN)sIHf?u?v9xl7 zjysFmI42fO(t4n%6`~NV56HMo()|bcx)k21-S&;T(k5s(XoA$eQM(Nq2;HQ$Ozn~= z7V}|izMw7c+s`Y;+?%xvZ3<<@1nmkZNZp&Y4PG&rLAgb{?WhoSLA$66Quh|^He?|F zy;av~8#sbgzEx|R0tKmjtM1;T@QKX!sx-M%=kCwC|6g^mbf>Q9BDR?-anMxlcg_$h zK{sR|8mDT%EdlAsRPA@pRnq6X!e~Q?f}9R#Obqw(;*rFokkFivx3t>G|mc6ZzisJI5-_b6bz!`^oN7f zDMj?*CZ{(Or_Tkor54m!5}ITJx5nIvrebfR<3SY zxCj?CPm={Yw?wNfzFb{UTA(X>Stm3XCoI%{mkps3bjvS@%7xnRvO!cX)T~?*w9UoT zMIi(rMiq2P5F{cN>8c*q8qikm=_29+7*&fjA>mZvlf_|hn_HiNE(?OlF4q2-03y0r z2KNVatVNnE)wvB>w+8k7>ZQ7(W1$Y)T1dB+XQc+!w{Cgx5D!tbT>E1Th@$11UGhLH zLgC}t-UcQn;;Mk>-3<(gPJPa=0BDkI z0lK&XQT3dzYH8yNMAdV;#vR~6R6Xa{2V|k=!*T|p2@IMfXFVT=iBdE@uiKa0@&;RB zySzzkRoisxR$vfK+jKE_mAc!t9^yL?qX`U};vrbIJq%p6 zT}`%!fdf&sT?Xz}iN9)zv>lp**k7{#2Xw3K^p&c0R{V{+w4SGK`cMaJc4&6Ca%KQg zu|snznCMint>2w3{f)Z5w7Wb)vX9@b{Yju&%RYX$W}hotyOwG4s?NRPR(jKtny+e3 z)-vubC1m!7bOO;=(4`ZQx_d)90nxfQq?49ft}b2+*{!9G8PLTHXiI%|1Cf1Aliggi zgv`DWZY^z$fX)FRqWg4(JJy4U?hE18Qs{NN)XVM@WISLu9w0qmq>?vv?j64a5_{hySjE6tiC^CGQ%Q(I(B7vAV*XqD6gPQbO5gUYi;zRRV-uwE z+p?UT&REo>$$p)CIQ!_g>a>>obw#_v!*UX-k@gNYo;*^`QS}Fd6M2fNgSyfkr$Ed< zs5wr}sIo$o-qP6YYBe*iyCw3Tud(gl68Y^1h|nz&Deya125Tl~uZ~k^)J=|bwT-bF z>+#7^OSj1c5t$re@_$+p=+5li->ET!?u>kF)L75n8Rgx%1e8h<=aTsnr8P4BrbW6< z?Y$~H_&Zfsa(4;CM_$!1didBe_CCN~GxYVh0)?i7_0bmx^~LXw8hz<-j{GC-Ex;AS z8%A7S9DB{x9PocXeC$=D#&H=DE=tF6SRXZdtUsD!0-=BnHXyr-Nw{lTROwb@5R0cp zt&b_3Zw;pMz1bbVS3jx0x7GMgXBYW|>Zt$!fW?i5~Q zr|$z%J9nA@k$E8M*{iVE$uNCqWn2HC_WgWTet`S<}^*_M7c$gyU|UlIVY;TB~fh8qp=nP9*O*( z9ik9)dv=i6dnEFEb{lh#M*gG#{g}$IO~PoBY4d30k}wD@EmxLS!BE$gQdce$Tcyd0 zD7QMx{;1BbUJ+Fs&r@SsiD@gd1AkQCt6Lccn1?7@8Tkzph;LR#Y?ve_T1hLbvS0s+ zm{=8j!$Wx*`NReyvMM66okiQN(`0Rw`y%`MpVXP@+K4TXj7#f?!`4%g{#!Qq&+5lD zPep~+g`R~(o{LrMv%CJRdJkG3nL?qukav%1WPMb1O!)!LtdGbzOO%(S#-{A^KdVOv zZ8};~%-a-IwP}(R12@Uw^|q#v^|nO%?QGXyRIi#X5!JqL721^dTvk(3KOFd6WGcP9 z%YDy94860B2Pk|_dVI1Mq{Z#ol#)7i;P$d5E)Q;xs;Zj=#ggqZeg5PH8PpxwHzoC# zvvx$L+<;vrqvma!1Z5z0MD044AE0SR#If>cUK6}4TX(Ix_^e$=Ym(JqSJb>!lc1~z zyQ0?J%MU~{V%Knq*F@raCHvKQ^~-^;M5c99JxLy~M8_Ooet_UBQRgm&GrS;8y_S7A zUY#}Qwa8R7)sqzRT2xu~f+UgG#0yKbmt^w4)p+Ry)mIIA>u3kcM&PZes_X~JC2vJ6 z>pksIG85m6^hepoiK<7Y+QFE^AZG7@TDn_l2Ek8ihfrve>jWP-APqO%WRd?DaAwiiu|@6MC7X|?P%=-QT|ob zNp?!wv`Le%que)Mc^hheEvZFzGi^lqkx09%Cx{RN-HrsrcSoWscg5O9cac_(L|uE^ zRw$;GBT;={GKDs6(`3BKU6=h~lKOGW@us3!IF$z4N&^#3wri3aT0hbFg`THqnrQs- z2t?CFLyGtzn%bqwB$K;2`_7H(2c=2I9}(J#rW=hvB0x9*bbB@sg*OI;APR33h0@D* zG9Wh@m#>BBCFpty(#x9+X-77#psn22?Wo(psJh9Jp(RTmn@rPBwnzK@?6lcI1sYR&2YyEGowrFo=pVx0gl5mfM5q1;@(b zF(vd1qFk#6;;TeZB!GP!%Rfj6surMrxO%~~tny4&~@ zJA^{eZLvWV-fjE>1fuY6c8S*IwbI%&cWYk6W zee-ctoo@X7&2i$0`-4RgYC+ci-=db4W`x1vAu48s z!2zXG7#t84Gh}dN{|tZiR>rg!!)6=pat4Gf7-Yqw*{0H6*ink;Y(tWi3DsUkXif+W2vN|v8ANoBscAqxgs@&A%Ac9bHz#0{M`9l41zxyQXl z9jUq0RGd&ak)i1*7A?=VPF5$EmIrM-q|S1~QZBv$(YD;Mc*=-$6hj^hu7NNFbcTSo z)So>-L?3gm5m5qRh0*Tf7D5zsq9qvF73F3n5>~iowK+ab8cpu6z7xk&v(fmg!sDeA zPXvn~)PgSYfYg1$%?kP)!q6KMAK^1!(B6iXj*OTEu%KYG+Ap(x%IwtMXIh1$)qTqdosif zgn^(l5Tx#tA!b0-J{dx$C~ZC!LIy$<45HGvr$WdSx#U3hsW9D((z$hE-a*KMK~^-c zGnH=MQHtogkbpX+$7HJ=U%sFQT&nUDz}w1Re|N(QF#GhvMYQTt3-BRWZ& z8^am_AqzT-KwIk92oTYYVU6e{o!J!fJcKCdW;2NBCR6f>9!7SPv5DSb6!f>?LOE3ODUqyhIHFWB5#ZFuh}3pfk9OE+FK0wF*3I)MRbed2847gdXnc&?nO6tv2^Zv z6WfJ0wqH?gGupjAf+z&-ixnxv#oG+01absO;r4Q&3=U}DpGYBfw;T8V1cY8Nx)d~t zEF3DkVq008&S|p4MXIfGpxE0-3DEJfYjX?R$Y*8?+p8Z&eCM* zW#itIp-HxUpqt7ds$Mq!W*4OP%cjQdb3s(SYo9^wn4Suiv!!}0eJUzFO){zTD5hT~1+UlBrx zf}ykG|2N4$?tDlwvTqvBhZ0a-#Q$#@{{|Lv7@8ITzh(RtD5Z$LW&9i1F4DcXLo7mA z0S2c^UU)miVi#SK#PGHcMw*qx@OFsBE}GlCckDVz)_{-&gB5a(_m1()B&CSH6PC#? znr~~~4Y3Ge1sJT5&uZS4SS(3Cq8L^08Xt=ws@@H;*hTYM&3onHt3(wTR8^wty%5&a zMbmpG4PLE8(|e|)d@U+oEu?0DSyRCfe{fJ$K-K=TssgI^msJ%|wZE*YimL_Vzf9?( zt1t=-nyS$Bepyo$n%+15GbAdb>3zdzNX-f*v8q{WJ}~|(2MASQP}K}oACy%!L)8Z+ zb=R*{M%4$Vr+oAvnwqEP!}54FM-&X>)f~|e%Td!D(GN?ejl4nE=7co)*yR4%&kw1b{imwzJac9U{VsUa<9u^Tf0jy zn*cymePZh5+fB`TspK=0`_eB`GJ8HVv24CgY{bCNjlYP6C3qh5ruOva8K_pvxbiE%nI~MD*VwS(dtr zX4@PXSLQLL zXgXrrl-w2(w!;2s)>W+dCd?VgVNfOc@tY9nl%nbz<3ITX(e#aRm+Le{-EWQif=37| zz|d+eukOAz9qkuAQjF}k#(mKPQu*50U-Uo@!vIM>yf$tXR7pO(Hg4(w`EWdM2z+lP zAA;`4(bc}z7$3{WfyY{BNJ1PRGnzlOfj~l>7-#q2uYOiPF>V@0$$S%I|1z+v&3qGM z=HwG{FVIy|-;G)E0kyjR#<(eJB*)zt`-?H^(9Vr-JzcdVv)kgdb>U*$49RRtcFYX*i=k8Erm>YIHYN6VLtV8bu_>{C>kpz~O5DC< z;TKi|Ic#dSXomV#{nT=!lB}l2{v}#ho2;hB#~xSs)EP>)x+fd_kovrIPr23RjK@83 zmD}WY)snRCiECX-0BQA}xUR2F34H23JQUXZj2V%F$q7-_ttXSp_7!duT$u-_Gd zICNI5?b|jX>ViEah6SlRs}%R{BRK~q!XJ+PCu50@&bJg4kpB6x1>4;e%Tl|dU3v|6C|zO0 zFbqc(b?3!J_uXGC3+?=}!4jPyJ9=&bP~42l^JBX#izkTA1!W^74#8kVbLuWA8_|OI ziB^+U)PlNT80Qw$T^M(Ahoo3nb2n5Tj%w;IDwSPaP31*#FBuMPx~0h@ajww?xamgK zM`HhJLpKTVM`M504G|HbTUbEqJ{nR4NFY8M`;BQgiP@#G-&{g*U&}#O!hdP(cb60+ zyEJBZ`Ew?EHwp0N*$cDPB}12oNy|f8Ump9j5{QQ7agDp`2GOuw;_(ct0a}qY%u#2R zR+Kf!#(G6rgG`kbu|I8fv+Kx;*q^q#$xM0NM;aE%!U4K83?lk?oOdsqL7IC!cB?;? zsk_q0p(%lm-J%L2yE69Qrhv$*|=hPG0XB(_NgkCR;XFU0lB=tP4Dpr(s=<}}tG1RKlyTo0`)fN&ZGG-oowbbnwrueN_4E2|!Bai#cyEjSwJeCp zwiuBavdHw10e>m$zfjGrf2rJzjPpxz-d%@K2bq^*u0!TH88YUsX^Ygn({_ab?P2!` zyJEj*0@1K5Ztq@-foRwj^F8*NOxvD(kre0tp1re3ol$xR{Z_uENf%Nj7o}z-s zu8$xpZc6+S4MfFF2_wHiM!s*FOiprlC93wm?2cusHruj-UtLd5c*Q7j*;hJxd*Zig z5UN2pj3BCSPy9&^MD^{7-=_7IcBf#SoedD8U=Wp#O-cMNjZ#FXh*dUE^p&37k@)wv z5D@@6AAzX4BlrkJ)g6gH*@39KBjGi!_^7YYREdCdBmxFyzgnp}mU!U2LovcrLj-`f zx{rW<|{zL1cE~!(u?1%u8}hyvqhqb6(=V;29t;n;*gg z!Vu6I0#bK=2n!Ic^Fvq+u*=7S#BZ<$SeJor5J6-Yg#LrbE(rY}ATC=N`VY}87@8H= zEe!pq6w!qV{g(+cKxpxQ525~jc@Wwa=PeGwLv34~p;{#AV_=#rOL8l+f2>vuOUn{o z(8=Hr6fZ0fUVtzMbb}9~ae3nREg%|~2QLg1TOTWn%47h8s5s%VvZy%WF(;}`X;7N1 zOma{9aT!F_m5E>02Z=?EA(SE1f=(?+-Nq2gAZi;!9vdVUJrN=qLKF<5V$l;ek}u*w zKrymUghVz-#${C)QV3blxfVorRTxqb(N!{}_SXo51lMFAtx=OpYeIJ5AzOhpiQmVA zs92NuyH8ML5`XtONJ4upxzA=`h}OZ-x`g=J5aN^~x;BLP;51p6HP`9TJ2n=zIyIHL z9efEP3%cHb$UYr>2_pM+m>z?Lo=N<5GK611mvBK``b=;sh^A+POTmb@EYAd=4i=wo z4AB5#1sJRlpKc73g;Ltx7&7gUG})ZwwtJrrq2}h`(jnr~XG3^GXa${LhVW4nm7fjq zNik}l4e>cddcGxC1R)CsS@G$XkZCDJbV~@&A>z`l!KDzQpz92X=vHy*MRL}Kk=+`6 zIz;HX#9vxN$bv2kKxCgw{0SAbl{ukG${iv;+$Jgayb}LMa9g=i@!+-)m6Rg5Ekxys zY4T!{+v7cWA~j!3D%>9`IZ-_LQV2>2t)Mdpr0z>0C_%KoBtdB->qP13ju4d)vY_)I zXiI%mg2?WWsFX~1qIhs;@F0XJ=sXA_x-$eNi0IDXz!QZ|dpURzL>3Gtiw9p09;B4o zFDH0V_V_1?2X`k~pJl2~_U(F=)bB1gDjwV&Vvw2$?v@e%4*B||G})Wv-pU4UQ2(oX zZ^F^^EYzJO&fAxb-=Mx*zb|y0hbYPD!yx7aP3DC#942K zaH9?~Z%X6!G=6fLyqn|>WDA~Fb=B`CygHWK`;(>d{n@)ut6$XZ58dY>iuQ*Q15vbJ zMohlAJz3iRFdOlVI<53!Xq$)fH1PukBJ!adC~Z#R{a}*&#D~r))cjb2OvdmOG2mdB zd=TRRy5R?@doXwbMC(B}_p~`REhV2Oxi7rhQ>prC!iRmL_Eb^(S%^powV)ebkh-6R z{(-3dETqX(rGKA?fP@eQokgH6b^W}McBG@9hlo5?BJxn;?^+;aK^KuAvWF6`++<3F zh#pF~YxyCsDET`t|4MQb^V#8z{QC1>N!(U0F5*NwayYwillsvmhrMEXNIQoUu3Grh zMX|i4|2pB16VY=3fv=M)`_ow=+B_N&wD=`)gd$2O3fsecwHFT<9`&;$ zLT6~2+?vn5(%5pddRV2m=GleI9o|s+>Bi)|elgqlthz9road(-e^Y!cPk~r{XVzrD`dQ^lZmg_3@zTdH*8=sVH5Xp69G1-{;#0NKO~Yx!OzeU}oc?=Tr|haOTmX zk_Bew`7$wxN*7-JbEzY4Nha88~_1UH!>e7?f|95eTvGsX=TT|93QMNwM4fL2Mal&k4Hf*OFchbguQaGxv z1lq=YRr{kKA-*xs$z^TieaYLY7aCiyZE{Fsv`+o40RriM+UaA>X0C z`~Y1qp1se#=Yqfn5wDa3h=6b}?TQUk)VybkNsPvlm*j=uHS(g606xP@ zIguh#1O?)@(F7@q6p^NYf(QsI2&iBI6(cPQCQ9u5e`^Yd|M%(l@!K1T(IEcw5~ zA74^fzg-vdX{>UuEdN6{)%aBPr)>14YD}rBpiPvdkj$V~c&236|^o1H#U{Iw|b(>d(CTaIJm9`6&(R7>YaF*8u4J&slLenr+I-x2; z)v&TE%mAL~RAhxubPCzwWmU#u=#)Xz@UkX@rr~8xSR1sOv@xYLxn1S%!1h(xUaH=% zDr#(p4aPU4l&-d;flv!p1f=dLRe5Sa)Q(auPDfPJfnl~HGD*P|5qcUp8s@841EQRBgZt4paJpz+}wlsfAKt#u>CTZb6=uwg; zcd6WZrK-;>URr-c{{i)bi$iX#FJ^NuQ+18+QWfnAPijIZk?v*7|8be>qiVA-TArdi zQe>g1(Zsvr3*6<6%UFZK6WaIvxl+) z-&e;jdZ?^I;_IQ{%EZRkLn=Mpju1q}L#kz~!dp%SI47I&1GTqyPPyk2NOOXp5-ou= zNBs1%lOc5GXA3S@J4*A*%}NB#FE=Y;F<+$}e6tck^HrzLg|D5(sJuk!w$(>;@w-?4 zsHU!Gk8_LtZW%PFen7vW*2upbH1LN0H`Nz^TVMaX!NvYV1{eGG>o@S00Ymx^_)W3@ zfZF1>i@zIGa&`I-E)E<}UpTo&Jr#!xE%qI7z1Kj6;^6ur#ep{ze?4&EZwGfR4jxED zi1Oc{`rqHue^CAPsJUrq@zxvb2NY~4iZ7y-uE5rD!NM|-2XQN28wLo z8-~;my0!11>j&2szdJ-qZW%DB{w4&kN83O;eSQD`?SK6(eQzpW{-Ym$=enAH18=(J z<^f^Y{p$x`P#n_t*EiA5&3%U!Zyb2j^~Ia%_E02gY-p%B)HYr0do$J;fL;0x9Pq#O zgNE2P?0{sbG6osKP{!7`-;H)OH`QPNoBBbuZptS*c0O=(6U1RlRAo!=uo#CeQEiHa z+0N(0v$q)N~98uDm(Qg!THnCn`tNX;6h)9U-OH?L5){8HRm4uk(b5iorR)dx467+wVp zA?qf3qAO@Hj;Un?2(I#t!i%T%IbohtSS zh>CTpu6JR0LbAxG$qto!cX|DlN=J=%sEU?_Jre49Ne;W0-+HzBm8#txOvh7{?GB~` zQMOxEpHX-$vO<);vpl|5EmYm!DGNzDct=&bY?Zg^;2p_UuPb^`ktX|9?r^s6I<>pB zUsZIr`L9CSKM*o9gjqo6br6jQ!b}J0#sQa+jj52O>7dds89|7GK~y?(P*pa!=AabO zgX;8Z+iIyolba4HeYP)^H4t>MMXg(v_~btohY5LJgHS;)FjnI<2o+`s+0AU^m& zRdlkgRLa;s3}b`P3ev$63js{!55wR<)P5KSS1D~C34?=>1>N94Tj~b~B6=hYu2RN! zROxf<*dWFRy0L*oP3fqr>KuwubyS_*Js_%%s$O+|1kguHU*HR6fd_-C2vr}cs+(l_p)ORVuT+KGeH6sJUn||pHVblgtV#yRQHaIJfZS|JL- z+JN|FxbD%@*QIcTcDpd@N}HhFX9-ewgm(KZ5E`kqOzn~=mhQv0`+~N(TX(OR?%u9l zXj3SQC1_VVLF(SFZSYEmampy|c9lZZ1?_q+NZnD|?a)B%dxx&kHgE)~e23OHHwseu z4&AX+;fT!ksx%p|bN6Nwex*Jvjn@_JrEjK63^YNr`<1N_gi6r43`FAu?RO*~1DT-x z2DnPbe3$m#h7bjVsF?3A?Y&JYqIYTU?NXH(=x(juCIdni46>s6Ze7{TcS@%B-TE}y zp-YdUiCWkBLJ4`$3kj`b=ZzikkG6)7yF?yyeUCyHv(M&T@4vWznq{$SWdq}J5H&yXREVIA6 zap>Uw{aDejADZ3YPrXu_qANPsW*UemrUp+yvyH9|u%!ffp~-w-N6ww--wo+%4gKiuiJAHv2bfQlF(^=saZT zOSL~DfT&oi{Sg7A)uobBF0dM)71=E}sy=;Ilr@NFS7>*br4{k)3hhq_pvY)W2)9}d z*nL&@!HsI@H&&H3a5gflwBH$>V$<3x?RQ2X8dmALa|&Z+b!n6)&*|LG<+J*$f+{_y zE81GGG!i3j(Eg|h(J9b{8%U=%1Y?4z+#tpjhc=QiZwzw_LKF<5V$_YnsFWhQG0d$} zBQfeGzbv3hQV8hc3PjZ=UDepe6^N=$x`{iSgQ(i%7Y$^g=lvofgeEX(l0^1=a1*6y zdS16Ixit^A!gkG*0U^8DFHS-ZgDN>%Z4UmT6jhsb>Xu~?O`CNwSe3e4wC?Q(5TgkU zn&KYxYD;ijBfG?G3629%wM85^PU5eTMB3Ku=QpYGwOhk{;UUd$)$DI&i2;$>syQeO zcQWkycVsPYRwGM0$}W*@{toRA3XQaE^LJ==yRyM+oF=d8+#7DaH;t+Js^(}dj&3Y5 z@><9r5Q76<{s5`_TF4(DT3-wKqp>bgx+|o!#x_Vm7bKu9_2~>mc9$ldxn_xx-66gj z+n@kl!T=H7tt;HQ9z=9^h_A*%uiFJ*_MjjRfSm(CM(}!wFA!C)>n84e4_aY&&%#2K zyrpw*`+bn~_bsARIv6Xl%N{>>geU~D;vJs)6dF#`|D&Ek)p5ytDp}(v52hJvPgC$B` zfPoBiVpQo?Q;-f!jGCQV__6H(b^jLWX4MxLueq^4>p4_?w-$DR-Na7IzeV{le3_Pi zi_)frF*3!P$h5pKn>SRAtGzGM?(oe++Pg1m;m!&mGWSKD&n~>-WSEvyvwr`l-nwRL zrr0eDEAnUUZ1foPiq;z9HZO|pxii+%l}94KH-{($-QFA|x*m!A-rPpjqme%m zKtH51Z1XCbWMVuTxx5NO^UIZ`RWQ_brPP&s!=`DnD9SC%y8T&wr_rLQq76@tX)0ZN zJRAOJby>~h!PPuO(c_Wd1Az?m@rXT;gh^9rWoh>5pVd!lmj>JLP@YCUb%BU1jYwUW z(sr{nSsCR%%Kq>dbxFE1Vpk&`Y8G**dMeV-W-tCl{jkYXQK4C(b0LxE(yP^3*OKZ| zw>mO~LZd?7J*JV>QPrvC2Q;%fBBwm2yd*W&Wn)WfVcoiuC8c}oqN?U6B&CDv#Cct8 zSIBD{BE2^o@K<$qlMNBozGoHMq_!!W_gD3U^EO4M(#yN-wkg8(u5Ua*;U*dJ`CgC~ zw?w8{b?0n)61C30f17I2iw9veF6V8Dsv4b8A${5+Q|eD%1@7IN-E*7z%cWZ*Q*O#G zflvKYs5kFYOe|2o?SakU3=;FlQl`^-ySt=dO}cg|MsX^$MOS_ zjMx%f=QWX~UdcWlrv9tfD~#?$J;^MuM5neXKS1!6s9pQQ#a@u6c4fnct4r&4MW*6J zJvrO#iYm)iki@b}tnirjk|cyZ%Re8kx~aN7CmT?*%buvJYzN6Ndm@(b&eo~S$#)}t zAp6Bg)v3w5QK1RbT;j`4$oH~)Myktuy;oM~X6AckkMID6?@3=S@q)CtKWl!w`p(7s z%XVa1(#8Ez!_<$82U0O=dV2W*n)XL*U~RlffFI7L+^%XaIvg@zGkGm!4o6j~O?4nT z4o6MhsSiZM;fOPUy;*4{K0lh}N2$%19Szfvhw?P?7p5RGMd?iuLNTp;7S(nm zXJ~U8mqJnQuUX^K>W7WLiYkhQ3u)jqY2bL24H&KZ)E*DU;3=ApNB-;sqUpFKiyxq= zMVbsZx!bc{qt*9I!;Rnnw-8MujNku57yxt&0Eog7#w!F-IKue-e+zNQNaHfMffyy| zMhP;?k%j~$8&uF%KFw{Ho5QFYX~@-*FHcXC(I$6iwqlIBq%_)8xa-T)rEg=5ZfjLQ z^bK@<1JO9fc+Z0<9Am8KjX7QVHnuD(XA>}pN@vEFMWruegXk5f%Q7-9j0<91pc@y6 zs&U4L2#Bh2#vcPfRE?8i^Ezhzs-vaH@^SOz3Is%2Pr8-E;!PzbtR2Z+ME zjbDmD6yD8_(2G(y(YP%piey-z8y09wE8VdPM0BEQ+RTcUs%2P{f~O&5LARX-k)32J z+)F_a*-63E)k2evzk-Gk1%s%h(8;F4d74sN+3ga{8EKN4+=E74WnWXCLDkIo%b7F8 z5ch^2L8t}YXh7=T8)6Sc?Y+{Yg|d}8L;CwbcKMxZap{5J93GO2?)de^Cmd6?7c~sXNX1V^m9BlAcX7_8etQOX=8j zqg~E`kOhOR^k}-NbXRngB0AlWBqcCfiic)|z<>}1otZ&IXP652+5tp#h6F~*$$}4s zplxYg1O{1g(L;uvqD)3gZDnf+X_f$=Y20RL)Gf_2 z+W8)Y!5}M3-7Hh#cHfjDJIk>97W=nKlQ|~$h_`<$YR)nKZAmM!|J*QpA+&#bO|BEHEso;-}Wqy@kPG5ZwcV zsB~|k@y8WP5nbpECZdGLBKqLXB^?79TnVt@7kkzH#1jdL3r z%`)R}oFRe`bXgW;^;l-AI@+;=pg7i2vYaS5J@0vpA3Oils2CVfdnB622mN?Qz4LwTyr4%R7e6v8QiKc8zE%D zAS;?znMyYsDMfTuNK0+g0Ry2445G3F-(a|rk-1GNq8ki%AS7YYlRR&7FFN1F zGPvhWY?t3yzK1fKjdrh*APPbIf<+23@n*x>fgAx+xTRbu&H?Rv6e*Bsj@S?WBL(!deV5Y|zCANZoB=Ee09(wy-;B zCry@KHtvlXnq(sgx~UAJ>Sg0Eb3tmqY?`>;FNms_4e!%jFBr{sKXNol2!KJ8MBetY zCTVxOX<~<3lG>=+?hOM%JHpI|a4YEY7>Mi+le+6u&{p=F$9B@}&afat4nr>_5O;<> z2Bm1)$=6tJfrL@DGc1tpq|2{_DGNCaW|csE#rQ7?C`I%YH)FMFpC-FZZohX{dur}7 z{(RA1oVDBdi#aGxOTsQlVJh$D#A$;RMD1?V@Dyv}_F}cy!?c3v5$JjZ+ERbx10wo* zm{sj1nBE8`g)k{-ONg2=uRvT1vvH$!|uGz*4i#T{>k_@dNS_UDZD;*PhB ze^m$}3WmXo{of-0xKks=$i8JbHA+CW7yIuq{!J|8Ff=Rn-(&nGD5Z$*G5$?#dl}x| z5Q`AK0E1B_FYFDm*j|?;G3@ohNVAd{_J&w&uetYo+pd#j4G38<^g=HD-Zp-jq!iJ& z!!p@k^YP6)Ar>Ke0ft`4=QZz0ES4l6QH-j0jE_YSRqupYY_Ive=H0UUDp3UnRh6iE zH-t5H(e$oKgHb7qK+Pn07UJfkYmr3xpmlRw*i6}8|cOcCMDr2_l69% zwcDR<699;+!=^?)hJq@=-tgLFl8hCXoega7m#pWy*dJ19nK0Pvp@2>I3S#rB4hm zc*G?gq-)3cQo{}j!gipu9f-nX#=imq8SpW~D-b72;lD$+>|iq<=<)|>OMS8g5&d^a zmZc8TwNH)z9vQ;!ptCzjiuly{m%t#ZJ~jR&Fo>#8jr*>I0YIOHEg^&^FldtH=`+Jc zugqgg(e#;VUUFMR*b4gtTLV9F| zmpnrB0t~Ij^78Hr)7pO7BgM#mVceHJAeFx?4=8aM93=VhOVc!{l6?53+vAEe$%kK+ zohkVcbVm*f5&g=@M}ntYV@N{$O1$|~8we!C<0h+{s;;g(UUs8ozT*-t&VZ8nj?0`} zA-4q`B=wDmdC@UX-7`Y<$c{`^!)tjE;zzRGh}hqAQ5)$Iaf|B09w$w@8=Xy`rrxd@ z9iQl?q_xqpe?8PeOIjNpr_Bo2+6GB$>?DD$hj|eS9hRHGSDRlkjnSPZo5S(bbnc~%px!-cBLm2)7uAPcUOU= z%oEV=y#&$pKrELNCDK_e^W?$UzlMUS47%4)AeA4C{cEULX2O(M+w}lR89HdM9tEj8 zB|g)BR0Lwssj;?i=!B>Xc9PH&r0&#G+@-5zADCF57W>g?+)+i{nQ_s52^hbaVge~xH~GlqY-uIl*%SC=2;Sdo4x)cFY_tB6dKmzg6*l$tKl9-(z`)wu^ce5O1 zCH&{dexFG(vh!p1nb$DU&yoONkli?2UDszpn6x~k^#!p%HGybY5I1pG;UF3oNIYI_ zH9(89uV$-DON+`HWQ)D1tU;#AqS&9i&ax}YqS&9i&XSq3*hd;Yk|hLm2^mCmah!KA zs6m=r9J_r0m8tu`?w2BZ91mO(m1!$JEJ2tm&X1R%8ufU zWwE~`htLYT9)Z+d7W+$b5UtB%?m~I}XG}*i){5-AbJexAE0}S1N#LP8jr|G%BD2Cd zL7Pr#vMSE)$hOW^S2tP}bD41+iaJRr)?{__)PL2i361j*MQh@`yJiPbv?k`7U6!X# z()QYH)jV}g&Dyevw7s@0B5kh~k*ll-0kA&%)+6fbp6f%rb+R5`ANyNo5RvsUcO&vu zeVifZ|y)^or_o3MV!4^g#R-ew~)8~eIHd9 z)bhX?s*`p1=Gfobf(UPp5uPS%OegX8OWE^}su{H}l^YZ{zZB=)y$E%Xc`4>z$OxwMM4y14Xe zT;X1abQb@-#z?G(A-V>-aeyd%EsO(1;cGGu*%WpbKkZ^i;6>#a47v$Rp)K{tU=Yz= zvA~D@KwUzzN zac7yMZ;&r9@LiTk3I|!4q;JIj6iH=d--x+v9WI~Do}DId$GP{iV++)lh^BXg-OiTL?F;h~q7$I&1ZYeBg$9V|KAD&Dd1{w5 z*&pXV$Szu>t}N}3{l!xk>BE7Lbs-djP9ccG10m~zC_E6dZWrmx!H{(!M8O~`eK{DC zE~SVbl=&|1|8W=b;UT|r83^NoZVwF-nup>lw|fOqbtrCa7h&_A;O zUaWpz`bRJ#4-xrC$a|nv3VE+aABKwi#ASa7C{u#{C)tUoz<^VCrKZ7|y zH2pJ}14Pq5#T->VY&XD<$2M8O~` zruia-3Z;mC5klpsH4-Xc2HQY{3g~PDqUy`Arw38>W$cezAgaC;+sMLHBlI4%Lcbh9!Qngy<6J zf(E4Su*5HxAX8@fR?)_GSTeqXSVjJn<(M&{p=N15q_RVRW*t)QX)( zW_wqtE3!t*@cYQb4~!DzMkapk1(6$>;P-jr_ikx2Cdu8EsOtN@-+#GGjW3N!cOiqcP9QU2cqiEgcrMFnQlT8vZt1-Yf2M>QFw^Rgv4)+ zK&g~?Z+B0ViAgT=-tJD#iHX1c?Jnk+6ub@55zu)Xr0%5PZ4j-Kg15U{Z%+TbOa zx-o&MnjFRiqH1y&6NswGVNBh{I`@dTuPNOV#>7KJ?g@?t5xK`%RGS`Ya$l00;m6d2 zn)fAq&?3g}A!E8fxEP`%pz{+*-TQ-!LA2fOZk{(>PioFg{P#OO#c;Di zFhFPpU3Wn0&I-W*qIH%8gZ*Zpr;PLA#BZMmVKwIjq03!QvutHBU-0WZl2vIOJ zD~e|aD^QB)>;x;wWaufR=Gr`Q4uIs`a-(9uxgmZirS4qu)}xXrdZo!@Np4Yg$13$m z>9K^ja1uMc!~_e12_Q6r&i^197bJd50-|w2m=C?AqYKNTVgWFSiUk&yMa2ROov1dY zx-@w_$vx?vQb*Ot6TgVpNspFXqF@k}9z9`$ z`6{l)C`R^)kg@8-DNBPtA!I@4PY~IqA*w+{mx@2_uMFx0S7amBka$;wgup`<{uPPe zqJyYdk@yQvP-GH+!C5EKy)yA%YeBRQhSnv%SBChe6w#F-zRyXMRY`80H)ZJ@s;)}> zw>amBEmsE@L8t{?q=D339ReIg?dss&b7aJ862BjU5CxqrL0jtgLm;AS681xOZk!{w zd^*??LKbwR0g-(=*b+qc=`c6W5qc)^cg7HQ0bPy-G3hhGq#&A}2_^+2UZp$}Y)85ovA57X?O!{01PYA7`vrBKjr=jw5 zAwDTa?Q;AN~x!j!CZgYr7>L9W?#N)YX z@?w(P>1}r|HD63B++P(rS8VrE2uFyHfUYATbzchM2%`0+5RT{C{rT1qkLOz3fzEay zvRe}$k07#JB_1Wmoh!E67HkL6Ea+?pBDyVvBZ%m>V7haKUbd#|jbTA#;m~EV-OIst zl-kavO~Q5EpqgEY4Tc<+mmg1R(-SCYY8XK zOHp*5m~A&9SKT}Nb`mwu>ej0+wLEZxrx=yHL(GAw+$}LTLhcXFlkvTk-ML=fUi(&A zMhx~=2sY{<^Okg@mTsJ%ChsJ<{n@vlQ#Fm=Nq9Rf*Yf8}H}++JeopHLHGi6RsgAcC|ChR>mfJuw7D=XB_AZYkG$Fosro^}7k#4kLQ(r+h)M{xpmQ-u z-4Da~K-7L1qVhr+-;ofM5Tc;#5ok+YP+mzpGSDL-Dle3%Jev4R6bM<+MJ0&r(S*A+ znb07jM-whle!yEu{;JEzN$z-(P29+DIzLY0)8s}XPGlg*vcntI<<}kaisd2g980)E z;ZNPf@*@7z#QrfM1PlV7CRO$au|l+YG9qa47;%ImO21CByEmzS7r!p6m)8+ri~3m+ zq0=W#?#T1Uj^;kEW~%g#Jlk%$rt2fW-WZeDFJ`~kqOMHG-2a78J8j%vZUeDTtuhePW*A z<`>YeN&1{+zkN}CP?zQXuM4E23^B`dq>-O#*at{vA~{=rT_8_*FlG6;msBU!Ys$%@ zk_o2d`S>u1N-mg^XNw>|4G~E!KRw&Om7j)8&l~sC68jjz>G{*#Pa*6B1gGcuoN1^R zBrs;>O`GceS=a3x??-M^Kd<9~`%#2Q$o=80JiiqWZOaYftUMns@fUJj{J&vTb6HdM&W){s1W00B%*9(HhQOe@cfneqyfL~ zs0;<@U72s#PpD1%~!QN`4Qr4^PFW@N8XmafO=v1>{r#(>f#sj{--_S_yTTy zA>Xj&36sdXsTcCCYReDM^+LW!FZ=tgK4OGz*_>VKvWvFm{iceCXxWzcug^hrY|A%y zpF@CX*p}zVL3XR#NBX-n>$;mC)b1>+ki@q$?{7M&BbD;0d*=b7V&|v>yA}WI;qEJ0* diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index 4b4b2f93..56c4c31f 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -29,6 +29,10 @@ pub struct SetModuleConfigurationRequest { pub scope: ::core::option::Option, #[prost(string, repeated, tag = "2")] pub enabled_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Initializes an existing profile's bookkeeping currency. Empty leaves it unchanged. + /// Global scope and changes to an already configured currency are rejected. + #[prost(string, tag = "3")] + pub accounting_currency: ::prost::alloc::string::String, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] @@ -43,6 +47,8 @@ pub struct ModuleConfiguration { pub inherited_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, #[prost(string, repeated, tag = "5")] pub effective_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(string, tag = "6")] + pub accounting_currency: ::prost::alloc::string::String, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] @@ -91,11 +97,11 @@ pub struct PostTableDefinitionRequest { /// Empty means the row is identified by its id alone. #[prost(string, repeated, tag = "7")] pub row_display_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - /// ISO-4217 currency the profile keeps its accounting in. A profile is one - /// accounting entity and keeps one set of books, so this is required only when - /// the request creates the profile, and is ignored afterwards. It is unrelated - /// to individual MONEY-column currencies: tables may hold money in any currency, and amounts convert - /// to this one when they reach the ledger. + /// Default ISO-4217 currency for this table's MONEY columns. Explicit column + /// currencies take precedence; when omitted, the profile currency is used. + /// The resolved default is saved for columns added later. When this request + /// creates a profile, it also initializes that profile's bookkeeping currency. + /// Supplying a table default never changes an existing profile's currency. #[prost(string, tag = "8")] pub accounting_currency: ::prost::alloc::string::String, /// Initial compiled direct-rate provider. It is enabled for each initial @@ -106,7 +112,7 @@ pub struct PostTableDefinitionRequest { #[prost(string, repeated, tag = "12")] pub foreign_currencies: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, /// When true, the table is stored once in the global physical schema and is - /// visible from every profile. profile_name and accounting_currency are ignored. + /// visible from every profile. profile_name is ignored. #[prost(bool, tag = "9")] pub global: bool, /// Names for the columns a definition row generates, in place of the ones the @@ -347,8 +353,8 @@ pub struct ColumnDefinition { /// from quantity-ledger contributions. #[prost(bool, tag = "4")] pub quantity_ledger: bool, - /// Canonical uppercase ISO-4217 currency code. Required for MONEY and forbidden - /// for every other field type. + /// Canonical uppercase ISO-4217 currency code. MONEY inherits the table/profile + /// default when omitted. Forbidden for field types without currency support. #[prost(string, tag = "5")] pub currency: ::prost::alloc::string::String, /// When true, the server rejects omitted or explicitly null values. diff --git a/search/src/lib.rs b/search/src/lib.rs index 315d9370..d4610e04 100644 --- a/search/src/lib.rs +++ b/search/src/lib.rs @@ -59,16 +59,27 @@ impl AccountPathProjection { }); } - let qualified_accounts = format!( - "\"{}\".\"{}\"", - profile_name.replace('"', "\"\""), - LEDGER_ACCOUNTS_TABLE_NAME, - ); + let (schema_id, storage_schema, storage_relation) = sqlx::query_as::<_, (i64, String, String)>( + r#"SELECT profile.id, binding.storage->>'schema', binding.storage->>'relation' + FROM schemas profile + JOIN table_definitions definition ON definition.schema_id = profile.id + JOIN table_storage_bindings binding ON binding.table_definition_id = definition.id + WHERE profile.name = $1 AND definition.table_name = $2 + AND definition.table_kind = 'system' AND definition.deleted = FALSE"#, + ) + .bind(profile_name) + .bind(LEDGER_ACCOUNTS_TABLE_NAME) + .fetch_optional(pool) + .await + .map_err(|error| Status::internal(format!("Account storage lookup failed: {error}")))? + .ok_or_else(|| Status::failed_precondition("Account tracking is not enabled for profile"))?; + let qualified_accounts = qualify_profile_table(&storage_schema, &storage_relation); let paths = sqlx::query_as::<_, (i64, String)>(AssertSqlSafe(format!( "SELECT id, full_path FROM {qualified_accounts} - WHERE deleted = FALSE" + WHERE schema_id = $1 AND deleted = FALSE" ))) + .bind(schema_id) .fetch_all(pool) .await .map_err(|error| Status::internal(format!("Account path lookup failed: {error}")))? diff --git a/server b/server index 77419e36..3c9829e6 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 77419e36fcbce3519b0a89c9576162363f43ea60 +Subproject commit 3c9829e6df6e5c7fa6de571b06050081c9663c8d