diff --git a/classes/class.workflow.php b/classes/class.workflow.php new file mode 100644 index 0000000..dc81865 --- /dev/null +++ b/classes/class.workflow.php @@ -0,0 +1,180 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * + * $Id: class.workflow.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$cfg["tab"]["workflow"] = $cfg['sql']['sqlprefix'] . "_piwf_workflow"; +$cfg["tab"]["workflow_allocation"] = $cfg['sql']['sqlprefix'] . "_piwf_allocation"; +$cfg["tab"]["workflow_art_allocation"] = $cfg['sql']['sqlprefix'] . "_piwf_art_allocation"; +$cfg["tab"]["workflow_items"] = $cfg['sql']['sqlprefix'] . "_piwf_items"; +$cfg["tab"]["workflow_user_sequences"] = $cfg['sql']['sqlprefix'] . "_piwf_user_sequences"; +$cfg["tab"]["workflow_actions"] = $cfg['sql']['sqlprefix'] . "_piwf_actions"; + +plugin_include('workflow', 'classes/class.workflowactions.php'); +plugin_include('workflow', 'classes/class.workflowallocation.php'); +plugin_include('workflow', 'classes/class.workflowartallocation.php'); +plugin_include('workflow', 'classes/class.workflowitems.php'); +plugin_include('workflow', 'classes/class.workflowusersequence.php'); + +/** + * Class Workflows + * Class for workflow management + * @author Timo A. Hummel + * @version 0.2 + * @copyright four for business 2003 + */ +class Workflows extends ItemCollection { + + /** + * Constructor Function + * @param none + */ + function __construct() { + global $cfg; + parent::__construct($cfg["tab"]["workflow"], "idworkflow"); + $this->_setItemClass("Workflow"); + } + + function create() { + global $auth, $client, $lang; + $newitem = parent::createNewItem(); + $newitem->setField("created", date("Y-m-d H-i-s")); + $newitem->setField("idauthor", $auth->auth["uid"]); + $newitem->setField("idclient", $client); + $newitem->setField("idlang", $lang); + $newitem->store(); + + return ($newitem); + } + + /** + * Deletes all corresponding informations to this workflow and delegate call to parent + * @param integer $idWorkflow - id of workflow to delete + */ + function delete($idWorkflow) { + global $cfg; + $oDb = new DB_ConLite(); + + $aItemIdsDelete = array(); + $sSql = 'SELECT idworkflowitem FROM ' . $cfg["tab"]["workflow_items"] . ' WHERE idworkflow = ' . Contenido_Security::toInteger($idWorkflow) . ';'; + $oDb->query($sSql); + while ($oDb->next_record()) { + array_push($aItemIdsDelete, Contenido_Security::escapeDB($oDb->f('idworkflowitem'), $oDb)); + } + + $aUserSequencesDelete = array(); + $sSql = 'SELECT idusersequence FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem in (' . implode(',', $aItemIdsDelete) . ');'; + $oDb->query($sSql); + while ($oDb->next_record()) { + array_push($aUserSequencesDelete, Contenido_Security::escapeDB($oDb->f('idusersequence'), $oDb)); + } + + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem in (' . implode(',', $aItemIdsDelete) . ');'; + $oDb->query($sSql); + + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_actions"] . ' WHERE idworkflowitem in (' . implode(',', $aItemIdsDelete) . ');'; + $oDb->query($sSql); + + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_items"] . ' WHERE idworkflow = ' . Contenido_Security::toInteger($idWorkflow) . ';'; + $oDb->query($sSql); + + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_allocation"] . ' WHERE idworkflow = ' . Contenido_Security::toInteger($idWorkflow) . ';'; + $oDb->query($sSql); + + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_art_allocation"] . ' WHERE idusersequence in (' . implode(',', $aUserSequencesDelete) . ');'; + $oDb->query($sSql); + + parent::delete($idWorkflow); + } + +} + +/** + * Class Workflow + * Class for a single workflow item + * @author Timo A. Hummel + * @version 0.1 + * @copyright four for business 2003 + */ +class Workflow extends Item { + + /** + * Constructor + * + * @global array $cfg + */ + function __construct() { + global $cfg; + parent::__construct($cfg["tab"]["workflow"], "idworkflow"); + } + +} + +/* Helper functions */ + +function getWorkflowForCat($idcat) { + global $lang, $cfg; + + $idcatlang = getCatLang($idcat, $lang); + $workflows = new WorkflowAllocations; + $workflows->select("idcatlang = '$idcatlang'"); + if ($obj = $workflows->next()) { + /* Sanity: Check if the workflow still exists */ + $workflow = new Workflow; + + $res = $workflow->loadByPrimaryKey($obj->get("idworkflow")); + + if ($res == false) { + return 0; + } else { + return $obj->get("idworkflow"); + } + } +} + +function getCatLang($idcat, $idlang) { + global $lang, $cfg; + $db = new DB_ConLite; + + /* Get the idcatlang */ + $sql = "SELECT idcatlang FROM " + . $cfg["tab"]["cat_lang"] . + " WHERE idlang = '" . Contenido_Security::escapeDB($idlang, $db) . "' AND + idcat = '" . Contenido_Security::escapeDB($idcat, $db) . "'"; + + $db->query($sql); + + if ($db->next_record()) { + return ($db->f("idcatlang")); + } +} + +?> \ No newline at end of file diff --git a/classes/class.workflowactions.php b/classes/class.workflowactions.php new file mode 100644 index 0000000..6814531 --- /dev/null +++ b/classes/class.workflowactions.php @@ -0,0 +1,132 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * + * $Id: class.workflowactions.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Class WorkflowActions + * Class for workflow action collections + * @author Timo A. Hummel + * @version 0.2 + * @copyright four for business 2003 + */ +class WorkflowActions extends ItemCollection { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["workflow_actions"], "idworkflowaction"); + $this->_setItemClass("WorkflowAction"); + } + + /** + * + * @param type $idworkflowitem + * @param type $action + * @return boolean + */ + function get($idworkflowitem, $action) + { + $this->select("idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."' AND action = '".Contenido_Security::escapeDB($action, NULL)."'"); + if ($this->next()) + { + return true; + } else { + return false; + } + } + + function getAvailableWorkflowActions () + { + $availableWorkflowActions = array ( + "publish" => i18n("Publish article", "workflow"), + "lock" => i18n("Lock article", "workflow"), + "last" => i18n("Move back to last editor", "workflow"), + "reject" => i18n("Reject article", "workflow"), + "articleedit" => i18n("Edit article content", "workflow"), + "propertyedit" => i18n("Edit article properties", "workflow"), + "templateedit" => i18n("Edit template", "workflow"), + "revise" => i18n("Revise article", "workflow")); + + return($availableWorkflowActions); + } + + function set ($idworkflowitem, $action) + { + $this->select("idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."' AND action = '".Contenido_Security::escapeDB($action, NULL)."'"); + if (!$this->next()) + { + $newitem = parent::createNewItem(); + $newitem->setField("idworkflowitem",$idworkflowitem); + $newitem->setField("action",$action); + $newitem->store(); + } + } + + function remove ($idworkflowitem, $action) + { + $this->select("idworkflowitem = '$idworkflowitem' AND action = '$action'"); + if ($item = $this->next()) + { + $this->delete($item->getField("idworkflowaction")); + } + } + + function select ($where = "", $group_by = "", $order_by = "", $limit = "") + { + global $client; + + return parent::select($where, $group_by, $order_by, $limit); + } +} + +/** + * Class WorkflowAction + * Class for a single workflow action + * @author Timo A. Hummel + * @version 0.1 + * @copyright four for business 2003 + */ +class WorkflowAction extends Item { + + /** + * Constructor + * @global type $cfg + */ + function __construct() { + global $cfg; + parent::__construct($cfg["tab"]["workflow_actions"], "idworkflowaction"); + } +} +?> \ No newline at end of file diff --git a/classes/class.workflowallocation.php b/classes/class.workflowallocation.php new file mode 100644 index 0000000..70444ef --- /dev/null +++ b/classes/class.workflowallocation.php @@ -0,0 +1,242 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * + * $Id: class.workflowallocation.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Class WorkflowAllocations + * Class for workflow allocation management + * @author Timo A. Hummel + * @version 0.2 + * @copyright four for business 2003 + */ +class WorkflowAllocations extends ItemCollection { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["workflow_allocation"], "idallocation"); + $this->_setItemClass("WorkflowAllocation"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowAllocations() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + function delete ($idallocation) + { + global $cfg, $lang; + + $obj = new WorkflowAllocation; + $obj->loadByPrimaryKey($idallocation); + + $idcatlang = $obj->get("idcatlang"); + + $db = new DB_ConLite; + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_lang"]." WHERE idcatlang = '".Contenido_Security::toInteger($idcatlang)."'"; + $db->query($sql); + $db->next_record(); + $idcat = $db->f("idcat"); + + $sql = "SELECT idart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."'"; + $db->query($sql); + + while ($db->next_record()) + { + $idarts[] = $db->f("idart"); + } + + $idartlangs = array(); + + if (is_array($idarts)) + { + foreach ($idarts as $idart) + { + $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' and idlang = '".Contenido_Security::toInteger($lang)."'"; + $db->query($sql); + if ($db->next_record()) + { + $idartlangs[] = $db->f("idartlang"); + } + } + } + + $workflowArtAllocation = new WorkflowArtAllocation; + $workflowArtAllocations = new WorkflowArtAllocations; + + foreach ($idartlangs as $idartlang) + { + $workflowArtAllocation->loadBy("idartlang", $idartlang); + $workflowArtAllocations->delete($workflowArtAllocation->get("idartallocation")); + } + + parent::delete($idallocation); + } + + function create ($idworkflow, $idcatlang) + { + $this->select("idcatlang = '$idcatlang'"); + + if ($this->next() !== false) + { + $this->lasterror = i18n("Category already has a workflow assigned", "workflow"); + return false; + } + + $workflows = new Workflows; + $workflows->select("idworkflow = '$idworkflow'"); + + if ($workflows->next() === false) + { + $this->lasterror = i18n("Workflow doesn't exist", "workflow"); + return false; + } + $newitem = parent::createNewItem(); + if (!$newitem->setWorkflow($idworkflow)) + { + $this->lasterror = $newitem->lasterror; + $workflows->delete($newitem->getField("idallocation")); + return false; + } + + if (!$newitem->setCatLang($idcatlang)) + { + $this->lasterror = $newitem->lasterror; + $workflows->delete($newitem->getField("idallocation")); + return false; + } + + $newitem->store(); + + return ($newitem); + } +} + +/** + * Class WorkflowAllocation + * Class for a single workflow allocation item + * @author Timo A. Hummel + * @version 0.1 + * @copyright four for business 2003 + */ +class WorkflowAllocation extends Item { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + + parent::__construct($cfg["tab"]["workflow_allocation"], "idallocation"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowAllocation() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Overridden setField function. Users should only use setWorkflow. + * @param string $field Void field since we override the usual setField function + * @param string $value Void field since we override the usual setField function + */ + function setField($field, $value, $bSafe = true) + { + die("Don't use setField for WorkflowAllocation items! Use setWorkflow instead!"); + } + + /** + * setWorkflow sets the workflow for the current item. + * @param int $idworkflow Workflow-ID to set the item to + */ + function setWorkflow ($idworkflow) + { + $workflows = new Workflows; + + $workflows->select("idworkflow = '$idworkflow'"); + + if ($workflows->next() === false) + { + $this->lasterror = i18n("Workflow doesn't exist", "workflow"); + return false; + } + + parent::setField("idworkflow", $idworkflow); + parent::store(); + return true; + } + + /** + * setCatLang sets the idcatlang for the current item. Should + * only be called by the create function. + * @param int $idcatlang idcatlang to set. + */ + function setCatLang ($idcatlang) + { + global $cfg; + + $allocations = new WorkflowAllocations; + + $allocations->select("idcatlang = '$idcatlang'"); + + if ($allocations->next() !== false) + { + $this->lasterror = i18n("Category already has a workflow assigned", "workflow"); + return false; + } + + $db = new DB_ConLite; + $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcatlang = '".Contenido_Security::toInteger($idcatlang)."'"; + $db->query($sql); + + if (!$db->next_record()) + { + $this->lasterror = i18n("Category doesn't exist, assignment failed", "workflow"); + return false; + } + + parent::setField("idcatlang", $idcatlang); + parent::store(); + return true; + } +} +?> \ No newline at end of file diff --git a/classes/class.workflowartallocation.php b/classes/class.workflowartallocation.php new file mode 100644 index 0000000..8774e85 --- /dev/null +++ b/classes/class.workflowartallocation.php @@ -0,0 +1,361 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * modified : 2008-06-25 - use php mailer class instead of mail() + * + * $Id: class.workflowartallocation.php 128 2019-07-03 11:58:28Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Class WorkflowArtAllocations + * Class for workflow art allocation management + * @author Timo A. Hummel + * @version 0.2 + * @copyright four for business 2003 + */ +class WorkflowArtAllocations extends ItemCollection { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["workflow_art_allocation"], "idartallocation"); + $this->_setItemClass("WorkflowArtAllocation"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowArtAllocations() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + function create ($idartlang) + { + global $cfg; + + $sql = "SELECT idartlang FROM " .$cfg["tab"]["art_lang"]. + " WHERE idartlang = '".Contenido_Security::escapeDB($idartlang, $this->db)."'"; + + $this->db->query($sql); + if (!$this->db->next_record()) + { + $this->lasterror = i18n("Article doesn't exist", "workflow"); + return false; + } + + $this->select("idartlang = '$idartlang'"); + + if ($this->next() !== false) + { + $this->lasterror = i18n("Article is already assigned to a usersequence step.", "workflow"); + return false; + } + + $newitem = parent::createNewItem(); + $newitem->setField("idartlang",$idartlang); + $newitem->store(); + + return ($newitem); + } +} + +/** + * Class WorkflowArtAllocation + * Class for a single workflow allocation item + * @author Timo A. Hummel + * @version 0.1 + * @copyright four for business 2003 + */ +class WorkflowArtAllocation extends Item { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + + parent::__construct($cfg["tab"]["workflow_art_allocation"], "idartallocation"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowArtAllocation() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + function getWorkflowItem () + { + $userSequence = new WorkflowUserSequence; + $userSequence->loadByPrimaryKey($this->values["idusersequence"]); + + return ($userSequence->getWorkflowItem()); + } + + /** + * Returns the current item position + * @param string $field Void field since we override the usual setField function + * @param string $value Void field since we override the usual setField function + */ + function currentItemPosition() + { + $idworkflowitem = $this->get("idworkflowitem"); + + $workflowItems = new WorkflowItems; + $workflowItems->select("idworkflowitem = '$idworkflowitem'"); + + if ($item = $workflowItems->next()) + { + return ($item->get("position")); + } + } + + /** + * Returns the current user position + * @param string $field Void field since we override the usual setField function + * @param string $value Void field since we override the usual setField function + */ + function currentUserPosition() + { + return ($this->get("position")); + } + + /** + * Overriden store function to send mails + * @param none + */ + function store() + { + global $cfg; + + $sMailhost = getSystemProperty('system', 'mail_host'); + if ($sMailhost == '') { + $sMailhost = 'localhost'; + } + + //modified : 2008-06-25 - use php mailer class instead of mail() + $oMail = new PHPMailer(); + $oMail->Host = $sMailhost; + $oMail->IsHTML(0); + $oMail->WordWrap = 1000; + $oMail->IsMail(); + + if (array_key_exists("idusersequence",$this->modifiedValues)) + { + $usersequence = new WorkflowUserSequence; + $usersequence->loadByPrimaryKey($this->values["idusersequence"]); + + $email = $usersequence->get("emailnoti"); + $escal = $usersequence->get("escalationnoti"); + + if ($email == 1 || $escal == 1) + { + /* Grab the required informations */ + $curEditor = getGroupOrUserName($usersequence->get("iduser")); + $idartlang = $this->get("idartlang"); + $timeunit = $usersequence->get("timeunit"); + $timelimit = $usersequence->get("timelimit"); + + $db = new DB_ConLite; + $sql = "SELECT author, title, idart FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang = '".Contenido_Security::escapeDB($idartlang, $db)."'"; + + $db->query($sql); + + if ($db->next_record()) + { + $idart = $db->f("idart"); + $title = $db->f("title"); + $author = $db->f("author"); + } + + /* Extract category */ + $sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::escapeDB($idart, $db)."'"; + $db->query($sql); + + if ($db->next_record()) + { + $idcat = $db->f("idcat"); + } + + $sql = "SELECT name FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::escapeDB($idcat, $db)."'"; + $db->query($sql); + + if ($db->next_record()) + { + $catname = $db->f("name"); + } + + $starttime = $this->get("starttime"); + + + $starttime = strtotime (substr_replace (substr (substr ($starttime,0,2).chunk_split (substr ($starttime,2,6),2,"-").chunk_split (substr ($starttime,8),2,":"),0,19)," ",10,1)); + + switch ($timeunit) + { + case "Seconds": + $maxtime = $starttime + $timelimit; + break; + case "Minutes": + $maxtime = $starttime + ($timelimit * 60); + break; + case "Hours": + $maxtime = $starttime + ($timelimit * 3600); + break; + case "Days": + $maxtime = $starttime + ($timelimit * 86400); + break; + case "Weeks": + $maxtime = $starttime + ($timelimit * 604800); + break; + case "Months": + $maxtime = $starttime + ($timelimit * 2678400); + break; + case "Years": + $maxtime = $starttime + ($timelimit * 31536000); + break; + default: + $maxtime = $starttime + $timelimit; + } + + if ($email == 1) + { + $email = "Hello %s,\n\n". + "you are assigned as the next editor for the Article %s.\n\n". + "More informations:\n". + "Article: %s\n". + "Category: %s\n". + "Editor: %s\n". + "Author: %s\n". + "Editable from: %s\n". + "Editable to: %s\n"; + + $filledMail = sprintf( $email, + $curEditor, + $title, + $title, + $catname, + $curEditor, + $author, + date("Y-m-d H:i:s", $starttime), + date("Y-m-d H:i:s", $maxtime)); + $user = new User; + + if (isGroup($usersequence->get("iduser"))) + { + $sql = "select idgroupuser, user_id FROM ". $cfg["tab"]["groupmembers"] ." WHERE + group_id = '".Contenido_Security::escapeDB($usersequence->get("iduser"), $db)."'"; + $db->query($sql); + + while ($db->next_record()) + { + $user->loadUserByUserID($db->f("user_id")); + //modified : 2008-06-25 - use php mailer class instead of mail() + $oMail->AddAddress($user->getField("email"), ""); + $oMail->Subject = stripslashes (i18n('Workflow notification')); + $oMail->Body = $filledMail; + $oMail->Send(); + } + + } else { + $user->loadUserByUserID($usersequence->get("iduser")); + //modified : 2008-06-25 - use php mailer class instead of mail() + $oMail->AddAddress($user->getField("email"), ""); + $oMail->Subject = stripslashes (i18n('Workflow notification')); + $oMail->Body = $filledMail; + $oMail->Send(); + } + + } else { + $email = "Hello %s,\n\n". + "you are assigned as the escalator for the Article %s.\n\n". + "More informations:\n". + "Article: %s\n". + "Category: %s\n". + "Editor: %s\n". + "Author: %s\n". + "Editable from: %s\n". + "Editable to: %s\n"; + + $filledMail = sprintf( $email, + $curEditor, + $title, + $title, + $catname, + $curEditor, + $author, + date("Y-m-d H:i:s", $starttime), + date("Y-m-d H:i:s", $maxtime)); + + $user = new User; + + if (isGroup($usersequence->get("iduser"))) + { + + $sql = "select idgroupuser, user_id FROM ". $cfg["tab"]["groupmembers"] ." WHERE + group_id = '".Contenido_Security::escapeDB($usersequence->get("iduser"), $db)."'"; + $db->query($sql); + + while ($db->next_record()) + { + $user->loadUserByUserID($db->f("user_id")); + echo "mail to ".$user->getField("email")."
"; + //modified : 2008-06-25 - use php mailer class instead of mail() + $oMail->AddAddress($user->getField("email"), ""); + $oMail->Subject = stripslashes (i18n('Workflow escalation')); + $oMail->Body = $filledMail; + $oMail->Send(); + } + + } else { + $user->loadUserByUserID($usersequence->get("iduser")); + echo "mail to ".$user->getField("email")."
"; + //modified : 2008-06-25 - use php mailer class instead of mail() + $oMail->AddAddress($user->getField("email"), ""); + $oMail->Subject = stripslashes (i18n('Workflow escalation')); + $oMail->Body = $filledMail; + $oMail->Send(); + } + } + + + + } + + + } + return parent::store(); + } +} +?> \ No newline at end of file diff --git a/classes/class.workflowitems.php b/classes/class.workflowitems.php new file mode 100644 index 0000000..62c8c4f --- /dev/null +++ b/classes/class.workflowitems.php @@ -0,0 +1,304 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * + * $Id: class.workflowitems.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +/** + * Class WorkflowItems + * Class for workflow item management + * @author Timo A. Hummel + * @version 0.2 + * @copyright four for business 2003 + */ +class WorkflowItems extends ItemCollection { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() { + global $cfg; + parent::__construct($cfg["tab"]["workflow_items"], "idworkflowitem"); + $this->_setItemClass("WorkflowItem"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowItems() { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + function delete($id) { + global $cfg; + $item = new WorkflowItem; + $item->loadByPrimaryKey($id); + $pos = $item->get("position"); + $idworkflow = $item->get("idworkflow"); + $oDb = new DB_ConLite(); + + $this->select("position > $pos AND idworkflow = '" . Contenido_Security::escapeDB($idworkflow, $oDb) . "'"); + while ($obj = $this->next()) { + $obj->setPosition($obj->get("position") - 1); + $obj->store(); + } + + $aUserSequencesDelete = array(); + $sSql = 'SELECT idusersequence FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem = ' . $id . ';'; + $oDb->query($sSql); + while ($oDb->next_record()) { + array_push($aUserSequencesDelete, Contenido_Security::escapeDB($oDb->f('idusersequence'), $oDb)); + } + + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_actions"] . ' WHERE idworkflowitem = ' . Contenido_Security::escapeDB($id, $oDb) . ';'; + $oDb->query($sSql); + + $this->updateArtAllocation($id, 1); + + if (count($aUserSequencesDelete) > 0) { + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idusersequence in (' . implode(',', $aUserSequencesDelete) . ');'; + $oDb->query($sSql); + } + } + + function updateArtAllocation($idworkflowitem, $delete = false) { + global $idworkflow, $cfg; + $oDb = new DB_ConLite(); + + $aUserSequences = array(); + $sSql = 'SELECT idusersequence FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem = ' . Contenido_Security::escapeDB($idworkflowitem, $oDb) . ';'; + + $oDb->query($sSql); + while ($oDb->next_record()) { + array_push($aUserSequences, Contenido_Security::escapeDB($oDb->f('idusersequence'), $oDb)); + } + + $aIdArtLang = array(); + if (count($aUserSequences) > 0) { + $sSql = 'SELECT idartlang FROM ' . $cfg["tab"]["workflow_art_allocation"] . ' WHERE idusersequence in (' . implode(',', $aUserSequences) . ');'; + $oDb->query($sSql); + while ($oDb->next_record()) { + array_push($aIdArtLang, $oDb->f('idartlang')); + } + $sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_art_allocation"] . ' WHERE idusersequence in (' . implode(',', $aUserSequences) . ');'; + $oDb->query($sSql); + } + + if ($delete) { + parent::delete($idworkflowitem); + } + + foreach ($aIdArtLang as $iIdArtLang) { + setUserSequence($iIdArtLang, $idworkflow); + } + } + + function swap($idworkflow, $pos1, $pos2) { + $this->select("idworkflow = '$idworkflow' AND position = '$pos1'"); + if (($item = $this->next()) === false) { + $this->lasterror = i18n("Swapping items failed: Item doesn't exist", "workflow"); + return false; + } + + $pos1ID = $item->getField("idworkflowitem"); + + $this->select("idworkflow = '$idworkflow' AND position = '$pos2'"); + if (($item = $this->next()) === false) { + $this->lasterror = i18n("Swapping items failed: Item doesn't exist", "workflow"); + return false; + } + + $pos2ID = $item->getField("idworkflowitem"); + + $item = new WorkflowItem(); + $item->loadByPrimaryKey($pos1ID); + $item->setPosition($pos2); + $item->store(); + $item->loadByPrimaryKey($pos2ID); + $item->setPosition($pos1); + $item->store(); + + $this->updateArtAllocation($pos1ID); + $this->updateArtAllocation($pos2ID); + return (true); + } + + function create($idworkflow) { + $workflows = new Workflows; + + $workflows->select("idworkflow = '$idworkflow'"); + + if ($workflows->next() === false) { + $this->lasterror = i18n("Can't add item to workflow: Workflow doesn't exist", "workflow"); + return false; + } + + $this->select("idworkflow = '$idworkflow'", "", "position DESC", "1"); + + $item = $this->next(); + + if ($item === false) { + $lastPos = 1; + } else { + $lastPos = $item->getField("position") + 1; + } + + $newItem = parent::createNewItem(); + if ($newItem->init($idworkflow, $lastPos) === false) { + $this->delete($newItem->getField("idworkflowitem")); + $this->lasterror = $newItem->lasterror; + return false; + } + + if ($item === false) { + $this->updateArtAllocation(0); + } + + return ($newItem); + } + +} + +/** + * Class WorkflowItem + * Class for a single workflow item + * @author Timo A. Hummel + * @version 0.1 + * @copyright four for business 2003 + */ +class WorkflowItem extends Item { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() { + global $cfg; + + parent::__construct($cfg["tab"]["workflow_items"], "idworkflowitem"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowItem() { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + function getStepRights() { + $idwfi = $this->values["idworkflowitem"]; + $workflowActions = new WorkflowActions; + + $actions = WorkflowActions::getAvailableWorkflowActions(); + + foreach ($actions as $key => $value) { + $rights[$key] = $workflowActions->get($idwfi, $key); + } + + return $rights; + } + + /** + * Overridden setField function. + * @param string $field Void field since we override the usual setField function + * @param string $value Void field since we override the usual setField function + */ + function setField($field, $value, $bSafe = TRUE) { + if ($this->virgin == true) { + $this->lasterror = i18n("No item loaded", "workflow"); + return false; + } + + if ($field == "idsequence") { + die("You can't set the idsequence field using this method. Use 'create' in the WorkflowItems class."); + } + + if ($field == "idworkflow") { + die("You can't set the workflow ID using this method. Use 'create' in the WorkflowItems class!"); + } + + if ($field == "position") { + die("You can't set the position ID using this method. Use 'create' or 'swap' to create or move items!"); + } + + if ($field == "idtask" && $value != 0) { + $taskCollection = new WorkflowTasks; + $taskCollection->select("idtask = '$value'"); + if ($taskCollection->next() === false) { + $this->lasterror = i18n("Requested task doesn't exist, can't assign", "workflow"); + return false; + } + } + + parent::setField($field, $value, $bSafe); + } + + /** + * init initializes a new wf_items entry. Should + * only be called by the create function. + * @param int $idworkflow The workflow to set the item to + */ + function init($idworkflow, $idposition) { + global $cfg; + + $workflows = new Workflows; + + $workflows->select("idworkflow = '$idworkflow'"); + + if ($workflows->next() === false) { + $this->lasterror = i18n("Workflow doesn't exist", "workflow"); + return false; + } + + $workflowItems = new WorkflowItems; + $workflowItems->select("position = '$idposition' AND idworkflow = '$idworkflow'"); + if ($workflowItems->next()) { + $this->lasterror = i18n("Position in this workflow already exists.", "workflow"); + return false; + } + + parent::setField("idworkflow", $idworkflow); + parent::setField("position", $idposition); + parent::store(); + return true; + } + + /** + * setPosition Sets the position for an item. Should only be + * called by the "swap" function + * @param int $idposition The new position ID + */ + function setPosition($idposition) { + parent::setField("position", $idposition); + parent::store(); + return true; + } + +} + +?> \ No newline at end of file diff --git a/classes/class.workflowtasks.php b/classes/class.workflowtasks.php new file mode 100644 index 0000000..008b9a3 --- /dev/null +++ b/classes/class.workflowtasks.php @@ -0,0 +1,106 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * + * $Id: class.workflowtasks.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Class WorkflowTasks + * Class for workflow task collections + * @author Timo A. Hummel + * @version 0.2 + * @copyright four for business 2003 + */ +class WorkflowTasks extends ItemCollection { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["tasks"], "idtask"); + $this->_setItemClass("WorkflowTask"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowTasks() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + function create () + { + $newitem = parent::createNewItem(); + return ($newitem); + } + + function select ($where = "", $group_by = "", $order_by = "", $limit = "") + { + global $client; + + if ($where != "") + { + $where = $where . " AND idclient = '".Contenido_Security::escapeDB($client, NULL)."'"; + } + return parent::select($where, $group_by, $order_by, $limit); + } +} + +/** + * Class WorkflowTask + * Class for a single workflow task item + * @author Timo A. Hummel + * @version 0.1 + * @copyright four for business 2003 + */ +class WorkflowTask extends Item { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["tasks"], "idtask"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowTask() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } +} + +?> \ No newline at end of file diff --git a/classes/class.workflowusersequence.php b/classes/class.workflowusersequence.php new file mode 100644 index 0000000..2a5a0a7 --- /dev/null +++ b/classes/class.workflowusersequence.php @@ -0,0 +1,278 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * + * $Id: class.workflowusersequence.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +/** + * Class WorkflowUserSequences + * Class for workflow user sequence management + * @author Timo A. Hummel + * @version 0.2 + * @copyright four for business 2003 + */ +class WorkflowUserSequences extends ItemCollection { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["workflow_user_sequences"], "idusersequence"); + $this->_setItemClass("WorkflowUserSequence"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowUserSequences() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + function delete ($id) + { + global $cfg, $idworkflow; + + $item = new WorkflowUserSequence; + $item->loadByPrimaryKey($id); + + $pos = $item->get("position"); + $idworkflowitem = $item->get("idworkflowitem"); + $this->select("position > $pos AND idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."'"); + while ($obj = $this->next()) + { + $pos = $obj->get("position") -1; + $obj->setPosition($pos); + $obj->store(); + } + + parent::delete($id); + + $this->updateArtAllocation($id); + } + + function updateArtAllocation ($idusersequence) { + global $idworkflow, $cfg; + $oDb = new DB_ConLite(); + + $aIdArtLang = array(); + $sSql = 'SELECT idartlang FROM '.$cfg["tab"]["workflow_art_allocation"].' WHERE idusersequence = '.Contenido_Security::escapeDB($idusersequence, $oDb).';'; + $oDb->query($sSql); + while ($oDb->next_record()) { + array_push($aIdArtLang, $oDb->f('idartlang')); + } + + $sSql = 'DELETE FROM '.$cfg["tab"]["workflow_art_allocation"].' WHERE idusersequence = '.Contenido_Security::escapeDB($idusersequence, $oDb).';'; + $oDb->query($sSql); + + + foreach ($aIdArtLang as $iIdArtLang) { + setUserSequence($iIdArtLang, $idworkflow); + } + } + + function create ($idworkflowitem) + { + global $auth, $client, $idworkflow; + $newitem = parent::createNewItem(); + + $workflowitems = new WorkflowItems; + if (!$workflowitems->exists($idworkflowitem)) + { + $this->delete($newitem->getField("idusersequence")); + $this->lasterror = i18n("Workflow item doesn't exist. Can't create entry.", "workflow"); + return false; + } + + $this->select("idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."'","","position DESC","1"); + + $item = $this->next(); + + if ($item === false) + { + $lastPos = 1; + } else { + $lastPos = $item->getField("position") + 1; + } + + $newitem->setWorkflowItem($idworkflowitem); + $newitem->setPosition($lastPos); + $newitem->store(); + + return ($newitem); + } + + function swap ($idworkflowitem, $pos1, $pos2) + { + $this->select("idworkflowitem = '$idworkflowitem' AND position = '".Contenido_Security::escapeDB($pos1, NULL)."'"); + if (($item = $this->next()) === false) + { + $this->lasterror = i18n("Swapping items failed: Item doesn't exist", "workflow"); + return false; + } + + $pos1ID = $item->getField("idusersequence"); + + $this->select("idworkflowitem = '$idworkflowitem' AND position = '".Contenido_Security::escapeDB($pos2, NULL)."'"); + if (($item = $this->next()) === false) + { + $this->lasterror(i18n("Swapping items failed: Item doesn't exist", "workflow")); + return false; + } + + $pos2ID = $item->getField("idusersequence"); + + $item = new WorkflowUserSequence(); + $item->loadByPrimaryKey($pos1ID); + $item->setPosition($pos2); + $item->store(); + $item->loadByPrimaryKey($pos2ID); + $item->setPosition($pos1); + $item->store(); + + $this->updateArtAllocation($pos2ID); + $this->updateArtAllocation($pos1ID); + + return (true); + } +} + +/** + * Class WorkflowUserSequence + * Class for a single workflow item + * @author Timo A. Hummel + * @version 0.1 + * @copyright four for business 2003 + */ +class WorkflowUserSequence extends Item { + + /** + * Constructor Function + * @param string $table The table to use as information source + */ + function __construct() + { + global $cfg; + parent::__construct($cfg["tab"]["workflow_user_sequences"], "idusersequence"); + } + + /** @deprecated [2011-03-15] Old constructor function for downwards compatibility */ + function WorkflowUserSequence() + { + cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()"); + $this->__construct(); + } + + /** + * Override setField Function to prevent that somebody modifies + * idsequence. + * @param string $field Field to set + * @param string $valie Value to set + */ + function setField($field, $value, $bSafe = true) + { + global $cfg; + + switch ($field) + { + case "idworkflowitem": + die("Please use create to modify idsequence. Direct modifications are not allowed"); + case "idusersequence": + die("Please use create to modify idsequence. Direct modifications are not allowed"); + case "position": + die("Please use create and swap to set the position. Direct modifications are not allowed"); + case "iduser": + if ($value != 0) + { + $db = new DB_ConLite; + $sql = "SELECT user_id FROM " . $cfg["tab"]["phplib_auth_user_md5"] . + " WHERE user_id = '".Contenido_Security::escapeDB($value, $db)."'"; + $db->query($sql); + + if (!$db->next_record()) + { + $sql = "SELECT group_id FROM " . $cfg["tab"]["groups"] . + " WHERE group_id = '".Contenido_Security::escapeDB($value, $db)."'"; + + $db->query($sql); + if (!$db->next_record()) + { + $this->lasterror = i18n("Can't set user_id: User or group doesn't exist", "workflow"); + return false; + } + } + $idusersquence = parent::getField('idusersequence'); + } + + } + + parent::setField($field, $value, $bSafe); + if ($idusersquence) { + WorkflowUserSequences::updateArtAllocation(0); + } + } + + /** + * Returns the associated workflowItem for this user sequence + * @param none + */ + function getWorkflowItem () + { + if (!$this->virgin) + { + $workflowItem = new WorkflowItem; + $workflowItem->loadByPrimaryKey($this->values["idworkflowitem"]); + return ($workflowItem); + } else { + return false; + } + } + + /** + * Interface to set idworkflowitem. Should only be called by "create". + * @param string $value The value to set + */ + function setWorkflowItem($value) + { + parent::setField("idworkflowitem", $value); + } + + /** + * Interface to set idworkflowitem. Should only be called by "create". + * @param string $value The value to set + */ + function setPosition($value) + { + parent::setField("position", $value); + } +} +?> \ No newline at end of file diff --git a/cronjobs/advance_workflow.php b/cronjobs/advance_workflow.php new file mode 100644 index 0000000..c4304ce --- /dev/null +++ b/cronjobs/advance_workflow.php @@ -0,0 +1,114 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-05-26 + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: advance_workflow.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +define('CON_FRAMEWORK', true); + + +// Contenido startup process +include_once ('../../../includes/startup.php'); + +cInclude("includes", "cfg_language_de.inc.php"); +cInclude("includes", "functions.con.php"); + +plugin_include('workflow', 'classes/class.workflow.php'); +plugin_include('workflow', 'includes/functions.workflow.php'); + +$workflowartallocations = new WorkflowArtAllocations; +$workflowusersequences = new WorkflowUserSequences; + +$workflowartallocations->select(); + +while ($obj = $workflowartallocations->next()) +{ + $starttime = $obj->get("starttime"); + $idartlang = $obj->get("idartlang"); + $lastidusersequence = $obj->get("lastusersequence"); + + $usersequence = getCurrentUserSequence($idartlang,0); + + if ($usersequence != $lastidusersequence) + { + + $workflowusersequences->select("idusersequence = '$usersequence'"); + + if ($wfobj = $workflowusersequences->next()) + { + $wfitem = $wfobj->get("idworkflowitem"); + $pos = $wfobj->get("position"); + $timeunit = $wfobj->get("timeunit"); + $timelimit = $wfobj->get("timelimit"); + } + + $starttime = strtotime (substr_replace (substr (substr ($starttime,0,2).chunk_split (substr ($starttime,2,6),2,"-").chunk_split (substr ($starttime,8),2,":"),0,19)," ",10,1)); + switch ($timeunit) + { + case "Seconds": + $maxtime = $starttime + $timelimit; + break; + case "Minutes": + $maxtime = $starttime + ($timelimit * 60); + break; + case "Hours": + $maxtime = $starttime + ($timelimit * 3600); + break; + case "Days": + $maxtime = $starttime + ($timelimit * 86400); + break; + case "Weeks": + $maxtime = $starttime + ($timelimit * 604800); + break; + case "Months": + $maxtime = $starttime + ($timelimit * 2678400); + break; + case "Years": + $maxtime = $starttime + ($timelimit * 31536000); + break; + default: + $maxtime = $starttime + $timelimit; + } + + + + if ($maxtime < time()) + { + $pos = $pos + 1; + $workflowusersequences->select("idworkflowitem = '$wfitem' AND position = '".Contenido_Security::escapeDB($pos, NULL)."'"); + + if ($wfobj = $workflowusersequences->next()) + { + $obj->set("idusersequence", $wfobj->get("idusersequence")); + $obj->store(); + + } + } + + } +} + +?> diff --git a/images/no_verschieben.gif b/images/no_verschieben.gif new file mode 100644 index 0000000..dbbc5e9 Binary files /dev/null and b/images/no_verschieben.gif differ diff --git a/images/nu_verschieben.gif b/images/nu_verschieben.gif new file mode 100644 index 0000000..00e6a36 Binary files /dev/null and b/images/nu_verschieben.gif differ diff --git a/images/workflow.gif b/images/workflow.gif new file mode 100644 index 0000000..d9c1f78 Binary files /dev/null and b/images/workflow.gif differ diff --git a/images/workflow_alt.gif b/images/workflow_alt.gif new file mode 100644 index 0000000..d9c1f78 Binary files /dev/null and b/images/workflow_alt.gif differ diff --git a/images/workflow_email_noti.gif b/images/workflow_email_noti.gif new file mode 100644 index 0000000..d95569d Binary files /dev/null and b/images/workflow_email_noti.gif differ diff --git a/images/workflow_erstellen.gif b/images/workflow_erstellen.gif new file mode 100644 index 0000000..0472fdc Binary files /dev/null and b/images/workflow_erstellen.gif differ diff --git a/images/workflow_escal_noti.gif b/images/workflow_escal_noti.gif new file mode 100644 index 0000000..2c753ac Binary files /dev/null and b/images/workflow_escal_noti.gif differ diff --git a/images/workflow_step.gif b/images/workflow_step.gif new file mode 100644 index 0000000..d9745a1 Binary files /dev/null and b/images/workflow_step.gif differ diff --git a/images/workflow_step_delete.gif b/images/workflow_step_delete.gif new file mode 100644 index 0000000..c7251de Binary files /dev/null and b/images/workflow_step_delete.gif differ diff --git a/images/workflow_step_ist_raus.gif b/images/workflow_step_ist_raus.gif new file mode 100644 index 0000000..d9745a1 Binary files /dev/null and b/images/workflow_step_ist_raus.gif differ diff --git a/images/workflow_step_new.gif b/images/workflow_step_new.gif new file mode 100644 index 0000000..0472fdc Binary files /dev/null and b/images/workflow_step_new.gif differ diff --git a/images/workflow_user.gif b/images/workflow_user.gif new file mode 100644 index 0000000..0256151 Binary files /dev/null and b/images/workflow_user.gif differ diff --git a/includes/config.plugin.php b/includes/config.plugin.php new file mode 100644 index 0000000..e89f864 --- /dev/null +++ b/includes/config.plugin.php @@ -0,0 +1,453 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * @todo move functions to own file and add autoloader (Ortwin) + * + * $Id: config.plugin.php 128 2019-07-03 11:58:28Z oldperl $ + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +plugin_include('workflow', 'classes/class.workflow.php'); +plugin_include('workflow', 'includes/functions.workflow.php'); + +global $lngAct, $modidartlang; + +$lngAct["workflow"]["workflow_delete"] = i18n("Delete workflow", "workflow"); +$lngAct["con_workflow"]["workflow_task_user_select"] = i18n("Select workflow task", "workflow"); +$lngAct["workflow_common"]["workflow_show"] = i18n("Show workflow", "workflow"); +$lngAct["workflow_common"]["workflow_create"] = i18n("Create workflow", "workflow"); +$lngAct["workflow_common"]["workflow_save"] = i18n("Edit workflow", "workflow"); +$lngAct["con"]["workflow_do_action"] = i18n("Process workflow step", "workflow"); +$lngAct["str"]["workflow_inherit_down"] = i18n("Inherit workflow down", "workflow"); +$lngAct["str"]["workflow_inherit_down"] = i18n("Inherit workflow down", "workflow"); +$lngAct["workflow_steps"]["workflow_step_edit"] = i18n("Edit workflow step", "workflow"); +$lngAct["workflow_steps"]["workflow_step_up"] = i18n("Move workflowstep up", "workflow"); +$lngAct["workflow_steps"]["workflow_step_down"] = i18n("Move workflowstep down", "workflow"); +$lngAct["workflow_steps"]["workflow_save_step"] = i18n("Save Workflowstep", "workflow"); +$lngAct["workflow_steps"]["workflow_create_step"] = i18n("Create workflowstep", "workflow"); +$lngAct["workflow_steps"]["workflow_step_delete"] = i18n("Delete workflowstep", "workflow"); +$lngAct["workflow_steps"]["workflow_user_up"] = i18n("Move workflowstepuser up", "workflow"); +$lngAct["workflow_steps"]["workflow_user_down"] = i18n("Move workflowstepuser down", "workflow"); +$lngAct["workflow_steps"]["workflow_create_user"] = i18n("Create Workflowstepuser", "workflow"); +$lngAct["workflow_steps"]["workflow_user_delete"] = i18n("Delete Workflowstepuser", "workflow"); +$lngAct["str"]["workflow_cat_assign"] = i18n("Associate workflow with category", "workflow"); + +$_cecRegistry->addChainFunction("Contenido.ArticleCategoryList.ListItems", "piworkflowCreateTasksFolder"); +$_cecRegistry->addChainFunction("Contenido.ArticleList.Columns", "piworkflowProcessArticleColumns"); +$_cecRegistry->addChainFunction("Contenido.ArticleList.Actions", "piworkflowProcessActions"); +$_cecRegistry->addChainFunction("Contenido.ArticleList.RenderColumn", "piworkflowRenderColumn"); +$_cecRegistry->addChainFunction("Contenido.ArticleList.RenderAction", "piworkflowRenderAction"); +$_cecRegistry->addChainFunction("Contenido.CategoryList.Columns", "piworkflowCategoryColumns"); +$_cecRegistry->addChainFunction("Contenido.CategoryList.RenderColumn", "piworkflowCategoryRenderColumn"); +$_cecRegistry->addChainFunction("Contenido.Frontend.AllowEdit", "piworkflowAllowArticleEdit"); + +function prepareWorkflowItems () +{ + + global $action, $lang, $modidcat, $workflowSelectBox, $workflowworkflows, $client, $tpl, $cfg; + + $workflowworkflows = new Workflows; + + if ($action === 'workflow_inherit_down') + { + $tmp = strDeeperCategoriesArray($modidcat); + $asworkflow = getWorkflowForCat($modidcat); + + $wfa = new WorkflowAllocations; + + foreach ($tmp as $tmp_cat) + { + $idcatlang = getCatLang ($tmp_cat, $lang); + + if ($asworkflow == 0) + { + $wfa->select("idcatlang = '$idcatlang'"); + + if ($item = $wfa->next()) + { + $wfa->delete($item->get("idallocation")); + # delete user sequences for listing in tasklist for each included article + $oArticles = new ArticleCollection(array('idcat' => $idcatlang, 'start' => true, 'offline' => true)); + while ($oArticle = $oArticles->nextArticle()) { + setUserSequence($oArticle->getField('idartlang'), -1); + } + } + } else { + $wfa->select("idcatlang = '$idcatlang'"); + + if ($item = $wfa->next()) + { + $item->setWorkflow($asworkflow); + $item->store(); + } else { + $wfa->create($asworkflow, $idcatlang); + # generate user sequences for listing in tasklist for each included article + $oArticles = new ArticleCollection(array('idcat' => $tmp_cat, 'start' => true, 'offline' => true)); + while ($oArticle = $oArticles->nextArticle()) { + setUserSequence($oArticle->getField('idartlang'), $asworkflow); + } + } + } + } + } + if ($action == "workflow_cat_assign") + { + $seltpl = "wfselect".$modidcat; + + $wfa = new WorkflowAllocations; + $idcatlang = getCatLang($modidcat, $lang); + + #associate workflow with category + if ($GLOBALS[$seltpl] != 0) + { + $wfa->select("idcatlang = '$idcatlang'"); + if ($item = $wfa->next()) + { + $item->setWorkflow($GLOBALS[$seltpl]); + $item->store(); + } else { + $wfa->create($GLOBALS[$seltpl], $idcatlang); + } + + # generate user sequences for listing in tasklist for each included article + $oArticles = new ArticleCollection(array('idcat' => $modidcat, 'start' => true, 'offline' => true)); + while ($oArticle = $oArticles->nextArticle()) { + setUserSequence($oArticle->getField('idartlang'), $GLOBALS[$seltpl]); + } + #unlink workflow with category + } else { + $wfa->select("idcatlang = '$idcatlang'"); + + if ($item = $wfa->next()) + { + $alloc = $item->get("idallocation"); + } + $wfa->delete($alloc); + + # delete user sequences for listing in tasklist for each included article + $oArticles = new ArticleCollection(array('idcat' => $modidcat, 'start' => true, 'offline' => true)); + while ($oArticle = $oArticles->nextArticle()) { + setUserSequence($oArticle->getField('idartlang'), -1); + } + + } + } + + $workflowSelectBox = new cHTMLSelectElement("foo"); + $workflowSelectBox->setClass("text_medium"); + $workflowworkflows->select("idclient = '$client' AND idlang = '".Contenido_Security::escapeDB($lang, null)."'"); + + $workflowOption = new cHTMLOptionElement("--- ".i18n("None", "workflow")." ---", 0); + $workflowSelectBox->addOptionElement(0,$workflowOption); + + while ($workflow = $workflowworkflows->next()) + { + $workflowOption = new cHTMLOptionElement($workflow->get("name"), $workflow->get("idworkflow")); + $workflowSelectBox->addOptionElement($workflow->get("idworkflow"),$workflowOption); + } + + $workflowSelectBox->updateAttributes(array("id" => "wfselect{IDCAT}")); + $workflowSelectBox->updateAttributes(array("name" => "wfselect{IDCAT}")); + + $tpl->set('s', 'PLUGIN_WORKFLOW', $workflowSelectBox->render().''); + $tpl->set('s', 'PLUGIN_WORKFLOW_TRANSLATION', i18n("Inherit workflow down", "workflow")); +} + +function piworkflowCategoryRenderColumn ($idcat, $type) +{ + + switch ($type) + { + case "workflow": + $value = workflowInherit($idcat).''; + break; + } + + return ($value); +} + +function piworkflowCategoryColumns ($array) +{ + prepareWorkflowItems(); + $myarray = array("workflow" => i18n("Workflow", "workflow")); + + return ($myarray); +} + +function piworkflowProcessActions ($array) +{ + global $idcat; + $defaultidworkflow = getWorkflowForCat($idcat); + + if ($defaultidworkflow != 0) + { + $narray = array("todo", + "wfartconf", + "wftplconf", + "wfonline", + "wflocked", + "duplicate", + "delete", + "usetime"); + } else { + $narray = $array; + } + + return ($narray); +} + +function piworkflowRenderAction ($idcat, $idart, $idartlang, $type) +{ + global $area, $frame, $idtpl, $cfg, $alttitle, $tmp_articletitle; + global $tmp_artconf, $onlinelink, $lockedlink, $tplconf_link; + + $defaultidworkflow = getWorkflowForCat($idcat); + + $idusersequence = getCurrentUserSequence($idartlang,$defaultidworkflow); + $associatedUserSequence = new WorkflowUserSequence; + $associatedUserSequence->loadByPrimaryKey($idusersequence); + + $currentEditor = $associatedUserSequence->get("iduser"); + $workflowItem = $associatedUserSequence->getWorkflowItem(); + + if (isCurrentEditor($associatedUserSequence->get("iduser"))) + { + /* Query rights for this user */ + $wfRights = $workflowItem->getStepRights(); + $mayEdit = true; + } else { + $wfRights = ""; + $mayEdit = false; + } + + switch ($type) + { + case "wfartconf": + if ($wfRights["propertyedit"] == true) + { + return $tmp_artconf; + } + break; + case "wfonline": + if ($wfRights["publish"] == true) + { + return $onlinelink; + } + break; + case "wflocked": + if ($wfRights["lock"] == true) + { + return $lockedlink; + } + break; + case "wftplconf": + if ($wfRights["templateedit"] == true) + { + return $tplconf_link; + } + default: + break; + } + + return ""; +} +function piworkflowProcessArticleColumns ($array) +{ + global $idcat, $action, $modidartlang; + + if ($action == "workflow_do_action") + { + $selectedAction = "wfselect".$modidartlang; + doWorkflowAction($modidartlang, $GLOBALS[$selectedAction]); + + } + + $defaultidworkflow = getWorkflowForCat($idcat); + + if ($defaultidworkflow != 0) + { + $narray = array(); + $bInserted = false; + foreach ($array as $sKey => $sValue) { + $narray[$sKey] = $sValue; + if ($sKey == 'title' && !$bInserted) { + $narray["wftitle"] = $array["title"]; + $narray["wfstep"] = i18n("Workflow Step", "workflow"); + $narray["wfaction"] = i18n("Workflow Action", "workflow"); + $narray["wfeditor"] = i18n("Workflow Editor", "workflow"); + $narray["wflaststatus"] = i18n("Last status", "workflow"); + $bInserted = true; + } + } + unset ($narray['title']); + unset ($narray['changeddate']); + unset ($narray['publisheddate']); + unset ($narray['sortorder']); + } else { + $narray = $array; + } + + return ($narray); +} + +function piworkflowAllowArticleEdit ($idlang, $idcat, $idart, $user) +{ + $defaultidworkflow = getWorkflowForCat($idcat); + + if ($defaultidworkflow == 0) + { + return true; + } + + $idartlang = getArtLang($idart, $idlang); + $idusersequence = getCurrentUserSequence($idartlang,$defaultidworkflow); + $associatedUserSequence = new WorkflowUserSequence; + $associatedUserSequence->loadByPrimaryKey($idusersequence); + + $currentEditor = $associatedUserSequence->get("iduser"); + + $workflowItem = $associatedUserSequence->getWorkflowItem(); + + if (isCurrentEditor($associatedUserSequence->get("iduser"))) + { + $wfRights = $workflowItem->getStepRights(); + $mayEdit = true; + } else { + $wfRights = ""; + $mayEdit = false; + } + + if ($wfRights["articleedit"] == true) + { + return true; + } else { + return false; + } + +} +function piworkflowRenderColumn ($idcat, $idart, $idartlang, $column) +{ + global $area, $frame, $idtpl, $cfg, $alttitle, $tmp_articletitle; + $defaultidworkflow = getWorkflowForCat($idcat); + + $idusersequence = getCurrentUserSequence($idartlang,$defaultidworkflow); + $associatedUserSequence = new WorkflowUserSequence; + $associatedUserSequence->loadByPrimaryKey($idusersequence); + + $currentEditor = $associatedUserSequence->get("iduser"); + + $workflowItem = $associatedUserSequence->getWorkflowItem(); + + if (isCurrentEditor($associatedUserSequence->get("iduser"))) + { + $wfRights = $workflowItem->getStepRights(); + $mayEdit = true; + } else { + $wfRights = ""; + $mayEdit = false; + } + + switch ($column) + { + case "wftitle": + if ($wfRights["articleedit"] == true) + { + $mtitle = $tmp_articletitle; + } else { + $mtitle = strip_tags($tmp_articletitle); + } + return ($mtitle); + case "wfstep": + if ($workflowItem === false) + { + return "nobody"; + } + + return ($workflowItem->get("position").".) ".$workflowItem->get("name")); + case "wfeditor": + $sEditor = getGroupOrUserName($currentEditor); + if (!$sEditor) { + $sEditor = "nobody"; + } + return $sEditor; + case "wfaction": + $defaultidworkflow = getWorkflowForCat($idcat); + $idusersequence = getCurrentUserSequence($idartlang,$defaultidworkflow); + + $sActionSelect = getActionSelect($idartlang, $idusersequence); + if (!$sActionSelect) { + $mayEdit = false; + } + + $form = new UI_Form("wfaction".$idartlang, "main.php", "get"); + $form->setVar("area",$area); + $form->setVar("action","workflow_do_action"); + $form->setVar("frame", $frame); + $form->setVar("idcat", $idcat); + $form->setVar("modidartlang", $idartlang); + $form->setVar("idtpl", $idtpl); + $form->add("select", '
'.$sActionSelect.''); + $form->add("button", '
'); + + if ($mayEdit == true) + { + return ($form->render(true)); + } else { + return '--- ' . i18n("None") . ' ---'; + } + + case "wflaststatus": + $sStatus = getLastWorkflowStatus($idartlang); + if (!$sStatus) { + $sStatus = '--- ' . i18n("None") . ' ---'; + } + return $sStatus; + + } +} + +function piworkflowCreateTasksFolder () +{ + global $sess, $cfg; + + $item = array(); + /* Create workflow tasks folder */ + $tmp_mstr = '%s'; + + $mstr = sprintf($tmp_mstr, 'right_bottom', + $sess->url("main.php?area=con_workflow&frame=4"), + 'right_top', + $sess->url("main.php?area=con_workflow&frame=3"), + 'Workflow / Todo'); + + $item["image"] = ''; + $item["title"] = $mstr; + + + return ($item); +} + + + +?> diff --git a/includes/functions.workflow.php b/includes/functions.workflow.php new file mode 100644 index 0000000..bba6d7f --- /dev/null +++ b/includes/functions.workflow.php @@ -0,0 +1,552 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-28 + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * + * $Id: functions.workflow.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +cInclude("includes", "functions.con.php"); + +plugin_include('workflow', 'classes/class.workflowitems.php'); + +function getUsers ($listid, $default) +{ + global $idclient, $cfg, $auth; + + $userlist = new Users; + $users = $userlist->getAccessibleUsers(explode(',', $auth->auth['perm'])); + $grouplist = new Groups; + $groups = $grouplist->getAccessibleGroups(explode(',', $auth->auth['perm'])); + + $tpl2 = new Template; + $tpl2->set('s', 'NAME', 'user'.$listid); + $tpl2->set('s', 'CLASS', 'text_small'); + $tpl2->set('s', 'OPTIONS', 'size=1'); + + $tpl2->set('d', 'VALUE', 0); + $tpl2->set('d', 'CAPTION', '--- '.i18n("None", "workflow").' ---'); + if ($default == 0) + { + $tpl2->set('d', 'SELECTED', 'SELECTED'); + } else { + $tpl2->set('d', 'SELECTED', ''); + } + $tpl2->next(); + + if ( is_array($users) ) + { + + foreach ($users as $key => $value) + { + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value["realname"] . " (".$value["username"].")"); + + if ($default == $key) + { + $tpl2->set('d', 'SELECTED', 'SELECTED'); + } else { + $tpl2->set('d', 'SELECTED', ''); + } + + $tpl2->next(); + } + } + + $tpl2->set('d', 'VALUE', '0'); + $tpl2->set('d', 'CAPTION', '------------------------------------'); + $tpl2->set('d', 'SELECTED', 'disabled'); + $tpl2->next(); + + if ( is_array($groups) ) + { + + foreach ($groups as $key => $value) + { + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value["groupname"]); + + if ($default == $key) + { + $tpl2->set('d', 'SELECTED', 'SELECTED'); + } else { + $tpl2->set('d', 'SELECTED', ''); + } + + $tpl2->next(); + } + + } + + return $tpl2->generate($cfg['path']['templates'].$cfg['templates']['generic_select'], true); + +} + +function isCurrentEditor ($uid) +{ + global $auth, $cfg; + + /* Check if the UID is a group. If yes, check if we are in it */ + $user = new User; + if ($user->loadUserByUserID($uid) == false) + { + $db2 = new DB_ConLite; + + /* Yes, it's a group. Let's try to load the group members! */ + $sql = "SELECT user_id FROM " + .$cfg["tab"]["groupmembers"]." + WHERE group_id = '".Contenido_Security::escapeDB($uid,$db2)."'"; + + $db2->query($sql); + + while ($db2->next_record()) + { + if ($db2->f("user_id") == $auth->auth["uid"]) + { + return true; + } + } + } else { + if ($uid == $auth->auth["uid"]) + { + return true; + } + } + + return false; +} + +function getActionSelect ($idartlang, $idusersequence) +{ + global $cfg; + + $workflowActions = new WorkflowActions; + + $allActions = $workflowActions->getAvailableWorkflowActions(); + + $wfSelect = new Template; + $wfSelect->set('s', 'NAME', 'wfselect'.$idartlang); + $wfSelect->set('s', 'CLASS', 'text_medium'); + + $userSequence = new WorkflowUserSequence; + $userSequence->loadByPrimaryKey($idusersequence); + + $workflowItem = $userSequence->getWorkflowItem(); + + if ($workflowItem === false) + { + return; + } + + $wfRights = $workflowItem->getStepRights(); + + $artAllocation = new WorkflowArtAllocations; + $artAllocation->select("idartlang = '$idartlang'"); + + if ($obj = $artAllocation->next()) + { + $laststep = $obj->get("lastusersequence"); + } + + $bExistOption = false; + if ($laststep != $idusersequence) + { + $wfSelect->set('d', 'VALUE', 'next'); + $wfSelect->set('d', 'CAPTION', i18n("Confirm", "workflow")); + $wfSelect->set('d', 'SELECTED', 'SELECTED'); + $wfSelect->next(); + $bExistOption = true; + } + + if ($wfRights["last"] == true) + { + $wfSelect->set('d', 'VALUE', 'last'); + $wfSelect->set('d', 'CAPTION', i18n("Back to last editor", "workflow")); + $wfSelect->set('d', 'SELECTED', ''); + $wfSelect->next(); + $bExistOption = true; + } + + if ($wfRights["reject"] == true) + { + $wfSelect->set('d', 'VALUE', 'reject'); + $wfSelect->set('d', 'CAPTION', i18n("Reject article", "workflow")); + $wfSelect->set('d', 'SELECTED', ''); + $wfSelect->next(); + $bExistOption = true; + } + + if ($wfRights["revise"] == true) + { + $wfSelect->set('d', 'VALUE', 'revise'); + $wfSelect->set('d', 'CAPTION', i18n("Revise article", "workflow")); + $wfSelect->set('d', 'SELECTED', ''); + $wfSelect->next(); + $bExistOption = true; + } + + if ($bExistOption) + return ($wfSelect->generate($cfg['path']['templates'].$cfg['templates']['generic_select'], true)); + else { + return false; + } +} + +#function for inserting todos in wokflow_art_allocation used, when a workflow is associated with a category in content->category +function setUserSequence ($idartlang, $defaultidworkflow) { + $wfaa = new WorkflowArtAllocations; + $wfaa->select("idartlang = '$idartlang'"); + $idusersequence = 0; + + if ($associatedUserSequence = $wfaa->next()) + { + $idartallocation = $associatedUserSequence->get("idartallocation"); + $wfaa->delete($idartallocation); + } + + if ($defaultidworkflow != -1) { + $newObj = $wfaa->create($idartlang); + + if (!$newObj) + { + /* Try to load */ + $newObj = new WorkflowArtAllocation; + + echo $wfaa->lasterror; + return false; + } + + /* Get the first idusersequence for the new item */ + $workflowItems = new WorkflowItems; + $workflowItems->select("idworkflow = '$defaultidworkflow' AND position = '1'"); + + if ($obj = $workflowItems->next()) + { + $firstitem = $obj->get("idworkflowitem"); + } + + $workflowUserSequences = new WorkflowUserSequences; + $workflowUserSequences->select("idworkflowitem = '$firstitem' AND position = '1'"); + + if ($obj = $workflowUserSequences->next()) + { + $firstIDUserSequence = $obj->get("idusersequence"); + } + + $newObj->set("idusersequence", $firstIDUserSequence); + $newObj->store(); + + $idusersequence = $newObj->get("idusersequence"); + $associatedUserSequence = $newObj; + } +} + +function getCurrentUserSequence ($idartlang, $defaultidworkflow) +{ + $wfaa = new WorkflowArtAllocations; + $wfaa->select("idartlang = '$idartlang'"); + $idusersequence = 0; + + if ($associatedUserSequence = $wfaa->next()) + { + $idusersequence = $associatedUserSequence->get("idusersequence"); + } + + if ($idusersequence == 0) + { + if ($associatedUserSequence != false) + { + $newObj = $associatedUserSequence; + } else { + $newObj = $wfaa->create($idartlang); + + if (!$newObj) + { + /* Try to load */ + $newObj = new WorkflowArtAllocation; + + echo $wfaa->lasterror; + return false; + } + } + + /* Get the first idusersequence for the new item */ + $workflowItems = new WorkflowItems; + $workflowItems->select("idworkflow = '$defaultidworkflow' AND position = '1'"); + + if ($obj = $workflowItems->next()) + { + $firstitem = $obj->get("idworkflowitem"); + } + + $workflowUserSequences = new WorkflowUserSequences; + $workflowUserSequences->select("idworkflowitem = '$firstitem' AND position = '1'"); + + if ($obj = $workflowUserSequences->next()) + { + $firstIDUserSequence = $obj->get("idusersequence"); + } + + $newObj->set("idusersequence", $firstIDUserSequence); + $newObj->store(); + + $idusersequence = $newObj->get("idusersequence"); + $associatedUserSequence = $newObj; + } + + return ($idusersequence); +} + +function getLastWorkflowStatus ($idartlang) +{ + $wfaa = new WorkflowArtAllocations; + + $wfaa->select("idartlang = '$idartlang'"); + + if ($associatedUserSequence = $wfaa->next()) + { + $laststatus = $associatedUserSequence->get("laststatus"); + } else { + return false; + } + + switch ($laststatus) + { + case "reject": + return (i18n("Rejected", "workflow")); + break; + case "revise": + return (i18n("Revised", "workflow")); + break; + case "last": + return (i18n("Last", "workflow")); + break; + case "confirm": + return (i18n("Confirmed", "workflow")); + break; + default: + return (i18n("None", "workflow")); + break; + } + return (""); +} + +function doWorkflowAction ($idartlang, $action) +{ + global $cfg, $idcat; + + switch ($action) + { + case "last": + $artAllocations = new WorkflowArtAllocations; + $artAllocations->select("idartlang = '$idartlang'"); + + if ($obj = $artAllocations->next()) + { + $usersequence = new WorkflowUserSequence; + $usersequence->loadByPrimaryKey($obj->get("idusersequence")); + + $workflowitem = $usersequence->getWorkflowItem(); + + $idworkflow = $workflowitem->get("idworkflow"); + $newpos = $workflowitem->get("position") - 1; + + if ($newpos < 1) + { + $newpos = 1; + } + + $workflowitems = new WorkflowItems; + $workflowitems->select("idworkflow = '$idworkflow' AND position = '".Contenido_Security::escapeDB($newpos, NULL)."'"); + + if ($nextObj = $workflowitems->next()) + { + $userSequences = new WorkflowUserSequences; + $idworkflowitem = $nextObj->get("idworkflowitem"); + $userSequences->select("idworkflowitem = '$idworkflowitem'"); + + if ($nextSeqObj = $userSequences->next()) + { + $obj->set("lastusersequence", $obj->get("idusersequence")); + $obj->set("idusersequence",$nextSeqObj->get("idusersequence")); + $obj->set("laststatus", "last"); + $obj->store(); + } + } + } + break; + case "next": + $artAllocations = new WorkflowArtAllocations; + $artAllocations->select("idartlang = '$idartlang'"); + + if ($obj = $artAllocations->next()) + { + $usersequence = new WorkflowUserSequence; + $usersequence->loadByPrimaryKey($obj->get("idusersequence")); + + $workflowitem = $usersequence->getWorkflowItem(); + + $idworkflow = $workflowitem->get("idworkflow"); + $newpos = $workflowitem->get("position") + 1; + + $workflowitems = new WorkflowItems; + $workflowitems->select("idworkflow = '$idworkflow' AND position = '".Contenido_Security::escapeDB($newpos, NULL)."'"); + + if ($nextObj = $workflowitems->next()) + { + $userSequences = new WorkflowUserSequences; + $idworkflowitem = $nextObj->get("idworkflowitem"); + $userSequences->select("idworkflowitem = '$idworkflowitem'"); + + if ($nextSeqObj = $userSequences->next()) + { + $obj->set("lastusersequence", '10'); + $obj->set("idusersequence",$nextSeqObj->get("idusersequence")); + $obj->set("laststatus", "confirm"); + $obj->store(); + } + } else { + $workflowitems->select("idworkflow = '$idworkflow' AND position = '".Contenido_Security::escapeDB($workflowitem->get("position"), NULL)."'"); + if ($nextObj = $workflowitems->next()) + { + $userSequences = new WorkflowUserSequences; + $idworkflowitem = $nextObj->get("idworkflowitem"); + $userSequences->select("idworkflowitem = '$idworkflowitem'"); + + if ($nextSeqObj = $userSequences->next()) + { + $obj->set("lastusersequence", $obj->get("idusersequence")); + $obj->set("idusersequence",$nextSeqObj->get("idusersequence")); + $obj->set("laststatus", "confirm"); + $obj->store(); + } + } + } + + } + break; + case "reject": + $artAllocations = new WorkflowArtAllocations; + $artAllocations->select("idartlang = '$idartlang'"); + + if ($obj = $artAllocations->next()) + { + $usersequence = new WorkflowUserSequence; + $usersequence->loadByPrimaryKey($obj->get("idusersequence")); + + $workflowitem = $usersequence->getWorkflowItem(); + + $idworkflow = $workflowitem->get("idworkflow"); + $newpos = 1; + + $workflowitems = new WorkflowItems; + $workflowitems->select("idworkflow = '$idworkflow' AND position = '".Contenido_Security::escapeDB($newpos, NULL)."'"); + + if ($nextObj = $workflowitems->next()) + { + $userSequences = new WorkflowUserSequences; + $idworkflowitem = $nextObj->get("idworkflowitem"); + $userSequences->select("idworkflowitem = '$idworkflowitem'"); + + if ($nextSeqObj = $userSequences->next()) + { + $obj->set("lastusersequence", $obj->get("idusersequence")); + $obj->set("idusersequence",$nextSeqObj->get("idusersequence")); + $obj->set("laststatus", "reject"); + $obj->store(); + } + } + } + break; + + case "revise": + $db = new DB_ConLite; + $sql = "SELECT idart, idlang FROM ".$cfg["tab"]["art_lang"] ." WHERE idartlang = '".Contenido_Security::escapeDB($idartlang, $db)."'"; + $db->query($sql); + $db->next_record(); + $idart = $db->f("idart"); + $idlang = $db->f("idlang"); + + $newidart = conCopyArticle($idart,$idcat, "foo"); + + break; + default: + } +} + +function getWorkflowForUserSequence ($usersequence) +{ + $usersequences = new WorkflowUserSequences; + $workflowitems = new WorkflowItems; + $usersequences->select("idusersequence = '$usersequence'"); + + if ($obj = $usersequences->next()) + { + $idworkflowitem = $obj->get("idworkflowitem"); + } else { + return false; + } + + $workflowitems->select("idworkflowitem = '$idworkflowitem'"); + if ($obj = $workflowitems->next()) + { + return $obj->get("idworkflow"); + } else { + return false; + } +} + +function workflowSelect ($listid, $default, $idcat) +{ + global $idclient, $cfg, $frame, $area, $workflowworkflows, $client, $lang, $wfcache, $workflowSelectBox; + + $oSelectBox = new cHTMLSelectElement('workflow'); + $oSelectBox = $workflowSelectBox; + + $default = (int) $default; + $workflowSelectBox->updateAttributes(array("id" => "wfselect" . $idcat)); + $workflowSelectBox->updateAttributes(array("name" => "wfselect" . $idcat)); + $workflowSelectBox->setDefault($default); + + $sButton =''; + + return $workflowSelectBox->render().$sButton; +} + +function workflowInherit ($idcat) +{ + global $idclient, $cfg, $frame, $area, $workflowworkflows, $sess; + $sUrl = $sess->url("main.php?area=$area&frame=$frame&modidcat=$idcat&action=workflow_inherit_down"); + $sButton =''; + return $sButton; +} + +?> \ No newline at end of file diff --git a/includes/include.workflow_edit.php b/includes/include.workflow_edit.php new file mode 100644 index 0000000..7d7e424 --- /dev/null +++ b/includes/include.workflow_edit.php @@ -0,0 +1,109 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-05-20 + * + * $Id: include.workflow_edit.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +plugin_include('workflow', 'classes/class.workflow.php'); + +$form = new UI_Table_Form("workflow_edit"); +$userclass = new User; +$workflows = new Workflows; + +$workflow = $workflows->loadItem($idworkflow); + +if ($action == "workflow_save") +{ + if ($idworkflow == "-1") + { + $workflow = $workflows->create(); + } + + $workflow->set("name",clHtmlSpecialChars($wfname)); + $workflow->set("description",clHtmlSpecialChars($wfdescription)); + $idworkflow = $workflow->get("idworkflow"); + $workflow->store(); +} + +if ((int) $idworkflow == 0) { + $idworkflow = $_GET['idworkflow']; +} + +if ($idworkflow) { + $sReloadScript = ""; +} else { + $sReloadScript = ''; +} + + +//function formGenerateField ($type, $name, $initvalue, $width, $maxlen) +$form->setVar("area",$area); +$form->setVar("action","workflow_save"); +$form->setVar("idworkflow", $idworkflow); +$form->setVar("frame", $frame); + +if ($workflow->virgin) +{ + $name = i18n("New Workflow", "workflow"); + $header = i18n("Create new workflow", "workflow"); +} else { + $header = i18n("Edit workflow", "workflow"); + $description = $workflow->get("description"); + $name = $workflow->get("name"); + $created = $workflow->get("created"); + $author = $userclass->getRealname($workflow->get("idauthor")); +} + +$form->addHeader($header); +$form->add(i18n("Workflow name", "workflow"),formGenerateField("text","wfname",$name,40,255)); +$form->add(i18n("Description", "workflow"),formGenerateField("textbox","wfdescription",$description,50,10)); +$form->add(i18n("Author", "workflow"),$author); +$form->add(i18n("Created", "workflow"),$created); + +$page = new UI_Page; +$page->setContent($form->render(true)); +$page->addScript('reload', $sReloadScript); + +$page->render(); + + +?> \ No newline at end of file diff --git a/includes/include.workflow_left_top.php b/includes/include.workflow_left_top.php new file mode 100644 index 0000000..7218630 --- /dev/null +++ b/includes/include.workflow_left_top.php @@ -0,0 +1,48 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-18 + * + * $Id: include.workflow_left_top.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$create = new Link; +$create->setMultiLink("workflow","","workflow_common","workflow_create"); +//$create->setCLink("workflow_common",4,"workflow_create"); +$create->setContent(i18n("Create workflow", "workflow")); +$create->setCustom("idworkflow","-1"); + +$aAttributes = array(); +$aAttributes['class'] = "addfunction"; +$create->updateAttributes($aAttributes); + +$ui = new UI_Left_Top; +$ui->setLink($create); +$ui->render(); + +?> \ No newline at end of file diff --git a/includes/include.workflow_list.php b/includes/include.workflow_list.php new file mode 100644 index 0000000..a601725 --- /dev/null +++ b/includes/include.workflow_list.php @@ -0,0 +1,129 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2006-01-13 + * + * $Id: include.workflow_list.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +$iIdMarked = (int) $_GET['idworkflow']; + +plugin_include('workflow', 'classes/class.workflow.php'); + +$workflows = new Workflows; +$sScript = ''; +if ($action == "workflow_delete") +{ + $workflows->delete($idworkflow); + $sScript = ''; +} + +$ui = new UI_Menu; +$workflows->select("idclient = '$client' AND idlang = '$lang'"); + +while ($workflow = $workflows->next()) +{ + $wfid = $workflow->getField("idworkflow"); + $wfname = $workflow->getField("name"); + $wfdescription = $workflow->getField("description"); + + /* Create the link to show/edit the workflow */ + $link = new Link; + $link->setMultiLink("workflow","","workflow_common","workflow_show"); + $link->setAlt($wfdescription); + $link->setCustom("idworkflow",$wfid); + + $delTitle = i18n("Delete workflow", "workflow"); + $delDescr = sprintf(i18n("Do you really want to delete the following workflow:

%s
", "workflow"),$wfname); + $delete = ''.$delTitle.''; + + $ui->setTitle($wfid, $wfname); + $ui->setLink($wfid, $link); + + $ui->setActions($wfid, 'delete', $delete); + + if ($wfid == $iIdMarked) { + $ui->setExtra ($wfid, 'id="marked" '); + } + +} +$content = $ui->render(false); + +$delScript = ' + '; + +$sInitRowMark = ""; + +$msgboxInclude = ' '; +$page = new UI_Page; +$page->addScript('include', $msgboxInclude); +$page->addScript('del',$delScript); +$page->addScript('refresh', $sScript); +$page->setMargin(0); +$page->setContent($content.$sInitRowMark); +$page->render(); + +?> \ No newline at end of file diff --git a/includes/include.workflow_steps.php b/includes/include.workflow_steps.php new file mode 100644 index 0000000..32d43c1 --- /dev/null +++ b/includes/include.workflow_steps.php @@ -0,0 +1,405 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * @modified 2008-12-05 Andreas Lindner, make select box values for time unit selection language independent + + * {@internal + * created + * + * $Id: include.workflow_steps.php 128 2019-07-03 11:58:28Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +plugin_include('workflow', 'classes/class.workflow.php'); +plugin_include('workflow', 'includes/functions.workflow.php'); +cInclude("includes", "functions.encoding.php"); + +$iIdMarked = (int) $_GET['idworkflowitem']; + +$availableWorkflowActions= WorkflowActions :: getAvailableWorkflowActions(); + +$sCurrentEncoding = getEncodingByLanguage ($db, $lang, $cfg); + +if (clHtmlEntities($adduser, ENT_COMPAT, $sCurrentEncoding) == i18n("Add User", "workflow")) { + $action= "workflow_create_user"; +} + +/* Function: Move step up */ +if ($action == "workflow_step_up") { + $workflowitems= new WorkflowItems; + $workflowitems->swap($idworkflow, $position, $position -1); +} + +/* Function: Move step down */ +if ($action == "workflow_step_down") { + $workflowitems= new WorkflowItems; + $workflowitems->swap($idworkflow, $position, $position +1); +} + +/* Function: Move user up */ +if ($action == "workflow_user_up") { + $workflowitems= new WorkflowUserSequences; + $workflowitems->swap($idworkflowitem, $position, $position -1); +} + +/* Function: Move step down */ +if ($action == "workflow_user_down") { + $workflowitems= new WorkflowUserSequences; + $workflowitems->swap($idworkflowitem, $position, $position +1); +} + +/* Function: Create new step */ +if ($action == "workflow_create_step") { + $workflowitems= new WorkflowItems; + $item= $workflowitems->create($idworkflow); + $item->set("name", i18n("New Workflow Step", "workflow")); + $item->store(); + $idworkflowitem= $item->get("idworkflowitem"); +} + +/* Function: Delete step */ +if ($action == "workflow_step_delete") { + $workflowitems= new WorkflowItems; + $workflowitems->delete($idworkflowitem); +} + +/* Function: Add user */ +if ($action == "workflow_create_user") { + $workflowusers= new WorkflowUserSequences; + $new= $workflowusers->create($idworkflowitem); +} + +/* Function: Remove user */ +if ($action == "workflow_user_delete") { + $workflowusers= new WorkflowUserSequences; + $workflowusers->delete($idusersequence); +} + +/* Function: Save step */ +if ($action == "workflow_save_step" || $action == "workflow_create_user") { + $workflowactions= new WorkflowActions; + + foreach ($availableWorkflowActions as $key => $value) { + if ($wfactions[$key] == 1) { + $workflowactions->set($idworkflowitem, $key); + } else { + $workflowactions->remove($idworkflowitem, $key); + } + } + + $workflowitem= new WorkflowItem; + $workflowitem->loadByPrimaryKey($idworkflowitem); + $workflowitem->setField('idtask', $wftaskselect); + $workflowitem->setField('name', $wfstepname); + $workflowitem->setField('description', $wfstepdescription); + $workflowitem->store(); + + $usersequences= new WorkflowUserSequences; + $usersequences->select("idworkflowitem = '$idworkflowitem'"); + + while ($usersequence= $usersequences->next()) { + $wftime= "time" . $usersequence->get("idusersequence"); + $wfuser= "user" . $usersequence->get("idusersequence"); + + $wftimelimit= "wftimelimit" . $usersequence->get("idusersequence"); + $usersequence->set("timeunit", $$wftime); + $usersequence->set("iduser", $$wfuser); + $usersequence->set("timelimit", $$wftimelimit); + $usersequence->set("emailnoti", $wfemailnoti[$usersequence->get("idusersequence")]); + $usersequence->set("escalationnoti", $wfescalnoti[$usersequence->get("idusersequence")]); + $usersequence->store(); + + } +} + +function getTimeUnitSelector($listid, $default) { + global $idclient, $cfg, $auth; + + $timeunits = array (); + $timeunits['Seconds'] = i18n("Seconds", "workflow"); + $timeunits['Minutes'] = i18n("Minutes", "workflow"); + $timeunits['Hours'] = i18n("Hours", "workflow"); + $timeunits['Days'] = i18n("Days", "workflow"); + $timeunits['Weeks'] = i18n("Weeks", "workflow"); + $timeunits['Months'] = i18n("Months", "workflow"); + $timeunits['Years'] = i18n("Years", "workflow"); + + $tpl2= new Template; + $tpl2->set('s', 'NAME', 'time' . $listid); + $tpl2->set('s', 'CLASS', 'text_small'); + $tpl2->set('s', 'OPTIONS', 'size=1'); + + foreach ($timeunits as $key => $value) { + + $tpl2->set('d', 'VALUE', $key); + $tpl2->set('d', 'CAPTION', $value); + + if ($default == $key) { + $tpl2->set('d', 'SELECTED', 'SELECTED'); + } else { + $tpl2->set('d', 'SELECTED', ''); + } + + $tpl2->next(); + } + + return $tpl2->generate($cfg['path']['templates'] . $cfg['templates']['generic_select'], true); + +} + +function getWorkflowList() { + global $idworkflow, $cfg; + + $ui= new UI_Menu; + $workflowitems= new WorkflowItems; + + $workflowitems->select("idworkflow = '$idworkflow'", "", "position ASC"); + + while ($workflowitem= $workflowitems->next()) { + $pos= $workflowitem->get("position"); + $name= $workflowitem->get("name"); + $id= $workflowitem->get("idworkflowitem"); + + $edititem= new Link; + $edititem->setCLink("workflow_steps", 4, "workflow_step_edit"); + $edititem->setCustom("idworkflowitem", $id); + $edititem->setCustom("idworkflow", $idworkflow); + + + $moveup= new Link; + $moveup->setCLink("workflow_steps", 4, "workflow_step_up"); + $moveup->setCustom("idworkflowitem", $id); + $moveup->setCustom("idworkflow", $idworkflow); + $moveup->setCustom("position", $pos); + $moveup->setAlt(i18n("Move step up", "workflow")); + $moveup->setContent(''); + + $movedown= new Link; + $movedown->setCLink("workflow_steps", 4, "workflow_step_down"); + $movedown->setCustom("idworkflowitem", $id); + $movedown->setCustom("idworkflow", $idworkflow); + $movedown->setCustom("position", $pos); + $movedown->setAlt(i18n("Move step down", "workflow")); + $movedown->setContent(''); + + + + $deletestep= new Link; + $deletestep->setCLink("workflow_steps", 4, "workflow_step_delete"); + $deletestep->setCustom("idworkflowitem", $id); + $deletestep->setCustom("idworkflow", $idworkflow); + $deletestep->setCustom("position", $pos); + $deletestep->setAlt(i18n("Delete step", "workflow")); + $deletestep->setContent(''); + + $ui->setTitle($id, "$pos. $name"); + $ui->setLink($id, $edititem); + + if ($pos > 1) { + $ui->setActions($id, "moveup", $moveup->render()); + } else { + $ui->setActions($id, "moveup", ''); + } + + if ($pos < $workflowitems->count()) { + $ui->setActions($id, "movedown", $movedown->render()); + } else { + $ui->setActions($id, "movedown", ''); + } + + $ui->setActions($id, "delete", $deletestep->render()); + + if ($_GET['idworkflowitem'] == $id) { + $ui->setExtra ($id, 'id="marked" '); + } + } + + + $content= $ui->render(false); + + return ($content); +} + +function createNewWorkflow() { + global $idworkflow, $cfg; + $content= ""; + $ui= new UI_Menu; + $rowmark = false; + + $createstep= new Link; + $createstep->setCLink("workflow_steps", 4, "workflow_create_step"); + $createstep->setCustom("idworkflow", $idworkflow); + + #$ui->setLink("spacer", NULL); + $ui->setTitle("create", i18n("Create new step", "workflow")); + $ui->setImage("create", $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_step_new.gif"); + $ui->setLink("create", $createstep); + $ui->setRowmark ($rowmark); + $ui->setBgColor("create", $cfg['color']['table_header']); + + $content= $ui->render(false); + return $content; + +} + +function editWorkflowStep($idworkflowitem) { + global $area, $idworkflow, $idworkflowitem, $frame, $availableWorkflowActions; + global $notification; + $workflowitem= new WorkflowItem; + + if ($workflowitem->loadByPrimaryKey($idworkflowitem) == false) { + return " "; + } + + $workflowactions= new WorkflowActions; + + $stepname= $workflowitem->get("name"); + $stepdescription= $workflowitem->get("description"); + $id= $workflowitem->get("idworkflowitem"); + $task= $workflowitem->get("idtask"); + + $form= new UI_Table_Form("workflow_edit"); + + $form->setVar("area", $area); + $form->setVar("action", "workflow_save_step"); + $form->setVar("idworkflow", $idworkflow); + $form->setVar("idworkflowitem", $idworkflowitem); + $form->setVar("frame", $frame); + + $form->addHeader(i18n("Edit workflow step", "workflow")); + $form->add(i18n("Step name", "workflow"), formGenerateField("text", "wfstepname", $stepname, 40, 255)); + $form->add(i18n("Step description", "workflow"), formGenerateField("textbox", "wfstepdescription", $stepdescription, 60, 10)); + + foreach ($availableWorkflowActions as $key => $value) { + $actions .= formGenerateCheckbox("wfactions[" . $key . "]", "1", $workflowactions->get($id, $key)) . '' . "
"; + } + + $form->add(i18n("Actions", "workflow"), $actions); + $form->add(i18n("Assigned users", "workflow"), getWorkflowUsers($idworkflowitem)); + + return $form->render(true); +} + +function getWorkflowUsers($idworkflowitem) { + global $idworkflow, $cfg; + + $ui= new UI_Menu; + $workflowusers= new WorkflowUserSequences; + + $workflowusers->select("idworkflowitem = '$idworkflowitem'", "", "position ASC"); + + while ($workflowitem= $workflowusers->next()) { + $pos= $workflowitem->get("position"); + $iduser= $workflowitem->get("iduser"); + $timelimit= $workflowitem->get("timelimit"); + $timeunit= $workflowitem->get("timeunit"); + $email= $workflowitem->get("emailnoti"); + $escalation= $workflowitem->get("escalationnoti"); + $timeunit= $workflowitem->get("timeunit"); + $id= $workflowitem->get("idusersequence"); + + $moveup= new Link; + $moveup->setCLink("workflow_steps", 4, "workflow_user_up"); + $moveup->setCustom("idworkflowitem", $idworkflowitem); + $moveup->setCustom("idworkflow", $idworkflow); + $moveup->setCustom("position", $pos); + $moveup->setAlt(i18n("Move user up", "workflow")); + #$moveup->setContent(''); + $moveup->setContent(''); + + $movedown= new Link; + $movedown->setCLink("workflow_steps", 4, "workflow_user_down"); + $movedown->setCustom("idworkflowitem", $idworkflowitem); + $movedown->setCustom("idworkflow", $idworkflow); + $movedown->setCustom("position", $pos); + $movedown->setAlt(i18n("Move user down", "workflow")); + $movedown->setContent(''); + + + + $deletestep= new Link; + $deletestep->setCLink("workflow_steps", 4, "workflow_user_delete"); + $deletestep->setCustom("idworkflowitem", $idworkflowitem); + $deletestep->setCustom("idworkflow", $idworkflow); + $deletestep->setCustom("position", $pos); + $deletestep->setCustom("idusersequence", $id); + $deletestep->setAlt(i18n("Delete user", "workflow")); + $deletestep->setContent(''); + + $title= "$pos. " . getUsers($id, $iduser); + $title .= formGenerateField("text", "wftimelimit" . $id, $timelimit, 3, 6); + $title .= getTimeUnitSelector($id, $timeunit); + $altmail= i18n("Notify this user via E-Mail", "workflow"); + $altnoti= i18n("Escalate to this user via E-Mail", "workflow"); + $title .= formGenerateCheckbox("wfemailnoti[" . $id . "]", "1", $email) . ''; + $title .= formGenerateCheckbox("wfescalnoti[" . $id . "]", "1", $escalation) . ''; + + $ui->setTitle($id, $title); + $ui->setLink($id, NULL); + + if ($pos > 1) { + $ui->setActions($id, "moveup", $moveup->render()); + } else { + $ui->setActions($id, "moveup", ''); + } + + if ($pos < $workflowusers->count()) { + $ui->setActions($id, "movedown", $movedown->render()); + } else { + $ui->setActions($id, "movedown", ''); + } + + $ui->setActions($id, "delete", $deletestep->render()); + + $ui->setImage($id, $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_user.gif"); + + } + + $createstep= new Link; + $createstep->setCLink("workflow_steps", 4, "workflow_create_user"); + $createstep->setCustom("idworkflow", $idworkflow); + $createstep->setCustom("idworkflowitem", $idworkflowitem); + + $ui->setLink("spacer", NULL); + + $ui->setTitle("create", ''); + $ui->setLink("create", NULL); + $content= $ui->render(false); + + return ($content); +} + +$tpl= new Template; +$tpl->set('s', 'NEW', createNewWorkflow()); +$tpl->set('s', 'STEPS', getWorkflowList()); +$tpl->set('s', 'EDITSTEP', editWorkflowStep($idworkflowitem)); +$tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]); +$frame= $tpl->generate($cfg["path"]["contenido"] . $cfg["path"]["plugins"] . "workflow/templates/template.workflow_steps.html", true); + +$page= new UI_Page; +$page->setContent($frame); +$page->render(); +?> diff --git a/includes/include.workflow_subnav.php b/includes/include.workflow_subnav.php new file mode 100644 index 0000000..de7e964 --- /dev/null +++ b/includes/include.workflow_subnav.php @@ -0,0 +1,113 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-05-20 + * modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307] + * + * $Id: include.workflow_subnav.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if (!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + + $nav = new Contenido_Navigation; + + $parentarea = getParentAreaID($area); + $sql = "SELECT + idarea + FROM + ".$cfg["tab"]["area"]." AS a + WHERE + a.name = '".Contenido_Security::escapeDB($parentarea, $db)."' OR + a.parent_id = '".Contenido_Security::escapeDB($parentarea, $db)."' + ORDER BY + idarea"; + + $db->query($sql); + + $in_str = ""; + + while ( $db->next_record() ) { + $in_str .= $db->f('idarea') . ','; + } + + $len = strlen($in_str)-1; + $in_str = substr($in_str, 0, $len); + $in_str = '('.$in_str.')'; + + $sql = "SELECT + b.location AS location, + a.name AS name + FROM + ".$cfg["tab"]["area"]." AS a, + ".$cfg["tab"]["nav_sub"]." AS b + WHERE + b.idarea IN ".Contenido_Security::escapeDB($in_str, $db)." AND + b.idarea = a.idarea AND + b.level = 1 + ORDER BY + b.idnavs"; + + $db->query($sql); + + while ( $db->next_record() ) { + + # Extract caption from + # the xml language file + $caption = $nav->getName($db->f("location")); + + $tmp_area = $db->f("name"); + + # Set template data + $tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt); + $tpl->set("d", "CLASS", ''); + $tpl->set("d", "OPTIONS", ''); + $tpl->set("d", "CAPTION", ''.$caption.''); + if ($area == $tmp_area) + { + $tpl->set('s', 'DEFAULT', markSubMenuItem($tpl->dyn_cnt,true)); + } + $tpl->next(); + + } + + $tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2); + $tpl->set('s', 'IDCAT', $idcat); + $tpl->set('s', 'SESSID', $sess->id); + $tpl->set('s', 'CLIENT', $client); + $tpl->set('s', 'LANG', $lang); + + + # Generate the third + # navigation layer + if ($idworkflow <= 0) + { + $tpl->generate($cfg["path"]["templates"].$cfg["templates"]["subnav_blank"]); + } else { + $tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]); + } + + +?> diff --git a/includes/include.workflow_tasks.php b/includes/include.workflow_tasks.php new file mode 100644 index 0000000..0c524f8 --- /dev/null +++ b/includes/include.workflow_tasks.php @@ -0,0 +1,274 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * + * {@internal + * created 2003-07-30 + * + * $Id: include.workflow_tasks.php 128 2019-07-03 11:58:28Z oldperl $ + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + + +plugin_include('workflow', 'classes/class.workflow.php'); +plugin_include('workflow', 'includes/functions.workflow.php'); + +global $sess; +$sSession = $sess->id; + +$wfa = new WorkflowArtAllocations; +$wfu = new WorkflowUserSequences; +$users = new User; +$db2 = new DB_ConLite; + +ob_start(); + +if ($usershow == "") +{ + $usershow = $auth->auth["uid"]; +} + +if (!$perm->have_perm_area_action($area, "workflow_task_user_select")) +{ + $usershow = $auth->auth["uid"]; +} + +if ($action == "workflow_do_action") +{ + $selectedAction = "wfselect".$modidartlang; + doWorkflowAction($modidartlang, $GLOBALS[$selectedAction]); +} + +$wfa->select(); + +while ($wfaitem = $wfa->next()) +{ + $wfaid = $wfaitem->get("idartallocation"); + $usersequence[$wfaid] = $wfaitem->get("idusersequence"); + $lastusersequence[$wfaid] = $wfaitem->get("lastusersequence"); + $article[$wfaid] = $wfaitem->get("idartlang"); +} + + +if (is_array($usersequence)) +{ +foreach ($usersequence as $key => $value) +{ + $wfu->select("idusersequence = '$value'"); + if ($obj = $wfu->next()) + { + $userids[$key] = $obj->get("iduser"); + } +} +} + +if (is_array($userids)) +{ +foreach ($userids as $key=>$value) +{ + $isCurrent[$key] = false; + + if ($usershow == $value) + { + $isCurrent[$key] = true; + } + + if ($users->loadUserByUserID($value) == false) + { + /* Yes, it's a group. Let's try to load the group members! */ + $sql = "SELECT user_id FROM " + .$cfg["tab"]["groupmembers"]." + WHERE group_id = '".$value."'"; + $db2->query(Contenido_Security::escapeDB($sql, $db2)); + + while ($db2->next_record()) + { + if ($db2->f("user_id") == $usershow) + { + $isCurrent[$key] = true; + } + } + } else { + if ($value == $usershow) + { + $isCurrent[$key] = true; + } + } + + if ($lastusersequence[$key] == $usersequence[$key]) + { + $isCurrent[$key] = false; + } +} +} + +$tpl->reset(); +$tpl->setEncoding('iso-8859-1'); +$tpl->set('s', 'SESSID', $sSession); +$tpl->set('s', 'SESSNAME', $sess->name); +$iIDCat = 0; +$iIDTpl = 0; + +if ($perm->have_perm_area_action($area, "workflow_task_user_select")) +{ + $form = new UI_Form("showusers", $sess->url("main.php?area=$area&frame=$frame")); + $form->setVar("area",$area); + $form->setEvent("submit", "setUsershow();"); + $form->setVar("frame", $frame); + $form->setVar("action", "workflow_task_user_select"); + $form->add("select",i18n("Show users").": ".getUsers("show",$usershow)); + $form->add("button", ''); + + $tpl->set('s', 'USERSELECT', $form->render(true)); +} else { + $tpl->set('s', 'USERSELECT', ''); +} + +$pageTitle = i18n('Search results').' - '.i18n('Workflow tasks', 'workflow'); +$tpl->set('s', 'PAGE_TITLE', $pageTitle); + +$tpl->set('s', 'TH_START', i18n("Article")); +$tpl->set('s', 'TH_TEMPLATE', i18n("Template")); +$tpl->set('s', 'TH_ACTIONS', i18n("Actions")); +$tpl->set('s', 'TH_TITLE', i18n("Title")); +$tpl->set('s', 'TH_CHANGED', i18n("Changed")); +$tpl->set('s', 'TH_PUBLISHED', i18n("Published")); +$tpl->set('s', 'TH_WORKFLOW_STEP', i18n("Workflow Step", 'workflow')); +$tpl->set('s', 'TH_WORKFLOW_ACTION', i18n("Workflow Action", 'workflow')); +$tpl->set('s', 'TH_WORKFLOW_EDITOR', i18n("Workflow Editor")); +$tpl->set('s', 'TH_LAST_STATUS', i18n("Last status", 'workflow')); + +$currentUserSequence = new WorkflowUserSequence; + +if (is_array($isCurrent)) +{ + +foreach ($isCurrent as $key => $value) +{ + if ($value == true) + { + $idartlang = Contenido_Security::toInteger($article[$key]); + $lang = Contenido_Security::toInteger($lang); + $client = Contenido_Security::toInteger($client); + + $sql = "SELECT B.idcat AS idcat, A.title AS title, A.created AS created, A.lastmodified AS changed, + A.idart as idart, E.name as tpl_name, A.idartlang as idartlang, F.idcatlang as idcatlang, + B.idcatart as idcatart, A.idlang as art_lang, F.startidartlang as startidartlang + FROM (".$cfg["tab"]["art_lang"]." AS A, + ".$cfg["tab"]["cat_art"]." AS B, + ".$cfg["tab"]["art"]." AS C) + LEFT JOIN ".$cfg['tab']['tpl_conf']." as D ON A.idtplcfg = D.idtplcfg + LEFT JOIN ".$cfg['tab']['tpl']." as E ON D.idtpl = E.`idtpl` + LEFT JOIN ".$cfg['tab']['cat_lang']." as F ON B.idcat = F.`idcat` + WHERE A.idartlang = '$idartlang' AND + A.idart = B.idart AND + A.idart = C.idart AND + A.idlang = '$lang' AND + C.idclient = '$client';"; + + $db->query($sql); + + if ($db->next_record()) + { + global $area; + //$area = "con"; + $idcat = $db->f("idcat"); + $idart = $db->f("idart"); + + # create javascript multilink + $tmp_mstr = '%s'; + + $mstr = sprintf($tmp_mstr, 'right_top', + $sess->url("main.php?area=con&frame=3&idcat=$idcat&idtpl=$idtpl"), + 'right_bottom', + $sess->url("main.php?area=con_editart&action=con_edit&frame=4&idcat=$idcat&idtpl=$idtpl&idart=$idart"), + $db->f("title")); + + $laststatus = getLastWorkflowStatus($idartlang); + $username = getGroupOrUserName($userids[$key]); + $actionSelect = piworkflowRenderColumn($idcat, $idart, $db->f('idartlang'), 'wfaction'); + + $currentUserSequence->loadByPrimaryKey($usersequence[$key]); + $workflowItem = $currentUserSequence->getWorkflowItem(); + $step = $workflowItem->get("name"); + $description = $workflowItem->get("description"); + + $sRowId = $db->f('idart').'-'.$db->f('idartlang').'-'.$db->f('idcat').'-'.$db->f('idcatlang').'-'.$db->f('idcatart').'-'.$db->f('art_lang'); + + if( $db->f('startidartlang') == $db->f('idartlang') ) { + $makeStartarticle = "\"{$sFlagTitle}\""; + } else { + $makeStartarticle = "\"{$sFlagTitle}\""; + } + + $todoListeSubject = i18n("Reminder"); + $sReminder = i18n("Set reminder / add to todo list"); + $sReminderHtml = "\"$sReminder\""; + + $templatename = $db->f('tpl_name'); + if (!empty($templatename)) { + $templatename = clHtmlEntities($templatename); + } else { + $templatename = '--- ' . i18n("None") . ' ---'; + } + + if ($i == 0) { + $iIDCat = $db->f("idcat"); + $iIDTpl = $idtpl; + $tpl->set('s', 'FIRST_ROWID', $sRowId); + } + + $tpl->set('d', 'START', $makeStartarticle); + $tpl->set('d', 'TITLE', $mstr); + $tpl->set('d', 'LAST_STATUS', $laststatus); + $tpl->set('d', 'WORKFLOW_EDITOR', $username); + $tpl->set('d', 'WORKFLOW_STEP', $step); + $tpl->set('d', 'WORKFLOW_ACTION', $actionSelect); + $tpl->set('d', 'TEMPLATE', $templatename); + $tpl->set('d', 'BGCOLOR', $cfg['color']['table_dark_offline']); + $tpl->set('d', 'ROWID', $sRowId); + $tpl->set('d', 'ACTIONS', $sReminderHtml); + $tpl->next(); + $i++; + } + } +} +} + +if ($i > 0) { + $tpl->set('s', 'NO_ARTICLES_ROW'); +} else { + $sRow = '' . i18n("No article found.") . ''; + $tpl->set('s', 'NO_ARTICLES_ROW', $sRow); +} + +$sLoadSubnavi = 'parent.parent.frames["right"].frames["right_top"].location.href = \'main.php?area=con&frame=3&idcat=' . $iIDCat . '&idtpl=' . $iIDTpl . '&contenido=' . $sSession . "';"; +$tpl->set('s', 'SUBNAVI', $sLoadSubnavi); + +$frame = ob_get_contents(); +ob_end_clean(); + +$tpl->generate($cfg["path"]['contenido'] . $cfg["path"]["plugins"] . "workflow/templates/template.workflow_tasks.html"); + +?> diff --git a/locale/de_DE/LC_MESSAGES/workflow.mo b/locale/de_DE/LC_MESSAGES/workflow.mo new file mode 100644 index 0000000..c7808d5 Binary files /dev/null and b/locale/de_DE/LC_MESSAGES/workflow.mo differ diff --git a/locale/de_DE/LC_MESSAGES/workflow.po b/locale/de_DE/LC_MESSAGES/workflow.po new file mode 100644 index 0000000..611d4a1 --- /dev/null +++ b/locale/de_DE/LC_MESSAGES/workflow.po @@ -0,0 +1,453 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-18 11:03+0200\n" +"PO-Revision-Date: 2011-05-18 11:17+0100\n" +"Last-Translator: Ortwin Pinke \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Basepath: M:\\Projekte_Persoenlich\\timo.hummel\\plugin_sources\\\n" +"X-Poedit-KeywordsList: i18n\n" +"X-Poedit-SearchPath-0: workflow\n" + +#: includes/config.plugin.php:40 +#: includes/include.workflow_list.php:71 +msgid "Delete workflow" +msgstr "Workflow löschen" + +#: includes/config.plugin.php:41 +msgid "Select workflow task" +msgstr "Workflow-Aufgabe auswählen" + +#: includes/config.plugin.php:42 +msgid "Show workflow" +msgstr "Workflow zeigen" + +#: includes/config.plugin.php:43 +#: includes/include.workflow_left_top.php:37 +msgid "Create workflow" +msgstr "Neuer Workflow" + +#: includes/config.plugin.php:44 +#: includes/include.workflow_edit.php:89 +msgid "Edit workflow" +msgstr "Workflow bearbeiten" + +#: includes/config.plugin.php:45 +msgid "Process workflow step" +msgstr "Workflow Schritt durchführen" + +#: includes/config.plugin.php:46 +#: includes/config.plugin.php:47 +#: includes/config.plugin.php:178 +msgid "Inherit workflow down" +msgstr "Workflow nach unten vererben" + +#: includes/config.plugin.php:48 +#: includes/include.workflow_steps.php:292 +msgid "Edit workflow step" +msgstr "Workflow Schritt bearbeiten" + +#: includes/config.plugin.php:49 +msgid "Move workflowstep up" +msgstr "Workflowschritt nach oben verschieben" + +#: includes/config.plugin.php:50 +msgid "Move workflowstep down" +msgstr "Workflowschritt nach unten verschieben" + +#: includes/config.plugin.php:51 +msgid "Save Workflowstep" +msgstr "Workflowschritt speichen" + +#: includes/config.plugin.php:52 +msgid "Create workflowstep" +msgstr "Workflowschritt erstellen" + +#: includes/config.plugin.php:53 +msgid "Delete workflowstep" +msgstr "Workflowschritt löschen" + +#: includes/config.plugin.php:54 +msgid "Move workflowstepuser up" +msgstr "Workflowschrittbenutzer nach oben verschieben" + +#: includes/config.plugin.php:55 +msgid "Move workflowstepuser down" +msgstr "Workflowschrittbenutzer nach unten verschieben" + +#: includes/config.plugin.php:56 +msgid "Create Workflowstepuser" +msgstr "Workflowschrittbenutzer erstellen" + +#: includes/config.plugin.php:57 +msgid "Delete Workflowstepuser" +msgstr "Workflowschrittbenutzer löschen" + +#: includes/config.plugin.php:58 +msgid "Associate workflow with category" +msgstr "Workflow zu Kategorien zuweisen" + +#: includes/config.plugin.php:165 +#: includes/config.plugin.php:421 +#: includes/config.plugin.php:427 +#: includes/include.workflow_tasks.php:233 +#: includes/functions.workflow.php:54 +#: includes/functions.workflow.php:356 +msgid "None" +msgstr "Kein" + +#: includes/config.plugin.php:197 +msgid "Workflow" +msgstr "Workflow" + +#: includes/config.plugin.php:300 +#: includes/include.workflow_tasks.php:157 +msgid "Workflow Step" +msgstr "Workflow Schritt" + +#: includes/config.plugin.php:301 +#: includes/include.workflow_tasks.php:158 +msgid "Workflow Action" +msgstr "Workflow Aktion" + +#: includes/config.plugin.php:302 +#: includes/include.workflow_tasks.php:159 +msgid "Workflow Editor" +msgstr "Workflow Bearbeiter" + +#: includes/config.plugin.php:303 +#: includes/include.workflow_tasks.php:160 +msgid "Last status" +msgstr "Letzter Status" + +#: includes/include.workflow_tasks.php:140 +msgid "Show users" +msgstr "Zeige Benutzer" + +#: includes/include.workflow_tasks.php:148 +msgid "Search results" +msgstr "Suchergebnis" + +#: includes/include.workflow_tasks.php:148 +msgid "Workflow tasks" +msgstr "Workflow Aufgaben" + +#: includes/include.workflow_tasks.php:151 +msgid "Article" +msgstr "Artikel" + +#: includes/include.workflow_tasks.php:152 +msgid "Template" +msgstr "Template" + +#: includes/include.workflow_tasks.php:153 +#: includes/include.workflow_steps.php:300 +msgid "Actions" +msgstr "Aktionen" + +#: includes/include.workflow_tasks.php:154 +msgid "Title" +msgstr "Titel" + +#: includes/include.workflow_tasks.php:155 +msgid "Changed" +msgstr "Geändert" + +#: includes/include.workflow_tasks.php:156 +msgid "Published" +msgstr "Veröffentlichen" + +#: includes/include.workflow_tasks.php:225 +msgid "Reminder" +msgstr "Wiedervorlage" + +#: includes/include.workflow_tasks.php:226 +msgid "Set reminder / add to todo list" +msgstr "Wiedervorlage / zur Todoliste hinzuf&uegen" + +#: includes/include.workflow_tasks.php:262 +#, fuzzy +msgid "No article found." +msgstr "Kein Artikel gefunden" + +#: includes/include.workflow_edit.php:86 +msgid "New Workflow" +msgstr "Neuer Workflow" + +#: includes/include.workflow_edit.php:87 +msgid "Create new workflow" +msgstr "Neuer Workflow erzeugen" + +#: includes/include.workflow_edit.php:97 +msgid "Workflow name" +msgstr "Workflow Name" + +#: includes/include.workflow_edit.php:98 +msgid "Description" +msgstr "Beschreibung" + +#: includes/include.workflow_edit.php:99 +msgid "Author" +msgstr "Autor" + +#: includes/include.workflow_edit.php:100 +msgid "Created" +msgstr "Erstellt" + +#: includes/include.workflow_list.php:72 +#, php-format +msgid "Do you really want to delete the following workflow:

%s
" +msgstr "Wollen Sie wirklich den folgenden Workflow löschen:

%s
" + +#: includes/include.workflow_steps.php:46 +#: includes/include.workflow_steps.php:388 +msgid "Add User" +msgstr "Benutzer hinzufügen" + +#: includes/include.workflow_steps.php:78 +msgid "New Workflow Step" +msgstr "Neuer Workflow Schritt" + +#: includes/include.workflow_steps.php:142 +msgid "Seconds" +msgstr "Sekunden" + +#: includes/include.workflow_steps.php:143 +msgid "Minutes" +msgstr "Minuten" + +#: includes/include.workflow_steps.php:144 +msgid "Hours" +msgstr "Stunden" + +#: includes/include.workflow_steps.php:145 +msgid "Days" +msgstr "Tage" + +#: includes/include.workflow_steps.php:146 +msgid "Weeks" +msgstr "Wochen" + +#: includes/include.workflow_steps.php:147 +msgid "Months" +msgstr "Monate" + +#: includes/include.workflow_steps.php:148 +msgid "Years" +msgstr "Jahre" + +#: includes/include.workflow_steps.php:197 +msgid "Move step up" +msgstr "Schritt nach oben bewegen" + +#: includes/include.workflow_steps.php:205 +msgid "Move step down" +msgstr "Schritt nach unten verschieben" + +#: includes/include.workflow_steps.php:215 +msgid "Delete step" +msgstr "Schritt löschen" + +#: includes/include.workflow_steps.php:257 +msgid "Create new step" +msgstr "Neuen Schritt erzeugen" + +#: includes/include.workflow_steps.php:293 +msgid "Step name" +msgstr "Name des Schritts" + +#: includes/include.workflow_steps.php:294 +msgid "Step description" +msgstr "Beschreibung des Schritts" + +#: includes/include.workflow_steps.php:301 +msgid "Assigned users" +msgstr "Zugeordnete Benutzer" + +#: includes/include.workflow_steps.php:329 +msgid "Move user up" +msgstr "Benutzer nach oben verschieben" + +#: includes/include.workflow_steps.php:338 +msgid "Move user down" +msgstr "Benutzer nach unten verschieben" + +#: includes/include.workflow_steps.php:349 +msgid "Delete user" +msgstr "Benutzer löschen" + +#: includes/include.workflow_steps.php:355 +msgid "Notify this user via E-Mail" +msgstr "Diesen Benutzer per e-Mail benachrichtigen" + +#: includes/include.workflow_steps.php:356 +msgid "Escalate to this user via E-Mail" +msgstr "An diesen Benutzer per e-Mail eskalieren" + +#: includes/functions.workflow.php:183 +msgid "Confirm" +msgstr "Bestätigen" + +#: includes/functions.workflow.php:192 +msgid "Back to last editor" +msgstr "Zurück zum letzten Bearbeiter" + +#: includes/functions.workflow.php:201 +#: classes/class.workflowactions.php:77 +msgid "Reject article" +msgstr "Artikel ablehnen" + +#: includes/functions.workflow.php:210 +#: classes/class.workflowactions.php:81 +msgid "Revise article" +msgstr "Artikel überarbeiten" + +#: includes/functions.workflow.php:344 +msgid "Rejected" +msgstr "Abgelehnt" + +#: includes/functions.workflow.php:347 +msgid "Revised" +msgstr "überarbeitet" + +#: includes/functions.workflow.php:350 +msgid "Last" +msgstr "Letzter" + +#: includes/functions.workflow.php:353 +msgid "Confirmed" +msgstr "Bestätigt" + +#: classes/class.workflowartallocation.php:72 +msgid "Article doesn't exist" +msgstr "Artikel existiert nicht." + +#: classes/class.workflowartallocation.php:80 +msgid "Article is already assigned to a usersequence step." +msgstr "Artikel ist bereits Benutzerschritt zugeordnet." + +#: classes/class.workflowartallocation.php:286 +#: classes/class.workflowartallocation.php:295 +msgid "Workflow notification" +msgstr "Workflow Notifikation" + +#: classes/class.workflowartallocation.php:336 +#: classes/class.workflowartallocation.php:346 +msgid "Workflow escalation" +msgstr "Workflow Steigerung" + +#: classes/class.workflowallocation.php:117 +#: classes/class.workflowallocation.php:223 +msgid "Category already has a workflow assigned" +msgstr "Kategorie ist bereits Workflow zugeordnet" + +#: classes/class.workflowallocation.php:126 +#: classes/class.workflowallocation.php:199 +#: classes/class.workflowitems.php:299 +msgid "Workflow doesn't exist" +msgstr "Workflow existiert nicht" + +#: classes/class.workflowallocation.php:233 +msgid "Category doesn't exist, assignment failed" +msgstr "Kategorie existiert nicht, Zuordnung fehlgeschlagen" + +#: classes/class.workflowitems.php:133 +#: classes/class.workflowitems.php:142 +#: classes/class.workflowusersequence.php:139 +#: classes/class.workflowusersequence.php:148 +msgid "Swapping items failed: Item doesn't exist" +msgstr "Tausch der Einträge fehlgeschlagen: Eintrag nicht vorhanden" + +#: classes/class.workflowitems.php:169 +msgid "Can't add item to workflow: Workflow doesn't exist" +msgstr "Zuordnung des Eintrags zum Workflow nicht möglich: Workflow existiert nicht" + +#: classes/class.workflowitems.php:251 +msgid "No item loaded" +msgstr "Kein Eintrag geladen" + +#: classes/class.workflowitems.php:276 +msgid "Requested task doesn't exist, can't assign" +msgstr "Gewünschte Aufgabe existiert nicht, Zuordnung nicht möglich" + +#: classes/class.workflowitems.php:307 +msgid "Position in this workflow already exists." +msgstr "Position existiert bereits in diesem Workflow." + +#: classes/class.workflowactions.php:74 +msgid "Publish article" +msgstr "Artikel veröffentlichen" + +#: classes/class.workflowactions.php:75 +msgid "Lock article" +msgstr "Artikel sperren" + +#: classes/class.workflowactions.php:76 +msgid "Move back to last editor" +msgstr "Zurück zum letzten Bearbeiter" + +#: classes/class.workflowactions.php:78 +msgid "Edit article content" +msgstr "Artikelinhalt bearbeiten" + +#: classes/class.workflowactions.php:79 +msgid "Edit article properties" +msgstr "Artikeleigenschaften bearbeiten" + +#: classes/class.workflowactions.php:80 +msgid "Edit template" +msgstr "Template bearbeiten" + +#: classes/class.workflowusersequence.php:112 +msgid "Workflow item doesn't exist. Can't create entry." +msgstr "Workflow existiert nicht. Eintrag kann nicht erstellt werden." + +#: classes/class.workflowusersequence.php:229 +msgid "Can't set user_id: User or group doesn't exist" +msgstr "Kann Benutzer-Id nicht zuweisen: Benutzer oder Gruppe nicht vorhanden" + +#~ msgid "Recently edited articles" +#~ msgstr "Zuletzt bearbeitete Artikel" + +#~ msgid "Change client" +#~ msgstr "Mandanten wechseln" + +#~ msgid "Welcome" +#~ msgstr "Willkommen" + +#~ msgid "You are logged in as" +#~ msgstr "Sie sind angemeldet als" + +#~ msgid "Last login" +#~ msgstr "Letzter Login" + +#~ msgid "Article is online" +#~ msgstr "Artikel ist online" + +#~ msgid "Article is offline" +#~ msgstr "Artikel ist offline" + +#~ msgid "Current workflow tasks" +#~ msgstr "Aktuelle Workflow Aufgaben" + +#~ msgid "Client" +#~ msgstr "Mandant" + +#~ msgid "Language" +#~ msgstr "Sprache" + +#~ msgid "No tasks found" +#~ msgstr "Keine Aufgabe gefunden" + +#~ msgid "Status" +#~ msgstr "Status" + +#~ msgid "Step" +#~ msgstr "Schritt" + +#~ msgid "Assign workflow to category" +#~ msgstr "Workflow einer Kategorie zuordnen" diff --git a/locale/potfiles.txt b/locale/potfiles.txt new file mode 100644 index 0000000..bdb342d --- /dev/null +++ b/locale/potfiles.txt @@ -0,0 +1,18 @@ +./includes/include.workflow_subnav.php +./includes/config.plugin.php +./includes/include.workflow_tasks.php +./includes/include.workflow_edit.php +./includes/include.workflow_left_top.php +./includes/include.workflow_list.php +./includes/include.workflow_steps.php +./includes/functions.workflow.php +./cronjobs/advance_workflow.php +./templates/template.workflow_steps.html +./templates/template.workflow_tasks.html +./classes/class.workflowartallocation.php +./classes/class.workflowallocation.php +./classes/class.workflowitems.php +./classes/class.workflowactions.php +./classes/class.workflowtasks.php +./classes/class.workflowusersequence.php +./classes/class.workflow.php diff --git a/locale/workflow.pot b/locale/workflow.pot new file mode 100644 index 0000000..fee7346 --- /dev/null +++ b/locale/workflow.pot @@ -0,0 +1,398 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-18 11:03+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: includes/config.plugin.php:40 includes/include.workflow_list.php:71 +msgid "Delete workflow" +msgstr "" + +#: includes/config.plugin.php:41 +msgid "Select workflow task" +msgstr "" + +#: includes/config.plugin.php:42 +msgid "Show workflow" +msgstr "" + +#: includes/config.plugin.php:43 includes/include.workflow_left_top.php:37 +msgid "Create workflow" +msgstr "" + +#: includes/config.plugin.php:44 includes/include.workflow_edit.php:89 +msgid "Edit workflow" +msgstr "" + +#: includes/config.plugin.php:45 +msgid "Process workflow step" +msgstr "" + +#: includes/config.plugin.php:46 includes/config.plugin.php:47 +#: includes/config.plugin.php:178 +msgid "Inherit workflow down" +msgstr "" + +#: includes/config.plugin.php:48 includes/include.workflow_steps.php:292 +msgid "Edit workflow step" +msgstr "" + +#: includes/config.plugin.php:49 +msgid "Move workflowstep up" +msgstr "" + +#: includes/config.plugin.php:50 +msgid "Move workflowstep down" +msgstr "" + +#: includes/config.plugin.php:51 +msgid "Save Workflowstep" +msgstr "" + +#: includes/config.plugin.php:52 +msgid "Create workflowstep" +msgstr "" + +#: includes/config.plugin.php:53 +msgid "Delete workflowstep" +msgstr "" + +#: includes/config.plugin.php:54 +msgid "Move workflowstepuser up" +msgstr "" + +#: includes/config.plugin.php:55 +msgid "Move workflowstepuser down" +msgstr "" + +#: includes/config.plugin.php:56 +msgid "Create Workflowstepuser" +msgstr "" + +#: includes/config.plugin.php:57 +msgid "Delete Workflowstepuser" +msgstr "" + +#: includes/config.plugin.php:58 +msgid "Associate workflow with category" +msgstr "" + +#: includes/config.plugin.php:165 includes/config.plugin.php:421 +#: includes/config.plugin.php:427 includes/include.workflow_tasks.php:233 +#: includes/functions.workflow.php:54 includes/functions.workflow.php:356 +msgid "None" +msgstr "" + +#: includes/config.plugin.php:197 +msgid "Workflow" +msgstr "" + +#: includes/config.plugin.php:300 includes/include.workflow_tasks.php:157 +msgid "Workflow Step" +msgstr "" + +#: includes/config.plugin.php:301 includes/include.workflow_tasks.php:158 +msgid "Workflow Action" +msgstr "" + +#: includes/config.plugin.php:302 includes/include.workflow_tasks.php:159 +msgid "Workflow Editor" +msgstr "" + +#: includes/config.plugin.php:303 includes/include.workflow_tasks.php:160 +msgid "Last status" +msgstr "" + +#: includes/include.workflow_tasks.php:140 +msgid "Show users" +msgstr "" + +#: includes/include.workflow_tasks.php:148 +msgid "Search results" +msgstr "" + +#: includes/include.workflow_tasks.php:148 +msgid "Workflow tasks" +msgstr "" + +#: includes/include.workflow_tasks.php:151 +msgid "Article" +msgstr "" + +#: includes/include.workflow_tasks.php:152 +msgid "Template" +msgstr "" + +#: includes/include.workflow_tasks.php:153 +#: includes/include.workflow_steps.php:300 +msgid "Actions" +msgstr "" + +#: includes/include.workflow_tasks.php:154 +msgid "Title" +msgstr "" + +#: includes/include.workflow_tasks.php:155 +msgid "Changed" +msgstr "" + +#: includes/include.workflow_tasks.php:156 +msgid "Published" +msgstr "" + +#: includes/include.workflow_tasks.php:225 +msgid "Reminder" +msgstr "" + +#: includes/include.workflow_tasks.php:226 +msgid "Set reminder / add to todo list" +msgstr "" + +#: includes/include.workflow_tasks.php:262 +msgid "No article found." +msgstr "" + +#: includes/include.workflow_edit.php:86 +msgid "New Workflow" +msgstr "" + +#: includes/include.workflow_edit.php:87 +msgid "Create new workflow" +msgstr "" + +#: includes/include.workflow_edit.php:97 +msgid "Workflow name" +msgstr "" + +#: includes/include.workflow_edit.php:98 +msgid "Description" +msgstr "" + +#: includes/include.workflow_edit.php:99 +msgid "Author" +msgstr "" + +#: includes/include.workflow_edit.php:100 +msgid "Created" +msgstr "" + +#: includes/include.workflow_list.php:72 +#, php-format +msgid "Do you really want to delete the following workflow:

%s
" +msgstr "" + +#: includes/include.workflow_steps.php:46 +#: includes/include.workflow_steps.php:388 +msgid "Add User" +msgstr "" + +#: includes/include.workflow_steps.php:78 +msgid "New Workflow Step" +msgstr "" + +#: includes/include.workflow_steps.php:142 +msgid "Seconds" +msgstr "" + +#: includes/include.workflow_steps.php:143 +msgid "Minutes" +msgstr "" + +#: includes/include.workflow_steps.php:144 +msgid "Hours" +msgstr "" + +#: includes/include.workflow_steps.php:145 +msgid "Days" +msgstr "" + +#: includes/include.workflow_steps.php:146 +msgid "Weeks" +msgstr "" + +#: includes/include.workflow_steps.php:147 +msgid "Months" +msgstr "" + +#: includes/include.workflow_steps.php:148 +msgid "Years" +msgstr "" + +#: includes/include.workflow_steps.php:197 +msgid "Move step up" +msgstr "" + +#: includes/include.workflow_steps.php:205 +msgid "Move step down" +msgstr "" + +#: includes/include.workflow_steps.php:215 +msgid "Delete step" +msgstr "" + +#: includes/include.workflow_steps.php:257 +msgid "Create new step" +msgstr "" + +#: includes/include.workflow_steps.php:293 +msgid "Step name" +msgstr "" + +#: includes/include.workflow_steps.php:294 +msgid "Step description" +msgstr "" + +#: includes/include.workflow_steps.php:301 +msgid "Assigned users" +msgstr "" + +#: includes/include.workflow_steps.php:329 +msgid "Move user up" +msgstr "" + +#: includes/include.workflow_steps.php:338 +msgid "Move user down" +msgstr "" + +#: includes/include.workflow_steps.php:349 +msgid "Delete user" +msgstr "" + +#: includes/include.workflow_steps.php:355 +msgid "Notify this user via E-Mail" +msgstr "" + +#: includes/include.workflow_steps.php:356 +msgid "Escalate to this user via E-Mail" +msgstr "" + +#: includes/functions.workflow.php:183 +msgid "Confirm" +msgstr "" + +#: includes/functions.workflow.php:192 +msgid "Back to last editor" +msgstr "" + +#: includes/functions.workflow.php:201 classes/class.workflowactions.php:77 +msgid "Reject article" +msgstr "" + +#: includes/functions.workflow.php:210 classes/class.workflowactions.php:81 +msgid "Revise article" +msgstr "" + +#: includes/functions.workflow.php:344 +msgid "Rejected" +msgstr "" + +#: includes/functions.workflow.php:347 +msgid "Revised" +msgstr "" + +#: includes/functions.workflow.php:350 +msgid "Last" +msgstr "" + +#: includes/functions.workflow.php:353 +msgid "Confirmed" +msgstr "" + +#: classes/class.workflowartallocation.php:72 +msgid "Article doesn't exist" +msgstr "" + +#: classes/class.workflowartallocation.php:80 +msgid "Article is already assigned to a usersequence step." +msgstr "" + +#: classes/class.workflowartallocation.php:286 +#: classes/class.workflowartallocation.php:295 +msgid "Workflow notification" +msgstr "" + +#: classes/class.workflowartallocation.php:336 +#: classes/class.workflowartallocation.php:346 +msgid "Workflow escalation" +msgstr "" + +#: classes/class.workflowallocation.php:117 +#: classes/class.workflowallocation.php:223 +msgid "Category already has a workflow assigned" +msgstr "" + +#: classes/class.workflowallocation.php:126 +#: classes/class.workflowallocation.php:199 +#: classes/class.workflowitems.php:299 +msgid "Workflow doesn't exist" +msgstr "" + +#: classes/class.workflowallocation.php:233 +msgid "Category doesn't exist, assignment failed" +msgstr "" + +#: classes/class.workflowitems.php:133 classes/class.workflowitems.php:142 +#: classes/class.workflowusersequence.php:139 +#: classes/class.workflowusersequence.php:148 +msgid "Swapping items failed: Item doesn't exist" +msgstr "" + +#: classes/class.workflowitems.php:169 +msgid "Can't add item to workflow: Workflow doesn't exist" +msgstr "" + +#: classes/class.workflowitems.php:251 +msgid "No item loaded" +msgstr "" + +#: classes/class.workflowitems.php:276 +msgid "Requested task doesn't exist, can't assign" +msgstr "" + +#: classes/class.workflowitems.php:307 +msgid "Position in this workflow already exists." +msgstr "" + +#: classes/class.workflowactions.php:74 +msgid "Publish article" +msgstr "" + +#: classes/class.workflowactions.php:75 +msgid "Lock article" +msgstr "" + +#: classes/class.workflowactions.php:76 +msgid "Move back to last editor" +msgstr "" + +#: classes/class.workflowactions.php:78 +msgid "Edit article content" +msgstr "" + +#: classes/class.workflowactions.php:79 +msgid "Edit article properties" +msgstr "" + +#: classes/class.workflowactions.php:80 +msgid "Edit template" +msgstr "" + +#: classes/class.workflowusersequence.php:112 +msgid "Workflow item doesn't exist. Can't create entry." +msgstr "" + +#: classes/class.workflowusersequence.php:229 +msgid "Can't set user_id: User or group doesn't exist" +msgstr "" diff --git a/templates/template.workflow_steps.html b/templates/template.workflow_steps.html new file mode 100644 index 0000000..a064aeb --- /dev/null +++ b/templates/template.workflow_steps.html @@ -0,0 +1,13 @@ +
+{NEW} +
+ +
+ {STEPS} +
+
+ {EDITSTEP} +
+
+ i18n('Warning: Changes will reset active Workflows') +
\ No newline at end of file diff --git a/templates/template.workflow_tasks.html b/templates/template.workflow_tasks.html new file mode 100644 index 0000000..0170f66 --- /dev/null +++ b/templates/template.workflow_tasks.html @@ -0,0 +1,157 @@ + + + + {TITLE} + + + + + + + + + + + + +
+
{USERSELECT}
+ {PAGE_TITLE} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {NO_ARTICLES_ROW} + +
{TH_START}{TH_TITLE}{TH_WORKFLOW_STEP}{TH_WORKFLOW_ACTION}{TH_WORKFLOW_EDITOR}{TH_LAST_STATUS}{TH_TEMPLATE}{TH_ACTIONS}
{START}{TITLE}{WORKFLOW_STEP}{WORKFLOW_ACTION}{WORKFLOW_EDITOR}{LAST_STATUS}{TEMPLATE}{ACTIONS}
+ + + + + diff --git a/xml/lang_de_DE.xml b/xml/lang_de_DE.xml new file mode 100644 index 0000000..05962e4 --- /dev/null +++ b/xml/lang_de_DE.xml @@ -0,0 +1,17 @@ + + + + + + + +
Workflow
+ Workflow-Einstellungen + Schritte +
+
+ +
+ + +
diff --git a/xml/lang_en_EN.xml b/xml/lang_en_EN.xml new file mode 100644 index 0000000..5e4dfc9 --- /dev/null +++ b/xml/lang_en_EN.xml @@ -0,0 +1,17 @@ + + + + + + + +
Workflow
+ Workflow-Properties + Steps +
+
+ +
+ + +
\ No newline at end of file diff --git a/xml/lang_en_US.xml b/xml/lang_en_US.xml new file mode 100644 index 0000000..5590ceb --- /dev/null +++ b/xml/lang_en_US.xml @@ -0,0 +1,17 @@ + + + + + + + +
Workflow
+ Workflow-Properties + Steps +
+
+ +
+ + +