summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/administration.cpp43
-rw-r--r--src/administration_reader.cpp4
-rw-r--r--src/administration_writer.cpp15
-rw-r--r--src/ui/ui_contacts.cpp20
-rw-r--r--src/ui/ui_expenses.cpp3
-rw-r--r--src/ui/ui_invoices.cpp3
6 files changed, 66 insertions, 22 deletions
diff --git a/src/administration.cpp b/src/administration.cpp
index b6dfcbb..af276f3 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -871,6 +871,18 @@ int administration_contact_get_autocompletions(contact* buffer, int buf_size, ch
return write_cursor;
}
+a_err administration_addressee_is_valid(delivery_info data)
+{
+ a_err result = A_ERR_SUCCESS;
+ if (strlen(data.name) == 0) result |= A_ERR_MISSING_NAME;
+ if (strlen(data.address.city) == 0) result |= A_ERR_MISSING_CITY;
+ if (strlen(data.address.postal) == 0) result |= A_ERR_MISSING_POSTAL;
+ if (strlen(data.address.address1) == 0) result |= A_ERR_MISSING_ADDRESS1;
+ if (strlen(data.address.country_code) == 0) result |= A_ERR_MISSING_COUNTRYCODE;
+
+ return result;
+}
+
a_err administration_contact_is_valid(contact data)
{
a_err result = A_ERR_SUCCESS;
@@ -879,7 +891,6 @@ a_err administration_contact_is_valid(contact data)
if (strlen(data.address.city) == 0) result |= A_ERR_MISSING_CITY;
if (strlen(data.address.postal) == 0) result |= A_ERR_MISSING_POSTAL;
if (strlen(data.address.address1) == 0) result |= A_ERR_MISSING_ADDRESS1;
- //if (strlen(data.address.address2) == 0) return 0;
if (strlen(data.address.country_code) == 0) result |= A_ERR_MISSING_COUNTRYCODE;
if (data.type == contact_type::CONTACT_BUSINESS)
@@ -1080,6 +1091,7 @@ project administration_project_create_empty()
memset(&result, 0, sizeof(project));
result.state = project_state::PROJECT_RUNNING;
result.start_date = time(NULL);
+ result.start_date -= (result.start_date % 86400);
result.end_date = 0;
snprintf(result.id, sizeof(result.id), "P/%d", administration_create_id());
return result;
@@ -1461,7 +1473,7 @@ a_err administration_invoice_is_valid(invoice* invoice)
{
a_err result = A_ERR_SUCCESS;
if (list_size(&invoice->billing_items) == 0) result |= A_ERR_MISSING_BILLING_ITEMS;
- if (invoice->is_triangulation && administration_contact_is_valid(invoice->addressee) != A_ERR_SUCCESS) result |= A_ERR_INVALID_ADDRESSEE;
+ if (invoice->is_triangulation && administration_addressee_is_valid(invoice->addressee) != A_ERR_SUCCESS) result |= A_ERR_INVALID_ADDRESSEE;
if (administration_contact_is_valid(invoice->customer) != A_ERR_SUCCESS) result |= A_ERR_INVALID_CUSTOMER;
if (administration_contact_is_valid(invoice->supplier) != A_ERR_SUCCESS) result |= A_ERR_INVALID_SUPPLIER;
@@ -1500,16 +1512,24 @@ a_err administration_invoice_remove(invoice* inv)
return A_ERR_NOT_FOUND;
}
+static void _administration_invoice_set_addressee(invoice* inv, contact contact)
+{
+ memcpy(&inv->addressee.name, &contact.name, sizeof(inv->addressee.name));
+ memcpy(&inv->addressee.address.address1, &contact.address.address1, sizeof(inv->addressee.address.address1));
+ memcpy(&inv->addressee.address.address2, &contact.address.address2, sizeof(inv->addressee.address.address2));
+ memcpy(&inv->addressee.address.city, &contact.address.city, sizeof(inv->addressee.address.city));
+ memcpy(&inv->addressee.address.postal, &contact.address.postal, sizeof(inv->addressee.address.postal));
+ memcpy(&inv->addressee.address.region, &contact.address.region, sizeof(inv->addressee.address.region));
+ memcpy(&inv->addressee.address.country_code, &contact.address.country_code, sizeof(inv->addressee.address.country_code));
+}
+
a_err administration_invoice_update(invoice* inv)
{
a_err result = administration_invoice_is_valid(inv);
if (result != A_ERR_SUCCESS) return result;
// Addressee is same as customer.
- if (!inv->is_triangulation)
- {
- memcpy(&inv->addressee, &inv->customer, sizeof(contact));
- }
+ if (!inv->is_triangulation) _administration_invoice_set_addressee(inv, inv->customer);
list_iterator_start(&g_administration.invoices);
while (list_iterator_hasnext(&g_administration.invoices)) {
@@ -1535,10 +1555,7 @@ a_err administration_invoice_import(invoice* inv)
a_err result = administration_invoice_is_valid(inv);
if (result != A_ERR_SUCCESS) return result;
- if (!inv->is_triangulation)
- {
- memcpy(&inv->addressee, &inv->customer, sizeof(contact));
- }
+ inv->is_triangulation = !(memcmp(&inv->addressee.address, &inv->customer.address, sizeof(address)) == 0);
inv->issued_at -= (inv->issued_at % 86400);
inv->delivered_at -= (inv->delivered_at % 86400);
@@ -1563,11 +1580,7 @@ a_err administration_invoice_add(invoice* inv)
a_err result = administration_invoice_is_valid(inv);
if (result != A_ERR_SUCCESS) return result;
- // Addressee is same as customer.
- if (!inv->is_triangulation)
- {
- memcpy(&inv->addressee, &inv->customer, sizeof(contact));
- }
+ if (!inv->is_triangulation) _administration_invoice_set_addressee(inv, inv->customer);
inv->issued_at -= (inv->issued_at % 86400);
inv->delivered_at -= (inv->delivered_at % 86400);
diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp
index 09a4a0a..bf8f8db 100644
--- a/src/administration_reader.cpp
+++ b/src/administration_reader.cpp
@@ -302,8 +302,8 @@ bool administration_reader_import_project(char* buffer, size_t buffer_size)
xml_get_str(root, data.id, MAX_LEN_ID, "Id");
xml_get_str(root, data.description, MAX_LEN_LONG_DESC, "Description");
data.state = (project_state)xml_get_s32(root, "State");
- data.start_date = xml_get_s64(root, "StartDate");
- data.end_date = xml_get_s64(root, "EndDate");
+ data.start_date = xml_get_date_x(root, "StartDate", 0);
+ data.end_date = xml_get_date_x(root, "EndDate", 0);
a_err result = administration_project_import(data);
if (result == A_ERR_SUCCESS) {
diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp
index c27b3e3..b08723b 100644
--- a/src/administration_writer.cpp
+++ b/src/administration_writer.cpp
@@ -522,11 +522,22 @@ bool administration_writer_save_project_blocking(project project)
int buf_length = 0;
char* file_content = administration_writer_copy_template(project_save_template, &buf_length);
+ struct tm *tm_info = 0;
+ char date_buffer[11]; // "YYYY-MM-DD" + null terminator
+
+
+
strops_replace(file_content, buf_length, "{{PROJECT_ID}}", project.id);
strops_replace(file_content, buf_length, "{{PROJECT_DESCRIPTION}}", project.description);
strops_replace_int32(file_content, buf_length, "{{PROJECT_STATE}}", project.state);
- strops_replace_int64(file_content, buf_length, "{{PROJECT_STARTDATE}}", (long long)project.start_date);
- strops_replace_int64(file_content, buf_length, "{{PROJECT_ENDDATE}}", (long long)project.end_date);
+
+ tm_info = gmtime(&project.start_date);
+ strftime(date_buffer, sizeof(date_buffer), "%Y-%m-%d", tm_info);
+ strops_replace(file_content, buf_length, "{{PROJECT_STARTDATE}}", date_buffer);
+
+ tm_info = gmtime(&project.end_date);
+ strftime(date_buffer, sizeof(date_buffer), "%Y-%m-%d", tm_info);
+ strops_replace(file_content, buf_length, "{{PROJECT_ENDDATE}}", date_buffer);
//// Write to Disk.
char final_path[50];
diff --git a/src/ui/ui_contacts.cpp b/src/ui/ui_contacts.cpp
index 549273d..fc03e84 100644
--- a/src/ui/ui_contacts.cpp
+++ b/src/ui/ui_contacts.cpp
@@ -48,6 +48,25 @@ void ui_setup_contacts()
memset(&selected_for_removal, 0, sizeof(contact));
}
+void draw_addressee_form_ex(delivery_info* buffer, bool viewing_only = false)
+{
+ a_err last_err = administration_addressee_is_valid(*buffer);
+
+ ImGui::PushID(buffer);
+
+ ImGui::Spacing();
+ ImGui::BeginDisabled();
+
+ if (!viewing_only) ImGui::EndDisabled();
+
+ ImGui::FormInputTextWithErrorHint(localize("contact.form.fullname"), buffer->name, IM_ARRAYSIZE(buffer->name), last_err & A_ERR_MISSING_NAME);
+
+ ui_draw_address_form(&buffer->address, last_err);
+
+ if (viewing_only) ImGui::EndDisabled();
+ ImGui::PopID();
+}
+
void draw_contact_form_ex(contact* buffer, bool viewing_only = false, bool with_autocomplete = false)
{
a_err last_err = administration_contact_is_valid(*buffer);
@@ -86,7 +105,6 @@ void draw_contact_form(contact* buffer, bool viewing_only = false)
draw_contact_form_ex(buffer, viewing_only, false);
}
-
static void draw_contact_list()
{
const u32 items_per_page = 50;
diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp
index 7dd5add..9094d30 100644
--- a/src/ui/ui_expenses.cpp
+++ b/src/ui/ui_expenses.cpp
@@ -34,6 +34,7 @@ static invoice selected_for_removal = {0};
static billing_item* invoice_items_buffer = 0;
+void draw_addressee_form_ex(delivery_info* buffer, bool viewing_only = false);
void draw_contact_form_ex(contact* buffer, bool viewing_only = false, bool with_autocomplete = false);
void draw_invoice_items_form(invoice* invoice);
@@ -91,7 +92,7 @@ static void draw_expense_form(invoice* buffer, bool viewing_only = false)
if (buffer->is_triangulation) {
ImGui::Spacing();
ImGui::Text(localize("invoice.form.shippinginformation"));
- draw_contact_form_ex(&buffer->addressee, 0,0);
+ draw_addressee_form_ex(&buffer->addressee, 0);
}
ImGui::Separator();
diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp
index 6c3e229..0ef3fb2 100644
--- a/src/ui/ui_invoices.cpp
+++ b/src/ui/ui_invoices.cpp
@@ -36,6 +36,7 @@ static invoice selected_for_removal = {0};
static billing_item* invoice_items_buffer = 0;
void draw_contact_form_ex(contact* buffer, bool viewing_only = false, bool with_autocomplete = false);
+void draw_addressee_form_ex(delivery_info* buffer, bool viewing_only = false);
void ui_destroy_invoices()
{
@@ -212,7 +213,7 @@ static void draw_invoice_form(invoice* buffer, bool viewing_only = false)
if (buffer->is_triangulation) {
ImGui::Spacing();
ImGui::Text(localize("invoice.form.shippinginformation"));
- draw_contact_form_ex(&buffer->addressee, 0,0);
+ draw_addressee_form_ex(&buffer->addressee, 0);
}
ImGui::Separator();