|
| 1 | +-- | /balance handlers. |
| 2 | + |
| 3 | +{-# LANGUAGE NamedFieldPuns #-} |
| 4 | +{-# LANGUAGE OverloadedStrings #-} |
| 5 | + |
| 6 | +module Hledger.Web.Handler.BalanceR where |
| 7 | + |
| 8 | +import Hledger |
| 9 | +import Hledger.Cli.CliOptions |
| 10 | +import Hledger.Write.Html.Blaze (printHtml) |
| 11 | +import Hledger.Web.Import |
| 12 | +import Hledger.Web.WebOptions |
| 13 | +import qualified Hledger.Cli.Commands.Balance as Balance |
| 14 | +import qualified Hledger.Query as Query |
| 15 | + |
| 16 | +import Text.Megaparsec.Error (errorBundlePretty) |
| 17 | +import qualified Text.Blaze.Html4.Strict as Blaze |
| 18 | +import qualified Data.Text as Text |
| 19 | +import qualified Yesod |
| 20 | + |
| 21 | + |
| 22 | +-- | The balance or multi-period balance view, with sidebar. |
| 23 | +getBalanceR :: Handler Html |
| 24 | +getBalanceR = do |
| 25 | + checkServerSideUiEnabled |
| 26 | + VD{j, q, qparam, opts, today} <- getViewData |
| 27 | + require ViewPermission |
| 28 | + let title :: Text |
| 29 | + title = "Balance Report" <> if q /= Any then ", filtered" else "" |
| 30 | + rspecOrig = reportspec_ $ cliopts_ opts |
| 31 | + ropts = |
| 32 | + (_rsReportOpts rspecOrig) { |
| 33 | + balance_base_url_ = Just "", |
| 34 | + querystring_ = Query.words'' queryprefixes qparam |
| 35 | + } |
| 36 | + rspec = |
| 37 | + rspecOrig { |
| 38 | + _rsQuery = filterQuery (not . queryIsDepth) q, |
| 39 | + _rsReportOpts = ropts |
| 40 | + } |
| 41 | + |
| 42 | + defaultLayout $ do |
| 43 | + mperiod <- lookupGetParam "period" |
| 44 | + case mperiod of |
| 45 | + Nothing -> do |
| 46 | + setTitle "balance - hledger-web" |
| 47 | + Yesod.toWidget . |
| 48 | + (Blaze.h2 (Blaze.toHtml title) >>) . |
| 49 | + printHtml . map (map (fmap Blaze.toHtml)) . |
| 50 | + Balance.balanceReportAsSpreadsheet ropts $ |
| 51 | + balanceReport rspec j |
| 52 | + Just perStr -> do |
| 53 | + setTitle "multibalance - hledger-web" |
| 54 | + case parsePeriodExpr today perStr of |
| 55 | + Left msg -> Yesod.toWidget $ Text.pack $ errorBundlePretty msg |
| 56 | + Right (per_,_) -> |
| 57 | + Yesod.toWidget . |
| 58 | + (Blaze.h2 (Blaze.toHtml title) >>) . |
| 59 | + printHtml . map (map (fmap Blaze.toHtml)) . |
| 60 | + snd . Balance.multiBalanceReportAsSpreadsheet ropts $ |
| 61 | + let rspec' = rspec{_rsReportOpts = ropts{interval_ = per_}} in |
| 62 | + multiBalanceReport rspec' j |
0 commit comments