Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 21 additions & 13 deletions src/csvparser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,8 +217,15 @@

fn parse_investment_transaction_dates(
df: &DataFrame,
col_name: &str,
col_names: &[&str],
) -> Result<Vec<String>, &'static str> {
// Pick the first available column from the provided candidates.
let col_name = col_names
.iter()
.find(|c| df.get_column_names().contains(c))
.map(|s| *s)
.ok_or("Error: None of the requested date columns are present")?;

let date = df
.column(col_name)
.map_err(|_| "Error: Unable to select Date")?;
Expand Down Expand Up @@ -342,7 +349,7 @@
log::info!("Content of Interests: {df}");
let filtred_df = extract_intrest_rate_transactions(&df)?;
ta.dates
.extend(parse_investment_transaction_dates(&filtred_df, "Date")?);
.extend(parse_investment_transaction_dates(&filtred_df, &["Date"])?);
let lincomes = parse_incomes(&filtred_df, "Money in")?;
let ltaxes: Vec<crate::Currency> = lincomes.iter().map(|i| i.derive(0.0)).collect();
ta.taxes.extend(ltaxes);
Expand All @@ -358,9 +365,10 @@
log::trace!("Content of Sells: {df}");
let filtred_df = extract_sold_transactions(&df)?;
log::info!("Filtered Sold Data of interest: {filtred_df}");
let lacquired_dates = parse_investment_transaction_dates(&filtred_df, "Date acquired")?;
let lacquired_dates =
parse_investment_transaction_dates(&filtred_df, &["Date acquired"])?;
log::info!("dates:: {:?}", ta.acquired_dates);
let lsold_dates = parse_investment_transaction_dates(&filtred_df, "Date sold")?;
let lsold_dates = parse_investment_transaction_dates(&filtred_df, &["Date sold"])?;

// For each sold data has to be one acquire date
if lacquired_dates.len() != lsold_dates.len() {
Expand Down Expand Up @@ -392,7 +400,7 @@
let filtred_df = extract_dividends_transactions(&df)?;
log::info!("Filtered Dividend Data of interest: {filtred_df}");
ta.dates
.extend(parse_investment_transaction_dates(&filtred_df, "Date")?);
.extend(parse_investment_transaction_dates(&filtred_df, &["Date"])?);

// parse income
let lincomes = parse_incomes(&filtred_df, "Gross amount base currency")?;
Expand All @@ -417,9 +425,9 @@
.finish()
.map_err(|e| format!("Error reading CSV: {e}"))?;
log::info!("Content of Crypto: {df}");
let lacquired_dates = parse_investment_transaction_dates(&df, "Date acquired")?;
let lacquired_dates = parse_investment_transaction_dates(&df, &["Date acquired"])?;
log::trace!("acquired dates:: {:?}", lacquired_dates);
let lsold_dates = parse_investment_transaction_dates(&df, "Date sold")?;
let lsold_dates = parse_investment_transaction_dates(&df, &["Date sold"])?;
log::trace!("sold dates:: {:?}", lsold_dates);
// For each sold data has to be one acquire date
if lacquired_dates.len() != lsold_dates.len() {
Expand All @@ -443,7 +451,7 @@
pub fn parse_revolut_transactions(csvtoparse: &str) -> Result<RevolutTransactions, String> {
let mut dividend_transactions: Vec<(String, crate::Currency, crate::Currency)> = vec![];
let mut sold_transactions: Vec<(String, String, crate::Currency, crate::Currency)> = vec![];
let mut crypto_transactions: Vec<(String, String, crate::Currency, crate::Currency)> = vec![];

Check warning on line 454 in src/csvparser.rs

View workflow job for this annotation

GitHub Actions / coverage

variable does not need to be mutable

let mut ta = TransactionAccumulator::default();

Expand Down Expand Up @@ -471,7 +479,7 @@

log::info!("Filtered data of Interest: {filtred_df}");

ta.dates = parse_investment_transaction_dates(&filtred_df, "Completed Date")?;
ta.dates = parse_investment_transaction_dates(&filtred_df, &["Completed Date"])?;

ta.incomes = parse_incomes(&filtred_df, "Money in")?;
// Taxes are not automatically taken from savings account
Expand All @@ -488,7 +496,7 @@
log::info!("CSV DataFrame: {df}");
let filtred_df = extract_investment_gains_and_costs_transactions(&df)?;
log::info!("Filtered Data of interest: {filtred_df}");
ta.dates = parse_investment_transaction_dates(&filtred_df, "Date")?;
ta.dates = parse_investment_transaction_dates(&filtred_df, &["Date"])?;
ta.incomes = parse_incomes(&filtred_df, "Total Amount")?;
ta.taxes = ta.incomes.iter().map(|i| i.derive(0.0)).collect();
} else if result.iter().any(|field| field == "Income from Sells") {
Expand Down Expand Up @@ -526,8 +534,8 @@

let filtred_df = extract_sold_transactions(&sales)?;
log::info!("Filtered Sold Data of interest: {filtred_df}");
ta.acquired_dates = parse_investment_transaction_dates(&filtred_df, "Date acquired")?;
ta.sold_dates = parse_investment_transaction_dates(&filtred_df, "Date sold")?;
ta.acquired_dates = parse_investment_transaction_dates(&filtred_df, &["Date acquired"])?;
ta.sold_dates = parse_investment_transaction_dates(&filtred_df, &["Date sold"])?;
// For each sold date there has to be one acquire date
if ta.acquired_dates.len() != ta.sold_dates.len() {
return Err("ERROR: Different number of acquired and sold dates".to_string());
Expand All @@ -539,7 +547,7 @@

let filtred_df = extract_dividends_transactions(&others)?;
log::info!("Filtered Dividend Data of interest: {filtred_df}");
ta.dates = parse_investment_transaction_dates(&filtred_df, "Date")?;
ta.dates = parse_investment_transaction_dates(&filtred_df, &["Date"])?;
// parse income
ta.incomes = parse_income_with_currency(&filtred_df, "Gross amount", "Currency")?;
// parse taxes
Expand Down Expand Up @@ -725,7 +733,7 @@
Ok(())
}

fn test_parse_date_helper(

Check warning on line 736 in src/csvparser.rs

View workflow job for this annotation

GitHub Actions / coverage

function `test_parse_date_helper` is never used
description: Vec<&str>,
input_dates: Vec<&str>,
expected_dates: Vec<String>,
Expand All @@ -737,7 +745,7 @@
.map_err(|_| "Error creating DataFrame")?;

assert_eq!(
parse_investment_transaction_dates(&df, "Date"),
parse_investment_transaction_dates(&df, &["Date"]),
Ok(expected_dates)
);

Expand Down
Loading