feat(payouts): implement promoter earnings viewing, request flow, and admin Stripe processing with webhooks

Add model methods for accurate net calculations (€0.50 + 1.5% fees), eligibility, refund handling
Update promoter/payouts controller for index (pending events), create (eligibility checks)
Integrate admin processing via Stripe::Transfer, webhook for status sync
Enhance views: index pending cards, events/show preview/form
Add comprehensive tests (models, controllers, service, integration); run migrations
This commit is contained in:
kbe
2025-09-17 02:07:52 +02:00
parent 47f4f50e5b
commit 3c1e17c2af
31 changed files with 1096 additions and 148 deletions

View File

@@ -92,4 +92,47 @@ class UserTest < ActiveSupport::TestCase
user.update!(onboarding_completed: true)
assert_not user.needs_onboarding?, "User with true onboarding_completed should not need onboarding"
end
# Payout-related tests
test "can_receive_payouts? returns true if stripe account id present and charges enabled" do
user = users(:one)
user.update!(stripe_connected_account_id: "acct_12345", is_professionnal: true)
# Mock Stripe API call
Stripe::Account.expects(:retrieve).with("acct_12345").returns(stub(charges_enabled: true))
assert user.can_receive_payouts?
end
test "can_receive_payouts? returns false if no stripe account id" do
user = users(:one)
user.update!(is_professionnal: true)
assert_not user.can_receive_payouts?
end
test "can_receive_payouts? returns false if not professional" do
user = users(:one)
user.update!(stripe_connected_account_id: "acct_12345")
assert_not user.can_receive_payouts?
end
test "can_receive_payouts? returns false if charges not enabled" do
user = users(:one)
user.update!(stripe_connected_account_id: "acct_12345", is_professionnal: true)
Stripe::Account.expects(:retrieve).with("acct_12345").returns(stub(charges_enabled: false))
assert_not user.can_receive_payouts?
end
test "can_receive_payouts? handles Stripe API error" do
user = users(:one)
user.update!(stripe_connected_account_id: "acct_invalid", is_professionnal: true)
Stripe::Account.expects(:retrieve).with("acct_invalid").raises(Stripe::InvalidRequestError.new("Account not found"))
assert_not user.can_receive_payouts?
end
end