diff --git a/cli/src/import/single_entry.rs b/cli/src/import/single_entry.rs index f1833b8..ce935cc 100644 --- a/cli/src/import/single_entry.rs +++ b/cli/src/import/single_entry.rs @@ -214,45 +214,49 @@ impl Txn { Some(_) => syntax::ClearState::Uncleared, None => syntax::ClearState::Pending, }); + let add_charges = |posts: &mut Vec>| { + for chrg in &self.charges { + posts.push(syntax::Posting { + clear_state: syntax::ClearState::Uncleared, + amount: Some(self.to_posting_amount(chrg.amount.into_borrowed())), + balance: None, + metadata: vec![syntax::Metadata::KeyValueTag { + key: Cow::Borrowed("Payee"), + value: syntax::MetadataValue::Text(chrg.payee.as_str().into()), + }], + ..syntax::Posting::new("Expenses:Commissions") + }); + } + }; if self.amount.value.is_sign_positive() { - posts.push(syntax::Posting { - clear_state: post_clear, - amount: Some(self.dest_amount()), - ..syntax::Posting::new(self.dest_account.as_deref().unwrap_or("Income:Unknown")) - }); posts.push(syntax::Posting { clear_state: syntax::ClearState::Uncleared, amount: Some(self.amount()), balance: self.balance.as_ref().map(|x| as_syntax_amount(x).into()), ..syntax::Posting::new(src_account) }); - } else if self.amount.value.is_sign_negative() { + add_charges(&mut posts); posts.push(syntax::Posting { - clear_state: syntax::ClearState::Uncleared, - amount: Some(self.amount()), - balance: self.balance.as_ref().map(|x| as_syntax_amount(x).into()), - ..syntax::Posting::new(src_account) + clear_state: post_clear, + amount: Some(self.dest_amount()), + ..syntax::Posting::new(self.dest_account.as_deref().unwrap_or("Income:Unknown")) }); + } else if self.amount.value.is_sign_negative() { posts.push(syntax::Posting { clear_state: post_clear, amount: Some(self.dest_amount()), ..syntax::Posting::new(self.dest_account.as_deref().unwrap_or("Expenses:Unknown")) }); - } else { - // warning log or error? - return Err(ImportError::Other("credit and debit both zero".to_string())); - } - for chrg in &self.charges { + add_charges(&mut posts); posts.push(syntax::Posting { clear_state: syntax::ClearState::Uncleared, - amount: Some(self.to_posting_amount(chrg.amount.into_borrowed())), - balance: None, - metadata: vec![syntax::Metadata::KeyValueTag { - key: Cow::Borrowed("Payee"), - value: syntax::MetadataValue::Text(chrg.payee.as_str().into()), - }], - ..syntax::Posting::new("Expenses:Commissions") + amount: Some(self.amount()), + balance: self.balance.as_ref().map(|x| as_syntax_amount(x).into()), + ..syntax::Posting::new(src_account) }); + } else { + // warning log or error? + return Err(ImportError::Other("credit and debit both zero".to_string())); } let metadata = self .comments diff --git a/cli/tests/testdata/csv_multi_currency.ledger b/cli/tests/testdata/csv_multi_currency.ledger index 39fae09..0b5a477 100644 --- a/cli/tests/testdata/csv_multi_currency.ledger +++ b/cli/tests/testdata/csv_multi_currency.ledger @@ -1,32 +1,32 @@ 2020/07/08 * 被仕向外貨送金 OKANE. INC. - ! Income:Unknown -24000.11 USD Assets:Okane Bank 24000.11 USD = 31691.78 USD + ! Income:Unknown -24000.11 USD 2020/07/11 * 円普通預金より振替(デビット) - Assets:Wire -2675 JPY Assets:Okane Bank 23.45 CHF @ 114.0500 JPY = 23.45 CHF + Assets:Wire -2675 JPY 2020/07/11 * (785403) Hamachi Super - Assets:Okane Bank -23.45 CHF = 0.00 CHF Expenses:Grocery 23.45 CHF + Assets:Okane Bank -23.45 CHF = 0.00 CHF 2020/07/29 * 外貨普通預金(スイスフラン)へ振替 - Assets:Okane Bank -1097.94 USD @ 0.9108 CHF = 31691.78 USD Assets:Wire 1000.003752 CHF + Assets:Okane Bank -1097.94 USD @ 0.9108 CHF = 31691.78 USD 2020/07/29 * 外貨普通預金(米ドル)より振替 - Assets:Wire -1000.00 CHF Assets:Okane Bank 1000.00 CHF = 1000.00 CHF + Assets:Wire -1000.00 CHF 2020/07/29 * 外貨普通預金(ユーロ)へ振替 - Assets:Okane Bank -2353.40 USD = 29338.38 USD Assets:Wire 2000.00 EUR @ 1.1767 USD + Assets:Okane Bank -2353.40 USD = 29338.38 USD 2020/07/29 * 外貨普通預金(米ドル)より振替 - Assets:Wire -2000.00 EUR Assets:Okane Bank 2000.00 EUR = 2000.00 EUR + Assets:Wire -2000.00 EUR 2020/07/30 * 円普通預金へ振替 - Assets:Okane Bank -2740.65 USD @ 145.5200 JPY = 26597.73 USD Assets:Wire 398819 JPY + Assets:Okane Bank -2740.65 USD @ 145.5200 JPY = 26597.73 USD diff --git a/cli/tests/testdata/csv_template.ledger b/cli/tests/testdata/csv_template.ledger index 00d2059..8b06c6a 100644 --- a/cli/tests/testdata/csv_template.ledger +++ b/cli/tests/testdata/csv_template.ledger @@ -1,40 +1,40 @@ 2024/07/30 * Credit Interest - SCHWAB1 INT 06/27-07/29 ; SCHWAB1 INT 06/27-07/29 - Income:Interest -11.81 USD Assets:Brokers:Schrank 11.81 USD + Income:Interest -11.81 USD 2024/08/29 * Credit Interest - SCHWAB1 INT 07/30-08/28 ; SCHWAB1 INT 07/30-08/28 - Income:Interest -6.60 USD Assets:Brokers:Schrank 6.60 USD + Income:Interest -6.60 USD 2024/09/24 * NRA Tax Adj - VANGUARD HIGH DIVIDEND YIELD ETF ; VANGUARD HIGH DIVIDEND YIELD ETF - Assets:Brokers:Schrank -0.26 USD Expenses:Tax:Income 0.26 USD + Assets:Brokers:Schrank -0.26 USD 2024/09/24 * Reinvest Dividend - VANGUARD HIGH DIVIDEND YIELD ETF ; VANGUARD HIGH DIVIDEND YIELD ETF - Income:Dividend -1.72 USD Assets:Brokers:Schrank 1.72 USD + Income:Dividend -1.72 USD 2024/09/24 * Service Fee - WIRED FUNDS FEE ; WIRED FUNDS FEE - Assets:Brokers:Schrank -15.00 USD Assets:Receivables:Advances 15.00 USD + Assets:Brokers:Schrank -15.00 USD 2024/09/24 * Misc Cash Entry - WAIVE WIRE FEE ; WAIVE WIRE FEE - Assets:Receivables:Advances -15.00 USD Assets:Brokers:Schrank 15.00 USD + Assets:Receivables:Advances -15.00 USD 2024/09/24 * Wire Sent - WIRED FUNDS DISBURSED ; WIRED FUNDS DISBURSED - Assets:Brokers:Schrank -8000.00 USD ! Assets:Wire:Unknown 8000.00 USD + Assets:Brokers:Schrank -8000.00 USD 2024/09/24 * Reinvest Shares - VANGUARD HIGH DIVIDEND YIELD ETF ; VANGUARD HIGH DIVIDEND YIELD ETF - Assets:Brokers:Schrank -1.46 USD Assets:Brokers:Schrank 0.0114 VYM @ 127.90 USD + Assets:Brokers:Schrank -1.46 USD diff --git a/cli/tests/testdata/index_amount.ledger b/cli/tests/testdata/index_amount.ledger index 8e5a772..115779a 100644 --- a/cli/tests/testdata/index_amount.ledger +++ b/cli/tests/testdata/index_amount.ledger @@ -1,12 +1,12 @@ 2021/09/01 * cashback - ! Income:Misc -50.00 USD Liabilities:Okane Card 50.00 USD + ! Income:Misc -50.00 USD 2021/09/02 * (31415) Migros - Liabilities:Okane Card -28.00 USD Expenses:Grocery 28.00 USD + Liabilities:Okane Card -28.00 USD 2021/09/03 * (14142) FooBar - Liabilities:Okane Card -1.45 USD ! Expenses:Unknown 1.45 USD + Liabilities:Okane Card -1.45 USD diff --git a/cli/tests/testdata/iso_camt.ledger b/cli/tests/testdata/iso_camt.ledger index da9f8d2..0f3f3ae 100644 --- a/cli/tests/testdata/iso_camt.ledger +++ b/cli/tests/testdata/iso_camt.ledger @@ -1,56 +1,56 @@ 2021/10/01 * Initial Balance - Equity:Adjustments -0.00 CHF Assets:Okane Bank 0.00 CHF = 100.00 CHF + Equity:Adjustments -0.00 CHF 2021/10/01 * (20211031/1/1) Jiro Okane - Assets:Wire:Money Bank -1000.00 CHF Assets:Okane Bank 1000.00 CHF + Assets:Wire:Money Bank -1000.00 CHF 2021/10/02 * Taro and Jiro - Income:Salary -6000.00 CHF Assets:Okane Bank 6000.00 CHF + Income:Salary -6000.00 CHF 2021/10/03 * (20211031/3/1) Herr Haus Okane und Frau Hause Okane - Assets:Okane Bank -1880.00 CHF Expenses:House 1880.00 CHF + Assets:Okane Bank -1880.00 CHF 2021/10/03 * (20211031/3/2) OKANE VERSICHERUNGEN - Assets:Okane Bank -120.00 CHF ! Expenses:Insurance 120.00 CHF + Assets:Okane Bank -120.00 CHF 2021/10/04=2021/10/05 * (20211031/4/1) 山田商店 - Assets:Okane Bank -10.10 CHF Expenses:Grocery 10.10 CHF + Assets:Okane Bank -10.10 CHF 2021/10/05 * (20211031/5/1) EURO GROCERY - Assets:Okane Bank -14.15 CHF Expenses:Grocery 11.58 EUR @ 1.092059 CHF Expenses:Commissions 1.50 CHF ; Payee: Okane Bank (fee) Expenses:Commissions 0.02 EUR @ 1.092059 CHF ; Payee: Okane Bank (fee) + Assets:Okane Bank -14.15 CHF 2021/10/06 * (20211031/6/1) Hanako Steinmann - Assets:Okane Bank -24.75 CHF ! Expenses:Unknown 24.75 CHF + Assets:Okane Bank -24.75 CHF 2021/10/07=2021/10/08 * (20211031/7/1) OTHER BANK NAIROBI - Assets:Okane Bank -52.00 CHF Expenses:Cash 50.00 CHF Expenses:Commissions 2.00 CHF ; Payee: Okane Bank (fee) + Assets:Okane Bank -52.00 CHF 2021/10/08=2021/10/10 * (20211031/8/1) OKANE BANK ATM - Assets:Okane Bank -437.60 CHF Expenses:Cash 400.00 EUR @ 1.094 CHF + Assets:Okane Bank -437.60 CHF 2021/12/31 * unknown payee - ! Income:Unknown -0.05 CHF Assets:Okane Bank 0.05 CHF + ! Income:Unknown -0.05 CHF 2022/01/03 * (20220103/9/1) unknown payee - ! Income:Unknown -10014.00 CHF Assets:Okane Bank 10000.00 CHF = 4561.90 CHF Expenses:Commissions 14.00 CHF ; Payee: Okane Bank (fee) + ! Income:Unknown -10014.00 CHF diff --git a/cli/tests/testdata/label_credit_debit.ledger b/cli/tests/testdata/label_credit_debit.ledger index 6e641bf..57068c9 100644 --- a/cli/tests/testdata/label_credit_debit.ledger +++ b/cli/tests/testdata/label_credit_debit.ledger @@ -1,12 +1,12 @@ 2021/09/01 * 五反田ATM - Assets:Cash -5000 JPY Assets:Okane Bank 5000 JPY = 12345 JPY + Assets:Cash -5000 JPY 2021/09/02 * (31415) Migros - Assets:Okane Bank -2800 JPY = 9545 JPY Expenses:Grocery 2800 JPY + Assets:Okane Bank -2800 JPY = 9545 JPY 2021/09/03 * (14142) FooBar - Assets:Okane Bank -145 JPY = 9400 JPY ! Expenses:Unknown 145 JPY + Assets:Okane Bank -145 JPY = 9400 JPY diff --git a/cli/tests/testdata/viseca.ledger b/cli/tests/testdata/viseca.ledger index d46c696..065c2f3 100644 --- a/cli/tests/testdata/viseca.ledger +++ b/cli/tests/testdata/viseca.ledger @@ -1,34 +1,34 @@ 2020/07/23=2020/07/24 * Your payment - Thank you - Assets:Wire -1803.05 CHF Liabilities:Okane Card 1803.05 CHF + Assets:Wire -1803.05 CHF 2020/08/04=2020/08/05 * certain, phone company CH - Liabilities:Okane Card -5.00 CHF Expenses:Telecom 5.00 CHF + Liabilities:Okane Card -5.00 CHF 2020/08/10=2020/08/11 * Europe Gas AT - Liabilities:Okane Card -52.10 CHF ! Expenses:Car:Gas 46.88 EUR @ 1.092432 CHF Expenses:Commissions 0.90 CHF ; Payee: Okane Card (fee) + Liabilities:Okane Card -52.10 CHF 2020/08/11=2020/08/12 * GOOGLE *YouTubePremium, g.co/helppay# GB - Liabilities:Okane Card -23.90 CHF Expenses:Amusement 23.90 CHF + Liabilities:Okane Card -23.90 CHF 2020/12/13=2020/12/15 * PAYPAL *STEAM GAMES, 35314369001 GB - Liabilities:Okane Card -19.35 CHF ! Expenses:Unknown 19.00 CHF Expenses:Commissions 0.35 CHF ; Payee: Okane Card (fee) + Liabilities:Okane Card -19.35 CHF 2021/03/05=2021/02/24 * HM.COM, NEUENDORF CH - ! Income:Unknown -92.90 CHF Liabilities:Okane Card 92.90 CHF + ! Income:Unknown -92.90 CHF 2022/08/11=2022/07/23 * AMZNPRIME DE AMZN.DE/I, Luxembourg LU - ! Income:Unknown -7.99 EUR @ 0.988364 CHF Liabilities:Okane Card 8.05 CHF Expenses:Commissions -0.15 CHF ; Payee: Okane Card (fee) + ! Income:Unknown -7.99 EUR @ 0.988364 CHF