diff options
| -rw-r--r-- | docs/CHANGES.rst | 1 | ||||
| -rw-r--r-- | include/administration.hpp | 12 | ||||
| -rw-r--r-- | src/administration.cpp | 23 | ||||
| -rw-r--r-- | src/locales/en.cpp | 1 | ||||
| -rw-r--r-- | src/ui/ui_expenses.cpp | 36 | ||||
| -rw-r--r-- | src/ui/ui_invoices.cpp | 36 |
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(); } |
