1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
module LoggedIn.Stat.View exposing
( view
)
import Date exposing (Month)
import Html exposing (..)
import Html.Attributes exposing (..)
import LoggedData exposing (LoggedData)
import Msg exposing (Msg)
import Model.Payment as Payment exposing (Payments)
import Model.Conf exposing (Conf)
import Model.Translations exposing (getMessage, getParamMessage)
import LoggedIn.View.Format as Format
import View.Date as Date
import View.Plural exposing (plural)
import Utils.List as List
view : LoggedData -> Html Msg
view loggedData =
let paymentsByMonth = Payment.groupAndSortByMonth (Payment.punctual loggedData.payments)
monthPaymentMean = getMonthPaymentMean loggedData paymentsByMonth
in div
[ class "stat withMargin" ]
[ h1 [] [ text (getParamMessage [ Format.price loggedData.conf monthPaymentMean ] loggedData.translations "ByMonthsAndMean") ]
, ul
[]
( List.map (monthDetail loggedData) paymentsByMonth)
]
getMonthPaymentMean : LoggedData -> List ((Month, Int), Payments) -> Int
getMonthPaymentMean loggedData paymentsByMonth =
paymentsByMonth
|> List.filter (\((month, year), _) ->
let currentDate = Date.fromTime loggedData.currentTime
in not (Date.month currentDate == month && Date.year currentDate == year)
)
|> List.map (List.sum << List.map .cost << Tuple.second)
|> List.mean
monthDetail : LoggedData -> ((Month, Int), Payments) -> Html Msg
monthDetail loggedData ((month, year), payments) =
li
[]
[ text (Date.monthView loggedData.translations month)
, text " "
, text (toString year)
, text " − "
, text (paymentsSum loggedData.conf payments)
]
paymentsSum : Conf -> Payments -> String
paymentsSum conf payments =
payments
|> List.map .cost
|> List.sum
|> Format.price conf
|