{- | Module : Business.Bookkeeping.JP.Csv Copyright : Kadzuya Okamoto 2017 License : MIT Stability : experimental Portability : unknown This module exports functions to produce CSV-formatted texts for Japanese people. -} {-# LANGUAGE NoImplicitPrelude #-} module Business.Bookkeeping.JP.Csv ( fromTransactions ) where import Business.Bookkeeping import Data.MonoTraversable.Unprefixed (intercalate) import Data.Semigroup ((<>)) import Data.Sequences (pack, unlines) import Data.Text (Text) import Data.Time.Format (defaultTimeLocale, formatTime) import Prelude hiding (unlines) {-| Produce CSV-formatted texts from `Transactions` value. -} fromTransactions :: Transactions -> Text fromTransactions = unlines . (transactionHeader:) . fmap transactionBody . zip [1..] . runTransactions transactionBody :: (Int, Transaction) -> Text transactionBody (n, Transaction {..}) = intercalate "," [ tshow n , tshow $ formatTime defaultTimeLocale "%Y/%m/%d" tDay , formatText . unCategoryName . cName . unDebitCategory $ tDebit , maybe "" formatText . unCategorySubName . cName . unDebitCategory $ tDebit , formatText . unCategoryName . cName . unCreditCategory $ tCredit , maybe "" formatText . unCategorySubName . cName . unCreditCategory $ tCredit , formatText . unDescription $ tDescription , formatText . unSubDescription $ tSubDescription , tshow $ unAmount tAmount ] formatText :: Text -> Text formatText = (<> "\"") . ("\"" <>) transactionHeader :: Text transactionHeader = intercalate "," [ formatText "取引No" , formatText "取引日" , formatText "借方勘定科目" , formatText "借方補助勘定科目" , formatText "貸方勘定科目" , formatText "貸方補助勘定科目" , formatText "摘要" , formatText "細目" , formatText "貸借金額" ] tshow :: Show a => a -> Text tshow = pack . show