From a5992379db3c6e118729589082263d87021a5cb3 Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 29 Jul 2026 17:14:13 +0200 Subject: [PATCH] data in accounts is automatic now --- client | 2 +- common/proto/table_definition.proto | 5 ++--- common/proto/table_structure.proto | 3 ++- common/proto/tables_data.proto | 5 ++++- common/src/proto/descriptor.bin | Bin 135618 -> 135795 bytes common/src/proto/komp_ac.table_definition.rs | 5 ++--- common/src/proto/komp_ac.table_structure.rs | 3 ++- common/src/proto/komp_ac.tables_data.rs | 8 ++++++-- server | 2 +- 9 files changed, 20 insertions(+), 13 deletions(-) diff --git a/client b/client index 9f68031..7a63161 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit 9f68031ff4259e4a616a2103c42b37a240f2c6fd +Subproject commit 7a63161ad87165f68913b1e80727a2ca8840c266 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 9f29788..5147ed5 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -178,9 +178,8 @@ message ColumnDefinition { // PHONE (international or national phone number; generates extension/type/country/calling-code companions) // TIME (timezone-free time of day) // MONEY (= unconstrained NUMERIC; currency comes from the table) - // ACCOUNTING (creates schema-managed name, debit, and credit columns; - // automatically creates a required accounts_id link and posts - // the referenced canonical account row's account value; + // ACCOUNTING (creates schema-managed name, account, debit, and credit fields; + // account always selects a row from the profile's managed accounts table; // name is limited to 10 characters and one stored row contributes // one line to the profile journal) // INT diff --git a/common/proto/table_structure.proto b/common/proto/table_structure.proto index 8def2fc..db60a16 100644 --- a/common/proto/table_structure.proto +++ b/common/proto/table_structure.proto @@ -46,7 +46,8 @@ message GetTableStructureResponse { message TableStructureResponse { // Columns of the physical table, including system columns (id, deleted, // created_at, row_revision), user-defined columns, and any foreign-key columns such as - // "_id". May be empty if the physical table is missing. + // "_id", plus the dedicated "account_id" column on + // ACCOUNTING-enabled tables. May be empty if the physical table is missing. repeated TableColumn columns = 1; } diff --git a/common/proto/tables_data.proto b/common/proto/tables_data.proto index 056b1e6..71d7cc2 100644 --- a/common/proto/tables_data.proto +++ b/common/proto/tables_data.proto @@ -62,7 +62,8 @@ service TablesData { // - Validates profile and table definition // - Returns all columns as strings (COALESCE(col::TEXT, '') AS col) // including: id, deleted, row_revision, all user-defined columns, and FK columns - // named "_id" for each table link + // named "_id" for each table link, plus "account_id" on + // ACCOUNTING-enabled tables // - Fails with NOT_FOUND if record does not exist or is soft-deleted // - If the physical table is missing but the definition exists, returns INTERNAL rpc GetTableData(GetTableDataRequest) returns (GetTableDataResponse); @@ -101,6 +102,7 @@ message PostTableDataRequest { // - System/FK columns: // • "deleted" (BOOLEAN), optional; default FALSE if not provided // • "_id" (BIGINT) for each table link + // • "account_id" (BIGINT) on ACCOUNTING-enabled tables // // Type expectations by SQL type: // - TEXT: string value; empty string is treated as NULL @@ -266,6 +268,7 @@ message GetTableDataResponse { // - id, deleted // - all user-defined columns from the table definition // - FK columns named "_id" for each table link + // - account_id for ACCOUNTING-enabled tables // // All values are returned as TEXT via col::TEXT and COALESCEed to empty string // (NULL becomes ""). The row is returned only if deleted = FALSE. diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 2530afc35820c4a1c562a70f68f85daa5fd0e756..dbfcbb082684e6cda0c4edaef3a27dfd6ee54c62 100644 GIT binary patch delta 8249 zcmaJ`Yjjjqmae_4a;xfAo;MF51SsBwP$48y0RfjRUQ4Hx zM>H6q8x|Z#K?H4JK!QBh)RN`2jxDtGYQ$z5o8i$0L0B@VbcdlADmdRh=bjY)=*ged zch32~v(G;J?sM-x@4p^tdn5AJ^KJZ>Z3mj#8VaK;{@D$C85Fpp*6gAlsZLQ^RYJc_ zz0sSdQQpO{8wxp0Ug$mIj>RX#sm#7q$;tZJvllF#zhppsPQzn!@vnaVocQcT4Rhu$ zi9bHKVcwj@_qy>P{`rh}{k*5@f3`TjxM5zy>?Moi_3=duo{B%dXu*^5C4b)#U$|(& z<8$XV^j#c(vVMO36Ag3XK5ub+N&RE<8hqK*SEV$NlCUY_X1N(+p*As^Z(&d@F6!XM z++fIwdZG7;v)oKsOf(=UmT5*t10dcB*@yS*g##TX?owPCA3t$I-EqTT;gseEe3d0wUyE9Sl5wuvFfziTu$SvPE#m~j<9LQ)Tar)Z*Rafr)8QUJ`n@Xsgi+o zZ`C;px$Wa*OV3d(C*1(zIr8$|DLxUq)2dbtq^Y&76iQFP8EB`h{C1-3ODh$0O*cTP zmAdzEr}|337gVnbdbIY!ok~F{UAR+8cIyHa^leuP3X}Smxzl~6kQch7-m9P))tByE zObEnF6f0~ehCsYT9Xq+D+O6a{SBS5viG!$L-W785+y}KFiCeF#7Y5Pzs;g;1G(+%e z+B;}~;8pR?D4&P{U#mzZ)zy5RUK24nXs0aCw*(C`kn%gF8=&+xm2@#XE(WxzwUv|@ z)<*2=@QQE%Ds2?=EQCfI<#)Ca3T@Q2n>!Ja6!o0HQs5hPvyvth{FNec_g*YHD!Mm` zi;EMgwT3#VMODCK9#VIfM&Jm#A?5%Sds13gFAH5un66d z`kvz5^@9`hoaG#NUTv+WQOV^TDb^Fj#I_a8-8BaYwgDR30HL^oqb0T%f-AUN+^3>* zWtvK$0$QqU-^w&qY*}fk55*YINF)2}0>Zig&AI>~)yT0te_C-uBYS3D=!H}xV_AdX z@=VWJ#eucz;9XRaT*b%-;g4)da1)7@7lx3}Ef2V=K1q}OxWgV+IVwGhbtJ&Y_OhIdyO{fBa z3TUbFfUn_**=h9Z!JUecC^(emIqNu}nAB%?)8w)1IMQF6lO;}AZ><4>B%oOdASBnb zAIN}^TrbxA2>#0wQ#Y#QJv4UMM!PR)gu+ISnZ*OjAkOQhmj?)ijoi1N-j{68d6@&- zlrtFn@-jzyYm>6Yq*vHKnSdY&XjTab!B=3Q76gRgE1Z?>Q_;D}t|nXC0%%qPsC)g@ z0D`*7`Zk#@`?8ri?hDJl0NQC~v704y(puU!-W`O!y znu@HjHEpqzQK7NrI^b?io9uwQm0_}+>^YwEOAhQ*7lu$>@|PSb)5he;u5Guj2ZAwx zMi3B!+if5LLU6lveUA8c2lHKe9YAmipxI$Sn7V^w{cNuuTw0-F5xOC@gR81>mUAfA zb9Qs!p!$!YG$y&5Bl+64T(Rvvo1iatA%4Gq5vV)!X-U@D^MODGG`<7Wz5eC{f_m6) ze$ta@K4SAD5V(MrE6PVWYN8pv;2yF0(G&C=<^sJ)AW#7>8#xeKq#G+ome4Xq=jNdtC~29 z8p~VL9GShPX;zQL8q(wWGI zn8d*>_!{sL0d?qVQ4k1UmU5E9`nvKL2pWTNcy0=50{UuFi&jxr?qAc+fTw~rQORb)hogcug+=ZdO<*rrrw%pKgJpFH zM>7Kc4%UV3csvckI*fl-;vgt!jH*~o%gV;I6Yxj`$Al&4$pm;Jf@2UkZx}+z3yxRk zR@3(WHBf;?~WEcV#9~_U9>c@J53@i>cx~Lh)7&==18$p=s`v|`HZ#SM7hF+wz?jly zs6}8*shjS0Lww??eKhbd>V-Dy<~lnS3(KccylT5z4_R?KQAO3=>2OS~aU(9S|)*$~z9 z!px@w1B#!IrXv4KVHzs+!_S`G_QS`uU(J}&VTP#O$AgUX;DCY8ZE5zLdmIQ)iU&2tp^x%$;j z>d-+djFPsVqevGw0U2GgS+4%)CJjt1xAi$wuvu>FbEaIgTbns4tU^Hs zr$M8wTbTMxBl$TI5Lu;>5b#ouBRLV9)aGv}k!T|S{RNGXYa(PEd6@+SrAexx(=-LB zS!KICxrX#xaI-CR03x+EQ_OrS0YaylI`#8)pO}Syeu`UiLgv^b!d~+s7AIw4BacyU=C`Xw$bl@3%=tIom0)SM9n@y>hlonM_WgkgRH_I(M6fCwAKSL?eWD z+V}*7&`uklA(>^jiBJ4SeD1bu0F*u(pMW6lmiU~h=fWCV)T`gqPlmPFHDJfFh8BvM zG65hITBy7ECIW;)3on(JuioFsf>nM)b*#!13! zhU6Vb&?%jF)a?v*?!z^L`Rqjx;^CA{JAg3ulubK;LX@;~kCuVE&Zzqx9+Etho>?4q z#-<%dJL-(2olH0i*C>CYz-L4{cgV->p9sZ4`J~WyDWBpY)fNLGv;ocIY3@`$weex@ zR6dpXFjV*;3C2}08qND0|3FhA`Xy;Fd}Eqmug`IPvMu=cr=3YCHddZfS`Oy z_;!|9j|jRZvHnQ;wKPTc8?QOW8yF*lB+4a+;r8IV+#Wm}#age+9hl@seS2_2t&H-_ z#0{In%$>mvo5ReV!42`b#9velyD9NEeI%|KOz5Ezp?A}U9-s`ep$7<4Zc6Cg1yjte zLnBjhU-jKr)LR{MIhKR#2a}X=rGRSy@xSU>O{FnOJNjN>8E^QAtE%uD&Ru3db^tNg zGW(%rZV{Hrht?oXgmYJ_Ju$8-Uug>yu6FK9?2ZmOK$y2uYGuP<9xfi5IPkA3JCpA# zY+~etZ{?dv-#n~i?pAzN&C29`W$}c)RK*8S{P6{g{`QNM%E{tQ)gYU)n7OA|$3^Cb z1rYPE<1Ss@U&&`dOgyZZON;l?`tzTURPk*7SrQG#Ty$go%2u}k^>EJ|U4Rf%Qr4Cy z1h)@f=p|bx1Hw}eXqDv4|E08&O#G59lVLEFUXn5y4v>i4Tx?=g$m2QOCwG&SFeG|$ z8zB|t4GXxe8o!~}UTp@19;(gu0zsDfs(d!fmf|i#3c0eSAj*p3#$GP DbLu9r delta 8032 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 diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index 7b376a7..c51a65e 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -149,9 +149,8 @@ pub struct ColumnDefinition { /// PHONE (international or national phone number; generates extension/type/country/calling-code companions) /// TIME (timezone-free time of day) /// MONEY (= unconstrained NUMERIC; currency comes from the table) - /// ACCOUNTING (creates schema-managed name, debit, and credit columns; - /// automatically creates a required accounts_id link and posts - /// the referenced canonical account row's account value; + /// ACCOUNTING (creates schema-managed name, account, debit, and credit fields; + /// account always selects a row from the profile's managed accounts table; /// name is limited to 10 characters and one stored row contributes /// one line to the profile journal) /// INT diff --git a/common/src/proto/komp_ac.table_structure.rs b/common/src/proto/komp_ac.table_structure.rs index 17af7c3..eb89f06 100644 --- a/common/src/proto/komp_ac.table_structure.rs +++ b/common/src/proto/komp_ac.table_structure.rs @@ -26,7 +26,8 @@ pub struct GetTableStructureResponse { pub struct TableStructureResponse { /// Columns of the physical table, including system columns (id, deleted, /// created_at, row_revision), user-defined columns, and any foreign-key columns such as - /// "\\_id". May be empty if the physical table is missing. + /// "\\_id", plus the dedicated "account_id" column on + /// ACCOUNTING-enabled tables. May be empty if the physical table is missing. #[prost(message, repeated, tag = "1")] pub columns: ::prost::alloc::vec::Vec, } diff --git a/common/src/proto/komp_ac.tables_data.rs b/common/src/proto/komp_ac.tables_data.rs index fa82b8d..5c26ab1 100644 --- a/common/src/proto/komp_ac.tables_data.rs +++ b/common/src/proto/komp_ac.tables_data.rs @@ -18,6 +18,7 @@ pub struct PostTableDataRequest { /// * System/FK columns: /// • "deleted" (BOOLEAN), optional; default FALSE if not provided /// • "\\_id" (BIGINT) for each table link + /// • "account_id" (BIGINT) on ACCOUNTING-enabled tables /// /// Type expectations by SQL type: /// @@ -208,6 +209,7 @@ pub struct GetTableDataResponse { /// * id, deleted /// * all user-defined columns from the table definition /// * FK columns named "\\_id" for each table link + /// * account_id for ACCOUNTING-enabled tables /// /// All values are returned as TEXT via col::TEXT and COALESCEed to empty string /// (NULL becomes ""). The row is returned only if deleted = FALSE. @@ -498,7 +500,8 @@ pub mod tables_data_client { /// * Validates profile and table definition /// * Returns all columns as strings (COALESCE(col::TEXT, '') AS col) /// including: id, deleted, row_revision, all user-defined columns, and FK columns - /// named "\\_id" for each table link + /// named "\\_id" for each table link, plus "account_id" on + /// ACCOUNTING-enabled tables /// * Fails with NOT_FOUND if record does not exist or is soft-deleted /// * If the physical table is missing but the definition exists, returns INTERNAL pub async fn get_table_data( @@ -690,7 +693,8 @@ pub mod tables_data_server { /// * Validates profile and table definition /// * Returns all columns as strings (COALESCE(col::TEXT, '') AS col) /// including: id, deleted, row_revision, all user-defined columns, and FK columns - /// named "\\_id" for each table link + /// named "\\_id" for each table link, plus "account_id" on + /// ACCOUNTING-enabled tables /// * Fails with NOT_FOUND if record does not exist or is soft-deleted /// * If the physical table is missing but the definition exists, returns INTERNAL async fn get_table_data( diff --git a/server b/server index 8dd5dcb..df7f5aa 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 8dd5dcbdcb306e2371e6aee1c39edd2bb9f8213f +Subproject commit df7f5aaf95bd44633998d635c758aef698230c50