TODO: Fix: - When reloading view, lock main thread as the freeing might cause a crash - reload invoice when backing out of edit mode. Unsaved changed are not undone atm - Handle missing file loading crash Refactor: - Refactor zip writing to be faster (Windows is slow) - remove run_windows64.bat - simplify run_linux64.sh, remove library paths from shell file and include path in .hpp - fix all warnings from Wall - load ttfs from memory, embed ttfs in binary Testing: - write tests for strops.hpp - write tests that check error handling for corrupt files. (e.g. references to tax rates, project and cost center that failed to load) Features: - save api keys for all options individually so user can switch without losing key - Refactor contact and project UI to be like invoice & expenses - Show AI balance available in settings page - Handle invalid api key response from AI backends and display in settings UI - error log for tax report to display invoices not yet supported for tax generation or invoices with invalid tax rates - minimum invoice date for tax report generation, show warnings for unsupported invoices - create invoice PDF for NL https://goedestartbelastingdienst.nl/wiki/view/50bdccd8-f9a0-4297-b57f-3a6651cbe05c/factuureisen - toggle on invoice form wether price is inclusive of tax. - retrieve available balance from AI api & show in settings/services. - Send invoice by email - create invoice from image of receipt - create invoice from UBL file - read invoice from Holodeck instance - send invoice via Holodeck instance - View invoice history for contacts - View invoice history for projects - 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" - ICP reports