Initial commit

This commit is contained in:
Senad Uka
2018-06-11 11:09:35 +02:00
commit ed7df7b11f
1954 changed files with 483354 additions and 0 deletions

View File

@@ -0,0 +1,180 @@
<?php
/**
*
*/
class ProcessesController{
private $model;
function __construct(){
$this->model = new ProcessesModel();
}
/**
* get info for processes
* @return json process info
*/
public function getProcessInfo() {
echo json_encode($this->model->getProcessInfo());
}
/**
* Get only the processes that match the wanted string
* @return json list of processes
*/
public function searchProcess() {
$nameToSearch = $_REQUEST['name'] ? $_REQUEST['name'] : '';
echo json_encode($this->model->searchProcess($nameToSearch));
}
/**
* add or update links between process and package
* @return json update message
*/
public function linkProcessesToPackage(){
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$selectedProcesses = isset($_REQUEST['selectedProcesses']) ? $_REQUEST['selectedProcesses'] : '';
echo json_encode($this->model->linkProcessesToPackage($idPackage, $selectedProcesses));
}
/**
* returns json response for packages that don't have processes associated
* @return list packages json
*/
public function getPackagesAndProcesses(){
$idCountry = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : 0;
echo json_encode($this->model->getPackagesAndProcesses($idCountry));
}
/**
* get all processes for packages linking including the steps for each process
* @return json list of processes
*/
public function getProcesses(){
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
echo json_encode($this->model->getProcesses($idPackage));
}
/**
* returns confirmation message after adding process step in DB
* @return status message for process step creation
*/
public function addProcessStep() {
$shortDesc = isset($_REQUEST['shortDesc']) ? $_REQUEST['shortDesc'] : '';
$fullDesc = isset($_REQUEST['fullDesc']) ? $_REQUEST['fullDesc'] : '';
$idUserType = isset($_REQUEST['idUserType']) ? $_REQUEST['idUserType'] : 0;
$isStepVisible = isset($_REQUEST['isStepVisible']) ? $_REQUEST['isStepVisible'] : 1;
$extraActionCode = isset($_REQUEST['extraActionCode']) ? $_REQUEST['extraActionCode'] : '';
echo json_encode($this->model->addProcessStep($shortDesc, $fullDesc, $idUserType, $isStepVisible, $extraActionCode));
}
/**
* returns status message after adding process in DB
* @return status message for process creation
*/
public function addProcess() {
$data = isset($_REQUEST['data']) ? $_REQUEST['data'] : [];
$processName = isset($_REQUEST['processName']) ? $_REQUEST['processName'] : '';
$idCountry = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : '';
echo json_encode($this->model->addProcess(json_decode($data), $processName, $idCountry));
}
/**
* get process names and ids for edit
* @return json list of processes
*/
public function getProcessNames(){
echo json_encode($this->model->getProcessNames());
}
/**
* get all steps and steps for process selected
* @return json list of steps
*/
public function getStepsForProcessSelected(){
$idProcess = isset($_REQUEST['idProcess']) ? $_REQUEST['idProcess'] : 0;
echo json_encode($this->model->getStepsForProcessSelected($idProcess));
}
/**
* edit processes
* @return status message
*/
public function editProcess() {
$idProcess = isset($_REQUEST['idProcess']) ? $_REQUEST['idProcess'] : 0;
$processSteps = isset($_REQUEST['data']) ? $_REQUEST['data'] : [];
echo json_encode($this->model->editProcess($idProcess, $processSteps));
}
/**
* returns json response with default process steps
* @return array with existing process steps
*/
public function getProcessSteps() {
$packageId = isset($_REQUEST['packageId']) ? $_REQUEST['packageId'] : 0;
echo json_encode($this->model->getProcessSteps($packageId));
}
/**
* get all possible user types
*/
public function getUserTypes() {
echo json_encode($this->model->getUserTypes());
}
/**
* get all possible extra actions for process steps
*/
public function getExtraActionsAvailable() {
echo json_encode($this->model->getExtraActionsAvailable());
}
/**
* include copy processes template
*/
public function copyProcessesTemplate(){
require_once('templates/CopyProcessesTemplate.php');
}
/**
* include edit processes template
*/
public function editProcessesTemplate(){
require_once('templates/EditProcessesTemplate.php');
}
/**
* include create process template
*/
public function createProcessTemplate() {
require_once('templates/CreateProcessTemplate.php');
}
/**
* include link processes template
*/
public function linkProcessTemplate(){
require_once('templates/LinkProcessTemplate.php');
}
/**
* include view processes template
*/
public function viewPackageProcessesTemplate(){
require_once('templates/ViewPackageProcessesTemplate.php');
}
/**
* include processes template
*/
public function processesTemplate(){
require_once('templates/ProcessesTemplate.php');
}
/**
* open processes page
*/
public function showPage(){
require_once('ProcessesPage.php');
}
}

View File

@@ -0,0 +1,771 @@
<?php
/**
*
*/
class ProcessesModel{
const ID_PACKAGE_OPTION_TYPE = 2;
function __construct(){
$this->defaultSteps = [1, 2];
}
/**
* Get and format info about processes
* @param - optional string $nameToSearch is the name of the package or process to be searched
* @return array - returns a formatted array with process details
*/
public function getProcessInfo($nameToSearch = '') {
global $database;
$whereClause = '';
$processInfo = [];
if(!empty($nameToSearch)) {
$whereClause = " WHERE
c.name LIKE '%".$database->escapeValue($nameToSearch)."%'
OR proc.name LIKE '%".$database->escapeValue($nameToSearch)."%' ";
}
$sql = "SELECT
proc.id AS idProcess,
proc.name AS processName,
ps.shortDesc AS processStep,
ps.isVisibleForCustomer AS isVisibleForCustomer,
c.id AS idCountry,
c.name AS countryName
FROM
".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.idStep = ps.id
INNER JOIN
(
SELECT
rps_last.idProcess,
MAX(rps_last.processInstance) as lastInstace
FROM ".TABLES['rel_process_steps']." rps_last
GROUP BY rps_last.idProcess
) last_inst
ON last_inst.idProcess=rps.idProcess AND last_inst.lastInstace=rps.processInstance
INNER JOIN ".TABLES['processes']." proc
ON proc.id = rps.idProcess
INNER JOIN ".TABLES['countries']." c
ON c.id=proc.idCountry
$whereClause
ORDER BY processName, rps.idParent";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
if(!isset($processInfo[$row['idCountry']])){
$processInfo[$row['idCountry']] = [
'idCountry' => $row['idCountry'],
'countryName' => $row['countryName']
];
}
if(!isset($processInfo[$row['idCountry']]['processes'][$row['idProcess']])){
$processInfo[$row['idCountry']]['processes'][$row['idProcess']] = $row;
}
$processInfo[$row['idCountry']]['processes'][$row['idProcess']]['steps'][] = [
'stepName' => $row['processStep'],
'isVisibleForCustomer' => $row['isVisibleForCustomer']
];
}
return $processInfo;
}
/**
* Get only the processes that match the wanted string
* @param string $nameToSearch is the name of the package or process to be searched
* @return array - returns a formatted array with process details
*/
public function searchProcess($nameToSearch) {
if(empty($nameToSearch)) {
return [
'messageData'=> [
'status' => 'error',
'message' => 'SEARCH_EMPTY'
]
];
}
$processesFound = $this->getProcessInfo($nameToSearch);
if($processesFound) {
$data['data'] = $processesFound;
$data['messageData'] = [
'status' => 'success',
'message' => 'SEARCH_SUCCESS'
];
} else {
$data['messageData'] = [
'status' => 'warning',
'message' => 'SEARCH_SUCCESS_EMPTY'
];
}
return $data;
}
/**
* add or remove links between processes and package
* @param INT $idPackage id of the package
* @param Array[Objects] $selectedProcesses processes that need to be linked to the package
* @return Array update message
*/
public function linkProcessesToPackage($idPackage, $selectedProcesses){
global $database;
$idPackage = $database->escapeValue($idPackage);
$selectedProcesses = json_decode($selectedProcesses);
$data = [];
$valuesSql = "";
$notToDelSql = "";
if($idPackage == 0){
$data['messages'][] = [
'code' => 'error',
'message' => 'NO_COUNTRY_OR_PACKAGE'
];
return $data;
}
if(count($selectedProcesses) === 0){
$data['messages'][] = [
'code' => 'error',
'message' => 'NO_PROCESS_SELECTED'
];
return $data;
}
foreach ($selectedProcesses as $process) {
$idProcess = $database->escapeValue($process->idProcess);
$valuesSql .= "(".$idPackage.",
".$idProcess."
),";
$notToDelSql .= $idProcess . ',';
}
if($valuesSql !== "") {
$valuesSql = rtrim($valuesSql, ',');
$sql = "INSERT IGNORE INTO ".TABLES['rel_package_processes']."
(idPackage, idProcess)
VALUES
$valuesSql";
$database->query($sql);
$insertedProcesses = $database->affectedRows();
$notToDelSql = rtrim($notToDelSql, ',');
$sql = "DELETE FROM ".TABLES['rel_package_processes']."
WHERE idPackage=$idPackage AND idProcess NOT IN ($notToDelSql)";
$database->query($sql);
$deletedProcesses = $database->affectedRows();
if($insertedProcesses < 1 && $deletedProcesses < 1){
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES_PROCESS'
];
}else{
$data['messages'][] = [
'code' => 'success',
'message' => 'PROCESSES_LINKED'
];
}
}
return $data;
}
/**
* get the list of packages that don't have processes associated
* @return Array array of packages
*/
public function getPackagesAndProcesses($idCountry = 0) {
global $database;
$sql = "SELECT
p.id AS idPackage,
p.name AS packageName
FROM
".TABLES['packages']." p
LEFT OUTER JOIN ".TABLES['rel_package_processes']." rpp
ON rpp.idPackage=p.id
WHERE p.idCountry = $idCountry AND p.idPackageType!=".self::ID_PACKAGE_OPTION_TYPE;
return $database->fetchResultArray($sql);
}
/**
* get info and steps for processes
* @param INT $idPackage id for package (only to get also linked processes)
* @return Array list of steps and processes
*/
public function getProcesses($idPackage){
global $database;
$idPackage = $database->escapeValue($idPackage);
$data = [];
$sql = "SELECT ps.shortDesc,
rps.idProcess,
ps.isVisibleForCustomer
FROM ".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON ps.id=rps.idStep
INNER JOIN
(
SELECT
rps_last.idProcess,
MAX(rps_last.processInstance) as lastInstace
FROM ".TABLES['rel_process_steps']." rps_last
GROUP BY rps_last.idProcess
) last_inst
ON last_inst.idProcess=rps.idProcess AND last_inst.lastInstace=rps.processInstance
ORDER BY rps.idParent";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data['steps'][$row['idProcess']][] = [
'shortDesc' => $row['shortDesc'],
'isVisibleForCustomer' => $row['isVisibleForCustomer']
];
}
$sql = "SELECT proc.id AS idProcess,
proc.name AS processName,
CASE WHEN rel_proc.idProcess IS NULL THEN '0' ELSE '1' END AS isSelected
FROM ".TABLES['processes']." proc
LEFT OUTER JOIN
(SELECT rp.idProcess
FROM ".TABLES['rel_package_processes']." rp
WHERE rp.idPackage=$idPackage
) rel_proc
ON proc.id=rel_proc.idProcess
ORDER by proc.name ASC";
$data['processes'] = $database->fetchResultArray($sql);
return $data;
}
/**
* get processes names and ids for editing
* @return array of ids and names for all available processes
*/
public function getProcessNames() {
global $database;
$sql = "SELECT p.id,
p.idCountry,
p.name
FROM " . TABLES['processes'] ." p
ORDER BY p.name
";
return $database->fetchResultArray($sql);
}
/**
* get info and steps for processes available for editing
* @param idProcess - the id of the process selected for editing
* @return Array - list of steps and processes
*/
public function getStepsForProcessSelected($idProcess, $getAllSteps = false){
global $database;
$data = [];
$whereClause = '';
$stepsInProcess = '';
if($idProcess) {
$whereClause = " AND rps.idProcess = $idProcess";
}
if(!$getAllSteps){
$whereClause .= " AND idStep NOT IN(";
foreach($this->defaultSteps as $idStep) {
$whereClause .= $idStep.',';
}
$whereClause = rtrim($whereClause, ',') . ')';
}
foreach($this->defaultSteps as $idStep) {
$stepsInProcess .= $idStep.',';
}
$sql = "SELECT
ps.id,
ps.shortDesc,
ps.isVisibleForCustomer,
rps.idStep AS idStep
FROM ".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON ps.id=rps.idStep
INNER JOIN
(
SELECT
rps_last.idProcess,
MAX(rps_last.processInstance) as lastInstace
FROM ".TABLES['rel_process_steps']." rps_last
GROUP BY rps_last.idProcess
) last_inst
ON last_inst.idProcess=rps.idProcess AND last_inst.lastInstace=rps.processInstance
WHERE 1=1
$whereClause
ORDER BY rps.idParent";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data['processSteps'][] = $row;
$stepsInProcess .= $row['idStep'] . ',';
}
$stepsInProcess = $stepsInProcess ? rtrim($stepsInProcess, ',') : '';
$sql = "SELECT proc.id AS idStep,
proc.shortDesc,
proc.isVisibleForCustomer
FROM ".TABLES['process_step']." proc
WHERE proc.id NOT IN ($stepsInProcess)
ORDER by proc.shortDesc ASC";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data['steps'][$row['idStep']] = [
'shortDesc' => $row['shortDesc'],
'isVisibleForCustomer' => $row['isVisibleForCustomer']
];
}
return $data;
}
/**
* Edit a process - name and steps
* @param $idProcess - the id of the process needed to be updated
* @param $processData - the information regarding the process - name and steps
* @return array - status message
*/
public function editProcess($idProcess, $processData) {
global $database;
$idProcess = $database->escapeValue($idProcess);
$processName = $database->escapeValue($processData['processName']);
$idCountry = $database->escapeValue($processData['idCountry']);
$steps = $processData['processSteps'];
$data['idProcess'] = $idProcess;
$changeFound = false;
if($data['messageData'] = $this->validateEditProcessData($idProcess, $processName, $idCountry)) {
return $data;
}
$sql = "UPDATE ".TABLES['processes']."
SET name='".$processName."', idCountry='".$idCountry."'
WHERE id=$idProcess
";
$result = $database->query($sql);
if($database->affectedRows() > 0) {
$data['messageData'][] = [
'code' => 'success',
'message' => 'PROCESS_NAME_UPDATED'
];
}
$originalProcessSteps = $this->getStepsForProcessSelected($idProcess, false)['processSteps'];
if(count($originalProcessSteps) !== count($steps)){
$changeFound = true;
}else{
for($i=0; $i<count($steps); $i++) {
if($steps[$i]['idStep'] !== $originalProcessSteps[$i]['idStep']) {
$changeFound = true;
}
}
}
if(!$changeFound) {
$data['messageData'][] = [
'code' => 'warning',
'message' => 'PROCESS_STEPS_NOT_CHANGED'
];
return $data;
}
$idStepsUpdated = '';
$idStepInserted = 0;
$sql = "SELECT MAX(rps.processInstance) AS processInstance
FROM ".TABLES['rel_process_steps']." rps
WHERE idProcess=$idProcess
LIMIT 1";
$processInstance = $database->fetchResultArray($sql);
$processInstance = isset($processInstance[0]['processInstance']) ? $processInstance[0]['processInstance'] + 1 : 1;
$idStepInserted = $this->addProcessDefaultSteps($idProcess, $idStepInserted, $processInstance);
foreach($steps as $index => $processStep) {
$idStepInserted = $this->addProcessStepsInDb($processStep['idStep'], $idProcess, $idStepInserted, $processInstance);
}
if($idStepInserted > 0) {
$data['messageData'][] = [
'code' => 'success',
'message' => 'PROCESS_STEPS_UPDATED'
];
}
return $data;
}
/**
* validate the data required for a process
* @param INT $idProcess id for the process
* @param String $processName name for the process
* @param INT $idCountry id for country
* @return Array error message array or null in case of success
*/
private function validateEditProcessData($idProcess, $processName, $idCountry) {
global $database;
if($idProcess <= 0) {
$message[] = [
'code' => 'error',
'message' => 'PROCESS_NOT_FOUND'
];
return $message;
}
if(empty($idCountry) || $idCountry == 0){
$message[] = [
'code' => 'error',
'message' => 'COUNTRY_MANDATORY'
];
return $message;
}
$sql = "SELECT p.name
FROM " . TABLES['processes'] . " p
WHERE p.name = '".$processName."'
AND p.id <> $idProcess
";
$result = $database->query($sql);
if($database->affectedRows() > 0) {
$message[] = [
'code' => 'error',
'message' => 'PROCESS_NAME_EXISTS'
];
return $message;
}
return;
}
/**
* Add process and relations to package and process steps in DB
* @param array $data contains the details for every step
* @param string $processName is the name of the process which will be added
* @param int $idCountry io for the country
* @return array - returns a failure or success message for adding the process in the DB
*/
public function addProcess($data, $processName, $idCountry) {
$messages['messageData'] = [];
if(empty($data) || empty($processName) || empty($idCountry) || $idCountry == 0) {
$messages['messageData'][] = [
'code' => 'error',
'message' => 'PROCESS_DATA_MISSING'
];
return $messages;
}
if(strlen($processName) > 150) {
$messages['messageData'][] = [
'code' => 'error',
'message' => 'STRING_TOO_LONG',
'type' => 'Process name',
'limit' => 150
];
return $messages;
}
if($this->checkIfProcessExists($processName)) {
$messages['messageData'][] = [
'code' => 'error',
'message' => 'PROCESS_NAME_EXISTS'
];
return $messages;
}
$idProcess = $this->addProcessName($processName, $idCountry);
$idStepInserted = 0;
$idStepInserted = $this->addProcessDefaultSteps($idProcess, $idStepInserted, 1);
foreach($data as $index => $processStep) {
$idStepInserted = $this->addProcessStepsInDb($processStep->id, $idProcess, $idStepInserted, 1);
}
$messages['messageData'][] = [
'code' => 'success',
'message' => 'PROCESS_ADDED'
];
return $messages;
}
/**
* add the default steps for a process
* @param INT $idProcess id for the process
* @param INT $idStepInserted id of last insterted step
* @param INT $processInstance instance of the process
*/
private function addProcessDefaultSteps($idProcess, $idStepInserted, $processInstance){
foreach($this->defaultSteps as $idProcessStep){
$idStepInserted = $this->addProcessStepsInDb($idProcessStep, $idProcess, $idStepInserted, $processInstance);
}
return $idStepInserted;
}
/**
* check if a process already exists
* @param String $processName process name
* @return Boolean returns true in case a process with this name is found
*/
private function checkIfProcessExists($processName) {
global $database;
$sql = "SELECT
p.name
FROM
".TABLES['processes']." p
WHERE
p.name = '".$database->escapeValue(trim($processName))."'
";
$result = $database->query($sql);
$numRows = $database->numRows($result);
return $numRows > 0;
}
/**
* Insert in the DB the process steps for the recently added process
* @param array or object $processStep contains the details and/or chidren for every step
* @param int $idProcess is the id of the process name added in the corresponding table
*/
private function addProcessStepsInDb($idProcessStep, $idProcess, $idStepInserted = 0, $processInstance = 1) {
global $database;
$sql = "INSERT INTO ".TABLES['rel_process_steps']."
(idProcess, processInstance, idStep, idParent)
VALUES(
".$database->escapeValue($idProcess).",
".$database->escapeValue($processInstance).",
".$database->escapeValue($idProcessStep).",
".$database->escapeValue($idStepInserted)."
)";
$database->query($sql);
return $database->getInsertId();
}
/**
* Add process name in the corresponding table and return the inserted id
* @param string $processName is the name of the process which will be added
* @param INT $idCountry id for country
* @return int - returns the latest inserted process name
*/
private function addProcessName($processName, $idCountry) {
global $database;
$sql = "INSERT INTO ".TABLES['processes']."
(name, idCountry)
VALUES(
'".$database->escapeValue($processName)."',
'".$database->escapeValue($idCountry)."'
)";
$result = $database->query($sql);
return $database->getInsertId();
}
/**
* Get existing process steps
* @param int $idPackage is the id of the package selected
* @return int - returns number of products added in the package
*/
public function getProcessSteps($idPackage) {
$processSteps = $this->getProcessStepsFromDB();
return [
'steps'=> $processSteps,
'process'=> []
];
}
/**
* Get existing process steps from DB
* @return array - returns array with process steps existing in DB
*/
private function getProcessStepsFromDB() {
global $database;
$sql = "SELECT
proc.id, proc.shortDesc, proc.fullDesc, proc.idUserType, proc.isVisibleForCustomer
FROM
".TABLES['process_step']." proc
WHERE proc.id NOT IN(1, 2)
ORDER BY proc.shortDesc";
return $database->fetchResultArray($sql);
}
/**
* Add process step in DB
* @param string $shortDesc is the short description of the process step
* @param string $fullDesc is the full description of the process step
* @param int $idUserType is the id of the user type selected that is able to modify the step
* @param int $isStepVisible is a flag for making the step visible or not for the customer
* @param string $extraActionCode is the extra action name, if it is the case
* @return array - returns a failure or success message for adding the process step in the DB
*/
public function addProcessStep($shortDesc, $fullDesc, $idUserType, $isStepVisible, $extraActionCode) {
global $database;
$extraInsertFields = '';
$extraInsertValues = '';
if($shortDesc === '' || $fullDesc === ''){
$data['messageData'][] = [
'code' => 'error',
'message' => 'DESC_MISSING'
];
return $data;
}
if($idUserType == 0) {
$data['messageData'][] = [
'code' => 'error',
'message' => 'USER_TYPE_MISSING'
];
return $data;
}
if(strlen($shortDesc) > 100) {
$data['messageData'][] = [
'code' => 'error',
'message' => 'STRING_TOO_LONG',
'type' => 'Short description',
'limit' => 100
];
return $data;
}
if(strlen($fullDesc) > 500) {
return [
'messageData' => [
'code' => 'error',
'message' => 'STRING_TOO_LONG',
'type' => 'Full description',
'limit' => 500
]
];
}
if($this->checkIfProcessStepExists($shortDesc)) {
$data['messageData'][] = [
'code' => 'error',
'message' => 'PROCESS_STEP_EXISTS'
];
return $data;
}
if($extraActionCode) {
$extraActionCode = $database->escapeValue($extraActionCode);
$extraInsertFields = ', idActionCode';
$extraInsertValues = ", '$extraActionCode'";
}
$sql = "INSERT INTO ".TABLES['process_step']."
(shortDesc, fullDesc, idUserType, isVisibleForCustomer $extraInsertFields)
VALUES(
'".$database->escapeValue($shortDesc)."',
'".$database->escapeValue($fullDesc)."',
".$database->escapeValue($idUserType).",
".$database->escapeValue($isStepVisible)."
$extraInsertValues
)";
$database->query($sql);
$data['idInserted'] = $database->getInsertId();
$data['messageData'][] = [
'code' => 'success',
'message' => 'STEP_ADDED'
];
return $data;
}
/**
* Check if processStep to be added already exists in the DB
* @param string $shortDesc is the short description of the process step
* @return bool - returns true if the processStep already exists in the DB, false otherwise
*/
private function checkIfProcessStepExists($shortDesc) {
global $database;
$sql = "SELECT
shortDesc
FROM
".TABLES['process_step']."
WHERE
shortDesc = '".$database->escapeValue(trim($shortDesc))."'
";
$result = $database->query($sql);
$numRows = $database->numRows($result);
return $numRows > 0;
}
/**
* Get all available user types
* @return array - returns an array with all available user types (commercial lead, broker, customer)
*/
public function getUserTypes() {
global $database;
$sql = "SELECT u.id, u.type
FROM ".TABLES['user_types']." u";
return $database->fetchResultArray($sql);
}
/**
* Get all available extra actions for processes
* @return array - returns an array with all available extra actions
*/
public function getExtraActionsAvailable() {
global $database;
$sql = "
SELECT
psa.id as idActionCode,
psa.actionCode
FROM
".TABLES['process_step_actions']." psa
WHERE psa.stepType='extraAction'
ORDER BY actionCode";
return $database->fetchResultArray($sql);
}
}

View File

@@ -0,0 +1,11 @@
<script src="<?php echo PATH_JS_COMPONENTS.'processes/processes.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'processes/link-process.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'processes/edit-processes.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'processes/create-process-steps.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'processes/view-package-processes.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'processes/copy-processes.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<div id="processes" class="container-fluid col-md-12">
<h1>{{ 'processes.TITLE' | translate }}</h1>
<processes ng-controller="processesController"></processes>
</div>

View File

@@ -0,0 +1,16 @@
<div id="copy-processes" class="dropzone-packages">
<h3>{{'processes.headers.COPY_PROCESS' | translate}}</h3>
<div class="row">
<label for="selectProcess" class="package-label col-md-2">{{'processes.labels.PROCESS_TO_COPY' | translate}}:</label>
<select id="copy-process-select"
ng-model="idSelectedProccess"
ng-change="getSteps()"
class="form-control-static col-md-3"
ng-options="processInfo.name for processInfo in processes track by processInfo.id">
</select>
</div>
<div id="create-process-layer"
ng-if="processSteps.length">
<create-process-steps ng-controller="createProcessStepsCtrl" ng-init="initProcessCreation($parent.processSteps, resetProcessSelection)"></create-process-steps>
</div>
</div>

View File

@@ -0,0 +1,164 @@
<div id="create-process-steps" class="dropzone-packages">
<div class="create-process-notice alert alert-info">
<span class="glyphicon glyphicon-info-sign"></span>
{{'processes.messages.DEFAULT_STEPS' | translate}}
</div>
<div class="create-processes-name-description row">
<div class="create-processes-name row">
<label id="create-processes-name-label" for="packageName" class="package-label col-md-2">
{{'processes.labels.PROCESS_NAME' | translate}}:
</label>
<input type="text" placeholder="Enter process name" id="create-processes-process-name"
class="create-process-name-input col-md-2"
ng-model="processName" />
</div>
<div class="create-processes-country row">
<label id="create-processes-country-label" for="create-process-country-select" class="package-label col-md-2">
{{'processes.labels.PROCESS_COUNTRY' | translate}}:
</label>
<select id="create-process-country-select"
class="create-process-country-select col-md-2"
ng-model="selectedCountry">
<option id="catete-process-country-{{idCountry}}" ng-repeat="countryInfo in countries" value={{countryInfo.id}}>
{{countryInfo.name}}
</option>
</select>
</div>
</div>
<div class="create-process-steps-container">
<div class="create-processes-name-description">
<div>
<div id="create-processes-add-new-step-link" class="btn btn-primary add-step-label" ng-click="isStepFormOpen = !isStepFormOpen">
{{'processes.labels.NEW_STEP' | translate}}
</div>
</div>
<div>
<div class="add-process-steps" ng-if="isStepFormOpen">
<h3>{{'processes.buttons.ADD_STEP' | translate}}</h3>
<div class="create-processes-description col-md-12">
<label id="create-processes-short-desc-label" for="packageDescription" class="col-md-3">
{{'processes.labels.STEP_SHORT_DESC' | translate}}:
</label>
<textarea id="process-step-short-description"
placeholder="{{'processes.placeholders.SHORT_DESC' | translate}}"
class="form-control-static col-md-8"
ng-model="$parent.$parent.processStepShortDesc"></textarea>
</div>
<div class="create-processes-description col-md-12">
<label id="create-processes-full-desc-label" for="packageDescription" class="col-md-3">
{{'processes.labels.STEP_FULL_DESC' | translate}}:
</label>
<div id="proces-step-full-description" class="col-md-8">
<textarea
ui-tinymce="tinymceOptions"
ng-model="$parent.$parent.processStepFullDesc"></textarea>
</div>
</div>
<div class="create-processes-description col-md-12">
<label id="create-processes-customer-checkbox-label" for="packageDescription" class="package-label col-md-3">
{{'processes.labels.STEP_VISIBLE_CUSTOMER' | translate}}
</label>
<span ng-click="setVisible()" class="glyphicon {{isStepVisibleToCustomer()}}"></span>
</div>
<div class="create-processes-description col-md-12">
<label id="create-processes-step-extra-action-label" class="package-label col-md-3">
{{'processes.labels.EXTRA_ACTION' | translate}}
</label>
<select id="create-processes-step-extra-action-select" ng-model="$parent.$parent.selectedExtraAction" class="col-md-2">
<option id="create-processes-step-extra-action-{{extraAction.actionCode}}" ng-repeat="extraAction in extraActions" value={{extraAction.idActionCode}}>
{{extraAction.name}}
</option>
</select>
</div>
<div ng-if="$parent.$parent.selectedExtraAction" class="col-md-12">
<div class="create-process-notice alert alert-info">
<span class="glyphicon glyphicon-info-sign"></span>
{{getExtraActionDescription()}}
</div>
</div>
<div class="create-processes-description col-md-12">
<label id="create-processes-step-rights-label" for="processStepUserType" class="package-label col-md-3">
{{'processes.labels.STEP_RIGHTS' | translate}}
</label>
<select id="create-processes-step-rights-select"
class="col-md-2"
ng-model="$parent.$parent.selectedUserTypeId">
<option id="create-processes-step-rights-{{userType.id}}" ng-repeat="userType in userTypes" value={{userType.id}}>
{{userType.type}}
</option>
</select>
</div>
<div class="create-process-steps-add-button col-md-12">
<button type="button"
id="add-process-step-button"
class="btn btn-primary"
ng-click="addProcessStep()">{{'processes.buttons.ADD_STEP' | translate}}</button>
</div>
</div>
</div>
</div>
<div id="create-process-lists-container" class="create-packages-container">
<div class="create-packages-titles row">
<div class="col-md-4">
<div id="create-processes-products-title" class="create-process-title">
{{processListsTitle('process') | translate}}
</div>
</div>
<div class="col-md-4">
<div id="create-processes-packages-title" class="create-process-title">
{{processListsTitle('steps') | translate}}
</div>
</div>
</div>
<div id="create-processes-step-dragndrop-container" class="steps-container row">
<div class="col-md-4">
<div id="create-processes-step-dragndrop-available"
class="processes-list process-col-margin"
ui-sortable="sortableOptionsList.available" ng-model="availableSteps">
<div ng-repeat="(position, step) in availableSteps" class="create-package-row product-draggable">
<div id="available-list-{{position}}-position" class="create-processes-products-display">
<span class="glyphicon {{isVisibleToCustomer(step.isVisibleForCustomer)}}"></span>
<div class="create-processes-product">
{{step.shortDesc}}
</div>
</div>
</div>
</div>
</div>
<div class="draggable-icon-steps">
<span class="glyphicon glyphicon-transfer"></span>
</div>
<div class="col-md-4">
<div id="create-processes-step-dragndrop-process"
class="processes-list process-col-margin"
ui-sortable="sortableOptionsList.process" ng-model="processSteps">
<div ng-repeat="(position, step) in processSteps" class="create-package-row product-draggable">
<div id="available-list-{{position}}-position"
class="create-processes-products-display">
<span class="glyphicon {{isVisibleToCustomer(step.isVisibleForCustomer)}}"></span>
<div class="create-processes-step-number">
{{getStepNumber(position)}}
</div>
<div class="create-processes-product">
{{step.shortDesc}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="create-processes-button col-md-12" ng-if="processSteps">
<button id="create-processes-add-process-button" type="button" class="btn btn-primary" ng-click="addProcess()">
{{'processes.buttons.ADD_PROCESS' | translate}}
</button>
</div>
</div>

View File

@@ -0,0 +1,122 @@
<div id="edit-processes" class="dropzone-packages">
<h3>{{'processes.headers.EDIT_PROCESS' | translate}}</h3>
<div id="edit-process-select-container" class="link-process-steps-packages select-group row">
<label for="selectPackage" class="package-label col-md-2">{{'processes.labels.PROCESS_SELECT' | translate}}:</label>
<select id="edit-process-select"
ng-model="idSelectedProccess"
ng-change="getSteps()"
ng-init="setProcessAfterEdit()"
class="form-control-static col-md-3"
ng-options="processInfo.name for processInfo in processes track by processInfo.id">
</select>
</div>
<form ng-if="isProcessSelected()">
<div class="create-packages-name-description row">
<div class="create-package-name row justify-content-start col-md-12">
<label for="process-name" class="package-label col-md-2">{{ 'processes.labels.PROCESS_NAME' | translate }}:</label>
<input type="text"
id="process-name-edit"
required
class="create-package-name-input form-control-static col-md-5"
ng-model="$parent.processName" />
</div>
<div class="create-processes-country row justify-content-start col-md-12">
<label id="create-processes-country-label" for="create-process-country-select" class="package-label col-md-2">
{{'processes.labels.PROCESS_COUNTRY' | translate}}:
</label>
<select id="create-process-country-select"
class="create-process-country-select form-control-static col-md-5"
ng-model="$parent.selectedCountry">
<option id="create-process-country-{{countryInfo.id}}" ng-repeat="countryInfo in countries" value={{countryInfo.id}}>
{{countryInfo.name}}
</option>
</select>
</div>
</div>
<div class="create-process-notice alert alert-info">
<span class="glyphicon glyphicon-info-sign"></span>
{{'processes.messages.DEFAULT_STEPS' | translate}}
</div>
<div id="edit-processes-container" class="create-packages-container">
<div class="create-packages-titles row">
<div class="create-package-title col-md-4">
{{'processes.labels.PROCESS' | translate}}
</div>
<div class="create-package-title col-md-5">
{{'processes.labels.STEPS_IN_PROCESS' | translate}}
</div>
</div>
<div id="edit-process-and-steps-container" class="row">
<div class="draggable-icon col-md-1">
<span class="glyphicon glyphicon-transfer"></span>
</div>
<div class="create-packages col-md-4 available-steps-list">
<ul class="edit-processes-lists"
id="available-steps-list"
data-drop="true"
jqyoui-droppable="{onDrop:'processStepDropped'}">
<li ng-repeat="(idStep, availableStep) in availableSteps"
class="create-package-row product-draggable"
step-info="{{availableStep}}"
data-drag="true"
jqyoui-draggable="{animate:true, onStart:'startDragFromAvailableSteps(idStep)', onStop:'endDragFromAvailableSteps()', scroll: false}"
data-jqyoui-options="{revert: 'invalid', containment:'#edit-processes-container', scroll: false}">
<div id="edit-available-steps-list-{{idStep}}-position" class="create-processes-products-display">
<div class="create-processes-product">
<span class="glyphicon {{isVisibleToCustomer(availableStep.isVisibleForCustomer)}}"></span>
{{availableStep.shortDesc}}
</div>
</div>
</li>
</ul>
</div>
<div class="create-packages col-md-4 process-steps-list">
<ul class="edit-processes-lists rearrange-steps"
id="process-steps-list"
data-drop="true"
jqyoui-droppable="{onDrop: 'availableStepDropped'}"
sortable-steps
start-drag-process="startDragFromProcessSteps"
end-drag-process="endDragFromProcessSteps"
process-steps="processSteps">
<li ng-repeat="(position, processStep) in processSteps"
step-info="{{processStep}}"
data-drag="true"
data-jqyoui-options="{revert: 'invalid', containment:'#edit-processes-container', scroll: false}"
class="create-processes-row" style="padding-left: {{getStepPadding(position)}}%;">
<div id="edit-process-steps-list-{{position}}-position" class="create-processes-products-display">
<div class="create-processes-step-number">
{{position + 1}}
</div>
<div class="create-processes-product">
<span class="glyphicon {{isVisibleToCustomer(processStep.isVisibleForCustomer)}}"></span>
{{processStep.shortDesc}}
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="edit-buttons row" ng-if="processSteps">
<div class="edit-package-button col-md-7">
<input type="submit"
id="edit-package-btn"
class="btn btn-primary"
ng-click="editProcess()"
value="{{ 'processes.buttons.EDIT_PROCESS' | translate }}"/>
</div>
<div class="reset-button col-md-5">
<input type="submit"
id="reset-package-btn"
class="btn btn-primary"
ng-click="resetProducts()"
value="{{ 'processes.buttons.RESET' | translate }}"/>
</div>
</div>
</form>
</div>

View File

@@ -0,0 +1,103 @@
<div id="link-process-steps" class="dropzone-packages">
<h3>{{'processes.headers.LINK_PROCESSES' | translate}}</h3>
<div id="process-steps-countries" class="packages-countries select-group row justify-content-start">
<label for="selectCountry" class="package-label col-md-2">{{ 'processes.labels.CREATE_COUNTRY' | translate }}:</label>
<select id="process-select-country" class="form-control-static col-md-3" ng-model="$parent.selectedCountryId" ng-change="getPackages()">
<option ng-repeat="(id, country) in countries" value={{id}}>
{{country}}
</option>
</select>
</div>
<div id="link-process-steps-packages-list" class="link-process-steps-packages select-group row" ng-if="isCountrySelected()">
<label for="selectPackage" class="package-label col-md-2">{{'processes.labels.PACKAGE_SELECT' | translate}}:</label>
<select id="link-process-package-select"
ng-model="$parent.selectedPackageId"
ng-change="getProcesses()"
class="form-control-static col-md-3">
<option id="link-process-package-{{idPackage}}" ng-repeat="(idPackage, packageName) in packages" value={{idPackage}}>
{{packageName}}
</option>
</select>
</div>
<div class="processes-contianer" ng-if="isPackageSelected()">
<div class="selection-headers row">
<div id="headers-col-available" class="headers-col col-md-4">
<h3>{{'processes.headers.AVAILABLE_PROCESSES' | translate}}</h3>
</div>
<div id="headers-col-selected" class="headers-col col-md-4">
<h3>{{'processes.headers.SELECTED_PROCESSES' | translate}}</h3>
</div>
<div id="headers-col-info" class="headers-col col-md-4">
<h3>{{'processes.headers.PROCESS_INFO' | translate}}</h3>
<div>{{selectedSteps.processName}}</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="add-new-process" class="btn btn-primary add-new-process" ng-click="enableAddNewProcess()">{{'processes.buttons.NEW_PROCESS' | translate}}</div>
</div>
<create-process-steps ng-if="isNewStepFormVisible()"
ng-controller="createProcessStepsCtrl"
ng-init="displayProcessSteps(getStepsForProcess)"></create-process-steps>
</div>
<div class="process-selection-layer">
<div class="col-md-4">
<div id="available-processes"
class="processes-list"
data-drop="true"
jqyoui-droppable="{onDrop:'prcessDrop()'}"
data-jqyoui-options="{accept:'.selected-process'}">
<div class="process-draggable available-process"
data-drag="true"
data-jqyoui-options="{revert: true, containment:'.process-selection-layer', scroll: false}"
ng-model="process"
jqyoui-draggable="{animate:true, onStart:'processDragStart', onStop:'processDragStop'}"
process-key="{{key}}"
ng-click="showProcessInfo(process)"
ng-repeat="(key, process) in processes">{{process.processName}}</div>
</div>
</div>
<div class="col-md-4">
<div id="selected-processes"
class="processes-list process-col-margin"
data-drop="true"
jqyoui-droppable="{onDrop:'prcessDrop()'}"
data-jqyoui-options="{accept:'.available-process'}">
<div class="process-draggable selected-process"
data-drag="true"
data-jqyoui-options="{revert: true, containment:'.process-selection-layer'}"
ng-model="process"
jqyoui-draggable="{animate:true, onStart:'processDragStart', onStop:'processDragStop'}"
process-key="{{key}}"
ng-click="showProcessInfo(process)"
ng-repeat="(key, process) in selectedProcesses">{{process.processName}}</div>
</div>
</div>
<div class="col-md-4">
<div id="process-info" class="processes-list process-col-margin">
<div id="info-placeholder" class="info-placeholder">{{'processes.messages.CLICK_FOR_INFO' | translate}}</div>
<div class="info-step" ng-repeat="(key, step) in selectedSteps.steps">
<div class="step-position">{{key + 1}}.</div>
<div class="step-description">
<span class="glyphicon {{isVisibleToCustomer(step.isVisibleForCustomer)}}"></span>
{{step.shortDesc}}
</div>
</div>
</div>
</div>
</div>
<div class="link-processes-button col-md-12">
<button id="link-processes-add-process-button" type="button" class="btn btn-primary" ng-click="linkProcesses()">
{{'processes.buttons.ADD_SELECTED_PROCESSES' | translate}}
</button>
</div>
</div>
</div>

View File

@@ -0,0 +1,42 @@
<button type="button"
id="view-package-processes-btn"
subModule="viewPackageProcesses"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'processes.buttons.VIEW_PACKAGE_PROCESSES' | translate }}</button>
<button type="button"
id="create-processes-button"
subModule="createProcesses"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'processes.buttons.CREATE_PROCESSES' | translate }}</button>
<button type="button"
id="edit-processes-button"
subModule="editProcesses"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'processes.buttons.EDIT_PROCESSES' | translate }}</button>
<button type="button"
id="copy-processes-button"
subModule="copyProcesses"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'processes.buttons.COPY_PROCESSES' | translate }}</button>
<div id="view-processes-layer"
ng-if="isSubmoduleVisible('viewPackageProcesses')">
<view-package-processes></view-package-processes>
</div>
<div id="edit-processes-layer"
ng-if="isSubmoduleVisible('editProcesses')">
<edit-processes ng-controller="editProcessesCtrl" ng-init="initPRocessEdit()"></edit-processes>
</div>
<div id="create-process-layer"
ng-if="isSubmoduleVisible('createProcesses')">
<create-process-steps ng-controller="createProcessStepsCtrl" ng-init="initProcessCreation()"></create-process-steps>
</div>
<div id="copy-processes-layer"
ng-if="isSubmoduleVisible('copyProcesses')">
<copy-processes ng-controller="copyProcessesCtrl" ng-init="initPeocessCopy()"></copy-processes>
</div>

View File

@@ -0,0 +1,47 @@
<div id="view-package-process-list" class="view-package-process-layer row" ng-controller="viewPackageProcessesController">
<div id="search-processes" class="search-process-field col-md-12">
<label id="view-package-process-search-label" class="search-process-label">{{ 'processes.labels.SEARCH_PROCESS' | translate }}</label>
<input type="text" ng-model="searchProcessValue" class="search-process-input"/>
<button type="button"
id="view-package-process-search-button"
class="search-package-process-button btn btn-info"
ng-disabled="!searchProcessValue"
ng-click="searchProcess()">
{{ 'processes.buttons.SEARCH_PROCESS' | translate }}
</button>
<button type="button"
id="view-package-process-all-button"
class="search-package-process-button btn btn-success"
ng-click="listAvailableProcesses()">
{{ 'processes.buttons.ALL_PROCESSES' | translate }}
</button>
</div>
<div class="view-process-container col-md-12" ng-init="getAvailableProcesses()">
<div ng-repeat="country in countries" class="package-layer">
<div id="view-package-process-package-name" class="package-name col-md-12">
{{country.countryName}}
</div>
<div class="processes-layer row">
<div ng-repeat="process in country.processes" class="col-md-4">
<div class="process-info-container process-info">
<div id='view-package-process-name' class="process-name">
{{process.processName}}
</div>
<div class="process-steps">
<div ng-repeat="(position, step) in process.steps" class="package-process-row">
<div class="step-number">
{{position+1}}
</div>
<div class="process-step">
<span class="glyphicon {{isVisibleForCustomer(step.isVisibleForCustomer)}}"></span>
{{step.stepName}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>