summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-09-07 15:24:11 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-09-07 15:24:11 +0200
commit12f306e2144081e00c36ed9942068462604bef55 (patch)
treed0279fa5b3fbd976cd18cc05e4e6d245dcd63ea0 /src/ui
parent026e38982f5388cede0cd7ebad2ea7571d1d57ed (diff)
income statement finalization
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/helpers.cpp2
-rw-r--r--src/ui/ui_earnings.cpp220
-rw-r--r--src/ui/ui_settings.cpp2
3 files changed, 136 insertions, 88 deletions
diff --git a/src/ui/helpers.cpp b/src/ui/helpers.cpp
index 37c4b36..0a93cf7 100644
--- a/src/ui/helpers.cpp
+++ b/src/ui/helpers.cpp
@@ -5,6 +5,8 @@
#include "locales.hpp"
#include "strops.hpp"
+ImFont* fontBold;
+
static ui_status current_status;
void ui_draw_status()
diff --git a/src/ui/ui_earnings.cpp b/src/ui/ui_earnings.cpp
index 81e31b5..4f545d2 100644
--- a/src/ui/ui_earnings.cpp
+++ b/src/ui/ui_earnings.cpp
@@ -21,131 +21,177 @@ void ui_destroy_earnings()
void ui_draw_earnings()
{
- if (ImGui::BeginTable("QuarterlyResultsTable", 5,
- ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit))
+ static s32 current_page = 0;
+ s32 max_page = ((statement->quarter_count) / 4);
+
+ if (current_page >= max_page-1) current_page = max_page-1;
+ if (current_page < 0) current_page = 0;
+
+ bool enable_prev = current_page > 0;
+ if (!enable_prev) ImGui::BeginDisabled();
+ if (ImGui::Button("<< Prev") && current_page > 0) current_page--;
+ if (!enable_prev) ImGui::EndDisabled();
+
+ ImGui::SameLine();
+ ImGui::Text("(%d/%d)", current_page+1, max_page);
+
+ ImGui::SameLine();
+ bool enable_next = current_page < max_page-1;
+ if (!enable_next) ImGui::BeginDisabled();
+ if (ImGui::Button("Next >>") && current_page < max_page-1) current_page++;
+ if (!enable_next) ImGui::EndDisabled();
+
+ ImGui::Spacing();
+
+ char* currency_symbol = administration_get_currency_symbol_from_currency(administration_get_default_currency());
+
+ if (ImGui::BeginTable("QuarterlyResultsTable", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Hideable))
{
- ImGui::TableSetupColumn("##names");
+ ImGui::TableSetupColumn("##names", ImGuiTableColumnFlags_WidthFixed, 300);
- int quarter_start = 0;
int quarter_count = 4;
+ int quarter_start = current_page*quarter_count;
- // Table header
+ ImGui::PushFont(fontBold);
for (int q = 0; q < quarter_count; q++)
{
- ImGui::TableSetupColumn(statement->quarters[q].quarter_str, ImGuiTableColumnFlags_WidthStretch);
+ ImGui::TableSetupColumn(statement->quarters[quarter_start+q].quarter_str, ImGuiTableColumnFlags_WidthStretch);
}
ImGui::TableHeadersRow();
+ ImGui::PopFont();
- // Uncategorized income and expenses
- ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::Text("(Uncategorized)");
- ImGui::TableSetColumnIndex(1); ImGui::Text("");
- ImGui::TableSetColumnIndex(2); ImGui::Text("");
- ImGui::TableSetColumnIndex(3); ImGui::Text("");
- ImGui::TableSetColumnIndex(4); ImGui::Text("");
+ bool has_uncategorized_revenue = (statement->quarters[quarter_start + 0].uncategorized_revenue +
+ statement->quarters[quarter_start + 1].uncategorized_revenue +
+ statement->quarters[quarter_start + 2].uncategorized_revenue +
+ statement->quarters[quarter_start + 3].uncategorized_revenue) != 0.0f;
- ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(" Revenue");
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f", statement->quarters[quarter_start + 0].uncategorized_revenue);
- ImGui::TableSetColumnIndex(2); ImGui::Text("%.2f", statement->quarters[quarter_start + 1].uncategorized_revenue);
- ImGui::TableSetColumnIndex(3); ImGui::Text("%.2f", statement->quarters[quarter_start + 2].uncategorized_revenue);
- ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f", statement->quarters[quarter_start + 3].uncategorized_revenue);
+ bool has_uncategorized_taxes = (statement->quarters[quarter_start + 0].uncategorized_taxes +
+ statement->quarters[quarter_start + 1].uncategorized_taxes +
+ statement->quarters[quarter_start + 2].uncategorized_taxes +
+ statement->quarters[quarter_start + 3].uncategorized_taxes) != 0.0f;
- ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(" Tax");
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f", statement->quarters[quarter_start + 0].uncategorized_taxes);
- ImGui::TableSetColumnIndex(2); ImGui::Text("%.2f", statement->quarters[quarter_start + 1].uncategorized_taxes);
- ImGui::TableSetColumnIndex(3); ImGui::Text("%.2f", statement->quarters[quarter_start + 2].uncategorized_taxes);
- ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f", statement->quarters[quarter_start + 3].uncategorized_taxes);
+ bool has_uncategorized_expenses = (statement->quarters[quarter_start + 0].uncategorized_expenses +
+ statement->quarters[quarter_start + 1].uncategorized_expenses +
+ statement->quarters[quarter_start + 2].uncategorized_expenses +
+ statement->quarters[quarter_start + 3].uncategorized_expenses) != 0.0f;
- ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(" Expenses");
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f", statement->quarters[quarter_start + 0].uncategorized_expenses);
- ImGui::TableSetColumnIndex(2); ImGui::Text("%.2f", statement->quarters[quarter_start + 1].uncategorized_expenses);
- ImGui::TableSetColumnIndex(3); ImGui::Text("%.2f", statement->quarters[quarter_start + 2].uncategorized_expenses);
- ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f", statement->quarters[quarter_start + 3].uncategorized_expenses);
+ // Uncategorized income and expenses
+ if (has_uncategorized_revenue || has_uncategorized_taxes || has_uncategorized_expenses) {
+ ImGui::TableNextRow();
+ ImGui::TableSetColumnIndex(0); ImGui::Text("(%s)", localize("statement.uncategorized"));
+ ImGui::TableSetColumnIndex(1); ImGui::Text("");
+ ImGui::TableSetColumnIndex(2); ImGui::Text("");
+ ImGui::TableSetColumnIndex(3); ImGui::Text("");
+ ImGui::TableSetColumnIndex(4); ImGui::Text("");
+ }
+
+ if (has_uncategorized_revenue) {
+ ImGui::TableNextRow();
+ ImGui::TableSetColumnIndex(0); ImGui::Text(" %s", localize("statement.revenue"));
+ ImGui::TableSetColumnIndex(1); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 0].uncategorized_revenue, currency_symbol);
+ ImGui::TableSetColumnIndex(2); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 1].uncategorized_revenue, currency_symbol);
+ ImGui::TableSetColumnIndex(3); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 2].uncategorized_revenue, currency_symbol);
+ ImGui::TableSetColumnIndex(4); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 3].uncategorized_revenue, currency_symbol);
+ }
+
+ if (has_uncategorized_taxes) {
+ ImGui::TableNextRow();
+ ImGui::TableSetColumnIndex(0); ImGui::Text(" %s", localize("statement.tax"));
+ ImGui::TableSetColumnIndex(1); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 0].uncategorized_taxes, currency_symbol);
+ ImGui::TableSetColumnIndex(2); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 1].uncategorized_taxes, currency_symbol);
+ ImGui::TableSetColumnIndex(3); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 2].uncategorized_taxes, currency_symbol);
+ ImGui::TableSetColumnIndex(4); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 3].uncategorized_taxes, currency_symbol);
+ }
+
+ if (has_uncategorized_expenses) {
+ ImGui::TableNextRow();
+ ImGui::TableSetColumnIndex(0); ImGui::Text(" %s", localize("statement.expenses"));
+ ImGui::TableSetColumnIndex(1); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 0].uncategorized_expenses, currency_symbol);
+ ImGui::TableSetColumnIndex(2); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 1].uncategorized_expenses, currency_symbol);
+ ImGui::TableSetColumnIndex(3); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 2].uncategorized_expenses, currency_symbol);
+ ImGui::TableSetColumnIndex(4); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 3].uncategorized_expenses, currency_symbol);
+ }
quarterly_report default_quater = statement->quarters[0];
for (u32 p = 0; p < default_quater.report_count; p++)
{
- ImGui::TableNextRow();
project_report* report = &default_quater.reports[p];
- ImGui::TableSetColumnIndex(0); ImGui::Text("(%s)", report->description);
+
+ ImGui::TableNextRow();
+ ImGui::TableSetColumnIndex(0);
+ bool toggled = ImGui::TreeNodeEx(report->description,
+ ImGuiTreeNodeFlags_SpanFullWidth |
+ ImGuiTreeNodeFlags_DefaultOpen);
+
ImGui::TableSetColumnIndex(1); ImGui::Text("");
ImGui::TableSetColumnIndex(2); ImGui::Text("");
ImGui::TableSetColumnIndex(3); ImGui::Text("");
ImGui::TableSetColumnIndex(4); ImGui::Text("");
+ if (!toggled) continue;
+
+ ImGui::PushFont(fontBold);
ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(" Revenue");
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f", statement->quarters[quarter_start + 0].reports[p].revenue);
- ImGui::TableSetColumnIndex(2); ImGui::Text("%.2f", statement->quarters[quarter_start + 1].reports[p].revenue);
- ImGui::TableSetColumnIndex(3); ImGui::Text("%.2f", statement->quarters[quarter_start + 2].reports[p].revenue);
- ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f", statement->quarters[quarter_start + 3].reports[p].revenue);
+ ImGui::TableSetColumnIndex(0); ImGui::Text(" %s", localize("statement.revenue"));
+ ImGui::TableSetColumnIndex(1); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 0].reports[p].revenue, currency_symbol);
+ ImGui::TableSetColumnIndex(2); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 1].reports[p].revenue, currency_symbol);
+ ImGui::TableSetColumnIndex(3); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 2].reports[p].revenue, currency_symbol);
+ ImGui::TableSetColumnIndex(4); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 3].reports[p].revenue, currency_symbol);
+ ImGui::PopFont();
ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(" Tax");
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f", statement->quarters[quarter_start + 0].reports[p].taxes);
- ImGui::TableSetColumnIndex(2); ImGui::Text("%.2f", statement->quarters[quarter_start + 1].reports[p].taxes);
- ImGui::TableSetColumnIndex(3); ImGui::Text("%.2f", statement->quarters[quarter_start + 2].reports[p].taxes);
- ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f", statement->quarters[quarter_start + 3].reports[p].taxes);
+ ImGui::TableSetColumnIndex(0); ImGui::Text(" %s", localize("statement.tax"));
+ ImGui::TableSetColumnIndex(1); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 0].reports[p].taxes, currency_symbol);
+ ImGui::TableSetColumnIndex(2); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 1].reports[p].taxes, currency_symbol);
+ ImGui::TableSetColumnIndex(3); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 2].reports[p].taxes, currency_symbol);
+ ImGui::TableSetColumnIndex(4); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 3].reports[p].taxes, currency_symbol);
+ ImGui::PushFont(fontBold);
ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(" Expenses");
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f", statement->quarters[quarter_start + 0].reports[p].expenses_total);
- ImGui::TableSetColumnIndex(2); ImGui::Text("%.2f", statement->quarters[quarter_start + 1].reports[p].expenses_total);
- ImGui::TableSetColumnIndex(3); ImGui::Text("%.2f", statement->quarters[quarter_start + 2].reports[p].expenses_total);
- ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f", statement->quarters[quarter_start + 3].reports[p].expenses_total);
+ ImGui::TableSetColumnIndex(0); ImGui::Text(" %s", localize("statement.expenses"));
+ ImGui::TableSetColumnIndex(1); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 0].reports[p].expenses_total, currency_symbol);
+ ImGui::TableSetColumnIndex(2); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 1].reports[p].expenses_total, currency_symbol);
+ ImGui::TableSetColumnIndex(3); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 2].reports[p].expenses_total, currency_symbol);
+ ImGui::TableSetColumnIndex(4); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 3].reports[p].expenses_total, currency_symbol);
+ ImGui::PopFont();
for (u32 e = 0; e < report->expense_count; e++)
{
- ImGui::TableNextRow();
project_expense* expense = &report->expenses[e];
+ if (!expense->expense_used_in_project) continue;
+ ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::Text(" %s", localize(expense->description));
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f", statement->quarters[quarter_start + 0].reports[p].expenses[e].total);
- ImGui::TableSetColumnIndex(2); ImGui::Text("%.2f", statement->quarters[quarter_start + 1].reports[p].expenses[e].total);
- ImGui::TableSetColumnIndex(3); ImGui::Text("%.2f", statement->quarters[quarter_start + 2].reports[p].expenses[e].total);
- ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f", statement->quarters[quarter_start + 3].reports[p].expenses[e].total);
-
-
+ ImGui::TableSetColumnIndex(1); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 0].reports[p].expenses[e].total, currency_symbol);
+ ImGui::TableSetColumnIndex(2); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 1].reports[p].expenses[e].total, currency_symbol);
+ ImGui::TableSetColumnIndex(3); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 2].reports[p].expenses[e].total, currency_symbol);
+ ImGui::TableSetColumnIndex(4); ImGui::Text("%.0f %s", statement->quarters[quarter_start + 3].reports[p].expenses[e].total, currency_symbol);
}
+
+ ImGui::TreePop();
}
- /*
- for (int i = 0; i < 1; i++)
- {
- quarterly_report quarter = statement->quarters[quarter_start + quarter_index];
+ ImGui::PushFont(fontBold);
+ ImGui::TableNextRow();
+ ImGui::TableNextColumn(); ImGui::TextUnformatted(localize("statement.profit"));
+
+ #define PUSH_PROFIT_COLUMN(_profit)\
+ ImGui::TableNextColumn(); \
+ if (_profit < 0.0f) {\
+ ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(235, 64, 52, 255));\
+ ImGui::Text("(%.0f %s)", _profit, currency_symbol);\
+ ImGui::PopStyleColor();\
+ }\
+ else {\
+ ImGui::Text("%.0f %s", _profit, currency_symbol);\
+ }
- for (u32 p = 0; p < quarter.report_count; p++)
- {
- ImGui::TableNextRow();
- project_report* report = &quarter.reports[p];
- ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(report->description);
- ImGui::TableSetColumnIndex(1); ImGui::Text("");
- ImGui::TableSetColumnIndex(2); ImGui::Text("");
- ImGui::TableSetColumnIndex(3); ImGui::Text("");
- ImGui::TableSetColumnIndex(4); ImGui::Text("");
-
-
- // for (u32 e = 0; e < report->expense_count; e++)
- // {
- // project_expense* expense = &report->expenses[e];
- // ImGui::TableNextColumn(); ImGui::TextUnformatted(expense->description);
- // }
- }
- }*/
-
- // // Rows
- // for (int i = 0; i < results_count; i++)
- // {
- // ImGui::TableNextRow();
- // ImGui::TableSetColumnIndex(0); ImGui::TextUnformatted(results[i].quarter);
- // ImGui::TableSetColumnIndex(1); ImGui::TextUnformatted(results[i].revenue);
- // ImGui::TableSetColumnIndex(2); ImGui::TextUnformatted(results[i].profit);
- // ImGui::TableSetColumnIndex(3); ImGui::TextUnformatted(results[i].expenses);
- // }
+ PUSH_PROFIT_COLUMN(statement->quarters[quarter_start + 0].profit);
+ PUSH_PROFIT_COLUMN(statement->quarters[quarter_start + 1].profit);
+ PUSH_PROFIT_COLUMN(statement->quarters[quarter_start + 2].profit);
+ PUSH_PROFIT_COLUMN(statement->quarters[quarter_start + 3].profit);
+ ImGui::PopFont();
ImGui::EndTable();
}
} \ No newline at end of file
diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp
index dea58ec..1746111 100644
--- a/src/ui/ui_settings.cpp
+++ b/src/ui/ui_settings.cpp
@@ -47,7 +47,7 @@ static void ui_draw_vat_rates()
if (ImGui::BeginTable("TableVatRates", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
- ImGui::TableSetupColumn(localize("settings.vat.table.country"), ImGuiTableColumnFlags_WidthFixed, 140);
+ ImGui::TableSetupColumn(localize("settings.vat.table.country"), ImGuiTableColumnFlags_WidthFixed, 220);
ImGui::TableSetupColumn(localize("settings.vat.table.rates"));
// Used to generate headers for each individual country.