array("type" => "string", "required" => false, "empty" => false, "defaultValues" => array(), "fieldNameAux" => "dynaFormUid"), "DYN_TITLE" => array("type" => "string", "required" => true, "empty" => false, "defaultValues" => array(), "fieldNameAux" => "dynaFormTitle"), "DYN_DESCRIPTION" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "dynaFormDescription"), "DYN_TYPE" => array("type" => "string", "required" => true, "empty" => false, "defaultValues" => array("xmlform", "grid"), "fieldNameAux" => "dynaFormType"), "DYN_CONTENT" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "dynaFormContent"), "DYN_VERSION" => array("type" => "int", "required" => false, "empty" => true, "defaultValues" => array(1 ,2), "fieldNameAux" => "dynaFormVersion") ); private $formatFieldNameInUppercase = true; private $arrayFieldNameForException = array( "processUid" => "PRO_UID" ); /** * Constructor of the class * * return void */ public function __construct() { try { foreach ($this->arrayFieldDefinition as $key => $value) { $this->arrayFieldNameForException[$value["fieldNameAux"]] = $key; } } catch (\Exception $e) { throw $e; } } /** * Set the format of the fields name (uppercase, lowercase) * * @param bool $flag Value that set the format * * return void */ public function setFormatFieldNameInUppercase($flag) { try { $this->formatFieldNameInUppercase = $flag; $this->setArrayFieldNameForException($this->arrayFieldNameForException); } catch (\Exception $e) { throw $e; } } /** * Set exception messages for fields * * @param array $arrayData Data with the fields * * return void */ public function setArrayFieldNameForException($arrayData) { try { foreach ($arrayData as $key => $value) { $this->arrayFieldNameForException[$key] = $this->getFieldNameByFormatFieldName($value); } } catch (\Exception $e) { throw $e; } } /** * Get the name of the field according to the format * * @param string $fieldName Field name * * return string Return the field name according the format */ public function getFieldNameByFormatFieldName($fieldName) { try { return ($this->formatFieldNameInUppercase)? strtoupper($fieldName) : strtolower($fieldName); } catch (\Exception $e) { throw $e; } } /** * Verify if exists the title of a DynaForm * * @param string $processUid Unique id of Process * @param string $dynaFormTitle Title * @param string $dynaFormUidExclude Unique id of DynaForm to exclude * * return bool Return true if exists the title of a DynaForm, false otherwise */ public function existsTitle($processUid, $dynaFormTitle, $dynaFormUidExclude = "") { try { $criteria = new \Criteria("workflow"); $criteria->addSelectColumn(\DynaformPeer::DYN_UID); $criteria->addSelectColumn(\DynaformPeer::DYN_TITLE); $criteria->add(\DynaformPeer::PRO_UID, $processUid, \Criteria::EQUAL); if ($dynaFormUidExclude != "") { $criteria->add(\DynaformPeer::DYN_UID, $dynaFormUidExclude, \Criteria::NOT_EQUAL); } $criteria->add(\DynaformPeer::DYN_TITLE, $dynaFormTitle, \Criteria::EQUAL); $rsCriteria = \DynaformPeer::doSelectRS($criteria); if ($rsCriteria->next()) { return true; } else { return false; } } catch (\Exception $e) { throw $e; } } /** * Verify if a DynaForm is assigned some Steps * * @param string $dynaFormUid Unique id of DynaForm * @param string $processUid Unique id of Process * * return bool Return true if a DynaForm is assigned some Steps, false otherwise */ public function dynaFormDepends($dynUid, $proUid) { $oCriteria = new \Criteria(); $oCriteria->addSelectColumn( \DynaformPeer::DYN_TYPE ); $oCriteria->add( \DynaformPeer::DYN_UID, $dynUid ); $oCriteria->add( \DynaformPeer::PRO_UID, $proUid ); $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); $oDataset->next(); $dataDyna = $oDataset->getRow(); if ($dataDyna['DYN_TYPE'] == 'grid') { $formsDepend = array(); $oCriteria = new \Criteria( 'workflow' ); $oCriteria->addSelectColumn( \DynaformPeer::DYN_UID ); $oCriteria->addSelectColumn( \DynaformPeer::DYN_TITLE ); $oCriteria->add( \DynaformPeer::PRO_UID, $proUid ); $oCriteria->add( \DynaformPeer::DYN_TYPE, "xmlform" ); $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); while ($oDataset->next()) { $dataForms = $oDataset->getRow(); $dynHandler = new DynaformHandler(PATH_DYNAFORM . $proUid . PATH_SEP . $dataForms["DYN_UID"] . ".xml"); $dynFields = $dynHandler->getFields(); foreach ($dynFields as $field) { $sType = \Step::getAttribute( $field, 'type' ); if ($sType == 'grid') { $sxmlgrid = \Step::getAttribute( $field, 'xmlgrid' ); $aGridInfo = explode( "/", $sxmlgrid ); if ($aGridInfo[0] == $proUid && $aGridInfo[1] == $dynUid) { $formsDepend[] = $dataForms["DYN_TITLE"]; } } } } if (!empty($formsDepend)) { $message = "You can not delete the grid '$dynUid', because it is in the "; $message .= (count($formsDepend) == 1) ? 'form' : 'forms'; $message .= ': ' . implode(', ', $formsDepend); return $message; } } else { $flagDepend = false; $stepsDepends = \Step::verifyDynaformAssigStep($dynUid, $proUid); $messageSteps = '(0) Depends in steps'; if (!empty($stepsDepends)) { $flagDepend = true; $countSteps = count($stepsDepends); $messTemp = ''; foreach ($stepsDepends as $value) { $messTemp .= ", the task '" . $value['CON_VALUE'] . "' position " . $value['STEP_POSITION']; } $messageSteps = "($countSteps) Depends in steps in" . $messTemp; } $stepSupervisorsDepends = \StepSupervisor::verifyDynaformAssigStepSupervisor($dynUid, $proUid); $messageStepsSupervisors = '(0) Depends in steps supervisor'; if (!empty($stepSupervisorsDepends)) { $flagDepend = true; $countSteps = count($stepSupervisorsDepends); $messageStepsSupervisors = "($countSteps) Depends in steps supervisor"; } $objectPermissionDepends = \ObjectPermission::verifyDynaformAssigObjectPermission($dynUid, $proUid); $messageObjectPermission = '(0) Depends in permissions'; if (!empty($objectPermissionDepends)) { $flagDepend = true; $countSteps = count($objectPermissionDepends); $messageObjectPermission = "($countSteps) Depends in permissions"; } $caseTrackerDepends = \CaseTrackerObject::verifyDynaformAssigCaseTracker($dynUid, $proUid); $messageCaseTracker = '(0) Depends in case traker'; if (!empty($caseTrackerDepends)) { $flagDepend = true; $countSteps = count($caseTrackerDepends); $messageCaseTracker = "($countSteps) Depends in case traker"; } $dynaformDepends = \Dynaform::verifyDynaformAssignDynaform($dynUid, $proUid); $messageDynaform = '(0) Depends in case traker'; if (!empty($dynaformDepends)) { $flagDepend = true; $countSteps = count($dynaformDepends); $messageDynaform = "($countSteps) Depends in dynaform"; } if ($flagDepend) { $message = "You can not delete the dynaform '$dynUid', because it has the following dependencies: \n\n"; $message .= $messageSteps . ".\n" . $messageStepsSupervisors . ".\n"; $message .= $messageObjectPermission . ".\n" . $messageCaseTracker . "\n"; $message .= $messageDynaform; return $message; } return ''; } } /** * Verify if a DynaForm has relation with a Step Supervisor * * @param string $dynaFormUid Unique id of DynaForm * * return bool Return true if a DynaForm has relation with a Step Supervisor, false otherwise */ public function dynaFormRelationStepSupervisor($dynaFormUid) { try { $stepSupervisor = new \StepSupervisor(); $arrayData = $stepSupervisor->loadInfo($dynaFormUid); if (is_array($arrayData)) { return true; } else { return false; } } catch (\Exception $e) { throw $e; } } /** * Throw the exception "The DynaForm doesn't exist" * * @param string $dynaFormUid Unique id of DynaForm * @param string $fieldNameForException Field name for the exception * * @return void */ private function throwExceptionDynaFormDoesNotExist($dynaFormUid, $fieldNameForException) { throw new \Exception(\G::LoadTranslation( 'ID_DYNAFORM_DOES_NOT_EXIST', [$fieldNameForException, $dynaFormUid] )); } /** * Verify if doesn't exists the DynaForm in table DYNAFORM * * @param string $dynaFormUid Unique id of DynaForm * @param string $processUid Unique id of Process * @param string $fieldNameForException Field name for the exception * * return void Throw exception if doesn't exists the DynaForm in table DYNAFORM */ public function throwExceptionIfNotExistsDynaForm($dynaFormUid, $processUid, $fieldNameForException) { try { $criteria = new \Criteria("workflow"); $criteria->addSelectColumn(\DynaformPeer::DYN_UID); if ($processUid != "") { $criteria->add(\DynaformPeer::PRO_UID, $processUid, \Criteria::EQUAL); } $criteria->add(\DynaformPeer::DYN_UID, $dynaFormUid, \Criteria::EQUAL); $rsCriteria = \DynaformPeer::doSelectRS($criteria); if (!$rsCriteria->next()) { $this->throwExceptionDynaFormDoesNotExist($dynaFormUid, $fieldNameForException); } } catch (\Exception $e) { throw $e; } } /** * Verify if exists the title of a DynaForm * * @param string $processUid Unique id of Process * @param string $dynaFormTitle Title * @param string $fieldNameForException Field name for the exception * @param string $dynaFormUidExclude Unique id of DynaForm to exclude * * return void Throw exception if exists the title of a DynaForm */ public function throwExceptionIfExistsTitle($processUid, $dynaFormTitle, $fieldNameForException, $dynaFormUidExclude = "") { try { if ($this->existsTitle($processUid, $dynaFormTitle, $dynaFormUidExclude)) { throw new \Exception(\G::LoadTranslation("ID_DYNAFORM_TITLE_ALREADY_EXISTS", array($fieldNameForException, $dynaFormTitle))); } } catch (\Exception $e) { throw $e; } } /** * Verify if is not grid DynaForm * * @param string $dynaFormUid Unique id of DynaForm * @param string $fieldNameForException Field name for the exception * * return void Throw exception if is not grid DynaForm */ public function throwExceptionIfNotIsGridDynaForm($dynaFormUid, $fieldNameForException) { try { //Load DynaForm $dynaForm = new \Dynaform(); $arrayDynaFormData = $dynaForm->Load($dynaFormUid); if ($arrayDynaFormData["DYN_TYPE"] != "grid") { throw new \Exception(\G::LoadTranslation("ID_DYNAFORM_IS_NOT_GRID", array($fieldNameForException, $dynaFormUid))); } } catch (\Exception $e) { throw $e; } } /** * Get DynaForm record * * @param string $dynaFormUid Unique id of DynaForm * @param array $arrayVariableNameForException Variable name for exception * @param bool $throwException Flag to throw the exception if the main parameters are invalid or do not exist * (TRUE: throw the exception; FALSE: returns FALSE) * * @return array Returns an array with DynaForm record, ThrowTheException/FALSE otherwise */ public function getDynaFormRecordByPk($dynaFormUid, array $arrayVariableNameForException, $throwException = true) { try { $obj = \DynaformPeer::retrieveByPK($dynaFormUid); if (is_null($obj)) { if ($throwException) { $this->throwExceptionDynaFormDoesNotExist( $dynaFormUid, $arrayVariableNameForException['$dynaFormUid'] ); } else { return false; } } //Return return $obj->toArray(\BasePeer::TYPE_FIELDNAME); } catch (\Exception $e) { throw $e; } } /** * Create DynaForm for a Process * * @param string $processUid Unique id of Process * @param array $arrayData Data * * return array Return data of the new DynaForm created */ public function create($processUid, $arrayData) { try { $arrayData = array_change_key_case($arrayData, CASE_UPPER); unset($arrayData["DYN_UID"]); unset($arrayData["COPY_IMPORT"]); unset($arrayData["PMTABLE"]); //Verify data $process = new \ProcessMaker\BusinessModel\Process(); $process->throwExceptionIfNotExistsProcess($processUid, $this->arrayFieldNameForException["processUid"]); $process->throwExceptionIfDataNotMetFieldDefinition($arrayData, $this->arrayFieldDefinition, $this->arrayFieldNameForException, true); $this->throwExceptionIfExistsTitle($processUid, $arrayData["DYN_TITLE"], $this->arrayFieldNameForException["dynaFormTitle"]); //Create $dynaForm = new \Dynaform(); $arrayData["PRO_UID"] = $processUid; $dynaFormUid = $dynaForm->create($arrayData); //Return unset($arrayData["PRO_UID"]); $arrayData = array_merge(array("DYN_UID" => $dynaFormUid), $arrayData); if (!$this->formatFieldNameInUppercase) { $arrayData = array_change_key_case($arrayData, CASE_LOWER); } return $arrayData; } catch (\Exception $e) { throw $e; } } /** * Update DynaForm * * @param string $dynaFormUid Unique id of DynaForm * @param array $arrayData Data * * return array Return data of the DynaForm updated */ public function update($dynaFormUid, $arrayData) { try { $arrayData = array_change_key_case($arrayData, CASE_UPPER); //Verify data $this->throwExceptionIfNotExistsDynaForm($dynaFormUid, "", $this->arrayFieldNameForException["dynaFormUid"]); //Load DynaForm $dynaForm = new \Dynaform(); $arrayDynaFormData = $dynaForm->Load($dynaFormUid); $processUid = $arrayDynaFormData["PRO_UID"]; //Verify data $process = new \ProcessMaker\BusinessModel\Process(); $process->throwExceptionIfDataNotMetFieldDefinition($arrayData, $this->arrayFieldDefinition, $this->arrayFieldNameForException, false); if (isset($arrayData["DYN_TITLE"])) { $this->throwExceptionIfExistsTitle($processUid, $arrayData["DYN_TITLE"], $this->arrayFieldNameForException["dynaFormTitle"], $dynaFormUid); } //Update $arrayData["DYN_UID"] = $dynaFormUid; $result = $dynaForm->update($arrayData); //Return unset($arrayData["DYN_UID"]); if (!$this->formatFieldNameInUppercase) { $arrayData = array_change_key_case($arrayData, CASE_LOWER); } return $arrayData; } catch (\Exception $e) { throw $e; } } /** * Delete DynaForm * * @param string $dynaFormUid Unique id of DynaForm * * return void */ public function delete($dynaFormUid) { try { //Verify data $this->throwExceptionIfNotExistsDynaForm($dynaFormUid, "", $this->arrayFieldNameForException["dynaFormUid"]); //Load DynaForm $dynaForm = new \Dynaform(); $arrayDynaFormData = $dynaForm->Load($dynaFormUid); $processUid = $arrayDynaFormData["PRO_UID"]; //Verify dependences dynaforms $resultDepends = $this->dynaFormDepends($dynaFormUid, $processUid); if ($resultDepends != "") { throw new \Exception($resultDepends); } //Delete //In table DYNAFORM $result = $dynaForm->remove($dynaFormUid); //In table STEP $step = new \Step(); $step->removeStep("DYNAFORM", $dynaFormUid); //In table OBJECT_PERMISSION $objPermission = new \ObjectPermission(); $objPermission->removeByObject("DYNAFORM", $dynaFormUid); //In table STEP_SUPERVISOR $stepSupervisor = new \StepSupervisor(); $stepSupervisor->removeByObject("DYNAFORM", $dynaFormUid); //In table CASE_TRACKER_OBJECT $caseTrackerObject = new \CaseTrackerObject(); $caseTrackerObject->removeByObject("DYNAFORM", $dynaFormUid); } catch (\Exception $e) { throw $e; } } /** * Copy/Import a DynaForm * * @param string $processUid Unique id of Process * @param array $arrayData Data * * return array Return data of the new DynaForm created */ public function copyImport($processUid, $arrayData) { try { $arrayData = \G::array_change_key_case2($arrayData, CASE_UPPER); unset($arrayData["DYN_UID"]); unset($arrayData["PMTABLE"]); //Verify data $process = new \ProcessMaker\BusinessModel\Process(); $process->throwExceptionIfNotExistsProcess($processUid, $this->arrayFieldNameForException["processUid"]); $process->throwExceptionIfDataNotMetFieldDefinition($arrayData, $this->arrayFieldDefinition, $this->arrayFieldNameForException, true); if (!isset($arrayData["COPY_IMPORT"])) { throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->getFieldNameByFormatFieldName("COPY_IMPORT")))); } if (!isset($arrayData["COPY_IMPORT"]["PRJ_UID"])) { throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->getFieldNameByFormatFieldName("COPY_IMPORT.PRJ_UID")))); } $arrayData["COPY_IMPORT"]["PRJ_UID"] = trim($arrayData["COPY_IMPORT"]["PRJ_UID"]); if ($arrayData["COPY_IMPORT"]["PRJ_UID"] == "") { throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($this->getFieldNameByFormatFieldName("COPY_IMPORT.PRJ_UID")))); } if (!isset($arrayData["COPY_IMPORT"]["DYN_UID"])) { throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->getFieldNameByFormatFieldName("COPY_IMPORT.DYN_UID")))); } $arrayData["COPY_IMPORT"]["DYN_UID"] = trim($arrayData["COPY_IMPORT"]["DYN_UID"]); if ($arrayData["COPY_IMPORT"]["DYN_UID"] == "") { throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($this->getFieldNameByFormatFieldName("COPY_IMPORT.DYN_UID")))); } $this->throwExceptionIfExistsTitle($processUid, $arrayData["DYN_TITLE"], $this->arrayFieldNameForException["dynaFormTitle"]); //Copy/Import Uids $processUidCopyImport = $arrayData["COPY_IMPORT"]["PRJ_UID"]; $dynaFormUidCopyImport = $arrayData["COPY_IMPORT"]["DYN_UID"]; //Verify data $process->throwExceptionIfNotExistsProcess($processUidCopyImport, $this->getFieldNameByFormatFieldName("COPY_IMPORT.PRJ_UID")); $this->throwExceptionIfNotExistsDynaForm($dynaFormUidCopyImport, $processUidCopyImport, $this->getFieldNameByFormatFieldName("COPY_IMPORT.DYN_UID")); //Copy/Import //Copy content if version is 2 if ($arrayData["DYN_VERSION"] === 2) { $dynaFormOld = new \Dynaform(); $arrayDynaFormData = $dynaFormOld->Load($dynaFormUidCopyImport); $arrayData["DYN_CONTENT"] = $arrayDynaFormData["DYN_CONTENT"]; } //Create $arrayData = $this->create($processUid, $arrayData); $dynaFormUid = $arrayData[$this->getFieldNameByFormatFieldName("DYN_UID")]; //Copy files of the DynaForm $umaskOld = umask(0); $fileXml = PATH_DYNAFORM . $processUidCopyImport . PATH_SEP . $dynaFormUidCopyImport . ".xml"; if (file_exists($fileXml)) { $fileXmlCopy = PATH_DYNAFORM . $processUid . PATH_SEP . $dynaFormUid . ".xml"; $fhXml = fopen($fileXml, "r"); $fhXmlCopy = fopen($fileXmlCopy, "w"); while (!feof($fhXml)) { $strLine = fgets($fhXml, 4096); $strLine = str_replace($processUidCopyImport . "/" . $dynaFormUidCopyImport, $processUid . "/" . $dynaFormUid, $strLine); //DynaForm Grid preg_match_all("/<.*type\s*=\s*[\"\']grid[\"\'].*xmlgrid\s*=\s*[\"\']\w{32}\/(\w{32})[\"\'].*\/>/", $strLine, $arrayMatch, PREG_SET_ORDER); foreach ($arrayMatch as $value) { $dynaFormGridUidCopyImport = $value[1]; //Get data $dynaForm = new \Dynaform(); $row = $dynaForm->Load($dynaFormGridUidCopyImport); $dynGrdTitleCopyImport = $row["DYN_TITLE"]; $dynGrdDescriptionCopyImport = $row["DYN_DESCRIPTION"]; //Create Grid $dynaFormGrid = new \Dynaform(); $arrayDataAux = array( "PRO_UID" => $processUid, "DYN_TITLE" => $dynGrdTitleCopyImport . (($this->existsTitle($processUid, $dynGrdTitleCopyImport))? " (" . $arrayData["DYN_TITLE"] . ")" : ""), "DYN_DESCRIPTION" => $dynGrdDescriptionCopyImport, "DYN_TYPE" => "grid" ); $dynaFormGridUid = $dynaFormGrid->create($arrayDataAux); //Copy files of the DynaForm Grid $fileGridXml = PATH_DYNAFORM . $processUidCopyImport . PATH_SEP . $dynaFormGridUidCopyImport . ".xml"; if (file_exists($fileGridXml)) { $fileGridXmlCopy = PATH_DYNAFORM . $processUid . PATH_SEP . $dynaFormGridUid . ".xml"; $fhGridXml = fopen($fileGridXml, "r"); $fhGridXmlCopy = fopen($fileGridXmlCopy, "w"); while (!feof($fhGridXml)) { $strLineAux = fgets($fhGridXml, 4096); $strLineAux = str_replace($processUidCopyImport . "/" . $dynaFormGridUidCopyImport, $processUid . "/" . $dynaFormGridUid, $strLineAux); fwrite($fhGridXmlCopy, $strLineAux); } fclose($fhGridXmlCopy); fclose($fhGridXml); chmod($fileGridXmlCopy, 0777); } $fileGridHtml = PATH_DYNAFORM . $processUidCopyImport . PATH_SEP . $dynaFormGridUidCopyImport . ".html"; if (file_exists($fileGridHtml)) { $fileGridHtmlCopy = PATH_DYNAFORM . $processUid . PATH_SEP . $dynaFormGridUid . ".html"; copy($fileGridHtml, $fileGridHtmlCopy); chmod($fileGridHtmlCopy, 0777); } $strLine = str_replace($processUidCopyImport . "/" . $dynaFormGridUidCopyImport, $processUid . "/" . $dynaFormGridUid, $strLine); } fwrite($fhXmlCopy, $strLine); } fclose($fhXmlCopy); fclose($fhXml); chmod($fileXmlCopy, 0777); } $fileHtml = PATH_DYNAFORM . $processUidCopyImport . PATH_SEP . $dynaFormUidCopyImport . ".html"; if (file_exists($fileHtml)) { $fileHtmlCopy = PATH_DYNAFORM . $processUid . PATH_SEP . $dynaFormUid . ".html"; copy($fileHtml, $fileHtmlCopy); chmod($fileHtmlCopy, 0777); } //Copy if there are conditions attached to the DynaForm $fieldCondition = new \FieldCondition(); $arrayCondition = $fieldCondition->getAllByDynUid($dynaFormUidCopyImport); foreach ($arrayCondition as $condition) { $condition["FCD_UID"] = ""; $condition["FCD_DYN_UID"] = $dynaFormUid; $fieldCondition->quickSave($condition); } umask($umaskOld); //Return return $arrayData; } catch (\Exception $e) { throw $e; } } /** * Create a Dynaform based on a PMTable * * @param string $processUid Unique id of Process * @param array $arrayData Data * * return array Return data of the new DynaForm created */ public function createBasedPmTable($processUid, $arrayData) { try { $arrayData = \G::array_change_key_case2($arrayData, CASE_UPPER); unset($arrayData["DYN_UID"]); unset($arrayData["COPY_IMPORT"]); //Verify data $process = new \ProcessMaker\BusinessModel\Process(); $process->throwExceptionIfNotExistsProcess($processUid, $this->arrayFieldNameForException["processUid"]); $process->throwExceptionIfDataNotMetFieldDefinition($arrayData, $this->arrayFieldDefinition, $this->arrayFieldNameForException, true); if ($arrayData["DYN_TYPE"] == "grid") { throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES", array($this->arrayFieldNameForException["dynaFormType"], "xmlform"))); } if (!isset($arrayData["PMTABLE"])) { throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->getFieldNameByFormatFieldName("PMTABLE")))); } if (!isset($arrayData["PMTABLE"]["TAB_UID"])) { throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->getFieldNameByFormatFieldName("PMTABLE.TAB_UID")))); } $arrayData["PMTABLE"]["TAB_UID"] = trim($arrayData["PMTABLE"]["TAB_UID"]); if ($arrayData["PMTABLE"]["TAB_UID"] == "") { throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($this->getFieldNameByFormatFieldName("PMTABLE.TAB_UID")))); } if (!isset($arrayData["PMTABLE"]["FIELDS"])) { throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->getFieldNameByFormatFieldName("PMTABLE.FIELDS")))); } if (count($arrayData["PMTABLE"]["FIELDS"]) == 0) { throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($this->getFieldNameByFormatFieldName("PMTABLE.FIELDS")))); } $this->throwExceptionIfExistsTitle($processUid, $arrayData["DYN_TITLE"], $this->arrayFieldNameForException["dynaFormTitle"]); $process->throwExceptionIfNotExistsPmTable($arrayData["PMTABLE"]["TAB_UID"], $this->getFieldNameByFormatFieldName("PMTABLE.TAB_UID")); //Validate PMTABLE.FIELDS //Valid Keys $flagValidFieldKey = 1; foreach ($arrayData["PMTABLE"]["FIELDS"] as $key => $value) { if (!isset($value["FLD_NAME"]) || !isset($value["PRO_VARIABLE"])) { $flagValidFieldKey = 0; break; } } if ($flagValidFieldKey == 0) { throw new \Exception(\G::LoadTranslation("ID_ATTRIBUTE_HAS_INVALID_ELEMENT_KEY", array($this->getFieldNameByFormatFieldName("PMTABLE.FIELDS")))); } //Is Primary Key $arrayFieldPk = $process->getPmTablePrimaryKeyFields($arrayData["PMTABLE"]["TAB_UID"], $this->getFieldNameByFormatFieldName("PMTABLE.TAB_UID")); $flagValidFieldPk = 1; $invalidFieldPk = ""; $arrayFieldPkAux = array(); foreach ($arrayData["PMTABLE"]["FIELDS"] as $key => $value) { $arrayFieldPkAux[] = $value["FLD_NAME"]; if (!in_array($value["FLD_NAME"], $arrayFieldPk)) { $flagValidFieldPk = 0; $invalidFieldPk = $value["FLD_NAME"]; break; } } if ($flagValidFieldPk == 0) { throw new \Exception(\G::LoadTranslation("ID_PMTABLE_FIELD_IS_NOT_PRIMARY_KEY", array($this->getFieldNameByFormatFieldName("PMTABLE.FIELDS.FLD_NAME"), $invalidFieldPk))); } //All Primary Keys $flagAllFieldPk = 1; $missingFieldPk = ""; foreach ($arrayFieldPk as $key => $value) { if (!in_array($value, $arrayFieldPkAux)) { $flagAllFieldPk = 0; $missingFieldPk = $value; break; } } if ($flagAllFieldPk == 0) { throw new \Exception(\G::LoadTranslation("ID_PMTABLE_PRIMARY_KEY_FIELD_IS_MISSING_IN_ATTRIBUTE", array($missingFieldPk, $this->getFieldNameByFormatFieldName("PMTABLE.FIELDS")))); } //Total of Primary Keys $n1 = count($arrayFieldPk); $n2 = count($arrayFieldPkAux); if ($n1 != $n2) { throw new \Exception(\G::LoadTranslation("ID_PMTABLE_TOTAL_PRIMARY_KEY_FIELDS_IS_NOT_EQUAL_IN_ATTRIBUTE", array($n1, $this->getFieldNameByFormatFieldName("PMTABLE.FIELDS"), $n2))); } //Set data $tableUid = $arrayData["PMTABLE"]["TAB_UID"]; $arrayFields = $arrayData["PMTABLE"]["FIELDS"]; unset($arrayData["PMTABLE"]); //Create $dynaForm = new \Dynaform(); $arrayData["PRO_UID"] = $processUid; $arrayData["DYN_TYPE"] = "xmlform"; $arrayData["FIELDS"] = $arrayFields; $dynaForm->createFromPMTable($arrayData, $tableUid); $dynaFormUid = $dynaForm->getDynUid(); //Return unset($arrayData["PRO_UID"]); unset($arrayData["FIELDS"]); $arrayData = array_merge(array("DYN_UID" => $dynaFormUid), $arrayData); if (!$this->formatFieldNameInUppercase) { $arrayData = array_change_key_case($arrayData, CASE_LOWER); } return $arrayData; } catch (\Exception $e) { throw $e; } } /** * Defines the method for create a DynaForm * * @param string $processUid Unique id of Process * @param array $arrayData Data * * return array Return data of the new DynaForm created */ public function executeCreate($processUid, $arrayData) { try { $arrayData = array_change_key_case($arrayData, CASE_UPPER); $option = "NORMAL"; //Validate data $count = 0; $msgMethod = ""; if (isset($arrayData["COPY_IMPORT"])) { $count = $count + 1; $msgMethod = $msgMethod . (($msgMethod != "")? ", " : "") . "COPY_IMPORT"; $option = "COPY_IMPORT"; } if (isset($arrayData["PMTABLE"])) { $count = $count + 1; $msgMethod = $msgMethod . (($msgMethod != "")? ", " : "") . "PMTABLE"; $option = "PMTABLE"; } if ($count <= 1) { $arrayDataAux = array(); switch ($option) { case "COPY_IMPORT": $arrayDataAux = $this->copyImport($processUid, $arrayData); break; case "PMTABLE": $arrayDataAux = $this->createBasedPmTable($processUid, $arrayData); break; default: //NORMAL $arrayDataAux = $this->create($processUid, $arrayData); break; } //Return return $arrayDataAux; } else { throw new \Exception(\G::LoadTranslation("ID_DYNAFORM_IT_IS_TRYING_CREATE_BY_SEVERAL_METHODS", array($this->getFieldNameByFormatFieldName($msgMethod)))); } } catch (\Exception $e) { throw $e; } } /** * Get criteria for DynaForm * * return object */ public function getDynaFormCriteria() { try { $criteria = new \Criteria("workflow"); $criteria->addSelectColumn(\DynaformPeer::DYN_UID); $criteria->addSelectColumn(\DynaformPeer::DYN_TITLE); $criteria->addSelectColumn(\DynaformPeer::DYN_DESCRIPTION); $criteria->addSelectColumn(\DynaformPeer::DYN_TYPE); $criteria->addSelectColumn(\DynaformPeer::DYN_CONTENT); $criteria->addSelectColumn(\DynaformPeer::DYN_VERSION); $criteria->addSelectColumn(\DynaformPeer::DYN_UPDATE_DATE); return $criteria; } catch (\Exception $e) { throw $e; } } /** * Get data of a DynaForm from a record * * @param array $record Record * * return array Return an array with data DynaForm */ public function getDynaFormDataFromRecord($record) { try { if ($record["DYN_VERSION"] == 0) { $record["DYN_VERSION"] = 1; } $record["DYN_CONTENT"] = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", $record["DYN_CONTENT"]); return array( $this->getFieldNameByFormatFieldName("DYN_UID") => $record["DYN_UID"], $this->getFieldNameByFormatFieldName("DYN_TITLE") => $record["DYN_TITLE"], $this->getFieldNameByFormatFieldName("DYN_DESCRIPTION") => $record["DYN_DESCRIPTION"] . "", $this->getFieldNameByFormatFieldName("DYN_TYPE") => $record["DYN_TYPE"] . "", $this->getFieldNameByFormatFieldName("DYN_CONTENT") => $record["DYN_CONTENT"] . "", $this->getFieldNameByFormatFieldName("DYN_VERSION") => (int)($record["DYN_VERSION"]), $this->getFieldNameByFormatFieldName("DYN_UPDATE_DATE") => $record["DYN_UPDATE_DATE"] ); } catch (\Exception $e) { throw $e; } } /** * Get data of a DynaForm * * @param string $dynaFormUid Unique id of DynaForm * * return array Return an array with data of a DynaForm */ public function getDynaForm($dynaFormUid) { try { //Verify data $this->throwExceptionIfNotExistsDynaForm($dynaFormUid, "", $this->arrayFieldNameForException["dynaFormUid"]); //Get data $criteria = $this->getDynaFormCriteria(); $criteria->add(\DynaformPeer::DYN_UID, $dynaFormUid, \Criteria::EQUAL); $rsCriteria = \DynaformPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); $rsCriteria->next(); $row = $rsCriteria->getRow(); //Return return $this->getDynaFormDataFromRecord($row); } catch (\Exception $e) { throw $e; } } /** * Get data of a DynaForm * * @param string $projectUid Unique id of Project * @param string $dynaFormUid Unique id of DynaForm * * return array Return an array with data of a DynaForm */ public function getDynaFormFields($projectUid, $dynaFormUid) { try { $arrayVariables = array(); $arrayVariablesDef = array(); //Verify data Validator::proUid($projectUid, '$prj_uid'); $this->throwExceptionIfNotExistsDynaForm($dynaFormUid, "", $this->arrayFieldNameForException["dynaFormUid"]); $criteria = new \Criteria("workflow"); $criteria->addSelectColumn(\DynaformPeer::DYN_CONTENT); $criteria->add(\DynaformPeer::DYN_UID, $dynaFormUid, \Criteria::EQUAL); $rsCriteria = \DynaformPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); $rsCriteria->next(); $aRow = $rsCriteria->getRow(); $contentDecode = json_decode($aRow['DYN_CONTENT'],true); $content = $contentDecode['items'][0]['items']; foreach ($content as $key => $value) { $valueType = (isset($value[0]["valueType"])) ? $value[0]["valueType"]:null; $maxLength = (isset($value[0]["maxLength"])) ? $value[0]["maxLength"]:null; $label = (isset($value[0]["label"])) ? $value[0]["label"]:null; $defaultValue = (isset($value[0]["defaultValue"])) ? $value[0]["defaultValue"]:null; $required = (isset($value[0]["required"])) ? $value[0]["required"]:null; $dbConnection = (isset($value[0]["dbConnection"])) ? $value[0]["dbConnection"]:null; $sql = (isset($value[0]["sql"])) ? $value[0]["sql"]:null; $options = (isset($value[0]["options"])) ? $value[0]["options"]:null; if (isset($value[0]["variable"])) { $variable = $value[0]["variable"]; $criteria = new \Criteria("workflow"); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_NAME); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_FIELD_TYPE); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_FIELD_SIZE); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_LABEL); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_DBCONNECTION); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_SQL); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_NULL); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_DEFAULT); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_ACCEPTED_VALUES); $criteria->add(\ProcessVariablesPeer::PRJ_UID, $projectUid, \Criteria::EQUAL); $criteria->add(\ProcessVariablesPeer::VAR_NAME, $variable, \Criteria::EQUAL); $rsCriteria = \ProcessVariablesPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); $rsCriteria->next(); while ($aRow = $rsCriteria->getRow()) { $valueTypeMerged = ($valueType == null && $valueType == '') ? $aRow['VAR_FIELD_TYPE'] : $valueType; $maxLengthMerged = ($maxLength == null && $maxLength == '') ? (int)$aRow['VAR_FIELD_SIZE'] : $maxLength; $labelMerged = ($label == null && $label == '') ? $aRow['VAR_LABEL'] : $label; $defaultValueMerged = ($defaultValue == null && $defaultValue == '') ? $aRow['VAR_DEFAULT'] : $defaultValue; $requiredMerged = ($required == null && $required == '') ? ($aRow['VAR_NULL']==1) ? false: true : $required; $dbConnectionMerged = ($dbConnection == null && $dbConnection == '') ? $aRow['VAR_DBCONNECTION'] : $dbConnection; $sqlMerged = ($sql == null && $sql == '') ? $aRow['VAR_SQL'] : $sql; $optionsMerged = ($options == null && $options == '') ? $aRow['VAR_ACCEPTED_VALUES'] : $options; $aVariables = array('valueType' => $valueTypeMerged, 'maxLength' => $maxLengthMerged, 'label' => $labelMerged, 'defaultValue' => $defaultValueMerged, 'required' => $requiredMerged, 'dbConnection' => $dbConnectionMerged, 'sql' => $sqlMerged, 'options' => $optionsMerged); //fields properties if (isset($value[0]["pickType"])) { $aVariables = array_merge(array('pickType' => $value[0]["pickType"]), $aVariables); } if (isset($value[0]["placeHolder"])) { $aVariables = array_merge(array('placeHolder' => $value[0]["placeHolder"]), $aVariables); } if (isset($value[0]["dependentsField"])) { $aVariables = array_merge(array('dependentsField' => $value[0]["dependentsField"]), $aVariables); } if (isset($value[0]["hint"])) { $aVariables = array_merge(array('hint' => $value[0]["hint"]), $aVariables); } if (isset($value[0]["readonly"])) { $aVariables = array_merge(array('readonly' => $value[0]["readonly"]), $aVariables); } if (isset($value[0]["colSpan"])) { $aVariables = array_merge(array('colSpan' => $value[0]["colSpan"]), $aVariables); } if (isset($value[0]["type"])) { $aVariables = array_merge(array('type' => $value[0]["type"]), $aVariables); } if (isset($value[0]["name"])) { $aVariables = array_merge(array('name' => $value[0]["name"]), $aVariables); } $aVariables = array_merge(array('variable' => $variable), $aVariables); $arrayVariables[] = $aVariables; $rsCriteria->next(); } } else { $arrayVariablesDef[] = $value[0]; } } $arrayVariables = array_merge($arrayVariables, $arrayVariablesDef); //Return return $arrayVariables; } catch (\Exception $e) { throw $e; } } /** * Get data of a DynaForm History * * @param string $dynaFormUid Unique id of DynaForm * * return array Return an array with data of a DynaForm History */ public function getDynaFormHistory($prj_uid, $dynaFormUid, array $arrayData = array()) { try { $filter = ""; if (isset($arrayData["filter"])) { $filter = $arrayData["filter"]; } $start = 0; if (isset($arrayData["start"])) { $start = $arrayData["start"]; } $limit = 50; if (isset($arrayData["limit"])) { $limit = $arrayData["limit"]; } $this->throwExceptionIfNotExistsDynaForm($dynaFormUid, "", $this->arrayFieldNameForException["dynaFormUid"]); $criteria = new \Criteria("workflow"); $subcriteria = $criteria->getNewCriterion(\AppHistoryPeer::HISTORY_DATE, "%" . $filter . "%", \Criteria::LIKE); $criteria->addSelectColumn(\AppHistoryPeer::DYN_UID); $criteria->addSelectColumn(\AppHistoryPeer::HISTORY_DATA); $criteria->addSelectColumn(\AppHistoryPeer::HISTORY_DATE); $criteria->addAnd(\AppHistoryPeer::DYN_UID, $dynaFormUid, \Criteria::EQUAL); $criteria->addAnd(\AppHistoryPeer::OBJ_TYPE, "DYNAFORM", \Criteria::EQUAL); $criteria->addAnd(\AppHistoryPeer::HISTORY_DATA, "%DYN_CONTENT_HISTORY%", \Criteria::LIKE); $criteria->addAnd($subcriteria); $criteria->addDescendingOrderByColumn(\AppHistoryPeer::HISTORY_DATE); $criteria->setOffset($start); $criteria->setLimit($limit); $rsCriteria = \AppHistoryPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); $data = array(); while ($rsCriteria->next()) { $row = $rsCriteria->getRow(); $d = @unserialize($row["HISTORY_DATA"]); $jsonData = ""; if (isset($d["DYN_CONTENT_HISTORY"])) { $decode = base64_decode($d["DYN_CONTENT_HISTORY"], true); if ($decode !== false) { $jsonData = $decode; } } $data[] = array( "history_date" => $row["HISTORY_DATE"], "dyn_uid" => $row["DYN_UID"], "dyn_content_history" => $jsonData ); } return $data; } catch (\Exception $e) { throw $e; } } }