typedef struct daily_calls_struct { char date[20]; int calls; int rechecked; } daily_calls_t; daily_calls_t *daily_calls = NULL; int daily_calls_count = 0; typedef struct users_struct { int id; char name[256]; char nice_name[256]; char currency[256]; char created_at[256]; char created_at_user_time[256]; double exchange_rate; int invoice_grace_period; int billing_period; char timezone[256]; float timezone_offset; char period_start[20]; char server_period_start[20]; char period_end[20]; char server_period_end[20]; char user_date[20]; char due_date[20]; char address[256]; char city[256]; char postcode[256]; char state[256]; char phone[256]; char invoice_number[256]; char vat_number[256]; int direction_id; int tax_compound; int tax1; int tax2; int tax3; int tax4; double tax1_value; double tax2_value; double tax3_value; double tax4_value; double server_offset_at_user_created_date; double user_offset_at_user_created_date; int skip; int skip_control; int zero_price_invoice; long long int invoice_id; } users_t; users_t *users = NULL; int users_count = 0; typedef struct invoice_details { double price; double price_with_tax; double rate; int billsec; char prefix[256]; int user_id; int calls; char name[256]; int subscription_id; int did_id; } invoice_details_t; invoice_details_t *invoice_details = NULL; int invoice_details_count = 0; typedef struct timezones_struct { char zone[256]; float offset; } timezones_t; timezones_t tz[34]; int tz_count = 34; float server_offset = 0; typedef struct invoices { int user_id; long long int id; int zero_price; char period_start[20]; char period_end[20]; } invoices_t; invoices_t *invoices = NULL; int invoices_count = 0; int new_invoice = 0; struct MemoryStruct { char *memory; size_t size; }; // recalculate int recalculate = 0; char recalculate_from[20] = ""; char recalculate_till[20] = ""; invoices_t *recalculate_invoices = NULL; int recalculate_invoices_count = 0; // generate invoices int generate_invoices_manually = 0; char generate_date_from[20] = ""; char generate_date_till[20] = ""; char generate_issue_date[20] = ""; int generate_user_id = 0; int do_not_generate_invoices_for_blocked_users = 0; int owner_id = 0; int responsible_manager = 0; // invoice number int invoice_number_type = 1; int invoice_number_length = 0; unsigned long long int invoice_last_number = 1; char invoice_number_start[32] = ""; char invoice_last_number_str[64] = ""; int wait_time = 6; char current_date[20] = ""; int show_invoice_lines = 0; int current_day_es_db_check_is_ok = 1; int action_log_reported = 0; char confline_date_format[20] = ""; // web variables char web_dir[256] = ""; char web_url[256] = ""; // background tasks int task_failed = 0; // ES fields int es_did_field_exists = 0; int get_users_data(int user_id); void define_timezones(); int compare_dates(const char *date1, const char *date2, int mode); int check_completed_invoices(); int insert_new_invoices(int index); int get_data(int index); void get_server_gmt_offset(); int insert_invoice_lines(long long int invoice_id); int check_missing_invoices(); void adjust_to_target_time(char *date, char *buffer, float offset, int target); void adjust_to_target_time_with_tz_handle(char *date, char *buffer, float offset, int target); int get_last_datetime_of_month(char *date, char *buffer, int current_month); int get_first_calldates(); int check_if_user_has_calls(); time_t get_timestamp(char *date); void timestamp_to_string(time_t timestamp, char *date); void get_time_periods_sql(char *user_start_time, char *user_end_time, char *time_periods_sql); int get_date_param(char *date, int param); void calculate_due_date(char *date, char *grace_period, int days); int get_invoice_settings(); void generate_invoice_number(users_t *user); int check_invoice_report(); int get_recalculate_invoices(); int delete_invoicedetails(long long int invoice_id); double get_server_gmt_offset_date(char *date); double get_timezone_offset_for_date(char *date, char *timezone); int my_strlen_utf8_c(char *s); int is_elasticsearch_installed(); size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp); void get_destination_name_by_prefix(char *prefix, char *name); void format_calldate_to_es(char *calldate, char *new_calldate); int get_calls_from_elasticsearch(int index); void check_responsible_manager(int user_id); void error_handle(); int check_es_data_integrity(char *start_date, char *end_date); long long int get_calls_count_from_elasticsearch(char *start_date, char *end_date); void adjust_es_check_time(char *start_date, char *end_date, char *new_start_date, char *new_end_date); int get_daily_calls(char *date, int recheck); long long int get_calls_count_from_db_cached(char *start_date, char *end_date, int recheck); int check_es_db_consistency_for_today(); int get_confline_date_format(); int check_es_fields(); void get_did_by_id(int id, char *did);