Add /admin/invoices/stats with a year filter: invoiced, received and outstanding totals in GEL at each invoice's captured rate (the one currency every invoice has), overdue count, average days to pay, money received per month by payment date as a bar chart with the same figures in a table, per-currency totals, top clients and crypto option usage. Cancelled invoices are left out of every amount; hidden ones follow the usual superuser-only visibility. Assisted-by: Claude:opus-5
42 lines
1.8 KiB
Text
42 lines
1.8 KiB
Text
<%== erb :'admin/_nav', layout: false %>
|
|
<div class="header">
|
|
<h1>Invoices</h1>
|
|
<p class="tagline"><% if can?('invoices', 'write') %><a href="/admin/invoices/new">+ New invoice</a> · <% end %><a href="/admin/invoices/stats">statistics</a> · <a href="/admin/invoices/payout-addresses">payout addresses</a></p>
|
|
</div>
|
|
|
|
<% if @invoices.empty? %>
|
|
<section class="section">
|
|
<p>No invoices yet.<% if can?('invoices', 'write') %> <a href="/admin/invoices/new">Create the first one</a>.<% end %></p>
|
|
</section>
|
|
<% else %>
|
|
<section class="section">
|
|
<table class="invoice-list">
|
|
<thead>
|
|
<tr>
|
|
<th>Number</th>
|
|
<th>Client</th>
|
|
<th>Issued</th>
|
|
<th class="num">Total</th>
|
|
<th>Status</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<% @invoices.each do |inv| %>
|
|
<tr>
|
|
<td class="mono"><%= inv.number %><% if inv.hidden %> <span class="badge badge-hidden">hidden</span><% end %></td>
|
|
<td><%= inv.client_name %></td>
|
|
<td class="mono"><%= inv.issued_on.strftime('%Y-%m-%d') %></td>
|
|
<td class="num mono"><%= inv.currency %> <%= '%.2f' % inv.total %></td>
|
|
<td>
|
|
<span class="badge badge-<%= inv.status %>"><%= inv.status %></span>
|
|
</td>
|
|
<td class="actions">
|
|
<a href="/admin/invoices/<%= inv.uuid %>">view</a>
|
|
</td>
|
|
</tr>
|
|
<% end %>
|
|
</tbody>
|
|
</table>
|
|
</section>
|
|
<% end %>
|