PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.0
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.0
V3.3.2 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 All 139 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 2.0, at includes/Core/Integration/ZohoCRM/ZohoCRMHandler.php

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