diff options
Diffstat (limited to 'src/administration.cpp')
| -rw-r--r-- | src/administration.cpp | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/src/administration.cpp b/src/administration.cpp index 6ed7d63..95ae705 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -480,6 +480,23 @@ bool administration_is_project_valid(project data) return strlen(data.description) > 0; } +char* administration_get_invoice_status_string(invoice* invoice) +{ + switch(invoice->status) + { + case invoice_status::INVOICE_CONCEPT: return "invoice.state.concept"; + case invoice_status::INVOICE_SENT: return "invoice.state.sent"; + case invoice_status::INVOICE_REMINDED: return "invoice.state.reminded"; + case invoice_status::INVOICE_PAID: return "invoice.state.paid"; + case invoice_status::INVOICE_EXPIRED: return "invoice.state.expired"; + case invoice_status::INVOICE_CANCELLED: return "invoice.state.cancelled"; + case invoice_status::INVOICE_REFUNDED: return "invoice.state.refunded"; + case invoice_status::INVOICE_CORRECTED: return "invoice.state.corrected"; + default: assert(0); break; + } + return ""; +} + char* administration_project_get_status_string(project data) { switch(data.state) @@ -948,27 +965,103 @@ bool administration_is_invoice_valid(invoice* invoice) return true; } +bool administration_update_invoice(invoice* inv) +{ + if (!administration_is_invoice_valid(inv)) return false; + + // Invoice is valid but customer id is unset means we need to register a new contact. + if (strcmp(inv->customer_id, "") == 0) + { + contact new_contact = administration_create_empty_contact(); + strops_copy(inv->customer_id, new_contact.id, sizeof(new_contact.id)); + strops_copy(inv->customer.id, new_contact.id, sizeof(new_contact.id)); + + memcpy(&new_contact, &inv->customer, sizeof(contact)); + administration_create_contact(new_contact); + + inv->customer = new_contact; + } + + // Addressee is same as customer. + if (!inv->is_triangulation) + { + memcpy(&inv->addressee, &inv->customer, sizeof(contact)); + } + + list_iterator_start(&g_administration.invoices); + while (list_iterator_hasnext(&g_administration.invoices)) { + invoice* c = (invoice *)list_iterator_next(&g_administration.invoices); + + if (strcmp(c->id, inv->id) == 0) + { + memcpy(c, inv, sizeof(invoice)); + list_iterator_stop(&g_administration.invoices); + return true; + } + } + list_iterator_stop(&g_administration.invoices); + return false; +} + bool administration_add_invoice(invoice* inv) { if (!administration_is_invoice_valid(inv)) return false; // Invoice is valid but customer id is unset means we need to register a new contact. - if (strcmp(inv->customer_id, "")) + if (strcmp(inv->customer_id, "") == 0) { contact new_contact = administration_create_empty_contact(); + strops_copy(inv->customer_id, new_contact.id, sizeof(new_contact.id)); strops_copy(inv->customer.id, new_contact.id, sizeof(new_contact.id)); memcpy(&new_contact, &inv->customer, sizeof(contact)); administration_create_contact(new_contact); + + inv->customer = new_contact; + } + + // Addressee is same as customer. + if (!inv->is_triangulation) + { + memcpy(&inv->addressee, &inv->customer, sizeof(contact)); } invoice* new_inv = (invoice*)malloc(sizeof(invoice)); memcpy((void*)new_inv, (void*)inv, sizeof(invoice)); + new_inv->status = invoice_status::INVOICE_CONCEPT; + list_append(&g_administration.invoices, new_inv); g_administration.next_id++; g_administration.next_sequence_number++; return true; +} + +u32 administration_get_invoice_count() +{ + return list_size(&g_administration.invoices); +} + +u32 administration_get_invoices(u32 page_index, u32 page_size, invoice* buffer) +{ + assert(buffer); + + u32 write_cursor = 0; + + u32 read_start = page_index * page_size; + + list_iterator_start(&g_administration.invoices); + while (list_iterator_hasnext(&g_administration.invoices)) { + invoice c = *(invoice *)list_iterator_next(&g_administration.invoices); + + if (g_administration.invoices.iter_pos <= read_start) continue; + + buffer[write_cursor++] = c; + if (write_cursor >= page_size) break; + } + list_iterator_stop(&g_administration.invoices); + + return write_cursor; }
\ No newline at end of file |
