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