summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp92
1 files changed, 82 insertions, 10 deletions
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, &copy, 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, &copy, 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;