summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-08-16 13:56:11 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-08-16 13:56:11 +0200
commit6273aef9aa9a4ac5375710d51a5bc33f62265d76 (patch)
treec20f5896a9820229171d134200e975dd4c34c549 /src/administration.cpp
parent12afa4c63e642452676f77830ec0383a6132883e (diff)
invoice table view
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp95
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