visuals on the wallet
This commit is contained in:
parent
941717f776
commit
44653b7504
@ -6,6 +6,16 @@ import Data.List (unfoldr)
|
|||||||
import Data.Time.Clock
|
import Data.Time.Clock
|
||||||
import Text.Printf
|
import Text.Printf
|
||||||
|
|
||||||
|
buttonIntervals :: [(Int64,String)]
|
||||||
|
buttonIntervals = [ (2,"2 hours")
|
||||||
|
, (6,"6 hours")
|
||||||
|
, (12,"12 hours")
|
||||||
|
, (24,"1 day")
|
||||||
|
, (48,"2 days")
|
||||||
|
, (7*24,"7 days")
|
||||||
|
, (31*24,"31 days")
|
||||||
|
]
|
||||||
|
|
||||||
getWalletR :: Handler Html
|
getWalletR :: Handler Html
|
||||||
getWalletR = getWalletDetailsR 6 7
|
getWalletR = getWalletDetailsR 6 7
|
||||||
|
|
||||||
@ -14,74 +24,112 @@ getWalletDetailsR hrs days = loginOrDo (\(uid,user) -> do
|
|||||||
now <- liftIO getCurrentTime
|
now <- liftIO getCurrentTime
|
||||||
trans <- runDB $ selectList [TransactionDateTime >. (addUTCTime ((fromIntegral $ -(hrs*3600)) :: NominalDiffTime) now)] [Desc TransactionDateTime]
|
trans <- runDB $ selectList [TransactionDateTime >. (addUTCTime ((fromIntegral $ -(hrs*3600)) :: NominalDiffTime) now)] [Desc TransactionDateTime]
|
||||||
defaultLayout $ [whamlet|
|
defaultLayout $ [whamlet|
|
||||||
<a href=@{WalletDetailsR 168 days}>show last 7 days
|
<div .panel .panel-default>
|
||||||
<h1>Transactions in the last #{hrs} hours
|
<div .panel-heading>Transactions in the last #{hrs} hours:
|
||||||
<table .table>
|
<div .btn-group .btn-group-justified role="group">
|
||||||
<tr>
|
$forall (hrs',cap) <- buttonIntervals
|
||||||
<th>Time
|
$if hrs == hrs'
|
||||||
<th>P/C
|
<a href="@{WalletDetailsR hrs' days}" .btn .active role="button">#{cap}
|
||||||
<th>B/S
|
$else
|
||||||
<th>Item
|
<a href="@{WalletDetailsR hrs' days}" .btn role="button">#{cap}
|
||||||
<th>Quantity
|
<table .table .table-striped .table-condensed .small>
|
||||||
<th>ISK/Item
|
|
||||||
<th>ISK total
|
|
||||||
<th>ISK profit
|
|
||||||
<th>%
|
|
||||||
<th>Time
|
|
||||||
<th>Client
|
|
||||||
<th>Station
|
|
||||||
<th>?
|
|
||||||
<th>
|
|
||||||
$forall Entity _ t <- trans
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>#{show $ utctDay $ transactionDateTime $ t} #{show $ utctDayTime $ transactionDateTime $ t}
|
<th .text-center>Time
|
||||||
$if transactionTransForCorp t
|
<th .text-center>P/C
|
||||||
<td .corpTransaction>C
|
<th .text-center>B/S
|
||||||
$else
|
<th .text-center>Item
|
||||||
<td .personalTransaction>P
|
<th .text-center>Quantity
|
||||||
$if transactionTransIsSell t
|
<th .text-center>ISK/Item
|
||||||
<td .sellTransaction>S
|
<th .text-center>ISK total
|
||||||
$else
|
<th .text-center>ISK profit
|
||||||
<td .buyTransaction>B
|
<th .text-center>%
|
||||||
<td>#{transactionTypeName t}
|
<th .text-center>Time
|
||||||
<td>#{transactionQuantity t}
|
<th .text-center>Client
|
||||||
<td>#{prettyISK $ transactionPriceCents t}
|
<th .text-center>Station
|
||||||
<td>#{prettyISK $ transactionQuantity t * transactionPriceCents t}
|
<th .text-center>?
|
||||||
$maybe profit <- transRealProfit t
|
<th .text-center>
|
||||||
<td>
|
$forall Entity _ t <- trans
|
||||||
#{prettyISK $ profit}
|
<tr>
|
||||||
<td>
|
<td>#{show $ utctDay $ transactionDateTime $ t} #{showTime $ round $ utctDayTime $ transactionDateTime $ t}
|
||||||
#{profitPercent profit t}
|
$if transactionTransForCorp t
|
||||||
$nothing
|
<td .corpTransaction .text-center>C
|
||||||
<td>
|
$else
|
||||||
-
|
<td .personalTransaction .text-center>P
|
||||||
<td>
|
$if transactionTransIsSell t
|
||||||
<td>
|
<td .sellTransaction .text-center>S
|
||||||
$maybe secs <- transactionSecondsToSell t
|
$else
|
||||||
#{secs}
|
<td .buyTransaction .text-center>B
|
||||||
|
<td>#{transactionTypeName t}
|
||||||
|
<td .text-right>#{transactionQuantity t}
|
||||||
|
<td .text-right>#{prettyISK $ transactionPriceCents t}
|
||||||
|
<td .text-right>#{prettyISK $ transactionQuantity t * transactionPriceCents t}
|
||||||
|
$maybe profit <- transRealProfit t
|
||||||
|
$if (&&) (transactionTransIsSell t) (profit > 0)
|
||||||
|
<td .text-right .profit>
|
||||||
|
#{prettyISK $ profit}
|
||||||
|
$elseif (&&) (transactionTransIsSell t) (profit < 0)
|
||||||
|
<td .text-right .loss>
|
||||||
|
#{prettyISK $ profit}
|
||||||
|
$elseif (transactionTransIsSell t)
|
||||||
|
<td .text-right .buyfee>
|
||||||
|
#{prettyISK $ profit}
|
||||||
|
$else
|
||||||
|
<td .text-right>
|
||||||
|
#{prettyISK $ profit}
|
||||||
|
<td .text-right>
|
||||||
|
#{profitPercent profit t}%
|
||||||
$nothing
|
$nothing
|
||||||
|
<td>
|
||||||
<td>#{transactionClientName t}
|
-
|
||||||
<td>#{transactionStationName t}
|
<td>
|
||||||
<td>
|
<td>
|
||||||
<td>
|
$maybe secs <- transactionSecondsToSell t
|
||||||
|
#{showSecsToSell secs}
|
||||||
|
$nothing
|
||||||
|
|
||||||
|
<td>#{transactionClientName t}
|
||||||
|
<td>#{transactionStationName t}
|
||||||
|
<td>
|
||||||
|
<td>
|
||||||
|
|
||||||
<h1>Statistices for the last #{days} days
|
<div .panel .panel-default>
|
||||||
|
<div .panel-heading>Statistices for the last #{days} days:
|
||||||
|
<table .table .table-striped .table-condensed .small>
|
||||||
|
<tr>
|
||||||
|
<th .text-center>TODO
|
||||||
|]
|
|]
|
||||||
)
|
)
|
||||||
|
|
||||||
transRealProfit :: Transaction -> Maybe Int64
|
transRealProfit :: Transaction -> Maybe Int64
|
||||||
transRealProfit t = (\a b c -> a - b - c) <$> transactionProfit t <*> transactionFee t <*> transactionTax t
|
transRealProfit t = if transactionTransIsSell t then
|
||||||
|
(\a b c -> a - b - c) <$> transactionProfit t <*> transactionFee t <*> transactionTax t
|
||||||
|
else
|
||||||
|
negate <$> ((+) <$> transactionFee t <*> transactionTax t)
|
||||||
|
|
||||||
profitPercent :: Int64 -> Transaction -> String
|
profitPercent :: Int64 -> Transaction -> String
|
||||||
profitPercent p t = printf "%.2f" $ (100*(fromIntegral p) / (fromIntegral (transactionQuantity t * transactionPriceCents t)) :: Double)
|
profitPercent p t = printf "%.2f" $ (100*(fromIntegral p) / (fromIntegral (transactionQuantity t * transactionPriceCents t)) :: Double)
|
||||||
|
|
||||||
prettyISK :: Int64 -> String
|
prettyISK :: Int64 -> String
|
||||||
prettyISK isk = pretty++","++ printf "%02u" cents
|
prettyISK isk = signIsk++pretty++","++ printf "%02u" cents
|
||||||
where
|
where
|
||||||
(isk',cents) = divMod isk 100
|
signIsk = if isk > 0 then "" else "-"
|
||||||
|
(isk',cents) = divMod (abs isk) 100
|
||||||
thousands = unfoldr (\b -> if b == 0 then Nothing else Just (b `mod` 1000, b `div` 1000)) isk'
|
thousands = unfoldr (\b -> if b == 0 then Nothing else Just (b `mod` 1000, b `div` 1000)) isk'
|
||||||
(ht:t) = reverse thousands
|
(ht:t) = reverse thousands
|
||||||
pretty = intercalate "." $ [show ht] ++ (printf "%03u" <$> t)
|
pretty = intercalate "." $ [show ht] ++ (printf "%03u" <$> t)
|
||||||
|
|
||||||
|
showTime :: Int64 -> String
|
||||||
|
showTime t = printf "%2u" hours ++ ":" ++ printf "%02u" minutes ++ ":" ++ printf "%02u" seconds
|
||||||
|
where
|
||||||
|
(hours, minutes') = divMod t 3600
|
||||||
|
(minutes, seconds) = divMod minutes' 60
|
||||||
|
|
||||||
|
showSecsToSell :: Int64 -> String
|
||||||
|
showSecsToSell t
|
||||||
|
| t > 4*7*86400 = pp (fromIntegral t / (7*86400) :: Double) ++ "w"
|
||||||
|
| t > 86400 = pp (fromIntegral t / 86400 :: Double) ++ "d"
|
||||||
|
| t > 3600 = pp (fromIntegral t / 3600 :: Double) ++ "h"
|
||||||
|
| t > 60 = pp (fromIntegral t / 60 :: Double) ++ "m"
|
||||||
|
| otherwise = pp (fromIntegral t :: Double) ++ "s"
|
||||||
|
where
|
||||||
|
pp x = printf "%.2f" x
|
||||||
|
Loading…
Reference in New Issue
Block a user