query($sql);
while($row = $database->fetchArray($query)){
$sqlInsert .= "(
".$row['idProcessStep'].",
".$row['idOrder'].",
'".$row['status']."'),";
if(intval($row['idParent']) === 0){
$firstProcessStepId = $row['idProcessStep'];
}
}
$sqlInsert = rtrim($sqlInsert, ',');
$queryIns = $database->query($sqlInsert);
return $database->affectedRows() > 0 ? $firstProcessStepId : 0;
}
/**
* select a process for an order
* @param INT $idOrder id for the order
* @param INT $idProcess id for process
* @return Array update message
*/
public function setProcessForOrder($idOrder, $idProcess, $ordersDetailsMail){
global $database;
$data = [];
$actionsList = [];
$idOrder = $database->escapeValue($idOrder);
$idProcess = $database->escapeValue($idProcess);
$ordersDetailsMail = (array) json_decode($ordersDetailsMail);
$ordersDetailsMail['idProcess'] = $idProcess;
$orderActions = new OrderActions();
$firstStep = $this->insertProcessStepsForOrder($idOrder, $idProcess);
if($firstStep > 0){
$stepUpdated = $orderActions->executeAutomatedStep($idOrder, $firstStep);
if($stepUpdated > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'AUTOMATED_STEPS_EXECUTED'
];
$orderStatusUpdated = $this->updateOrderStatus($idOrder);
if($orderStatusUpdated['orderUpdated'] > 0) {
$message = [
'code' => 'success',
'message' => 'ORDER_UPDATED'
];
$data['messages'][] = $message;
$data['order'] = $orderStatusUpdated['orderUpdated'];
$ordersDetailsMail['status'] = $orderStatusUpdated['status'];
$data['messages'][] = $this->sendConfirmationMail('orderStatusChanged', $ordersDetailsMail);
}
$data['messages'][] = [
'code' => 'success',
'message' => 'PROCESS_SET'
];
$data['messages'][] = $this->sendConfirmationMail('processAssigned', $ordersDetailsMail);
}else{
$data['messages'][] = [
'code' => 'error',
'message' => 'AUTOMATED_STEPS_FAILED'
];
}
}else{
$data['messages'][] = [
'code' => 'error',
'message' => 'PROCESS_ADD_ERROR'
];
}
return $data;
}
/**
* get the order status
* @param HashArray $packageStatuses statuses for packages in order
* @return String order status
*/
private function getOrderStatusBasedOnPackages($packageStatuses){
$delivered = intval($packageStatuses['endOfLife']) + intval($packageStatuses['production']);
if($packageStatuses['endOfLife'] === $packageStatuses['totalPackages']){
return 'end-of-life';
}else if($delivered === intval($packageStatuses['totalPackages'])){
return 'production';
}else if($packageStatuses['processing'] > 0){
return 'in-progress';
}
return 'none';
}
/**
* update order status
* @param INT $idOrder id for order
* @return HashArray updated object
*/
public function updateOrderStatus($idOrder){
global $database;
$orderUpdated = 0;
$sqlStatuses = "SELECT
SUM(IF(rop.status = 'end-of-life', 1, 0)) as endOfLife,
SUM(IF(rop.status = 'processing', 1, 0)) as processing,
SUM(IF(rop.status ='production', 1, 0)) as production,
COUNT(rop.idPackage) as totalPackages
FROM ".TABLES['rel_order_packages']." rop
WHERE rop.idOrder=$idOrder
GROUP BY rop.idOrder";
$queryStatuses = $database->query($sqlStatuses);
$packageStatuses = $database->fetchArray($queryStatuses);
$status = $this->getOrderStatusBasedOnPackages($packageStatuses);
if($status === 'in-progress'){
$sqlUpdateOrder = "UPDATE ".TABLES['orders']."
SET status='$status'
WHERE id=$idOrder";
$query = $database->query($sqlUpdateOrder);
$orderUpdated = $database->affectedRows();
}else if($status === 'production' || $status === 'end-of-life'){
$deliveryDate = date("Y-m-d H:i:s");
$sqlUpdateOrder = "UPDATE ".TABLES['orders']."
SET status='$status',
deliveryDate=CASE WHEN deliveryDate IS NULL THEN '$deliveryDate' ELSE deliveryDate END
WHERE id=$idOrder";
$query = $database->query($sqlUpdateOrder);
$orderUpdated = $database->affectedRows();
}
return [
'orderUpdated' => $orderUpdated,
'status' => $status
];
}
/**
* get package and process names
* @param Int $idProcess the id of the process
* @param Int $idPackage the id of the package
* @return Array package and process names
*/
private function getProcessAndPackageName($idProcess, $idPackage) {
global $database;
if(!$idPackage){
return [];
}
$sql = "
SELECT
pack.name AS packageName,
proc.name AS processName
FROM
".TABLES['packages']." pack
INNER JOIN ".TABLES['processes']." proc
ON proc.id = $idProcess
WHERE pack.id = $idPackage";
return $database->fetchResultArray($sql)[0];
}
/**
* returns the previous and current process step for given order and package
* @param Int $idProcess id of the process
* @param Int $idPackage id of the package
* @param Int $idOrder id of the order
* @return Array array with current and previous steps of the order
*/
private function getPreviousAndCurrentSteps($idProcess, $idOrder) {
global $database;
$data = [
'currentStep' => '',
'prevStep' => ''
];
$sql = "
SELECT
ps.shortDesc,
rops.status
FROM
".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.idStep = ps.id
INNER JOIN
(SELECT
MAX(processInstance) AS processInstance
FROM
".TABLES['rel_process_steps']."
WHERE idProcess = $idProcess) max_instance
ON rps.processInstance = max_instance.processInstance
INNER JOIN ".TABLES['rel_order_process_step']." rops
ON rops.idProcessStep = rps.id
AND rops.idOrder = $idOrder
AND rops.status = 'in-progress'
WHERE ps.isVisibleForCustomer = 1
UNION
SELECT
ps.shortDesc,
rops.status
FROM
".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.idStep = ps.id
INNER JOIN
(SELECT
MAX(processInstance) AS processInstance
FROM
".TABLES['rel_process_steps']."
WHERE idProcess = $idProcess) max_instance
ON rps.processInstance = max_instance.processInstance
INNER JOIN ".TABLES['rel_order_process_step']." rops
ON rops.idProcessStep = rps.id
AND rops.idOrder = $idOrder
AND rops.status = 'done'
INNER JOIN
(SELECT
idParent
FROM
".TABLES['rel_process_steps']." rps_progress
INNER JOIN ".TABLES['rel_order_process_step']." rops_progress
ON rops_progress.idProcessStep = rps_progress.id
AND rops_progress.idOrder = $idOrder
AND rops_progress.status = 'in-progress') progress_parent
ON progress_parent.idParent = rps.id
WHERE ps.isVisibleForCustomer = 1
";
$result = $database->fetchResultArray($sql);
if(count($result) > 0) {
foreach($result as $stepDetails) {
if($stepDetails['status'] === 'in-progress') {
$data['currentStep'] = $stepDetails['shortDesc'];
}
if($stepDetails['status'] === 'done') {
$data['prevStep'] = $stepDetails['shortDesc'];
}
}
}
return $data;
}
/**
* returns the last process step for given order and package
* @param Int $idProcess id of the process
* @param Int $idOrder id of the order
* @return Array array with last step completed of the order
*/
private function getLastStepOrderCompleted($idProcess, $idOrder) {
global $database;
$data = [];
$sql = "
SELECT
ps.shortDesc AS shortDesc,
rops.status AS status,
ps.isVisibleForCustomer AS isVisibleForCustomer
FROM
".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.idStep = ps.id
INNER JOIN
(SELECT
MAX(processInstance) AS processInstance,
MAX(id) AS id
FROM
".TABLES['rel_process_steps']."
WHERE idProcess = $idProcess) max_instance
ON rps.processInstance = max_instance.processInstance
AND rps.id = max_instance.id
INNER JOIN ".TABLES['rel_order_process_step']." rops
ON rops.idProcessStep = rps.id
AND rops.idOrder = $idOrder
AND rops.status = 'done'
";
$result = $database->fetchResultArray($sql);
if(count($result) > 0) {
$data['prevStep'] = [
'description' => $result[0]['shortDesc'],
'isVisibleForCustomer' => $result[0]['isVisibleForCustomer']
];
}
return $data;
}
/**
* checks parameters and sends mail based on the action made
* @param String $mailType the action for which to send the mail
* @param Json string $orderData the details regarding the order for which to send the mail
* @return Array confirmation message
*/
public function sendConfirmationMail($mailType, $orderData) {
global $database, $user;
$mailType = $database->escapeValue($mailType);
$orderHelper = new OrderHelper();
$commentMessage = array_key_exists('commentMessage', $orderData) ? $orderData['commentMessage'] : '';
foreach($orderData as $orderKey => $orderDetail) {
$orderData[$orderKey] = $database->escapeValue($orderDetail);
}
$data = [];
$idOrder = array_key_exists('idOrder', $orderData) ? $orderData['idOrder'] : 0;
$orderNumber = array_key_exists('orderNumber', $orderData) ? $orderData['orderNumber'] : $orderHelper->getOrderNumberById($idOrder);
if(!$mailType) {
return [
'code' => 'error',
'message' => 'ACTION_NOT_SET'
];
}
if(count($orderData) < 1) {
return [
'code' => 'error',
'message' => 'ORDER_DATA_NOT_SET'
];
}
if(!$idOrder) {
return [
'code' => 'error',
'message' => 'ID_ORDER_NOT_SET'
];
}
if(!$orderNumber) {
return [
'code' => 'error',
'message' => 'ORDER_NUMBER_NOT_SET'
];
}
if(!array_key_exists('customer', $orderData) || !array_key_exists('commercialLead', $orderData)) {
$customerCLNames = $orderHelper->getCustomerAndCLNamesFromOrder($idOrder);
$orderData['customer'] = $customerCLNames['customerName'];
$orderData['commercialLead'] = $customerCLNames['commercialLeadName'];
}
$idPackage = array_key_exists('idPackage', $orderData) ? $orderData['idPackage'] : 0;
$idProcess = array_key_exists('idProcess', $orderData) && $orderData['idProcess'] ? $orderData['idProcess'] : $orderHelper->getIdProcessSelectedForPackageOrder($idOrder, $idPackage);
$orderData['orderNumber'] = $orderNumber;
$names = $this->getProcessAndPackageName($idProcess, $idPackage);
$orderData['processName'] = array_key_exists('processName', $names) ? $names['processName'] : '';
$orderData['packageName'] = array_key_exists('packageName', $names) ? $names['packageName'] : '';
$currentDate = new DateTime();
$currentDate = $currentDate->format('d-m-Y H:i');
$params = [
'apiOrderUrl' => WIAAS_URL.'/api-wiaas/orders?subModule=orders_steps&idOrder='.$idOrder.'&orderNumber='.$orderNumber,
'orderUrl' => WIAAS_URL.'/orders/'.$idOrder,
'mailType' => $mailType,
'currentDate' => $currentDate,
'idOrder' => $idOrder,
'orderNumber' => $orderNumber,
'processName' => $orderData['processName'],
'packageName' => $orderData['packageName']
];
$mailAddresses = $orderHelper->getCLAndCustomerMails($orderData['customer'], $orderData['commercialLead']);
switch($mailType) {
case 'processAssigned':
$mailTitle = "Process assigned for order $orderNumber ($currentDate)";
break;
case 'orderStepUpdated':
$mailTitle = "Order $orderNumber updated ($currentDate)";
$steps = $this->getPreviousAndCurrentSteps($idProcess, $idOrder);
$params['currentStepMessage'] = $steps['currentStep'] ?
"".$steps['currentStep']." is currently in progress.
" :
'';
$params['prevStepMessage'] = $steps['prevStep'] ?
"The step ".$steps['prevStep']." has been completed successfully.
" :
'';
break;
case 'lastStepCompleted':
$mailTitle = "Order $orderNumber is successfully completed ($currentDate)";
$lastStep = $this->getLastStepOrderCompleted($idProcess, $idOrder);
$params['prevStepMessage'] = $lastStep['prevStep']['isVisibleForCustomer'] === '1' ?
"The step ".$lastStep['prevStep']['description']." has been done.
" :
'';
break;
case 'packageStatusChanged':
$mailTitle = "Order's $orderNumber package status updated ($currentDate)";
$params['status'] = $orderData['status'];
$params['deliveryEstimationDateMessage'] = array_key_exists('estimatedDate', $orderData) ?
"The estimated date to complete the step is ".$orderData['estimatedDate'].".
" :
'';
break;
case 'scheduleMeeting':
$mailTitle = "Follow-up meeting date updated for order $orderNumber ($currentDate)";
$mailAddresses = $orderHelper->getCLAndCustomerMails($orderData['customer'], $orderData['commercialLead'], 1);
$params['estimatedDateMessage'] = array_key_exists('estimatedMeetingDate', $orderData) ?
"The estimated date set for the follow-up meeting is ".$orderData['estimatedMeetingDate'].".
" :
'';
$params['confirmedDateMessage'] = array_key_exists('confirmedMeetingDate', $orderData) ?
"The confimed date set for the follow-up meeting is ".$orderData['confirmedMeetingDate'].".
" :
'';
break;
case 'orderStatusChanged':
$mailTitle = "Order $orderNumber changed it's status to ".$orderData['status']. " ($currentDate)";
$params['status'] = $orderData['status'];
$params['deliveryEstimationDateMessage'] = array_key_exists('estimatedDate', $orderData) ?
"The estimated delivery date for the order is ".$orderData['estimatedDate'].".
" :
'';
break;
case 'orderCommentAdded':
if(array_key_exists('isStepComment', $orderData)) {
$mailTitle = "New comment for step in order $orderNumber ($currentDate)";
$mailAddresses = $orderHelper->getCLAndCustomerMails('', $orderData['commercialLead'], 1);
} else {
$mailTitle = "New comment for order $orderNumber ($currentDate)";
$mailAddresses = $orderHelper->getCLAndCustomerMails($orderData['customer'], $orderData['commercialLead'], 1);
}
$params['commentMessage'] = $commentMessage;
$params['userLoggedIn'] = $user->getUserFullName();
break;
default:
return $data;
}
return UtilsModel::sendOrderUpdateMail($mailType, $params, $mailTitle, $mailAddresses);
}
/**
* get comments for all oreder steps
* @param INT $idOrder id of the order
* @return Array list of comments for an order grouped by idPackage and idProcessStep
*/
private function getStepsComments($idOrder){
global $database, $user;
$extraFields = '';
$whereSql = '';
$userType = $user->getUserType();
if($userType === USER_TYPES['BROKER']){
$extraFields = ",rsc.isVisible ";
}else{
$whereSql = " AND rsc.isVisible=1";
}
$sql = "SELECT rsc.id, rsc.idProcessStep,
rsc.comment,
rsc.addDate,
u.username as user
$extraFields
FROM ".TABLES['rel_step_comments']." rsc
INNER JOIN ".TABLES['users']." u
ON u.id=rsc.idUser
WHERE rsc.idOrder=$idOrder
AND rsc.type = 'stepComment'
$whereSql";
$comments = [];
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$idProcessStep = $row['idProcessStep'];
unset($row['idProcessStep']);
$comments[$idProcessStep][] = $row;
}
return $comments;
}
/**
* get all steps for an order
* @param INT $idOrder id of the order
* @return Array list of steps for an order grouped by process and package
*/
public function getOrderSteps($idOrder){
global $database, $user;
$userType = $user->getUserType();
$extraWhereClause = '';
$extraJoin = '';
$orderHelper = new OrderHelper();
if(!$orderHelper->checkOrderOwner($idOrder)){
return [];
}
if($userType === USER_TYPES['CUSTOMER']) {
$extraWhereClause = " AND ps.isVisibleForCustomer = 1";
}
if($userType === USER_TYPES['SUPPLIER']) {
$extraJoin = " INNER JOIN(
SELECT DISTINCT rop.idOrder, rop.idPackage
FROM ".TABLES['rel_order_packages']." rop
INNER JOIN ".TABLES['rel_package_products']." rpp
ON rpp.idPackage=rop.idPackage and rpp.packageInstance=rpp.packageInstance
INNER JOIN ".TABLES['suppliers_countries_products']." scp
ON scp.idProduct=rpp.idProduct
INNER JOIN ".TABLES['suppliers']." s
ON s.id=scp.idSupplier
WHERE s.idUSer=".$user->getUserId()." AND rop.idOrder=$idOrder
) supplierPkg
ON rops.idOrder=supplierPkg.idOrder AND rops.idPackage=supplierPkg.idPackage";
}
$comments = $this->getStepsComments($idOrder);
$sql = "SELECT o.id AS idOrder,
ps.shortDesc,
ps.fullDesc,
ps.isVisibleForCustomer,
psa.actionCode,
psa.stepType,
rops.idProcessStep,
rops.status,
rops.actualDate,
rps.idProcess,
p.name AS processName
FROM ".TABLES['rel_order_process_step']." rops
INNER JOIN ".TABLES['orders']." o
ON o.id=rops.idOrder
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.id=rops.idProcessStep
INNER JOIN ".TABLES['processes']." p
ON p.id=rps.idProcess
INNER JOIN ".TABLES['process_step']." ps
ON ps.id=rps.idStep
INNER JOIN ".TABLES['process_step_actions']." psa
ON psa.id=ps.idActionCode
$extraJoin
WHERE o.id=".$idOrder."
$extraWhereClause
ORDER BY rps.idProcess, rops.idProcessStep
";
$query = $database->query($sql);
$data = [];
while($row = $database->fetchArray($query)){
$idProcess = $row['idProcess'];
$data[$idProcess]['idProcess'] = $row['idProcess'];
$data[$idProcess]['processName'] = $row['processName'];
unset($row['processName']);
$row['comments'] = isset($comments[$row['idProcessStep']]) ? $comments[$row['idProcessStep']] : [];
$row['isNewCommentVisible'] = $row['isVisibleForCustomer'];
$data[$idProcess]['steps'][] = $row;
}
return $data;
}
/**
* Update the actual date for an order
* @param Int $idOrder Id of the order to be modified
* @param Int $idProcessStep id of the porcess to be modified
* @param String $actualDate new date to be added for an order actual date step completed
* @return array resopnese message for the update
*/
public function updateStepActualDate($idOrder, $idProcessStep, $actualDate, $ordersDetailsMail) {
global $database;
$data = [];
$idOrder = $database->escapeValue($idOrder);
$idProcessStep = $database->escapeValue($idProcessStep);
$actualDate = $database->escapeValue($actualDate);
$ordersDetailsMail = (array) json_decode($ordersDetailsMail);
$orderProcessHelper = new OrderProcessHelper();
$checkDate = $database->invalidDate('ACTUAL_DATE_INCORRECT', $actualDate);
if($checkDate){
$data['messages'][] = $checkDate;
return $data;
}
$sql = "UPDATE ".TABLES['rel_order_process_step']."
SET actualDate='$actualDate'
WHERE idOrder=$idOrder AND idProcessStep=$idProcessStep
LIMIT 1";
$query = $database->query($sql);
if(!$query){
$err_mes = [
'code' => 'error',
'message' => 'SERVER_ERROR'
];
$data['messages'][] = $err_mes;
}
if($database->affectedRows() === 1){
$message = [
'code' => 'success',
'message' => 'ORDER_STEP_ACTUAL_DATE_UPDATED'
];
$data['messages'][] = $message;
$sqlProcessStep = "
SELECT ps.shortDesc
FROM ".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.idStep = ps.id
AND rps.id = $idProcessStep
LIMIT 1
";
$result = $database->fetchResultArray($sqlProcessStep);
$procStep = $result ? $result[0]['shortDesc'] : '';
$ordersDetailsMail['status'] = 'actual date set for step "'.$procStep.'"';
$ordersDetailsMail['actualDate'] = $actualDate;
$data['messages'][] = $orderProcessHelper->sendConfirmationMail('packageStatusChanged', $ordersDetailsMail);
}
return $data;
}
/**
* update commnet for a step
* @param int $idOrder id of the order
* @param int $idProcessStep process step id
* @param String $comment comment
* @return arary messages array
*/
public function updateStepComment($idOrder, $idProcessStep, $comment, $isVisible, $ordersDetailsMail) {
global $database, $user;
$data = [];
$idOrder = $database->escapeValue($idOrder);
$idProcessStep = $database->escapeValue($idProcessStep);
$comment = $database->escapeValue($comment);
$isVisible = $database->escapeValue($isVisible);
$idUser = $user->getUserId();
$ordersDetailsMail = (array) json_decode($ordersDetailsMail);
$orderProcessHelper = new OrderProcessHelper();
$checkMessage = $database->invalidLength('COMMENT_LONG',$comment, 700);
if($checkMessage){
$data['messages'][] = $checkMessage;
return $data;
}
$sql = "INSERT INTO ".TABLES['rel_step_comments']."
(idProcessStep, idOrder, idUser, comment, isVisible)
VALUES ($idProcessStep, $idOrder, $idUser, '$comment', $isVisible)";
$query = $database->query($sql);
if(!$query){
$err_mes = [
'code' => 'error',
'message' => 'SERVER_ERROR'
];
$data['messages'][] = $err_mes;
}
if($database->affectedRows() === 1){
$message = [
'code' => 'success',
'message' => 'ORDER_STEP_COMMENT_UPDATED'
];
$data['messages'][] = $message;
if($isVisible) {
$ordersDetailsMail['commentMessage'] = $comment;
$ordersDetailsMail['isStepComment'] = true;
$data['messages'][] = $orderProcessHelper->sendConfirmationMail('orderCommentAdded', $ordersDetailsMail);
}
}
return $data;
}
/**
* update the visibility for a comment
* @param INT $idComment id of the comment
* @param boolean $isVisible visibility for the step
* @return Array update message
*/
public function updateStepCommentVisibility($idComment, $isVisible){
global $database;
$data = [];
$idComment = $database->escapeValue($idComment);
$isVisible = $database->escapeValue($isVisible);
$sql = "UPDATE ".TABLES['rel_step_comments']."
SET isVisible=$isVisible
WHERE id=$idComment
LIMIT 1";
$query = $database->query($sql);
if(!$query){
$err_mes = [
'code' => 'error',
'message' => 'SERVER_ERROR'
];
$data['messages'][] = $err_mes;
}
if($database->affectedRows() === 1){
$message = [
'code' => 'success',
'message' => 'ORDER_STEP_COMMENT_UPDATED'
];
$data['messages'][] = $message;
}
return $data;
}
private function updateOrderPackagseStatus($idOrder){
global $database;
$packageUpdated = 0;
$sqlRemaningSteps = "SELECT COUNT(rops.idProcessStep) as remainingSteps
FROM ".TABLES['rel_order_process_step']." rops
WHERE rops.idOrder=$idOrder and rops.status!='done'";
$queryRemaining = $database->query($sqlRemaningSteps);
$rowsRemaining = $database->fetchArray($queryRemaining);
if(intval($rowsRemaining['remainingSteps']) === 0){
$sqlPayTerm = "SELECT pt.packagePayPeriod,
pt.servicesContractPeriod
FROM ".TABLES['payment_types']." pt
INNER JOIN ".TABLES['rel_order_packages']." rop
ON rop.idPaymentTerm=pt.id
WHERE rop.idOrder=$idOrder
LIMIT 1";
$queryPayTerm = $database->query($sqlPayTerm);
while($payTerm = $database->fetchArray($queryPayTerm)){
$packagePayTerm = intval($payTerm['packagePayPeriod'], 10);
$servicesPayTerm = intval($payTerm['servicesContractPeriod'], 10);
$maxPeriod = max($packagePayTerm, $servicesPayTerm);
$deliveryDate = date("Y-m-d H:i:s");
$status = 'production';
$endOfLife = "DATE_ADD('$deliveryDate', INTERVAL $maxPeriod MONTH)";
$sql = "UPDATE ".TABLES['rel_order_packages']."
SET status='$status', endOfLife=$endOfLife
WHERE idOrder=$idOrder";
$query = $database->query($sql);
$packageUpdated = $database->affectedRows($query);
}
}
return $packageUpdated;
}
public function goToNextStep($idOrder, $idProcessStep, $ordersDetailsMail){
global $database;
$idOrder = $database->escapeValue($idOrder);
$idProcessStep = $database->escapeValue($idProcessStep);
$ordersDetailsMail = (array) json_decode($ordersDetailsMail);
$orderProcessHelper = new OrderProcessHelper();
$orderActions = new OrderActions();
$err_mes = [
'code' => 'error',
'message' => 'SERVER_ERROR'
];
$data['messages'][] = $err_mes;
$childSteps = $orderActions->getStepChilds($idProcessStep);
$stepsStatusUpdated = $orderActions->updateActiveStep($idOrder, $idProcessStep, $childSteps);
//in case automated steps are available code goes here
if($stepsStatusUpdated > 0){
$data['messages'][0] = [
'code' => 'success',
'message' => 'ACTIVE_STEP_UPDATE'
];
$data['messages'][] = [
'code' => 'success',
'message' => 'NEW_STEP_ACTIVATED'
];
$data['updated_active'] = $stepsStatusUpdated;
if(empty($childSteps)) {
$data['messages'][] = $orderProcessHelper->sendConfirmationMail('lastStepCompleted', $ordersDetailsMail);
} else {
$data['messages'][] = $orderProcessHelper->sendConfirmationMail('orderStepUpdated', $ordersDetailsMail);
}
}
$packageStatusUpdated = $this->updateOrderPackagseStatus($idOrder);
$orderStatusUpdated = $orderProcessHelper->updateOrderStatus($idOrder);
if($orderStatusUpdated['orderUpdated'] > 0) {
$message = [
'code' => 'success',
'message' => 'ORDER_UPDATED'
];
$data['messages'][] = $message;
$data['order'] = $orderStatusUpdated['orderUpdated'];
$data['sendMail'] = [
'message' => 'orderStatusChanged',
'status' => $orderStatusUpdated['status']
];
}
return $data;
}
/**
* undo a step
* @param INT $idOrder id for the order
* @param INT $idProcessStep id for the process step
* @return Array update message
*/
public function undoStep($idOrder, $idProcessStep){
$orderActions = new OrderActions();
$stepsStatusUpdated = $orderActions->undoStep($idOrder, $idProcessStep);
if($stepsStatusUpdated > 0){
$data['messages'][0] = [
'code' => 'success',
'message' => 'ACTIVE_STEP_UNDONE'
];
$customerInfo = UtilsModel::getDataForMailToCustomer($idOrder);
$currentDate = new DateTime();
$currentDate = $currentDate->format('d-m-Y H:i');
$stepDetails = $this->getProcessStepDetailsById($idProcessStep);
if(array_key_exists('isVisibleForCustomer', $stepDetails) && intval($stepDetails['isVisibleForCustomer']) === 1) {
$params = [
'orderUrl' => WIAAS_URL.'/orders/'.$idOrder,
'orderNumber' => $customerInfo['orderNumber'],
'processStepName' => $stepDetails['shortDesc'],
'currentDate' => $currentDate
];
$response = Mail::sendMail($customerInfo['mail'], 'Process step reopened', 'undoStepTemplate.php', $params);
if($response){
$data['messages'][] = [
'code' => 'success',
'message' => 'ORDER_UPDATE_MAIL_SENT'
];
} else {
$data['messages'][] = [
'code' => 'error',
'message' => 'ERROR_MAIL_SENT'
];
}
}
}else{
$err_mes = [
'code' => 'error',
'message' => 'SERVER_ERROR'
];
$data['messages'][] = $err_mes;
}
return $data;
}
/**
* get process step name and if is visible to customer based on the id
* @param INT $idProcessStep the id of the process step
* @return String the name of the process step
*/
public function getProcessStepDetailsById($idProcessStep) {
global $database;
$sqlProcessStep = "SELECT
ps.shortDesc,
ps.isVisibleForCustomer
FROM
".TABLES['process_step']." ps
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.idStep = ps.id
INNER JOIN
(SELECT
idParent
FROM
".TABLES['rel_process_steps']."
WHERE id = $idProcessStep) parentProcess
ON rps.id = parentProcess.idParent
LIMIT 1";
$result = $database->fetchResultArray($sqlProcessStep);
return $result && $result[0] ? $result[0] : [];
}
}