aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/Model/PaymentCategory.elm
blob: 87678fef3b9b69d7921bf064b851a7130cb53094 (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
module Model.PaymentCategory exposing
  ( PaymentCategories
  , paymentCategoriesDecoder
  , search
  , isCategoryUnused
  , set
  , update
  )

import Dict exposing (Dict)
import Json.Decode as Decode exposing (Decoder)

import Model.Category exposing (CategoryId, categoryIdDecoder)
import Utils.Json as Json
import Utils.Search as Search

type alias PaymentCategories = List PaymentCategory

type alias PaymentCategory =
  { name : String
  , category : CategoryId
  }

paymentCategoriesDecoder : Decoder PaymentCategories
paymentCategoriesDecoder =
  Decode.list <| Decode.map2 PaymentCategory
    (Decode.field "name" Decode.string)
    (Decode.field "category" categoryIdDecoder)

search : String -> PaymentCategories -> Maybe CategoryId
search paymentName paymentCategories =
  paymentCategories
    |> List.filter (\pc -> Search.format pc.name == Search.format paymentName)
    |> List.head
    |> Maybe.map .category

isCategoryUnused : CategoryId -> PaymentCategories -> Bool
isCategoryUnused category paymentCategories =
  paymentCategories
    |> List.filter ((==) category << .category)
    |> List.isEmpty

set : String -> CategoryId -> PaymentCategories -> PaymentCategories
set name category paymentCategories = update name name category paymentCategories

update : String -> String -> CategoryId -> PaymentCategories -> PaymentCategories
update oldName newName category paymentCategories =
  { name = newName, category = category } :: List.filter (\pc -> not <| Search.format pc.name == Search.format oldName) paymentCategories