diff --git a/src/uctovnictvo/handlers/post_uctovnictvo.rs b/src/uctovnictvo/handlers/post_uctovnictvo.rs index 872ff47..1e4638a 100644 --- a/src/uctovnictvo/handlers/post_uctovnictvo.rs +++ b/src/uctovnictvo/handlers/post_uctovnictvo.rs @@ -1,7 +1,7 @@ // src/uctovnictvo/handlers/post_uctovnictvo.rs use tonic::Status; use sqlx::PgPool; -use chrono::NaiveDate; // Using chrono directly! +use chrono::NaiveDate; use crate::uctovnictvo::models::Uctovnictvo; use crate::proto::multieko2::uctovnictvo::{PostUctovnictvoRequest, UctovnictvoResponse}; @@ -9,9 +9,9 @@ pub async fn post_uctovnictvo( db_pool: &PgPool, request: PostUctovnictvoRequest, ) -> Result { - // Parse the date string into a chrono::NaiveDate. - let datum = NaiveDate::parse_from_str(&request.datum, "%d:%m:%Y") - .map_err(|e| Status::invalid_argument(format!("Invalid date: {}", e)))?; + // 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)))?; // Pass the NaiveDate value directly. let uctovnictvo = sqlx::query_as!( @@ -56,13 +56,12 @@ pub async fn post_uctovnictvo( .await .map_err(|e| Status::internal(e.to_string()))?; - // Convert the NaiveDate back to a String for the API response, - // if that format fits your client requirements. + // Return the response with formatted date Ok(UctovnictvoResponse { id: uctovnictvo.id, adresar_id: uctovnictvo.adresar_id, c_dokladu: uctovnictvo.c_dokladu, - datum: uctovnictvo.datum.to_string(), + datum: uctovnictvo.datum.format("%d.%m.%Y").to_string(), // Standard Slovak format c_faktury: uctovnictvo.c_faktury, obsah: uctovnictvo.obsah.unwrap_or_default(), stredisko: uctovnictvo.stredisko.unwrap_or_default(), @@ -74,3 +73,35 @@ pub async fn post_uctovnictvo( }) } +/// 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 +}