imp: nicer invalid balance assignment errors
This commit is contained in:
parent
3135753e94
commit
30080a9aa1
@ -350,7 +350,7 @@ type Balancing s = ReaderT (BalancingState s) (ExceptT String (ST s))
|
||||
data BalancingState s = BalancingState {
|
||||
-- read only
|
||||
bsStyles :: Maybe (M.Map CommoditySymbol AmountStyle) -- ^ commodity display styles
|
||||
,bsUnassignable :: S.Set AccountName -- ^ accounts in which balance assignments may not be used
|
||||
,bsUnassignable :: S.Set AccountName -- ^ accounts where balance assignments may not be used (because of auto posting rules)
|
||||
,bsAssrt :: Bool -- ^ whether to check balance assertions
|
||||
-- mutable
|
||||
,bsBalances :: H.HashTable s AccountName MixedAmount -- ^ running account balances, initially empty
|
||||
@ -422,8 +422,8 @@ journalBalanceTransactions bopts' j' =
|
||||
-- display precisions used in balanced checking
|
||||
styles = Just $ journalCommodityStyles j
|
||||
bopts = bopts'{commodity_styles_=styles}
|
||||
-- balance assignments will not be allowed on these
|
||||
txnmodifieraccts = S.fromList . map (paccount . tmprPosting) . concatMap tmpostingrules $ jtxnmodifiers j
|
||||
-- balance assignments are not allowed on accounts affected by auto postings
|
||||
autopostingaccts = S.fromList . map (paccount . tmprPosting) . concatMap tmpostingrules $ jtxnmodifiers j
|
||||
in
|
||||
runST $ do
|
||||
-- We'll update a mutable array of transactions as we balance them,
|
||||
@ -448,7 +448,7 @@ journalBalanceTransactions bopts' j' =
|
||||
-- 2. Sort these items by date, preserving the order of same-day items,
|
||||
-- and step through them while keeping running account balances,
|
||||
runningbals <- lift $ H.newSized (length $ journalAccountNamesUsed j)
|
||||
flip runReaderT (BalancingState styles txnmodifieraccts (not $ ignore_assertions_ bopts) runningbals balancedtxns) $ do
|
||||
flip runReaderT (BalancingState styles autopostingaccts (not $ ignore_assertions_ bopts) runningbals balancedtxns) $ do
|
||||
-- performing balance assignments in, and balancing, the remaining transactions,
|
||||
-- and checking balance assertions as each posting is processed.
|
||||
void $ mapM' balanceTransactionAndCheckAssertionsB $ sortOn (either postingDate tdate) psandts
|
||||
@ -618,30 +618,29 @@ checkIllegalBalanceAssignmentB p = do
|
||||
checkBalanceAssignmentPostingDateB :: Posting -> Balancing s ()
|
||||
checkBalanceAssignmentPostingDateB p =
|
||||
when (hasBalanceAssignment p && isJust (pdate p)) $
|
||||
throwError . T.unpack $ T.unlines
|
||||
["postings which are balance assignments may not have a custom date."
|
||||
,"Please write the posting amount explicitly, or remove the posting date:"
|
||||
throwError $ chomp $ unlines [
|
||||
"can't use balance assignment with custom posting date"
|
||||
,""
|
||||
,maybe (T.unlines $ showPostingLines p) showTransaction $ ptransaction p
|
||||
,chomp1 $ T.unpack $ maybe (T.unlines $ showPostingLines p) showTransaction $ ptransaction p
|
||||
,"Balance assignments may not be used on postings with a custom posting date"
|
||||
,"(it makes balancing the journal impossible)."
|
||||
,"Please write the posting amount explicitly (or remove the posting date)."
|
||||
]
|
||||
|
||||
-- | Throw an error if this posting is trying to do a balance assignment and
|
||||
-- the account does not allow balance assignments (eg because it is referenced
|
||||
-- by a transaction modifier, which might generate additional postings to it).
|
||||
-- by an auto posting rule, which might generate additional postings to it).
|
||||
checkBalanceAssignmentUnassignableAccountB :: Posting -> Balancing s ()
|
||||
checkBalanceAssignmentUnassignableAccountB p = do
|
||||
unassignable <- R.asks bsUnassignable
|
||||
when (hasBalanceAssignment p && paccount p `S.member` unassignable) $
|
||||
throwError . T.unpack $ T.unlines
|
||||
["balance assignments cannot be used with accounts which are"
|
||||
,"posted to by transaction modifier rules (auto postings)."
|
||||
,"Please write the posting amount explicitly, or remove the rule."
|
||||
throwError $ chomp $ unlines [
|
||||
"can't use balance assignment with auto postings"
|
||||
,""
|
||||
,"account: " <> paccount p
|
||||
,""
|
||||
,"transaction:"
|
||||
,""
|
||||
,maybe (T.unlines $ showPostingLines p) showTransaction $ ptransaction p
|
||||
,chomp1 $ T.unpack $ maybe (T.unlines $ showPostingLines p) (showTransaction) $ ptransaction p
|
||||
,"Balance assignments may not be used on accounts affected by auto posting rules"
|
||||
,"(it makes balancing the journal impossible)."
|
||||
,"Please write the posting amount explicitly (or remove the auto posting rule)."
|
||||
]
|
||||
|
||||
-- lenses
|
||||
|
||||
Loading…
Reference in New Issue
Block a user