Files
formipay-public/includes/Notification/Notification.php
2025-08-21 20:39:34 +07:00

512 lines
21 KiB
PHP

<?php
namespace Formipay\Notification;
use Formipay\Traits\SingletonTrait;
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
class Notification {
use SingletonTrait;
protected function __construct() {
add_action( 'init', [$this, 'create_db'] );
add_filter( 'formipay/global-settings/tab:general', [$this, 'global_settings_general'], 40 );
add_filter( 'formipay/global-settings', [$this, 'add_menu_on_global_setting'], 40 );
add_filter( 'formipay/form-config', [$this, 'add_menu_on_product_setting'], 100 );
add_action( 'formipay/notification/order', [$this, 'order_trigger'] );
add_action( 'formipay/notification/access', [$this, 'access_trigger'] );
}
public function create_db() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$create[] = "CREATE TABLE `{$wpdb->base_prefix}formipay_notification_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` int,
`customer_id` int,
`order_id` int,
`recipient_type` text,
`media` text,
`notification_data` longtext,
`status` text,
`meta_data` text,
PRIMARY KEY (`id`)
) $charset_collate;";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta($create);
}
public function insert_notification_data($args) {
$args = wp_parse_args( $args, [
'order_id' => 0,
'recipient_type' => 'admin',
'media' => 'email',
'notification_data' => [],
'status' => 'pending',
'meta_data' => []
] );
global $wpdb;
$table = $wpdb->prefix . 'formipay_notification_log';
$insert_data = [
'order_id' => intval($args['order_id']),
'recipient_type' => sanitize_text_field($args['recipient_type']),
'media' => sanitize_text_field($args['media']),
'notification_data' => maybe_serialize($args['notification_data']),
'status' => sanitize_text_field($args['status']),
'meta_data' => maybe_serialize($args['meta_data'])
];
if($args['order_id'] > 0){
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
$wpdb->insert($table, $insert_data);
return $wpdb->insert_id;
}
return false;
}
public function get_notification_data_by_id($notification_id) {
global $wpdb;
$table = $wpdb->prefix . 'formipay_notification_log';
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$get = $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM %i WHERE `id` = %d", $table, $notification_id
)
);
return $get;
}
public function update_notification_data($notification_id, $args) {
$recent_data = $this->get_notification_data_by_id($notification_id);
$args = wp_parse_args( $args, [
'order_id' => $recent_data->order_id,
'recipient_type' => $recent_data->recipient_type,
'media' => $recent_data->media,
'notification_data' => maybe_unserialize($recent_data->notification_data),
'status' => $recent_data->status,
'meta_data' => maybe_unserialize($recent_data->meta_data)
] );
global $wpdb;
$table_name = $wpdb->prefix . 'formipay_notification_log';
$new_args = [
'order_id' => intval($args['order_id']),
'recipient_type' => sanitize_text_field($args['recipient_type']),
'media' => sanitize_text_field($args['media']),
'notification_data' => maybe_serialize($args['notification_data']),
'status' => sanitize_text_field($args['status']),
'meta_data' => maybe_serialize($args['meta_data'])
];
$where = [ 'id' => $notification_id ];
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$update = $wpdb->update( $table_name, $new_args, $where );
return $update;
}
public function global_settings_general($fields) {
$medias = apply_filters('formipay/notification/media', ['email'] );
$notification_fields = [
'notification_type_group' => [
'type' => 'group_title',
'label' => __( 'Notification Type', 'formipay'),
'group' => 'started',
],
];
foreach($medias as $key => $media){
$notification_fields['notification_'.$media.'_active'] = [
'type' => 'checkbox',
'label' => sprintf( __( '%s Notification', 'formipay'), ucfirst($media) ),
'value' => true
];
}
$last_notification_field = count($notification_fields) - 1;
$notification_fields[$last_notification_field]['group'] = 'ended';
$notification_fields['notification_email_sender_group_header'] = [
'type' => 'group_title',
'label' => __( 'Email Settings', 'formipay'),
'group' => 'started',
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty'
]
];
foreach($medias as $key => $media){
$notification_fields['notification_'.$media.'_admin_recipient'] = [
'type' => 'text',
// translators: %s is the media type name.
'label' => sprintf( __( 'Admin\'s %s', 'formipay'), ucfirst($media) ),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty'
]
];
}
$notification_fields['notification_name_admin_recipient'] = [
'type' => 'text',
'label' => __( 'Admin\'s Name', 'formipay'),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty'
]
];
$notification_fields['notification_email_logo'] = [
'type' => 'image',
'label' => __('Logo Image', 'formipay'),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty'
]
];
$notification_fields['notification_email_footer'] = [
'type' => 'tinymce',
'label' => __( 'Email Footer', 'formipay'),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty'
]
];
$notification_fields['notification_email_footer_links'] = [
'type' => 'repeater',
'label' => __( 'Icon Links', 'formipay' ),
'fields' => [
'type' => [
'type' => 'select',
'label' => __( 'Type', 'formipay' ),
'is_group_title' => true,
'options' => [
'dribbble' => 'Dribbble',
'facebook' => 'Facebook',
'facebook-messenger' => 'Messenger',
'github' => 'Github',
'instagram' => 'Instagram',
'link' => 'Link',
'linkedin' => 'Linkedin',
'pinterest' => 'Pinterest',
'telegram' => 'Telegram',
'tiktok' => 'Tiktok',
'whatsapp' => 'WhatsApp',
'wordpress' => 'WordPress',
'x' => 'X'
],
],
'link' => [
'type' => 'text',
'label' => __( 'URL', 'formipay' )
]
],
'group' => 'ended',
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty'
]
];
$fields = array_merge($fields, $notification_fields);
return $fields;
}
public function add_menu_on_global_setting($fields) {
$hints = formipay_editor_hints();
$statuses = formipay_order_status_list();
$medias = apply_filters('formipay/notification/media', ['email'] );
$notification_fields = [];
// access link
$notification_fields['notification_email_access_link_group'] = [
'type' => 'group_title',
'label' => __( 'Access Link', 'formipay' ),
'description' => __( 'This notification type is for responding request for access when people visit the thankyou page that contain any of your digital access (including files and URLs)', 'formipay' ),
'group' => 'started',
'submenu' => __( 'Access Link', 'formipay' ),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
];
$notification_fields['notification_email_access_link_title'] = [
'type' => 'text',
'label' => __( 'Title', 'formipay' ),
'value' => __( 'Your New Purchased Access Link', 'formipay' ),
'submenu' => __( 'Access Link', 'formipay' ),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
];
$notification_fields['notification_email_access_link_content'] = [
'type' => 'tinymce',
'label' => __( 'Content', 'formipay' ),
'hints' => [
'buyer_name' => __( 'Buyer Name', 'formipay' ),
'order_id' => __( 'Order ID', 'formipay' ),
'access_button' => __( 'Access Button', 'formipay' ),
'access_link' => __( 'Access Link', 'formipay' ),
],
'submenu' => __( 'Access Link', 'formipay' ),
'value' => '<p>Hello {{buyer_name}},</p><p><br></p><p>Anyone request to access your purchase order ID&nbsp;<span style="background-color: transparent;">{{order_id}}</span><span style="background-color: transparent;">. Here is the new access link:</span></p><p>{{access_button}}<br></p><p><br></p><p>Here is the raw link if there is issue with the button:</p><p>{{access_link}}</p><p><br></p><p>Do not give access to others to make sure your purcase safe. Please ignore this email if it was not you.</p><p><br></p><p>Best regards,</p><p>Your E-commerce Team</p>',
'group' => 'ended',
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
];
foreach($statuses as $key => $status){
$status_key = str_replace('-', '_', $key);
$notification_fields['notification_email_admin_'.$status_key.'_group_header'] = [
'type' => 'group_title',
// translators: %s is the status of order.
'label' => sprintf( __( 'Email Notification Admin (%s)', 'formipay' ), $status),
'group' => 'started',
'submenu' => esc_html($status),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
];
$notification_fields['notification_email_admin_'.$status_key.'_toggle'] = [
'type' => 'checkbox',
'label' => __('Activate', 'formipay'),
'submenu' => esc_html($status),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
];
$notification_fields['notification_email_admin_'.$status_key.'_title'] = [
'type' => 'text',
'label' => __( 'Title', 'formipay' ),
'submenu' => esc_html($status),
'dependency' => [
[
'key' => 'notification_email_admin_'.$status_key.'_toggle',
'value' => 'not_empty'
],
[
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
],
'dependencies' => '&&'
];
$notification_fields['notification_email_admin_'.$status_key.'_content'] = [
'type' => 'tinymce',
'label' => __( 'Content', 'formipay' ),
'hints' => [
'order_details' => __( 'Order Details', 'formipay' ),
'order_items' => __( 'Order Items', 'formipay' ),
'buyer_details' => __( 'Buyer Details', 'formipay' ),
'buyer_name' => __( 'Buyer Name', 'formipay' ),
'order_id' => __( 'Order ID', 'formipay' ),
'order_status' => __( 'Order Status', 'formipay' ),
'payment_timeout' => __( 'Payment Timeout', 'formipay' )
],
'submenu' => esc_html($status),
'dependency' => [
[
'key' => 'notification_email_admin_'.$status_key.'_toggle',
'value' => 'not_empty'
],
[
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
],
'dependencies' => '&&',
'group' => 'ended',
];
$notification_fields['notification_email_buyer_'.$status_key.'_group_header'] = [
'type' => 'group_title',
// translators: %s is the status of order.
'label' => sprintf( __( 'Email Notification Buyer (%s)', 'formipay' ), $status),
'group' => 'started',
'submenu' => esc_html($status),
'description' => __( 'Email notification for buyer only available if your form is contain email field type', 'formipay'),
];
$notification_fields['notification_email_buyer_'.$status_key.'_toggle'] = [
'type' => 'checkbox',
'label' => __('Activate', 'formipay'),
'submenu' => esc_html($status),
'dependency' => [
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
];
$notification_fields['notification_email_buyer_'.$status_key.'_title'] = [
'type' => 'text',
'label' => __( 'Title', 'formipay' ),
'submenu' => esc_html($status),
'dependency' => [
[
'key' => 'notification_email_buyer_'.$status_key.'_toggle',
'value' => 'not_empty'
],
[
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
],
'dependencies' => '&&'
];
$notification_fields['notification_email_buyer_'.$status_key.'_content'] = [
'type' => 'tinymce',
'label' => __( 'Content', 'formipay' ),
'hints' => [
'order_details' => __( 'Order Details', 'formipay' ),
'order_items' => __( 'Order Items', 'formipay' ),
'buyer_details' => __( 'Buyer Details', 'formipay' ),
'buyer_name' => __( 'Buyer Name', 'formipay' ),
'order_id' => __( 'Order ID', 'formipay' ),
'order_status' => __( 'Order Status', 'formipay' ),
'payment_timeout' => __( 'Payment Timeout', 'formipay' )
],
'submenu' => esc_html($status),
'dependency' => [
[
'key' => 'notification_email_buyer_'.$status_key.'_toggle',
'value' => 'not_empty'
],
[
'key' => 'notification_email_active',
'value' => 'not_empty',
'section' => 'General'
]
],
'dependencies' => '&&',
'group' => 'ended',
];
$notification_fields = apply_filters('formipay/settings/notification/fields/'.$status_key, $notification_fields);
}
$fields['notification'] = [
'name' => __('Notification', 'formipay'),
'fields' => $notification_fields
];
return $fields;
}
public function add_menu_on_product_setting($fields) {
$notification_fields = [];
$hints = formipay_editor_hints();
$statuses = formipay_order_status_list();
foreach($statuses as $key => $status){
$status_key = str_replace('-', '_', $key);
$notification_fields['product_notification_email_buyer_'.$status_key.'_group_header'] = [
'type' => 'group_title',
// translators: %s is the status of order.
'label' => sprintf( __( 'Email Notification Buyer (%s)', 'formipay' ), $status),
'group' => 'started',
'description' => __( 'Email notification for buyer only available if your form is contain email field type', 'formipay'),
];
$notification_fields['product_notification_email_buyer_'.$status_key.'_toggle'] = [
'type' => 'checkbox',
'label' => __('Replace Content', 'formipay'),
];
$notification_fields['product_notification_email_buyer_'.$status_key.'_content'] = [
'type' => 'tinymce',
'label' => __( 'Email Content', 'formipay' ),
'hints' => $hints,
'dependency' => [
'key' => 'product_notification_email_buyer_'.$status_key.'_toggle',
'value' => 'not_empty'
],
'group' => 'ended',
];
$notification_fields = apply_filters('formipay/product/notification/fields/', $notification_fields, $status_key);
}
$fields['formipay_form_settings']['notification'] = [
'name' => __('Notification', 'formipay'),
'fields' => $notification_fields
];
return $fields;
}
public function order_trigger($order_data) {
$medias = apply_filters('formipay/notification/media', ['email'] );
$order_status = $order_data['status'];
if(!empty($medias)){
foreach($medias as $media){
do_action(
'formipay/notification/order/'.$media, $order_data
);
}
}
}
public function access_trigger($order_data) {
$medias = apply_filters('formipay/notification/media', ['email'] );
if(!empty($medias)){
foreach($medias as $media){
do_action(
'formipay/notification/access/'.$media, $order_data
);
}
}
}
}