mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
save and print entry and transaction comments
This commit is contained in:
parent
5763a80fda
commit
6dc6186c0d
@ -30,7 +30,7 @@ isEntryBalanced e = (sumLedgerTransactions . etransactions) e == 0
|
||||
|
||||
autofillEntry :: LedgerEntry -> LedgerEntry
|
||||
autofillEntry e =
|
||||
LedgerEntry (edate e) (estatus e) (ecode e) (edescription e)
|
||||
LedgerEntry (edate e) (estatus e) (ecode e) (edescription e) (ecomment e)
|
||||
(autofillTransactions (etransactions e))
|
||||
|
||||
-- the print command shows cleaned up ledger file entries, something like:
|
||||
@ -49,25 +49,27 @@ showEntry :: LedgerEntry -> String
|
||||
showEntry e =
|
||||
unlines $ ["", description] ++ (showtxns $ etransactions e)
|
||||
where
|
||||
description = concat [date, status, code, desc]
|
||||
description = concat [date, status, code, desc, comment]
|
||||
date = showDate $ edate e
|
||||
status = if estatus e then " *" else ""
|
||||
code = if (length $ ecode e) > 0 then " "++(printf "%-10s" $ ecode e) else ""
|
||||
desc = " " ++ (elideRight 20 $ edescription e)
|
||||
comment = if (length $ ecomment e) > 0 then " ; "++(printf "%-20s" $ ecomment e) else ""
|
||||
showtxns (t1:t2:[]) = [showtxn t1, showtxnnoamt t2]
|
||||
showtxns ts = map showtxn ts
|
||||
showtxn t = showacct t ++ " " ++ (showamount $ tamount t)
|
||||
showtxnnoamt t = showacct t ++ " "
|
||||
showtxn t = showacct t ++ " " ++ (showamount $ tamount t) ++ (showcomment $ tcomment t)
|
||||
showtxnnoamt t = showacct t ++ " " ++ (showcomment $ tcomment t)
|
||||
showacct t = " " ++ (showaccountname $ taccount t)
|
||||
showamount = printf "%11s" . showAmountRounded
|
||||
showaccountname = printf "%-35s" . elideRight 35
|
||||
showcomment s = if (length s) > 0 then " ; "++(printf "%-20s" $ elideRight 20 s) else ""
|
||||
|
||||
showEntries :: [LedgerEntry] -> String
|
||||
showEntries = concatMap showEntry
|
||||
|
||||
entrySetPrecision :: Int -> LedgerEntry -> LedgerEntry
|
||||
entrySetPrecision p (LedgerEntry d s c desc ts) =
|
||||
LedgerEntry d s c desc $ map (ledgerTransactionSetPrecision p) ts
|
||||
entrySetPrecision p (LedgerEntry d s c desc comm ts) =
|
||||
LedgerEntry d s c desc comm $ map (ledgerTransactionSetPrecision p) ts
|
||||
|
||||
|
||||
-- modifier & periodic entries
|
||||
|
@ -33,4 +33,4 @@ sumLedgerTransactions :: [LedgerTransaction] -> Amount
|
||||
sumLedgerTransactions = sum . map tamount
|
||||
|
||||
ledgerTransactionSetPrecision :: Int -> LedgerTransaction -> LedgerTransaction
|
||||
ledgerTransactionSetPrecision p (LedgerTransaction a amt) = LedgerTransaction a amt{precision=p}
|
||||
ledgerTransactionSetPrecision p (LedgerTransaction a amt c) = LedgerTransaction a amt{precision=p} c
|
||||
|
2
NOTES
2
NOTES
@ -3,8 +3,6 @@ hledger project notes
|
||||
* TO DO
|
||||
** bugs/cleanup
|
||||
** ledger features
|
||||
*** print command
|
||||
**** need to save & print comments
|
||||
*** handle mixed amounts, non-money currencies
|
||||
**** handle precision per currency
|
||||
*** handle time logs
|
||||
|
31
Parse.hs
31
Parse.hs
@ -152,10 +152,22 @@ ledger = do
|
||||
return $ LedgerFile modifier_entries periodic_entries entries
|
||||
|
||||
ledgernondatalines :: Parser [String]
|
||||
ledgernondatalines = many (ledgerdirective <|> ledgercomment <|> do {whiteSpace1; return []})
|
||||
ledgernondatalines = many (ledgerdirective <|> ledgercommentline <|> do {whiteSpace1; return []})
|
||||
|
||||
ledgercommentline :: Parser String
|
||||
ledgercommentline = do
|
||||
char ';'
|
||||
many spacenonewline
|
||||
restofline <?> "comment line"
|
||||
|
||||
ledgercomment :: Parser String
|
||||
ledgercomment = char ';' >> restofline <?> "comment"
|
||||
ledgercomment =
|
||||
try (do
|
||||
char ';'
|
||||
many spacenonewline
|
||||
many (noneOf "\n")
|
||||
)
|
||||
<|> return "" <?> "comment"
|
||||
|
||||
ledgerdirective :: Parser String
|
||||
ledgerdirective = char '!' >> restofline <?> "directive"
|
||||
@ -183,10 +195,12 @@ ledgerentry = do
|
||||
date <- ledgerdate
|
||||
status <- ledgerstatus
|
||||
code <- ledgercode
|
||||
description <- anyChar `manyTill` ledgereol
|
||||
description <- many (noneOf ";\n") <?> "description"
|
||||
comment <- ledgercomment
|
||||
restofline
|
||||
transactions <- ledgertransactions
|
||||
ledgernondatalines
|
||||
return $ autofillEntry $ LedgerEntry date status code description transactions
|
||||
return $ autofillEntry $ LedgerEntry date status code description comment transactions
|
||||
|
||||
ledgerdate :: Parser String
|
||||
ledgerdate = do
|
||||
@ -213,9 +227,10 @@ ledgertransaction = do
|
||||
account <- ledgeraccount
|
||||
amount <- ledgeramount
|
||||
many spacenonewline
|
||||
ledgereol
|
||||
many ledgercomment
|
||||
return (LedgerTransaction account amount)
|
||||
comment <- ledgercomment
|
||||
restofline
|
||||
many ledgercommentline
|
||||
return (LedgerTransaction account amount comment)
|
||||
|
||||
-- account names may have single spaces in them, and are terminated by two or more spaces
|
||||
ledgeraccount :: Parser String
|
||||
@ -240,7 +255,7 @@ ledgeramount =
|
||||
striptrailingpoint = reverse . dropWhile (=='.') . reverse
|
||||
|
||||
ledgereol :: Parser String
|
||||
ledgereol = ledgercomment <|> do {newline; return []}
|
||||
ledgereol = do {newline; return []}
|
||||
|
||||
spacenonewline :: Parser Char
|
||||
spacenonewline = satisfy (\c -> c `elem` " \v\f\t")
|
||||
|
56
Tests.hs
56
Tests.hs
@ -65,7 +65,7 @@ parseEqual parsed other =
|
||||
|
||||
transaction1_str = " expenses:food:dining $10.00\n"
|
||||
|
||||
transaction1 = LedgerTransaction "expenses:food:dining" (dollars 10)
|
||||
transaction1 = LedgerTransaction "expenses:food:dining" (dollars 10) ""
|
||||
|
||||
entry1_str = "\
|
||||
\2007/01/28 coopportunity\n\
|
||||
@ -74,9 +74,9 @@ entry1_str = "\
|
||||
\\n" --"
|
||||
|
||||
entry1 =
|
||||
(LedgerEntry "2007/01/28" False "" "coopportunity"
|
||||
[LedgerTransaction "expenses:food:groceries" (Amount (getcurrency "$") 47.18 2),
|
||||
LedgerTransaction "assets:checking" (Amount (getcurrency "$") (-47.18) 2)])
|
||||
(LedgerEntry "2007/01/28" False "" "coopportunity" ""
|
||||
[LedgerTransaction "expenses:food:groceries" (Amount (getcurrency "$") 47.18 2) "",
|
||||
LedgerTransaction "assets:checking" (Amount (getcurrency "$") (-47.18) 2) ""])
|
||||
|
||||
entry2_str = "\
|
||||
\2007/01/27 * joes diner\n\
|
||||
@ -211,62 +211,74 @@ ledger7 = LedgerFile
|
||||
[]
|
||||
[
|
||||
LedgerEntry {
|
||||
edate="2007/01/01", estatus=False, ecode="*", edescription="opening balance",
|
||||
edate="2007/01/01", estatus=False, ecode="*", edescription="opening balance", ecomment="",
|
||||
etransactions=[
|
||||
LedgerTransaction {taccount="assets:cash",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=4.82, precision=2}},
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=4.82, precision=2},
|
||||
tcomment=""},
|
||||
LedgerTransaction {taccount="equity:opening balances",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-4.82), precision=2}}
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-4.82), precision=2},
|
||||
tcomment=""}
|
||||
]
|
||||
}
|
||||
,
|
||||
LedgerEntry {
|
||||
edate="2007/02/01", estatus=False, ecode="*", edescription="ayres suites",
|
||||
edate="2007/02/01", estatus=False, ecode="*", edescription="ayres suites", ecomment="",
|
||||
etransactions=[
|
||||
LedgerTransaction {taccount="expenses:vacation",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=179.92, precision=2}},
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=179.92, precision=2},
|
||||
tcomment=""},
|
||||
LedgerTransaction {taccount="assets:checking",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-179.92), precision=2}}
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-179.92), precision=2},
|
||||
tcomment=""}
|
||||
]
|
||||
}
|
||||
,
|
||||
LedgerEntry {
|
||||
edate="2007/01/02", estatus=False, ecode="*", edescription="auto transfer to savings",
|
||||
edate="2007/01/02", estatus=False, ecode="*", edescription="auto transfer to savings", ecomment="",
|
||||
etransactions=[
|
||||
LedgerTransaction {taccount="assets:saving",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=200, precision=2}},
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=200, precision=2},
|
||||
tcomment=""},
|
||||
LedgerTransaction {taccount="assets:checking",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-200), precision=2}}
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-200), precision=2},
|
||||
tcomment=""}
|
||||
]
|
||||
}
|
||||
,
|
||||
LedgerEntry {
|
||||
edate="2007/01/03", estatus=False, ecode="*", edescription="poquito mas",
|
||||
edate="2007/01/03", estatus=False, ecode="*", edescription="poquito mas", ecomment="",
|
||||
etransactions=[
|
||||
LedgerTransaction {taccount="expenses:food:dining",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=4.82, precision=2}},
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=4.82, precision=2},
|
||||
tcomment=""},
|
||||
LedgerTransaction {taccount="assets:cash",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-4.82), precision=2}}
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-4.82), precision=2},
|
||||
tcomment=""}
|
||||
]
|
||||
}
|
||||
,
|
||||
LedgerEntry {
|
||||
edate="2007/01/03", estatus=False, ecode="*", edescription="verizon",
|
||||
edate="2007/01/03", estatus=False, ecode="*", edescription="verizon", ecomment="",
|
||||
etransactions=[
|
||||
LedgerTransaction {taccount="expenses:phone",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=95.11, precision=2}},
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=95.11, precision=2},
|
||||
tcomment=""},
|
||||
LedgerTransaction {taccount="assets:checking",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-95.11), precision=2}}
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-95.11), precision=2},
|
||||
tcomment=""}
|
||||
]
|
||||
}
|
||||
,
|
||||
LedgerEntry {
|
||||
edate="2007/01/03", estatus=False, ecode="*", edescription="discover",
|
||||
edate="2007/01/03", estatus=False, ecode="*", edescription="discover", ecomment="",
|
||||
etransactions=[
|
||||
LedgerTransaction {taccount="liabilities:credit cards:discover",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=80, precision=2}},
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=80, precision=2},
|
||||
tcomment=""},
|
||||
LedgerTransaction {taccount="assets:checking",
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-80), precision=2}}
|
||||
tamount=Amount {currency=(getcurrency "$"), quantity=(-80), precision=2},
|
||||
tcomment=""}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
15
TimeLog.hs
15
TimeLog.hs
@ -9,7 +9,7 @@ import LedgerEntry
|
||||
import LedgerFile
|
||||
|
||||
instance Show TimeLogEntry where
|
||||
show t = printf "%s %s %s" (show $ tcode t) (tdatetime t) (tcomment t)
|
||||
show t = printf "%s %s %s" (show $ tlcode t) (tldatetime t) (tlcomment t)
|
||||
|
||||
instance Show TimeLog where
|
||||
show tl = printf "TimeLog with %d entries" $ length $ timelog_entries tl
|
||||
@ -30,16 +30,17 @@ entriesFromTimeLogEntries [clockin,clockout] =
|
||||
estatus = True,
|
||||
ecode = "",
|
||||
edescription = accountname,
|
||||
ecomment = "",
|
||||
etransactions = [
|
||||
LedgerTransaction accountname amount,
|
||||
LedgerTransaction "TIME" (-amount)
|
||||
LedgerTransaction accountname amount "",
|
||||
LedgerTransaction "TIME" (-amount) ""
|
||||
]}
|
||||
]
|
||||
where
|
||||
accountname = tcomment clockin
|
||||
intime = tdatetime clockin
|
||||
indate = dateFrom $ tdatetime clockin
|
||||
outtime = tdatetime clockout
|
||||
accountname = tlcomment clockin
|
||||
intime = tldatetime clockin
|
||||
indate = dateFrom $ tldatetime clockin
|
||||
outtime = tldatetime clockout
|
||||
amount = hours 0 -- read $ outtime - intime
|
||||
|
||||
entriesFromTimeLogEntries many =
|
||||
|
@ -10,7 +10,7 @@ import Currency
|
||||
|
||||
|
||||
flattenEntry :: LedgerEntry -> [Transaction]
|
||||
flattenEntry (LedgerEntry d _ _ desc ts) = [Transaction d desc (taccount t) (tamount t) | t <- ts]
|
||||
flattenEntry (LedgerEntry d _ _ desc _ ts) = [Transaction d desc (taccount t) (tamount t) | t <- ts]
|
||||
|
||||
transactionSetPrecision :: Int -> Transaction -> Transaction
|
||||
transactionSetPrecision p (Transaction d desc a amt) = Transaction d desc a amt{precision=p}
|
||||
@ -55,12 +55,12 @@ showTransactionsWithBalances ts b =
|
||||
|
||||
showTransactionDescriptionAndBalance :: Transaction -> Amount -> String
|
||||
showTransactionDescriptionAndBalance t b =
|
||||
(showEntryDescription $ LedgerEntry (date t) False "" (description t) [])
|
||||
++ (showLedgerTransaction $ LedgerTransaction (account t) (amount t)) ++ (showBalance b)
|
||||
(showEntryDescription $ LedgerEntry (date t) False "" (description t) "" [])
|
||||
++ (showLedgerTransaction $ LedgerTransaction (account t) (amount t) "") ++ (showBalance b)
|
||||
|
||||
showTransactionAndBalance :: Transaction -> Amount -> String
|
||||
showTransactionAndBalance t b =
|
||||
(replicate 32 ' ') ++ (showLedgerTransaction $ LedgerTransaction (account t) (amount t)) ++ (showBalance b)
|
||||
(replicate 32 ' ') ++ (showLedgerTransaction $ LedgerTransaction (account t) (amount t) "") ++ (showBalance b)
|
||||
|
||||
showBalance :: Amount -> String
|
||||
showBalance b = printf " %12s" (showAmountRoundedOrZero b)
|
||||
|
10
Types.hs
10
Types.hs
@ -53,7 +53,8 @@ type AccountName = String
|
||||
-- a line item in a ledger entry
|
||||
data LedgerTransaction = LedgerTransaction {
|
||||
taccount :: AccountName,
|
||||
tamount :: Amount
|
||||
tamount :: Amount,
|
||||
tcomment :: String
|
||||
} deriving (Eq)
|
||||
|
||||
-- a ledger entry, with two or more balanced transactions
|
||||
@ -62,6 +63,7 @@ data LedgerEntry = LedgerEntry {
|
||||
estatus :: Bool,
|
||||
ecode :: String,
|
||||
edescription :: String,
|
||||
ecomment :: String,
|
||||
etransactions :: [LedgerTransaction]
|
||||
} deriving (Eq)
|
||||
|
||||
@ -79,9 +81,9 @@ data PeriodicEntry = PeriodicEntry {
|
||||
|
||||
-- we also parse timeclock.el timelogs
|
||||
data TimeLogEntry = TimeLogEntry {
|
||||
tcode :: Char,
|
||||
tdatetime :: DateTime,
|
||||
tcomment :: String
|
||||
tlcode :: Char,
|
||||
tldatetime :: DateTime,
|
||||
tlcomment :: String
|
||||
} deriving (Eq,Ord)
|
||||
|
||||
data TimeLog = TimeLog {
|
||||
|
Loading…
Reference in New Issue
Block a user