Aggiunge abbonamenti omaggio admin per sponsor e promozioni.

Gli admin possono concedere o revocare Premium Light/Full senza Stripe;
il piano omaggio ha priorità sui webhook e la società vede un messaggio dedicato.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-02 22:26:19 +02:00
parent 566104aff4
commit 82ff1972a0
24 changed files with 388 additions and 7 deletions

View File

@@ -0,0 +1,56 @@
<%# locals: (club:, subscription:, return_to: nil) %>
<section class="admin-comped-card" style="margin-bottom:24px;padding:16px;border:1px solid #3d3520;border-radius:8px;background:#2a2618">
<h2 style="margin:0 0 8px;font-size:1.1rem">Abbonamento omaggio</h2>
<p style="color:#bbb;font-size:0.9rem;margin:0 0 14px">
Sponsor o promozione: assegna Premium Light/Full senza pagamento Stripe. Revocabile in qualsiasi momento.
</p>
<% sub = subscription %>
<% if sub&.admin_comped? %>
<p style="margin:0 0 12px">
<strong>Attivo:</strong> <%= sub.plan.name %>
<% if sub.admin_comped_reason.present? %>
· <%= sub.admin_comped_reason %>
<% end %>
<% if sub.admin_comped_at.present? %>
<br><span style="color:#888;font-size:0.85rem">Dal <%= l(sub.admin_comped_at, format: :long) %>
<% if sub.admin_comped_by.present? %> · admin <%= sub.admin_comped_by.username %><% end %>
</span>
<% end %>
<% if sub.stripe_subscription_id.present? %>
<br><span style="color:#888;font-size:0.85rem">Nota: esiste anche un abbonamento Stripe collegato; lomaggio ha priorità sul piano.</span>
<% end %>
</p>
<%= button_to "Revoca omaggio (torna Free o ripristina Stripe)",
revoke_comped_admin_club_path(club, return_to: return_to),
method: :delete,
class: "admin-btn admin-btn--secondary",
form: { data: { turbo_confirm: "Revocare labbonamento omaggio per #{club.name}?" } } %>
<% else %>
<p style="margin:0 0 12px;color:#888">
Piano attuale: <strong><%= sub&.plan&.name || "Free" %></strong>
<% if sub&.stripe_subscription_id.present? %>
· pagamento Stripe attivo
<% end %>
</p>
<%= form_with url: grant_comped_admin_club_path(club), method: :post, local: true, class: "admin-comped-form" do %>
<%= hidden_field_tag :return_to, return_to if return_to.present? %>
<div style="display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end">
<label style="display:flex;flex-direction:column;gap:4px;font-size:0.85rem">
Piano
<%= select_tag :plan_slug,
options_for_select(
[["Premium Light", "premium_light"], ["Premium Full", "premium_full"]]
),
required: true,
class: "admin-input" %>
</label>
<label style="display:flex;flex-direction:column;gap:4px;font-size:0.85rem;flex:1;min-width:200px">
Motivo (es. sponsor 2026)
<%= text_field_tag :reason, nil, placeholder: "Sponsor, promozione…", class: "admin-input", style: "width:100%" %>
</label>
<%= submit_tag "Concedi omaggio", class: "admin-btn admin-btn--primary" %>
</div>
<% end %>
<% end %>
</section>

View File

@@ -0,0 +1,38 @@
<h2>Società</h2>
<p style="color:#888;margin-bottom:16px">
Gestisci abbonamenti omaggio (sponsor / promozioni). Per pagamenti Stripe usa <%= link_to "Fatturazione", admin_billing_path %>.
</p>
<table class="admin-table">
<thead>
<tr>
<th>Società</th>
<th>Piano</th>
<th>Omaggio</th>
<th>Stripe</th>
<th></th>
</tr>
</thead>
<tbody>
<% @clubs.each do |club| %>
<% sub = club.subscription %>
<tr>
<td><strong><%= club.name %></strong></td>
<td><%= sub&.plan&.name || "Free" %></td>
<td>
<% if sub&.admin_comped? %>
<span style="color:#ffb74d">Sì</span>
<% if sub.admin_comped_reason.present? %> · <%= sub.admin_comped_reason %><% end %>
<% else %>
<% end %>
</td>
<td><%= sub&.stripe_subscription_id.present? ? "Sì" : "—" %></td>
<td>
<%= link_to "Gestisci", admin_club_path(club) %>
· <%= link_to "Fatture", admin_billing_path(club_id: club.id) %>
</td>
</tr>
<% end %>
</tbody>
</table>

View File

@@ -0,0 +1,16 @@
<p style="margin-bottom:16px"><%= link_to "← Tutte le società", admin_clubs_path %></p>
<h2><%= @club.name %></h2>
<p style="color:#888">
Sport: <%= @club.sport %>
· <%= link_to "Pagamenti e fatture", admin_billing_path(club_id: @club.id) %>
</p>
<%= render "admin/clubs/comped_form", club: @club, subscription: @subscription, return_to: admin_club_path(@club) %>
<h3 style="font-size:1rem;margin-top:24px">Squadre</h3>
<ul>
<% @club.teams.order(:name).each do |team| %>
<li><%= link_to team.name, admin_team_path(team) %></li>
<% end %>
</ul>