diff options
Diffstat (limited to 'app/Import/Ing/SavingsAccountCsv.hs')
-rw-r--r-- | app/Import/Ing/SavingsAccountCsv.hs | 36 |
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) | |||
12 | import Data.Text qualified as T | 12 | import Data.Text qualified as T |
13 | import Data.Time.Calendar (Day) | 13 | import Data.Time.Calendar (Day) |
14 | import Data.Vector qualified as V | 14 | import Data.Vector qualified as V |
15 | import Import.Ing.Shared (dateCP, decimalCP, eitherToCP, ibanCP, maybeCP, scsvOptions) | 15 | import Import.Ing.Shared (maybeCP, parseDateM, parseDecimalM, parseIbanM, scsvOptions) |
16 | import System.IO (Handle) | 16 | import System.IO (Handle) |
17 | import Text.Regex.TDFA ((=~~)) | 17 | import Text.Regex.TDFA ((=~~)) |
18 | 18 | ||
@@ -49,7 +49,7 @@ instance MonadFail (Either String) where | |||
49 | 49 | ||
50 | txBaseFromPrim :: PrimTx -> Either String TxBase | 50 | txBaseFromPrim :: PrimTx -> Either String TxBase |
51 | txBaseFromPrim ptx@PrimTx {ptxCommodity = "EUR"} = | 51 | txBaseFromPrim 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 |
53 | txBaseFromPrim ptx = | 53 | txBaseFromPrim 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 | |||
121 | mutationTypeCP "Rente" = return InterestMutation | 121 | mutationTypeCP "Rente" = return InterestMutation |
122 | mutationTypeCP t = fail ("Unknown mutation type '" ++ T.unpack t ++ "'") | 122 | mutationTypeCP t = fail ("Unknown mutation type '" ++ T.unpack t ++ "'") |
123 | 123 | ||
124 | instance C.FromNamedRecord Tx where | 124 | instance 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 | ||
140 | readFile :: Handle -> IO (V.Vector Tx) | 139 | readFile :: Handle -> IO (V.Vector Tx) |
141 | readFile h = do | 140 | readFile 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 | ||