diff options
Diffstat (limited to 'src/administration.cpp')
| -rw-r--r-- | src/administration.cpp | 79 |
1 files changed, 77 insertions, 2 deletions
diff --git a/src/administration.cpp b/src/administration.cpp index 2e16775..6ed7d63 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -268,6 +268,8 @@ static void administration_create_debug_data() strops_copy(g_administration.company_info.address.address1, "Keerderstraat 81", sizeof(g_administration.company_info.address.address1)); strops_copy(g_administration.company_info.address.address2, "6226XW Maastricht", sizeof(g_administration.company_info.address.address2)); strops_copy(g_administration.company_info.address.country_code, "NL", sizeof(g_administration.company_info.address.country_code)); + strops_copy(g_administration.company_info.taxid, "123", sizeof(g_administration.company_info.taxid)); + strops_copy(g_administration.company_info.businessid, "123", sizeof(g_administration.company_info.businessid)); } void administration_create() @@ -275,6 +277,7 @@ void administration_create() g_administration.next_id = 1; g_administration.next_sequence_number = 1; + list_init(&g_administration.invoices); list_init(&g_administration.contacts); list_init(&g_administration.projects); list_init(&g_administration.tax_brackets); @@ -291,6 +294,7 @@ void administration_create() void administration_destroy() { + list_destroy(&g_administration.invoices); list_destroy(&g_administration.contacts); list_destroy(&g_administration.projects); list_destroy(&g_administration.tax_brackets); @@ -835,6 +839,23 @@ static bool administration_get_tax_bracket_by_id(country_tax_bracket* buffer, ch return false; } +static void administration_recalculate_invoice_totals(invoice* invoice) +{ + invoice->tax = 0.0f; + invoice->total = 0.0f; + invoice->net = 0.0f; + + list_iterator_start(&invoice->billing_items); + while (list_iterator_hasnext(&invoice->billing_items)) { + billing_item* c = (billing_item *)list_iterator_next(&invoice->billing_items); + + invoice->tax += c->tax; + invoice->total += c->total; + invoice->net += c->net; + } + list_iterator_stop(&invoice->billing_items); +} + static void administration_recalculate_billing_item_totals(billing_item* item) { if (item->amount_is_percentage) @@ -867,6 +888,23 @@ static void administration_recalculate_billing_item_totals(billing_item* item) item->total = item->net + item->tax; } +bool administration_remove_billing_item_from_invoice(invoice* invoice, billing_item item) +{ + list_iterator_start(&invoice->billing_items); + while (list_iterator_hasnext(&invoice->billing_items)) { + billing_item* c = (billing_item *)list_iterator_next(&invoice->billing_items); + + if (strcmp(c->id, item.id) == 0) { + list_iterator_stop(&invoice->billing_items); + list_delete(&invoice->billing_items, c); + return true; + } + } + list_iterator_stop(&invoice->billing_items); + + return false; +} + bool administration_update_billing_item_of_invoice(invoice* invoice, billing_item item) { list_iterator_start(&invoice->billing_items); @@ -874,9 +912,11 @@ bool administration_update_billing_item_of_invoice(invoice* invoice, billing_ite billing_item* c = (billing_item *)list_iterator_next(&invoice->billing_items); if (strcmp(c->id, item.id) == 0) { - memcpy(c, &item, sizeof(billing_item)); - administration_recalculate_billing_item_totals(c); + memcpy(c, &item, sizeof(billing_item)); list_iterator_stop(&invoice->billing_items); + + administration_recalculate_billing_item_totals(c); + administration_recalculate_invoice_totals(invoice); return true; } } @@ -896,4 +936,39 @@ void administration_invoice_set_currency(invoice* invoice, char* currency) strops_copy(c->currency, currency, CURRENCY_LENGTH); } list_iterator_stop(&invoice->billing_items); +} + +bool administration_is_invoice_valid(invoice* invoice) +{ + if (list_size(&invoice->billing_items) == 0) return false; + if (invoice->is_triangulation && !administration_is_contact_valid(invoice->addressee)) return false; + if (!administration_is_contact_valid(invoice->customer)) return false; + if (!administration_is_contact_valid(invoice->supplier)) return false; + + return true; +} + +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, "")) + { + contact new_contact = administration_create_empty_contact(); + strops_copy(inv->customer.id, new_contact.id, sizeof(new_contact.id)); + + memcpy(&new_contact, &inv->customer, sizeof(contact)); + administration_create_contact(new_contact); + } + + invoice* new_inv = (invoice*)malloc(sizeof(invoice)); + memcpy((void*)new_inv, (void*)inv, sizeof(invoice)); + + list_append(&g_administration.invoices, new_inv); + + g_administration.next_id++; + g_administration.next_sequence_number++; + + return true; }
\ No newline at end of file |
