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