Resolve merge conflicts in payout system implementation
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
@@ -1,122 +1,221 @@
|
||||
<%= render 'shared/admin_nav' %>
|
||||
|
||||
<div class="container mx-auto px-4 py-8">
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<h1 class="text-3xl font-bold text-gray-900">Payout Details</h1>
|
||||
<%= link_to "Back to Payouts", admin_payouts_path, class: "text-indigo-600 hover:text-indigo-900" %>
|
||||
<h1 class="text-3xl font-bold text-gray-900">Payout Details #<%= @payout.id %></h1>
|
||||
<%= link_to "← Back to Payouts", admin_payouts_path, class: "text-indigo-600 hover:text-indigo-900" %>
|
||||
</div>
|
||||
|
||||
<div class="bg-white rounded-lg shadow overflow-hidden">
|
||||
<div class="px-6 py-4 border-b border-gray-200">
|
||||
<h2 class="text-xl font-semibold text-gray-800">Payout #<%= @payout.id %></h2>
|
||||
</div>
|
||||
|
||||
<div class="p-6">
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
||||
<!-- Payout Information -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<h2 class="text-xl font-semibold text-gray-900 mb-4">Payout Information</h2>
|
||||
|
||||
<div class="space-y-4">
|
||||
<div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-4">Event Information</h3>
|
||||
<div class="space-y-3">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Event Name</p>
|
||||
<p class="text-sm text-gray-900"><%= @payout.event.name %></p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Event Date</p>
|
||||
<p class="text-sm text-gray-900"><%= @payout.event.start_time.strftime("%B %d, %Y") %></p>
|
||||
</div>
|
||||
<label class="block text-sm font-medium text-gray-500">Status</label>
|
||||
<% case @payout.status %>
|
||||
<% when 'pending' %>
|
||||
<span class="px-3 py-1 text-sm font-semibold rounded-full bg-yellow-100 text-yellow-800">
|
||||
Pending Review
|
||||
</span>
|
||||
<% when 'approved' %>
|
||||
<span class="px-3 py-1 text-sm font-semibold rounded-full bg-blue-100 text-blue-800">
|
||||
Approved - Ready for Transfer
|
||||
</span>
|
||||
<% when 'processing' %>
|
||||
<span class="px-3 py-1 text-sm font-semibold rounded-full bg-indigo-100 text-indigo-800">
|
||||
Processing
|
||||
</span>
|
||||
<% when 'completed' %>
|
||||
<span class="px-3 py-1 text-sm font-semibold rounded-full bg-green-100 text-green-800">
|
||||
Completed
|
||||
</span>
|
||||
<% when 'failed' %>
|
||||
<span class="px-3 py-1 text-sm font-semibold rounded-full bg-red-100 text-red-800">
|
||||
Failed
|
||||
</span>
|
||||
<% when 'rejected' %>
|
||||
<span class="px-3 py-1 text-sm font-semibold rounded-full bg-gray-100 text-gray-800">
|
||||
Rejected
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Event</label>
|
||||
<p class="text-gray-900"><%= @payout.event.name %></p>
|
||||
<p class="text-sm text-gray-500"><%= @payout.event.date.strftime("%B %d, %Y") if @payout.event.date %></p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Promoter</label>
|
||||
<p class="text-gray-900"><%= @payout.user.name.presence || @payout.user.email %></p>
|
||||
<p class="text-sm text-gray-500"><%= @payout.user.email %></p>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Gross Amount</label>
|
||||
<p class="text-lg font-semibold text-gray-900">€<%= @payout.amount_euros %></p>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Platform Fee</label>
|
||||
<p class="text-lg font-semibold text-gray-900">€<%= @payout.fee_euros %></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-4">Promoter Information</h3>
|
||||
<div class="space-y-3">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Name</p>
|
||||
<p class="text-sm text-gray-900"><%= @payout.user.name.presence || @payout.user.email %></p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Email</p>
|
||||
<p class="text-sm text-gray-900"><%= @payout.user.email %></p>
|
||||
</div>
|
||||
<label class="block text-sm font-medium text-gray-500">Net Amount (To Transfer)</label>
|
||||
<p class="text-2xl font-bold text-green-600">€<%= @payout.net_amount_euros %></p>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Total Orders</label>
|
||||
<p class="text-gray-900"><%= @payout.total_orders_count %></p>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Refunded Orders</label>
|
||||
<p class="text-gray-900"><%= @payout.refunded_orders_count %></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-4">Financial Details</h3>
|
||||
<div class="space-y-3">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Gross Amount</p>
|
||||
<p class="text-sm text-gray-900">€<%= @payout.amount_euros %></p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Platform Fees</p>
|
||||
<p class="text-sm text-gray-900">€<%= @payout.fee_euros %></p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Net Amount</p>
|
||||
<p class="text-sm text-gray-900">€<%= @payout.net_amount_euros %></p>
|
||||
</div>
|
||||
</div>
|
||||
<label class="block text-sm font-medium text-gray-500">Requested</label>
|
||||
<p class="text-gray-900"><%= @payout.created_at.strftime("%B %d, %Y at %I:%M %p") %></p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-4">Payout Information</h3>
|
||||
<div class="space-y-3">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Status</p>
|
||||
<p class="text-sm text-gray-900">
|
||||
<% case @payout.status %>
|
||||
<% when 'pending' %>
|
||||
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-yellow-100 text-yellow-800">
|
||||
Pending
|
||||
</span>
|
||||
<% when 'processing' %>
|
||||
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-100 text-blue-800">
|
||||
Processing
|
||||
</span>
|
||||
<% when 'completed' %>
|
||||
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
|
||||
Completed
|
||||
</span>
|
||||
<% when 'failed' %>
|
||||
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">
|
||||
Failed
|
||||
</span>
|
||||
<% end %>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Created At</p>
|
||||
<p class="text-sm text-gray-900"><%= @payout.created_at.strftime("%B %d, %Y at %H:%M") %></p>
|
||||
</div>
|
||||
<% if @payout.stripe_payout_id.present? %>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Payout ID</p>
|
||||
<p class="text-sm text-gray-900">
|
||||
<% if @payout.manual_payout? %>
|
||||
Manual Transfer - <%= @payout.stripe_payout_id %>
|
||||
<% else %>
|
||||
<%= @payout.stripe_payout_id %>
|
||||
<% end %>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<% if @payout.processed_at %>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Processed</label>
|
||||
<p class="text-gray-900"><%= @payout.processed_at.strftime("%B %d, %Y at %I:%M %p") %></p>
|
||||
<% if @payout.processed_by %>
|
||||
<p class="text-sm text-gray-500">by <%= @payout.processed_by.name.presence || @payout.processed_by.email %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if @payout.bank_transfer_reference.present? %>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Transfer Reference</label>
|
||||
<p class="text-gray-900 font-mono"><%= @payout.bank_transfer_reference %></p>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if @payout.rejection_reason.present? %>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Rejection/Failure Reason</label>
|
||||
<p class="text-red-600"><%= @payout.rejection_reason %></p>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Banking Information -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<h2 class="text-xl font-semibold text-gray-900 mb-4">Banking Information</h2>
|
||||
|
||||
<% if @banking_errors.any? %>
|
||||
<div class="mb-4 p-4 bg-red-50 border border-red-200 rounded-md">
|
||||
<h3 class="text-sm font-medium text-red-800">Banking Information Issues:</h3>
|
||||
<ul class="mt-2 text-sm text-red-700">
|
||||
<% @banking_errors.each do |error| %>
|
||||
<li>• <%= error %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if @transfer_summary %>
|
||||
<div class="space-y-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Account Holder</label>
|
||||
<p class="text-gray-900"><%= @transfer_summary[:account_holder] %></p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">Bank Name</label>
|
||||
<p class="text-gray-900"><%= @transfer_summary[:bank_name] %></p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-500">IBAN</label>
|
||||
<p class="text-gray-900 font-mono"><%= @transfer_summary[:iban] %></p>
|
||||
</div>
|
||||
|
||||
<div class="p-4 bg-blue-50 border border-blue-200 rounded-md">
|
||||
<h3 class="text-sm font-medium text-blue-800">Transfer Instructions</h3>
|
||||
<div class="mt-2 text-sm text-blue-700">
|
||||
<p><strong>Amount:</strong> €<%= @transfer_summary[:amount_euros] %></p>
|
||||
<p><strong>Reference:</strong> Payout #<%= @transfer_summary[:payout_id] %> - <%= @transfer_summary[:event_name] %></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="text-center text-gray-500 py-8">
|
||||
<p>Banking information not available for display.</p>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Actions -->
|
||||
<div class="mt-8 bg-white rounded-lg shadow p-6">
|
||||
<h2 class="text-xl font-semibold text-gray-900 mb-4">Actions</h2>
|
||||
|
||||
<div class="flex flex-wrap gap-4">
|
||||
<% if @payout.can_approve? %>
|
||||
<%= button_to "✅ Approve Payout", approve_admin_payout_path(@payout), method: :post,
|
||||
class: "bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-md font-medium",
|
||||
data: { confirm: "Approve this payout for manual bank transfer?" } %>
|
||||
<% end %>
|
||||
|
||||
<% if @payout.can_reject? %>
|
||||
<%= form_with url: reject_admin_payout_path(@payout), method: :post, local: true, class: "flex gap-2" do |form| %>
|
||||
<%= form.text_field :rejection_reason, placeholder: "Rejection reason...", required: true,
|
||||
class: "border border-gray-300 rounded-md px-3 py-2" %>
|
||||
<%= form.submit "❌ Reject", class: "bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded-md font-medium",
|
||||
data: { confirm: "Reject this payout?" } %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% if @payout.can_process? %>
|
||||
<%= form_with url: mark_processing_admin_payout_path(@payout), method: :post, local: true, class: "flex gap-2" do |form| %>
|
||||
<%= form.text_field :bank_transfer_reference, placeholder: "Transfer reference (optional)",
|
||||
class: "border border-gray-300 rounded-md px-3 py-2" %>
|
||||
<%= form.submit "🔄 Mark as Processing", class: "bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md font-medium",
|
||||
data: { confirm: "Mark as processing (bank transfer initiated)?" } %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% if @payout.processing? %>
|
||||
<%= form_with url: mark_completed_admin_payout_path(@payout), method: :post, local: true, class: "flex gap-2" do |form| %>
|
||||
<%= form.text_field :bank_transfer_reference, placeholder: "Final transfer reference",
|
||||
value: @payout.bank_transfer_reference,
|
||||
class: "border border-gray-300 rounded-md px-3 py-2" %>
|
||||
<%= form.submit "✅ Mark as Completed", class: "bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-md font-medium",
|
||||
data: { confirm: "Confirm transfer completion?" } %>
|
||||
<% end %>
|
||||
|
||||
<%= form_with url: mark_failed_admin_payout_path(@payout), method: :post, local: true, class: "flex gap-2" do |form| %>
|
||||
<%= form.text_field :failure_reason, placeholder: "Failure reason...", required: true,
|
||||
class: "border border-gray-300 rounded-md px-3 py-2" %>
|
||||
<%= form.submit "❌ Mark as Failed", class: "bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded-md font-medium",
|
||||
data: { confirm: "Mark transfer as failed?" } %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-8 flex space-x-4">
|
||||
<% if @payout.can_process? %>
|
||||
<%= button_to "Process Payout", admin_payout_path(@payout), method: :post,
|
||||
class: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" %>
|
||||
<% end %>
|
||||
|
||||
<% if @payout.pending? || @payout.processing? %>
|
||||
<%= button_to "Mark as Manually Processed", mark_as_manually_processed_admin_payout_path(@payout), method: :post,
|
||||
class: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500",
|
||||
data: { confirm: "Are you sure you want to mark this payout as manually processed? This will notify the promoter that the bank transfer is being processed." } %>
|
||||
<% end %>
|
||||
|
||||
<%= link_to "View as Promoter", promoter_payout_path(@payout), class: "inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md shadow-sm text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" %>
|
||||
</div>
|
||||
<% if @payout.pending? || @payout.processing? %>
|
||||
<%= button_to "Process Payout", admin_payout_path(@payout), method: :post,
|
||||
class: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" %>
|
||||
<% end %>
|
||||
|
||||
<% if @payout.pending? || @payout.processing? %>
|
||||
<%= button_to "Mark as Manually Processed", mark_as_manually_processed_admin_payout_path(@payout), method: :post,
|
||||
class: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500",
|
||||
data: { confirm: "Are you sure you want to mark this payout as manually processed? This will notify the promoter that the bank transfer is being processed." } %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user