module RobinHood.Report where import Data.Map qualified as M import RobinHood.AppState import RobinHood.Money import RobinHood.Prelude import RobinHood.Instrument printReport :: ProfitM () printReport = do st <- get case preview traverseMax ((^. #previousDay) <$> st.instruments) of Nothing -> fail "No trades" Just _lastTradeDay -> do printPerInstrument st putStrLn "--------------------------------------------------------------" printAggByPeriod st putStrLn "--------------------------------------------------------------" putStrLn $ "Balance: " <> show ((round $ unMoney st.balance) :: Integer) where printAggByPeriod st = do tax' <- asks (^. #taxBraket) putStrLn " Period| Gain| Interest| Dividend| Profit|Tax Prepay| Oversell" forM_ (toAscList . unionsWith (<>) . fmap (^. #profit) $ elems st.instruments) $ \(p, ip) -> do let inter = fromMaybe 0 $ st.interest ^. at p profit' = m2s $ ip.capitalGain + inter + ip.dividend - ip.tax in putStrLn $ printf "%7s|%10d|%10d|%10d|%10d|%10.2f|%10s" p (m2s ip.capitalGain) (m2s inter) (m2s ip.dividend) profit' (tax' * fromIntegral profit') ip.oversell printPerInstrument st = do putStrLn "Instrument| Period| Gain| Dividend| Profit| Oversell" forM_ (elems st.instruments) $ \i -> do forM_ (M.toList i.profit) $ \(p, ip) -> do putStrLn $ printf "%10s|%7s|%10d|%10d|%10d|%10s" i.name p (m2s ip.capitalGain) (m2s ip.dividend) (m2s $ ip.capitalGain + ip.dividend - ip.tax) ip.oversell m2s :: Money -> Int m2s (Money d) = round d