summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/administration.cpp b/src/administration.cpp
index 66e4a46..45a1125 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -293,7 +293,6 @@ void administration_create()
g_administration.next_sequence_number = 1;
list_init(&g_administration.invoices);
- list_init(&g_administration.expenses);
list_init(&g_administration.contacts);
list_init(&g_administration.projects);
list_init(&g_administration.tax_brackets);
@@ -319,7 +318,6 @@ static void administration_destroy_list(list_t *list)
void administration_destroy()
{
administration_destroy_list(&g_administration.invoices);
- administration_destroy_list(&g_administration.expenses);
administration_destroy_list(&g_administration.contacts);
administration_destroy_list(&g_administration.projects);
administration_destroy_list(&g_administration.tax_brackets);
@@ -927,6 +925,19 @@ bool administration_invoice_update(invoice* inv)
inv->customer = new_contact;
}
+ // Supplier is valid but supplier id is unset means we need to register a new contact.
+ if (strcmp(inv->supplier_id, "") == 0)
+ {
+ contact new_contact = administration_contact_create_empty();
+ strops_copy(inv->supplier_id, new_contact.id, sizeof(new_contact.id));
+ strops_copy(inv->supplier.id, new_contact.id, sizeof(new_contact.id));
+
+ memcpy(&new_contact, &inv->supplier, sizeof(contact));
+ administration_contact_add(new_contact);
+
+ inv->supplier = new_contact;
+ }
+
// Addressee is same as customer.
if (!inv->is_triangulation)
{
@@ -986,6 +997,19 @@ bool administration_invoice_add(invoice* inv)
inv->customer = new_contact;
}
+ // Supplier is valid but supplier id is unset means we need to register a new contact.
+ if (strcmp(inv->supplier_id, "") == 0)
+ {
+ contact new_contact = administration_contact_create_empty();
+ strops_copy(inv->supplier_id, new_contact.id, sizeof(new_contact.id));
+ strops_copy(inv->supplier.id, new_contact.id, sizeof(new_contact.id));
+
+ memcpy(&new_contact, &inv->supplier, sizeof(contact));
+ administration_contact_add(new_contact);
+
+ inv->supplier = new_contact;
+ }
+
// Addressee is same as customer.
if (!inv->is_triangulation)
{
@@ -995,8 +1019,6 @@ bool administration_invoice_add(invoice* inv)
invoice copy = administration_invoice_create_copy(inv); // Create copy to make copy of billing item list.
invoice* new_inv = (invoice*)malloc(sizeof(invoice));
memcpy(new_inv, &copy, sizeof(invoice));
-
- new_inv->status = invoice_status::INVOICE_CONCEPT;
list_append(&g_administration.invoices, new_inv);
@@ -1011,17 +1033,20 @@ u32 administration_invoice_count()
return list_size(&g_administration.invoices);
}
-u32 administration_invoice_get_partial_list(u32 page_index, u32 page_size, invoice* buffer)
+static u32 administration_invoice_get_partial_list(u32 page_index, u32 page_size, invoice* buffer, bool want_outgoing)
{
assert(buffer);
u32 write_cursor = 0;
u32 read_start = page_index * page_size;
+ u32 read_cursor = 0;
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;
+ if (c.is_outgoing != want_outgoing) continue; // Continue without incrementing read cursor
+ read_cursor++;
+ if (read_cursor <= read_start) continue;
buffer[write_cursor++] = c;
if (write_cursor >= page_size) break;
@@ -1031,6 +1056,16 @@ u32 administration_invoice_get_partial_list(u32 page_index, u32 page_size, invoi
return write_cursor;
}
+u32 administration_invoice_get_partial_list_outgoing(u32 page_index, u32 page_size, invoice* buffer)
+{
+ return administration_invoice_get_partial_list(page_index, page_size, buffer, 1);
+}
+
+u32 administration_invoice_get_partial_list_incomming(u32 page_index, u32 page_size, invoice* buffer)
+{
+ return administration_invoice_get_partial_list(page_index, page_size, buffer, 0);
+}
+
char* administration_invoice_get_status_string(invoice* invoice)
{
switch(invoice->status)
@@ -1043,6 +1078,7 @@ char* administration_invoice_get_status_string(invoice* invoice)
case invoice_status::INVOICE_CANCELLED: return "invoice.status.cancelled";
case invoice_status::INVOICE_REFUNDED: return "invoice.status.refunded";
case invoice_status::INVOICE_CORRECTED: return "invoice.status.corrected";
+ case invoice_status::INVOICE_RECEIVED: return "invoice.status.received";
default: assert(0); break;
}
return "";