PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / -3.0.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v-3.0.1
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 -3.0.1, at includes/Core/Integration/ZohoCRM/ZohoCRMHandler.php

830 lines 30.4 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 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 use BitCode\BitForm\Core\Integration\IntegrationHandler;
15 use BitCode\BitForm\Core\Util\ApiResponse as UtilApiResponse;
16 use BitCode\BitForm\Core\Util\HttpHelper;
17 use BitCode\BitForm\Core\Util\IpTool;
18 use BitCode\BitForm\GlobalHelper;
19 use WP_Error;
20
21 /**
22 * Provide functionality for ZohoCrm integration
23 */
24 class ZohoCRMHandler
25 {
26 private $_formID;
27 private $_integrationID;
28
29 private $_logResponse;
30
31 public function __construct($integrationID, $fromID)
32 {
33 $this->_formID = $fromID;
34 $this->_integrationID = $integrationID;
35 $this->_logResponse = new UtilApiResponse();
36 }
37
38 /**
39 * Helps to register ajax function's with wp
40 *
41 * @return null
42 */
43 public static function registerAjax()
44 {
45 add_action('wp_ajax_bitforms_zcrm_generate_token', [__CLASS__, 'generateTokens']);
46 add_action('wp_ajax_bitforms_zcrm_refresh_modules', [__CLASS__, 'refreshModulesAjaxHelper']);
47 add_action('wp_ajax_bitforms_zcrm_refresh_layouts', [__CLASS__, 'refreshLayoutsAjaxHelper']);
48 add_action('wp_ajax_bitforms_zcrm_get_users', [__CLASS__, 'refreshUsersAjaxHelper']);
49 add_action('wp_ajax_bitforms_zcrm_get_tags', [__CLASS__, 'refreshTagListAjaxHelper']);
50 add_action('wp_ajax_bitforms_zcrm_get_assignment_rules', [__CLASS__, 'getAssignmentRulesAjaxHelper']);
51 add_action('wp_ajax_nopriv_bitforms_zcrm_get_assignment_rules', [__CLASS__, 'getAssignmentRulesAjaxHelper']);
52 add_action('wp_ajax_bitforms_zcrm_get_related_lists', [__CLASS__, 'getRelatedListsAjaxHelper']);
53 }
54
55 /**
56 * Process ajax request for generate_token
57 *
58 * @return JSON zoho crm api response and status
59 */
60 public static function generateTokens()
61 {
62 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
63 GlobalHelper::requirePostMethod();
64
65 try {
66 $requestsParams = GlobalHelper::formatRequestData();
67 } catch (\InvalidArgumentException $e) {
68 wp_send_json_error($e->getMessage(), 400);
69 }
70 if (
71 empty($requestsParams->{'accounts-server'})
72 || empty($requestsParams->dataCenter)
73 || empty($requestsParams->clientId)
74 || empty($requestsParams->clientSecret)
75 || empty($requestsParams->redirectURI)
76 || empty($requestsParams->code)
77 ) {
78 wp_send_json_error(
79 __(
80 'Requested parameter is empty',
81 'bit-form'
82 ),
83 400
84 );
85 }
86 $apiEndpoint = \urldecode($requestsParams->{'accounts-server'}) . '/oauth/v2/token';
87 $requestParams = [
88 'grant_type' => 'authorization_code',
89 'client_id' => $requestsParams->clientId,
90 'client_secret' => $requestsParams->clientSecret,
91 'redirect_uri' => \urldecode($requestsParams->redirectURI),
92 'code' => $requestsParams->code
93 ];
94 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
95 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
96 wp_send_json_error(
97 empty($apiResponse->error) ? 'Unknown' : $apiResponse->error,
98 400
99 );
100 }
101 $apiResponse->generates_on = \time();
102 wp_send_json_success($apiResponse, 200);
103 } else {
104 wp_send_json_error(
105 __(
106 'Token expired',
107 'bit-form'
108 ),
109 401
110 );
111 }
112 }
113
114 /**
115 * Process ajax request for refresh crm modules
116 *
117 * @return JSON crm module data
118 */
119 public static function refreshModulesAjaxHelper()
120 {
121 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
122 GlobalHelper::requirePostMethod();
123
124 try {
125 $queryParams = GlobalHelper::formatRequestData();
126 } catch (\InvalidArgumentException $e) {
127 wp_send_json_error($e->getMessage(), 400);
128 }
129 if (
130 empty($queryParams->tokenDetails)
131 || empty($queryParams->dataCenter)
132 || empty($queryParams->clientId)
133 || empty($queryParams->clientSecret)
134 ) {
135 wp_send_json_error(
136 __(
137 'Requested parameter is empty',
138 'bit-form'
139 ),
140 400
141 );
142 }
143 $response = [];
144 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
145 $response['tokenDetails'] = ZohoCRMHandler::_refreshAccessToken($queryParams);
146 }
147 $zohosIntegratedModules = [
148 'zohosign__ZohoSign_Document_Events',
149 'zohoshowtime__ShowTime_Sessions',
150 'zohoshowtime__Zoho_ShowTime',
151 'zohosign__ZohoSign_Documents',
152 'zohosign__ZohoSign_Recipients'
153 ];
154 $modulesMetaApiEndpoint = "{$queryParams->tokenDetails->api_domain}/crm/v2/settings/modules";
155 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
156 $modulesMetaResponse = HttpHelper::get($modulesMetaApiEndpoint, null, $authorizationHeader);
157 if (!is_wp_error($modulesMetaResponse) && (empty($modulesMetaResponse->status) || (!empty($modulesMetaResponse->status) && 'error' !== $modulesMetaResponse->status))) {
158 $retriveModuleData = $modulesMetaResponse->modules;
159
160 $allModules = [];
161 foreach ($retriveModuleData as $key => $value) {
162 if ((!empty($value->inventory_template_supported) && $value->inventory_template_supported) || \in_array($value->api_name, $zohosIntegratedModules)) {
163 continue;
164 }
165 if (!empty($value->api_supported) && $value->api_supported && !empty($value->editable) && $value->editable) {
166 $allModules[$value->api_name] = (object) [
167 'plural_label' => $value->plural_label,
168 'triggers_supported' => $value->triggers_supported,
169 'quick_create' => $value->quick_create,
170 ];
171 }
172 }
173 uksort($allModules, 'strnatcasecmp');
174 $response['modules'] = $allModules;
175 } else {
176 wp_send_json_error(
177 empty($modulesMetaResponse->error) ? 'Unknown' : $modulesMetaResponse->error,
178 400
179 );
180 }
181 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
182 ZohoCRMHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['modules']);
183 }
184 wp_send_json_success($response, 200);
185 } else {
186 wp_send_json_error(
187 __(
188 'Token expired',
189 'bit-form'
190 ),
191 401
192 );
193 }
194 }
195
196 /**
197 * Process ajax request for refesh crm layouts
198 *
199 * @return JSON crm layout data
200 */
201 public static function refreshLayoutsAjaxHelper()
202 {
203 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
204 GlobalHelper::requirePostMethod();
205
206 try {
207 $queryParams = GlobalHelper::formatRequestData();
208 } catch (\InvalidArgumentException $e) {
209 wp_send_json_error($e->getMessage(), 400);
210 }
211
212 if (
213 empty($queryParams->module)
214 || empty($queryParams->tokenDetails)
215 || empty($queryParams->dataCenter)
216 || empty($queryParams->clientId)
217 || empty($queryParams->clientSecret)
218 ) {
219 wp_send_json_error(
220 __(
221 'Requested parameter is empty',
222 'bit-form'
223 ),
224 400
225 );
226 }
227 $response = [];
228 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
229 $response['tokenDetails'] = ZohoCRMHandler::_refreshAccessToken($queryParams);
230 }
231 $layoutsMetaApiEndpoint = "{$queryParams->tokenDetails->api_domain}/crm/v2/settings/layouts";
232 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
233 $requiredParams['module'] = $queryParams->module;
234 $layoutsMetaResponse = HttpHelper::get($layoutsMetaApiEndpoint, $requiredParams, $authorizationHeader);
235 if (!is_wp_error($layoutsMetaResponse) && (empty($layoutsMetaResponse->status) || (!empty($layoutsMetaResponse->status) && 'error' !== $layoutsMetaResponse->status))) {
236 $retriveLayoutsData = $layoutsMetaResponse->layouts;
237 $layouts = [];
238 foreach ($retriveLayoutsData as $layoutKey => $layoutValue) {
239 $fields = [];
240 $fileUploadFields = [];
241 $requiredFields = [];
242 $requiredFileUploadFiles = [];
243 $uniqueFields = [];
244 foreach ($layoutValue->sections as $sectionKey => $sectionValue) {
245 foreach ($sectionValue->fields as $fieldKey => $fieldDetails) {
246 if (empty($fieldDetails->subform) && !empty($fieldDetails->api_name) && !empty($fieldDetails->view_type->create) && $fieldDetails->view_type->create && 'ownerlookup' !== $fieldDetails->data_type) {
247 if ('fileupload' === $fieldDetails->data_type) {
248 $fileUploadFields[$fieldDetails->api_name] = (object) [
249 'display_label' => $fieldDetails->display_label,
250 'length' => $fieldDetails->length,
251 'visible' => $fieldDetails->visible,
252 'json_type' => $fieldDetails->json_type,
253 'data_type' => $fieldDetails->data_type,
254 'required' => $fieldDetails->required
255 ];
256 } else {
257 $fields[$fieldDetails->api_name] = (object) [
258 'display_label' => $fieldDetails->display_label,
259 'length' => $fieldDetails->length,
260 'visible' => $fieldDetails->visible,
261 'json_type' => $fieldDetails->json_type,
262 'data_type' => $fieldDetails->data_type,
263 'required' => $fieldDetails->required
264 ];
265 }
266
267 if (!empty($fieldDetails->required) && $fieldDetails->required) {
268 if ('fileupload' === $fieldDetails->data_type) {
269 $requiredFileUploadFiles[] = $fieldDetails->api_name;
270 } elseif ('Parent_Id' !== $fieldDetails->api_name) {
271 $requiredFields[] = $fieldDetails->api_name;
272 }
273 }
274 if (!empty($fieldDetails->unique) && count((array)$fieldDetails->unique)) {
275 $uniqueFields[] = $fieldDetails->api_name;
276 }
277 }
278 }
279 }
280 uksort($fields, 'strnatcasecmp');
281 uksort($fileUploadFields, 'strnatcasecmp');
282 usort($requiredFields, 'strnatcasecmp');
283 usort($requiredFileUploadFiles, 'strnatcasecmp');
284
285 $layouts[$layoutValue->name] = (object) [
286 'visible' => $layoutValue->visible,
287 'fields' => $fields,
288 'required' => $requiredFields,
289 'unique' => $uniqueFields,
290 'id' => $layoutValue->id,
291 'fileUploadFields' => $fileUploadFields,
292 'requiredFileUploadFields' => $requiredFileUploadFiles
293 ];
294 }
295 uksort($layouts, 'strnatcasecmp');
296 $response['layouts'] = $layouts;
297 } else {
298 wp_send_json_error(
299 'error' === $layoutsMetaResponse->status ? $layoutsMetaResponse->message : 'Unknown',
300 400
301 );
302 }
303 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
304 $response['queryModule'] = $queryParams->module;
305 ZohoCRMHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
306 }
307 wp_send_json_success($response, 200);
308 } else {
309 wp_send_json_error(
310 __(
311 'Token expired',
312 'bit-form'
313 ),
314 401
315 );
316 }
317 }
318
319 /**
320 * Helps to refresh zoho crm access_token
321 *
322 * @param object $apiData Contains required data for refresh access token
323 * @return string json | boolean $tokenDetails API token details
324 */
325 protected static function _refreshAccessToken($apiData)
326 {
327 if (
328 empty($apiData->dataCenter)
329 || empty($apiData->clientId)
330 || empty($apiData->clientSecret)
331 || empty($apiData->tokenDetails)
332 ) {
333 return false;
334 }
335 $tokenDetails = $apiData->tokenDetails;
336
337 $dataCenter = $apiData->dataCenter;
338 $apiEndpoint = "https://accounts.zoho.{$dataCenter}/oauth/v2/token";
339 $requestParams = [
340 'grant_type' => 'refresh_token',
341 'client_id' => $apiData->clientId,
342 'client_secret' => $apiData->clientSecret,
343 'refresh_token' => $tokenDetails->refresh_token,
344 ];
345
346 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
347 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
348 return false;
349 }
350 $tokenDetails->generates_on = \time();
351 $tokenDetails->access_token = $apiResponse->access_token;
352 return $tokenDetails;
353 }
354
355 /**
356 * Save updated access_token to avoid unnecessary token generation
357 *
358 * @param integer $fromID ID of Integration related form
359 * @param integer $integrationID ID of Zoho crm Integration
360 * @param object $tokenDetails refreshed token info
361 *
362 * @return null
363 */
364 protected static function _saveRefreshedToken($formID, $integrationID, $tokenDetails, $others = null)
365 {
366 if (empty($formID) || empty($integrationID)) {
367 return;
368 }
369
370 $integrationHandler = new IntegrationHandler($formID, IpTool::getUserDetail());
371 $zcrmDetails = $integrationHandler->getAIntegration($integrationID);
372
373 if (is_wp_error($zcrmDetails)) {
374 return;
375 }
376 $newDetails = json_decode($zcrmDetails[0]->integration_details);
377
378 $newDetails->tokenDetails = $tokenDetails;
379 if (!empty($others['modules'])) {
380 $newDetails->default->modules = $others['modules'];
381 }
382 if (!empty($others['layouts']) && !empty($others['queryModule'])) {
383 $newDetails->default->layouts->{$others['queryModule']} = $others['layouts'];
384 }
385
386 $integrationHandler->updateIntegration($integrationID, $zcrmDetails[0]->integration_name, 'Zoho CRM', wp_json_encode($newDetails), 'form');
387 }
388
389 /**
390 * Process ajax request for refresh crm users
391 *
392 * @return JSON crm users data
393 */
394 public static function refreshUsersAjaxHelper()
395 {
396 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
397 GlobalHelper::requirePostMethod();
398
399 try {
400 $queryParams = GlobalHelper::formatRequestData();
401 } catch (\InvalidArgumentException $e) {
402 wp_send_json_error($e->getMessage(), 400);
403 }
404
405 if (
406 empty($queryParams->tokenDetails)
407 || empty($queryParams->dataCenter)
408 || empty($queryParams->clientId)
409 || empty($queryParams->clientSecret)
410 ) {
411 wp_send_json_error(
412 __(
413 'Requested parameter is empty',
414 'bit-form'
415 ),
416 400
417 );
418 }
419 $response = [];
420 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
421 $response['tokenDetails'] = self::_refreshAccessToken($queryParams);
422 }
423 $usersApiEndpoint = "{$queryParams->tokenDetails->api_domain}/crm/v2/users?type=ActiveConfirmedUsers";
424 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
425 $retrivedUsersData = [];
426 $usersResponse = (object) [];
427 do {
428 $requiredParams = [];
429 if (!empty($usersResponse->users)) {
430 if (!empty($retrivedUsersData)) {
431 $retrivedUsersData = array_merge($retrivedUsersData, $usersResponse->users);
432 } else {
433 $retrivedUsersData = $usersResponse->users;
434 }
435 }
436 if (!empty($usersResponse->info->more_records) && $usersResponse->info->more_records) {
437 $requiredParams['page'] = intval($usersResponse->info->page) + 1;
438 }
439 $usersResponse = HttpHelper::get($usersApiEndpoint, $requiredParams, $authorizationHeader);
440 } while (null === $usersResponse || (!empty($usersResponse->info->more_records) && $usersResponse->info->more_records));
441 if (empty($requiredParams) && !is_wp_error($usersResponse)) {
442 $retrivedUsersData = $usersResponse->users;
443 }
444 if (!is_wp_error($usersResponse) && !empty($retrivedUsersData)) {
445 $users = [];
446 foreach ($retrivedUsersData as $userKey => $userValue) {
447 $users[$userValue->full_name] = (object) [
448 'full_name' => $userValue->full_name,
449 'id' => $userValue->id,
450 ];
451 }
452 uksort($users, 'strnatcasecmp');
453 $response['users'] = $users;
454 } else {
455 wp_send_json_error(
456 'error' === $usersResponse->status ? $usersResponse->message : 'Unknown',
457 400
458 );
459 }
460 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
461 self::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
462 }
463 wp_send_json_success($response, 200);
464 } else {
465 wp_send_json_error(
466 __(
467 'Token expired',
468 'bit-form'
469 ),
470 401
471 );
472 }
473 }
474
475 /**
476 * Process ajax request for refresh tags of a module
477 *
478 * @return JSON crm Tags for a module
479 */
480 public static function refreshTagListAjaxHelper()
481 {
482 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
483 GlobalHelper::requirePostMethod();
484
485 try {
486 $queryParams = GlobalHelper::formatRequestData();
487 } catch (\InvalidArgumentException $e) {
488 wp_send_json_error($e->getMessage(), 400);
489 }
490
491 if (
492 empty($queryParams->module)
493 || empty($queryParams->tokenDetails)
494 || empty($queryParams->dataCenter)
495 || empty($queryParams->clientId)
496 || empty($queryParams->clientSecret)
497 ) {
498 wp_send_json_error(
499 __(
500 'Requested parameter is empty',
501 'bit-form'
502 ),
503 400
504 );
505 }
506 $response = [];
507 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
508 $response['tokenDetails'] = self::_refreshAccessToken($queryParams);
509 }
510 $tokenDetails = empty($response['tokenDetails']) ? $queryParams->tokenDetails : $response['tokenDetails'];
511 $tagApiHelper = new TagApiHelper($tokenDetails, $queryParams->module);
512 $tagListApiResponse = $tagApiHelper->getTagList();
513 if (!is_wp_error($tagListApiResponse)) {
514 usort($tagListApiResponse, 'strnatcasecmp');
515 $response['tags'] = $tagListApiResponse;
516 } else {
517 wp_send_json_error(
518 is_wp_error($tagListApiResponse) ? $tagListApiResponse->get_error_message() : (empty($tagListApiResponse) ? __('Tag is empty', 'bit-form') : 'Unknown'),
519 empty($tagListApiResponse) ? 204 : 400
520 );
521 }
522 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
523 self::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
524 }
525 wp_send_json_success($response, 200);
526 } else {
527 wp_send_json_error(
528 __(
529 'Token expired',
530 'bit-form'
531 ),
532 401
533 );
534 }
535 }
536
537 /**
538 * Process ajax request to get assignment rules of a Zoho CRM module
539 *
540 * @return JSON crm assignment rules data
541 */
542 public static function getAssignmentRulesAjaxHelper()
543 {
544 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
545 GlobalHelper::requirePostMethod();
546
547 try {
548 $queryParams = GlobalHelper::formatRequestData();
549 } catch (\InvalidArgumentException $e) {
550 wp_send_json_error($e->getMessage(), 400);
551 }
552
553 if (
554 empty($queryParams->module)
555 || empty($queryParams->tokenDetails)
556 || empty($queryParams->dataCenter)
557 || empty($queryParams->clientId)
558 || empty($queryParams->clientSecret)
559 ) {
560 wp_send_json_error(
561 __(
562 'Requested parameter is empty',
563 'bit-form'
564 ),
565 400
566 );
567 }
568 $response = [];
569 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
570 $response['tokenDetails'] = self::_refreshAccessToken($queryParams);
571 }
572 $metaDataApiHelper = new MetaDataApiHelper($queryParams->tokenDetails, true);
573 $assignmentRulesResponse = $metaDataApiHelper->getAssignmentRules($queryParams->module);
574 if (
575 !is_wp_error($assignmentRulesResponse)
576 && !empty($assignmentRulesResponse)
577 && empty($assignmentRulesResponse->status)
578 ) {
579 uksort($assignmentRulesResponse, 'strnatcasecmp');
580 $response['assignmentRules'] = $assignmentRulesResponse;
581 } else {
582 wp_send_json_error(
583 !empty($assignmentRulesResponse->status)
584 && 'error' === $assignmentRulesResponse->status ?
585 $assignmentRulesResponse->message : (empty($assignmentRulesResponse) ? __('Assignment rules is empty', 'bit-form') : 'Unknown'),
586 empty($assignmentRulesResponse) ? 204 : 400
587 );
588 }
589 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
590 // $response["queryModule"] = $queryParams->module;
591 self::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
592 }
593 wp_send_json_success($response, 200);
594 } else {
595 wp_send_json_error(
596 __(
597 'Token expired',
598 'bit-form'
599 ),
600 401
601 );
602 }
603 }
604
605 /**
606 * Process ajax request to get realted lists of a Zoho CRM module
607 *
608 * @return JSON crm layout data
609 */
610 public static function getRelatedListsAjaxHelper()
611 {
612 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
613 GlobalHelper::requirePostMethod();
614
615 try {
616 $queryParams = GlobalHelper::formatRequestData();
617 } catch (\InvalidArgumentException $e) {
618 wp_send_json_error($e->getMessage(), 400);
619 }
620
621 if (
622 empty($queryParams->module)
623 || empty($queryParams->tokenDetails)
624 || empty($queryParams->dataCenter)
625 || empty($queryParams->clientId)
626 || empty($queryParams->clientSecret)
627 ) {
628 wp_send_json_error(
629 __(
630 'Requested parameter is empty',
631 'bit-form'
632 ),
633 400
634 );
635 }
636 $response = [];
637 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
638 $response['tokenDetails'] = self::_refreshAccessToken($queryParams);
639 }
640 $metaDataApiHelper = new MetaDataApiHelper($queryParams->tokenDetails);
641 $relatedListResponse = $metaDataApiHelper->getRelatedLists($queryParams->module);
642 if (
643 !is_wp_error($relatedListResponse)
644 && !empty($relatedListResponse)
645 && empty($relatedListResponse->status)
646 ) {
647 uksort($relatedListResponse, 'strnatcasecmp');
648 $response['relatedLists'] = $relatedListResponse;
649 } else {
650 wp_send_json_error(
651 !empty($relatedListResponse->status)
652 && 'error' === $relatedListResponse->status ?
653 $relatedListResponse->message : (empty($relatedListResponse) ? __('RelatedList is empty', 'bit-form') : 'Unknown'),
654 empty($relatedListResponse) ? 204 : 400
655 );
656 }
657 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
658 // $response["queryModule"] = $queryParams->module;
659 self::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
660 }
661 wp_send_json_success($response, 200);
662 } else {
663 wp_send_json_error(
664 __(
665 'Token expired',
666 'bit-form'
667 ),
668 401
669 );
670 }
671 }
672
673 public static function addRelatedListV2($zcrmApiResponse, $formID, $entryID, $integID, $logID, $fieldValues, $integrationDetails, $recordApiHelper)
674 {
675 foreach ($integrationDetails->relatedlists as $relatedlist) {
676 // Related List apis..
677 $relatedListModule = !empty($relatedlist->module) ? $relatedlist->module : '';
678 $relatedListLayout = !empty($relatedlist->layout) ? $relatedlist->layout : '';
679 $defaultDataConf = $integrationDetails->default;
680 if (empty($relatedListModule) || empty($relatedListLayout)) {
681 return new WP_Error('REQ_FIELD_EMPTY', __('module, layout are required for zoho crm relatedlist', 'bit-form'));
682 }
683 $module = $integrationDetails->module;
684 $moduleSingular = \substr($module, 0, \strlen($module) - 1);
685 if (isset($defaultDataConf->layouts->{$relatedListModule}->{$relatedListLayout}->fields->{$module})) {
686 $moduleSingular = $module;
687 } elseif (!isset($defaultDataConf->layouts->{$relatedListModule}->{$relatedListLayout}->fields->{$moduleSingular})) {
688 $moduleSingular = '';
689 }
690 $relatedListRequired = !empty($defaultDataConf->layouts->{$relatedListModule}->{$relatedListLayout}->required) ?
691 $defaultDataConf->layouts->{$relatedListModule}->{$relatedListLayout}->required : [];
692 $recordID = $zcrmApiResponse->data[0]->details->id;
693 $defaultDataConf->layouts->{$relatedListModule}->{$relatedListLayout}->fields->{'$se_module'} = (object) [
694 'length' => 200,
695 'visible' => true,
696 'json_type' => 'string',
697 'data_type' => 'string',
698 ];
699 $fieldValues['$se_module'] = $module;
700 $relatedlist->field_map[] = (object)
701 [
702 'formField' => '$se_module',
703 'zohoFormField' => '$se_module'
704 ];
705 if (isset($defaultDataConf->layouts->{$relatedListModule}->{$relatedListLayout}->fields->Parent_Id)) {
706 $fieldValues['Parent_Id'] = (object) ['id' => $recordID];
707 $relatedlist->field_map[] = (object)
708 [
709 'formField' => 'Parent_Id',
710 'zohoFormField' => 'Parent_Id'
711 ];
712 } elseif (!empty($moduleSingular)) {
713 $fieldValues[$moduleSingular] = ['id' => $recordID];
714 $relatedlist->field_map[] = (object)
715 [
716 'formField' => $moduleSingular,
717 'zohoFormField' => $moduleSingular
718 ];
719 } elseif ('Contacts' === $module) {
720 $fieldValues['Who_Id'] = (object) ['id' => $recordID];
721 $relatedlist->field_map[] = (object)
722 [
723 'formField' => 'Who_Id',
724 'zohoFormField' => 'Who_Id'
725 ];
726 } else {
727 $fieldValues['What_Id'] = (object) ['id' => $recordID];
728 $relatedlist->field_map[] = (object)
729 [
730 'formField' => 'What_Id',
731 'zohoFormField' => 'What_Id'
732 ];
733 }
734
735 $zcrmRelatedlistApiResponse = $recordApiHelper->executeRecordApi(
736 $formID,
737 $entryID,
738 $integID,
739 $logID,
740 $defaultDataConf,
741 $relatedListModule,
742 $relatedListLayout,
743 $fieldValues,
744 $relatedlist->field_map,
745 $relatedlist->actions,
746 $relatedListRequired,
747 $relatedlist->upload_field_map,
748 true
749 );
750 }
751 }
752
753 public function execute(IntegrationHandler $integrationHandler, $integrationData, $fieldValues, $entryID, $logID)
754 {
755 $entryDetails = [
756 'formId' => $this->_formID,
757 'entryId' => $entryID,
758 'fieldValues' => $fieldValues
759 ];
760
761 $integrationDetails = is_string($integrationData->integration_details) ? json_decode($integrationData->integration_details) : $integrationData->integration_details;
762
763 $tokenDetails = $integrationDetails->tokenDetails;
764 $module = $integrationDetails->module;
765 $layout = $integrationDetails->layout;
766 $fieldMap = $integrationDetails->field_map;
767 $fileMap = $integrationDetails->upload_field_map;
768 $actions = $integrationDetails->actions;
769 $defaultDataConf = $integrationDetails->default;
770
771 if (
772 empty($tokenDetails)
773 || empty($module)
774 || empty($layout)
775 || empty($fieldMap)
776 ) {
777 $error = new WP_Error('REQ_FIELD_EMPTY', __('module, layout, fields are required for zoho crm api', 'bit-form'));
778 $this->_logResponse->apiResponse($logID, $this->_integrationID, 'record', 'validation', $error, $entryDetails);
779 return $error;
780 }
781 if (empty($defaultDataConf->layouts->{$module}->{$layout}->fields) || empty($defaultDataConf->modules->{$module})) {
782 $error = new WP_Error('REQ_FIELD_EMPTY', __('module, layout, fields are required for zoho crm api', 'bit-form'));
783 $this->_logResponse->apiResponse($logID, $this->_integrationID, 'record', 'validation', $error, $entryDetails);
784 return $error;
785 }
786 if ((intval($tokenDetails->generates_on) + (55 * 60)) < time()) {
787 $requiredParams['clientId'] = $integrationDetails->clientId;
788 $requiredParams['clientSecret'] = $integrationDetails->clientSecret;
789 $requiredParams['dataCenter'] = $integrationDetails->dataCenter;
790 $requiredParams['tokenDetails'] = $tokenDetails;
791 $newTokenDetails = ZohoCRMHandler::_refreshAccessToken((object)$requiredParams);
792 if ($newTokenDetails) {
793 ZohoCRMHandler::_saveRefreshedToken($this->_formID, $this->_integrationID, $newTokenDetails);
794 $tokenDetails = $newTokenDetails;
795 }
796 }
797
798 $required = !empty($defaultDataConf->layouts->{$module}->{$layout}->required) ?
799 $defaultDataConf->layouts->{$module}->{$layout}->required : [];
800 $actions = $integrationDetails->actions;
801 $recordApiHelper = new RecordApiHelper($tokenDetails);
802 $zcrmApiResponse = $recordApiHelper->executeRecordApi(
803 $this->_formID,
804 $entryID,
805 $this->_integrationID,
806 $logID,
807 $defaultDataConf,
808 $module,
809 $layout,
810 $fieldValues,
811 $fieldMap,
812 $actions,
813 $required,
814 $fileMap
815 );
816 if (is_wp_error($zcrmApiResponse)) {
817 return $zcrmApiResponse;
818 }
819 if (
820 !empty($zcrmApiResponse->data)
821 && !empty($zcrmApiResponse->data[0]->code)
822 && 'SUCCESS' === $zcrmApiResponse->data[0]->code
823 && count($integrationDetails->relatedlists)
824 ) {
825 $zcrmApiResponse = self::addRelatedListV2($zcrmApiResponse, $this->_formID, $entryID, $this->_integrationID, $logID, $fieldValues, $integrationDetails, $recordApiHelper);
826 }
827 return $zcrmApiResponse;
828 }
829 }
830