Current File : /home/inlingua/www/crm/ninexb/wp-content/plugins/tablesome/workflow-library/triggers/forminator.php
<?php

namespace Tablesome\Workflow_Library\Triggers;

use Tablesome\Includes\Modules\Workflow\Abstract_Trigger;

if (!defined('ABSPATH')) {
    exit;
} // Exit if accessed directly

if (!class_exists('\Tablesome\Workflow_Library\Triggers\Forminator')) {
    class Forminator extends Abstract_Trigger
    {

        public $trigger_source_id = 0;
        public $trigger_source_data = array();

        public $unsupported_formats = array(
            // 'stripe',
            // 'paypal',
            'captcha',
        );

        public static $instance = null;

        public static function get_instance()
        {
            if (is_null(self::$instance)) {
                self::$instance = new self();
            }
            return self::$instance;
        }

        public function get_config()
        {
            $is_active = class_exists('Forminator') ? true : false;
            return array(
                'integration' => 'forminator',
                'integration_label' => __('Forminator', 'tablesome'),
                'trigger' => 'tablesome_forminator_form_submit',
                'trigger_id' => 4,
                'trigger_label' => __('On Form Submit', 'tablesome'),
                'trigger_type' => 'forms',
                'is_active' => $is_active,
                'is_premium' => "no",
                'hooks' => array(
                    array(
                        'priority' => 10,
                        'accepted_args' => 3,
                        'name' => 'forminator_custom_form_submit_before_set_fields',
                        'callback_name' => 'trigger_callback',
                    ),
                ),
                'supported_actions' => [],
                'unsupported_actions' => [8, 9]
            );
        }

        public function trigger_callback($entry, $form_id, $fields_data)
        {
            $entry_id = $entry->entry_id;

            $form = \Forminator_API::get_form($form_id);

            // error_log(' Forminator form : ' . print_r($form, true));
            // error_log(' Forminator fields_data : ' . print_r($fields_data, true));
            // error_log(' Forminator entry : ' . print_r($entry, true));
            $submission_data = $this->get_formatted_posted_data($fields_data, $form);
            $submission_data = apply_filters("tablesome_form_submission_data", $submission_data);

            // error_log(' Forminator submission_data : ' . print_r($submission_data, true));

            $this->trigger_source_id = $form_id;
            $this->trigger_source_data = array(
                'integration' => $this->get_config()['integration'],
                'form_title' => isset($form->settings['formName']) ? $form->settings['formName'] : 'Untitled Table - ' . $form_id,
                'form_id' => $form_id,
                'data' => $submission_data,
            );

            $this->run_triggers($this, $this->trigger_source_data);
        }

        public function conditions($trigger_meta, $trigger_data)
        {
            $integration = isset($trigger_meta['integration']) ? $trigger_meta['integration'] : '';
            $trigger_id = isset($trigger_meta['trigger_id']) ? $trigger_meta['trigger_id'] : '';

            if ($integration != $this->get_config()['integration'] || $trigger_id != $this->get_config()['trigger_id']) {
                return false;
            }

            $trigger_source_id = isset($trigger_meta['form_id']) ? $trigger_meta['form_id'] : 0;
            if (isset($trigger_data['form_id']) && $trigger_data['form_id'] == $trigger_source_id) {
                return true;
            }
            return false;
        }

        public function get_collection()
        {
            $posts = $this->get_posts();
            if (empty($posts)) {
                return [];
            }

            foreach ($posts as $index => $post) {
                $posts[$index]['fields'] = $this->get_post_fields($post['id']);
            }
            return $posts;
        }

        public function get_posts()
        {
            if (!class_exists('Forminator')) {
                return [];
            }

            $forms = \Forminator_API::get_forms(null, 1, -1, '');

            if (is_wp_error($forms) || empty($forms)) {
                return [];
            }
            $posts = [];
            foreach ($forms as $form) {
                $posts[] = array(
                    'id' => $form->id,
                    'label' => $form->settings['formName'] . " (ID: " . $form->id . ")",
                    'integration_type' => 'forminator',
                );
            }
            return $posts;

        }

        public function get_post_fields($id, $args = array())
        {
            if (!class_exists('Forminator')) {
                return [];
            }
            $fields = \Forminator_API::get_form_fields($id);
            if (is_wp_error($fields) || empty($fields)) {
                return [];
            }

            $form_fields = array();

            foreach ($fields as $field_obj) {

                $type = $field_obj->__get('type');
                $id = $field_obj->__get('element_id');
                $label = $field_obj->__get('field_label');
                if (in_array($type, $this->unsupported_formats)) {
                    continue;
                }

                $field = array(
                    'id' => $id,
                    'label' => !empty($label) ? $label : $id,
                    'field_type' => $type,
                );

                $options = $field_obj->__get('options');

                if (!empty($options)) {

                    $options = (array_map(function ($option) {
                        $return_data = $option;
                        $return_data['id'] = $return_data['value'];
                        return $return_data;
                    }, $options));

                    $field['options'] = $options;
                }
                $form_fields[] = $field;
            }

            $form_fields = $this->post_processing_fields($form_fields);
            return $form_fields;
        }

        public function get_formatted_posted_data($fields_data, $form_obj)
        {
            $data = array();

            // Gettings other paypal fields

            foreach ($fields_data as $field_data) {
                $name = $field_data['name'];
                $additional_data = [];

                if (in_array($name, ['_forminator_user_ip'])) {
                    continue;
                }

                $field = \Forminator_API::get_form_field($form_obj->id, $name, true);

                // error_log(' Forminator field : ' . print_r($field, true));
                // error_log(' Forminator field_data : ' . print_r($field_data, true));

                if (is_wp_error($field)) {
                    continue;
                }

                $type = $field['type'];

                if (in_array($type, $this->unsupported_formats)) {
                    continue;
                }

                if ($type == 'paypal') {
                    $value = isset($field_data['value']) && isset($field_data['value']['status']) ? $field_data['value']['status'] : '';
                    $additional_data = isset($field_data['value']) && isset($field_data['value']) ? $field_data['value'] : [];
                } else {
                    $value = isset($field_data['value']) ? $field_data['value'] : '';
                }

                if ($type == 'date') {
                    $incoming_date_format = $field_data['field_array']['date_format'];
                    // $incoming_date_format = 'm-d-Y';
                    // Note: Special Conversion for Forminator Date Field
                    $incoming_date_format = str_replace("dd", "d", $incoming_date_format);
                    $incoming_date_format = str_replace("mm", "m", $incoming_date_format);
                    $incoming_date_format = str_replace("yy", "Y", $incoming_date_format);

                    $unix_timestamp = (int) convert_tablesome_date_to_unix_timestamp($value, $incoming_date_format);
                    // $unix_timestamp = strtotime($value);
                    $unix_timestamp = $unix_timestamp * 1000; // convert to milliseconds

                    // error_log('$incoming_date_format : ' . $incoming_date_format);
                    // error_log('$unix_timestamp : ' . $unix_timestamp);

                } else if ($type == 'postdata') {
                    /** Get the Post ID */
                    $value = isset($value['postdata']) ? $value['postdata'] : 0;
                } else if ($type == 'file') {
                    $attachment_id = isset($value['file']) ? $value['file'] : '';
                    $value = $attachment_id;

                } else if ($type == 'upload') {
                    $file = isset($value['file']) ? $value['file'] : '';

                    // error_log(' Forminator file : ' . print_r($file, true));

                    $value = '';
                    if (isset($file['success']) && $file['success'] == 1 && isset($file['file_url'])) {
                        $file_url = is_array($file['file_url']) ? implode(',', $file['file_url']) : $file['file_url'];

                        $value = '';
                        // $value = attachment_url_to_postid($url);
                        $file_type = wp_check_filetype($file_url);

                        // error_log(' Forminator url : ' . $url);
                        // error_log(' Forminator value : ' . $value);
                    }
                } else {
                    if (is_array($value) && !empty($value)) {
                        if ($type == 'time') {
                            $value = sprintf('%02d', $value['hours']) . ':' . sprintf('%02d', $value['minutes']) . ' ' . $value['ampm'];
                        } else if ($type == 'calculation') {
                            $value = isset($value['result']) ? $value['result'] : '';
                        } else if ($type == 'name') {
                            $value = implode(' ', $value);
                        } else {
                            $value = implode(', ', $value);
                        }
                    }
                }

                $data[$name] = array(
                    'type' => $type,
                    'label' => isset($field['field_label']) && !empty($field['field_label']) ? $field['field_label'] : $name,
                    'value' => $value ?? '',
                    'unix_timestamp' => isset($unix_timestamp) ? $unix_timestamp : '', // use this prop when the column format type is date
                    'additional_data' => $additional_data,
                );

                if ($type == 'upload') {
                    // $data[$name]['type'] = 'file';
                    // error_log(' Forminator file_type : ' . print_r($file_type, true));
                    $data[$name]['file_type'] = isset($file_type) ? $file_type['type'] : '';
                    $data[$name]['linkText'] = 'View File';
                    $data[$name]['file_url'] = $file_url ?? '';
                    $data[$name]['type'] = 'file';
                }
            }

            // $old_url = 'http://tablesome-dev.local/wp-content/uploads/forminator/617_7a9de121849d5b46ac6356cb2bc211ef/uploads/uGUH9tJmPivK-Copy.of_.Member.Roster.Tab_.csv';
            // $old_attachment_id = attachment_url_to_postid($old_url);
            // error_log(' Forminator old_attachment_id : ' . $old_attachment_id);

            $data = $this->post_processing($data);
            // error_log(' Forminator formatted data : ' . print_r($data, true));
            return $data;
        }

        public function post_processing_fields($form_fields)
        {

            end($form_fields);
            $last_key = key($form_fields);
            reset($form_fields);
            // error_log(' Forminator form_fields : ' . print_r($form_fields, true));
            // Processing for paypal fields

            $last_key = $last_key + 1;
            foreach ($form_fields as $primary_key => $field) {

                if ($field['field_type'] == 'paypal') {
                    $form_fields[$last_key++] = [
                        'id' => $field['id'] . '_mode',
                        'label' => 'Mode',
                        'field_type' => 'paypal',
                    ];

                    $form_fields[$last_key++] = [
                        'id' => $field['id'] . '_transaction_id',
                        'label' => 'Transaction ID',
                        'field_type' => 'paypal',
                    ];

                    $form_fields[$last_key++] = [
                        'id' => $field['id'] . '_status',
                        'label' => 'Payment Status',
                        'field_type' => 'paypal',
                    ];

                    $form_fields[$last_key++] = [
                        'id' => $field['id'] . '_amount',
                        'label' => 'Payment Amount',
                        'field_type' => 'paypal',
                    ];

                    $form_fields[$last_key++] = [
                        'id' => $field['id'] . '_currency',
                        'label' => 'Payment Currency',
                        'field_type' => 'paypal',
                    ];

                    $form_fields[$last_key++] = [
                        'id' => $field['id'] . '_transaction_link',
                        'label' => 'Transaction Link',
                        'field_type' => 'paypal',
                    ];

                }
            }

            // error_log(' Forminator form_fields eenndd: ' . print_r($form_fields, true));
            return $form_fields;
        }
        public function post_processing($data)
        {

            // Processing for paypal fields
            foreach ($data as $key => $field) {
                if ($field['type'] == 'paypal') {
                    $data[$key]['value'] = $field['value'];

                    // Mode
                    if (isset($field['additional_data']['mode'])) {
                        $data[$key . '_mode'] = array(
                            'type' => 'paypal',
                            'label' => 'Mode',
                            'value' => isset($field['additional_data']['mode']) ? $field['additional_data']['mode'] : '',
                        );
                    }

                    // Transaction ID
                    if (isset($field['additional_data']['transaction_id'])) {
                        $data[$key . '_transaction_id'] = array(
                            'type' => 'paypal',
                            'label' => 'Transaction ID',
                            'value' => isset($field['additional_data']['transaction_id']) ? $field['additional_data']['transaction_id'] : '',
                        );
                    }

                    // Payment Status
                    if (isset($field['additional_data']['status'])) {
                        $data[$key . '_status'] = array(
                            'type' => 'paypal',
                            'label' => 'Payment Status',
                            'value' => isset($field['additional_data']['status']) ? $field['additional_data']['status'] : '',
                        );
                    }

                    // Payment Amount
                    if (isset($field['additional_data']['amount'])) {
                        $data[$key . '_amount'] = array(
                            'type' => 'paypal',
                            'label' => 'Payment Amount',
                            'value' => isset($field['additional_data']['amount']) ? $field['additional_data']['amount'] : '',
                        );
                    }

                    // Payment Currency
                    if (isset($field['additional_data']['currency'])) {
                        $data[$key . '_currency'] = array(
                            'type' => 'paypal',
                            'label' => 'Payment Currency',
                            'value' => isset($field['additional_data']['currency']) ? $field['additional_data']['currency'] : '',
                        );
                    }

                    // Transaction Link
                    if (isset($field['additional_data']['transaction_link'])) {
                        $data[$key . '_transaction_link'] = array(
                            'type' => 'paypal',
                            'label' => 'Transaction Link',
                            'value' => isset($field['additional_data']['transaction_link']) ? $field['additional_data']['transaction_link'] : '',
                        );
                    }

                }
            } // End of foreach

            return $data;
        }
    } // End of class
}