Current File : /home/inlingua/www/crm/ninexb/wp-content/plugins/tablesome/workflow-library/triggers/fluent.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\Fluent')) {
    class Fluent extends Abstract_Trigger
    {

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

        public $unsupported_formats = array(
            'custom_html',
            'section_break',
            'shortcode',
            'action_hook',
            'input_password',
            'form_step',
            'tabular_grid',
            'custom_submit_button',
            'save_progress_button',
            'recaptcha',
            'hcaptcha',
            'turnstile',
            'repeater_field',
            'chained_select',

            // Payments fields
            'payment_summary_component',
            'subscription_payment_component',
        );

        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 = function_exists('wpFluent') ? true : false;
            return array(
                'integration' => 'fluent',
                'integration_label' => __('Fluent Forms', 'tablesome'),
                'trigger' => 'tablesome_fluent_form_submit',
                'trigger_id' => 7,
                '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' => 'fluentform_submission_inserted',
                        'callback_name' => 'trigger_callback',
                    ),
                ),
                'supported_actions' => [],
                'unsupported_actions' => [8, 9]
            );
        }

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

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

        public function get_posts()
        {
            $exists = function_exists('wpFluent') && method_exists(wpFluent()->table('fluentform_forms'), 'get');
            if (!$exists) {
                return [];
            }

            $forms = wpFluent()->table('fluentform_forms')
                ->select(array('id', 'title'))
                ->orderBy('id', 'DESC')
                ->get();
            if (empty($forms)) {
                return [];
            }

            $posts = [];
            foreach ($forms as $form) {
                $posts[] = array(
                    'id' => (int) $form->id,
                    'label' => esc_html($form->title) . " (ID: " . $form->id . ")",
                    'integration_type' => 'fluent',
                );
            }
            return $posts;
        }

        public function get_post_fields($id, array $args = array())
        {
            if (!function_exists('wpFluent')) {
                return [];
            }

            $formApi = fluentFormApi('forms')->form($id);
            $form = $formApi->fields();

            if (!isset($form["fields"]) && empty($form["fields"])) {
                return [];
            }

            // error_log('form_fields  : ' . print_r($form["fields"], true));

            return $this->get_fields($form["fields"]);

        }

        public function get_fields($form_fields, $fields = [], $parent = [])
        {
            foreach ($form_fields as $form_field) {
                /**
                 * Making sure field id must consit of parent and child field id because address fields consist of its own set of fields like
                 * address_line_1, address_line_2, city, state, zip and country. This why we have to piping parent and child with dot(.)
                 * Followings are examples:-
                 * 1. address_1.country and address_1.zip
                 * 2. address_2.city and address_2.zip
                 * */

                // error_log('fluent->get_fields() form_field  : ' . print_r($form_field, true));

                $attribute_name = isset($form_field['attributes']["name"]) && !empty($form_field['attributes']["name"]) ? $form_field['attributes']["name"] : '';
                $id = isset($parent) && !empty($parent) ? $parent['id'] . "." . $attribute_name : $attribute_name;
                $type = isset($form_field['element']) ? $form_field['element'] : '';
                $admin_label = isset($form_field["settings"]['admin_field_label']) && !empty($form_field["settings"]['admin_field_label']) ? $form_field["settings"]['admin_field_label'] : '';
                $label = isset($form_field["settings"]['label']) && !empty($form_field["settings"]['label']) ? $form_field["settings"]['label'] : $admin_label;
                $label = isset($parent) && !empty($parent) ? $parent['label'] . " - " . $label : $label;

                if (isset($form_field["columns"]) && !empty($form_field["columns"])) {
                    foreach ($form_field["columns"] as $column) {
                        $column_fields = $this->get_fields($column["fields"]);
                        $fields = array_merge($fields, $column_fields);
                    }
                    continue;
                }

                if (!empty($type) && $type == "address") {

                    $parent_field = [
                        'id' => $id,
                        'label' => $label,
                    ];
                    $address_fields = $this->get_fields($form_field["fields"], [], $parent_field);
                    $fields = array_merge($fields, $address_fields);
                    continue;
                }

                if (!in_array($type, $this->unsupported_formats)) {

                    $field = [
                        "id" => $id,
                        "label" => $label,
                        //TODO: need to remove ternary condition specific for send_email action.
                        "field_type" => $type == "input_email" ? 'email' : $type,
                    ];

                    $have_options = (isset($form_field['settings']["advanced_options"]) && !empty($form_field['settings']["advanced_options"]));
                    if ($have_options) {
                        $field['options'] = $this->get_formatted_options($form_field['settings']["advanced_options"]);
                    }
                    $fields[] = $field;
                }
            }
            return $fields;
        }

        public function trigger_callback($entry_id, $data, $form)
        {
            $fields = $this->get_post_fields($form->id);

            $submission_data = $this->get_formatted_posted_data($fields, $data);
            $submission_data = apply_filters("tablesome_form_submission_data", $submission_data);

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

            $this->trigger_source_id = $form->id;
            $this->trigger_source_data = array(
                'integration' => $this->get_config()['integration'],
                'form_title' => $form->title,
                '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_formatted_posted_data($fields, $form_data)
        {
            $data = array();
            if (empty($fields)) {
                return $data;
            }
            foreach ($fields as $field) {
                $field_ids = explode(".", $field['id']);
                $does_parent_exists = count($field_ids) > 1;
                $value = isset($form_data[$field['id']]) ? $form_data[$field['id']] : '';
                $value = $does_parent_exists && isset($form_data[$field_ids[0]][$field_ids[1]]) ? $form_data[$field_ids[0]][$field_ids[1]] : $value;
                $type = $field['field_type'];

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

                if ($type == 'input_name') {
                    $value = implode(' ', $value);
                } else if ($type == 'input_date' && !empty($value)) {
                    $date_obj = date_parse($value);
                    if (isset($date_obj) && !empty($date_obj)) {
                        $date = $date_obj['year'] . '-' . $date_obj['month'] . '-' . $date_obj['day'];
                        $unix_timestamp = (int) convert_tablesome_date_to_unix_timestamp($date, 'Y-m-d');
                        $unix_timestamp = $unix_timestamp * 1000; // convert to milliseconds
                    }

                } else if ($type == 'input_file' || $type == 'input_image') {
                    $value = is_array($value) ? $value[0] : $value;
                    $file_url = $value;
                    $file_type = wp_check_filetype($value);
                } else if (($type == 'select' || $type == 'input_checkbox') && is_array($value)) {
                    $value = implode(', ', $value);
                }

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

                if ($type == 'input_file' || $type == 'input_image') {
                    // $data[$name]['type'] = 'file';
                    error_log(' Fluent file_type : ' . print_r($file_type, true));
                    $data[$field['id']]['file_type'] = isset($file_type) ? $file_type['type'] : '';
                    $data[$field['id']]['linkText'] = 'View File';
                    $data[$field['id']]['file_url'] = $file_url ?? '';
                }
            }
            return $data;
        }

        public function get_formatted_options($form_field_options)
        {
            $options = array();
            foreach ($form_field_options as $option) {
                $options[] = array(
                    'id' => $option["value"],
                    'label' => $option['label'],
                );
            }
            return $options;
        }
    }
}