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
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.0, at includes/Core/Integration/ZohoDesk/ZohoDeskHandler.php

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