summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp274
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, &copy, 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()