#pragma once #include "config.hpp" #include "simclist.h" typedef struct { char id[16]; char country_code[3]; float rate; // 0-100 char description[32]; } country_tax_bracket; typedef struct { char id[16]; char code[5]; char description[64]; } cost_center; typedef struct { char address1[128]; char address2[128]; char country_code[3]; // 2 letter country code. } address; typedef enum { CONTACT_BUSINESS, CONTACT_CONSUMER, } contact_type; typedef struct { char id[16]; char name[64]; address address; contact_type type; char taxid[32]; char businessid[32]; char email[64]; char phone_number[16]; char bank_account[32]; } contact; typedef enum { PROJECT_RUNNING, PROJECT_PAUSED, PROJECT_CANCELLED, } project_state; typedef struct { char id[16]; char description[64]; project_state state; time_t start_date; time_t end_date; } project; typedef enum { INVOICE_PAID, INVOICE_EXPIRED, INVOICE_CANCELLED, INVOICE_REFUNDED, INVOICE_CORRECTED, } invoice_status; typedef struct { char id[16]; char invoice_id[16]; char description[128]; country_tax_bracket tax_bracket; char tax_section[16]; float amount; bool amount_is_percentage; s32 net_per_item; s32 net; s32 discount; s32 tax; bool is_intra_community; bool is_triangulation; char currency[16]; char internal_code[64]; } billing_item; typedef struct { char id[16]; char sequential_number[16]; // INV0000000000 - INV9999999999 char customer_id[16]; char supplier_id[16]; address shipping_address; time_t issued_at; time_t expires_at; time_t delivered_at; char document[255]; // path to copy of document for incomming invoice. char project_id[16]; char cost_center_id[16]; list_t billing_items; s32 total; s32 tax; s32 net; invoice_status status; char currency[8]; time_t keep_untill; time_t payment_on_account_date; char tax_representative[64]; char corrected_sequential_number[16]; // Not stored. contact supplier; contact customer; } invoice; typedef struct { contact company_info; s32 next_id; // Shared across all objects that have an ID. s32 next_sequence_number; // Sequence number for generating invoice numbers. char path[4096]; char program_version[10]; list_t contacts; list_t projects; list_t invoices; list_t tax_brackets; list_t cost_centers; } administration; void administration_create(); void administration_destroy(); char* administration_get_file_path(); contact administration_get_company_info(); void administration_set_company_info(contact data); bool administration_can_contact_be_deleted(contact data); bool administration_remove_contact(contact data); bool administration_create_contact(contact data); bool administration_update_contact(contact data); u32 administration_get_contact_count(); u32 administration_get_contacts(u32 page_index, u32 page_size, contact* buffer); contact administration_create_empty_contact(); bool administration_is_contact_valid(contact data); int administration_get_contact_recommendations(contact* buffer, int buf_size, char* name); void administration_cancel_project(project data); bool administration_remove_project(project data); bool administration_create_project(project data); bool administration_update_project(project data); char* administration_project_get_status_string(project data); u32 administration_get_project_count(); u32 administration_get_projects(u32 page_index, u32 page_size, project* buffer); bool administration_is_project_valid(project data); project administration_create_empty_project(); u32 administration_get_all_projects(project* buffer); u32 administration_get_tax_bracket_count(); u32 administration_get_tax_brackets(country_tax_bracket* buffer); bool administration_add_tax_bracket(country_tax_bracket data); bool administration_update_tax_bracket(country_tax_bracket data); u32 administration_get_cost_center_count(); u32 administration_get_cost_centers(cost_center* buffer); bool administration_verify_cost_center_code(char* code); bool administration_verify_cost_center_description(char* text); bool administration_add_cost_center(cost_center data); bool administration_update_cost_center(cost_center data); invoice administration_create_empty_invoice();