diff --git a/README.md b/README.md index 76ea176..82d3b85 100644 --- a/README.md +++ b/README.md @@ -152,8 +152,9 @@ Where result will be something like this: ```elixir iex> %{ ...> postings: [ - ...> %Numscriptex.Posting{ +...> %Numscriptex.Posting{ ...> amount: 100, +...> decimal_amount: 1.0, ...> asset: "USD/2", ...> destination: "bar", ...> source: "foo" @@ -164,19 +165,25 @@ iex> %{ ...> account: "foo", ...> asset: "EUR/2", ...> final_balance: 300, -...> initial_balance: 300 +...> initial_balance: 300, +...> decimal_final_balance: 3.0, +...> decimal_initial_balance: 3.0, ...> }, ...> %Numscriptex.Balance{ ...> account: "foo", ...> asset: "USD/2", ...> final_balance: 400, -...> initial_balance: 500 +...> initial_balance: 500, +...> decimal_final_balance: 4.0, +...> decimal_initial_balance: 5.0, ...> }, ...> %Numscriptex.Balance{ ...> account: "bar", ...> asset: "USD/2", ...> final_balance: 100, -...> initial_balance: 0 +...> initial_balance: 0, +...> decimal_final_balance: 1.0, +...> decimal_initial_balance: 0.0, ...> } ...> ], ...> accountMeta: %{} diff --git a/lib/numscriptex/balance.ex b/lib/numscriptex/balance.ex index 16be138..b51bbf2 100644 --- a/lib/numscriptex/balance.ex +++ b/lib/numscriptex/balance.ex @@ -5,11 +5,15 @@ defmodule Numscriptex.Balance do can see the results of all transactions. """ + alias Numscriptex.Utilities + @derive JSON.Encoder defstruct account: nil, asset: nil, final_balance: nil, - initial_balance: nil + decimal_final_balance: nil, + initial_balance: nil, + decimal_initial_balance: nil @typedoc """ Type that represents `Numscriptex.Balance` struct. @@ -17,14 +21,18 @@ defmodule Numscriptex.Balance do ## Fields * `:account` the account name * `:asset` the asset were the transaction was made - * `:final_balance` balance after the transactions - * `:initial_balance` balance before the transactions + * `:final_balance` balance after the transactions (integer) + * `:decimal_final_balance` balance after the transactions, but as float + * `:initial_balance` balance before the transactions (integer) + * `:decimal_initial_balance` balance after the transactions, but as float """ @type t() :: %__MODULE__{ account: bitstring(), asset: bitstring(), - final_balance: non_neg_integer(), - initial_balance: non_neg_integer() + final_balance: integer(), + decimal_final_balance: float(), + initial_balance: integer(), + decimal_initial_balance: float() } @doc """ @@ -57,19 +65,25 @@ defmodule Numscriptex.Balance do account: "foo", asset: "EUR/2", final_balance: 300, - initial_balance: 300 + decimal_final_balance: 3.0, + initial_balance: 300, + decimal_initial_balance: 3.0 }, %Numscriptex.Balance{ account: "foo", asset: "USD/2", final_balance: 400, - initial_balance: 500 + decimal_final_balance: 4.0, + initial_balance: 500, + decimal_initial_balance: 5.0 }, %Numscriptex.Balance{ account: "bar", asset: "USD/2", final_balance: 100, - initial_balance: 0 + decimal_final_balance: 1.0, + initial_balance: 0, + decimal_initial_balance: 0.0 } ] ``` @@ -82,9 +96,8 @@ defmodule Numscriptex.Balance do |> handle_initial_balance(account_assets) |> handle_final_balance(postings) |> maybe_drop_balance() - |> then(fn balances -> - Enum.map(balances, &struct(__MODULE__, &1)) - end) + |> put_decimal_values() + |> Enum.map(&struct(__MODULE__, &1)) end defp build_balances(account_assets, postings) do @@ -100,8 +113,10 @@ defmodule Numscriptex.Balance do %{ account: account, asset: asset, + final_balance: 0, + decimal_final_balance: 0, initial_balance: 0, - final_balance: 0 + decimal_initial_balance: 0 } end) end) @@ -113,14 +128,18 @@ defmodule Numscriptex.Balance do %{ account: posting["source"], asset: posting["asset"], + final_balance: 0, + decimal_final_balance: 0, initial_balance: 0, - final_balance: 0 + decimal_initial_balance: 0 }, %{ account: posting["destination"], asset: posting["asset"], + final_balance: 0, + decimal_final_balance: 0, initial_balance: 0, - final_balance: 0 + decimal_initial_balance: 0 } ] end) @@ -177,4 +196,19 @@ defmodule Numscriptex.Balance do balance.initial_balance == 0 and balance.final_balance == 0 end) end + + defp put_decimal_values(balances) do + Enum.map(balances, fn + %{initial_balance: initial_balance, final_balance: final_balance} = balance -> + decimal_places = Utilities.decimal_places_from_asset(balance.asset) + decimal_initial_balance = Utilities.integer_to_decimal(initial_balance, decimal_places) + decimal_final_balance = Utilities.integer_to_decimal(final_balance, decimal_places) + + %{ + balance + | decimal_initial_balance: decimal_initial_balance, + decimal_final_balance: decimal_final_balance + } + end) + end end diff --git a/lib/numscriptex/posting.ex b/lib/numscriptex/posting.ex index 2b682f6..4b10329 100644 --- a/lib/numscriptex/posting.ex +++ b/lib/numscriptex/posting.ex @@ -3,8 +3,11 @@ defmodule Numscriptex.Posting do `Numscriptex.Postings` represents a financial transaction made with [Numscript](https://docs.formance.com/numscript/) """ + alias Numscriptex.Utilities + @derive JSON.Encoder defstruct amount: nil, + decimal_amount: nil, asset: nil, destination: nil, source: nil @@ -17,21 +20,37 @@ defmodule Numscriptex.Posting do * `:asset` the asset were the transaction was made * `:destination` account whose the money will go to * `:amount` amount of money transferred (integer) + * `:decimal_amount` amount of money transferred, but as float """ @type t() :: %__MODULE__{ amount: pos_integer(), + decimal_amount: float(), asset: bitstring(), destination: bitstring(), source: bitstring() } - @spec from_list(map()) :: list(__MODULE__.t()) + @spec from_list(list(map())) :: list(__MODULE__.t()) def from_list(postings) do Enum.map(postings, &from_map/1) end - @spec from_list(map()) :: __MODULE__.t() - def from_map(map) do - struct(%__MODULE__{}, map) + @spec from_map(map()) :: __MODULE__.t() + def from_map(posting) do + put_decimal_amount(posting) + end + + defp put_decimal_amount(posting) when not is_struct(posting) do + posting + |> Map.put(:decimal_amount, 0) + |> then(fn elem -> struct(%__MODULE__{}, elem) end) + |> put_decimal_amount() + end + + defp put_decimal_amount(posting) do + decimal_places = Utilities.decimal_places_from_asset(posting.asset) + decimal_amount = Utilities.integer_to_decimal(posting.amount, decimal_places) + + %{posting | decimal_amount: decimal_amount} end end diff --git a/lib/numscriptex/utilities.ex b/lib/numscriptex/utilities.ex index d494ef2..d1630b8 100644 --- a/lib/numscriptex/utilities.ex +++ b/lib/numscriptex/utilities.ex @@ -43,4 +43,64 @@ defmodule Numscriptex.Utilities do defp keys_to_atom({key, value}), do: {String.to_existing_atom(key), value} + + @doc """ + Converts an integer value to float + + ```elixir + iex> Utilities.integer_to_decimal(1000, 2) + 10.0 + + iex> Utilities.integer_to_decimal(1000, 3) + 1.0 + + iex> Utilities.integer_to_decimal(1000, 4) + 0.1 + + iex> Utilities.integer_to_decimal(1000, 5) + 0.01 + ``` + """ + @spec integer_to_decimal(pos_integer(), pos_integer() | nil) :: float() + def integer_to_decimal(amount, decimal_places \\ 2) + + def integer_to_decimal(amount, nil), do: integer_to_decimal(amount) + + def integer_to_decimal(amount, decimal_places) do + divisor = + 10 + |> Integer.pow(decimal_places) + |> trunc() + + amount / divisor + end + + @doc """ + Gets the decimal places from an asset if has any (e.g. decimal places for "USD/2" would be 2). + You can choose a default value (the second argument), but if you don't choose any the default will be 2. + + ```elixir + iex> Utilities.decimal_places_from_asset("USD/2") + 2 + + iex> Utilities.decimal_places_from_asset("USD/4") + 4 + + iex> Utilities.decimal_places_from_asset("USD") + 2 + + iex> Utilities.decimal_places_from_asset("USD", 3) + 3 + ``` + """ + @spec decimal_places_from_asset(bitstring(), pos_integer()) :: pos_integer() + def decimal_places_from_asset(asset, default \\ 2) do + if String.length(asset) >= 5 do + asset + |> String.last() + |> String.to_integer() + else + default + end + end end diff --git a/test/numscriptex/balance_test.exs b/test/numscriptex/balance_test.exs index 24e5280..c714b14 100644 --- a/test/numscriptex/balance_test.exs +++ b/test/numscriptex/balance_test.exs @@ -38,19 +38,25 @@ defmodule Numscriptex.BalanceTest do account: "bar", asset: "USD/2", final_balance: 50, - initial_balance: 0 + decimal_final_balance: 0.5, + initial_balance: 0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "baz", asset: "USD/2", final_balance: 49, - initial_balance: 0 + decimal_final_balance: 0.49, + initial_balance: 0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "foo", asset: "USD/2", final_balance: 1, - initial_balance: 100 + initial_balance: 100, + decimal_final_balance: 0.01, + decimal_initial_balance: 1.0 } ] diff --git a/test/numscriptex/posting_tests.exs b/test/numscriptex/posting_tests.exs index 8ee1e2d..2672bba 100644 --- a/test/numscriptex/posting_tests.exs +++ b/test/numscriptex/posting_tests.exs @@ -6,7 +6,7 @@ defmodule Numscriptex.PostingTest do doctest Numscriptex.Posting describe "from_map/1" do - setup_all do + setup do postings = [ %{ amount: 100, @@ -18,7 +18,7 @@ defmodule Numscriptex.PostingTest do amount: 100, asset: "USD/2", destination: "baz", - source: "foo" + source: "bar" } ] @@ -31,12 +31,14 @@ defmodule Numscriptex.PostingTest do assert postings == [ %Numscriptex.Posting{ amount: 100, + decimal_amount: 1.0, asset: "USD/2", destination: "bar", source: "foo" }, %Numscriptex.Posting{ amount: 100, + decimal_amount: 1.0, asset: "USD/2", destination: "baz", source: "bar" @@ -49,6 +51,7 @@ defmodule Numscriptex.PostingTest do assert posting == %Numscriptex.Posting{ amount: 100, + decimal_amount: 1.0, asset: "USD/2", destination: "bar", source: "foo" diff --git a/test/numscriptex_test.exs b/test/numscriptex_test.exs index fecb4b8..b8f8c78 100644 --- a/test/numscriptex_test.exs +++ b/test/numscriptex_test.exs @@ -104,6 +104,7 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 100, + decimal_amount: 1.0, asset: "USD/2", destination: "bar", source: "foo" @@ -115,19 +116,25 @@ defmodule NumscriptexTest do account: "foo", asset: "EUR/2", final_balance: 300, - initial_balance: 300 + initial_balance: 300, + decimal_final_balance: 3.0, + decimal_initial_balance: 3.0 }, %Numscriptex.Balance{ account: "foo", asset: "USD/2", final_balance: 400, - initial_balance: 500 + initial_balance: 500, + decimal_final_balance: 4.0, + decimal_initial_balance: 5.0 }, %Numscriptex.Balance{ account: "bar", asset: "USD/2", final_balance: 100, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 1.0, + decimal_initial_balance: 0.0 } ] end @@ -156,12 +163,14 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 100, + decimal_amount: 1.0, asset: "USD/2", destination: "bar", source: "foo" }, %Numscriptex.Posting{ amount: 100, + decimal_amount: 1.0, asset: "USD/2", destination: "baz", source: "bar" @@ -173,13 +182,17 @@ defmodule NumscriptexTest do account: "foo", asset: "USD/2", final_balance: 400, - initial_balance: 500 + initial_balance: 500, + decimal_final_balance: 4.0, + decimal_initial_balance: 5.0 }, %Numscriptex.Balance{ account: "baz", asset: "USD/2", final_balance: 100, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 1.0, + decimal_initial_balance: 0.0 } ] end @@ -214,24 +227,28 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 5000, + decimal_amount: 50.0, asset: "USD/2", destination: "orders:4567:payment", source: "users:1234:main" }, %Numscriptex.Posting{ amount: 1000, + decimal_amount: 10.0, asset: "USD/2", destination: "orders:4567:payment", source: "users:1234:vouchers:2024-01-31" }, %Numscriptex.Posting{ amount: 3000, + decimal_amount: 30.0, asset: "USD/2", destination: "orders:4567:payment", source: "users:1234:vouchers:2024-02-17" }, %Numscriptex.Posting{ amount: 1000, + decimal_amount: 10.0, asset: "USD/2", destination: "orders:4567:payment", source: "users:1234:vouchers:2024-03-22" @@ -243,31 +260,41 @@ defmodule NumscriptexTest do account: "users:1234:main", asset: "USD/2", final_balance: 0, - initial_balance: 5000 + initial_balance: 5000, + decimal_final_balance: 0.0, + decimal_initial_balance: 50.0 }, %Numscriptex.Balance{ account: "users:1234:vouchers:2024-01-31", asset: "USD/2", final_balance: 0, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 0.0, + decimal_initial_balance: 10.0 }, %Numscriptex.Balance{ account: "users:1234:vouchers:2024-02-17", asset: "USD/2", final_balance: 0, - initial_balance: 3000 + initial_balance: 3000, + decimal_final_balance: 0.0, + decimal_initial_balance: 30.0 }, %Numscriptex.Balance{ account: "users:1234:vouchers:2024-03-22", asset: "USD/2", final_balance: 9000, - initial_balance: 10_000 + initial_balance: 10_000, + decimal_final_balance: 90.0, + decimal_initial_balance: 100.0 }, %Numscriptex.Balance{ account: "orders:4567:payment", asset: "USD/2", final_balance: 10_000, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 100.0, + decimal_initial_balance: 0.0 } ] end @@ -311,24 +338,28 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 2000, + decimal_amount: 20.0, asset: "USD/2", destination: "payments:4567", source: "coupons:FALL24" }, %Numscriptex.Posting{ amount: 27_900, + decimal_amount: 279.0, asset: "USD/2", destination: "payments:4567", source: "users:1234" }, %Numscriptex.Posting{ amount: 900, + decimal_amount: 9.0, asset: "USD/2", destination: "payments:5678", source: "coupons:FALL24" }, %Numscriptex.Posting{ amount: 8100, + decimal_amount: 81.0, asset: "USD/2", destination: "payments:5678", source: "users:1234" @@ -340,25 +371,33 @@ defmodule NumscriptexTest do account: "coupons:FALL24", asset: "USD/2", final_balance: 97_000, - initial_balance: 99_900 + initial_balance: 99_900, + decimal_final_balance: 970.0, + decimal_initial_balance: 999.0 }, %Numscriptex.Balance{ account: "users:1234", asset: "USD/2", final_balance: 64_000, - initial_balance: 100_000 + initial_balance: 100_000, + decimal_final_balance: 640.0, + decimal_initial_balance: 1000.0 }, %Numscriptex.Balance{ account: "payments:4567", asset: "USD/2", final_balance: 29_900, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 299.0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "payments:5678", asset: "USD/2", final_balance: 9000, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 90.0, + decimal_initial_balance: 0.0 } ] end @@ -385,12 +424,14 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 10, + decimal_amount: 0.1, asset: "USD/2", destination: "platform:fees", source: "orders:1234" }, %Numscriptex.Posting{ amount: 90, + decimal_amount: 0.9, asset: "USD/2", destination: "merchants:6789", source: "orders:1234" @@ -402,19 +443,25 @@ defmodule NumscriptexTest do account: "orders:1234", asset: "USD/2", final_balance: 900, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 9.0, + decimal_initial_balance: 10.0 }, %Numscriptex.Balance{ account: "platform:fees", asset: "USD/2", final_balance: 10, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.1, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "merchants:6789", asset: "USD/2", final_balance: 90, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.9, + decimal_initial_balance: 0.0 } ] end @@ -448,24 +495,28 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 300, + decimal_amount: 3.0, asset: "USD/2", destination: "platform:commission:sales_tax", source: "orders:1234" }, %Numscriptex.Posting{ amount: 1200, + decimal_amount: 12.0, asset: "USD/2", destination: "platform:commission:revenue", source: "orders:1234" }, %Numscriptex.Posting{ amount: 500, + decimal_amount: 5.0, asset: "USD/2", destination: "users:1234:cashback", source: "orders:1234" }, %Numscriptex.Posting{ amount: 8000, + decimal_amount: 80.0, asset: "USD/2", destination: "merchants:6789", source: "orders:1234" @@ -477,31 +528,41 @@ defmodule NumscriptexTest do account: "orders:1234", asset: "USD/2", final_balance: 0, - initial_balance: 10_000 + initial_balance: 10_000, + decimal_final_balance: 0.0, + decimal_initial_balance: 100.0 }, %Numscriptex.Balance{ account: "platform:commission:sales_tax", asset: "USD/2", final_balance: 300, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 3.0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "platform:commission:revenue", asset: "USD/2", final_balance: 1200, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 12.0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "users:1234:cashback", asset: "USD/2", final_balance: 500, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 5.0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "merchants:6789", asset: "USD/2", final_balance: 8000, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 80.0, + decimal_initial_balance: 0.0 } ] end @@ -525,6 +586,7 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 500, + decimal_amount: 5.0, asset: "USD/2", destination: "payment", source: "users:1234" @@ -536,13 +598,17 @@ defmodule NumscriptexTest do account: "users:1234", asset: "USD/2", final_balance: 0, - initial_balance: 500 + initial_balance: 500, + decimal_final_balance: 0.0, + decimal_initial_balance: 5.0 }, %Numscriptex.Balance{ account: "payment", asset: "USD/2", final_balance: 500, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 5.0, + decimal_initial_balance: 0.0 } ] end @@ -574,18 +640,21 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 100, + decimal_amount: 1.0, asset: "USD/2", destination: "payments:4567", source: "users:1234" }, %Numscriptex.Posting{ amount: 1000, + decimal_amount: 10.0, asset: "USD/2", destination: "payments:4567", source: "users:2345:credit" }, %Numscriptex.Posting{ amount: 5000, + decimal_amount: 50.0, asset: "USD/2", destination: "payments:4567", source: "users:2345:main" @@ -597,25 +666,33 @@ defmodule NumscriptexTest do account: "users:2345:main", asset: "USD/2", final_balance: 0, - initial_balance: 5000 + initial_balance: 5000, + decimal_final_balance: 0.0, + decimal_initial_balance: 50.0 }, %Numscriptex.Balance{ account: "users:1234", asset: "USD/2", final_balance: -100, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: -1.0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "payments:4567", asset: "USD/2", final_balance: 6100, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 61.0, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "users:2345:credit", asset: "USD/2", final_balance: -1000, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: -10.0, + decimal_initial_balance: 0.0 } ] end @@ -642,6 +719,7 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 5, + decimal_amount: 0.05, asset: "USD/2", destination: "platform:fees", source: "users:1234" @@ -653,13 +731,17 @@ defmodule NumscriptexTest do account: "users:1234", asset: "USD/2", final_balance: 495, - initial_balance: 500 + initial_balance: 500, + decimal_final_balance: 4.95, + decimal_initial_balance: 5.0 }, %Numscriptex.Balance{ account: "platform:fees", asset: "USD/2", final_balance: 5, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.05, + decimal_initial_balance: 0.0 } ] end @@ -695,19 +777,39 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 50, + decimal_amount: 0.5, asset: "USD/2", destination: "bar", source: "foo" }, %Numscriptex.Posting{ amount: 49, + decimal_amount: 0.49, asset: "USD/2", destination: "baz", source: "foo" }, - %Numscriptex.Posting{amount: 20, asset: "USD/2", destination: "b", source: "a"}, - %Numscriptex.Posting{amount: 20, asset: "USD/2", destination: "c", source: "a"}, - %Numscriptex.Posting{amount: 59, asset: "USD/2", destination: "d", source: "a"} + %Numscriptex.Posting{ + amount: 20, + decimal_amount: 0.2, + asset: "USD/2", + destination: "b", + source: "a" + }, + %Numscriptex.Posting{ + amount: 20, + decimal_amount: 0.2, + asset: "USD/2", + destination: "c", + source: "a" + }, + %Numscriptex.Posting{ + amount: 59, + decimal_amount: 0.59, + asset: "USD/2", + destination: "d", + source: "a" + } ] assert result.balances == [ @@ -715,43 +817,57 @@ defmodule NumscriptexTest do account: "a", asset: "USD/2", final_balance: 901, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 9.01, + decimal_initial_balance: 10.0 }, %Numscriptex.Balance{ account: "foo", asset: "USD/2", final_balance: 901, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 9.01, + decimal_initial_balance: 10.0 }, %Numscriptex.Balance{ account: "bar", asset: "USD/2", final_balance: 50, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.5, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "baz", asset: "USD/2", final_balance: 49, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.49, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "b", asset: "USD/2", final_balance: 20, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.2, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "c", asset: "USD/2", final_balance: 20, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.2, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "d", asset: "USD/2", final_balance: 59, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.59, + decimal_initial_balance: 0.0 } ] end @@ -784,12 +900,14 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 20, + decimal_amount: 0.2, asset: "USD/2", destination: "platform:tax", source: "users:1234" }, %Numscriptex.Posting{ amount: 80, + decimal_amount: 0.8, asset: "USD/2", destination: "platform:revenue", source: "users:1234" @@ -801,19 +919,25 @@ defmodule NumscriptexTest do account: "users:1234", asset: "USD/2", final_balance: 9900, - initial_balance: 10_000 + initial_balance: 10_000, + decimal_final_balance: 99.0, + decimal_initial_balance: 100.0 }, %Numscriptex.Balance{ account: "platform:tax", asset: "USD/2", final_balance: 20, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.2, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "platform:revenue", asset: "USD/2", final_balance: 80, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 0.8, + decimal_initial_balance: 0.0 } ] end @@ -850,12 +974,14 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 150, + decimal_amount: 1.5, asset: "USD/2", destination: "platform:fees", source: "orders:2345" }, %Numscriptex.Posting{ amount: 850, + decimal_amount: 8.5, asset: "USD/2", destination: "merchants:1234", source: "orders:2345" @@ -867,19 +993,25 @@ defmodule NumscriptexTest do account: "orders:2345", asset: "USD/2", final_balance: 0, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 0.0, + decimal_initial_balance: 10.0 }, %Numscriptex.Balance{ account: "platform:fees", asset: "USD/2", final_balance: 150, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 1.5, + decimal_initial_balance: 0.0 }, %Numscriptex.Balance{ account: "merchants:1234", asset: "USD/2", final_balance: 850, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 8.5, + decimal_initial_balance: 0.0 } ] end @@ -900,6 +1032,7 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 1000, + decimal_amount: 10.0, asset: "USD/2", destination: "user", source: "user" @@ -911,7 +1044,9 @@ defmodule NumscriptexTest do account: "user", asset: "USD/2", final_balance: 1000, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 10.0, + decimal_initial_balance: 10.0 } ] end @@ -936,21 +1071,24 @@ defmodule NumscriptexTest do assert result.postings == [ %Numscriptex.Posting{ amount: 620, + decimal_amount: 6.2, asset: "USD/2", destination: "user", source: "user" }, %Numscriptex.Posting{ amount: 270, + decimal_amount: 2.7, asset: "USD/2", destination: "user2", source: "user" }, %Numscriptex.Posting{ - source: "user", - destination: "user3", amount: 110, - asset: "USD/2" + decimal_amount: 1.1, + asset: "USD/2", + destination: "user3", + source: "user" } ] @@ -959,19 +1097,25 @@ defmodule NumscriptexTest do account: "user", asset: "USD/2", final_balance: 620, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 6.2, + decimal_initial_balance: 10.0 }, %Numscriptex.Balance{ account: "user2", asset: "USD/2", final_balance: 1270, - initial_balance: 1000 + initial_balance: 1000, + decimal_final_balance: 12.7, + decimal_initial_balance: 10.0 }, %Numscriptex.Balance{ account: "user3", asset: "USD/2", final_balance: 110, - initial_balance: 0 + initial_balance: 0, + decimal_final_balance: 1.1, + decimal_initial_balance: 0.0 } ] end