diff options
| -rw-r--r-- | TODO | 5 | ||||
| -rw-r--r-- | include/administration.hpp | 3 | ||||
| -rw-r--r-- | src/administration.cpp | 7 | ||||
| -rw-r--r-- | src/administration_reader.cpp | 2 | ||||
| -rw-r--r-- | src/administration_writer.cpp | 2 | ||||
| -rw-r--r-- | src/providers/openAI.cpp | 8 | ||||
| -rw-r--r-- | src/ui/imgui_extensions.cpp | 2 | ||||
| -rw-r--r-- | src/ui/ui_expenses.cpp | 11 | ||||
| -rw-r--r-- | src/ui/ui_invoices.cpp | 11 | ||||
| -rw-r--r-- | src/ui/ui_projects.cpp | 2 | ||||
| -rw-r--r-- | src/ui/ui_settings.cpp | 4 | ||||
| -rw-r--r-- | tests/administration_rw_tests.cpp | 2 |
12 files changed, 31 insertions, 28 deletions
@@ -6,18 +6,21 @@ Fix: - 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) +- crash on back button when leaving ai import view after failure +- datepicker ui is a little off 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 +- Email provider needs a sender email 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 +- write tests for activity r/w Features: - Button to mark expense as paid diff --git a/include/administration.hpp b/include/administration.hpp index be3f6c0..9cc27d1 100644 --- a/include/administration.hpp +++ b/include/administration.hpp @@ -407,7 +407,7 @@ typedef struct { ai_provider provider; char model_name[MAX_LEN_SHORT_DESC]; - char api_key_public[MAX_LEN_API_KEY]; // @TODO rename to api_key + char api_key[MAX_LEN_API_KEY]; } ai_service; typedef enum @@ -524,7 +524,6 @@ namespace administration { s32 get_next_sequence_number(); const char* get_currency_symbol_for_currency(const char* code); const char* get_default_currency(); - time_t get_default_invoice_expire_duration(); ai_service get_active_ai_service(); ai_service get_ai_service(ai_provider provider); email_service get_email_service(); diff --git a/src/administration.cpp b/src/administration.cpp index 41ad2fc..bb84797 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -39,11 +39,6 @@ static s32 create_id() return g_administration.next_id; } -time_t administration::get_default_invoice_expire_duration() // TODO depricated -{ - return (30 * 24 * 60 * 60); // 30 days -} - static void administration_recalculate_billing_item_totals(billing_item* item); static const char* get_default_currency_for_country(const char* country_code); @@ -1412,7 +1407,7 @@ invoice administration::invoice_create_empty() result.extras.status = invoice_status::INVOICE_CONCEPT; result.delivered_at = result.issued_at; - result.expires_at = result.issued_at + administration::get_default_invoice_expire_duration(); + result.expires_at = result.issued_at + country::get_default_invoice_expire_duration(g_administration.company_info.addr.country_code); list_init(&result.billing_items); strops::copy(result.currency, get_default_currency_for_country(g_administration.company_info.addr.country_code), MAX_LEN_CURRENCY); return result; diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp index 268e984..a87594e 100644 --- a/src/administration_reader.cpp +++ b/src/administration_reader.cpp @@ -479,7 +479,7 @@ bool administration_reader::import_administration_info(char* buffer, size_t buff { ai_service service; service.provider = (ai_provider)xml_get_s32_x(child, "Provider", 0); - xml_get_str_x(child, service.api_key_public, MAX_LEN_API_KEY, "PublicKey", 0); + xml_get_str_x(child, service.api_key, MAX_LEN_API_KEY, "PublicKey", 0); xml_get_str_x(child, service.model_name, MAX_LEN_SHORT_DESC, "Model", 0); administration::import_ai_service(service); diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp index ad6f200..1d08e30 100644 --- a/src/administration_writer.cpp +++ b/src/administration_writer.cpp @@ -937,7 +937,7 @@ bool administration_writer::save_administration_info_blocking() ai_service service = administration::get_ai_service((ai_provider)i); strops::replace_int32(file_content, buf_length, "{{AI_SERVICE_PROVIDER}}", i); - strops::replace(file_content, buf_length, "{{AI_SERVICE_KEY}}", service.api_key_public); + strops::replace(file_content, buf_length, "{{AI_SERVICE_KEY}}", service.api_key); strops::replace(file_content, buf_length, "{{AI_SERVICE_MODEL}}", service.model_name); u32 content_len = (u32)strops::length(file_content); diff --git a/src/providers/openAI.cpp b/src/providers/openAI.cpp index 5659465..04981d1 100644 --- a/src/providers/openAI.cpp +++ b/src/providers/openAI.cpp @@ -26,7 +26,7 @@ static bool _openAI_batch_query_with_file(const char** queries, size_t query_count, const char* file_id, invoice* buffer, importer::batch_query_response_handler response_handler) { - const char *api_key = administration::get_active_ai_service().api_key_public; + const char *api_key = administration::get_active_ai_service().api_key; httplib::SSLClient cli("api.openai.com", 443); thrd_t threads[20]; @@ -96,7 +96,7 @@ static bool _openAI_batch_query_with_file(const char** queries, size_t query_cou static bool _openAI_query_with_file(const char* query, size_t query_length, const char* file_id, char** response) { - const char *api_key = administration::get_active_ai_service().api_key_public; + const char *api_key = administration::get_active_ai_service().api_key; httplib::SSLClient cli("api.openai.com", 443); //cli.enable_server_certificate_verification(false); @@ -135,7 +135,7 @@ static bool _openAI_query_with_file(const char* query, size_t query_length, cons static bool _openAI_upload_file(const char* file_path, char* file_id, size_t file_id_len) { - const char *api_key = administration::get_active_ai_service().api_key_public; + const char *api_key = administration::get_active_ai_service().api_key; const char *filename = strops::get_filename(file_path); FILE* orig_file = fopen(file_path, "rb"); @@ -237,7 +237,7 @@ static bool _openAI_upload_file(const char* file_path, char* file_id, size_t fil static bool _openAI_get_available_models(importer::model_list_request* buffer) { - const char *api_key = administration::get_active_ai_service().api_key_public; + const char *api_key = administration::get_active_ai_service().api_key; httplib::SSLClient cli("api.openai.com", 443); diff --git a/src/ui/imgui_extensions.cpp b/src/ui/imgui_extensions.cpp index 9ce5bf9..911906d 100644 --- a/src/ui/imgui_extensions.cpp +++ b/src/ui/imgui_extensions.cpp @@ -747,7 +747,7 @@ namespace ImGui ImGui::SameLine(); ImVec2 cursor_pos = ImGui::GetCursorScreenPos(); - ImVec2 center = ImVec2(cursor_pos.x + radius, cursor_pos.y + radius + 4); + ImVec2 center = ImVec2(cursor_pos.x + radius, cursor_pos.y + radius + 1); ImGui::PushID((int)center.y); ImDrawList* draw_list = ImGui::GetWindowDrawList(); diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp index 64dbc18..7ac977b 100644 --- a/src/ui/ui_expenses.cpp +++ b/src/ui/ui_expenses.cpp @@ -302,10 +302,13 @@ static void _invoice_saved_callback() static void _draw_activity_sidepanel() { ImGui::SameLine(); - ImGui::SeparatorEx(1 << 1, 1.0f); - ImGui::SameLine(); - ImGui::BeginChild("##historyPanel", ImVec2(sidepanel_width, 0), ImGuiChildFlags_None); + ImVec2 area = ImGui::GetContentRegionAvail(); + + ImGui::SetNextWindowPos(ImVec2(ImGui::GetCursorScreenPos().x, ImGui::GetCursorScreenPos().y)); + ImGui::SetNextWindowSize(ImVec2(sidepanel_width, area.y)); + + ImGui::Begin("##historyPanel", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse); { for (u32 i = 0; i < activity_count; i++) { @@ -328,7 +331,7 @@ static void _draw_activity_sidepanel() } } - ImGui::EndChild(); + ImGui::End(); } static void draw_expense_update() diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index 70db412..1c14d77 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -397,10 +397,13 @@ static void _reset_to_default_view() static void _draw_activity_sidepanel() { ImGui::SameLine(); - ImGui::SeparatorEx(1 << 1, 1.0f); - ImGui::SameLine(); - ImGui::BeginChild("##historyPanel", ImVec2(sidepanel_width, 0), ImGuiChildFlags_None); + ImVec2 area = ImGui::GetContentRegionAvail(); + + ImGui::SetNextWindowPos(ImVec2(ImGui::GetCursorScreenPos().x, ImGui::GetCursorScreenPos().y)); + ImGui::SetNextWindowSize(ImVec2(sidepanel_width, area.y)); + + ImGui::Begin("##historyPanel", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse); { for (u32 i = 0; i < activity_count; i++) { @@ -423,7 +426,7 @@ static void _draw_activity_sidepanel() } } - ImGui::EndChild(); + ImGui::End(); } static void draw_invoice_update() diff --git a/src/ui/ui_projects.cpp b/src/ui/ui_projects.cpp index 55125de..441df46 100644 --- a/src/ui/ui_projects.cpp +++ b/src/ui/ui_projects.cpp @@ -198,7 +198,7 @@ static void draw_project_list() if (administration::project_is_valid(c) != A_ERR_SUCCESS) { if (ImGui::WarningIcon(8.0f)) { - ImGui::SetTooltip(locale::get("ui.tooltip.invalidInvoice")); + ImGui::SetTooltip(locale::get("ui.tooltip.invalidProject")); } } diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index 4644001..1be032b 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -286,7 +286,7 @@ static void draw_ai_service_ui() ai_service service = administration::get_ai_service((ai_provider)n); new_ai_service.provider = (ai_provider)n; strops::copy(new_ai_service.model_name, service.model_name, MAX_LEN_SHORT_DESC); - strops::copy(new_ai_service.api_key_public, service.api_key_public, MAX_LEN_API_KEY); + strops::copy(new_ai_service.api_key, service.api_key, MAX_LEN_API_KEY); model_request = 0; set_model_on_load = strops::length(new_ai_service.model_name) == 0; @@ -312,7 +312,7 @@ static void draw_ai_service_ui() } ImGui::InputTextWithHint(locale::get("settings.services.ai_service.apikey"), locale::get("settings.services.ai_service.apikey"), - new_ai_service.api_key_public, sizeof(new_ai_service.api_key_public)); + new_ai_service.api_key, sizeof(new_ai_service.api_key)); if (!model_request) { model_request = importer::ai_get_available_models(new_ai_service.provider); diff --git a/tests/administration_rw_tests.cpp b/tests/administration_rw_tests.cpp index b610948..427c29b 100644 --- a/tests/administration_rw_tests.cpp +++ b/tests/administration_rw_tests.cpp @@ -146,7 +146,7 @@ TEST _administration_rw_info(void) ai_service ss; ss.provider = AI_PROVIDER_OPENAI; - strops::copy(ss.api_key_public, "123", sizeof(ss.api_key_public)); + strops::copy(ss.api_key, "123", sizeof(ss.api_key)); strops::copy(ss.model_name, "321", sizeof(ss.model_name)); administration::set_active_ai_service(ss); |
