summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-09-17 10:30:27 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-09-17 10:30:27 +0200
commit885f413e9ae887979a59d0ca7238246429dd81ad (patch)
tree07d2dabe1ae3fadf36d8526f3fb156c7796fb06b
parent8c1eb3246c8f738867b2ddeb44e48f8332633963 (diff)
set invoice finals if invoice currency != main currency
-rw-r--r--docs/CHANGES.rst1
-rw-r--r--include/administration.hpp12
-rw-r--r--src/administration.cpp23
-rw-r--r--src/locales/en.cpp1
-rw-r--r--src/ui/ui_expenses.cpp36
-rw-r--r--src/ui/ui_invoices.cpp36
6 files changed, 86 insertions, 23 deletions
diff --git a/docs/CHANGES.rst b/docs/CHANGES.rst
index cb3c923..35f5a5b 100644
--- a/docs/CHANGES.rst
+++ b/docs/CHANGES.rst
@@ -17,7 +17,6 @@ TODO:
- validate data within administration on save to make sure it is valid for transmissions. (e.g. rules of https://docs.peppol.eu/poacc/billing/3.0/syntax/ubl-invoice/cac-AccountingSupplierParty/cac-Party/cbc-EndpointID/)
- View local business number / vat number naming on contact form. e.g. when country is austria: "Österreichische Umsatzsteuer-Identifikationsnummer"
- outgoing invoices should always have default currency
-- if an incomming invoice currency != default currency, final amount should be manually set as the total is always represented in the default currency.
- ICP reports
v0.1 (master)
diff --git a/include/administration.hpp b/include/administration.hpp
index 616cc0a..ad94c37 100644
--- a/include/administration.hpp
+++ b/include/administration.hpp
@@ -114,7 +114,7 @@ typedef struct
bool discount_is_percentage;
float allowance; // Total discount.
float net; // Total net, with discount.
- char currency[MAX_LEN_CURRENCY]; // 3 letter code
+ char currency[MAX_LEN_CURRENCY]; // 3 letter code, always matches invoice currency.
char tax_rate_id[MAX_LEN_ID]; // T/[id]
float tax;
float total;
@@ -243,11 +243,11 @@ typedef struct
char cost_center_id[MAX_LEN_ID]; // For incomming invoices. optional.
list_t billing_items;
- // Total, tax and net are calculated from billing items.
- float total;
- float tax;
- float net;
- float allowance;
+ // Calculated from billing items, represented in invoice currency.
+ float orig_total, orig_tax, orig_net, orig_allowance;
+
+ // Represented in main currency.
+ float total, tax, net, allowance;
char currency[MAX_LEN_CURRENCY]; // 3 letter code
bool is_triangulation; // True if addressee != customer
diff --git a/src/administration.cpp b/src/administration.cpp
index 0233213..ccbd284 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -1554,21 +1554,28 @@ invoice administration_invoice_create_empty()
static void administration_recalculate_invoice_totals(invoice* invoice)
{
- invoice->tax = 0.0f;
- invoice->total = 0.0f;
- invoice->net = 0.0f;
- invoice->allowance = 0.0f;
+ invoice->orig_tax = 0.0f;
+ invoice->orig_total = 0.0f;
+ invoice->orig_net = 0.0f;
+ invoice->orig_allowance = 0.0f;
list_iterator_start(&invoice->billing_items);
while (list_iterator_hasnext(&invoice->billing_items)) {
billing_item* c = (billing_item *)list_iterator_next(&invoice->billing_items);
- invoice->tax += c->tax;
- invoice->total += c->total;
- invoice->net += c->net;
- invoice->allowance += c->allowance;
+ invoice->orig_tax += c->tax;
+ invoice->orig_total += c->total;
+ invoice->orig_net += c->net;
+ invoice->orig_allowance += c->allowance;
}
list_iterator_stop(&invoice->billing_items);
+
+ if (strcmp(invoice->currency, administration_get_default_currency()) == 0) {
+ invoice->tax = invoice->orig_tax;
+ invoice->total = invoice->orig_total;
+ invoice->net = invoice->orig_net;
+ invoice->allowance = invoice->orig_allowance;
+ }
}
void administration_invoice_set_currency(invoice* invoice, char* currency)
diff --git a/src/locales/en.cpp b/src/locales/en.cpp
index a5309a3..d70a282 100644
--- a/src/locales/en.cpp
+++ b/src/locales/en.cpp
@@ -141,6 +141,7 @@ locale_entry en_locales[] = {
{"invoice.form.shippinginformation", "Shipping information"},
{"invoice.form.add", "+ Billing item"},
{"invoice.form.currency", "Currency"},
+ {"invoice.form.finalSettlement", "Final settlement in"},
{"invoice.table.invoicenumber", "Invoice number"},
{"invoice.table.amount", "Amount"},
diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp
index 96489d3..75bd268 100644
--- a/src/ui/ui_expenses.cpp
+++ b/src/ui/ui_expenses.cpp
@@ -189,7 +189,7 @@ static void draw_expense_items_form(invoice* invoice)
ImGui::PopItemWidth();
ImGui::TableSetColumnIndex(4);
- ImGui::InputFloat("##discount", &item.discount, 0.0f, 0.0f, "%.0f");
+ ImGui::InputFloat("##discount", &item.discount, 0.0f, 0.0f, "%.2f");
ImGui::SameLine();
// Toggle between currency and %
@@ -233,13 +233,41 @@ static void draw_expense_items_form(invoice* invoice)
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, IM_COL32(70, 70, 70, 255));
ImGui::TableSetColumnIndex(5);
- ImGui::Text("%.2f %s", invoice->net, invoice->currency);
+ ImGui::Text("%.2f %s", invoice->orig_net, invoice->currency);
ImGui::TableSetColumnIndex(7);
- ImGui::Text("%.2f %s", invoice->tax, invoice->currency);
+ ImGui::Text("%.2f %s", invoice->orig_tax, invoice->currency);
ImGui::TableSetColumnIndex(8);
- ImGui::Text("%.2f %s", invoice->total, invoice->currency);
+ ImGui::Text("%.2f %s", invoice->orig_total, invoice->currency);
+
+ if (strcmp(invoice->currency, administration_get_default_currency()) != 0) {
+ ImGui::TableNextRow();
+ ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, IM_COL32(50, 50, 50, 255));
+
+ ImGui::TableSetColumnIndex(2);
+ ImGui::Text("%s %s", localize("invoice.form.finalSettlement"), administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(4);
+ ImGui::InputFloat("##final_allowance", &invoice->allowance, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(5);
+ ImGui::InputFloat("##final_net", &invoice->net, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(7);
+ ImGui::InputFloat("##final_tax", &invoice->tax, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(8);
+ ImGui::InputFloat("##final_total", &invoice->total, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+ }
ImGui::EndTable();
}
diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp
index f022509..6db7054 100644
--- a/src/ui/ui_invoices.cpp
+++ b/src/ui/ui_invoices.cpp
@@ -223,7 +223,7 @@ static void draw_invoice_items_form(invoice* invoice)
ImGui::PopItemWidth();
ImGui::TableSetColumnIndex(4);
- ImGui::InputFloat("##discount", &item.discount, 0.0f, 0.0f, "%.0f");
+ ImGui::InputFloat("##discount", &item.discount, 0.0f, 0.0f, "%.2f");
ImGui::SameLine();
// Toggle between currency and %
@@ -266,13 +266,41 @@ static void draw_invoice_items_form(invoice* invoice)
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, IM_COL32(70, 70, 70, 255));
ImGui::TableSetColumnIndex(5);
- ImGui::Text("%.2f %s", invoice->net, invoice->currency);
+ ImGui::Text("%.2f %s", invoice->orig_net, invoice->currency);
ImGui::TableSetColumnIndex(7);
- ImGui::Text("%.2f %s", invoice->tax, invoice->currency);
+ ImGui::Text("%.2f %s", invoice->orig_tax, invoice->currency);
ImGui::TableSetColumnIndex(8);
- ImGui::Text("%.2f %s", invoice->total, invoice->currency);
+ ImGui::Text("%.2f %s", invoice->orig_total, invoice->currency);
+
+ if (strcmp(invoice->currency, administration_get_default_currency()) != 0) {
+ ImGui::TableNextRow();
+ ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, IM_COL32(50, 50, 50, 255));
+
+ ImGui::TableSetColumnIndex(2);
+ ImGui::Text("%s %s", localize("invoice.form.finalSettlement"), administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(4);
+ ImGui::InputFloat("##final_allowance", &invoice->allowance, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(5);
+ ImGui::InputFloat("##final_net", &invoice->net, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(7);
+ ImGui::InputFloat("##final_tax", &invoice->tax, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+
+ ImGui::TableSetColumnIndex(8);
+ ImGui::InputFloat("##final_total", &invoice->total, 0.0f, 0.0f, "%.2f");
+ ImGui::SameLine();
+ ImGui::Text("%s", administration_get_default_currency());
+ }
ImGui::EndTable();
}