Packages

Simple Elixir SDK for the Splitwise API

Current section

Files

Jump to
ex_splitwise lib splitwise models expense.ex
Raw

lib/splitwise/models/expense.ex

defmodule ExSplitwise.Models.Expense do
@moduledoc false
@enforce_keys [:cost, :users]
defstruct [
:cost,
:currency_code,
:group_id,
:users,
:category_id,
:description,
:creation_method
]
@doc """
Converts a Splitwise.Models.Expense to the format expected by Splitwise.
Particularly, converts the expense's users to a flat list.
## Example
iex> alias ExSplitwise.Models.{Expense, Expense.User}
iex> users = [%User{ id: 1, paid_share: 500, owed_share: 0 }, %User{ id: 2, paid_share: 0, owed_share: 500 }]
iex> Expense.convert(%Expense{ cost: 1_000, users: users })
[
{"users__0__user_id", 2},
{"users__0__paid_share", 0},
{"users__0__owed_share", 500},
{"users__1__user_id", 1},
{"users__1__paid_share", 500},
{"users__1__owed_share", 0},
{"cost", 1000},
{"currency_code", "USD"},
{"group_id", nil},
{"category_id", nil},
{"description", "New expense"},
{"creation_method", "equal"}
]
"""
def convert(data = %__MODULE__{}) do
result = [
{"cost", data.cost},
{"currency_code", data.currency_code || "USD"},
{"group_id", data.group_id},
{"category_id", data.category_id},
{"description", data.description || "New expense"},
{"creation_method", data.creation_method || "equal"}
]
# convert all users to plain props
toList(data.users, result)
end
defp toList([], result), do: result
defp toList([user | users], result) do
index = length(users)
toList(
users,
[
{"users__#{index}__user_id", user.id},
{"users__#{index}__paid_share", user.paid_share},
{"users__#{index}__owed_share", user.owed_share}
] ++ result
)
end
# defp flatten([], result), do: result
# defp flatten([user|users], result) do
# index = length(users)
# flatten(users, Map.merge(result, %{
# "users__#{index}__user_id" => user.id,
# "users__#{index}__paid_share" => user.paid_share,
# "users__#{index}__owed_share" => user.owed_share
# }))
# end
end