- Replace Stripe automatic payouts with manual admin-processed bank transfers - Add banking information fields (IBAN, bank name, account holder) to User model - Implement manual payout workflow: pending → approved → processing → completed - Add comprehensive admin interface for payout review and processing - Update Payout model with manual processing fields and workflow methods - Add transfer reference tracking and rejection/failure handling - Consolidate all migration fragments into clean "create" migrations - Add comprehensive documentation for manual payout workflow - Fix Event payout_status enum definition and database column issues This addresses France's lack of Stripe Global Payouts support by implementing a complete manual bank transfer workflow while maintaining audit trails and proper admin controls. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
4.8 KiB
4.8 KiB
Payout System Analysis Report
Current Implementation Overview
The current payout system implemented on the feat/stripe-global-payouts branch uses Stripe Connect with Stripe Transfers to automatically process payouts to promoters. This implementation is not compatible with France as it relies on Stripe Global Payouts functionality.
Architecture Analysis
Core Components
-
Models
Payout: Tracks payout requests with statuses (pending, processing, completed, failed)User: Containsstripe_connected_account_idfor Stripe Connect integrationEvent: Has payout eligibility and earnings calculation methodsEarning: Tracks individual order earnings (referenced in docs but may not be fully implemented)
-
Services
PayoutService(app/services/payout_service.rb:13-19): Processes payouts viaStripe::Transfer.createStripeConnectService: Manages Stripe Connect account setup
-
Controllers
Promoter::PayoutsController: Handles promoter payout requests and viewingAdmin::PayoutsController: Handles admin payout processing
Current Payout Flow
- Promoter Request: Promoter requests payout for ended event via
Promoter::PayoutsController#create - Admin Processing: Admin processes payout via
Admin::PayoutsController#process - Stripe Transfer:
PayoutServicecreatesStripe::Transferto promoter's connected account - Status Update: Payout status updated to completed/failed based on Stripe response
Key Issues for France
- Stripe Global Payouts Dependency: The system uses
Stripe::Transfer.createwithdestination: stripe_connected_account_idwhich requires Stripe Global Payouts - Stripe Connect Requirement: Users must have verified Stripe Connect accounts (
stripe_connected_account_id) - Automatic Processing: System assumes automated Stripe processing capability
Database Schema
Payouts Table
amount_cents: Gross payout amountfee_cents: Platform feesstatus: Enum (pending, processing, completed, failed)stripe_payout_id: Stripe transfer IDtotal_orders_count: Number of orders includedrefunded_orders_count: Number of refunded ordersuser_id: Promoter receiving payoutevent_id: Event for which payout is requested
Users Table (Relevant Fields)
stripe_connected_account_id: Stripe Connect account IDis_professionnal: Required for event management
Compliance and Legal Considerations
France-Specific Issues
- Stripe Global Payouts: Not available in France as of current analysis
- Banking Regulations: May require different approach for cross-border transfers
- Tax Reporting: Manual payouts may require additional documentation
Alternative Approaches Needed
- Manual Bank Transfers: Admin-initiated SEPA transfers
- Payout Request System: Promoters request, admins approve and process manually
- Documentation: Enhanced record-keeping for manual transfers
Recommendations
Immediate Actions Required
- Disable Automatic Processing: Remove Stripe Transfer functionality
- Implement Manual Workflow: Create admin interface for manual payout processing
- Add Banking Information: Collect IBAN/SWIFT details from promoters
- Update Status Flow: Modify payout statuses for manual processing
Proposed Manual Payout System
- Request Phase: Promoters submit payout requests (existing functionality can be kept)
- Review Phase: Admins review and approve requests
- Processing Phase: Admins mark as "processing" and initiate bank transfer
- Completion Phase: Admins confirm transfer completion manually
Migration Strategy
Phase 1: Immediate Fix
- Disable automatic Stripe processing
- Add manual processing interface for admins
- Update payout status workflow
Phase 2: Enhanced Manual System
- Add banking information collection
- Implement approval workflow
- Add transfer documentation features
Phase 3: Potential Automation
- Investigate France-compatible payment providers
- Implement API-based bank transfers if available
- Maintain manual fallback option
Technical Debt
Files Requiring Updates
app/services/payout_service.rb: Remove Stripe Transfer logicapp/controllers/admin/payouts_controller.rb: Add manual processing actionsapp/models/user.rb: Add banking information fields- Database migrations: Add IBAN/banking fields to users table
Testing Impact
- Update
test/services/payout_service_test.rb - Modify controller tests for manual workflow
- Add integration tests for manual payout flow
Conclusion
The current Stripe Global Payouts implementation is not viable for France operations. A manual payout system must be implemented immediately to handle promoter payments through traditional banking methods while maintaining audit trails and proper documentation.