* @copyright 2019 Closemarketing
* @version 1.0
*/
GFForms::include_feed_addon_framework();
global $formscrm_api;
class GFCRM extends GFFeedAddOn {
protected $_version = FORMSCRM_VERSION;
protected $_min_gravityforms_version = '1.9.0';
protected $_slug = 'formscrm';
protected $_path = 'formscrm/crm.php';
protected $_full_path = __FILE__;
protected $_url = 'https://www.formscrm.com';
protected $_title = 'CRM Add-On';
protected $_short_title = 'FormsCRM';
// Members plugin integration.
protected $_capabilities = array(
'formscrm',
'formscrm_uninstall',
);
// Permissions.
protected $_capabilities_settings_page = 'formscrm';
protected $_capabilities_form_settings = 'formscrm';
protected $_capabilities_uninstall = 'formscrm_uninstall';
protected $_enable_rg_autoupgrade = true;
private static $_instance = null;
private $crmlib;
public static function get_instance() {
if ( self::$_instance == null ) {
self::$_instance = new GFCRM();
}
return self::$_instance;
}
/**
* Init function of library
*
* @return void
*/
public function init() {
parent::init();
load_plugin_textdomain( 'formscrm', FALSE, '/formscrm/languages' );
}
public function init_admin() {
parent::init_admin();
$this->ensure_upgrade();
}
/**
* Plugin settings
*
* @return void
*/
public function plugin_settings_fields() {
global $formscrm_api;
return array(
array(
'title' => __( 'CRM Account Information', 'formscrm' ),
'description' => __( 'Use this connector with CRM software. Use Gravity Forms to collect customer information and automatically add them to your CRM Leads.', 'formscrm' ),
'fields' => array(
array(
'name' => 'fc_crm_type',
'label' => __( 'CRM Type', 'formscrm' ),
'type' => 'select',
'class' => 'medium',
'onchange' => 'jQuery(this).parents("form").submit();',
'choices' => formscrm_get_choices(),
),
array(
'name' => 'fc_crm_url',
'label' => __( 'CRM URL', 'formscrm' ),
'type' => 'text',
'class' => 'medium',
'tooltip' => __( 'Use the URL with http and the ending slash /.', 'formscrm' ),
'tooltip_class' => 'tooltipclass',
'dependency' => array(
'field' => 'fc_crm_type',
'values' => formscrm_get_dependency_url(),
),
),
array(
'name' => 'fc_crm_username',
'label' => __( 'Username', 'formscrm' ),
'type' => 'text',
'class' => 'medium',
'dependency' => array(
'field' => 'fc_crm_type',
'values' => formscrm_get_dependency_username(),
),
'feedback_callback' => $this->login_api_crm(),
),
array(
'name' => 'fc_crm_password',
'label' => __('Password', 'formscrm' ),
'type' => 'api_key',
'class' => 'medium',
'tooltip' => __( 'Use the password of the actual user.', 'formscrm' ),
'tooltip_class' => 'tooltipclass',
'dependency' => array(
'field' => 'fc_crm_type',
'values' => formscrm_get_dependency_password(),
),
),
array(
'name' => 'fc_crm_apipassword',
'label' => __('API Password for User', 'formscrm'),
'type' => 'api_key',
'class' => 'medium',
//'feedback_callback' => $this->login_api_crm(),
'tooltip' => __('Find the API Password in the profile of the user in CRM.', 'formscrm'),
'tooltip_class' => 'tooltipclass',
'dependency' => array(
'field' => 'fc_crm_type',
'values' => formscrm_get_dependency_apipassword(),
),
),
array(
'name' => 'fc_crm_apisales',
'label' => __('Password and Security Key', 'formscrm'),
'type' => 'api_key',
'class' => 'medium',
'tooltip' => __( '"Password""SecurityKey" Go to My Settings / Reset my Security Key.', 'formscrm'),
'tooltip_class' => 'tooltipclass',
'dependency' => array(
'field' => 'fc_crm_type',
'values' => formscrm_get_dependency_apisales(),
),
),
array(
'name' => 'fc_crm_odoodb',
'label' => __( 'Odoo DB Name', 'formscrm' ),
'type' => 'text',
'class' => 'medium',
'dependency' => array(
'field' => 'fc_crm_type',
'values' => formscrm_get_dependency_odoodb(),
),
),
),
),
);
}
public function settings_api_key( $field, $echo = true ) {
$field['type'] = 'text';
$api_key_field = $this->settings_text( $field, false );
//switch type="text" to type="password" so the key is not visible
$api_key_field = str_replace('type="text"', 'type="password"', $api_key_field);
$caption = '' . sprintf( esc_html__( 'Find a Password or API key depending of CRM.', 'formscrm' ) ) . '';
if ( $echo ) {
echo esc_html( $api_key_field ) . '' . esc_html( $caption );
}
return $api_key_field . '' . $caption;
}
/**
* Forms Settings
*
* @param array $form Form.
* @param string $feed_id Feed id.
* @return void
*/
public function feed_edit_page( $form, $feed_id ) {
// Ensures valid credentials were entered in the settings page.
if ( false == $this->login_api_crm() ) {
?>
get_plugin_settings_url() ) . '">' . esc_html__( 'Use Settings Page', 'formscrm' ) . '';
?>
var form = ' . esc_html( GFCommon::json_encode( $form ) ) . ';';
parent::feed_edit_page( $form, $feed_id );
}
/**
* Include library connector
*
* @param string $crmtype Type of CRM.
* @return void
*/
private function include_library( $crmtype ) {
if ( isset( $_POST['_gform_setting_fc_crm_type'] ) ) {
$crmtype = sanitize_text_field( $_POST['_gform_setting_fc_crm_type'] );
}
if ( isset( $crmtype ) ) {
$crmname = strtolower( $crmtype );
$crmclassname = str_replace( ' ', '', $crmname );
$crmclassname = 'CRMLIB_' . strtoupper( $crmclassname );
$crmname = str_replace( ' ', '_', $crmname );
$array_path = formscrm_get_crmlib_path();
if ( isset( $array_path[ $crmname ] ) ) {
include_once $array_path[ $crmname ];
}
formscrm_debug_message( $array_path[ $crmname ]);
if ( class_exists( $crmclassname ) ) {
$this->crmlib = new $crmclassname();
}
}
}
public function feed_settings_fields() {
$settings = $this->get_plugin_settings();
$this->include_library( $settings['fc_crm_type'] );
return array(
array(
'title' => __('CRM Feed', 'formscrm'),
'description' => '',
'fields' => array(
array(
'name' => 'feedName',
'label' => __('Name', 'formscrm' ),
'type' => 'text',
'required' => true,
'class' => 'medium',
'tooltip' => '' . __('Name', 'formscrm' ) . '
' . __( 'Enter a feed name to uniquely identify this setup.', 'formscrm' ),
),
array(
'name' => 'gf_crm_module',
'label' => __( 'CRM Module', 'formscrm' ),
'type' => 'select',
'class' => 'medium',
'onchange' => 'jQuery(this).parents("form").submit();',
'choices' => $this->crmlib->list_modules( $settings ),
),
array(
'name' => 'listFields',
'label' => __('Map Fields', 'formscrm' ),
'type' => 'field_map',
'dependency' => 'gf_crm_module',
'field_map' => $this->crmlib->list_fields( $settings, $this->get_setting( 'gf_crm_module' ) ),
'tooltip' => '' . __( 'Map Fields', 'formscrm' ) . '
' . __('Associate your CRM custom fields to the appropriate Gravity Form fields by selecting the appropriate form field from the list.', 'formscrm' ),
),
),
),
);
}
public function ensure_upgrade() {
if (get_option('gf_crm_upgrade')) {
return false;
}
$feeds = $this->get_feeds();
if (empty($feeds)) {
//Force Add-On framework upgrade
$this->upgrade('2.0');
}
update_option('gf_crm_upgrade', 1);
}
public function feed_list_columns() {
return array(
'feedName' => __('Name', 'formscrm'),
);
}
public function process_feed( $feed, $entry, $form ) {
if ( ! $this->is_valid_key() ) {
return;
}
$this->export_feed( $entry, $form, $feed );
}
public function export_feed( $entry, $form, $feed) {
$settings = $this->get_plugin_settings();
$this->include_library($settings['fc_crm_type']);
if (!empty($feed['meta']['listFields_first_name'])) {
$name = $this->get_name($entry, $feed['meta']['listFields_first_name']);
}
$merge_vars = array();
$field_maps = $this->get_field_map_fields($feed, 'listFields');
foreach ($field_maps as $var_key => $field_id) {
$field = RGFormsModel::get_field( $form, $field_id );
if ( isset( $field['type'] ) && GFCommon::is_product_field($field['type']) && rgar( $field, 'enablePrice' )) {
$ary = explode('|', $entry[$field_id]);
$product_name = count($ary) > 0 ? $ary[0] : '';
$merge_vars[] = array('name' => $var_key, 'value' => $product_name);
} elseif ( $field && RGFormsModel::get_input_type($field) == 'checkbox') {
$value = '';
foreach ($field['inputs'] as $input) {
$index = (string) $input['id'];
$value_n = apply_filters('formscrm_field_value', rgar($entry, $index), $form['id'], $field_id, $entry);
$value .= $value_n;
if ($value_n) {
$value .= '|';
}
}
$value = substr($value, 0, -1);
$merge_vars[] = array(
'name' => $var_key,
'value' => $value,
);
} elseif ( $field && RGFormsModel::get_input_type($field) == 'multiselect') {
$value = apply_filters('formscrm_field_value', rgar($entry, $field_id), $form['id'], $field_id, $entry);
$value = str_replace(',', '|', $value);
$merge_vars[] = array(
'name' => $var_key,
'value' => $value,
);
} elseif ( $field && RGFormsModel::get_input_type($field) == 'textarea') {
$value = apply_filters('formscrm_field_value', rgar($entry, $field_id), $form['id'], $field_id, $entry);
$value = str_replace(array("\r", "\n"), ' ', $value);
$merge_vars[] = array(
'name' => $var_key,
'value' => $value,
);
} else {
$merge_vars[] = array(
'name' => $var_key,
'value' => apply_filters( 'formscrm_field_value', rgar( $entry, $field_id ), $form['id'], $field_id, $entry ),
);
}
}
$override_custom_fields = apply_filters( 'formscrm_override_blank_custom_fields', false, $entry, $form, $feed );
if ( ! $override_custom_fields ) {
$merge_vars = $this->remove_blank_custom_fields( $merge_vars );
}
$settings = $this->get_plugin_settings();
formscrm_debug_message( $settings );
formscrm_debug_message( $merge_vars );
$id = $this->crmlib->create_entry( $settings, $merge_vars );
formscrm_debug_message( $id );
}
private static function remove_blank_custom_fields( $merge_vars ) {
$i = 0;
$count = count( $merge_vars );
for ( $i = 0; $i < $count; $i++ ) {
if ( rgblank( $merge_vars[$i]['value'] ) ) {
unset( $merge_vars[$i] );
}
}
//resort the array because items could have been removed, this will give an error from CRM if the keys are not in numeric sequence
sort( $merge_vars );
return $merge_vars;
}
private function get_name( $entry, $field_id ) {
// If field is simple (one input), simply return full content.
$name = rgar( $entry, $field_id );
if ( ! empty( $name ) ) {
return $name;
}
//Complex field (multiple inputs). Join all pieces and create name
$prefix = trim(rgar($entry, $field_id . '.2'));
$first = trim(rgar($entry, $field_id . '.3'));
$last = trim(rgar($entry, $field_id . '.6'));
$suffix = trim(rgar($entry, $field_id . '.8'));
$name = $prefix;
$name .= !empty($name) && !empty($first) ? " $first" : $first;
$name .= !empty($name) && !empty($last) ? " $last" : $last;
$name .= !empty($name) && !empty($suffix) ? " $suffix" : $suffix;
return $name;
}
private function is_valid_key() {
$result_api = $this->login_api_crm();
return $result_api;
}
private function login_api_crm() {
$login_result = false;
// Logins to CRM.
$settings = $this->get_plugin_settings();
if ( isset( $settings['fc_crm_type'] ) ) {
$this->include_library($settings['fc_crm_type']);
}
if ( isset( $this->crmlib ) ) {
$login_result = $this->crmlib->login( $settings );
formscrm_debug_message( $login_result );
}
formscrm_testserver();
if ( ! isset( $login_result ) ) {
$login_result = '';
}
return $login_result;
}
} //from main class