summaryrefslogtreecommitdiffstats
path: root/app/Import/Ing/SavingsAccountCsv.hs
diff options
context:
space:
mode:
Diffstat (limited to 'app/Import/Ing/SavingsAccountCsv.hs')
-rw-r--r--app/Import/Ing/SavingsAccountCsv.hs36
1 files changed, 19 insertions, 17 deletions
diff --git a/app/Import/Ing/SavingsAccountCsv.hs b/app/Import/Ing/SavingsAccountCsv.hs
index 3f2e5e6..16b5f92 100644
--- a/app/Import/Ing/SavingsAccountCsv.hs
+++ b/app/Import/Ing/SavingsAccountCsv.hs
@@ -12,7 +12,7 @@ import Data.Maybe (isJust)
12import Data.Text qualified as T 12import Data.Text qualified as T
13import Data.Time.Calendar (Day) 13import Data.Time.Calendar (Day)
14import Data.Vector qualified as V 14import Data.Vector qualified as V
15import Import.Ing.Shared (dateCP, decimalCP, eitherToCP, ibanCP, maybeCP, scsvOptions) 15import Import.Ing.Shared (maybeCP, parseDateM, parseDecimalM, parseIbanM, scsvOptions)
16import System.IO (Handle) 16import System.IO (Handle)
17import Text.Regex.TDFA ((=~~)) 17import Text.Regex.TDFA ((=~~))
18 18
@@ -49,7 +49,7 @@ instance MonadFail (Either String) where
49 49
50txBaseFromPrim :: PrimTx -> Either String TxBase 50txBaseFromPrim :: PrimTx -> Either String TxBase
51txBaseFromPrim ptx@PrimTx {ptxCommodity = "EUR"} = 51txBaseFromPrim ptx@PrimTx {ptxCommodity = "EUR"} =
52 return $ TxBase (ptxDate ptx) (ptxAccountId ptx) (ptxAccountName ptx) (ptxAmount ptx) (ptxResBal ptx) 52 return $ TxBase <$> ptxDate <*> ptxAccountId <*> ptxAccountName <*> ptxAmount <*> ptxResBal $ ptx
53txBaseFromPrim ptx = 53txBaseFromPrim ptx =
54 Left $ "Unexpected commodity '" ++ T.unpack (ptxCommodity ptx) ++ "' (expected EUR)" 54 Left $ "Unexpected commodity '" ++ T.unpack (ptxCommodity ptx) ++ "' (expected EUR)"
55 55
@@ -121,26 +121,25 @@ mutationTypeCP "Opname" = return WithdrawalMutation
121mutationTypeCP "Rente" = return InterestMutation 121mutationTypeCP "Rente" = return InterestMutation
122mutationTypeCP t = fail ("Unknown mutation type '" ++ T.unpack t ++ "'") 122mutationTypeCP t = fail ("Unknown mutation type '" ++ T.unpack t ++ "'")
123 123
124instance C.FromNamedRecord Tx where 124instance C.FromNamedRecord PrimTx where
125 parseNamedRecord m = 125 parseNamedRecord m =
126 eitherToCP . processPrimTx 126 PrimTx
127 =<< PrimTx 127 <$> (m .: "Datum" >>= parseDateM "%Y-%m-%d")
128 <$> (m .: "Datum" >>= dateCP "%Y-%m-%d") 128 <*> m .: "Omschrijving"
129 <*> m .: "Omschrijving" 129 <*> m .: "Rekening"
130 <*> m .: "Rekening" 130 <*> m .: "Rekening naam"
131 <*> m .: "Rekening naam" 131 <*> (m .: "Tegenrekening" >>= maybeCP parseIbanM)
132 <*> (m .: "Tegenrekening" >>= maybeCP ibanCP) 132 <*> (m .: "Af Bij" >>= debitCreditCP)
133 <*> (m .: "Af Bij" >>= debitCreditCP) 133 <*> (m .: "Bedrag" >>= parseDecimalM)
134 <*> (m .: "Bedrag" >>= decimalCP) 134 <*> m .: "Valuta"
135 <*> m .: "Valuta" 135 <*> (m .: "Mutatiesoort" >>= mutationTypeCP)
136 <*> (m .: "Mutatiesoort" >>= mutationTypeCP) 136 <*> m .: "Mededelingen"
137 <*> m .: "Mededelingen" 137 <*> (m .: "Saldo na mutatie" >>= parseDecimalM)
138 <*> (m .: "Saldo na mutatie" >>= decimalCP)
139 138
140readFile :: Handle -> IO (V.Vector Tx) 139readFile :: Handle -> IO (V.Vector Tx)
141readFile h = do 140readFile h = do
142 contents <- BS.hGetContents h 141 contents <- BS.hGetContents h
143 case C.decodeByNameWith scsvOptions contents of 142 primTxs <- case C.decodeByNameWith scsvOptions contents of
144 Left err -> fail err 143 Left err -> fail err
145 Right 144 Right
146 ( [ "Datum", 145 ( [ "Datum",
@@ -160,3 +159,6 @@ readFile h = do
160 return txs 159 return txs
161 Right _ -> 160 Right _ ->
162 fail "Headers do not match expected pattern" 161 fail "Headers do not match expected pattern"
162 case V.mapM processPrimTx primTxs of
163 Left err -> fail err
164 Right txs -> return txs