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 - handle invalid file format crash. check if xml object is found before using it. - invoice total is wrong when invoice is not using main currency (final is correct but currency tag is wrong) Refactor: - Refactor zip writing to be faster (Windows is slow) - fix all warnings from Wall - load ttfs from memory, embed ttfs in binary - remove hardcoded buffer sizes from api provider implementations - remove hardcoded buffer sizes from administration_writer.cpp 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) - write tests for document saving Features: - Button to mark expense as paid - Button to mark invoice as paid - status window for ongoing requests, used can click on item when result is ready. Should be usefull for batch imports. - implement gemini and perplexity api backends - Refactor contact and project UI to be like invoice & expenses - 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