summaryrefslogtreecommitdiff
path: root/sort-and-sanitize-amex-export.hs
diff options
context:
space:
mode:
Diffstat (limited to 'sort-and-sanitize-amex-export.hs')
-rw-r--r--sort-and-sanitize-amex-export.hs45
1 files changed, 45 insertions, 0 deletions
diff --git a/sort-and-sanitize-amex-export.hs b/sort-and-sanitize-amex-export.hs
new file mode 100644
index 0000000..f0be45c
--- /dev/null
+++ b/sort-and-sanitize-amex-export.hs
@@ -0,0 +1,45 @@
+import Text.CSV
+import Text.Printf (printf)
+
+import Data.List (sort, isPrefixOf, groupBy)
+
+import System.Environment (getArgs)
+
+normAmount :: Field -> Field
+normAmount amt | amt == "" = ""
+ | otherwise = printf "$%.2f" (read amt :: Double)
+
+compressWhitespace :: String -> String
+compressWhitespace x = map head $ groupSpaces x
+ where groupSpaces "" = [""]
+ groupSpaces x = groupBy (\x y -> x==' ' && y==' ') x
+
+mungePayment :: Field -> Field
+mungePayment x | x == "PAYMENT RECEIVED - THANK YOU" = "Assets:Bank:SFLC:Checking:FirstRepublic"
+ | isPrefixOf "FEDEX# " x = "Expenses:Office & Postage:FedEx"
+ | isPrefixOf "JUNCTION NETWORKS " x = "Expenses:Telephony:VoIP:Junction"
+ | isPrefixOf "T-MOBILE" x = "Expenses:Telephony:Mobile:T-Mobile"
+ | isPrefixOf "SPEAKEASY SEATTLE WA" x = "Expenses:Internet:Speakeasy"
+ | isPrefixOf "TELIAX " x = "Expenses:Telephony:VoIP:Teliax"
+ | isPrefixOf "VERIZON" x = "Expenses:Telephony:PSTN:Verizon"
+ | isPrefixOf "VOICEPULSE " x = "Expenses:Telephony:VoIP:VoicePulse"
+ | otherwise = "Expenses:Raw:" ++ compressWhitespace x
+
+newDesc :: String -> String -> String
+newDesc merch refno = compressWhitespace merch ++ parenRef refno
+ where
+ parenRef r | "Reference: " `isPrefixOf` r = concat [" (",drop 11 r,")"]
+ | otherwise = concat [" (",r,")"]
+massageMerchant :: [Field] -> [Field]
+massageMerchant [a,b,c,d,e] = [a,newDesc d b,normAmount c,"",e]
+massageMerchant xs = xs
+
+sanitySort :: [Record] -> [Record]
+sanitySort ts = map (massageMerchant) (sort ts)
+
+main = do
+ args <- getArgs
+ result <- parseCSVFromFile (head args)
+ case result of
+ Left e -> putStrLn ("Parse fail: " ++ show e)
+ Right ts -> putStrLn $ printCSV (sanitySort ts)