diff options
Diffstat (limited to 'src/administration.cpp')
| -rw-r--r-- | src/administration.cpp | 73 |
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, ©, 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 |
