summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/administration.hpp78
-rw-r--r--src/administration.cpp274
-rw-r--r--src/ui/ui_contacts.cpp4
-rw-r--r--src/ui/ui_expenses.cpp4
-rw-r--r--src/ui/ui_invoices.cpp4
-rw-r--r--src/ui/ui_projects.cpp2
-rw-r--r--src/ui/ui_settings.cpp8
-rw-r--r--tests/administration_rw_tests.cpp8
-rw-r--r--tests/administration_validation_tests.cpp331
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, &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()
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