From 9eb5e5211655ceb0b9016aaa5ef324fb01da1f62 Mon Sep 17 00:00:00 2001 From: filipriec Date: Fri, 21 Feb 2025 23:46:06 +0100 Subject: [PATCH] put uctovnictvo is now working --- proto/uctovnictvo.proto | 16 ++++ src/lib.rs | 1 + src/proto/descriptor.bin | Bin 9001 -> 10168 bytes src/server/mod.rs | 12 ++- src/shared/date_utils.rs | 34 ++++++++ src/shared/mod.rs | 2 + src/uctovnictvo/handlers.rs | 2 + src/uctovnictvo/handlers/post_uctovnictvo.rs | 36 +-------- src/uctovnictvo/handlers/put_uctovnictvo.rs | 78 +++++++++++++++++++ 9 files changed, 144 insertions(+), 37 deletions(-) create mode 100644 src/shared/date_utils.rs create mode 100644 src/shared/mod.rs create mode 100644 src/uctovnictvo/handlers/put_uctovnictvo.rs diff --git a/proto/uctovnictvo.proto b/proto/uctovnictvo.proto index 07e5815..24a2485 100644 --- a/proto/uctovnictvo.proto +++ b/proto/uctovnictvo.proto @@ -10,6 +10,7 @@ service Uctovnictvo { rpc GetUctovnictvo (GetUctovnictvoRequest) returns (UctovnictvoResponse); rpc GetUctovnictvoCount (multieko2.adresar.Empty) returns (multieko2.adresar.CountResponse); rpc GetUctovnictvoByPosition (multieko2.adresar.PositionRequest) returns (UctovnictvoResponse); + rpc PutUctovnictvo (PutUctovnictvoRequest) returns (UctovnictvoResponse); } message PostUctovnictvoRequest { @@ -41,6 +42,21 @@ message UctovnictvoResponse { string firma = 12; } +message PutUctovnictvoRequest { + int64 id = 1; + int64 adresar_id = 2; + string c_dokladu = 3; + string datum = 4; + string c_faktury = 5; + string obsah = 6; + string stredisko = 7; + string c_uctu = 8; + string md = 9; + string identif = 10; + string poznanka = 11; + string firma = 12; +} + message GetUctovnictvoRequest { int64 id = 1; } diff --git a/src/lib.rs b/src/lib.rs index 7e7e283..9b46fd6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,3 +5,4 @@ pub mod server; pub mod proto; pub mod adresar; pub mod uctovnictvo; +pub mod shared; diff --git a/src/proto/descriptor.bin b/src/proto/descriptor.bin index 1377e33c3e88c71275b845016befdcabafb1abc7..bc29de1315582f7bd15a74a577407a0254ba3d82 100644 GIT binary patch delta 2202 zcmX|>yKWOf6oz+Z#~XVVh&}dtZHG8c9Or__)wviE1Pv4*1W0srAR2@OLeS9cJK$G9 zNOVY%5DgDQ%PY|E|Le1-N{-L@=AX-Fe}C}n$&atO{W7}zmVdX&Z|k$CpXSd8$dSlY}?^8b1Fwm{|PzIk@W|{%QLpI1}BO-?)C?T%Eta{`W=dT@qOr;w$d4 zzv62w461s!sw}GBURA}YW{~^|T%KO7df@VAOD?4z;-1T;RR`8n ztPZS~R!i1_^|G#DjS%ZN^%2YNaWY@nD2HqfW@zy|HC zG|L3H8r@i!WiYi`Un#d?Xx7lR7Wa<|>kVC_3`T{?A^xXusIcB}xhWi4YqEV~DcqW3 z3|R9E;m`xNCU0Xbgc~VlfsM-D7Yv|zBY9I);6}=!SQmwirFrXeYE;11<)uEX><>J$Y4%x9y6> z_X<65+hQy#aNAifPY&~T^mH_DN8@PTjtFZk&D#-SjZH(mtA|U0?JAZ6+vQyrrC}+! zT`|@McQd-RFqUH6tgn{aurzkhExy7iu-=}ShYExIVWqIBu-u*qTgtUByGH?RUom3} zlwvHJ;P&NlER8)-j>aCy_R&JzfxIayU0d}Yug*_C5(Botw3RxO^q;WL% zNI4pNq;VAXNaHYgtZ@|fSTPEFtZ@|fSkoZvlxe(wTmDu~m7}p!jia$sjl)mniM**T zg*{P>!k&n*=m9$sVJ(F{6=6|em#2aiD8ZeIv8ceEim{f)o{6z2z@2Fvg*_8t(F1lS z!deSq&-E@T?73nT_FRO;U;*x2jI}g&rl+H^Gv#RPOfQqd&P3QaxZBa4g|K|#+ahdC jVJ}2j6j<&;%tM923+S5BSd>`rV!8P;dH>Id0of5Qg~{QPiVtk&mk)QTt|Cu5yN?NRvCnNbMj<&msp%p(_Li+y!tGgB0=*5_~2Tm58Seodd0d-w0!h2E;*{`{wT zqpr@g`QO$#Z3Ay_f>+8pXKbLnxryd3cGdY+1tbk-1w`^y@?L{~eVirxi zZ7341vFYXhQDMD?jYEaW2Ad!oQDMDioG^#hoVTwu88;V<0_H3#dcfxVHcCUdgWdAtdP=V-jYv^3fPiQjfy7OAf;j6O5(`8m0)Dvs!waR1-Fto zOs*x4%v%db=B*`;%v(zw%-cvDnYR&)%-i&FIs~?nw4ra!mfuuqGH)v!nYU$Q(F3>b zjJ3Ehn73nLQ2^TsM&|8USoDDHSXiZD-rm;yswCdt;;(dhWHN8h#$poOzNq-gVctPb zN9G+Qj?6o-uu7A82NqW8*qfsqE(UfKECzO@yL{*ji@_b)SncgyaDOqD#JG!^ZX246 hJ=x1Ai~{SO*gRAiJh8B-u-s{!d, + ) -> Result, Status> { + let response = put_uctovnictvo(&self.db_pool, request.into_inner()).await?; + Ok(Response::new(response)) + } } pub async fn run_server(db_pool: sqlx::PgPool) -> Result<(), Box> { diff --git a/src/shared/date_utils.rs b/src/shared/date_utils.rs new file mode 100644 index 0000000..ab620c1 --- /dev/null +++ b/src/shared/date_utils.rs @@ -0,0 +1,34 @@ +// src/shared/date_utils.rs +use chrono::NaiveDate; + +/// Attempts to parse the date string with multiple commonly used formats in Slovakia +pub fn parse_date_with_multiple_formats(date_str: &str) -> Option { + // Define common date formats used in Slovakia + let formats = [ + "%d:%m:%Y", // Original format: 01:01:2023 + "%d.%m.%Y", // Standard Slovak format: 01.01.2023 + "%d-%m-%Y", // Dash format: 01-01-2023 + "%d/%m/%Y", // Slash format: 01/01/2023 + "%Y-%m-%d", // ISO format: 2023-01-01 + "%Y/%m/%d", // Alternative ISO: 2023/01/01 + "%Y.%m.%d", // Dot ISO: 2023.01.01 + "%d.%m.%y", // Short year with dot: 01.01.23 + "%d-%m-%y", // Short year with dash: 01-01-23 + "%d/%m/%y", // Short year with slash: 01/01/23 + ]; + + // Try each format until one works + for format in formats { + if let Ok(date) = NaiveDate::parse_from_str(date_str, format) { + return Some(date); + } + } + + // If none of the formats worked, try to handle potential whitespace issues + let trimmed = date_str.trim(); + if trimmed != date_str { + return parse_date_with_multiple_formats(trimmed); + } + + None +} diff --git a/src/shared/mod.rs b/src/shared/mod.rs new file mode 100644 index 0000000..73a5d5e --- /dev/null +++ b/src/shared/mod.rs @@ -0,0 +1,2 @@ +// src/shared/mod.rs +pub mod date_utils; diff --git a/src/uctovnictvo/handlers.rs b/src/uctovnictvo/handlers.rs index c0e515a..ed289b7 100644 --- a/src/uctovnictvo/handlers.rs +++ b/src/uctovnictvo/handlers.rs @@ -3,8 +3,10 @@ pub mod post_uctovnictvo; pub mod get_uctovnictvo; pub mod get_uctovnictvo_count; pub mod get_uctovnictvo_by_position; +pub mod put_uctovnictvo; pub use post_uctovnictvo::post_uctovnictvo; pub use get_uctovnictvo::get_uctovnictvo; pub use get_uctovnictvo_count::get_uctovnictvo_count; pub use get_uctovnictvo_by_position::get_uctovnictvo_by_position; +pub use put_uctovnictvo::put_uctovnictvo; diff --git a/src/uctovnictvo/handlers/post_uctovnictvo.rs b/src/uctovnictvo/handlers/post_uctovnictvo.rs index 1e4638a..561ce3e 100644 --- a/src/uctovnictvo/handlers/post_uctovnictvo.rs +++ b/src/uctovnictvo/handlers/post_uctovnictvo.rs @@ -1,15 +1,14 @@ // src/uctovnictvo/handlers/post_uctovnictvo.rs use tonic::Status; use sqlx::PgPool; -use chrono::NaiveDate; use crate::uctovnictvo::models::Uctovnictvo; use crate::proto::multieko2::uctovnictvo::{PostUctovnictvoRequest, UctovnictvoResponse}; +use crate::shared::date_utils::parse_date_with_multiple_formats; // Import from shared module pub async fn post_uctovnictvo( db_pool: &PgPool, request: PostUctovnictvoRequest, ) -> Result { - // Try multiple date formats commonly used in Slovakia let datum = parse_date_with_multiple_formats(&request.datum) .ok_or_else(|| Status::invalid_argument(format!("Invalid date format: {}", request.datum)))?; @@ -72,36 +71,3 @@ pub async fn post_uctovnictvo( firma: uctovnictvo.firma, }) } - -/// TODO: adjust and unify in the future -/// Attempts to parse the date string with multiple commonly used formats in Slovakia -fn parse_date_with_multiple_formats(date_str: &str) -> Option { - // Define common date formats used in Slovakia - let formats = [ - "%d:%m:%Y", // Original format: 01:01:2023 - "%d.%m.%Y", // Standard Slovak format: 01.01.2023 - "%d-%m-%Y", // Dash format: 01-01-2023 - "%d/%m/%Y", // Slash format: 01/01/2023 - "%Y-%m-%d", // ISO format: 2023-01-01 - "%Y/%m/%d", // Alternative ISO: 2023/01/01 - "%Y.%m.%d", // Dot ISO: 2023.01.01 - "%d.%m.%y", // Short year with dot: 01.01.23 - "%d-%m-%y", // Short year with dash: 01-01-23 - "%d/%m/%y", // Short year with slash: 01/01/23 - ]; - - // Try each format until one works - for format in formats { - if let Ok(date) = NaiveDate::parse_from_str(date_str, format) { - return Some(date); - } - } - - // If none of the formats worked, try to handle potential whitespace issues - let trimmed = date_str.trim(); - if trimmed != date_str { - return parse_date_with_multiple_formats(trimmed); - } - - None -} diff --git a/src/uctovnictvo/handlers/put_uctovnictvo.rs b/src/uctovnictvo/handlers/put_uctovnictvo.rs new file mode 100644 index 0000000..2f43f90 --- /dev/null +++ b/src/uctovnictvo/handlers/put_uctovnictvo.rs @@ -0,0 +1,78 @@ +// src/uctovnictvo/handlers/put_uctovnictvo.rs +use tonic::Status; +use sqlx::PgPool; +use crate::uctovnictvo::models::Uctovnictvo; +use crate::proto::multieko2::uctovnictvo::{PutUctovnictvoRequest, UctovnictvoResponse}; +use crate::shared::date_utils::parse_date_with_multiple_formats; // Import from shared module + +pub async fn put_uctovnictvo( + db_pool: &PgPool, + request: PutUctovnictvoRequest, +) -> Result { + let datum = parse_date_with_multiple_formats(&request.datum) + .ok_or_else(|| Status::invalid_argument("Invalid date format"))?; + + let uctovnictvo = sqlx::query_as!( + Uctovnictvo, + r#" + UPDATE uctovnictvo + SET + adresar_id = $2, + c_dokladu = $3, + datum = $4, + c_faktury = $5, + obsah = $6, + stredisko = $7, + c_uctu = $8, + md = $9, + identif = $10, + poznanka = $11, + firma = $12 + WHERE id = $1 AND deleted = FALSE + RETURNING + id, + deleted, + adresar_id, + c_dokladu, + datum as "datum: chrono::NaiveDate", + c_faktury, + obsah, + stredisko, + c_uctu, + md, + identif, + poznanka, + firma + "#, + request.id, + request.adresar_id, + request.c_dokladu, + datum as chrono::NaiveDate, + request.c_faktury, + request.obsah, + request.stredisko, + request.c_uctu, + request.md, + request.identif, + request.poznanka, + request.firma + ) + .fetch_one(db_pool) + .await + .map_err(|e| Status::internal(e.to_string()))?; + + Ok(UctovnictvoResponse { + id: uctovnictvo.id, + adresar_id: uctovnictvo.adresar_id, + c_dokladu: uctovnictvo.c_dokladu, + datum: uctovnictvo.datum.format("%d.%m.%Y").to_string(), + c_faktury: uctovnictvo.c_faktury, + obsah: uctovnictvo.obsah.unwrap_or_default(), + stredisko: uctovnictvo.stredisko.unwrap_or_default(), + c_uctu: uctovnictvo.c_uctu.unwrap_or_default(), + md: uctovnictvo.md.unwrap_or_default(), + identif: uctovnictvo.identif.unwrap_or_default(), + poznanka: uctovnictvo.poznanka.unwrap_or_default(), + firma: uctovnictvo.firma, + }) +}