From 04b1c65f986ff98b7165052350190e22909e07d4 Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Thu, 11 Apr 2024 09:03:36 +0200 Subject: [PATCH] - Added support for polish version of XLSX documents (#111) --- Cargo.toml | 2 +- data/G&L_Expanded_polish.xlsx | Bin 0 -> 8909 bytes src/xlsxparser.rs | 94 +++++++++++++++++++++++++++++++--- 3 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 data/G&L_Expanded_polish.xlsx diff --git a/Cargo.toml b/Cargo.toml index 97623ef..321b512 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "etradeTaxReturnHelper" -version = "0.5.2" +version = "0.5.3" edition = "2021" description = "Parses etrade financial documents for transaction details (income, tax paid, cost basis) and compute total income and total tax paid according to chosen tax residency (currency)" license = "BSD-3-Clause" diff --git a/data/G&L_Expanded_polish.xlsx b/data/G&L_Expanded_polish.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5d4b24259459e1fe836966b3f5371ec2afb8695c GIT binary patch literal 8909 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 k@I3YZW5ApE@Be date_acquired_idx = idx, - "Date Sold" => date_sold_idx = idx, - "Acquisition Cost" => acquistion_cost_idx = idx, - "Adjusted Cost Basis" => cost_basis_idx = idx, - "Total Proceeds" => total_proceeds_idx = idx, + "Date Acquired" | "Data nabycia" => date_acquired_idx = idx, + "Date Sold" | "Data sprzedaży" => date_sold_idx = idx, + "Acquisition Cost" | "Koszt zakupu" => acquistion_cost_idx = idx, + "Adjusted Cost Basis" | "Skorygowana podstawa kosztów" => cost_basis_idx = idx, + "Total Proceeds" | "Łączne wpływy" => total_proceeds_idx = idx, _ => (), } } @@ -120,7 +120,7 @@ mod tests { ); assert_eq!( parse_gains_and_losses("data/G&L_Expanded.xlsx"), - Ok((vec![ + Ok(vec![ ( "04/24/2013".to_owned(), "04/11/2022".to_owned(), @@ -135,9 +135,89 @@ mod tests { 29.28195, 43.67 ) - ])) + ]) ); Ok(()) } + + #[test] + fn test_parse_gain_and_losses_pl() -> Result<(), String> { + assert_eq!( + parse_gains_and_losses("data/G&L_Expanded_polish.xlsx"), + Ok(vec![ + ( + "02/17/2023".to_owned(), + "02/21/2023".to_owned(), + 1791.0388, + 2107.1, + 2018.3545 + ), + ( + "08/01/2022".to_owned(), + "06/05/2023".to_owned(), + 0.0, + 258.09, + 219.0275 + ), + ( + "01/31/2023".to_owned(), + "06/05/2023".to_owned(), + 0.0, + 195.37, + 219.0275 + ), + ( + "10/31/2022".to_owned(), + "06/05/2023".to_owned(), + 0.0, + 200.305, + 219.0275 + ), + ( + "05/01/2023".to_owned(), + "06/05/2023".to_owned(), + 0.0, + 215.32, + 219.0275 + ), + ( + "07/31/2023".to_owned(), + "08/07/2023".to_owned(), + 0.0, + 255.0275, + 247.16 + ), + ( + "08/18/2023".to_owned(), + "08/21/2023".to_owned(), + 1969.0505, + 2701.235, + 2689.0754 + ), + ( + "08/30/2023".to_owned(), + "12/13/2023".to_owned(), + 0.0, + 923.8725, + 1187.31 + ), + ( + "11/30/2023".to_owned(), + "12/13/2023".to_owned(), + 0.0, + 1163.5, + 1143.34 + ), + ( + "10/31/2023".to_owned(), + "12/13/2023".to_owned(), + 0.0, + 252.665, + 307.82 + ) + ]) + ); + Ok(()) + } }