TODO: - for invoice importing using AI: all address data should be editable because import is not perfect - for invoice importing using AI: file path should not be editable as it is imported - 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. - let user choose the model to use in settings/services/ai - real error logging for OpenAI and importing in general - write tests for strops.hpp - log_set_depth function so data can be grouped - log elapsed time for ai requests - refactor _add functions to use _import functions - write tests that check error handling for corrupt files. (e.g. references to tax rates, project and cost center that failed to load) - it is possible a referenced tax rate is loaded after an invoice is loaded. This means all invoices need to be recalculated after file load. (try to write a test for this). - invoice sequential number should be modifyable & checked for uniqueness (for external invoices being imported) - allow cost centers to be deleted that have 0 references - 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