PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.9.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.9.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 2.10.2 All 137 releases
bit-form / includes / Core / Integration / ZohoSheet / ZohoSheetHandler.php

ZohoSheetHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.9.1, at includes/Core/Integration/ZohoSheet/ZohoSheetHandler.php

429 lines 14.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * ZohoSheet Integration
5 *
6 */
7
8 namespace BitCode\BitForm\Core\Integration\ZohoSheet;
9
10 use BitCode\BitForm\Core\Integration\IntegrationHandler;
11 use BitCode\BitForm\Core\Util\HttpHelper;
12 use BitCode\BitForm\Core\Util\IpTool;
13 use WP_Error;
14
15 /**
16 * Provide functionality for ZohoCrm integration
17 */
18 class ZohoSheetHandler
19 {
20 private $_formID;
21 private $_integrationID;
22
23 public function __construct($integrationID, $fromID)
24 {
25 $this->_formID = $fromID;
26 $this->_integrationID = $integrationID;
27 }
28
29 /**
30 * Helps to register ajax function's with wp
31 *
32 * @return null
33 */
34 public static function registerAjax()
35 {
36 add_action('wp_ajax_bitforms_zsheet_generate_token', [__CLASS__, 'generateTokens']);
37 add_action('wp_ajax_bitforms_zsheet_refresh_workbooks', [__CLASS__, 'refreshWorkbooksAjaxHelper']);
38 add_action('wp_ajax_bitforms_zsheet_refresh_worksheets', [__CLASS__, 'refreshWorksheetsAjaxHelper']);
39 add_action('wp_ajax_bitforms_zsheet_refresh_worksheet_headers', [__CLASS__, 'refreshWorksheetHeadersAjaxHelper']);
40 }
41
42 /**
43 * Process ajax request for generate_token
44 *
45 * @return JSON zoho crm api response and status
46 */
47 public static function generateTokens()
48 {
49 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce($_REQUEST['_ajax_nonce'], 'bitforms_save')) {
50 $inputJSON = file_get_contents('php://input');
51 $requestsParams = json_decode($inputJSON);
52 if (
53 empty($requestsParams->{'accounts-server'})
54 || empty($requestsParams->dataCenter)
55 || empty($requestsParams->clientId)
56 || empty($requestsParams->clientSecret)
57 || empty($requestsParams->redirectURI)
58 || empty($requestsParams->code)
59 ) {
60 wp_send_json_error(
61 __(
62 'Requested parameter is empty',
63 'bit-form'
64 ),
65 400
66 );
67 }
68
69 $apiEndpoint = \urldecode($requestsParams->{'accounts-server'}) . '/oauth/v2/token';
70 $requestParams = [
71 'grant_type' => 'authorization_code',
72 'client_id' => $requestsParams->clientId,
73 'client_secret' => $requestsParams->clientSecret,
74 'redirect_uri' => \urldecode($requestsParams->redirectURI),
75 'code' => $requestsParams->code
76 ];
77 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
78
79 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
80 wp_send_json_error(
81 empty($apiResponse->error) ? 'Unknown' : $apiResponse->error,
82 400
83 );
84 }
85 $apiResponse->generates_on = \time();
86 wp_send_json_success($apiResponse, 200);
87 } else {
88 wp_send_json_error(
89 __(
90 'Token expired',
91 'bit-form'
92 ),
93 401
94 );
95 }
96 }
97
98 /**
99 * Process ajax request for refresh crm modules
100 *
101 * @return JSON crm module data
102 */
103 public static function refreshWorkbooksAjaxHelper()
104 {
105 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce($_REQUEST['_ajax_nonce'], 'bitforms_save')) {
106 $authorizationHeader = null;
107 $inputJSON = file_get_contents('php://input');
108 $queryParams = json_decode($inputJSON);
109 if (
110 empty($queryParams->tokenDetails)
111 || empty($queryParams->dataCenter)
112 || empty($queryParams->clientId)
113 || empty($queryParams->clientSecret)
114 ) {
115 wp_send_json_error(
116 __(
117 'Requested parameter is empty',
118 'bit-form'
119 ),
120 400
121 );
122 }
123 $response = [];
124 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
125 $response['tokenDetails'] = ZohoSheetHandler::_refreshAccessToken($queryParams);
126 }
127
128 $workbooksMetaApiEndpoint = "https://sheet.zoho.{$queryParams->dataCenter}/api/v2/workbooks?method=workbook.list";
129
130 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
131 $workbooksMetaResponse = HttpHelper::get($workbooksMetaApiEndpoint, null, $authorizationHeader);
132
133 $allWorkbooks = [];
134 if (!is_wp_error($workbooksMetaResponse) && empty($workbooksMetaResponse->response->error)) {
135 $workbooks = $workbooksMetaResponse->workbooks;
136 foreach ($workbooks as $workbook) {
137 $allWorkbooks[$workbook->workbook_name] = (object) [
138 'workbookId' => $workbook->resource_id,
139 'workbookName' => $workbook->workbook_name
140 ];
141 }
142 uksort($allWorkbooks, 'strnatcasecmp');
143 $response['workbooks'] = $allWorkbooks;
144 } else {
145 wp_send_json_error(
146 $workbooksMetaResponse->response->error->message,
147 400
148 );
149 }
150 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
151 ZohoSheetHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['workbooks']);
152 }
153 wp_send_json_success($response, 200);
154 } else {
155 wp_send_json_error(
156 __(
157 'Token expired',
158 'bit-form'
159 ),
160 401
161 );
162 }
163 }
164
165 /**
166 * Process ajax request for refesh crm layouts
167 *
168 * @return JSON crm layout data
169 */
170 public static function refreshWorksheetsAjaxHelper()
171 {
172 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce($_REQUEST['_ajax_nonce'], 'bitforms_save')) {
173 $authorizationHeader = null;
174 $inputJSON = file_get_contents('php://input');
175 $queryParams = json_decode($inputJSON);
176 if (
177 empty($queryParams->workbook)
178 || empty($queryParams->tokenDetails)
179 || empty($queryParams->dataCenter)
180 || empty($queryParams->clientId)
181 || empty($queryParams->clientSecret)
182 ) {
183 wp_send_json_error(
184 __(
185 'Requested parameter is empty',
186 'bit-form'
187 ),
188 400
189 );
190 }
191 $response = [];
192 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
193 $response['tokenDetails'] = ZohoSheetHandler::_refreshAccessToken($queryParams);
194 }
195
196 $worksheetsMetaApiEndpoint = "https://sheet.zoho.{$queryParams->dataCenter}/api/v2/{$queryParams->workbook}?method=worksheet.list";
197
198 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
199 $worksheetsMetaResponse = HttpHelper::get($worksheetsMetaApiEndpoint, null, $authorizationHeader);
200
201 if (!is_wp_error($worksheetsMetaResponse)) {
202 $allWorksheets = [];
203 $worksheets = $worksheetsMetaResponse->worksheet_names;
204 foreach ($worksheets as $worksheet) {
205 $allWorksheets[] = $worksheet->worksheet_name;
206 }
207 usort($allWorksheets, 'strnatcasecmp');
208 $response['worksheets'] = $allWorksheets;
209 } else {
210 wp_send_json_error(
211 'error' === $fieldsMetaResponse->status ? $fieldsMetaResponse->message : 'Unknown',
212 400
213 );
214 }
215 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
216 $response['queryWorkbook'] = $queryParams->workbook;
217 ZohoSheetHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
218 }
219 wp_send_json_success($response, 200);
220 } else {
221 wp_send_json_error(
222 __(
223 'Token expired',
224 'bit-form'
225 ),
226 401
227 );
228 }
229 }
230
231 /**
232 * Process ajax request for refesh crm layouts
233 *
234 * @return JSON crm layout data
235 */
236 public static function refreshWorksheetHeadersAjaxHelper()
237 {
238 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce($_REQUEST['_ajax_nonce'], 'bitforms_save')) {
239 $authorizationHeader = null;
240 $inputJSON = file_get_contents('php://input');
241 $queryParams = json_decode($inputJSON);
242 if (
243 empty($queryParams->workbook)
244 || empty($queryParams->worksheet)
245 || empty($queryParams->tokenDetails)
246 || empty($queryParams->dataCenter)
247 || empty($queryParams->clientId)
248 || empty($queryParams->clientSecret)
249 || empty($queryParams->clientSecret)
250 ) {
251 wp_send_json_error(
252 __(
253 'Requested parameter is empty',
254 'bit-form'
255 ),
256 400
257 );
258 }
259 $response = [];
260 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
261 $response['tokenDetails'] = ZohoSheetHandler::_refreshAccessToken($queryParams);
262 }
263
264 if ((int) $queryParams->headerRow < 1) {
265 $queryParams->headerRow = 1;
266 }
267
268 $worksheetHeadersMetaApiEndpoint = "https://sheet.zoho.{$queryParams->dataCenter}/api/v2/{$queryParams->workbook}?method=worksheet.records.fetch&worksheet_name={$queryParams->worksheet}&count=1&header_row={$queryParams->headerRow}";
269
270 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
271 $worksheetHeadersMetaResponse = HttpHelper::get($worksheetHeadersMetaApiEndpoint, null, $authorizationHeader);
272
273 // wp_send_json_success($worksheetHeadersMetaResponse, 200);
274
275 if (!is_wp_error($worksheetHeadersMetaResponse)) {
276 $allHeaders = array_diff(array_keys((array) $worksheetHeadersMetaResponse->records[0]), ['row_index']);
277
278 usort($allHeaders, 'strnatcasecmp');
279 $response['worksheet_headers'] = $allHeaders;
280 } else {
281 wp_send_json_error(
282 'error' === $fieldsMetaResponse->status ? $fieldsMetaResponse->message : 'Unknown',
283 400
284 );
285 }
286 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
287 $response['queryModule'] = $queryParams->module;
288 ZohoSheetHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
289 }
290 wp_send_json_success($response, 200);
291 } else {
292 wp_send_json_error(
293 __(
294 'Token expired',
295 'bit-form'
296 ),
297 401
298 );
299 }
300 }
301
302 /**
303 * Helps to refresh zoho crm access_token
304 *
305 * @param Array $apiData Contains required data for refresh access token
306 * @return JSON $tokenDetails API token details
307 */
308 protected static function _refreshAccessToken($apiData)
309 {
310 if (
311 empty($apiData->dataCenter)
312 || empty($apiData->clientId)
313 || empty($apiData->clientSecret)
314 || empty($apiData->tokenDetails)
315 ) {
316 return false;
317 }
318 $tokenDetails = $apiData->tokenDetails;
319
320 $dataCenter = $apiData->dataCenter;
321 $apiEndpoint = "https://accounts.zoho.{$dataCenter}/oauth/v2/token";
322 $requestParams = [
323 'grant_type' => 'refresh_token',
324 'client_id' => $apiData->clientId,
325 'client_secret' => $apiData->clientSecret,
326 'refresh_token' => $tokenDetails->refresh_token,
327 ];
328
329 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
330 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
331 return false;
332 }
333 $tokenDetails->generates_on = \time();
334 $tokenDetails->access_token = $apiResponse->access_token;
335 return $tokenDetails;
336 }
337
338 /**
339 * Save updated access_token to avoid unnecessary token generation
340 *
341 * @param Integer $fromID ID of Integration related form
342 * @param Integer $integrationID ID of Zoho crm Integration
343 * @param Obeject $tokenDetails refreshed token info
344 *
345 * @return null
346 */
347 protected static function _saveRefreshedToken($formID, $integrationID, $tokenDetails, $others = null)
348 {
349 if (empty($formID) || empty($integrationID)) {
350 return;
351 }
352
353 $integrationHandler = new IntegrationHandler($formID, IpTool::getUserDetail());
354 $zsheetDetails = $integrationHandler->getAIntegration($integrationID);
355
356 if (is_wp_error($zsheetDetails)) {
357 return;
358 }
359 $newDetails = json_decode($zsheetDetails[0]->integration_details);
360
361 $newDetails->tokenDetails = $tokenDetails;
362 if (!empty($others['workbooks'])) {
363 $newDetails->default->workbooks = $others['workbooks'];
364 }
365 if (!empty($others['worksheets'])) {
366 $newDetails->default->worksheets = $others['worksheets'];
367 }
368 if (!empty($others['worksheet_headers'])) {
369 $newDetails->default->worksheets->headers->{$others['worksheet']} = $others['worksheet_headers'];
370 }
371
372 $integrationHandler->updateIntegration($integrationID, $zsheetDetails[0]->integration_name, 'Zoho Sheet', \json_encode($newDetails), 'form');
373 }
374
375 public function execute(IntegrationHandler $integrationHandler, $integrationData, $fieldValues, $entryID, $logID)
376 {
377 $integrationDetails = is_string($integrationData->integration_details) ? json_decode($integrationData->integration_details) : $integrationData->integration_details;
378
379 $tokenDetails = $integrationDetails->tokenDetails;
380 $workbook = $integrationDetails->workbook;
381 $worksheet = $integrationDetails->worksheet;
382 $headerRow = $integrationDetails->headerRow;
383 $dataCenter = $integrationDetails->dataCenter;
384 $fieldMap = $integrationDetails->field_map;
385 $actions = $integrationDetails->actions;
386 $defaultDataConf = $integrationDetails->default;
387 if (
388 empty($tokenDetails)
389 || empty($workbook)
390 || empty($worksheet)
391 || empty($fieldMap)
392 ) {
393 return new WP_Error('REQ_FIELD_EMPTY', __('module, fields are required for zoho sheet api', 'bit-form'));
394 }
395
396 $requiredParams = null;
397 if ((intval($tokenDetails->generates_on) + (55 * 60)) < time()) {
398 $requiredParams['clientId'] = $integrationDetails->clientId;
399 $requiredParams['clientSecret'] = $integrationDetails->clientSecret;
400 $requiredParams['dataCenter'] = $integrationDetails->dataCenter;
401 $requiredParams['tokenDetails'] = $tokenDetails;
402 $newTokenDetails = ZohoSheetHandler::_refreshAccessToken((object)$requiredParams);
403 if ($newTokenDetails) {
404 ZohoSheetHandler::_saveRefreshedToken($this->_formID, $this->_integrationID, $newTokenDetails);
405 $tokenDetails = $newTokenDetails;
406 }
407 }
408
409 // $actions = $integrationDetails->actions;
410 $recordApiHelper = new RecordApiHelper($tokenDetails, $this->_integrationID, $logID);
411
412 $zsheetApiResponse = $recordApiHelper->executeRecordApi(
413 $workbook,
414 $worksheet,
415 $headerRow,
416 $dataCenter,
417 $actions,
418 $defaultDataConf,
419 $fieldValues,
420 $fieldMap
421 );
422
423 if (is_wp_error($zsheetApiResponse)) {
424 return $zsheetApiResponse;
425 }
426 return $zsheetApiResponse;
427 }
428 }
429