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 / ZohoSheet / ZohoSheetHandler.php

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

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