summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/administration.cpp b/src/administration.cpp
index 245809b..4d8233e 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -760,7 +760,7 @@ bool administration_billing_item_add_to_invoice(invoice* invoice, billing_item i
snprintf(tb->id, sizeof(tb->id), "B/%d", administration_create_id());
strops_copy(tb->invoice_id, invoice->id, sizeof(tb->invoice_id));
list_append(&invoice->billing_items, tb);
- strops_copy(tb->currency, invoice->currency, CURRENCY_LENGTH); // Set billing item currency to invoice currency.
+ strops_copy(tb->currency, invoice->currency, MAX_LEN_CURRENCY); // Set billing item currency to invoice currency.
g_administration.next_id++;
@@ -817,7 +817,7 @@ invoice administration_invoice_create_empty()
result.delivered_at = time(NULL);
result.expires_at = time(NULL) + administration_get_default_invoice_expire_duration();
list_init(&result.billing_items); // @leak
- strops_copy(result.currency, administration_get_default_currency_for_country(g_administration.company_info.address.country_code), CURRENCY_LENGTH);
+ strops_copy(result.currency, administration_get_default_currency_for_country(g_administration.company_info.address.country_code), MAX_LEN_CURRENCY);
return result;
}
@@ -944,13 +944,13 @@ bool administration_billing_item_update_in_invoice(invoice* invoice, billing_ite
void administration_invoice_set_currency(invoice* invoice, char* currency)
{
- strops_copy(invoice->currency, currency, CURRENCY_LENGTH);
+ strops_copy(invoice->currency, currency, MAX_LEN_CURRENCY);
list_iterator_start(&invoice->billing_items);
while (list_iterator_hasnext(&invoice->billing_items)) {
billing_item* c = (billing_item *)list_iterator_next(&invoice->billing_items);
- strops_copy(c->currency, currency, CURRENCY_LENGTH);
+ strops_copy(c->currency, currency, MAX_LEN_CURRENCY);
}
list_iterator_stop(&invoice->billing_items);
}
@@ -1003,6 +1003,27 @@ bool administration_invoice_update(invoice* inv)
return false;
}
+invoice administration_invoice_create_copy(invoice* inv)
+{
+ invoice new_inv = administration_invoice_create_empty();
+ list_t billing_items = new_inv.billing_items;
+
+ memcpy((void*)&new_inv, (void*)inv, sizeof(invoice));
+ new_inv.billing_items = billing_items;
+
+ list_iterator_start(&inv->billing_items);
+ while (list_iterator_hasnext(&inv->billing_items)) {
+ billing_item* c = (billing_item *)list_iterator_next(&inv->billing_items);
+
+ billing_item* item_copy = (billing_item*)malloc(sizeof(billing_item));
+ memcpy(item_copy, c, sizeof(billing_item));
+ list_append(&new_inv.billing_items, item_copy);
+ }
+ list_iterator_stop(&inv->billing_items);
+
+ return new_inv;
+}
+
bool administration_invoice_add(invoice* inv)
{
if (!administration_invoice_is_valid(inv)) return false;
@@ -1026,9 +1047,10 @@ bool administration_invoice_add(invoice* inv)
memcpy(&inv->addressee, &inv->customer, sizeof(contact));
}
+ invoice copy = administration_invoice_create_copy(inv); // Create copy to make copy of billing item list.
invoice* new_inv = (invoice*)malloc(sizeof(invoice));
- memcpy((void*)new_inv, (void*)inv, sizeof(invoice));
-
+ memcpy(new_inv, &copy, sizeof(invoice));
+
new_inv->status = invoice_status::INVOICE_CONCEPT;
list_append(&g_administration.invoices, new_inv);
@@ -1047,9 +1069,7 @@ u32 administration_invoice_count()
u32 administration_invoice_get_partial_list(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);