// Author: Ricardas Stoma // Company: Kolmisoft // Year: 2022 // About: Script sends Flat-Rate notification emails #define _GNU_SOURCE #define SCRIPT_VERSION "1.0" #define SCRIPT_NAME "m2_flatrate_notifications" #include "m2_functions.c" typedef struct flatrates_struct { int flatrate_id; int subscription_id; int flatrate_data_id; int user_id; int notify_customer_minutes_used; int total_seconds; int seconds_used; int notify_customer_email_id; char user_email[200]; } flatrates_t; flatrates_t *flatrates = NULL; int flatrates_count = 0; int find_flatrates_to_report(); int get_email_text(int template_id, char *email_body); int main(int argc, char *argv[]) { // Starting sript m2_init("Starting M2 Flat-Rate Notifications script\n"); // Find flatrates that should be reported to user based on minutes used if (find_flatrates_to_report()) { exit(1); } if (flatrates_count) { int i = 0; for (i = 0; i < flatrates_count; i++) { char email_body[5000] = ""; char response[1000] = ""; m2_log("Flatrate_id: %d, subscription_id: %d, flatrate_data_id: %d, user_id: %d, notify_when_minutes_used: %d (%d seconds), " "total_seconds: %d, seconds_used: %d, email_id: %d, user_email: %s\n", flatrates[i].flatrate_id, flatrates[i].subscription_id, flatrates[i].flatrate_data_id, flatrates[i].user_id, flatrates[i].notify_customer_minutes_used, flatrates[i].notify_customer_minutes_used * 60, flatrates[i].total_seconds, flatrates[i].seconds_used, flatrates[i].notify_customer_email_id, flatrates[i].user_email); if (!strlen(flatrates[i].user_email)) { m2_log("Can't send email to user [%d] because email is empty\n", flatrates[i].user_id); continue; } if (flatrates[i].notify_customer_email_id <= 0) { m2_log("Can't send email to user [%d] because email id invalid\n", flatrates[i].user_id); continue; } if (get_email_text(flatrates[i].notify_customer_email_id, email_body)) { exit(1); } if (!strlen(email_body)) { m2_log("Can't send email to user [%d] because email text is empty\n", flatrates[i].user_id); continue; } m2_log("Sending Flat-Rates notification email to user [%d] at %s\n", flatrates[i].user_id, flatrates[i].user_email); if (m2_send_email(NULL, flatrates[i].user_email, NULL, email_body, NULL, 0, flatrates[i].notify_customer_email_id, "core_flat_rates", 0, response)) { m2_log("Failed to send email: %s\n", response); } else { char query[1000] = ""; m2_log("Email sent successfully\n"); sprintf(query, "UPDATE flat_rate_data SET email_sent = 1 WHERE id = %d", flatrates[i].flatrate_data_id); if (m2_mysql_query(query)) { exit(1); } } } } else { m2_log("Nothing to report\n"); } m2_log("Script completed\n"); return 0; } /* Find flatrates that should be reported to user based on minutes used */ int find_flatrates_to_report() { MYSQL_RES *result; MYSQL_ROW row; // Get flatrates that should be reported if (m2_mysql_query( "SELECT " "A.id, B.id, C.id, C.notify_customer_minutes_used, A.total_seconds, A.seconds_used, C.notify_customer_email_id, B.user_id, D.main_email " "FROM " "flat_rate_data AS A " "JOIN " "subscriptions AS B ON A.subscription_id = B.id " "JOIN " "flat_rates AS C ON C.id = 1 " "JOIN " "users AS D ON D.id = B.user_id " "WHERE " "NOW() BETWEEN A.period_start AND A.period_end " "AND A.email_sent = 0 " "AND notify_customer = 1 " "AND notify_customer_email_id > 0 " "AND notify_customer_minutes_used > 0 " "AND seconds_used >= (C.notify_customer_minutes_used * 60) " "GROUP BY " "A.subscription_id " "ORDER BY " "A.subscription_id")) { return 1; } result = mysql_store_result(&mysql); if (result) { while (( row = mysql_fetch_row(result) )) { flatrates = realloc(flatrates, (flatrates_count + 1) * sizeof(flatrates_t)); memset(&flatrates[flatrates_count], 0, sizeof(flatrates_t)); if (row[0]) flatrates[flatrates_count].flatrate_data_id = atoi(row[0]); else flatrates[flatrates_count].flatrate_data_id = 0; if (row[1]) flatrates[flatrates_count].subscription_id = atoi(row[1]); else flatrates[flatrates_count].subscription_id = 0; if (row[2]) flatrates[flatrates_count].flatrate_id = atoi(row[2]); else flatrates[flatrates_count].flatrate_id = 0; if (row[3]) flatrates[flatrates_count].notify_customer_minutes_used = atoi(row[3]); else flatrates[flatrates_count].notify_customer_minutes_used = 0; if (row[4]) flatrates[flatrates_count].total_seconds = atoi(row[4]); else flatrates[flatrates_count].total_seconds = 0; if (row[5]) flatrates[flatrates_count].seconds_used = atoi(row[5]); else flatrates[flatrates_count].seconds_used = 0; if (row[6]) flatrates[flatrates_count].notify_customer_email_id = atoi(row[6]); else flatrates[flatrates_count].notify_customer_email_id = 0; if (row[7]) flatrates[flatrates_count].user_id = atoi(row[7]); else flatrates[flatrates_count].user_id = 0; if (row[8]) strcpy(flatrates[flatrates_count].user_email, row[8]); else strcpy(flatrates[flatrates_count].user_email, ""); flatrates_count++; } mysql_free_result(result); } return 0; } /* Get email test from email templates */ int get_email_text(int template_id, char *email_body) { MYSQL_RES *result; MYSQL_ROW row; char query[1000] = ""; sprintf(query, "SELECT body FROM emails WHERE id = %d", template_id); if (m2_mysql_query(query)) { return 1; } result = mysql_store_result(&mysql); if (result) { while (( row = mysql_fetch_row(result) )) { if (row[0]) strcpy(email_body, row[0]); else strcpy(email_body, ""); } mysql_free_result(result); } return 0; }