| Server IP : 13.126.101.145 / Your IP : 216.73.217.37 Web Server : Apache/2.4.52 (Ubuntu) System : Linux ip-11-115-0-196 6.8.0-1039-aws #41~22.04.1-Ubuntu SMP Thu Sep 11 10:54:48 UTC 2025 x86_64 User : www-data ( 33) PHP Version : 8.3.17 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/rentals_updated/wp-content/plugins/custom-email-enhance/ |
Upload File : |
<?php
/**
* Plugin Name: Custom Emails Enhance
* Description: Adds custom email notifications for quotations in WooCommerce
* Version: 3
* Author:iTrosys
* Developper : Bhaskara
* Requires at least: 5.0
* Requires PHP: 7.2
* WC requires at least: 3.0
* WC tested up to: 8.0
*/
if (!defined('ABSPATH')) exit;
define('CUSTOM_EMAIL_PATH', plugin_dir_path(__FILE__));
// Enhanced Debug logging function
function quotation_log($message, $type = 'debug') {
if (WP_DEBUG === true) {
$log_file = WP_CONTENT_DIR . '/debug.log';
$timestamp = current_time('mysql');
$formatted_message = "[{$timestamp}] [{$type}] ";
if (is_array($message) || is_object($message)) {
$formatted_message .= print_r($message, true);
} else {
$formatted_message .= $message;
}
error_log($formatted_message . PHP_EOL, 3, $log_file);
}
}
// Check WooCommerce and dependencies
function check_dependencies() {
if (!class_exists('WooCommerce')) {
quotation_log('WooCommerce not found', 'error');
return false;
}
if (!class_exists('WC_Email')) {
quotation_log('WC_Email class not found', 'error');
return false;
}
return true;
}
// Declare HPOS compatibility
function declare_hpos_compatibility() {
if (class_exists('\Automattic\WooCommerce\Utilities\FeaturesUtil')) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables', __FILE__, true);
}
}
add_action('before_woocommerce_init', 'declare_hpos_compatibility');
add_action('woocommerce_init', 'custom_email_includes');
function custom_email_includes() {
if (!check_dependencies()) {
return;
}
$quotation_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-quotation.php';
$rfq_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-rfq.php';
$agreement_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-agreement.php';
$fleet_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-fleet.php';
$status_change_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-status-change.php';
$sos_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-sos.php';
$used_enquiry_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-used-enquiry.php';
$contract_renewal_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-contract-renewal.php';
$sapid_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-sapid.php';
$invoice_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-invoice.php';
$modify_rfq_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-modifyrfq.php';
$discount_rfq_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-discountrfq.php';
$new_contract_class_path = CUSTOM_EMAIL_PATH . 'includes/class-wc-custom-email-new-contract.php';
if (file_exists($quotation_class_path)) {
require_once $quotation_class_path;
} else {
quotation_log("Quotation email class file not found at: {$quotation_class_path}", 'error');
}
if (file_exists($rfq_class_path)) {
require_once $rfq_class_path;
} else {
quotation_log("RFQ email class file not found at: {$rfq_class_path}", 'error');
}
if (file_exists($modify_rfq_class_path)) {
require_once $modify_rfq_class_path;
} else {
quotation_log("RFQ email class file not found at: {$modify_rfq_class_path}", 'error');
}
if (file_exists($discount_rfq_class_path)) {
require_once $discount_rfq_class_path;
} else {
quotation_log("RFQ email class file not found at: {$discount_rfq_class_path}", 'error');
}
if (file_exists($agreement_class_path)) {
require_once $agreement_class_path;
} else {
quotation_log("Agreement email class file not found at: {$agreement_class_path}", 'error');
}
if (file_exists($new_contract_class_path)) {
require_once $new_contract_class_path;
} else {
quotation_log("Agreement email class file not found at: {$new_contract_class_path}", 'error');
}
if (file_exists($fleet_class_path)) {
require_once $fleet_class_path;
} else {
quotation_log("Agreement email class file not found at: {$fleet_class_path}", 'error');
}
if (file_exists($status_change_class_path)) {
require_once $status_change_class_path;
} else {
quotation_log("Agreement email class file not found at: {$status_change_class_path}", 'error');
}
if (file_exists($sos_class_path)) {
require_once $sos_class_path;
} else {
quotation_log("Agreement email class file not found at: {$sos_class_path}", 'error');
}
if (file_exists($used_enquiry_class_path)) {
require_once $used_enquiry_class_path;
} else {
quotation_log("Used Enquiry email class file not found at: {$used_enquiry_class_path}", 'error');
}
if (file_exists($contract_renewal_class_path)) {
require_once $contract_renewal_class_path;
} else {
quotation_log("Contract Renewal email class file not found at: {$contract_renewal_class_path}", 'error');
}
if (file_exists($sapid_class_path)) {
require_once $sapid_class_path;
} else {
quotation_log("SAP ID email class file not found at: {$sapid_class_path}", 'error');
}
if (file_exists($invoice_class_path)) {
require_once $invoice_class_path;
} else {
quotation_log("invoice email class file not found at: {$invoice_class_path}", 'error');
}
}
function add_custom_email_classes($email_classes) {
if (!check_dependencies()) {
return $email_classes;
}
// Include files if not already included
if (!class_exists('WC_Custom_Email_Quotation') || !class_exists('WC_Custom_Email_Rfq') || !class_exists('WC_Custom_Email_Agg') || !class_exists('WC_Custom_Email_Fleet') || !class_exists('WC_Custom_Email_Status')) {
custom_email_includes();
}
// Add RFQ email class
if (class_exists('WC_Custom_Email_Rfq')) {
$email_classes['WC_Custom_Email_Rfq'] = new WC_Custom_Email_Rfq();
quotation_log('RFQ email class added successfully');
}
// Add Modify RFQ email class
if (class_exists('WC_Custom_Email_Modify_Rfq')) {
$email_classes['WC_Custom_Email_Modify_Rfq'] = new WC_Custom_Email_Modify_Rfq();
quotation_log('Modify RFQ email class added successfully');
}
// Add Quotation email class
if (class_exists('WC_Custom_Email_Quotation')) {
$email_classes['WC_Custom_Email_Quotation'] = new WC_Custom_Email_Quotation();
quotation_log('Quotation email class added successfully');
}
// Add Discount RFQ email class
if (class_exists('WC_Custom_Email_Discount_Rfq')) {
$email_classes['WC_Custom_Email_Discount_Rfq'] = new WC_Custom_Email_Discount_Rfq();
quotation_log('Discount RFQ email class added successfully');
}
// Add Agreement email class
if (class_exists('WC_Custom_Email_Agg')) {
$email_classes['WC_Custom_Email_Agg'] = new WC_Custom_Email_Agg();
quotation_log('Agreement email class added successfully');
}
// Add Agreement email class
if (class_exists('WC_Custom_Email_New_Contract')) {
$email_classes['WC_Custom_Email_New_Contract'] = new WC_Custom_Email_New_Contract();
quotation_log('New Contract email class added successfully');
}
// Add Status-Change email class
if (class_exists('WC_Custom_Email_Status')) {
$email_classes['WC_Custom_Email_Status'] = new WC_Custom_Email_Status();
quotation_log('Agreement email class added successfully');
}
// add Invoice email class
if (class_exists('WC_Custom_Email_Invoice')) {
$email_classes['WC_Custom_Email_Invoice'] = new WC_Custom_Email_Invoice();
quotation_log('Invoice email class added successfully');
}
// add contract Renewal email class
if (class_exists('WC_Custom_Email_Contract_Renewal')) {
$email_classes['WC_Custom_Email_Contract_Renewal'] = new WC_Custom_Email_Contract_Renewal();
quotation_log('Contract Renewal email class added successfully');
}
// add contract Renewal email class
if (class_exists('WC_Custom_Email_Sapid')) {
$email_classes['WC_Custom_Email_Sapid'] = new WC_Custom_Email_Sapid();
quotation_log('SAP ID email class added successfully');
}
// Add Fleet email class
if (class_exists('WC_Custom_Email_Fleet')) {
$email_classes['WC_Custom_Email_Fleet'] = new WC_Custom_Email_Fleet();
quotation_log('Agreement email class added successfully');
}
// Add SOS email class
// if (class_exists('WC_Custom_Email_Sos')) {
// $email_classes['WC_Custom_Email_Sos'] = new WC_Custom_Email_Sos();
// quotation_log('Agreement email class added successfully');
// }
// add Used Enquiry email class
if (class_exists('WC_Custom_Email_Used_Enquiry')) {
$email_classes['WC_Custom_Email_Used_Enquiry'] = new WC_Custom_Email_Used_Enquiry();
quotation_log('Agreement email class added successfully');
}
return $email_classes;
}
add_filter('woocommerce_email_classes', 'add_custom_email_classes', 20);
// Test email template loading for both templates
add_action('init', function() {
$quotation_template = CUSTOM_EMAIL_PATH . 'templates/emails/quotation-notification.php';
$rfq_template = CUSTOM_EMAIL_PATH . 'templates/emails/rfq-notification.php';
$agreement_template = CUSTOM_EMAIL_PATH . 'templates/emails/agreement-notification.php';
$fleet_template = CUSTOM_EMAIL_PATH . 'templates/emails/plain/fleet-notification.php';
$status_change_template = CUSTOM_EMAIL_PATH . 'templates/emails/status-change-notification.php';
$sos_template = CUSTOM_EMAIL_PATH . 'templates/emails/plain/sos-notification.php';
$used_enquiry_template = CUSTOM_EMAIL_PATH . 'templates/emails/used-enquiry-template.php';
$contract_renewal_template = CUSTOM_EMAIL_PATH . 'templates/emails/contract-renewal-template.php';
$sapid_template = CUSTOM_EMAIL_PATH . 'templates/emails/sapid-templet.php';
$invoice_template = CUSTOM_EMAIL_PATH . 'templates/emails/invoice-template.php';
$modify_rfq_template = CUSTOM_EMAIL_PATH . 'templates/emails/modify-rfq-template.php';
$discount_rfq_template = CUSTOM_EMAIL_PATH . 'templates/emails/discount-rfq-template.php';
$new_contract_template = CUSTOM_EMAIL_PATH . 'templates/emails/new-contract-template.php';
quotation_log('Quotation template exists: ' . (file_exists($quotation_template) ? 'yes' : 'no'));
quotation_log('RFQ template exists: ' . (file_exists($rfq_template) ? 'yes' : 'no'));
quotation_log('Agreement template exists: ' . (file_exists($agreement_template) ? 'yes' : 'no'));
quotation_log('Fleet template exists: ' . (file_exists($fleet_template) ? 'yes' : 'no'));
quotation_log('Status template exists: ' . (file_exists($status_change_template) ? 'yes' : 'no'));
quotation_log('SOS template exists: ' . (file_exists($sos_template) ? 'yes' : 'no'));
quotation_log('Used Enquiry template exists: ' . (file_exists($used_enquiry_template) ? 'yes' : 'no'));
quotation_log('Contract Renewal template exists: ' . (file_exists($contract_renewal_template) ? 'yes' : 'no'));
quotation_log('SAP ID template exists: ' . (file_exists($sapid_template) ? 'yes' : 'no'));
quotation_log('Invoice template exists: ' . (file_exists($invoice_template) ? 'yes' : 'no'));
quotation_log('Modify RFQ template exists: ' . (file_exists($modify_rfq_template) ? 'yes' : 'no'));
quotation_log('Discount RFQ template exists: ' . (file_exists($discount_rfq_template) ? 'yes' : 'no'));
quotation_log('New Contract template exists: ' . (file_exists($new_contract_template) ? 'yes' : 'no'));
});
//Test WooCommerce email integration:
add_action('woocommerce_init', function() {
$mailer = WC()->mailer();
$emails = $mailer->get_emails();
quotation_log('Available emails: ' . print_r(array_keys($emails), true));
});
// Add this new function to handle the AJAX request
function handle_send_quotation_email() {
check_ajax_referer('send_quotation_email_nonce', 'nonce');
$quotation_id = isset($_POST['quotation_id']) ? intval($_POST['quotation_id']) : 0;
if (!$quotation_id) {
quotation_log('Invalid quotation ID: ' . $quotation_id, 'error');
wp_send_json_error('Invalid quotation ID');
return;
}
$quotation_data = get_quotation_data($quotation_id);
if (!$quotation_data) {
quotation_log('Quotation not found for ID: ' . $quotation_id, 'error');
wp_send_json_error('Quotation not found');
return;
}
quotation_log('Attempting to send email for quotation ID: ' . $quotation_id);
// Trigger the email notification
$result = do_action('quotation_created_notification', $quotation_id, $quotation_data);
quotation_log('Email notification action result: ' . print_r($result, true));
// Update the quotation status
global $wpdb;
$table_name = $wpdb->prefix . 'quotation';
$update_result = $wpdb->update(
$table_name,
array('qt_status' => 'Quote Send to Customer'),
array('id' => $quotation_id),
array('%s'),
array('%d')
);
if ($update_result === false) {
quotation_log('Failed to update quotation status. SQL Error: ' . $wpdb->last_error, 'error');
} else {
quotation_log('Quotation status updated successfully');
}
}
add_action('wp_ajax_send_quotation_email', 'handle_send_quotation_email');
// Add this function to get quotation data
function get_quotation_data($quotation_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'quotation';
$quotation = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id = %d",
$quotation_id
), ARRAY_A);
if (!$quotation) {
return false;
}
return array(
'id' => $quotation_id,
'customer_name' => $quotation['user_name'],
'customer_email' => $quotation['user_email'],
'product_id' => $quotation['product_id'],
'product_name' => $quotation['product_name'],
'start_date' => $quotation['start_date'],
'end_date' => $quotation['end_date'],
'shift' => $quotation['shift'],
'total' => $quotation['final_price'],
'status' => $quotation['qt_status'],
'hire_charges' => $quotation['dynamic_terms_1'],
'other_terms' => $quotation['dynamic_terms_2']
);
}
//RFQ section
function handle_send_rfq_email() {
check_ajax_referer('send_rfq_email_nonce', 'nonce');
$user_id = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0;
if (!$user_id) {
quotation_log('Invalid user ID: ' . $user_id, 'error');
wp_send_json_error('Invalid user ID');
return;
}
$user_data = get_userdata($user_id);
if (!$user_data) {
quotation_log('User not found for ID: ' . $user_id, 'error');
wp_send_json_error('User not found');
return;
}
quotation_log('Attempting to send email for user ID: ' . $user_id);
// Get the latest RFQ data for this user
global $wpdb;
$table_name = $wpdb->prefix . 'request_quote';
$rfq_data = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE user_id = %d ORDER BY id DESC LIMIT 1",
$user_id
), ARRAY_A);
if (!$rfq_data) {
quotation_log('No RFQ data found for user ID: ' . $user_id, 'error');
wp_send_json_error('No RFQ data found');
return;
}
// Prepare RFQ data for email
$rfq_email_data = array(
'id' => $rfq_data['id'],
'customer_name' => $user_data->display_name,
'customer_email' => $user_data->user_email,
'product_id' => $rfq_data['product_id'],
'product_name' => get_the_title($rfq_data['product_id']),
'start_date' => $rfq_data['start_date'],
'end_date' => $rfq_data['end_date'],
'shift' => $rfq_data['shift'],
'location' => $rfq_data['location'],
'application' => $rfq_data['application'],
'calculated_price' => $rfq_data['calculated_price'],
'status' => 'Pending'
);
// Trigger the email notification
$result = do_action('rfq_created_notification', $rfq_data['id'], $rfq_email_data);
quotation_log('Email notification action result: ' . print_r($result, true));
wp_send_json_success('RFQ email sent successfully');
}
add_action('wp_ajax_send_rfq_email', 'handle_send_rfq_email');
add_action('wp_ajax_nopriv_send_rfq_email', 'handle_send_rfq_email');
// Modify RFQ
function handle_send_modify_rfq_email() {
check_ajax_referer('send_modify_rfq_email_nonce', 'nonce');
$rfq_id = isset($_POST['rfq_id']) ? intval($_POST['rfq_id']) : 0;
if (!$rfq_id) {
quotation_log('Invalid RFQ ID: ' . $rfq_id, 'error');
wp_send_json_error('Invalid RFQ ID');
return;
}
quotation_log('Attempting to send email for user ID: ' . $user_id);
// Get the latest RFQ data for this user
global $wpdb;
$table_name = $wpdb->prefix . 'request_quote';
$rfq_data = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id = %d",
$rfq_id
), ARRAY_A);
if (!$rfq_data) {
quotation_log('No RFQ data found for user ID: ' . $user_id, 'error');
wp_send_json_error('No RFQ data found');
return;
}
$user_data = get_userdata($rfq_data['user_id']);
// Prepare RFQ data for email
$rfq_email_data = array(
'id' => $rfq_data['id'],
'customer_name' => $user_data->display_name,
'customer_email' => $user_data->user_email,
'product_id' => $rfq_data['product_id'],
'product_name' => get_the_title($rfq_data['product_id']),
'start_date' => $rfq_data['start_date'],
'end_date' => $rfq_data['end_date'],
'shift' => $rfq_data['shift'],
'location' => $rfq_data['location'],
'application' => $rfq_data['application'],
'calculated_price' => $rfq_data['calculated_price'],
'status' => 'Pending'
);
// Trigger the email notification
$result = do_action('modify_rfq_created_notification', $rfq_data['id'], $rfq_email_data);
quotation_log('Email notification action result: ' . print_r($result, true));
wp_send_json_success('RFQ email sent successfully');
}
add_action('wp_ajax_send_modify_rfq_email', 'handle_send_modify_rfq_email');
add_action('wp_ajax_nopriv_send_modify_rfq_email', 'handle_send_modify_rfq_email');
function handle_send_discount_rfq_email() {
check_ajax_referer('send_discount_rfq_email_nonce', 'nonce');
$qt_id = isset($_POST['qt_id']) ? intval($_POST['qt_id']) : 0;
$status = isset($_POST['status']) ? sanitize_text_field($_POST['status']) : '';
if (!$qt_id) {
quotation_log('Invalid RFQ ID: ' . $qt_id, 'error');
wp_send_json_error('Invalid RFQ ID');
return;
}
quotation_log('Attempting to send email for user ID: ' . $user_id);
global $wpdb;
$table_name = $wpdb->prefix . 'discount_approval';
$qt_data = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id = %d ORDER BY id DESC LIMIT 1",
$qt_id
), ARRAY_A);
if (!$qt_data) {
quotation_log('No Quote data found for user ID: ' . $qt_id, 'error');
wp_send_json_error('No Quote data found');
return;
}
$user_data = get_userdata($qt_data['user_id']);
// Prepare RFQ data for email
$qt_email_data = array(
'id' => $qt_data['id'],
'customer_name' => $user_data->display_name,
'customer_email' => $user_data->user_email,
// 'product_id' => $qt_data['product_id'],
'product_name' => get_the_title($qt_data['product_id']),
'start_date' => $qt_data['start_date'],
'end_date' => $qt_data['end_date'],
'shift' => $qt_data['shift'],
'total' => $quotation['final_price'],
'status' => $qt_data['status'],
'discount' => $qt_data['discount'],
'request_by' => $qt_data['requested_by']
);
// Trigger the email notification
$result = do_action('discount_rfq_created_notification', $rfq_data['id'], $qt_email_data);
quotation_log('Email notification action result: ' . print_r($result, true));
wp_send_json_success('RFQ email sent successfully');
}
add_action('wp_ajax_send_discount_rfq_email', 'handle_send_discount_rfq_email');
add_action('wp_ajax_nopriv_send_discount_rfq_email', 'handle_send_discount_rfq_email');
// Aggriment Section
function handle_send_agg_email() {
check_ajax_referer('send_agg_email_nonce', 'nonce');
$qt_id = isset($_POST['qt_id']) ? intval($_POST['qt_id']) : 0;
if (!$qt_id) {
quotation_log('Invalid Quote ID: ' . $qt_id, 'error');
wp_send_json_error('Invalid user ID');
return;
}
// $qt_data = get_userdata($qt_id);
// if (!$qt_data) {
// quotation_log('User not found for ID: ' . $user_id, 'error');
// wp_send_json_error('User not found');
// return;
// }
// quotation_log('Attempting to send email for user ID: ' . $user_id);
// Get the latest RFQ data for this user
global $wpdb;
$table_name = $wpdb->prefix . 'quotation';
$qt_data = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id = %d ORDER BY id DESC LIMIT 1",
$qt_id
), ARRAY_A);
if (!$qt_data) {
quotation_log('No Quote data found for user ID: ' . $qt_id, 'error');
wp_send_json_error('No Quote data found');
return;
}
$user_data = get_userdata($qt_data['user_id']);
// Prepare RFQ data for email
$qt_email_data = array(
'id' => $qt_data['id'],
'customer_name' => $user_data->display_name,
'customer_email' => $qt_data['user_email'],
'product_id' => $qt_data['product_id'],
'product_name' => get_the_title($qt_data['product_id']),
'start_date' => $qt_data['start_date'],
'end_date' => $qt_data['end_date'],
'shift' => $qt_data['shift'],
'total' => $quotation['final_price'],
'status' => $qt_data['qt_status']
);
// Trigger the email notification
$result = do_action('agg_created_notification', $qt_data['id'], $qt_email_data);
quotation_log('Email notification action result: ' . print_r($result, true));
wp_send_json_success('Aggrement email sent successfully');
}
add_action('wp_ajax_send_agg_email', 'handle_send_agg_email');
add_action('wp_ajax_nopriv_send_agg_email', 'handle_send_agg_email');
// Fleet Add / Remove
function handle_send_fleet_email($product_id, $action) {
// Check if product exists
$product = wc_get_product($product_id);
if (!$product && $action !== 'deleted') {
return;
}
// Prepare product data
$product_data = array(
'id' => $product_id,
'name' => $product ? $product->get_name() : 'Unknown',
'sku' => $product ? $product->get_sku() : 'N/A',
'action' => $action // 'added', 'deleted', or 'trashed'
);
// Trigger the email notification
do_action('fleet_notification', $product_id, $product_data);
}
add_action('transition_post_status', 'trigger_fleet_email_on_publish', 10, 3);
function trigger_fleet_email_on_publish($new_status, $old_status, $post) {
if (($new_status === 'publish') && ($old_status !== 'publish') &&
(in_array($post->post_type, ['product', 'product_variation']))) {
handle_send_fleet_email($post->ID, 'added');
}
}
// Hook into product trashing
add_action('wp_trash_post', 'trigger_fleet_email_on_trash', 10, 1);
function trigger_fleet_email_on_trash($post_id) {
if (get_post_type($post_id) === 'product' || get_post_type($post_id) === 'product_variation') {
handle_send_fleet_email($post_id, 'trashed');
}
}
// Hook into product deletion
add_action('before_delete_post', 'trigger_fleet_email_on_delete', 10, 1);
function trigger_fleet_email_on_delete($post_id) {
if (get_post_type($post_id) === 'product' || get_post_type($post_id) === 'product_variation') {
handle_send_fleet_email($post_id, 'deleted');
}
}
// Function to handle AJAX request for sending fleet change email
function handle_send_fleet_email_ajax() {
check_ajax_referer('send_fleet_email_nonce', 'nonce');
$product_id = isset($_POST['product_id']) ? intval($_POST['product_id']) : 0;
$action = isset($_POST['action']) ? sanitize_text_field($_POST['action']) : '';
if (!$product_id || !in_array($action, ['added', 'deleted'])) {
wp_send_json_error('Invalid product ID or action');
return;
}
handle_send_fleet_email($product_id, $action);
wp_send_json_success('Fleet change email sent successfully');
}
add_action('wp_ajax_send_fleet_email', 'handle_send_fleet_email_ajax');
add_action('wp_ajax_nopriv_send_fleet_email', 'handle_send_fleet_email_ajax');
// Status Change
// Hook into WooCommerce order status change
add_action('woocommerce_order_status_changed', 'trigger_email_on_status_change', 10, 4);
function trigger_email_on_status_change($order_id, $old_status, $new_status, $order) {
// Check if order exists and is valid
if (!$order || !$order_id) {
return;
}
// Get WooCommerce email classes
$emails = WC()->mailer()->get_emails();
// Trigger default WooCommerce emails
switch ($new_status) {
// case 'processing':
// if (isset($emails['WC_Email_Customer_Processing_Order'])) {
// $emails['WC_Email_Customer_Processing_Order']->trigger($order_id);
// }
// break;
case 'completed':
if (isset($emails['WC_Email_Customer_Completed_Order'])) {
$emails['WC_Email_Customer_Completed_Order']->trigger($order_id);
}
break;
// Add more cases for other status changes if needed
}
// Trigger custom status change email
do_action('status_created_notification', $order_id, $new_status);
}
// Function to handle AJAX request for sending status change email
function handle_send_status_email() {
check_ajax_referer('send_status_email_nonce', 'nonce');
$order_id = isset($_POST['order_id']) ? intval($_POST['order_id']) : 0;
$new_status = isset($_POST['new_status']) ? sanitize_text_field($_POST['new_status']) : '';
if (!$order_id || !$new_status) {
wp_send_json_error('Invalid order ID or status');
return;
}
do_action('status_created_notification', $order_id, $new_status);
wp_send_json_success('Status email sent successfully');
}
add_action('wp_ajax_send_status_email', 'handle_send_status_email');
add_action('wp_ajax_nopriv_send_status_email', 'handle_send_status_email');
// SOS
function handle_send_sso_email() {
check_ajax_referer('send_sso_email_nonce', 'nonce');
$sos_id = isset($_POST['sos_id']) ? intval($_POST['sos_id']) : 0;
if (!$sos_id) {
quotation_log('Invalid Quote ID: ' . $sos_id, 'error');
wp_send_json_error('Invalid user ID');
return;
}
global $wpdb;
$table_name = $wpdb->prefix . 'sos';
$sos_data = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE sos_id = %d",
$sos_id
), ARRAY_A);
if (!$sos_data) {
wp_send_json_error('SOS data not found');
return;
}
$user_data = get_userdata($qt_data['user_id']);
// Prepare RFQ data for email
$sos_data = array(
'id' => $sos_data['id'],
'operator_id' => $sos_data['operator_id'],
'sos_message' => $qt_data['sos_message']
);
// Trigger the email notification
$result = do_action('sos_created_notification', $sos_data['id'], $sos_data);
quotation_log('Email notification action result: ' . print_r($result, true));
wp_send_json_success('SOS email sent successfully');
}
add_action('wp_ajax_send_sos_email', 'handle_send_sos_email');
add_action('wp_ajax_nopriv_send_sos_email', 'handle_send_sos_email');
//SAP ID update
function handle_send_sapid_email($user_id, $sapid_data) {
if (!$user_id) {
error_log('Invalid User ID: ' . $user_id);
return;
}
$user_data = get_userdata($user_id);
$sap_id = get_user_meta($user_id, 'sap_customer_id', true);
if (!$sap_id) {
error_log('SAP ID missing for User ID: ' . $user_id);
return;
}
// Trigger WooCommerce custom email class
$email_instance = new WC_Custom_Email_Sapid();
// $email_instance->trigger($user_id, $sapid_data);
error_log('SAPID email triggered for User ID: ' . $user_id);
}
add_action('sapid_created_notification', 'handle_send_sapid_email', 10, 2);
function handle_send_used_enquiry_email($used_enquiry_id) {
if (empty($used_enquiry_id)) {
error_log('No Enquiry ID provided.');
return;
}
if (!class_exists('WC_Custom_Email_Used_Enquiry')) {
error_log('WC_Custom_Email_Used_Enquiry class not found.');
return;
}
global $wpdb;
$table_name = $wpdb->prefix . 'used_product_enquiry';
// Fetch enquiry data
$used_enquiry_data = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id = %d",
$used_enquiry_id
), ARRAY_A);
if (empty($used_enquiry_data)) {
error_log("No enquiry data found for ID: $used_enquiry_id");
return;
}
error_log("Enquiry Data: " . print_r($used_enquiry_data, true));
$email_instance = new WC_Custom_Email_Used_Enquiry();
$email_result = $email_instance->trigger($used_enquiry_id, $used_enquiry_data);
if ($email_result) {
error_log("Used Enquiry Email Triggered for Enquiry ID: $used_enquiry_id");
} else {
error_log("Failed to trigger Used Enquiry Email for Enquiry ID: $used_enquiry_id");
}
}
add_action('used_enquiry_created_notification', 'handle_send_used_enquiry_email', 10, 2);
// Contract Renuval
function handle_send_contract_renewal_email($contract_renewal_id) {
// check_ajax_referer('send_contract_renewal_email_nonce', 'nonce');
// $contract_renewal_id = isset($_POST['contract_id']) ? intval($_POST['contract_id']) : 0;
if (!$contract_renewal_id) {
error_log('Invalid Contract ID: ' . $contract_renewal_id, 'error');
return;
}
$contract_renewal_data = get_contract_renewal_data($contract_renewal_id);
if (!$contract_renewal_data) {
error_log('Contract not found for ID: ' . $contract_renewal_id, 'error');
return;
}
if (!class_exists('WC_Custom_Email_Contract_Renewal')) {
error_log('Email class WC_Custom_Email_Contract_Renewal not found.');
return;
}
$email_instance = new WC_Custom_Email_Contract_Renewal();
$email_result = $email_instance->trigger($contract_renewal_id, $contract_renewal_data);
if ($email_result) {
error_log("Contract Renewal Email Triggered for Enquiry ID: $contract_renewal_id");
} else {
error_log("Failed to trigger Contract Renewal Email for Enquiry ID: $contract_renewal_id");
}
}
add_action('contract_renewal_created_notification', 'handle_send_contract_renewal_email', 10, 2);
// add_action('wp_ajax_send_contract_renewal_email', 'handle_send_contract_renewal_email');
// // Add this function to get contract_renewal data
function get_contract_renewal_data($contract_renewal_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'contract_renewal';
$contract_renewal = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id = %d",
$contract_renewal_id
), ARRAY_A);
$user_data = get_userdata($contract_renewal['user_id']);
$user_email = $user_data->user_email;
if (!$contract_renewal) {
return false;
}
return array(
'id' => $contract_renewal_id,
'user_id' => $contract_renewal['user_id'],
'customer_email' => $user_email,
'contract_id' => $contract_renewal['contract_id'],
'extended_date_by_user' => $contract_renewal['extended_date_by_user'],
'extended_date_by_admin' => $contract_renewal['extended_date_by_admin'],
);
}
//Invoice
function handle_send_invoie_email($sales_order_id, $invoice_data) {
if (!$sales_order_id) {
error_log('Invalid User ID: ' . $sales_order_id);
return;
}
// Trigger WooCommerce custom email class
$email_instance = new WC_Custom_Email_Invoice();
$email_instance->trigger($sales_order_id, $invoice_data);
error_log('Invoice email triggered for User ID: ' . $sales_order_id);
}
add_action('invoice_created_notification', 'handle_send_invoice_email', 10, 2);
// Hook to add the Settings menu for email
add_action('admin_menu', 'add_email_settings_menu');
function add_email_settings_menu() {
// Check if the current user is a central administrator
if (current_user_can('central_administrator')) {
// Add a parent menu itemas settings that directly links to the WooCommerce Email settings
add_menu_page(
__('Settings'),
__('Settings'),
'central_administrator',
'email-settings',
'redirect_to_wc_email_settings',
'dashicons-admin-settings',
99
);
}
}
// Redirect to WooCommerce Email Settings tab
function redirect_to_wc_email_settings() {
if (current_user_can('central_administrator')) {
wp_safe_redirect(admin_url('admin.php?page=wc-settings&tab=email'));
exit;
} else {
wp_die(__('You do not have permission to access this page.'));
}
}
// Hide the WooCommerce tabs for central_administrator role
add_action('admin_head', 'hide_wc_settings_tabs_css_for_administrator');
function hide_wc_settings_tabs_css_for_administrator() {
if (current_user_can('central_administrator')) {
echo '<style>
.woocommerce-layout__header-navigation,
.nav-tab-wrapper {
display: none !important;
}
#email_notification_settings-description {
display:none
}
</style>';
}
}
// Hide EmailKit column
add_action('admin_footer', 'remove_emailkit_column');
function remove_emailkit_column() {
$screen = get_current_screen();
if ($screen && $screen->id === 'woocommerce_page_wc-settings' && isset($_GET['tab']) && $_GET['tab'] === 'email') {
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
function removeEmailkitColumn() {
// Remove the column header
$('th.wc-email-settings-table-template').remove();
// Remove the column cells
$('td.wc-email-settings-table-template').remove();
// Adjust colspan of the footer
var columnCount = $('.wc-emails').find('thead th').length;
$('.wc-emails tfoot th').attr('colspan', columnCount);
}
// Run on page load
removeEmailkitColumn();
// Run again when AJAX requests complete (for dynamic content)
$(document).ajaxComplete(function() {
removeEmailkitColumn();
});
});
</script>
<?php
}
}
// Hiding un used touch points
// add_filter('woocommerce_email_classes', 'disable_specific_woocommerce_emails');
// function disable_specific_woocommerce_emails($email_classes) {
// // Unset the email classes for the touchpoints you want to disable
// unset($email_classes['WC_Email_Failed_Order']); // Disable "Failed Order"
// unset($email_classes['WC_Email_Customer_Refunded_Order']); // Disable "Refund Order"
// unset($email_classes['WC_Email_Customer_Note']); // Disable "Customer Note"
// unset($email_classes['WC_Email_Customer_Invoice']); // Disable "Order Details" (example)
// unset( $email_classes['WC_Email_New_Order'] ); // Remove New Order Email
// unset( $email_classes['WC_Email_Customer_Processing_Order'] ); // Remove Processing Order Email
// return $email_classes;
// }
// hide screen options
function hide_screen_options_for_email_notification() {
?>
<style>
<?php if (isset($_GET['page'], $_GET['tab']) && $_GET['page'] === 'wc-settings' && $_GET['tab'] === 'email') : ?>
#screen-meta-links {
display: none !important;
}
<?php endif; ?>
</style>
<?php
}
add_action('admin_head', 'hide_screen_options_for_email_notification');