Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(balance): rename :annual_income to :revenues #343

Merged
merged 1 commit into from
Jan 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions apps/app/lib/app/balance.ex
Original file line number Diff line number Diff line change
Expand Up @@ -104,29 +104,29 @@ defmodule App.Balance do
transfers = Repo.preload(transfers, peers: [:balance_config])

Enum.map(transfers, fn transfer ->
peers_without_annual_income =
peers_without_revenues =
Enum.filter(transfer.peers, fn peer ->
peer.balance_config == nil or peer.balance_config.annual_income == nil
peer.balance_config == nil or peer.balance_config.revenues == nil
end)

maybe_set_weight_by_income_total_weight(transfer, peers_without_annual_income)
maybe_set_weight_by_income_total_weight(transfer, peers_without_revenues)
end)
end

defp maybe_set_weight_by_income_total_weight(transfer, peers_without_annual_income)
defp maybe_set_weight_by_income_total_weight(transfer, peers_without_revenues)

defp maybe_set_weight_by_income_total_weight(transfer, []) do
transfer =
update_in(transfer.peers, fn peers ->
peers_with_total_weight(peers, &Decimal.mult(&1.weight, &1.balance_config.annual_income))
peers_with_total_weight(peers, &Decimal.mult(&1.weight, &1.balance_config.revenues))
end)

{:ok, transfer}
end

defp maybe_set_weight_by_income_total_weight(transfer, peers_without_annual_income) do
defp maybe_set_weight_by_income_total_weight(transfer, peers_without_revenues) do
error_reasons =
Enum.map(peers_without_annual_income, fn peer ->
Enum.map(peers_without_revenues, fn peer ->
%{
uniq_hash: "revenues_missing_#{peer.member_id}",
kind: :revenues_missing,
Expand Down
14 changes: 7 additions & 7 deletions apps/app/lib/app/balance/balance_config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ defmodule App.Balance.BalanceConfig do

The overall lifecycle of balance configurations was designed to answer two problems:
- the balance configurations must have some kind of "history", so when the configuration
of a member changes their annual income, the old configuration is kept and is still
of a member changes their revenues, the old configuration is kept and is still
referenced by peers,
- an unlinked book member must be able to have their own balance configuration.
This allows both to have members without users in the first place, and users to
Expand Down Expand Up @@ -84,7 +84,7 @@ defmodule App.Balance.BalanceConfig do
id: id() | nil,
owner: User.t() | Ecto.Association.NotLoaded.t() | nil,
owner_id: User.id() | nil,
annual_income: non_neg_integer() | nil,
revenues: non_neg_integer() | nil,
inserted_at: NaiveDateTime.t() | nil,
updated_at: NaiveDateTime.t() | nil
}
Expand All @@ -94,19 +94,19 @@ defmodule App.Balance.BalanceConfig do
belongs_to :owner, User

# Confidential information
field :annual_income, App.Encrypted.Integer
field :revenues, App.Encrypted.Integer

timestamps()
end

def revenues_changeset(struct, attrs) do
struct
|> cast(attrs, [:annual_income])
|> validate_annual_income()
|> cast(attrs, [:revenues])
|> validate_revenues()
end

defp validate_annual_income(changeset) do
defp validate_revenues(changeset) do
changeset
|> validate_number(:annual_income, greater_than_or_equal_to: 0)
|> validate_number(:revenues, greater_than_or_equal_to: 0)
end
end
6 changes: 3 additions & 3 deletions apps/app/lib/app/balance/balance_configs.ex
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ defmodule App.Balance.BalanceConfigs do
Check if a member has revenues set in their balance configuration.

Returns `false` both if the member has no balance configuration or if the balance
configuration has no annual income set.
configuration has no revenues set.
"""
@spec member_has_revenues?(BookMember.t()) :: boolean()
def member_has_revenues?(%BookMember{balance_config_id: nil} = _member), do: false

def member_has_revenues?(%BookMember{} = member) do
from(balance_config in BalanceConfig,
where: balance_config.id == ^member.balance_config_id,
select: not is_nil(balance_config.annual_income)
select: not is_nil(balance_config.revenues)
)
|> Repo.one!()
end
Expand Down Expand Up @@ -97,7 +97,7 @@ defmodule App.Balance.BalanceConfigs do
end

@doc """
Return an `%Ecto.Changeset{}` for tracking changes to a balance config annual income.
Return an `%Ecto.Changeset{}` for tracking changes to a balance config revenues.
"""
@spec change_balance_config_revenues(BalanceConfig.t(), map()) :: Ecto.Changeset.t()
def change_balance_config_revenues(balance_config, attrs \\ %{}) do
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
defmodule App.Repo.Migrations.RenameBalanceConfigRevenues do
use Ecto.Migration

def change do
rename table("balance_configs"), :annual_income, to: :revenues
end
end
10 changes: 5 additions & 5 deletions apps/app/test/app/balance/balance_config_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,25 @@ defmodule App.Balance.BalanceConfigTest do
end

describe "revenues_changeset/2" do
test "allows valid `:annual_income`", %{user: user} do
test "allows valid `:revenues`", %{user: user} do
changeset =
BalanceConfig.revenues_changeset(
%BalanceConfig{owner_id: user.id},
balance_config_attributes(annual_income: 0)
balance_config_attributes(revenues: 0)
)

assert changeset.valid?
end

test "does not allow negative `:annual_income`", %{user: user} do
test "does not allow negative `:revenues`", %{user: user} do
changeset =
BalanceConfig.revenues_changeset(
%BalanceConfig{owner_id: user.id},
balance_config_attributes(annual_income: -1)
balance_config_attributes(revenues: -1)
)

refute changeset.valid?
assert errors_on(changeset) == %{annual_income: ["must be greater than or equal to 0"]}
assert errors_on(changeset) == %{revenues: ["must be greater than or equal to 0"]}
end
end
end
26 changes: 13 additions & 13 deletions apps/app/test/app/balance/balance_configs_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ defmodule App.Balance.BalanceConfigsTest do
assert not BalanceConfigs.member_has_revenues?(member)
end

test "returns false if the balance configuration has no annual income set", %{book: book} do
balance_config = balance_config_fixture(annual_income: nil)
test "returns false if the balance configuration has no revenues set", %{book: book} do
balance_config = balance_config_fixture(revenues: nil)
member = book_member_fixture(book, balance_config_id: balance_config.id)

assert not BalanceConfigs.member_has_revenues?(member)
end

test "returns true if the balance configuration has an annual income set", %{book: book} do
balance_config = balance_config_fixture(annual_income: 2345)
test "returns true if the balance configuration has an revenues set", %{book: book} do
balance_config = balance_config_fixture(revenues: 2345)
member = book_member_fixture(book, balance_config_id: balance_config.id)

assert BalanceConfigs.member_has_revenues?(member)
Expand All @@ -55,10 +55,10 @@ defmodule App.Balance.BalanceConfigsTest do
owner = user_fixture()

assert {:ok, balance_config} =
BalanceConfigs.create_balance_config(member, owner, %{annual_income: 5432})
BalanceConfigs.create_balance_config(member, owner, %{revenues: 5432})

assert balance_config.owner_id == owner.id
assert balance_config.annual_income == 5432
assert balance_config.revenues == 5432

# updates the member
member = Repo.reload!(member)
Expand All @@ -70,16 +70,16 @@ defmodule App.Balance.BalanceConfigsTest do
owner = user_fixture()

assert {:error, changeset} =
BalanceConfigs.create_balance_config(member, owner, %{annual_income: -1})
BalanceConfigs.create_balance_config(member, owner, %{revenues: -1})

assert errors_on(changeset) == %{annual_income: ["must be greater than or equal to 0"]}
assert errors_on(changeset) == %{revenues: ["must be greater than or equal to 0"]}
end

test "deletes the former balance configuration if it's not linked to any entity" do
balance_config = balance_config_fixture()
member = book_member_fixture(book_fixture(), balance_config_id: balance_config.id)

{:ok, _} = BalanceConfigs.create_balance_config(member, user_fixture(), %{annual_income: 0})
{:ok, _} = BalanceConfigs.create_balance_config(member, user_fixture(), %{revenues: 0})

refute Repo.reload(balance_config)
end
Expand All @@ -93,7 +93,7 @@ defmodule App.Balance.BalanceConfigsTest do
# There is no reason for this case to happen, but better be safe than sorry
_member = book_member_fixture(book, balance_config_id: balance_config.id)

{:ok, _} = BalanceConfigs.create_balance_config(member, user_fixture(), %{annual_income: 0})
{:ok, _} = BalanceConfigs.create_balance_config(member, user_fixture(), %{revenues: 0})

assert Repo.reload(balance_config)
end
Expand All @@ -106,7 +106,7 @@ defmodule App.Balance.BalanceConfigsTest do
transfer = money_transfer_fixture(book, tenant_id: member.id)
_peer = peer_fixture(transfer, member_id: member.id, balance_config_id: balance_config.id)

{:ok, _} = BalanceConfigs.create_balance_config(member, user_fixture(), %{annual_income: 0})
{:ok, _} = BalanceConfigs.create_balance_config(member, user_fixture(), %{revenues: 0})

assert Repo.reload(balance_config)
end
Expand All @@ -121,11 +121,11 @@ defmodule App.Balance.BalanceConfigsTest do
assert %Ecto.Changeset{} =
changeset =
BalanceConfigs.change_balance_config_revenues(balance_config, %{
annual_income: 2345
revenues: 2345
})

assert changeset.valid?
assert changeset.changes == %{annual_income: 2345}
assert changeset.changes == %{revenues: 2345}
end

test "cannot change the owner", %{balance_config: balance_config} do
Expand Down
24 changes: 12 additions & 12 deletions apps/app/test/app/balance_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,10 @@ defmodule App.BalanceTest do

test "weight transfer amount using peers income #1", %{book: book} do
member1 = book_member_fixture(book)
balance_config1 = member_balance_config_fixture(member1, annual_income: 1)
balance_config1 = member_balance_config_fixture(member1, revenues: 1)

member2 = book_member_fixture(book)
balance_config2 = member_balance_config_fixture(member2, annual_income: 2)
balance_config2 = member_balance_config_fixture(member2, revenues: 2)

transfer =
money_transfer_fixture(book,
Expand All @@ -181,16 +181,16 @@ defmodule App.BalanceTest do

test "weight transfer amount using peers income #2", %{book: book} do
member1 = book_member_fixture(book)
balance_config1 = member_balance_config_fixture(member1, annual_income: 2)
balance_config1 = member_balance_config_fixture(member1, revenues: 2)

member2 = book_member_fixture(book)
balance_config2 = member_balance_config_fixture(member2, annual_income: 2)
balance_config2 = member_balance_config_fixture(member2, revenues: 2)

member3 = book_member_fixture(book)
balance_config3 = member_balance_config_fixture(member3, annual_income: 2)
balance_config3 = member_balance_config_fixture(member3, revenues: 2)

member4 = book_member_fixture(book)
balance_config4 = member_balance_config_fixture(member4, annual_income: 3)
balance_config4 = member_balance_config_fixture(member4, revenues: 3)

transfer =
money_transfer_fixture(book,
Expand All @@ -215,13 +215,13 @@ defmodule App.BalanceTest do

test "weighting by incomes takes user-defined weight into account", %{book: book} do
member1 = book_member_fixture(book)
balance_config1 = member_balance_config_fixture(member1, annual_income: 1)
balance_config1 = member_balance_config_fixture(member1, revenues: 1)

member2 = book_member_fixture(book)
balance_config2 = member_balance_config_fixture(member2, annual_income: 2)
balance_config2 = member_balance_config_fixture(member2, revenues: 2)

member3 = book_member_fixture(book)
balance_config3 = member_balance_config_fixture(member3, annual_income: 3)
balance_config3 = member_balance_config_fixture(member3, revenues: 3)

transfer =
money_transfer_fixture(book,
Expand Down Expand Up @@ -259,13 +259,13 @@ defmodule App.BalanceTest do

test "fails if a user config appropriate fields aren't set", %{book: book} do
member1 = book_member_fixture(book, nickname: "member1")
balance_config1 = member_balance_config_fixture(member1, annual_income: nil)
balance_config1 = member_balance_config_fixture(member1, revenues: nil)

member2 = book_member_fixture(book)
balance_config2 = member_balance_config_fixture(member2, annual_income: 1)
balance_config2 = member_balance_config_fixture(member2, revenues: 1)

member3 = book_member_fixture(book)
balance_config3 = member_balance_config_fixture(member3, annual_income: 1)
balance_config3 = member_balance_config_fixture(member3, revenues: 1)

transfer1 =
money_transfer_fixture(book,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ defmodule App.Balance.BalanceConfigsFixtures do
def balance_config_attributes(attrs \\ %{}) do
Enum.into(attrs, %{
owner_id: nil,
annual_income: 1234
revenues: 1234
})
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ defmodule AppWeb.BookMemberRevenuesLive do
<p>{revenues_balance_config_paragraph(assigns)}</p>
<p>{gettext("What would you like to set them to?")}</p>
<.input
field={@form[:annual_income]}
field={@form[:revenues]}
type="number"
label={gettext("Revenues")}
required
Expand Down Expand Up @@ -99,7 +99,7 @@ defmodule AppWeb.BookMemberRevenuesLive do
balance_config.owner_id == current_user.id ->
~H"""
{revenues_helper_owner(@live_action)}<br />
<span class="label">{@balance_config.annual_income}</span>
<span class="label">{@balance_config.revenues}</span>
"""

true ->
Expand Down
2 changes: 1 addition & 1 deletion apps/app_web/test/app_web/live/books/book_live_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ defmodule AppWeb.BookLiveTest do
end

test "is hidden when them member incomes are set", %{conn: conn, book: book, member: member} do
_balance_config = member_balance_config_fixture(member, annual_income: 1234)
_balance_config = member_balance_config_fixture(member, revenues: 1234)

{:ok, _live, html} = live(conn, ~p"/books/#{book}")

Expand Down
Loading