Merge remote branch 'upstream/master'

This commit is contained in:
Julio Cesar Laura
2014-03-14 08:55:13 -04:00
9 changed files with 452 additions and 79 deletions

View File

@@ -508,7 +508,7 @@ class dynaFormHandler
/**
* Function getFields
* @param array $aFilter
* @return array
* @return DOMElement[]
*/
public function getFields($aFilter = Array())
{

View File

@@ -160,5 +160,30 @@ class CaseTrackerObject extends BaseCaseTrackerObject
throw ($e);
}
}
/**
* verify if a dynaform is assigned some steps
*
* @param string $proUid the uid of the process
* @param string $dynUid the uid of the dynaform
*
* @return array
*/
public function verifyDynaformAssigCaseTracker ($dynUid, $proUid)
{
$res = array();
$oCriteria = new Criteria();
$oCriteria->addSelectColumn( CaseTrackerObjectPeer::CTO_UID );
$oCriteria->add( CaseTrackerObjectPeer::PRO_UID, $proUid );
$oCriteria->add( CaseTrackerObjectPeer::CTO_UID_OBJ, $dynUid );
$oCriteria->add( CaseTrackerObjectPeer::CTO_TYPE_OBJ, 'DYNAFORM' );
$oDataset = CaseTrackerObjectPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
while($oDataset->next()) {
$res[] = $oDataset->getRow();
}
return $res;
}
}

View File

@@ -125,5 +125,29 @@ class ObjectPermission extends BaseObjectPermission
$aRow = $oDataset->getRow();
return ($aRow);
}
/**
* verify if a dynaform is assigned some steps
*
* @param string $proUid the uid of the process
* @param string $dynUid the uid of the dynaform
*
* @return array
*/
public function verifyDynaformAssigObjectPermission ($dynUid, $proUid)
{
$res = array();
$oCriteria = new Criteria();
$oCriteria->addSelectColumn( ObjectPermissionPeer::OP_UID );
$oCriteria->add( ObjectPermissionPeer::PRO_UID, $proUid );
$oCriteria->add( ObjectPermissionPeer::OP_OBJ_UID, $dynUid );
$oCriteria->add( ObjectPermissionPeer::OP_OBJ_TYPE, 'DYNAFORM' );
$oDataset = ObjectPermissionPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
while($oDataset->next()) {
$res[] = $oDataset->getRow();
}
return $res;
}
}

View File

@@ -346,7 +346,7 @@ class Step extends BaseStep
}
/**
* verify if a dynaform is assigned some steps
* <DEPRECATE PM3> verify if a dynaform is assigned some steps
*
* @param string $sproUid the uid of the process
* @param string $sObjUID the uid of the dynaform
@@ -405,6 +405,35 @@ class Step extends BaseStep
die();
}
/**
* verify if a dynaform is assigned some steps
*
* @param string $proUid the uid of the process
* @param string $dynUid the uid of the dynaform
*
* @return array
*/
public function verifyDynaformAssigStep ($dynUid, $proUid)
{
$res = array();
$oCriteria = new Criteria();
$oCriteria->addSelectColumn( StepPeer::TAS_UID );
$oCriteria->addSelectColumn( ContentPeer::CON_VALUE );
$oCriteria->addSelectColumn( StepPeer::STEP_POSITION );
$oCriteria->add( StepPeer::PRO_UID, $proUid );
$oCriteria->add( StepPeer::STEP_UID_OBJ, $dynUid );
$oCriteria->add( StepPeer::STEP_TYPE_OBJ, 'DYNAFORM' );
$oCriteria->add( ContentPeer::CON_CATEGORY, 'TAS_TITLE');
$oCriteria->add( ContentPeer::CON_LANG, SYS_LANG);
$oCriteria->addJoin( StepPeer::TAS_UID, ContentPeer::CON_ID, Criteria::INNER_JOIN);
$oDataset = StepPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
while($oDataset->next()) {
$res[] = $oDataset->getRow();
}
return $res;
}
public function getAttribute ($node, $attName)
{

View File

@@ -224,5 +224,29 @@ class StepSupervisor extends BaseStepSupervisor
$aRow = $oDataset->getRow();
return ($aRow);
}
/**
* verify if a dynaform is assigned some steps
*
* @param string $proUid the uid of the process
* @param string $dynUid the uid of the dynaform
*
* @return array
*/
public function verifyDynaformAssigStepSupervisor ($dynUid, $proUid)
{
$res = array();
$oCriteria = new Criteria();
$oCriteria->addSelectColumn( StepSupervisorPeer::STEP_UID );
$oCriteria->add( StepSupervisorPeer::PRO_UID, $proUid );
$oCriteria->add( StepSupervisorPeer::STEP_UID_OBJ, $dynUid );
$oCriteria->add( StepSupervisorPeer::STEP_TYPE_OBJ, 'DYNAFORM' );
$oDataset = StepSupervisorPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
while($oDataset->next()) {
$res[] = $oDataset->getRow();
}
return $res;
}
}

View File

@@ -139,20 +139,99 @@ class DynaForm
*
* return bool Return true if a DynaForm is assigned some Steps, false otherwise
*/
public function dynaFormAssignedStep($dynaFormUid, $processUid)
public function dynaFormDepends($dynUid, $proUid)
{
try {
$step = new \Step();
$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();
$arrayData = $step->loadInfoAssigDynaform($processUid, $dynaFormUid);
if ($dataDyna['DYN_TYPE'] == 'grid') {
$formsDepend = array();
\G::LoadSystem( 'dynaformhandler' );
if (is_array($arrayData)) {
return true;
} else {
return false;
$oCriteria = new \Criteria( 'workflow' );
$oCriteria->addSelectColumn( \DynaformPeer::DYN_UID );
$oCriteria->addSelectColumn( \ContentPeer::CON_VALUE );
$oCriteria->add( \DynaformPeer::PRO_UID, $proUid );
$oCriteria->add( \DynaformPeer::DYN_TYPE, "xmlform" );
$oCriteria->add( \ContentPeer::CON_CATEGORY, 'DYN_TITLE');
$oCriteria->add( \ContentPeer::CON_LANG, SYS_LANG);
$oCriteria->addJoin( \DynaformPeer::DYN_UID, \ContentPeer::CON_ID, \Criteria::INNER_JOIN);
$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["CON_VALUE"];
}
}
}
}
} catch (\Exception $e) {
throw $e;
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";
}
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;
return $message;
}
return '';
}
}
@@ -167,9 +246,7 @@ class DynaForm
{
try {
$stepSupervisor = new \StepSupervisor();
$arrayData = $stepSupervisor->loadInfo($dynaFormUid);
if (is_array($arrayData)) {
return true;
} else {
@@ -381,9 +458,10 @@ class DynaForm
$processUid = $arrayDynaFormData["PRO_UID"];
//Verify data
if ($this->dynaFormAssignedStep($dynaFormUid, $processUid)) {
throw (new \Exception("You cannot delete this Dynaform while it is assigned to a step"));
//Verify dependencies dynaforms
$resultDependeds = $this->dynaFormDepends($dynaFormUid, $processUid);
if ($resultDependeds != '') {
throw (new \Exception($resultDependeds));
}
//Delete

View File

@@ -1,6 +1,9 @@
<?php
namespace BusinessModel;
use G;
use Criteria;
class Process
{
private $arrayFieldDefinition = array(
@@ -1547,9 +1550,7 @@ class Process
//Get data
switch ($option) {
case "GRID":
\G::LoadClass("xmlfield_InputPM");
$arrayVar = getGridsVars($processUid);
$arrayVar = self::getGridsVars($processUid);
foreach ($arrayVar as $key => $value) {
$arrayVariableAux = $this->getVariableDataFromRecord(array("name" => $value["sName"], "label" => "[ " . \G::LoadTranslation("ID_GRID") . " ]", "type" => "grid"));
@@ -1565,36 +1566,15 @@ class Process
$dynaForm->throwExceptionIfNotIsGridDynaForm($gridUid, $this->arrayFieldNameForException["gridUid"]);
//Get data
$file = PATH_DYNAFORM . $processUid . PATH_SEP . $gridUid . ".xml";
if (file_exists($file) && filesize($file) > 0) {
//Load DynaForm
$dynaForm = new \Dynaform();
$arrayDynaFormData = $dynaForm->Load($gridUid);
$dynaFormFilename = $arrayDynaFormData["DYN_FILENAME"];
//Fields
$form = new \Form($dynaFormFilename, PATH_DYNAFORM, SYS_LANG);
$arrayFieldName = array();
if ($form->type == "grid") {
foreach ($form->fields as $key => $value) {
if (!in_array($key, $arrayFieldName)) {
$arrayVariable[] = $this->getVariableDataFromRecord(array("name" => $key, "label" => $value->label, "type" => $value->type));
$arrayFieldName[] = $key;
}
}
}
$fields = self::getVarsGrid($processUid, $gridUid);
foreach ($fields as $field) {
$arrayVariable[] = $this->getVariableDataFromRecord(array("name" => $field["sName"], "label" => $field["sLabel"], "type" => $field["sType"]));
}
break;
default:
//ALL
\G::LoadClass("xmlfield_InputPM");
$arrayVar = getDynaformsVars($processUid);
$arrayVar = self::getDynaformsVars($processUid);
foreach ($arrayVar as $key => $value) {
$arrayVariable[] = $this->getVariableDataFromRecord(array("name" => $value["sName"], "label" => $value["sLabel"], "type" => $value["sType"]));
@@ -1646,5 +1626,163 @@ class Process
throw $e;
}
}
/**
* Function getDynaformsVars
*
* @access public
* @param eter string $sProcessUID
* @param eter boolean $bSystemVars
* @return array
*/
public static function getDynaformsVars ($sProcessUID, $bSystemVars = true, $bIncMulSelFields = 0)
{
$aFields = array ();
$aFieldsNames = array ();
if ($bSystemVars) {
$aAux = G::getSystemConstants();
foreach ($aAux as $sName => $sValue) {
$aFields[] = array ('sName' => $sName,'sType' => 'system','sLabel' => G::LoadTranslation('ID_TINY_SYSTEM_VARIABLES'));
}
//we're adding the ping variable to the system list
$aFields[] = array ('sName' => 'PIN','sType' => 'system','sLabel' => G::LoadTranslation('ID_TINY_SYSTEM_VARIABLES'));
}
$aInvalidTypes = array("title", "subtitle", "file", "button", "reset", "submit", "javascript");
$aMultipleSelectionFields = array("listbox", "checkgroup", "grid");
if ($bIncMulSelFields != 0) {
$aInvalidTypes = array_merge( $aInvalidTypes, $aMultipleSelectionFields );
}
$oCriteria = new Criteria( 'workflow' );
$oCriteria->addSelectColumn( \DynaformPeer::DYN_FILENAME );
$oCriteria->add( \DynaformPeer::PRO_UID, $sProcessUID );
$oCriteria->add( \DynaformPeer::DYN_TYPE, 'xmlform' );
$oDataset = \DynaformPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
while ($aRow = $oDataset->getRow()) {
if (is_file(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml")) {
$dyn = new \dynaFormHandler(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml");
if ($dyn->getHeaderAttribute("type") !== "xmlform" && $dyn->getHeaderAttribute("type") !== "") { // skip it, if that is not a xmlform
$oDataset->next();
continue;
}
$fields = $dyn->getFields();
foreach ($fields as $field) {
$label = "";
if ($field->hasChildNodes()) {
$child = $field->getElementsByTagName(SYS_LANG)->length ? $field->getElementsByTagName(SYS_LANG): $field->getElementsByTagName("en");
$label = $child->item(0) ? $child->item(0)->textContent : "";
}
if (! in_array($field->getAttribute("type"), $aInvalidTypes) && ! in_array($field->tagName, $aFieldsNames)) {
$aFieldsNames[] = $field->tagName;
$aFields[] = array (
'sName' => $field->tagName,
'sType' => $field->getAttribute("type"),
'sLabel' => ($field->getAttribute("type") != 'grid' ? $label : '[ ' . G::LoadTranslation('ID_GRID') . ' ]')
);
}
}
}
$oDataset->next();
}
return $aFields;
}
/**
* Function getGridsVars
*
* @access public
* @param eter string $sProcessUID
* @return array
*/
public static function getGridsVars ($sProcessUID)
{
$aFields = array ();
$aFieldsNames = array ();
$oCriteria = new Criteria( 'workflow' );
$oCriteria->addSelectColumn( \DynaformPeer::DYN_FILENAME );
$oCriteria->add( \DynaformPeer::PRO_UID, $sProcessUID );
$oDataset = \DynaformPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
while ($aRow = $oDataset->getRow()) {
if (is_file(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml")) {
$dyn = new \dynaFormHandler(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml");
if ($dyn->getHeaderAttribute("type") === "xmlform") { // skip it, if that is not a xmlform
$oDataset->next();
continue;
}
$fields = $dyn->getFields();
foreach ($fields as $field) {
if ($field->getAttribute("type") !== "grid") {
continue;
}
if (! in_array($field->tagName, $aFieldsNames)) {
$aFieldsNames[] = $field->tagName;
$aFields[] = array (
'sName' => $field->tagName,
'sXmlForm' => $aRow['DYN_FILENAME']
);
}
}
}
$oDataset->next();
}
return $aFields;
}
/**
* Function getVarsGrid returns all variables of Grid
*
* @access public
* @param string proUid process ID
* @param string dynUid dynaform ID
* @return array
*/
public static function getVarsGrid ($proUid, $dynUid)
{
$dynaformFields = array ();
$aFieldsNames = array();
$aFields = array();
$aInvalidTypes = array("title", "subtitle", "file", "button", "reset", "submit", "javascript");
$aMultipleSelectionFields = array("listbox", "checkgroup", "grid");
if (is_file( PATH_DATA . '/sites/'. SYS_SYS .'/xmlForms/'. $proUid .'/'.$dynUid. '.xml' ) && filesize( PATH_DATA . '/sites/'. SYS_SYS .'/xmlForms/'. $proUid .'/'. $dynUid .'.xml' ) > 0) {
$dyn = new \dynaFormHandler( PATH_DATA . '/sites/'. SYS_SYS .'/xmlForms/' .$proUid. '/' . $dynUid .'.xml' );
$dynaformFields[] = $dyn->getFields();
$fields = $dyn->getFields();
foreach ($fields as $field) {
if ($field->getAttribute("type") !== "grid") {
continue;
}
if (! in_array($field->getAttribute("type"), $aInvalidTypes) && ! in_array($field->tagName, $aFieldsNames)) {
$aFieldsNames[] = $field->tagName;
$aFields[] = array (
'sName' => $field->tagName,
'sType' => $field->getAttribute("type"),
'sLabel' => ($field->getAttribute("type") != 'grid' ? $label : '[ ' . G::LoadTranslation('ID_GRID') . ' ]')
);
}
}
}
return $aFields;
}
}

View File

@@ -2,6 +2,7 @@
namespace BusinessModel;
use \G;
use \ProcessMaker\Util;
class Task
{
@@ -461,14 +462,6 @@ class Task
//Array DB
$arraydbStep = array();
$arraydbStep[] = array(
$this->getFieldNameByFormatFieldName("OBJ_UID") => "char",
$this->getFieldNameByFormatFieldName("OBJ_TITLE") => "char",
$this->getFieldNameByFormatFieldName("OBJ_DESCRIPTION") => "char",
$this->getFieldNameByFormatFieldName("OBJ_TYPE") => "char"
);
$delimiter = \DBAdapter::getStringDelimiter();
//DynaForms
@@ -619,32 +612,15 @@ class Task
}
}
\G::LoadClass("ArrayPeer");
global $_DBArray;
$_DBArray = (isset($_SESSION["_DBArray"]))? $_SESSION["_DBArray"] : "";
$_DBArray["STEP"] = $arraydbStep;
$_SESSION["_DBArray"] = $_DBArray;
$criteria = new \Criteria("dbarray");
$criteria->setDBArrayTable("STEP");
$criteria->addAscendingOrderByColumn($this->getFieldNameByFormatFieldName("OBJ_TYPE"));
$criteria->addAscendingOrderByColumn($this->getFieldNameByFormatFieldName("OBJ_TITLE"));
$rsCriteria = \ArrayBasePeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
while ($rsCriteria->next()) {
$row = $rsCriteria->getRow();
$arrayAvailableStep[] = $row;
if (! empty($arraydbStep)) {
$arraydbStep = Util\ArrayUtil::sort(
$arraydbStep,
array($this->getFieldNameByFormatFieldName("OBJ_TYPE"), $this->getFieldNameByFormatFieldName("OBJ_TITLE")),
SORT_ASC
);
}
//Return
return $arrayAvailableStep;
return $arraydbStep;
} catch (\Exception $e) {
throw $e;
}

View File

@@ -13,4 +13,83 @@ class ArrayUtil
return $array;
}
}
/**
* Function that sorts an associative array by given array keys
*
* @author Erik Amaru Ortiz <erik@colosa.com, aortiz.erik@gmail.com>
* @param array $data associative contains array data to sort by key.
* @param array $columns contains the key to sort by those them.
* @param mixed $direction this param by default is SORT_ASC, it can contains a value from [SORT_ASC|SORT_DESC]
* php constants, or it can be a array(SORT_ASC,SORT_DESC,..), it must have the same length
* of $columns array.
* @return array
* @throws \Exception
*
* Example:
* $data = array();
* $data[] = array('volume' => 67, 'edition' => 2);
* $data[] = array('volume' => 86, 'edition' => 1);
* $data[] = array('volume' => 85, 'edition' => 6);
* $data[] = array('volume' => 98, 'edition' => 2);
* $data[] = array('volume' => 86, 'edition' => 6);
* $data[] = array('volume' => 67, 'edition' => 7);
*
* $r = ArrayUtil::sort($data, array("volume", "edition"), array(SORT_DESC, SORT_ASC));
* print_r($r);
*
* Example Output:
* Array
* (
* [0] => Array (
* [volume] => 98
* [edition] => 2
* )
* [1] => Array (
* [volume] => 86
* [edition] => 1
* )
* [2] => Array (
* [volume] => 86
* [edition] => 6
* )
* [3] => Array (
* [volume] => 85
* [edition] => 6
* )
* [4] => Array (
* [volume] => 67
* [edition] => 2
* )
* [5] => Array (
* [volume] => 67
* [edition] => 7
* )
* )
*/
public static function sort($data, $columns, $direction = SORT_ASC)
{
$composedData = array();
if (is_array($direction)) {
if (count($direction) !== count($columns)) {
throw new \Exception("Error, \$columns length and \$direction length must be equals.");
}
}
foreach ($data as $row) {
$j = 0;
foreach ($columns as $i => $col) {
$composedData[$j++][] = $row[$col];
$composedData[$j++] = is_array($direction) ? $direction[$i] : $direction;
}
}
$composedData[] = & $data;
call_user_func_array("array_multisort", $composedData);
return $data;
}
}