aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/LoggedIn/Stat/View.elm
blob: f99ef0e65b8fa75d550edff46a86c19ada15724c (plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
module LoggedIn.Stat.View exposing
  ( view
  )

import Date exposing (Month)
import Dict
import String

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 LoggedIn.View.Date as Date
import View.Plural exposing (plural)

import LoggedIn.Stat.Account.View as AccountView

import Utils.Tuple as Tuple
import Utils.List as List

view : LoggedData -> Html Msg
view loggedData =
  div
    [ class "stat" ]
    [ h1 [] [ text (getMessage "Balance" loggedData.translations) ]
    , AccountView.view loggedData
    , h1 [] [ text (getMessage "Overall" loggedData.translations) ]
    , paymentsDetail loggedData (Payment.punctual loggedData.payments)
    , h1 [] [ text (getMessage "ByMonths" loggedData.translations) ]
    , monthsDetail loggedData
    ]

paymentsDetail : LoggedData -> Payments -> Html Msg
paymentsDetail loggedData payments =
  ul
    []
    [ li
        []
        [ text <| plural loggedData.translations (List.length payments) "Payment" "Payments" ]
    , li
        []
        [ text (paymentsSum loggedData.conf payments)
        , text " − "
        , text <| totalPayments loggedData
        ]
    ]

totalPayments : LoggedData -> String
totalPayments loggedData =
  String.join
    ", "
    ( loggedData.users
        |> Dict.toList
        |> List.map (Tuple.mapFst (\userId -> Payment.totalPayments (always True) userId loggedData.payments))
        |> List.sortBy fst
        |> List.map (\(sum, user) ->
             String.concat
               [ Format.price loggedData.conf sum
               , " "
               , getMessage "By" loggedData.translations
               , " "
               , user.name
               ]
           )
    )

monthsDetail : LoggedData -> Html Msg
monthsDetail loggedData =
  let paymentsByMonth =
        loggedData.payments
          |> Payment.punctual
          |> Payment.groupAndSortByMonth
      monthPaymentMean =
        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 << snd)
          |> List.mean
  in  div
        []
        [ div
            [ class "mean" ]
            [ text (getParamMessage [ Format.price loggedData.conf monthPaymentMean ] "Mean" loggedData.translations)
            ]
        , ul
            []
            ( Payment.punctual loggedData.payments
                |> Payment.groupAndSortByMonth
                |> List.map (monthDetail loggedData)
            )
        ]

monthDetail : LoggedData -> ((Month, Int), Payments) -> Html Msg
monthDetail loggedData ((month, year), payments) =
  li
    []
    [ text (Date.renderMonth 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