diff --git a/lib/algora_web/live/claim_live.ex b/lib/algora_web/live/claim_live.ex index 80709cb92..3e6480fa7 100644 --- a/lib/algora_web/live/claim_live.ex +++ b/lib/algora_web/live/claim_live.ex @@ -124,6 +124,8 @@ defmodule AlgoraWeb.ClaimLive do |> Enum.sort_by(&{&1.pledged, &1.paid, &1.sponsor.name}, :desc) source_or_target = primary_claim.source || primary_claim.target + claim_status_label = claim_status_label(primary_claim, sponsors) + show_claim_payment_hint = show_claim_payment_hint?(primary_claim, sponsors) contexts = if socket.assigns.current_user do @@ -145,6 +147,8 @@ defmodule AlgoraWeb.ClaimLive do |> assign(:target, primary_claim.target) |> assign(:source, primary_claim.source) |> assign(:source_or_target, source_or_target) + |> assign(:claim_status_label, claim_status_label) + |> assign(:show_claim_payment_hint, show_claim_payment_hint) |> assign(:bounties, primary_claim.target.bounties) |> assign(:prize_pool, prize_pool) |> assign(:total_paid, total_paid) @@ -210,6 +214,24 @@ defmodule AlgoraWeb.ClaimLive do end end + defp claim_status_label(%Claim{status: status}, _sponsors) when status != :approved do + status |> to_string() |> String.capitalize() + end + + defp claim_status_label(%Claim{status: :approved}, sponsors) do + cond do + Enum.all?(sponsors, &(&1.status in [:paid, :overpaid])) -> "Rewarded" + Enum.any?(sponsors, &(&1.status == :partial)) -> "Partially rewarded" + true -> "Awaiting sponsor reward" + end + end + + defp show_claim_payment_hint?(%Claim{status: :approved}, sponsors) do + Enum.any?(sponsors, &(&1.status in [:pending, :partial])) + end + + defp show_claim_payment_hint?(_claim, _sponsors), do: false + defp default_context_id(socket) do case socket.assigns.available_bounties do [] -> socket.assigns.current_user.id @@ -398,7 +420,10 @@ defmodule AlgoraWeb.ClaimLive do
Status - {@primary_claim.status |> to_string() |> String.capitalize()} + {@claim_status_label} +
+
+ No contributor action is required. This claim is approved and waiting for the sponsor reward to be completed.
Submitted diff --git a/test/algora_web/live/claim_live_test.exs b/test/algora_web/live/claim_live_test.exs new file mode 100644 index 000000000..a4ede9273 --- /dev/null +++ b/test/algora_web/live/claim_live_test.exs @@ -0,0 +1,49 @@ +defmodule AlgoraWeb.ClaimLiveTest do + use AlgoraWeb.ConnCase, async: true + + import Algora.Factory + import Phoenix.LiveViewTest + + describe "payment status" do + test "shows approved claims as awaiting sponsor reward until the bounty is paid", %{conn: conn} do + %{group_id: group_id} = create_claim_with_reward_status(:pending) + + assert {:ok, _view, html} = live(conn, ~p"/claims/#{group_id}") + + assert html =~ "Awaiting sponsor reward" + assert html =~ "No contributor action is required" + end + + test "shows rewarded after the sponsor payment succeeds", %{conn: conn} do + %{group_id: group_id} = create_claim_with_reward_status(:paid) + + assert {:ok, _view, html} = live(conn, ~p"/claims/#{group_id}") + + assert html =~ "Rewarded" + refute html =~ "Awaiting sponsor reward" + end + end + + defp create_claim_with_reward_status(status) do + sponsor = insert!(:organization) + contributor = insert!(:user) + repository = insert!(:repository, user: sponsor) + target = insert!(:ticket, repository: repository) + bounty = insert!(:bounty, owner: sponsor, creator: sponsor, ticket: target, amount: Money.new!(100, :USD)) + claim = insert!(:claim, target: target, user: contributor, status: :approved) + + if status == :paid do + insert!( + :transaction, + claim: claim, + bounty: bounty, + user: sponsor, + type: :debit, + status: :succeeded, + net_amount: Money.new!(100, :USD) + ) + end + + %{group_id: claim.group_id} + end +end