diff options
Diffstat (limited to 'src/administration.cpp')
| -rw-r--r-- | src/administration.cpp | 274 |
1 files changed, 154 insertions, 120 deletions
diff --git a/src/administration.cpp b/src/administration.cpp index 41dbf90..0233213 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -535,7 +535,7 @@ s32 administration_get_next_sequence_number() bool administration_can_create_invoices() { - return administration_contact_is_valid(g_administration.company_info); + return administration_contact_is_valid(g_administration.company_info) == A_ERR_SUCCESS; } char* administration_get_default_currency() @@ -837,35 +837,47 @@ void administration_company_info_set(contact data) // Contact functions. // ======================= -bool administration_contact_import(contact data) +a_err administration_contact_import(contact data) { + a_err result = administration_contact_is_valid(data); + if (result != A_ERR_SUCCESS) return result; + if (strcmp(data.id, MY_COMPANY_ID) == 0) { administration_company_info_import(data); - return true; + return A_ERR_SUCCESS; } contact* new_contact = (contact*)malloc(sizeof(contact)); + if (!new_contact) return A_ERR_GENERIC; + memcpy((void*)new_contact, (void*)&data, sizeof(contact)); - list_append(&g_administration.contacts, new_contact); + if (!list_append(&g_administration.contacts, new_contact)) { + return A_ERR_GENERIC; + } - return true; + return A_ERR_SUCCESS; } -bool administration_contact_add(contact data) +a_err administration_contact_add(contact data) { - if (!administration_contact_is_valid(data)) return false; + a_err result = administration_contact_is_valid(data); + if (result != A_ERR_SUCCESS) return result; contact* new_contact = (contact*)malloc(sizeof(contact)); + if (!new_contact) return A_ERR_GENERIC; + memcpy((void*)new_contact, (void*)&data, sizeof(contact)); - list_append(&g_administration.contacts, new_contact); + if (!list_append(&g_administration.contacts, new_contact)) { + return A_ERR_GENERIC; + } g_administration.next_id++; if (contact_changed_event_callback) contact_changed_event_callback(new_contact); if (data_changed_event_callback) data_changed_event_callback(); - return true; + return A_ERR_SUCCESS; } bool administration_contact_can_be_deleted(contact data) @@ -875,9 +887,10 @@ bool administration_contact_can_be_deleted(contact data) return true; } -bool administration_contact_update(contact data) +a_err administration_contact_update(contact data) { - if (!administration_contact_is_valid(data)) return false; + a_err result = administration_contact_is_valid(data); + if (result != A_ERR_SUCCESS) return result; list_iterator_start(&g_administration.contacts); while (list_iterator_hasnext(&g_administration.contacts)) { @@ -890,33 +903,33 @@ bool administration_contact_update(contact data) if (data_changed_event_callback) data_changed_event_callback(); list_iterator_stop(&g_administration.contacts); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.contacts); - return false; + return A_ERR_NOT_FOUND; } -bool administration_contact_remove(contact data) +a_err administration_contact_remove(contact data) { list_iterator_start(&g_administration.contacts); while (list_iterator_hasnext(&g_administration.contacts)) { contact* c = (contact *)list_iterator_next(&g_administration.contacts); if (strcmp(c->id, data.id) == 0) { - list_iterator_stop(&g_administration.contacts); - list_delete(&g_administration.contacts, c); + list_iterator_stop(&g_administration.contacts); + if (list_delete(&g_administration.contacts, c) != 0) return A_ERR_GENERIC; if (data_deleted_event_callback) data_deleted_event_callback(c->id); free(c); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.contacts); - return false; + return A_ERR_NOT_FOUND; } u32 administration_contact_count() @@ -960,17 +973,17 @@ u32 administration_contact_get_partial_list(u32 page_index, u32 page_size, conta return write_cursor; } -bool administration_contact_get_by_id(contact* buffer, char* id) +a_err administration_contact_get_by_id(contact* buffer, char* id) { // Include company info in contact lookup because this might be // used in forms. if (strcmp(id, g_administration.company_info.id) == 0) { *buffer = g_administration.company_info; - return true; + return A_ERR_SUCCESS; } - bool result = false; + a_err result = A_ERR_NOT_FOUND; list_iterator_start(&g_administration.contacts); while (list_iterator_hasnext(&g_administration.contacts)) { contact c = *(contact *)list_iterator_next(&g_administration.contacts); @@ -978,7 +991,7 @@ bool administration_contact_get_by_id(contact* buffer, char* id) if (strcmp(c.id, id) == 0) { list_iterator_stop(&g_administration.projects); *buffer = c; - result = true; + result = A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.contacts); @@ -1005,22 +1018,23 @@ int administration_contact_get_autocompletions(contact* buffer, int buf_size, ch return write_cursor; } -bool administration_contact_is_valid(contact data) +a_err administration_contact_is_valid(contact data) { - if (strlen(data.name) == 0) return 0; - if (strlen(data.address.city) == 0) return 0; - if (strlen(data.address.postal) == 0) return 0; - if (strlen(data.address.address1) == 0) return 0; + a_err result = A_ERR_SUCCESS; + if (strlen(data.name) == 0) result |= A_ERR_MISSING_NAME; + if (strlen(data.address.city) == 0) result |= A_ERR_MISSING_CITY; + if (strlen(data.address.postal) == 0) result |= A_ERR_MISSING_POSTAL; + if (strlen(data.address.address1) == 0) result |= A_ERR_MISSING_ADDRESS1; //if (strlen(data.address.address2) == 0) return 0; - if (strlen(data.address.country_code) == 0) return 0; + if (strlen(data.address.country_code) == 0) result |= A_ERR_MISSING_COUNTRYCODE; if (data.type == contact_type::CONTACT_BUSINESS) { - if (strlen(data.taxid) == 0) return 0; - if (strlen(data.businessid) == 0) return 0; + if (strlen(data.taxid) == 0) result |= A_ERR_MISSING_TAXID; + if (strlen(data.businessid) == 0) result |= A_ERR_MISSING_BUSINESSID; } - return true; + return result; } contact administration_contact_create_empty() @@ -1054,12 +1068,12 @@ a_err administration_project_get_by_id(project* buffer, char* id) { *buffer = c; list_iterator_stop(&g_administration.projects); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.projects); - return a_err::A_ERR_NOT_FOUND; + return A_ERR_NOT_FOUND; } u32 administration_project_get_all(project* buffer) @@ -1107,8 +1121,8 @@ void administration_project_cancel(project data) a_err administration_project_is_valid(project data) { - if (strlen(data.description) == 0) return a_err::A_ERR_MISSING_DESCRIPTION; - return a_err::A_ERR_SUCCESS; + if (strlen(data.description) == 0) return A_ERR_MISSING_DESCRIPTION; + return A_ERR_SUCCESS; } char* administration_project_get_status_string(project data) @@ -1126,31 +1140,31 @@ char* administration_project_get_status_string(project data) a_err administration_project_import(project data) { a_err result = administration_project_is_valid(data); - if (result != a_err::A_ERR_SUCCESS) return result; + if (result != A_ERR_SUCCESS) return result; project* new_project = (project*)malloc(sizeof(project)); - if (!new_project) return a_err::A_ERR_GENERIC; + if (!new_project) return A_ERR_GENERIC; memcpy((void*)new_project, (void*)&data, sizeof(project)); if (!list_append(&g_administration.projects, new_project)) { - return a_err::A_ERR_GENERIC; + return A_ERR_GENERIC; } - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } a_err administration_project_add(project data) { a_err result = administration_project_is_valid(data); - if (result != a_err::A_ERR_SUCCESS) return result; + if (result != A_ERR_SUCCESS) return result; project* new_project = (project*)malloc(sizeof(project)); - if (!new_project) return a_err::A_ERR_GENERIC; + if (!new_project) return A_ERR_GENERIC; memcpy((void*)new_project, (void*)&data, sizeof(project)); if (!list_append(&g_administration.projects, new_project)) { - return a_err::A_ERR_GENERIC; + return A_ERR_GENERIC; } g_administration.next_id++; @@ -1158,13 +1172,13 @@ a_err administration_project_add(project data) if (project_changed_event_callback) project_changed_event_callback(new_project); if (data_changed_event_callback) data_changed_event_callback(); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } a_err administration_project_update(project data) { a_err result = administration_project_is_valid(data); - if (result != a_err::A_ERR_SUCCESS) return result; + if (result != A_ERR_SUCCESS) return result; list_iterator_start(&g_administration.projects); while (list_iterator_hasnext(&g_administration.projects)) { @@ -1177,12 +1191,12 @@ a_err administration_project_update(project data) if (project_changed_event_callback) project_changed_event_callback(c); if (data_changed_event_callback) data_changed_event_callback(); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.projects); - return a_err::A_ERR_NOT_FOUND; + return A_ERR_NOT_FOUND; } a_err administration_project_remove(project data) @@ -1193,17 +1207,17 @@ a_err administration_project_remove(project data) if (strcmp(c->id, data.id) == 0) { list_iterator_stop(&g_administration.projects); - if (list_delete(&g_administration.projects, c) != 0) return a_err::A_ERR_GENERIC; + if (list_delete(&g_administration.projects, c) != 0) return A_ERR_GENERIC; if (data_deleted_event_callback) data_deleted_event_callback(c->id); free(c); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.projects); - return a_err::A_ERR_NOT_FOUND; + return A_ERR_NOT_FOUND; } project administration_project_create_empty() @@ -1240,12 +1254,12 @@ a_err administration_tax_rate_get_by_id(tax_rate* buffer, char* id) { *buffer = c; list_iterator_stop(&g_administration.tax_rates); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.tax_rates); - return a_err::A_ERR_NOT_FOUND; + return A_ERR_NOT_FOUND; } u32 administration_tax_rate_count() @@ -1256,26 +1270,26 @@ u32 administration_tax_rate_count() a_err administration_tax_rate_import(tax_rate data) { tax_rate* tb = (tax_rate*)malloc(sizeof(tax_rate)); - if (!tb) return a_err::A_ERR_GENERIC; + if (!tb) return A_ERR_GENERIC; memcpy((void*)tb, (void*)&data, sizeof(tax_rate)); if (!list_append(&g_administration.tax_rates, tb)) { - return a_err::A_ERR_GENERIC; + return A_ERR_GENERIC; } list_attributes_comparator(&g_administration.tax_rates, compare_tax_countries); list_sort(&g_administration.tax_rates, -1); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } a_err administration_tax_rate_add(tax_rate data) { tax_rate* tb = (tax_rate*)malloc(sizeof(tax_rate)); - if (!tb) return a_err::A_ERR_GENERIC; + if (!tb) return A_ERR_GENERIC; memcpy((void*)tb, (void*)&data, sizeof(tax_rate)); if (!list_append(&g_administration.tax_rates, tb)) { - return a_err::A_ERR_GENERIC; + return A_ERR_GENERIC; } g_administration.next_id++; @@ -1286,7 +1300,7 @@ a_err administration_tax_rate_add(tax_rate data) if (taxrate_changed_event_callback) taxrate_changed_event_callback(&data); if (data_changed_event_callback) data_changed_event_callback(); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } u32 administration_tax_rate_get_by_country(tax_rate* buffer, char* country_code) @@ -1335,12 +1349,12 @@ a_err administration_tax_rate_update(tax_rate data) if (taxrate_changed_event_callback) taxrate_changed_event_callback(c); if (data_changed_event_callback) data_changed_event_callback(); - return a_err::A_ERR_SUCCESS; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.tax_rates); - return a_err::A_ERR_NOT_FOUND; + return A_ERR_NOT_FOUND; } // Cost center functions. @@ -1358,7 +1372,7 @@ cost_center administration_cost_center_create_empty() return cc; } -bool administration_cost_center_get_by_id(cost_center* buffer, char* id) +a_err administration_cost_center_get_by_id(cost_center* buffer, char* id) { assert(buffer); @@ -1369,12 +1383,12 @@ bool administration_cost_center_get_by_id(cost_center* buffer, char* id) { *buffer = c; list_iterator_stop(&g_administration.cost_centers); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.cost_centers); - return false; + return A_ERR_NOT_FOUND; } u32 administration_cost_center_get_all(cost_center* buffer) @@ -1410,51 +1424,59 @@ static bool administration_get_cost_center_by_code(char* code, cost_center* buff return result; } -// TODO merge these 2 info cost_center_is_valid -bool administration_cost_center_verify_description(char* text) +a_err administration_cost_center_is_valid(cost_center data) { - return strlen(text) != 0; -} + cost_center lookup; -bool administration_cost_center_verify_code(char* code) -{ - if (strlen(code) == 0) return false; + a_err result = A_ERR_SUCCESS; + if (strlen(data.code) == 0) result |= A_ERR_MISSING_CODE; + if (strlen(data.description) == 0) result |= A_ERR_MISSING_DESCRIPTION; + if (administration_get_cost_center_by_code(data.code, &lookup)) result |= A_ERR_CODE_EXISTS; - cost_center cost_center; - bool found = administration_get_cost_center_by_code(code, &cost_center); - return !found; + return result; } -bool administration_cost_center_import(cost_center data) +a_err administration_cost_center_import(cost_center data) { + a_err result = administration_cost_center_is_valid(data); + if (result != A_ERR_SUCCESS) return result; + cost_center* tb = (cost_center*)malloc(sizeof(cost_center)); + if (!tb) return A_ERR_GENERIC; + memcpy(tb, &data, sizeof(cost_center)); - list_append(&g_administration.cost_centers, tb); - return true; + if (!list_append(&g_administration.cost_centers, tb)) { + return A_ERR_GENERIC; + } + return A_ERR_SUCCESS; } -bool administration_cost_center_add(cost_center data) +a_err administration_cost_center_add(cost_center data) { - cost_center cs; - bool found = administration_get_cost_center_by_code(data.code, &cs); - if (found) return false; - - if (!administration_cost_center_verify_description(data.description)) return false; + a_err result = administration_cost_center_is_valid(data); + if (result != A_ERR_SUCCESS) return result; cost_center* tb = (cost_center*)malloc(sizeof(cost_center)); + if (!tb) return A_ERR_GENERIC; + memcpy((void*)tb, (void*)&data, sizeof(cost_center)); - list_append(&g_administration.cost_centers, tb); + if (!list_append(&g_administration.cost_centers, tb)) { + return A_ERR_GENERIC; + } g_administration.next_id++; if (costcenter_changed_event_callback) costcenter_changed_event_callback(tb); if (data_changed_event_callback) data_changed_event_callback(); - return true; + return A_ERR_SUCCESS; } -bool administration_cost_center_update(cost_center data) +a_err administration_cost_center_update(cost_center data) { + a_err result = administration_cost_center_is_valid(data); + if (result != A_ERR_CODE_EXISTS) return result; + list_iterator_start(&g_administration.cost_centers); while (list_iterator_hasnext(&g_administration.cost_centers)) { cost_center* c = (cost_center *)list_iterator_next(&g_administration.cost_centers); @@ -1466,12 +1488,12 @@ bool administration_cost_center_update(cost_center data) if (costcenter_changed_event_callback) costcenter_changed_event_callback(c); if (data_changed_event_callback) data_changed_event_callback(); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.cost_centers); - return false; + return A_ERR_NOT_FOUND; } // Invoice functions. @@ -1562,17 +1584,18 @@ void administration_invoice_set_currency(invoice* invoice, char* currency) list_iterator_stop(&invoice->billing_items); } -bool administration_invoice_is_valid(invoice* invoice) +a_err administration_invoice_is_valid(invoice* invoice) { - if (list_size(&invoice->billing_items) == 0) return false; - if (invoice->is_triangulation && !administration_contact_is_valid(invoice->addressee)) return false; - if (!administration_contact_is_valid(invoice->customer)) return false; - if (!administration_contact_is_valid(invoice->supplier)) return false; + a_err result = A_ERR_SUCCESS; + if (list_size(&invoice->billing_items) == 0) result |= A_ERR_MISSING_BILLING_ITEMS; + if (invoice->is_triangulation && administration_contact_is_valid(invoice->addressee) != A_ERR_SUCCESS) result |= A_ERR_INVALID_ADDRESSEE; + if (administration_contact_is_valid(invoice->customer) != A_ERR_SUCCESS) result |= A_ERR_INVALID_CUSTOMER; + if (administration_contact_is_valid(invoice->supplier) != A_ERR_SUCCESS) result |= A_ERR_INVALID_SUPPLIER; - return true; + return result; } -bool administration_invoice_remove(invoice* inv) +a_err administration_invoice_remove(invoice* inv) { list_iterator_start(&g_administration.invoices); while (list_iterator_hasnext(&g_administration.invoices)) { @@ -1581,8 +1604,8 @@ bool administration_invoice_remove(invoice* inv) if (strcmp(c->id, inv->id) == 0) { list_iterator_stop(&g_administration.invoices); - administration_destroy_list(&c->billing_items); - list_delete(&g_administration.invoices, c); + administration_destroy_list(&c->billing_items); + if (list_delete(&g_administration.invoices, c) != 0) return A_ERR_GENERIC; if (data_deleted_event_callback) data_deleted_event_callback(c->id); @@ -1590,11 +1613,11 @@ bool administration_invoice_remove(invoice* inv) else g_administration.expense_count--; free(c); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.invoices); - return false; + return A_ERR_NOT_FOUND; } static void administration_invoice_set_refs(invoice* inv) @@ -1605,7 +1628,7 @@ static void administration_invoice_set_refs(invoice* inv) // Check if supplier info is equal to contact stored in supplier id, in case we autocomplete and edit data after, // this should be handled as a new contact. contact lookup_buffer; - if (administration_contact_get_by_id(&lookup_buffer, inv->supplier.id)) + if (administration_contact_get_by_id(&lookup_buffer, inv->supplier.id) == A_ERR_SUCCESS) { if (!administration_contact_equals(lookup_buffer, inv->supplier)) { @@ -1635,7 +1658,7 @@ static void administration_invoice_set_refs(invoice* inv) // Check if customer info is equal to contact stored in customer id, in case we autocomplete and edit data after, // this should be handled as a new contact. - if (administration_contact_get_by_id(&lookup_buffer, inv->customer.id)) + if (administration_contact_get_by_id(&lookup_buffer, inv->customer.id) == A_ERR_SUCCESS) { if (!administration_contact_equals(lookup_buffer, inv->customer)) { @@ -1670,9 +1693,10 @@ static void administration_invoice_set_refs(invoice* inv) } } -bool administration_invoice_update(invoice* inv) +a_err administration_invoice_update(invoice* inv) { - if (!administration_invoice_is_valid(inv)) return false; + a_err result = administration_invoice_is_valid(inv); + if (result != A_ERR_SUCCESS) return result; administration_invoice_set_refs(inv); @@ -1688,21 +1712,24 @@ bool administration_invoice_update(invoice* inv) if (invoice_changed_event_callback) invoice_changed_event_callback(c); if (data_changed_event_callback) data_changed_event_callback(); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&g_administration.invoices); - return false; + return A_ERR_NOT_FOUND; } -bool administration_invoice_add(invoice* inv) +a_err administration_invoice_add(invoice* inv) { - if (!administration_invoice_is_valid(inv)) return false; + a_err result = administration_invoice_is_valid(inv); + if (result != A_ERR_SUCCESS) return result; administration_invoice_set_refs(inv); invoice copy = administration_invoice_create_copy(inv); // Create copy to make copy of billing item list. invoice* new_inv = (invoice*)malloc(sizeof(invoice)); + if (!new_inv) return A_ERR_GENERIC; + memcpy(new_inv, ©, sizeof(invoice)); new_inv->payment_means.payment_method = PAYMENT_METHOD_DEBIT_TRANSFER; @@ -1711,7 +1738,9 @@ bool administration_invoice_add(invoice* inv) strops_copy(new_inv->payment_means.service_provider_id, "", sizeof(new_inv->payment_means.service_provider_id)); strops_copy(new_inv->payment_means.payer_bank_account, inv->supplier.bank_account, sizeof(new_inv->payment_means.payer_bank_account)); - list_append(&g_administration.invoices, new_inv); + if (!list_append(&g_administration.invoices, new_inv)) { + return A_ERR_GENERIC; + } g_administration.next_id++; g_administration.next_sequence_number++; @@ -1722,7 +1751,7 @@ bool administration_invoice_add(invoice* inv) if (invoice_changed_event_callback) invoice_changed_event_callback(new_inv); if (data_changed_event_callback) data_changed_event_callback(); - return true; + return A_ERR_SUCCESS; } invoice administration_invoice_create_copy(invoice* inv) @@ -1814,7 +1843,7 @@ u32 administration_invoice_get_tax_rates(invoice* invoice, tax_rate* buffer) tax_rate rate; a_err found = administration_tax_rate_get_by_id(&rate, c.tax_rate_id); - if (found == a_err::A_ERR_SUCCESS) { + if (found == A_ERR_SUCCESS) { bool exists = false; for (u32 i = 0; i < write_cursor; i++) { @@ -1914,7 +1943,7 @@ static void administration_recalculate_billing_item_totals(billing_item* item) } tax_rate rate; - if (administration_tax_rate_get_by_id(&rate, item->tax_rate_id) == a_err::A_ERR_SUCCESS) + if (administration_tax_rate_get_by_id(&rate, item->tax_rate_id) == A_ERR_SUCCESS) { item->tax = item->net * (rate.rate/100.0f); } @@ -1941,7 +1970,7 @@ u32 administration_billing_item_get_all_for_invoice(invoice* invoice, billing_it return write_cursor; } -bool administration_billing_item_remove_from_invoice(invoice* invoice, billing_item item) +a_err administration_billing_item_remove_from_invoice(invoice* invoice, billing_item item) { list_iterator_start(&invoice->billing_items); while (list_iterator_hasnext(&invoice->billing_items)) { @@ -1949,17 +1978,17 @@ bool administration_billing_item_remove_from_invoice(invoice* invoice, billing_i if (strcmp(c->id, item.id) == 0) { list_iterator_stop(&invoice->billing_items); - list_delete(&invoice->billing_items, c); + if (list_delete(&invoice->billing_items, c) != 0) return A_ERR_GENERIC; free(c); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&invoice->billing_items); - return false; + return A_ERR_NOT_FOUND; } -bool administration_billing_item_update_in_invoice(invoice* invoice, billing_item item) +a_err administration_billing_item_update_in_invoice(invoice* invoice, billing_item item) { list_iterator_start(&invoice->billing_items); while (list_iterator_hasnext(&invoice->billing_items)) { @@ -1971,19 +2000,21 @@ bool administration_billing_item_update_in_invoice(invoice* invoice, billing_ite administration_recalculate_billing_item_totals(c); administration_recalculate_invoice_totals(invoice); - return true; + return A_ERR_SUCCESS; } } list_iterator_stop(&invoice->billing_items); - return false; + return A_ERR_NOT_FOUND; } -bool administration_billing_item_add_to_invoice(invoice* invoice, billing_item item) +a_err administration_billing_item_add_to_invoice(invoice* invoice, billing_item item) { - if (administration_billing_item_count(invoice) >= MAX_BILLING_ITEMS) return false; + if (administration_billing_item_count(invoice) >= MAX_BILLING_ITEMS) return A_ERR_MAX_ITEMS_REACHED; billing_item* tb = (billing_item*)malloc(sizeof(billing_item)); + if (!tb) return A_ERR_GENERIC; + memcpy(tb, &item, sizeof(billing_item)); snprintf(tb->id, sizeof(tb->id), "B/%d", administration_create_id()); strops_copy(tb->invoice_id, invoice->id, sizeof(tb->invoice_id)); @@ -1992,10 +2023,13 @@ bool administration_billing_item_add_to_invoice(invoice* invoice, billing_item i administration_recalculate_billing_item_totals(tb); administration_recalculate_invoice_totals(invoice); - list_append(&invoice->billing_items, tb); + if (!list_append(&invoice->billing_items, tb)) { + return A_ERR_GENERIC; + } + g_administration.next_id++; - return true; + return A_ERR_SUCCESS; } billing_item administration_billing_item_create_empty() |
