#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; #define CURRENCY_LENGTH 8 typedef struct { char id[16]; char invoice_id[16]; float amount; bool amount_is_percentage; char description[128]; float net_per_item; float discount; bool discount_is_percentage; float net; char currency[CURRENCY_LENGTH]; char tax_bracket_id[16]; // todo char tax_section[16]; float tax; float total; bool is_intra_community; bool is_triangulation; 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; float total; float tax; float net; invoice_status status; char currency[CURRENCY_LENGTH]; time_t payment_on_account_date; // TODO char tax_representative[64]; // TODO char corrected_sequential_number[16]; // TODO // Not stored. contact supplier; contact customer; } invoice; typedef struct { // Company info used for invoices. User should not be able to create invoices when this is empty. 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); u32 administration_get_tax_brackets_for_country(country_tax_bracket* buffer, char* country_code); 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(); void administration_invoice_set_currency(invoice* invoice, char* currency); billing_item administration_create_empty_billing_item(); u32 administration_get_all_billing_items_for_invoice(invoice* invoice, billing_item* buffer); u32 administration_get_billing_items_count(invoice* invoice); bool administration_add_billing_item_to_invoice(invoice* invoice, billing_item item); bool administration_update_billing_item_of_invoice(invoice* invoice, billing_item item);