526 lines
12 KiB
Markdown
526 lines
12 KiB
Markdown
## 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)
|
|
``` |