Odyssey
cutrustvendor.data
1 <?php
2  /*
3  * File: cutrustvendor.data
4  *
5  * Purpose: This script will handle the data / business logic for cu trusted vendor
6  * maintenance
7  * SPB, 10/6/2015-- add version 2 with kendo
8  */
9 $showSQL= false;
10 
11 $monLibrary= dirname(__FILE__) . "/../library";
12 $monIncludes= dirname(__FILE__) . "/../includes";
13 $sharedLibrary= dirname(__FILE__) . "/../../shared/library";
14 require_once("$monLibrary/cu_top.i");
15 require_once("$monLibrary/ck_hticket.i");
16 require_once("$monIncludes/cu_remote_top.prg");
17 require_once("$sharedLibrary/commonPhpFunctions.i");
18 
19  if (!CheckPerm($link, $Hu, basename($_SERVER['SCRIPT_NAME']), $_SERVER['REMOTE_ADDR'])) {
20  // ** Permissions failed
21  // ** redirect to new page
22  header("Location: /hcuadm/hcu_noperm.prg");
23  exit;
24  }
25 
26 dms_import_v2($DATA_PARAMETERS, "TOP_LEVEL", array('operation' => 'string'));
27 $operation= $DATA_PARAMETERS["TOP_LEVEL"]['operation'];
28 
29 switch ($operation)
30 {
31  case "readTrustedVendors":
32  $returnArray= readTrustedVendors($dbh);
33  break;
34  case "createTrustedId":
35  $returnArray= createOrUpdateTrustedId($dbh, true);
36  break;
37  case "updateTrustedId":
38  $returnArray= createOrUpdateTrustedId($dbh, false);
39  break;
40  case "removeTrustedId":
41  $returnArray= removeTrustedId($dbh);
42  break;
43  case "addTrustedDetail":
44  $returnArray= changeTrustedDetail($dbh, "add");
45  break;
46  case "updateTrustedDetail":
47  $returnArray= changeTrustedDetail($dbh, "update");
48  break;
49  case "removeTrustedDetail":
50  $returnArray= changeTrustedDetail($dbh, "delete");
51  break;
52  case "addServerProperty":
53  $returnArray= changeServerProperty($dbh, "add");
54  break;
55  case "updateServerProperty":
56  $returnArray= changeServerProperty($dbh, "update");
57  break;
58  case "removeServerProperty":
59  $returnArray= changeServerProperty($dbh, "delete");
60  break;
61  case "reorderTrustedDetail":
62  $returnArray= reorderTrustedDetail($dbh);
63  break;
64  default: $returnArray= array("sql" => array(), "error" => array("Operation not specified: '$operation'"), "record" => "", "operation" => "");
65 }
66 
67 if (!$showSQL)
68  unset($returnArray["sql"]);
69 header('Content-type: application/json');
70 print json_encode($returnArray);
71 
72 // Gets the particular options.
73 function getOptionList()
74 {
75  return array("APP" => "usesApps", "CLS" => "usesCls", "MBL" => "usesMbl", "ADA" => "usesAda", "CMB" => "usesCmb");
76 }
77 
78 // Gets the particular types.
79 function getTypeList()
80 {
81  return array("BillPay" => "BillPay", "SSO" => "SSO", "E" => "E-Statement", "C" => "Credit Card Info", "RDC" => "Remote Deposit Capture", "O" => "Other");
82 }
83 
84 // Gets the particular field types.
85 function getFieldTypeList()
86 {
87  return array("string" => "String", "digits" => "Number", "boolean" => "Boolean", "list" => "List");
88 }
89 
90 // Gets the particular server options.
91 function getServerOptions()
92 {
93  return array("N" => "Active", "U" => "Offline (Auto Up)", "Y" => "Offline (Stay Down)");
94 }
95 
96 // Updates the remote servers given all the particular fields.
97 function updateRemoteServers($trustedId, $vendorName, $trustedType, $optionsEncoded, $detailsEncoded)
98 {
99  $updateServers= false;
100  if (isset($trustedId))
101  {
102  Remote_Field_Add("trustvendor", "trustedid", $trustedId);
103  $updateServers= true;
104  }
105  if (isset($vendorName))
106  {
107  Remote_Field_Add("trustvendor", "trustedvendor", $vendorName);
108  $updateServers= true;
109  }
110  if (isset($trustedType))
111  {
112  Remote_Field_Add("trustvendor", "trustedtype", $trustedType);
113  $updateServers= true;
114  }
115  if (isset($optionsEncoded))
116  {
117  Remote_Field_Add("trustvendor", "hcuinterface", $optionsEncoded);
118  $updateServers= true;
119  }
120  if (isset($detailsEncoded))
121  {
122  Remote_Field_Add("trustvendor", "trustedfields", $detailsEncoded);
123  $updateServers= true;
124  }
125  if ($updateServers)
126  {
127  Remote_Update_All("U", "trustvendor");
128  }
129 }
130 
131 // Reads all the trusted vendors (top-level and bottom-level)
132 function readTrustedVendors($dbh)
133 {
134  $optionList= getOptionList();
135  $typeList= getTypeList();
136  $fieldTypeList= getFieldTypeList();
137 
138  $sql= "select trustedid, trustedvendor, trustedtype, trustedfields from cutrustedmaster order by trustedid, trustedvendor";
139  $queryResults= runSelectStatement($sql, $dbh, array("trustedid" => "trustedId", "trustedvendor" => "vendorName", "trustedtype" => "typeValue", "trustedfields" => "details"));
140  $records= array();
141 
142  $serverOptions= getServerOptions();
143  $serverOptionsDDL= array();
144  foreach($serverOptions as $key => $value)
145  {
146  $serverOptionsDDL[]= array("value" => $key, "text" => $value);
147  }
148 
149  $details= array();
150  $detailIndex= 1;
151  foreach($queryResults["record"] as $record)
152  {
153  // Expand options
154  foreach ($optionList as $key => $value)
155  {
156  $record[$value]= false;
157  }
158  $expandedOptions= json_decode($record["options"], true);
159  if (is_array($expandedOptions))
160  {
161  foreach($expandedOptions as $option)
162  {
163  $gridColumn= $optionList[$option];
164  $record[$gridColumn]= true;
165  }
166  }
167  unset($record["options"]);
168 
169  // Expand details
170  $expandedDetails= json_decode($record["details"], true);
171 
172  if (is_array($expandedDetails))
173  {
174  $theseDetails= array();
175  if ($record["vendorName"] == "HOMECU" && $record["trustedId"] == "HOMECUSERVICE")
176  {
177  $messages= array();
178  foreach($expandedDetails as $key => $detailRecord)
179  {
180  $pos= stripos($key, "_MSG");
181  if ($pos !== false && strlen($key) - $pos == 4) // _MSG at end of the string
182  $messages[stripslashes(substr($key, 0, $pos))]= stripslashes($detailRecord["Default"]);
183  else
184  $theseDetails[]= array("detailName" => stripslashes($key), "defaultValue" => stripslashes($detailRecord["Default"]), "trustedId" => $record["trustedId"]);
185  }
186 
187  for($i=0, $count= count($theseDetails); $i != $count; $i++)
188  {
189  $key= $theseDetails[$i]["detailName"];
190  $theseDetails[$i]["defaultMessage"]= strval($messages[$key]);
191  }
192  $details= array_merge($details, $theseDetails);
193  }
194  else
195  {
196  $displayOrder=0;
197  foreach($expandedDetails as $key => $detailRecord)
198  {
199  $detail= array("detailName" => $key, "fieldType" => "", "fieldTypeText" => "", "defaultValue" => "", "trustedId" => $record["trustedId"],
200  "defaultMessage" => "", "displayOrder" => $displayOrder++);
201  if (is_array($detailRecord))
202  foreach($detailRecord as $lowerKey => $value) // type and default
203  {
204  if ($lowerKey == "Type")
205  {
206  $detail["fieldType"]= $value;
207  $detail["fieldTypeText"]= $fieldTypeList[$value];
208  }
209  else if ($lowerKey == "Default")
210  $detail["defaultValue"]= stripslashes($value);
211  else if ($lowerKey == "Message")
212  $detail["defaultMessage"]= stripslashes($value);
213  }
214  $details[]= $detail;
215  }
216  }
217  }
218  unset($record["details"]);
219 
220  $record["typeText"]= $typeList[$record["typeValue"]];
221 
222  $records[]= $record;
223  }
224 
225  $types= array();
226  foreach($typeList as $value => $text)
227  {
228  $types[]= array("value" => $value, "text" => $text);
229  }
230  $fieldTypes= array();
231  foreach($fieldTypeList as $value => $text)
232  {
233  $fieldTypes[]= array("value" => $value, "text" => $text);
234  }
235 
236  return array("error" => $queryResults["error"], "sql" => $queryResults["sql"], "record" => $records, "operation" => "read", "detailRecords" => $details,
237  "optionDDL" => array_keys($optionList), "typeDDL" => $types, "fieldTypeDDL" => $fieldTypes, "serverOptions" => $serverOptionsDDL);
238 }
239 
240 // Creates or updates a top-level record.
241 function createOrUpdateTrustedId($dbh, $isCreate)
242 {
243  $parameters= array();
244  dms_import_v2($parameters, "BOTTOM_LEVEL", array("trustedId" => "string", "vendorName" => "string", "typeValue" => "string", "detailsEncoded" => "string"));
245 
246  $sqls= array();
247  $errors= cleanValuesForDatabase($parameters["BOTTOM_LEVEL"],
248  array("trustedId" => array("type" => "string", "required" => true, "maxlength" => 20),
249  "vendorName" => array("type" => "string", "required" => true, "maxlength" => 15),
250  "typeValue" => array("type" => "string", "required" => true, "maxlength" => 10)));
251  $trustedId= $parameters["BOTTOM_LEVEL"]["trustedId"];
252  $vendorName= $parameters["BOTTOM_LEVEL"]["vendorName"];
253  $typeValue= $parameters["BOTTOM_LEVEL"]["typeValue"];
254  $detailsEncoded= $parameters["BOTTOM_LEVEL"]["detailsEncoded"];
255 
256  $createdColumns= "trustedid, trustedvendor, trustedtype";
257  $createdValues= "'$trustedId', '$vendorName', '$typeValue'";
258  $updatedSets= "trustedvendor= '$vendorName', trustedtype= '$typeValue'";
259  $details= array();
260  if ($detailsEncoded != "")
261  {
262  $createdColumns.= ", trustedfields";
263 
264  $detailsDecoded= json_decode($detailsEncoded, true);
265  if (is_array($detailsDecoded))
266  {
267  foreach($detailsDecoded as $record)
268  {
269  $detailName= stripslashes(trim($record["detailName"]));
270  $fieldType= stripslashes(trim($record["fieldType"]));
271  $defaultValue= stripslashes(trim($record["defaultValue"]));
272  $defaultMessage= stripslashes(trim($record["defaultMessage"]));
273 
274  if ($detailName == "")
275  $errors[]= "DetailName is required";
276  if ($fieldType == "")
277  $errors[]= "FieldType is required";
278  $thisRecord= array("Type" => $fieldType, "Default" => $defaultValue);
279  if ($defaultMessage != "")
280  $thisRecord["Message"]= $defaultMessage;
281  $details[$detailName]= $thisRecord;
282  }
283  }
284  else
285  $errors[]= "detailsEncoded is invalid";
286  $unpreppedDetailString= json_encode($details);
287  $detailsString= prepSave($unpreppedDetailString);
288  $createdValues.= ", '$detailsString'";
289  $updatedSets.= ", trustedfields= '$detailsString'";
290  }
291 
292  if ($isCreate)
293  $sql= "insert into cutrustedmaster ($createdColumns) values ($createdValues)";
294  else
295  $sql= "update cutrustedmaster set $updatedSets where trustedid= '$trustedId'";
296 
297  $sqls[]= $sql;
298  if (count($errors) == 0)
299  {
300  $queryResults= runExecStatement($sql, $dbh);
301  $errors= array_merge($errors, $queryResults["error"]);
302  $detailsEncoded != "" ? updateRemoteServers($trustedId, $vendorName, $typeValue, null, $unpreppedDetailString) : updateRemoteServers($trustedId, $vendorName, $typeValue, null, null);
303  }
304 
305  $requerySQL= "select trustedid, trustedvendor, trustedtype, trustedfields from cutrustedmaster where trustedid= '$trustedId'";
306  $queryResults= runSelectStatement($requerySQL, $dbh, array("trustedid" => "trustedId", "trustedvendor" => "vendorName", "trustedtype" => "typeValue", "trustedfields" => "properties"));
307  $errors= array_merge($errors, $queryResults["error"]);
308  $sqls[]= $requerySQL;
309 
310  $record= array();
311  $typeList= getTypeList();
312  $fieldTypeList= getFieldTypeList();
313  if (isset($queryResults["record"][0]))
314  {
315  $record= $queryResults["record"][0];
316 
317  unset($record["options"]);
318  $record["typeText"]= $typeList[$record["typeValue"]];
319 
320  // Expand details
321  $details= array();
322  $expandedDetails= json_decode($record["properties"], true);
323 
324  if (is_array($expandedDetails))
325  {
326  $detailIndex= 1;
327  foreach($expandedDetails as $key => $detailRecord)
328  {
329  $detail= array("detailName" => stripslashes($key), "fieldType" => "", "fieldTypeText" => "", "defaultValue" => "", "detailIndex" => ++$detailIndex);
330  if (is_array($detailRecord))
331  foreach($detailRecord as $lowerKey => $value) // type and default
332  {
333  if ($lowerKey == "Type")
334  {
335  $detail["fieldType"]= $value;
336  $detail["fieldTypeText"]= $fieldTypeList[$value];
337  }
338  else if ($lowerKey == "Default")
339  $detail["defaultValue"]= stripslashes($value);
340  else if ($lowerKey == "Message")
341  $detail["defaultMessage"]= stripslashes($value);
342  }
343  $details[]= $detail;
344  }
345  }
346  $record["properties"]= $details;
347  unset($record["details"]);
348  }
349 
350  return array("error" => $errors, "sql" => $sqls, "operation" => $isCreate ? "add" : "update", "record" => array($record));
351 }
352 
353 // Removes a top-level record
354 function removeTrustedId($dbh)
355 {
356  $parameters= array();
357  dms_import_v2($parameters, "BOTTOM_LEVEL", array("trustedId" => "string"));
358  $errors= cleanValuesForDatabase($parameters["BOTTOM_LEVEL"], array("trustedId" => array("type" => "string", "required" => true, "maxlength" => 20)));
359  $trustedId= $parameters["BOTTOM_LEVEL"]["trustedId"];
360 
361  $sql= "delete from cutrustedmaster where trustedid= '$trustedId'";
362  if (count($errors) == 0)
363  {
364  $queryResults= runExecStatement($sql, $dbh);
365  $errors= array_merge($errors, $queryResults["error"]);
366 
367  Remote_Field_Add("trustvendor", "trustedid", $trustedId);
368  $Remote_Results = Remote_Update_All("D", "trustvendor");
369  }
370  return array("sql" => array($sql), "error" => $errors, "operation" => "delete");
371 }
372 
373 // Creates, updates, or removes a bottom-level record.
374 function changeTrustedDetail($dbh, $mode)
375 {
376  $parameters= array();
377 
378  $valid= array("trustedId" => "string", "detailName" => "string");
379  if ($mode != "delete")
380  {
381  $valid["fieldType"]= "string";
382  $valid["defaultValue"]= "string";
383  $valid["defaultMessage"]= "string";
384  }
385  dms_import_v2($parameters, "BOTTOM_LEVEL", $valid);
386 
387  $errors= cleanValuesForDatabase($parameters["BOTTOM_LEVEL"],
388  array("trustedId" => array("type" => "string", "required" => true, "maxlength" => 20)));
389  $trustedId= $parameters["BOTTOM_LEVEL"]["trustedId"];
390  $fieldType= $parameters["BOTTOM_LEVEL"]["fieldType"];
391 
392  $fieldTypeList= getFieldTypeList();
393 
394  // Do not clean. Will be cleaned after json created.
395  $defaultValue= trim($parameters["BOTTOM_LEVEL"]["defaultValue"]);
396  $detailName= trim($parameters["BOTTOM_LEVEL"]["detailName"]);
397  $defaultMessage= trim($parameters["BOTTOM_LEVEL"]["defaultMessage"]);
398  $fieldType= trim($parameters["BOTTOM_LEVEL"]["fieldType"]);
399 
400  if ($detailName == "")
401  $errors[]= "DetailName is required";
402  if ($fieldType == "" && $mode != "delete")
403  $errors[]= "FieldType is required";
404 
405  if ($trustedId == "HOMECUSERVICE")
406  return changeServerPropertyCommon($dbh, $mode, $detailName, $defaultMessage, $defaultValue, $errors);
407 
408 
409  $retrievalSQL= "select trustedfields from cutrustedmaster where trustedid= '$trustedId'";
410  $queryResults= runSelectStatement($retrievalSQL, $dbh, array("trustedfields" => "details"));
411  $errors= array_merge($errors, $queryResults["error"]);
412  $sqls= array($retrievalSQL);
413 
414  $detailArray= array();
415  $records= array();
416  if (count($errors) == 0)
417  {
418  if (count($queryResults["record"]) > 0)
419  {
420  $detailString= $queryResults["record"][0]["details"];
421  if ($detailString != "")
422  $detailArray= json_decode($detailString, true);
423  }
424 
425  if ($mode == "delete")
426  unset($detailArray[$detailName]);
427  else
428  {
429  $detailArray[$detailName]= array("Type" => $fieldType, "Default" => $defaultValue, "Message" => $defaultMessage);
430  }
431 
432  $records= array(array("detailName" => $detailName, "fieldType" => $fieldType, "defaultValue" => $defaultValue, "trustedId" => $trustedId,
433  "defaultMessage" => $defaultMessage, "fieldTypeText" => $fieldTypeList[$fieldType]));
434 
435  $unpreppedDetailString= json_encode($detailArray);
436  $detailString= prepSave($unpreppedDetailString);
437  $updateSQL= "update cutrustedmaster set trustedfields= '$detailString' where trustedid= '$trustedId'";
438  $queryResults= runExecStatement($updateSQL, $dbh);
439  $errors= array_merge($errors, $queryResults["error"]);
440  $sqls[]= $updateSQL;
441 
442  updateRemoteServers($trustedId, null, null, null, $unpreppedDetailString);
443  }
444  return array("sql" => $sqls, "error" => $errors, "operation" => $mode, "record" => $records);
445 }
446 
447 // Creates, updates, or removes a bottom-level record.
448 function reorderTrustedDetail($dbh)
449 {
450  $parameters= array();
451 
452  dms_import_v2($parameters, "BOTTOM_LEVEL", array("trustedId" => "string", "detailName" => "string", "position" => "string"));
453 
454  $errors= cleanValuesForDatabase($parameters["BOTTOM_LEVEL"],
455  array("trustedId" => array("type" => "string", "required" => true, "maxlength" => 20),
456  "position" => array("type" => "int", "required" => true)));
457  $trustedId= $parameters["BOTTOM_LEVEL"]["trustedId"];
458  $position= $parameters["BOTTOM_LEVEL"]["position"];
459 
460  // Do not clean. Will be cleaned after json created.
461  $detailName= trim($parameters["BOTTOM_LEVEL"]["detailName"]);
462 
463  if ($detailName == "")
464  $errors[]= "DetailName is required";
465 
466  $retrievalSQL= "select trustedfields from cutrustedmaster where trustedid= '$trustedId'";
467  $queryResults= runSelectStatement($retrievalSQL, $dbh, array("trustedfields" => "details"));
468  $errors= array_merge($errors, $queryResults["error"]);
469  $sqls= array($retrievalSQL);
470 
471  $detailArray= array();
472  $records= array();
473  if (count($errors) == 0)
474  {
475  if (count($queryResults["record"]) > 0)
476  {
477  $detailString= $queryResults["record"][0]["details"];
478  if ($detailString != "")
479  $detailArray= json_decode($detailString, true);
480  }
481 
482  $newDetailArray= array();
483  $index= 0;
484  foreach($detailArray as $key => $value)
485  {
486  if ($index == $position)
487  $newDetailArray[$detailName]= $detailArray[$detailName];
488  if ($key != $detailName)
489  $newDetailArray[$key]= $value;
490  $index++;
491  }
492 
493  if ($index >= count($detailArray))
494  $newDetailArray[$detailName]= $detailArray[$detailName];
495 
496  $displayOrder= 0;
497  foreach($newDetailArray as $key => $detailRecord)
498  {
499  $detail= array("detailName" => $key, "fieldType" => "", "fieldTypeText" => "", "defaultValue" => "", "trustedId" => $trustedId,
500  "defaultMessage" => "", "displayOrder" => $displayOrder++);
501  if (is_array($detailRecord))
502  foreach($detailRecord as $lowerKey => $value) // type and default
503  {
504  if ($lowerKey == "Type")
505  {
506  $detail["fieldType"]= $value;
507  $detail["fieldTypeText"]= $fieldTypeList[$value];
508  }
509  else if ($lowerKey == "Default")
510  $detail["defaultValue"]= stripslashes($value);
511  else if ($lowerKey == "Message")
512  $detail["defaultMessage"]= stripslashes($value);
513  }
514  $records[]= $detail;
515  }
516 
517  $unpreppedDetailString= json_encode($newDetailArray);
518  $detailString= prepSave($unpreppedDetailString);
519  $updateSQL= "update cutrustedmaster set trustedfields= '$detailString' where trustedid= '$trustedId'";
520  $queryResults= runExecStatement($updateSQL, $dbh);
521  $errors= array_merge($errors, $queryResults["error"]);
522  $sqls[]= $updateSQL;
523 
524  updateRemoteServers($trustedId, null, null, null, $unpreppedDetailString);
525  }
526  return array("sql" => $sqls, "error" => $errors, "record" => $records);
527 }
528 
529 // Creates, updates, or removes a bottom-level record from the HOMECUSERVICE trustedId.
530 function changeServerProperty($dbh, $mode)
531 {
532  $parameters= array();
533 
534  $valid= array("detailName" => "string");
535  if ($mode != "delete")
536  {
537  $valid["defaultMessage"]= "string";
538  $valid["defaultValue"]= "string";
539  }
540  dms_import_v2($parameters, "BOTTOM_LEVEL", $valid);
541 
542  $errors= array();
543 
544  $defaultMessage= trim($parameters["BOTTOM_LEVEL"]["defaultMessage"]);
545  $defaultValue= trim($parameters["BOTTOM_LEVEL"]["defaultValue"]);
546  $detailName= trim($parameters["BOTTOM_LEVEL"]["detailName"]);
547 
548  if ($detailName == "")
549  $errors[]= "DetailName is required";
550 
551  return changeServerPropertyCommon($dbh, $mode, $detailName, $defaultMessage, $defaultValue, $errors);
552 }
553 
554 function changeServerPropertyCommon($dbh, $mode, $detailName, $defaultMessage, $defaultValue, $errors= array(), $sqls= array())
555 {
556  $trustedId= "HOMECUSERVICE";
557  $trustedVendor= "HOMECU";
558 
559  $retrievalSQL= "select trustedfields from cutrustedmaster where trustedid= '$trustedId' and trustedvendor= '$trustedVendor'";
560  $queryResults= runSelectStatement($retrievalSQL, $dbh, array("trustedfields" => "details"));
561  $errors= array_merge($errors, $queryResults["error"]);
562  $sqls= array($retrievalSQL);
563 
564  $detailArray= array();
565  $records= array();
566  if (count($errors) == 0)
567  {
568  if (count($queryResults["record"]) > 0)
569  {
570  $detailString= $queryResults["record"][0]["details"];
571  if ($detailString != "")
572  $detailArray= json_decode($detailString, true);
573  }
574 
575  if ($mode == "delete")
576  {
577  unset($detailArray[$detailName]);
578  unset($detailArray[$detailName . "_MSG"]);
579  }
580  else
581  {
582  $detailArray[$detailName]= array("Type" => "string", "Default" => $defaultValue);
583 
584  if ($defaultMessage != "")
585  $detailArray[$detailName . "_MSG"]= array("Type" => "string", "Default" => $defaultMessage);
586  else
587  unset($detailArray[$detailName . "_MSG"]);
588  }
589 
590  $records= array(array("detailName" => $detailName, "defaultMessage" => $defaultMessage, "defaultValue" => $defaultValue, "trustedId" => $trustedId));
591 
592  $unpreppedDetailString= json_encode($detailArray);
593  $detailString= prepSave($unpreppedDetailString);
594  $updateSQL= "update cutrustedmaster set trustedfields= '$detailString' where trustedid= '$trustedId'";
595  $queryResults= runExecStatement($updateSQL, $dbh);
596  $errors= array_merge($errors, $queryResults["error"]);
597  $sqls[]= $updateSQL;
598 
599  updateRemoteServers($trustedId, null, null, null, $unpreppedDetailString);
600  }
601  return array("sql" => $sqls, "error" => $errors, "operation" => $mode, "record" => $records);
602 }