diff options
| -rw-r--r-- | include/administration.hpp | 78 | ||||
| -rw-r--r-- | src/administration.cpp | 274 | ||||
| -rw-r--r-- | src/ui/ui_contacts.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_expenses.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_invoices.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_projects.cpp | 2 | ||||
| -rw-r--r-- | src/ui/ui_settings.cpp | 8 | ||||
| -rw-r--r-- | tests/administration_rw_tests.cpp | 8 | ||||
| -rw-r--r-- | tests/administration_validation_tests.cpp | 331 |
9 files changed, 523 insertions, 190 deletions
diff --git a/include/administration.hpp b/include/administration.hpp index 7c1b0d0..616cc0a 100644 --- a/include/administration.hpp +++ b/include/administration.hpp @@ -333,27 +333,26 @@ typedef struct } administration; // Add/Update result codes. -typedef enum { - - A_ERR_GENERIC = 0, - A_ERR_SUCCESS = 1ULL << 0, - A_ERR_NOT_FOUND = 1ULL << 1, - - A_ERR_MISSING_DESCRIPTION = 1ULL << 2, - A_ERR_CODE_EXISTS = 1ULL << 3, - A_ERR_MISSING_BILLING_ITEMS = 1ULL << 4, - A_ERR_INVALID_ADDRESSEE = 1ULL << 5, - A_ERR_INVALID_CUSTOMER = 1ULL << 6, - A_ERR_INVALID_SUPPLIER = 1ULL << 7, - A_ERR_MISSING_NAME = 1ULL << 8, - A_ERR_MISSING_CITY = 1ULL << 9, - A_ERR_MISSING_POSTAL = 1ULL << 10, - A_ERR_MISSING_ADDRESS1 = 1ULL << 11, - A_ERR_MISSING_COUNTRYCODE = 1ULL << 12, - A_ERR_MISSING_TAXID = 1ULL << 13, - A_ERR_MISSING_BUSINESSID = 1ULL << 14, - A_ERR_MAX_ITEMS_REACHED = 1ULL << 15, -} a_err; +#define A_ERR_SUCCESS 0 +#define A_ERR_GENERIC (1ULL << 0) +#define A_ERR_NOT_FOUND (1ULL << 1) +#define A_ERR_MISSING_DESCRIPTION (1ULL << 2) +#define A_ERR_CODE_EXISTS (1ULL << 3) +#define A_ERR_MISSING_BILLING_ITEMS (1ULL << 4) +#define A_ERR_INVALID_ADDRESSEE (1ULL << 5) +#define A_ERR_INVALID_CUSTOMER (1ULL << 6) +#define A_ERR_INVALID_SUPPLIER (1ULL << 7) +#define A_ERR_MISSING_NAME (1ULL << 8) +#define A_ERR_MISSING_CITY (1ULL << 9) +#define A_ERR_MISSING_POSTAL (1ULL << 10) +#define A_ERR_MISSING_ADDRESS1 (1ULL << 11) +#define A_ERR_MISSING_COUNTRYCODE (1ULL << 12) +#define A_ERR_MISSING_TAXID (1ULL << 13) +#define A_ERR_MISSING_BUSINESSID (1ULL << 14) +#define A_ERR_MAX_ITEMS_REACHED (1ULL << 15) +#define A_ERR_MISSING_CODE (1ULL << 16) + +typedef uint32_t a_err; // Setup functions. // ======================= @@ -394,16 +393,16 @@ bool administration_can_create_invoices(); // ======================= u32 administration_contact_count(); contact administration_contact_create_empty(); -bool administration_contact_import(contact data); -bool administration_contact_add(contact data); -bool administration_contact_update(contact data); -bool administration_contact_remove(contact data); +a_err administration_contact_import(contact data); +a_err administration_contact_add(contact data); +a_err administration_contact_update(contact data); +a_err administration_contact_remove(contact data); -bool administration_contact_is_valid(contact data); +a_err administration_contact_is_valid(contact data); bool administration_contact_can_be_deleted(contact data); bool administration_contact_equals(contact c1, contact c2); -bool administration_contact_get_by_id(contact* buffer, char* id); +a_err administration_contact_get_by_id(contact* buffer, char* id); int administration_contact_get_autocompletions(contact* buffer, int buf_size, char* name); u32 administration_contact_get_partial_list(u32 page_index, u32 page_size, contact* buffer); u32 administration_contact_get_all(contact* buffer); @@ -441,15 +440,14 @@ u32 administration_tax_rate_get_by_country(tax_rate* buffer, char* country_ // ======================= u32 administration_cost_center_count(); cost_center administration_cost_center_create_empty(); -bool administration_cost_center_import(cost_center data); -bool administration_cost_center_add(cost_center data); -bool administration_cost_center_update(cost_center data); +a_err administration_cost_center_import(cost_center data); +a_err administration_cost_center_add(cost_center data); +a_err administration_cost_center_update(cost_center data); -bool administration_cost_center_verify_code(char* code); -bool administration_cost_center_verify_description(char* text); +a_err administration_cost_center_is_valid(cost_center data); u32 administration_cost_center_get_all(cost_center* buffer); -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); // Invoice functions. // ======================= @@ -457,13 +455,13 @@ u32 administration_invoice_count(); u32 administration_invoice_get_incomming_count(); u32 administration_invoice_get_outgoing_count(); invoice administration_invoice_create_empty(); -bool administration_invoice_add(invoice* invoice); -bool administration_invoice_update(invoice* invoice); -bool administration_invoice_remove(invoice* invoice); +a_err administration_invoice_add(invoice* invoice); +a_err administration_invoice_update(invoice* invoice); +a_err administration_invoice_remove(invoice* invoice); void administration_invoice_set_currency(invoice* invoice, char* currency); invoice administration_invoice_create_copy(invoice* invoice); -bool administration_invoice_is_valid(invoice* invoice); +a_err administration_invoice_is_valid(invoice* invoice); char* administration_invoice_get_status_string(invoice* invoice); u32 administration_invoice_get_partial_list_outgoing(u32 page_index, u32 page_size, invoice* buffer); @@ -477,8 +475,8 @@ bool administration_invoice_get_subtotal_for_tax_rate(invoice* invoice, tax_r // ======================= u32 administration_billing_item_count(invoice* invoice); billing_item administration_billing_item_create_empty(); -bool administration_billing_item_add_to_invoice(invoice* invoice, billing_item item); -bool administration_billing_item_update_in_invoice(invoice* invoice, billing_item item); -bool administration_billing_item_remove_from_invoice(invoice* invoice, billing_item item); +a_err administration_billing_item_add_to_invoice(invoice* invoice, billing_item item); +a_err administration_billing_item_update_in_invoice(invoice* invoice, billing_item item); +a_err administration_billing_item_remove_from_invoice(invoice* invoice, billing_item item); u32 administration_billing_item_get_all_for_invoice(invoice* invoice, billing_item* buffer);
\ No newline at end of file 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() diff --git a/src/ui/ui_contacts.cpp b/src/ui/ui_contacts.cpp index e7afd7a..cfeb08d 100644 --- a/src/ui/ui_contacts.cpp +++ b/src/ui/ui_contacts.cpp @@ -297,7 +297,7 @@ static void ui_draw_contacts_create() draw_contact_form(&active_contact); - bool can_save = administration_contact_is_valid(active_contact); + bool can_save = administration_contact_is_valid(active_contact) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); // Save button ImGui::Spacing(); @@ -316,7 +316,7 @@ static void ui_draw_contacts_update() draw_contact_form(&active_contact); - bool can_save = administration_contact_is_valid(active_contact); + bool can_save = administration_contact_is_valid(active_contact) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); // Save button ImGui::Spacing(); diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp index cd5e186..96489d3 100644 --- a/src/ui/ui_expenses.cpp +++ b/src/ui/ui_expenses.cpp @@ -478,7 +478,7 @@ static void ui_draw_expense_update() draw_expense_form(&active_invoice); - bool can_save = administration_invoice_is_valid(&active_invoice); + bool can_save = administration_invoice_is_valid(&active_invoice) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); ImGui::Spacing(); @@ -502,7 +502,7 @@ static void ui_draw_expense_create() draw_expense_form(&active_invoice); - bool can_save = administration_invoice_is_valid(&active_invoice); + bool can_save = administration_invoice_is_valid(&active_invoice) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); ImGui::Spacing(); diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index 99fac37..f022509 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -511,7 +511,7 @@ static void ui_draw_invoice_update() draw_invoice_form(&active_invoice); - bool can_save = administration_invoice_is_valid(&active_invoice); + bool can_save = administration_invoice_is_valid(&active_invoice) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); ImGui::Spacing(); @@ -535,7 +535,7 @@ static void ui_draw_invoice_create() draw_invoice_form(&active_invoice); - bool can_save = administration_invoice_is_valid(&active_invoice); + bool can_save = administration_invoice_is_valid(&active_invoice) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); ImGui::Spacing(); diff --git a/src/ui/ui_projects.cpp b/src/ui/ui_projects.cpp index 065e828..16d04b1 100644 --- a/src/ui/ui_projects.cpp +++ b/src/ui/ui_projects.cpp @@ -46,7 +46,7 @@ static void draw_project_form() if (viewing_only) ImGui::EndDisabled(); if (!viewing_only) { - bool can_save = administration_project_is_valid(active_project); + bool can_save = administration_project_is_valid(active_project) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); // Save button diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index 06cefe6..4812502 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -221,7 +221,7 @@ static void ui_draw_cost_centers() ImGui::TableSetColumnIndex(1); if (is_editing_item && editing_item_index == i) { - bool is_desc_valid = administration_cost_center_verify_description(new_cost_center.description); + bool is_desc_valid = !(administration_cost_center_is_valid(new_cost_center) & A_ERR_MISSING_DESCRIPTION); if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255)); ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description)); if (!is_desc_valid) ImGui::PopStyleColor(); @@ -268,13 +268,13 @@ static void ui_draw_cost_centers() { ImGui::TableNextRow(); - bool is_code_valid = administration_cost_center_verify_code(new_cost_center.code); + bool is_code_valid = !(administration_cost_center_is_valid(new_cost_center) & (A_ERR_CODE_EXISTS|A_ERR_MISSING_CODE)); if (!is_code_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255)); ImGui::TableSetColumnIndex(0); ImGui::InputText("##Code", new_cost_center.code, IM_ARRAYSIZE(new_cost_center.code), ImGuiInputTextFlags_CharsUppercase|ImGuiInputTextFlags_CharsNoBlank); if (!is_code_valid) ImGui::PopStyleColor(); - bool is_desc_valid = administration_cost_center_verify_description(new_cost_center.description); + bool is_desc_valid = !(administration_cost_center_is_valid(new_cost_center) & A_ERR_MISSING_DESCRIPTION); if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255)); ImGui::TableSetColumnIndex(1); ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description)); if (!is_desc_valid) ImGui::PopStyleColor(); @@ -324,7 +324,7 @@ void ui_draw_settings() draw_contact_form(&company_info); // Save button. - bool can_save = administration_contact_is_valid(company_info); + bool can_save = administration_contact_is_valid(company_info) == A_ERR_SUCCESS; if (!can_save) ImGui::BeginDisabled(); ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { diff --git a/tests/administration_rw_tests.cpp b/tests/administration_rw_tests.cpp index d69b7dd..aed3c52 100644 --- a/tests/administration_rw_tests.cpp +++ b/tests/administration_rw_tests.cpp @@ -54,7 +54,7 @@ TEST _administration_rw_taxrate(void) administration_reader_open_existing(test_file_path); { ASSERT_EQ(count+1, administration_tax_rate_count()); - ASSERT_EQ(1, administration_tax_rate_get_by_id(&pr, pw.id)); + ASSERT_EQ(A_ERR_SUCCESS, administration_tax_rate_get_by_id(&pr, pw.id)); ASSERT_MEM_EQ(&pw, &pr, sizeof(tax_rate)); } @@ -84,7 +84,7 @@ TEST _administration_rw_costcenter(void) administration_reader_open_existing(test_file_path); { ASSERT_EQ(count+1, administration_cost_center_count()); - ASSERT_EQ(1, administration_cost_center_get_by_id(&pr, pw.id)); + ASSERT_EQ(A_ERR_SUCCESS, administration_cost_center_get_by_id(&pr, pw.id)); ASSERT_MEM_EQ(&pw, &pr, sizeof(cost_center)); } @@ -112,7 +112,7 @@ TEST _administration_rw_project(void) administration_reader_open_existing(test_file_path); { ASSERT_EQ(count+1, administration_project_count()); - ASSERT_EQ(1, administration_project_get_by_id(&pr, pw.id)); + ASSERT_EQ(A_ERR_SUCCESS, administration_project_get_by_id(&pr, pw.id)); ASSERT_MEM_EQ(&pw, &pr, sizeof(project)); } @@ -146,7 +146,7 @@ TEST _administration_rw_contact(void) administration_reader_open_existing(test_file_path); { ASSERT_EQ(count+1, administration_contact_count()); - ASSERT_EQ(1, administration_contact_get_by_id(&pr, pw.id)); + ASSERT_EQ(A_ERR_SUCCESS, administration_contact_get_by_id(&pr, pw.id)); ASSERT_MEM_EQ(&pw, &pr, sizeof(contact)); } diff --git a/tests/administration_validation_tests.cpp b/tests/administration_validation_tests.cpp index a2fe46a..4b88e37 100644 --- a/tests/administration_validation_tests.cpp +++ b/tests/administration_validation_tests.cpp @@ -7,15 +7,17 @@ #include "strops.hpp" #include "administration.hpp" +// Project +////////////////// TEST _administration_validate_project_add(void) { administration_create_empty(""); project p1 = administration_project_create_empty(); - ASSERT_EQ(administration_project_add(p1), a_err::A_ERR_MISSING_DESCRIPTION); + ASSERT_EQ(administration_project_add(p1), A_ERR_MISSING_DESCRIPTION); strops_copy(p1.description, "test project", sizeof(p1.description)); - ASSERT_EQ(administration_project_add(p1), a_err::A_ERR_SUCCESS); + ASSERT_EQ(administration_project_add(p1), A_ERR_SUCCESS); PASS(); } @@ -25,10 +27,10 @@ TEST _administration_validate_project_import(void) administration_create_empty(""); project p1 = administration_project_create_empty(); - ASSERT_EQ(administration_project_import(p1), a_err::A_ERR_MISSING_DESCRIPTION); + ASSERT_EQ(administration_project_import(p1), A_ERR_MISSING_DESCRIPTION); strops_copy(p1.description, "test project", sizeof(p1.description)); - ASSERT_EQ(administration_project_import(p1), a_err::A_ERR_SUCCESS); + ASSERT_EQ(administration_project_import(p1), A_ERR_SUCCESS); PASS(); } @@ -40,14 +42,15 @@ TEST _administration_validate_project_update(void) project p1 = administration_project_create_empty(); strops_copy(p1.description, "test project", sizeof(p1.description)); - ASSERT_EQ(administration_project_add(p1), a_err::A_ERR_SUCCESS); + ASSERT_EQ(administration_project_add(p1), A_ERR_SUCCESS); + ASSERT_EQ(administration_project_update(p1), A_ERR_SUCCESS); strops_copy(p1.description, "", sizeof(p1.description)); - ASSERT_EQ(administration_project_update(p1), a_err::A_ERR_MISSING_DESCRIPTION); + ASSERT_EQ(administration_project_update(p1), A_ERR_MISSING_DESCRIPTION); - strops_copy(p1.id, "-1", sizeof(p1.description)); + strops_copy(p1.id, "-1", sizeof(p1.id)); strops_copy(p1.description, "test project 2", sizeof(p1.description)); - ASSERT_EQ(administration_project_update(p1), a_err::A_ERR_NOT_FOUND); + ASSERT_EQ(administration_project_update(p1), A_ERR_NOT_FOUND); PASS(); } @@ -58,13 +61,13 @@ TEST _administration_validate_project_remove(void) project p1 = administration_project_create_empty(); strops_copy(p1.description, "test project", sizeof(p1.description)); - ASSERT_EQ(administration_project_add(p1), a_err::A_ERR_SUCCESS); + ASSERT_EQ(administration_project_add(p1), A_ERR_SUCCESS); - ASSERT_EQ(administration_project_remove(p1), a_err::A_ERR_SUCCESS); + ASSERT_EQ(administration_project_remove(p1), A_ERR_SUCCESS); - ASSERT_EQ(administration_project_add(p1), a_err::A_ERR_SUCCESS); - strops_copy(p1.id, "-1", sizeof(p1.description)); - ASSERT_EQ(administration_project_remove(p1), a_err::A_ERR_NOT_FOUND); + ASSERT_EQ(administration_project_add(p1), A_ERR_SUCCESS); + strops_copy(p1.id, "-1", sizeof(p1.id)); + ASSERT_EQ(administration_project_remove(p1), A_ERR_NOT_FOUND); PASS(); } @@ -74,18 +77,316 @@ TEST _administration_validate_project_isvalid(void) administration_create_empty(""); project p1 = administration_project_create_empty(); - ASSERT_EQ(administration_project_is_valid(p1), a_err::A_ERR_MISSING_DESCRIPTION); + ASSERT_EQ(administration_project_is_valid(p1), A_ERR_MISSING_DESCRIPTION); strops_copy(p1.description, "test project", sizeof(p1.description)); - ASSERT_EQ(administration_project_is_valid(p1), a_err::A_ERR_SUCCESS); + ASSERT_EQ(administration_project_is_valid(p1), A_ERR_SUCCESS); PASS(); } +// Tax rate +////////////////// +TEST _administration_validate_taxrate_add(void) +{ + administration_create_empty(""); + tax_rate p1 = administration_tax_rate_create_empty(); + + ASSERT_EQ(administration_tax_rate_add(p1), A_ERR_SUCCESS); + + PASS(); +} + +TEST _administration_validate_taxrate_import(void) +{ + administration_create_empty(""); + tax_rate p1 = administration_tax_rate_create_empty(); + + ASSERT_EQ(administration_tax_rate_import(p1), A_ERR_SUCCESS); + + PASS(); +} + + +TEST _administration_validate_taxrate_update(void) +{ + administration_create_empty(""); + tax_rate p1 = administration_tax_rate_create_empty(); + + ASSERT_EQ(administration_tax_rate_add(p1), A_ERR_SUCCESS); + ASSERT_EQ(administration_tax_rate_update(p1), A_ERR_SUCCESS); + + strops_copy(p1.id, "-1", sizeof(p1.id)); + ASSERT_EQ(administration_tax_rate_update(p1), A_ERR_NOT_FOUND); + + PASS(); +} + +// Cost center +////////////////// +TEST _administration_validate_costcenter_add(void) +{ + administration_create_empty(""); + cost_center p1 = administration_cost_center_create_empty(); + strops_copy(p1.code, "TEST", sizeof(p1.code)); + strops_copy(p1.description, "description", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_add(p1), A_ERR_SUCCESS); + + ASSERT_EQ(administration_cost_center_add(p1), A_ERR_CODE_EXISTS); + strops_copy(p1.code, "", sizeof(p1.code)); + ASSERT_EQ(administration_cost_center_add(p1), A_ERR_MISSING_CODE); + strops_copy(p1.description, "", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_add(p1), A_ERR_MISSING_CODE|A_ERR_MISSING_DESCRIPTION); + + PASS(); +} + +TEST _administration_validate_costcenter_import(void) +{ + administration_create_empty(""); + cost_center p1 = administration_cost_center_create_empty(); + strops_copy(p1.code, "TEST", sizeof(p1.code)); + strops_copy(p1.description, "description", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_import(p1), A_ERR_SUCCESS); + + ASSERT_EQ(administration_cost_center_import(p1), A_ERR_CODE_EXISTS); + strops_copy(p1.code, "", sizeof(p1.code)); + ASSERT_EQ(administration_cost_center_import(p1), A_ERR_MISSING_CODE); + strops_copy(p1.description, "", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_import(p1), A_ERR_MISSING_CODE|A_ERR_MISSING_DESCRIPTION); + + PASS(); +} + + +TEST _administration_validate_costcenter_update(void) +{ + administration_create_empty(""); + cost_center p1 = administration_cost_center_create_empty(); + strops_copy(p1.code, "TEST", sizeof(p1.code)); + strops_copy(p1.description, "description", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_add(p1), A_ERR_SUCCESS); + ASSERT_EQ(administration_cost_center_update(p1), A_ERR_SUCCESS); + + strops_copy(p1.code, "", sizeof(p1.code)); + ASSERT_EQ(administration_cost_center_update(p1), A_ERR_MISSING_CODE); + strops_copy(p1.description, "", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_update(p1), A_ERR_MISSING_CODE|A_ERR_MISSING_DESCRIPTION); + + strops_copy(p1.id, "-1", sizeof(p1.id)); + strops_copy(p1.code, "TEST", sizeof(p1.code)); + strops_copy(p1.description, "description", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_update(p1), A_ERR_NOT_FOUND); + + PASS(); +} + +TEST _administration_validate_costcenter_isvalid(void) +{ + administration_create_empty(""); + cost_center p1 = administration_cost_center_create_empty(); + strops_copy(p1.code, "TEST", sizeof(p1.code)); + strops_copy(p1.description, "description", sizeof(p1.description)); + + ASSERT_EQ(administration_cost_center_is_valid(p1), A_ERR_SUCCESS); + + strops_copy(p1.code, "", sizeof(p1.code)); + ASSERT_EQ(administration_cost_center_is_valid(p1), A_ERR_MISSING_CODE); + + strops_copy(p1.code, "", sizeof(p1.code)); + strops_copy(p1.description, "", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_is_valid(p1), A_ERR_MISSING_CODE|A_ERR_MISSING_DESCRIPTION); + + strops_copy(p1.code, "TEST", sizeof(p1.code)); + strops_copy(p1.description, "description", sizeof(p1.description)); + ASSERT_EQ(administration_cost_center_add(p1), A_ERR_SUCCESS); + ASSERT_EQ(administration_cost_center_is_valid(p1), A_ERR_CODE_EXISTS); + + PASS(); +} + + +// Contact +////////////////// +TEST _administration_validate_contact_add(void) +{ + administration_create_empty(""); + contact p1 = administration_contact_create_empty(); + strops_copy(p1.name, "John Johnsson", sizeof(p1.name)); + strops_copy(p1.address.address1, "Address 1", sizeof(p1.address.address1)); + strops_copy(p1.address.country_code, "FR", sizeof(p1.address.country_code)); + strops_copy(p1.address.city, "Paris", sizeof(p1.address.city)); + strops_copy(p1.address.postal, "12345", sizeof(p1.address.postal)); + p1.type = contact_type::CONTACT_CONSUMER; + + ASSERT_EQ(administration_contact_add(p1), A_ERR_SUCCESS); + + strops_copy(p1.name, "", sizeof(p1.name)); + ASSERT_EQ(administration_contact_add(p1), A_ERR_MISSING_NAME); + strops_copy(p1.address.address1, "", sizeof(p1.address.address1)); + ASSERT_EQ(administration_contact_add(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1); + strops_copy(p1.address.city, "", sizeof(p1.address.city)); + ASSERT_EQ(administration_contact_add(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY); + strops_copy(p1.address.postal, "", sizeof(p1.address.postal)); + ASSERT_EQ(administration_contact_add(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL); + strops_copy(p1.address.country_code, "", sizeof(p1.address.country_code)); + ASSERT_EQ(administration_contact_add(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE); + + p1.type = contact_type::CONTACT_BUSINESS; + ASSERT_EQ(administration_contact_add(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY| + A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE|A_ERR_MISSING_TAXID|A_ERR_MISSING_BUSINESSID); + + PASS(); +} + +TEST _administration_validate_contact_import(void) +{ + + administration_create_empty(""); + contact p1 = administration_contact_create_empty(); + strops_copy(p1.name, "John Johnsson", sizeof(p1.name)); + strops_copy(p1.address.address1, "Address 1", sizeof(p1.address.address1)); + strops_copy(p1.address.country_code, "FR", sizeof(p1.address.country_code)); + strops_copy(p1.address.city, "Paris", sizeof(p1.address.city)); + strops_copy(p1.address.postal, "12345", sizeof(p1.address.postal)); + p1.type = contact_type::CONTACT_CONSUMER; + + ASSERT_EQ(administration_contact_import(p1), A_ERR_SUCCESS); + + strops_copy(p1.name, "", sizeof(p1.name)); + ASSERT_EQ(administration_contact_import(p1), A_ERR_MISSING_NAME); + strops_copy(p1.address.address1, "", sizeof(p1.address.address1)); + ASSERT_EQ(administration_contact_import(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1); + strops_copy(p1.address.city, "", sizeof(p1.address.city)); + ASSERT_EQ(administration_contact_import(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY); + strops_copy(p1.address.postal, "", sizeof(p1.address.postal)); + ASSERT_EQ(administration_contact_import(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL); + strops_copy(p1.address.country_code, "", sizeof(p1.address.country_code)); + ASSERT_EQ(administration_contact_import(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE); + + p1.type = contact_type::CONTACT_BUSINESS; + ASSERT_EQ(administration_contact_import(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY| + A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE|A_ERR_MISSING_TAXID|A_ERR_MISSING_BUSINESSID); + + PASS(); +} + + +TEST _administration_validate_contact_update(void) +{ + administration_create_empty(""); + contact p1 = administration_contact_create_empty(); + strops_copy(p1.name, "John Johnsson", sizeof(p1.name)); + strops_copy(p1.address.address1, "Address 1", sizeof(p1.address.address1)); + strops_copy(p1.address.country_code, "FR", sizeof(p1.address.country_code)); + strops_copy(p1.address.city, "Paris", sizeof(p1.address.city)); + strops_copy(p1.address.postal, "12345", sizeof(p1.address.postal)); + p1.type = contact_type::CONTACT_CONSUMER; + + ASSERT_EQ(administration_contact_add(p1), A_ERR_SUCCESS); + ASSERT_EQ(administration_contact_update(p1), A_ERR_SUCCESS); + + strops_copy(p1.name, "", sizeof(p1.name)); + ASSERT_EQ(administration_contact_update(p1), A_ERR_MISSING_NAME); + strops_copy(p1.address.address1, "", sizeof(p1.address.address1)); + ASSERT_EQ(administration_contact_update(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1); + strops_copy(p1.address.city, "", sizeof(p1.address.city)); + ASSERT_EQ(administration_contact_update(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY); + strops_copy(p1.address.postal, "", sizeof(p1.address.postal)); + ASSERT_EQ(administration_contact_update(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL); + strops_copy(p1.address.country_code, "", sizeof(p1.address.country_code)); + ASSERT_EQ(administration_contact_update(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE); + + p1.type = contact_type::CONTACT_BUSINESS; + ASSERT_EQ(administration_contact_update(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY| + A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE|A_ERR_MISSING_TAXID|A_ERR_MISSING_BUSINESSID); + + strops_copy(p1.id, "-1", sizeof(p1.id)); + strops_copy(p1.name, "John Johnsson", sizeof(p1.name)); + strops_copy(p1.address.address1, "Address 1", sizeof(p1.address.address1)); + strops_copy(p1.address.country_code, "FR", sizeof(p1.address.country_code)); + strops_copy(p1.address.city, "Paris", sizeof(p1.address.city)); + strops_copy(p1.address.postal, "12345", sizeof(p1.address.postal)); + p1.type = contact_type::CONTACT_CONSUMER; + ASSERT_EQ(administration_contact_update(p1), A_ERR_NOT_FOUND); + + PASS(); +} + +TEST _administration_validate_contact_remove(void) +{ + administration_create_empty(""); + contact p1 = administration_contact_create_empty(); + strops_copy(p1.name, "John Johnsson", sizeof(p1.name)); + strops_copy(p1.address.address1, "Address 1", sizeof(p1.address.address1)); + strops_copy(p1.address.country_code, "FR", sizeof(p1.address.country_code)); + strops_copy(p1.address.city, "Paris", sizeof(p1.address.city)); + strops_copy(p1.address.postal, "12345", sizeof(p1.address.postal)); + p1.type = contact_type::CONTACT_CONSUMER; + + ASSERT_EQ(administration_contact_add(p1), A_ERR_SUCCESS); + + ASSERT_EQ(administration_contact_remove(p1), A_ERR_SUCCESS); + + ASSERT_EQ(administration_contact_add(p1), A_ERR_SUCCESS); + strops_copy(p1.id, "-1", sizeof(p1.id)); + ASSERT_EQ(administration_contact_remove(p1), A_ERR_NOT_FOUND); + + PASS(); +} + +TEST _administration_validate_contact_isvalid(void) +{ + administration_create_empty(""); + contact p1 = administration_contact_create_empty(); + strops_copy(p1.name, "John Johnsson", sizeof(p1.name)); + strops_copy(p1.address.address1, "Address 1", sizeof(p1.address.address1)); + strops_copy(p1.address.country_code, "FR", sizeof(p1.address.country_code)); + strops_copy(p1.address.city, "Paris", sizeof(p1.address.city)); + strops_copy(p1.address.postal, "12345", sizeof(p1.address.postal)); + p1.type = contact_type::CONTACT_CONSUMER; + + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_SUCCESS); + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_SUCCESS); + + strops_copy(p1.name, "", sizeof(p1.name)); + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_MISSING_NAME); + strops_copy(p1.address.address1, "", sizeof(p1.address.address1)); + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1); + strops_copy(p1.address.city, "", sizeof(p1.address.city)); + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY); + strops_copy(p1.address.postal, "", sizeof(p1.address.postal)); + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL); + strops_copy(p1.address.country_code, "", sizeof(p1.address.country_code)); + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY|A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE); + + p1.type = contact_type::CONTACT_BUSINESS; + ASSERT_EQ(administration_contact_is_valid(p1), A_ERR_MISSING_NAME|A_ERR_MISSING_ADDRESS1|A_ERR_MISSING_CITY| + A_ERR_MISSING_POSTAL|A_ERR_MISSING_COUNTRYCODE|A_ERR_MISSING_TAXID|A_ERR_MISSING_BUSINESSID); + + PASS(); +} + + SUITE(administration_validate) { RUN_TEST(_administration_validate_project_add); RUN_TEST(_administration_validate_project_import); RUN_TEST(_administration_validate_project_update); RUN_TEST(_administration_validate_project_remove); RUN_TEST(_administration_validate_project_isvalid); + + RUN_TEST(_administration_validate_taxrate_add); + RUN_TEST(_administration_validate_taxrate_import); + RUN_TEST(_administration_validate_taxrate_update); + + RUN_TEST(_administration_validate_costcenter_add); + RUN_TEST(_administration_validate_costcenter_import); + RUN_TEST(_administration_validate_costcenter_update); + RUN_TEST(_administration_validate_costcenter_isvalid); + + RUN_TEST(_administration_validate_contact_add); + RUN_TEST(_administration_validate_contact_import); + RUN_TEST(_administration_validate_contact_update); + RUN_TEST(_administration_validate_contact_remove); + RUN_TEST(_administration_validate_contact_isvalid); }
\ No newline at end of file |
