## Transactions ``` ; Simplest Transaction 2000-01-01 * Account1 200 USD Account2 -200 USD ; With Payee 2023-01-01 * Payee Account1 200 USD Account2 -200 USD ; With Payee and Narration 2023-01-01 * Payee | Narration Account1 200 USD Account2 -200 USD ; With Narration only 2023-01-01 * | Narration Account1 200 USD Account2 -200 USD ; Incomplete Transaction 2000-01-01 ! Account1 200 USD Account2 -200 USD ; Partial incomplete transaction 2000-01-01 * Account1 200 USD ! Account2 -200 USD ``` # Conversion/inventories ``` ; TODO: how to define currency conversion does not have cost basis ; Currency conversion per unit 2000-01-01 * Account1 10 USD @ 1.2 EUR Account2 -12 EUR ; Currency conversion total cost 2000-01-01 * Account1 10 USD @@ 12 EUR Account2 -12 EUR ; Inventory with cost basis per unit 2000-01-01 * Account1 10 AAPL @ 100 USD Account2 -1000 USD ; Inventory with total cost basis 2000-01-01 * Account1 10 AAPL @@ 1000 USD Account2 -1000 USD ; Inventory with explicit unit cost basis + other properties 2000-01-01 * Account1 10 AAPL {100 USD, 2000-01-02, "lot 1"} @ 100 USD Account2 -1000 USD ; Inventory with explicit total cost basis? 2000-01-01 * ; TODO better syntax? Account1 10 AAPL {{1000 USD, 2000-01-02, "lot 1"}} @@ 1000 USD Account2 -1000 USD ; Inventory specifying cost basis and current price 2000-01-01 * ; Current market value conversion == $1100 Account1 10 AAPL {100 USD} @ 110 USD Account2 -1000 USD ; Sell with price known 2000-01-01 * ; Assuming lot existed of 10 AAPL @ 100 USD ; Current price needs to match up with non-Income accounts ; (-10 * $200 + $2000) == 0 Account1 -10 AAPL @ 200 USD Account2 2000 USD Income:Gains -1000 USD ; Sell with gains known 2000-01-01 * ; Assuming lot existed of 10 AAPL @ 100 USD ; Compute current price of -10 * x + 2000 USD == 0 -> x = 200 USD? Account1 -10 AAPL Account2 2000 USD Income:Gains -1000 USD ; Sell with specific lot price 2000-01-01 * Account1 -10 AAPL {100 USD} ... ; Sell with auto lot strategy 2000-01-01 * Account1 -10 AAPL {} ... ; Transaction metadata 2000-01-01 * key1: "value" key2: 100 key3: 2000-01-01 key4: Account1:abc key5: 100 USD ... ; Posting metadata 2000-01-01 * Account1 200 USD key1: "value" ... ; Postings with different dates 2000-01-01 * Account1 200 USD Account2 -200 USD [2000-01-02] ; ability to specify time? (ISO 8601-ish) ; potentially support time as metadata? ; arithmetic in amounts: `( ) * / - +` ; should currency/commodity be required? ; payee per line? ; what if inventory doesn't match up perfectly with rounding? ; e.g. 4 @ $1.001 = $4.004 and other account has $4.00 ; ability to specify using average cost basis ; for account? for commodity per account? ; when selling check ; fixed lot prices? {=100 USD} ; note - storing unit value is always more accurate, no need to store total cost? ; auto import transactions ; be able to approve transactions ; calculate net worth relative to inflation ; some way to change value of a dollar? ; explicit handling of stock splits to prevent historical price discontinuity? ; ISO 8601 dates YY ~ Century YYY ~ YYYY ~ Year YYYY-MM ~ Month YYYY-MM-DD ~ Day YYYY-Www ~ Week YYYY-Www-D ~ Day of week YYYY-DDD ~ Ordinal day? ; how to represent intervals for projections? xxxx ~ Every year xxxx-MM-DD ~ Every year on MM-DD xxxx-xx-xx ~ Every day YYYY-xx-xx ~ Every day in YYYY xxxx-Wxx ~ Every week xxxx-Wxx-1 ~ Every monday xxxx-xx ~ Every month ??? ~ Every quarter ??? ~ Every half R/P1Y ~ Every year? R/YYYY/P1Y ~ Every year starting with YYYY R/YYYY-MM-DD/P1Y ~ Every year on MM-DD starting with YYYY ; TODO: continue this R/YYYY-MM-DD/P1Y R/YYYY-MM-DD/P1D R/YYYY-MM-DD/P1D/YYYY-MM-DD $.04 ; Ability to specify the weekday prior? ; Buying a house that cost $500,000 with 20% down payment and 5% interest rate for 30 year 2000-01-01 * Bank | Take out loan Assets -$100,000 Equity:House 1 house @@ $500,000 Liabilities:Mortgage -$400,000 ; Amortization schedule: ; = P * ((1+r)^n)/((1+r)^n - 1) ; P = principal loan amounts ; r = monthly interest rate ; n = number of payments over loan lifetime ; P = $400,000 ; r = 5%/12 = 0.0041666... ; n = 12*30 = 360 ; ; Monthly payment = $2147.29 2000-01-01 * Bank | Mortgage Assets -$2147.29 Expenses:Interest:Mortgage (Liabilities:Mortgage * 0.05/12) Liabilities:Mortgage $2147.29 - (Liabilities:Mortgage * 0.05/12) 2000-01-01 * Bank | Mortgage Assets -$2147.29 Expenses:Interest:Mortgage $1666.67 Liabilities:Mortgage $480.62 ; Automated monthly forecast for mortgage payment ~ R360/2000-01-01/P1M * Bank Assets -$2147.29 Expenses:Interest:Mortgage (Liabilities:Mortgage * 0.05/12) Liabilities:Mortgage ; Automated interest from Fidelity - 5% per year ~ R/2000-01-01/P1M * Bank Assets:Bank (Assets:Bank-$ * (1.05^(1/12)-1)) Income:Interest ; Automated prices??? ; TODO ~ 2000-01-01/P1Y price AAPL *= 1.05 ``` ``` forecast Bank | Mortgage - start: 2000-01-01 - repeat: 1 Month - stop: 2001-01-01 Assets -$2147.29 Expenses:Interest:Mortgage (Liabilities:Mortgage * 0.05/12) Liabilities:Mortgage $2147.29 - (Liabilities:Mortgage * 0.05/12) ``` * Assets * Cash * BofA * Checking * Savings * Coinbase * ESPP * ETrade * Brokerage * RothIRA * Fidelity * 401k * Match * Roth * Trad * Brokerage * Cash Management * House * Liabilities * Credit * BofA * Chase * Mortgage * Expenses * Taxes * Federal * Return * Medicare * SocialSecurity * State * California * SDI * Georgia * Return * Income * Equity * Opening Balance * (CurrencyConversion) * (Trading) * (Transfer) ``` 2000-01-01 * Account1 10 AAPL @ 100 USD Account2 -1000 USD 2001-01-01 price AAPL 150 USD 2002-01-01 * Account1 -10 AAPL @ 200 USD Account2 2000 USD Income:Gains -1000 USD ``` * First: * Account1 ~ 10 AAPL * Account2 ~ -1000 USD * Second: * Account1 ~ 0 * Account2 ~ 1000 USD * Income:Gains ~ -1000 USD alternate: * First: * Account1 ~ 10 AAPL @ 100 USD * Account2 ~ -1000 USD * Second: * Account1 ~ 0 * Account2 ~ 1000 USD * Income:Gains ~ -1000 USD with market value: * First: * Account1 ~ 1000 USD * Account2 ~ -1000 USD * (price): * Account1 ~ 1500 USD * Account2 ~ -1000 USD * Equity:Unrealized Capital ~ -500 USD * Second: * Account1 ~ 0 * Account2 ~ 1000 USD * Income:Gains ~ -1000 USD * Equity:Unrealized Capital ~ 0 ``` 2000-01-01 * Account1 10 AAPL @ 100 USD Account2 -1000 USD Equity:Trading -10 AAPL Equity:Trading 1000 USD 2001-01-01 price AAPL 150 USD 2002-01-01 * Account1 -10 AAPL @ 200 USD Account2 2000 USD Income:Gains -1000 USD Equity:Trading 10 AAPL Equity:Trading -1000 USD ``` market equivalent: ``` 2000-01-01 * Account1 1000 USD Account2 -1000 USD Equity:Trading 0 2001-01-01 * Account1 500 USD Equity:Trading -500 USD 2001-01-01 * Account1 -2000 USD Account2 2000 USD Income:Gains -1000 USD Equity:Trading 1000 USD ``` * First: * Account1 ~ 10 AAPL * Account2 ~ -1000 USD * Equity:Trading ~ 1000 USD - 10 AAPL * Second: * Account1 ~ 0 * Account2 ~ 1000 USD * Income:Gains ~ -1000 USD * Equity:Trading ~ -1000 ``` 2000-01-01 * Account1: 12 EUR @@ 10 USD Account2: -10 USD Equity:CurrencyConversion -12 EUR Equity:CurrencyConversion 10 USD 2002-01-01 * Account1: -10 EUR @@ 10 USD Account2: 10 USD Equity:CurrencyConversion -10 USD Equity:CurrencyConversion 10 EUR ``` * First * Account1 ~ 12 EUR * Account2 ~ -10 USD * Equity:CurrencyConversion ~ 10 USD - 12 EUR * Second * Account1 ~ 2 EUR * Account2 ~ 0 * Equity:CurrencyConversion ~ -2 EUR ``` commodity USD currency: "US Dollar" code: "USD" number: 840 decimals: 2 conversion-account: Equity:CurrencyConversion aliases: ["$", "US$"] ``` ``` ; Inventory specifying cost basis and current price 2000-01-01 * ; Current market value conversion == $1100 Assets1 10 AAPL {100 USD} @ 110 USD Assets2 -1000 USD 2000-02-01 * Assets1 -10 AAPL {100 USD} @ 120 USD Assets2 1200 USD Income:CapitalGains -200 ``` Equivalent: ``` 2000-01-01 * Assets1 10 AAPL {100 USD} @ 110 USD Assets2 -1000 USD Equity:Trading -10 AAPL Equity:Trading 1000 USD 2000-02-01 * Assets1 -10 AAPL {100 USD} @ 120 USD Assets2 1200 USD Income:CapitalGains -200 USD Equity:Trading 10 AAPL Equity:Trading -1000 USD ``` Written transaction: ``` 2000-01-01 * Account1: 12 EUR @@ 10 USD Account2: -10 USD (account1 = 12 EUR, account2 = -10 USD) 2002-01-01 * Account1: -10 EUR @@ 10 USD Account2: 10 USD (account1 = 2 EUR, account2 = 0 USD) ``` Leave it in equity: ``` 2000-01-01 * Account1: 12 EUR @ 1.2 USD Account2: -10 USD Equity:CurrencyConversion -12 EUR Equity:CurrencyConversion 10 USD (account1 = 12 EUR, account2 = -10 USD, equity = 10 USD - 12 EUR) 2002-01-01 * Account1: -10 EUR @ 1 USD Account2: 10 USD Equity:CurrencyConversion -10 USD Equity:CurrencyConversion 10 EUR (account1 = 2 EUR, account2 = 0 USD, equity = 2 EUR) ``` ``` 2000-01-01 * Account1: 12 EUR @ 1.2 USD Account2: -10 USD Equity:CurrencyConversion -12 EUR Equity:CurrencyConversion 10 USD (account1 = 12 EUR, account2 = -10 USD, equity = 10 USD - 12 EUR) 2002-01-01 * Account1: -10 EUR {1.2 USD} @ 1 USD Account2: 10 USD Income:CurrencyConversion -1.67 USD Equity:CurrencyConversion -8.33 USD Equity:CurrencyConversion 10 EUR (account1 = 2 EUR, account2 = 0 USD, income = -1.67 USD, equity = 1.67 USD - 2 EUR) ``` Triple currency: Written transaction: ``` 2000-01-01 * Account2: 12 EUR @ 1.2 USD Account1: -10 USD (account1 = -10 USD, account2 = 12 EUR, account2 = -10 USD) 2002-01-01 * Account3: 11 GBP Account2: -10 EUR @ 1.1 GBP (account1 = -10 USD, account2 = 2 EUR account3 = 11 GBP) 2002-01-01 * Account1: 10 USD Account3: -10 GBP @ 1 USD (account1 = 0 USD, account2 = 2 EUR account3 = 1 GBP) ``` ``` 2000-01-01 * Account2: 12 EUR @ 1.2 USD Account1: -10 USD Equity:CurrencyConversion -12 EUR {1.2 USD} Equity:CurrencyConversion 10 USD (account1 = -10 USD, account2 = 12 EUR, account2 = -10 USD, equity = 10 USD - 12 EUR) 2002-01-01 * Account3: 11 GBP Account2: -10 EUR @ 1.1 GBP Income:CurrencyConversion 10 EUR {now} - 10 EUR {1.2 USD} Income:CurrencyConversion -10 EUR {1.2 USD} Equity:CurrencyConversion -11 GBP Equity:CurrencyConversion 10 EUR {1.2 USD} (account1 = -10 USD, account2 = 2 EUR account3 = 11 GBP, equity = 10 USD - 2 EUR - 11 GBP, income = 10 EUR {now} - 10 EUR {1.2 USD}) 2002-01-01 * Account1: 10 USD Account3: -10 GBP @ 1 USD ... (account1 = 0 USD, account2 = 2 EUR account3 = 1 GBP) ```