From 051666a90b2c4779efdc8cfb49ab7316c94b58b0 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Sun, 21 Sep 2025 20:37:34 +0200 Subject: peppol file importing + invoice rw tests --- src/administration.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 10 deletions(-) (limited to 'src/administration.cpp') diff --git a/src/administration.cpp b/src/administration.cpp index 690fcd9..a21c70f 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -1012,7 +1012,7 @@ a_err administration_contact_get_by_id(contact* buffer, char* id) contact c = *(contact *)list_iterator_next(&g_administration.contacts); if (strcmp(c.id, id) == 0) { - list_iterator_stop(&g_administration.projects); + list_iterator_stop(&g_administration.contacts); *buffer = c; result = A_ERR_SUCCESS; } @@ -1579,8 +1579,10 @@ invoice administration_invoice_create_empty() snprintf(result.id, sizeof(result.id), "I/%d", administration_create_id()); snprintf(result.sequential_number, sizeof(result.id), "INV%010d", administration_create_sequence_number()); result.issued_at = time(NULL); - result.delivered_at = time(NULL); - result.expires_at = time(NULL) + administration_get_default_invoice_expire_duration(); + result.issued_at -= (result.issued_at % 86400); + + result.delivered_at = result.issued_at; + result.expires_at = result.issued_at + 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), MAX_LEN_CURRENCY); return result; @@ -1767,12 +1769,20 @@ a_err administration_invoice_update(invoice* inv) return A_ERR_NOT_FOUND; } -a_err administration_invoice_add(invoice* inv) +a_err administration_invoice_import(invoice* inv) { a_err result = administration_invoice_is_valid(inv); if (result != A_ERR_SUCCESS) return result; - administration_invoice_set_refs(inv); + if (!inv->is_triangulation) + { + memcpy(&inv->addressee, &inv->customer, sizeof(contact)); + } + + inv->issued_at -= (inv->issued_at % 86400); + inv->delivered_at -= (inv->delivered_at % 86400); + inv->expires_at -= (inv->expires_at % 86400); + inv->is_outgoing = strcmp(inv->supplier.id, MY_COMPANY_ID) == 0; invoice copy = administration_invoice_create_copy(inv); // Create copy to make copy of billing item list. invoice* new_inv = (invoice*)malloc(sizeof(invoice)); @@ -1780,11 +1790,36 @@ a_err administration_invoice_add(invoice* inv) memcpy(new_inv, ©, sizeof(invoice)); - new_inv->payment_means.payment_method = PAYMENT_METHOD_STANDING_AGREEMENT; - strops_copy(new_inv->payment_means.payee_bank_account, inv->customer.bank_account, sizeof(new_inv->payment_means.payee_bank_account)); - strops_copy(new_inv->payment_means.payee_account_name, inv->customer.name, sizeof(new_inv->payment_means.payee_account_name)); - strops_copy(new_inv->payment_means.service_provider_id, "", sizeof(new_inv->payment_means.service_provider_id)); - strops_copy(new_inv->payment_means.payer_bank_account, inv->supplier.bank_account, sizeof(new_inv->payment_means.payer_bank_account)); + if (!list_append(&g_administration.invoices, new_inv)) { + return A_ERR_GENERIC; + } + + return A_ERR_SUCCESS; +} + +a_err administration_invoice_add(invoice* inv) +{ + a_err result = administration_invoice_is_valid(inv); + if (result != A_ERR_SUCCESS) return result; + + administration_invoice_set_refs(inv); + + inv->issued_at -= (inv->issued_at % 86400); + inv->delivered_at -= (inv->delivered_at % 86400); + inv->expires_at -= (inv->expires_at % 86400); + inv->is_outgoing = strcmp(inv->supplier.id, MY_COMPANY_ID) == 0; + + inv->payment_means.payment_method = PAYMENT_METHOD_STANDING_AGREEMENT; + strops_copy(inv->payment_means.payee_bank_account, inv->customer.bank_account, sizeof(inv->payment_means.payee_bank_account)); + strops_copy(inv->payment_means.payee_account_name, inv->customer.name, sizeof(inv->payment_means.payee_account_name)); + strops_copy(inv->payment_means.service_provider_id, "", sizeof(inv->payment_means.service_provider_id)); + strops_copy(inv->payment_means.payer_bank_account, inv->supplier.bank_account, sizeof(inv->payment_means.payer_bank_account)); + + invoice copy = administration_invoice_create_copy(inv); // Create copy to make copy of billing item list. + invoice* new_inv = (invoice*)malloc(sizeof(invoice)); + if (!new_inv) return A_ERR_GENERIC; + + memcpy(new_inv, ©, sizeof(invoice)); if (!list_append(&g_administration.invoices, new_inv)) { return A_ERR_GENERIC; @@ -1838,6 +1873,24 @@ u32 administration_invoice_get_outgoing_count() return g_administration.invoice_count; } +a_err administration_invoice_get_by_id(invoice* buffer, char* id) +{ + a_err result = A_ERR_NOT_FOUND; + 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, id) == 0) { + list_iterator_stop(&g_administration.invoices); + *buffer = c; + result = A_ERR_SUCCESS; + } + } + list_iterator_stop(&g_administration.invoices); + + return result; +} + u32 administration_invoice_get_all(invoice* buffer) { assert(buffer); @@ -2065,6 +2118,25 @@ a_err administration_billing_item_is_valid(billing_item item) return result; } +a_err administration_billing_item_import_to_invoice(invoice* invoice, billing_item item) +{ + if (administration_billing_item_count(invoice) >= MAX_BILLING_ITEMS) return A_ERR_MAX_ITEMS_REACHED; + + billing_item* tb = (billing_item*)malloc(sizeof(billing_item)); + if (!tb) return A_ERR_GENERIC; + + memcpy(tb, &item, sizeof(billing_item)); + + administration_recalculate_billing_item_totals(tb); + administration_recalculate_invoice_totals(invoice); + + if (!list_append(&invoice->billing_items, tb)) { + return A_ERR_GENERIC; + } + + return A_ERR_SUCCESS; +} + a_err administration_billing_item_add_to_invoice(invoice* invoice, billing_item item) { if (administration_billing_item_count(invoice) >= MAX_BILLING_ITEMS) return A_ERR_MAX_ITEMS_REACHED; -- cgit v1.2.3-70-g09d2