PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 3.2.2
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v3.2.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 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 3.2.2, at includes/Core/Integration/ZohoDesk/ZohoDeskHandler.php

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