From 2855642dd16cea260f3b32351f0529328a0bcb15 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Sat, 4 Oct 2025 15:54:30 +0200 Subject: namespacing locale, config, file_templates --- include/config.hpp | 21 +- include/file_templates.hpp | 516 +++++++++++++++++++++++---------------------- include/import_service.hpp | 57 ----- include/importer.hpp | 57 +++++ include/locales.hpp | 31 +-- 5 files changed, 349 insertions(+), 333 deletions(-) delete mode 100644 include/import_service.hpp create mode 100644 include/importer.hpp (limited to 'include') diff --git a/include/config.hpp b/include/config.hpp index 9598841..df99ab2 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -16,10 +16,8 @@ #pragma once -// major.minor.patch -#define PROGRAM_VERSION "0.1.0" - #include "stdint.h" +#include "imgui.h" #define s8 int8_t #define s16 int16_t @@ -31,7 +29,18 @@ #define u32 uint32_t #define u64 uint64_t -extern const char* country_codes[]; -extern s32 country_count; +namespace config { + static const char* PROGRAM_VERSION = "0.1.0"; // major.minor.patch + + static const char* country_codes[] = { + "AT", "BE", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", + "DE", "GR", "HU", "IE", "IT", "LV", "LT", "LU", "MT", "NL", + "PL", "PT", "RO", "SK", "SI", "ES", "SE" + }; + + static s32 country_count = sizeof(country_codes) / sizeof(country_codes[0]); -#define COLOR_ERROR_OUTLINE IM_COL32(255, 0, 0, 80) \ No newline at end of file + namespace colors { + static const ImU32 COLOR_ERROR_OUTLINE = IM_COL32(255, 0, 0, 80); + } +} \ No newline at end of file diff --git a/include/file_templates.hpp b/include/file_templates.hpp index c1420f9..506df67 100644 --- a/include/file_templates.hpp +++ b/include/file_templates.hpp @@ -14,274 +14,278 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -const char* project_save_template = -"\n" -" {{PROJECT_ID}}\n" -" {{PROJECT_DESCRIPTION}}\n" -" {{PROJECT_STATE}}\n" -" {{PROJECT_STARTDATE}}\n" -" {{PROJECT_ENDDATE}}\n" -""; +namespace file_template { -const char* costcenter_save_template = -"\n" -" {{COSTCENTER_ID}}\n" -" {{COSTCENTER_CODE}}\n" -" {{COSTCENTER_DESCRIPTION}}\n" -""; + static const char* project_save_template = + "\n" + " {{PROJECT_ID}}\n" + " {{PROJECT_DESCRIPTION}}\n" + " {{PROJECT_STATE}}\n" + " {{PROJECT_STARTDATE}}\n" + " {{PROJECT_ENDDATE}}\n" + ""; -const char* taxrate_save_template = -"\n" -" {{TAXBRACKET_ID}}\n" -" {{TAXBRACKET_COUNTRY}}\n" -" {{TAXBRACKET_RATE}}\n" -" {{TAXBRACKET_CATEGORY}}\n" -""; + static const char* costcenter_save_template = + "\n" + " {{COSTCENTER_ID}}\n" + " {{COSTCENTER_CODE}}\n" + " {{COSTCENTER_DESCRIPTION}}\n" + ""; -const char* contact_save_template = -"\n" -" {{CONTACT_ID}}\n" -" {{CONTACT_NAME}}\n" -" {{CONTACT_TYPE}}\n" -" {{CONTACT_TAXID}}\n" -" {{CONTACT_BUSINESSID}}\n" -" {{CONTACT_EMAIL}}\n" -" {{CONTACT_PHONENUMBER}}\n" -" {{CONTACT_BANKACCOUNT}}\n" -"
\n" -" {{CONTACT_ADDRESS1}}\n" -" {{CONTACT_ADDRESS2}}\n" -" {{CONTACT_COUNTRY}}\n" -" {{CONTACT_CITY}}\n" -" {{CONTACT_POSTAL}}\n" -" {{CONTACT_REGION}}\n" -"
\n" -"
"; + static const char* taxrate_save_template = + "\n" + " {{TAXBRACKET_ID}}\n" + " {{TAXBRACKET_COUNTRY}}\n" + " {{TAXBRACKET_RATE}}\n" + " {{TAXBRACKET_CATEGORY}}\n" + ""; -const char* administration_save_template = -"\n" -" {{NEXT_ID}}\n" -" {{NEXT_SEQUENCE_NUMBER}}\n" -" {{PROGRAM_VERSION}}\n" -" \n" -" {{AI_SERVICE_PROVIDER}}\n" -" {{AI_SERVICE_PUBLIC_KEY}}\n" -" \n" -""; + static const char* contact_save_template = + "\n" + " {{CONTACT_ID}}\n" + " {{CONTACT_NAME}}\n" + " {{CONTACT_TYPE}}\n" + " {{CONTACT_TAXID}}\n" + " {{CONTACT_BUSINESSID}}\n" + " {{CONTACT_EMAIL}}\n" + " {{CONTACT_PHONENUMBER}}\n" + " {{CONTACT_BANKACCOUNT}}\n" + "
\n" + " {{CONTACT_ADDRESS1}}\n" + " {{CONTACT_ADDRESS2}}\n" + " {{CONTACT_COUNTRY}}\n" + " {{CONTACT_CITY}}\n" + " {{CONTACT_POSTAL}}\n" + " {{CONTACT_REGION}}\n" + "
\n" + "
"; -const char* peppol_invoice_tax_subtotal_template = -" \n" -" {{TAXABLE_AMOUNT}}\n" -" {{TAX_AMOUNT}}\n" -" \n" -" {{TAX_CATEGORY}}\n" -" {{TAX_PERCENT}}\n" -" \n" -" VAT\n" -" \n" -" \n" -" \n"; + static const char* administration_save_template = + "\n" + " {{NEXT_ID}}\n" + " {{NEXT_SEQUENCE_NUMBER}}\n" + " {{PROGRAM_VERSION}}\n" + " \n" + " {{AI_SERVICE_PROVIDER}}\n" + " {{AI_SERVICE_PUBLIC_KEY}}\n" + " \n" + ""; -const char* peppol_invoice_line_template = -" \n" -" {{LINE_ID}}\n" -" {{QUANTITY}}\n" -" {{LINE_AMOUNT}}\n" + static const char* peppol_invoice_tax_subtotal_template = + " \n" + " {{TAXABLE_AMOUNT}}\n" + " {{TAX_AMOUNT}}\n" + " \n" + " {{TAX_CATEGORY}}\n" + " {{TAX_PERCENT}}\n" + " \n" + " VAT\n" + " \n" + " \n" + " \n"; -" \n" -" false\n" -" Discount\n" -" {{DISCOUNT_TOTAL_PERCENTAGE}}\n" -" {{DISCOUNT_TOTAL}}\n" -" {{DISCOUNT_BASE_AMOUNT}}\n" -" \n" + static const char* peppol_invoice_line_template = + " \n" + " {{LINE_ID}}\n" + " {{QUANTITY}}\n" + " {{LINE_AMOUNT}}\n" -" \n" -" {{ITEM_NAME}}\n" + " \n" + " false\n" + " Discount\n" + " {{DISCOUNT_TOTAL_PERCENTAGE}}\n" + " {{DISCOUNT_TOTAL}}\n" + " {{DISCOUNT_BASE_AMOUNT}}\n" + " \n" -" \n" -" Internal Tax Rate ID\n" -" {{LINE_TAX_ID}}\n" -" \n" + " \n" + " {{ITEM_NAME}}\n" -" \n" -" {{LINE_TAX_CATEGORY}}\n" -" {{LINE_TAX_PERCENT}}\n" -" \n" -" VAT\n" -" \n" -" \n" -" \n" + " \n" + " Internal Tax Rate ID\n" + " {{LINE_TAX_ID}}\n" + " \n" -" \n" -" {{UNIT_PRICE}}\n" -" \n" -" \n"; + " \n" + " {{LINE_TAX_CATEGORY}}\n" + " {{LINE_TAX_PERCENT}}\n" + " \n" + " VAT\n" + " \n" + " \n" + " \n" -const char *peppol_invoice_template = -/*"\n"*/ -"\n" -"\n" -" urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0\n" -" urn:fdc:peppol.eu:2017:poacc:billing:01:1.0\n" -"\n" -" {{INVOICE_ID}}\n" -" {{ISSUE_DATE}}\n" -" {{DUE_DATE}}\n" -" 380\n" -" {{CURRENCY}}\n" -"\n" -" \n" -" {{INVOICE_STATUS}}\n" -" \n" -"\n" -" \n" -" {{INVOICE_DOCUMENT_COPY}}\n" -" {{INVOICE_DOCUMENT_ORIG}}\n" -" \n" -"\n" -" \n" -" {{INVOICE_SEQUENCE_ID}}\n" -" \n" -"\n" -" \n" -" {{PROJECT_ID}}\n" -" \n" -" {{COST_CENTER_ID}}\n" -"\n" -" \n" -" \n" -" {{SUPPLIER_ENDPOINT_ID}}\n" -" \n" -" {{SUPPLIER_BUSINESS_ID}}\n" -" \n" -" \n" -" {{SUPPLIER_NAME}}\n" -" \n" -" \n" -" {{SUPPLIER_STREET}}\n" -" {{SUPPLIER_STREET2}}\n" -" {{SUPPLIER_CITY}}\n" -" {{SUPPLIER_POSTAL}}\n" -" {{SUPPLIER_REGION}}\n" -" \n" -" {{SUPPLIER_COUNTRY}}\n" -" \n" -" \n" -" \n" -" {{SUPPLIER_VAT_ID}}\n" -" \n" -" VAT\n" -" \n" -" \n" -"\n" -" \n" -" {{SUPPLIER_LEGAL_NAME}}\n" -" \n" -"\n" -" \n" -" {{SUPPLIER_ID}}\n" -" {{SUPPLIER_PHONE_NUMBER}}\n" -" {{SUPPLIER_EMAIL}}\n" -" \n" -"\n" -" \n" -" \n" -"\n" -" \n" -" \n" -" {{CUSTOMER_ENDPOINT_ID}}\n" -" \n" -" {{CUSTOMER_BUSINESS_ID}}\n" -" \n" -" \n" -" {{CUSTOMER_NAME}}\n" -" \n" -" \n" -" {{CUSTOMER_STREET}}\n" -" {{CUSTOMER_STREET2}}\n" -" {{CUSTOMER_CITY}}\n" -" {{CUSTOMER_POSTAL}}\n" -" {{CUSTOMER_REGION}}\n" -" \n" -" {{CUSTOMER_COUNTRY}}\n" -" \n" -" \n" -" \n" -" {{CUSTOMER_VAT_ID}}\n" -" \n" -" VAT\n" -" \n" -" \n" -"\n" -" \n" -" {{CUSTOMER_LEGAL_NAME}}\n" -" \n" -"\n" -" \n" -" {{CUSTOMER_ID}}\n" -" {{CUSTOMER_PHONE_NUMBER}}\n" -" {{CUSTOMER_EMAIL}}\n" -" \n" -"\n" -" \n" -" \n" -"\n" -"\n" -" {{DELIVERY_DATE}}\n" -" \n" -" \n" -" {{DELIVERY_STREET}}\n" -" {{DELIVERY_STREET2}}\n" -" {{DELIVERY_CITY}}\n" -" {{DELIVERY_POSTAL}}\n" -" {{DELIVERY_REGION}}\n" -" \n" -" {{DELIVERY_COUNTRY}}\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" {{DELIVERY_NAME}}\n" -" \n" -" \n" -"\n" -"\n" -" \n" -" {{PAYMENT_TYPE}}\n" -" {{INVOICE_ID}}\n" + " \n" + " {{UNIT_PRICE}}\n" + " \n" + " \n"; -" \n" -" {{RECIPIENT_IBAN}}\n" -" {{RECIPIENT_NAME}}\n" -" \n" -" \n" -" {{RECIPIENT_BIC}}\n" -" \n" -" \n" -" \n" + static const char *peppol_invoice_template = + /*"\n"*/ + "\n" + "\n" + " urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0\n" + " urn:fdc:peppol.eu:2017:poacc:billing:01:1.0\n" + "\n" + " {{INVOICE_ID}}\n" + " {{ISSUE_DATE}}\n" + " {{DUE_DATE}}\n" + " 380\n" + " {{CURRENCY}}\n" + "\n" + " \n" + " {{INVOICE_STATUS}}\n" + " \n" + "\n" + " \n" + " {{INVOICE_DOCUMENT_COPY}}\n" + " {{INVOICE_DOCUMENT_ORIG}}\n" + " \n" + "\n" + " \n" + " {{INVOICE_SEQUENCE_ID}}\n" + " \n" + "\n" + " \n" + " {{PROJECT_ID}}\n" + " \n" + " {{COST_CENTER_ID}}\n" + "\n" + " \n" + " \n" + " {{SUPPLIER_ENDPOINT_ID}}\n" + " \n" + " {{SUPPLIER_BUSINESS_ID}}\n" + " \n" + " \n" + " {{SUPPLIER_NAME}}\n" + " \n" + " \n" + " {{SUPPLIER_STREET}}\n" + " {{SUPPLIER_STREET2}}\n" + " {{SUPPLIER_CITY}}\n" + " {{SUPPLIER_POSTAL}}\n" + " {{SUPPLIER_REGION}}\n" + " \n" + " {{SUPPLIER_COUNTRY}}\n" + " \n" + " \n" + " \n" + " {{SUPPLIER_VAT_ID}}\n" + " \n" + " VAT\n" + " \n" + " \n" + "\n" + " \n" + " {{SUPPLIER_LEGAL_NAME}}\n" + " \n" + "\n" + " \n" + " {{SUPPLIER_ID}}\n" + " {{SUPPLIER_PHONE_NUMBER}}\n" + " {{SUPPLIER_EMAIL}}\n" + " \n" + "\n" + " \n" + " \n" + "\n" + " \n" + " \n" + " {{CUSTOMER_ENDPOINT_ID}}\n" + " \n" + " {{CUSTOMER_BUSINESS_ID}}\n" + " \n" + " \n" + " {{CUSTOMER_NAME}}\n" + " \n" + " \n" + " {{CUSTOMER_STREET}}\n" + " {{CUSTOMER_STREET2}}\n" + " {{CUSTOMER_CITY}}\n" + " {{CUSTOMER_POSTAL}}\n" + " {{CUSTOMER_REGION}}\n" + " \n" + " {{CUSTOMER_COUNTRY}}\n" + " \n" + " \n" + " \n" + " {{CUSTOMER_VAT_ID}}\n" + " \n" + " VAT\n" + " \n" + " \n" + "\n" + " \n" + " {{CUSTOMER_LEGAL_NAME}}\n" + " \n" + "\n" + " \n" + " {{CUSTOMER_ID}}\n" + " {{CUSTOMER_PHONE_NUMBER}}\n" + " {{CUSTOMER_EMAIL}}\n" + " \n" + "\n" + " \n" + " \n" + "\n" + "\n" + " {{DELIVERY_DATE}}\n" + " \n" + " \n" + " {{DELIVERY_STREET}}\n" + " {{DELIVERY_STREET2}}\n" + " {{DELIVERY_CITY}}\n" + " {{DELIVERY_POSTAL}}\n" + " {{DELIVERY_REGION}}\n" + " \n" + " {{DELIVERY_COUNTRY}}\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " {{DELIVERY_NAME}}\n" + " \n" + " \n" + "\n" + "\n" + " \n" + " {{PAYMENT_TYPE}}\n" + " {{INVOICE_ID}}\n" -" \n" -" {{SENDER_IBAN}}\n" -" \n" + " \n" + " {{RECIPIENT_IBAN}}\n" + " {{RECIPIENT_NAME}}\n" + " \n" + " \n" + " {{RECIPIENT_BIC}}\n" + " \n" + " \n" + " \n" -" \n" -"\n" -" \n" -" {{TOTAL_TAX_AMOUNT}}\n" -" {{TAX_SUBTOTAL_LIST}}" -" \n" -"\n" -" \n" -" {{LINE_EXTENSION_AMOUNT}}\n" -" {{TAX_EXCLUSIVE_AMOUNT}}\n" -" {{TAX_INCLUSIVE_AMOUNT}}\n" -" {{PAYABLE_AMOUNT}}\n" -" \n" -"\n" -" {{INVOICE_LINE_LIST}}" -"\n" -""; + " \n" + " {{SENDER_IBAN}}\n" + " \n" + + " \n" + "\n" + " \n" + " {{TOTAL_TAX_AMOUNT}}\n" + " {{TAX_SUBTOTAL_LIST}}" + " \n" + "\n" + " \n" + " {{LINE_EXTENSION_AMOUNT}}\n" + " {{TAX_EXCLUSIVE_AMOUNT}}\n" + " {{TAX_INCLUSIVE_AMOUNT}}\n" + " {{PAYABLE_AMOUNT}}\n" + " \n" + "\n" + " {{INVOICE_LINE_LIST}}" + "\n" + ""; + +} \ No newline at end of file diff --git a/include/import_service.hpp b/include/import_service.hpp deleted file mode 100644 index 7e23e20..0000000 --- a/include/import_service.hpp +++ /dev/null @@ -1,57 +0,0 @@ -/* -* Copyright (c) 2025 Aldrik Ramaekers -* -* Permission to use, copy, modify, and/or distribute this software for any -* purpose with or without fee is hereby granted, provided that the above -* copyright notice and this permission notice appear in all copies. -* -* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#pragma once - -#include "administration.hpp" - -typedef uint32_t i_err; - -#define I_ERR_SUCCESS 0 -#define I_ERR_FAILED_UPLOAD 1 -#define I_ERR_FAILED_QUERY 2 -#define I_ERR_FAILED_IMPORT 3 - -typedef enum -{ - IMPORT_STARTING, - IMPORT_UPLOADING_FILE, - IMPORT_QUERYING, - IMPORT_WAITING_FOR_RESPONSE, - IMPORT_DONE, -} import_status; - -typedef struct -{ - time_t started_at; - invoice result; - char file_path[MAX_LEN_PATH]; - i_err error; - import_status status; -} import_invoice_request; - -typedef struct -{ - bool (*upload_file)(char* file_path, char* file_id, size_t file_id_len); - bool (*query_with_file)(char* query, size_t query_length, char* file_id, char** response); -} ai_provider_impl; - -extern ai_provider_impl _chatgpt_api_provider; -extern ai_provider_impl _deepseek_api_provider; - -const char* import_error_to_str(i_err error); -const char* import_status_to_str(import_status status); -import_invoice_request* ai_document_to_invoice(char* file_path); \ No newline at end of file diff --git a/include/importer.hpp b/include/importer.hpp new file mode 100644 index 0000000..7e23e20 --- /dev/null +++ b/include/importer.hpp @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2025 Aldrik Ramaekers +* +* Permission to use, copy, modify, and/or distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#pragma once + +#include "administration.hpp" + +typedef uint32_t i_err; + +#define I_ERR_SUCCESS 0 +#define I_ERR_FAILED_UPLOAD 1 +#define I_ERR_FAILED_QUERY 2 +#define I_ERR_FAILED_IMPORT 3 + +typedef enum +{ + IMPORT_STARTING, + IMPORT_UPLOADING_FILE, + IMPORT_QUERYING, + IMPORT_WAITING_FOR_RESPONSE, + IMPORT_DONE, +} import_status; + +typedef struct +{ + time_t started_at; + invoice result; + char file_path[MAX_LEN_PATH]; + i_err error; + import_status status; +} import_invoice_request; + +typedef struct +{ + bool (*upload_file)(char* file_path, char* file_id, size_t file_id_len); + bool (*query_with_file)(char* query, size_t query_length, char* file_id, char** response); +} ai_provider_impl; + +extern ai_provider_impl _chatgpt_api_provider; +extern ai_provider_impl _deepseek_api_provider; + +const char* import_error_to_str(i_err error); +const char* import_status_to_str(import_status status); +import_invoice_request* ai_document_to_invoice(char* file_path); \ No newline at end of file diff --git a/include/locales.hpp b/include/locales.hpp index d361f1e..ec6cc74 100644 --- a/include/locales.hpp +++ b/include/locales.hpp @@ -16,20 +16,23 @@ #pragma once -typedef struct { - const char* key; - const char* value; -} locale_entry; +namespace locale { -typedef struct { - const char* lang_code; - locale_entry* entries; - int entry_count; -} locale_map; + typedef struct { + const char* key; + const char* value; + } locale_entry; -extern locale_entry en_locales[]; -extern const int en_locale_count; + typedef struct { + const char* lang_code; + locale_entry* entries; + int entry_count; + } locale_map; -const char* get_locale(); -void set_locale(const char key[2]); -const char* localize(const char* key); \ No newline at end of file + extern locale_entry en_locales[]; + extern const int en_locale_count; + + const char* get_locale(); + void set_locale(const char key[2]); + const char* get(const char* key); +} \ No newline at end of file -- cgit v1.2.3-70-g09d2