aboutsummaryrefslogtreecommitdiff
path: root/client/src/View/Statistics/Statistics.hs
blob: 71f93d401afaa7cb41a34f6782b3226bbc3a74cf (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
module View.Statistics.Statistics
  ( view
  , In(..)
  ) where

import           Control.Monad         (void)
import           Data.Map              (Map)
import qualified Data.Map              as M
import qualified Data.Text             as T
import           Data.Time.Calendar    (Day)
import qualified Data.Time.Calendar    as Calendar
import           Loadable              (Loadable)
import qualified Loadable
import           Reflex.Dom            (Dynamic, MonadWidget)
import qualified Reflex.Dom            as R
import qualified Util.Ajax             as AjaxUtil
import qualified View.Statistics.Chart as Chart

import           Common.Model          (Category (..), Currency, PaymentStats)
import qualified Common.Msg            as Msg
import qualified Common.View.Format    as Format

data In = In
  { _in_currency    :: Currency
  }

view :: forall t m. MonadWidget t m => In -> m ()
view input = do

  categories <- AjaxUtil.getNow "api/allCategories"
  statistics <- AjaxUtil.getNow "api/statistics"
  let categoriesAndStatistics = (\c s -> (,) <$> c <*> s) <$> categories <*> statistics

  R.divClass "withMargin" $
    R.divClass "titleButton" $
      R.el "h1" $
        R.text $ Msg.get Msg.Statistics_Title

  void . R.dyn . R.ffor categoriesAndStatistics . Loadable.viewHideValueWhileLoading $
    stats (_in_currency input)

stats :: forall t m. MonadWidget t m => Currency -> ([Category], PaymentStats) -> m ()
stats currency (categories, stats) =
  Chart.view $ Chart.In
    { Chart._in_title = Msg.get (Msg.Statistics_ByMonthsAndMean averageEachMonth)
    , Chart._in_labels = map (Format.monthAndYear . fst) stats
    , Chart._in_datasets =
      Chart.Dataset
        { Chart._dataset_label = Msg.get Msg.Statistics_Total
        , Chart._dataset_data  = totalSeries
        , Chart._dataset_color = "#555555"
        } : (map categoryDataset categories)
    }

  where
    averageEachMonth =
      Format.price currency $ sum totalSeries `div` length stats

    totalSeries =
      map (sum . map snd . M.toList . snd) stats

    categoryDataset category =
      Chart.Dataset
        { Chart._dataset_label = _category_name category
        , Chart._dataset_data  = map (M.findWithDefault 0 (_category_id category) . snd) stats
        , Chart._dataset_color = _category_color category
        }