1 {-# LANGUAGE NamedFieldPuns #-}
2 module Hcompta.CLI.Command.Print where
4 import Control.Arrow (first)
5 import Control.Applicative ((<$>))
6 import Control.Monad.IO.Class (liftIO)
7 import Control.Monad.Trans.Except (runExceptT)
8 import qualified Data.Either
9 import qualified Data.List
10 import qualified Data.Map.Strict as Data.Map
11 import qualified Data.Text.Lazy as TL
12 import System.Console.GetOpt
16 import System.Environment as Env (getProgName)
17 import System.Exit (exitWith, ExitCode(..))
18 import qualified System.IO as IO
20 import qualified Hcompta.CLI.Args as Args
21 import qualified Hcompta.CLI.Context as Context
22 import qualified Hcompta.CLI.Write as Write
23 import qualified Hcompta.Calc.Balance as Balance
24 import qualified Hcompta.Format.Ledger.Balance as Ledger.Balance
25 import qualified Hcompta.Format.Ledger.Journal as Ledger.Journal
26 import qualified Hcompta.Format.Ledger.Read as Ledger.Read
27 import qualified Hcompta.Format.Ledger.Write as Ledger.Write
28 import qualified Hcompta.Lib.Foldable as Lib.Foldable
29 import qualified Hcompta.Model.Journal
30 import qualified Hcompta.Model.Transaction as Transaction
34 { ctx_input :: [FilePath]
45 bin <- Env.getProgName
48 , " "++bin++" print [option..]"
50 , usageInfo "OPTIONS" options
53 options :: Args.Options Ctx
57 usage >>= IO.hPutStr IO.stderr
58 exitWith ExitSuccess))
60 , Option "i" ["input"]
62 return $ ctx{ctx_input=s:ctx_input ctx}) "FILE")
63 "read data from given file"
66 run :: Context.Context -> [String] -> IO ()
69 first (\ctx -> ctx{ctx_input=reverse $ ctx_input ctx}) <$>
70 Args.parse context usage options (nil, args)
71 (flip mapM) (ctx_input ctx) $ \path -> do
75 Left ko -> return $ Left (path, ko)
76 Right ok -> return $ Right ok
77 >>= return . Data.Either.partitionEithers
80 (flip mapM_) kos $ \(_path, ko) -> Write.fatal context ko
82 with_color <- Write.with_color context IO.stdout
83 case Lib.Foldable.find Ledger.Balance.equilibre journals of
84 Just ((tr, eq), path) ->
85 Write.fatal context $ concat
86 [ "the following transaction is not equilibrated, because:"
88 Balance.Equilibre e | not $ Balance.is_equilibrable eq ->
89 concat $ Data.Map.elems $ Data.Map.mapWithKey
90 (\unit Balance.Unit_Sum{Balance.amount} -> concat
92 , TL.unpack $ Ledger.Write.show with_color $ Ledger.Write.unit unit
93 , "\" sums up to the non-null amount: "
94 , TL.unpack $ Ledger.Write.show with_color $ Ledger.Write.amount amount
98 , "\nin ", show $ Transaction.sourcepos tr
99 , concat $ map (\j -> "\nincluded by \"" ++ Ledger.Journal.file j ++ "\"") path
100 , ":\n", TL.unpack $ Ledger.Write.show with_color $
101 Ledger.Write.transaction tr
105 = Hcompta.Model.Journal.unions $
106 Data.List.map Ledger.Journal.to_Model journals
107 Ledger.Write.put with_color IO.stdout $ do
108 Ledger.Write.journal journal