Files
sure/app/views/reports/_summary_dashboard.html.erb
soky srm d9f8d064af Implement Reporting tab (#276)
* First reporting version

* Fixes for all tabs

* Transactions table

* Budget section re-design

* FIX exports

Fix transactions table aggregation

* Add support for google sheets

Remove pdf and xlsx for now

* Multiple fixes

- Trends & Insights now follows top filter
- Transactions Breakdown removed filters, implemented sort by amount.
- The entire section follows top filters.
- Export to CSV adds per month breakdown

* Linter and tests

* Fix amounts

- Correctly handle amounts across the views and controller.
- Pass proper values to do calculation on, and not loose precision

* Update Gemfile.lock

* Add support for api-key on reports

Also fix custom date filter

* Review fixes

* Move budget status calculations out of the view.

* fix ensures that quarterly reports end at the quarter boundary

* Fix bugdet days remaining

Fix raw css style

* Fix test

* Implement google sheets properly with hotwire

* Improve UX on period comparison

* FIX csv export for non API key auth
2025-11-05 14:54:45 +01:00

133 lines
4.5 KiB
Plaintext

<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<%# Total Income Card %>
<div class="bg-container rounded-xl shadow-border-xs p-6">
<div class="flex items-start justify-between mb-3">
<div class="flex items-center gap-2">
<%= icon("trending-up", class: "w-5 h-5 text-success") %>
<h3 class="text-sm font-medium text-secondary">
<%= t("reports.summary.total_income") %>
</h3>
</div>
</div>
<div class="space-y-2">
<p class="text-2xl font-semibold text-primary">
<%= metrics[:current_income].format %>
</p>
<% if metrics[:income_change] %>
<div class="flex items-center gap-1.5">
<% if metrics[:income_change] >= 0 %>
<%= icon("arrow-up", class: "w-4 h-4 text-success") %>
<span class="text-sm font-medium text-success">
+<%= metrics[:income_change] %>%
</span>
<% else %>
<%= icon("arrow-down", class: "w-4 h-4 text-danger") %>
<span class="text-sm font-medium text-danger">
<%= metrics[:income_change] %>%
</span>
<% end %>
<span class="text-sm text-tertiary">
<%= t("reports.summary.vs_previous") %>
</span>
</div>
<% end %>
</div>
</div>
<%# Total Expenses Card %>
<div class="bg-container rounded-xl shadow-border-xs p-6">
<div class="flex items-start justify-between mb-3">
<div class="flex items-center gap-2">
<%= icon("trending-down", class: "w-5 h-5 text-danger") %>
<h3 class="text-sm font-medium text-secondary">
<%= t("reports.summary.total_expenses") %>
</h3>
</div>
</div>
<div class="space-y-2">
<p class="text-2xl font-semibold text-primary">
<%= metrics[:current_expenses].format %>
</p>
<% if metrics[:expense_change] %>
<div class="flex items-center gap-1.5">
<% if metrics[:expense_change] >= 0 %>
<%= icon("arrow-up", class: "w-4 h-4 text-danger") %>
<span class="text-sm font-medium text-danger">
+<%= metrics[:expense_change] %>%
</span>
<% else %>
<%= icon("arrow-down", class: "w-4 h-4 text-success") %>
<span class="text-sm font-medium text-success">
<%= metrics[:expense_change] %>%
</span>
<% end %>
<span class="text-sm text-tertiary">
<%= t("reports.summary.vs_previous") %>
</span>
</div>
<% end %>
</div>
</div>
<%# Net Savings Card %>
<div class="bg-container rounded-xl shadow-border-xs p-6">
<div class="flex items-start justify-between mb-3">
<div class="flex items-center gap-2">
<%= icon("piggy-bank", class: "w-5 h-5 text-primary") %>
<h3 class="text-sm font-medium text-secondary">
<%= t("reports.summary.net_savings") %>
</h3>
</div>
</div>
<div class="space-y-2">
<p class="text-2xl font-semibold <%= metrics[:net_savings] >= 0 ? "text-success" : "text-danger" %>">
<%= metrics[:net_savings].format %>
</p>
<p class="text-sm text-tertiary">
<%= t("reports.summary.income_minus_expenses") %>
</p>
</div>
</div>
<%# Budget Performance Card %>
<div class="bg-container rounded-xl shadow-border-xs p-6">
<div class="flex items-start justify-between mb-3">
<div class="flex items-center gap-2">
<%= icon("gauge", class: "w-5 h-5 text-primary") %>
<h3 class="text-sm font-medium text-secondary">
<%= t("reports.summary.budget_performance") %>
</h3>
</div>
</div>
<div class="space-y-2">
<% if metrics[:budget_percent] %>
<p class="text-2xl font-semibold text-primary">
<%= metrics[:budget_percent] %>%
</p>
<div class="space-y-1.5">
<div class="h-2 bg-surface-inset rounded-full overflow-hidden">
<div class="h-full <%= metrics[:budget_percent] >= 100 ? "bg-danger" : metrics[:budget_percent] >= 80 ? "bg-warning" : "bg-success" %> rounded-full transition-all"
style="width: <%= [metrics[:budget_percent], 100].min %>%"></div>
</div>
<p class="text-sm text-tertiary">
<%= t("reports.summary.of_budget_used") %>
</p>
</div>
<% else %>
<p class="text-base text-tertiary">
<%= t("reports.summary.no_budget_data") %>
</p>
<% end %>
</div>
</div>
</div>