PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 3.3.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v3.3.1
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 / ZohoRecruit / RecordApiHelper.php

RecordApiHelper.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 3.3.1, at includes/Core/Integration/ZohoRecruit/RecordApiHelper.php

243 lines 9.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * ZohoRecruit Record Api
5 *
6 */
7
8 namespace BitCode\BitForm\Core\Integration\ZohoRecruit;
9
10 use BitCode\BitForm\Core\Util\ApiResponse as UtilApiResponse;
11 use BitCode\BitForm\Core\Util\DateTimeHelper;
12 use BitCode\BitForm\Core\Util\FieldValueHandler;
13 use BitCode\BitForm\Core\Util\HttpHelper;
14 use WP_Error;
15
16 /**
17 * Provide functionality for Record insert,upsert
18 */
19 class RecordApiHelper
20 {
21 private $_defaultHeader;
22 private $_apiDomain;
23 private $_tokenDetails;
24 private $_dataCenter;
25 private $_integrationID;
26 private $_logID;
27 private $_logResponse;
28
29 public function __construct($dataCenter, $tokenDetails, $integId, $logID)
30 {
31 $this->_defaultHeader['Authorization'] = "Zoho-oauthtoken {$tokenDetails->access_token}";
32 $this->_apiDomain = \urldecode($tokenDetails->api_domain);
33 $this->_dataCenter = $dataCenter;
34 $this->_tokenDetails = $tokenDetails;
35 $this->_integrationID = $integId;
36 $this->_logID = $logID;
37 $this->_logResponse = new UtilApiResponse();
38 }
39
40 public function insertRecord($module, $data)
41 {
42 $insertRecordEndpoint = "https://recruit.zoho.{$this->_dataCenter}/recruit/private/json/{$module}/addRecords";
43 return HttpHelper::post($insertRecordEndpoint, $data, $this->_defaultHeader);
44 }
45
46 public function executeRecordApi($formID, $entryID, $defaultConf, $module, $fieldValues, $fieldMap, $actions, $required, $fileMap)
47 {
48 $fieldData = [];
49 $entryDetails = [
50 'formId' => $formID,
51 'entryId' => $entryID,
52 'fieldValues' => $fieldValues
53 ];
54 foreach ($fieldMap as $fieldPair) {
55 if (!empty($fieldPair->zohoFormField)) {
56 if ('custom' === $fieldPair->formField && isset($fieldPair->customValue)) {
57 $fieldData[$fieldPair->zohoFormField] = $this->formatFieldValue($fieldPair->customValue, $defaultConf->moduleData->{$module}->fields->{$fieldPair->zohoFormField});
58 } else {
59 $fieldData[$fieldPair->zohoFormField] = $this->formatFieldValue($fieldValues[$fieldPair->formField], $defaultConf->moduleData->{$module}->fields->{$fieldPair->zohoFormField});
60 if ('Zip/Postal Code' === $fieldPair->zohoFormField) {
61 $fieldData['Zip Code'] = $fieldData[$fieldPair->zohoFormField];
62 unset($fieldData[$fieldPair->zohoFormField]);
63 }
64 }
65
66 if (empty($fieldData[$fieldPair->zohoFormField]) && \in_array($fieldPair->zohoFormField, $required)) {
67 /* translators: %1$s: field name, %2$s: module name */
68 $error = new WP_Error('REQ_FIELD_EMPTY', wp_sprintf(__('%1$s is required for zoho recruit, %2$s module', 'bit-form'), $fieldPair->zohoFormField, $module));
69 $this->_logResponse->apiResponse($this->_logID, $this->_integrationID, ['type' => 'record', 'type_name' => 'field'], 'validation', $error, $entryDetails);
70 return $error;
71 }
72 }
73 }
74
75 $xmlData = "<$module><row no='1'>";
76
77 foreach ($fieldData as $field => $value) {
78 $xmlData .= "<FL val='$field'>$value</FL>";
79 }
80
81 if (!empty($actions->recordOwner)) {
82 $xmlData .= "<FL val='SMOWNERID'>$actions->recordOwner</FL>";
83 }
84 $xmlData .= "</row></$module>";
85 $requestParams['scope'] = 'ZohoRecruit.modules.all';
86 $requestParams['version'] = 4;
87
88 $requestParams['xmlData'] = $xmlData;
89 if (!empty($actions->workflow)) {
90 $requestParams['wfTrigger'] = 'true'; //api accept string true | false
91 }
92 if (!empty($actions->upsert)) {
93 $requestParams['duplicateCheck'] = 2;
94 }
95 if (!empty($actions->approval)) {
96 $requestParams['isApproval'] = 'true'; //api accept string true | false
97 }
98
99 $recordApiResponse = $this->insertRecord($module, $requestParams);
100 if (isset($recordApiResponse->response->error)) {
101 return $this->_logResponse->apiResponse($this->_logID, $this->_integrationID, ['type' => 'record', 'type_name' => $module], 'error', $recordApiResponse, $entryDetails);
102 } else {
103 $this->_logResponse->apiResponse($this->_logID, $this->_integrationID, ['type' => 'record', 'type_name' => $module], 'success', $recordApiResponse, $entryDetails);
104 }
105
106 if (isset($recordApiResponse->response->error)) {
107 return new WP_Error('INSERT_ERROR', $recordApiResponse->response->error->message);
108 }
109 if (!empty($recordApiResponse->response->result->row->success->details->FL[0]) && 'Id' === $recordApiResponse->response->result->row->success->details->FL[0]->val) {
110 $recordID = $recordApiResponse->response->result->row->success->details->FL[0]->content;
111 if (isset($actions->note) && !empty($actions->note->type)) {
112 $noteDetails = $actions->note;
113 $typeDetails = explode('__', $noteDetails->type);
114 $content = FieldValueHandler::replaceFieldWithValue($noteDetails->content, $fieldValues);
115 $xmlData = "<Notes><row no='1'>";
116 $xmlData .= "<FL val='entityId'>$recordID</FL>";
117 $xmlData .= "<FL val='Note Type'>$typeDetails[1]</FL>";
118 $xmlData .= "<FL val='Type Id'>$typeDetails[0]</FL>";
119 $xmlData .= "<FL val='Note Content'>$content</FL>";
120 $xmlData .= "<FL val='Parent Module'>$module</FL>";
121 $xmlData .= '</row></Notes>';
122 $requestParams['version'] = 2;
123 $requestParams['xmlData'] = $xmlData;
124
125 $noteApiResponse = $this->insertRecord('Notes', $requestParams);
126 if (isset($noteApiResponse->response->error)) {
127 $this->_logResponse->apiResponse($this->_logID, $this->_integrationID, ['type' => 'note', 'type_name' => $module], 'error', $noteApiResponse, $entryDetails);
128 } else {
129 $this->_logResponse->apiResponse($this->_logID, $this->_integrationID, ['type' => 'note', 'type_name' => $module], 'success', $noteApiResponse, $entryDetails);
130 }
131 }
132
133 $filesApiHelper = new FilesApiHelper($module, $this->_dataCenter, $this->_tokenDetails, $formID, $entryID);
134 if (count($fileMap)) {
135 $fileFound = 0;
136 $responseType = 'success';
137 $fileUpResponses = [];
138 foreach ($fileMap as $fileKey => $filePair) {
139 if (!empty($filePair->zohoFormField) && !empty($fieldValues[$filePair->formField])) {
140 $fileFound = 1;
141 if (@property_exists($defaultConf->moduleData->{$module}->fileUploadFields, $filePair->zohoFormField) && 'UploadText' === $defaultConf->moduleData->{$module}->fileUploadFields->{$filePair->zohoFormField}->data_type) {
142 $fileUpResponse = $filesApiHelper->uploadFiles($fieldValues[$filePair->formField], $recordID, $filePair->zohoFormField);
143 if (isset($fileUpResponse->response->error)) {
144 $responseType = 'error';
145 }
146 $fileUpResponses[] = $fileUpResponse;
147 }
148 }
149 }
150 if ($fileFound) {
151 $this->_logResponse->apiResponse($this->_logID, $this->_integrationID, ['type' => 'file', 'type_name' => $module], $responseType, $fileUpResponses, $entryDetails);
152 }
153 }
154 }
155
156 return $recordApiResponse;
157 }
158
159 public function formatFieldValue($value, $formatSpecs)
160 {
161 if (empty($value)) {
162 return '';
163 }
164
165 switch ($formatSpecs->data_type) {
166 case 'AutoNumber':
167 $apiFormat = 'integer';
168 break;
169
170 case 'Text':
171 case 'Picklist':
172 case 'Email':
173 case 'Website':
174 case 'Currency':
175 case 'TextArea':
176 $apiFormat = 'string';
177 break;
178
179 case 'Date':
180 $apiFormat = 'date';
181 break;
182
183 case 'DateTime':
184 $apiFormat = 'datetime';
185 break;
186
187 case 'Double':
188 $apiFormat = 'double';
189 break;
190
191 case 'Boolean':
192 $apiFormat = 'boolean';
193 break;
194
195 default:
196 $apiFormat = $formatSpecs->data_type;
197 break;
198 }
199
200 $formatedValue = '';
201 $fieldFormat = gettype($value);
202 if ($fieldFormat === $apiFormat && 'datetime' !== $formatSpecs->data_type) {
203 $formatedValue = $value;
204 } else {
205 if ('string' === $apiFormat && 'datetime' !== $formatSpecs->data_type) {
206 $formatedValue = !is_string($value) ? wp_json_encode($value) : $value;
207 } elseif ('datetime' === $apiFormat) {
208 $dateTimeHelper = new DateTimeHelper();
209 $formatedValue = $dateTimeHelper->getFormated($value, 'Y-m-d\TH:i', DateTimeHelper::wp_timezone(), 'Y-m-d H:i:s', null);
210 } elseif ('date' === $apiFormat) {
211 $dateTimeHelper = new DateTimeHelper();
212 $formatedValue = $dateTimeHelper->getFormated($value, 'Y-m-d', DateTimeHelper::wp_timezone(), 'm/d/Y', null);
213 } else {
214 $stringyfiedValue = !is_string($value) ? wp_json_encode($value) : $value;
215
216 switch ($apiFormat) {
217 case 'double':
218 $formatedValue = (float) $stringyfiedValue;
219 break;
220
221 case 'boolean':
222 $formatedValue = (bool) $stringyfiedValue;
223 break;
224
225 case 'integer':
226 $formatedValue = (int) $stringyfiedValue;
227 break;
228
229 default:
230 $formatedValue = $stringyfiedValue;
231 break;
232 }
233 }
234 }
235 $formatedValueLenght = 'array' === $apiFormat || 'object' === $apiFormat ? (is_countable($formatedValue) ? \count($formatedValue) : @count($formatedValue)) : \strlen($formatedValue);
236 if ($formatedValueLenght > $formatSpecs->length) {
237 $formatedValue = 'array' === $apiFormat || 'object' === $apiFormat ? array_slice($formatedValue, 0, $formatSpecs->length) : substr($formatedValue, 0, $formatSpecs->length);
238 }
239
240 return $formatedValue;
241 }
242 }
243