__( 'Text', 'formipay' ), 'url' => __( 'URL', 'formipay' ), 'email' => __( 'Email', 'formipay' ), 'tel' => __( 'Telephone', 'formipay' ), 'number' => __( 'Number', 'formipay' ), 'date' => __( 'Date', 'formipay' ), 'datetime' => __( 'Date & Time', 'formipay' ), 'color' => __( 'Number', 'formipay' ), 'select' => __( 'Select Dropdown', 'formipay' ), 'checkbox' => __( 'Checkbox', 'formipay' ), 'radio' => __( 'Radio', 'formipay' ), 'hidden' => __( 'Hidden', 'formipay' ), 'textarea' => __( 'Textarea', 'formipay' ), 'divider' => __( 'Divider', 'formipay' ), 'page_break' => __( 'Page Break', 'formipay' ), 'country_list' => __( 'Preset: Country List', 'formipay' ) ]; $types = apply_filters( 'formipay/form-config/field-type', $types); return $types; } function formipay_currency_array() { $json = file_get_contents(FORMIPAY_PATH . 'admin/assets/json/currencies.json'); $array = json_decode($json, true); return $array; } function formipay_is_multi_currency_active() { $formipay_settings = get_option('formipay_settings'); $is_active = $formipay_settings['enable_multicurrency']; return (bool) $is_active; } function formipay_default_currency($return='raw') { $formipay_settings = get_option('formipay_settings'); $default_currency = $formipay_settings['default_currency']; switch ($return) { case 'symbol': $output = formipay_get_currency_data_by_value($default_currency, 'symbol'); break; case 'title': $output = formipay_get_currency_data_by_value($default_currency, 'title'); break; case 'decimal_digits': $output = $formipay_settings['default_currency_decimal_digits']; break; case 'decimal_symbol': $output = $formipay_settings['default_currency_decimal_symbol']; break; case 'thousand_separator': $output = $formipay_settings['default_currency_thousand_separator']; break; default: $output = $formipay_settings['default_currency']; break; } return $output; } function formipay_global_currency_options() { $formipay_settings = get_option('formipay_settings'); // $currencies = (false !== boolval($formipay_settings['enable_multicurrency'])) ? formipay_default_currency() : []; $currencies = []; if(false !== boolval($formipay_settings['enable_multicurrency']) && !empty($formipay_settings['multicurrencies'])) { foreach($formipay_settings['multicurrencies'] as $currency){ $currency_value = $currency['currency']; $currency_label = formipay_get_currency_data_by_value($currency_value, 'title'); $currencies[$currency_value] = $currency_label; } } // if(empty($currencies)){ // $currencies[formipay_default_currency()] = formipay_default_currency('title'); // } return $currencies; } function formipay_country_array() { $json = file_get_contents(FORMIPAY_PATH . 'admin/assets/json/country.json'); $array = json_decode($json, true); return $array; } function formipay_get_flag_by_currency($currency) { if(strpos($currency, ':::')){ $currency = explode(':::', $currency); $currency = $currency[0]; } $json = file_get_contents(FORMIPAY_PATH . 'admin/assets/json/flags.json'); $array = json_decode($json, true); foreach($array as $country){ if($currency == $country['code']){ return $country['flag']; } } return false; } function formipay_price_format($num = 0, $post_id = 0){ $decimal_digits = 2; $decimal_symbol = '.'; $thousand_separator_symbol = ','; if($post_id > 0 ){ $currency_data = explode(':::', get_post_meta($post_id, 'product_currency', true)); $decimal_digits = get_post_meta($post_id, 'product_currency_decimal_digits', true); $decimal_symbol = get_post_meta($post_id, 'product_currency_decimal_symbol', true); $thousand_separator_symbol = get_post_meta($post_id, 'product_currency_thousand_separator', true); if(isset($currency_data[2]) && !empty($currency_data[2])){ $currency = $currency_data[2]; }else{ $currency = $currency_data[0]; } return $currency .' '. number_format(floatval($num), intval($decimal_digits), $decimal_symbol, $thousand_separator_symbol); } return number_format(floatval($num), intval($decimal_digits), $decimal_symbol, $thousand_separator_symbol); } function formipay_currency_as_options($currency_code = '') { $currencies = formipay_currency_array(); $result = []; foreach($currencies as $currency){ $code = $currency['code']; $currency_id = implode(':::', $currency); if('' !== $currency_code && $code == $currency_code){ $result = $currency_id; break; } $result[$currency_id] = ucwords($currency['name']); } return $result; } function formipay_post_currency($post_id){ $currency = formipay_get_post_meta($post_id, 'product_currency'); $currency = explode(':::', $currency); $currency_symbol = $currency[0]; if(isset($currency[2]) && '' !== $currency[2]){ $currency_symbol = $currency[2]; } return $currency_symbol; } function formipay_get_currency_data_by_value($value, $data='') { $currency = explode(':::', $value); switch ($data) { case 'title': $output = $currency[1]; break; case 'symbol': $output = $currency[0]; // if(isset($currency[2]) && '' !== $currency[2] && false !== boolval($currency[2])){ // $output = $currency[2]; // } break; default: $output = $value; break; } return $output; } function formipay_get_post_meta($post_id, $metakey) { $value = get_post_meta($post_id, $metakey, true); if(!empty($value) && false !== $value && '' !== $value){ return $value; } return false; } function formipay_order_status_list() { $statuses = array( 'on-hold' => 'On Hold', 'payment-confirm' => 'Payment Confirmed', 'in-progress' => 'In Progress', 'shipping' => 'Shipping', 'completed' => 'Completed', 'failed' => 'Failed', 'refunded' => 'Refunded', 'cancelled' => 'Cancelled' ); return $statuses; } function formipay_get_order($order_id) { $formipay_settings = get_option('formipay_settings'); $order = apply_filters( 'formipay/order/get', false, $order_id ); $order_data = []; if(false !== $order){ foreach($order as $key => $data){ $order_data[$key] = maybe_unserialize( $data ); if($key == 'items'){ foreach($order_data[$key] as $index => $item){ $order_data[$key][$index]['subtotal_formatted'] = formipay_price_format($item['subtotal'], $order_data['form_id']); } } } $order_data['total_formatted'] = formipay_price_format($order_data['total'], $order_data['form_id']); // Form Submission Data Process to Readable if(!empty($order_data['form_data'])){ $field_types = formipay_field_type_collection(); $form_field = get_post_meta($order_data['form_id'], 'formipay_settings', true); $form_field = $form_field['fields']; $all_fields = []; foreach($form_field as $key => $field){ if(array_key_exists($field['field_type'], $field_types)){ $skip = false; if(in_array($field['field_type'], ['divider', 'page_break'])){ $options = $field['field_options']; if(!empty($options)){ foreach($options as $option){ if(!empty($option['amount'])){ $skip = true; } } } } if(false == $skip){ $all_fields[$key] = $field; } } } $proceed_form_data = []; foreach($order_data['form_data'] as $name => $value){ switch ($name) { case 'qty': $label = esc_html__( 'Quantity', 'formipay' ); break; case 'payment': $label = esc_html__( 'Payment', 'formipay' ); break; case 'coupon_code': $label = esc_html__( 'Coupon Code', 'formipay' ); break; case 'payment_gateway': $label = esc_html__( 'Payment Gateway', 'formipay' ); break; default: if(!empty($all_fields[$name.'_config'])){ $label = $all_fields[$name.'_config']['label']; }else{ $label = ''; } break; } $data_value = $value; if(is_array($value)){ $data_value = $value['label'] !== 'undefined' ? $value['label'] : $value['value']; } if($name == 'payment'){ if(strpos($value, ':::') !== false){ $value = explode(':::', $value); $data_value = isset($value[1]) ? $value[1] : $value[0]; // If this is bank_transfer if( $value[0] == 'bank_transfer' && isset($value[1]) && strpos($value[1], '-') !== false ) { $bank_account = explode('-', $value[1]); $bank_account_index = intval($bank_account[1]) + 1; // translators: %d is the bank account index number. $bank_label = $bank_account[0] . ' (' . sprintf( __( 'Bank Accounts #%d', 'formipay' ), $bank_account_index) . ')'; $data_value = $bank_label; } } } $proceed_form_data[$name] = [ 'name' => $name, 'value' => $data_value !== '' ? $data_value : '-', 'label' => $label ]; } $order_data['form_data'] = $proceed_form_data; } $thankyou_link = site_url( $formipay_settings['thankyou_link'] . '/' . base64_encode( $order_data['form_id'] . ':::' . $order_id ) ); $order_data['thankyou'] = [ 'link' => $thankyou_link, 'pass_method' => !empty($order_data['meta_data']['access_method']) ? $order_data['meta_data']['access_method'] : 'magic_link', 'pass_word' => (!empty($order_data['meta_data']['access_password']) && !empty($order_data['meta_data']['access_method'])) ? $order_data['meta_data']['access_password'] : formipay_generate_password(), ]; if(!empty($order_data['meta_data'])){ $proceed_meta_data = []; foreach($order_data['meta_data'] as $name => $value){ $label = explode('_', $name); $__label = []; foreach($label as $_label){ if(strlen($_label) <= 3){ $__label[] = strtoupper($_label); }else{ $__label[] = ucfirst($_label); } } $proceed_meta_data[$name] = [ 'label' => implode(' ', $__label), 'name' => $name, 'value' => $value !== '' ? $value : '-' ]; } $order_data['meta_data'] = $proceed_meta_data; } // Payment Data Process to Readable if(!empty($order['payment_gateway'])){ $trx_data = formipay_get_payment_data($order_id, $order['payment_gateway']); if(false !== $trx_data) { $order_data['transaction'] = $trx_data; } $timeline = [ [ 'time' => $order['created_date'], // translators: %s is the payment gateway name. 'activity' => sprintf( __( 'Order created via %s', 'formipay'), ucwords(str_replace( '_', ' ', $order['payment_gateway'])) ), 'attachment' => 'none' ] ]; if(!empty($trx_data)){ foreach($trx_data as $trx){ if($order['payment_gateway'] == 'bank_transfer' && !empty($trx['meta_data']['transfer_receipt'])) { $timeline[] = [ 'time' => formipay_date($trx['meta_data']['transfer_receipt']['time']), 'activity' => __( 'Payment confirmation by uploading transfer receipt.', 'formipay' ), 'attachment' => !empty($trx['meta_data']['transfer_receipt']['attachment_url']) ? $trx['meta_data']['transfer_receipt']['attachment_url'] : 'none' ]; } if($order['payment_gateway'] == 'paypal' && !empty($trx['meta_data']) && $trx['meta_data']['status'] == 'COMPLETED') { $timeline[] = [ 'time' => formipay_date($trx['meta_data']['update_time']), 'activity' => __( 'Payment completed via Paypal.', 'formipay' ), 'attachment' => 'none' ]; } } } $timeline = apply_filters( 'formipay/order/transaction/timeline', $timeline, $order_id ); $order_data['transaction_timeline'] = $timeline; } $notif_data = formipay_get_notification_data($order_id); if(false !== $notif_data) { $order_data['notification'] = $notif_data; } } return $order_data; } function formipay_get_payment_data($order_id, $payment_gateway) { global $wpdb; if($payment_gateway !== 'cod'){ $table_name = $wpdb->prefix . 'formipay_'.$payment_gateway.'_trx'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $get = $wpdb->get_results( $wpdb->prepare("SELECT * FROM %i WHERE `order_id` = %d", $table_name, $order_id), ARRAY_A ); $trx_data = []; if(false !== $get){ foreach($get as $index => $row){ foreach($row as $key => $value){ $trx_data[$index][$key] = maybe_unserialize( $value ); } } } return !empty($trx_data) ? $trx_data : $get; } return []; } function formipay_get_notification_data($order_id) { global $wpdb; $table_name = $wpdb->prefix . 'formipay_notification_log'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $get = $wpdb->get_results( $wpdb->prepare("SELECT * FROM %i WHERE `order_id` = %d", $table_name, $order_id), ARRAY_A ); $notif_data = []; if(false !== $get){ foreach($get as $row_key => $row){ foreach($row as $key => $value){ $notif_data[$row_key][$key] = maybe_unserialize( $value ); } $notif_data[$row_key]['recipient'] = $notif_data[$row_key]['notification_data']['to']; $notif_data[$row_key]['title'] = $notif_data[$row_key]['notification_data']['subject']; switch ($notif_data[$row_key]['recipient_type']) { case 'email': $icon = ' '; break; case 'waba': case 'whatsapp': $icon = ' '; break; default: $icon = ''; break; } } } return !empty($notif_data) ? $notif_data : $get; } function formipay_update_order_status($args) { $data = wp_parse_args( $args, [ 'form_id' => 0, 'order_id' => 0, 'payment_gateway' => '', 'status' => 'on-hold' ] ); $order_id = intval($data['order_id']); $order = new Formipay_Order(); // $get = $order->get($order_id); $update = $order->update($order_id, [ 'status' => $data['status'] ]); if(is_wp_error( $update )){ $response = [ 'valid' => false, 'message' => str_replace( [ '{{order_id}}', '{{system_error_message}}' ], [ $order_id, $update->get_error_message() ], formipay_get_post_meta($data['form_id'], $data['payment_gateway'] . '_confirmation_message_error') ) ]; }else{ $response = [ 'valid' => true, 'message' => str_replace( '{{order_id}}', $order_id, formipay_get_post_meta($data['form_id'], $data['payment_gateway'] . '_confirmation_message_success') ) ]; } return $response; } function formipay_date($format = '', $date = '') { if ($format == '') { $format = get_option('date_format') . ' ' . get_option('time_format'); } $timezone = new DateTimeZone(wp_timezone_string()); if (empty($date)) { $datetime = new DateTime('now', $timezone); } else { // Detect if $date is a timestamp (integer or numeric string) if (is_numeric($date) && (int)$date == $date) { // Create DateTime from timestamp $datetime = new DateTime('@' . $date); // UTC by default $datetime->setTimezone($timezone); } else { // Create DateTime from date string in UTC $datetime = new DateTime($date, new DateTimeZone('UTC')); $datetime->setTimezone($timezone); } } if ($format === 'timestamp') { return (int) $datetime->format('U'); } return $datetime->format($format); } function formipay_editor_hints() { $hints = [ 'buyer_name' => __( 'Buyer Name', 'formipay' ), 'product_name' => __( 'Product Name', 'formipay' ), 'order_id' => __( 'Order ID', 'formipay' ), 'order_date' => __( 'Order Date', 'formipay' ), 'order_total' => __( 'Order Total', 'formipay' ), 'order_status' => __( 'Order Status', 'formipay' ), 'order_details' => __( 'Order Details', 'formipay' ), 'form_submission' => __( 'All Field Submissions', 'formipay' ), 'payment_details' => __( 'Payment Details', 'formipay' ) ]; $hints = apply_filters( 'formipay/form-config/notification/hints', $hints ); return $hints; } function formipay_is_HTML($string){ return $string !== wp_strip_all_tags($string) ? true : false ; } function allow_style_attribute_for_all_tags($content) { // Get all standard HTML tags $allowed_tags = wp_kses_allowed_html('post'); // Iterate over the allowed tags and add 'style' attribute to each foreach ($allowed_tags as $tag => $attributes) { $allowed_tags[$tag]['style'] = array(); // Allow 'style' attribute } // Sanitize the content with the updated allowed tags return wp_kses($content, $allowed_tags); } function formipay_isPopup($post_id) { if(formipay_get_post_meta($post_id, 'form_display_as') == 'popup'){ return true; } return false; } function formipay_filesize($attachment_id) { $metadata = wp_get_attachment_metadata($attachment_id); $fileSize = $metadata['filesize']; $sizeLabels = ['B', 'KB', 'MB', 'GB']; $index = 0; while ($fileSize >= 1024 && $index < count($sizeLabels) - 1) { $fileSize /= 1024; $index++; } return number_format($fileSize, 2) . ' ' . $sizeLabels[$index]; } function formipay_attachment_icon($attachment_id = 0){ if($attachment_id > 0){ $get_attach = get_post($attachment_id); $mime = $get_attach->post_mime_type; $mime = explode('/', $mime); $type = $mime[1]; switch ($type) { case 'zip': $icon = ''; break; default: $icon = ''; break; } }else{ $icon = ''; } return $icon; } function order_meta_fields() { return array( 'user_id', 'session_id', 'referrer', 'page_url', 'timestamp', 'utm_source', 'utm_medium', 'utm_campaign', 'ip_address', 'user_agent' ); } function formipay_get_coupon_id_by_code($code, $form_id) { global $wpdb; // Validate input early if (empty($code) || empty($form_id)) { return false; } // Get coupon by code directly using title match $coupon_post = false; $query = new WP_Query([ 'post_type' => 'formipay-coupon', 'title' => $code, 'post_status' => 'publish', 'posts_per_page' => 1, 'fields' => 'all', // or 'ids' if you only need the ID ]); if (!empty($query->posts)) { $coupon_post = $query->posts[0]; // Returns the post object } if (!$coupon_post || $coupon_post->post_status !== 'publish') { return false; } $coupon_id = $coupon_post->ID; // Check active status first if (formipay_get_post_meta($coupon_id, 'active') !== 'on') { return false; } // Check form restrictions using meta query $allowed_forms = formipay_get_post_meta($coupon_id, 'forms'); if (!empty($allowed_forms)) { $forms = array_map('intval', explode(',', $allowed_forms)); if (!in_array((int)$form_id, $forms, true)) { return false; } } // Case sensitivity check if (formipay_get_post_meta($coupon_id, 'case_sensitive') === 'on') { $stored_code = get_the_title($coupon_id); if ($code !== $stored_code) { return false; } } // Check usage limits using meta counters $use_limit = (int)formipay_get_post_meta($coupon_id, 'use_limit'); if ($use_limit > 0) { $usage_count = (int)formipay_get_post_meta($coupon_id, 'usage_count'); if ($usage_count >= $use_limit) { return false; } } // Date validation with proper timezone handling $date_limit = formipay_get_post_meta($coupon_id, 'date_limit'); if (!empty($date_limit) && is_numeric($date_limit)) { $current_time = current_time('timestamp', true); if ($current_time > (int)$date_limit) { return false; } } return $coupon_id; } // Function to check if a string contains HTML tags like , , or function formipay_contains_html($string) { return preg_match('/<(img|svg|i)(\s|>)/i', $string); } function formipay_generate_password() { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!!!'; $charactersLength = strlen($characters); $password = ''; for ($i = 0; $i < 8; $i++) : $password .= $characters[wp_rand(0, $charactersLength - 1)]; endfor; $set_password = $password; return $set_password; } function formipay_customer_mandatory_data() { $mandatory_data = ['name']; $formipay_settings = get_option( 'formipay_settings' ); if(isset($formipay_settings['customer_mandatory_data'])) { foreach($formipay_settings['customer_mandatory_data'] as $category => $config){ if($config['id'] == 'mandatory'){ foreach($config['options'] as $data){ $mandatory_data[] = $data['id']; } } } } return $mandatory_data; } function formipay_phone_country_code_options() { $codes = formipay_country_array(); $options = []; foreach($codes as $code){ $country_code = $code['phone']; $options[$country_code] = '(' . $country_code . ') ' . $code['name']; } return $options; } function formipay_sanitize_array(array $input) { $sanitized = []; foreach ($input as $key => $value) { if (is_array($value)) { // Recursively sanitize nested arrays $sanitized[$key] = formipay_sanitize_array( $value); } else { // Sanitize scalar values (adjust sanitization as needed) $sanitized[$key] = sanitize_text_field( wp_unslash($value)); } } return $sanitized; } function formipay_generate_privacy_policy() { // Check if page already exists $existing_page = get_page_by_path('privacy-policy', OBJECT, 'page'); if (!$existing_page) { // Get site-specific information $site_name = esc_html(get_bloginfo('name')); $site_url = esc_url(home_url()); $admin_email = sanitize_email(get_bloginfo('admin_email')); $current_year = formipay_date('Y'); // Build policy content $content = file_get_contents(FORMIPAY_PATH . '/public/templates/privacy-policy.php'); // Create privacy policy page $page_id = wp_insert_post([ 'post_title' => __('Privacy Policy', 'formipay'), 'post_name' => 'privacy-policy', 'post_content' => $content, 'post_status' => 'draft', // Set to draft for admin review 'post_type' => 'page', 'post_author' => get_current_user_id(), 'meta_input' => [ '_formipay_generated_policy' => true, '_formipay_policy_version' => '1.0' ] ]); // Add admin notice if ($page_id && !is_wp_error($page_id)) { add_action('admin_notices', function() use ($page_id) { $edit_url = admin_url("post.php?post={$page_id}&action=edit"); echo '
'; echo '

' . sprintf( // translators: %s is the drafted page URL. esc_html__('Privacy Policy draft created. Review and publish', 'formipay'), esc_url($edit_url) ) . '

'; echo '
'; }); } } } function formipay_thankyoupage_allowed_html() { return [ 'div' => [ 'id' => true, 'class' => true, 'data-*' => true ], 'h1' => [ 'id' => true, 'class' => true, 'style' => true ], 'h2' => [ 'id' => true, 'class' => true, 'style' => true ], 'h3' => [ 'id' => true, 'class' => true, 'style' => true ], 'h4' => [ 'id' => true, 'class' => true, 'style' => true ], 'h5' => [ 'id' => true, 'class' => true, 'style' => true ], 'h6' => [ 'id' => true, 'class' => true, 'style' => true ], 'form' => [ 'id' => true, 'class' => true, 'action' => true, 'method' => true, 'enctype' => true ], 'input' => [ 'type' => true, 'name' => true, 'value' => true, 'class' => true, 'id' => true, 'accept' => true, 'style' => true, 'data-*' => true ], 'button' => [ 'id' => true, 'class' => true, 'type' => true, 'data-*' => true ], 'img' => [ 'src' => true, 'alt' => true, 'class' => true, 'id' => true ], 'p' => ['class' => true], 'b' => [], 'i' => ['class' => true], 'table' => ['id' => true, 'class' => true], 'tbody' => [], 'tr' => [], 'th' => [], 'td' => [], 'br' => [] ]; }