summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-11-08 14:13:43 +0100
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-11-08 14:13:43 +0100
commit6abbea56a6bfa69cb5e576223301f0c992b646fa (patch)
tree97dabe37ef08202303c9a7a5187de77ac4b286e9 /src/administration.cpp
parent887d5f9f8d1309134c72b1f35afc7d007a5c64aa (diff)
activity sidebar for invoices.HEADmaster
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp73
1 files changed, 68 insertions, 5 deletions
diff --git a/src/administration.cpp b/src/administration.cpp
index cb158e2..d7e4eed 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -129,6 +129,7 @@ void administration_create()
list_init(&g_administration.contacts);
list_init(&g_administration.projects);
list_init(&g_administration.tax_rates);
+ list_init(&g_administration.activities);
list_init(&g_administration.all_tax_rates);
list_init(&g_administration.cost_centers);
strops::copy(g_administration.path, "", sizeof(g_administration.path));
@@ -176,6 +177,18 @@ static void administration_destroy_invoices()
list_iterator_stop(&g_administration.invoices);
}
+int sort_invoice_time_t(const void *a, const void *b) {
+ invoice* inv1 = (invoice*)a;
+ invoice* inv2 = (invoice*)b;
+ return (int)(inv1->issued_at - inv2->issued_at);
+}
+
+void administration::sort_data()
+{
+ list_attributes_comparator(&g_administration.invoices, sort_invoice_time_t);
+ list_sort(&g_administration.invoices, 1);
+}
+
void administration::destroy()
{
is_initialized = false;
@@ -183,6 +196,7 @@ void administration::destroy()
administration_destroy_list(&g_administration.invoices);
administration_destroy_list(&g_administration.contacts);
administration_destroy_list(&g_administration.projects);
+ administration_destroy_list(&g_administration.activities);
administration_destroy_list(&g_administration.tax_rates);
administration_destroy_list(&g_administration.all_tax_rates);
administration_destroy_list(&g_administration.cost_centers);
@@ -353,8 +367,8 @@ void administration::create_tax_statement(tax_statement* statement)
time_t youngest = 0;
for (u32 i = 0; i < invoice_count; i++)
{
- if (invoice_buffer[i].delivered_at < oldest) oldest = invoice_buffer[i].delivered_at;
- if (invoice_buffer[i].delivered_at > youngest) youngest = invoice_buffer[i].delivered_at;
+ if (invoice_buffer[i].delivered_at < oldest) oldest = country::get_invoice_date_to_use_for_tax_report(country_code, &invoice_buffer[i]);
+ if (invoice_buffer[i].delivered_at > youngest) youngest = country::get_invoice_date_to_use_for_tax_report(country_code, &invoice_buffer[i]);
}
u16 oldest_year;
@@ -527,7 +541,7 @@ void administration::create_income_statement(income_statement* statement)
u16 yy;
u8 qq;
- time_t_to_quarter(inv->issued_at, &yy, &qq);
+ time_t_to_quarter(inv->delivered_at, &yy, &qq);
u32 report_index = (qq + (yy*4)) - (oldest_quarter + (oldest_year*4));
@@ -1494,6 +1508,7 @@ a_err administration::invoice_update(invoice* inv)
if (invoice_changed_event_callback) invoice_changed_event_callback(c);
+ administration::activity_add(ACTIVITY_USER, c->id, "activity.update_invoice", 0);
return A_ERR_SUCCESS;
}
}
@@ -1547,9 +1562,11 @@ a_err administration::invoice_add(invoice* inv)
memops::copy(new_inv, &copy, sizeof(invoice));
- if (!list_append(&g_administration.invoices, new_inv)) {
+ if (!list_prepend(&g_administration.invoices, new_inv)) {
return A_ERR_GENERIC;
- }
+ }
+
+ administration::activity_add(ACTIVITY_USER, inv->id, "activity.add_invoice", 0);
g_administration.next_id++;
g_administration.next_sequence_number++;
@@ -1900,4 +1917,50 @@ billing_item administration::billing_item_create_empty()
memops::zero(&item, sizeof(billing_item));
item.amount = 1;
return item;
+}
+
+// Activity functions.
+// ===================
+a_err administration::activity_add(char* user, char* ref_id, char* message, ...)
+{
+ activity* new_activity = (activity*)memops::alloc(sizeof(activity));
+ strops::copy(new_activity->user_name, user, MAX_LEN_SHORT_DESC);
+ strops::copy(new_activity->ref_id, ref_id, MAX_LEN_ID);
+ strops::copy(new_activity->message, message, MAX_LEN_LONG_DESC);
+ new_activity->timestamp = time(NULL);
+
+ va_list args;
+ va_start(args, message);
+
+ char* param;
+ u32 param_count = 0;
+ do
+ {
+ param = va_arg(args, char*);
+ if (param != 0) {
+ strops::copy(new_activity->params[param_count++], param, MAX_LEN_LONG_DESC);
+ }
+ } while (param && param_count < ACTIVITY_MAX_PARAMS);
+
+ va_end(args);
+
+ if (!list_prepend(&g_administration.activities, new_activity)) {
+ return A_ERR_GENERIC;
+ }
+
+ return A_ERR_SUCCESS;
+}
+
+u32 administration::activity_get_all_for_object(activity* buffer, char* ref_id)
+{
+ u32 write_cursor = 0;
+
+ list_iterator_start(&g_administration.activities);
+ while (list_iterator_hasnext(&g_administration.activities)) {
+ activity c = *(activity *)list_iterator_next(&g_administration.activities);
+ if (strops::equals(c.ref_id, ref_id)) buffer[write_cursor++] = c;
+ }
+ list_iterator_stop(&g_administration.activities);
+
+ return write_cursor;
} \ No newline at end of file