diff --git a/lib/algora/payments/jobs/execute_pending_transfers.ex b/lib/algora/payments/jobs/execute_pending_transfers.ex index 47311e589..d728b3ce0 100644 --- a/lib/algora/payments/jobs/execute_pending_transfers.ex +++ b/lib/algora/payments/jobs/execute_pending_transfers.ex @@ -2,7 +2,8 @@ defmodule Algora.Payments.Jobs.ExecutePendingTransfer do @moduledoc false use Oban.Worker, queue: :transfers, - max_attempts: 1 + max_attempts: 1, + unique: [period: :infinity] alias Algora.Payments diff --git a/lib/algora/payments/payments.ex b/lib/algora/payments/payments.ex index 5aec5f861..d359fca4c 100644 --- a/lib/algora/payments/payments.ex +++ b/lib/algora/payments/payments.ex @@ -298,8 +298,9 @@ defmodule Algora.Payments do {:ok, updated_account} <- update_account(account, stripe_account) do user = Accounts.get_user(account.user_id) - if user && stripe_account.charges_enabled do + if user && stripe_account.payouts_enabled do Accounts.update_settings(user, %{country: stripe_account.country}) + enqueue_pending_transfers(account.user_id) end {:ok, updated_account} diff --git a/test/algora/payments_test.exs b/test/algora/payments_test.exs index 08f6ec44b..cc488271b 100644 --- a/test/algora/payments_test.exs +++ b/test/algora/payments_test.exs @@ -290,4 +290,59 @@ defmodule Algora.PaymentsTest do assert transfer_tx1.id == transfer_tx2.id end end + + describe "refresh_stripe_account/1" do + test "executes pending transfers", %{user: user} do + group_id0 = Nanoid.generate() + group_id1 = Nanoid.generate() + group_id2 = Nanoid.generate() + + credit0 = + insert(:transaction, + user: user, + type: :credit, + status: :succeeded, + net_amount: Money.new(100, :USD), + group_id: group_id0 + ) + + _transfer0 = + insert(:transaction, + user: user, + type: :transfer, + status: :succeeded, + net_amount: Money.new(100, :USD), + group_id: group_id0 + ) + + credit1 = + insert(:transaction, + user: user, + type: :credit, + status: :succeeded, + net_amount: Money.new(100, :USD), + group_id: group_id1 + ) + + credit2 = + insert(:transaction, + user: user, + type: :credit, + status: :succeeded, + net_amount: Money.new(100, :USD), + group_id: group_id2 + ) + + assert {:ok, _account} = Payments.refresh_stripe_account(user) + jobs = all_enqueued() + assert length(jobs) == 2 + refute_enqueued(worker: ExecutePendingTransfer, args: %{credit_id: credit0.id}) + assert_enqueued(worker: ExecutePendingTransfer, args: %{credit_id: credit1.id}) + assert_enqueued(worker: ExecutePendingTransfer, args: %{credit_id: credit2.id}) + + assert {:ok, _account} = Payments.refresh_stripe_account(user) + jobs = all_enqueued() + assert length(jobs) == 2 + end + end end diff --git a/test/support/stripe_mock.ex b/test/support/stripe_mock.ex index 941934c2b..4527d54b6 100644 --- a/test/support/stripe_mock.ex +++ b/test/support/stripe_mock.ex @@ -89,4 +89,27 @@ defmodule Algora.Support.StripeMock do {:ok, %Stripe.Customer{id: "cus_#{Algora.Util.random_int()}"}} end end + + defmodule Account do + @moduledoc false + def retrieve(id) do + {:ok, + %Stripe.Account{ + id: id, + charges_enabled: true, + payouts_enabled: true, + default_currency: "usd", + details_submitted: true, + country: "US", + settings: %{ + payouts: %{ + schedule: %{ + interval: "daily", + delay_days: 3 + } + } + } + }} + end + end end