PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 1.1.8
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v1.1.8
3.3.1 V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 All 138 releases
bit-form / includes / Core / Integration / ZohoCRM / ZohoCRMHandler.php

ZohoCRMHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 1.1.8, at includes/Core/Integration/ZohoCRM/ZohoCRMHandler.php

441 lines 19.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * ZohoCrm Integration
5 *
6 */
7
8 namespace BitCode\BitForm\Core\Integration\ZohoCRM;
9
10 use WP_Error;
11 use BitCode\BitForm\Core\Util\IpTool;
12 use BitCode\BitForm\Core\Util\HttpHelper;
13 use BitCode\BitForm\Core\Integration\IntegrationHandler;
14 use BitCode\BitForm\Core\Integration\ZohoCRM\RecordApiHelper;
15 use BitCode\BitForm\Core\Util\ApiResponse as UtilApiResponse;
16
17 /**
18 * Provide functionality for ZohoCrm integration
19 */
20 class ZohoCRMHandler
21 {
22 private $_formID;
23 private $_integrationID;
24
25 public function __construct($integrationID, $fromID)
26 {
27 $this->_formID = $fromID;
28 $this->_integrationID = $integrationID;
29 $this->_logResponse = new UtilApiResponse();
30 }
31
32 /**
33 * Helps to register ajax function's with wp
34 *
35 * @return null
36 */
37 public static function registerAjax()
38 {
39 add_action('wp_ajax_bitforms_zcrm_generate_token', array(__CLASS__, 'generateTokens'));
40 add_action('wp_ajax_bitforms_zcrm_refresh_modules', array(__CLASS__, 'refreshModulesAjaxHelper'));
41 add_action('wp_ajax_bitforms_zcrm_refresh_layouts', array(__CLASS__, 'refreshLayoutsAjaxHelper'));
42 }
43
44 /**
45 * Process ajax request for generate_token
46 *
47 * @return JSON zoho crm api response and status
48 */
49 public static function generateTokens()
50 {
51 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field($_REQUEST['_ajax_nonce']), 'bitforms_save')) {
52 $inputJSON = file_get_contents('php://input');
53 $requestsParams = json_decode($inputJSON);
54 if (
55 empty($requestsParams->{'accounts-server'})
56 || empty($requestsParams->dataCenter)
57 || empty($requestsParams->clientId)
58 || empty($requestsParams->clientSecret)
59 || empty($requestsParams->redirectURI)
60 || empty($requestsParams->code)
61 ) {
62 wp_send_json_error(
63 __(
64 'Requested parameter is empty',
65 'bitforms'
66 ),
67 400
68 );
69 }
70 $apiEndpoint = \urldecode($requestsParams->{'accounts-server'}) . '/oauth/v2/token';
71 $requestParams = array(
72 "grant_type" => "authorization_code",
73 "client_id" => $requestsParams->clientId,
74 "client_secret" => $requestsParams->clientSecret,
75 "redirect_uri" => \urldecode($requestsParams->redirectURI),
76 "code" => $requestsParams->code
77 );
78 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
79 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
80 wp_send_json_error(
81 empty($apiResponse->error) ? 'Unknown' : $apiResponse->error,
82 400
83 );
84 }
85 $apiResponse->generates_on = \time();
86 wp_send_json_success($apiResponse, 200);
87 } else {
88 wp_send_json_error(
89 __(
90 'Token expired',
91 'bitform'
92 ),
93 401
94 );
95 }
96 }
97 /**
98 * Process ajax request for refresh crm modules
99 *
100 * @return JSON crm module data
101 */
102 public static function refreshModulesAjaxHelper()
103 {
104 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field($_REQUEST['_ajax_nonce']), 'bitforms_save')) {
105 $inputJSON = file_get_contents('php://input');
106 $queryParams = json_decode($inputJSON);
107 if (
108 empty($queryParams->tokenDetails)
109 || empty($queryParams->dataCenter)
110 || empty($queryParams->clientId)
111 || empty($queryParams->clientSecret)
112 ) {
113 wp_send_json_error(
114 __(
115 'Requested parameter is empty',
116 'bitforms'
117 ),
118 400
119 );
120 }
121 $response = [];
122 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
123 $response['tokenDetails'] = ZohoCRMHandler::_refreshAccessToken($queryParams);
124 }
125 $zohosIntegratedModules = array(
126 'zohosign__ZohoSign_Document_Events',
127 'zohoshowtime__ShowTime_Sessions',
128 'zohoshowtime__Zoho_ShowTime',
129 'zohosign__ZohoSign_Documents',
130 'zohosign__ZohoSign_Recipients'
131 );
132 $modulesMetaApiEndpoint = "{$queryParams->tokenDetails->api_domain}/crm/v2/settings/modules";
133 $authorizationHeader["Authorization"] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
134 $modulesMetaResponse = HttpHelper::get($modulesMetaApiEndpoint, null, $authorizationHeader);
135 if (!is_wp_error($modulesMetaResponse) && (empty($modulesMetaResponse->status) || (!empty($modulesMetaResponse->status) && $modulesMetaResponse->status !== 'error'))) {
136 $retriveModuleData = $modulesMetaResponse->modules;
137
138 $allModules = [];
139 foreach ($retriveModuleData as $key => $value) {
140 if ((!empty($value->inventory_template_supported) && $value->inventory_template_supported) || \in_array($value->api_name, $zohosIntegratedModules)) {
141 continue;
142 }
143 if (!empty($value->api_supported) && $value->api_supported && !empty($value->editable) && $value->editable) {
144 $allModules[$value->api_name] = (object) array(
145 'plural_label' => $value->plural_label,
146 'triggers_supported' => $value->triggers_supported,
147 'quick_create' => $value->quick_create,
148 );
149 }
150 }
151 uksort($allModules, 'strnatcasecmp');
152 $response["modules"] = $allModules;
153 } else {
154 wp_send_json_error(
155 empty($modulesMetaResponse->error) ? 'Unknown' : $modulesMetaResponse->error,
156 400
157 );
158 }
159 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
160 // var_dump($queryParams->formID, $queryParams->id);
161 ZohoCRMHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['modules']);
162 }
163 wp_send_json_success($response, 200);
164 } else {
165 wp_send_json_error(
166 __(
167 'Token expired',
168 'bitform'
169 ),
170 401
171 );
172 }
173 }
174 /**
175 * Process ajax request for refesh crm layouts
176 *
177 * @return JSON crm layout data
178 */
179 public static function refreshLayoutsAjaxHelper()
180 {
181 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field($_REQUEST['_ajax_nonce']), 'bitforms_save')) {
182 $inputJSON = file_get_contents('php://input');
183 $queryParams = json_decode($inputJSON);
184 if (
185 empty($queryParams->module)
186 || empty($queryParams->tokenDetails)
187 || empty($queryParams->dataCenter)
188 || empty($queryParams->clientId)
189 || empty($queryParams->clientSecret)
190 ) {
191 wp_send_json_error(
192 __(
193 'Requested parameter is empty',
194 'bitforms'
195 ),
196 400
197 );
198 }
199 $response = [];
200 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
201 $response['tokenDetails'] = ZohoCRMHandler::_refreshAccessToken($queryParams);
202 }
203 $layoutsMetaApiEndpoint = "{$queryParams->tokenDetails->api_domain}/crm/v2/settings/layouts";
204 $authorizationHeader["Authorization"] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
205 $requiredParams['module'] = $queryParams->module;
206 $layoutsMetaResponse = HttpHelper::get($layoutsMetaApiEndpoint, $requiredParams, $authorizationHeader);
207 if (!is_wp_error($layoutsMetaResponse) && (empty($layoutsMetaResponse->status) || (!empty($layoutsMetaResponse->status) && $layoutsMetaResponse->status !== 'error'))) {
208 $retriveLayoutsData = $layoutsMetaResponse->layouts;
209 $layouts = [];
210 foreach ($retriveLayoutsData as $layoutKey => $layoutValue) {
211 $fields = [];
212 $fileUploadFields = [];
213 $requiredFields = [];
214 $requiredFileUploadFiles = [];
215 $uniqueFields = [];
216 foreach ($layoutValue->sections as $sectionKey => $sectionValue) {
217 foreach ($sectionValue->fields as $fieldKey => $fieldDetails) {
218 if (empty($fieldDetails->subform) && !empty($fieldDetails->api_name) && !empty($fieldDetails->view_type->create) && $fieldDetails->view_type->create && $fieldDetails->data_type !== 'ownerlookup') {
219 if ($fieldDetails->data_type === 'fileupload') {
220 $fileUploadFields[$fieldDetails->api_name] = (object) array(
221 'display_label' => $fieldDetails->display_label,
222 'length' => $fieldDetails->length,
223 'visible' => $fieldDetails->visible,
224 'json_type' => $fieldDetails->json_type,
225 'data_type' => $fieldDetails->data_type,
226 'required' => $fieldDetails->required
227 );
228 } else {
229 $fields[$fieldDetails->api_name] = (object) array(
230 'display_label' => $fieldDetails->display_label,
231 'length' => $fieldDetails->length,
232 'visible' => $fieldDetails->visible,
233 'json_type' => $fieldDetails->json_type,
234 'data_type' => $fieldDetails->data_type,
235 'required' => $fieldDetails->required
236 );
237 }
238
239 if (!empty($fieldDetails->required) && $fieldDetails->required) {
240 if ($fieldDetails->data_type === 'fileupload') {
241 $requiredFileUploadFiles[] = $fieldDetails->api_name;
242 } else if ($fieldDetails->api_name !== 'Parent_Id') {
243 $requiredFields[] = $fieldDetails->api_name;
244 }
245 }
246 if (!empty($fieldDetails->unique) && count((array)$fieldDetails->unique)) {
247 $uniqueFields[] = $fieldDetails->api_name;
248 }
249 }
250 }
251 }
252 uksort($fields, 'strnatcasecmp');
253 uksort($fileUploadFields, 'strnatcasecmp');
254 usort($requiredFields, 'strnatcasecmp');
255 usort($requiredFileUploadFiles, 'strnatcasecmp');
256
257 $layouts[$layoutValue->name] = (object) array(
258 'visible' => $layoutValue->visible,
259 'fields' => $fields,
260 'required' => $requiredFields,
261 'unique' => $uniqueFields,
262 'id' => $layoutValue->id,
263 'fileUploadFields' => $fileUploadFields,
264 'requiredFileUploadFields' => $requiredFileUploadFiles
265 );
266 }
267 uksort($layouts, 'strnatcasecmp');
268 $response["layouts"] = $layouts;
269 } else {
270 wp_send_json_error(
271 $layoutsMetaResponse->status === 'error' ? $layoutsMetaResponse->message : 'Unknown',
272 400
273 );
274 }
275 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
276 // var_dump($queryParams->formID, $queryParams->id);
277 $response["queryModule"] = $queryParams->module;
278 ZohoCRMHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
279 }
280 wp_send_json_success($response, 200);
281 } else {
282 wp_send_json_error(
283 __(
284 'Token expired',
285 'bitform'
286 ),
287 401
288 );
289 }
290 }
291
292 /**
293 * Helps to refresh zoho crm access_token
294 *
295 * @param Array $apiData Contains required data for refresh access token
296 * @return JSON $tokenDetails API token details
297 */
298 protected static function _refreshAccessToken($apiData)
299 {
300 if (
301 empty($apiData->dataCenter)
302 || empty($apiData->clientId)
303 || empty($apiData->clientSecret)
304 || empty($apiData->tokenDetails)
305 ) {
306 return false;
307 }
308 $tokenDetails = $apiData->tokenDetails;
309
310 $dataCenter = $apiData->dataCenter;
311 $apiEndpoint = "https://accounts.zoho.{$dataCenter}/oauth/v2/token";
312 $requestParams = array(
313 "grant_type" => "refresh_token",
314 "client_id" => $apiData->clientId,
315 "client_secret" => $apiData->clientSecret,
316 "refresh_token" => $tokenDetails->refresh_token,
317 );
318
319 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
320 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
321 return false;
322 }
323 $tokenDetails->generates_on = \time();
324 $tokenDetails->access_token = $apiResponse->access_token;
325 return $tokenDetails;
326 }
327
328 /**
329 * Save updated access_token to avoid unnecessary token generation
330 *
331 * @param Integer $fromID ID of Integration related form
332 * @param Integer $integrationID ID of Zoho crm Integration
333 * @param Obeject $tokenDetails refreshed token info
334 *
335 * @return null
336 */
337 protected static function _saveRefreshedToken($formID, $integrationID, $tokenDetails, $others = null)
338 {
339 if (empty($formID) || empty($integrationID)) {
340 return;
341 }
342
343 $integrationHandler = new IntegrationHandler($formID, IpTool::getUserDetail());
344 $zcrmDetails = $integrationHandler->getAIntegration($integrationID);
345
346 // var_dump($zcrmDetails, $formID, $integrationID, $tokenDetails, $others);
347 if (is_wp_error($zcrmDetails)) {
348 return;
349 }
350 $newDetails = json_decode($zcrmDetails[0]->integration_details);
351
352 $newDetails->tokenDetails = $tokenDetails;
353 if (!empty($others['modules'])) {
354 $newDetails->default->modules = $others['modules'];
355 }
356 if (!empty($others['layouts']) && !empty($others['queryModule'])) {
357 $newDetails->default->layouts->{$others['queryModule']} = $others['layouts'];
358 }
359
360 // var_dump($newDetails);
361
362 $integrationHandler->updateIntegration($integrationID, $zcrmDetails[0]->integration_name, 'Zoho CRM', \json_encode($newDetails), 'form');
363 }
364
365 public function execute(IntegrationHandler $integrationHandler, $integrationData, $fieldValues, $entryID, $logID)
366 {
367
368 $integrationDetails = is_string($integrationData->integration_details) ? json_decode($integrationData->integration_details) : $integrationData->integration_details;
369
370 $tokenDetails = $integrationDetails->tokenDetails;
371 $module = $integrationDetails->module;
372 $layout = $integrationDetails->layout;
373 $fieldMap = $integrationDetails->field_map;
374 $fileMap = $integrationDetails->upload_field_map;
375 $actions = $integrationDetails->actions;
376 $defaultDataConf = $integrationDetails->default;
377
378 if (
379 empty($tokenDetails)
380 || empty($module)
381 || empty($layout)
382 || empty($fieldMap)
383 ) {
384 $error = new WP_Error('REQ_FIELD_EMPTY', __('module, layout, fields are required for zoho crm api', 'bitform'));
385 $this->_logResponse->apiResponse($logID, $this->_integrationID, 'record', 'validation', $error);
386 return $error;
387 }
388 if (empty($defaultDataConf->layouts->{$module}->{$layout}->fields) || empty($defaultDataConf->modules->{$module})) {
389 $error = new WP_Error('REQ_FIELD_EMPTY', __('module, layout, fields are required for zoho crm api', 'bitform'));
390 $this->_logResponse->apiResponse($logID, $this->_integrationID, 'record', 'validation', $error);
391 return $error;
392 }
393 if ((intval($tokenDetails->generates_on) + (55 * 60)) < time()) {
394 $requiredParams['clientId'] = $integrationDetails->clientId;
395 $requiredParams['clientSecret'] = $integrationDetails->clientSecret;
396 $requiredParams['dataCenter'] = $integrationDetails->dataCenter;
397 $requiredParams['tokenDetails'] = $tokenDetails;
398 $newTokenDetails = ZohoCRMHandler::_refreshAccessToken((object)$requiredParams);
399 if ($newTokenDetails) {
400 ZohoCRMHandler::_saveRefreshedToken($this->_formID, $this->_integrationID, $newTokenDetails);
401 $tokenDetails = $newTokenDetails;
402 }
403 }
404
405 $required = !empty($defaultDataConf->layouts->{$module}->{$layout}->required) ?
406 $defaultDataConf->layouts->{$module}->{$layout}->required : [];
407 $actions = $integrationDetails->actions;
408 if (class_exists('BitCode\BitFormPro\Integration\ZohoCRM\RecordApiHelper')) {
409 $recordApiHelper = new \BitCode\BitFormPro\Integration\ZohoCRM\RecordApiHelper($tokenDetails);
410 } else {
411 $recordApiHelper = new RecordApiHelper($tokenDetails);
412 }
413 $zcrmApiResponse = $recordApiHelper->executeRecordApi(
414 $this->_formID,
415 $entryID,
416 $this->_integrationID,
417 $logID,
418 $defaultDataConf,
419 $module,
420 $layout,
421 $fieldValues,
422 $fieldMap,
423 $actions,
424 $required,
425 $fileMap
426 );
427 if (is_wp_error($zcrmApiResponse)) {
428 return $zcrmApiResponse;
429 }
430 if (
431 !empty($zcrmApiResponse->data)
432 && !empty($zcrmApiResponse->data[0]->code)
433 && $zcrmApiResponse->data[0]->code === 'SUCCESS'
434 && count($integrationDetails->relatedlists)
435 ) {
436 $zcrmApiResponse = apply_filters('bitform_zcrm_addRelatedList', $zcrmApiResponse, $this->_formID, $entryID, $this->_integrationID, $logID, $fieldValues, $integrationDetails, $recordApiHelper);
437 }
438 return $zcrmApiResponse;
439 }
440 }
441