profit calculation works, but is O(n²)
This commit is contained in:
parent
49adc39c2d
commit
617e225624
@ -8,6 +8,7 @@ import qualified Eve.Api.Types as T
|
|||||||
import qualified Eve.Api.Char.Standings as ST
|
import qualified Eve.Api.Char.Standings as ST
|
||||||
import qualified Eve.Api.Char.Skills as SK
|
import qualified Eve.Api.Char.Skills as SK
|
||||||
import Database.Persist.Sql
|
import Database.Persist.Sql
|
||||||
|
import qualified Debug.Trace as Debug
|
||||||
|
|
||||||
accountingId :: Int64
|
accountingId :: Int64
|
||||||
accountingId = 16622
|
accountingId = 16622
|
||||||
@ -57,6 +58,7 @@ getUpdateR = loginOrDo (\(uid,user) -> do
|
|||||||
update uid [UserWalletTimeout =. time']
|
update uid [UserWalletTimeout =. time']
|
||||||
insertMany_ (migrateTransaction uid <$> trans')
|
insertMany_ (migrateTransaction uid <$> trans')
|
||||||
_ -> return ()
|
_ -> return ()
|
||||||
|
-- update taxes
|
||||||
let sql = "update transaction t \
|
let sql = "update transaction t \
|
||||||
set \
|
set \
|
||||||
fee = 100*(quantity*(price_cents/100)*(0.0100-0.0005*ch.br)/exp(0.1000*COALESCE((select faction_standing from faction_standings where faction_id=c.\"factionID\" and \"user\"=t.\"user\"),0)+0.0400*COALESCE((select corp_standing from corp_standings where corp_id=c.\"corporationID\" and \"user\"=t.\"user\"),0))), \
|
fee = 100*(quantity*(price_cents/100)*(0.0100-0.0005*ch.br)/exp(0.1000*COALESCE((select faction_standing from faction_standings where faction_id=c.\"factionID\" and \"user\"=t.\"user\"),0)+0.0400*COALESCE((select corp_standing from corp_standings where corp_id=c.\"corporationID\" and \"user\"=t.\"user\"),0))), \
|
||||||
@ -72,9 +74,47 @@ getUpdateR = loginOrDo (\(uid,user) -> do
|
|||||||
t.no_tax = false and \
|
t.no_tax = false and \
|
||||||
t.user=?"
|
t.user=?"
|
||||||
runDB $ rawExecute sql [toPersistValue uid]
|
runDB $ rawExecute sql [toPersistValue uid]
|
||||||
|
-- calculate profits
|
||||||
|
runDB $ do
|
||||||
|
trans <- updateProfits <$> selectList [TransactionUser ==. uid, TransactionInStock !=. 0] [Asc TransactionDateTime]
|
||||||
|
mapM_ (\(Entity eid t) -> replace eid t) trans
|
||||||
redirect WalletR
|
redirect WalletR
|
||||||
)
|
)
|
||||||
|
|
||||||
|
updateProfits :: [Entity Transaction] -> [Entity Transaction]
|
||||||
|
updateProfits [] = []
|
||||||
|
updateProfits dat = updateProfits' [] dat
|
||||||
|
where
|
||||||
|
updateProfits' seen (x@(Entity _ tx):xs) = if transactionTransIsSell tx then
|
||||||
|
let (x',xs') = updateProfits'' x seen
|
||||||
|
updateProfits'' :: Entity Transaction -> [Entity Transaction] -> (Entity Transaction, [Entity Transaction])
|
||||||
|
updateProfits'' o [] = (o,[])
|
||||||
|
updateProfits'' o@(Entity et t) ((Entity cet ct):ts) =
|
||||||
|
if transactionTypeId t == transactionTypeId ct
|
||||||
|
&& transactionInStock ct > 0
|
||||||
|
&& transactionInStock t < 0 then
|
||||||
|
let m = min (transactionInStock t * (-1)) (transactionInStock ct)
|
||||||
|
t' = t {transactionInStock = transactionInStock t + m}
|
||||||
|
ct' = ct {transactionInStock = transactionInStock ct - m}
|
||||||
|
prof' = (transactionPriceCents t - transactionPriceCents ct) * m
|
||||||
|
(t'',ct'') = if prof' > 0 then
|
||||||
|
Debug.trace ("Item "++show (transactionTypeId t)++" has profit "++show prof'++" ("++show (transactionPriceCents t)++" - "++show (transactionPriceCents ct)++")*"++show m)
|
||||||
|
$ updateProfits'' (Entity et (t' { transactionProfit = maybe (Just prof') (\a -> Just (a + prof')) (transactionProfit t')})) ts
|
||||||
|
else
|
||||||
|
updateProfits'' (Entity et (t' { transactionProfit = maybe (Just prof') (\a -> Just (a + prof')) (transactionProfit t')})) ts
|
||||||
|
in
|
||||||
|
(t'' ,(Entity cet ct'):ct'')
|
||||||
|
else
|
||||||
|
let
|
||||||
|
(t'',ct'') = updateProfits'' o ts
|
||||||
|
in
|
||||||
|
(t'',(Entity cet ct):ct'')
|
||||||
|
in
|
||||||
|
updateProfits' (xs'++[x']) xs
|
||||||
|
else
|
||||||
|
updateProfits' (seen++[x]) xs
|
||||||
|
updateProfits' seen [] = seen
|
||||||
|
|
||||||
findLvl :: Int64 -> [SK.Skill] -> Int
|
findLvl :: Int64 -> [SK.Skill] -> Int
|
||||||
findLvl sid skills = case find (\(SK.Skill sid' _ _ _) -> sid' == sid) skills of
|
findLvl sid skills = case find (\(SK.Skill sid' _ _ _) -> sid' == sid) skills of
|
||||||
Just (SK.Skill _ _ lvl _) -> lvl
|
Just (SK.Skill _ _ lvl _) -> lvl
|
||||||
|
Loading…
Reference in New Issue
Block a user