summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@mailbox.org>2026-01-04 15:46:20 +0100
committerAldrik Ramaekers <aldrik@mailbox.org>2026-01-04 15:46:20 +0100
commit9b87e0d3123bbc533c2e4d452b16fe82de0e5cd4 (patch)
treeb154f83c4d8b0bb777ca1eca8d902bd6a4b0455a /src
parent9a3cfd077013e42d4b3f788b78f45edf3b46ef07 (diff)
activity list import
Diffstat (limited to 'src')
-rw-r--r--src/administration.cpp12
-rw-r--r--src/administration_reader.cpp47
-rw-r--r--src/administration_writer.cpp2
3 files changed, 59 insertions, 2 deletions
diff --git a/src/administration.cpp b/src/administration.cpp
index 0b1a0db..182dabd 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -1933,6 +1933,18 @@ billing_item administration::billing_item_create_empty()
// Activity functions.
// ===================
+a_err administration::activity_import(activity ac)
+{
+ activity* new_activity = (activity*)memops::alloc(sizeof(activity));
+ memops::copy(new_activity, &ac, sizeof(activity));
+
+ if (!list_append(&g_administration.activities, new_activity)) {
+ return A_ERR_GENERIC;
+ }
+
+ return A_ERR_SUCCESS;
+}
+
a_err administration::activity_add(char* user, char* ref_id, char* message)
{
activity* new_activity = (activity*)memops::alloc(sizeof(activity));
diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp
index 6c7234d..2c94028 100644
--- a/src/administration_reader.cpp
+++ b/src/administration_reader.cpp
@@ -74,6 +74,10 @@ bool administration_reader::open_existing(char* file_path)
{
administration_reader::import_administration_info(buffer, (size_t)size);
}
+ else if (strops::equals(name, ACTIVITY_FILE))
+ {
+ administration_reader::import_activities(buffer, (size_t)size);
+ }
else if (strops::is_prefixed("T/", name))
{
administration_reader::import_tax_rate(buffer, (size_t)size);
@@ -271,7 +275,7 @@ bool administration_reader::import_invoice(zip_t* zip, char* buffer, size_t buff
invoice data;
if (!administration_reader::read_invoice_from_xml(&data, buffer, buffer_size)) return false;
if (!_import_invoice_extras(zip, &data)) return false;
- printf("%d\n", data.extras.status);
+
a_err result = administration::invoice_import(&data);
if (result == A_ERR_SUCCESS) {
@@ -470,4 +474,45 @@ bool administration_reader::import_administration_info(char* buffer, size_t buff
xml_document_free(document, false);
return true;
+}
+
+bool administration_reader::import_activities(char* buffer, size_t buffer_size)
+{
+ STOPWATCH_START;
+
+ xml_document* document = xml_parse_document((uint8_t *)buffer, buffer_size);
+ if (!document) return false;
+
+ struct xml_node* root = xml_document_root(document);
+ if (!root) {
+ xml_document_free(document, false);
+ return false;
+ }
+
+ size_t child_count = xml_node_children(root);
+ for (size_t x = 0; x < child_count; x++)
+ {
+ xml_node* child = xml_node_child(root, x);
+
+ char* child_name = (char*)xml_easy_name(child);
+ if (strops::equals(child_name, "Activity"))
+ {
+ activity ac = {0};
+ time_t timestamp;
+
+ ac.timestamp = xml_get_s64(child, "Timestamp");
+ xml_get_str(child, ac.user_name, MAX_LEN_SHORT_DESC, "User");
+ xml_get_str(child, ac.ref_id, MAX_LEN_ID, "RefId");
+ xml_get_str(child, ac.message, MAX_LEN_LONG_DESC, "Message");
+
+ administration::activity_import(ac);
+ }
+
+ memops::unalloc(child_name);
+ }
+
+ logger::info("Loaded %d activities in %.3fms.", child_count, STOPWATCH_TIME);
+
+ xml_document_free(document, false);
+ return true;
} \ No newline at end of file
diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp
index 8cd1dcf..da9ee77 100644
--- a/src/administration_writer.cpp
+++ b/src/administration_writer.cpp
@@ -967,7 +967,7 @@ bool administration_writer::save_activities_blocking()
int buf_length = 0;
char* file_content = copy_template(file_template::activity_template, &buf_length);
- strops::replace_int32(file_content, buf_length, "{{TIMESTAMP}}", ac.timestamp);
+ strops::replace_int64(file_content, buf_length, "{{TIMESTAMP}}", ac.timestamp);
strops::replace(file_content, buf_length, "{{USERNAME}}", ac.user_name);
strops::replace(file_content, buf_length, "{{REF_ID}}", ac.ref_id);
strops::replace(file_content, buf_length, "{{MESSAGE}}", ac.message);