PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.21.13
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.21.13
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 / ZohoDesk / ZohoDeskHandler.php

ZohoDeskHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.21.13, at includes/Core/Integration/ZohoDesk/ZohoDeskHandler.php

643 lines 20.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * ZohoDesk Integration
5 *
6 */
7
8 namespace BitCode\BitForm\Core\Integration\ZohoDesk;
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 use BitCode\BitForm\Core\Integration\IntegrationHandler;
15 use BitCode\BitForm\Core\Util\HttpHelper;
16 use BitCode\BitForm\Core\Util\IpTool;
17 use BitCode\BitForm\GlobalHelper;
18 use WP_Error;
19
20 /**
21 * Provide functionality for ZohoCrm integration
22 */
23 class ZohoDeskHandler
24 {
25 private $_formID;
26 private $_integrationID;
27
28 public function __construct($integrationID, $formID)
29 {
30 $this->_formID = $formID;
31 $this->_integrationID = $integrationID;
32 }
33
34 /**
35 * Helps to register ajax function's with wp
36 *
37 * @return null
38 */
39 public static function registerAjax()
40 {
41 add_action('wp_ajax_bitforms_zdesk_generate_token', [__CLASS__, 'generateTokens']);
42 add_action('wp_ajax_bitforms_zdesk_refresh_organizations', [__CLASS__, 'refreshOrganizationsAjaxHelper']);
43 add_action('wp_ajax_bitforms_zdesk_refresh_departments', [__CLASS__, 'refreshDepartmentsAjaxHelper']);
44 add_action('wp_ajax_bitforms_zdesk_refresh_fields', [__CLASS__, 'refreshFieldsAjaxHelper']);
45 add_action('wp_ajax_bitforms_zdesk_refresh_owners', [__CLASS__, 'refreshTicketOwnersAjaxHelper']);
46 add_action('wp_ajax_bitforms_zdesk_refresh_products', [__CLASS__, 'refreshProductsAjaxHelper']);
47 }
48
49 /**
50 * Process ajax request for generate_token
51 *
52 * @return string | boolean zoho crm api response and status
53 */
54 public static function generateTokens()
55 {
56 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
57
58
59 GlobalHelper::requirePostMethod();
60
61 try {
62 $requestsParams = GlobalHelper::formatRequestData();
63 } catch (\InvalidArgumentException $e) {
64 wp_send_json_error($e->getMessage(), 400);
65 }
66
67 if (
68 empty($requestsParams->{'accounts-server'})
69 || empty($requestsParams->dataCenter)
70 || empty($requestsParams->clientId)
71 || empty($requestsParams->clientSecret)
72 || empty($requestsParams->redirectURI)
73 || empty($requestsParams->code)
74 ) {
75 wp_send_json_error(
76 __(
77 'Requested parameter is empty',
78 'bit-form'
79 ),
80 400
81 );
82 }
83
84 $apiEndpoint = \urldecode($requestsParams->{'accounts-server'}) . '/oauth/v2/token';
85 $requestParams = [
86 'grant_type' => 'authorization_code',
87 'client_id' => $requestsParams->clientId,
88 'client_secret' => $requestsParams->clientSecret,
89 'redirect_uri' => \urldecode($requestsParams->redirectURI),
90 'code' => $requestsParams->code
91 ];
92 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
93
94 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
95 wp_send_json_error(
96 empty($apiResponse->error) ? 'Unknown' : $apiResponse->error,
97 400
98 );
99 }
100 $apiResponse->generates_on = \time();
101 wp_send_json_success($apiResponse, 200);
102 } else {
103 wp_send_json_error(
104 __(
105 'Token expired',
106 'bit-form'
107 ),
108 401
109 );
110 }
111 }
112
113 public static function refreshOrganizationsAjaxHelper()
114 {
115 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
116 $authorizationHeader = null;
117
118
119 GlobalHelper::requirePostMethod();
120
121 try {
122 $queryParams = GlobalHelper::formatRequestData();
123 } catch (\InvalidArgumentException $e) {
124 wp_send_json_error($e->getMessage(), 400);
125 }
126
127 if (
128 empty($queryParams->tokenDetails)
129 || empty($queryParams->dataCenter)
130 || empty($queryParams->clientId)
131 || empty($queryParams->clientSecret)
132 ) {
133 wp_send_json_error(
134 __(
135 'Requested parameter is empty',
136 'bit-form'
137 ),
138 400
139 );
140 }
141 $response = [];
142 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
143 $response['tokenDetails'] = ZohoDeskHandler::_refreshAccessToken($queryParams);
144 }
145
146 $organizationsMetaApiEndpoint = "https://desk.zoho.{$queryParams->dataCenter}/api/v1/organizations";
147
148 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
149 $organizationsMetaResponse = HttpHelper::get($organizationsMetaApiEndpoint, null, $authorizationHeader);
150
151 if (!is_wp_error($organizationsMetaResponse)) {
152 $allOrganizations = [];
153 $organizations = $organizationsMetaResponse->data;
154
155 if (count($organizations) > 0) {
156 foreach ($organizations as $organization) {
157 $allOrganizations[$organization->companyName] = (object) [
158 'orgId' => $organization->id,
159 'portalName' => $organization->companyName
160 ];
161 }
162 }
163 uksort($allOrganizations, 'strnatcasecmp');
164 $response['organizations'] = $allOrganizations;
165 } else {
166 wp_send_json_error(
167 empty($organizationsMetaResponse->data) ? 'Unknown' : $organizationsMetaResponse->error,
168 400
169 );
170 }
171 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
172 ZohoDeskHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['lists']);
173 }
174 wp_send_json_success($response, 200);
175 } else {
176 wp_send_json_error(
177 __(
178 'Token expired',
179 'bit-form'
180 ),
181 401
182 );
183 }
184 }
185
186 /**
187 * Process ajax request for refresh crm modules
188 *
189 * @return JSON crm module data
190 */
191 public static function refreshDepartmentsAjaxHelper()
192 {
193 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
194 $authorizationHeader = null;
195
196
197 GlobalHelper::requirePostMethod();
198
199 try {
200 $queryParams = GlobalHelper::formatRequestData();
201 } catch (\InvalidArgumentException $e) {
202 wp_send_json_error($e->getMessage(), 400);
203 }
204
205 if (
206 empty($queryParams->tokenDetails)
207 || empty($queryParams->dataCenter)
208 || empty($queryParams->clientId)
209 || empty($queryParams->clientSecret)
210 || empty($queryParams->orgId)
211 ) {
212 wp_send_json_error(
213 __(
214 'Requested parameter is empty',
215 'bit-form'
216 ),
217 400
218 );
219 }
220 $response = [];
221 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
222 $response['tokenDetails'] = ZohoDeskHandler::_refreshAccessToken($queryParams);
223 }
224
225 $departmentsMetaApiEndpoint = "https://desk.zoho.{$queryParams->dataCenter}/api/v1/departments?isEnabled=true&limit=100";
226
227 $authorizationHeader['orgId'] = "{$queryParams->orgId}";
228 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
229 $departmentsMetaResponse = HttpHelper::get($departmentsMetaApiEndpoint, null, $authorizationHeader);
230
231 if (!is_wp_error($departmentsMetaResponse)) {
232 $allDepartments = [];
233 $departments = $departmentsMetaResponse->data;
234
235 if (count($departments) > 0) {
236 foreach ($departments as $department) {
237 $allDepartments[$department->name] = (object) [
238 'departmentId' => $department->id,
239 'departmentName' => $department->name
240 ];
241 }
242 }
243 uksort($allDepartments, 'strnatcasecmp');
244 $response['departments'] = $allDepartments;
245 } else {
246 wp_send_json_error(
247 empty($departmentsMetaResponse->data) ? 'Unknown' : $departmentsMetaResponse->error,
248 400
249 );
250 }
251 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
252 ZohoDeskHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['lists']);
253 }
254 wp_send_json_success($response, 200);
255 } else {
256 wp_send_json_error(
257 __(
258 'Token expired',
259 'bit-form'
260 ),
261 401
262 );
263 }
264 }
265
266 /**
267 * Process ajax request for refesh crm layouts
268 *
269 * @return JSON crm layout data
270 */
271 public static function refreshFieldsAjaxHelper()
272 {
273 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
274 $authorizationHeader = null;
275
276
277 GlobalHelper::requirePostMethod();
278
279 try {
280 $queryParams = GlobalHelper::formatRequestData();
281 } catch (\InvalidArgumentException $e) {
282 wp_send_json_error($e->getMessage(), 400);
283 }
284
285 if (
286 empty($queryParams->tokenDetails)
287 || empty($queryParams->dataCenter)
288 || empty($queryParams->clientId)
289 || empty($queryParams->clientSecret)
290 || empty($queryParams->orgId)
291 ) {
292 wp_send_json_error(
293 __(
294 'Requested parameter is empty',
295 'bit-form'
296 ),
297 400
298 );
299 }
300 $response = [];
301 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
302 $response['tokenDetails'] = ZohoDeskHandler::_refreshAccessToken($queryParams);
303 }
304
305 $fieldsMetaApiEndpoint = "https://desk.zoho.{$queryParams->dataCenter}/api/v1/organizationFields?module=tickets";
306
307 $authorizationHeader['orgId'] = "{$queryParams->orgId}";
308 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
309 $fieldsMetaResponse = HttpHelper::get($fieldsMetaApiEndpoint, null, $authorizationHeader);
310
311 if (!is_wp_error($fieldsMetaResponse)) {
312 $fields = $fieldsMetaResponse->data;
313
314 if (count($fields) > 0) {
315 $response['fields']['Contact Name - Last Name'] = (object) [
316 'apiName' => 'lastName',
317 'displayLabel' => 'Contact Name - Last Name',
318 'isCustomField' => false,
319 'required' => true
320 ];
321 $response['fields']['Contact Name - First Name'] = (object) [
322 'apiName' => 'firstName',
323 'displayLabel' => 'Contact Name - First Name',
324 'isCustomField' => false,
325 'required' => false
326 ];
327 $response['required'][] = 'lastName';
328 foreach ($fields as $field) {
329 if ('contactId' === $field->apiName || 'assigneeId' === $field->apiName) {
330 continue;
331 }
332 $response['fields'][$field->displayLabel] = (object) [
333 'apiName' => $field->apiName,
334 'displayLabel' => $field->displayLabel,
335 'isCustomField' => $field->isCustomField,
336 'required' => $field->isMandatory
337 ];
338
339 if ($field->isMandatory) {
340 $response['required'][] = $field->apiName;
341 }
342 }
343 }
344 uksort($response['fields'], 'strnatcasecmp');
345 usort($response['required'], 'strnatcasecmp');
346 } else {
347 wp_send_json_error(
348 'error' === $fieldsMetaResponse->status ? $fieldsMetaResponse->message : 'Unknown',
349 400
350 );
351 }
352 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
353 $response['queryModule'] = $queryParams->module;
354 ZohoDeskHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
355 }
356 wp_send_json_success($response, 200);
357 } else {
358 wp_send_json_error(
359 __(
360 'Token expired',
361 'bit-form'
362 ),
363 401
364 );
365 }
366 }
367
368 /**
369 * Process ajax request for refresh crm modules
370 *
371 * @return JSON crm module data
372 */
373 public static function refreshTicketOwnersAjaxHelper()
374 {
375 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
376 $authorizationHeader = null;
377
378
379 GlobalHelper::requirePostMethod();
380
381 try {
382 $queryParams = GlobalHelper::formatRequestData();
383 } catch (\InvalidArgumentException $e) {
384 wp_send_json_error($e->getMessage(), 400);
385 }
386 if (
387 empty($queryParams->tokenDetails)
388 || empty($queryParams->dataCenter)
389 || empty($queryParams->clientId)
390 || empty($queryParams->clientSecret)
391 || empty($queryParams->orgId)
392 ) {
393 wp_send_json_error(
394 __(
395 'Requested parameter is empty',
396 'bit-form'
397 ),
398 400
399 );
400 }
401 $response = [];
402 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
403 $response['tokenDetails'] = ZohoDeskHandler::_refreshAccessToken($queryParams);
404 }
405
406 $ownersMetaApiEndpoint = "https://desk.zoho.{$queryParams->dataCenter}/api/v1/agents?status=ACTIVE&limit=100";
407
408 $authorizationHeader['orgId'] = "{$queryParams->orgId}";
409 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
410 $ownersMetaResponse = HttpHelper::get($ownersMetaApiEndpoint, null, $authorizationHeader);
411
412 if (!is_wp_error($ownersMetaResponse)) {
413 $owners = $ownersMetaResponse->data;
414
415 if (count($owners) > 0) {
416 foreach ($owners as $owner) {
417 $response['owners'][] = (object) [
418 'ownerId' => $owner->id,
419 'ownerName' => $owner->name
420 ];
421 }
422 }
423 } else {
424 wp_send_json_error(
425 empty($ownersMetaResponse->data) ? 'Unknown' : $ownersMetaResponse->error,
426 400
427 );
428 }
429 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
430 ZohoDeskHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['lists']);
431 }
432 wp_send_json_success($response, 200);
433 } else {
434 wp_send_json_error(
435 __(
436 'Token expired',
437 'bit-form'
438 ),
439 401
440 );
441 }
442 }
443
444 /**
445 * Process ajax request for refresh crm modules
446 *
447 * @return JSON crm module data
448 */
449 public static function refreshProductsAjaxHelper()
450 {
451 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
452 $authorizationHeader = null;
453
454
455 GlobalHelper::requirePostMethod();
456
457 try {
458 $queryParams = GlobalHelper::formatRequestData();
459 } catch (\InvalidArgumentException $e) {
460 wp_send_json_error($e->getMessage(), 400);
461 }
462
463 if (
464 empty($queryParams->tokenDetails)
465 || empty($queryParams->dataCenter)
466 || empty($queryParams->clientId)
467 || empty($queryParams->clientSecret)
468 || empty($queryParams->orgId)
469 || empty($queryParams->departmentId)
470 ) {
471 wp_send_json_error(
472 __(
473 'Requested parameter is empty',
474 'bit-form'
475 ),
476 400
477 );
478 }
479
480 $response = [];
481 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
482 $response['tokenDetails'] = ZohoDeskHandler::_refreshAccessToken($queryParams);
483 }
484
485 $productsMetaApiEndpoint = "https://desk.zoho.{$queryParams->dataCenter}/api/v1/products?departmentId={$queryParams->departmentId}&limit=100";
486
487 $authorizationHeader['orgId'] = "{$queryParams->orgId}";
488 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
489 $productsMetaResponse = HttpHelper::get($productsMetaApiEndpoint, null, $authorizationHeader);
490
491 if (!is_wp_error($productsMetaResponse)) {
492 $products = $productsMetaResponse->data;
493
494 if (count($products) > 0) {
495 foreach ($products as $product) {
496 $response['products'][] = (object) [
497 'productId' => $product->id,
498 'productName' => $product->productName
499 ];
500 }
501 }
502 } else {
503 wp_send_json_error(
504 empty($productsMetaResponse->data) ? 'Unknown' : $productsMetaResponse->error,
505 400
506 );
507 }
508 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
509 ZohoDeskHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['lists']);
510 }
511 wp_send_json_success($response, 200);
512 } else {
513 wp_send_json_error(
514 __(
515 'Token expired',
516 'bit-form'
517 ),
518 401
519 );
520 }
521 }
522
523 /**
524 * Helps to refresh zoho crm access_token
525 *
526 * @param object $apiData Contains required data for refresh access token
527 * @return string $tokenDetails API token details
528 */
529 protected static function _refreshAccessToken($apiData)
530 {
531 if (
532 empty($apiData->dataCenter)
533 || empty($apiData->clientId)
534 || empty($apiData->clientSecret)
535 || empty($apiData->tokenDetails)
536 ) {
537 return false;
538 }
539 $tokenDetails = $apiData->tokenDetails;
540
541 $dataCenter = $apiData->dataCenter;
542 $apiEndpoint = "https://accounts.zoho.{$dataCenter}/oauth/v2/token";
543 $requestParams = [
544 'grant_type' => 'refresh_token',
545 'client_id' => $apiData->clientId,
546 'client_secret' => $apiData->clientSecret,
547 'refresh_token' => $tokenDetails->refresh_token,
548 ];
549
550 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
551 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
552 return false;
553 }
554 $tokenDetails->generates_on = \time();
555 $tokenDetails->access_token = $apiResponse->access_token;
556 return $tokenDetails;
557 }
558
559 /**
560 * Save updated access_token to avoid unnecessary token generation
561 *
562 * @param integer $formID ID of Integration related form
563 * @param integer $integrationID ID of Zoho crm Integration
564 * @param object $tokenDetails refreshed token info
565 *
566 * @return null
567 */
568 protected static function _saveRefreshedToken($formID, $integrationID, $tokenDetails, $others = null)
569 {
570 if (empty($formID) || empty($integrationID)) {
571 return;
572 }
573
574 $integrationHandler = new IntegrationHandler($formID, IpTool::getUserDetail());
575 $zdeskDetails = $integrationHandler->getAIntegration($integrationID);
576
577 if (is_wp_error($zdeskDetails)) {
578 return;
579 }
580 $newDetails = json_decode($zdeskDetails[0]->integration_details);
581
582 $newDetails->tokenDetails = $tokenDetails;
583 if (!empty($others['organizations'])) {
584 $newDetails->default->organizations = $others['organizations'];
585 }
586
587 $integrationHandler->updateIntegration($integrationID, $zdeskDetails[0]->integration_name, 'Zoho Desk', wp_json_encode($newDetails), 'form');
588 }
589
590 public function execute(IntegrationHandler $integrationHandler, $integrationData, $fieldValues, $entryID, $logID)
591 {
592 $integrationDetails = is_string($integrationData->integration_details) ? json_decode($integrationData->integration_details) : $integrationData->integration_details;
593
594 $tokenDetails = $integrationDetails->tokenDetails;
595 $orgId = $integrationDetails->orgId;
596 $department = $integrationDetails->department;
597 $dataCenter = $integrationDetails->dataCenter;
598 $fieldMap = $integrationDetails->field_map;
599 $required = $integrationDetails->default->fields->{$orgId}->required;
600 $actions = $integrationDetails->actions;
601 if (
602 empty($tokenDetails)
603 || empty($orgId)
604 || empty($department)
605 || empty($fieldMap)
606 ) {
607 return new WP_Error('REQ_FIELD_EMPTY', __('list are required for zoho desk api', 'bit-form'));
608 }
609
610 $requiredParams = null;
611 if ((intval($tokenDetails->generates_on) + (55 * 60)) < time()) {
612 $requiredParams['clientId'] = $integrationDetails->clientId;
613 $requiredParams['clientSecret'] = $integrationDetails->clientSecret;
614 $requiredParams['dataCenter'] = $integrationDetails->dataCenter;
615 $requiredParams['tokenDetails'] = $tokenDetails;
616 $newTokenDetails = ZohoDeskHandler::_refreshAccessToken((object)$requiredParams);
617 if ($newTokenDetails) {
618 ZohoDeskHandler::_saveRefreshedToken($this->_formID, $this->_integrationID, $newTokenDetails);
619 $tokenDetails = $newTokenDetails;
620 }
621 }
622
623 // $actions = $integrationDetails->actions;
624 $recordApiHelper = new RecordApiHelper($tokenDetails, $orgId, $this->_integrationID, $logID);
625
626 $zdeskApiResponse = $recordApiHelper->executeRecordApi(
627 $department,
628 $dataCenter,
629 $fieldValues,
630 $fieldMap,
631 $required,
632 $actions,
633 $entryID,
634 $this->_formID
635 );
636
637 if (is_wp_error($zdeskApiResponse)) {
638 return $zdeskApiResponse;
639 }
640 return $zdeskApiResponse;
641 }
642 }
643