summaryrefslogtreecommitdiffstats
path: root/app/Import/Ing/Shared.hs
diff options
context:
space:
mode:
Diffstat (limited to 'app/Import/Ing/Shared.hs')
-rw-r--r--app/Import/Ing/Shared.hs44
1 files changed, 0 insertions, 44 deletions
diff --git a/app/Import/Ing/Shared.hs b/app/Import/Ing/Shared.hs
deleted file mode 100644
index b5d1703..0000000
--- a/app/Import/Ing/Shared.hs
+++ /dev/null
@@ -1,44 +0,0 @@
1module Import.Ing.Shared where
2
3import Data.Attoparsec.Text qualified as AP
4import Data.Char (digitToInt, ord)
5import Data.Csv qualified as C
6import Data.Decimal (Decimal, DecimalRaw (Decimal), normalizeDecimal)
7import Data.Iban (Iban, mkIban)
8import Data.Text qualified as T
9import Data.Time.Calendar (Day)
10import Data.Time.Clock (UTCTime)
11import Data.Time.Format (defaultTimeLocale, parseTimeM)
12import Data.Time.Zones (TZ, localTimeToUTCTZ)
13
14data DebitCredit = Debit | Credit deriving (Show)
15
16scsvOptions :: C.DecodeOptions
17scsvOptions = C.defaultDecodeOptions {C.decDelimiter = fromIntegral (ord ';')}
18
19maybeCP :: (T.Text -> C.Parser a) -> T.Text -> C.Parser (Maybe a)
20maybeCP p t = if T.null t then return Nothing else Just <$> p t
21
22parseDecimalM :: (MonadFail m) => T.Text -> m Decimal
23parseDecimalM =
24 either fail return
25 . AP.parseOnly
26 ( do
27 decPart <- AP.decimal
28 _ <- AP.char ','
29 f1 <- AP.digit
30 f2 <- AP.digit
31 AP.endOfInput
32 let fracPart = fromIntegral $ digitToInt f1 * 10 + digitToInt f2
33 return $ normalizeDecimal (Decimal 2 (decPart * 100 + fracPart))
34 )
35
36parseIbanM :: (MonadFail m) => T.Text -> m Iban
37parseIbanM = either fail return . mkIban
38
39parseDateM :: (MonadFail m) => String -> T.Text -> m Day
40parseDateM fmt = parseTimeM False defaultTimeLocale fmt . T.unpack
41
42parseTimestampM :: (MonadFail m) => String -> TZ -> T.Text -> m UTCTime
43parseTimestampM fmt amsTz t = do
44 localTimeToUTCTZ amsTz <$> parseTimeM False defaultTimeLocale fmt (T.unpack t)