aboutsummaryrefslogtreecommitdiff
path: root/src/client/Model
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/Model')
-rw-r--r--src/client/Model/Payers.elm57
-rw-r--r--src/client/Model/View/PaymentView.elm7
2 files changed, 62 insertions, 2 deletions
diff --git a/src/client/Model/Payers.elm b/src/client/Model/Payers.elm
new file mode 100644
index 0000000..6550eaa
--- /dev/null
+++ b/src/client/Model/Payers.elm
@@ -0,0 +1,57 @@
+module Model.Payers
+ ( Payers
+ , ExceedingPayer
+ , payersDecoder
+ , updatePayers
+ , getOrderedExceedingPayers
+ ) where
+
+import Json.Decode as Json exposing (..)
+import Dict exposing (..)
+import List
+import Maybe
+
+type alias Payers = Dict String Int
+
+payersDecoder : Decoder Payers
+payersDecoder = Json.map Dict.fromList (list payerDecoder)
+
+payerDecoder : Decoder (String, Int)
+payerDecoder =
+ object2 (,)
+ ("userName" := string)
+ ("totalPayment" := int)
+
+updatePayers : Payers -> String -> Int -> Payers
+updatePayers payers userName amountDiff =
+ Dict.update
+ userName
+ (\mbAmount ->
+ case mbAmount of
+ Just amount -> Just (amount + amountDiff)
+ Nothing -> Nothing
+ )
+ payers
+
+type alias ExceedingPayer =
+ { userName : String
+ , amount : Int
+ }
+
+getOrderedExceedingPayers : Payers -> List ExceedingPayer
+getOrderedExceedingPayers payers =
+ let orderedPayers =
+ Dict.toList payers
+ |> List.map (\(userName, amount) -> ExceedingPayer userName amount)
+ |> List.sortBy .amount
+ maybeMinAmount =
+ List.head orderedPayers
+ |> Maybe.map .amount
+ in case maybeMinAmount of
+ Just minAmount ->
+ orderedPayers
+ |> List.map (\payer -> { payer | amount <- payer.amount - minAmount })
+ |> List.filter (\payer -> payer.amount /= 0)
+ |> List.reverse
+ Nothing ->
+ []
diff --git a/src/client/Model/View/PaymentView.elm b/src/client/Model/View/PaymentView.elm
index 2f2be46..19ad355 100644
--- a/src/client/Model/View/PaymentView.elm
+++ b/src/client/Model/View/PaymentView.elm
@@ -4,6 +4,7 @@ module Model.View.PaymentView
) where
import Model.Payment exposing (Payments)
+import Model.Payers exposing (Payers)
import Model.View.Payment.Add exposing (..)
import Model.View.Payment.Edition exposing (..)
@@ -11,13 +12,15 @@ type alias PaymentView =
{ userName : String
, add : AddPayment
, payments : Payments
+ , payers : Payers
, edition : Maybe Edition
}
-initPaymentView : String -> Payments -> PaymentView
-initPaymentView userName payments =
+initPaymentView : String -> Payments -> Payers -> PaymentView
+initPaymentView userName payments payers =
{ userName = userName
, add = initAddPayment
, payments = payments
+ , payers = payers
, edition = Nothing
}